UNPKG

redmine-mcp-tools

Version:

A comprehensive Model Context Protocol (MCP) server for Redmine integration. Provides 25+ specialized tools for complete Redmine API access including issue management, project administration, time tracking, and user management. Built with TypeScript and d

62 lines (61 loc) 2.01 kB
#!/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 { RedmineClient } from "./lib/client.js"; import { getAllTools } from "./tools/index.js"; import { createHandlers } from "./handlers/index.js"; import { validateConfig } from "./lib/config.js"; // Validate environment variables const config = validateConfig(); // Initialize Redmine client const redmineClient = new RedmineClient(config.redmineUrl, config.apiToken); // Create handlers const handlers = createHandlers(redmineClient); // Get all available tools const tools = getAllTools(); // Initialize MCP server const server = new Server({ name: "redmine-connector", version: "1.0.0", }, { capabilities: { tools: {}, }, }); // Handle tool listing server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: tools, })); // Handle tool execution server.setRequestHandler(CallToolRequestSchema, async (request) => { const { name, arguments: args } = request.params; if (name in handlers) { try { return await handlers[name](args || {}); } catch (error) { return { content: [{ type: "text", text: `Error executing ${name}: ${error instanceof Error ? error.message : String(error)}` }], isError: true, }; } } return { content: [{ type: "text", text: `Unknown tool: ${name}` }], isError: true, }; }); // Start server async function main() { const transport = new StdioServerTransport(); await server.connect(transport); console.error("Redmine Connector MCP server running on stdio"); } main().catch((error) => { console.error("Server error:", error); process.exit(1); });