/**
* MCP Server Setup
*/
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 { z } from 'zod';
import { RunSolverTool, createRunSolverTool } from './tools/run-solver.js';
import { LoadRangeTool, createLoadRangeTool } from './tools/load-range.js';
import { ListRangesTool, createListRangesTool } from './tools/list-ranges.js';
import { ConfigureTreeTool, createConfigureTreeTool } from './tools/configure-tree.js';
import { ListOutputsTool, createListOutputsTool } from './tools/list-outputs.js';
export class TexasSolverMCPServer {
constructor(solverPath, storageManager) {
this.solverPath = solverPath;
this.storageManager = storageManager;
// Initialize tools
this.runSolverTool = new RunSolverTool(solverPath, storageManager);
this.loadRangeTool = new LoadRangeTool(solverPath);
this.listRangesTool = new ListRangesTool(solverPath);
this.configureTreeTool = new ConfigureTreeTool(solverPath, storageManager);
this.listOutputsTool = new ListOutputsTool(storageManager);
// Create MCP server
this.server = new Server({
name: 'texassolver-mcp',
version: '1.0.0'
});
this._setupHandlers();
}
/**
* Set up request handlers
* @private
*/
_setupHandlers() {
// Handle tool listing
this.server.setRequestHandler(ListToolsRequestSchema, async () => {
return {
tools: [
createRunSolverTool(),
createLoadRangeTool(),
createListRangesTool(),
createConfigureTreeTool(),
createListOutputsTool()
]
};
});
// Handle tool calls
this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
const { name, arguments: args } = request;
try {
let result;
switch (name) {
case 'run_solver':
result = await this.runSolverTool.execute(args);
break;
case 'load_range':
result = await this.loadRangeTool.execute(args);
break;
case 'list_ranges':
result = await this.listRangesTool.execute(args);
break;
case 'build_game_tree_config':
result = await this.configureTreeTool.execute(args);
break;
case 'list_outputs':
result = await this.listOutputsTool.execute(args);
break;
default:
return {
isError: true,
content: [
{
type: 'text',
text: `Unknown tool: ${name}`
}
]
};
}
// Format result for MCP
if (result.success === false) {
return {
isError: true,
content: [
{
type: 'text',
text: `Error: ${result.error}`
}
]
};
}
return {
content: [
{
type: 'text',
text: JSON.stringify(result, null, 2)
}
]
};
} catch (error) {
return {
isError: true,
content: [
{
type: 'text',
text: `Server error: ${error.message}`
}
]
};
}
});
}
/**
* Connect to transport and start server
* @param {ServerTransport} transport
* @returns {Promise<void>}
*/
async connect(transport) {
await this.server.connect(transport);
}
/**
* Get server instance
* @returns {Server}
*/
getServer() {
return this.server;
}
}
export default TexasSolverMCPServer;