告别"玩具项目":用 MCP 协议让你的 AI Agent 真正干活

一、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 环境下验证。

相关推荐
Light602 小时前
源码泄露VS工业革命:Claude Code与领码SPARK VIEW的AI编程范式对决
ai编程·配置即代码·源码泄露·claude code·spark view·技术范式
小手智联老徐2 小时前
OpenClaw 三小时连更三个版本
llm·ai编程·openclaw
与虾牵手3 小时前
OpenClaw 省钱方案:2026 年我把 Claude Code 的开销砍掉 70% 的完整配置
ai编程·claude
sickworm陈浩3 小时前
为 300W 行的安卓老工程落地可迭代的 AI 知识库
android·ai编程
Java老刘3 小时前
Spring AI + Chroma 如何搭建汽车客服知识库问答系统
spring boot·ai编程
木子予彤3 小时前
Android 性能诊断 V2:基于 Agent Skill 的原生 IDE 融合架构
android·ai编程
摇滚侠3 小时前
从 Vibe Coding 到 Spec Coding:研发范式演进与高质量交付
java·人工智能·ai编程
木子予彤3 小时前
基于 Perfetto 与 AI 的 Android 性能自动化诊断方案
android·ai编程
好运的阿财3 小时前
OpenClaw四种角色详解
人工智能·python·程序人生·microsoft·开源·ai编程