import { Server } from '@modelcontextprotocol/sdk/server/index.js'
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'
import { RequestSchema } from '@modelcontextprotocol/sdk/types.js'
import { z } from 'zod'
import { processRequest, formatResponse } from './pipeline.js'
// ============================================================================
// SERVER
// ============================================================================
const createServer = () => {
const server = new Server({ name: 'diff-mcp-server', version: '6.0.0' })
const handleRequest = (request: unknown) => {
try {
const result = processRequest(request)
return formatResponse(result)
} catch (error) {
throw new Error(`Request failed: ${error instanceof Error ? error.message : String(error)}`)
}
}
// Tools/call handler
server.setRequestHandler(
RequestSchema.extend({
method: z.literal('tools/call'),
params: z.object({
name: z.string(),
arguments: z.record(z.unknown()).default({})
})
}),
async (request) => handleRequest(request)
)
// Tools/list handler
server.setRequestHandler(
RequestSchema.extend({
method: z.literal('tools/list'),
params: z.object({}).optional()
}),
async (request) => handleRequest(request)
)
return server
}
// ============================================================================
// MAIN
// ============================================================================
const main = async () => {
try {
const server = createServer()
const transport = new StdioServerTransport()
await server.connect(transport)
console.error('Diff MCP Server v6.0.0 ready')
} catch (error) {
console.error('Server failed:', error instanceof Error ? error.message : String(error))
process.exit(1)
}
}
process.on('SIGINT', () => process.exit(0))
process.on('SIGTERM', () => process.exit(0))
main().catch(error => {
console.error('Fatal error:', error)
process.exit(1)
})