从零搭建 MCP Server:让 AI 助手调用你的本地工具

说实话,今年 AI 圈最火的概念之一就是 MCP。如果你还没搞懂它是啥,或者想动手搭一个但不知道从哪下手,这篇文章就是为你准备的。

什么是 MCP?一句话说清楚

MCP(Model Context Protocol)是 Anthropic 推的一个开放协议,说白了就是给 AI 模型开了个"后门",让它能跟外部工具对话。想象一下,以前你问 ChatGPT"帮我查一下本地文件",它只能摊手说"我做不到"。有了 MCP,它可以直接调用你的文件系统、数据库、甚至控制你的浏览器。

MCP架构示意图

核心概念:三个角色

MCP 架构里就三个角色,好记得很:

  • Host:宿主程序,比如 Claude Desktop、Cursor 这些
  • Client:和 Server 建立一对一连接的客户端
  • Server:你的工具,暴露给 AI 调用的接口

MCP角色关系图

动手:从零搭建一个天气查询 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天气查询效果

进阶:用 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 实战教程!

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐