TellWorldAI 世界档案
问档案English

首页›实践›实践

实践

用官方 Python SDK 写一个 MCP 服务器

用官方 MCP Python SDK 写一个带工具和资源的服务器,用 Inspector 调试,作为 HTTP 服务运行,再用客户端调用。

这篇适合谁,读完能做到什么

这篇适合会写 Python、想把自己的工具或数据交给大模型应用调用的读者。读完你应该能装好官方 SDK,写出一个带一个工具和一个资源的 MCP 服务器,用 MCP Inspector 试跑,把它作为 HTTP 服务运行,并用一小段客户端代码调用它。

MCP Python SDK 是什么

MCP(Model Context Protocol,模型上下文协议)是把数据和功能暴露给大模型应用的一套标准协议。MCP Python SDK 是它的 Python 实现[1]。用这个 SDK 可以写两类程序:服务器把工具(tools)、资源(resources)和提示(prompts)暴露给任何 MCP 宿主;客户端则连接任何 MCP 服务器[1]。SDK 支持三种标准传输方式:stdio、Streamable HTTP 和 SSE[1]。

和自己实现协议层相比,SDK 替你处理请求解析、参数校验和协议细节,你主要写的是带类型标注的普通 Python 函数[1]。README 中的第一个示例服务器大约十几行代码。

准备工作

  • Python 3.11 或更高版本[1]。
  • SDK 以 MIT 许可证发布[1]。
  • 安装命令可以用 uv add "mcp[cli]",也可以用 pip install "mcp[cli]"[1]。cli 扩展会加上 mcp 命令行工具,其中包括 mcp dev、mcp run 和 mcp install。如果不需要命令行工具,装普通的 mcp 即可[1]。
  • 只想临时执行一条命令、不想建项目,可以用 uv run --with "mcp[cli]" mcp ...,不需要先建项目[1]。

上手步骤

  1. 安装 SDK 和命令行工具:uv add "mcp[cli]"[1]。
  2. 新建 server.py,写入下面的代码[1]:
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[1]。@mcp.tool() 把 add 函数注册为工具;SDK 直接用参数的类型标注(a: int, b: int)作为输入结构,不需要手写 JSON Schema[1]。@mcp.resource("greeting://{name}") 把 greeting 函数注册为资源,地址是一个 URI 模板,其中的 {name} 由调用方填入[1]。这个例子里开发者不需要写请求解析、校验代码或协议处理[1]。

  1. 用 MCP Inspector 调试:uv run mcp dev server.py[1]。在 Inspector 里调用 add,把 a 设为 1、b 设为 2,返回值是 3[1]。
  2. 作为 HTTP 服务运行:uv run mcp run server.py --transport streamable-http[1]。这是 SDK 为部署准备的传输方式[1]。
  3. 用客户端调用它。服务器运行时,另写一个文件,内容如下[1]:
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 收到的是一个 URL,所以按 Streamable HTTP 连接[1]。代码中注释所示,打印出的 result.structured_content 是 {'result': 3}[1]。

客户端还能怎么连

Client 的参数决定连接方式:传入 URL 时使用 Streamable HTTP;它也可以启动一个本地服务器作为 stdio 子进程,或者接入自定义的传输方式[1]。客户端的完整用法可以查看官方文档[2]。

常见问题

**mcp dev 和 mcp run 有什么区别?** mcp dev 用来在 MCP Inspector 中打开服务器,方便调试;mcp run 用来按指定的传输方式运行服务器,例子里是 --transport streamable-http[1]。

一定要装 cli 扩展吗? 不一定。cli 扩展只提供 mcp 命令行工具;只写代码、不用这些命令的话,装普通的 mcp 就够了[1]。

示例里的地址是什么? 客户端示例连接的是 http://localhost:8000/mcp[1]。换成你的服务器实际监听的地址即可。

限制

  • 本文的代码只取自 SDK 的官方 README,编辑部没有实际运行过这些示例。动手前请以官方文档为准[2]。
  • 示例只有一个工具和一个资源。真实的服务需要根据业务设计参数、返回值和错误处理,示例不能直接当作成品。
  • SDK 要求 Python 3.11 或更高版本,更低的版本装不上[1]。

下一步

官方文档提供 Get started 指南、「What's new in v2」页面、API 参考和迁移指南[2]。建议先读 Get started 走通第一个服务器,再用 API 参考查具体的装饰器和类的用法[2]。

本文改编自 MCP Python SDK 的 README 和官方文档[1][2],原文以 MIT 许可证发布。

来源

  1. 1
    MCP Python SDK (README)MCP Python SDK (MIT)
  2. 2
    MCP Python SDK documentationMCP Python SDK (MIT)

引用本页: 用官方 Python SDK 写一个 MCP 服务器. TellWorld, https://www.tellworld.net/zh/practice/practice-mcp-python-sdk. 更新于 2026-11-14

相关动态