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
JavaScript
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);
});