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" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏