MCP(Model Context Protocol)—— AI 领域的 USB-C

0 阅读4分钟

MCP 是 Anthropic 于 2024 年 11 月推出的开放标准协议,被誉为"AI 领域的 USB-C 接口"。


1.1 什么是 MCP?

Model Context Protocol(MCP) 是 Anthropic 提出的开放标准协议,旨在解决大语言模型(LLM)与外部数据源、工具之间的连接问题。

"MCP 就像 AI 领域的 USB-C 接口——一个统一的标准,让 AI 模型能够无缝连接任何外部系统。" —— Anthropic 官方

核心价值

价值说明
标准化接口统一 AI 模型与外部系统的交互方式
一次开发,处处可用开发者只需编写一次 MCP 服务器,即可被所有支持的客户端使用
生态互通打破 AI 应用的孤岛效应
降低集成成本无需为每个新集成定制代码

1.2 技术架构

MCP 采用客户端-服务器架构,包含三个核心组件:

┌─────────────────┐     ┌─────────────────┐     ┌─────────────────┐
│   MCP Client    │────▶│   MCP Server    │────▶│  External System│
│  (Claude/IDE)   │     │   (Your Code)   │     │  (DB/API/Files) │
└─────────────────┘     └─────────────────┘     └─────────────────┘

核心概念

概念说明示例
Resources只读数据源文件内容、数据库记录、API 响应
Tools可执行操作API 调用、文件写入、数据库查询
Prompts预定义提示词模板代码审查模板、分析框架
Sampling服务器请求 LLM 补全让 AI 生成内容或做决策

协议层

┌─────────────────────────────────────────┐
│            Application Layer            │
│         (Claude Desktop, IDEs)          │
├─────────────────────────────────────────┤
│              MCP Protocol               │
│     (JSON-RPC 2.0 based messages)       │
├─────────────────────────────────────────┤
│           Transport Layer               │
│    (Stdio, HTTP/SSE, Custom)           │
└─────────────────────────────────────────┘

1.3 实战案例:构建企业知识库 MCP 服务器

场景描述

为企业构建一个 MCP 服务器,让 Claude 能够:

  • 搜索内部文档
  • 查询数据库
  • 调用内部 API

项目结构

enterprise-mcp-server/
├── src/
│   ├── index.ts          # 入口文件
│   ├── resources/        # 资源定义
│   │   └── documents.ts
│   ├── tools/            # 工具定义
│   │   ├── search.ts
│   │   └── query.ts
│   └── prompts/          # 提示词模板
│       └── analyze.ts
├── package.json
└── tsconfig.json

核心代码实现

// src/index.ts
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import {
  CallToolRequestSchema,
  ListToolsRequestSchema,
} from "@modelcontextprotocol/sdk/types.js";

const server = new Server(
  { name: "enterprise-knowledge-base", version: "1.0.0" },
  { capabilities: { resources: {}, tools: {} } }
);

// 注册工具列表
server.setRequestHandler(ListToolsRequestSchema, async () => ({
  tools: [
    {
      name: "search_documents",
      description: "搜索企业知识库文档",
      inputSchema: {
        type: "object",
        properties: {
          query: { type: "string", description: "搜索关键词" },
          limit: { type: "number", description: "返回结果数量", default: 10 }
        },
        required: ["query"]
      }
    },
    {
      name: "query_database",
      description: "执行数据库查询",
      inputSchema: {
        type: "object",
        properties: {
          sql: { type: "string", description: "SQL 查询语句" }
        },
        required: ["sql"]
      }
    }
  ]
}));

// 处理工具调用
server.setRequestHandler(CallToolRequestSchema, async (request) => {
  const { name, arguments: args } = request.params;

  switch (name) {
    case "search_documents":
      return await searchDocuments(args.query, args.limit);
    case "query_database":
      return await queryDatabase(args.sql);
    default:
      throw new Error(`Unknown tool: ${name}`);
  }
});

// 文档搜索实现
async function searchDocuments(query: string, limit: number = 10) {
  // 实现文档搜索逻辑
  const results = await fetch(`/api/documents/search?q=${query}&limit=${limit}`);
  return {
    content: [{ type: "text", text: JSON.stringify(await results.json()) }]
  };
}

// 数据库查询实现
async function queryDatabase(sql: string) {
  // 实现数据库查询逻辑
  // 注意:实际应用中需要防止 SQL 注入
  return {
    content: [{ type: "text", text: "查询结果..." }]
  };
}

// 启动服务器
const transport = new StdioServerTransport();
await server.connect(transport);

配置 Claude Desktop 使用 MCP

// ~/Library/Application Support/Claude/claude_desktop_config.json (macOS)
// %APPDATA%/Claude/claude_desktop_config.json (Windows)

{
  "mcpServers": {
    "enterprise-kb": {
      "command": "node",
      "args": ["/path/to/enterprise-mcp-server/dist/index.js"]
    }
  }
}

资源定义示例

// src/resources/documents.ts
import { ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";

export function registerDocumentResources(server: Server) {
  // 静态资源
  server.resources.register({
    uri: "docs://company/policies",
    name: "公司规章制度",
    description: "公司内部规章制度文档",
    mimeType: "text/markdown",
    async read() {
      const content = await fetchPolicyDocument();
      return { contents: [{ uri: "docs://company/policies", text: content }] };
    }
  });

  // 动态资源模板
  server.resources.registerTemplate(
    new ResourceTemplate("docs://projects/{projectId}", {
      list: async () => {
        const projects = await listProjects();
        return {
          resources: projects.map(p => ({
            uri: `docs://projects/${p.id}`,
            name: p.name
          }))
        };
      }
    })
  );
}

1.4 MCP 生态系统

官方服务器

Anthropic 提供了多个官方 MCP 服务器:

服务器功能链接
Filesystem文件系统访问GitHub
PostgreSQLPostgreSQL 数据库GitHub
SQLiteSQLite 数据库GitHub
GitHubGitHub API 集成GitHub
Google DriveGoogle Drive 访问GitHub
Brave Search网页搜索GitHub

社区服务器

项目描述链接
OpenMemory MCPAI 记忆共享方案github.com/mem0ai/mem0…
MCP C# SDK微软官方 .NET SDKgithub.com/modelcontex…
MCP Java SDKJava 版本 SDKgithub.com/modelcontex…

1.5 最佳实践

1. 单一职责原则

每个 MCP 服务器专注一个领域:

✅ 好的设计
├── github-mcp-server/      # GitHub 操作
├── database-mcp-server/    # 数据库操作
└── slack-mcp-server/       # Slack 集成

❌ 不好的设计
└── everything-mcp-server/  # 做太多事情

2. 清晰的错误处理

// 提供清晰的错误信息,帮助 AI 理解失败原因
server.setRequestHandler(CallToolRequestSchema, async (request) => {
  try {
    const result = await executeTool(request.params);
    return { content: [{ type: "text", text: JSON.stringify(result) }] };
  } catch (error) {
    return {
      content: [{
        type: "text",
        text: JSON.stringify({
          error: true,
          message: `执行失败: ${error.message}`,
          suggestion: "请检查参数是否正确,或联系管理员"
        })
      }],
      isError: true
    };
  }
});

3. 详细的工具描述

{
  name: "search_code",
  description: `
    在代码库中搜索代码片段。

    使用场景:
    - 查找函数定义
    - 搜索特定模式
    - 定位配置文件

    返回结果包含:
    - 文件路径
    - 行号
    - 匹配上下文
  `,
  inputSchema: { /* ... */ }
}

4. 权限控制

// 实现最小权限原则
const PERMISSIONS = {
  search_documents: "read",
  create_document: "write",
  delete_document: "admin"
};

function checkPermission(tool: string, user: User): boolean {
  const requiredPermission = PERMISSIONS[tool];
  return user.permissions.includes(requiredPermission);
}

1.6 快速开始

安装 MCP SDK

# TypeScript
npm install @modelcontextprotocol/sdk

# Python
pip install mcp

创建第一个 MCP 服务器

# 使用官方模板
npx @modelcontextprotocol/create-server my-first-server

cd my-first-server
npm install
npm run dev

GitHub 项目推荐

项目描述链接
MCP SDK (TypeScript)Anthropic 官方 SDKgithub.com/modelcontex…
MCP SDK (Python)Python 版本 SDKgithub.com/modelcontex…
MCP Servers官方服务器合集github.com/modelcontex…
MCP Specification协议规范文档github.com/modelcontex…

下一篇: 智能体(Agent)


欢迎关注的我的公众号《码上未来》,一起交流AI前沿技术!

码上未来.jpg

扫码二维码加我微信进群聊AI

image.png