@coretext-ai/qa-discord-77f3255a-cccf-4fab-b131-c7d49ae1be7c
Version:
MCP server with discord integration
106 lines • 4.26 kB
JavaScript
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import { CallToolRequestSchema, ErrorCode, ListToolsRequestSchema, McpError, } from '@modelcontextprotocol/sdk/types.js';
import { config } from 'dotenv';
import { loadConfig, validateConfig } from './config.js';
import { LogShipper } from './services/log-shipper.js';
import { Logger } from './services/logger.js';
// Load environment variables
config();
// Import tools from each template
import { DiscordTools } from './tools/discord-tools.js';
import { DiscordClient } from './clients/discord-client.js';
class DiscordMcpServerServer {
constructor() {
// Initialize logging first
this.initializeLogging();
this.server = new Server({
name: 'discord-mcp-server',
version: '1.0.0',
}, {
capabilities: {
tools: {},
},
});
// Initialize template clients and tools
// Regular client - pass configuration object
this.discordClient = new DiscordClient({
authToken: process.env.DISCORD_ACCESS_TOKEN,
dISCORDACCESSTOKEN: process.env.DISCORD_ACCESS_TOKEN,
logger: this.logger
});
this.discordTools = new DiscordTools(this.discordClient);
this.setupHandlers();
}
initializeLogging() {
const config = loadConfig();
const validation = validateConfig(config);
if (!validation.isValid) {
console.error('Configuration validation failed:', validation.errors);
process.exit(1);
}
this.logShipper = new LogShipper(config.logShipping);
this.logger = new Logger({
logLevel: config.logShipping.logLevel,
component: 'server',
enableConsole: true,
enableShipping: config.logShipping.enabled,
serverName: 'discord-mcp-server',
logShipper: this.logShipper
});
this.logger.info('SERVER_INIT', 'MCP server initializing', {
serverName: 'discord-mcp-server',
logShippingEnabled: config.logShipping.enabled,
logLevel: config.logShipping.logLevel
});
}
setupHandlers() {
this.server.setRequestHandler(ListToolsRequestSchema, async () => {
const tools = [];
// Add discord tools
tools.push(...this.discordTools.getToolDefinitions());
return { tools };
});
this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
const { name, arguments: args } = request.params;
try {
// Handle discord tools
if (this.discordTools.canHandle(name)) {
return await this.discordTools.executeTool(name, args);
}
throw new McpError(ErrorCode.MethodNotFound, `Unknown tool: ${name}`);
}
catch (error) {
if (error instanceof McpError) {
throw error;
}
throw new McpError(ErrorCode.InternalError, `Tool execution failed: ${error instanceof Error ? error.message : String(error)}`);
}
});
}
async run() {
const transport = new StdioServerTransport();
await this.server.connect(transport);
this.logger.info('SERVER_START', 'MCP server started successfully', {
serverName: 'discord-mcp-server',
transport: 'stdio'
});
console.error('discord-mcp-server MCP server running on stdio');
// Handle graceful shutdown for log shipping
const shutdown = async () => {
this.logger.info('SERVER_SHUTDOWN', 'MCP server shutting down', {
serverName: 'discord-mcp-server'
});
if (this.logShipper) {
await this.logShipper.shutdown();
}
process.exit(0);
};
process.on('SIGINT', shutdown);
process.on('SIGTERM', shutdown);
}
}
const server = new DiscordMcpServerServer();
server.run().catch(console.error);
//# sourceMappingURL=index.js.map