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.ValidateToken gRPC, fail closed; WWW-Authenticate + /.well-known/oauth-protected-resource
  • Stub tools: search_memory, write_memory with strict schemas; tenant from token org_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

On this page

0%