MCP Orchestrator Server
by mokafari
#!/usr/bin/env node
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
import { readFileSync } from 'fs';
// Debug logging helper
function log(message, data = null) {
const timestamp = new Date().toISOString();
console.log(`[${timestamp}] ${message}`);
if (data) {
console.log(JSON.stringify(data, null, 2));
}
console.log('-'.repeat(80));
}
async function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function main() {
try {
log('Starting coordination test...');
// Read MCP settings to get server configuration
const settingsPath = '/Users/gustav/Library/Application Support/Code/User/globalStorage/rooveterinaryinc.roo-cline/settings/cline_mcp_settings.json';
const settings = JSON.parse(readFileSync(settingsPath, 'utf8'));
const serverConfig = settings.mcpServers.orchestrator;
if (!serverConfig) {
throw new Error('Orchestrator server not found in MCP settings');
}
log('Using server config:', serverConfig);
// Initialize MCP client and connect to server
const transport = new StdioClientTransport({
command: serverConfig.command,
args: serverConfig.args,
env: {
...process.env,
...serverConfig.env,
DEBUG: 'true'
}
});
const client = new Client(
{
name: 'coordination-test',
version: '0.1.0'
},
{
capabilities: {
resources: true,
tools: true
}
}
);
log('Connecting to orchestrator server...');
await client.connect(transport);
log('Connected successfully');
// Create tasks with dependencies
log('Creating research task...');
const researchTask = await client.callTool('orchestrator', 'create_task', {
id: 'research',
description: 'Research authentication methods'
});
log('Research task created:', researchTask);
log('Creating design task...');
const designTask = await client.callTool('orchestrator', 'create_task', {
id: 'design',
description: 'Design authentication system',
dependencies: ['research']
});
log('Design task created:', designTask);
log('Creating implementation task...');
const implementTask = await client.callTool('orchestrator', 'create_task', {
id: 'implement',
description: 'Implement authentication system',
dependencies: ['design']
});
log('Implementation task created:', implementTask);
// Research instance starts working
log('Research instance requesting task...');
const researchWork = await client.callTool('orchestrator', 'get_next_task', {
instance_id: 'research-instance'
});
log('Research instance got task:', researchWork);
// Design instance checks what's available
log('Design instance checking task status...');
const designCheck1 = await client.callTool('orchestrator', 'get_task_status', {});
log('Design instance sees:', designCheck1);
// Design instance checks its dependencies
log('Design instance checking dependencies...');
const designDeps = await client.callTool('orchestrator', 'get_task_details', {
task_id: 'design'
});
log('Design task dependencies:', designDeps);
// Research instance completes its work
await sleep(2000);
log('Research instance completing task...');
const researchComplete = await client.callTool('orchestrator', 'complete_task', {
task_id: 'research',
instance_id: 'research-instance',
result: 'OAuth 2.0 recommended for authentication'
});
log('Research completion unlocked tasks:', researchComplete);
// Design instance checks again and gets the task
log('Design instance checking task status again...');
const designCheck2 = await client.callTool('orchestrator', 'get_task_status', {});
log('Design instance sees tasks are updated:', designCheck2);
log('Design instance requesting task...');
const designWork = await client.callTool('orchestrator', 'get_next_task', {
instance_id: 'design-instance'
});
log('Design instance got task:', designWork);
// Implementation instance checks status
log('Implementation instance checking dependencies...');
const implementDeps = await client.callTool('orchestrator', 'get_task_details', {
task_id: 'implement'
});
log('Implementation task dependencies:', implementDeps);
// Design instance completes its work
await sleep(2000);
log('Design instance completing task...');
const designComplete = await client.callTool('orchestrator', 'complete_task', {
task_id: 'design',
instance_id: 'design-instance',
result: 'Authentication system design document completed'
});
log('Design completion unlocked tasks:', designComplete);
// Implementation instance gets its task
log('Implementation instance requesting task...');
const implementWork = await client.callTool('orchestrator', 'get_next_task', {
instance_id: 'implement-instance'
});
log('Implementation instance got task:', implementWork);
// Implementation instance completes work
await sleep(2000);
log('Implementation instance completing task...');
const implementComplete = await client.callTool('orchestrator', 'complete_task', {
task_id: 'implement',
instance_id: 'implement-instance',
result: 'Authentication system implemented and tested'
});
log('Implementation completion result:', implementComplete);
// Check final status
log('Getting final task status...');
const finalStatus = await client.callTool('orchestrator', 'get_task_status', {});
log('Final status:', finalStatus);
log('Test completed successfully');
} catch (error) {
console.error('Test failed:', error);
process.exit(1);
}
}
// Run the test
main().catch(console.error);