MCP 的 HTTP 部署,最先要验证的是服务器能在指定地址响应协议、客户端能发现工具并得到正确结果。本文使用官方 Python SDK v2 的 Streamable HTTP,在本机 127.0.0.1:8865/mcp 提供一个整数翻倍工具。读者可以先完成这条最小链路,再处理远端访问、HTTPS 与认证。
这个部署示例适用于什么情况
代码已在 Windows、Python 3.11、mcp==2.2.0 上运行验证,核验日期为 2026 年 10 月 1 日。服务仅监听本机回环地址,没有身份认证,也没有生产环境压测;不能据此认为公网部署已完成。选择 Streamable HTTP 的依据是官方 SDK 对 URL 客户端的支持,不需要把旧 SSE 配置复制进来。

stdio 通常由客户端启动本地子进程;HTTP 模式则需要先启动一个持续运行的服务,客户端通过地址连接。两者可以暴露相同工具,但启动方式与连接配置不同。
mkdir C:\mcp-demo
cd C:\mcp-demo
python -m venv .venv
.\.venv\Scripts\python.exe -m pip install "mcp==2.2.0"
启动一个明确绑定地址的服务器
把以下内容保存为 http_server.py:
from mcp.server import MCPServer
mcp = MCPServer("LocalHttpDemo")
@mcp.tool()
def double(value: int) -> int:
"""Double an integer; no external service is called."""
return value * 2
if __name__ == "__main__":
mcp.run(transport="streamable-http", host="127.0.0.1", port=8865, json_response=True)
.\.venv\Scripts\python.exe .\http_server.py
保持这个终端运行。在代码中,host="127.0.0.1" 限定本机访问,port=8865 与后面客户端地址保持一致,json_response=True 选择 JSON 响应模式。整数翻倍工具不调用外部接口、也不修改数据。
/mcp 是本例的 MCP 端点路径。用浏览器直接打开地址,看见空白或方法、请求头相关错误,都不能单独说明服务坏了:MCP 客户端会发送协议请求及必要请求头,普通地址栏访问不是完整验收。
用独立客户端检查发现与调用
新建 http_client.py,在第二个终端使用同一虚拟环境运行:
import asyncio
from mcp import Client
async def main():
async with Client("http://127.0.0.1:8865/mcp",
read_timeout_seconds=10) as client:
listed = await client.list_tools()
print([tool.name for tool in listed.tools])
result = await client.call_tool("double", {"value": 7})
if result.is_error:
raise RuntimeError(str(result.content))
assert result.structured_content == {"result": 14}
print(result.structured_content)
if __name__ == "__main__":
asyncio.run(main())
cd C:\mcp-demo
.\.venv\Scripts\python.exe .\http_client.py
本次实际测试中,工具列表包含 double,传入 {"value":7} 后得到 {"result":14} 且错误标志为假。读者应核对列表和断言都通过,不能只凭端口能连接就宣布 MCP 部署成功。
SDK 的 Client 会处理连接生命周期与协议消息。本教程不手写 curl 会话,是为了避免把缺少协商、请求头或会话状态的问题误认成业务工具故障。
常见故障:每次只改变一个变量
| 现象 | 排查操作 | 复查标准 |
|---|---|---|
| 连接被拒绝 | 检查服务终端是否退出、监听端口是否仍为 8865;运行 Test-NetConnection 127.0.0.1 -Port 8865 |
端口可达后,再跑 MCP 客户端 |
| 地址能连但返回 404 | 确认 URL 结尾有 /mcp,没有误用 /sse 或网站首页 |
客户端能列出 double |
| 提示端口占用 | 选一个未占用端口,同时修改服务端与客户端;不要关闭用途不明的进程 | 新端口上重新完成发现和调用 |
| 远端电脑连接失败 | 确认服务仍只监听 127.0.0.1;远端电脑的 localhost 指的是它自己 | 先明确网络拓扑和访问入口,再测试协议 |
| 参数错或工具失败 | 检查工具名 double 与整数参数 value,读取 is_error 和错误内容 |
固定输入 7 应返回 14 |
从本机验证走向远端服务,还需要哪些工作
如果希望另一台机器访问,不能只把 URL 中的 127.0.0.1 换成公网 IP。还需要合适的监听地址、网络路由或反向代理,并配置 HTTPS、认证与访问范围。SDK 的传输安全检查与允许的 Host/Origin 也要按实际域名设置;不要为图省事直接关闭安全检查。
本示例没有实现这些远端能力。正式服务应给工具设置超时、并发和资源限制,明确进程重启方式;如果有写入操作,还需要权限验证、审计与幂等。先沿用本文的确定输入复测,再增加真实工具,才容易定位是哪一层改变导致失败。
相关问答
HTTP 服务能让客户端自己启动吗? 本文的 URL 客户端只连接地址,服务进程需预先运行。若希望客户端管理一个本地子进程,应选择 stdio;两种配置不要混用。
Streamable HTTP 是否必须返回流? 不是。官方 SDK 暴露 json_response 选项,本例用 JSON 响应完成请求;如果你的应用需要通知、事件或恢复行为,应按相应协议与 SDK 功能单独验证。
参考:MCPServer 的运行方法及 HTTP 配置参数;官方 URL Client 示例与结果处理;MCP 标准传输与 HTTP 安全要求。
Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/30222.html