2.2.0 — echo-mcp: the containerized MCP server
Build and Push Docker Image / build (push) Successful in 23s

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>
This commit is contained in:
Jason Stedwell
2026-07-28 23:01:47 -05:00
parent e7792003a7
commit 227e26c8db
13 changed files with 761 additions and 6 deletions
+28
View File
@@ -0,0 +1,28 @@
# echo-mcp — PORT deploy manifest (ALPHA / br0). See docs/MCP-SERVER-SPEC.md §8.
# Container name deliberately differs from the repo (echo): the repo ships the
# plugin AND this server; only the server is a container.
name: echo-mcp
image: registry.alwisp.com/jason/echo:latest
network: br0
ip: auto
ports: [] # br0 static IP — app serves :8765 directly
volumes:
- /mnt/user/appdata/echo-mcp:/data # outbox + read cache (+ backups/history, v1.1)
env:
# Vault adjacency: the Obsidian Local REST API's HTTP binding on the same box —
# never the public echoapi.alwisp.com hairpin (spec §8; cleartext stays on the LAN).
ECHO_BASE: http://10.2.0.35:27123
ECHO_OWNER: Jason Stedwell
ECHO_STATE_DIR: /data
ECHO_MCP_PORT: "8765"
ECHO_MCP_TOOLS: full
# Secrets from the PORT secret store — values never appear in this file or chat.
ECHO_KEY: SECRET:echo-vault-key
ECHO_MCP_TOKEN: SECRET:echo-mcp-token
health_check_path: /health
health_check_port: 8765
webui: https://echomcp.alwisp.com
proxy:
forward_port: 8765
forward_scheme: http
websockets: true