@decyjphr/release-tracker
v1.0.4
Published
GitHub Product Features Release Tracker MCP Server
Readme
GitHub Product Features Release Tracker
A Model Context Protocol (MCP) server for tracking GitHub product feature releases and project boards. Built for GitHub team members to monitor releases, changelogs, and project status across multiple GitHub products.
Features
- 📦 Release Tracking: Monitor releases across multiple GitHub repositories
- 🎯 Projects V2 Integration: Track features and status in GitHub organization projects
- 🔍 Full-Text Search: Search releases and features with SQLite FTS5
- 💾 Local Caching: Reduce API calls with local SQLite database
- 🔧 MCP Compatible: Works with any MCP-compatible client (like GitHub Copilot CLI)
Prerequisites
- Node.js 20+ or compatible version
- GitHub Personal Access Token (PAT) with required scopes
GitHub Token Setup
You need a GitHub Personal Access Token with the following scopes:
Creating a Classic Token (Recommended for Internal Use)
- Go to GitHub Settings → Developer settings → Personal access tokens → Tokens (classic)
- Select the following scopes:
- ✅
repo- Full control of private repositories - ✅
read:org- Read org and team membership, read org projects - ✅
project- Full control of organization projects (required for Projects V2)
- ✅
- Click "Generate token" and copy the token value
Token Permissions
For GitHub team members tracking internal projects, the token needs:
- Access to the
githuborganization - Read access to tracked project boards (2463, 23733, 13002, 20481, 22216, 22504)
- Read access to tracked repositories
Installation
# Clone or navigate to the project directory
cd github-release-tracker
# Install dependencies
npm install
# Create environment configuration
cp .env.example .env
# Edit .env and add your GitHub token
nano .env # or use your preferred editorEnvironment Configuration
Edit .env file:
# Required: Your GitHub Personal Access Token
GITHUB_TOKEN=ghp_your_token_here
# Optional: Database location (default: ./data/releases.db)
DATABASE_PATH=./data/releases.db
# Optional: Log level (default: info)
LOG_LEVEL=info
# Optional: Organization name (default: github)
ORG_NAME=github
# Optional: Project numbers to track (comma-separated)
PROJECT_NUMBERS=2463,23733,13002,20481,22216,22504Usage
Building the Project
npm run buildRunning in Development Mode
npm run devRunning the MCP Server
npm startThe server runs on stdio and communicates via the Model Context Protocol.
Validating the Server
After starting the server, you can send JSON-RPC messages to stdin to verify it's working.
List all available tools:
echo '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' | node dist/index.jsCall a tool (e.g., search releases):
echo '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"search_releases","arguments":{"query":"custom patterns API"}}}' | node dist/index.jsCall get_release_details for a specific issue:
echo '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"get_release_details","arguments":{"issue_number":12345}}}' | node dist/index.jsNote: MCP uses JSON-RPC over stdio, so all messages are JSON. MCP clients like GitHub Copilot CLI handle this automatically.
Initial Data Sync
After starting the server, run a sync to fetch data from GitHub:
{
"tool": "sync_data",
"arguments": {
"source": "all"
}
}MCP Tools
1. search_releases
Search for product features and releases in github/releases using semantic search. Unlike keyword search, this understands the intent of your query and returns semantically relevant results.
Parameters:
query(string, required): Natural language query describing the feature or product (e.g., "custom patterns API", "Copilot pull request reviews")limit(number, optional): Maximum results to return (default: 20)
Example:
{
"tool": "search_releases",
"arguments": {
"query": "custom patterns API",
"limit": 10
}
}How it works: Calls GET /search/issues with q="is:issue repo:github/releases <query>" and search_type=semantic, so results are ranked by meaning, not just keyword overlap.
2. get_release_details
Get full details for a product/feature issue from github/releases, including its status across all connected project boards — GA rollout status, private/public preview, release dates, blog posts, and any other project field values.
Parameters:
issue_number(number, required): The issue number fromgithub/releases(e.g., fromsearch_releasesresults)
Example:
{
"tool": "get_release_details",
"arguments": {
"issue_number": 12345
}
}How it works: Uses a single GraphQL query to fetch the issue and walk its projectItems edge, returning every field value from every connected project board (status, dates, text fields, iterations, etc.).
Sample response shape:
{
"issue": {
"number": 12345,
"title": "Custom patterns API",
"state": "OPEN",
"labels": ["feature", "code-scanning"],
"url": "https://github.com/github/releases/issues/12345"
},
"ship_dates": {
"initial_expected": "2026-01-15",
"latest_expected": "2026-03-01",
"date_has_changed": true,
"change_history": [
{
"from": "2026-01-15",
"to": "2026-03-01",
"changed_at": "2026-02-10T14:30:00Z",
"changed_by": "octocat",
"source": "comment"
}
]
},
"connected_projects": [
{
"project_number": 2463,
"project_title": "Ship Board",
"project_url": "https://github.com/orgs/github/projects/2463",
"fields": {
"Status": "GA",
"Release Date": "2026-03-01",
"Blog Post": "https://github.blog/..."
}
}
]
}Ship date detection: The tool scans issue comments, the issue body, and cross-referenced issues for date change patterns (e.g., "ship date moved from 2026-01-15 to 2026-03-01"). It also reads date fields from connected project boards. Both the initially expected and latest expected dates are returned along with a full change history.
3. list_tracked_products
List all GitHub repositories being tracked.
Example:
{
"tool": "list_tracked_products",
"arguments": {}
}4. list_tracked_projects
List all GitHub Projects V2 being tracked.
Example:
{
"tool": "list_tracked_projects",
"arguments": {}
}5. sync_data
Synchronize data from GitHub (fetch latest releases and project items).
Parameters:
source(string, optional): What to sync - "releases", "projects", or "all" (default: "all")
Example:
{
"tool": "sync_data",
"arguments": {
"source": "all"
}
}Tracked Data Sources
GitHub Repositories (Releases)
github/roadmap- GitHub public roadmapgithub/feedback- GitHub feedback discussionsactions/runner- GitHub Actions Runneractions/toolkit- GitHub Actions Toolkitcli/cli- GitHub CLI
GitHub Projects V2 (Organization)
- Project 2463: github/projects/2463
- Project 23733: github/projects/23733
- Project 13002: github/projects/13002
- Project 20481: github/projects/20481
- Project 22216: github/projects/22216
- Project 22504: github/projects/22504
Integration with GitHub Copilot CLI
The package is published to npm, so no local clone is required. Add it to your MCP configuration using npx:
VS Code (mcp.json or settings.json)
VS Code supports input variables that prompt for a value the first time the server starts each session. This avoids storing the token in plaintext.
{
"servers": {
"release-tracker": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@decyjphr/release-tracker"],
"env": {
"GITHUB_TOKEN": "${input:github_token}"
}
}
},
"inputs": [
{
"type": "promptString",
"id": "github_token",
"description": "GitHub Personal Access Token",
"password": true
}
]
}VS Code will show a password prompt once per session when the server is first used.
Claude Desktop (claude_desktop_config.json)
Claude Desktop does not support input variables — set the token directly or export GITHUB_TOKEN in your shell profile and use ${env:GITHUB_TOKEN}:
{
"mcpServers": {
"release-tracker": {
"command": "npx",
"args": ["-y", "@decyjphr/release-tracker"],
"env": {
"GITHUB_TOKEN": "ghp_your_token_here"
}
}
}
}Then you can use the tools in your Copilot CLI sessions:
- "Search for custom patterns API releases" →
search_releases - "Get details for release issue 12345" →
get_release_details(shows GA status, release dates, blog posts across all boards)
Publishing
npm run build
npm login
npm publishTo publish a new version, update version in package.json first, then re-run npm publish.
Once published, users can run the server directly with:
npx -y @decyjphr/release-trackerArchitecture
┌─────────────────────────────────────────┐
│ GitHub Copilot CLI │
│ (MCP Client) │
└──────────────┬──────────────────────────┘
│ Model Context Protocol
│
┌──────────────▼──────────────────────────┐
│ MCP Server (stdio transport) │
│ ┌───────────────────────────────────┐ │
│ │ Tools: search_releases, │ │
│ │ get_product_updates, │ │
│ │ get_project_status, etc. │ │
│ └───────────┬───────────────────────┘ │
└──────────────┼──────────────────────────┘
│
┌──────────────▼──────────────────────────┐
│ Data Repository Layer │
│ ┌────────────┐ ┌───────────────┐ │
│ │ SQLite │ │ GitHub API │ │
│ │ Database │◄────►│ Client │ │
│ │ (Cache) │ │ (REST+GraphQL)│ │
│ └────────────┘ └───────────────┘ │
└──────────────┬──────────────────────────┘
│
┌──────────────▼──────────────────────────┐
│ GitHub │
│ ┌──────────────┐ ┌────────────────┐ │
│ │ Repositories │ │ Projects V2 │ │
│ │ (Releases) │ │ (Org Projects) │ │
│ └──────────────┘ └────────────────┘ │
└─────────────────────────────────────────┘Database Schema
The local SQLite database includes:
- products: Tracked GitHub repositories
- releases: Release data with full-text search
- features: Parsed features from releases (future)
- projects: GitHub Projects V2 metadata
- project_items: Project board items (issues, PRs, drafts)
- sync_history: Synchronization tracking
Development
Project Structure
github-release-tracker/
├── src/
│ ├── index.ts # Entry point
│ ├── config.ts # Configuration management
│ ├── database.ts # Database schema and initialization
│ ├── github-client.ts # GitHub API client (REST + GraphQL)
│ ├── repository.ts # Data repository layer
│ └── mcp-server.ts # MCP server implementation
├── config/ # Configuration files
├── tests/ # Test files (future)
├── .env.example # Environment template
├── package.json # Dependencies and scripts
└── tsconfig.json # TypeScript configurationAvailable Scripts
npm run build- Compile TypeScript to JavaScriptnpm run dev- Run in development mode with auto-reloadnpm start- Run the compiled servernpm run typecheck- Type-check without compiling
Troubleshooting
Token Validation Errors
If you see warnings about missing scopes:
⚠ Warning: Token may not have required "project" scope for Projects V2Recreate your token with all required scopes (repo, read:org, project).
Rate Limiting
The GitHub API has rate limits (5000 requests/hour for authenticated users). The client logs rate limit status. If you hit limits, wait for the reset time or reduce sync frequency.
Database Lock Errors
If you see database lock errors, ensure only one instance of the server is running at a time.
License
MIT
Contributing
This is an internal tool for GitHub team members. For issues or feature requests, please contact the team.
