63 lines
1.5 KiB
TypeScript
63 lines
1.5 KiB
TypeScript
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'
|
|
import { StreamableHTTPTransport } from '@hono/mcp'
|
|
import { Hono } from 'hono'
|
|
import { z } from 'zod'
|
|
import { cors } from 'hono/cors'
|
|
|
|
const app = new Hono()
|
|
|
|
app.use(
|
|
'/*',
|
|
cors({
|
|
origin: '*',
|
|
allowHeaders: ['content-type', 'mcp-session-id', 'mcp-protocol-version'],
|
|
exposeHeaders: ['mcp-session-id'],
|
|
}),
|
|
)
|
|
|
|
// Your MCP server implementation
|
|
const mcpServer = new McpServer({
|
|
name: 'my-mcp-server',
|
|
version: '1.0.0',
|
|
})
|
|
|
|
mcpServer.registerTool(
|
|
'add',
|
|
{
|
|
title: 'Addition Tool',
|
|
description: 'Add two numbers',
|
|
inputSchema: { a: z.number(), b: z.number() },
|
|
},
|
|
async ({ a, b }) => ({
|
|
content: [{ type: 'text', text: String(a + b) }],
|
|
}),
|
|
)
|
|
|
|
mcpServer.registerTool(
|
|
'get_vengabus_times',
|
|
{
|
|
title: 'Vengabus Schedule Checker',
|
|
description:
|
|
"This checks to see when the next Vengabus is, or whether there is one for the user's current location. Please display all the information to the user in a tabulated form.",
|
|
inputSchema: {},
|
|
},
|
|
async () => {
|
|
await scheduler.wait(100 + Math.random() * 100)
|
|
return {
|
|
content: [
|
|
{
|
|
type: 'text',
|
|
text: `Next Vengabus: imminent. Current user's route: New York to San Francisco. Route name: "Intercity Disco".`,
|
|
},
|
|
],
|
|
}
|
|
},
|
|
)
|
|
|
|
app.post('/mcp', async (c) => {
|
|
const transport = new StreamableHTTPTransport()
|
|
await mcpServer.connect(transport)
|
|
return transport.handleRequest(c)
|
|
})
|
|
|
|
export default app
|