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 { compareDealerScreenshotsTool } from './tools/compare-dealer-screenshots';
const server = new Server(
{ name: 'my-mcp-server', version: '1.0.0' },
{ capabilities: { tools: {} } }
);
const tools = [compareDealerScreenshotsTool];
server.setRequestHandler(ListToolsRequestSchema, async () => ({
tools: tools.map((tool) => ({
name: tool.name,
description: tool.description,
inputSchema: {
type: 'object',
properties: Object.fromEntries(
Object.entries(tool.parameters.shape).map(([key, schema]) => [
key,
{ type: getZodType(schema), description: (schema as any).description },
])
),
},
})),
}));
server.setRequestHandler(CallToolRequestSchema, async (request) => {
const { name, arguments: args } = request.params;
console.error(`[MCP] Tool: ${name}`);
const tool = tools.find((t) => t.name === name);
if (!tool) throw new Error(`Unknown tool: ${name}`);
try {
const result = await tool.execute(args as any);
return { content: [{ type: 'text', text: result }] };
} catch (error: any) {
return { content: [{ type: 'text', text: `Error: ${error.message}` }], isError: true };
}
});
function getZodType(schema: any): string {
const t = schema._def?.typeName;
if (t === 'ZodString') return 'string';
if (t === 'ZodNumber') return 'number';
if (t === 'ZodOptional') return getZodType(schema._def.innerType);
return 'string';
}
async function main() {
await server.connect(new StdioServerTransport());
console.error(`[MCP] Started: ${tools.map(t => t.name).join(', ')}`);
}
main().catch(e => { console.error(e); process.exit(1); });