main.ts•2.27 kB
#!/usr/bin/env node
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { setupStdioFiltering } from './stdio-filter.js';
import { log } from './logger.js';
import { parseConfig } from './config.js';
import { BotConnection } from './bot-connection.js';
import { ToolFactory } from './tool-factory.js';
import { MessageStore } from './message-store.js';
import { registerPositionTools } from './tools/position-tools.js';
import { registerInventoryTools } from './tools/inventory-tools.js';
import { registerBlockTools } from './tools/block-tools.js';
import { registerEntityTools } from './tools/entity-tools.js';
import { registerChatTools } from './tools/chat-tools.js';
import { registerFlightTools } from './tools/flight-tools.js';
import { registerGameStateTools } from './tools/gamestate-tools.js';
setupStdioFiltering();
process.on('unhandledRejection', (reason) => {
log('error', `Unhandled rejection: ${reason}`);
});
process.on('uncaughtException', (error) => {
log('error', `Uncaught exception: ${error}`);
});
async function main() {
const config = parseConfig();
const messageStore = new MessageStore();
const connection = new BotConnection(
config,
{
onLog: log,
onChatMessage: (username, message) => messageStore.addMessage(username, message)
}
);
connection.connect();
const server = new McpServer({
name: "minecraft-mcp-server",
version: "2.0.0"
});
const factory = new ToolFactory(server, connection);
const getBot = () => connection.getBot()!;
registerPositionTools(factory, getBot);
registerInventoryTools(factory, getBot);
registerBlockTools(factory, getBot);
registerEntityTools(factory, getBot);
registerChatTools(factory, getBot, messageStore);
registerFlightTools(factory, getBot);
registerGameStateTools(factory, getBot);
process.stdin.on('end', () => {
connection.cleanup();
log('info', 'MCP Client has disconnected. Shutting down...');
process.exit(0);
});
const transport = new StdioServerTransport();
await server.connect(transport);
}
main().catch((error) => {
log('error', `Fatal error in main(): ${error}`);
process.exit(1);
});