mcp

Model Context Protocol 的服务器、客户端与接入配置。

补充说明

MCP 是让模型应用连接外部工具和数据源的开放协议,基于 JSON-RPC。服务器暴露 tools、resources、prompts;客户端(Claude Code、IDE、桌面应用)负责发现并调用。

传输方式主要有 stdio 和 Streamable HTTP。stdio 适合本地进程,HTTP 适合远程共享服务;早期 SSE 传输已被 Streamable HTTP 取代,新旧客户端要匹配协议版本。

安装与启动

pip install -U "mcp[cli]"

Python SDK 自带 FastMCP,适合快速写工具服务器:

cat > server.py <<'PY'
from mcp.server.fastmcp import FastMCP

mcp = FastMCP("ops-tools")

@mcp.tool()
def disk_usage(path: str = "/") -> dict:
    """返回指定路径的磁盘总量、已用和可用字节数。"""
    import shutil
    usage = shutil.disk_usage(path)
    return {"total": usage.total, "used": usage.used, "free": usage.free}

@mcp.resource("config://app")
def app_config() -> str:
    """返回应用配置摘要。"""
    return "env=prod\nregion=cn"

if __name__ == "__main__":
    mcp.run(transport="stdio")
PY
python server.py

stdio 服务器启动后不会打印欢迎信息,stdout 已被 JSON-RPC 占用。

常用示例

在 Claude Code 中注册 stdio 服务器:

claude mcp add --transport stdio ops-tools -- python /abs/path/server.py
claude mcp list

用 Inspector 调试工具列表和调用参数:

npx -y @modelcontextprotocol/inspector python /abs/path/server.py

远程部署改用 Streamable HTTP,并加认证:

# server.py 中改为 mcp.run(transport="streamable-http")
claude mcp add --transport http ops https://mcp.example.com/mcp \
  --header "Authorization: Bearer $MCP_TOKEN"

易错点与排错

读完自测

合上页面,先回答,再展开对照。

  1. stdio 和 Streamable HTTP 分别适合什么场景?
  2. 为什么 MCP 服务器不能往 stdout 打印日志?
  3. 工具 schema 从哪里来?
答案
  1. stdio 适合本地、单用户的工具进程,配置简单、无需网络端口;Streamable HTTP 适合远程共享、多客户端和需要统一鉴权的服务。
  2. stdio 传输把 stdout 当作 JSON-RPC 消息通道。额外输出会插入非协议内容,客户端解析失败,表现为连接断开或工具不可用。
  3. FastMCP 根据函数名、参数类型注解和 docstring 生成工具名、输入 schema 与描述。类型缺失或描述含糊会直接影响模型调用准确率。

相关条目