在人工智能技术快速发展的今天,如何有效整合各类工具能力成为提升大模型实用性的关键。Claude推出的MCP(Model Collaboration Protocol)协议正是为解决这一需求而设计的标准化交互方案。
这里通过一个加法计算器的完整实现案例,写代码之前需要选择一个编码工具。在 AI 盛行的当下自然要选择一款 AI 编程工具。 这里选择字节的 Trae 来开发MCP服务的技术实践。当然这里 Trae 除了作为写代码工具,还有就是当成 MCP client,目前像 Cursor、Trae、Cline、Claude Desktop 等都可以成为MCP Host,而这些工具里创建的智能体就可以成为 MCP Client。
以下是一个完整MCP服务的实现过程:
一、MCP 开发与使用
Step1:环境准备
安装最新版 python MCP 依赖包:
pip install "MCP[cli]"#当然你也可以使用uvuv add "MCP[cli]"
Step2:MCP server代码
创建 MCP_calculator_server.py:
# server.pyfrom MCP.server.fastMCP import FastMCP# 创建一个MCP服务器实例# Demo为服务器名称,用于标识这个MCP服务MCP = FastMCP("Demo")# 添加一个加法工具函数# @MCP.tool()装饰器将这个函数注册为MCP工具@MCP.tool()def add(a: int, b: int) -> int: """实现两个数字相加的功能""" return a + b# 添加一个动态问候资源# @MCP.resource装饰器定义了一个动态URL路由,其中{name}是一个变量部分@MCP.resource("greeting://{name}")def get_greeting(name: str) -> str: """生成个性化的问候语""" return f"Hello, {name}!"# 启动MCP服务器if __name__ == "__main__": MCP.run()
@MCP.tool 注册为工具
@MCP.resource 注册为资源
协议原语 :MCP 定义了三大类“原语”
- Resources(资源),资源相当于静态数据块Tools(工具),资源相当于静态数据块Prompts(提示词模板),提示词模板是一些预设的对话或工作流程。
关于协议原语官方文档中也有相应的介绍。
代码使用了 MCP 官方的 python SDK,也就是使用 MCP 的话我们可以使用现存官方提供的 SDK 不需要我们自己去实现。官方有提供 ts、python、java、kotlin、C#的 SDK 及相应的 demo
这里使用的是 python 的 sdk 与 demo,当然你如果不想写代码也可以直接使用官方现存的 MCP server 程序。
后面也会具体在 Trae 上演示。
Step3:Trae MCP servers 配置
代码编写好后,在 Trae 里选择"设置",再选择 MCP
进入 MCP 后选择添加
选择手动配置
在这里参考示例进行配置
我是在 windows 下的代码,所以配置时路径是 \ 双斜杠
{ "MCPServers": { "MCP_calculator_server": { "command": "python", "args": [ "D:\code\local\python\email\MCP_calculator_server.py" ] } }}
配置好后,如果 显示为绿色的勾说明已经配置成功了
如果出现 “重试”,就是有错,这时可以看一下日志
日志文件为 MCP-servers-host.log,在 MCP 里 Trae 或 cursor 就是 host
Step4:Trae 智能体配置
再创建一个智能体来引用刚才的 MCP 服务
当然这里还会出现之前增加过的 MCP server 或内置的一些 MCP server。
可以看到
那当然 resource 也是可以触发调用的
到这里就已经完成 MCP 的开发与调用了。
二、补充内容
1、内置的 MCP server
在新建 MCP Server 时,这里会出现 Trae MCP 市场内置的 MCP server 可以看到官方提供的 MCP server 都在里面,如果需要使用也是非常的方便的。
2、调试 MCP
一般来说写完的代码可以使用 MCP 官方提供的测试工具先来调试自己的程序,这里可以直接调用和看日志
npx @modelcontextprotocol/inspector python MCP_calculator_server.py
运行命令后,在浏览器打开调试页面
3、调用方式
是否 mcp client 与 mcp server 必须在同一台电脑上?
这里演示的是使用命令直接调用本地文件的方式,一般来说函数很多都是通过接口的方式提供的。当然 MCP 也是支持的,也就是说是支持远程调用的。
MCP 传输层处理 clients 和 servers 之间的实际通信。MCP 支持多种传输机制:
- Stdio 传输
- 使用标准输入/输出进行通信适用于本地进程
- 通过 HTTP 的 SSE 传输
- 使用服务器发送事件进行服务器到客户端的消息传递使用 HTTP POST 进行客户端到服务器的消息传递
所有传输都使用 JSON-RPC 2.0 进行消息交换。
要实现远程调用,也就是这里说的 sse 的方式,但好像一般网上 sse 的方式都非常的少。
sse mcp server 程序
import argparsefrom mcp.server.fastmcp import FastMCPfrom starlette.applications import Starlettefrom mcp.server.sse import SseServerTransportfrom starlette.requests import Requestfrom starlette.routing import Mount, Routefrom mcp.server import Serverimport uvicorn # 初始化 FastMCP 实例mcp = FastMCP("api-mcp-calc") @mcp.tool()def add(a: float, b: float) -> float: """Add two numbers""" return a + b # 创建 Starlette 应用def create_starlette_app(mcp_server: Server, *, debug: bool = False) -> Starlette: sse = SseServerTransport("/messages/") async def handle_sse(request: Request) -> None: async with sse.connect_sse( request.scope, request.receive, request._send, ) as (read_stream, write_stream): await mcp_server.run( read_stream, write_stream, mcp_server.create_initialization_options(), ) return Starlette( debug=debug, routes=[ Route("/sse", endpoint=handle_sse), Mount("/messages/", app=sse.handle_post_message), ], ) # 主程序入口if __name__ == "__main__": # 创建并运行 Starlette 应用 starlette_app = create_starlette_app( mcp._mcp_server, debug=True) uvicorn.run(starlette_app, host='0.0.0.0', port=18080)
然后启动程序:
python api_mcp_calc.py
trac 配置
{ "mcpServers": { "api-mcp-calc": { "url": "http://localhost:18080/sse" } }}
可以看到已经触发调用服务了
也可以通过inspector 调试http://localhost:18080/sse
我是栈江湖,如果你喜欢此文章,不要忘记点赞+关注!