Dart MCP Server

  • src
#!/usr/bin/env node import { Client } from '@modelcontextprotocol/sdk/client/index.js'; import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js'; import { join } from 'path'; import { fileURLToPath } from 'url'; const __dirname = fileURLToPath(new URL('.', import.meta.url)); async function main() { // Create transport for stdio communication const transport = new StdioClientTransport({ command: 'node', args: [join(__dirname, 'index.js')], stderr: process.stderr, }); // Initialize client with capabilities const client = new Client({ name: 'dart-test-client', version: '0.1.0', }, { capabilities: { tools: {}, // Empty object to enable tools capability }, }); try { // Connect to server await client.connect(transport); console.log('Connected to server'); // List available tools console.log('Listing available tools...'); const tools = await client.listTools(); console.log('Available tools:', JSON.stringify(tools, null, 2)); // Get default space DUID console.log('\nGetting default space DUID...'); const spaceResponse = await client.callTool('get_default_space', {}); console.log('Space response:', spaceResponse.content[0].text); // Extract space DUID from response const spaceMatch = spaceResponse.content[0].text.match(/DUID: ([a-zA-Z0-9-]+)/); if (!spaceMatch) { throw new Error('Failed to extract space DUID from response'); } const spaceDuid = spaceMatch[1]; console.log('Default space DUID:', spaceDuid); // Get default status DUIDs console.log('\nGetting default status DUIDs...'); const statusResponse = await client.callTool('get_default_status', {}); console.log('Status response:', statusResponse.content[0].text); // Extract status DUIDs const todoMatch = statusResponse.content[0].text.match(/Todo: ([a-zA-Z0-9-]+)/); const doingMatch = statusResponse.content[0].text.match(/Doing: ([a-zA-Z0-9-]+)/); const doneMatch = statusResponse.content[0].text.match(/Done: ([a-zA-Z0-9-]+)/); if (!todoMatch || !doingMatch || !doneMatch) { throw new Error('Failed to extract status DUIDs from response'); } const statusDuids = { todo: todoMatch[1], doing: doingMatch[1], done: doneMatch[1] }; console.log('Status DUIDs:', statusDuids); // Get dartboards console.log('\nGetting dartboards...'); const dartboardsResponse = await client.callTool('get_dartboards', { space_duid: spaceDuid }); console.log('Dartboards response:', dartboardsResponse.content[0].text); // Create a test task console.log('\nCreating test task...'); const createResponse = await client.callTool('create_task', { title: 'Test MCP Task', description: 'Testing the MCP server integration', priority: 'High', tags: ['test', 'mcp'], size: 3, }); console.log('Create task response:', createResponse.content[0].text); // Extract DUID from response const match = createResponse.content[0].text.match(/DUID: ([a-zA-Z0-9-]+)/); if (!match) { throw new Error('Failed to extract task DUID from response'); } const taskDuid = match[1]; console.log('Created task DUID:', taskDuid); // Update the task to "doing" status console.log('\nUpdating task to "doing" status...'); const doingResponse = await client.callTool('update_task', { duid: taskDuid, status_duid: statusDuids.doing, description: 'Updated description via MCP', priority: 'Critical' }); console.log('Update to doing response:', doingResponse.content[0].text); // Get folders console.log('\nGetting folders...'); const foldersResponse = await client.callTool('get_folders', { space_duid: spaceDuid }); console.log('Folders response:', foldersResponse.content[0].text); // Mark task as done console.log('\nMarking task as done...'); const doneResponse = await client.callTool('update_task', { duid: taskDuid, status_duid: statusDuids.done }); console.log('Mark as done response:', doneResponse.content[0].text); } catch (error) { console.error('Test failed:', error); if (error.response) { console.error('Response:', error.response); } if (error.stack) { console.error('Stack:', error.stack); } process.exit(1); } finally { // Cleanup await client.close(); } } main().catch(error => { console.error('Unhandled error:', error); process.exit(1); });