从零搭建 MCP Server:让 AI 助手调用你的本地工具
说实话,今年 AI 圈最火的概念之一就是 MCP。如果你还没搞懂它是啥,或者想动手搭一个但不知道从哪下手,这篇文章就是为你准备的。
什么是 MCP?一句话说清楚
MCP(Model Context Protocol)是 Anthropic 推的一个开放协议,说白了就是给 AI 模型开了个"后门",让它能跟外部工具对话。想象一下,以前你问 ChatGPT"帮我查一下本地文件",它只能摊手说"我做不到"。有了 MCP,它可以直接调用你的文件系统、数据库、甚至控制你的浏览器。
核心概念:三个角色
MCP 架构里就三个角色,好记得很:
- Host:宿主程序,比如 Claude Desktop、Cursor 这些
- Client:和 Server 建立一对一连接的客户端
- Server:你的工具,暴露给 AI 调用的接口
动手:从零搭建一个天气查询 MCP Server
接下来咱们实战,用 Python 搭一个简单的 MCP Server,让 AI 能查天气。
环境准备
# 安装 mcp 库pipinstallmcp httpx# 创建项目目录mkdirmy-mcp-server&&cdmy-mcp-server写 Server 代码
frommcp.serverimportServerfrommcp.server.stdioimportstdio_serverfrommcp.typesimportTool,TextContentimporthttpximportjson# 初始化 Serverserver=Server("weather-server")# 注册工具@server.list_tools()asyncdeflist_tools()->list[Tool]:return[Tool(name="get_weather",description="查询指定城市的当前天气",inputSchema={"type":"object","properties":{"city":{"type":"string","description":"城市名,如 北京、上海"}},"required":["city"]})]# 实现工具逻辑@server.call_tool()asyncdefcall_tool(name:str,arguments:dict)->list[TextContent]:ifname=="get_weather":city=arguments["city"]# 这里用 wttr.in 的公开 APIasyncwithhttpx.AsyncClient()asclient:resp=awaitclient.get(f"https://wttr.in/{city}?format=%C+%t")return[TextContent(type="text",text=f"{city}天气:{resp.text}")]raiseValueError(f"Unknown tool:{name}")if__name__=="__main__":importasyncio asyncio.run(stdio_server(server))配置 Claude Desktop 连接
在 Claude Desktop 的配置文件中添加:
{"mcpServers":{"weather-server":{"command":"python","args":["path/to/weather_server.py"]}}}配置完重启 Claude Desktop,就能看到你的 MCP 工具了!
进阶:用 MCP 连接数据库
上面只是开胃菜,真正的威力在于连接数据库、文件系统这些"重型"工具。
@server.list_tools()asyncdeflist_tools()->list[Tool]:return[Tool(name="query_database",description="执行 SQL 查询,返回结果",inputSchema={"type":"object","properties":{"sql":{"type":"string","description":"SQL 查询语句"}},"required":["sql"]})]@server.call_tool()asyncdefcall_tool(name:str,arguments:dict)->list[TextContent]:ifname=="query_database":importsqlite3 conn=sqlite3.connect("mydb.db")cursor=conn.cursor()cursor.execute(arguments["sql"])results=cursor.fetchall()conn.close()return[TextContent(type="text",text=json.dumps(results,ensure_ascii=False))]raiseValueError(f"Unknown tool:{name}")常见问题 Q&A
Q:MCP 和 Function Calling 有啥区别?
A:Function Calling 是各家模型自己搞的私有协议,MCP 是开放标准。用了 MCP,你的工具能在所有支持 MCP 的客户端上跑,不用改代码。
Q:MCP Server 一定要用 Python 吗?
A:不,官方 SDK 支持 Python、TypeScript、Java、Go。选你熟悉的语言就行。
Q:安全方面怎么考虑?
A:MCP Server 跑在本地,权限由你控制。建议不要暴露敏感操作,或者加上鉴权逻辑。
总结
MCP 说白了就是一个"让 AI 用工具"的标准化接口。花一两个小时搭一个 MCP Server,你就能让 AI 真正帮你干活了,而不是只会在那聊天。
下一步可以试试:搭一个文件搜索 MCP Server、一个代码执行 MCP Server、或者一个浏览器控制 MCP Server。玩起来你就知道 MCP 有多香了。
如果你喜欢这篇文章,点个赞收藏一下,以后还有更多 AI 实战教程!