Skip to content

Commit e6f3d34

Browse files
feat: created the example for sse
1 parent ce658fb commit e6f3d34

File tree

4 files changed

+324
-27
lines changed

4 files changed

+324
-27
lines changed

examples/mcp-sdk/package.json

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@
33
"version": "0.0.1",
44
"bin": "./dist/index.js",
55
"scripts": {
6-
"dev": "tsx ./src/index.ts",
6+
"dev": "tsx --watch ./src/index.ts",
77
"build": "pkgroll --minify"
88
},
99
"dependencies": {
10-
"@hono/node-server": "^1.13.8",
10+
"express": "^4.21.2",
1111
"@modelcontextprotocol/sdk": "^1.7.0",
1212
"hono": "^4.7.4",
1313
"muppet": "workspace:*",
@@ -18,6 +18,7 @@
1818
"@types/node": "^22.13.10",
1919
"pkgroll": "^2.11.2",
2020
"tsx": "^4.19.3",
21-
"typescript": "^5.8.2"
21+
"typescript": "^5.8.2",
22+
"@types/express": "^5.0.1"
2223
}
23-
}
24+
}

examples/mcp-sdk/src/index.ts

Lines changed: 48 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,9 @@ import {
99
} from "muppet";
1010
import z from "zod";
1111
import pino from "pino";
12-
// import { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse.js";
13-
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
12+
import { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse.js";
13+
import express from "express";
14+
// import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
1415

1516
const app = new Hono();
1617
const logger = pino(
@@ -88,7 +89,7 @@ app.post(
8889

8990
// "E:/dev/muppet/muppet/examples/mcp-sdk/dist/main.log"
9091

91-
muppet(app, {
92+
const mcpServer = muppet(app, {
9293
name: "My Muppet",
9394
version: "1.0.0",
9495
logger,
@@ -118,14 +119,56 @@ muppet(app, {
118119
];
119120
},
120121
},
121-
}).then((mcp) => {
122+
});
123+
124+
/**
125+
* For Stdio transport
126+
*/
127+
// mcpServer.then((mcp) => {
128+
// if (!mcp) {
129+
// throw new Error("MCP not initialized");
130+
// }
131+
132+
// bridge({
133+
// mcp,
134+
// transport: new StdioServerTransport(),
135+
// logger,
136+
// });
137+
// });
138+
139+
/**
140+
* For SSE transport
141+
*/
142+
let transport: SSEServerTransport | null = null;
143+
144+
const server = express().use((req, res, next) => {
145+
console.log("Request received", req.url);
146+
147+
next();
148+
});
149+
150+
server.get("/", async (req, res) => {
151+
transport = new SSEServerTransport("/messages", res);
152+
153+
const mcp = await mcpServer;
154+
122155
if (!mcp) {
123156
throw new Error("MCP not initialized");
124157
}
125158

126159
bridge({
127160
mcp,
128-
transport: new StdioServerTransport(),
161+
transport,
129162
logger,
130163
});
131164
});
165+
166+
server.post("/messages", (req, res) => {
167+
if (transport) {
168+
transport.handlePostMessage(req, res);
169+
}
170+
});
171+
172+
server.listen(3001, () => {
173+
console.log("Server started on port 3001");
174+
});

packages/core/src/transport.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ export type BridgeOptions<
3131
* Bridge aka Bifrost, the connection between the app and the transport
3232
* @param options
3333
*/
34-
export async function bridge(options: BridgeOptions) {
34+
export function bridge(options: BridgeOptions) {
3535
const { mcp: app, transport, logger } = options;
3636

3737
let messageId = 0;
@@ -102,7 +102,7 @@ export async function handleMessage(options: HandleMessageOptions) {
102102
// If there's no payload, we don't need to send a response. Eg. Notifications
103103
if (response.status === 204) return null;
104104

105-
const payload = await response.json();
105+
const payload = (await response.json()) as JSONRPCMessage;
106106

107107
logger?.info({ payload }, "Response payload");
108108

0 commit comments

Comments
 (0)