MCP 是 Anthropic 在 2024 年底开源的一套协议标准,定义了AI 模型和外部工具之间如何通信。
你可以把它理解成一个标准化的"插座":
AI 模型 ←→ MCP 协议层 ←→ 各种工具(数据库 / 文件系统 / API / 浏览器)
在 MCP 出现之前,每个 AI 应用要集成工具,都要自己写一套 function calling 的胶水代码,格式各异,难以复用。
MCP 之后,工具变成了可复用的MCP Server ,模型变成了标准化的MCP Client,协议负责中间的握手与通信。就像 HTTP 统一了 Web 通信一样。
MCP Server 向模型暴露的可读数据,类似 REST 里的 GET 端点。
{
"uri": "file:///home/user/project/README.md", "name": "项目说明文档", "mimeType": "text/markdown" }
模型可以请求读取这个资源,Server 把内容返回给它。文件、数据库记录、API 响应------都可以包装成 Resource。
模型可以调用执行的函数,类似 REST 里的 POST 端点。这是 MCP 最核心的能力。
@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 → 拿到真实数据 → 继续推理。
可复用的提示词片段,让模型以一致的方式完成特定任务。适合封装团队内部的**实践。
环境:Python 3.11+,SQLite
pip install mcp
# 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="
".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 的配置文件:
{
"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)。
截至 2025 年,Anthropic 官方和社区已经有数百个开箱即用的 MCP Server:
- 文件系统:读写本地/云端文件
- 数据库:PostgreSQL、MySQL、MongoDB、Redis
- 开发工具:GitHub、Jira、Linear
- 浏览器控制:Playwright、Puppeteer
- 搜索:Brave Search、Exa
- 通讯:Slack、Email
这意味着你不需要从零写 Tool,组合现有 Server 就能快速搭出强大的 AI 工作流。
MCP 正在做的事,就是把碎片化的 AI 工具整合成一个可互操作的生态系统。这不是玩具,这是基础设施。
上面这些只是 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 环境下验证。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/252600.html