@gitscrum-studio/mcp-server 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +250 -0
- package/dist/auth/DeviceAuthenticator.d.ts +51 -0
- package/dist/auth/DeviceAuthenticator.d.ts.map +1 -0
- package/dist/auth/DeviceAuthenticator.js +89 -0
- package/dist/auth/DeviceAuthenticator.js.map +1 -0
- package/dist/auth/RateLimiter.d.ts +58 -0
- package/dist/auth/RateLimiter.d.ts.map +1 -0
- package/dist/auth/RateLimiter.js +181 -0
- package/dist/auth/RateLimiter.js.map +1 -0
- package/dist/auth/TokenManager.d.ts +62 -0
- package/dist/auth/TokenManager.d.ts.map +1 -0
- package/dist/auth/TokenManager.js +164 -0
- package/dist/auth/TokenManager.js.map +1 -0
- package/dist/client/GitScrumClient.d.ts +1002 -0
- package/dist/client/GitScrumClient.d.ts.map +1 -0
- package/dist/client/GitScrumClient.js +1835 -0
- package/dist/client/GitScrumClient.js.map +1 -0
- package/dist/context/ActiveContext.d.ts +79 -0
- package/dist/context/ActiveContext.d.ts.map +1 -0
- package/dist/context/ActiveContext.js +151 -0
- package/dist/context/ActiveContext.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +152 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/activity.d.ts +12 -0
- package/dist/tools/activity.d.ts.map +1 -0
- package/dist/tools/activity.js +106 -0
- package/dist/tools/activity.js.map +1 -0
- package/dist/tools/analytics.d.ts +11 -0
- package/dist/tools/analytics.d.ts.map +1 -0
- package/dist/tools/analytics.js +117 -0
- package/dist/tools/analytics.js.map +1 -0
- package/dist/tools/auth.d.ts +17 -0
- package/dist/tools/auth.d.ts.map +1 -0
- package/dist/tools/auth.js +173 -0
- package/dist/tools/auth.js.map +1 -0
- package/dist/tools/budget.d.ts +12 -0
- package/dist/tools/budget.d.ts.map +1 -0
- package/dist/tools/budget.js +109 -0
- package/dist/tools/budget.js.map +1 -0
- package/dist/tools/clientflow.d.ts +12 -0
- package/dist/tools/clientflow.d.ts.map +1 -0
- package/dist/tools/clientflow.js +476 -0
- package/dist/tools/clientflow.js.map +1 -0
- package/dist/tools/comments.d.ts +11 -0
- package/dist/tools/comments.d.ts.map +1 -0
- package/dist/tools/comments.js +99 -0
- package/dist/tools/comments.js.map +1 -0
- package/dist/tools/discussions.d.ts +12 -0
- package/dist/tools/discussions.d.ts.map +1 -0
- package/dist/tools/discussions.js +200 -0
- package/dist/tools/discussions.js.map +1 -0
- package/dist/tools/epics.d.ts +11 -0
- package/dist/tools/epics.d.ts.map +1 -0
- package/dist/tools/epics.js +122 -0
- package/dist/tools/epics.js.map +1 -0
- package/dist/tools/labels.d.ts +11 -0
- package/dist/tools/labels.d.ts.map +1 -0
- package/dist/tools/labels.js +138 -0
- package/dist/tools/labels.js.map +1 -0
- package/dist/tools/notes.d.ts +11 -0
- package/dist/tools/notes.d.ts.map +1 -0
- package/dist/tools/notes.js +201 -0
- package/dist/tools/notes.js.map +1 -0
- package/dist/tools/projects.d.ts +12 -0
- package/dist/tools/projects.d.ts.map +1 -0
- package/dist/tools/projects.js +272 -0
- package/dist/tools/projects.js.map +1 -0
- package/dist/tools/search.d.ts +17 -0
- package/dist/tools/search.d.ts.map +1 -0
- package/dist/tools/search.js +56 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/shared/actionHandler.d.ts +67 -0
- package/dist/tools/shared/actionHandler.d.ts.map +1 -0
- package/dist/tools/shared/actionHandler.js +98 -0
- package/dist/tools/shared/actionHandler.js.map +1 -0
- package/dist/tools/shared/initModules.d.ts +6 -0
- package/dist/tools/shared/initModules.d.ts.map +1 -0
- package/dist/tools/shared/initModules.js +166 -0
- package/dist/tools/shared/initModules.js.map +1 -0
- package/dist/tools/shared/toolRegistry.d.ts +45 -0
- package/dist/tools/shared/toolRegistry.d.ts.map +1 -0
- package/dist/tools/shared/toolRegistry.js +59 -0
- package/dist/tools/shared/toolRegistry.js.map +1 -0
- package/dist/tools/sprints.d.ts +11 -0
- package/dist/tools/sprints.d.ts.map +1 -0
- package/dist/tools/sprints.js +271 -0
- package/dist/tools/sprints.js.map +1 -0
- package/dist/tools/standup.d.ts +11 -0
- package/dist/tools/standup.d.ts.map +1 -0
- package/dist/tools/standup.js +89 -0
- package/dist/tools/standup.js.map +1 -0
- package/dist/tools/taskTypes.d.ts +11 -0
- package/dist/tools/taskTypes.d.ts.map +1 -0
- package/dist/tools/taskTypes.js +132 -0
- package/dist/tools/taskTypes.js.map +1 -0
- package/dist/tools/tasks.d.ts +12 -0
- package/dist/tools/tasks.d.ts.map +1 -0
- package/dist/tools/tasks.js +470 -0
- package/dist/tools/tasks.js.map +1 -0
- package/dist/tools/timeTracking.d.ts +11 -0
- package/dist/tools/timeTracking.d.ts.map +1 -0
- package/dist/tools/timeTracking.js +174 -0
- package/dist/tools/timeTracking.js.map +1 -0
- package/dist/tools/userStories.d.ts +11 -0
- package/dist/tools/userStories.d.ts.map +1 -0
- package/dist/tools/userStories.js +166 -0
- package/dist/tools/userStories.js.map +1 -0
- package/dist/tools/wiki.d.ts +11 -0
- package/dist/tools/wiki.d.ts.map +1 -0
- package/dist/tools/wiki.js +154 -0
- package/dist/tools/wiki.js.map +1 -0
- package/dist/tools/workflows.d.ts +11 -0
- package/dist/tools/workflows.d.ts.map +1 -0
- package/dist/tools/workflows.js +144 -0
- package/dist/tools/workflows.js.map +1 -0
- package/package.json +89 -0
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Action Handler Pattern
|
|
3
|
+
*
|
|
4
|
+
* Eliminates switch statements with a clean, extensible map-based approach.
|
|
5
|
+
* Each tool defines its actions as a record of handlers.
|
|
6
|
+
*/
|
|
7
|
+
import type { GitScrumClient } from "../../client/GitScrumClient.js";
|
|
8
|
+
/** Standard MCP response */
|
|
9
|
+
export type ToolResponse = {
|
|
10
|
+
content: Array<{
|
|
11
|
+
type: "text";
|
|
12
|
+
text: string;
|
|
13
|
+
}>;
|
|
14
|
+
isError?: boolean;
|
|
15
|
+
};
|
|
16
|
+
/** Handler function signature */
|
|
17
|
+
export type ActionHandler<TArgs = Record<string, unknown>> = (client: GitScrumClient, args: TArgs) => Promise<ToolResponse>;
|
|
18
|
+
/** Map of action name to handler */
|
|
19
|
+
export type ActionHandlerMap<TArgs = Record<string, unknown>> = Record<string, ActionHandler<TArgs>>;
|
|
20
|
+
/** Execute action from handler map with error handling */
|
|
21
|
+
export declare function executeAction(handlers: ActionHandlerMap<any>, action: string, client: GitScrumClient, args: any): Promise<ToolResponse>;
|
|
22
|
+
/** Context object for LLM memory */
|
|
23
|
+
export interface ResponseContext {
|
|
24
|
+
company_slug?: string;
|
|
25
|
+
project_slug?: string;
|
|
26
|
+
sprint_slug?: string;
|
|
27
|
+
user_story_slug?: string;
|
|
28
|
+
task_uuid?: string;
|
|
29
|
+
}
|
|
30
|
+
/** Success response */
|
|
31
|
+
export declare function success(text: string, context?: ResponseContext): ToolResponse;
|
|
32
|
+
/** Error response */
|
|
33
|
+
export declare function error(message: string): ToolResponse;
|
|
34
|
+
/** Validation error */
|
|
35
|
+
export declare function required(field: string): ToolResponse;
|
|
36
|
+
/** Normalize color input: supports named colors and hex codes (strips #) */
|
|
37
|
+
export declare function normalizeColor(color: string): string;
|
|
38
|
+
interface ResolvedContext {
|
|
39
|
+
company_slug: string;
|
|
40
|
+
project_slug: string;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Intelligently resolves project context from partial information.
|
|
44
|
+
* STATELESS: Performs API calls to find missing data.
|
|
45
|
+
*
|
|
46
|
+
* Resolution strategies (in order):
|
|
47
|
+
* 1. Both company_slug and project_slug provided → use as-is
|
|
48
|
+
* 2. Only project identifier provided (name OR slug) → search and get both slugs
|
|
49
|
+
* 3. Only company_slug provided → return null (need project)
|
|
50
|
+
* 4. Nothing provided → return null
|
|
51
|
+
*
|
|
52
|
+
* The key insight: project_slug might be:
|
|
53
|
+
* - An actual slug (e.g., "my-project")
|
|
54
|
+
* - A project name (e.g., "My Project")
|
|
55
|
+
* - A UUID
|
|
56
|
+
*
|
|
57
|
+
* We try to find it by searching.
|
|
58
|
+
*
|
|
59
|
+
* @returns ResolvedContext or null if resolution failed
|
|
60
|
+
*/
|
|
61
|
+
export declare function resolveProjectContext(client: GitScrumClient, args: {
|
|
62
|
+
company_slug?: string;
|
|
63
|
+
project_slug?: string;
|
|
64
|
+
project_name?: string;
|
|
65
|
+
}): Promise<ResolvedContext | null>;
|
|
66
|
+
export {};
|
|
67
|
+
//# sourceMappingURL=actionHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actionHandler.d.ts","sourceRoot":"","sources":["../../../src/tools/shared/actionHandler.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAErE,4BAA4B;AAC5B,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/C,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB,CAAC;AAEF,iCAAiC;AACjC,MAAM,MAAM,aAAa,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAC3D,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,KAAK,KACR,OAAO,CAAC,YAAY,CAAC,CAAC;AAE3B,oCAAoC;AACpC,MAAM,MAAM,gBAAgB,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,MAAM,CACpE,MAAM,EACN,aAAa,CAAC,KAAK,CAAC,CACrB,CAAC;AAEF,0DAA0D;AAE1D,wBAAsB,aAAa,CACjC,QAAQ,EAAE,gBAAgB,CAAC,GAAG,CAAC,EAC/B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,cAAc,EAEtB,IAAI,EAAE,GAAG,GACR,OAAO,CAAC,YAAY,CAAC,CAYvB;AAMD,oCAAoC;AACpC,MAAM,WAAW,eAAe;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAYD,uBAAuB;AACvB,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,YAAY,CAG7E;AAED,qBAAqB;AACrB,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,CAEnD;AAED,uBAAuB;AACvB,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,CAEpD;AAYD,4EAA4E;AAC5E,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGpD;AAMD,UAAU,eAAe;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE;IACJ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,GACA,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CA6BjC"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/** Execute action from handler map with error handling */
|
|
2
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
3
|
+
export async function executeAction(handlers, action, client,
|
|
4
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
5
|
+
args) {
|
|
6
|
+
const handler = handlers[action];
|
|
7
|
+
if (!handler) {
|
|
8
|
+
return error(`Unknown action: ${action}`);
|
|
9
|
+
}
|
|
10
|
+
try {
|
|
11
|
+
return await handler(client, args);
|
|
12
|
+
}
|
|
13
|
+
catch (err) {
|
|
14
|
+
return error(err instanceof Error ? err.message : String(err));
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
/** Format context block for LLM (user doesn't need to see, LLM uses for next calls) */
|
|
18
|
+
function formatContext(ctx) {
|
|
19
|
+
const parts = Object.entries(ctx)
|
|
20
|
+
.filter(([, v]) => v !== undefined && v !== null)
|
|
21
|
+
.map(([k, v]) => `${k}: ${v}`);
|
|
22
|
+
if (parts.length === 0)
|
|
23
|
+
return "";
|
|
24
|
+
return `\n\n---context\n${parts.join("\n")}\n---`;
|
|
25
|
+
}
|
|
26
|
+
/** Success response */
|
|
27
|
+
export function success(text, context) {
|
|
28
|
+
const contextBlock = context ? formatContext(context) : "";
|
|
29
|
+
return { content: [{ type: "text", text: text + contextBlock }] };
|
|
30
|
+
}
|
|
31
|
+
/** Error response */
|
|
32
|
+
export function error(message) {
|
|
33
|
+
return { content: [{ type: "text", text: message }], isError: true };
|
|
34
|
+
}
|
|
35
|
+
/** Validation error */
|
|
36
|
+
export function required(field) {
|
|
37
|
+
return { content: [{ type: "text", text: `Error: ${field} required` }], isError: true };
|
|
38
|
+
}
|
|
39
|
+
// ============================================================================
|
|
40
|
+
// Color Helper
|
|
41
|
+
// ============================================================================
|
|
42
|
+
const COLOR_MAP = {
|
|
43
|
+
gray: "8B949E", blue: "58A6FF", red: "F85149", green: "3FB950",
|
|
44
|
+
yellow: "D29922", purple: "A371F7", coral: "FF7B72", amber: "F2CC60",
|
|
45
|
+
sky: "79C0FF", lime: "56D364",
|
|
46
|
+
};
|
|
47
|
+
/** Normalize color input: supports named colors and hex codes (strips #) */
|
|
48
|
+
export function normalizeColor(color) {
|
|
49
|
+
const lower = color.toLowerCase().replace("#", "");
|
|
50
|
+
return COLOR_MAP[lower] || lower.toUpperCase();
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Intelligently resolves project context from partial information.
|
|
54
|
+
* STATELESS: Performs API calls to find missing data.
|
|
55
|
+
*
|
|
56
|
+
* Resolution strategies (in order):
|
|
57
|
+
* 1. Both company_slug and project_slug provided → use as-is
|
|
58
|
+
* 2. Only project identifier provided (name OR slug) → search and get both slugs
|
|
59
|
+
* 3. Only company_slug provided → return null (need project)
|
|
60
|
+
* 4. Nothing provided → return null
|
|
61
|
+
*
|
|
62
|
+
* The key insight: project_slug might be:
|
|
63
|
+
* - An actual slug (e.g., "my-project")
|
|
64
|
+
* - A project name (e.g., "My Project")
|
|
65
|
+
* - A UUID
|
|
66
|
+
*
|
|
67
|
+
* We try to find it by searching.
|
|
68
|
+
*
|
|
69
|
+
* @returns ResolvedContext or null if resolution failed
|
|
70
|
+
*/
|
|
71
|
+
export async function resolveProjectContext(client, args) {
|
|
72
|
+
// Case 1: Both provided - use as-is (trust the caller)
|
|
73
|
+
if (args.company_slug && args.project_slug) {
|
|
74
|
+
return {
|
|
75
|
+
company_slug: args.company_slug,
|
|
76
|
+
project_slug: args.project_slug,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
// Determine what project identifier we have
|
|
80
|
+
const projectIdentifier = args.project_slug || args.project_name;
|
|
81
|
+
// Case 2: We have a project identifier (name, slug, or uuid) - search for it
|
|
82
|
+
if (projectIdentifier) {
|
|
83
|
+
const found = await client.findProjectByName(projectIdentifier, args.company_slug);
|
|
84
|
+
if (found) {
|
|
85
|
+
return {
|
|
86
|
+
company_slug: found.company_slug,
|
|
87
|
+
project_slug: found.project_slug,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
// If we have company_slug but couldn't find project, return null
|
|
91
|
+
// The project identifier might be wrong
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
// Case 3: Only company_slug, no project - can't resolve full context
|
|
95
|
+
// Case 4: Nothing provided
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=actionHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actionHandler.js","sourceRoot":"","sources":["../../../src/tools/shared/actionHandler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"initModules.d.ts","sourceRoot":"","sources":["../../../src/tools/shared/initModules.ts"],"names":[],"mappings":"AA8JA;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CA2B5C"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool Modules Initialization
|
|
3
|
+
*
|
|
4
|
+
* Centralizes all tool module registration.
|
|
5
|
+
* This provides a single source of truth for tool routing.
|
|
6
|
+
*/
|
|
7
|
+
import { registerModule } from './toolRegistry.js';
|
|
8
|
+
// Tool handlers
|
|
9
|
+
import { registerAuthTools, handleAuthTool } from '../auth.js';
|
|
10
|
+
import { registerTaskTools, handleTaskTool } from '../tasks.js';
|
|
11
|
+
import { registerProjectTools, handleProjectTool } from '../projects.js';
|
|
12
|
+
import { registerSprintTools, handleSprintTool } from '../sprints.js';
|
|
13
|
+
import { registerTimeTrackingTools, handleTimeTrackingTool } from '../timeTracking.js';
|
|
14
|
+
import { registerUserStoryTools, handleUserStoryTool } from '../userStories.js';
|
|
15
|
+
import { registerWikiTools, handleWikiTool } from '../wiki.js';
|
|
16
|
+
import { registerSearchTools, handleSearchTool } from '../search.js';
|
|
17
|
+
import { registerNoteTools, handleNoteTool } from '../notes.js';
|
|
18
|
+
import { registerWorkflowTools, handleWorkflowTool } from '../workflows.js';
|
|
19
|
+
import { registerLabelTools, handleLabelTool } from '../labels.js';
|
|
20
|
+
import { registerTaskTypeTools, handleTaskTypeTool } from '../taskTypes.js';
|
|
21
|
+
import { registerClientFlowTools, handleClientFlowTool } from '../clientflow.js';
|
|
22
|
+
import { registerStandupTools, handleStandupTool } from '../standup.js';
|
|
23
|
+
import { registerCommentTools, handleCommentTool } from '../comments.js';
|
|
24
|
+
import { registerAnalyticsTools, handleAnalyticsTool } from '../analytics.js';
|
|
25
|
+
import { registerEpicTools, handleEpicTool } from '../epics.js';
|
|
26
|
+
import { registerDiscussionTools, handleDiscussionTool } from '../discussions.js';
|
|
27
|
+
import { registerActivityTools, handleActivityTool } from '../activity.js';
|
|
28
|
+
import { registerBudgetTools, handleBudgetTool } from '../budget.js';
|
|
29
|
+
// ============================================================================
|
|
30
|
+
// Tool Module Definitions
|
|
31
|
+
// ============================================================================
|
|
32
|
+
const authModule = {
|
|
33
|
+
tools: registerAuthTools(),
|
|
34
|
+
handler: handleAuthTool,
|
|
35
|
+
handles: ['auth_login', 'auth_complete', 'auth_status', 'auth_logout'],
|
|
36
|
+
};
|
|
37
|
+
const taskModule = {
|
|
38
|
+
tools: registerTaskTools(),
|
|
39
|
+
handler: handleTaskTool,
|
|
40
|
+
handles: ['task'],
|
|
41
|
+
};
|
|
42
|
+
const projectModule = {
|
|
43
|
+
tools: registerProjectTools(),
|
|
44
|
+
handler: handleProjectTool,
|
|
45
|
+
handles: ['project', 'workspace'],
|
|
46
|
+
};
|
|
47
|
+
const sprintModule = {
|
|
48
|
+
tools: registerSprintTools(),
|
|
49
|
+
handler: handleSprintTool,
|
|
50
|
+
handles: ['sprint'],
|
|
51
|
+
};
|
|
52
|
+
const timeTrackingModule = {
|
|
53
|
+
tools: registerTimeTrackingTools(),
|
|
54
|
+
handler: handleTimeTrackingTool,
|
|
55
|
+
handles: ['time'],
|
|
56
|
+
};
|
|
57
|
+
const userStoryModule = {
|
|
58
|
+
tools: registerUserStoryTools(),
|
|
59
|
+
handler: handleUserStoryTool,
|
|
60
|
+
handles: ['user_story'],
|
|
61
|
+
};
|
|
62
|
+
const wikiModule = {
|
|
63
|
+
tools: registerWikiTools(),
|
|
64
|
+
handler: handleWikiTool,
|
|
65
|
+
handles: ['wiki'],
|
|
66
|
+
};
|
|
67
|
+
const searchModule = {
|
|
68
|
+
tools: registerSearchTools(),
|
|
69
|
+
handler: handleSearchTool,
|
|
70
|
+
handles: ['search'],
|
|
71
|
+
};
|
|
72
|
+
const noteModule = {
|
|
73
|
+
tools: registerNoteTools(),
|
|
74
|
+
handler: handleNoteTool,
|
|
75
|
+
handles: ['note', 'note_folder'],
|
|
76
|
+
};
|
|
77
|
+
const workflowModule = {
|
|
78
|
+
tools: registerWorkflowTools(),
|
|
79
|
+
handler: handleWorkflowTool,
|
|
80
|
+
handles: ['workflow'],
|
|
81
|
+
};
|
|
82
|
+
const labelModule = {
|
|
83
|
+
tools: registerLabelTools(),
|
|
84
|
+
handler: handleLabelTool,
|
|
85
|
+
handles: ['label'],
|
|
86
|
+
};
|
|
87
|
+
const taskTypeModule = {
|
|
88
|
+
tools: registerTaskTypeTools(),
|
|
89
|
+
handler: handleTaskTypeTool,
|
|
90
|
+
handles: ['task_type'],
|
|
91
|
+
};
|
|
92
|
+
const clientFlowModule = {
|
|
93
|
+
tools: registerClientFlowTools(),
|
|
94
|
+
handler: handleClientFlowTool,
|
|
95
|
+
handles: ['client', 'invoice', 'proposal', 'clientflow_dashboard', 'clientflow_cross_workspace'],
|
|
96
|
+
};
|
|
97
|
+
const standupModule = {
|
|
98
|
+
tools: registerStandupTools(),
|
|
99
|
+
handler: handleStandupTool,
|
|
100
|
+
handles: ['standup'],
|
|
101
|
+
};
|
|
102
|
+
const commentModule = {
|
|
103
|
+
tools: registerCommentTools(),
|
|
104
|
+
handler: handleCommentTool,
|
|
105
|
+
handles: ['comment'],
|
|
106
|
+
};
|
|
107
|
+
const analyticsModule = {
|
|
108
|
+
tools: registerAnalyticsTools(),
|
|
109
|
+
handler: handleAnalyticsTool,
|
|
110
|
+
handles: ['analytics'],
|
|
111
|
+
};
|
|
112
|
+
const epicModule = {
|
|
113
|
+
tools: registerEpicTools(),
|
|
114
|
+
handler: handleEpicTool,
|
|
115
|
+
handles: ['epic'],
|
|
116
|
+
};
|
|
117
|
+
const discussionModule = {
|
|
118
|
+
tools: registerDiscussionTools(),
|
|
119
|
+
handler: handleDiscussionTool,
|
|
120
|
+
handles: ['discussion'],
|
|
121
|
+
};
|
|
122
|
+
const activityModule = {
|
|
123
|
+
tools: registerActivityTools(),
|
|
124
|
+
handler: handleActivityTool,
|
|
125
|
+
handles: ['activity'],
|
|
126
|
+
};
|
|
127
|
+
const budgetModule = {
|
|
128
|
+
tools: registerBudgetTools(),
|
|
129
|
+
handler: handleBudgetTool,
|
|
130
|
+
handles: ['budget'],
|
|
131
|
+
};
|
|
132
|
+
// ============================================================================
|
|
133
|
+
// Initialize All Modules
|
|
134
|
+
// ============================================================================
|
|
135
|
+
/**
|
|
136
|
+
* Registers all tool modules with the central registry.
|
|
137
|
+
* Call this once during server initialization.
|
|
138
|
+
*/
|
|
139
|
+
export function initializeToolModules() {
|
|
140
|
+
const modules = [
|
|
141
|
+
authModule,
|
|
142
|
+
taskModule,
|
|
143
|
+
projectModule,
|
|
144
|
+
sprintModule,
|
|
145
|
+
timeTrackingModule,
|
|
146
|
+
userStoryModule,
|
|
147
|
+
wikiModule,
|
|
148
|
+
searchModule,
|
|
149
|
+
noteModule,
|
|
150
|
+
workflowModule,
|
|
151
|
+
labelModule,
|
|
152
|
+
taskTypeModule,
|
|
153
|
+
clientFlowModule,
|
|
154
|
+
standupModule,
|
|
155
|
+
commentModule,
|
|
156
|
+
analyticsModule,
|
|
157
|
+
epicModule,
|
|
158
|
+
discussionModule,
|
|
159
|
+
activityModule,
|
|
160
|
+
budgetModule,
|
|
161
|
+
];
|
|
162
|
+
for (const module of modules) {
|
|
163
|
+
registerModule(module);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=initModules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"initModules.js","sourceRoot":"","sources":["../../../src/tools/shared/initModules.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool Registry - Centralized Tool Registration & Routing
|
|
3
|
+
*
|
|
4
|
+
* Eliminates if/else chains with a declarative map-based approach.
|
|
5
|
+
* Each tool module registers itself here.
|
|
6
|
+
*/
|
|
7
|
+
import type { Tool } from "@modelcontextprotocol/sdk/types.js";
|
|
8
|
+
import type { GitScrumClient } from "../../client/GitScrumClient.js";
|
|
9
|
+
import type { ToolResponse } from "./actionHandler.js";
|
|
10
|
+
/** Standardized handler signature for all tools */
|
|
11
|
+
export type ToolHandler = (client: GitScrumClient, name: string, args: Record<string, unknown>) => Promise<ToolResponse>;
|
|
12
|
+
/** Tool module definition */
|
|
13
|
+
export interface ToolModule {
|
|
14
|
+
/** Tool definitions for MCP */
|
|
15
|
+
tools: Tool[];
|
|
16
|
+
/** Handler function */
|
|
17
|
+
handler: ToolHandler;
|
|
18
|
+
/** Tool names this module handles */
|
|
19
|
+
handles: string[];
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Register a tool module
|
|
23
|
+
*/
|
|
24
|
+
export declare function registerModule(module: ToolModule): void;
|
|
25
|
+
/**
|
|
26
|
+
* Get all registered tools
|
|
27
|
+
*/
|
|
28
|
+
export declare function getAllTools(): Tool[];
|
|
29
|
+
/**
|
|
30
|
+
* Route a tool call to the appropriate handler
|
|
31
|
+
*/
|
|
32
|
+
export declare function routeToolCall(client: GitScrumClient, name: string, args: Record<string, unknown>): Promise<ToolResponse>;
|
|
33
|
+
/**
|
|
34
|
+
* Check if a tool is registered
|
|
35
|
+
*/
|
|
36
|
+
export declare function isToolRegistered(name: string): boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Get handler for a specific tool
|
|
39
|
+
*/
|
|
40
|
+
export declare function getHandler(name: string): ToolHandler | undefined;
|
|
41
|
+
/**
|
|
42
|
+
* Clear all registered tools (for testing)
|
|
43
|
+
*/
|
|
44
|
+
export declare function clearRegistry(): void;
|
|
45
|
+
//# sourceMappingURL=toolRegistry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolRegistry.d.ts","sourceRoot":"","sources":["../../../src/tools/shared/toolRegistry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAMvD,mDAAmD;AACnD,MAAM,MAAM,WAAW,GAAG,CACxB,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC1B,OAAO,CAAC,YAAY,CAAC,CAAC;AAE3B,6BAA6B;AAC7B,MAAM,WAAW,UAAU;IACzB,+BAA+B;IAC/B,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,uBAAuB;IACvB,OAAO,EAAE,WAAW,CAAC;IACrB,qCAAqC;IACrC,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAYD;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAQvD;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,EAAE,CAEpC;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,YAAY,CAAC,CAYvB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAEhE;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,IAAI,CAGpC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Registry
|
|
3
|
+
// ============================================================================
|
|
4
|
+
/** Map of tool name → handler */
|
|
5
|
+
const handlerMap = new Map();
|
|
6
|
+
/** All registered tools */
|
|
7
|
+
const allTools = [];
|
|
8
|
+
/**
|
|
9
|
+
* Register a tool module
|
|
10
|
+
*/
|
|
11
|
+
export function registerModule(module) {
|
|
12
|
+
// Add tools to collection
|
|
13
|
+
allTools.push(...module.tools);
|
|
14
|
+
// Map each handled name to the handler
|
|
15
|
+
for (const name of module.handles) {
|
|
16
|
+
handlerMap.set(name, module.handler);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Get all registered tools
|
|
21
|
+
*/
|
|
22
|
+
export function getAllTools() {
|
|
23
|
+
return allTools;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Route a tool call to the appropriate handler
|
|
27
|
+
*/
|
|
28
|
+
export async function routeToolCall(client, name, args) {
|
|
29
|
+
// Direct lookup
|
|
30
|
+
const handler = handlerMap.get(name);
|
|
31
|
+
if (handler) {
|
|
32
|
+
return handler(client, name, args);
|
|
33
|
+
}
|
|
34
|
+
// Unknown tool
|
|
35
|
+
return {
|
|
36
|
+
content: [{ type: "text", text: `Unknown tool: ${name}` }],
|
|
37
|
+
isError: true,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Check if a tool is registered
|
|
42
|
+
*/
|
|
43
|
+
export function isToolRegistered(name) {
|
|
44
|
+
return handlerMap.has(name);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Get handler for a specific tool
|
|
48
|
+
*/
|
|
49
|
+
export function getHandler(name) {
|
|
50
|
+
return handlerMap.get(name);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Clear all registered tools (for testing)
|
|
54
|
+
*/
|
|
55
|
+
export function clearRegistry() {
|
|
56
|
+
handlerMap.clear();
|
|
57
|
+
allTools.length = 0;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=toolRegistry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolRegistry.js","sourceRoot":"","sources":["../../../src/tools/shared/toolRegistry.ts"],"names":[],"mappings":"AA+BA,+EAA+E;AAC/E,WAAW;AACX,+EAA+E;AAE/E,iCAAiC;AACjC,MAAM,UAAU,GAAG,IAAI,GAAG,EAAuB,CAAC;AAElD,2BAA2B;AAC3B,MAAM,QAAQ,GAAW,EAAE,CAAC;AAE5B;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,MAAkB;IAC/C,0BAA0B;IAC1B,QAAQ,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAE/B,uCAAuC;IACvC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QAClC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAsB,EACtB,IAAY,EACZ,IAA6B;IAE7B,gBAAgB;IAChB,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACrC,CAAC;IAED,eAAe;IACf,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,IAAI,EAAE,EAAE,CAAC;QAC1D,OAAO,EAAE,IAAI;KACd,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,OAAO,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,UAAU,CAAC,KAAK,EAAE,CAAC;IACnB,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;AACtB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sprint MCP Tool (Consolidated)
|
|
3
|
+
*
|
|
4
|
+
* Uses Action Handler pattern for clean, extensible code.
|
|
5
|
+
*/
|
|
6
|
+
import type { Tool } from "@modelcontextprotocol/sdk/types.js";
|
|
7
|
+
import type { GitScrumClient } from "../client/GitScrumClient.js";
|
|
8
|
+
import { type ToolResponse } from "./shared/actionHandler.js";
|
|
9
|
+
export declare function registerSprintTools(): Tool[];
|
|
10
|
+
export declare function handleSprintTool(client: GitScrumClient, _name: string, args?: Record<string, unknown>): Promise<ToolResponse>;
|
|
11
|
+
//# sourceMappingURL=sprints.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sprints.d.ts","sourceRoot":"","sources":["../../src/tools/sprints.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAQL,KAAK,YAAY,EAElB,MAAM,2BAA2B,CAAC;AAMnC,wBAAgB,mBAAmB,IAAI,IAAI,EAAE,CAyE5C;AA2ND,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE,MAAM,EACb,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GACjC,OAAO,CAAC,YAAY,CAAC,CAGvB"}
|