Skip to main content
Glama

GitHub MCP

A GitHub MCP server for Claude and other MCP clients. No OAuth — it uses a GitHub Personal Access Token, protected by a shared bearer token so only your clients can reach it.

22 tools across repos, files, search, branches, commits, pull requests, issues, and releases.

Read SECURITY.md before deploying. This server exposes a PAT over HTTP. Anyone who can reach the URL and present the auth token inherits that token's access to your repositories.

Quick start

1. Create a GitHub PAT

https://github.com/settings/tokens?type=betaGenerate new token

Scopes: repo, read:org, read:user, workflow.

Prefer a fine-grained token limited to specific repositories — that is the strongest control available here, stronger than anything the server enforces.

2. Generate a server auth token

openssl rand -hex 32

This is the secret your MCP client presents to the server. It is not your GitHub PAT — keep the two separate.

3. Deploy

Any Node 20+ host or container platform works. Config is included for the common ones:

Platform

Cost

Setup

DO App Platform

smallest shared-CPU instance

doctl apps create --spec .do/app.yaml

DO Droplet

cheapest basic droplet

systemd + Caddy walkthrough

Render

free tier available

Blueprint — render.yaml

Fly / Railway / Koyeb

varies

Dockerfile

Any Docker host

docker build -t github-mcp .

Not compatible: Cloudflare Workers, Vercel/Netlify functions. Both need a long-lived process for sessions and SSE. See DEPLOYMENT.md.

Locally, or on any VM:

npm ci && npm run build
GITHUB_TOKEN=... MCP_AUTH_TOKEN=... npm start

The server refuses to start without a valid MCP_AUTH_TOKEN. That is deliberate — it never comes up unauthenticated.

Two settings matter on every platform:

  • TLS. The auth token is a bearer header on every request. Managed platforms terminate TLS for you; on a bare VM you must add a proxy that does.

  • TRUST_PROXY. 1 behind a proxy, 0 (the default) when Node is exposed directly. Wrong value silently disables rate limiting — details.

Run one instance — sessions are held in memory.

4. Connect your client

{
  "mcpServers": {
    "github": {
      "type": "http",
      "url": "https://your-app.onrender.com/mcp",
      "headers": { "Authorization": "Bearer YOUR_MCP_AUTH_TOKEN" }
    }
  }
}

If your client cannot send custom headers, set MCP_ALLOW_QUERY_TOKEN=true and append the token to the URL:

https://your-app.onrender.com/mcp?key=YOUR_MCP_AUTH_TOKEN

This is weaker — URLs end up in proxy logs, browser history, and referrer headers — so prefer the header wherever the client supports it.

Related MCP server: GitHub MCP Connector

Configuration

Variable

Required

Default

Purpose

GITHUB_TOKEN

yes

GitHub PAT the tools act with

MCP_AUTH_TOKEN

yes

Shared secret clients must present (min 32 chars)

MCP_READ_ONLY

no

false

Register read tools only; write tools are never exposed

ALLOWED_REPOS

no

(all)

Comma-separated owner/repo allowlist for repo-scoped tools

MCP_ALLOW_QUERY_TOKEN

no

false

Also accept the token as ?key=

ALLOWED_ORIGINS

no

(none)

Comma-separated browser origins allowed to call the server

RATE_LIMIT_PER_MINUTE

no

240

Per-IP request ceiling

MAX_SESSIONS

no

50

Concurrent session cap (LRU eviction)

SESSION_IDLE_MINUTES

no

30

Idle session timeout

TRUST_PROXY

no

0

Proxy hops to trust for client IPs. 1 behind a proxy

HOST

no

0.0.0.0

Bind address. 127.0.0.1 to expose only to a local proxy

PORT

no

8080

Listen port

See .env.example for a copyable template.

Security summary

  • Bearer auth on every MCP route, compared in constant time

  • Fail-closed startup — no token, no server

  • Origin allowlisting (DNS-rebinding defense) and CORS off by default

  • Brute-force limiting: 20 failed auth attempts per IP per 15 min

  • Bounded sessions with idle sweeping

  • Optional read-only mode and per-repo allowlisting

  • helmet headers, generic error responses

  • X-Forwarded-For ignored by default, so rate limiting cannot be spoofed past

Full detail and the hardening checklist: SECURITY.md.

Transports

  • Streamable HTTP (current): POST/GET/DELETE on /mcp

  • SSE (deprecated): GET /sse + POST /message

Sessions are held in memory, so run a single instance. Multiple replicas behind a load balancer will break sessions.

Development

npm ci
cp .env.example .env    # fill in GITHUB_TOKEN and MCP_AUTH_TOKEN
npm run dev

Docs

  • DEPLOYMENT.md — platform compatibility, DigitalOcean guides, TLS

  • SECURITY.md — threat model, controls, hardening checklist

License

MIT — see LICENSE.

A
license - permissive license
Not graded
quality - not tested
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Related MCP Servers

  • A
    license
    Not graded
    quality
    Not graded
    maintenance
    Connects Claude Desktop to GitHub repositories, enabling users to perform git operations and GitHub API interactions through natural conversation.
    467
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables to interact with GitHub repositories directly from Claude, supporting actions like viewing repos, checking status, committing and pushing changes, and managing pull requests.

View all related MCP servers

Related MCP Connectors

  • Connect AI assistants to GitHub - manage repos, issues, PRs, and workflows through natural language.

  • GitHub Private MCP Pack — access private repos, org data via OAuth.

  • GitHub MCP — wraps the GitHub public REST API (no auth required for public endpoints)

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/abdul-34/custom-github-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server