当前位置:首页>python>手把手用 Python 搭建 MCP 服务,打通本地文件与数据库

手把手用 Python 搭建 MCP 服务,打通本地文件与数据库

  • 2026-09-02 17:07:24
手把手用 Python 搭建 MCP 服务,打通本地文件与数据库

MCP,全称 Model Context Protocol(模型上下文协议),主要应用于 AI 相关的工作流。

其实,这个概念已经出现挺久的了,但我一直没太悟透它的精髓。为了提升工作效率,我最近在 Cursor中大量使用 MCP,并积攒了一些粗浅的经验和感受,如下。写得不成熟的地方,还望家人们不吝斧正。

MCP的故事

纵观行业发展,规律高度一致:需求催生厂商,群雄逐鹿之后,头部企业共同敲定统一标准。花开两朵,各表一枝。

第一枝,先聊硬件设备接口。 我们手边五花八门的数据线,就是一部接口标准化历史:USB-A (1996) → Mini-USB → Micro-USB (2007) → Lightning (苹果私有) → Type-C (2014 至今)。 历经近 30 年竞争,物理接口最终固化为 Type-C,完成消费电子 “书同文,车同轨”。只是硬件定型后,USB4、雷电、PD 供电这类上层协议还在持续迭代。

另一枝,正是本文主角:MCP 协议。 它的演进路径和硬件接口如出一辙。2023–2024 年大模型爆发,但有一个无解困境:GPT、Claude 被禁锢在训练数据中。想要对接本地文件、GitHub、Slack,每新增一个数据源,就要从零开发一套对接代码。 M 个模型 × N 个外部工具 = M×N 套胶水集成,开发者陷入重复劳动,大模型始终被困在信息孤岛。

转机来自 Anthropic 工程师 David Soria Parra。他在用 Claude Desktop 开发时,总要来回在 IDE 与软件之间复制代码,不由得思考:既然模型能读懂代码,为什么不能自主读取本地资源? 他曾深度参与微软 LSP 语言服务器协议的设计。当年 IDE 与编程语言之间也是 M×N 的混乱生态,LSP 用一套统一协议,把复杂度从 M×N 降到 M+N,一统编辑器生态。 他立刻意识到:AI 模型调用外部工具,本质就是新一代的 “编辑器 — 服务端” 问题。

他和同事一拍即合:借鉴 LSP 思想,设计一套开放协议,依靠 JSON-RPC 标准化接口,打通大模型与外部数据、工具,MCP 就此诞生。 在内部黑客松验证后,团队给 Claude Desktop 批量接入各类工具,整体体验提升巨大。

MCP的演进

2024 年 11 月 25 日,Anthropic 正式发布公告,将 Model Context Protocol(模型上下文协议) 开源。并配了 Python/TypeScript SDK,还预置了 Google Drive、Slack、GitHub、Postgres 等 MCP Server。

后来 Block、Zed、Replit、Sourcegraph 跟进,2025 年 OpenAI 也宣布支持,MCP 从 Anthropic 的“私器”变成行业准标准,2025 年底捐给 Linux 基金会下的 Agentic AI Foundation,彻底中立化。截至 2026 年中,主流玩家已全部原生支持 MCP。

阵营
支持情况
Anthropic
Claude Desktop / Claude Code 原生,MCP 首发方
OpenAI
ChatGPT 桌面端 + Agents SDK 原生接入
Google
Gemini / Vertex AI / Chrome DevTools MCP Server
微软
GitHub Copilot / VS Code MCP 扩展
IDE/编辑器
Cursor、Windsurf、Zed、Neovim、Replit 均原生
国内大厂
阿里云 ModelScope、腾讯、蚂蚁、百度均已接入

MCP 在"AI 连接外部工具/数据源"这个场景,已经是业界公认的事实标准(de facto standard),并且正在向正式开放标准过渡。

MCP 由什么组成

Host(应用)通过 Client(中介)连 Server(工具),用 JSON‑RPC 跑 Tools / Resources / Prompts 三类能力。拆开就是:

● 角色:Host(Cursor/Claude)←Client→ Server(文件/GitHub/DB)

● 能力:Tools(执行)、Resources(只读)、Prompts(模板)

● 通信:JSON‑RPC,本地走 stdio,远程走 HTTP/SSE

MCP解决了什么

它解决了“怎么说话”和“说什么”的问题:

● 统一方言:基于 JSON-RPC 2.0,全行业共用一套通信标准;

● 统一接口:无论是查数据库还是读文件,都被规范为 Tools / Resources / Prompts;

● 稳定内核:协议层一旦定型绝不乱改,给两端的开发者留出最大的创新空间。

实操

1. 工具插件

填写配置,这个AI编辑器是cursor,其他竞品也类似。

添加MySQL配置

local-mysql8 是本地数据库配置。

{"mcpServers": {"local-mysql8": {"command": "npx","args": ["-y","@f4ww4z/mcp-mysql-server","--host", "127.0.0.1","--port", "3307","--user", "root","--password", "password","--database", "journal"        ]      },"mcp-hello": {"command": "/Users/wuxian/.pyenv/shims/python3","args": ["/Users/wuxian/Desktop/codes/mcp-hello-py/src/server.py"        ]      }    }  }

mcp-hello 是本地 mcp 服务器。注意第二个红框,通过 mcp 能马上识别其中的 tools

氛围编程

下图是我与cursor的对话。手动写 SQL 查询和氛围编程调用 MCP 结果表现一致,如下图

2. 智能体调用

服务端

一个简单mcp服务器,用于学习原理

#!/usr/bin/env python3"""Simple Hello MCP Server功能:姓名英文问候,支持Tools/Resources/Prompts,提供Streamable HTTP与健康检查接口传输方式:stdio / streamable-http"""import sysimport osfrom mcp.server.fastmcp import FastMCPfrom mcp.server.transport_security import TransportSecuritySettingsfrom starlette.responses import JSONResponse, PlainTextResponse# 初始化MCP服务mcp = FastMCP(    name="mcp-hello",    instructions="接收姓名并用英语打招呼",    stateless_http=True,    json_response=True,    host="0.0.0.0",    transport_security=TransportSecuritySettings(enable_dns_rebinding_protection=False),)# 工具:单人问候@mcp.tool()defsay_hello(name: str) -> str:ifnot name.strip():return"Hello!"returnf"Hello, {name}!"# 工具:多人问候@mcp.tool()defsay_hello_multiple(names: list[str]) -> str:ifnot names:return""    lines = [f"• {say_hello(name)}"for name in names]return"\n".join(lines)# 资源文档@mcp.resource("docs://hello/readme")defget_readme() -> str:return"""# Hello MCP Server Documentation## 可用工具### say_hello参数: name(string)返回: Hello, {name}!### say_hello_multiple参数: names(string[])返回多条带项目符号的问候## 接口/mcp   MCP协议入口/health 健康检查"""# 提示词模板@mcp.prompt()defgreeting_message(recipient: str) -> str:    greeting = say_hello(recipient)returnf"""以{greeting}开头,给{recipient}写3-5句亲切礼貌的问候消息"""# 自定义路由@mcp.custom_route("/health", methods=["GET"])asyncdefhealth_check(request):return JSONResponse({"status": "healthy", "service": "mcp-hello", "version": "1.0.0"})@mcp.custom_route("/", methods=["GET"])asyncdefroot(request):return PlainTextResponse("MCP Hello Server\n/mcp MCP入口\n/health 健康检查")# HTTP服务启动defrun_http_server():    port = int(os.environ.get("PORT", 8080))    mcp.settings.port = port    print(f"服务启动于 0.0.0.0:{port}")    mcp.run(transport="streamable-http")# 主入口defmain():if"--http-stream"in sys.argv:        run_http_server()else:        mcp.run(transport="stdio")if __name__ == "__main__":    main()

客户端

顺手写个客户端,实际项目中这个客户端是嵌在 agent 中的

import jsonimport urllib.requestMCP_URL = "http://localhost:8080/mcp"defrpc(request):"""发送一个 JSON-RPC 请求"""    req = urllib.request.Request(        MCP_URL,        data=json.dumps(request).encode(),        headers={"Content-Type": "application/json"},    )with urllib.request.urlopen(req) as resp:return json.load(resp)defmain():# 1. 初始化    init_req = {"jsonrpc": "2.0","id": 1,"method": "initialize","params": {"protocolVersion": "2024-11-05","clientInfo": {"name": "minimal-client", "version": "1.0.0"},        },    }    init_resp = rpc(init_req)    print("✅ initialize:")    print(json.dumps(init_resp, indent=2))# 2. 查询工具列表    list_req = {"jsonrpc": "2.0","id": 2,"method": "tools/list",    }    list_resp = rpc(list_req)    print("\n✅ tools/list:")    print(json.dumps(list_resp, indent=2))# 3. 调用say_hello工具    call_req = {"jsonrpc": "2.0","id": 3,"method": "tools/call","params": {"name": "say_hello","arguments": {"name": "World"},        },    }    call_resp = rpc(call_req)    print("\n✅ tools/call(say_hello):")    print(json.dumps(call_resp, indent=2))if __name__ == "__main__":    main()

示例

下面是postman模拟客户端调用 mcp服务器的例子

总结

MCP 本质就是 AI 时代的 Type‑C 接口:一套标准协议,让大模型无需定制开发,就能任意调用本地文件、数据库、第三方 API,彻底终结 M×N 的重复集成工作。

在标准上,MCP 已经是一种工程实践标准:

  • 端点只有一个 http://localhost:8080/mcp,类似 GraphQL;
  • 动作上就 3 种核心操作——initialize、tools/list、tools/call;
  • 协议上,就是一个 json-rpc格式包装。MCP 选中它,主要是因为它的生态成熟、兼容性好、稳定性强。

至此,MCP 就讲完了。我对它的理解,就像美国汉堡包 vs 陕西肉夹馍——本质都是两块饼夹块肉;或者说,它是AI圈的 RPC。体验上,就是标准化、模块化的连接,让 AI 智能体能“即插即用”。

最新文章

随机文章