资讯动态

动手造一个 MCP“翻译器“:让 AI 学会调用你的工具

发布时间:2026/8/11 9:17:07 来源:尧图企业网站定制
动手造一个 MCP翻译器让 AI 学会调用你的工具开场AI 不是魔法它只是不会用工具你肯定用过 ChatGPT 或者其他 AI 助手问它北京今天天气怎么样它可能回答得头头是道——但如果你仔细看会发现它其实是在猜或者用的是很久以前的训练数据。为什么因为 AI 模型本身看不到外面的世界。它就像一个关在图书馆里的学霸书读得再多也不知道窗外现在是晴是雨。要让 AI 真正有用得教它用工具——查天气就调天气 API查股票就连数据库要画图就启动画图程序。但问题来了每个工具的用法都不一样怎么让 AI 知道这个工具叫什么名字、需要什么参数、能干什么事MCPModel Context Protocol模型上下文协议就是一套说明书标准让所有工具都用同一种格式告诉 AI“我能做什么你该怎么调用我。”今天我们不讲大道理直接动手造一个——让 AI 学会查天气、翻译文字全程不到 100 行代码。第一步搞清楚 MCP 到底在干什么想象你开了一家工具店有扳手、锤子、电钻。客户AI想借工具但它不认识你的工具你得准备三样东西菜单列出你有哪些工具tools/list说明书每个工具的名字、用途、需要什么参数实际执行客户选好工具、填好参数你帮它干活tools/callMCP 就是这套菜单 说明书 执行的标准格式。它用JSON-RPC这种通信方式就是一问一答的消息格式让 AI 和工具能对话AI: 嘿你有什么工具 工具: 我有查天气、翻译两个工具。 AI: 我要用查天气参数是城市北京。 工具: 好结果是晴天15°C。第二步造一个最简单的 MCP 服务器我们用 Python 写一个工具服务器叫Server提供两个工具get_weather查天气假装查实际随机返回translate翻译文字简单字典替换安装工具先装一个官方 SDK它帮你处理那些繁琐的消息格式pipinstallmcp写代码新建一个文件my_tools.py# my_tools.pyfrommcp.server.fastmcpimportFastMCPimportrandom# 创建一个 MCP 服务器名字叫我的工具箱mcpFastMCP(我的工具箱)# 工具 1查天气 mcp.tool()defget_weather(city:str)-str:查询指定城市的天气这是给 AI 看的说明# 这里简化了实际应该调真的天气 APIweathers[晴天 ☀️,多云 ⛅,下雨 ️,雾霾 ]temprandom.randint(5,35)weatherrandom.choice(weathers)returnf{city}现在是{weather}气温{temp}°C# 工具 2翻译 mcp.tool()deftranslate(text:str,to_lang:str)-str:把文字翻译成指定语言支持en英文, ja日文# 超级简陋的字典翻译你可以接入真的翻译 APIvocab{en:{你好:Hello,再见:Goodbye,谢谢:Thank you},ja:{你好:こんにちは,再见:さようなら,谢谢:ありがとう},}wordsvocab.get(to_lang,{})returnwords.get(text,f[不认识这个词:{text}])# 启动服务器if__name____main__:mcp.run()代码解释mcp.tool()这是个装饰器告诉 SDK这个函数是一个工具自动生成说明书。函数名get_weather就是工具名参数city: str自动变成这个工具需要一个叫 city 的字符串参数注释 是给 AI 看的让它知道这工具是干嘛的mcp.run()启动服务器开始监听 AI 的请求。第三步让 AI 连上你的工具箱现在你有了工具箱Server还需要一个AI 助手Client去调用它。官方的 Claude Desktop 或者一些 AI 应用支持 MCP但我们自己写一个简单的测试客户端更有意思。新建test_client.py# test_client.pyimportasynciofrommcpimportClientSession,StdioServerParametersfrommcp.client.stdioimportstdio_clientasyncdefmain():# 1. 连接到我们刚才写的工具服务器server_paramsStdioServerParameters(commandpython,args[my_tools.py])asyncwithstdio_client(server_params)as(read,write):asyncwithClientSession(read,write)assession:# 2. 初始化握手awaitsession.initialize()# 3. 看看有哪些工具toolsawaitsession.list_tools()print( 工具箱里有)fortoolintools.tools:print(f -{tool.name}:{tool.description})# 4. 调用查天气工具print(\n️ 测试查天气)resultawaitsession.call_tool(get_weather,{city:上海})print(f 结果{result.content[0].text})# 5. 调用翻译工具print(\n 测试翻译)resultawaitsession.call_tool(translate,{text:你好,to_lang:ja})print(f 结果{result.content[0].text})if__name____main__:asyncio.run(main())运行python test_client.py你会看到 工具箱里有 - get_weather: 查询指定城市的天气这是给 AI 看的说明 - translate: 把文字翻译成指定语言支持en英文, ja日文 ️ 测试查天气 结果上海现在是多云 ⛅气温 22°C 测试翻译 结果こんにちは恭喜你刚刚实现了一个符合 MCP 协议的工具系统。第四步让真正的 AI 用你的工具上面的test_client.py是我们手动调工具。真正酷的是让AI 自己决定该用哪个工具。比如你问东京天气怎么样AI 自己发现该调get_weather参数填city东京。这需要一个支持function calling函数调用的 AI 模型比如 Claude、GPT-4、Gemini 等。我们用 Claude 举例# ai_assistant.pyimportasyncioimportanthropicfrommcpimportClientSession,StdioServerParametersfrommcp.client.stdioimportstdio_clientasyncdefmain():# 连接你的 MCP 工具服务器server_paramsStdioServerParameters(commandpython,args[my_tools.py])asyncwithstdio_client(server_params)as(read,write):asyncwithClientSession(read,write)assession:awaitsession.initialize()# 获取工具列表tools_respawaitsession.list_tools()# 转换成 Claude 能理解的格式tools[{name:t.name,description:t.description,input_schema:t.inputSchema,}fortintools_resp.tools]# 创建 AI 客户端需要 API keyclientanthropic.Anthropic()# 用户的问题user_query帮我查一下北京的天气然后把结果翻译成英文print(f 用户{user_query}\n)# 第一轮让 AI 决定用什么工具responseclient.messages.create(modelclaude-3-5-sonnet-20241022,max_tokens1024,toolstools,messages[{role:user,content:user_query}])# 处理 AI 的决策messages[{role:user,content:user_query}]whileresponse.stop_reasontool_use:# AI 决定要用工具了tool_usenext(blockforblockinresponse.contentifblock.typetool_use)print(f AI 决定调用工具{tool_use.name})print(f 参数{tool_use.input}\n)# 实际执行工具resultawaitsession.call_tool(tool_use.name,tool_use.input)result_textresult.content[0].textprint(f⚙️ 工具返回{result_text}\n)# 把结果告诉 AImessages.append({role:assistant,content:response.content})messages.append({role:user,content:[{type:tool_result,tool_use_id:tool_use.id,content:result_text,}],})# 继续对话responseclient.messages.create(modelclaude-3-5-sonnet-20241022,max_tokens1024,toolstools,messagesmessages,)# 最终回答final_answernext(block.textforblockinresponse.contentifhasattr(block,text))print(f AI 最终回答{final_answer})if__name____main__:asyncio.run(main())运行结果可能像这样 用户帮我查一下北京的天气然后把结果翻译成英文 AI 决定调用工具get_weather 参数{city: 北京} ⚙️ 工具返回北京现在是晴天 ☀️气温 18°C AI 决定调用工具translate 参数{text: 晴天, to_lang: en} ⚙️ 工具返回[不认识这个词: 晴天] AI 最终回答北京现在是晴天气温 18°C。不过抱歉我的翻译工具词汇有限无法翻译晴天这个词。看到了吗AI 自己决定了先用get_weather查天气再用translate翻译发现翻译失败后诚实地告诉用户你没有告诉它这些步骤——它看到工具说明书后自己推理出来的。重点你刚刚做到了什么造了一个符合工业标准的工具接口你的my_tools.py遵循 MCP 协议理论上任何支持 MCP 的 AI 应用Claude Desktop、VSCode 插件等都能直接用不需要改代码。让 AI 学会了看说明书AI 不是魔法它只是读了你的工具描述查询指定城市的天气和参数定义city: str然后推理出该怎么用。体验了协议的威力你没有为 Claude 单独写适配代码也没有告诉它第一步干嘛第二步干嘛。协议就像语言只要大家都遵守就能无障碍沟通。你可以改进的方向现在这个工具箱很简陋你可以往几个方向升级1. 接入真实 API把假天气换成真的比如用 OpenWeatherMap APIimportrequestsmcp.tool()defget_weather(city:str)-str:api_key你的API密钥urlfhttps://api.openweathermap.org/data/2.5/weather?q{city}appid{api_key}unitsmetriclangzh_cnresprequests.get(url).json()returnf{city}{resp[weather][0][description]}{resp[main][temp]}°C2. 加更多工具mcp.tool()defcalculate(expression:str)-str:计算数学表达式如 23*4try:resulteval(expression)# 注意实际项目要用安全的解析器returnf{expression}{result}except:return表达式有误mcp.tool()defsearch_web(query:str)-str:在网上搜索信息# 接入搜索引擎 APIreturnf搜索{query}的结果...3. 做个网页版把 Server 改成 HTTP 接口用mcp.server的 HTTP 传输然后做一个网页聊天界面让朋友也能和你的 AI 工具助手对话。4. 研究AI 怎么选工具如果你有 30 个工具AI 会不会选错试试故意加一些名字相似的工具比如get_weather和fetch_weather看 AI 会不会混淆。这就是前面那篇评测文章在研究的问题。最后为什么这件事重要你可能听过AI AgentAI 代理这个词——就是能自主完成任务的 AI。比如你说帮我订明天去杭州的火车票它自己查余票、选座位、付款。Agent 的核心就是用工具。而 MCP 是第一个被大公司Anthropic推广、真正有可能成为标准的工具协议。你今天写的这 100 行代码本质上和那些价值几百万的 AI 系统用的是同一套协议。协议的美妙就在于无论是高中生的小项目还是大公司的产品只要遵守同一套规则就能互相连接。现在你已经从AI 用户升级成了AI 工具开发者。去造更有趣的工具吧——让 AI 帮你控制智能家居、自动整理照片、甚至写作业别被老师发现。代码在手AI 听我的。这才是编程的乐趣所在。后记2026年8月10日于上海在claude opus 4.8辅助下完成。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价