-
-
Notifications
You must be signed in to change notification settings - Fork 1.8k
Expand file tree
/
Copy pathmcp.ts
More file actions
64 lines (55 loc) · 1.64 KB
/
mcp.ts
File metadata and controls
64 lines (55 loc) · 1.64 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import express from 'express';
import { McpServer, ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';
import { SSEServerTransport } from '@modelcontextprotocol/sdk/server/sse.js';
import { z } from 'zod';
import { wrapMcpServerWithSentry } from '@sentry/core';
const mcpRouter = express.Router();
const server = wrapMcpServerWithSentry(
new McpServer({
name: 'Echo',
version: '1.0.0',
}),
);
server.resource('echo', new ResourceTemplate('echo://{message}', { list: undefined }), async (uri, { message }) => ({
contents: [
{
uri: uri.href,
text: `Resource echo: ${message}`,
},
],
}));
server.tool('echo', { message: z.string() }, async ({ message }, rest) => {
return {
content: [{ type: 'text', text: `Tool echo: ${message}` }],
};
});
server.prompt('echo', { message: z.string() }, ({ message }, extra) => ({
messages: [
{
role: 'user',
content: {
type: 'text',
text: `Please process this message: ${message}`,
},
},
],
}));
const transports: Record<string, SSEServerTransport> = {};
mcpRouter.get('/sse', async (_, res) => {
const transport = new SSEServerTransport('/messages', res);
transports[transport.sessionId] = transport;
res.on('close', () => {
delete transports[transport.sessionId];
});
await server.connect(transport);
});
mcpRouter.post('/messages', async (req, res) => {
const sessionId = req.query.sessionId;
const transport = transports[sessionId as string];
if (transport) {
await transport.handlePostMessage(req, res);
} else {
res.status(400).send('No transport found for sessionId');
}
});
export { mcpRouter };