MCP版本用日期定义最早的正式版本2024-11-05截止当前最新的是2026-07-28这一版协议有根本性改动Python SDK需要使用 v2。下面的概念是针对 2024-11-05 版的2026-07-28 变成无状态协议了下文属于该版本的会额外指出MCP就是 JSON-RPC 2.0 消息通信规范也就是Agent要完成任务时需要使用的远程函数的调用方式无非MCP协议将这种调用规范化了以JSON数据格式交互。MCP Server 主要提供3种东西Tools工具、功能、Resources上下文和数据、Prompts模板消息和工作流常用 / 命令触发另外提供了分页太长按游标分次读取、完成服务端引导客户完善参数和日志记录服务端告诉客户端发生的一些情况。MCP Client 主要提供2种东西Roots服务端从客户端获得根的位置项目根目录或仓库根目录等、Sampling服务器给客户端提问题客户端去调用LLM获得回答后回复服务器服务器实现了代理行为。容纳一堆 MCP Client 的AI应用称为 MCP HostMCP Server可能是本地的也可能是远程的。协议本身定义的传输机制是2种stdio MCP Server作为子进程和 HTTP with SSE MCP Server 包含 SSE 和 HTTP POST 两个端点客户端打开 SSE连接时服务端将 POST URI 告诉客户端以便客户端发消息给服务端。协议允许在保证生命周期情况下自定义传输。注意2025-03-26 版本用 Streamable HTTP 代替了 HTTP with SSE。作为远程函数MCP请求包含method 和 paramsMCP响应包含result 或 error 二选一。另外MCP请求和MCP响应都包含id 整数或字符串响应中的 id 必须和对应的请求的 id 一致。另外还有一种MCP通知消息它可以是服务器到客户端也可以是客户端到服务器它包含 method 和 params并且不得有 id因为通知不求回报。客户端或服务器都可以发送ping请求ping method来了解对方活着没。双方都可以发送notifications/cancelled 通知消息来表达要撤销某个请求的立场。对于可能的长耗时响应可以在请求时给参数添加元数据_meta progressToken接收者可以回复notifications/progress 通知消息报告进度用相同的 progressToken 表明这是哪个请求的响应进度。MCP常见的SDK是 Python SDK 和 TypeScript SDK。下载比较新的 Python 版本 3.14 python-3.14.8-amd64.exe并安装。pip install mcp[cli]2 安装 SDK版本2变动太大网上大量资料都是针对版本1的。下面是MCP服务器的例子传输模式用了 stdio也就是服务器作为子进程存在一般测试的时候用该模式生产环境应该用 SSE基本上就是一些方法头上加对应的装饰器from mcp.server.fastmcp import FastMCP import datetime import urllib.parse mcp FastMCP(mcp-server-1) # v2中名为 MCPServer # Tool 1 mcp.tool(description浮点加法计算器) def add(a: float, b: float) - float: return a b # Tool 2 mcp.tool(description字符串反转) def reverse_string(text: str) - str: return text[::-1] # Tool 3 mcp.tool(description获取当前时间) def get_current_time() - str: return datetime.datetime.now().isoformat() # static resource mcp.resource(docs://about) def get_about() - str: 返回Server基本信息 # 也可以这样用文档字符串指定 description return This is an MCP Server demo for the study of MCP development # dynamic resource mcp.resource(greeting://{name}, description动态资源带参数) def get_greeting(name: str) - str: decoded_name urllib.parse.unquote(name) return fHello, {decoded_name}! Welcome to study MCP Server development # prompt mcp.prompt() def review_code(code: str) - str: Review a piece of code. return fPlease review this code:\n\n{code} # start MCP Server (stdio mode) if __name__ __main__: mcp.run(transport stdio)下面是使用上述服务器的客户端的例子客户端代码包括的步骤是1、创建客户端对象2、创建会话3、会话初始化4、之后就是正常的协议操作5、用了with语法所以会话和客户端对象会自动关闭。SDK把复杂的初始化等通信步骤包装了所以用起来没那么麻烦。。调用prompts和调用tools是类似的远程函数调用使用静态和动态资源则需要URI。from mcp import ClientSession, StdioServerParameters from mcp.client.stdio import stdio_client import asyncio async def main(): server_params StdioServerParameters( commandpython, args[my_first_mcp_server.py], ) async with stdio_client(server_params) as (r, w): async with ClientSession(r, w) as session: await session.initialize() tools await session.list_tools() print( Tools available ) for tool in tools.tools: print(f - {tool.name}: {tool.description}) ctResult await session.call_tool(add, {a: 3, b: 4}) print(f\n add(3, 4) {ctResult.structuredContent[result]}) ctResult await session.call_tool(reverse_string, {text: This is a MCP test.}) print(f reverse_string(This is a MCP test.) is {ctResult.structuredContent[result]}) ctResult await session.call_tool(get_current_time, {}) print(f current time: {ctResult.structuredContent[result]}) resources await session.list_resources() print(\n Resources available ) for resource in resources.resources: print(f - {resource.name}: {resource.uri} {resource.description}) rrr await session.read_resource(docs://about) print(rrr.contents[0].mimeType, \t, rrr.contents[0].text) resources await session.list_resource_templates() for resource in resources.resourceTemplates: print(f - {resource.name}: {resource.uriTemplate} {resource.description}) rrr await session.read_resource(greeting://Jack-Ma) print(rrr.contents[0].mimeType, \t, rrr.contents[0].text) prompts await session.list_prompts() print(\n Prompts available ) for prompt in prompts.prompts: print(f - {prompt.name}: {prompt.description}) pResult await session.get_prompt(review_code, {code: echo dos bat! aaa.txt}) print(pResult.messages[0].content.text) if __name__ __main__: asyncio.run(main())输出如下D:\py_prj\mcpTestpython my_client1.py Tools available - add: 浮点加法计算器 - reverse_string: 字符串反转 - get_current_time: 获取当前时间 add(3, 4) 7.0 reverse_string(This is a MCP test.) is .tset PCM a si sihT current time: 2026-10-10T16:00:56.479329 Resources available - get_about: docs://about 返回Server基本信息 text/plain This is an MCP Server demo for the study of MCP development - get_greeting: greeting://{name} 动态资源带参数 text/plain Hello, Jack-Ma! Welcome to study MCP Server development Prompts available - review_code: Review a piece of code. Please review this code: echo dos bat! aaa.txt此图来源 参考2我们来把上述程序传输方式改成 Streamable HTTP。首先是服务器端mcp对象的settings属性中设置host和port然后 run(...) 中改传输方式并指定 path。# ....................................... # start MCP Server (stdio mode) if __name__ __main__: mcp.settings.host 0.0.0.0 mcp.settings.port 8888 mcp.run(transport streamable-http, mount_path/mcp)再修改客户端其实就是创建 client 对象的语句改动了一下from mcp import ClientSession #, StdioServerParameters #from mcp.client.stdio import stdio_client from mcp.client.streamable_http import streamable_http_client import asyncio async def main(): # server_params StdioServerParameters( # commandpython, # args[my_first_mcp_server.py], # ) # async with stdio_client(server_params) as (r, w): async with streamable_http_client(http://localhost:8888/mcp) as (r, w, _): # .......................................................一个终端运行服务端另一个终端运行客户端。客户端的输出是和前面一样的服务端的输出如下多次运行客户端服务端输出会从 Created new transport with session ID: 这里开始D:\py_prj\mcpTestpython my_first_mcp_server.py [32mINFO[0m: Started server process [[36m16216[0m] [32mINFO[0m: Waiting for application startup. [10/12/26 12:28:10] INFO StreamableHTTP session manager started streamable_http_manager.py:164 [32mINFO[0m: Application startup complete. [32mINFO[0m: Uvicorn running on [1mhttp://0.0.0.0:8888[0m (Press CTRLC to quit) [10/12/26 12:28:34] INFO Created new transport with session ID: streamable_http_manager.py:330 5948d71511ae447c84fa31bc925c0ede [32mINFO[0m: 127.0.0.1:60822 - [1mPOST /mcp HTTP/1.1[0m [32m200 OK[0m [32mINFO[0m: 127.0.0.1:60826 - [1mGET /mcp HTTP/1.1[0m [32m200 OK[0m [32mINFO[0m: 127.0.0.1:60825 - [1mPOST /mcp HTTP/1.1[0m [32m202 Accepted[0m [32mINFO[0m: 127.0.0.1:60828 - [1mPOST /mcp HTTP/1.1[0m [32m200 OK[0m [10/12/26 12:28:35] INFO Processing request of type ListToolsRequest server.py:733 [32mINFO[0m: 127.0.0.1:60830 - [1mPOST /mcp HTTP/1.1[0m [32m200 OK[0m INFO Processing request of type CallToolRequest server.py:733 [32mINFO[0m: 127.0.0.1:60832 - [1mPOST /mcp HTTP/1.1[0m [32m200 OK[0m INFO Processing request of type CallToolRequest server.py:733 [32mINFO[0m: 127.0.0.1:60836 - [1mPOST /mcp HTTP/1.1[0m [32m200 OK[0m INFO Processing request of type CallToolRequest server.py:733 [32mINFO[0m: 127.0.0.1:60838 - [1mPOST /mcp HTTP/1.1[0m [32m200 OK[0m [10/12/26 12:28:36] INFO Processing request of type ListResourcesRequest server.py:733 [32mINFO[0m: 127.0.0.1:60840 - [1mPOST /mcp HTTP/1.1[0m [32m200 OK[0m INFO Processing request of type ReadResourceRequest server.py:733 [32mINFO[0m: 127.0.0.1:60842 - [1mPOST /mcp HTTP/1.1[0m [32m200 OK[0m INFO Processing request of type ListResourceTemplatesRequest server.py:733 [32mINFO[0m: 127.0.0.1:60844 - [1mPOST /mcp HTTP/1.1[0m [32m200 OK[0m [10/12/26 12:28:37] INFO Processing request of type ReadResourceRequest server.py:733 [32mINFO[0m: 127.0.0.1:60846 - [1mPOST /mcp HTTP/1.1[0m [32m200 OK[0m INFO Processing request of type ListPromptsRequest server.py:733 [32mINFO[0m: 127.0.0.1:60848 - [1mPOST /mcp HTTP/1.1[0m [32m200 OK[0m INFO Processing request of type GetPromptRequest server.py:733 [10/12/26 12:28:38] INFO Terminating session: 5948d71511ae447c84fa31bc925c0ede streamable_http.py:831 [32mINFO[0m: 127.0.0.1:60850 - [1mDELETE /mcp HTTP/1.1[0m [32m200 OK[0m用Wireshark捕获一下过滤器 tcp.port8888 http可以发现会话 initialize 时客户向服务器发送 POST请求头部 accept 包含了application/json, text/event-stream 服务器回复 200 text/event-stream响应头部包含了 mcp-session-id。之后客户会先向服务器发送一个空的 GET 请求根据参考6这是客户想升级为SSE的意思头部包含了 mcp-protocol-version: 2025-11-25 表明了客户端支持的协议版本再发送 POST 请求以通知消息告诉服务器 initialized 初始化结束客户端准备就绪服务器则以 202 回复表示知道了但事情还没完因为之后会有更多 SSE。如果服务器压根不支持客户端提出的协议连接就该终止。。此后基本上是客户端一个POST请求服务端以 text/event-stream 内容格式下发数据。这个流程其实和HTTP with SSE差不多但 Streamable HTTP 是允许服务器只支持无状态的HTTP而不支持SSE的从 2026-07-28 版本协议彻底改成无状态来看Streamable HTTP 像一个过渡产品。参考1MCP协议实战用Python 5分钟搭建一个MCP Server附完整代码https://zhuanlan.zhihu.com/p/2056732722438090859#:~:text%E6%9C%AC%E6%96%87%E7%94%A8%E4%B8%80%E6%AE%B5%E5%8F%AF%E7%9B%B4%E6%8E%A5%E8%BF%90%E8%A1%8C%E7%9A%84%20Python%E4%BB%A3%E7%A0%81%EF%BC%8C%E5%B8%A6%E4%BD%A0%E4%BB%8E%E9%9B%B6%E6%90%AD%E5%BB%BA%E7%AC%AC%E4%B8%80%E4%B8%AA%20MCP%20Server%EF%BC%8C%E8%A7%A3%E5%86%B3%22Agent%E6%83%B3%E6%93%8D%E4%BD%9C%E6%95%B0%E6%8D%AE%E5%BA%93%2F%E6%9F%A5%E5%A4%A9%E6%B0%94%2F%E5%8F%91%E9%82%AE%E4%BB%B6%EF%BC%8C%E5%8D%B4%E4%B8%8D%E7%9F%A5%E9%81%93%E5%A6%82%E4%BD%95%E6%A0%87%E5%87%86%E5%8C%96%E6%8E%A5%E5%85%A5%22%E7%9A%84%E7%97%9B%E7%82%B9%E3%80%82%20%E9%80%82%E5%90%88%E6%9C%89Python%E5%9F%BA%E7%A1%80%E7%9A%84%E5%BC%80%E5%8F%91%E8%80%85%E9%98%85%E8%AF%BB%EF%BC%8C%E9%99%84%E5%AE%8C%E6%95%B4%E6%8A%A5%E9%94%99%E6%8E%92%E6%9F%A5%E6%8C%87%E5%8D%97%E3%80%82%202024%E5%B9%B411%E6%9C%88%EF%BC%8C,Anthropic%20%E5%8F%91%E5%B8%83%E4%BA%86%20MCP%E5%8D%8F%E8%AE%AE%EF%BC%8C%E5%88%9D%E8%A1%B7%E5%BE%88%E7%AE%80%E5%8D%95%EF%BC%9A%E8%AE%A9%20AI%20Agent%20%E8%BF%9E%E6%8E%A5%E5%A4%96%E9%83%A8%E5%B7%A5%E5%85%B7%E6%97%B6%EF%BC%8C%E4%B8%8D%E5%86%8D%E9%9C%80%E8%A6%81%E4%B8%BA%E6%AF%8F%E4%B8%AA%E5%B7%A5%E5%85%B7%E5%86%99%E4%B8%80%E5%A5%97%E5%AE%9A%E5%88%B6%E5%8C%96%E7%9A%84%E8%83%B6%E6%B0%B4%E4%BB%A3%E7%A0%81%E3%80%82https://zhuanlan.zhihu.com/p/2056732722438090859#:~:text%E6%9C%AC%E6%96%87%E7%94%A8%E4%B8%80%E6%AE%B5%E5%8F%AF%E7%9B%B4%E6%8E%A5%E8%BF%90%E8%A1%8C%E7%9A%84%20Python%E4%BB%A3%E7%A0%81%EF%BC%8C%E5%B8%A6%E4%BD%A0%E4%BB%8E%E9%9B%B6%E6%90%AD%E5%BB%BA%E7%AC%AC%E4%B8%80%E4%B8%AA%20MCP%20Server%EF%BC%8C%E8%A7%A3%E5%86%B3%22Agent%E6%83%B3%E6%93%8D%E4%BD%9C%E6%95%B0%E6%8D%AE%E5%BA%93%2F%E6%9F%A5%E5%A4%A9%E6%B0%94%2F%E5%8F%91%E9%82%AE%E4%BB%B6%EF%BC%8C%E5%8D%B4%E4%B8%8D%E7%9F%A5%E9%81%93%E5%A6%82%E4%BD%95%E6%A0%87%E5%87%86%E5%8C%96%E6%8E%A5%E5%85%A5%22%E7%9A%84%E7%97%9B%E7%82%B9%E3%80%82%20%E9%80%82%E5%90%88%E6%9C%89Python%E5%9F%BA%E7%A1%80%E7%9A%84%E5%BC%80%E5%8F%91%E8%80%85%E9%98%85%E8%AF%BB%EF%BC%8C%E9%99%84%E5%AE%8C%E6%95%B4%E6%8A%A5%E9%94%99%E6%8E%92%E6%9F%A5%E6%8C%87%E5%8D%97%E3%80%82%202024%E5%B9%B411%E6%9C%88%EF%BC%8C,Anthropic%20%E5%8F%91%E5%B8%83%E4%BA%86%20MCP%E5%8D%8F%E8%AE%AE%EF%BC%8C%E5%88%9D%E8%A1%B7%E5%BE%88%E7%AE%80%E5%8D%95%EF%BC%9A%E8%AE%A9%20AI%20Agent%20%E8%BF%9E%E6%8E%A5%E5%A4%96%E9%83%A8%E5%B7%A5%E5%85%B7%E6%97%B6%EF%BC%8C%E4%B8%8D%E5%86%8D%E9%9C%80%E8%A6%81%E4%B8%BA%E6%AF%8F%E4%B8%AA%E5%B7%A5%E5%85%B7%E5%86%99%E4%B8%80%E5%A5%97%E5%AE%9A%E5%88%B6%E5%8C%96%E7%9A%84%E8%83%B6%E6%B0%B4%E4%BB%A3%E7%A0%81%E3%80%82参考2规范 – Model Context Protocol Specification参考3协议规范 What is the Model Context Protocol (MCP)? - Model Context Protocol参考4 MCP Python SDK - MCP Python SDK参考5(99 封私信 / 99 条消息) 跟着MCP官方学习Python SDK精华版 - 知乎参考6MCP 协议更新详解从 HTTPSSE 到 Streamable HTTPStreamable HTTP 是对 MC - 掘金