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

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 采用客户端-服务器架构,包含三个核心组件:

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

核心概念

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

协议层

scss 复制代码
┌─────────────────────────────────────────┐
│            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

项目结构

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

核心代码实现

typescript 复制代码
// 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

json 复制代码
// ~/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"]
    }
  }
}

资源定义示例

typescript 复制代码
// 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
PostgreSQL PostgreSQL 数据库 GitHub
SQLite SQLite 数据库 GitHub
GitHub GitHub API 集成 GitHub
Google Drive Google Drive 访问 GitHub
Brave Search 网页搜索 GitHub

社区服务器

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

1.5 最佳实践

1. 单一职责原则

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

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

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

2. 清晰的错误处理

typescript 复制代码
// 提供清晰的错误信息,帮助 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. 详细的工具描述

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

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

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

4. 权限控制

typescript 复制代码
// 实现最小权限原则
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

bash 复制代码
# TypeScript
npm install @modelcontextprotocol/sdk

# Python
pip install mcp

创建第一个 MCP 服务器

bash 复制代码
# 使用官方模板
npx @modelcontextprotocol/create-server my-first-server

cd my-first-server
npm install
npm run dev

GitHub 项目推荐

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

下一篇: 智能体(Agent)


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

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

相关推荐
舒一笑1 天前
大模型根本不是“学会了”,它只是会“看例子”:一文讲透 In-context Learning(ICL)
langchain·llm·openai
冬奇Lab1 天前
你的 Skill 真的好用吗?来自OpenAI的 Eval 系统化验证 Agent 技能方法论
人工智能·openai
朦胧之1 天前
AI 编程开发思维
前端·后端·ai编程
甲维斯1 天前
Opus4.7克隆 Claude 继续!接入GLM5实现聊天功能
ai编程·vibecoding
Karl_wei1 天前
企业级 Vibe Coding 实操
openai·ai编程·cursor
oden1 天前
省下的就是净利润:手把手教你用模型路由砍掉 80% 的 OpenClaw 账单
aigc·ai编程·aiops
爱吃的小肥羊1 天前
2026 Claude Design 完整指南:功能介绍+使用教程+Claude会员订阅方法
aigc·ai编程
带你去学习1 天前
codex app每次打开重连5次Reconnecting问题解决
ai·ai编程
麦哲思科技任甲林1 天前
大懒人AI结对工作模式——驾驭AI编程的进阶指南
人工智能·ai编程·结对编程·工作模式·ai赋能
HashTang1 天前
我用 Cloudflare Workers + GitHub Actions 做了个 2.5 刀/月的 AI 日报,代码开源了
前端·ai编程·aiops