Quill
Local MCP server that indexes compiled Java and Kotlin projects with their DI wiring and git history
Local git plus GitHub, GitLab, Gitea and Forgejo through one short, workflow-shaped tool set
By Abdelkader Boudih (individual) Rust Local · stdio Git and code hostingDevOps and monitoring
17 popularity score ★ 23
Opens the app, which asks before it adds the server.
cargo install skipperclaude mcp add skipper -- skipper{
"mcpServers": {
"skipper": {
"command": "skipper",
"args": []
}
}
}{
"mcpServers": {
"skipper": {
"command": "skipper",
"args": []
}
}
}{
"servers": {
"skipper": {
"type": "stdio",
"command": "skipper",
"args": []
}
}
}[mcp_servers.skipper]
command = "skipper"
args = []gemini mcp add --scope user skipper skipperGH_TOKEN secret |
Optional: GitHub token `gh auth token` hands over instead of its stored login. |
|---|
skipper is a Rust MCP server, run over stdio as the `skipper` binary, that works on the git repository it is started in. Local git operations (status, diff, log, show, blame, staging, committing, local branches) run in-process through the gitoxide library and touch no network. Forge features cover GitHub (REST and GraphQL), GitLab (through the `glab` CLI) and Gitea/Forgejo (REST), and are mostly about following work: CI run and pipeline status, waiting on a build or a PR's checks, and watching PRs for comments, reviews, pushes and merges.
It registers 20 tools, but shows only those the current checkout can use: forge tools appear when a remote points at that forge and its CLI is installed, new enough and logged in. Visibility is re-checked on every call, so adding or changing a remote takes effect without a restart. The git router goes further than the README says: `git_add` is only listed while the working tree has changes, and `git_commit` only while something is staged (src/mcp/git.rs). Much of the read side is offered as MCP resources rather than tools: the workspace, issues, a PR's merge-readiness, changed files, check matrix and full comment thread with bot noise stripped.
By default nothing it does reaches a remote: the four write tools (`pr_merge`, `git_push`, `git_pull`, `git_fetch`) stay hidden until `[writes] enabled = true` is set in the global config, and merges and pushes then ask the user for approval through the client unless `confirm = false`. The example config also documents a `[providers.<forge>] disabled = true` switch, not mentioned in the README, that hides a forge's tools whatever the remotes say. Gitea and Forgejo count as one forge there (skipper.example.toml).
| Runtime | A prebuilt binary |
|---|---|
| Runs on | Linux, macOS |
| GitHub | FreeOptional, for GitHub tools: uses the token from `gh auth login` |
| GitLab | FreeOptional, for GitLab tools: uses `glab auth login` |
| Gitea or Forgejo | Your own instanceOptional, for Gitea/Forgejo tools: uses the login saved by `tea login add` |
| Also |
|
The install script fetches a prebuilt binary for Linux or macOS on x86_64 or arm64 into ~/.local/bin. Building with `cargo install skipper` needs Rust 1.99 or newer. A forge CLI that is missing, too old or logged out only hides that forge's tools. The Gitea/Forgejo token needs the `read:issue` scope for issues.
Has no tools to create, delete, close or fork anything on a forge, and no issue or PR creation; `git_push` refuses force and delete refspecs, `git_pull` only fast-forwards. Writes need the global config and cannot be enabled from a repository's `skipper.toml`; with `confirm` on, a client without MCP elicitation is refused. PR watching, PR checks and `pr_merge` are GitHub only; Gitea/Forgejo get no CI tools. Issue and PR list resources return the last 30. Self-hosted forges must be mapped under `[hosts]`; only github.com, gitlab.com and codeberg.org are known out of the box.
Suits a developer who wants an assistant to inspect a local repository, commit locally, and follow CI and PR reviews across several forges without a large tool list, and who prefers forge writes off unless switched on with per-action approval. Pick a forge's own API-wide server instead if the assistant must open issues or PRs, manage releases or administer repositories, since skipper leaves those out on purpose. It is a personal project, not published by GitHub, GitLab or the Gitea/Forgejo projects, and it runs entirely on your machine.
13 only read, 6 change things, 1 can delete or overwrite. A ? marks an optional parameter.
repo_searchgh_repo_listglab_project_listbuild_statusbuild_watchpr_build_waitpr_watchpr_merge changesgit_push changesgit_pull changesgit_fetch changesgit_statusgit_diffscope: enumformat: enumcheck: booleanbase?: stringpaths?: arraygit_loglimit?: integerbranch?: stringgit_showrev?: stringgit_show_filefile_path: stringrev?: stringstart_line?: integerend_line?: integergit_blamefile_path: stringstart_line?: integerend_line?: integergit_add changespaths: arraygit_commit changesmessage: stringtrailers?: arrayamend?: booleangit_branch deletesoperation: enumname: stringstart_point?: stringforce?: booleanskipper://workspaceskipper://reposkipper://issues/{state}skipper://issue/{number}skipper://pr/{number}skipper://pr/{number}/filesskipper://pr/{number}/checksskipper://pr/{number}/commentsskipper://pr/{number}/comments/{kind}skipper://watch/comments/{kind}skipper://prs/{state}/{author}skipper://watch