feat(mcp): typed-entity tools (person/place/list)

Nine tools — list/create/update for each of person, place, list.
Get and delete reuse fable_get_note / fable_delete_note (typed
entities share the Note model).

Lists: the wrappers accept an `items: list[str]` for ergonomics and
translate to the {text, checked} dict shape that
services/knowledge.py and KnowledgeView.vue expect. items=[] clears;
items=None leaves unchanged.

Updates do an explicit get → merge → update round trip so updating
one typed field doesn't clobber the others stored alongside it in
entity_meta (which is a single JSONB column).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-26 20:53:36 -04:00
parent 6961144c3a
commit d4f3516552
3 changed files with 438 additions and 1 deletions
+2 -1
View File
@@ -5,7 +5,7 @@ to a FastMCP instance. `register_all(mcp)` is the single entry point called
from `mcp.server.build_mcp_server`.
"""
from fabledassistant.mcp.tools import (
events, milestones, notes, projects, recent, search, tags, tasks,
entities, events, milestones, notes, projects, recent, search, tags, tasks,
)
@@ -19,3 +19,4 @@ def register_all(mcp) -> None:
events.register(mcp)
tags.register(mcp)
recent.register(mcp)
entities.register(mcp)