MCP是什么?技术原理是是什么?

参考链接:https://www.bilibili.com/video/BV1AnQNYxEsy

Modal Context Protocol 模型上下文协议,由Claude的母公司Anthorpic于24年底开源发布。旨在为大型语言模型(LLM)与外部工具(浏览器、文件系统、数据库、GitHub等)建立统一的通信框架,获取信息并完成具体任务。MCP服务作为AI与外部工具的中间层,代替人类访问并且操作外部工具。

每个MCP服务或者叫做MCP Server都专精于一类工作,比如有的负责读写浏览器,有的负责读写本地文件。

MCP Server通常就是运行在本地的一段Node或者Python程序,大模型通过操作标准输入通道调用某个MCP Server
在这里插入图片描述
MCP Server接到这些请求以后,访问外部工具,完成任务。

MCP 的最大优点在于整合了各家大模型不同的function call标准,整合成了一个统一的标准协议。

MCP是如何对接大模型的?

抓取AI提示词,拆解MCP的底层原理
学习链接:https://www.bilibili.com/video/BV1P3XTYPEJm

方案1

通过function call

方案2

通过prompt 提示词
在这里插入图片描述

MCP server list

1、https://github.com/modelcontextprotocol
2、https://github.com/punkpeye/awesome-mcp-servers
3、https://smithery.ai/

实战

1、支持MCP的客户端

  • Cursor
  • Cline
  • Claude App

2、常用的MCP Server

3、开发一个自己的MCP
参考链接:https://www.bilibili.com/video/BV1RNTtzMENj


MCP(Model Context Protocol,模型上下文协议)是由 Anthropic 在 2024 年提出的开放标准协议,旨在为大型语言模型(LLM)与外部数据源或工具之间建立标准化连接。比如:

  • 数据源:文件系统、数据库、API 等
  • 工具:可以执行特定操作的功能
  • 提示词模板:预定义的提示词
    在这里插入图片描述

核心定义与定位

  1. 技术本质
    MCP 是 AI 生态的通用接口协议,类比为 “AI 时代的 USB 接口”。它通过标准化交互方式,解决传统 API 集成中的碎片化问题,实现工具与模型的即插即用连接。

    • 核心目标:消除 LLM 与外部系统(如数据库、云服务、本地文件)对接的定制化开发成本,降低集成门槛。
  2. 与传统 API 的区别

    • 功能扩展性:MCP 不仅支持 API 工具调用,还提供上下文管理、文件读取、内置提示词等 AI 专用功能 [2]。
    • 交互模式:API 需开发者手动调用,而 MCP 允许模型根据用户指令主动触发工具调用,实现自动化决策。

技术架构与核心组件

MCP 采用 Client-Host-Server 三层架构:

  1. 主机(Host)
    • 承载 AI 模型的应用(如 Claude Desktop、智能 IDE),负责发起任务调度 [4][6]。
  2. 客户端(Client)
    • 作为 Host 与 Server 的通信代理,封装请求/响应数据为 JSON-RPC 格式 [7]。
  3. 服务器(Server)
    • 连接外部资源(如数据库、云 API),执行具体操作并返回结果 [4][9]。
    • 传输机制:支持 stdio(本地进程通信)和 SSE(网络实时推送)两种模式 [6]。

核心价值与优势

  1. 开发效率革命
    • 传统需数周的集成工作可缩短至数小时,维护成本降低 70%+ [1][2]。
  2. 生态网络效应
    • 构建双边市场:AI 开发者(需求方)与工具提供商(供给方)形成规模化生态(如阿里云百炼集成 110+ 服务)[1]。
  3. 安全与灵活性
    • 安全隔离:模型不直接访问系统资源,操作经 MCP 中转控制数据边界 [6][9]。
    • 动态扩展:新工具只需实现 MCP Server 接口即可接入,无需改造现有系统 [7]。

典型应用场景

领域 案例
企业自动化 订单处理、库存管理通过 MCP 调用 ERP 系统,减少人工干预 [2][6]。
开发者工具 IDE 插件调用编译器/调试器辅助代码生成,实时分析日志 [6][9]。
消费服务 旅行助手联动航班 API、日历应用,自动预订行程 [4][11]。
数据分析 AI 通过 MCP 访问数据库生成可视化报告,同步邮件发送 [6]。

与其他技术的协同与区别

  1. vs. Function Calling
    • 互补关系:Function Calling 是模型内部能力(输出结构化参数),MCP 是外部协议层(执行具体操作),两者需配合使用。
  2. vs. A2A 协议
    • 定位差异:MCP 专注工具调用,A2A(Agent-to-Agent)解决智能体间协作问题

MCP 调用机制详解

调用流程:

  1. 用户输入 → 2. AI分析意图 → 3. 选择合适的MCP工具 → 4. 调用MCP → 5. 处理结果 → 6. 返回给用户

谁调用 MCP?

调用方(MCP 客户端):

  • AI 应用(如 Claude Desktop、Cursor、Windsurf 等)
  • 支持 MCP 协议的聊天工具
  • 自定义的 AI 应用程序

被调用方(MCP 服务器):

  • 你创建的 MCP 服务器(如之前的 mcp-simple.js
  • 官方或第三方 MCP 服务器

什么情况下调用?

自动调用场景:

  1. 用户提问时 - AI 判断需要外部工具/数据
   用户: "帮我计算 23 * 45"
   AI: 发现有 calculate 工具 → 调用 MCP 服务器
  1. 需要访问资源时
   用户: "读取 data.json 文件"
   AI: 调用文件系统 MCP 服务器
  1. 执行操作时
   用户: "创建一个新文件"
   AI: 调用 MCP 服务器的文件操作工具

如何调用?

完整调用流程:

1. 启动阶段(配置)
   ┌─────────────┐
   │ AI 客户端    │ 读取 mcp.json
   └──────┬──────┘
          │ 启动子进程
          ↓
   ┌─────────────┐
   │ MCP 服务器   │ node mcp-simple.js
   └─────────────┘

2. 初始化
   AI 客户端 → MCP 服务器: "你有哪些工具?"
   MCP 服务器 → AI 客户端: "我有 hello 工具"

3. 运行时调用
   用户 → AI: "say hello to Alice"
   AI → MCP 服务器: CallTool(name: "hello", args: {name: "Alice"})
   MCP 服务器 → AI: {text: "你好, Alice!"}
   AI → 用户: "执行结果:你好, Alice!"
  1. 启动时:

    • Cursor读取配置
    • 启动所有配置的 MCP 服务器(作为子进程)
    • 询问每个服务器有哪些工具和资源
      在这里插入图片描述
  2. 对话时:

   你: "帮我用 hello 工具问候 Bob"
   Cursor (AI):
   1. 分析请求 → 发现需要 hello 工具
   2. 发送 JSON-RPC 请求到 MCP 服务器
   3. 接收响应
   4. 把结果返回给你
具体决策示例

场景1:数学计算

用户:"5加3等于多少?"
决策过程:
1. 识别关键词:"加"、数字"5"、"3"
2. 匹配工具:add(描述包含"计算"、"和")
3. 提取参数:a=5, b=3
4. 验证参数:类型正确,必需参数齐全
5. 调用工具:add(5, 3)

场景2:问候功能

用户:"跟张三打个招呼"
决策过程:
1. 识别关键词:"打招呼"、"张三"
2. 匹配工具:hello(描述包含"问候")
3. 提取参数:name="张三"
4. 验证参数:可选参数,类型正确
5. 调用工具:hello("张三")

总结:
大模型调用工具的决策是一个多层次的智能推理过程:

1、理解用户真实需求
2、匹配最合适的工具
3、提取必要的参数
4、验证调用的可行性
5、执行工具调用
6、整合结果并回答

技术细节:

1. 配置文件(告诉 AI 如何启动 MCP 服务器)

{
  "mcpServers": {
    "simple": {
      "command": "node",           // 启动命令
      "args": ["mcp-simple.js"]    // 参数
    }
  }
}

2. 通信方式(通过 stdio)

// MCP 服务器通过标准输入输出通信
stdin  ← AI 发送 JSON-RPC 请求
stdout → MCP 返回 JSON-RPC 响应

3. JSON-RPC 协议

JSON-RPC(JavaScript Object Notation Remote Procedure Call)是一种轻量级、无状态的远程过程调用(RPC)传送协议,它主要使用 JSON 格式来传输数据和定义通信规范。JSON-RPC 可以使用多种底层协议,但在实际应用中,主要有HTTP/HTTPS、WebSocket、TCP/IP 套接字 (Sockets)等。

工作原理

JSON-RPC 遵循简单的请求-响应模型:

1、客户端请求:客户端向服务器发送一个包含特定成员(jsonrpc版本号、method名称、params参数、以及可选的id标识符)的 JSON 对象。
2、服务器处理:服务器解析请求,执行相应的远程方法。
3、服务器响应:服务器返回一个响应对象,包含请求的 id、执行结果 (result) 或错误信息 (error)。

// AI 调用工具
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "hello",
    "arguments": { "name": "Alice" }
  }
}

// MCP 服务器响应
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "content": [
      { "type": "text", "text": "你好, Alice!" }
    ]
  }
}

demo测试

在这里插入图片描述

#!/usr/bin/env node

// 导入 MCP SDK 的核心组件
const { Server } = require('@modelcontextprotocol/sdk/server/index.js');
const { StdioServerTransport } = require('@modelcontextprotocol/sdk/server/stdio.js');
const {
    CallToolRequestSchema,    // 工具调用请求的 Schema 定义
    ErrorCode,               // MCP 标准错误码
    ListToolsRequestSchema,  // 工具列表请求的 Schema 定义
    McpError                 // MCP 标准错误类
} = require('@modelcontextprotocol/sdk/types.js');

/**
 * Hello MCP 服务器类
 * 提供简单的问候和数学计算工具给大模型使用
 */
class HelloMcpServer {
    constructor() {
        // 创建 MCP 服务器实例
        console.error('init server');
        this.server = new Server(
            {
                name: 'hello-mcp-server',  // 服务器名称(必须字段)
                version: '0.1.0'           // 服务器版本(必须字段)
            },
            {
                capabilities: {            // 声明服务器支持的能力(必须字段)
                    tools: {}              // 声明支持工具功能
                }
            }
        );

        // 初始化工具处理器和错误处理
        this.setupToolHandlers();
        this.setupErrorHandling();
    }

    /**
     * 设置工具处理器
     * 定义大模型可以调用的工具及其处理逻辑
     */
    setupToolHandlers() {
        // 处理工具列表请求 - 当大模型询问"有哪些工具可用"时调用
        this.server.setRequestHandler(ListToolsRequestSchema, async () => {
            console.error('MCP服务启动,在询问有哪些工具可调用');
            return {
                tools: [
                    {
                        name: 'hello',                    // 工具名称(唯一标识符)
                        description: '返回一个简单的问候语',  // 工具功能描述
                        inputSchema: {                    // 输入参数的 JSON Schema 定义
                            type: 'object',
                            properties: {
                                name: {
                                    type: 'string',
                                    description: '要问候的名字'
                                }
                            }
                            // 注意:name 参数是可选的,所以没有 required 字段
                        }
                    },
                    {
                        name: 'add',                      // 数学加法工具
                        description: '计算两个数字的和',
                        inputSchema: {
                            type: 'object',
                            properties: {
                                a: {
                                    type: 'number',
                                    description: '第一个数字'
                                },
                                b: {
                                    type: 'number',
                                    description: '第二个数字'
                                }
                            },
                            required: ['a', 'b']          // 这两个参数是必须的
                        }
                    }
                ]
            };
        });

        // 处理工具调用请求 - 当大模型实际调用工具时执行
        this.server.setRequestHandler(CallToolRequestSchema, async request => {
            // 从请求中提取工具名称和参数
            const { name, arguments: args } = request.params;

            try {
                // 根据工具名称路由到对应的处理逻辑
                switch (name) {
                    case 'hello':
                        // 处理问候工具调用
                        return {
                            content: [                    // MCP 协议要求的响应格式
                                {
                                    type: 'text',         // 内容类型(必须字段)
                                    text: `你好,${args.name || '世界'}`  // 实际返回的文本内容
                                }
                            ]
                        };

                    case 'add':
                        // 参数类型验证 - 确保传入的是数字
                        if (typeof args.a !== 'number' || typeof args.b !== 'number') {
                            throw new McpError(ErrorCode.InvalidParams, '参数必须是数字');
                        }
                        
                        // 执行加法计算并返回结果
                        return {
                            content: [
                                {
                                    type: 'text',
                                    text: `${args.a} + ${args.b} = ${args.a + args.b}`
                                }
                            ]
                        };

                    default:
                        // 处理未知工具调用
                        throw new McpError(ErrorCode.MethodNotFound, `未知工具: ${name}`);
                }
            } catch (error) {
                // 错误处理:如果是 MCP 错误直接抛出,否则包装为内部错误
                if (error instanceof McpError) {
                    throw error;
                }
                throw new McpError(ErrorCode.InternalError, `工具执行错误: ${error.message}`);
            }
        });
    }

    /**
     * 设置错误处理和优雅关闭
     */
    setupErrorHandling() {
        // 设置服务器错误处理器
        this.server.onerror = error => {
            console.error('[MCP Error]', error);
        };

        // 处理 Ctrl+C 信号,优雅关闭服务器
        process.on('SIGINT', async () => {
            await this.server.close();
            process.exit(0);
        });
    }

    /**
     * 启动 MCP 服务器
     * 建立与大模型的通信连接
     */
    async run() {
        // 创建标准输入输出传输层 - 用于与大模型进行 JSON-RPC 通信
        const transport = new StdioServerTransport();
        
        // 连接服务器到传输层
        await this.server.connect(transport);
        
        // 输出到 stderr 避免干扰与大模型的 stdio 通信
        console.error('Hello MCP Server 运行中...');
    }
}

// 如果这个文件被直接执行(而不是被 require),则启动服务器
if (require.main === module) {
    const server = new HelloMcpServer();
    server.run().catch(error => {
        console.error('启动失败:', error);
        process.exit(1);
    });
}

// 导出类以供其他模块使用
module.exports = HelloMcpServer;

MCP Inspector 调试工具

安装和使用

# 安装 MCP Inspector
npm install -g @modelcontextprotocol/inspector

# 启动 Inspector 调试你的服务器
npx @modelcontextprotocol/inspector node nodeServer/helloMcp.js
Inspector 功能
  • 实时通信监控:查看所有 JSON-RPC 消息
  • 工具测试:直接测试工具调用
  • 错误诊断:详细的错误信息和堆栈跟踪
  • 性能分析:请求响应时间统计

好用的mcp

AI工程化流搭建

  • chrome-devtools-mcp

  • Figma mcp

    • 获取token:点击头像,设置,security,Generate new token
  • Supabase mcp

  • Sequential Thinking + Software Planning Tool
    Sequential Thinking:结构化思考过程,将复杂的问题分解为客管理的步骤,项目经历
    Software Planning Tool:软件规划工具,技术经理

  • Magic mcp:为cursor定制的

  • 在这里插入图片描述

chrome-devtools

https://blog.csdn.net/yexudengzhidao/article/details/155499096

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐