@clicktime/mcp-server
Version:
ClickTime MCP Tech Demo for AI agents to interact with ClickTime API
87 lines (86 loc) • 3.3 kB
JavaScript
// 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);
}
}