Skip to main content
Glama
SiwarKhalfaoui

github-changelog-mcp

README.md
# github-changelog-mcp

An [MCP](https://modelcontextprotocol.io) server that turns raw GitHub commit
history into a categorized, human-readable changelog — directly inside
Claude (or any MCP-compatible client).

```
You: "Generate a changelog for expressjs/express between v4.18.0 and v4.19.0"

Claude: [calls generate_changelog tool]

## expressjs/express: v4.18.0 → v4.19.0

### Features
- add support for X-Forwarded-Host header (`a1b2c3d`) — @wesleytodd

### Bug Fixes
- prevent ReDoS in query parser (`b2c3d4e`) — @cdoublev

### Chores
- bump path-to-regexp to 0.1.10 (`c3d4e5f`) — @dependabot
```

No paid APIs. No API keys required to get started (an optional free GitHub
token just raises the rate limit).

## Why this exists

Writing release notes by hand is tedious and usually done by skimming
`git log` and manually sorting commits into categories. This tool automates
that: it fetches the commit diff between two refs via GitHub's public REST
API, classifies each commit ([Conventional Commits](https://www.conventionalcommits.org/)
prefix first, keyword heuristics as a fallback), filters out merge-commit
noise, and renders clean grouped Markdown — as a tool Claude can call
directly in conversation.

## Tools

| Tool                 | Description                                                                                        |
| -------------------- | -------------------------------------------------------------------------------------------------- |
| `list_tags`          | List recent tags for a public repo (use this to find valid ref names)                              |
| `compare_refs`       | Raw commit diff between two refs, uncategorized                                                    |
| `generate_changelog` | The main tool — categorized Markdown changelog between two refs, with optional contributor summary |

## Setup

```bash
git clone https://github.com/SiwarKhalfaoui/github-changelog-mcp.git
cd github-changelog-mcp
npm install
npm run build
```

Optional — raise the GitHub API rate limit from 60/hr to 5,000/hr:

```bash
cp .env.example .env
# add a free token from https://github.com/settings/tokens (no scopes needed)
```

## Connect it to Claude Desktop

Add this to your Claude Desktop config
(`~/Library/Application Support/Claude/claude_desktop_config.json` on macOS,
`%APPDATA%\Claude\claude_desktop_config.json` on Windows):

```json
{
  "mcpServers": {
    "github-changelog": {
      "command": "node",
      "args": ["/absolute/path/to/github-changelog-mcp/build/index.js"],
      "env": {
        "GITHUB_TOKEN": "optional-token-here"
      }
    }
  }
}
```

Restart Claude Desktop. You should see a 🔨 tools icon confirming the server
connected — then just ask Claude to generate a changelog for any public repo.

## Development

```bash
npm run dev              # run directly with tsx, no build step
npm run test:changelog   # run the categorization logic test suite
```

## Architecture notes

- `src/github.ts` — thin GitHub REST API wrapper. No SDK dependency, just
  `fetch` + a shared header builder. Handles rate-limit errors explicitly
  and surfaces an actionable message (which token to add, when the limit
  resets) rather than a raw HTTP error.
- `src/changelog.ts` — the actual logic: Conventional Commits parsing with
  a keyword-based fallback for repos that don't use that convention, merge
  commit filtering, and Markdown rendering.
- `src/index.ts` — MCP server wiring (tool registration, schemas via `zod`,
  stdio transport).

Kept intentionally dependency-light — GitHub's REST API and MCP's official
SDK are the only two runtime dependencies. No frameworks, no ORMs, no
unnecessary abstraction for a tool this size.

## Possible extensions

- Group changelog entries by scope (`feat(auth): ...` → group under "Auth")
  in addition to type
- Compare against **unreleased** commits (`to_ref` = default branch) and
  suggest the next semver bump based on commit types present
- Cache `compareRefs` responses per (owner, repo, base, head) to reduce
  API calls on repeated queries in the same session

## License

MIT

TDQS

A4.3/5.0

Scored across 3 tools

Disambiguation5/5

Each tool has a distinct purpose: listing tags for reference, generating a categorized changelog, and showing a raw diff. There is no overlap or ambiguity.

Naming Consistency5/5

All tool names follow a consistent snake_case verb_noun pattern (list_tags, compare_refs, generate_changelog), making them predictable and easy to remember.

Tool Count5/5

Three tools is perfectly scoped for a changelog-focused server. Each tool serves a necessary step without bloat or deficiency.

Completeness5/5

The tool set covers the full workflow: listing available refs, generating a changelog, and providing a raw diff for verification. No obvious gaps for the declared purpose.

Maintenance

ActivityStale
ResponsivenessNo issues