开场:AI助手的「能力危机」

场景一:你问Claude

你:“帮我查一下公司数据库里上个月的销售数据”
Claude:“抱歉,我无法直接访问数据库…”

场景二:你问ChatGPT

你:“读取我桌面上的report.pdf并总结”
ChatGPT:“我无法访问您的本地文件…”

问题来了:这些AI明明这么聪明,为什么连最基本的「读文件」「查数据库」都做不到?

答案:不是它们不够聪明,而是缺少「工具」。

就像一个天才厨师,如果厨房里没有刀、锅、灶,也做不出美食。


第一章:MCP协议是什么?

1.1 一句话解释

MCP (Model Context Protocol) = AI模型的「USB接口标准」

就像USB让所有设备都能连接电脑一样,MCP让所有工具都能连接AI。

1.2 没有MCP之前的世界

每个AI应用都要自己实现工具集成:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# 开发者A的实现
class ClaudeWithDatabase:
    def query_db(self, sql):
        # 自己写数据库连接逻辑
        conn = psycopg2.connect(...)
        # 自己写SQL执行逻辑
        cursor.execute(sql)
        # 自己写结果格式化
        return format_results(...)

# 开发者B的实现(完全不同)
class GPTWithDatabase:
    def db_query(self, query):
        # 又要重新实现一遍
        engine = create_engine(...)
        # 完全不同的接口
        return engine.execute(query)

问题

  • ❌ 每个开发者都要重复造轮子
  • ❌ 工具无法在不同AI之间复用
  • ❌ 维护成本极高

1.3 有了MCP之后

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# 任何AI都可以使用同一个MCP服务器
from mcp import Client

# 连接到数据库MCP服务器
client = Client("postgresql://localhost:5432/mydb")

# Claude使用
claude_response = claude.chat(
    "查询上月销售数据",
    tools=[client]  # 直接传入MCP客户端
)

# GPT使用(完全相同的方式)
gpt_response = gpt.chat(
    "查询上月销售数据",
    tools=[client]  # 同一个工具!
)

优势

  • ✅ 一次开发,到处使用
  • ✅ 工具可以在不同AI之间共享
  • ✅ 标准化接口,易于维护

第二章:MCP的核心架构

2.1 三个角色

graph LR
    A[AI模型
Claude/GPT] -->|请求工具| B[MCP客户端] B -->|标准协议| C[MCP服务器] C -->|实际操作| D[资源
数据库/文件/API]

角色说明

  1. AI模型(Host):发起请求的"大脑"
  2. MCP客户端(Client):AI和工具之间的"翻译官"
  3. MCP服务器(Server):实际执行操作的"工具箱"

2.2 通信流程

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 完整的MCP通信示例
class MCPCommunicationFlow:
    def demonstrate(self):
        # Step 1: AI发现可用工具
        tools = mcp_client.list_tools()
        # 返回: [
        #   {"name": "query_database", "description": "查询PostgreSQL数据库"},
        #   {"name": "read_file", "description": "读取本地文件"},
        # ]
        
        # Step 2: AI选择并调用工具
        result = mcp_client.call_tool(
            name="query_database",
            arguments={
                "sql": "SELECT * FROM sales WHERE month = '2025-11'"
            }
        )
        
        # Step 3: MCP服务器执行并返回结果
        # result = {
        #   "content": [
        #     {"type": "text", "text": "找到123条记录"},
        #     {"type": "resource", "uri": "db://sales/2025-11"}
        #   ]
        # }
        
        # Step 4: AI处理结果并回复用户
        return ai_model.generate_response(result)

2.3 协议规范

MCP使用JSON-RPC 2.0作为通信协议:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// 请求示例
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "query_database",
    "arguments": {
      "sql": "SELECT COUNT(*) FROM users"
    }
  }
}

// 响应示例
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "content": [
      {
        "type": "text",
        "text": "总用户数: 1,234,567"
      }
    ]
  }
}

第三章:实战——搭建你的第一个MCP服务器

3.1 最简单的例子:文件读取服务器

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# file_server.py
from mcp.server import Server
from mcp.types import Tool, TextContent
import os

# 创建MCP服务器
app = Server("file-reader")

# 定义工具
@app.list_tools()
async def list_tools():
    return [
        Tool(
            name="read_file",
            description="读取本地文件内容",
            inputSchema={
                "type": "object",
                "properties": {
                    "path": {
                        "type": "string",
                        "description": "文件路径"
                    }
                },
                "required": ["path"]
            }
        )
    ]

# 实现工具逻辑
@app.call_tool()
async def call_tool(name: str, arguments: dict):
    if name == "read_file":
        path = arguments["path"]
        
        # 安全检查
        if not os.path.exists(path):
            return [TextContent(
                type="text",
                text=f"错误:文件 {path} 不存在"
            )]
        
        # 读取文件
        with open(path, 'r', encoding='utf-8') as f:
            content = f.read()
        
        return [TextContent(
            type="text",
            text=f"文件内容:\n{content}"
        )]

# 启动服务器
if __name__ == "__main__":
    app.run()

运行服务器

1
2
python file_server.py
# MCP服务器启动在 stdio://

3.2 在Claude Desktop中使用

编辑Claude Desktop配置文件:

1
2
3
4
5
6
7
8
9
// ~/Library/Application Support/Claude/claude_desktop_config.json
{
  "mcpServers": {
    "file-reader": {
      "command": "python",
      "args": ["/path/to/file_server.py"]
    }
  }
}

重启Claude Desktop,现在你可以

你:“读取我桌面上的report.txt”
Claude:“好的,让我读取文件… [调用read_file工具] …文件内容是:…”

🎉 成功!Claude现在可以读取本地文件了!

3.3 进阶:数据库查询服务器

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# database_server.py
from mcp.server import Server
from mcp.types import Tool, TextContent, Resource
import psycopg2
import pandas as pd

app = Server("postgres-query")

# 数据库连接配置
DB_CONFIG = {
    "host": "localhost",
    "database": "myapp",
    "user": "postgres",
    "password": "secret"
}

@app.list_tools()
async def list_tools():
    return [
        Tool(
            name="query_database",
            description="执行SQL查询并返回结果",
            inputSchema={
                "type": "object",
                "properties": {
                    "sql": {
                        "type": "string",
                        "description": "SQL查询语句"
                    },
                    "format": {
                        "type": "string",
                        "enum": ["table", "json", "markdown"],
                        "description": "返回格式",
                        "default": "markdown"
                    }
                },
                "required": ["sql"]
            }
        ),
        Tool(
            name="list_tables",
            description="列出数据库中的所有表",
            inputSchema={"type": "object", "properties": {}}
        )
    ]

@app.call_tool()
async def call_tool(name: str, arguments: dict):
    conn = psycopg2.connect(**DB_CONFIG)
    
    try:
        if name == "list_tables":
            # 查询所有表
            df = pd.read_sql("""
                SELECT table_name 
                FROM information_schema.tables 
                WHERE table_schema = 'public'
            """, conn)
            
            tables = df['table_name'].tolist()
            return [TextContent(
                type="text",
                text=f"数据库表:\n" + "\n".join(f"- {t}" for t in tables)
            )]
        
        elif name == "query_database":
            sql = arguments["sql"]
            format_type = arguments.get("format", "markdown")
            
            # 执行查询
            df = pd.read_sql(sql, conn)
            
            # 格式化输出
            if format_type == "markdown":
                result = df.to_markdown(index=False)
            elif format_type == "json":
                result = df.to_json(orient="records", indent=2)
            else:
                result = str(df)
            
            return [TextContent(
                type="text",
                text=f"查询结果({len(df)}行):\n{result}"
            )]
    
    finally:
        conn.close()

if __name__ == "__main__":
    app.run()

使用效果

你:“我们数据库里有哪些表?”
Claude:[调用list_tables] “数据库中有以下表:users, orders, products…”

你:“查询上个月订单总额”
Claude:[调用query_database] “上个月订单总额为 ¥1,234,567…”


第四章:MCP的「杀手级」应用场景

4.1 场景一:智能数据分析助手

1
2
3
4
5
6
7
8
9
# 用户只需要说话,AI自动完成整个分析流程
用户: "分析一下我们Q4的销售趋势"

# AI的工作流程(全自动):
1. [调用list_tables] 发现有sales表
2. [调用query_database] 查询Q4数据
3. [调用python_executor] 用pandas分析趋势
4. [调用chart_generator] 生成可视化图表
5. [返回分析报告] "Q4销售呈上升趋势,环比增长23%..."

实现代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# analytics_server.py
@app.call_tool()
async def call_tool(name: str, arguments: dict):
    if name == "analyze_sales":
        # Step 1: 查询数据
        df = query_sales_data(arguments["period"])
        
        # Step 2: 自动分析
        insights = {
            "total": df['amount'].sum(),
            "growth": calculate_growth(df),
            "top_products": df.groupby('product')['amount'].sum().nlargest(5),
            "trend": detect_trend(df)
        }
        
        # Step 3: 生成图表
        chart_url = generate_chart(df)
        
        # Step 4: 返回结果
        return [
            TextContent(type="text", text=format_insights(insights)),
            Resource(type="image", uri=chart_url)
        ]

4.2 场景二:全能开发助手

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 开发者的梦想:AI能直接操作代码库
用户: "帮我重构auth模块,添加OAuth支持"

# AI的操作:
1. [调用git_server] 创建新分支 feature/oauth
2. [调用file_server] 读取现有auth代码
3. [调用code_generator] 生成OAuth实现
4. [调用file_server] 写入新代码
5. [调用test_runner] 运行测试
6. [调用git_server] 提交并推送
7. [返回] "重构完成,所有测试通过,PR已创建"

MCP服务器组合

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
{
  "mcpServers": {
    "git": {
      "command": "mcp-git-server"
    },
    "filesystem": {
      "command": "mcp-file-server",
      "args": ["--root", "/Users/dev/myproject"]
    },
    "test-runner": {
      "command": "mcp-pytest-server"
    }
  }
}

4.3 场景三:企业知识库问答

1
2
3
4
5
6
7
8
9
# 连接公司所有数据源
用户: "上季度客户投诉最多的问题是什么?"

# AI自动整合多个数据源:
1. [调用jira_server] 查询工单系统
2. [调用slack_server] 搜索客服频道
3. [调用database_server] 查询CRM数据
4. [调用confluence_server] 检索知识库
5. [综合分析] "最多的投诉是配送延迟(占37%),主要原因是..."

第五章:MCP生态系统

5.1 官方MCP服务器

Anthropic已经提供了一些开箱即用的服务器:

服务器功能使用场景
@modelcontextprotocol/server-filesystem文件系统访问读写本地文件
@modelcontextprotocol/server-githubGitHub集成管理仓库、PR、Issues
@modelcontextprotocol/server-postgresPostgreSQL数据库查询
@modelcontextprotocol/server-brave-search网络搜索实时信息检索
@modelcontextprotocol/server-slackSlack集成发送消息、查询历史

安装使用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 安装官方服务器
npm install -g @modelcontextprotocol/server-github

# 配置到Claude Desktop
{
  "mcpServers": {
    "github": {
      "command": "mcp-server-github",
      "env": {
        "GITHUB_TOKEN": "your_token_here"
      }
    }
  }
}

5.2 社区MCP服务器

开源社区已经创建了大量服务器:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 一些有趣的社区服务器
awesome_mcp_servers = [
    "mcp-server-notion",      # Notion笔记集成
    "mcp-server-gmail",       # Gmail邮件管理
    "mcp-server-calendar",    # Google Calendar
    "mcp-server-docker",      # Docker容器管理
    "mcp-server-kubernetes",  # K8s集群操作
    "mcp-server-aws",         # AWS云服务
    "mcp-server-stripe",      # 支付处理
    "mcp-server-openai",      # OpenAI API封装
]

5.3 创建自己的MCP服务器

Python版本

1
2
3
4
5
pip install mcp
mcp create my-server
cd my-server
# 编辑 server.py
python server.py

TypeScript版本

1
2
3
4
5
npm create @modelcontextprotocol/server my-server
cd my-server
# 编辑 src/index.ts
npm run build
npm start

第六章:MCP vs 其他方案

6.1 对比表

方案优点缺点适用场景
MCP标准化、可复用、生态丰富相对新,文档还在完善需要多工具集成的AI应用
Function Calling简单直接每个AI都要单独实现简单的单一工具调用
LangChain Tools成熟的框架绑定LangChain生态LangChain项目
自定义API完全控制开发成本高,难复用特殊需求

6.2 什么时候用MCP?

适合使用MCP

  • 需要集成多个工具(数据库+文件+API)
  • 希望工具可以在不同AI之间复用
  • 构建企业级AI应用
  • 需要标准化的工具接口

不适合使用MCP

  • 只需要一个简单的API调用
  • 项目已经深度绑定其他框架
  • 对性能有极致要求(MCP有一定开销)

第七章:最佳实践

7.1 安全性

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
# ❌ 危险:直接执行用户SQL
@app.call_tool()
async def call_tool(name: str, arguments: dict):
    sql = arguments["sql"]
    return execute_sql(sql)  # SQL注入风险!

# ✅ 安全:参数化查询 + 权限控制
@app.call_tool()
async def call_tool(name: str, arguments: dict):
    # 1. 验证用户权限
    if not user.has_permission("query_database"):
        return [TextContent(type="text", text="权限不足")]
    
    # 2. 白名单检查
    allowed_tables = ["users", "orders", "products"]
    if not all(table in allowed_tables for table in extract_tables(sql)):
        return [TextContent(type="text", text="不允许查询该表")]
    
    # 3. 参数化查询
    sql = arguments["sql"]
    params = arguments.get("params", [])
    return execute_safe_sql(sql, params)

7.2 错误处理

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
@app.call_tool()
async def call_tool(name: str, arguments: dict):
    try:
        # 执行操作
        result = perform_operation(arguments)
        return [TextContent(type="text", text=result)]
    
    except FileNotFoundError as e:
        # 友好的错误提示
        return [TextContent(
            type="text",
            text=f"❌ 文件不存在:{e.filename}\n建议:检查文件路径是否正确"
        )]
    
    except PermissionError:
        return [TextContent(
            type="text",
            text="❌ 权限不足\n建议:使用sudo或检查文件权限"
        )]
    
    except Exception as e:
        # 记录详细错误日志
        logger.error(f"MCP tool error: {e}", exc_info=True)
        # 返回用户友好的错误
        return [TextContent(
            type="text",
            text=f"❌ 操作失败:{str(e)}"
        )]

7.3 性能优化

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
# 使用缓存减少重复查询
from functools import lru_cache

@lru_cache(maxsize=100)
def query_database(sql: str):
    # 相同的SQL查询会被缓存
    return execute_sql(sql)

# 异步处理提高并发
import asyncio

@app.call_tool()
async def call_tool(name: str, arguments: dict):
    # 并行执行多个操作
    results = await asyncio.gather(
        query_database(sql1),
        query_database(sql2),
        read_file(path)
    )
    return combine_results(results)

第八章:未来展望

8.1 MCP的发展方向

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# 2025年:基础工具集成
current_capabilities = [
    "文件系统访问",
    "数据库查询",
    "API调用",
    "Git操作"
]

# 2026年预测:更智能的工具
future_capabilities = [
    "自动工具组合(AI自己决定调用哪些工具)",
    "工具学习(根据使用反馈优化工具行为)",
    "跨服务器协作(多个MCP服务器协同工作)",
    "实时数据流(WebSocket支持)",
    "工具市场(一键安装社区工具)"
]

8.2 可能的应用场景

场景一:全自动运维

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
用户: "网站响应变慢了"

AI自动执行
1. [调用monitoring_server] 检查服务器指标
2. [调用log_server] 分析错误日志
3. [调用database_server] 检查慢查询
4. [调用docker_server] 重启有问题的容器
5. [调用slack_server] 通知团队

结果: "已自动修复,原因是数据库连接池耗尽"

场景二:智能客服

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
客户: "我的订单怎么还没发货?"

AI自动处理
1. [调用crm_server] 查询客户信息
2. [调用order_server] 查询订单状态
3. [调用logistics_server] 查询物流信息
4. [调用email_server] 发送更新邮件
5. [调用ticket_server] 创建跟进工单

回复: "您的订单已在配送中,预计明天送达"

结语:MCP的意义

MCP不仅仅是一个协议,它代表了AI应用开发的范式转变

从「AI是工具」到「AI用工具」

以前

1
人类 → 使用AI → 获得答案

现在

1
人类 → 告诉AI目标 → AI使用工具 → 完成任务

开发者的新机会

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 以前:开发AI应用很难
def build_ai_app():
    学习LLM API 
    + 实现工具集成  ()
    + 处理错误和边界情况  ()
    + 维护和更新  ()
    = 放弃 😭

# 现在:使用MCP很简单
def build_ai_app_with_mcp():
    学习LLM API 
    + 安装MCP服务器  (简单)
    + 配置JSON文件  (简单)
    = 成功 🎉

最后的思考

MCP的本质是「标准化」

就像USB标准让所有设备都能连接电脑,MCP让所有工具都能连接AI。

这意味着

  • 🔧 开发者可以专注于创造工具,而不是重复集成
  • 🤖 AI可以使用越来越多的工具,变得越来越强大
  • 👥 用户可以用自然语言完成复杂任务,无需学习技术细节

MCP正在构建AI的「工具生态系统」,就像App Store之于iPhone。


快速开始

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 1. 安装MCP SDK
pip install mcp

# 2. 创建你的第一个服务器
mcp create my-first-server

# 3. 在Claude Desktop中配置
# 编辑 ~/Library/Application Support/Claude/claude_desktop_config.json

# 4. 开始使用!

相关资源

MCP的时代才刚刚开始。