MCP server/version-control

git-steer MCP Server

Self-hosting GitHub autonomy engine.

★ 1ry-ops/git-steer ↗by ry-opsupdated
1

Add it to Claude Code

claude mcp add -e "GITHUB_APP_PRIVATE_KEY=${GITHUB_APP_PRIVATE_KEY}" -e "GITHUB_APP_ID=${GITHUB_APP_ID}" -e "GITHUB_INSTALLATION_ID=${GITHUB_INSTALLATION_ID}" git-steer -- npx -y git-steer
Required:GITHUB_APP_PRIVATE_KEYGITHUB_APP_IDGITHUB_INSTALLATION_ID
2

Make your agent remember this setup

git-steer's config, env vars, and the gotchas you hit — recalled in every future Claude Code, Cursor, and Codex session.

npx conare@latest

Free · one command · indexes the sessions already on disk. Set up in the browser instead →

What it does

  • Autonomous control over GitHub repositories, branches, and security alerts
  • Zero-local-footprint architecture using GitHub as the state database
  • Rate-limit-hardened API interactions with ETag caching and GraphQL batching
  • Ephemeral cloud-based execution for dependency fixes and linting
  • Audit logging and configuration management via a private state repository

Tools 5

repository_managementManage GitHub repositories including creation and configuration settings.
branch_operationsPerform branch management tasks such as creation, deletion, and protection.
pull_request_workflowsManage pull request lifecycles including creation and review automation.
security_scanningExecute security sweeps and manage alerts across repositories.
actions_managementControl and monitor GitHub Actions workflows.

Environment Variables

GITHUB_APP_PRIVATE_KEYrequiredPrivate key for the GitHub App authentication.
GITHUB_APP_IDrequiredThe ID of the GitHub App.
GITHUB_INSTALLATION_IDrequiredThe installation ID for the GitHub App.

Try it

List all repositories that currently have failing security alerts.
Create a new branch named 'feature/auth-update' in the main repository and enable branch protection.
Check the status of the latest GitHub Actions workflow runs and restart any that failed.
Summarize the open pull requests that have been waiting for review for more than 3 days.
Original README from ry-ops/git-steer

git-steer

Self-hosting GitHub autonomy engine. A skid steer for your repos.

git-steer gives you autonomous control over your GitHub account through a Model Context Protocol (MCP) server. Manage repos, branches, security, Actions -- everything -- through natural language. Rate-limit-hardened from the ground up: ETag caching, GraphQL batching, concurrency caps, and chunked execution keep it well inside GitHub's API guardrails at any fleet size.

Passed TAEM Phase 04 gate review after two remediation cycles covering security, architecture, and test coverage.

Philosophy: Zero Footprint

Your machine steers. GitHub does everything else.

Nothing lives locally -- no cloned repos, no config files, no build artifacts. git-steer treats your PC or Mac as a thin control plane and GitHub as the entire runtime.

  • Zero local code: No repos cloned, no node_modules, no lock files
  • Keychain only: GitHub App credentials in macOS Keychain -- nothing else on disk
  • Git as database: All config, state, and audit logs live in a private GitHub repo
  • Actions as compute: Dependency fixes, linting, and PRs happen in ephemeral cloud runners
  • Rate-limit-hardened: Throttle/retry plugins, ETag caching, GraphQL batching, concurrency caps -- safe at any fleet size
+-----------------------------------------------------------------+
|                        YOUR PC or MAC                           |
|                                                                 |
|   Keychain:                                                     |
|     - GitHub App private key                                    |
|     - App ID / Installation ID                                  |
|                                                                 |
|   $ npx git-steer                  (stdio -> Claude Desktop)    |
|   $ npx git-steer --http           (portal -> localhost:3333)   |
|         |                                                       |
|         +-> Pulls itself from ry-ops/git-steer                  |
|         +-> Pulls state from ry-ops/git-steer-state             |
|         +-> Runs MCP server in-memory (rate-limit-aware)        |
|         +-> Commits state changes back on shutdown              |
|                                                                 |
+-----------------------------------------------------------------+
                               |
                    Throttled, ETag-cached,
                    GraphQL-batched API calls
                               |
                               v
+-----------------------------------------------------------------+
|                         GITHUB                                  |
|                                                                 |
|   ry-ops/git-steer              (source of truth for code)      |
|   |                                                             |
|   ry-ops/git-steer-state        (private repo)                  |
|   +-- config/                                                   |
|   |   +-- policies.yaml         (branch protection templates)   |
|   |   +-- schedules.yaml        (job definitions)               |
|   |   +-- managed-repos.yaml    (what git-steer controls)       |
|   +-- state/                                                    |
|   |   +-- jobs.jsonl            (job history, append-only)      |
|   |   +-- audit.jsonl           (action log + rate telemetry)   |
|   |   +-- rfcs.jsonl            (RFC lifecycle tracking)        |
|   |   +-- quality.jsonl         (linter/SAST results)           |
|   |   +-- cache.json            (ETag map + sweep cursor)       |
|   +-- .github/workflows/                                        |
|       +-- heartbeat.yml         (scheduled triggers)            |
|                                                                 |
+-----------------------------------------------------------------+

Architecture

Tool Module System

The MCP server is split into per-domain tool modules under src/mcp/tools/. Each module exports getTools() (tool definitions) and handleCall() (tool execution). The server collects tools from all modules at startup and dispatches via a name-to-handler map.

src/mcp/
+-- server.ts            # MCP protocol, transport init, tool dispatch (~600 lines)
+-- permissions.ts       # Destructive tool registry, dry-run defaults
+-- tools/
    +-- index.ts         # Re-exports all domain modules
    +-- types.ts         # Shared ToolDeps interface
    +-- repos.ts         # Repository management (8 tools)
    +-- branches.ts      # Branch operations (3 tools)
    +-- prs.ts           # Pull request workflows (3 tools -- was 5 with dedup)
    +-- security.ts      # Security scanning and sweeps (7 tools)
    +-- actions.ts       # GitHub Actions (3 tools)
    +-- ops.ts           # Observability, co

Frequently Asked Questions

What are the key features of git-steer?

Autonomous control over GitHub repositories, branches, and security alerts. Zero-local-footprint architecture using GitHub as the state database. Rate-limit-hardened API interactions with ETag caching and GraphQL batching. Ephemeral cloud-based execution for dependency fixes and linting. Audit logging and configuration management via a private state repository.

What can I use git-steer for?

Automating repository security sweeps and alert remediation across an entire organization. Managing branch protection policies consistently across multiple repositories via natural language. Triggering and monitoring complex GitHub Actions workflows without manual dashboard interaction. Maintaining a clean repository state by automating routine maintenance tasks and PR lifecycle management.

How do I install git-steer?

Install git-steer by running: npx git-steer

What MCP clients work with git-steer?

git-steer works with any MCP-compatible client including Claude Desktop, Claude Code, Cursor, and other editors with MCP support.

Conare · memory for coding agents

Turn this server into reusable context

Keep git-steer docs, env vars, and workflow notes in Conare so your agent carries them across sessions.

Set up free$npx conare@latest