feat: MCP-tester — live testscherm voor de scrum4me-MCP #35

Merged
janpeter merged 28 commits from claude/suspicious-cray-cb8b92 into main 2026-06-08 08:50:35 +02:00
Owner

Summary

Nieuw admin-only scherm /mcp-tester om de shared scrum4me-MCP-tools live aan te roepen en het resultaat te zien.

  • HTTP-transport naar de scrum4me-mcp HTTP-mode via @modelcontextprotocol/sdk (StreamableHTTP, POST /mcp, Bearer-auth). MCP_HTTP_URL = basis-URL; client appendt /mcp.
  • Dynamisch formulier uit tools/list — velden/typen/enums live afgeleid; nooit drift.
  • Comboboxen uit Prisma met cascade op product (entity-id-registry → provider per *_id; niet-gemapte ids vallen terug op tekst). Base UI Combobox, client-side filter.
  • Write-confirm voor muterende tools (read/write o.b.v. readOnlyHint + naam-heuristiek).
  • Pretty/Raw result-pane (Raw = CallToolResult + verzonden verzoek).
  • Auth: env-default token (MCP_DEFAULT_TOKEN, optioneel) + altijd-zichtbare UI-override (iron-session sealed cookie); token blijft server-side, geredacteerde audit-log per call. Ontbrekende-token foutstaat + "MCP onbereikbaar"-staat.
  • Nav-link toegevoegd; requireWorkersAdmin op page + elke server-action.

Spec & plan (in deze PR): docs/superpowers/specs/2026-06-07-mcp-tester-design.md (v0.4, codex-GO) en docs/superpowers/plans/2026-06-07-mcp-tester.md (codex-GO). Beide doorliepen een cross-model review-loop (codex op mac).

Test Plan

  • npm run verify groen (lint + typecheck + 438 tests, 2 skipped).
  • Unit-tests voor de pure units: registry, classify, schema-form, build-args (context-product_id), redact (Bearer/64-hex/veldnamen), entities (mocked Prisma, cascade), http-client (mocked SDK, /mcp + Bearer), session (override-precedentie), actions (admin-guard, config-fout, geen token-lek, set/clear override).
  • Handmatige smoke (vereist draaiende HTTP-MCP): start npm run dev:http in scrum4me-mcp; zet MCP_HTTP_URL/MCP_DEFAULT_TOKEN; in de browser: list_products (read, direct), search_product_docs (product uit context), create_sprint (write -> confirm), en de foutstaten (MCP gestopt / geen token).
  • Schema-snapshot fixture genereren tegen een live HTTP-MCP (zie __tests__/mcp-tester/fixtures/README.md) — test skipt tot de fixture er is.

Notes

  • De HTTP-MCP draait nog nergens permanent; het scherm werkt tegen een configureerbare MCP_HTTP_URL. Permanente deploy = apart plan (spec §7, Fase B).

🤖 Generated with Claude Code

## Summary Nieuw admin-only scherm **`/mcp-tester`** om de shared scrum4me-MCP-tools live aan te roepen en het resultaat te zien. - **HTTP-transport** naar de scrum4me-mcp HTTP-mode via `@modelcontextprotocol/sdk` (StreamableHTTP, `POST /mcp`, Bearer-auth). `MCP_HTTP_URL` = basis-URL; client appendt `/mcp`. - **Dynamisch formulier** uit `tools/list` — velden/typen/enums live afgeleid; nooit drift. - **Comboboxen uit Prisma** met cascade op product (entity-id-registry → provider per `*_id`; niet-gemapte ids vallen terug op tekst). Base UI Combobox, client-side filter. - **Write-confirm** voor muterende tools (read/write o.b.v. `readOnlyHint` + naam-heuristiek). - **Pretty/Raw** result-pane (Raw = `CallToolResult` + verzonden verzoek). - **Auth**: env-default token (`MCP_DEFAULT_TOKEN`, optioneel) + altijd-zichtbare UI-override (iron-session sealed cookie); token blijft server-side, geredacteerde audit-log per call. Ontbrekende-token foutstaat + "MCP onbereikbaar"-staat. - Nav-link toegevoegd; `requireWorkersAdmin` op page + elke server-action. Spec & plan (in deze PR): `docs/superpowers/specs/2026-06-07-mcp-tester-design.md` (v0.4, codex-GO) en `docs/superpowers/plans/2026-06-07-mcp-tester.md` (codex-GO). Beide doorliepen een cross-model review-loop (codex op mac). ## Test Plan - [x] `npm run verify` groen (lint + typecheck + **438 tests**, 2 skipped). - [x] Unit-tests voor de pure units: registry, classify, schema-form, build-args (context-`product_id`), redact (Bearer/64-hex/veldnamen), entities (mocked Prisma, cascade), http-client (mocked SDK, `/mcp` + Bearer), session (override-precedentie), actions (admin-guard, config-fout, geen token-lek, set/clear override). - [ ] **Handmatige smoke** (vereist draaiende HTTP-MCP): start `npm run dev:http` in scrum4me-mcp; zet `MCP_HTTP_URL`/`MCP_DEFAULT_TOKEN`; in de browser: `list_products` (read, direct), `search_product_docs` (product uit context), `create_sprint` (write -> confirm), en de foutstaten (MCP gestopt / geen token). - [ ] **Schema-snapshot fixture** genereren tegen een live HTTP-MCP (zie `__tests__/mcp-tester/fixtures/README.md`) — test skipt tot de fixture er is. ## Notes - De HTTP-MCP draait nog nergens permanent; het scherm werkt tegen een configureerbare `MCP_HTTP_URL`. Permanente deploy = apart plan (spec §7, Fase B). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Admin-scherm /mcp-tester om de scrum4me-MCP shared tools live aan te roepen:
HTTP-transport (Bearer), dynamisch formulier uit tools/list, comboboxen uit
Prisma met cascade op product, write-confirm, Pretty/Raw result. Fase B
(HTTP-MCP deploy op scrum4me-server) apart afgebakend.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- §6.7 concreet redaction-contract (veldnamen + Bearer/64-hex, geneste payloads)
- §6.2 entity-id-registry met bredere *_id-dekking + tekstveld-fallback
- §6.5/§6.7 MCP_DEFAULT_TOKEN env + .env.example + ontbrekende-token foutstaat
- §8 tests: redaction-vormen, Bearer-header op init/list/call, schema-snapshot
- §11 review-historie toegevoegd

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Niet-blokkerende nakomers uit review-ronde 2 verwerkt:
- MCP_DEFAULT_TOKEN expliciet optioneel in env-validatie (foutstaat bereikbaar)
- iron-session verzegelt cookie genoteerd
status: draft -> approved

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Gefaseerd plan o.b.v. goedgekeurde spec v0.3: setup → pure logic
(classify/registry/schema-form/redact) → server (entities/http-client/
session/actions) → UI (combobox/tool-list/form/result/page/nav) →
borging (schema-snapshot + verify). Modelnamen geverifieerd
(ClaudeJob/ClaudeWorker/UserQuestion/SprintTaskExecution/SprintRun),
SDK-client + Base UI Combobox API via ctx7.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1. MCP_HTTP_URL = basis-URL; client appendt /mcp (Task 0/7) + URL-test
2. buildToolArgs injecteert context-product_id (Task 4b) + dynamic-form hint
3. altijd-zichtbare token-control (Task 12/14) + precedentie-test (Task 8)
4. Raw = CallToolResult + verzoek (Task 7/11); spec §6.6 v0.4
5. Task 6 submodule-prerequisite + eerlijke verificatie-claim

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Raw-contract wording overal opgeschoond (Task 1 types-comment + spec §4 K7)
- clear-flow getest: setTokenOverrideAction(null) → delete + save (Task 9)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- wire redactForLog in callMcpToolAction (audit-log geredacteerde call; module was dead code)
- redactForLog accepteert nu unknown (geen JsonLike-constraint-lek)
- EntityCombobox: .catch op loadEntityOptionsAction (geen unhandled rejection)
- page: product-load in try/catch met [] fallback
- types: McpCallResult.content comment gecorrigeerd (raw content-blocks)
- spec §6.3: read-prefixes related_/peek genoteerd

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- #2 lege MCP_DEFAULT_TOKEN= → undefined (preprocess+trim); foutstaat bereikbaar + test
- #3 worker_instance_id/instance_id → nieuwe 'workerInstance' kind die
  ClaudeWorker.instance_id teruggeeft (i.p.v. row-id); worker_id blijft row-id
- #4 altijd-actieve registry-baseline-guard (bekende *_id-velden) naast de
  optionele live-snapshot — guard draait nu in verify
(#1 stale branch is opgelost via merge van origin/main)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
janpeter/scrum4me-workers!35
No description provided.