GitHub Project Manager
Automate GitHub project management workflows using the GitHub MCP server to create issues, manage project boards, and track work items across repositories.
What I Do
- Create issues with full metadata (title, body, labels, assignees, milestones, type)
- List and discover Projects (v2) for users and organizations
- Add issues and pull requests to project boards
- Update project item fields (status, priority, custom fields)
- Move issues across project workflow states (Backlog → Ready → In Progress → Done)
- Query project items and filter by criteria
- Link related issues and manage project board organization
When to Use Me
- Create, generate, or open a new GitHub issue
- Add an issue or pull request to a project board
- Move an issue from Backlog to Ready (or any status transition)
- Set up a new project board with initial issues
- Update issue status, priority, or custom fields in a project
- Query project board items or check project structure
- Automate project management workflows
- Organize repository work items across multiple projects
Prerequisites
The GitHub MCP server must be configured with the following toolsets enabled:
issues - For creating and managing issues
projects - For project board operations
repos - For repository context
Authentication via GITHUB_PERSONAL_ACCESS_TOKEN with scopes:
repo - Full repository access
project - Full project access
Core Workflows
1. Create an Issue
TASK: Create a new issue in owner/repo
STEPS:
1. Use mcp__github__issue_write with method="create" and:
- owner: Repository owner (user or org)
- repo: Repository name
- title: Clear, concise issue title
- body: Detailed description (supports Markdown)
- labels: Array of label names (optional)
- assignees: Array of usernames (optional)
- milestone: Milestone number (optional)
- type: Issue type if custom types are configured (optional)
2. Capture the returned issue number and ID for subsequent operations
EXAMPLE:
mcp__github__issue_write(
method="create",
owner="myorg",
repo="myrepo",
title="Add user authentication feature",
body="Implement OAuth2 login with Google and GitHub providers...",
labels=["enhancement", "backend"],
assignees=["username"],
type="Feature"
)
Key Points:
- Issue ID (returned field) is needed for project operations, NOT issue number
- Labels must exist in the repository beforehand
- Assignees must have repository access
- Type field only works if repository has custom issue types configured
2. Find Projects for a User or Organization
TASK: List all projects for a user or organization
STEPS:
1. Use mcp__github__projects_list with method="list_projects" and:
- owner_type: "user" or "org"
- owner: GitHub username or organization name
- per_page: Number of results (default 30, max 100)
- query: Optional search query to filter by title/description
2. Review returned projects array for:
- number: Project number (used in subsequent calls)
- title: Project name
- shortDescription: Project description
- id: Internal project ID
EXAMPLE:
mcp__github__projects_list(
method="list_projects",
owner_type="org",
owner="myorg",
query="roadmap"
)
Returns projects matching "roadmap" in title or description
Key Points:
- Projects are GitHub Projects v2 (modern project boards)
- User-owned projects use
owner_type="user"
- Organization projects use
owner_type="org"
- Project number is visible in URL:
github.com/orgs/myorg/projects/5 → number is 5
3. Add an Issue to a Project
TASK: Add an existing issue to a project board
STEPS:
1. Get the issue ID from mcp__github__issue_write (method="create") or mcp__github__issue_read
(ID is different from issue number!)
2. Use mcp__github__projects_write with method="add_project_item" and:
- owner_type: "user" or "org"
- owner: Project owner
- project_number: Project number from URL or list_projects
- item_type: "issue" or "pull_request"
- item_id: Numeric issue ID (NOT issue number)
3. Capture the returned project item ID for status updates
EXAMPLE:
# First get issue details to obtain ID
issue = mcp__github__issue_read(
method="get",
owner="myorg",
repo="myrepo",
issue_number=42
)
issue_id = issue.node_id # Extract numeric ID from node_id
# Then add to project
mcp__github__projects_write(
method="add_project_item",
owner_type="org",
owner="myorg",
project_number=5,
item_type="issue",
item_id=issue_id
)
Critical Distinction:
- Issue Number: Visible in UI (#42) - used for mcp__github__issue_read, mcp__github__issue_write (method="update")
- Issue ID: Internal identifier - used for mcp__github__projects_write (method="add_project_item")
4. Get Project Structure and Fields
TASK: Understand project board structure before updating items
STEPS:
1. Use mcp__github__projects_get with method="get_project" to see project metadata:
mcp__github__projects_get(
method="get_project",
owner_type="org",
owner="myorg",
project_number=5
)
2. Use mcp__github__projects_list with method="list_project_fields" to see available fields:
mcp__github__projects_list(
method="list_project_fields",
owner_type="org",
owner="myorg",
project_number=5
)
Returns fields like:
- Status (single_select with options: Backlog, Ready, In Progress, Done)
- Priority (single_select with options: High, Medium, Low)
- Custom fields specific to your project
3. Note the field IDs and option IDs for update operations
Key Information:
- Status field typically has options: Backlog, Ready, In Progress, Done, Closed
- Field IDs are required for update operations
- Option IDs specify which value to set (e.g., "Ready" vs "In Progress")
5. Update Issue Status in Project (Move Between Columns)
TASK: Move an issue from Backlog to Ready (or any status transition)
STEPS:
1. Get project fields to find Status field ID and option IDs:
fields = mcp__github__projects_list(
method="list_project_fields",
owner_type="org",
owner="myorg",
project_number=5
)
status_field = find field where name="Status"
ready_option_id = find option where name="Ready"
2. Get the project item ID (different from issue ID!):
items = mcp__github__projects_list(
method="list_project_items",
owner_type="org",
owner="myorg",
project_number=5
)
project_item_id = find item matching your issue
3. Update the project item field:
mcp__github__projects_write(
method="update_project_item",
owner_type="org",
owner="myorg",
project_number=5,
item_id=project_item_id,
field_id=status_field.id,
value=ready_option_id
)
Important Notes:
- Three different IDs in play: Issue ID, Project Item ID, Field/Option IDs
- Project Item ID is returned when you add an issue to a project
- Use mcp__github__projects_get (method="get_project_item") to retrieve current state before updating
Complete Example: End-to-End Workflow
SCENARIO: Create issue, add to project board, set to "Ready" status
STEP 1: Create the issue
issue = mcp__github__issue_write(
method="create",
owner="myorg",
repo="backend-api",
title="Implement rate limiting middleware",
body="Add Express middleware for API rate limiting...",
labels=["enhancement", "security"],
assignees=["backend-dev"]
)
→ Returns: issue_number=42, issue_id=123456
STEP 2: Find the project
projects = mcp__github__projects_list(
method="list_projects",
owner_type="org",
owner="myorg"
)
→ Find project: "Q1 Roadmap" has project_number=5
STEP 3: Add issue to project
project_item = mcp__github__projects_write(
method="add_project_item",
owner_type="org",
owner="myorg",
project_number=5,
item_type="issue",
item_id=123456 # Use issue_id from Step 1
)
→ Returns: project_item_id=789
STEP 4: Get project fields
fields = mcp__github__projects_list(
method="list_project_fields",
owner_type="org",
owner="myorg",
project_number=5
)
→ Status field: id=field_abc, options=[{id: opt_1, name: "Backlog"}, {id: opt_2, name: "Ready"}]
STEP 5: Move to "Ready" status
mcp__github__projects_write(
method="update_project_item",
owner_type="org",
owner="myorg",
project_number=5,
item_id=789, # project_item_id from Step 3
field_id="field_abc",
value="opt_2" # Ready option ID
)
→ Issue now shows in "Ready" column on project board
Quick Decision Matrix
| Need |
GitHub MCP Tool |
| Create a new issue |
mcp__github__issue_write (method="create") |
| Update an existing issue |
mcp__github__issue_write (method="update") |
| Get issue details (to obtain ID) |
mcp__github__issue_read (method="get") |
| List user/org projects |
mcp__github__projects_list (method="list_projects") |
| Get project details |
mcp__github__projects_get (method="get_project") |
| See project fields (Status, Priority) |
mcp__github__projects_list (method="list_project_fields") |
| Get specific field details |
mcp__github__projects_get (method="get_project_field") |
| List items in project |
mcp__github__projects_list (method="list_project_items") |
| Get specific project item |
mcp__github__projects_get (method="get_project_item") |
| Add issue/PR to project |
mcp__github__projects_write (method="add_project_item") |
| Update issue status/fields |
mcp__github__projects_write (method="update_project_item") |
| Remove item from project |
mcp__github__projects_write (method="delete_project_item") |
Common Errors
| Error |
Cause |
Solution |
| "Resource not accessible by integration" |
Missing project scope in PAT |
Regenerate token with project scope enabled |
| "Could not resolve to a node with the global id" |
Using issue number instead of issue ID |
Use mcp__github__issue_read (method="get") to obtain node_id/ID |
| "Field not found on ProjectV2" |
Invalid field_id |
Run mcp__github__projects_list (method="list_project_fields") to get current field IDs |
| "Project not found" |
Wrong project_number or owner |
Verify project number from URL or list_projects |
| "Item already exists in project" |
Issue already added |
Check mcp__github__projects_list (method="list_project_items") before adding |
ID Reference Guide
GitHub has multiple identifier types - use the correct one:
| ID Type |
Example |
Used For |
Obtained From |
| Issue Number |
42 |
UI display, get/update issue |
Visible in URL/UI |
| Issue ID (node_id) |
I_kwDOAbc123 |
Adding to projects |
mcp__github__issue_read (method="get") response |
| Project Number |
5 |
All project operations |
Project URL or mcp__github__projects_list (method="list_projects") |
| Project Item ID |
789 |
Updating item fields |
mcp__github__projects_write (method="add_project_item") response |
| Field ID |
field_abc |
Updating field values |
mcp__github__projects_list (method="list_project_fields") |
| Option ID |
opt_1 |
Setting field value |
Field options in list_project_fields |
Batch Operations Pattern
TASK: Add multiple issues to a project and set status
FOR EACH issue_number IN [42, 43, 44, 45]:
1. issue = mcp__github__issue_read(method="get", owner=owner, repo=repo, issue_number=issue_number)
2. project_item = mcp__github__projects_write(method="add_project_item", owner_type=owner_type, owner=owner, project_number=project_number, item_type="issue", item_id=issue.id)
3. mcp__github__projects_write(method="update_project_item", owner_type=owner_type, owner=owner, project_number=project_number, item_id=project_item.id, field_id=status_field_id, value=ready_option_id)
OPTIMIZATION:
- Retrieve field IDs once before loop
- Handle errors per-issue to continue batch
- Log successful additions and failures
GraphQL Fallback
If GitHub MCP server project tools are unavailable, use the GitHub GraphQL API v4 directly. See references/graphql-fallback.md for complete query patterns, prerequisites, the full end-to-end workflow, MCP-to-GraphQL mapping, and debugging tips.
Integration with Other Skills
| Skill |
Integration Point |
| github-actions |
Create issues from workflow failures; update project status in CI |
| markdown-editor |
Format issue bodies with proper Markdown templates |
Related GitHub MCP Tools
| Tool Category |
MCP Tool (with method) |
| Issue Management |
mcp__github__issue_write (create, update), mcp__github__issue_read (get), mcp__github__list_issues |
| Project Discovery |
mcp__github__projects_list (list_projects), mcp__github__projects_get (get_project) |
| Project Fields |
mcp__github__projects_list (list_project_fields), mcp__github__projects_get (get_project_field) |
| Project Items |
mcp__github__projects_write (add_project_item, update_project_item, delete_project_item), mcp__github__projects_list (list_project_items), mcp__github__projects_get (get_project_item) |
Context7 Integration
For current GitHub Projects API documentation:
1. context7_resolve-library-id with query="github projects api"
2. context7_query-docs with:
- libraryId="/github/docs" or resolved library
- query="projects v2 graphql" or "managing project items"
Best Practices
- Always retrieve IDs before operations: Issue ID ≠ Issue Number, Project Item ID ≠ Issue ID
- Cache field mappings: Project fields don't change frequently - retrieve once per session
- Error handling: Check if item already exists in project before adding
- Status workflow: Respect project workflow (Backlog → Ready → In Progress → Done)
- Batch updates: When updating multiple items, get field IDs once
- Validation: Verify project and field existence before attempting updates
References
1---2name: github-project-manager3description: Manage, configure, generate, validate, and set up GitHub Projects (v2) with issue creation, project discovery, adding items to projects, and updating issue status across project boards. Capabilities include creating issues with metadata (labels, assignees, milestones), listing projects for users/orgs, adding issues/PRs to projects, updating project item fields (status, priority), and managing project workflows (Backlog, Ready, In Progress, Done). Use GraphQL fallback, node IDs, MCP server tools, and batch operations for project item automation. Use when creating GitHub issues, managing project boards, moving issues between project columns, organizing repository work items, tracking project progress, automating GitHub project workflows, or integrating project boards with CI/CD pipelines.4license: MIT5---67# GitHub Project Manager89Automate GitHub project management workflows using the GitHub MCP server to create issues, manage project boards, and track work items across repositories.1011## What I Do1213- Create issues with full metadata (title, body, labels, assignees, milestones, type)14- List and discover Projects (v2) for users and organizations15- Add issues and pull requests to project boards16- Update project item fields (status, priority, custom fields)17- Move issues across project workflow states (Backlog → Ready → In Progress → Done)18- Query project items and filter by criteria19- Link related issues and manage project board organization2021## When to Use Me2223- Create, generate, or open a new GitHub issue24- Add an issue or pull request to a project board25- Move an issue from Backlog to Ready (or any status transition)26- Set up a new project board with initial issues27- Update issue status, priority, or custom fields in a project28- Query project board items or check project structure29- Automate project management workflows30- Organize repository work items across multiple projects3132## Prerequisites3334The GitHub MCP server must be configured with the following toolsets enabled:35- `issues` - For creating and managing issues36- `projects` - For project board operations37- `repos` - For repository context3839Authentication via `GITHUB_PERSONAL_ACCESS_TOKEN` with scopes:40- `repo` - Full repository access41- `project` - Full project access4243## Core Workflows4445### 1. Create an Issue4647```markdown48TASK: Create a new issue in owner/repo4950STEPS:511. Use mcp__github__issue_write with method="create" and:52 - owner: Repository owner (user or org)53 - repo: Repository name54 - title: Clear, concise issue title55 - body: Detailed description (supports Markdown)56 - labels: Array of label names (optional)57 - assignees: Array of usernames (optional)58 - milestone: Milestone number (optional)59 - type: Issue type if custom types are configured (optional)60612. Capture the returned issue number and ID for subsequent operations6263EXAMPLE:64mcp__github__issue_write(65 method="create",66 owner="myorg",67 repo="myrepo",68 title="Add user authentication feature",69 body="Implement OAuth2 login with Google and GitHub providers...",70 labels=["enhancement", "backend"],71 assignees=["username"],72 type="Feature"73)74```7576**Key Points:**77- Issue ID (returned field) is needed for project operations, NOT issue number78- Labels must exist in the repository beforehand79- Assignees must have repository access80- Type field only works if repository has custom issue types configured8182### 2. Find Projects for a User or Organization8384```markdown85TASK: List all projects for a user or organization8687STEPS:881. Use mcp__github__projects_list with method="list_projects" and:89 - owner_type: "user" or "org"90 - owner: GitHub username or organization name91 - per_page: Number of results (default 30, max 100)92 - query: Optional search query to filter by title/description93942. Review returned projects array for:95 - number: Project number (used in subsequent calls)96 - title: Project name97 - shortDescription: Project description98 - id: Internal project ID99100EXAMPLE:101mcp__github__projects_list(102 method="list_projects",103 owner_type="org",104 owner="myorg",105 query="roadmap"106)107108Returns projects matching "roadmap" in title or description109```110111**Key Points:**112- Projects are GitHub Projects v2 (modern project boards)113- User-owned projects use `owner_type="user"`114- Organization projects use `owner_type="org"`115- Project **number** is visible in URL: `github.com/orgs/myorg/projects/5` → number is `5`116117### 3. Add an Issue to a Project118119```markdown120TASK: Add an existing issue to a project board121122STEPS:1231. Get the issue ID from mcp__github__issue_write (method="create") or mcp__github__issue_read124 (ID is different from issue number!)1251262. Use mcp__github__projects_write with method="add_project_item" and:127 - owner_type: "user" or "org"128 - owner: Project owner129 - project_number: Project number from URL or list_projects130 - item_type: "issue" or "pull_request"131 - item_id: Numeric issue ID (NOT issue number)1321333. Capture the returned project item ID for status updates134135EXAMPLE:136# First get issue details to obtain ID137issue = mcp__github__issue_read(138 method="get",139 owner="myorg",140 repo="myrepo",141 issue_number=42142)143issue_id = issue.node_id # Extract numeric ID from node_id144145# Then add to project146mcp__github__projects_write(147 method="add_project_item",148 owner_type="org",149 owner="myorg",150 project_number=5,151 item_type="issue",152 item_id=issue_id153)154```155156**Critical Distinction:**157- **Issue Number**: Visible in UI (#42) - used for mcp__github__issue_read, mcp__github__issue_write (method="update")158- **Issue ID**: Internal identifier - used for mcp__github__projects_write (method="add_project_item")159160### 4. Get Project Structure and Fields161162```markdown163TASK: Understand project board structure before updating items164165STEPS:1661. Use mcp__github__projects_get with method="get_project" to see project metadata:167 mcp__github__projects_get(168 method="get_project",169 owner_type="org",170 owner="myorg",171 project_number=5172 )1731742. Use mcp__github__projects_list with method="list_project_fields" to see available fields:175 mcp__github__projects_list(176 method="list_project_fields",177 owner_type="org",178 owner="myorg",179 project_number=5180 )181182 Returns fields like:183 - Status (single_select with options: Backlog, Ready, In Progress, Done)184 - Priority (single_select with options: High, Medium, Low)185 - Custom fields specific to your project1861873. Note the field IDs and option IDs for update operations188```189190**Key Information:**191- Status field typically has options: Backlog, Ready, In Progress, Done, Closed192- Field IDs are required for update operations193- Option IDs specify which value to set (e.g., "Ready" vs "In Progress")194195### 5. Update Issue Status in Project (Move Between Columns)196197```markdown198TASK: Move an issue from Backlog to Ready (or any status transition)199200STEPS:2011. Get project fields to find Status field ID and option IDs:202 fields = mcp__github__projects_list(203 method="list_project_fields",204 owner_type="org",205 owner="myorg",206 project_number=5207 )208 status_field = find field where name="Status"209 ready_option_id = find option where name="Ready"2102112. Get the project item ID (different from issue ID!):212 items = mcp__github__projects_list(213 method="list_project_items",214 owner_type="org",215 owner="myorg",216 project_number=5217 )218 project_item_id = find item matching your issue2192203. Update the project item field:221 mcp__github__projects_write(222 method="update_project_item",223 owner_type="org",224 owner="myorg",225 project_number=5,226 item_id=project_item_id,227 field_id=status_field.id,228 value=ready_option_id229 )230```231232**Important Notes:**233- Three different IDs in play: Issue ID, Project Item ID, Field/Option IDs234- Project Item ID is returned when you add an issue to a project235- Use mcp__github__projects_get (method="get_project_item") to retrieve current state before updating236237## Complete Example: End-to-End Workflow238239```markdown240SCENARIO: Create issue, add to project board, set to "Ready" status241242STEP 1: Create the issue243issue = mcp__github__issue_write(244 method="create",245 owner="myorg",246 repo="backend-api",247 title="Implement rate limiting middleware",248 body="Add Express middleware for API rate limiting...",249 labels=["enhancement", "security"],250 assignees=["backend-dev"]251)252→ Returns: issue_number=42, issue_id=123456253254STEP 2: Find the project255projects = mcp__github__projects_list(256 method="list_projects",257 owner_type="org",258 owner="myorg"259)260→ Find project: "Q1 Roadmap" has project_number=5261262STEP 3: Add issue to project263project_item = mcp__github__projects_write(264 method="add_project_item",265 owner_type="org",266 owner="myorg",267 project_number=5,268 item_type="issue",269 item_id=123456 # Use issue_id from Step 1270)271→ Returns: project_item_id=789272273STEP 4: Get project fields274fields = mcp__github__projects_list(275 method="list_project_fields",276 owner_type="org",277 owner="myorg",278 project_number=5279)280→ Status field: id=field_abc, options=[{id: opt_1, name: "Backlog"}, {id: opt_2, name: "Ready"}]281282STEP 5: Move to "Ready" status283mcp__github__projects_write(284 method="update_project_item",285 owner_type="org",286 owner="myorg",287 project_number=5,288 item_id=789, # project_item_id from Step 3289 field_id="field_abc",290 value="opt_2" # Ready option ID291)292→ Issue now shows in "Ready" column on project board293```294295## Quick Decision Matrix296297| Need | GitHub MCP Tool |298|------|-----------------|299| Create a new issue | `mcp__github__issue_write` (method="create") |300| Update an existing issue | `mcp__github__issue_write` (method="update") |301| Get issue details (to obtain ID) | `mcp__github__issue_read` (method="get") |302| List user/org projects | `mcp__github__projects_list` (method="list_projects") |303| Get project details | `mcp__github__projects_get` (method="get_project") |304| See project fields (Status, Priority) | `mcp__github__projects_list` (method="list_project_fields") |305| Get specific field details | `mcp__github__projects_get` (method="get_project_field") |306| List items in project | `mcp__github__projects_list` (method="list_project_items") |307| Get specific project item | `mcp__github__projects_get` (method="get_project_item") |308| Add issue/PR to project | `mcp__github__projects_write` (method="add_project_item") |309| Update issue status/fields | `mcp__github__projects_write` (method="update_project_item") |310| Remove item from project | `mcp__github__projects_write` (method="delete_project_item") |311312## Common Errors313314| Error | Cause | Solution |315|-------|-------|----------|316| "Resource not accessible by integration" | Missing `project` scope in PAT | Regenerate token with `project` scope enabled |317| "Could not resolve to a node with the global id" | Using issue number instead of issue ID | Use `mcp__github__issue_read` (method="get") to obtain node_id/ID |318| "Field not found on ProjectV2" | Invalid field_id | Run `mcp__github__projects_list` (method="list_project_fields") to get current field IDs |319| "Project not found" | Wrong project_number or owner | Verify project number from URL or `list_projects` |320| "Item already exists in project" | Issue already added | Check `mcp__github__projects_list` (method="list_project_items") before adding |321322## ID Reference Guide323324GitHub has multiple identifier types - use the correct one:325326| ID Type | Example | Used For | Obtained From |327|---------|---------|----------|---------------|328| Issue Number | `42` | UI display, get/update issue | Visible in URL/UI |329| Issue ID (node_id) | `I_kwDOAbc123` | Adding to projects | `mcp__github__issue_read` (method="get") response |330| Project Number | `5` | All project operations | Project URL or `mcp__github__projects_list` (method="list_projects") |331| Project Item ID | `789` | Updating item fields | `mcp__github__projects_write` (method="add_project_item") response |332| Field ID | `field_abc` | Updating field values | `mcp__github__projects_list` (method="list_project_fields") |333| Option ID | `opt_1` | Setting field value | Field options in `list_project_fields` |334335## Batch Operations Pattern336337```markdown338TASK: Add multiple issues to a project and set status339340FOR EACH issue_number IN [42, 43, 44, 45]:341 1. issue = mcp__github__issue_read(method="get", owner=owner, repo=repo, issue_number=issue_number)342 2. project_item = mcp__github__projects_write(method="add_project_item", owner_type=owner_type, owner=owner, project_number=project_number, item_type="issue", item_id=issue.id)343 3. mcp__github__projects_write(method="update_project_item", owner_type=owner_type, owner=owner, project_number=project_number, item_id=project_item.id, field_id=status_field_id, value=ready_option_id)344345OPTIMIZATION:346- Retrieve field IDs once before loop347- Handle errors per-issue to continue batch348- Log successful additions and failures349```350351## GraphQL Fallback352353If GitHub MCP server project tools are unavailable, use the GitHub GraphQL API v4 directly. See [references/graphql-fallback.md](references/graphql-fallback.md) for complete query patterns, prerequisites, the full end-to-end workflow, MCP-to-GraphQL mapping, and debugging tips.354355## Integration with Other Skills356357| Skill | Integration Point |358|-------|-------------------|359| github-actions | Create issues from workflow failures; update project status in CI |360| markdown-editor | Format issue bodies with proper Markdown templates |361362## Related GitHub MCP Tools363364| Tool Category | MCP Tool (with method) |365|---------------|------------------------|366| Issue Management | `mcp__github__issue_write` (create, update), `mcp__github__issue_read` (get), `mcp__github__list_issues` |367| Project Discovery | `mcp__github__projects_list` (list_projects), `mcp__github__projects_get` (get_project) |368| Project Fields | `mcp__github__projects_list` (list_project_fields), `mcp__github__projects_get` (get_project_field) |369| Project Items | `mcp__github__projects_write` (add_project_item, update_project_item, delete_project_item), `mcp__github__projects_list` (list_project_items), `mcp__github__projects_get` (get_project_item) |370371## Context7 Integration372373For current GitHub Projects API documentation:374```3751. context7_resolve-library-id with query="github projects api"3762. context7_query-docs with:377 - libraryId="/github/docs" or resolved library378 - query="projects v2 graphql" or "managing project items"379```380381## Best Practices3823831. **Always retrieve IDs before operations**: Issue ID ≠ Issue Number, Project Item ID ≠ Issue ID3842. **Cache field mappings**: Project fields don't change frequently - retrieve once per session3853. **Error handling**: Check if item already exists in project before adding3864. **Status workflow**: Respect project workflow (Backlog → Ready → In Progress → Done)3875. **Batch updates**: When updating multiple items, get field IDs once3886. **Validation**: Verify project and field existence before attempting updates389390## References391392| Reference | Description |393|-----------|-------------|394| [GitHub Projects API](https://docs.github.com/en/issues/planning-and-tracking-with-projects) | Official documentation |395| [GraphQL API for Projects](https://docs.github.com/en/graphql/reference/objects#projectv2) | Project v2 schema |396| [GraphQL Fallback](references/graphql-fallback.md) | Local: complete GraphQL patterns, full workflow, and MCP-to-GraphQL mapping |