探索MCP:模型上下文协议
概述
MCP (Model Context Protocol) 是一种专为大型语言模型 (LLM) 设计的协议,旨在打通模型与外部数据源、工具及服务之间的壁垒,实现无缝集成。
传输方式
MCP主要支持以下几种传输方式:
stdio
(标准输入/输出)
这是最基础和通用的传输方式。它通过标准输入流读取数据,并向标准输出流写入结果,非常适合本地开发、命令行工具 (CLI) 和代理插件的集成。
sse
(服务器发送事件)
SSE 基于标准的 HTTP 协议,用于解决远程服务的访问问题。在此模式下,MCP 服务作为一个独立的 Web 服务器运行,能够处理来自多个客户端的并发连接。
streamable-http
(可流式传输的HTTP)
这是MCP协议在新版本中引入的新传输机制,作为 SSE 的强大替代方案。它同样基于 HTTP POST/GET 请求,并利用服务器发送事件 (SSE) 的能力来高效地流式传输多条服务器消息。
构建一个简单的MCP服务
MCP服务示例
使用 FastMCP
可以轻松创建一个MCP服务。
from mcp.server.fastmcp import FastMCP# 初始化MCP服务实例mcp = FastMCP("My_Mcp_Server")@mcp.tool()def sum(a: int,b: int) -> int: """ 两个数相加求和 Args: a (int): 整数a b (int): 整数b Returns: int: 两个数的和 """ return a+bif __name__ == '__main__': # 启动MCP服务,使用标准输入输出作为传输方式 mcp.settings.host = "0.0.0.0" mcp.settings.port = 8000 mcp.run(transport='stdio') print("MCP服务已启动,等待工具调用...")
在本地使用MCP服务
在支持MCP的 AI工具(如 trae
)中,可以通过简单的JSON配置来注册和使用本地服务。
配置 mcp.json
文件:
{ "mcpServers": { "My_Mcp_Server": { "command": "python", "args": [ "D:\\WorkSpace\\AI\\demo\\main.py" ] } }}
配置完成后,可以在工具中看到服务状态。现在,向 AI 提问,验证服务是否被成功调用。
部署并远程调用MCP服务
本地
stdio
模式非常适合开发和调试,但若要让服务被公开访问,则需要将其部署为网络服务。这可以通过sse
或streamable-http
协议实现。
切换传输协议
只需在服务入口文件中修改一行代码,即可切换传输协议。
if __name__ == '__main__': # 启动 MCP 服务,使用 sse 或 streamable-http 协议 # mcp.run(transport='stdio') mcp.settings.host = "0.0.0.0" mcp.settings.port = 8000 mcp.run(transport='sse') # mcp.run(transport='streamable-http')
在AI客户端中配置远程服务
以 Cherry Studio
为例,添加一个新的MCP服务,并根据选择的协议进行配置。
- 使用
sse
协议:选择 sse
类型,并输入服务地址,格式为 http://<IP>:<端口>/sse
。- 使用
streamable-http
协议:选择 streamableHttp
类型,URL 地址格式为 http://<IP>:<端口>/mcp
。在AI开发工具中配置远程服务
可以将
Cherry Studio
中的图形化配置导出为 JSON,以便在其他开发工具(如 Cursor、VSCode)中使用。
将导出的 JSON 粘贴到开发工具的配置文件中。请注意:某些工具(如 Cursor)要求将 baseUrl
字段名修改为 url
才能正确识别。
{ "mcpServers": { "A_N9cktV9xBWJfUv4w3Ug": { "name": "我的MCP服务器", "type": "streamableHttp", "description": "", "isActive": true, "tags": [], "url": "http://localhost:8000/mcp" } }}
配置完成后,即可在开发工具中看到服务已成功连接。
将MCP服务打包为Python包
将开发好后的工具封装成一个 Python 包并发布到 PyPI,是与社区共享成果的最佳方式。其他用户只需一条命令即可安装和使用所开发的MCP服务。
初始化项目
使用 uv
可以快速创建一个结构规范的Python项目。
# 创建并进入项目目录mkdir ccyy_mcpcd ccyy_mcp# 当前目录下初始化 创建一个结构化的、可以打包分发的Python项目uv init . --package
uv会创建一个src目录,并在里面建立一个与项目同名的子目录,里面还包含一个 __init__.py
文件。这种结构是Python打包的推荐做法。
添加依赖
uv add "mcp[cli]"
编写服务与入口脚本
将之前的服务代码放入
src/ccyy_mcp/main.py
。然后,在src/ccyy_mcp/__init__.py
中创建一个main
函数作为命令行入口。
在 __init__.py
同级目录创建main.py
文件编写MCP服务代码
from mcp.server.fastmcp import FastMCP# 初始化MCP服务实例mcp = FastMCP("My_Mcp_Server")@mcp.tool()def sum(a: int,b: int) -> int: """ 两个数相加求和 Args: a (int): 整数a b (int): 整数b Returns: int: 两个数的和 """ return a+bif __name__ == '__main__': # 启动MCP服务,使用标准输入输出作为传输方式 mcp.run(transport='stdio')
在 __init__.py
文件中配置启动MCP服务
from ccyy_mcp.main import mcpdef main() -> None: mcp.settings.host = "0.0.0.0" mcp.settings.port = 8000 mcp.run(transport='stdio') print("MCP服务已启动,等待工具调用...")
打包构建
默认情况下,执行uv build
后,所有生成的打包文件(.whl 和 .tar.gz
)都会被放置在项目根目录下的一个名为dist
的文件夹里
uv build
获取Token
首先,访问Pypi官网,在Account settings
菜单栏下找到API tokens
并执行Add API token
进行添加一个Token
发布到Pypi
在项目根目录执行以下命令将构建的Python包发布到Pypi网站
uv publish --token Token
发布成功后,就可以在PyPI网站的 Your projects
页面看到包信息。
使用发布的包
现在,任何用户都可以通过
uvx
(或pipx
)直接运行发布的MCP服务,无需手动下载代码。
在 Cherry Studio
中使用:command
填 uvx
,args
填写包名 ccyy-mcp
。
在AI开发工具中配置:
{ "mcpServers": { "My_Mcp_Server": { "command": "uvx", "args": [ "ccyy-mcp" ] } }}