@uluops/ops-mcp 0.2.1
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/CHANGELOG.md +383 -0
- package/LICENSE +21 -0
- package/README.md +272 -0
- package/dist/client/sdk-error-mapper.d.ts +24 -0
- package/dist/client/sdk-error-mapper.d.ts.map +1 -0
- package/dist/client/sdk-error-mapper.js +205 -0
- package/dist/client/sdk-error-mapper.js.map +1 -0
- package/dist/config/index.d.ts +26 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +121 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/tool-registry.d.ts +25 -0
- package/dist/config/tool-registry.d.ts.map +1 -0
- package/dist/config/tool-registry.js +439 -0
- package/dist/config/tool-registry.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +245 -0
- package/dist/index.js.map +1 -0
- package/dist/resources/index.d.ts +12 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +16 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/resources/projects.d.ts +12 -0
- package/dist/resources/projects.d.ts.map +1 -0
- package/dist/resources/projects.js +45 -0
- package/dist/resources/projects.js.map +1 -0
- package/dist/resources/response-helpers.d.ts +15 -0
- package/dist/resources/response-helpers.d.ts.map +1 -0
- package/dist/resources/response-helpers.js +34 -0
- package/dist/resources/response-helpers.js.map +1 -0
- package/dist/resources/taxonomy.d.ts +19 -0
- package/dist/resources/taxonomy.d.ts.map +1 -0
- package/dist/resources/taxonomy.js +45 -0
- package/dist/resources/taxonomy.js.map +1 -0
- package/dist/tools/add-issue-note.d.ts +25 -0
- package/dist/tools/add-issue-note.d.ts.map +1 -0
- package/dist/tools/add-issue-note.js +19 -0
- package/dist/tools/add-issue-note.js.map +1 -0
- package/dist/tools/archive-runs.d.ts +33 -0
- package/dist/tools/archive-runs.d.ts.map +1 -0
- package/dist/tools/archive-runs.js +21 -0
- package/dist/tools/archive-runs.js.map +1 -0
- package/dist/tools/bulk-update-status.d.ts +54 -0
- package/dist/tools/bulk-update-status.d.ts.map +1 -0
- package/dist/tools/bulk-update-status.js +22 -0
- package/dist/tools/bulk-update-status.js.map +1 -0
- package/dist/tools/create-issue.d.ts +52 -0
- package/dist/tools/create-issue.d.ts.map +1 -0
- package/dist/tools/create-issue.js +25 -0
- package/dist/tools/create-issue.js.map +1 -0
- package/dist/tools/create-project.d.ts +21 -0
- package/dist/tools/create-project.d.ts.map +1 -0
- package/dist/tools/create-project.js +17 -0
- package/dist/tools/create-project.js.map +1 -0
- package/dist/tools/delete-project.d.ts +28 -0
- package/dist/tools/delete-project.d.ts.map +1 -0
- package/dist/tools/delete-project.js +34 -0
- package/dist/tools/delete-project.js.map +1 -0
- package/dist/tools/delete-run.d.ts +24 -0
- package/dist/tools/delete-run.d.ts.map +1 -0
- package/dist/tools/delete-run.js +18 -0
- package/dist/tools/delete-run.js.map +1 -0
- package/dist/tools/diff-runs.d.ts +30 -0
- package/dist/tools/diff-runs.d.ts.map +1 -0
- package/dist/tools/diff-runs.js +20 -0
- package/dist/tools/diff-runs.js.map +1 -0
- package/dist/tools/edit-issue.d.ts +34 -0
- package/dist/tools/edit-issue.d.ts.map +1 -0
- package/dist/tools/edit-issue.js +25 -0
- package/dist/tools/edit-issue.js.map +1 -0
- package/dist/tools/get-agent-lifecycle.d.ts +10 -0
- package/dist/tools/get-agent-lifecycle.d.ts.map +1 -0
- package/dist/tools/get-agent-lifecycle.js +20 -0
- package/dist/tools/get-agent-lifecycle.js.map +1 -0
- package/dist/tools/get-agent-matrix.d.ts +24 -0
- package/dist/tools/get-agent-matrix.d.ts.map +1 -0
- package/dist/tools/get-agent-matrix.js +29 -0
- package/dist/tools/get-agent-matrix.js.map +1 -0
- package/dist/tools/get-agent-reliability.d.ts +22 -0
- package/dist/tools/get-agent-reliability.d.ts.map +1 -0
- package/dist/tools/get-agent-reliability.js +14 -0
- package/dist/tools/get-agent-reliability.js.map +1 -0
- package/dist/tools/get-agent-runs-analysis.d.ts +33 -0
- package/dist/tools/get-agent-runs-analysis.d.ts.map +1 -0
- package/dist/tools/get-agent-runs-analysis.js +26 -0
- package/dist/tools/get-agent-runs-analysis.js.map +1 -0
- package/dist/tools/get-analytics.d.ts +30 -0
- package/dist/tools/get-analytics.d.ts.map +1 -0
- package/dist/tools/get-analytics.js +29 -0
- package/dist/tools/get-analytics.js.map +1 -0
- package/dist/tools/get-burndown.d.ts +24 -0
- package/dist/tools/get-burndown.d.ts.map +1 -0
- package/dist/tools/get-burndown.js +26 -0
- package/dist/tools/get-burndown.js.map +1 -0
- package/dist/tools/get-discovery.d.ts +24 -0
- package/dist/tools/get-discovery.d.ts.map +1 -0
- package/dist/tools/get-discovery.js +26 -0
- package/dist/tools/get-discovery.js.map +1 -0
- package/dist/tools/get-full-taxonomy-analytics.d.ts +27 -0
- package/dist/tools/get-full-taxonomy-analytics.d.ts.map +1 -0
- package/dist/tools/get-full-taxonomy-analytics.js +19 -0
- package/dist/tools/get-full-taxonomy-analytics.js.map +1 -0
- package/dist/tools/get-issue-by-fingerprint.d.ts +24 -0
- package/dist/tools/get-issue-by-fingerprint.d.ts.map +1 -0
- package/dist/tools/get-issue-by-fingerprint.js +18 -0
- package/dist/tools/get-issue-by-fingerprint.js.map +1 -0
- package/dist/tools/get-issue-details.d.ts +27 -0
- package/dist/tools/get-issue-details.d.ts.map +1 -0
- package/dist/tools/get-issue-details.js +19 -0
- package/dist/tools/get-issue-details.js.map +1 -0
- package/dist/tools/get-issue-history.d.ts +19 -0
- package/dist/tools/get-issue-history.d.ts.map +1 -0
- package/dist/tools/get-issue-history.js +13 -0
- package/dist/tools/get-issue-history.js.map +1 -0
- package/dist/tools/get-latest-run.d.ts +24 -0
- package/dist/tools/get-latest-run.d.ts.map +1 -0
- package/dist/tools/get-latest-run.js +18 -0
- package/dist/tools/get-latest-run.js.map +1 -0
- package/dist/tools/get-project-analysis.d.ts +36 -0
- package/dist/tools/get-project-analysis.d.ts.map +1 -0
- package/dist/tools/get-project-analysis.js +28 -0
- package/dist/tools/get-project-analysis.js.map +1 -0
- package/dist/tools/get-project-summary.d.ts +21 -0
- package/dist/tools/get-project-summary.d.ts.map +1 -0
- package/dist/tools/get-project-summary.js +17 -0
- package/dist/tools/get-project-summary.js.map +1 -0
- package/dist/tools/get-project-trends.d.ts +24 -0
- package/dist/tools/get-project-trends.d.ts.map +1 -0
- package/dist/tools/get-project-trends.js +27 -0
- package/dist/tools/get-project-trends.js.map +1 -0
- package/dist/tools/get-project.d.ts +21 -0
- package/dist/tools/get-project.d.ts.map +1 -0
- package/dist/tools/get-project.js +17 -0
- package/dist/tools/get-project.js.map +1 -0
- package/dist/tools/get-run-analysis.d.ts +21 -0
- package/dist/tools/get-run-analysis.d.ts.map +1 -0
- package/dist/tools/get-run-analysis.js +17 -0
- package/dist/tools/get-run-analysis.js.map +1 -0
- package/dist/tools/get-run-details.d.ts +27 -0
- package/dist/tools/get-run-details.d.ts.map +1 -0
- package/dist/tools/get-run-details.js +19 -0
- package/dist/tools/get-run-details.js.map +1 -0
- package/dist/tools/get-run.d.ts +21 -0
- package/dist/tools/get-run.d.ts.map +1 -0
- package/dist/tools/get-run.js +17 -0
- package/dist/tools/get-run.js.map +1 -0
- package/dist/tools/get-taxonomy.d.ts +15 -0
- package/dist/tools/get-taxonomy.d.ts.map +1 -0
- package/dist/tools/get-taxonomy.js +15 -0
- package/dist/tools/get-taxonomy.js.map +1 -0
- package/dist/tools/get-velocity.d.ts +24 -0
- package/dist/tools/get-velocity.d.ts.map +1 -0
- package/dist/tools/get-velocity.js +28 -0
- package/dist/tools/get-velocity.js.map +1 -0
- package/dist/tools/index.d.ts +10 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +119 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/list-agents.d.ts +15 -0
- package/dist/tools/list-agents.d.ts.map +1 -0
- package/dist/tools/list-agents.js +29 -0
- package/dist/tools/list-agents.js.map +1 -0
- package/dist/tools/list-projects.d.ts +15 -0
- package/dist/tools/list-projects.d.ts.map +1 -0
- package/dist/tools/list-projects.js +15 -0
- package/dist/tools/list-projects.js.map +1 -0
- package/dist/tools/list-runs.d.ts +30 -0
- package/dist/tools/list-runs.d.ts.map +1 -0
- package/dist/tools/list-runs.js +23 -0
- package/dist/tools/list-runs.js.map +1 -0
- package/dist/tools/merge-issues.d.ts +25 -0
- package/dist/tools/merge-issues.d.ts.map +1 -0
- package/dist/tools/merge-issues.js +19 -0
- package/dist/tools/merge-issues.js.map +1 -0
- package/dist/tools/query-analysis-records.d.ts +39 -0
- package/dist/tools/query-analysis-records.d.ts.map +1 -0
- package/dist/tools/query-analysis-records.js +31 -0
- package/dist/tools/query-analysis-records.js.map +1 -0
- package/dist/tools/query-issues.d.ts +54 -0
- package/dist/tools/query-issues.d.ts.map +1 -0
- package/dist/tools/query-issues.js +41 -0
- package/dist/tools/query-issues.js.map +1 -0
- package/dist/tools/restore-issue.d.ts +21 -0
- package/dist/tools/restore-issue.d.ts.map +1 -0
- package/dist/tools/restore-issue.js +17 -0
- package/dist/tools/restore-issue.js.map +1 -0
- package/dist/tools/restore-project.d.ts +21 -0
- package/dist/tools/restore-project.d.ts.map +1 -0
- package/dist/tools/restore-project.js +17 -0
- package/dist/tools/restore-project.js.map +1 -0
- package/dist/tools/save-run.d.ts +1570 -0
- package/dist/tools/save-run.d.ts.map +1 -0
- package/dist/tools/save-run.js +50 -0
- package/dist/tools/save-run.js.map +1 -0
- package/dist/tools/search-issues.d.ts +42 -0
- package/dist/tools/search-issues.d.ts.map +1 -0
- package/dist/tools/search-issues.js +25 -0
- package/dist/tools/search-issues.js.map +1 -0
- package/dist/tools/soft-delete-issue.d.ts +21 -0
- package/dist/tools/soft-delete-issue.d.ts.map +1 -0
- package/dist/tools/soft-delete-issue.js +17 -0
- package/dist/tools/soft-delete-issue.js.map +1 -0
- package/dist/tools/soft-delete-project.d.ts +27 -0
- package/dist/tools/soft-delete-project.d.ts.map +1 -0
- package/dist/tools/soft-delete-project.js +22 -0
- package/dist/tools/soft-delete-project.js.map +1 -0
- package/dist/tools/undo-issue-status.d.ts +21 -0
- package/dist/tools/undo-issue-status.d.ts.map +1 -0
- package/dist/tools/undo-issue-status.js +17 -0
- package/dist/tools/undo-issue-status.js.map +1 -0
- package/dist/tools/update-issue-by-fingerprint.d.ts +30 -0
- package/dist/tools/update-issue-by-fingerprint.d.ts.map +1 -0
- package/dist/tools/update-issue-by-fingerprint.js +24 -0
- package/dist/tools/update-issue-by-fingerprint.js.map +1 -0
- package/dist/tools/update-project.d.ts +24 -0
- package/dist/tools/update-project.d.ts.map +1 -0
- package/dist/tools/update-project.js +21 -0
- package/dist/tools/update-project.js.map +1 -0
- package/dist/tools/update-run.d.ts +1495 -0
- package/dist/tools/update-run.d.ts.map +1 -0
- package/dist/tools/update-run.js +60 -0
- package/dist/tools/update-run.js.map +1 -0
- package/dist/tools/update-status.d.ts +64 -0
- package/dist/tools/update-status.d.ts.map +1 -0
- package/dist/tools/update-status.js +28 -0
- package/dist/tools/update-status.js.map +1 -0
- package/dist/tools/validate-run.d.ts +228 -0
- package/dist/tools/validate-run.d.ts.map +1 -0
- package/dist/tools/validate-run.js +25 -0
- package/dist/tools/validate-run.js.map +1 -0
- package/dist/types/config.d.ts +33 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +5 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/index.d.ts +12 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +12 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/mcp.d.ts +21 -0
- package/dist/types/mcp.d.ts.map +1 -0
- package/dist/types/mcp.js +30 -0
- package/dist/types/mcp.js.map +1 -0
- package/dist/types/run-schemas.d.ts +996 -0
- package/dist/types/run-schemas.d.ts.map +1 -0
- package/dist/types/run-schemas.js +91 -0
- package/dist/types/run-schemas.js.map +1 -0
- package/dist/types/schemas.d.ts +288 -0
- package/dist/types/schemas.d.ts.map +1 -0
- package/dist/types/schemas.js +218 -0
- package/dist/types/schemas.js.map +1 -0
- package/dist/types/server.d.ts +59 -0
- package/dist/types/server.d.ts.map +1 -0
- package/dist/types/server.js +7 -0
- package/dist/types/server.js.map +1 -0
- package/dist/utils/logger.d.ts +24 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +90 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/normalize-keys.d.ts +20 -0
- package/dist/utils/normalize-keys.d.ts.map +1 -0
- package/dist/utils/normalize-keys.js +38 -0
- package/dist/utils/normalize-keys.js.map +1 -0
- package/dist/utils/tool-handler.d.ts +64 -0
- package/dist/utils/tool-handler.d.ts.map +1 -0
- package/dist/utils/tool-handler.js +138 -0
- package/dist/utils/tool-handler.js.map +1 -0
- package/package.json +83 -0
- package/tool-policies.json +96 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* @uluops/ops-mcp
|
|
4
|
+
*
|
|
5
|
+
* MCP server that enables Claude Code, Cursor, and other MCP hosts to
|
|
6
|
+
* interact with the UluOps Platform API via @uluops/ops-sdk.
|
|
7
|
+
*/
|
|
8
|
+
import { SecureMcpServer } from 'mcp-secure-server';
|
|
9
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
10
|
+
import { OpsClient } from '@uluops/ops-sdk';
|
|
11
|
+
import { createRequire } from 'module';
|
|
12
|
+
import { loadConfig, validateConfig, apiKeyFingerprint } from './config/index.js';
|
|
13
|
+
import { toolRegistry } from './config/tool-registry.js';
|
|
14
|
+
import { registerAllTools } from './tools/index.js';
|
|
15
|
+
import { registerAllResources } from './resources/index.js';
|
|
16
|
+
import { createLogger } from './utils/logger.js';
|
|
17
|
+
// Read version from package.json dynamically
|
|
18
|
+
const require = createRequire(import.meta.url);
|
|
19
|
+
const { version } = require('../package.json');
|
|
20
|
+
// Resolve the bundled tool-policies.json file shipped with this package.
|
|
21
|
+
// Without this, mcp-secure-server falls back to CWD / ~/.config — which
|
|
22
|
+
// does NOT contain the bundled policies for npx / global-install consumers.
|
|
23
|
+
const TOOL_POLICIES_PATH = require.resolve('../tool-policies.json');
|
|
24
|
+
/**
|
|
25
|
+
* Tool groups surfaced in the startup log. Kept in sync with src/tools/index.ts;
|
|
26
|
+
* a drift between this listing and the actual registration is caught by
|
|
27
|
+
* src/__tests__/tools-integration.test.ts (count assertion: 48).
|
|
28
|
+
*/
|
|
29
|
+
const STARTUP_TOOL_GROUPS = {
|
|
30
|
+
p0_core: [
|
|
31
|
+
'save_run',
|
|
32
|
+
'query_issues',
|
|
33
|
+
'update_status',
|
|
34
|
+
'get_project_summary',
|
|
35
|
+
'delete_project',
|
|
36
|
+
],
|
|
37
|
+
p1_extended: [
|
|
38
|
+
'get_issue_details',
|
|
39
|
+
'get_run_details',
|
|
40
|
+
'diff_runs',
|
|
41
|
+
'archive_runs',
|
|
42
|
+
'get_analytics',
|
|
43
|
+
'search_issues',
|
|
44
|
+
'list_agents',
|
|
45
|
+
'get_agent_lifecycle',
|
|
46
|
+
'validate_run',
|
|
47
|
+
'get_issue_history',
|
|
48
|
+
'add_issue_note',
|
|
49
|
+
'edit_issue',
|
|
50
|
+
'merge_issues',
|
|
51
|
+
'bulk_update_status',
|
|
52
|
+
'update_run',
|
|
53
|
+
'get_agent_reliability',
|
|
54
|
+
'create_issue',
|
|
55
|
+
],
|
|
56
|
+
p2_projects: [
|
|
57
|
+
'list_projects',
|
|
58
|
+
'get_project',
|
|
59
|
+
'get_project_trends',
|
|
60
|
+
'create_project',
|
|
61
|
+
'update_project',
|
|
62
|
+
'soft_delete_project',
|
|
63
|
+
'restore_project',
|
|
64
|
+
],
|
|
65
|
+
p2_runs: ['get_run', 'list_runs', 'get_latest_run', 'delete_run'],
|
|
66
|
+
p2_issues: [
|
|
67
|
+
'get_issue_by_fingerprint',
|
|
68
|
+
'update_issue_by_fingerprint',
|
|
69
|
+
'restore_issue',
|
|
70
|
+
'soft_delete_issue',
|
|
71
|
+
'undo_issue_status',
|
|
72
|
+
],
|
|
73
|
+
p2_analysis: [
|
|
74
|
+
'get_run_analysis',
|
|
75
|
+
'get_project_analysis',
|
|
76
|
+
'query_analysis_records',
|
|
77
|
+
'get_agent_runs_analysis',
|
|
78
|
+
],
|
|
79
|
+
p2_taxonomy: [
|
|
80
|
+
'get_taxonomy',
|
|
81
|
+
'get_full_taxonomy_analytics',
|
|
82
|
+
'get_burndown',
|
|
83
|
+
'get_velocity',
|
|
84
|
+
'get_discovery',
|
|
85
|
+
'get_agent_matrix',
|
|
86
|
+
],
|
|
87
|
+
};
|
|
88
|
+
const STARTUP_RESOURCES = [
|
|
89
|
+
'validation://projects',
|
|
90
|
+
'validation://projects/{project}',
|
|
91
|
+
'validation://taxonomy',
|
|
92
|
+
];
|
|
93
|
+
/**
|
|
94
|
+
* Build SecureMcpServer options.
|
|
95
|
+
*
|
|
96
|
+
* Extracted from main() to keep the entry point readable and to make the
|
|
97
|
+
* configuration block testable in isolation. Defaults are tuned for
|
|
98
|
+
* Claude Code's parallel tool call patterns; tier-gating policy lives in
|
|
99
|
+
* the bundled tool-policies.json (TOOL_POLICIES_PATH).
|
|
100
|
+
*/
|
|
101
|
+
function buildServerOptions(security) {
|
|
102
|
+
return {
|
|
103
|
+
toolPoliciesPath: TOOL_POLICIES_PATH,
|
|
104
|
+
// Use 'basic' preset with higher rate limits for parallel validation workflows
|
|
105
|
+
securityLevel: 'basic',
|
|
106
|
+
maxRequestsPerMinute: 120,
|
|
107
|
+
// Override maxMessageSize for large validation payloads (default 'basic' is 100KB).
|
|
108
|
+
// Large workflows with many recommendations + raw_markdown can exceed 100KB.
|
|
109
|
+
maxMessageSize: 500 * 1024, // 500KB
|
|
110
|
+
// Override maxParamCount for save_run which can have many nested parameters:
|
|
111
|
+
// agents × fields + recommendations × fields. With 70 issues × 15 fields +
|
|
112
|
+
// 8 agents × 10 fields = 1150+ params. Set to 3000 to support up to ~150
|
|
113
|
+
// issues in validation runs.
|
|
114
|
+
maxParamCount: 3000,
|
|
115
|
+
// Behavior layer tuned for Claude Code usage patterns:
|
|
116
|
+
// - Validation workflows issue 10-30 parallel calls in short bursts
|
|
117
|
+
// - Calls cluster in <2s bursts, then pause for "thinking" periods
|
|
118
|
+
// - Claude Code IS automation, but trusted — disable bot detection
|
|
119
|
+
burstThreshold: 15, // Covers 90% of parallel query/update scenarios
|
|
120
|
+
burstWindowMs: 5000, // 5s window resets between thinking periods
|
|
121
|
+
automationDetection: {
|
|
122
|
+
enabled: false, // Disable — Claude Code is trusted automation
|
|
123
|
+
},
|
|
124
|
+
// Tool registry — required for semantic validation layer
|
|
125
|
+
toolRegistry,
|
|
126
|
+
// Default policy — allow writes since this is a validation tracker
|
|
127
|
+
defaultPolicy: {
|
|
128
|
+
allowWrites: true,
|
|
129
|
+
allowNetwork: true,
|
|
130
|
+
},
|
|
131
|
+
// Resource policy — allow our custom validation:// scheme
|
|
132
|
+
resourcePolicy: {
|
|
133
|
+
allowedSchemes: ['validation'],
|
|
134
|
+
},
|
|
135
|
+
// Error diagnostics — propagate redacted reasons in error.message so callers
|
|
136
|
+
// (humans, LLMs, logs) can see what failed without digging into the data
|
|
137
|
+
// envelope. Set ENABLE_DETAILED_ERRORS=false to suppress for tightened
|
|
138
|
+
// production deployments.
|
|
139
|
+
enableDetailedErrors: process.env['ENABLE_DETAILED_ERRORS'] !== 'false',
|
|
140
|
+
// Logging configuration
|
|
141
|
+
enableLogging: security.enableLogging,
|
|
142
|
+
verboseLogging: security.verboseLogging,
|
|
143
|
+
logPerformanceMetrics: security.logPerformanceMetrics,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Main entry point for the @uluops/ops-mcp server.
|
|
148
|
+
*/
|
|
149
|
+
async function main() {
|
|
150
|
+
// Load and validate configuration
|
|
151
|
+
const { config, warnings } = loadConfig();
|
|
152
|
+
validateConfig(config);
|
|
153
|
+
// Initialize logger with full config object
|
|
154
|
+
const logger = createLogger({
|
|
155
|
+
level: config.security.logLevel,
|
|
156
|
+
enableFileLogging: config.security.enableLogging,
|
|
157
|
+
logDir: config.security.logDir,
|
|
158
|
+
});
|
|
159
|
+
// Emit deferred deprecation warnings through structured logger
|
|
160
|
+
for (const warning of warnings) {
|
|
161
|
+
logger.warn(warning);
|
|
162
|
+
}
|
|
163
|
+
logger.info('Starting @uluops/ops-mcp server', {
|
|
164
|
+
version,
|
|
165
|
+
apiUrl: config.api.baseUrl,
|
|
166
|
+
apiKeyFingerprint: apiKeyFingerprint(config.api.apiKey),
|
|
167
|
+
});
|
|
168
|
+
// Detect auth type: ulr_ prefix = API key, otherwise = session token
|
|
169
|
+
const isApiKey = config.api.apiKey?.startsWith('ulr_');
|
|
170
|
+
const opsClient = new OpsClient({
|
|
171
|
+
baseUrl: config.api.baseUrl,
|
|
172
|
+
...(isApiKey ? { apiKey: config.api.apiKey } : { sessionToken: config.api.apiKey }),
|
|
173
|
+
orgSlug: config.api.orgSlug,
|
|
174
|
+
timeout: config.api.timeout,
|
|
175
|
+
retries: config.api.retries,
|
|
176
|
+
});
|
|
177
|
+
// Create MCP server with security configuration optimized for Claude Code's
|
|
178
|
+
// parallel tool call patterns. Options live in buildServerOptions() for
|
|
179
|
+
// testability and to keep main() readable.
|
|
180
|
+
const server = await SecureMcpServer.create({
|
|
181
|
+
name: '@uluops/ops-mcp',
|
|
182
|
+
version,
|
|
183
|
+
}, buildServerOptions(config.security));
|
|
184
|
+
// Register all tools and resources
|
|
185
|
+
registerAllTools(server, opsClient);
|
|
186
|
+
registerAllResources(server, opsClient);
|
|
187
|
+
// Setup graceful shutdown. Awaits server.close() so any in-flight tool call
|
|
188
|
+
// response can flush back through the stdio transport before exit. Capped
|
|
189
|
+
// at 2 seconds to avoid hanging if the transport is wedged.
|
|
190
|
+
const shutdown = async (signal) => {
|
|
191
|
+
logger.info(`Received ${signal}, shutting down gracefully`);
|
|
192
|
+
try {
|
|
193
|
+
await Promise.race([
|
|
194
|
+
server.close(),
|
|
195
|
+
new Promise((resolve) => setTimeout(resolve, 2000)),
|
|
196
|
+
]);
|
|
197
|
+
}
|
|
198
|
+
catch (error) {
|
|
199
|
+
logger.warn('Error during server.close()', {
|
|
200
|
+
error: error instanceof Error ? error.message : String(error),
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
process.exit(0);
|
|
204
|
+
};
|
|
205
|
+
process.on('SIGINT', () => {
|
|
206
|
+
void shutdown('SIGINT');
|
|
207
|
+
});
|
|
208
|
+
process.on('SIGTERM', () => {
|
|
209
|
+
void shutdown('SIGTERM');
|
|
210
|
+
});
|
|
211
|
+
// Handle uncaught errors
|
|
212
|
+
process.on('uncaughtException', (error) => {
|
|
213
|
+
logger.error('Uncaught exception', {
|
|
214
|
+
error: error.message,
|
|
215
|
+
stack: error.stack,
|
|
216
|
+
});
|
|
217
|
+
process.exit(1);
|
|
218
|
+
});
|
|
219
|
+
process.on('unhandledRejection', (reason) => {
|
|
220
|
+
logger.error('Unhandled rejection', { reason: String(reason) });
|
|
221
|
+
process.exit(1);
|
|
222
|
+
});
|
|
223
|
+
// Connect stdio transport and start serving
|
|
224
|
+
// Type assertion needed: StdioServerTransport from @modelcontextprotocol/sdk
|
|
225
|
+
// has a slightly different type signature than mcp-secure-server expects.
|
|
226
|
+
// Both implement the same Transport protocol at runtime; this is a compile-time
|
|
227
|
+
// type variance issue only. Using Parameters<> extracts the expected type.
|
|
228
|
+
const transport = new StdioServerTransport();
|
|
229
|
+
await server.connect(transport);
|
|
230
|
+
logger.info('MCP server connected and ready', {
|
|
231
|
+
tools: STARTUP_TOOL_GROUPS,
|
|
232
|
+
resources: STARTUP_RESOURCES,
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
// Export main for testing
|
|
236
|
+
export { main };
|
|
237
|
+
// Run main function (skip in test environment)
|
|
238
|
+
if (process.env.NODE_ENV !== 'test') {
|
|
239
|
+
main().catch((error) => {
|
|
240
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
241
|
+
console.error('Failed to start MCP client:', message);
|
|
242
|
+
process.exit(1);
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resource registry - registers all MCP resources
|
|
3
|
+
*/
|
|
4
|
+
import type { OpsClient } from '@uluops/ops-sdk';
|
|
5
|
+
import type { McpServerResourceRegistration } from '../types/index.js';
|
|
6
|
+
/**
|
|
7
|
+
* Register all MCP resources
|
|
8
|
+
*/
|
|
9
|
+
export declare function registerAllResources(server: McpServerResourceRegistration, opsClient: OpsClient): void;
|
|
10
|
+
export { registerProjectsResource } from './projects.js';
|
|
11
|
+
export { registerTaxonomyResource } from './taxonomy.js';
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,mBAAmB,CAAC;AAIvE;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,6BAA6B,EACrC,SAAS,EAAE,SAAS,GACnB,IAAI,CAGN;AAGD,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resource registry - registers all MCP resources
|
|
3
|
+
*/
|
|
4
|
+
import { registerProjectsResource } from './projects.js';
|
|
5
|
+
import { registerTaxonomyResource } from './taxonomy.js';
|
|
6
|
+
/**
|
|
7
|
+
* Register all MCP resources
|
|
8
|
+
*/
|
|
9
|
+
export function registerAllResources(server, opsClient) {
|
|
10
|
+
registerProjectsResource(server, opsClient);
|
|
11
|
+
registerTaxonomyResource(server, opsClient);
|
|
12
|
+
}
|
|
13
|
+
// Re-export for testing
|
|
14
|
+
export { registerProjectsResource } from './projects.js';
|
|
15
|
+
export { registerTaxonomyResource } from './taxonomy.js';
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AAEzD;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAClC,MAAqC,EACrC,SAAoB;IAEpB,wBAAwB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC5C,wBAAwB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AAC9C,CAAC;AAED,wBAAwB;AACxB,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Projects MCP resource
|
|
3
|
+
*
|
|
4
|
+
* Provides read-only access to project listing via validation:// URI scheme.
|
|
5
|
+
*/
|
|
6
|
+
import type { OpsClient } from '@uluops/ops-sdk';
|
|
7
|
+
import type { McpServerResourceRegistration } from '../types/index.js';
|
|
8
|
+
/**
|
|
9
|
+
* Register projects resource and template
|
|
10
|
+
*/
|
|
11
|
+
export declare function registerProjectsResource(server: McpServerResourceRegistration, opsClient: OpsClient): void;
|
|
12
|
+
//# sourceMappingURL=projects.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../src/resources/projects.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,mBAAmB,CAAC;AAGvE;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,6BAA6B,EACrC,SAAS,EAAE,SAAS,GACnB,IAAI,CA8CN"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Projects MCP resource
|
|
3
|
+
*
|
|
4
|
+
* Provides read-only access to project listing via validation:// URI scheme.
|
|
5
|
+
*/
|
|
6
|
+
import { createResourceResponse, createErrorResourceResponse } from './response-helpers.js';
|
|
7
|
+
/**
|
|
8
|
+
* Register projects resource and template
|
|
9
|
+
*/
|
|
10
|
+
export function registerProjectsResource(server, opsClient) {
|
|
11
|
+
// Static resource: list all projects
|
|
12
|
+
server.resource('projects', 'validation://projects', {
|
|
13
|
+
description: 'List all tracked projects',
|
|
14
|
+
mimeType: 'application/json',
|
|
15
|
+
}, async () => {
|
|
16
|
+
try {
|
|
17
|
+
const result = await opsClient.projects.list();
|
|
18
|
+
return createResourceResponse('validation://projects', result);
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
const rawMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
22
|
+
// Redact any credential values before exposing in resource response
|
|
23
|
+
const message = rawMessage.replace(/ulr_[a-zA-Z0-9]{20,}/g, '[REDACTED]')
|
|
24
|
+
.replace(/bearer\s+[a-zA-Z0-9_\-.]+/gi, '[REDACTED]');
|
|
25
|
+
return createErrorResourceResponse('validation://projects', message);
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
// Template resource: get specific project summary
|
|
29
|
+
// Note: MCP SDK resource handlers don't receive the actual requested URI,
|
|
30
|
+
// so we cannot extract the {project} parameter at runtime. Instead, we
|
|
31
|
+
// register this as a discoverable pattern and direct users to the tool API.
|
|
32
|
+
// This is a known SDK limitation, not a bug - tools are the primary interface.
|
|
33
|
+
server.resource('project-summary', 'validation://projects/{project}', {
|
|
34
|
+
description: 'Project summary pattern - use get_project_summary tool for actual data',
|
|
35
|
+
mimeType: 'application/json',
|
|
36
|
+
}, () => {
|
|
37
|
+
return Promise.resolve(createResourceResponse('validation://projects/{project}', {
|
|
38
|
+
info: 'This resource template advertises the URL pattern. Use the tool API for actual data.',
|
|
39
|
+
tool: 'get_project_summary',
|
|
40
|
+
example: 'get_project_summary({ project: "my-project" })',
|
|
41
|
+
note: 'MCP SDK limitation: resource handlers cannot access URI template parameters',
|
|
42
|
+
}));
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=projects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/resources/projects.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,sBAAsB,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AAE5F;;GAEG;AACH,MAAM,UAAU,wBAAwB,CACtC,MAAqC,EACrC,SAAoB;IAEpB,qCAAqC;IACrC,MAAM,CAAC,QAAQ,CACb,UAAU,EACV,uBAAuB,EACvB;QACE,WAAW,EAAE,2BAA2B;QACxC,QAAQ,EAAE,kBAAkB;KAC7B,EACD,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC/C,OAAO,sBAAsB,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAC;QACjE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,UAAU,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YAC5E,oEAAoE;YACpE,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,uBAAuB,EAAE,YAAY,CAAC;iBACtE,OAAO,CAAC,6BAA6B,EAAE,YAAY,CAAC,CAAC;YACxD,OAAO,2BAA2B,CAAC,uBAAuB,EAAE,OAAO,CAAC,CAAC;QACvE,CAAC;IACH,CAAC,CACF,CAAC;IAEF,kDAAkD;IAClD,0EAA0E;IAC1E,uEAAuE;IACvE,4EAA4E;IAC5E,+EAA+E;IAC/E,MAAM,CAAC,QAAQ,CACb,iBAAiB,EACjB,iCAAiC,EACjC;QACE,WAAW,EAAE,wEAAwE;QACrF,QAAQ,EAAE,kBAAkB;KAC7B,EACD,GAAG,EAAE;QACH,OAAO,OAAO,CAAC,OAAO,CACpB,sBAAsB,CAAC,iCAAiC,EAAE;YACxD,IAAI,EAAE,sFAAsF;YAC5F,IAAI,EAAE,qBAAqB;YAC3B,OAAO,EAAE,gDAAgD;YACzD,IAAI,EAAE,6EAA6E;SACpF,CAAC,CACH,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared response helpers for MCP resources
|
|
3
|
+
*
|
|
4
|
+
* Provides consistent response formatting across all resource handlers.
|
|
5
|
+
*/
|
|
6
|
+
import type { ResourceResponse } from '../types/index.js';
|
|
7
|
+
/**
|
|
8
|
+
* Create a resource response with JSON content
|
|
9
|
+
*/
|
|
10
|
+
export declare function createResourceResponse(uri: string, data: unknown): ResourceResponse;
|
|
11
|
+
/**
|
|
12
|
+
* Create an error resource response
|
|
13
|
+
*/
|
|
14
|
+
export declare function createErrorResourceResponse(uri: string, error: string): ResourceResponse;
|
|
15
|
+
//# sourceMappingURL=response-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response-helpers.d.ts","sourceRoot":"","sources":["../../src/resources/response-helpers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAE1D;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,gBAAgB,CAUnF;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAUxF"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared response helpers for MCP resources
|
|
3
|
+
*
|
|
4
|
+
* Provides consistent response formatting across all resource handlers.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Create a resource response with JSON content
|
|
8
|
+
*/
|
|
9
|
+
export function createResourceResponse(uri, data) {
|
|
10
|
+
return {
|
|
11
|
+
contents: [
|
|
12
|
+
{
|
|
13
|
+
uri,
|
|
14
|
+
mimeType: 'application/json',
|
|
15
|
+
text: JSON.stringify(data, null, 2),
|
|
16
|
+
},
|
|
17
|
+
],
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Create an error resource response
|
|
22
|
+
*/
|
|
23
|
+
export function createErrorResourceResponse(uri, error) {
|
|
24
|
+
return {
|
|
25
|
+
contents: [
|
|
26
|
+
{
|
|
27
|
+
uri,
|
|
28
|
+
mimeType: 'application/json',
|
|
29
|
+
text: JSON.stringify({ error }),
|
|
30
|
+
},
|
|
31
|
+
],
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=response-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response-helpers.js","sourceRoot":"","sources":["../../src/resources/response-helpers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,GAAW,EAAE,IAAa;IAC/D,OAAO;QACL,QAAQ,EAAE;YACR;gBACE,GAAG;gBACH,QAAQ,EAAE,kBAAkB;gBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;aACpC;SACF;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,2BAA2B,CAAC,GAAW,EAAE,KAAa;IACpE,OAAO;QACL,QAAQ,EAAE;YACR;gBACE,GAAG;gBACH,QAAQ,EAAE,kBAAkB;gBAC5B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC;aAChC;SACF;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Taxonomy MCP resource
|
|
3
|
+
*
|
|
4
|
+
* Provides read-only access to the failure taxonomy via validation:// URI scheme.
|
|
5
|
+
* Fetches taxonomy data from the tracker API via SDK on first access,
|
|
6
|
+
* caches for 1 hour, and serves stale data on errors.
|
|
7
|
+
*
|
|
8
|
+
* Previously contained a hardcoded divergent taxonomy with completely
|
|
9
|
+
* different mode codes. Now serves the canonical taxonomy from the DB.
|
|
10
|
+
*
|
|
11
|
+
* See: dynamic-taxonomy-spec-v1_0_0.md, Phase 5.
|
|
12
|
+
*/
|
|
13
|
+
import type { OpsClient } from '@uluops/ops-sdk';
|
|
14
|
+
import type { McpServerResourceRegistration } from '../types/index.js';
|
|
15
|
+
/**
|
|
16
|
+
* Register taxonomy resource
|
|
17
|
+
*/
|
|
18
|
+
export declare function registerTaxonomyResource(server: McpServerResourceRegistration, opsClient: OpsClient): void;
|
|
19
|
+
//# sourceMappingURL=taxonomy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"taxonomy.d.ts","sourceRoot":"","sources":["../../src/resources/taxonomy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,mBAAmB,CAAC;AA6BvE;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,6BAA6B,EACrC,SAAS,EAAE,SAAS,GACnB,IAAI,CAaN"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Taxonomy MCP resource
|
|
3
|
+
*
|
|
4
|
+
* Provides read-only access to the failure taxonomy via validation:// URI scheme.
|
|
5
|
+
* Fetches taxonomy data from the tracker API via SDK on first access,
|
|
6
|
+
* caches for 1 hour, and serves stale data on errors.
|
|
7
|
+
*
|
|
8
|
+
* Previously contained a hardcoded divergent taxonomy with completely
|
|
9
|
+
* different mode codes. Now serves the canonical taxonomy from the DB.
|
|
10
|
+
*
|
|
11
|
+
* See: dynamic-taxonomy-spec-v1_0_0.md, Phase 5.
|
|
12
|
+
*/
|
|
13
|
+
import { createResourceResponse } from './response-helpers.js';
|
|
14
|
+
const CACHE_TTL_MS = 3_600_000; // 1 hour
|
|
15
|
+
let cache = null;
|
|
16
|
+
async function getTaxonomyData(opsClient) {
|
|
17
|
+
// Serve from cache if fresh
|
|
18
|
+
if (cache && Date.now() < cache.expiry) {
|
|
19
|
+
return cache.data;
|
|
20
|
+
}
|
|
21
|
+
try {
|
|
22
|
+
const taxonomy = await opsClient.taxonomy.get();
|
|
23
|
+
cache = { data: taxonomy, expiry: Date.now() + CACHE_TTL_MS };
|
|
24
|
+
return taxonomy;
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
// Serve stale cache on error
|
|
28
|
+
if (cache)
|
|
29
|
+
return cache.data;
|
|
30
|
+
throw new Error('Taxonomy unavailable: tracker API unreachable and no cached data');
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Register taxonomy resource
|
|
35
|
+
*/
|
|
36
|
+
export function registerTaxonomyResource(server, opsClient) {
|
|
37
|
+
server.resource('taxonomy', 'validation://taxonomy', {
|
|
38
|
+
description: 'Failure taxonomy schema for classifying validation issues',
|
|
39
|
+
mimeType: 'application/json',
|
|
40
|
+
}, async () => {
|
|
41
|
+
const taxonomy = await getTaxonomyData(opsClient);
|
|
42
|
+
return createResourceResponse('validation://taxonomy', taxonomy);
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=taxonomy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"taxonomy.js","sourceRoot":"","sources":["../../src/resources/taxonomy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,MAAM,YAAY,GAAG,SAAS,CAAC,CAAC,SAAS;AAOzC,IAAI,KAAK,GAAyB,IAAI,CAAC;AAEvC,KAAK,UAAU,eAAe,CAAC,SAAoB;IACjD,4BAA4B;IAC5B,IAAI,KAAK,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QACvC,OAAO,KAAK,CAAC,IAAI,CAAC;IACpB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;QAChD,KAAK,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,YAAY,EAAE,CAAC;QAC9D,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QACP,6BAA6B;QAC7B,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC,IAAI,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;IACtF,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CACtC,MAAqC,EACrC,SAAoB;IAEpB,MAAM,CAAC,QAAQ,CACb,UAAU,EACV,uBAAuB,EACvB;QACE,WAAW,EAAE,2DAA2D;QACxE,QAAQ,EAAE,kBAAkB;KAC7B,EACD,KAAK,IAAI,EAAE;QACT,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,SAAS,CAAC,CAAC;QAClD,OAAO,sBAAsB,CAAC,uBAAuB,EAAE,QAAQ,CAAC,CAAC;IACnE,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* add_issue_note tool
|
|
3
|
+
*/
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
import type { OpsClient } from '@uluops/ops-sdk';
|
|
6
|
+
import { type McpServerToolRegistration } from '../types/index.js';
|
|
7
|
+
export declare const AddIssueNoteInputSchema: z.ZodObject<{
|
|
8
|
+
issue_id: z.ZodString;
|
|
9
|
+
content: z.ZodString;
|
|
10
|
+
note_type: z.ZodDefault<z.ZodEnum<["context", "resolution", "blocker"]>>;
|
|
11
|
+
created_by: z.ZodOptional<z.ZodString>;
|
|
12
|
+
}, "strip", z.ZodTypeAny, {
|
|
13
|
+
content: string;
|
|
14
|
+
issue_id: string;
|
|
15
|
+
note_type: "context" | "resolution" | "blocker";
|
|
16
|
+
created_by?: string | undefined;
|
|
17
|
+
}, {
|
|
18
|
+
content: string;
|
|
19
|
+
issue_id: string;
|
|
20
|
+
note_type?: "context" | "resolution" | "blocker" | undefined;
|
|
21
|
+
created_by?: string | undefined;
|
|
22
|
+
}>;
|
|
23
|
+
export type AddIssueNoteInput = z.infer<typeof AddIssueNoteInputSchema>;
|
|
24
|
+
export declare function registerAddIssueNoteTool(server: McpServerToolRegistration, opsClient: OpsClient): void;
|
|
25
|
+
//# sourceMappingURL=add-issue-note.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add-issue-note.d.ts","sourceRoot":"","sources":["../../src/tools/add-issue-note.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAkB,KAAK,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAGnF,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;EAKlC,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAExE,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,yBAAyB,EACjC,SAAS,EAAE,SAAS,GACnB,IAAI,CAUN"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* add_issue_note tool
|
|
3
|
+
*/
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
import { NoteTypeSchema } from '../types/index.js';
|
|
6
|
+
import { createToolHandler } from '../utils/tool-handler.js';
|
|
7
|
+
export const AddIssueNoteInputSchema = z.object({
|
|
8
|
+
issue_id: z.string().uuid(),
|
|
9
|
+
content: z.string().min(1).max(10000),
|
|
10
|
+
note_type: NoteTypeSchema.default('context'),
|
|
11
|
+
created_by: z.string().max(200).optional(),
|
|
12
|
+
});
|
|
13
|
+
export function registerAddIssueNoteTool(server, opsClient) {
|
|
14
|
+
server.tool('add_issue_note', 'Add a note to an issue. Note types: context (additional context), resolution (how to resolve), blocker (why blocking).', AddIssueNoteInputSchema.shape, createToolHandler(AddIssueNoteInputSchema, (n) => {
|
|
15
|
+
const { issueId, ...input } = n;
|
|
16
|
+
return opsClient.issues.addNote(issueId, input);
|
|
17
|
+
}, { toolName: 'add_issue_note' }));
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=add-issue-note.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add-issue-note.js","sourceRoot":"","sources":["../../src/tools/add-issue-note.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,cAAc,EAAkC,MAAM,mBAAmB,CAAC;AACnF,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9C,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE;IAC3B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC;IACrC,SAAS,EAAE,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC;IAC5C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;CAC3C,CAAC,CAAC;AAIH,MAAM,UAAU,wBAAwB,CACtC,MAAiC,EACjC,SAAoB;IAEpB,MAAM,CAAC,IAAI,CACT,gBAAgB,EAChB,wHAAwH,EACxH,uBAAuB,CAAC,KAAK,EAC7B,iBAAiB,CAAC,uBAAuB,EAAE,CAAC,CAAC,EAAE,EAAE;QAC/C,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,GAAG,CAAC,CAAC;QAChC,OAAO,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,OAAiB,EAAE,KAAK,CAAC,CAAC;IAC5D,CAAC,EAAE,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC,CACnC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* archive_runs tool
|
|
3
|
+
*
|
|
4
|
+
* Archive old runs without deletion.
|
|
5
|
+
*/
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
import type { OpsClient } from '@uluops/ops-sdk';
|
|
8
|
+
import type { McpServerToolRegistration } from '../types/index.js';
|
|
9
|
+
export declare const ArchiveRunsInputSchema: z.ZodObject<{
|
|
10
|
+
project: z.ZodString;
|
|
11
|
+
before_run_number: z.ZodOptional<z.ZodNumber>;
|
|
12
|
+
before_date: z.ZodOptional<z.ZodString>;
|
|
13
|
+
keep_last: z.ZodOptional<z.ZodNumber>;
|
|
14
|
+
reason: z.ZodOptional<z.ZodString>;
|
|
15
|
+
}, "strip", z.ZodTypeAny, {
|
|
16
|
+
project: string;
|
|
17
|
+
reason?: string | undefined;
|
|
18
|
+
before_run_number?: number | undefined;
|
|
19
|
+
before_date?: string | undefined;
|
|
20
|
+
keep_last?: number | undefined;
|
|
21
|
+
}, {
|
|
22
|
+
project: string;
|
|
23
|
+
reason?: string | undefined;
|
|
24
|
+
before_run_number?: number | undefined;
|
|
25
|
+
before_date?: string | undefined;
|
|
26
|
+
keep_last?: number | undefined;
|
|
27
|
+
}>;
|
|
28
|
+
export type ArchiveRunsInput = z.infer<typeof ArchiveRunsInputSchema>;
|
|
29
|
+
/**
|
|
30
|
+
* Register archive_runs tool
|
|
31
|
+
*/
|
|
32
|
+
export declare function registerArchiveRunsTool(server: McpServerToolRegistration, opsClient: OpsClient): void;
|
|
33
|
+
//# sourceMappingURL=archive-runs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"archive-runs.d.ts","sourceRoot":"","sources":["../../src/tools/archive-runs.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAGnE,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;EAMjC,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEtE;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,yBAAyB,EACjC,SAAS,EAAE,SAAS,GACnB,IAAI,CAON"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* archive_runs tool
|
|
3
|
+
*
|
|
4
|
+
* Archive old runs without deletion.
|
|
5
|
+
*/
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
import { createToolHandler } from '../utils/tool-handler.js';
|
|
8
|
+
export const ArchiveRunsInputSchema = z.object({
|
|
9
|
+
project: z.string().min(1),
|
|
10
|
+
before_run_number: z.number().int().positive().optional(),
|
|
11
|
+
before_date: z.string().optional(),
|
|
12
|
+
keep_last: z.number().int().positive().optional(),
|
|
13
|
+
reason: z.string().optional(),
|
|
14
|
+
});
|
|
15
|
+
/**
|
|
16
|
+
* Register archive_runs tool
|
|
17
|
+
*/
|
|
18
|
+
export function registerArchiveRunsTool(server, opsClient) {
|
|
19
|
+
server.tool('archive_runs', 'Archive old runs without deletion. Specify before_run_number, before_date, or keep_last to select runs. Archived runs remain queryable.', ArchiveRunsInputSchema.shape, createToolHandler(ArchiveRunsInputSchema, (n) => opsClient.runs.archive(n), { toolName: 'archive_runs' }));
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=archive-runs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"archive-runs.js","sourceRoot":"","sources":["../../src/tools/archive-runs.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1B,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IACzD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IACjD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC9B,CAAC,CAAC;AAIH;;GAEG;AACH,MAAM,UAAU,uBAAuB,CACrC,MAAiC,EACjC,SAAoB;IAEpB,MAAM,CAAC,IAAI,CACT,cAAc,EACd,yIAAyI,EACzI,sBAAsB,CAAC,KAAK,EAC5B,iBAAiB,CAAC,sBAAsB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,CAC1G,CAAC;AACJ,CAAC"}
|