feat(mcp): make Scribe reflexively recall + scope reads to the active project #61

Merged
bvandeusen merged 1 commits from dev into main 2026-06-04 23:13:27 -04:00
Owner

Makes the MCP surface advertise recall as well as it advertised writing, and closes the wiring gap that made project-scoped reads impossible.

Why

  • search and list_notes dropped the project_id their underlying services already support, so a scoped search was impossible — every query swept all projects and bled unrelated work into the session.
  • Tool descriptions were mechanical ("Semantic search over the user's notes and tasks") with no trigger telling Claude when to reach for them; the server instructions were all write-discipline and said nothing about searching before answering or starting work.

Changes

  • search, list_notes: add project_id param, wired to the service.
  • search, list_notes, list_tasks: trigger-worded descriptions that push passing the active project's id and reserve project_id=0 for a deliberate cross-project sweep.
  • _INSTRUCTIONS: add a "Reach for Scribe to RECALL, not just to record" block — search before answering/starting, check for an existing ticket before create_task, scope reads to the active project (which doesn't stick on the stateless server).

Paired out-of-band with always-on rule #75 ("Search Scribe first, scoped to the active project") in the FabledSword-family rulebook, and a memory pointer binding this repo to the FabledScribe project (prod id 2 / dev id 3).

CI green on dev (run #541) at head e3c6124.

🤖 Generated with Claude Code

Makes the MCP surface advertise *recall* as well as it advertised *writing*, and closes the wiring gap that made project-scoped reads impossible. ## Why - `search` and `list_notes` dropped the `project_id` their underlying services already support, so a scoped search was impossible — every query swept all projects and bled unrelated work into the session. - Tool descriptions were mechanical ("Semantic search over the user's notes and tasks") with no trigger telling Claude *when* to reach for them; the server instructions were all write-discipline and said nothing about searching before answering or starting work. ## Changes - `search`, `list_notes`: add `project_id` param, wired to the service. - `search`, `list_notes`, `list_tasks`: trigger-worded descriptions that push passing the active project's id and reserve `project_id=0` for a deliberate cross-project sweep. - `_INSTRUCTIONS`: add a "Reach for Scribe to RECALL, not just to record" block — search before answering/starting, check for an existing ticket before `create_task`, scope reads to the active project (which doesn't stick on the stateless server). Paired out-of-band with always-on rule #75 ("Search Scribe first, scoped to the active project") in the FabledSword-family rulebook, and a memory pointer binding this repo to the FabledScribe project (prod id 2 / dev id 3). CI green on dev (run #541) at head `e3c6124`. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
bvandeusen added 1 commit 2026-06-04 23:13:21 -04:00
feat(mcp): make Scribe reflexively recall + scope reads to the active project
CI & Build / Python lint (push) Successful in 3s
CI & Build / TypeScript typecheck (push) Successful in 34s
CI & Build / Python tests (push) Successful in 43s
CI & Build / Build & push image (push) Successful in 56s
e3c6124912
The MCP surface advertised writing well but recall poorly, and project
scoping had no anchor that survived past enter_project's snapshot:

- search / list_notes dropped the project_id their services already
  support, so a scoped search was impossible — every query swept all
  projects and bled unrelated work into the session.
- The tool descriptions were mechanical ("Semantic search over the
  user's notes and tasks") with no trigger telling Claude WHEN to reach
  for them; the server instructions were all write-discipline and said
  nothing about searching before answering or starting work.

Changes:
- search, list_notes: add project_id param, wired to the service.
- search, list_notes, list_tasks: trigger-worded descriptions that push
  passing the active project's id and reserve project_id=0 for a
  deliberate cross-project sweep.
- _INSTRUCTIONS: add a 'Reach for Scribe to RECALL, not just to record'
  block — search before answering/starting, check for an existing ticket
  before create_task, scope reads to the active project (which does not
  stick on the server).

Paired with always-on rule #75 in the FabledSword-family rulebook.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
bvandeusen merged commit 51feaddcd3 into main 2026-06-04 23:13:27 -04:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: bvandeusen/FabledScribe#61