ECHO as 14 typed MCP tools (streamable HTTP, stateless JSON, bearer auth, open
/health) wrapping the 2.1.1 *_op cores in-process:
- mcp-server/app.py: FastMCP app; duplicate gate + offline queueing surface as
DATA (merge_into/force are parameters, never blind retries); recall packs
excerpts into budget_chars by score; get_note is traversal-guarded with
section/max_chars; patch_note enriches invalid-target errors with the note's
actual headings; log_session wraps the session-end bundle (heartbeat-last);
ECHO_MCP_TOOLS=core exposes only the six daily drivers; all MCP writes
serialize in-process; startup fails fast on missing env.
- Dockerfile (legacy format — no BuildKit on the CI runner), python:3.12-slim,
healthcheck probes 127.0.0.1; .dockerignore keeps the context lean.
- .gitea/workflows/docker-build.yml: standard image build; PORT redeploy
trigger targets the echo-mcp container explicitly (repo name is echo).
- deploy.unraid.yml: br0/auto-IP, /data volume, vault adjacency
(ECHO_BASE=http://10.2.0.35:27123), secrets as SECRET: refs.
- SKILL.md: prefer the echo_* tools when the connector is present; CLI recipes
stay as the fallback. Spec header marked BUILT (tool count corrected to 14).
- eval/test_mcp_server.py: e2e over real streamable HTTP (health/auth/
initialize/tools-list + capture->gate->merge->recall->log_session); skips
cleanly when the SDK is absent. All seven suites green.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>