Implement the server-managed MCP server catalog HTTP API on top of the
OpenAPI spec and the `fabro-mcp-store` foundation, mirroring the
automations feature end to end.
- fabro-api: reuse the domain model as the wire contract via
`with_replacement` instead of parallel DTOs — `McpServer` →
`McpServerDefinition`, `CreateMcpServerRequest` → `McpServerDraft`,
`ReplaceMcpServerRequest` → `McpServerReplace`. The transport types
(`McpTransport`, `McpHttpProtocol`) are already mapped to the domain
`u64`/`u16` widths, so the spec's signed integer formats never leak.
Add identity + JSON-parity tests.
- fabro-types: derive serde on `McpServerDefinition` so it can serve as
the public response type.
- fabro-server: wire the `McpServerStore` into `AppState` (load from the
active config's `mcps/` directory) and add the
`list/create/get/replace/delete` handlers with ETag-on-201, required
`If-Match` on PUT/DELETE, and the same store-error → status mapping
automations uses (404/409/422/500). Register the routes.
- Regenerate the TypeScript Axios client against the merged spec.
Credential-literal validation (warn vs hard-reject for credential-looking
literal env/header values) is left intentionally unenforced behind a TODO;
that decision is still open.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>