Files
FabledScribe/src/fabledassistant/mcp/server.py
T
bvandeusen 198f11ee09 feat(mcp): scaffold in-app FastMCP package
Empty FastMCP instance with the post-pivot instructions block. Tools
get registered in phases 2 and 3; ASGI mounting + bearer-auth comes
in task 1.4.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-26 19:12:57 -04:00

39 lines
1.4 KiB
Python

"""FastMCP instance + Quart mount-point. Tools are registered in mcp/tools/."""
from __future__ import annotations
from mcp.server.fastmcp import FastMCP
from quart import Quart
_INSTRUCTIONS = """
Fabled Scribe is the user's self-hosted second-brain and project-management
data store. You (Claude) are the assistant.
Hierarchy: Project -> Milestone -> Task/Note.
- Notes and Tasks share a model; tasks are notes with is_task=True.
- Use fable_*_note tools for notes, fable_*_task tools for tasks.
- Typed entities (person, place, list) are notes with a type field plus
type-specific columns; use the dedicated tools for those.
- Tags are plain strings (no `#` prefix). Empty list clears tags; omit to leave
unchanged on updates.
- For optional integer FKs (project_id, milestone_id, parent_id), use 0 to mean
"not set".
"""
def build_mcp_server() -> FastMCP:
"""Build the FastMCP instance with all tools registered."""
mcp = FastMCP("fable", instructions=_INSTRUCTIONS.strip())
# Tools will be registered here in Phase 2/3.
return mcp
def mount_mcp(app: Quart) -> None:
"""Mount the FastMCP streamable-HTTP ASGI sub-app at /mcp on the Quart app.
Phase 1.2 scaffold: just builds and exposes the instance for tests. The
actual ASGI wiring with bearer-auth happens in Task 1.4.
"""
mcp = build_mcp_server()
app.mcp_instance = mcp