@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.
Files changed (269) hide show
  1. package/CHANGELOG.md +383 -0
  2. package/LICENSE +21 -0
  3. package/README.md +272 -0
  4. package/dist/client/sdk-error-mapper.d.ts +24 -0
  5. package/dist/client/sdk-error-mapper.d.ts.map +1 -0
  6. package/dist/client/sdk-error-mapper.js +205 -0
  7. package/dist/client/sdk-error-mapper.js.map +1 -0
  8. package/dist/config/index.d.ts +26 -0
  9. package/dist/config/index.d.ts.map +1 -0
  10. package/dist/config/index.js +121 -0
  11. package/dist/config/index.js.map +1 -0
  12. package/dist/config/tool-registry.d.ts +25 -0
  13. package/dist/config/tool-registry.d.ts.map +1 -0
  14. package/dist/config/tool-registry.js +439 -0
  15. package/dist/config/tool-registry.js.map +1 -0
  16. package/dist/index.d.ts +13 -0
  17. package/dist/index.d.ts.map +1 -0
  18. package/dist/index.js +245 -0
  19. package/dist/index.js.map +1 -0
  20. package/dist/resources/index.d.ts +12 -0
  21. package/dist/resources/index.d.ts.map +1 -0
  22. package/dist/resources/index.js +16 -0
  23. package/dist/resources/index.js.map +1 -0
  24. package/dist/resources/projects.d.ts +12 -0
  25. package/dist/resources/projects.d.ts.map +1 -0
  26. package/dist/resources/projects.js +45 -0
  27. package/dist/resources/projects.js.map +1 -0
  28. package/dist/resources/response-helpers.d.ts +15 -0
  29. package/dist/resources/response-helpers.d.ts.map +1 -0
  30. package/dist/resources/response-helpers.js +34 -0
  31. package/dist/resources/response-helpers.js.map +1 -0
  32. package/dist/resources/taxonomy.d.ts +19 -0
  33. package/dist/resources/taxonomy.d.ts.map +1 -0
  34. package/dist/resources/taxonomy.js +45 -0
  35. package/dist/resources/taxonomy.js.map +1 -0
  36. package/dist/tools/add-issue-note.d.ts +25 -0
  37. package/dist/tools/add-issue-note.d.ts.map +1 -0
  38. package/dist/tools/add-issue-note.js +19 -0
  39. package/dist/tools/add-issue-note.js.map +1 -0
  40. package/dist/tools/archive-runs.d.ts +33 -0
  41. package/dist/tools/archive-runs.d.ts.map +1 -0
  42. package/dist/tools/archive-runs.js +21 -0
  43. package/dist/tools/archive-runs.js.map +1 -0
  44. package/dist/tools/bulk-update-status.d.ts +54 -0
  45. package/dist/tools/bulk-update-status.d.ts.map +1 -0
  46. package/dist/tools/bulk-update-status.js +22 -0
  47. package/dist/tools/bulk-update-status.js.map +1 -0
  48. package/dist/tools/create-issue.d.ts +52 -0
  49. package/dist/tools/create-issue.d.ts.map +1 -0
  50. package/dist/tools/create-issue.js +25 -0
  51. package/dist/tools/create-issue.js.map +1 -0
  52. package/dist/tools/create-project.d.ts +21 -0
  53. package/dist/tools/create-project.d.ts.map +1 -0
  54. package/dist/tools/create-project.js +17 -0
  55. package/dist/tools/create-project.js.map +1 -0
  56. package/dist/tools/delete-project.d.ts +28 -0
  57. package/dist/tools/delete-project.d.ts.map +1 -0
  58. package/dist/tools/delete-project.js +34 -0
  59. package/dist/tools/delete-project.js.map +1 -0
  60. package/dist/tools/delete-run.d.ts +24 -0
  61. package/dist/tools/delete-run.d.ts.map +1 -0
  62. package/dist/tools/delete-run.js +18 -0
  63. package/dist/tools/delete-run.js.map +1 -0
  64. package/dist/tools/diff-runs.d.ts +30 -0
  65. package/dist/tools/diff-runs.d.ts.map +1 -0
  66. package/dist/tools/diff-runs.js +20 -0
  67. package/dist/tools/diff-runs.js.map +1 -0
  68. package/dist/tools/edit-issue.d.ts +34 -0
  69. package/dist/tools/edit-issue.d.ts.map +1 -0
  70. package/dist/tools/edit-issue.js +25 -0
  71. package/dist/tools/edit-issue.js.map +1 -0
  72. package/dist/tools/get-agent-lifecycle.d.ts +10 -0
  73. package/dist/tools/get-agent-lifecycle.d.ts.map +1 -0
  74. package/dist/tools/get-agent-lifecycle.js +20 -0
  75. package/dist/tools/get-agent-lifecycle.js.map +1 -0
  76. package/dist/tools/get-agent-matrix.d.ts +24 -0
  77. package/dist/tools/get-agent-matrix.d.ts.map +1 -0
  78. package/dist/tools/get-agent-matrix.js +29 -0
  79. package/dist/tools/get-agent-matrix.js.map +1 -0
  80. package/dist/tools/get-agent-reliability.d.ts +22 -0
  81. package/dist/tools/get-agent-reliability.d.ts.map +1 -0
  82. package/dist/tools/get-agent-reliability.js +14 -0
  83. package/dist/tools/get-agent-reliability.js.map +1 -0
  84. package/dist/tools/get-agent-runs-analysis.d.ts +33 -0
  85. package/dist/tools/get-agent-runs-analysis.d.ts.map +1 -0
  86. package/dist/tools/get-agent-runs-analysis.js +26 -0
  87. package/dist/tools/get-agent-runs-analysis.js.map +1 -0
  88. package/dist/tools/get-analytics.d.ts +30 -0
  89. package/dist/tools/get-analytics.d.ts.map +1 -0
  90. package/dist/tools/get-analytics.js +29 -0
  91. package/dist/tools/get-analytics.js.map +1 -0
  92. package/dist/tools/get-burndown.d.ts +24 -0
  93. package/dist/tools/get-burndown.d.ts.map +1 -0
  94. package/dist/tools/get-burndown.js +26 -0
  95. package/dist/tools/get-burndown.js.map +1 -0
  96. package/dist/tools/get-discovery.d.ts +24 -0
  97. package/dist/tools/get-discovery.d.ts.map +1 -0
  98. package/dist/tools/get-discovery.js +26 -0
  99. package/dist/tools/get-discovery.js.map +1 -0
  100. package/dist/tools/get-full-taxonomy-analytics.d.ts +27 -0
  101. package/dist/tools/get-full-taxonomy-analytics.d.ts.map +1 -0
  102. package/dist/tools/get-full-taxonomy-analytics.js +19 -0
  103. package/dist/tools/get-full-taxonomy-analytics.js.map +1 -0
  104. package/dist/tools/get-issue-by-fingerprint.d.ts +24 -0
  105. package/dist/tools/get-issue-by-fingerprint.d.ts.map +1 -0
  106. package/dist/tools/get-issue-by-fingerprint.js +18 -0
  107. package/dist/tools/get-issue-by-fingerprint.js.map +1 -0
  108. package/dist/tools/get-issue-details.d.ts +27 -0
  109. package/dist/tools/get-issue-details.d.ts.map +1 -0
  110. package/dist/tools/get-issue-details.js +19 -0
  111. package/dist/tools/get-issue-details.js.map +1 -0
  112. package/dist/tools/get-issue-history.d.ts +19 -0
  113. package/dist/tools/get-issue-history.d.ts.map +1 -0
  114. package/dist/tools/get-issue-history.js +13 -0
  115. package/dist/tools/get-issue-history.js.map +1 -0
  116. package/dist/tools/get-latest-run.d.ts +24 -0
  117. package/dist/tools/get-latest-run.d.ts.map +1 -0
  118. package/dist/tools/get-latest-run.js +18 -0
  119. package/dist/tools/get-latest-run.js.map +1 -0
  120. package/dist/tools/get-project-analysis.d.ts +36 -0
  121. package/dist/tools/get-project-analysis.d.ts.map +1 -0
  122. package/dist/tools/get-project-analysis.js +28 -0
  123. package/dist/tools/get-project-analysis.js.map +1 -0
  124. package/dist/tools/get-project-summary.d.ts +21 -0
  125. package/dist/tools/get-project-summary.d.ts.map +1 -0
  126. package/dist/tools/get-project-summary.js +17 -0
  127. package/dist/tools/get-project-summary.js.map +1 -0
  128. package/dist/tools/get-project-trends.d.ts +24 -0
  129. package/dist/tools/get-project-trends.d.ts.map +1 -0
  130. package/dist/tools/get-project-trends.js +27 -0
  131. package/dist/tools/get-project-trends.js.map +1 -0
  132. package/dist/tools/get-project.d.ts +21 -0
  133. package/dist/tools/get-project.d.ts.map +1 -0
  134. package/dist/tools/get-project.js +17 -0
  135. package/dist/tools/get-project.js.map +1 -0
  136. package/dist/tools/get-run-analysis.d.ts +21 -0
  137. package/dist/tools/get-run-analysis.d.ts.map +1 -0
  138. package/dist/tools/get-run-analysis.js +17 -0
  139. package/dist/tools/get-run-analysis.js.map +1 -0
  140. package/dist/tools/get-run-details.d.ts +27 -0
  141. package/dist/tools/get-run-details.d.ts.map +1 -0
  142. package/dist/tools/get-run-details.js +19 -0
  143. package/dist/tools/get-run-details.js.map +1 -0
  144. package/dist/tools/get-run.d.ts +21 -0
  145. package/dist/tools/get-run.d.ts.map +1 -0
  146. package/dist/tools/get-run.js +17 -0
  147. package/dist/tools/get-run.js.map +1 -0
  148. package/dist/tools/get-taxonomy.d.ts +15 -0
  149. package/dist/tools/get-taxonomy.d.ts.map +1 -0
  150. package/dist/tools/get-taxonomy.js +15 -0
  151. package/dist/tools/get-taxonomy.js.map +1 -0
  152. package/dist/tools/get-velocity.d.ts +24 -0
  153. package/dist/tools/get-velocity.d.ts.map +1 -0
  154. package/dist/tools/get-velocity.js +28 -0
  155. package/dist/tools/get-velocity.js.map +1 -0
  156. package/dist/tools/index.d.ts +10 -0
  157. package/dist/tools/index.d.ts.map +1 -0
  158. package/dist/tools/index.js +119 -0
  159. package/dist/tools/index.js.map +1 -0
  160. package/dist/tools/list-agents.d.ts +15 -0
  161. package/dist/tools/list-agents.d.ts.map +1 -0
  162. package/dist/tools/list-agents.js +29 -0
  163. package/dist/tools/list-agents.js.map +1 -0
  164. package/dist/tools/list-projects.d.ts +15 -0
  165. package/dist/tools/list-projects.d.ts.map +1 -0
  166. package/dist/tools/list-projects.js +15 -0
  167. package/dist/tools/list-projects.js.map +1 -0
  168. package/dist/tools/list-runs.d.ts +30 -0
  169. package/dist/tools/list-runs.d.ts.map +1 -0
  170. package/dist/tools/list-runs.js +23 -0
  171. package/dist/tools/list-runs.js.map +1 -0
  172. package/dist/tools/merge-issues.d.ts +25 -0
  173. package/dist/tools/merge-issues.d.ts.map +1 -0
  174. package/dist/tools/merge-issues.js +19 -0
  175. package/dist/tools/merge-issues.js.map +1 -0
  176. package/dist/tools/query-analysis-records.d.ts +39 -0
  177. package/dist/tools/query-analysis-records.d.ts.map +1 -0
  178. package/dist/tools/query-analysis-records.js +31 -0
  179. package/dist/tools/query-analysis-records.js.map +1 -0
  180. package/dist/tools/query-issues.d.ts +54 -0
  181. package/dist/tools/query-issues.d.ts.map +1 -0
  182. package/dist/tools/query-issues.js +41 -0
  183. package/dist/tools/query-issues.js.map +1 -0
  184. package/dist/tools/restore-issue.d.ts +21 -0
  185. package/dist/tools/restore-issue.d.ts.map +1 -0
  186. package/dist/tools/restore-issue.js +17 -0
  187. package/dist/tools/restore-issue.js.map +1 -0
  188. package/dist/tools/restore-project.d.ts +21 -0
  189. package/dist/tools/restore-project.d.ts.map +1 -0
  190. package/dist/tools/restore-project.js +17 -0
  191. package/dist/tools/restore-project.js.map +1 -0
  192. package/dist/tools/save-run.d.ts +1570 -0
  193. package/dist/tools/save-run.d.ts.map +1 -0
  194. package/dist/tools/save-run.js +50 -0
  195. package/dist/tools/save-run.js.map +1 -0
  196. package/dist/tools/search-issues.d.ts +42 -0
  197. package/dist/tools/search-issues.d.ts.map +1 -0
  198. package/dist/tools/search-issues.js +25 -0
  199. package/dist/tools/search-issues.js.map +1 -0
  200. package/dist/tools/soft-delete-issue.d.ts +21 -0
  201. package/dist/tools/soft-delete-issue.d.ts.map +1 -0
  202. package/dist/tools/soft-delete-issue.js +17 -0
  203. package/dist/tools/soft-delete-issue.js.map +1 -0
  204. package/dist/tools/soft-delete-project.d.ts +27 -0
  205. package/dist/tools/soft-delete-project.d.ts.map +1 -0
  206. package/dist/tools/soft-delete-project.js +22 -0
  207. package/dist/tools/soft-delete-project.js.map +1 -0
  208. package/dist/tools/undo-issue-status.d.ts +21 -0
  209. package/dist/tools/undo-issue-status.d.ts.map +1 -0
  210. package/dist/tools/undo-issue-status.js +17 -0
  211. package/dist/tools/undo-issue-status.js.map +1 -0
  212. package/dist/tools/update-issue-by-fingerprint.d.ts +30 -0
  213. package/dist/tools/update-issue-by-fingerprint.d.ts.map +1 -0
  214. package/dist/tools/update-issue-by-fingerprint.js +24 -0
  215. package/dist/tools/update-issue-by-fingerprint.js.map +1 -0
  216. package/dist/tools/update-project.d.ts +24 -0
  217. package/dist/tools/update-project.d.ts.map +1 -0
  218. package/dist/tools/update-project.js +21 -0
  219. package/dist/tools/update-project.js.map +1 -0
  220. package/dist/tools/update-run.d.ts +1495 -0
  221. package/dist/tools/update-run.d.ts.map +1 -0
  222. package/dist/tools/update-run.js +60 -0
  223. package/dist/tools/update-run.js.map +1 -0
  224. package/dist/tools/update-status.d.ts +64 -0
  225. package/dist/tools/update-status.d.ts.map +1 -0
  226. package/dist/tools/update-status.js +28 -0
  227. package/dist/tools/update-status.js.map +1 -0
  228. package/dist/tools/validate-run.d.ts +228 -0
  229. package/dist/tools/validate-run.d.ts.map +1 -0
  230. package/dist/tools/validate-run.js +25 -0
  231. package/dist/tools/validate-run.js.map +1 -0
  232. package/dist/types/config.d.ts +33 -0
  233. package/dist/types/config.d.ts.map +1 -0
  234. package/dist/types/config.js +5 -0
  235. package/dist/types/config.js.map +1 -0
  236. package/dist/types/index.d.ts +12 -0
  237. package/dist/types/index.d.ts.map +1 -0
  238. package/dist/types/index.js +12 -0
  239. package/dist/types/index.js.map +1 -0
  240. package/dist/types/mcp.d.ts +21 -0
  241. package/dist/types/mcp.d.ts.map +1 -0
  242. package/dist/types/mcp.js +30 -0
  243. package/dist/types/mcp.js.map +1 -0
  244. package/dist/types/run-schemas.d.ts +996 -0
  245. package/dist/types/run-schemas.d.ts.map +1 -0
  246. package/dist/types/run-schemas.js +91 -0
  247. package/dist/types/run-schemas.js.map +1 -0
  248. package/dist/types/schemas.d.ts +288 -0
  249. package/dist/types/schemas.d.ts.map +1 -0
  250. package/dist/types/schemas.js +218 -0
  251. package/dist/types/schemas.js.map +1 -0
  252. package/dist/types/server.d.ts +59 -0
  253. package/dist/types/server.d.ts.map +1 -0
  254. package/dist/types/server.js +7 -0
  255. package/dist/types/server.js.map +1 -0
  256. package/dist/utils/logger.d.ts +24 -0
  257. package/dist/utils/logger.d.ts.map +1 -0
  258. package/dist/utils/logger.js +90 -0
  259. package/dist/utils/logger.js.map +1 -0
  260. package/dist/utils/normalize-keys.d.ts +20 -0
  261. package/dist/utils/normalize-keys.d.ts.map +1 -0
  262. package/dist/utils/normalize-keys.js +38 -0
  263. package/dist/utils/normalize-keys.js.map +1 -0
  264. package/dist/utils/tool-handler.d.ts +64 -0
  265. package/dist/utils/tool-handler.d.ts.map +1 -0
  266. package/dist/utils/tool-handler.js +138 -0
  267. package/dist/utils/tool-handler.js.map +1 -0
  268. package/package.json +83 -0
  269. package/tool-policies.json +96 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,383 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [Unreleased]
9
+
10
+ ## [0.2.1] - 2026-06-05
11
+
12
+ First post-ship hardening pass. Driven by the run #1 ship pipeline (which
13
+ failed Stage 3 public-interface at 56/100) and the run #2 anxiety reading
14
+ (which surfaced two silent runtime failures the static gates missed:
15
+ `tool-policies.json` never loaded by `npx` consumers, and `ULUOPS_API_KEY`
16
+ format documented but unvalidated). All 7 ship gates now pass; 34 of the 39
17
+ tracker findings closed (87%).
18
+
19
+ ### Security
20
+
21
+ - **`tool-policies.json` now actually loaded.** The bundled policy file ships
22
+ in `files[]` but mcp-secure-server's resolution order (env var, then
23
+ `./tool-policies.json` in CWD, then `~/.config`) never found it for
24
+ `npx -y @uluops/ops-mcp` invocations — CWD is the MCP host's project
25
+ directory, not the package directory. Resolved via
26
+ `require.resolve('../tool-policies.json')` passed as `toolPoliciesPath`.
27
+ Without this fix every public consumer ran with default-level enforcement
28
+ and the `relaxedFields` that suppress UUID-as-credit-card false positives
29
+ were decorative.
30
+ - **`ULUOPS_API_KEY` format validated at startup.** README documented the
31
+ `ulr_` prefix + 20-char minimum but `validateConfig` only checked for
32
+ non-empty. Mis-prefixed keys silently routed through `sessionToken` auth
33
+ and surfaced as opaque 401s. Now enforced via
34
+ `/^ulr_[A-Za-z0-9_-]{16,}$/` with an actionable error message.
35
+ - **`NotFoundError` and `NetworkError` now pass through `sanitizeErrorMessage`.**
36
+ Closed a credential-redaction gap where 2 of 7 typed error branches
37
+ forwarded raw SDK error messages — low probability of leaking `ulr_*`
38
+ keys today, but the redaction layer is now consistent across all branches.
39
+ - **402 tier-gating payload uses defensive type guards.** Previously cast
40
+ `details.definitions`, `details.currentTier`, `details.upgradeUrl` without
41
+ shape validation. Now `Array.isArray` + `typeof === 'string'` guards
42
+ with graceful fallback to `'above-tier definitions'` / `'unknown'` when
43
+ the API payload shape drifts.
44
+ - **HTTPS-only base URL warning.** `loadConfig` now warns when
45
+ `ULUOPS_BASE_URL` uses a non-`https:` scheme outside `NODE_ENV=development`.
46
+ Closes CWE-319 cleartext-credential-transmission visibility gap.
47
+ - **`ENABLE_DETAILED_ERRORS=false` env gate** for tightened production
48
+ deployments that want mcp-secure-server to suppress redacted error
49
+ reasons in `error.message`.
50
+ - **`Number.isFinite` coercion guard.** `coerceNumericFields` now rejects
51
+ `Infinity` / `-Infinity` / `NaN` from string-typed numeric inputs.
52
+ - **Input size bounds.** `delete_project.confirmation_phrase` and
53
+ `search_issues.query` now have `.max()` constraints (200 / 500 chars).
54
+
55
+ ### Changed
56
+
57
+ - **Server protocol identity is now `@uluops/ops-mcp`.** Three call sites
58
+ still said `uluops-tracker-client` from before the package rename
59
+ (`SecureMcpServer.create` name, internal config default, startup log).
60
+ MCP host UIs now display the correct identity and bug reports can be
61
+ correlated to the npm package name.
62
+ - **Verbose file logging defaults to `false`.** `ENABLE_FILE_LOGGING`,
63
+ `VERBOSE_LOGGING`, and `LOG_PERFORMANCE_METRICS` previously defaulted
64
+ to `true`, which created a `logs/` directory in every consumer's working
65
+ directory without opt-in. All three now default `false`; opt in
66
+ explicitly via env vars.
67
+ - **README rewritten for npm/npx consumers.** Installation section was
68
+ the contributor `npm install` + `npm run build` workflow; now leads
69
+ with `npx -y @uluops/ops-mcp` and `npm install -g @uluops/ops-mcp`.
70
+ `.mcp.json` example uses the correct binary name (`uluops-ops-mcp`,
71
+ not the stale `uluops-tracker-client`). Quick Start field names
72
+ corrected (`agents`/`decision`/`agent`, not the pre-rename
73
+ `validators`/`status`/`validator`).
74
+ - **Documentation parity with 48 registered tools.** README previously
75
+ documented 47 (off-by-one from `soft_delete_issue` addition) and
76
+ 4 stale tool names from the validator→agent rename (`list_validators`,
77
+ `validate_features_list`, `get_validator_reliability`,
78
+ `get_validator_matrix`). All corrected; 10 previously-undocumented
79
+ tools added (the full Analysis Tools group plus `get_agent_lifecycle`,
80
+ `soft_delete_issue`, and renames).
81
+ - **Six previously-undocumented environment variables documented**:
82
+ `ULUOPS_ORG_SLUG`, `ULUOPS_TRACKER_RETRIES`, `ENABLE_FILE_LOGGING`,
83
+ `LOG_DIR`, `VERBOSE_LOGGING`, `LOG_PERFORMANCE_METRICS`.
84
+ - **Graceful shutdown awaits server close.** `SIGINT`/`SIGTERM` handlers
85
+ now `await Promise.race([server.close(), 2s timeout])` before
86
+ `process.exit(0)` so in-flight tool responses can flush back through
87
+ stdio.
88
+
89
+ ### Added
90
+
91
+ - **API key fingerprint in startup log.** `apiKeyFingerprint(apiKey)`
92
+ emits `ulr_…XXXX` (last 4 chars) so operators can distinguish which
93
+ key the server loaded across multiple deployments without leaking
94
+ the secret.
95
+ - **7 tests covering the 402 tier-gating error path** (`sdk-error-mapper.test.ts`)
96
+ including happy path, `?source=mcp` vs `&source=mcp` upgrade-URL tracking,
97
+ missing-details fallback, malformed-definitions tolerance,
98
+ non-array/non-string defensive handling, and credential-not-leaked check.
99
+ - **`coerceNumericFields` boundary tests** verifying MCP JSON-RPC string-typed
100
+ numerics are coerced and `Infinity`/`NaN` rejected.
101
+ - **`save_run` timestamp injection tests** verifying ISO-8601 timestamp is
102
+ injected when the caller omits one and caller-supplied timestamps are
103
+ preserved verbatim.
104
+
105
+ ### Removed
106
+
107
+ - **Dead `config.server` stanza.** `ServerConfig` interface, the
108
+ `server: { name, version: '1.0.0' }` block in `loadConfig`, and the
109
+ matching test assertion. The static `'1.0.0'` was a pinned falsehood
110
+ (package was at 0.2.0); the dynamic version path at `src/index.ts:22`
111
+ reads from `package.json` and remains.
112
+ - **`ValidatorResultSchema` / `ValidatorResult` deprecated aliases**
113
+ removed from `src/types/schemas.ts`. All consumers migrated to
114
+ `AgentResultSchema` / `AgentResult`. Deprecation introduced post-rename
115
+ in 0.2.0; alias dropped now to reduce surface.
116
+
117
+ ### Internal
118
+
119
+ - 10 ESLint errors fixed (3× `restrict-template-expressions`,
120
+ 3× `no-deprecated`, 3× `no-unnecessary-type-assertion`,
121
+ 1× `no-unnecessary-type-assertion`). Lint now exits clean.
122
+ - Shared run-related schemas extracted to `src/types/run-schemas.ts`
123
+ (`CategoryScoreSchema`, `ExplorationSectionSchema`,
124
+ `ExplorationMapSchema`, `AnalysisRecordBaseSchema`,
125
+ `AnalysisSummaryBaseSchema`). `save-run.ts` shrank 173 → 76 lines;
126
+ `update-run.ts` shrank 167 → 80 lines.
127
+ - `main()` body extracted into `buildServerOptions()` plus
128
+ `STARTUP_TOOL_GROUPS` / `STARTUP_RESOURCES` constants. Function body
129
+ shrank 197 → 88 lines.
130
+ - `EXPECTED_TOOLS` unified to a single fixture
131
+ (`src/__tests__/fixtures/expected-tools.ts`) consumed by both
132
+ `tools-integration.test.ts` and `tool-registry.test.ts`.
133
+ - `createToolHandler` `preProcess` discriminates on a `Symbol`
134
+ marker (`shortCircuit()`) instead of `'content' in result`
135
+ duck-typing. Future tool schemas with top-level `content` fields
136
+ no longer trigger an accidental error-response interpretation.
137
+ - `isNumericSchema` uses Zod's public `unwrap()` /
138
+ `removeDefault()` API instead of accessing `_def.innerType`
139
+ via `as any`. Stable across Zod minor versions.
140
+ - `list_agents` handler now guards SDK return shape with
141
+ `Array.isArray` + a type predicate filter. Previously cast
142
+ `data as Array<{ name: string }>` blind.
143
+ - `assertion` guarding `toolPoliciesPath` argument added to
144
+ `index.test.ts` — the fix above would otherwise have no test
145
+ coverage protecting it from refactor regression.
146
+ - Stale `tool-policies.json` CWD-fallback comment in `src/index.ts`
147
+ replaced with an accurate description of the bundled-file lookup.
148
+ - LICENSE file added (MIT, matching sibling `@uluops/*` packages)
149
+ and `LICENSE` added to `files[]`.
150
+ - CHANGELOG `[Unreleased]` compare base corrected from `v1.21.0`
151
+ (pre-rename) to `v0.2.0` and `[0.2.0]` tag link added in 0.2.0
152
+ release; this release adds `[0.2.1]` link.
153
+
154
+ ### Test count
155
+
156
+ 655 passing (up from 645 in 0.2.0). Net +10: +7 tier-gating, +2
157
+ `coerceNumericFields` boundary, +2 `save_run` timestamp, +2 ulr_
158
+ format validation, −5 retired (one `loadConfig` server-defaults
159
+ test deleted with the dead stanza, removed assertions migrated).
160
+
161
+ ## [0.2.0] - 2026-06-05
162
+
163
+ First release under the scoped name `@uluops/ops-mcp`. Forward-ports the
164
+ operational drift from the legacy `uluops-ops-mcp-client` 1.22.0 codebase
165
+ and aligns the package with the broader UluOps supply-chain policy.
166
+
167
+ ### Added
168
+
169
+ - **`soft_delete_issue` tool** — write-side tool for soft-deleting issues
170
+ with standard 10KB/10KB size budgets and 60/min, 1000/hr rate limits.
171
+ Brings total tool count to 48.
172
+ - **`add_issue_note` size relaxation** — `maxArgsSize` 50→80 KB and
173
+ `maxEgressBytes` 20→100 KB. The MySQL `TEXT` content column tolerates
174
+ 64KB; the prior 20KB egress was too tight for stack-trace-heavy notes.
175
+
176
+ ### Changed
177
+
178
+ - **`@uluops/ops-sdk` bumped `^2.0.0` → `3.1.0`** (two major versions).
179
+ All tool source compiles unchanged against the new SDK surface.
180
+ - **All runtime and dev dependencies pinned to exact versions** — removed
181
+ caret ranges across the board per the 2026-06-01 UluOps supply-chain
182
+ hardening policy.
183
+
184
+ ### Historical lineage (legacy `uluops-ops-mcp-client` versions below)
185
+
186
+ ## [1.21.0] - 2026-05-21
187
+
188
+ ### Changed
189
+ - Score field now optional/nullable across MCP schemas to support generator/executor agents
190
+
191
+ ## [1.20.0] - 2026-05-20
192
+
193
+ ### Changed
194
+ - `save_run` and `update_run` pass `{ _skipClientValidation: true }` to SDK — eliminates redundant double validation
195
+
196
+ ### Fixed
197
+ - `edit_issue` tool aligned with SDK rename (`issues.edit()` → `issues.update()`)
198
+ - `ConflictError` details (`nextAvailable`, `status`) forwarded to MCP response
199
+ - Tool count assertions updated from 45 → 47
200
+
201
+ ## [1.19.0] - 2026-05-18
202
+
203
+ ### Fixed
204
+ - `ExplorationSection` schemas aligned with API discriminated union type
205
+
206
+ ## [1.18.0] - 2026-05-11
207
+
208
+ ### Added
209
+ - `get_agent_runs_analysis` MCP tool for per-agent analysis history
210
+ - `exploration_maps` on `save_run` and `update_run` tool schemas
211
+ - Per-agent analysis summary array on `save_run`
212
+
213
+ ## [1.17.0] - 2026-05-10
214
+
215
+ ### Added
216
+ - Per-agent analysis attribution on `update_run` tool
217
+ - `analysis_records` and `analysis_summary` exposed on `update_run` tool
218
+
219
+ ## [1.16.0] - 2026-05-06
220
+
221
+ ### Added
222
+ - `high` priority level added to MCP schemas
223
+
224
+ ### Changed
225
+ - Legacy `ULUOPS_TRACKER_API_KEY`/`ULUOPS_TRACKER_URL` env var support removed
226
+
227
+ ## [1.15.0] - 2026-05-03
228
+
229
+ ### Added
230
+ - `get_agent_lifecycle` tool with `definition_version` on agent snapshots
231
+
232
+ ### Fixed
233
+ - `save_features_list` references replaced with `save_run` in docs
234
+
235
+ ## [1.14.0] - 2026-05-01
236
+
237
+ ### Fixed
238
+ - `classified_by` enum value renamed from `validator` to `agent` in MCP schema
239
+
240
+ ## [1.13.0] - 2026-04-28
241
+
242
+ ### Added
243
+ - 402 `SubscriptionRequired` error handling with `source=mcp` tracking
244
+
245
+ ## [1.12.0] - 2026-04-19
246
+
247
+ ### Added
248
+ - `definition_id` field on `save_run` MCP tool input schema
249
+
250
+ ## [1.11.0] - 2026-04-16
251
+
252
+ ### Added
253
+ - `summary` field on `AgentResultSchema`
254
+
255
+ ### Fixed
256
+ - `mcp-secure-server` upgraded to 0.0.13-security (UUID false-positive fix)
257
+
258
+ ## [1.10.0] - 2026-04-15
259
+
260
+ ### Added
261
+ - Detailed error diagnostics from `mcp-secure-server`
262
+
263
+ ## [1.9.0] - 2026-04-12
264
+
265
+ ### Added
266
+ - Session token authentication as alternative to API keys
267
+
268
+ ## [1.8.0] - 2026-04-10
269
+
270
+ ### Added
271
+ - `observation` as first-class issue status
272
+
273
+ ### Changed
274
+ - Divergent taxonomy resource replaced with SDK-fetched data
275
+
276
+ ## [1.7.0] - 2026-04-04
277
+
278
+ ### Added
279
+ - Structured error context with tool name, type, and suggestions
280
+ - `recommendations` field on `update_run` tool
281
+
282
+ ## [1.6.0] - 2026-03-29
283
+
284
+ ### Added
285
+ - Org context support via `ULUOPS_ORG_SLUG` env var
286
+
287
+ ### Fixed
288
+ - Error handling overhauled for actionable agent-facing messages
289
+ - Analysis record type enum enforced at MCP layer on `save_run`
290
+
291
+ ## [1.5.0] - 2026-03-14
292
+
293
+ ### Added
294
+ - Analysis query tools: `get_run_analysis`, `get_project_analysis`, `query_analysis_records`
295
+ - `analysis_records` and `analysis_summary` fields on `save_run`
296
+
297
+ ### Fixed
298
+ - `get_project_analysis` uses project name instead of UUID
299
+
300
+ ## [1.4.0] - 2026-03-08
301
+
302
+ ### Changed
303
+ - `save_features_list` renamed to `save_run`
304
+ - `validator` renamed to `agent` across Zod schemas, tool descriptions, and tracker tools
305
+
306
+ ### Fixed
307
+ - Test data updated for validators→agents schema rename
308
+ - String-typed numeric params coerced before Zod validation
309
+
310
+ ## [1.3.0] - 2026-03-01
311
+
312
+ ### Added
313
+ - Definition metadata enrichment and background registry sync
314
+
315
+ ## [1.2.0] - 2026-02-15
316
+
317
+ ### Changed
318
+ - `BackendApiClient` replaced with `@uluops/ops-sdk`
319
+ - Production URL default added so users only need API key
320
+
321
+ ### Fixed
322
+ - 9 DX validator issues resolved
323
+ - 4 live-testing bugs in MCP tools fixed
324
+ - Missing `get_discovery` and `get_validator_matrix` tool specs added
325
+ - Deferred deprecation logging, `apiKey` validation, and tool description enrichment
326
+ - Post-implementation validation issues resolved
327
+
328
+ ## [1.1.0] - 2026-02-07
329
+
330
+ ### Added
331
+ - `false-positive` status added to issue lifecycle
332
+ - `IssueType` classification on MCP tool schemas
333
+ - Domain-specific issue types accepted
334
+ - Discovery timeline and validator-matrix analytics tools
335
+ - Burndown and velocity MCP tools
336
+
337
+ ### Fixed
338
+ - `workflow_type` included in run update path
339
+ - Null `line_number` allowed in recommendation and issue inputs
340
+ - `type` field included in `createIssue` request body
341
+ - `run_id` sent in `X-Confirm-Delete` header instead of `'true'`
342
+
343
+ ## [1.0.0] - 2026-01-19
344
+
345
+ ### Added
346
+ - Core MCP tools (P0): `save_run`, `query_issues`, `update_status`, `get_project_summary`, `delete_project`
347
+ - Extended MCP tools (P1): `get_issue_details`, `get_run_details`, `diff_runs`, `archive_runs`, `get_analytics`, `search_issues`
348
+ - P2 MCP tools: 17 additional tools for full API coverage (projects, runs, issues, taxonomy)
349
+ - MCP resources for `validation://` URI scheme
350
+ - API client with retry logic and error mapping
351
+ - Structured logging with optional file output
352
+ - Configuration for `mcp-secure-server` framework
353
+ - Initial project setup with TypeScript, ESLint, Prettier, and Vitest
354
+
355
+ ### Fixed
356
+ - Security limits increased for large validation payloads
357
+ - `id` field handling standardized in status update tools
358
+
359
+ [Unreleased]: https://github.com/Uluops/ops-uluops-mcp/compare/v0.2.1...HEAD
360
+ [0.2.1]: https://github.com/Uluops/ops-uluops-mcp/compare/v0.2.0...v0.2.1
361
+ [0.2.0]: https://github.com/Uluops/ops-uluops-mcp/compare/v1.21.0...v0.2.0
362
+ [1.21.0]: https://github.com/Uluops/ops-uluops-mcp/compare/v1.20.0...v1.21.0
363
+ [1.20.0]: https://github.com/Uluops/ops-uluops-mcp/compare/v1.19.0...v1.20.0
364
+ [1.19.0]: https://github.com/Uluops/ops-uluops-mcp/compare/v1.18.0...v1.19.0
365
+ [1.18.0]: https://github.com/Uluops/ops-uluops-mcp/compare/v1.17.0...v1.18.0
366
+ [1.17.0]: https://github.com/Uluops/ops-uluops-mcp/compare/v1.16.0...v1.17.0
367
+ [1.16.0]: https://github.com/Uluops/ops-uluops-mcp/compare/v1.15.0...v1.16.0
368
+ [1.15.0]: https://github.com/Uluops/ops-uluops-mcp/compare/v1.14.0...v1.15.0
369
+ [1.14.0]: https://github.com/Uluops/ops-uluops-mcp/compare/v1.13.0...v1.14.0
370
+ [1.13.0]: https://github.com/Uluops/ops-uluops-mcp/compare/v1.12.0...v1.13.0
371
+ [1.12.0]: https://github.com/Uluops/ops-uluops-mcp/compare/v1.11.0...v1.12.0
372
+ [1.11.0]: https://github.com/Uluops/ops-uluops-mcp/compare/v1.10.0...v1.11.0
373
+ [1.10.0]: https://github.com/Uluops/ops-uluops-mcp/compare/v1.9.0...v1.10.0
374
+ [1.9.0]: https://github.com/Uluops/ops-uluops-mcp/compare/v1.8.0...v1.9.0
375
+ [1.8.0]: https://github.com/Uluops/ops-uluops-mcp/compare/v1.7.0...v1.8.0
376
+ [1.7.0]: https://github.com/Uluops/ops-uluops-mcp/compare/v1.6.0...v1.7.0
377
+ [1.6.0]: https://github.com/Uluops/ops-uluops-mcp/compare/v1.5.0...v1.6.0
378
+ [1.5.0]: https://github.com/Uluops/ops-uluops-mcp/compare/v1.4.0...v1.5.0
379
+ [1.4.0]: https://github.com/Uluops/ops-uluops-mcp/compare/v1.3.0...v1.4.0
380
+ [1.3.0]: https://github.com/Uluops/ops-uluops-mcp/compare/v1.2.0...v1.3.0
381
+ [1.2.0]: https://github.com/Uluops/ops-uluops-mcp/compare/v1.1.0...v1.2.0
382
+ [1.1.0]: https://github.com/Uluops/ops-uluops-mcp/compare/v1.0.0...v1.1.0
383
+ [1.0.0]: https://github.com/Uluops/ops-uluops-mcp/releases/tag/v1.0.0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 UluOps
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,272 @@
1
+ # @uluops/ops-mcp
2
+
3
+ MCP (Model Context Protocol) server for the UluOps Platform API. Provides **48 tools** and **3 resources** (2 functional, 1 template placeholder) that enable Claude Code, Cursor, and other MCP hosts to interact with the UluOps Platform.
4
+
5
+ ## Design Philosophy
6
+
7
+ **Thin Client Pattern**: This MCP server contains **zero business logic**. All data processing, validation, storage, and analytics are handled by the backend API. The server's sole responsibility is protocol translation between MCP's stdio-based JSON-RPC and the backend's REST API.
8
+
9
+ ## Installation
10
+
11
+ Requires **Node.js 18** or later.
12
+
13
+ **Option A — npx (no install):**
14
+
15
+ ```bash
16
+ npx -y @uluops/ops-mcp
17
+ ```
18
+
19
+ **Option B — global install:**
20
+
21
+ ```bash
22
+ npm install -g @uluops/ops-mcp
23
+ ```
24
+
25
+ This exposes the `uluops-ops-mcp` binary on your PATH.
26
+
27
+ ## Configuration
28
+
29
+ Set environment variables in your MCP host configuration (see "Usage with Claude Code" below) or in a `.env` file when developing locally.
30
+
31
+ | Variable | Description | Required |
32
+ |----------|-------------|----------|
33
+ | `ULUOPS_BASE_URL` | Backend API URL | Yes |
34
+ | `ULUOPS_API_KEY` | API authentication key (must start with `ulr_`, min 20 chars) | Yes |
35
+ | `ULUOPS_ORG_SLUG` | Organization slug for multi-org contexts | No |
36
+ | `ULUOPS_TRACKER_TIMEOUT` | Request timeout (ms) | No (default: 30000) |
37
+ | `ULUOPS_TRACKER_RETRIES` | Number of retry attempts on failure | No (default: 3) |
38
+ | `LOG_LEVEL` | Logging level (`debug`, `info`, `warn`, `error`) | No (default: info) |
39
+
40
+ ### Advanced Logging
41
+
42
+ By default this server logs only to stderr at `info` level. To enable structured file logging, set:
43
+
44
+ | Variable | Description | Default |
45
+ |----------|-------------|---------|
46
+ | `ENABLE_FILE_LOGGING` | Write JSON logs to disk | `false` |
47
+ | `LOG_DIR` | Directory for log files | `logs` |
48
+ | `VERBOSE_LOGGING` | Include extra diagnostic detail | `false` |
49
+ | `LOG_PERFORMANCE_METRICS` | Emit per-call timing metrics | `false` |
50
+
51
+ When `ENABLE_FILE_LOGGING=true`, a `logs/` directory is created in the process's working directory.
52
+
53
+ ### Production Tightening
54
+
55
+ | Variable | Description | Default |
56
+ |----------|-------------|---------|
57
+ | `ENABLE_DETAILED_ERRORS` | Propagate redacted error reasons in `error.message` so callers can diagnose failures without parsing the data envelope. Set to `false` to suppress in tightened production deployments. | `true` |
58
+
59
+ ## Usage with Claude Code
60
+
61
+ Add to your Claude Code MCP configuration (`.mcp.json`):
62
+
63
+ **Option 1: npx (lowest friction — no install)**
64
+ ```json
65
+ {
66
+ "mcpServers": {
67
+ "uluops-ops": {
68
+ "command": "npx",
69
+ "args": ["-y", "@uluops/ops-mcp"],
70
+ "env": {
71
+ "ULUOPS_BASE_URL": "https://api.uluops.ai/api/v1",
72
+ "ULUOPS_API_KEY": "ulr_your-api-key-here"
73
+ }
74
+ }
75
+ }
76
+ }
77
+ ```
78
+
79
+ **Option 2: Globally installed binary**
80
+ ```json
81
+ {
82
+ "mcpServers": {
83
+ "uluops-ops": {
84
+ "command": "uluops-ops-mcp",
85
+ "args": [],
86
+ "env": {
87
+ "ULUOPS_BASE_URL": "https://api.uluops.ai/api/v1",
88
+ "ULUOPS_API_KEY": "ulr_your-api-key-here"
89
+ }
90
+ }
91
+ }
92
+ }
93
+ ```
94
+
95
+ ## Quick Start Examples
96
+
97
+ Once configured, Claude Code can use the uluops tracker tools:
98
+
99
+ ```typescript
100
+ // Save validation results from a workflow run
101
+ save_run({
102
+ project: "my-project",
103
+ workflow_type: "ship",
104
+ agents: [{ name: "code-validator", score: 85, decision: "PASS" }],
105
+ recommendations: [{ agent: "code-validator", title: "Fix lint error", priority: "suggested" }]
106
+ })
107
+
108
+ // Query open issues for a project
109
+ query_issues({ project: "my-project", status: "open", priority: "critical" })
110
+
111
+ // Get project summary with issue counts and trends
112
+ get_project_summary({ project: "my-project" })
113
+ ```
114
+
115
+ ## Rate Limiting Configuration
116
+
117
+ This server uses `mcp-secure-server` with configuration optimized for Claude Code's usage patterns.
118
+
119
+ ### Claude Code Usage Patterns
120
+
121
+ | Operation | Typical Parallel Calls | Notes |
122
+ |-----------|------------------------|-------|
123
+ | Query context (summary, issues, runs) | 3-5 | Low burst |
124
+ | Create issues from validation workflow | 10-30 | High burst |
125
+ | Update agents with metrics | 6 | Medium burst |
126
+ | Save recommendations | 1 (with array) | Single call |
127
+
128
+ Claude Code issues tool calls in short, intense bursts (<2s) followed by "thinking" pauses. The default configuration accounts for this:
129
+
130
+ ```typescript
131
+ {
132
+ securityLevel: 'basic',
133
+ maxRequestsPerMinute: 120,
134
+ burstThreshold: 15, // Covers 90% of parallel operations
135
+ burstWindowMs: 5000, // 5s window resets between thinking periods
136
+ automationDetection: {
137
+ enabled: false, // Claude Code is trusted automation
138
+ },
139
+ }
140
+ ```
141
+
142
+ ### Why These Settings
143
+
144
+ - **`burstThreshold: 15`** - Handles typical validation workflow bursts (10-15 parallel issue creates or queries)
145
+ - **`burstWindowMs: 5000`** - Short window resets between Claude's "thinking" periods, preventing false positives
146
+ - **`automationDetection: disabled`** - Claude Code IS automation with consistent timing patterns; detecting it as a "bot" would block legitimate use
147
+
148
+ ## Available Tools
149
+
150
+ ### Core Tools (P0)
151
+ | Tool | Description |
152
+ |------|-------------|
153
+ | `save_run` | Save validation pipeline output with issue correlation |
154
+ | `query_issues` | Query issues with filtering by status, priority, validator |
155
+ | `update_status` | Update issue status (completed, deferred, wontfix) |
156
+ | `get_project_summary` | Get project overview with workflow and validator stats |
157
+ | `delete_project` | Delete project data (requires confirmation) |
158
+
159
+ ### Extended Tools (P1)
160
+ | Tool | Description |
161
+ |------|-------------|
162
+ | `create_issue` | Create a user-submitted issue directly (outside validation runs) |
163
+ | `get_issue_details` | Full issue lifecycle with occurrences, notes, history |
164
+ | `get_run_details` | Run information with all recommendations and stats |
165
+ | `diff_runs` | Compare two validation runs (fixed, new, unchanged issues) |
166
+ | `archive_runs` | Archive old runs without deletion |
167
+ | `get_analytics` | Cross-project analytics (8 metric types available) |
168
+ | `search_issues` | Search issues across projects with relevance ranking |
169
+ | `list_agents` | List canonical agents from manifest |
170
+ | `validate_run` | Preview save operation without modifying database |
171
+ | `get_issue_history` | Full issue history with changes between runs |
172
+ | `add_issue_note` | Add context, resolution, or blocker notes to issues |
173
+ | `edit_issue` | Edit issue metadata (title, file_path, severity, etc.) |
174
+ | `merge_issues` | Merge duplicate issues into a target issue |
175
+ | `bulk_update_status` | Bulk update multiple issue statuses in one transaction |
176
+ | `update_run` | Update run metadata post-hoc (tokens, scores, timestamps) |
177
+ | `get_agent_reliability` | Analyze agent effectiveness and reliability scores |
178
+ | `get_agent_lifecycle` | Lifecycle metrics for an agent across runs |
179
+
180
+ ### Project Tools (P2)
181
+ | Tool | Description |
182
+ |------|-------------|
183
+ | `list_projects` | List all active projects |
184
+ | `get_project` | Get a single project by ID or name |
185
+ | `get_project_trends` | Get issue trends over time for a project |
186
+ | `create_project` | Create a new project |
187
+ | `update_project` | Update a project name |
188
+ | `soft_delete_project` | Soft delete a project (can be restored later) |
189
+ | `restore_project` | Restore a soft-deleted project |
190
+
191
+ ### Run Tools (P2)
192
+ | Tool | Description |
193
+ |------|-------------|
194
+ | `get_run` | Get a run by UUID |
195
+ | `list_runs` | List runs for a project |
196
+ | `get_latest_run` | Get the latest run for a project |
197
+ | `delete_run` | Delete a run (requires confirmation) |
198
+
199
+ ### Issue Tools (P2)
200
+ | Tool | Description |
201
+ |------|-------------|
202
+ | `get_issue_by_fingerprint` | Get an issue by its SHA-256 fingerprint |
203
+ | `update_issue_by_fingerprint` | Update an issue status by its fingerprint |
204
+ | `restore_issue` | Restore a soft-deleted issue |
205
+ | `soft_delete_issue` | Soft delete an issue (can be restored later) |
206
+ | `undo_issue_status` | Undo the last status change on an issue |
207
+
208
+ ### Taxonomy Tools (P2)
209
+ | Tool | Description |
210
+ |------|-------------|
211
+ | `get_taxonomy` | Get the failure taxonomy schema (domains, modes, severities) |
212
+ | `get_full_taxonomy_analytics` | Get full taxonomy analytics with distribution by domain |
213
+ | `get_burndown` | Get taxonomy burndown with time series and trend analysis per failure domain |
214
+ | `get_velocity` | Get velocity metrics per failure mode with sparkline data and trend reliability |
215
+ | `get_discovery` | Get discovery timeline showing new vs recurring issues over time |
216
+ | `get_agent_matrix` | Get agent-taxonomy coverage matrix with blind spot detection |
217
+
218
+ ### Analysis Tools (P2)
219
+ | Tool | Description |
220
+ |------|-------------|
221
+ | `get_run_analysis` | Structured analysis records for a single run (decision, scoring, findings) |
222
+ | `get_project_analysis` | Aggregated analysis records across all runs in a project |
223
+ | `query_analysis_records` | Query analysis records by type, classification, severity |
224
+ | `get_agent_runs_analysis` | Per-run analysis records grouped by agent |
225
+
226
+ ## Available Resources
227
+
228
+ MCP resources provide read-only access to validation data via the `validation://` URI scheme.
229
+
230
+ | Resource | URI | Description |
231
+ |----------|-----|-------------|
232
+ | Projects | `validation://projects` | List all tracked projects |
233
+ | Project Summary | `validation://projects/{project}` | Template placeholder (use `get_project_summary` tool) |
234
+ | Taxonomy | `validation://taxonomy` | Failure taxonomy schema for classifying issues |
235
+
236
+ ### Resource Usage
237
+
238
+ ```typescript
239
+ // List all projects (returns JSON array of project names)
240
+ read_resource("validation://projects")
241
+
242
+ // Get the failure taxonomy schema (domains, modes, severity codes)
243
+ read_resource("validation://taxonomy")
244
+ ```
245
+
246
+ **Note:** For project-specific data, use the `get_project_summary` tool instead of resources. MCP resource templates with parameters are not fully supported by the SDK.
247
+
248
+ ## Development
249
+
250
+ ```bash
251
+ # Install dependencies
252
+ npm install
253
+
254
+ # Development mode with watch
255
+ npm run dev
256
+
257
+ # Run tests
258
+ npm test
259
+
260
+ # Type checking
261
+ npm run typecheck
262
+
263
+ # Linting
264
+ npm run lint
265
+
266
+ # Build for production
267
+ npm run build
268
+ ```
269
+
270
+ ## License
271
+
272
+ MIT