Skip to main content
Glama
urahmank

pr-digest-mcp

by urahmank
README.md
# pr-digest-mcp

An MCP server that syncs your GitHub pull request and review activity in the
background and exposes it as tools Claude can call directly — so instead of
checking multiple repos by hand, you can ask "what's blocking me on GitHub
right now" or "summarize PR activity since Monday" and get a real answer.

## Why it's built this way

The server does **not** try to summarize anything itself. It syncs GitHub
state (PRs, review requests, submitted reviews, check status) into a local
SQLite database on a poll interval, and exposes that as structured MCP
tools. Claude — the MCP client — is the one that turns the structured data
into a natural-language answer. That keeps the backend's job to what a
backend is actually good at: integration, polling, normalizing, and state,
not reimplementing an LLM.

See [`pr-digest-mcp-plan.md`](../../claude/pr-digest-mcp-plan.md) (project
docs) for the full architecture and milestone plan.

## Tools exposed

| Tool | What it does |
| --- | --- |
| `list_pending_reviews` | Open PRs across tracked repos where a review is requested from you and not yet submitted. |
| `whats_blocking_me` | Open PRs you authored that have changes requested or failing checks. |
| `summarize_pr_activity(since)` | Structured PR/review/check activity updated after a given timestamp, freshly synced. |

## Setup

1. **Create a GitHub token.** A classic PAT with `repo` scope (or a
   fine-grained token with PR + metadata read access to the repos you want
   to track) at <https://github.com/settings/tokens>.

2. **Install dependencies and generate the Prisma client:**

   ```bash
   npm install
   npm run prisma:generate
   npm run prisma:migrate -- --name init
   ```

3. **Configure environment variables.** Copy `.env.example` to `.env` and
   fill in:

   - `GITHUB_TOKEN` — the token from step 1
   - `GITHUB_USERNAME` — your GitHub username (used to filter "requested
     from me" / "authored by me")
   - `TRACKED_REPOS` — comma-separated `owner/repo` list, e.g.
     `myorg/api,myorg/web`
   - `POLL_INTERVAL_MS` — how often to re-sync (default 2 minutes)

4. **Build:**

   ```bash
   npm run build
   ```

## Registering it with Claude

Add it to your MCP client config (Claude Desktop's `claude_desktop_config.json`,
or Claude Code's MCP settings) as a stdio server:

```json
{
  "mcpServers": {
    "pr-digest": {
      "command": "node",
      "args": ["/absolute/path/to/pr-digest-mcp/dist/main.js"],
      "env": {
        "GITHUB_TOKEN": "...",
        "GITHUB_USERNAME": "...",
        "TRACKED_REPOS": "owner/repo1,owner/repo2"
      }
    }
  }
}
```

Restart the client, then try asking: *"what's blocking me on GitHub right
now?"*

## Development

```bash
npm run start:dev   # watch mode
npm run lint
npm test
```

## Roadmap

Out of scope for v1, deliberately — see the project plan for the full list:
webhook-based real-time sync (needs a public endpoint), multi-user support,
richer per-event activity timelines (commits/comments, not just review
state), and a second transport (SSE/HTTP) alongside stdio.

## License

MIT