MCP用法
目录
MCP介绍
MCP 英文全称 Model Context Protocol(模型上下文协议),是一套开放标准协议,定义了大语言模型(LLM)应用与外部数据源、工具、服务之间的交互规范,实现大模型安全调用本地或远程能力。
MCP 就像 USB-C 一样,可以让不同设备能够通过相同的接口连接在一起。
安装方式:
pip install mcp
python最低版本需要 3.10,才能安装MCP库
transport=“streamable-http”模式
服务端配置
# *_*coding:utf-8
from mcp.server.fastmcp import FastMCP
from datetime import datetime
mcp = FastMCP(
"simple-demo-server",
host="127.0.0.1",
port=8081,
streamable_http_path="/mcp",
)
@mcp.tool()
def search_weather(city: str):
"""查询天气"""
return f"echo: {city},今天晴天"
@mcp.tool()
def search_now_time():
"""查询当前时间"""
now_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
return now_time
if __name__ == "__main__":
# mcp.run(transport="sse") # 旧版远程传输,不推荐
mcp.run(transport="streamable-http") # 推荐方式
客户端配置
需先手动启动本脚本,客户端连 url。
{
"mcpServers": {
"simple-demo": {
"url": "http://127.0.0.1:8081/mcp"
}
}
}
部署到云服务器:host 改 0.0.0.0 + 安全组限制来源 IP;
多副本 / Serverless 场景需加 stateless_http=True。
transport=”stdio”模式
服务端配置
# *_*coding:utf-8
from mcp.server.fastmcp import FastMCP
from datetime import datetime
# 不需要写ip+端口
mcp = FastMCP("simple-demo-server")
@mcp.tool()
def search_weather(city: str):
"""查询天气"""
return f"echo: {city},今天晴天"
@mcp.tool()
def search_now_time():
"""查询当前时间"""
now_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
return now_time
if __name__ == "__main__":
mcp.run(transport="stdio")
客户端配置
客户端负责启动本脚本作为子进程,通过 stdin/stdout 通信,不需要监听端口。
注意:当前环境默认 python 是 3.6,mcp 需要 3.10+,command 务必指向 3.11 的解释器。
{
"mcpServers": {
"simple-demo": {
"command": "D:/python3.11.0/python.exe",
"args": ["e:/document/python_files/demo_MCP.py"]
}
}
}
Windows 路径注意:args 里写脚本的绝对路径,command 写解释器绝对路径。
推荐用正斜杠 "e:/document/python_files/demo_MCP.py";
若用反斜杠必须双写转义 "e:\\document\\python_files\\demo_MCP.py",
单反斜杠(如 "e:\document\...")会被 JSON 当作转义序列导致解析失败。
不要写相对路径——它相对客户端进程的工作目录,各 IDE 不一致。
Windows 另一种写法(反斜杠,注意必须双写):
{
"mcpServers": {
"simple-demo": {
"command": "D:\\python3.11.0\\python.exe",
"args": ["e:\\document\\python_files\\demo_MCP.py"]
}
}
}
stdio 模式注意事项:
1. 不要在代码里 print() 到 stdout(会破坏协议),日志请走 stderr 或 logging;
2. host / port / streamable_http_path 在 stdio 模式下不生效;
3. 改代码后需重启客户端才能加载新进程。
MCP 三种 transport 传输方式对比
MCP transport 决定服务端和客户端怎么收发 JSON‑RPC 消息。
1. transport="stdio" 标准输入输出
✅ 本地子进程模式,不开启网络端口
- 通信:父进程通过 `stdin/stdout` 和 MCP 服务子进程对话,不走 TCP 网络
- 网络:**不监听任何端口,没有 http 服务**
- 使用场景:
- Cursor / Claude Desktop / Unity MCP 本地调用 MCP 服务
- 本机程序内部调用工具,只有本机可以访问
- 优点:最简单、安全,不用处理鉴权、端口、跨域
- 缺点:**不能跨机器访问**,只能本机;不能多个客户端同时连接
2. transport="sse" (旧版 SSE,遗留方案)
SSE = Server‑Sent‑Events
- 启动 HTTP 服务,监听端口;客户端 HTTP 连接,SSE 长连接接收服务端推送,POST 发送请求。
- 特点:
- 开放端口,**支持跨机器访问**
- 协议限制:**只能单方向长连接**,每个客户端需要 2 个通道:POST 发请求 + SSE 接收返回事件
- 缺点:
1. 不支持多路复用,每个客户端两条连接;
2. 不支持 HTTP2;
3. 官方标记为**遗留方案,新项目不要再用**;
4. 部署要处理鉴权,公网暴露要小心安全。
- 适用:老项目兼容,历史 MCP 客户端。
3.transport="streamable‑http" ✨新项目官方推荐
> MCP 最新标准,替代旧 SSE
- 底层:普通 HTTP,支持**流式 HTTP(HTTP chunked)**,一个 HTTP 连接同时双向收发消息。
- 启动后会监听端口(例如 `http://127.0.0.1:8000/mcp`)
#### 优点
1. **单连接双向流**,不再需要 SSE+POST 两条链路;
2. 支持多客户端同时接入;
3. 支持 HTTP1.1 / HTTP2;
4. 支持代理、Nginx 反向代理,适合部署到服务器;
5. 兼容鉴权 token、header 鉴权,适合远程调用;
6. MCP 官方现在优先推荐。
#### 缺点
- 会开启 TCP 端口,如果对公网暴露,**必须做身份校验,不要裸跑**。
三者对比
| transport | 是否开端口 | 跨机器访问 | 多客户端 | 适用场景 |
|---|---|---|---|---|
stdio |
❌无端口 | ❌仅本机 | ❌单客户端 | Claude Desktop、Cursor 本地工具,最安全 |
sse |
✅开启端口 | ✅支持 | ⚠️复杂 | 老项目兼容,遗留 |
streamable‑http |
✅开启端口 | ✅支持 | ✅多客户端 | 服务端部署、远程调用,新项目首选 |
鉴权版本
服务端配置
# *_*coding:utf-8
from mcp.server.fastmcp import FastMCP
from mcp.server.auth.provider import AccessToken, TokenVerifier
from mcp.server.auth.settings import AuthSettings
from datetime import datetime
import hmac
import os
# ---------------------------------------------------------------------------
# 鉴权配置
# ---------------------------------------------------------------------------
# Token 只从环境变量读取,缺失直接启动失败(fail-fast),禁止写死在代码里。
# Windows 设置方式:
# cmd: set MCP_API_TOKEN=你的随机token && D:/python3.11.0/python.exe demo_MCP.py
# ps : $env:MCP_API_TOKEN="你的随机token"; D:/python3.11.0/python.exe demo_MCP.py
# 生成随机 token: python -c "import secrets;print(secrets.token_urlsafe(32))"
mcp_api_token = "u9p1lUJFYyLvaOrPdCDoPhXEnDjCaEV1Rz1WvyoULLs"
# _API_TOKEN = os.environ.get("MCP_API_TOKEN")
_API_TOKEN = mcp_api_token
if not _API_TOKEN:
raise RuntimeError("缺少环境变量 MCP_API_TOKEN,拒绝以无鉴权方式启动")
# 资源服务器自身的对外地址,用于 OAuth 保护资源元数据(/.well-known/...)
_RESOURCE_URL = os.environ.get("MCP_RESOURCE_URL", "http://127.0.0.1:8081")
class StaticTokenVerifier:
"""校验 Bearer Token。任何返回 None 的情况都会被框架转成 401。
TokenVerifier 是 Protocol,只要实现 async verify_token(token) -> AccessToken | None 即可。
生产环境把这里换成 JWT 校验 / OAuth Introspection / 数据库查询,接口不变。
"""
def __init__(self, token: str, scopes: list[str]):
self._token = token
self._scopes = scopes
async def verify_token(self, token: str) -> AccessToken | None:
# 定长比较,防时序侧信道
if not hmac.compare_digest(token, self._token):
return None
return AccessToken(
token=token,
client_id="demo-client",
scopes=self._scopes,
)
mcp = FastMCP(
"simple-demo-server",
host="127.0.0.1",
port=8081,
streamable_http_path="/mcp",
# 鉴权:两者必须同时给,只给一个会抛 ValueError
token_verifier=StaticTokenVerifier(_API_TOKEN, ["mcp:read", "mcp:write"]),
auth=AuthSettings(
issuer_url="http://127.0.0.1:8081",
resource_server_url=_RESOURCE_URL,
required_scopes=["mcp:read"], # 访问 /mcp 至少需要的 scope,留空则只验 token 不验 scope
),
)
@mcp.tool()
def search_weather(city: str):
"""查询天气"""
return f"echo: {city},今天晴天"
@mcp.tool()
def search_now_time():
"""查询当前时间"""
now_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
return now_time
if __name__ == "__main__":
mcp.run(transport="streamable-http")
客户端
需先手动启动本脚本,客户端连 url。已开启 Bearer Token 鉴权,客户端必须带 Authorization 头:
{
"mcpServers": {
"simple-demo": {
"url": "http://127.0.0.1:8081/mcp",
"headers": {
"Authorization": "Bearer ${MCP_API_TOKEN}"
}
}
}
}
注意:${MCP_API_TOKEN} 只是占位写法,多数 MCP 客户端不会做变量替换,
需要你把真实 token 填进去,或用支持环境变量的客户端(如 mcp-remote / cursor 的 env 语法)。
不带 token 或 token 错误 -> 401,响应头带 WWW-Authenticate 指向保护资源元数据。
部署到云服务器:host 改 0.0.0.0 + 安全组限制来源 IP;
多副本 / Serverless 场景需加 stateless_http=True。
参考教程
https://www.runoob.com/vibe-coding/mcp-usage.html
https://www.runoob.com/np/mcp-protocol.html
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。
文章标题:MCP用法
本文作者:伟生
发布时间:2026-09-07, 21:40:00
最后更新:2026-09-07, 21:54:40
原始链接:http://yoursite.com/2026/09/07/ai_02_use_mcp/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。