#
tokens: 1505/50000 6/6 files
lines: off (toggle) GitHub
raw markdown copy
# Directory Structure

```
├── .gitignore
├── claude_desktop_config.json
├── main.py
├── pyproject.toml
├── README.md
└── requirements.txt
```

# Files

--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------

```
# Python-generated files
__pycache__/
*.py[oc]
build/
dist/
wheels/
*.egg-info

# Virtual environments
.venv
.env 

```

--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------

```markdown
# GitHub MCP Server

## Overview

GitHub MCP Server is an API-based tool that interacts with GitHub using the [MCP (Modular Command Processor)](https://github.com/mcp-framework) framework. It provides various functionalities, including fetching user details, repository information, and authenticated user data using GitHub's REST API.

This project is built using Python and leverages `httpx` for asynchronous API calls. It also uses `dotenv` for secure handling of GitHub authentication tokens.

## Features

- Fetch GitHub user information by username.
- Retrieve details of a GitHub repository.
- Get authenticated user details using a GitHub personal access token.
- Utilizes `FastMCP` for modular command processing.

## Project Structure
```bash
D:/MCP_Project/ 
|----.env
│----.gitignore
│----claude_desktop_config.json  (Create this file in C:\Users\your_username\AppData\Roaming\Claude\)
│----main.py
│----pyproject.toml
│----README.md
│----requirements.txt
```

<br>

- `main.py`: Core logic of the GitHub MCP Server.
- `.env`: Stores environment variables (e.g., GitHub Token).
- `claude_desktop_config.json`: Configuration for running the MCP Server.
- `requirements.txt`: Lists required dependencies.
- `explanation_video.mp4`: A video explaining the project.

## Setup Instructions

### Prerequisites

- Python >=3.10
- GitHub personal access token (for authenticated requests)
- `conda` or `venv` for virtual environment management

### Setup and Usage

1. **Clone the Repository**
   ```bash
   git clone https://github.com/DivyanshKushwaha/GitHub-MCP-Server-Claude.git
   cd GitHub-MCP-Server-Claude
   ```
2. **Create Python environment**
```bash 
python -m venv venv
source venv/bin/activate  
```

3. **Install Dependencies**
```bash
pip install -r requirements.txt
```

4. **Set Up Environment Variables (Create .env file)**
```bash
GITHUB_TOKEN=your_personal_access_token
```

5. **Setup claude_desktop_config.json**

```bash
{
    "mcpServers": {
        "MCP_Server": {
            "command": "my_env/Scripts/uv",
            "args": [
                "run",
                "D:/MCP_Project/main.py"
            ]
        }
    }
}
```

- The command key specifies the path to the uv script located in the conda environment. This is used to run the server.

- The args key provides additional arguments for the uv script:

    - "run": Indicates the action to run the server.
    - my_env : python environment 'my_env'
    - "D:/MCP_Project/main.py": Specifies the path to the main.py script, which contains the implementation of the MCP server.


6. **Launch the Claude Desktop Application**
- Open the Claude Desktop Application. 
- It will use the MCP Server as configured in the claude_desktop_config.json file to fetch and process data.
```

--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------

```
fastmcp
httpx
python-dotenv
uv

```

--------------------------------------------------------------------------------
/pyproject.toml:
--------------------------------------------------------------------------------

```toml
[project]
name = "mcp-server"
version = "0.1.0"
description = "Add your description here"
readme = "README.md"
requires-python = ">=3.10"
dependencies = []

```

--------------------------------------------------------------------------------
/claude_desktop_config.json:
--------------------------------------------------------------------------------

```json
{
    "mcpServers": {
        "MCP_Server": {
            "command": "D:/conda-envs/openaidemo/Scripts/uv",
            "args": [
                "run",
                "D:/Assignments/MCP_Server/main.py"
            ]
        }
    }
}

```

--------------------------------------------------------------------------------
/main.py:
--------------------------------------------------------------------------------

```python
from mcp.server.fastmcp import FastMCP
from dotenv import load_dotenv
import httpx
import os

# Load environment variables
load_dotenv()
GITHUB_TOKEN = os.getenv("GITHUB_TOKEN")

# Initialize MCP server
mcp = FastMCP("github")

# GitHub API base URL and headers
BASE_URL = "https://api.github.com"
HEADERS = {
    "Authorization": f"Bearer {GITHUB_TOKEN}",
    "Accept": "application/vnd.github.v3+json",
    "User-Agent": "mcp-github-server"
}


@mcp.tool()
async def get_user_info(username: str):
    """
    Fetches information about a GitHub user.

    Args:
        username: The username of the GitHub user.

    Returns:
        A dictionary containing user details.
    """
    url = f"{BASE_URL}/users/{username}"
    async with httpx.AsyncClient() as client:
        try:
            response = await client.get(url, headers=HEADERS)
            response.raise_for_status()
            return response.json()
        except httpx.HTTPStatusError as e:
            return {"error": str(e)}
        except httpx.TimeoutException:
            return {"error": "Request timed out"}


@mcp.tool()
async def get_repo_info(owner: str, repo: str):
    """
    Fetches information about a GitHub repository.

    Args:
        owner: The username of the repository owner.
        repo: The name of the repository.

    Returns:
        A dictionary containing repository details.
    """
    url = f"{BASE_URL}/repos/{owner}/{repo}"
    async with httpx.AsyncClient() as client:
        try:
            response = await client.get(url, headers=HEADERS)
            response.raise_for_status()
            return response.json()
        except httpx.HTTPStatusError as e:
            return {"error": str(e)}
        except httpx.TimeoutException:
            return {"error": "Request timed out"}


@mcp.tool()
async def get_authenticated_user():
    """
    Fetches information about the authenticated GitHub user.

    Returns:
        A dictionary containing the authenticated user's details.
    """
    url = f"{BASE_URL}/user"
    async with httpx.AsyncClient() as client:
        try:
            response = await client.get(url, headers=HEADERS)
            response.raise_for_status()
            return response.json()
        except httpx.HTTPStatusError as e:
            return {"error": str(e)}
        except httpx.TimeoutException:
            return {"error": "Request timed out"}


def main():
    print("Running MCP server for GitHub!")


if __name__ == "__main__":
    mcp.run(transport="stdio")





```