什么是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);
});
使用指南
可以通过以下的命令来快速开始
- 启动服务器 : node mcp-demo.js
- 手动测试 :直接输入JSON消息
- 自动化测试 : node quick-test.js
Trae帮我们也加了调试,方便我们看到运行的每一个过程和输出结果
- 使用 console.error() 输出调试信息到stderr
- 每条消息必须是 单行JSON
- 响应后立即读取stdout,避免缓冲区溢出
控制台输出的结果

扩展建议
- 添加更多工具函数到 tools 对象
- 支持异步操作(返回Promise)
- 增加错误处理和验证
- 实现工具发现机制
通过这种标准输入输出方式,MCP实现了AI模型与工具的无缝集成,为构建强大的AI应用提供了坚实基础。
看完Trae帮我们理解的Mcp,你是不是更加清晰Mcp的原理呢?如果有疑问,在评论区留下你的疑惑吧