discord-mcp
Version: 
Discord integration for Model Context Protocol
88 lines • 3.06 kB
JavaScript
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import { logger } from './utils/logger.js';
import { config } from './config.js';
import { DiscordService } from './discord/service.js';
import { SessionManager } from './session.js';
import { tools as messageTools } from './tools/messages.js';
import { tools as fileTools } from './tools/files.js';
import { tools as channelTools } from './tools/channels.js';
import { tools as relationshipTools } from './tools/relationships.js';
import { tools as presenceTools } from './tools/presence.js';
// Create MCP server using the modern API
const server = new McpServer({
    name: 'discord-mcp',
    version: '2.4.0',
});
// Initialize services
const sessionManager = new SessionManager();
let discordService = null;
// Helper to get or create Discord service
function getDiscordService() {
    const token = process.env.DISCORD_BOT_TOKEN || config.discord.token;
    if (!token) {
        throw new Error('Discord token not provided. Set DISCORD_BOT_TOKEN environment variable.');
    }
    if (!discordService) {
        discordService = new DiscordService(token);
    }
    return discordService;
}
// Collect all tools from each module
const allTools = [
    ...messageTools,
    ...fileTools,
    ...channelTools,
    ...relationshipTools,
    ...presenceTools,
];
// Register each tool using the modern server.tool() API
allTools.forEach(tool => {
    server.tool(tool.name, tool.description, tool.parameters.shape, async (args) => {
        try {
            // Validate parameters with the tool's schema
            const validatedArgs = tool.parameters.parse(args || {});
            // Create a context object that matches what the tools expect
            const toolContext = {
                discord: getDiscordService(),
                discordService: getDiscordService(),
                sessionManager,
            };
            const result = await tool.execute(validatedArgs, toolContext);
            const resultText = typeof result === 'string' ? result : JSON.stringify(result, null, 2);
            return {
                content: [
                    {
                        type: 'text',
                        text: resultText,
                    },
                ],
            };
        }
        catch (error) {
            logger.error({
                msg: 'Tool execution error',
                tool: tool.name,
                error
            });
            throw error;
        }
    });
});
// Start the server
async function main() {
    const transport = new StdioServerTransport();
    logger.info({
        msg: 'Discord MCP server starting',
        tools: allTools.length,
        toolNames: allTools.map(t => t.name),
        version: '2.4.0',
    });
    await server.connect(transport);
}
main().catch(error => {
    logger.error({ msg: 'Failed to start server', error });
    process.exit(1);
});
//# sourceMappingURL=index.js.map