Phase 2.5 provider generalization
MCP resource server with Streamable HTTP, AuthService.ValidateToken, stub search_memory/write_memory, and async mcp_tool_calls audit (ADR-0050).
Milestone 2.5.G6.M1 — MCP Server Skeleton
Status: Completed (2026-08-25)
Goal: Track F — MCP Server Skeleton
Phase: 2.5 — Provider Generalization & Foundation
Estimated effort: 3 days
ADR: ADR-0050
Why This Milestone Exists
Ship the MCP auth boundary, Streamable HTTP transport, and audit wiring against stub handlers before Phase 3 writers exist — same “build the seam first” pattern as the rest of Phase 2.5.
Non-Goals (enforced)
- Real memory read/write / DB coupling
record_feedback/get_memory_lineage- Independent OAuth authorization server or second identity system
- Independent MCP rate limiter (env reserved; enforcement is 3.5.E.4)
What shipped
- Service
services/mcp-memory/— official MCP Python SDK, FastAPI host,/health/ready - Transport: Streamable HTTP (
/mcp); stdio gated (IBEX_MCP_TRANSPORT=stdio+IBEX_MCP_ALLOW_STDIO) - Auth: Bearer →
AuthService.ValidateTokengRPC, fail closed;WWW-Authenticate+/.well-known/oauth-protected-resource - Stub tools:
search_memory,write_memorywith strict schemas; tenant from tokenorg_id - ClickHouse
ibex.mcp_tool_calls(000002) + async non-blocking audit emitter - CI (pytest/ruff/bandit/coverage), Dockerfile, ADR-0050
Success signals
- MCP initialize / tools/list / tools/call against stubs (HTTP tests)
- Bearer validation via Auth gRPC seam; fail closed on auth outage
- Tool invocations emit org-scoped audit events (no secrets/content)
- Exactly two tools registered
- Repo guards / CI gates wired for the new Python service
Prerequisites
- Phase 2 exit (merged)
- Auth service gRPC contract stable
Edit on GitHub
Last updated on