#!/usr/bin/env node
/**
* Todoist MCP Server
*
* An MCP server providing comprehensive task management through Todoist.
* Supports tasks, projects, labels, comments, and productivity workflows.
*/
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import { TodoistService } from './services/index.js';
import {
registerTaskTools,
registerProjectTools,
registerLabelTools,
registerUtilityTools,
} from './tools/index.js';
import { registerTaskResources, registerProjectResources } from './resources/index.js';
import { registerWorkflowPrompts } from './prompts/index.js';
// Get API token from environment
const API_TOKEN = process.env.TODOIST_API_TOKEN;
if (!API_TOKEN) {
console.error('Error: TODOIST_API_TOKEN environment variable is required');
console.error('');
console.error('To get your API token:');
console.error('1. Go to https://todoist.com/app/settings/integrations/developer');
console.error('2. Copy your API token');
console.error('3. Set it as an environment variable:');
console.error(' export TODOIST_API_TOKEN=your_token_here');
console.error('');
console.error('Or add it to your Claude Code MCP configuration:');
console.error(' claude mcp add --transport stdio todoist \\');
console.error(' --env TODOIST_API_TOKEN=your_token_here \\');
console.error(' -- node /path/to/todoist-mcp/dist/index.js');
process.exit(1);
}
// Initialize services
const todoist = new TodoistService(API_TOKEN);
// Create MCP server
const server = new McpServer({
name: 'todoist-mcp',
version: '1.0.0',
});
// Register all tools
registerTaskTools(server, todoist);
registerProjectTools(server, todoist);
registerLabelTools(server, todoist);
registerUtilityTools(server, todoist);
// Register resources
registerTaskResources(server, todoist);
registerProjectResources(server, todoist);
// Register prompts
registerWorkflowPrompts(server, todoist);
// Start the server
async function main() {
const transport = new StdioServerTransport();
await server.connect(transport);
// Log to stderr (not stdout, which is used for MCP communication)
console.error('Todoist MCP server started');
console.error('Rate limit stats:', todoist.getRateLimitStats());
}
main().catch((error) => {
console.error('Fatal error:', error);
process.exit(1);
});