一、MCP 是什么?一句话说清楚
MCP 是 Anthropic 在 2024 年底开源的一套协议标准,定义了AI 模型和外部工具之间如何通信。
你可以把它理解成一个标准化的"插座":
AI 模型 ←→ MCP 协议层 ←→ 各种工具(数据库 / 文件系统 / API / 浏览器)
在 MCP 出现之前,每个 AI 应用要集成工具,都要自己写一套 function calling 的胶水代码,格式各异,难以复用。
MCP 之后,工具变成了可复用的MCP Server ,模型变成了标准化的MCP Client,协议负责中间的握手与通信。就像 HTTP 统一了 Web 通信一样。
二、三个概念搞懂 MCP 架构
1. Resources(资源)
MCP Server 向模型暴露的可读数据,类似 REST 里的 GET 端点。
json
{
"uri": "file:///home/user/project/README.md",
"name": "项目说明文档",
"mimeType": "text/markdown"
}
模型可以请求读取这个资源,Server 把内容返回给它。文件、数据库记录、API 响应------都可以包装成 Resource。
2. Tools(工具)
模型可以调用执行的函数,类似 REST 里的 POST 端点。这是 MCP 最核心的能力。
python
@server.call_tool()
async def handle_tool(name: str, arguments: dict):
if name == "query_database":
sql = arguments["sql"]
result = await db.execute(sql)
return [TextContent(type="text", text=str(result))]
模型决定"我需要查数据库"→ 调用这个 Tool → 拿到真实数据 → 继续推理。
3. Prompts(提示模板)
可复用的提示词片段,让模型以一致的方式完成特定任务。适合封装团队内部的最佳实践。
三、动手:15 分钟写一个能查数据库的 MCP Server
环境:Python 3.11+,SQLite
bash
pip install mcp
python
# sqlite_server.py
import asyncio
import sqlite3
from mcp.server import Server
from mcp.server.stdio import stdio_server
from mcp.types import Tool, TextContent
app = Server("sqlite-assistant")
DB_PATH = "mydata.db"
@app.list_tools()
async def list_tools() -> list[Tool]:
return [
Tool(
name="query",
description="执行 SQL 查询并返回结果",
inputSchema={
"type": "object",
"properties": {
"sql": {
"type": "string",
"description": "要执行的 SELECT 语句"
}
},
"required": ["sql"]
}
)
]
@app.call_tool()
async def call_tool(name: str, arguments: dict) -> list[TextContent]:
if name != "query":
raise ValueError(f"未知工具: {name}")
sql = arguments["sql"]
# 安全起见,只允许 SELECT
if not sql.strip().upper().startswith("SELECT"):
return [TextContent(type="text", text="错误:只允许 SELECT 查询")]
conn = sqlite3.connect(DB_PATH)
cursor = conn.execute(sql)
rows = cursor.fetchall()
columns = [desc[0] for desc in cursor.description]
conn.close()
# 格式化输出
result = [" | ".join(columns)]
result.append("-" * 40)
for row in rows:
result.append(" | ".join(str(v) for v in row))
return [TextContent(type="text", text="\n".join(result))]
async def main():
async with stdio_server() as (read, write):
await app.run(read, write, app.create_initialization_options())
if __name__ == "__main__":
asyncio.run(main())
把这个 Server 注册到 Claude Desktop 的配置文件:
json
{
"mcpServers": {
"sqlite-assistant": {
"command": "python",
"args": ["/path/to/sqlite_server.py"]
}
}
}
重启 Claude Desktop,现在对话框里直接说:
"查一下 users 表里注册时间在本月的用户有多少个"
模型会自动调用你的 Tool,拿到真实数据,给你完整的分析结果。这才是真正干活的 AI Agent。
四、生产环境要注意的四个坑
1. 权限边界要明确
Tool 的 description 写清楚能做什么、不能做什么。模型会认真读这段描述来决定是否调用。上例中只允许 SELECT 是防御第一层,description 里也应该写明"只支持读操作"。
2. 错误信息要对模型友好
返回的错误信息是给模型看的,不是给人看的。要描述清楚"是什么错、为什么错、可以怎么修正",让模型能够自我修复重试。
3. 长上下文的 Resource 要分页
一次性把整个数据库 dump 给模型是典型的反模式。设计 Resource 时要支持分页参数,让模型按需取数据。
4. 本地 stdio vs 远程 HTTP
本地开发用 stdio transport 简单直接。生产部署多用户场景下,用 HTTP+SSE transport,加上认证层(JWT 或 API Key)。
五、MCP 的真正价值:生态
截至 2025 年,Anthropic 官方和社区已经有数百个开箱即用的 MCP Server:
- 文件系统:读写本地/云端文件
- 数据库:PostgreSQL、MySQL、MongoDB、Redis
- 开发工具:GitHub、Jira、Linear
- 浏览器控制:Playwright、Puppeteer
- 搜索:Brave Search、Exa
- 通讯:Slack、Email
这意味着你不需要从零写 Tool,组合现有 Server 就能快速搭出强大的 AI 工作流。
MCP 正在做的事,就是把碎片化的 AI 工具整合成一个可互操作的生态系统。这不是玩具,这是基础设施。
想系统学 MCP?
上面这些只是 MCP 的冰山一角。Resources 的订阅机制、Sampling(让 Server 反过来调用模型)、多 Server 的组合编排、与 LangChain / LlamaIndex 的集成......每一块展开都有不少细节。
推荐去 古法编程 gufacode.com 看 MCP 系列教程------从协议原理到 Server 开发、Client 实现、生产部署,10 章完整覆盖,配套可运行的代码示例。
网站上还有 54 门技术教程,涵盖 AI Agent、RAG、Kubernetes、Rust、鸿蒙开发等热门方向,全部免费。适合想在 AI 时代保持技术竞争力的开发者。
古法编程,传承那些 AI 还无法替代的编程技艺。
本文代码已在 Python 3.11 + mcp 1.x 环境下验证。