@defai.digital/mcp-server 13.0.3
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 +214 -0
- package/dist/bin.d.ts +3 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +7 -0
- package/dist/bin.js.map +1 -0
- package/dist/bootstrap.d.ts +89 -0
- package/dist/bootstrap.d.ts.map +1 -0
- package/dist/bootstrap.js +161 -0
- package/dist/bootstrap.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/rate-limiter.d.ts +136 -0
- package/dist/middleware/rate-limiter.d.ts.map +1 -0
- package/dist/middleware/rate-limiter.js +262 -0
- package/dist/middleware/rate-limiter.js.map +1 -0
- package/dist/prompts/agent-guide.d.ts +16 -0
- package/dist/prompts/agent-guide.d.ts.map +1 -0
- package/dist/prompts/agent-guide.js +391 -0
- package/dist/prompts/agent-guide.js.map +1 -0
- package/dist/prompts/explain-workflow.d.ts +15 -0
- package/dist/prompts/explain-workflow.d.ts.map +1 -0
- package/dist/prompts/explain-workflow.js +157 -0
- package/dist/prompts/explain-workflow.js.map +1 -0
- package/dist/prompts/index.d.ts +39 -0
- package/dist/prompts/index.d.ts.map +1 -0
- package/dist/prompts/index.js +83 -0
- package/dist/prompts/index.js.map +1 -0
- package/dist/prompts/review-changes.d.ts +15 -0
- package/dist/prompts/review-changes.d.ts.map +1 -0
- package/dist/prompts/review-changes.js +102 -0
- package/dist/prompts/review-changes.js.map +1 -0
- package/dist/prompts/troubleshoot-session.d.ts +15 -0
- package/dist/prompts/troubleshoot-session.d.ts.map +1 -0
- package/dist/prompts/troubleshoot-session.js +156 -0
- package/dist/prompts/troubleshoot-session.js.map +1 -0
- package/dist/registry-accessor.d.ts +83 -0
- package/dist/registry-accessor.d.ts.map +1 -0
- package/dist/registry-accessor.js +153 -0
- package/dist/registry-accessor.js.map +1 -0
- package/dist/resources/agents.d.ts +40 -0
- package/dist/resources/agents.d.ts.map +1 -0
- package/dist/resources/agents.js +123 -0
- package/dist/resources/agents.js.map +1 -0
- package/dist/resources/config.d.ts +57 -0
- package/dist/resources/config.d.ts.map +1 -0
- package/dist/resources/config.js +222 -0
- package/dist/resources/config.js.map +1 -0
- package/dist/resources/index.d.ts +38 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +132 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/resources/policies.d.ts +40 -0
- package/dist/resources/policies.d.ts.map +1 -0
- package/dist/resources/policies.js +122 -0
- package/dist/resources/policies.js.map +1 -0
- package/dist/resources/sessions.d.ts +30 -0
- package/dist/resources/sessions.d.ts.map +1 -0
- package/dist/resources/sessions.js +64 -0
- package/dist/resources/sessions.js.map +1 -0
- package/dist/resources/workflows.d.ts +40 -0
- package/dist/resources/workflows.d.ts.map +1 -0
- package/dist/resources/workflows.js +143 -0
- package/dist/resources/workflows.js.map +1 -0
- package/dist/schema-registry.d.ts +23 -0
- package/dist/schema-registry.d.ts.map +1 -0
- package/dist/schema-registry.js +225 -0
- package/dist/schema-registry.js.map +1 -0
- package/dist/server.d.ts +63 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +393 -0
- package/dist/server.js.map +1 -0
- package/dist/session-accessor.d.ts +23 -0
- package/dist/session-accessor.d.ts.map +1 -0
- package/dist/session-accessor.js +39 -0
- package/dist/session-accessor.js.map +1 -0
- package/dist/shared-registry.d.ts +23 -0
- package/dist/shared-registry.d.ts.map +1 -0
- package/dist/shared-registry.js +235 -0
- package/dist/shared-registry.js.map +1 -0
- package/dist/stdio.d.ts +6 -0
- package/dist/stdio.d.ts.map +1 -0
- package/dist/stdio.js +152 -0
- package/dist/stdio.js.map +1 -0
- package/dist/tool-namespacing.d.ts +28 -0
- package/dist/tool-namespacing.d.ts.map +1 -0
- package/dist/tool-namespacing.js +80 -0
- package/dist/tool-namespacing.js.map +1 -0
- package/dist/tools/ability.d.ts +55 -0
- package/dist/tools/ability.d.ts.map +1 -0
- package/dist/tools/ability.js +560 -0
- package/dist/tools/ability.js.map +1 -0
- package/dist/tools/agent.d.ts +73 -0
- package/dist/tools/agent.d.ts.map +1 -0
- package/dist/tools/agent.js +895 -0
- package/dist/tools/agent.js.map +1 -0
- package/dist/tools/config.d.ts +36 -0
- package/dist/tools/config.d.ts.map +1 -0
- package/dist/tools/config.js +265 -0
- package/dist/tools/config.js.map +1 -0
- package/dist/tools/design.d.ts +42 -0
- package/dist/tools/design.d.ts.map +1 -0
- package/dist/tools/design.js +736 -0
- package/dist/tools/design.js.map +1 -0
- package/dist/tools/discuss.d.ts +40 -0
- package/dist/tools/discuss.d.ts.map +1 -0
- package/dist/tools/discuss.js +331 -0
- package/dist/tools/discuss.js.map +1 -0
- package/dist/tools/file-system.d.ts +63 -0
- package/dist/tools/file-system.d.ts.map +1 -0
- package/dist/tools/file-system.js +513 -0
- package/dist/tools/file-system.js.map +1 -0
- package/dist/tools/guard.d.ts +29 -0
- package/dist/tools/guard.d.ts.map +1 -0
- package/dist/tools/guard.js +311 -0
- package/dist/tools/guard.js.map +1 -0
- package/dist/tools/index.d.ts +35 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +178 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/memory.d.ts +101 -0
- package/dist/tools/memory.d.ts.map +1 -0
- package/dist/tools/memory.js +704 -0
- package/dist/tools/memory.js.map +1 -0
- package/dist/tools/orchestration.d.ts +58 -0
- package/dist/tools/orchestration.d.ts.map +1 -0
- package/dist/tools/orchestration.js +714 -0
- package/dist/tools/orchestration.js.map +1 -0
- package/dist/tools/review.d.ts +40 -0
- package/dist/tools/review.d.ts.map +1 -0
- package/dist/tools/review.js +319 -0
- package/dist/tools/review.js.map +1 -0
- package/dist/tools/scaffold.d.ts +27 -0
- package/dist/tools/scaffold.d.ts.map +1 -0
- package/dist/tools/scaffold.js +495 -0
- package/dist/tools/scaffold.js.map +1 -0
- package/dist/tools/session.d.ts +75 -0
- package/dist/tools/session.d.ts.map +1 -0
- package/dist/tools/session.js +749 -0
- package/dist/tools/session.js.map +1 -0
- package/dist/tools/telemetry.d.ts +58 -0
- package/dist/tools/telemetry.d.ts.map +1 -0
- package/dist/tools/telemetry.js +638 -0
- package/dist/tools/telemetry.js.map +1 -0
- package/dist/tools/trace.d.ts +29 -0
- package/dist/tools/trace.d.ts.map +1 -0
- package/dist/tools/trace.js +191 -0
- package/dist/tools/trace.js.map +1 -0
- package/dist/tools/workflow.d.ts +26 -0
- package/dist/tools/workflow.d.ts.map +1 -0
- package/dist/tools/workflow.js +269 -0
- package/dist/tools/workflow.js.map +1 -0
- package/dist/trace-wrapper.d.ts +79 -0
- package/dist/trace-wrapper.d.ts.map +1 -0
- package/dist/trace-wrapper.js +151 -0
- package/dist/trace-wrapper.js.map +1 -0
- package/dist/types.d.ts +185 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +11 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/artifact-store.d.ts +49 -0
- package/dist/utils/artifact-store.d.ts.map +1 -0
- package/dist/utils/artifact-store.js +102 -0
- package/dist/utils/artifact-store.js.map +1 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +10 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/response.d.ts +139 -0
- package/dist/utils/response.d.ts.map +1 -0
- package/dist/utils/response.js +293 -0
- package/dist/utils/response.js.map +1 -0
- package/dist/validation.d.ts +223 -0
- package/dist/validation.d.ts.map +1 -0
- package/dist/validation.js +372 -0
- package/dist/validation.js.map +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { createListResponse, successResponse, } from '../utils/response.js';
|
|
2
|
+
import { storeArtifact } from '../utils/artifact-store.js';
|
|
3
|
+
import { LIMIT_TRACES } from '@defai.digital/contracts';
|
|
4
|
+
/**
|
|
5
|
+
* Trace list tool definition
|
|
6
|
+
*/
|
|
7
|
+
export const traceListTool = {
|
|
8
|
+
name: 'trace_list',
|
|
9
|
+
description: 'List recent execution traces',
|
|
10
|
+
idempotent: true,
|
|
11
|
+
inputSchema: {
|
|
12
|
+
type: 'object',
|
|
13
|
+
properties: {
|
|
14
|
+
limit: {
|
|
15
|
+
type: 'number',
|
|
16
|
+
description: 'Maximum number of traces to return',
|
|
17
|
+
default: LIMIT_TRACES,
|
|
18
|
+
},
|
|
19
|
+
status: {
|
|
20
|
+
type: 'string',
|
|
21
|
+
description: 'Filter by status',
|
|
22
|
+
enum: ['success', 'failure', 'running'],
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Trace get tool definition
|
|
29
|
+
*/
|
|
30
|
+
export const traceGetTool = {
|
|
31
|
+
name: 'trace_get',
|
|
32
|
+
description: 'Get detailed information about a specific trace',
|
|
33
|
+
idempotent: true,
|
|
34
|
+
inputSchema: {
|
|
35
|
+
type: 'object',
|
|
36
|
+
properties: {
|
|
37
|
+
traceId: {
|
|
38
|
+
type: 'string',
|
|
39
|
+
description: 'The ID of the trace to retrieve',
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
required: ['traceId'],
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Trace analyze tool definition
|
|
47
|
+
*/
|
|
48
|
+
export const traceAnalyzeTool = {
|
|
49
|
+
name: 'trace_analyze',
|
|
50
|
+
description: 'Analyze a trace for performance issues or errors',
|
|
51
|
+
idempotent: true,
|
|
52
|
+
inputSchema: {
|
|
53
|
+
type: 'object',
|
|
54
|
+
properties: {
|
|
55
|
+
traceId: {
|
|
56
|
+
type: 'string',
|
|
57
|
+
description: 'The ID of the trace to analyze',
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
required: ['traceId'],
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* Handler for trace_list tool
|
|
65
|
+
* INV-MCP-RESP-002: Arrays limited to 10 items with pagination
|
|
66
|
+
*/
|
|
67
|
+
export const handleTraceList = (args) => {
|
|
68
|
+
const status = args.status;
|
|
69
|
+
// Sample traces
|
|
70
|
+
const traces = [
|
|
71
|
+
{
|
|
72
|
+
id: 'a1b2c3d4-e5f6-7890-abcd-ef1234567890',
|
|
73
|
+
label: 'data-pipeline',
|
|
74
|
+
status: 'success',
|
|
75
|
+
durationMs: 5000,
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
id: 'b2c3d4e5-f6a7-8901-bcde-f12345678901',
|
|
79
|
+
label: 'code-review',
|
|
80
|
+
status: 'success',
|
|
81
|
+
durationMs: 5000,
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
id: 'c3d4e5f6-a7b8-9012-cdef-123456789012',
|
|
85
|
+
label: 'deploy-staging',
|
|
86
|
+
status: 'failure',
|
|
87
|
+
durationMs: 2000,
|
|
88
|
+
},
|
|
89
|
+
];
|
|
90
|
+
const filtered = status !== undefined
|
|
91
|
+
? traces.filter((t) => t.status === status)
|
|
92
|
+
: traces;
|
|
93
|
+
// Use createListResponse for automatic pagination (max 10 items)
|
|
94
|
+
return Promise.resolve(createListResponse(filtered, {
|
|
95
|
+
domain: 'traces',
|
|
96
|
+
idField: 'id',
|
|
97
|
+
labelField: 'label',
|
|
98
|
+
limit: 10,
|
|
99
|
+
}));
|
|
100
|
+
};
|
|
101
|
+
/**
|
|
102
|
+
* Handler for trace_get tool
|
|
103
|
+
* INV-MCP-RESP-001: Response < 10KB with summary, events stored as artifact
|
|
104
|
+
*/
|
|
105
|
+
export const handleTraceGet = async (args) => {
|
|
106
|
+
const traceId = args.traceId;
|
|
107
|
+
const now = new Date();
|
|
108
|
+
// Sample trace detail - full events stored as artifact
|
|
109
|
+
const fullEvents = [
|
|
110
|
+
{
|
|
111
|
+
eventId: crypto.randomUUID(),
|
|
112
|
+
type: 'run.start',
|
|
113
|
+
sequence: 0,
|
|
114
|
+
timestamp: new Date(now.getTime() - 60000).toISOString(),
|
|
115
|
+
payload: { workflowId: 'data-pipeline' },
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
eventId: crypto.randomUUID(),
|
|
119
|
+
type: 'decision.routing',
|
|
120
|
+
sequence: 1,
|
|
121
|
+
timestamp: new Date(now.getTime() - 59500).toISOString(),
|
|
122
|
+
payload: {
|
|
123
|
+
selectedModel: 'claude-3-5-sonnet-20241022',
|
|
124
|
+
provider: 'anthropic',
|
|
125
|
+
},
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
eventId: crypto.randomUUID(),
|
|
129
|
+
type: 'step.execute',
|
|
130
|
+
sequence: 2,
|
|
131
|
+
timestamp: new Date(now.getTime() - 59000).toISOString(),
|
|
132
|
+
payload: { stepId: 'step-1', stepName: 'Initialize' },
|
|
133
|
+
status: 'success',
|
|
134
|
+
durationMs: 500,
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
eventId: crypto.randomUUID(),
|
|
138
|
+
type: 'step.execute',
|
|
139
|
+
sequence: 3,
|
|
140
|
+
timestamp: new Date(now.getTime() - 57000).toISOString(),
|
|
141
|
+
payload: { stepId: 'step-2', stepName: 'Process' },
|
|
142
|
+
status: 'success',
|
|
143
|
+
durationMs: 2000,
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
eventId: crypto.randomUUID(),
|
|
147
|
+
type: 'run.end',
|
|
148
|
+
sequence: 4,
|
|
149
|
+
timestamp: new Date(now.getTime() - 55000).toISOString(),
|
|
150
|
+
payload: { success: true },
|
|
151
|
+
status: 'success',
|
|
152
|
+
},
|
|
153
|
+
];
|
|
154
|
+
// Store full events as artifact
|
|
155
|
+
const artifactRef = await storeArtifact(`trace:${traceId}`, { events: fullEvents });
|
|
156
|
+
// Return summary with only first/last events
|
|
157
|
+
return successResponse(`Trace ${traceId}: success (5000ms, ${fullEvents.length} events)`, {
|
|
158
|
+
traceId,
|
|
159
|
+
workflowId: 'data-pipeline',
|
|
160
|
+
status: 'success',
|
|
161
|
+
durationMs: 5000,
|
|
162
|
+
eventCount: fullEvents.length,
|
|
163
|
+
// Only include first and last events in response
|
|
164
|
+
firstEvent: { type: fullEvents[0]?.type, timestamp: fullEvents[0]?.timestamp },
|
|
165
|
+
lastEvent: { type: fullEvents[fullEvents.length - 1]?.type, status: 'success' },
|
|
166
|
+
artifactRef,
|
|
167
|
+
hasMore: true,
|
|
168
|
+
});
|
|
169
|
+
};
|
|
170
|
+
/**
|
|
171
|
+
* Handler for trace_analyze tool
|
|
172
|
+
* INV-MCP-RESP-006: Response includes summary field with key metrics only
|
|
173
|
+
*/
|
|
174
|
+
export const handleTraceAnalyze = (args) => {
|
|
175
|
+
const traceId = args.traceId;
|
|
176
|
+
// Return optimized analysis with summary and key metrics
|
|
177
|
+
return Promise.resolve(successResponse('Trace OK: 5000ms, 3 steps, no issues', {
|
|
178
|
+
traceId,
|
|
179
|
+
status: 'success',
|
|
180
|
+
performance: {
|
|
181
|
+
totalDuration: 5000,
|
|
182
|
+
stepCount: 3,
|
|
183
|
+
slowestStep: 'Process (2000ms)',
|
|
184
|
+
},
|
|
185
|
+
issueCount: 0,
|
|
186
|
+
recommendationCount: 1,
|
|
187
|
+
// Only include top recommendation
|
|
188
|
+
topRecommendation: 'Consider caching step-2 results',
|
|
189
|
+
}));
|
|
190
|
+
};
|
|
191
|
+
//# sourceMappingURL=trace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace.js","sourceRoot":"","sources":["../../src/tools/trace.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { MCPTool, ToolHandler } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Workflow run tool definition
|
|
4
|
+
*/
|
|
5
|
+
export declare const workflowRunTool: MCPTool;
|
|
6
|
+
/**
|
|
7
|
+
* Workflow list tool definition
|
|
8
|
+
*/
|
|
9
|
+
export declare const workflowListTool: MCPTool;
|
|
10
|
+
/**
|
|
11
|
+
* Workflow describe tool definition
|
|
12
|
+
*/
|
|
13
|
+
export declare const workflowDescribeTool: MCPTool;
|
|
14
|
+
/**
|
|
15
|
+
* Handler for workflow_run tool
|
|
16
|
+
*/
|
|
17
|
+
export declare const handleWorkflowRun: ToolHandler;
|
|
18
|
+
/**
|
|
19
|
+
* Handler for workflow_list tool
|
|
20
|
+
*/
|
|
21
|
+
export declare const handleWorkflowList: ToolHandler;
|
|
22
|
+
/**
|
|
23
|
+
* Handler for workflow_describe tool
|
|
24
|
+
*/
|
|
25
|
+
export declare const handleWorkflowDescribe: ToolHandler;
|
|
26
|
+
//# sourceMappingURL=workflow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../../src/tools/workflow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAiB,MAAM,aAAa,CAAC;AA4CvE;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,OAiB7B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,OAkB9B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,OAalC,CAAC;AAMF;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,WAqE/B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,WAiDhC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,sBAAsB,EAAE,WAyDpC,CAAC"}
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
import { createWorkflowRunner, createWorkflowLoader, findWorkflowDir, defaultStepExecutor, } from '@defai.digital/workflow-engine';
|
|
2
|
+
import { LIMIT_WORKFLOWS } from '@defai.digital/contracts';
|
|
3
|
+
import { getStepExecutor } from '../bootstrap.js';
|
|
4
|
+
// Check if we're in test environment
|
|
5
|
+
const isTestEnv = process.env.VITEST === 'true' || process.env.NODE_ENV === 'test';
|
|
6
|
+
// ============================================================================
|
|
7
|
+
// Workflow Loader Singleton
|
|
8
|
+
// ============================================================================
|
|
9
|
+
let _workflowLoader = null;
|
|
10
|
+
function getWorkflowLoader() {
|
|
11
|
+
if (_workflowLoader === null) {
|
|
12
|
+
const workflowDir = findWorkflowDir(process.cwd()) ?? 'examples/workflows';
|
|
13
|
+
_workflowLoader = createWorkflowLoader({ workflowsDir: workflowDir });
|
|
14
|
+
}
|
|
15
|
+
return _workflowLoader;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Get the appropriate step executor based on environment
|
|
19
|
+
* Uses placeholder in tests, production executor otherwise
|
|
20
|
+
*/
|
|
21
|
+
function getWorkflowStepExecutor() {
|
|
22
|
+
if (isTestEnv) {
|
|
23
|
+
return defaultStepExecutor;
|
|
24
|
+
}
|
|
25
|
+
return getStepExecutor();
|
|
26
|
+
}
|
|
27
|
+
// ============================================================================
|
|
28
|
+
// Tool Definitions
|
|
29
|
+
// ============================================================================
|
|
30
|
+
/**
|
|
31
|
+
* Workflow run tool definition
|
|
32
|
+
*/
|
|
33
|
+
export const workflowRunTool = {
|
|
34
|
+
name: 'workflow_run',
|
|
35
|
+
description: 'Execute a workflow by ID with optional input parameters',
|
|
36
|
+
inputSchema: {
|
|
37
|
+
type: 'object',
|
|
38
|
+
properties: {
|
|
39
|
+
workflowId: {
|
|
40
|
+
type: 'string',
|
|
41
|
+
description: 'The ID of the workflow to execute',
|
|
42
|
+
},
|
|
43
|
+
input: {
|
|
44
|
+
type: 'object',
|
|
45
|
+
description: 'Optional input parameters for the workflow',
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
required: ['workflowId'],
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* Workflow list tool definition
|
|
53
|
+
*/
|
|
54
|
+
export const workflowListTool = {
|
|
55
|
+
name: 'workflow_list',
|
|
56
|
+
description: 'List all available workflows',
|
|
57
|
+
inputSchema: {
|
|
58
|
+
type: 'object',
|
|
59
|
+
properties: {
|
|
60
|
+
status: {
|
|
61
|
+
type: 'string',
|
|
62
|
+
description: 'Filter by status (active, inactive, draft)',
|
|
63
|
+
enum: ['active', 'inactive', 'draft'],
|
|
64
|
+
},
|
|
65
|
+
limit: {
|
|
66
|
+
type: 'number',
|
|
67
|
+
description: 'Maximum number of workflows to return',
|
|
68
|
+
default: LIMIT_WORKFLOWS,
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
/**
|
|
74
|
+
* Workflow describe tool definition
|
|
75
|
+
*/
|
|
76
|
+
export const workflowDescribeTool = {
|
|
77
|
+
name: 'workflow_describe',
|
|
78
|
+
description: 'Get detailed information about a specific workflow',
|
|
79
|
+
inputSchema: {
|
|
80
|
+
type: 'object',
|
|
81
|
+
properties: {
|
|
82
|
+
workflowId: {
|
|
83
|
+
type: 'string',
|
|
84
|
+
description: 'The ID of the workflow to describe',
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
required: ['workflowId'],
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
// ============================================================================
|
|
91
|
+
// Tool Handlers
|
|
92
|
+
// ============================================================================
|
|
93
|
+
/**
|
|
94
|
+
* Handler for workflow_run tool
|
|
95
|
+
*/
|
|
96
|
+
export const handleWorkflowRun = async (args) => {
|
|
97
|
+
const workflowId = args.workflowId;
|
|
98
|
+
const input = args.input ?? {};
|
|
99
|
+
try {
|
|
100
|
+
// Load workflow from file
|
|
101
|
+
const loader = getWorkflowLoader();
|
|
102
|
+
const workflow = await loader.load(workflowId);
|
|
103
|
+
if (!workflow) {
|
|
104
|
+
const available = await loader.loadAll();
|
|
105
|
+
const ids = available.map(w => w.workflowId).slice(0, 5).join(', ');
|
|
106
|
+
return {
|
|
107
|
+
content: [
|
|
108
|
+
{
|
|
109
|
+
type: 'text',
|
|
110
|
+
text: JSON.stringify({
|
|
111
|
+
error: `Workflow "${workflowId}" not found`,
|
|
112
|
+
availableWorkflows: ids,
|
|
113
|
+
hint: 'Use workflow_list to see all available workflows',
|
|
114
|
+
}, null, 2),
|
|
115
|
+
},
|
|
116
|
+
],
|
|
117
|
+
isError: true,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
// Create workflow runner with production step executor
|
|
121
|
+
// Uses placeholder executor in test environment to avoid real LLM calls
|
|
122
|
+
const runner = createWorkflowRunner({
|
|
123
|
+
stepExecutor: getWorkflowStepExecutor(),
|
|
124
|
+
});
|
|
125
|
+
// Execute workflow
|
|
126
|
+
const result = await runner.run(workflow, input);
|
|
127
|
+
return {
|
|
128
|
+
content: [
|
|
129
|
+
{
|
|
130
|
+
type: 'text',
|
|
131
|
+
text: JSON.stringify({
|
|
132
|
+
success: result.success,
|
|
133
|
+
workflowId: workflow.workflowId,
|
|
134
|
+
name: workflow.name,
|
|
135
|
+
version: workflow.version,
|
|
136
|
+
stepsCompleted: result.stepResults.map((s) => ({
|
|
137
|
+
stepId: s.stepId,
|
|
138
|
+
success: s.success,
|
|
139
|
+
durationMs: s.durationMs,
|
|
140
|
+
})),
|
|
141
|
+
output: result.output,
|
|
142
|
+
totalDurationMs: result.totalDurationMs,
|
|
143
|
+
error: result.error,
|
|
144
|
+
}, null, 2),
|
|
145
|
+
},
|
|
146
|
+
],
|
|
147
|
+
isError: !result.success,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
return {
|
|
152
|
+
content: [
|
|
153
|
+
{
|
|
154
|
+
type: 'text',
|
|
155
|
+
text: `Error executing workflow: ${error instanceof Error ? error.message : 'Unknown error'}`,
|
|
156
|
+
},
|
|
157
|
+
],
|
|
158
|
+
isError: true,
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
/**
|
|
163
|
+
* Handler for workflow_list tool
|
|
164
|
+
*/
|
|
165
|
+
export const handleWorkflowList = async (args) => {
|
|
166
|
+
const status = args.status;
|
|
167
|
+
const limit = args.limit ?? LIMIT_WORKFLOWS;
|
|
168
|
+
try {
|
|
169
|
+
const loader = getWorkflowLoader();
|
|
170
|
+
const allWorkflows = await loader.listAll();
|
|
171
|
+
// Filter by status if specified
|
|
172
|
+
const filtered = status !== undefined
|
|
173
|
+
? allWorkflows.filter((w) => w.status === status)
|
|
174
|
+
: allWorkflows;
|
|
175
|
+
// Apply limit
|
|
176
|
+
const limited = filtered.slice(0, limit);
|
|
177
|
+
// Format for output
|
|
178
|
+
const workflows = limited.map((w) => ({
|
|
179
|
+
id: w.id,
|
|
180
|
+
name: w.name,
|
|
181
|
+
version: w.version,
|
|
182
|
+
description: w.description,
|
|
183
|
+
stepCount: w.stepCount,
|
|
184
|
+
status: w.status,
|
|
185
|
+
}));
|
|
186
|
+
return {
|
|
187
|
+
content: [
|
|
188
|
+
{
|
|
189
|
+
type: 'text',
|
|
190
|
+
text: JSON.stringify({
|
|
191
|
+
count: workflows.length,
|
|
192
|
+
total: allWorkflows.length,
|
|
193
|
+
workflows,
|
|
194
|
+
}, null, 2),
|
|
195
|
+
},
|
|
196
|
+
],
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
catch (error) {
|
|
200
|
+
return {
|
|
201
|
+
content: [
|
|
202
|
+
{
|
|
203
|
+
type: 'text',
|
|
204
|
+
text: `Error listing workflows: ${error instanceof Error ? error.message : 'Unknown error'}`,
|
|
205
|
+
},
|
|
206
|
+
],
|
|
207
|
+
isError: true,
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
};
|
|
211
|
+
/**
|
|
212
|
+
* Handler for workflow_describe tool
|
|
213
|
+
*/
|
|
214
|
+
export const handleWorkflowDescribe = async (args) => {
|
|
215
|
+
const workflowId = args.workflowId;
|
|
216
|
+
try {
|
|
217
|
+
const loader = getWorkflowLoader();
|
|
218
|
+
const workflow = await loader.load(workflowId);
|
|
219
|
+
if (!workflow) {
|
|
220
|
+
return {
|
|
221
|
+
content: [
|
|
222
|
+
{
|
|
223
|
+
type: 'text',
|
|
224
|
+
text: JSON.stringify({
|
|
225
|
+
error: `Workflow "${workflowId}" not found`,
|
|
226
|
+
hint: 'Use workflow_list to see all available workflows',
|
|
227
|
+
}, null, 2),
|
|
228
|
+
},
|
|
229
|
+
],
|
|
230
|
+
isError: true,
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
// Format workflow for output
|
|
234
|
+
const description = {
|
|
235
|
+
workflowId: workflow.workflowId,
|
|
236
|
+
name: workflow.name,
|
|
237
|
+
version: workflow.version,
|
|
238
|
+
description: workflow.description,
|
|
239
|
+
steps: workflow.steps.map((step) => ({
|
|
240
|
+
stepId: step.stepId,
|
|
241
|
+
name: step.name,
|
|
242
|
+
type: step.type,
|
|
243
|
+
timeout: step.timeout,
|
|
244
|
+
config: step.config,
|
|
245
|
+
})),
|
|
246
|
+
metadata: workflow.metadata,
|
|
247
|
+
};
|
|
248
|
+
return {
|
|
249
|
+
content: [
|
|
250
|
+
{
|
|
251
|
+
type: 'text',
|
|
252
|
+
text: JSON.stringify(description, null, 2),
|
|
253
|
+
},
|
|
254
|
+
],
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
catch (error) {
|
|
258
|
+
return {
|
|
259
|
+
content: [
|
|
260
|
+
{
|
|
261
|
+
type: 'text',
|
|
262
|
+
text: `Error describing workflow: ${error instanceof Error ? error.message : 'Unknown error'}`,
|
|
263
|
+
},
|
|
264
|
+
],
|
|
265
|
+
isError: true,
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
};
|
|
269
|
+
//# sourceMappingURL=workflow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow.js","sourceRoot":"","sources":["../../src/tools/workflow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Tool Trace Wrapper
|
|
3
|
+
*
|
|
4
|
+
* Wraps tool handlers with tracing for observability.
|
|
5
|
+
*
|
|
6
|
+
* Invariants:
|
|
7
|
+
* - INV-MCP-007: Every tool call produces exactly one trace
|
|
8
|
+
* - INV-MCP-008: Trace includes input/output/duration/success
|
|
9
|
+
*/
|
|
10
|
+
import type { ToolHandler } from './types.js';
|
|
11
|
+
import { type ToolTraceEvent } from '@defai.digital/contracts';
|
|
12
|
+
/**
|
|
13
|
+
* Collects trace events for analysis and persistence
|
|
14
|
+
*/
|
|
15
|
+
export interface TraceCollector {
|
|
16
|
+
/**
|
|
17
|
+
* Records a tool trace event
|
|
18
|
+
*/
|
|
19
|
+
record(event: ToolTraceEvent): void;
|
|
20
|
+
/**
|
|
21
|
+
* Gets all recorded events
|
|
22
|
+
*/
|
|
23
|
+
getEvents(): ToolTraceEvent[];
|
|
24
|
+
/**
|
|
25
|
+
* Clears recorded events
|
|
26
|
+
*/
|
|
27
|
+
clear(): void;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* In-memory trace collector implementation
|
|
31
|
+
*/
|
|
32
|
+
export declare class InMemoryTraceCollector implements TraceCollector {
|
|
33
|
+
private events;
|
|
34
|
+
private readonly maxEvents;
|
|
35
|
+
constructor(maxEvents?: number);
|
|
36
|
+
record(event: ToolTraceEvent): void;
|
|
37
|
+
getEvents(): ToolTraceEvent[];
|
|
38
|
+
clear(): void;
|
|
39
|
+
/**
|
|
40
|
+
* Gets summary statistics
|
|
41
|
+
*/
|
|
42
|
+
getSummary(): {
|
|
43
|
+
totalInvocations: number;
|
|
44
|
+
successCount: number;
|
|
45
|
+
failureCount: number;
|
|
46
|
+
avgDurationMs: number;
|
|
47
|
+
byTool: Record<string, number>;
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Sets the global trace collector
|
|
52
|
+
*/
|
|
53
|
+
export declare function setTraceCollector(collector: TraceCollector): void;
|
|
54
|
+
/**
|
|
55
|
+
* Gets the global trace collector
|
|
56
|
+
*/
|
|
57
|
+
export declare function getTraceCollector(): TraceCollector | undefined;
|
|
58
|
+
/**
|
|
59
|
+
* Wraps a single tool handler with tracing
|
|
60
|
+
*
|
|
61
|
+
* INV-MCP-007: Every tool call produces exactly one trace event
|
|
62
|
+
* INV-MCP-008: Trace includes input/output/duration/success
|
|
63
|
+
*/
|
|
64
|
+
export declare function withTracing(toolName: string, handler: ToolHandler, collector?: TraceCollector): ToolHandler;
|
|
65
|
+
/**
|
|
66
|
+
* Wraps all handlers in a registry with tracing
|
|
67
|
+
*/
|
|
68
|
+
export declare function wrapHandlersWithTracing(handlers: Record<string, ToolHandler>, collector?: TraceCollector): Record<string, ToolHandler>;
|
|
69
|
+
/**
|
|
70
|
+
* Initializes default trace collector if not already set
|
|
71
|
+
* Returns the collector, which may be InMemoryTraceCollector or a custom implementation
|
|
72
|
+
*/
|
|
73
|
+
export declare function initializeDefaultTracing(): TraceCollector;
|
|
74
|
+
/**
|
|
75
|
+
* Gets the trace collector as InMemoryTraceCollector if it is one
|
|
76
|
+
* Returns undefined if no collector is set or if it's a different implementation
|
|
77
|
+
*/
|
|
78
|
+
export declare function getInMemoryTraceCollector(): InMemoryTraceCollector | undefined;
|
|
79
|
+
//# sourceMappingURL=trace-wrapper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace-wrapper.d.ts","sourceRoot":"","sources":["../src/trace-wrapper.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAiB,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAwB,KAAK,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAMrF;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAAC;IAEpC;;OAEG;IACH,SAAS,IAAI,cAAc,EAAE,CAAC;IAE9B;;OAEG;IACH,KAAK,IAAI,IAAI,CAAC;CACf;AAED;;GAEG;AACH,qBAAa,sBAAuB,YAAW,cAAc;IAC3D,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,SAAS,SAAO;IAI5B,MAAM,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IAQnC,SAAS,IAAI,cAAc,EAAE;IAI7B,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,UAAU,IAAI;QACZ,gBAAgB,EAAE,MAAM,CAAC;QACzB,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;QACtB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAChC;CAqBF;AAWD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,cAAc,GAAG,IAAI,CAEjE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,cAAc,GAAG,SAAS,CAE9D;AAMD;;;;;GAKG;AACH,wBAAgB,WAAW,CACzB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,WAAW,EACpB,SAAS,CAAC,EAAE,cAAc,GACzB,WAAW,CAiDb;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,EACrC,SAAS,CAAC,EAAE,cAAc,GACzB,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAQ7B;AAMD;;;GAGG;AACH,wBAAgB,wBAAwB,IAAI,cAAc,CAKzD;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,IAAI,sBAAsB,GAAG,SAAS,CAK9E"}
|