6.3 KiB
| title | status | audience | language | last_updated | when_to_read | |
|---|---|---|---|---|---|---|
| MCP Integration — Scrum4Me Tools | active |
|
nl | 2026-05-03 | When using MCP tools to interact with the Scrum4Me backlog. |
MCP-integratie
Scrum4Me heeft een eigen MCP-server in repo madhura68/scrum4me-mcp die de REST-API als native tools voor Claude Code aanbiedt. Schema's worden gedeeld via een git submodule (vendor/scrum4me), niet gedupliceerd.
Tools beschikbaar in Claude Code (18)
Read / context:
mcp__scrum4me__health— service + DB pingmcp__scrum4me__list_products— producten waar de tokengebruiker toegang tot heeftmcp__scrum4me__get_claude_context— bundled product / actieve sprint / next story (met tasks) / open todos
Authoring (PBI/Story/Task aanmaken):
mcp__scrum4me__create_pbi—{ product_id, title, description?, priority, sort_order? }; auto sort_order = last+1 binnen prio-groepmcp__scrum4me__create_story—{ pbi_id, title, description?, acceptance_criteria?, priority, sort_order? }; product_id afgeleid uit PBI; status=OPENmcp__scrum4me__create_task—{ story_id, title, description?, implementation_plan?, priority, sort_order? }; sprint_id geërfd van story; status=TO_DOmcp__scrum4me__create_todo— losse todo (optioneel product-scoped)
Task / story writes:
mcp__scrum4me__update_task_status,mcp__scrum4me__update_task_planmcp__scrum4me__log_implementation,mcp__scrum4me__log_test_result,mcp__scrum4me__log_commit
Vraag-antwoord-kanaal (M11):
mcp__scrum4me__ask_user_question— post een vraag over een story; optionelewait_seconds(max 600) polt voor het antwoordmcp__scrum4me__get_question_answer— huidige status + antwoord (voor latere session-pickup)mcp__scrum4me__list_open_questions— eigen vragen, max 50, recente eerstmcp__scrum4me__cancel_question— asker-only annulering van een eigen open vraag
Job queue — agent worker mode (M13):
mcp__scrum4me__wait_for_job— blokkeert ≤600s, claimt atomisch een QUEUED-job via FOR UPDATE SKIP LOCKED. Sinds M12 retourneert de payload eenkind-discriminator:kind: 'TASK_IMPLEMENTATION'(default) — payload metimplementation_plan,story,pbi,sprint,repo_urlkind: 'IDEA_GRILL'of'IDEA_MAKE_PLAN'— payload metidea,product,repo_url, enprompt_text(de embedded prompt uitlib/idea-prompts/) Stale CLAIMED-jobs (>30min) worden eerst terug naar QUEUED gezet. Lege queue na block-time = klaar.
mcp__scrum4me__update_job_status— agent rapporteertrunning|done|failed+ optionele branch/summary/error; triggert automatisch SSE-event. BijfailedvoorIDEA_GRILL/IDEA_MAKE_PLANwordt de idea-status automatisch opGRILL_FAILEDresp.PLAN_FAILEDgezet. Auth: Bearer-token moet matchenclaimed_by_token_id. Optionele token-velden:model_id(string),input_tokens,output_tokens,cache_read_tokens,cache_write_tokens(alle non-negative int) — worden opgeslagen op de ClaudeJob-rij bij done/failed.
Idea-jobs (M12) — agent gedrag per kind:
| Kind | Werkwijze | Eind-call |
|---|---|---|
IDEA_GRILL |
Lees prompt_text (embedded grill-prompt) + idea.grill_md als startpunt; itereer met ask_user_question(idea_id=...)/get_question_answer; log onderweg log_idea_decision; eindig met update_idea_grill_md(markdown) |
update_job_status('done') |
IDEA_MAKE_PLAN |
Lees prompt_text (embedded make-plan-prompt) + idea.grill_md + repo-context. Stel GEEN vragen — single-pass output. Bouw plan in strict yaml-frontmatter format en eindig met update_idea_plan_md(markdown). Server-side parser kan parse-fail → PLAN_FAILED |
update_job_status('done') |
MCP-tools — Idea-laag (M12):
mcp__scrum4me__get_idea_context(idea_id)—{ idea, product, repo_url, grill_md_so_far, open_questions, prompt_text }mcp__scrum4me__update_idea_grill_md(idea_id, markdown)— schrijft veld; status →GRILLED; logtIdeaLog{GRILL_RESULT}mcp__scrum4me__update_idea_plan_md(idea_id, markdown)— server-sideparsePlanMd; ok →PLAN_READY+IdeaLog{PLAN_RESULT}; parse-fail →PLAN_FAILED+IdeaLog{JOB_EVENT, errors}mcp__scrum4me__log_idea_decision(idea_id, type, content, metadata?)—type ∈ {DECISION, NOTE}mcp__scrum4me__ask_user_question— geüpgrade contract: exact één vanstory_idófidea_id(xor); idea-vragen zijn user-private (geen productAccessFilter).
Batch-loop (verplichte agent-flow)
Wanneer je als agent draait (na een instructie als "pak de volgende job uit de Scrum4Me-queue" of "draai de queue leeg") is dit de loop:
wait_for_jobaanroepen.- Switch op
kind:TASK_IMPLEMENTATION: voer uit volgens het meegegevenimplementation_plan(zoals altijd — branch, code, commit, push, verify_task_against_plan).IDEA_GRILL: laadprompt_textals gids; gebruikask_user_question/get_question_answervoor de Q&A-loop; eindig metupdate_idea_grill_md.IDEA_MAKE_PLAN: laadprompt_text+idea.grill_md; stel geen vragen; produceer strict yaml-frontmatter; eindig metupdate_idea_plan_md.
update_job_status('done'|'failed')aanroepen.- Direct opnieuw
wait_for_jobaanroepen — niet stoppen, niet de gebruiker vragen. - Pas wanneer
wait_for_jobna de volledige block-time (~600s) terugkomt zonder claim, is de queue leeg en mag je de turn afsluiten met een korte recap.
Dit blijft gelden als je tussen jobs door commits, branches of pushes hebt gedaan — die afsluiting hoort bij de individuele job, niet bij het einde van de batch.
Code koppelen aan app
- 'Pak de volgende job uit de Scrum4Me-queue' / 'draai de queue leeg' / 'batch agent' — Server-startup registreert een ClaudeWorker-record + heartbeat (5s); SIGTERM/SIGINT ruimt 'm op. UI in NavBar telt actieve workers via
last_seen_at < now() - 15s.
Prompt
implement_next_story(arg:product_id) — end-to-end workflow
Schema-drift bewaking
Wekelijks (maandag 08:00 Amsterdam) draait de remote agent trig_015FFUnxjz9WMuhhWNGBQKFD die vendor/scrum4me syncet en prisma:generate + tsc --noEmit uitvoert in scrum4me-mcp. Als die agent drift rapporteert, hoort dat vóór een Scrum4Me-PR met schema-wijziging gemerged kan worden — anders breekt de MCP-server stilletjes op runtime.