GitHub issues as agent memory for Claude Code — hybrid retrieval over issues + discussions, no vector database
You already have a GitHub connector. This adds the semantic layer: the issues you use as scratchpads, ADRs, and RFC threads become retrievable by meaning.
Last tested: 2026-06-19 — @reneza/ats-mcp + @reneza/ats-adapter-github, GitHub REST 2022-11-28. See Changelog at the bottom.
If this saves you setup time, follow @renezander030 — practical AI / coding-agent infrastructure notes.
Full repo with the MCP server + adapter source: github.com/renezander030/agentic-task-system
| Goal | Use |
|---|---|
| GitHub issues in Claude Code | claude mcp add ats -e ATS_ADAPTER=@reneza/ats-adapter-github -- ats-mcp |
| Auth | fine-grained PAT (github_pat_…), Issues = Read on just the repos you grant |
| Scope repos | ATS_GITHUB_REPOS=owner/repo,owner/other |
Bad credentials / Not Found |
token wrong, or missing Issues:Read on that repo — see Common failures |
| Mapping | repo = project, issue/discussion = task (PRs filtered), labels = tags, body + comments = one record |
The official GitHub MCP server connects your agent to GitHub — open an issue, list issues, comment. It can't answer "what did we decide about the rate-limit regression?" across a repo's history, ranked by relevance. ATS adds hybrid retrieval (keyword + dense + sparse, fused with RRF) over your issues and discussions, body + comment thread folded into one record, so the first result is the right thread.
ATS is task-first: GitHub issues are supporting context for the task you're working — the decisions, the repro, the prior thread — fused in alongside your task manager, not a separate store.
npm install -g @reneza/ats-cli @reneza/ats-mcp @reneza/ats-adapter-github
export ATS_GITHUB_TOKEN=github_pat_xxxxxxxx
export ATS_GITHUB_REPOS=your-org/your-repo
ats config use @reneza/ats-adapter-github
ats find "rate limit regression" # verify from the CLI first
claude mcp add ats -e ATS_ADAPTER=@reneza/ats-adapter-github -- ats-mcpCreate a fine-grained PAT at https://github.com/settings/tokens?type=beta, grant it only the specific repos you want read, with Issues: Read (add Read and write only if you want the agent to file/update issues). That per-repo read-only scope is the blast-radius boundary — a leaked token can't reach the rest of your account.
Optional dense/hybrid branch (local, no hosted vector DB):
docker run -d --name qdrant -p 6333:6333 qdrant/qdrant:latest
docker run -d --name ollama -p 11434:11434 ollama/ollama:latest
docker exec ollama ollama pull nomic-embed-text
ats sync vectorToken is wrong, expired, or has no resource owner selected. Re-create the fine-grained PAT and confirm the org/owner is set.
A fine-grained PAT returns 404 (not 403) when it lacks access to that repo or the Issues: Read permission. Edit the token: add the repo under Repository access, set Issues → Read.
Authenticated REST is 5,000 req/hr. A cold corpus pull across big repos can spike it. Keep the corpus cache on (default) so warm finds don't re-fetch; the adapter honors Retry-After.
Too many requests in a short burst. The adapter backs off automatically; if you scripted a tight loop around bulkFetch, add a delay.
ats doctor # adapter github, login ok, repos listed
ats find "a phrase from a real issue" --limit 3 --json | jq '.tasks[].title'
claude mcp list # ats listed as connectedThen in Claude Code: "use ats find to pull the issue where we discussed ." Pass criteria: it cites issue number + title and returns a sources provenance array — pull requests excluded.
Same six-method adapter contract, different backend:
- Notion as agent memory for Claude Code
- TickTick MCP server for Claude Code & Claude Desktop
- Obsidian vault as agent memory for Claude Code
- Agent memory without a vector database — RRF over data you already curate
To query GitHub and Notion and your task app in one ranked result, use the composite adapter.
- ATS repo + adapter source: https://github.com/renezander030/agentic-task-system
- npm: https://www.npmjs.com/package/@reneza/ats-adapter-github
- GitHub REST (issues): https://docs.github.com/en/rest/issues
Wiring GitHub into Claude Code another way? Comment with: token type (fine-grained vs classic vs GitHub App), repos/issue count, and any error strings not listed here.
- Initial publication. Deliberate skips: no hardware matrix (not hardware-bound); no companion repo (source lives in agentic-task-system).