Skip to main content
Glama
nouhailadahmany

GitHub Prod MCP

README.md
# GitHub Prod MCP

Production-ready GitHub MCP server implemented in Python, based on the official GitHub REST API documentation at `https://docs.github.com/en/rest`.

## Features

- MCP stdio server for GitHub operations
- REST API wrapper exposing the same tools
- POST-only tool endpoints
- Request-body-only inputs for tool APIs
- Centralized validation with Pydantic models
- GitHub API version header support
- Timeout handling and normalized API errors
- Shared service layer for MCP and REST parity

## Implemented tools

- `get_authenticated_user`
- `create_repository`
- `get_repository`
- `get_repository_details`
- `list_branches`
- `get_branch`
- `list_repository_files`
- `get_file_content`
- `search_repositories`
- `search_code`
- `search_issues`
- `list_issues`
- `get_issue`
- `create_issue`
- `update_issue`
- `create_issue_comment`
- `list_pull_requests`
- `get_pull_request`
- `create_pull_request`
- `merge_pull_request`
- `get_commit`
- `compare_commits`
- `create_or_update_file`
- `append_to_file`
- `delete_file`
- `create_repository_dispatch`
- `trigger_workflow_dispatch`
- `list_workflow_runs`

## Project structure

- `src/github_prod_mcp/main.py` - MCP stdio server
- `src/github_prod_mcp/rest_api.py` - REST API wrapper
- `src/github_prod_mcp/github_api.py` - GitHub REST client
- `src/github_prod_mcp/service.py` - shared business layer
- `src/github_prod_mcp/models.py` - request and response schemas
- `src/github_prod_mcp/config.py` - environment-driven settings

## Requirements

- Python 3.10+
- A GitHub token with the scopes required for the operations you plan to use

## Setup

### 1. Create a virtual environment

PowerShell:

```powershell
python -m venv .venv
.venv\Scripts\Activate.ps1
```

### 2. Install dependencies

```powershell
python -m pip install --upgrade pip
python -m pip install -e .
```

### 3. Configure environment

Copy [`.env.example`](.env.example) to `.env` and set your token:

```env
GITHUB_TOKEN=ghp_your_token_here
GITHUB_API_BASE_URL=https://api.github.com
GITHUB_API_VERSION=2022-11-28
GITHUB_USER_AGENT=github-prod-mcp/0.1.0
GITHUB_TIMEOUT_SECONDS=30
REST_HOST=127.0.0.1
REST_PORT=8080
LOG_LEVEL=INFO
```

## Run the MCP server

```powershell
python -m github_prod_mcp.main
```

## Run the REST API

```powershell
python -m github_prod_mcp.rest_api
```

REST docs will be available at:

- `http://127.0.0.1:8080/docs`
- `http://127.0.0.1:8080/openapi.json`

## REST API design rule

All tool endpoints are exposed as `POST` endpoints under `/tools/...`.

For tool execution:
- no path variables
- no query variables
- inputs are passed in the JSON request body only

Examples:

### Get repository

```http
POST /tools/get_repository
Content-Type: application/json

{
  "owner": "octocat",
  "repo": "Hello-World"
}
```

### Get repository details

```http
POST /tools/get_repository_details
Content-Type: application/json

{
  "owner": "octocat",
  "repo": "Hello-World",
  "include_branches": true,
  "include_root_files": true,
  "include_readme": false
}
```

### List repository files

```http
POST /tools/list_repository_files
Content-Type: application/json

{
  "owner": "octocat",
  "repo": "Hello-World",
  "path": "",
  "ref": "main"
}
```

### Get file content metadata

```http
POST /tools/get_file_content
Content-Type: application/json

{
  "owner": "octocat",
  "repo": "Hello-World",
  "path": "README.md",
  "ref": "main"
}
```

### Create issue

```http
POST /tools/create_issue
Content-Type: application/json

{
  "owner": "octocat",
  "repo": "Hello-World",
  "title": "Bug report",
  "body": "Something is broken"
}
```

### Trigger workflow dispatch

```http
POST /tools/trigger_workflow_dispatch
Content-Type: application/json

{
  "owner": "octocat",
  "repo": "Hello-World",
  "workflow_id": "ci.yml",
  "ref": "main",
  "inputs": {
    "environment": "prod"
  }
}
```

### Append to file

```http
POST /tools/append_to_file
Content-Type: application/json

{
  "owner": "octocat",
  "repo": "Hello-World",
  "path": "README.md",
  "content": "\n\n## New Section\n\nThis content will be appended to the file.",
  "message": "Append new section to README"
}
```

## MCP registration

Update [`.bob/mcp.json`](../.bob/mcp.json) so Bob can launch the stdio server.

Example configuration:

```json
{
  "mcpServers": {
    "github-prod-mcp": {
      "command": "python",
      "args": [
        "-m",
        "github_prod_mcp.main"
      ],
      "cwd": "c:/Users/abdenourChenouf/Documents/MCP-Github/github-prod-mcp",
      "env": {
        "GITHUB_TOKEN": "YOUR_GITHUB_TOKEN",
        "GITHUB_API_BASE_URL": "https://api.github.com",
        "GITHUB_API_VERSION": "2022-11-28",
        "GITHUB_USER_AGENT": "github-prod-mcp/0.1.0",
        "GITHUB_TIMEOUT_SECONDS": "30",
        "LOG_LEVEL": "INFO"
      },
      "disabled": false,
      "alwaysAllow": [],
      "disabledTools": []
    }
  }
}
```

## Production notes

- Use a fine-grained GitHub token with least privilege
- Rotate tokens regularly
- Keep `.env` out of source control
- Run the REST API behind a reverse proxy for TLS and access control
- Add request authentication in front of the REST API before internet exposure
- Tune timeout and logging for your environment
- Add tests before deploying to shared environments

## Official API basis

This implementation follows GitHub REST API conventions including:
- `Accept: application/vnd.github+json`
- `Authorization: Bearer <token>`
- `X-GitHub-Api-Version: 2022-11-28`

Reference:
- `https://docs.github.com/en/rest`

TDQS

C2.3/5.0

Scored across 27 tools

Disambiguation4/5

Most tools have distinct purposes, but get_repository and get_repository_details overlap with similar descriptions, and list_issues vs search_issues could cause confusion.

Naming Consistency5/5

All tools follow verb_noun snake_case (e.g., create_issue, list_branches) with no mixing of conventions.

Tool Count2/5

27 tools exceed the 25+ threshold for 'too many', making the surface heavier than ideal for most agents.

Completeness3/5

Covers core repository, issue, PR, and workflow operations, but lacks update_pull_request, create_branch, and detailed workflow management.

Maintenance

ActivityInactive
ResponsivenessNo issues