Skip to content

Commit b437cad

Browse files
committed
fix: adding MCP SSE support to tanchat
1 parent 6d1782c commit b437cad

File tree

5 files changed

+80
-1
lines changed

5 files changed

+80
-1
lines changed

packages/cta-engine/src/create-app.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -799,6 +799,6 @@ Use the following commands to start your app:
799799
% cd ${options.projectName}
800800
% ${startCommand}
801801
802-
Please read the README.md for more information on testing, styling, adding routes, react-query, etc.${errorStatement}`)
802+
Please check the README.md for more information on testing, styling, adding routes, react-query, etc.${errorStatement}`)
803803
}
804804
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { createAPIFileRoute } from "@tanstack/react-start/api";
2+
import { getEvent } from "vinxi/http";
3+
4+
import { transports } from "@/utils/demo.sse";
5+
6+
export const APIRoute = createAPIFileRoute("/api/messages")({
7+
// @ts-ignore
8+
POST: async ({ request, params }) => {
9+
const body = await request.json();
10+
const url = new URL(request.url);
11+
const sessionId = url.searchParams.get("sessionId") as string;
12+
const transport = transports[sessionId];
13+
if (transport) {
14+
try {
15+
getEvent().node.res.statusCode = 200;
16+
await transport.handleMessage(body);
17+
} catch (error) {
18+
getEvent().node.res.send("Error handling message");
19+
}
20+
} else {
21+
getEvent().node.res.send("No transport found for sessionId");
22+
}
23+
},
24+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { createAPIFileRoute } from '@tanstack/react-start/api'
2+
import { getEvent } from 'vinxi/http'
3+
import { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js'
4+
5+
import { transports, server } from '@/utils/demo.sse'
6+
7+
export const APIRoute = createAPIFileRoute('/api/sse')({
8+
// @ts-ignore
9+
GET: async ({}) => {
10+
const transport = new SSEServerTransport(
11+
'/api/messages',
12+
getEvent().node.res,
13+
)
14+
transports[transport.sessionId] = transport
15+
transport.onerror = (error) => {
16+
console.error(error)
17+
}
18+
getEvent().node.res.on('close', () => {
19+
delete transports[transport.sessionId]
20+
})
21+
await server.connect(transport)
22+
},
23+
})
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2+
import { SSEServerTransport } from "@modelcontextprotocol/sdk/server/sse.js";
3+
import { getWebRequest } from "vinxi/http";
4+
5+
import guitars from "@/data/example-guitars";
6+
7+
export const server = new McpServer({
8+
name: "guitar-server",
9+
version: "1.0.0",
10+
});
11+
export const transports: { [sessionId: string]: SSEServerTransport } = {};
12+
13+
server.tool("getGuitars", {}, async ({}) => {
14+
const port = new URL(getWebRequest().url).port;
15+
return {
16+
content: [
17+
{
18+
type: "text",
19+
text: JSON.stringify(
20+
guitars.map((guitar) => ({
21+
id: guitar.id,
22+
name: guitar.name,
23+
description: guitar.description,
24+
price: guitar.price,
25+
image: `http://localhost:${port}${guitar.image}`,
26+
}))
27+
),
28+
},
29+
],
30+
};
31+
});

packages/cta-engine/templates/react/example/tanchat/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
"dependencies": {
33
"@ai-sdk/anthropic": "^1.1.17",
44
"@ai-sdk/react": "^1.1.23",
5+
"@modelcontextprotocol/sdk": "^1.8.0",
56
"ai": "^4.1.65",
67
"highlight.js": "^11.11.1",
78
"react-markdown": "^9.0.1",

0 commit comments

Comments
 (0)