#!/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 { DataLoader } from './utils/dataLoader.js';
import { logger } from './utils/errorHandler.js';
import { getLicenseTypesTool, handleGetLicenseTypes } from './tools/getLicenseTypes.js';
import { calculateFeesTool, handleCalculateFees } from './tools/calculateFees.js';
import { compareJurisdictionsTool, handleCompareJurisdictions } from './tools/compareJurisdictions.js';
import { getComplianceRequirementsTool, handleGetComplianceRequirements } from './tools/getComplianceRequirements.js';
import { getRegulatoryUpdatesTool, handleGetRegulatoryUpdates } from './tools/getRegulatoryUpdates.js';
import { calculateMarketSizeTool, handleCalculateMarketSize } from './tools/calculateMarketSize.js';
const DATA_PATH = process.env.DATA_PATH || './data/states/completed';
const CACHE_TTL = parseInt(process.env.CACHE_TTL || '3600', 10);
const dataLoader = new DataLoader(DATA_PATH, CACHE_TTL);
const server = new Server({
name: "us-gambling-regulations",
version: "1.0.0",
}, {
capabilities: {
tools: {},
},
});
server.setRequestHandler(ListToolsRequestSchema, async () => {
logger.info('Listing available tools');
return {
tools: [
getLicenseTypesTool,
calculateFeesTool,
compareJurisdictionsTool,
getComplianceRequirementsTool,
getRegulatoryUpdatesTool,
calculateMarketSizeTool,
],
};
});
server.setRequestHandler(CallToolRequestSchema, async (request) => {
const { name, arguments: args } = request.params;
logger.info('Tool called', { tool: name, args });
try {
let result;
switch (name) {
case "get_license_types":
result = await handleGetLicenseTypes(args, dataLoader);
break;
case "calculate_fees":
result = await handleCalculateFees(args, dataLoader);
break;
case "compare_jurisdictions":
result = await handleCompareJurisdictions(args, dataLoader);
break;
case "get_compliance_requirements":
result = await handleGetComplianceRequirements(args, dataLoader);
break;
case "get_regulatory_updates":
result = await handleGetRegulatoryUpdates(args, dataLoader);
break;
case "calculate_market_size":
result = await handleCalculateMarketSize(args, dataLoader);
break;
default:
result = {
content: [{
type: "text",
text: JSON.stringify({ error: `Unknown tool: ${name}` })
}],
isError: true
};
}
return result;
}
catch (error) {
logger.error('Tool execution failed', { tool: name, error });
return {
content: [{
type: "text",
text: JSON.stringify({
error: error instanceof Error ? error.message : 'Unknown error'
})
}],
isError: true
};
}
});
async function main() {
try {
logger.info('Starting US Gambling Regulations MCP Server');
logger.info('Data path:', DATA_PATH);
logger.info('Cache TTL:', CACHE_TTL);
const availableStates = await dataLoader.getAvailableStates();
logger.info(`Loaded ${availableStates.length} state data files`);
const transport = new StdioServerTransport();
await server.connect(transport);
logger.info('US Gambling Regulations MCP Server running on stdio');
}
catch (error) {
logger.error('Server startup failed:', error);
process.exit(1);
}
}
process.on('SIGINT', async () => {
logger.info('Shutting down server...');
dataLoader.clearCache();
process.exit(0);
});
process.on('SIGTERM', async () => {
logger.info('Shutting down server...');
dataLoader.clearCache();
process.exit(0);
});
main().catch((error) => {
logger.error("Fatal error:", error);
process.exit(1);
});
//# sourceMappingURL=index.js.map