Provides comprehensive tools for managing GitHub issues, projects (ProjectsV2), labels, and assignees through GitHub's GraphQL API, including creating issues with embedded images, updating project item fields, and moving items between project columns.
Uses GitHub's GraphQL API for efficient data fetching and mutations when managing GitHub repositories, issues, and projects.
GitHub Project MCP Server
A Model Context Protocol (MCP) server for managing GitHub projects and issues using GitHub's GraphQL API.
Features
List, create, update, and delete (close) GitHub issues
Create issues with embedded images (upload local files or use URLs)
Add/remove labels and assignees from issues
List GitHub projects (ProjectsV2)
Add/remove issues from projects
Update project item fields (move between columns/status)
Get project items and fields
Get repository labels and user IDs
Full GraphQL API integration for efficient data fetching
Easy-to-use CLI with
gpscommand
Installation
From PyPI (Recommended)
From Source
For Development
From Wheel
Quick Start
Configure your GitHub token:
Test the connection:
Start the server:
CLI Commands
The gps command provides a comprehensive interface for managing the MCP server:
Server Management
Configuration
Utilities
Integration with AI Coding Assistants
Setup
The gps cli needs to be accessible from the system PATH, which typically means it should be installed globally or
in the active environment.
Option 1: Install globally with Python >=3.10
Option 2: Use absolute path to virtual environment (venv or miniconda)
Claude Desktop
Claude Desktop supports MCP servers natively. Configure it by editing the Claude Desktop configuration:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
Linux: ~/.config/Claude/claude_desktop_config.json
Add the following configuration:
Or if you've configured the token with gps config:
After adding the configuration, restart Claude Desktop. You'll see the GitHub tools available in the tools menu.
Cursor.ai
Cursor doesn't natively support MCP yet, but you can use the server as a local API:
Start the server as a daemon:
Create a wrapper script
cursor-github-helper.py:
Reference this in your Cursor rules or documentation for the AI to use.
Windsurf (Codeium)
Windsurf supports custom tools through its API integration:
Install the package globally:
Add to Windsurf's
~/.windsurf/config.json:
In Windsurf chat, you can now reference GitHub operations:
Visual Studio Code
For VS Code, you can integrate the MCP server through extensions or terminal commands:
Option 1: VS Code Tasks
Add to .vscode/tasks.json:
Option 2: VS Code Extension (Continue.dev)
If using Continue.dev extension for AI assistance:
Install Continue.dev extension
Add to
~/.continue/config.json:
Option 3: GitHub Copilot Chat
While GitHub Copilot doesn't directly support MCP, you can create command shortcuts:
Create a
.github/copilot-instructions.mdfile in your project:
Copilot will recognize these commands and can help you use them.
General Integration Pattern
For any IDE or assistant that doesn't natively support MCP, you can:
Install the package:
Start as a daemon:
Use the CLI programmatically:
Or use it in Python scripts:
Available Tools
Issue Management
list_issues: List issues in a repository
Parameters:
owner,repo,state(OPEN/CLOSED)
create_issue: Create a new issue
Parameters:
owner,repo,title,body,labels,assignees
create_issue_with_images: Create an issue with embedded images
Parameters:
owner,repo,title,body,images(array),labels,assigneesImages can be: local file paths, URLs, or objects with
path/urlandalttext
update_issue: Update an existing issue
Parameters:
issue_id,title,body,state,labels,assignees
delete_issue: Close an issue (GitHub doesn't support deletion)
Parameters:
issue_id
add_labels_to_issue: Add labels to an issue
Parameters:
issue_id,label_ids(array)
remove_labels_from_issue: Remove labels from an issue
Parameters:
issue_id,label_ids(array)
add_assignees_to_issue: Add assignees to an issue
Parameters:
issue_id,assignee_ids(array)
remove_assignees_from_issue: Remove assignees from an issue
Parameters:
issue_id,assignee_ids(array)
Project Management
list_projects: List projects in a repository
Parameters:
owner,repo
get_project_items: Get items in a project
Parameters:
project_id
add_issue_to_project: Add an issue to a project
Parameters:
project_id,issue_id
remove_issue_from_project: Remove an issue from a project
Parameters:
project_id,item_id
update_project_item_field: Update a project item's field (advanced)
Parameters:
project_id,item_id,field_id,value(option ID for single-select fields)
update_project_item_status: Update a project item's status (Todo, In Progress, Done, etc.)
Parameters:
project_id,item_id,status(status name as text)
get_project_fields: Get available fields in a project (including status options)
Parameters:
project_id
Utilities
get_repo_id: Get repository ID for GraphQL mutations
Parameters:
owner,repo
get_repository_labels: Get all labels in a repository with their IDs
Parameters:
owner,repo
get_user_id: Get a GitHub user's ID by username
Parameters:
username
Example Usage
List Open Issues
Create New Issue
Update Issue
Add Labels to Issue
Add Issue to Project
Update Issue Status in Project Board
Common status values: "Todo", "In Progress", "Done" (varies by project configuration)
Advanced: Update Project Field Directly
Note: For status fields, use update_project_item_status instead for easier usage
Create Issue with Images
Images are automatically uploaded to the repository and embedded in the issue body using Markdown
GraphQL API Benefits
This server uses GitHub's GraphQL API v4 instead of REST API v3, providing:
Efficient data fetching: Request only the fields you need
Fewer API calls: Get related data in a single request
Better performance: Reduced network overhead
Type safety: Strongly typed schema
Real-time capabilities: Support for subscriptions (future enhancement)
Requirements
Python 3.10+
GitHub Personal Access Token with appropriate permissions
Dependencies listed in
requirements.txt
License
MIT
Publishing to PyPI
Prerequisites
Install build tools:
Create PyPI account:
Register at https://pypi.org
Generate API token in account settings
Optionally, create TestPyPI account at https://test.pypi.org
Publishing Steps
Update version in
setup.pyorpyproject.tomlBuild the package:
Upload to TestPyPI (optional, for testing):
Username:
__token__Password: Your TestPyPI API token
Upload to PyPI:
Username:
__token__Password: Your PyPI API token
Verify installation:
Notes
Clean the
dist/directory between builds:rm -rf dist/Use semantic versioning (e.g., 0.1.0, 0.1.1, 1.0.0)
Ensure all tests pass before publishing
Consider using GitHub Actions for automated publishing
Contributing
Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.