MCP Server 开发入门(Python):用官方 SDK 写第一个 MCP 服务器并调试

想自己写一个 MCP 服务器?按 MCP 官方 Python SDK 文档讲清安装命令、十几行代码定义一个工具和一个资源、用 mcp dev 打开 Inspector 调试、切换到 Streamable HTTP 运行,以及 v2 把 FastMCP 改名为 MCPServer 后旧教程要改的地方。

NNathaniel bigo··原创首发·AI 辅助撰写
10 分钟读完
资料核对于 2026-10-11 · 依据官方文档与公开资料整理 免费账号 账号
本文根据 MCP 官方 Python SDK 仓库的 README、文档首页和《Migration Guide》整理,资料核对于 2026-10-11。MCP 是什么见《MCP 是什么》。文中代码取自官方 README,没有在本机运行验证。

适用于谁

  • 搜「mcp server 开发」「mcp server 开发 python」「mcp server 开发教程」「fastmcp 教程」的人;
  • 已经会给 Claude Code、Cursor 配别人的 MCP 服务器,想把公司内部的接口或脚本也接进来的人;
  • 照着旧教程写 from mcp.server.fastmcp import FastMCP,升级后发现对不上的人。

结论先说

  1. 官方 Python SDK 的包名是 mcp,安装时带上 cli 附加项:pip install "mcp[cli]",需要 Python 3.10 及以上。
  2. 十几行代码就是一个服务器:创建一个 MCPServer 实例,用 @mcp.tool() 装饰函数就是工具,用 @mcp.resource(...) 就是资源。函数的类型标注和文档字符串会成为给模型看的参数定义和说明。
  3. 调试用 mcp dev server.py,它会启动服务器并打开 MCP Inspector。
  4. v2 改了类名:FastMCP 已改名为 MCPServer,导入路径也变了。装饰器的用法和 v1 相同。
  5. stdio 服务器绝不能往标准输出打印东西,日志要写到标准错误。这是协议规定,也是新手最常见的故障原因。

一、三个基本概念

一个 MCP 服务器可以向客户端提供三类东西:

类型是什么例子
工具(Tools)模型可以调用的函数查订单、发消息、跑一段计算
资源(Resources)客户端可以按 URI 读取的只读内容某个文件、某条记录
提示(Prompts)服务器提供的可复用提示模板一套固定的代码审查提问

入门阶段只需要工具。

二、安装

官方给出两种方式:

bash
uv add "mcp[cli]"
bash
pip install "mcp[cli]"

cli 附加项提供 mcp 命令行;不需要命令行时装普通的 mcp 即可。

另外,调试用的 Inspector 是一个 Node.js 程序,官方文档提醒需要 npx 在你的 PATH 里,也就是要先装好 Node.js。

三、写第一个服务器

新建 server.py,下面是官方 README 的快速上手示例:

python
from mcp.server import MCPServer

mcp = MCPServer("Demo")


@mcp.tool()
def add(a: int, b: int) -> int:
    """Add two numbers."""
    return a + b


@mcp.resource("greeting://{name}")
def greeting(name: str) -> str:
    """Greet someone by name."""
    return f"Hello, {name}!"

逐行看:

  • MCPServer("Demo"):创建服务器,Demo 是它的名称;
  • @mcp.tool():把下面的函数注册为工具。a: int, b: int 这些类型标注决定了工具的参数定义,三引号里的文档字符串是给模型看的工具说明;
  • @mcp.resource("greeting://{name}"):注册一个带模板的资源,{name} 会作为参数传给函数。

工具说明要写给模型看。模型只凭名称和说明决定何时调用、怎么填参数,「Add two numbers.」这种一句话对简单工具够用;实际业务里的工具要写清它做什么、参数的含义和取值范围。

四、调试

bash
uv run mcp dev server.py

这条命令启动服务器并打开 MCP Inspector,一个在浏览器里运行的调试界面。打开终端里打印出来的地址,官方文档给的验证步骤是:

  • 在 Tools 里调用 add,填 a=1、b=2,应当得到 3;
  • 在 Resources 里读取 greeting://World,应当得到 Hello, World!。

先在 Inspector 里把工具调通,再接进真正的客户端。这样出问题时能分清是服务器的问题还是客户端配置的问题。Inspector 的详细用法见《MCP Inspector 怎么用》。

五、两种运行方式

MCP 定义了两种标准传输方式,区别见《MCP 的 stdio、SSE 和 Streamable HTTP 有什么区别》。简单说:

  • stdio:客户端把你的服务器当作子进程启动,通过标准输入输出通信。本机自用的服务器用这种;
  • Streamable HTTP:服务器作为独立的 HTTP 服务运行,客户端通过网址连接。要给多人用、或部署在别的机器上时用这种。

用 Streamable HTTP 运行的官方命令:

bash
uv run mcp run server.py --transport streamable-http

官方 README 接着给了一个客户端示例,用来验证服务器可以被调用:

python
import asyncio

from mcp import Client


async def main() -> None:
    async with Client("http://localhost:8000/mcp") as client:
        result = await client.call_tool("add", {"a": 1, "b": 2})
        print(result.structured_content)  # {'result': 3}


asyncio.run(main())

官方说明:给 Client 传一个网址就表示用 Streamable HTTP;它也可以启动本地的 stdio 子进程。

六、接进客户端

SDK 的命令行还有一个 mcp install 子命令,具体用法以官方文档为准。

七、从 v1 升级:FastMCP 改名了

网上大量教程是按 v1 写的。官方《Migration Guide》里和入门相关的几条:

项目v1v2
类名FastMCPMCPServer
导入from mcp.server.fastmcp import FastMCPfrom mcp.server.mcpserver import MCPServer, Context
装饰器@mcp.tool()、@mcp.resource()、@mcp.prompt()相同,官方说明参数和处理函数的签名与 v1 一致
传输方式的取值"stdio"、"sse"、"streamable-http"

迁移指南列了全部不兼容的改动,升级已有项目前通读一遍。v1.x 的文档官方另行保留。

八、写服务器时的几条规矩

1. stdio 服务器不要 print。 协议规定:服务器不得向标准输出写入任何不是合法 MCP 消息的内容;日志可以写到标准错误。在工具函数里随手 print() 一句调试信息,就会破坏通信,表现为客户端连不上或者莫名断开。

2. 工具要小而明确。 一个工具做一件事,参数用明确的类型;可选值有限时用枚举,而不是让模型自由填字符串。

3. 报错信息写给模型看。 工具失败时返回「哪里不对、期望什么」,模型才能自己修正后重试。

4. 密钥走环境变量。 不要写进代码,客户端配置里用各自的 env 传入。

5. HTTP 服务要考虑安全。 协议对 Streamable HTTP 的要求包括:校验 Origin 请求头、本地服务绑定到 127.0.0.1 而不是所有网卡、为连接实现鉴权。要对外提供服务时,这三条都要落实。

常见问题

Q:必须用 uv 吗?

不是。官方同时给了 pip install 的写法;文档里的命令以 uv run 开头,是因为它用 uv 管理项目环境。用 pip 时在已激活的虚拟环境里直接运行 mcp dev server.py。

Q:FastMCP 还能用吗?

官方 SDK 的 v2 里这个类已改名为 MCPServer。继续用 v1 的写法就要把依赖固定在 v1.x 版本。

Q:用 TypeScript 可以吗?

可以,MCP 官方也有 TypeScript 等语言的 SDK,本文没有覆盖。

Q:客户端里看不到我的工具?

先用 Inspector 确认服务器本身正常;再看客户端的日志。stdio 服务器重点查两件事:启动命令和路径是否是绝对路径、代码里有没有往标准输出打印内容。

参考资料

  • MCP Python SDK(官方仓库):https://github.com/modelcontextprotocol/python-sdk
  • SDK 文档首页:https://github.com/modelcontextprotocol/python-sdk/blob/main/docs/index.md
  • Migration Guide(v1 → v2):https://github.com/modelcontextprotocol/python-sdk/blob/main/docs/migration.md
  • mcp(PyPI):https://pypi.org/project/mcp/
  • Transports(MCP 规范):https://modelcontextprotocol.io/specification/2025-11-25/basic/transports
需要开通或续费?Claude Pro 充值 →

Nathaniel 的更多内容

  1. 01

    ChatGPT 个人资料怎么改:头像、名字、用户名在哪设置,个人主页怎么公开和关闭

    想换 ChatGPT 的头像、改显示的名字,或者看到别人分享的 chatgpt.com/u/ 开头的主页链接?本文按官方帮助中心讲清个人资料页在哪打开、能改哪些信息、名字改了不生效怎么办,个人主页上会显示什么、怎么公开和收回,以及公司工作区里的不同规则。

    ChatGPT0
  2. 02

    ChatGPT Space 是什么、怎么用:页面(Pages)怎么创建和编辑、多人协作与分享权限

    ChatGPT 侧边栏多了个 Space,文件库却不见了?Space 是放页面、文件和成果的新地方,页面可以让 ChatGPT 起草、多人一起编辑。本文按官方帮助中心讲清谁能用、Space 和项目 / 文件库的关系、怎么创建和整理页面、分享后别人能看到什么,以及手机上的限制。

    ChatGPT0
  3. 03

    ChatGPT 录音模式(Record)怎么用:录会议自动出纪要,按钮不见了、没有声音怎么办

    ChatGPT 的录音功能(Record)可以在 Mac 上边录边转写,结束后自动生成会议纪要。本文按官方帮助中心讲清谁能用、怎么开始和结束、单次能录多久、录音会不会被保存和训练,以及 Record 按钮不见、权限报错、找不到纪要时的处理办法。

    ChatGPT0
  4. 04

    ChatGPT 购物研究怎么用:从选商品到拿到购买指南,结果准不准、和普通购物结果的区别

    ChatGPT 的购物研究(shopping research)能帮你比较商品、列出取舍,最后给一份个性化的购买指南。本文按官方帮助中心讲清现在从哪里启动、过程中怎么调整、指南里有什么、价格和库存为什么可能不准,以及虚拟试穿、收藏商品这些相关功能。

    ChatGPT0
  5. 05

    ChatGPT 群聊功能还能用吗:2026 年 7 月起停止新建,旧群聊怎么办、用什么替代

    想找 ChatGPT 的群聊(群组对话)入口却找不到?这个功能是 2025 年底的一次试点,官方已从 2026 年 7 月 9 日起停止新建和加入。本文按官方帮助中心讲清时间线、已有群聊会怎样、历史记录还在不在,以及现在多人协作可以改用的三种官方功能。

    ChatGPT0
  6. 06

    ChatGPT 深色模式怎么开:夜间模式、主题颜色、对比度与字体大小在哪设置

    想把 ChatGPT 换成深色(夜间)模式、改掉蓝色的消息气泡,或者把字调大?本文按官方帮助中心讲清网页、Windows、iPhone、安卓各自的入口,外观、对比度、强调色、文字大小四个设置分别管什么、哪些会跨设备同步,以及「为什么突然变蓝了」等常见问题。

    ChatGPT0

同产品的其他教程

  1. 01

    AI 幻觉是什么、怎么解决:用 AI 搜索时核实信息的七步检查法

    AI 幻觉是什么意思、怎么减少?讲清 AI 为什么会一本正经地说错,哪些内容最容易出错,并给出用 ChatGPT、Claude、Gemini、Grok 搜索时可照做的七步核查法:开联网、要来源、点开原文、看日期、找第二来源、反问、重要的事问人。

    ChatGPT其他 AI 工具0
  2. 02

    Claude Code 网页版(claude.ai/code)怎么用:在云端跑任务

    Claude Code 网页版(云端会话)不用在电脑上装任何东西:连接 GitHub、选仓库、交代任务,Claude 在云端虚拟机里改代码并推送分支。本文讲哪些套餐能用、怎么开始、审阅 diff、建 PR、和本地会话互相转移。

    Claude0
  3. 03

    MarkItDown 怎么用:把 PDF、Word、Excel、PPT 转成 Markdown(安装、命令行与 Python)

    微软的 MarkItDown 是什么、怎么安装使用?按官方 README 讲清它支持的文件格式、为什么转成 Markdown、pip 安装与可选依赖、三种命令行写法、Python 调用、让大模型给图片写描述、插件与 OCR、MCP 服务器,以及处理不可信文件时的安全提示。

    其他 AI 工具0
  4. 04

    Seedance 2.0 怎么用:在即梦里用多模态参考生成视频(含提示词写法要点)

    Seedance 2.0 怎么用?本文讲清它在即梦里的入口和几个版本的区别,「全能参考」怎么同时放图片、视频、音频,编辑和延长视频怎么做,提示词怎么引用素材,以及 2.5 新增了什么、怎么收费去哪看。

    其他 AI 工具0
  5. 05

    Claude Code settings.json 配置详解:文件位置、优先级与常用示例

    Claude Code 的 settings.json 有几个、放在哪、谁覆盖谁?本文讲清四级配置文件与优先级、列表合并规则、怎么确认生效,并给出个人与团队两份可复制的配置示例和常用字段。

    Claude0
  6. 06

    pgvector 是什么、怎么安装和使用:在 PostgreSQL 里存向量、查最近邻、建索引

    pgvector 是什么、怎么安装使用?按官方 README 讲清它给 PostgreSQL 加了什么、源码与 Docker 两种安装方式、四条 SQL 完成建表插入查询、六个距离运算符的含义、HNSW 与 IVFFlat 两种索引怎么选怎么调,以及 2000 维的索引上限怎么绕过。

    其他 AI 工具0

0 条评论

登录 后参与评论

还没有评论,来抢沙发~