Add service layer and MCP server with read tools
Slice 1: internal/service is the one capability layer both the HTTP API and the MCP server call (AGENT.md 1.7); /api/repos and /api/repo route through it. Slice 2: internal/mcp serves an MCP server over Streamable HTTP at /mcp (go-sdk v1.8.0) with read tools list_repos and get_repo as thin adapters over the service, plus a round-trip test. Enabled air polling so hot reload works across the Docker-on-Windows bind mount. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -52,3 +52,20 @@ Append-only running history of all changes (AGENT.md §9.1). Newest last.
|
||||
stop cluttering repos. Decisions locked: cooperative pull-first handoff; Gitea
|
||||
writes enabled (confirmed per §1.4); MCP over HTTP `/mcp`.
|
||||
- **Affects:** `AGENT.md`, `.env.example` (architecture/contract only — no code).
|
||||
|
||||
## 2026-09-19 — Service layer + MCP server (Claude integration, read tools)
|
||||
- **What:** Slice 1 — extracted `internal/service`, the one capability layer both
|
||||
the HTTP API and the MCP server call (§1.7); the `/api/repos` and `/api/repo`
|
||||
handlers now route through it. Slice 2 — added `internal/mcp`: an MCP server
|
||||
(`github.com/modelcontextprotocol/go-sdk` v1.8.0) served over Streamable HTTP at
|
||||
`/mcp`, with read tools `list_repos` and `get_repo` as thin adapters over the
|
||||
service. Added a round-trip test (`internal/mcp/mcp_test.go`) using a real temp
|
||||
git repo + the in-memory MCP transport. Verified the HTTP `/mcp` handshake
|
||||
locally and in Docker.
|
||||
- **Why:** First step of the two-way Claude integration (AGENT.md §8.1) — prove
|
||||
Claude can connect to the app over MCP before building deeper features on it.
|
||||
- **Affects:** `internal/service` (new), `internal/mcp` (new), `cmd/server/main.go`,
|
||||
`go.mod`/`go.sum`, `.air.toml`.
|
||||
- **Gotcha:** Docker-on-Windows bind mounts do NOT deliver filesystem events, so
|
||||
air's watch-based reload silently never fired. Fixed by enabling air polling
|
||||
(`poll = true`, `poll_interval = 500` in `.air.toml`).
|
||||
|
||||
Reference in New Issue
Block a user