# github-project-info-mcp [![CI](https://github.com/shubhtoy/github-project-info-mcp/actions/workflows/ci.yml/badge.svg)](https://github.com/shubhtoy/github-project-info-mcp/actions/workflows/ci.yml) [![npm version](https://img.shields.io/npm/v/github-project-info-mcp.svg)](https://www.npmjs.com/package/github-project-info-mcp) [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](./LICENSE) [![Node >=18](https://img.shields.io/badge/node-%3E%3D18-brightgreen)](https://nodejs.org) [![MCP](https://img.shields.io/badge/MCP-server-purple)](https://modelcontextprotocol.io) An [MCP](https://modelcontextprotocol.io) server for reading **public GitHub Projects (v2) boards without authentication** — including item-level data (status, custom fields, story points) for boards that GitHub's own official API can't read unauthenticated. **Runs entirely locally via stdio** (`npx -y github-project-info-mcp`, no server, no Cloudflare, no infrastructure of any kind) — this is the primary, standard way to use it. A browser client and a self-hostable Cloudflare Worker are also included as **optional extras** for the specific case of calling this from client-side JavaScript (see [Browser usage](#browser-usage-no-server-no-deploy-required)); neither is needed for normal MCP usage and neither is a runtime dependency of the stdio server. Also ships as an [Agent Skill](./SKILL.md) — see [Skill](#skill) below. ## Why this exists GitHub's official REST API for Projects v2 has an authentication gap: | Endpoint | Org-owned project | User-owned project | |---|---|---| | Project metadata (title, state, dates) | ✅ unauthenticated for public projects | ✅ unauthenticated for public projects | | Project **items** (status, fields, points) | ✅ unauthenticated for public projects | ❌ **401, even when the project is public** | This is confirmed live against GitHub's current API, not just inferred from docs — see [`docs/investigation.md`](./docs/investigation.md) for the full trail. If your project board is owned by your **personal GitHub user account** (the common case for solo/personal projects), there is no official, documented, unauthenticated way to read its items. This library closes that gap for user-owned projects using a public fallback: the project board's own webpage embeds full item data as JSON, unauthenticated, for any public project. This tool reads that instead. ## What's official vs. unofficial - **`get_project_metadata`** — uses GitHub's official, documented REST API (`GET /users|orgs/{owner}/projectsV2/{n}`). Stable, unauthenticated, works for any public project. - **`list_project_items`** — for **org-owned** projects, uses GitHub's official REST API (unauthenticated for public projects, per GitHub's docs). For **user-owned** projects, falls back to reading the public board page's embedded JSON (`