Personal GitHub MCP
Provides tools for interacting with GitHub, enabling repository management (list, create, summarize), project publishing, code and repository search, repository analysis and comparison, and uploading Project Euler solutions to a dedicated repository.
Provides optional integration with OpenAI-compatible APIs for generating README files for projects and Project Euler solutions.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Personal GitHub MCPpublish current project to my GitHub"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Personal GitHub MCP
A production-grade Model Context Protocol server that acts as a personal GitHub engineering assistant.
Instead of exposing raw GitHub API calls, it provides high-level tools that represent real user intentions — publish the project you are working in, upload a Project Euler solution with an auto-generated README, find where you used a library, or search your entire engineering memory.
Built with Python 3.12+, the official MCP Python SDK (v2), PyGithub, GitPython, Pydantic v2, and uv.
Features
Repository management — list, summarize, create, and inspect your repositories.
Publishing —
publish_current_projectpublishes the directory you are in with an auto-generated README and.gitignore;publish_project/backup_projectcover the rest.Project Euler flagship workflow —
publish_euler_solutiondetects the problem from the current directory, infers the language, generates a professional README (LLM or static analysis), and pushes both to your solutions repo.Search — GitHub code/repo search plus
search_my_engineering_memory, which ranks hits across your repositories, READMEs, architecture docs, and source code.Analysis — explain a repo in plain language, compare repos, recommend what to work on, detect stale repos, and summarize a local project's dependencies and architecture.
Structured, typed errors — the server never crashes; every failure is returned as a structured envelope.
Structured JSON logging with per-tool timing.
Every tool returns the same envelope:
{ "ok": true, "data": { ... } }or
{ "ok": false, "error": { "kind": "repository_not_found", "message": "..." } }Related MCP server: git-steer
Architecture
src/
├── server.py # MCP server assembly + tool registration wiring
├── main.py # CLI entry point (uv run personal-github-mcp)
├── config.py # Settings loaded from .env (pydantic-settings)
├── models.py # Pydantic response models for every tool
├── github_client.py # Thin PyGithub wrapper (exception mapping)
├── git_client.py # Thin GitPython wrapper (exception mapping)
├── dependencies.py # Service container / dependency wiring
├── tools/ # Tool registration only (thin, one concern per file)
│ ├── repo.py # repository listing/summary/create + reporting
│ ├── publish.py # publish_project, publish_current_project, backup_project
│ ├── search.py # search_code, search_repository, where_did_i_use,
│ │ # search_my_engineering_memory
│ ├── euler.py # upload_euler_solution, publish_euler_solution, update_progress
│ └── analyze.py # compare_repositories, dependency_summary, ...
├── services/ # Business logic (SOLID, no raw API calls here)
│ ├── github_service.py # core GitHub CRUD (list/summary/create/exists)
│ ├── report_service.py # statistics, explain, stale report, recommend, compare
│ ├── git_service.py # local git + project analysis
│ ├── search_service.py # code/repo search + engineering memory search
│ ├── euler_service.py # Project Euler detection, upload, publish, progress
│ ├── project_service.py # publish / backup workflows
│ ├── readme_service.py # README generation (static analysis + optional LLM)
│ ├── scaffold_service.py# README + .gitignore scaffolding for projects
│ └── llm_service.py # optional OpenAI-compatible client (never required)
└── utils/
├── logging.py # Structured JSON logging
└── errors.py # Typed errors + tool_handler decoratorLayering is strict:
tools (MCP registration only)
→ services (business logic, returns Pydantic models)
→ clients (PyGithub / GitPython wrappers, raise typed errors)
→ utils (shared errors + logging)This keeps tool files small, makes the business logic unit-testable, and keeps the server module free of implementation details. Services are dependency-injected and model-backed so they can be lifted straight into LangGraph agents later.
Installation
Prerequisites: Python 3.12+, git, and uv.
git clone <your-repo-url> personal-github-mcp
cd personal-github-mcp
# Install dependencies and the package (editable dev install)
uv sync --all-extras
# Configure secrets
cp .env.example .env
# edit .env and set GITHUB_TOKENConfiguration
Copy .env.example to .env and fill in at least GITHUB_TOKEN.
Variable | Required | Default | Description |
| yes | — | GitHub Personal Access Token (classic |
| no | token owner | Account used to scope searches/repo listing. |
| no |
| Repo that stores Project Euler solutions. |
| no |
| Visibility for new repos ( |
| no |
| Branch used when initializing new repos. |
| no |
| Author for local git commits. |
| no |
| Committer email for local commits. |
| no |
|
|
| no |
| Default result cap for list/search tools (1–100). |
| no | — | Optional OpenAI-compatible API key for LLM-generated READMEs ( |
| no |
| Base URL for an OpenAI-compatible |
| no |
| Model used for README generation ( |
Never commit
.env. It is git-ignored. If the token is missing at startup the server prints a clear message and exits with a non-zero code.README generation never fails without an LLM. When no
OPENAI_API_KEYis set (or the call fails), READMEs are generated deterministically from static analysis of the project/solution.
Tools
Repository
Tool | Description |
| List your repos, optionally filtered by |
| High-level summary: languages, topics, last commit, top-level structure. |
| Create a repo under your account (auto-initialized with a README). |
| Language breakdown, commits per author, open issues/PRs. |
| Plain-language explanation of what a repo is about. |
| Repos not pushed to for a while. |
| Ranked suggestions for what to work on next. |
Publishing
Tool | Description |
| Publish the current working directory. Detects the project, generates a README and |
| Publish a local directory as a new GitHub repo (init → commit → create repo → push). |
| Commit local changes and push to an existing repo (creates the repo only if no remote exists). |
Publishing handles every combination: existing repos, not-yet-created repos, repos with a remote, and repos without one.
Search
Tool | Description |
| GitHub code search. |
| GitHub repository search by name. |
| Find where you used a keyword in your own repos. |
| Search across your repositories, README files, architecture documentation, and source code, returning ranked results. |
Project Euler
Tool | Description |
| Flagship workflow. Detects the problem in the current directory (folders like |
| Upload a solution as |
| Solved problems, totals, and the next unsolved problem number. |
Generated Euler READMEs include: Problem Number, Problem Statement (placeholder — the official statement is copyright and cannot be reproduced), Approach, Complexity (time & space), Key Insights, and Files.
Analysis
Tool | Description |
| Compare two repos and summarize differences. |
| Detect and list a local project's dependencies. |
| Languages, structure, and entry points of a local project. |
Example usage
// publish the project you're currently in (detects cwd, writes README + .gitignore)
publish_current_project(description: "my notes app")
// → { "ok": true, "data": { "repository": "me/notes-app", "url": "https://github.com/me/notes-app",
// "created": true, "readme_generated": true, "gitignore_generated": true, ... } }
// flagship Project Euler workflow (run from inside "ProjectEuler/023/")
publish_euler_solution()
// → { "ok": true, "data": { "problem_number": 23, "path_in_repo": "problem_023/solution.py",
// "readme_url": "https://github.com/me/project-euler/...", ... } }
// search your entire engineering memory
search_my_engineering_memory(keyword: "sieve")
// → { "ok": true, "data": { "query": "\"sieve\" user:me", "items": [
// { "kind": "repository", "repository": "me/algo", ... },
// { "kind": "source", "repository": "me/algo", "path": "sieve.py", ... } ] } }
// publish a local project by path
publish_project(path: "/Users/me/projects/notes", repo_name: "notes", private: true)
// → { "ok": true, "data": { "repository": "me/notes", "url": "https://github.com/me/notes", "created": true, ... } }
// upload a Project Euler solution
upload_euler_solution(problem_number: 25, file_path: "/Users/me/euler/p025.py")
// → { "ok": true, "data": { "problem_number": 25, "path_in_repo": "problem_025/p025.py", ... } }Connecting from Claude Desktop
Add this to your Claude Desktop config (claude_desktop_config.json):
{
"mcpServers": {
"personal-github-mcp": {
"command": "uv",
"args": ["--directory", "/absolute/path/to/personal-github-mcp", "run", "personal-github-mcp"],
"env": {
"GITHUB_TOKEN": "ghp_xxxx"
}
}
}
}If your token is already in the project's .env, you can omit env — the server loads .env itself.
Connecting from Cursor
In Cursor, add an MCP server (Settings → MCP) with the stdio type:
{
"mcpServers": {
"personal-github-mcp": {
"type": "stdio",
"command": "uv",
"args": ["--directory", "/absolute/path/to/personal-github-mcp", "run", "personal-github-mcp"],
"env": {
"GITHUB_TOKEN": "ghp_xxxx"
}
}
}
}The same pattern works for other MCP clients (Claude Code, VS Code Copilot, etc.): point the client at uv --directory <path> run personal-github-mcp.
Screenshots
Area | Placeholder |
Claude Desktop tools |
|
|
|
Engineering memory search |
|
Troubleshooting
"GitHub token is required" and the server exits with code 2
Set GITHUB_TOKEN in .env (or export it) and retry. The server deliberately
refuses to start without a token.
publish_euler_solution says "No Project Euler problem detected"
The tool expects to run inside (or above) a folder named like 001,
problem_023, or ProjectEuler/023, and that folder must contain a recognized
source file (solution.py, main.cpp, etc.). Supported extensions: .py,
.cpp, .cc, .cxx, .c, .rs, .go, .js, .ts, .java, .rb, .cs,
.php, .swift, .kt, .hs, .lua, .zig, .ml.
"Git push failed"
A remote may point to a repository you cannot write to, or the branch has
diverged. Run git remote -v and git log to diagnose; backup_project is
the safe way to push to an existing remote.
GitHub API / rate-limit errors
GitHub rate limits apply. Wait and retry, or reduce limit/MAX_RESULTS.
Fine-grained tokens need read/write access to the repos you manage.
READMEs look generic
No LLM is configured, so READMEs come from static analysis. Set
OPENAI_API_KEY (and optionally OPENAI_BASE_URL/OPENAI_MODEL) to get
LLM-written READMEs. Any LLM failure falls back to static analysis silently.
Logs are JSON lines
Set LOG_LEVEL=DEBUG for more detail. Per-tool timing and error kinds are
logged to stderr.
Testing
uv run pytestThe suite covers GitHub services (with in-memory fakes), reporting/analysis services, git services (real repos in temp dirs, including pushes to a local bare remote), the full publish/backup workflows, Project Euler detection and publishing, README/.gitignore scaffolding, search, MCP tool registration and response envelopes.
Development
uv sync --all-extras # install everything
uv run ruff format src tests
uv run ruff check src tests
uv run pytestRoadmap
LangGraph integration — services are deliberately dependency-injected and model-backed so they can be lifted straight into LangGraph agents/nodes.
Project Euler templates — generate solution scaffolds per problem.
PR automation — raise pull requests from local branches.
SSE / HTTP transport — support
transport="streamable-http"for remote clients.Issues triage — list and label open issues across repositories.
Auth UX — OAuth device flow as an alternative to a PAT.
Fuzzy "where did I use" — tokenized search across clone history, not just the API.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseBqualityDmaintenanceEnables interaction with GitHub repositories, issues, pull requests, and code search through natural language. Supports self-hosted deployment with built-in analytics and flexible authentication options.34MIT
- Alicense-qualityAmaintenanceAn autonomous GitHub management engine that enables control over repositories, branches, security alerts, and Actions workflows through natural language. It utilizes a zero-local-footprint architecture by storing all configuration and audit logs within a private state repository on GitHub.1MIT
- Alicense-qualityBmaintenanceEnables AI agents to manage GitHub repositories, branches, issues, pull requests, releases, and actions through natural language.4425MIT
- Flicense-qualityBmaintenanceEnables AI agents to interact with GitHub via natural language, supporting repository management, issue tracking, file commits, and more.
Related MCP Connectors
Connect AI assistants to GitHub - manage repos, issues, PRs, and workflows through natural language.
Connect AI assistants to your GitHub-hosted Obsidian vault to seamlessly access, search, and analy…
An MCP server that gives your AI access to the source code and docs of all public github repos
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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/sam170203/personal-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server