@boundless-oss/atlas
Version:
Atlas - MCP Server for comprehensive startup project management
159 lines • 8.2 kB
JavaScript
/**
* MCP Client utility for web dashboard
* Provides interface to call MCP tools from the web dashboard
*/
let mcpClient = null;
export function getMCPClient() {
// In a real implementation, this would connect to the MCP server
// For now, we'll return a mock client that can simulate tool calls
if (!mcpClient) {
mcpClient = createMockMCPClient();
}
return mcpClient;
}
function createMockMCPClient() {
return {
async callTool(toolName, args) {
console.log(`Mock MCP call: ${toolName}`, args);
// Return mock data based on tool name
switch (toolName) {
case 'get_epic_progress':
return {
epicId: args.epicId,
epicTitle: 'Mock Epic',
progress: {
completionPercentage: 65,
completedStories: 8,
totalStories: 12,
inProgressStories: 3,
blockedStories: 1
},
storyPoints: {
total: 34,
completed: 22,
completionPercentage: 65
},
statusBreakdown: {
todo: 1,
inProgress: 3,
review: 0,
done: 8
}
};
case 'get_team_velocity_trend':
return {
velocityTrend: [
{ sprintId: 'sprint-1', sprintName: 'Sprint 1', completedPoints: 21, plannedPoints: 25 },
{ sprintId: 'sprint-2', sprintName: 'Sprint 2', completedPoints: 23, plannedPoints: 25 },
{ sprintId: 'sprint-3', sprintName: 'Sprint 3', completedPoints: 26, plannedPoints: 30 },
{ sprintId: 'sprint-4', sprintName: 'Sprint 4', completedPoints: 24, plannedPoints: 25 },
{ sprintId: 'sprint-5', sprintName: 'Sprint 5', completedPoints: 28, plannedPoints: 30 }
],
summary: {
averageVelocity: 24.4,
trendDirection: 'increasing',
consistency: {
standardDeviation: 2.5,
coefficientOfVariation: 0.10
}
}
};
case 'get_cycle_time_metrics':
return {
stories: [
{ storyId: 'story-1', title: 'User Login', cycleTimeDays: 3.5, timeInEachStatus: { todo: 0.5, inProgress: 2, review: 0.5, done: 0.5 } },
{ storyId: 'story-2', title: 'Dashboard', cycleTimeDays: 5, timeInEachStatus: { todo: 1, inProgress: 3, review: 0.5, done: 0.5 } }
],
summary: {
totalStories: 2,
completedStories: 2,
averageCycleTimeDays: 4.25,
medianCycleTimeDays: 4.25,
bottlenecks: {
longestPhase: 'inProgress',
averageTimeInPhase: { todo: 0.75, inProgress: 2.5, review: 0.5, done: 0.5 }
}
}
};
case 'get_cross_sprint_analytics':
return {
sprints: [
{ name: 'Sprint 1', completionRate: 85, storiesCompleted: 17, storiesTotal: 20, velocity: 85 },
{ name: 'Sprint 2', completionRate: 92, storiesCompleted: 23, storiesTotal: 25, velocity: 92 },
{ name: 'Sprint 3', completionRate: 78, storiesCompleted: 18, storiesTotal: 23, velocity: 78 },
{ name: 'Sprint 4', completionRate: 95, storiesCompleted: 19, storiesTotal: 20, velocity: 95 },
{ name: 'Sprint 5', completionRate: 88, storiesCompleted: 22, storiesTotal: 25, velocity: 88 }
],
trends: {
averageCompletionRate: 87.6,
velocityTrend: 'stable',
predictability: 'high'
}
};
case 'get_epic_timeline':
return {
epicId: args.epicId,
timeline: [
{ sprintId: 'sprint-1', sprintName: 'Sprint 1', status: 'completed', storiesCompleted: 3, totalStories: 4, pointsCompleted: 13, totalPoints: 17, completionPercentage: 76 },
{ sprintId: 'sprint-2', sprintName: 'Sprint 2', status: 'active', storiesCompleted: 2, totalStories: 5, pointsCompleted: 8, totalPoints: 21, completionPercentage: 38 }
],
summary: {
totalSprints: 2,
sprintsCompleted: 1,
estimatedSprintsRemaining: 2
}
};
case 'validate_epic_requirements':
return {
epicId: args.epicId,
overallValid: false,
validationResults: [
{ check: 'All stories completed', passed: false, message: '3 stories remaining incomplete' },
{ check: 'Acceptance criteria met', passed: true, message: 'All completed stories meet acceptance criteria' },
{ check: 'No blocked stories', passed: false, message: '1 story is currently blocked' },
{ check: 'Epic goals achieved', passed: true, message: 'All epic goals have been satisfied' }
],
summary: {
totalChecks: 4,
passed: 2,
failed: 2
}
};
case 'generate_epic_burndown':
return {
epicId: args.epicId,
chartData: [
{ date: new Date(Date.now() - 14 * 24 * 60 * 60 * 1000).toISOString(), remainingPoints: 55, idealPoints: 55 },
{ date: new Date(Date.now() - 10 * 24 * 60 * 60 * 1000).toISOString(), remainingPoints: 47, idealPoints: 44 },
{ date: new Date(Date.now() - 6 * 24 * 60 * 60 * 1000).toISOString(), remainingPoints: 38, idealPoints: 33 },
{ date: new Date(Date.now() - 2 * 24 * 60 * 60 * 1000).toISOString(), remainingPoints: 25, idealPoints: 22 },
{ date: new Date().toISOString(), remainingPoints: 20, idealPoints: 11 }
],
summary: {
totalPoints: 55,
remainingPoints: 20,
completedPoints: 35,
burnRate: 2.5,
projectedCompletion: 'On track'
}
};
default:
return { success: true, message: `Mock response for ${toolName}` };
}
}
};
}
// Initialize MCP client connection
export async function initializeMCPClient() {
try {
// In production, this would establish a real connection to the MCP server
console.log('Initializing MCP client connection...');
mcpClient = createMockMCPClient();
return true;
}
catch (error) {
console.error('Failed to initialize MCP client:', error);
return false;
}
}
//# sourceMappingURL=mcp-client.js.map