问题与目标
Function Calling 解决单个应用怎样向模型描述工具,但每个应用都自定义接入方式,会重复处理发现、连接和生命周期。MCP(Model Context Protocol)定义了应用与上下文提供方之间的协议,使工具和数据能力可以通过一致方式暴露。
本篇纠正一个容易传播的误解:MCP 不是“Multi-Component Pipeline”,也不等同于多工具 Agent。目标是理解 Host、Client、Server、能力协商和三类服务端能力,并分别跑通本地 stdio 与远程 Streamable HTTP。示例使用 Python MCP SDK,具体版本应与当前规范日期一起记录。

一个 Host 可以管理多个 Client,每个 Client 与一个 Server 保持协议会话;Server 暴露的 Tools、Resources、Prompts 具有不同控制方向。
核心概念
参与者与生命周期
- Host:用户实际使用的 AI 应用,管理权限、模型和一个或多个 Client。
- Client:Host 内与某个 Server 保持一对一协议会话的组件。
- Server:暴露能力的程序,可以是本地进程或远程服务。
连接通常经历初始化、能力协商、正常操作和关闭。MCP 基于 JSON-RPC 消息,不负责替 Host 决定是否信任一个 Server。
三类能力的控制方向
- Tools:模型可发现并请求调用,应用负责授权与确认;
- Resources:应用读取的上下文数据,类似可寻址内容;
- Prompts:用户或应用选择的可复用提示模板。
三者不能因为都返回文本就混为一类。工具可能产生副作用,资源读取也可能泄露敏感数据,它们需要不同权限策略。
两种常见传输
stdio 由 Host 启动本地子进程,协议消息走标准输入输出;Server 不能向 stdout 打普通日志,否则会破坏协议。Streamable HTTP 面向独立远程服务,需要 HTTPS、认证、Origin 校验、会话管理和网络边界。旧资料中的 HTTP+SSE 传输不应与当前 Streamable HTTP 混称。
可运行实现
安装官方 Python SDK:
python -m pip install "mcp[cli]"
创建 server.py:
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("inspection-demo")
@mcp.tool()
def add(a: int, b: int) -> int:
"""返回两个整数之和。"""
return a + b
@mcp.resource("policy://alarm")
def alarm_policy() -> str:
return "关键告警必须立即通知负责人。"
@mcp.prompt()
def summarize_event(event: str) -> str:
return f"只整理事实,不推测原因:{event}"
if __name__ == "__main__":
mcp.run(transport="stdio")
stdio Server 由支持 MCP 的 Host 按命令 python server.py 启动。调试时把日志写到 stderr。
远程服务只需改变启动入口:
if __name__ == "__main__":
mcp.settings.host = "127.0.0.1"
mcp.run(transport="streamable-http")
开发阶段绑定环回地址,经过认证网关后再决定是否开放。可用 MCP Inspector 检查能力列表、Schema 和调用结果,但不要把生产凭据放进共享调试记录。
常见问题与排查
stdio 一启动就解析失败
检查 Server 是否向 stdout 输出了欢迎语、调试日志或第三方库日志;协议之外的内容写 stderr。再核对 Host 配置的解释器、工作目录与依赖环境。
远程 Server 能访问但能力列表为空
检查客户端和服务端协议版本、初始化响应与能力声明,再查看反向代理是否缓存或截断流式响应。
把 MCP 当作安全沙箱
协议标准化连接,不自动隔离文件、网络和账号。Host 仍要审核 Server 来源,对工具做白名单和确认,对 Resources 做最小权限与脱敏。
为了方便监听 0.0.0.0 且无认证
先绑定 127.0.0.1。远程部署使用 HTTPS、认证授权、Origin 校验、速率限制和审计;对文件写入、命令执行等危险工具增加逐次确认。
小结
MCP 的核心价值是协议化连接上下文能力,而不是替代 Function Calling 或 Agent。Host 掌握用户体验和安全决策,Client 管理会话,Server 暴露 Tools、Resources、Prompts;理解控制方向和传输边界后,才能安全复用外部能力。
许可协议:CC BY-NC 4.0
更新于 1 小时前
觉得文章有帮助?点个赞吧!
0 条评论


