当前位置: 首页 > news >正文

[具身智能-338]:mcp server代码格式详解

编写 MCP Server 的代码格式其实并不复杂,但有几个“铁律”必须遵守,否则客户端(如 Claude Desktop)无法识别。

结合你之前问的 Python 函数定义,我们可以把 MCP Server 的代码格式拆解为三个核心部分:通信协议格式代码结构格式、以及数据定义格式

1. 通信协议格式(底层铁律)

这是 MCP Server 与客户端“对话”的语言。无论你用什么语言写,必须遵守JSON-RPC 2.0标准。

  • 传输方式:通过标准输入(stdin)读取,标准输出(stdout)写入。
  • 数据格式:必须是严格的JSON对象。
  • 绝对禁忌严禁在 stdout 中打印任何非 JSON 内容(如print("debug")),这会导致协议解析失败。调试信息必须发到 stderr。

消息的基本骨架(JSON-RPC 2.0):

表格

类型格式示例说明
请求{"jsonrpc": "2.0", "method": "tools/list", "id": 1}客户端发来的指令
响应{"jsonrpc": "2.0", "result": {...}, "id": 1}服务器返回的结果
错误{"jsonrpc": "2.0", "error": {"code": -32601, "message": "..."}, "id": 1}报错信息

2. 代码结构格式(Python 实战)

在实际开发中,我们通常使用Python SDK (mcp) 来简化开发,不需要手写底层的 JSON 解析。一个标准的 MCP Server 代码结构通常包含以下四个步骤:

第一步:导入与初始化

必须导入FastMCP类,并实例化一个服务器对象。

python

from mcp.server.fastmcp import FastMCP # 初始化服务器,给它起个名字 mcp = FastMCP("MyCustomServer")
第二步:定义工具(核心业务逻辑)

这是你最熟悉的部分——定义 Python 函数。但在 MCP 中,格式上有两个特殊要求:

  1. 装饰器必须使用@mcp.tool()装饰器。
  2. 文档字符串:函数内部必须有"""..."""注释,虽然是注释,但非常非常的重要,这是 AI 理解工具功能的唯一依据,是AI大模型通过自然语言找到该工具的依据!!!包括功能描述,输入参数清单和含义。
  3. 类型提示:参数类型(如name: str)和返回类型(-> int必须准确,AI 依赖这些信息来传参。虽然这些注释对python代码没啥直接的约束力,但这些注释对于AI理解函数工具的参数类型和返回值的类型很有意义,是AI大模型通过自然语言理解入口参数的依据!!!!
  4. 从编程的角度看,看是没有意义的注释,对于理解自然语言的AI却非常有意义,有作用。是AI大模型通过自然语言找到对应tool的依据!!!

python

@mcp.tool() def calculate_tax(price: float, rate: float) -> float: """ 计算商品价格及税率。 Args: price: 商品的原始价格 rate: 税率比例(例如 0.1 代表 10%) """ return price * (1 + rate)
第三步:定义资源(可选)

如果你想让 AI 读取某些文件作为上下文(类似只读文件),使用@mcp.resource

python

@mcp.resource("config://app_settings") def get_settings() -> str: """提供应用的配置信息""" return "当前环境: 生产环境; 版本: 1.0"
第四步:启动入口

代码的最后必须有运行入口,通常使用stdio传输模式。

python

if __name__ == "__main__": mcp.run(transport='stdio')

3. 数据定义格式(JSON Schema)

虽然你在 Python 代码中写的是函数,但 MCP Server 最终会将其转换为 JSON Schema 格式发送给客户端。

当你定义了上面的calculate_tax函数后,MCP 会自动生成如下格式的元数据给 AI:

json

{ "name": "calculate_tax", "description": "计算商品价格及税率...", "inputSchema": { "type": "object", "properties": { "price": { "type": "number", "description": "商品的原始价格" }, "rate": { "type": "number", "description": "税率比例..." } }, "required": ["price", "rate"] } }

注意:这就是为什么 Python 函数中的类型提示(float,str)和文档字符串如此重要的原因,它们直接决定了这个 JSON Schema 的生成质量。

4. 完整的标准模板

你可以直接复制这个模板作为开发的起点:

python

#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ MCP Server 标准模板 """ from mcp.server.fastmcp import FastMCP # 1. 初始化 mcp = FastMCP("TemplateServer") # 2. 定义工具 @mcp.tool() def my_tool(param_a: str) -> str: """ 这是一个示例工具。 请详细描述这个工具的功能,AI 会根据这个描述决定是否调用它。 Args: param_a: 参数的描述 """ # 你的业务逻辑 return f"处理结果: {param_a}" # 3. 启动 if __name__ == "__main__": # 必须使用 stdio 模式与大多数客户端通信 mcp.run()

总结:MCP 代码格式的“三要三不要”

表格

类别说明
写类型提示name: str必须写,否则 AI 不知道传什么类型。
写文档字符串"""..."""必须写,这是 AI 的“说明书”。
用 Stdio启动时通常用mcp.run()transport='stdio'
不要用 Print

严禁在函数里print()调试,会破坏 JSON 协议,请用sys.stderr.write()

不要缺参数描述尽量把参数解释清楚,AI 才能填对参数。
不要阻塞主线程

工具执行要快,不要写死循环,否则客户端会卡死。

client采用同步阻塞性的方式远程调用tools对应的函数。

http://www.jsqmd.com/news/621315/

相关文章:

  • Python实战:如何高效获取RealSense D405相机内参矩阵
  • 378. Java IO API - 遍历文件树
  • Claude频发Bug,AI安全引担忧
  • VS2013创建首个C++程序教程
  • 2030年软件工程教育新图景:测试从业者的专业转型之路
  • 深入解析3A与ISP算法:从基础概念到实际应用
  • AI Agent 架构图解:大模型、记忆、RAG 与工具调用的协同机制畏
  • 10万开发者调查证实AI写的代码大部分是垃圾,这个Harness Engineering方法论把产出质量拉高了3倍
  • 告别一人一链!微信URL Scheme新规详解:如何让同一个链接被千万用户访问
  • Arduino嵌入式Modbus RTU通信实战指南
  • 雪女-斗罗大陆-造相Z-Turbo生成视频封面实战:结合AE模板批量产出
  • Qwen3.5-4B-Claude-Opus详细步骤:修改系统提示词打造专属AI助教方法
  • 单片机实战:按键切换LED流水灯模式与定时器中断的协同设计
  • Deneyap气压传感器模块与MS5637嵌入式驱动开发指南
  • AI理论能力或吞噬美国就业市场?真相并非如此
  • 深入解析SQL中的SYSDATE函数:从基础到高级应用
  • DeepSeek V4将至,基础设施能扛住吗?
  • Qwen2.5-VL图文对话模型应用:智能识图助手快速搭建与体验
  • 高效开发者的秘密武器:深度工作与心流状态
  • 从湖北师大真题看C语言核心考点:循环、递归、数组实战避坑指南
  • Krita AI绘画插件终极指南:如何一键实现智能选区与背景移除
  • 基于分时电价的改进粒子群算法在电动汽车充放电优化调度中的应用
  • BRIICK单总线按键模块:嵌入式低功耗矩阵键盘解决方案
  • M5-SX127x:面向ESP32的轻量级LoRa驱动库
  • PS2键盘鼠标接口电路设计实战指南
  • 当AI学会编程,我们还能做什么较
  • Stable Diffusion像素化创新:Pixel Fashion Atelier对复古RPG UI的现代化重构
  • VS2015环境下FreeImage库的安装与配置全攻略(含常见问题解决)
  • 一文讲清,精益成本管理是什么意思?精益成本的核心是什么?
  • 使用 Cloudlare 实现免费邮箱服务器搭建