大模型的得力干将MCP(3) - SSE服务

今天我们将继续学习,将了解MCP服务的另一种通信方式。当然这两种都是有不同的适用场景的,并非竞争的关系。后面也会说明,其各自的优缺点和场景。

等系列课学习完成,你将能了解什么是MCP,如何开发MCP和如何实际使用它(当然我们会回归到Dify中,配合LLM,更加完善我们的AI应用适用场景)。

**01.**动手准备

在我们动手写一个自己的SSE版本的MCP之前,又需要了解协议的一些概念,这样做起来就得心应手了。

  1. Resoures:暴露结构化数据的内容给LLM。

  2. Prompts:提供给LLM应用的可重用Prompt模板。

  3. Tools:提供在服务端给LLM应用特别是Agent使用的工具。

  4. Roots:定义API的接入点和访问路径

  5. Sampling:允许服务器通过客户端请求LLM完成

    当然以上不是全部都必须,比如可以只实现Tools功能,那我们同样从TypeScript的SDK开始。

    上一课的例子是通过stdio传输数据,即数据是本地机器的进程间通信。适合AI助手工具来软件使用。

    而今天我们来尝试实现远程通信。

**02.**动手做一做

复制一下上节课的项目,做以下修改:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
const app = express();

// to support multiple simultaneous connections we have a lookup object from
// sessionId to transport
// const transports: {[sessionId: string]: SSEServerTransport} = {};
let transport: SSEServerTransport;
app.get("/sse", async (_: Request, res: Response) => {
console.log("Received connection");
transport = new SSEServerTransport("/message", res);
await server.connect(transport);
});

app.post("/messages", async (req: Request, res: Response) => {
console.log("Received message");

await transport.handlePostMessage(req, res);
});

const PORT = process.env.PORT || 3001;
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});

记得把express包依赖也加入到package.json。

1
2
npm run build
node index.js

图片

测试一下是否工作正常。使用API测试工具,访问http://localhost:3001/sse,如果成功,会出现如下图结果。

图片

同时,刚刚启动node的窗口,也会打印”Received connection”的日志。

这样,就完成了SSE的MCP服务改造。

**03.**补充说明

看起来一切都是那么的简单。但是仅仅靠测试工具测试它工作,这才是第一步。而我们要让它服务大模型,所以还需要一个相对于的MCP client,让它们之间正常交互数据,才算完整。

不要着急,麦金叔接下来会继续介绍,请耐心等待。

总结

今天学习了MCP服务的SSE实现。理解stdio的方式与封装为远程服务之间的代码差异。但是,还有更多的MCP的模块没有引入,后面的文章将继续探讨,敬请期待。