最近很火的MCP,究竟是什么?Trae用大白话教会你

什么是MCP?

MCP(Model Context Protocol)是一种让AI模型与外部工具通信的标准协议,它通过标准输入输出(stdin/stdout)进行通信,使用JSON格式交换数据。

MCP的通信原理

  • 标准输入(stdin) : 接收AI模型的请求
  • 标准输出(stdout) : 返回处理结果
  • 标准错误(stderr) : 输出调试信息 这种设计让MCP服务器可以独立运行,通过管道与任何支持标准输入输出的程序通信。

今天让Trae来帮我们理解一下Mcp的标准输出输入是怎么样的

消息格式详解

首先是初始化消息,来作为mcp的初始化

服务端node会响应

json 复制代码
{"type":"initialize_result","protocol":"mcp","version":"1.
0"}

然后是Trae帮我们做得简易工具来理解mcp的调用消息"tool_name": "add"

调用的json格式

css 复制代码
{
  "type": "call_tool",
  "tool_name": "add",
  "arguments": {"a": 5, "b": 3}
}

服务器会响应以下的格式

json 复制代码
{
  "type": "tool_result",
  "tool_name": "add",
  "result": {"result": 8, "operation": "5 + 3"}
}

实际测试验证

然后我让Trae帮我生成测试脚本,通过测试脚本 quick-test.js ,帮我们验证了以下功能

✅ 初始化 :服务器正确响应初始化请求

✅ 加法运算 :5 + 3 = 8,返回详细计算过程

✅ 乘法运算 :4 × 7 = 28,包含操作描述

✅ 消息回显 :正确返回输入消息及其长度

完整示例代码

这是Trae生成服务器端(mcp-demo.js)

javascript 复制代码
const readline = require('readline');

// 定义工具函数
const tools = {
  add: (a, b) => ({ result: a + b, operation: `${a} + ${b}
  ` }),
  multiply: (a, b) => ({ result: a * b, operation: `${a} × 
  ${b}` }),
  echo: (message) => ({ result: message, length: message.
  length })
};

// 处理消息
function handleMessage(message) {
  switch (message.type) {
    case 'initialize':
      return { type: 'initialize_result', protocol: 'mcp', 
      version: '1.0' };
    
    case 'call_tool':
      const tool = tools[message.tool_name];
      if (!tool) {
        return { type: 'error', message: `Unknown tool: $
        {message.tool_name}` };
      }
      const result = tool(...Object.values(message.
      arguments));
      return { type: 'tool_result', tool_name: message.
      tool_name, result };
    
    default:
      return { type: 'error', message: `Unknown message 
      type: ${message.type}` };
  }
}

// 启动服务器
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
  terminal: false
});

console.error('🚀 MCP演示服务器已启动!');
console.error('输入格式: JSON消息');
console.error('示例: {"type":"initialize"}');
console.error('示例: {"type":"call_tool","tool_name":"add",
"arguments":{"a":5,"b":3}}');
console.error('---');

rl.on('line', (line) => {
  try {
    const message = JSON.parse(line.trim());
    console.error('收到消息:', JSON.stringify(message, 
    null, 2));
    const response = handleMessage(message);
    console.log(JSON.stringify(response));
  } catch (error) {
    console.error('错误:', error.message);
    console.log(JSON.stringify({ type: 'error', message: 
    error.message }));
  }
});

生成的测试客户端(quick-test.js)

javascript 复制代码
const { spawn } = require('child_process');

const testCases = [
  { name: '初始化', message: { type: 'initialize' } },
  { name: '加法', message: { type: 'call_tool', tool_name: 
  'add', arguments: { a: 5, b: 3 } } },
  { name: '乘法', message: { type: 'call_tool', tool_name: 
  'multiply', arguments: { a: 4, b: 7 } } }
];

const server = spawn('node', ['mcp-demo.js'], { stdio: 
['pipe', 'pipe', 'inherit'] });
server.stdout.on('data', (data) => {
  console.log('响应:', JSON.parse(data.toString()));
});

testCases.forEach((test, index) => {
  setTimeout(() => {
    server.stdin.write(JSON.stringify(test.message) + 
    '\n');
  }, index * 500);
});

使用指南

可以通过以下的命令来快速开始

  1. 启动服务器 : node mcp-demo.js
  2. 手动测试 :直接输入JSON消息
  3. 自动化测试 : node quick-test.js

Trae帮我们也加了调试,方便我们看到运行的每一个过程和输出结果

  • 使用 console.error() 输出调试信息到stderr
  • 每条消息必须是 单行JSON
  • 响应后立即读取stdout,避免缓冲区溢出

控制台输出的结果

扩展建议

  • 添加更多工具函数到 tools 对象
  • 支持异步操作(返回Promise)
  • 增加错误处理和验证
  • 实现工具发现机制

通过这种标准输入输出方式,MCP实现了AI模型与工具的无缝集成,为构建强大的AI应用提供了坚实基础。

看完Trae帮我们理解的Mcp,你是不是更加清晰Mcp的原理呢?如果有疑问,在评论区留下你的疑惑吧

相关推荐
小Lu的开源日常2 小时前
踩坑日记:为什么 .gitignore 不起作用了
git·代码规范·trae
飞哥数智坊2 天前
“成章”写作助手开源:中秋赏不成月,那就开源一个 AI 实战项目吧
人工智能·ai编程·trae
用户4099322502122 天前
PostgreSQL处理SQL居然像做蛋糕?解析到执行的4步里藏着多少查询优化的小心机?
后端·ai编程·trae
用户4099322502123 天前
PostgreSQL备份不是复制文件?物理vs逻辑咋选?误删还能精准恢复到1分钟前?
后端·ai编程·trae
用户4099322502124 天前
转账不翻车、并发不干扰,PostgreSQL的ACID特性到底有啥魔法?
后端·ai编程·trae
用户4099322502125 天前
银行转账不白扣钱、电商下单不超卖,PostgreSQL事务的诀窍是啥?
后端·ai编程·trae
youcans_6 天前
【Trae】Trae 插件实战手册(1)PyCharm 安装 Trae
人工智能·python·pycharm·ai编程·trae
用户4099322502126 天前
PostgreSQL里的PL/pgSQL到底是啥?能让SQL从“说目标”变“讲步骤”?
后端·ai编程·trae
用户4099322502127 天前
PostgreSQL视图不存数据?那它怎么简化查询还能递归生成序列和控制权限?
后端·ai编程·trae
豆包MarsCode8 天前
不做“赛博棉花工”!TRAE 帮我实现数据处理自由
trae