MCP学习的前置知识
这一章主要对MCP的前置知识进行学习:stdio(通信方式)、JSON-RPC(通信格式)
stdio
stdio:st and ard i nput and output (标准输入输出)
进程之间是相互独立的,而进程需要与外界进行通信,通信的方式有很多,其中一种就是stdio。它能够让一个进程 通过标准输出接口(stdout) 向外界发送信息、外界也可以 通过它的标准输入接口(stdin) 向进程中写入一些信息。
举个栗子🌰
标准输出接口
用node.js来写个简单案例:
js
//创建一个server.js
//process进程 stdout标准输出
process.stdout.write('Hello World!!\n')
然后在终端中运行它node server.js
(意思:启动一个node进程,参数是'server.js'),就会发现终端中打印了Hello World!!
。没错看起来效果很像console.log()
,因为在node环境 中console.log()
的内部确实是调用了process.stdout.write()
加上一些额外处理。
那我们刚刚说了,stdio是通信方式呀,那这里是谁跟谁通信了嘞?这里其实是node进程与终端进行通信了 :终端本身是一个进程,它在 启动子进程(这里是node进程) 的时候会去 监听子进程的标准输出接口,终端已经内置了这些流程,当它监听到数据后就会将其显示在终端。
标准输入接口
js
//server.js
//监听父进程(终端)输入
process.stdin.on('data',(data)=>{
const resp = `回复 ${data}\n`
process.stdout.write(resp)
})
运行后,会发现终端中就会一直运行着这个node进程,可以在终端输入数据然后回车来发送,就可以被node子进程接收到。那么我们就会发现,在这个场景下,终端 类似于客户端 ,因此才会给这个js文件起名为server.js
。
当然node.js自己本身也可以作为一个父进程来创建更多子进程:
js
import {spawn} from 'child_process'
// 创建子进程
const serverProcess = spawn('node',['server.js']) //启动node应用程序,参数是'server.js'
stdio的特点:简洁、高效 ,但仅适用于本地进程间通信。
JSON-RPC (通信格式约束)
request(2.0的版本,如果用到不同版本需要分析)
json
{
'jsonrpc': '2.0', //版本
'method': 'sum', //方法
'params': { //参数
"a": 5,
"b": 6
},
'id': 1 //标记
}
response
json
{
'jsonrpc': '2.0', //版本
'result': 11,
'id': 1
}
这边从server.js这边写一个测试:
js
import utils from './utils.js'
process.stdin.on('data',(data)=>{
const req = JSON.parse(data)
const funcName = req.method
const params = req.params
const result = utils[funcName](params)
const res = {
'jsonrpc': '2.0',
'result': result,
'id': req.id
}
})
小结
这些通信,主要是补充了某一些进程功能上的不足。