MCP实战:一个Server给三个Agent用
简单说,MCP就是把“工具定义”和“具体实现”分开了。Server负责提供工具(带参数描述的函数),Client(比如Claude Code)负责把这些描述喂给大模型。模型决定调用哪个工具,Client再把请求转发给Server。
这套机制最让我觉得不靠谱(但也最关键)的地方在于它的传输协议:默认走的是stdio。也就是说,Client把Server当成子进程启动,通过标准输入输出传JSON。
这里有个大坑:MCP Server绝对不能在代码里随便用 print()。因为stdout被协议占用了,你随手写个 print("debug info") 就会直接把协议报文搞脏,导致Client端解析报错,直接崩溃。所有日志必须强行输出到stderr。
我试了一套用FastMCP搭建的方案,代码量极少,直接用装饰器定义工具:
from mcp.server.fastmcp import FastMCPmcp = FastMCP("NB2Lite Agent")
@mcp.tool()
def generate_image(
prompt: str, aspect_ratio: str = "1:1", thinking_level: str = "low"
) -> str:
"""Generates a new image from a text prompt."""
# 实际调用Gemini API的逻辑
return "image_path"
在这种架构下,无论你是用Claude Code、Python写的ADK Agent,还是用Rust写的CLI,只要配置文件里指向这个 server.py,它们都能瞬间获得生成图片的能力。
几个核心维度的对比:
对于追求安全和统一管理的工程来说,这种解耦方式比在每个Agent里硬编码API Key和调用逻辑要稳得多。