【实战教程】从零搭建 MCP Server:让 AI 助手调用你的本地工具
从零搭建 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 库
pip install mcp httpx
# 创建项目目录
mkdir my-mcp-server && cd my-mcp-server
写 Server 代码
from mcp.server import Server
from mcp.server.stdio import stdio_server
from mcp.types import Tool, TextContent
import httpx
import json
# 初始化 Server
server = Server("weather-server")
# 注册工具
@server.list_tools()
async def list_tools() -> list[Tool]:
return [
Tool(
name="get_weather",
description="查询指定城市的当前天气",
inputSchema={
"type": "object",
"properties": {
"city": {"type": "string", "description": "城市名,如 北京、上海"}
},
"required": ["city"]
}
)
]
# 实现工具逻辑
@server.call_tool()
async def call_tool(name: str, arguments: dict) -> list[TextContent]:
if name == "get_weather":
city = arguments["city"]
# 这里用 wttr.in 的公开 API
async with httpx.AsyncClient() as client:
resp = await client.get(f"https://wttr.in/{city}?format=%C+%t")
return [TextContent(type="text", text=f"{city} 天气:{resp.text}")]
raise ValueError(f"Unknown tool: {name}")
if __name__ == "__main__":
import asyncio
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()
async def list_tools() -> list[Tool]:
return [
Tool(
name="query_database",
description="执行 SQL 查询,返回结果",
inputSchema={
"type": "object",
"properties": {
"sql": {"type": "string", "description": "SQL 查询语句"}
},
"required": ["sql"]
}
)
]
@server.call_tool()
async def call_tool(name: str, arguments: dict) -> list[TextContent]:
if name == "query_database":
import sqlite3
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))]
raise ValueError(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 实战教程!
更多推荐


所有评论(0)