index.ts•2.44 kB
#!/usr/bin/env node
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import {
CallToolRequestSchema,
ListToolsRequestSchema,
} from '@modelcontextprotocol/sdk/types.js';
import { zodToJsonSchema } from 'zod-to-json-schema';
import { loadConfig } from './config.js';
import { loadAllData } from './parsers/index.js';
import { tools, type ToolName, type ImageResult } from './tools/index.js';
function isImageResult(result: unknown): result is ImageResult {
return (
typeof result === 'object' &&
result !== null &&
'__type' in result &&
(result as ImageResult).__type === 'image'
);
}
const server = new Server(
{
name: 'wotblitz-mcp',
version: '1.0.0',
},
{
capabilities: {
tools: {},
},
}
);
server.setRequestHandler(ListToolsRequestSchema, async () => {
return {
tools: Object.entries(tools).map(([name, tool]) => ({
name,
description: tool.description,
inputSchema: zodToJsonSchema(tool.inputSchema, { $refStrategy: 'none' }),
})),
};
});
server.setRequestHandler(CallToolRequestSchema, async (request) => {
const toolName = request.params.name as ToolName;
const tool = tools[toolName];
if (!tool) {
return {
content: [{ type: 'text', text: `Unknown tool: ${toolName}` }],
isError: true,
};
}
try {
const input = tool.inputSchema.parse(request.params.arguments ?? {});
const result = await tool.handler(input as never);
if (isImageResult(result)) {
return {
content: [{
type: 'image',
data: result.data,
mimeType: result.mimeType,
}],
};
}
return {
content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
};
} catch (err) {
const message = err instanceof Error ? err.message : String(err);
return {
content: [{ type: 'text', text: `Error: ${message}` }],
isError: true,
};
}
});
async function main() {
try {
const config = loadConfig();
await loadAllData(config);
const transport = new StdioServerTransport();
await server.connect(transport);
} catch (err) {
console.error('Failed to start server:', err);
process.exit(1);
}
}
main().catch(err => {
console.error('Fatal error:', err instanceof Error ? err.message : err);
process.exit(1);
});