UNPKG

@clicktime/mcp-server

Version:

ClickTime MCP Tech Demo for AI agents to interact with ClickTime API

87 lines (86 loc) 3.3 kB
// src/server.ts import { Server } from '@modelcontextprotocol/sdk/server/index.js'; import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'; import { CallToolRequestSchema, ListToolsRequestSchema, ListResourcesRequestSchema, ReadResourceRequestSchema, } from '@modelcontextprotocol/sdk/types.js'; import { ClickTimeAPIClient } from './api-clients.js'; import { ClickTimeToolHandlers } from './handlers.js'; import { ResourceHandlers } from './resources.js'; import { getAllTools } from './tools.js'; import { SERVER_NAME, VERSION } from './constants.js'; export class ClickTimeServer { server; client; handlers; resourceHandlers; constructor(config, allowedPaths) { this.client = new ClickTimeAPIClient(config); this.resourceHandlers = new ResourceHandlers(allowedPaths); this.handlers = new ClickTimeToolHandlers(this.client, this.resourceHandlers); this.server = new Server({ name: SERVER_NAME, version: VERSION, }, { capabilities: { tools: {}, resources: {}, }, }); this.setupHandlers(); } setupHandlers() { // List available tools this.server.setRequestHandler(ListToolsRequestSchema, async () => { const tools = getAllTools(this.client); return { tools: tools, }; }); // Handle tool calls this.server.setRequestHandler(CallToolRequestSchema, async (request) => { return await this.handlers.handleToolCall(request); }); // List available resources this.server.setRequestHandler(ListResourcesRequestSchema, async () => { const resources = await this.resourceHandlers.listResources(); return { resources: resources, }; }); // Read resource content this.server.setRequestHandler(ReadResourceRequestSchema, async (request) => { return await this.resourceHandlers.readResource({ uri: request.params.uri, }); }); } async start() { console.error('ClickTime MCP Server starting...'); // Test connection try { const isHealthy = await this.client.healthCheck(); if (!isHealthy) { throw new Error('Failed to connect to ClickTime API'); } console.error('✓ Connected to ClickTime API successfully'); } catch (error) { console.error('✗ Failed to connect to ClickTime API:', error); process.exit(1); } const transport = new StdioServerTransport(); console.error('✓ Server initialized and ready for connections'); console.error('✓ Resource handlers enabled for local file access'); console.error('Waiting for MCP client connections...\n'); await this.server.connect(transport); } async stop() { console.error('Shutting down ClickTime MCP Server...'); await this.server.close(); } /** * Add allowed directory for file access */ addAllowedDirectory(directory) { this.resourceHandlers.addAllowedDirectory(directory); } }