MCP 模型上下文协议
什么是 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 工具推荐!