MCP 模型上下文协议

更新时间:2026-03-18 | 阅读时间:10分钟

什么是 MCP?

MCP(Model Context Protocol)是由 Anthropic 推出的开放协议,用于连接 AI 模型与外部数据源和工具。它就像是 AI 的"USB接口"——标准化的连接方式。

🎯 一句话理解

MCP 就像是给 AI 装上了"万能转接头"——不管数据在哪(GitHub、Google Drive、数据库),都能通过统一的接口安全访问。

MCP 解决的问题

  • 数据孤岛 - AI 无法访问企业内部数据
  • 重复开发 - 每个 AI 应用都要单独对接数据源
  • 安全风险 - 数据访问缺乏统一管控
  • 兼容性差 - 不同 AI 工具无法共享数据源

MCP 的核心价值

特性 说明
标准化 统一的协议规范,一次接入到处可用
安全性 客户端控制权限,数据不离开本地
可扩展 社区贡献 Server,生态持续丰富
开放性 开源协议,任何模型都可以支持

架构原理

MCP 三层架构

┌─────────────────────────────────────────┐
│           MCP Host (宿主应用)             │
│  如:Claude Desktop、IDE、OpenClaw       │
└─────────────────┬───────────────────────┘
                  │ MCP Protocol
┌─────────────────▼───────────────────────┐
│           MCP Client (客户端)            │
│  管理连接、权限控制、消息路由             │
└─────────────────┬───────────────────────┘
                  │
┌─────────────────▼───────────────────────┐
│           MCP Server (服务器)            │
│  提供资源、工具、提示词                   │
│  如:GitHub Server、Filesystem Server    │
└─────────────────────────────────────────┘

MCP Server 提供的能力

能力类型 说明 示例
Resources(资源) 可读取的数据 文件内容、数据库记录
Tools(工具) 可执行的操作 创建文件、发送消息
Prompts(提示词) 预定义的提示模板 代码审查模板

通信方式

  • Stdio - 本地进程通信,最常用
  • HTTP/SSE - 远程服务通信

实际应用

热门 MCP Server

Server 功能
filesystem 安全访问本地文件系统
github GitHub 仓库、Issues、PR 操作
postgres PostgreSQL 数据库查询
slack Slack 消息发送和读取
google-drive Google Drive 文件访问
brave-search Brave 搜索集成

使用场景

场景一:代码助手

filesystem Server → 读取项目代码
github Server → 查看 Issues、创建 PR
postgres Server → 查询数据库结构

场景二:知识管理

google-drive Server → 读取文档
notion Server → 同步笔记
slack Server → 推送更新通知

场景三:数据分析

postgres Server → 执行 SQL 查询
sqlite Server → 本地数据分析
brave-search Server → 获取市场数据

代码示例

MCP Server 配置

{
  "mcpServers": {
    "filesystem": {
      "command": "mcp-server-filesystem",
      "args": ["/home/user/projects"]
    },
    "github": {
      "command": "mcp-server-github",
      "env": {
        "GITHUB_TOKEN": "ghp_xxx"
      }
    }
  }
}

创建自定义 MCP Server

from mcp.server import Server
from mcp.types import Tool, TextContent

server = Server("my-server")

@server.list_tools()
async def list_tools():
    return [
        Tool(
            name="hello",
            description="打招呼",
            inputSchema={
                "type": "object",
                "properties": {
                    "name": {"type": "string"}
                }
            }
        )
    ]

@server.call_tool()
async def call_tool(name: str, arguments: dict):
    if name == "hello":
        return [TextContent(
            type="text",
            text=f"Hello, {arguments['name']}!"
        )]

💡 想了解更多?

访问 妙趣AI 获取更多 OpenClaw 教程和 AI 工具推荐!