#!/usr/bin/env node
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
import { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js';
const SERVER_URL = process.env.MCP_SERVER_URL || 'http://localhost:3000/mcp';
const SESSION_ID = process.env.SESSION_ID || 'demo-session-' + Date.now();
async function main() {
console.log('🔌 Connecting to MCP Todo Server...');
console.log(` URL: ${SERVER_URL}`);
console.log(` Session: ${SESSION_ID}\n`);
// Create MCP client
const client = new Client({
name: 'todo-client',
version: '1.0.0',
}, {
capabilities: {}
});
// Connect using SSE transport
const transport = new SSEClientTransport(new URL(SERVER_URL));
await client.connect(transport);
console.log('✅ Connected!\n');
try {
// List available tools
console.log('📋 Available Tools:');
const tools = await client.request({
method: 'tools/list'
}, { schema: null });
tools.tools.forEach((tool) => {
console.log(` - ${tool.name}: ${tool.description}`);
});
console.log('');
// Example 1: Add a todo
console.log('➕ Adding a new todo...');
const addResult = await client.request({
method: 'tools/call',
params: {
name: 'todo_add',
arguments: {
sessionId: SESSION_ID,
title: 'Complete MCP implementation',
description: 'Finish building the multi-node MCP todo server with Redis',
priority: 'high'
}
}
}, { schema: null });
console.log(' Result:', JSON.parse(addResult.content[0].text).message);
console.log('');
// Example 2: Add more todos
await client.request({
method: 'tools/call',
params: {
name: 'todo_add',
arguments: {
sessionId: SESSION_ID,
title: 'Write documentation',
description: 'Create comprehensive README with usage examples',
priority: 'medium'
}
}
}, { schema: null });
await client.request({
method: 'tools/call',
params: {
name: 'todo_add',
arguments: {
sessionId: SESSION_ID,
title: 'Test load balancing',
description: 'Verify requests are distributed across nodes',
priority: 'high'
}
}
}, { schema: null });
// Example 3: List todos
console.log('📝 Listing all todos...');
const listResult = await client.request({
method: 'tools/call',
params: {
name: 'todo_list',
arguments: {
sessionId: SESSION_ID,
status: 'all'
}
}
}, { schema: null });
const todos = JSON.parse(listResult.content[0].text);
console.log(` Found ${todos.count} todos:`);
todos.todos.forEach((todo, i) => {
console.log(` ${i + 1}. [${todo.priority}] ${todo.title} - ${todo.status}`);
});
console.log('');
// Example 4: Analyze todos with AI
console.log('🤖 Analyzing todos with AI...');
const analyzeResult = await client.request({
method: 'tools/call',
params: {
name: 'todo_analyze',
arguments: {
sessionId: SESSION_ID
}
}
}, { schema: null });
console.log('\n' + analyzeResult.content[0].text);
console.log('');
// Example 5: Mark a todo as done
const todoId = todos.todos[0].id;
console.log(`✔️ Marking todo as done: ${todos.todos[0].title}`);
await client.request({
method: 'tools/call',
params: {
name: 'todo_mark_done',
arguments: {
sessionId: SESSION_ID,
todoId: todoId
}
}
}, { schema: null });
console.log(' Done!\n');
// Example 6: List pending todos only
console.log('📝 Listing pending todos...');
const pendingResult = await client.request({
method: 'tools/call',
params: {
name: 'todo_list',
arguments: {
sessionId: SESSION_ID,
status: 'pending'
}
}
}, { schema: null });
const pending = JSON.parse(pendingResult.content[0].text);
console.log(` ${pending.count} pending todos\n`);
// Example 7: Clear all todos
console.log('🗑️ Clearing all todos...');
await client.request({
method: 'tools/call',
params: {
name: 'todo_clear',
arguments: {
sessionId: SESSION_ID
}
}
}, { schema: null });
console.log(' All todos cleared!\n');
console.log('✅ Demo completed successfully!');
} catch (error) {
console.error('❌ Error:', error);
} finally {
await client.close();
}
}
main().catch(console.error);