{
  "markdown": "# github-talent-mcp\n\n[![License: Apache 2.0](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](LICENSE)\n[![Python 3.10+](https://img.shields.io/badge/Python-3.10+-blue.svg)](https://www.python.org)\n[![MCP](https://img.shields.io/badge/MCP-Model_Context_Protocol-8A2BE2)](https://modelcontextprotocol.io)\n[![Claude](https://img.shields.io/badge/Built_for-Claude_by_Anthropic-d4a373)](https://claude.ai)\n[![GitHub Copilot](https://img.shields.io/badge/Works_with-GitHub_Copilot-8957E5?logo=githubcopilot&logoColor=white)](https://github.com/features/copilot)\n[![Cursor](https://img.shields.io/badge/Works_with-Cursor-000000)](https://cursor.com)\n[![Grok Bot](https://img.shields.io/badge/Works_with-Grok_Bot-1C9A5F)](https://cursor.com)\n[![GitHub API](https://img.shields.io/badge/GitHub-REST_API_v3-181717?logo=github)](https://docs.github.com/en/rest)\n\nMCP server that searches, scores, and ranks GitHub developers for technical recruiting.\n\nWorks with **Claude** (Code & Desktop), **GitHub Copilot** (CLI & desktop app), and **Cursor** (IDE & Grok Bot) — any MCP client that speaks stdio.\n\n## Brand\n\n<p align=\"center\">\n  <img src=\"https://raw.githubusercontent.com/carolinacherry/github-talent-mcp/main/assets/logo/talent-mcp-icon-dark.svg\" width=\"96\" alt=\"talent-mcp mark, dark\" />\n  &nbsp;&nbsp;\n  <img src=\"https://raw.githubusercontent.com/carolinacherry/github-talent-mcp/main/assets/logo/talent-mcp-icon-light.svg\" width=\"96\" alt=\"talent-mcp mark, light\" />\n</p>\n\n<p align=\"center\">\n  <a href=\"https://raw.githubusercontent.com/carolinacherry/github-talent-mcp/main/assets/logo/talent-mcp-icon-dark.svg\">Download (dark, default)</a> ·\n  <a href=\"https://raw.githubusercontent.com/carolinacherry/github-talent-mcp/main/assets/logo/talent-mcp-icon-light.svg\">Download (light)</a> ·\n  <a href=\"https://raw.githubusercontent.com/carolinacherry/github-talent-mcp/main/assets/logo/talent-mcp-mark-black.svg\">mark only (black)</a> ·\n  <a href=\"https://raw.githubusercontent.com/carolinacherry/github-talent-mcp/main/assets/logo/talent-mcp-mark-white.svg\">mark only (white)</a>\n</p>\n\n## Demo\n\nhttps://github.com/user-attachments/assets/b2dbe9e0-26ee-4849-861a-4b5cb268facc\n\nSourcing candidates for a real Anthropic JD, live in Claude Cowork.\n\nhttps://github.com/user-attachments/assets/2dfd82b4-3eb5-4f2b-bc0a-2580b95043e4\n\n### Profile deep dive\n\n> Get the full developer profile and activity score for torvalds on GitHub\n\nClaude calls `get_developer_profile(\"torvalds\")` and returns:\n\n| Field | Value |\n|---|---|\n| **Activity Score** | **150** (reputation floor applied) |\n| Location | Portland, OR |\n| Followers | 293,321 |\n| Stars Received | 235,068 |\n| Primary Language | C (98.1%) |\n| Commits (90d) | 0 |\n| PRs (90d) | 0 |\n| Notable Repos | linux (183K stars), libdc-for-dirk, subsurface-for-dirk, uemacs, pesern-resolve |\n| Profile README | No |\n| Hireable | No |\n\nTorvalds has zero recent GitHub activity because kernel development flows through mailing lists, not GitHub PRs. The **reputation floor** (293K followers) overrides the behavioral score and sets it to 150.\n\n### Repo contributor ranking\n\n> Get the top contributors to huggingface/transformers and rank them for a founding ML engineer role at an AI startup\n\nClaude calls `get_repo_contributors(\"huggingface/transformers\")` → `rank_candidates` on the top 24 contributors:\n\n| Rank | Developer | Combined Score | Activity | Relevance | Strengths |\n|---|---|---|---|---|---|\n| 1 | stas00 | 83.4 | 150 | 72 | 4,553 stars, contributes to major OSS, MIT-licensed repos |\n| 2 | cyyever | 80.8 | 120 | 64 | 1,217 followers, active contributor, profile README |\n| 3 | Cyrilvallez | 77.2 | 120 | 56 | Active: 13 commits + 57 PRs in 90 days, strong OSS presence |\n| 4 | ArthurZucker | 74.4 | 120 | 48 | 37 PRs in 90 days, contributes to huggingface/transformers |\n| 5 | ydshieh | 72.0 | 120 | 40 | Active: 9 commits + 40 PRs in 90 days |\n\nCombined score = activity × 0.4 + relevance × 0.6. Relevance is keyword overlap with the job description (ML, AI, startup, engineer, etc.).\n\n## Installation\n\n### 1. Install `uv`\n\nThe server runs through `uvx`, which downloads and launches it for you — no clone, no\nvirtualenv, and you get updates automatically.\n\n```bash\nbrew install uv\n```\n\nNo Homebrew? `curl -LsSf https://astral.sh/uv/install.sh | sh`\n\n### 2. Create a GitHub personal access token\n\nWithout a token GitHub allows **60 requests per hour**, and a single candidate profile\ncosts 6-15 of them. You will run out mid-search and profiles will come back empty. With a\ntoken you get 5,000/hour.\n\nGo to [github.com/settings/tokens](https://github.com/settings/tokens) and create a\n**fine-grained** or **classic** token with these scopes:\n\n| Scope | Why |\n|---|---|\n| `read:user` | Read user profiles and search users |\n| `public_repo` | Read public repo data, languages, contributors |\n\nCopy the token — you cannot view it again after leaving the page.\n\n### 3. Connect it\n\n#### GitHub Copilot (CLI and desktop app)\n\n**Important:** Put the token itself in the config, not `${GITHUB_TOKEN}`. Desktop apps are launched by\nthe operating system, not by your shell, so they never read `.zshrc` and an environment\nvariable reference expands to nothing. The server then starts fine, runs unauthenticated,\nand quietly fails a few candidates in. A `.env` file has the same problem unless the config\nalso sets `cwd` to the project directory, because it is read relative to the working\ndirectory.\n\nBoth share one config. Paste this in a terminal — it fills in your token for you:\n\n```bash\nmkdir -p ~/.copilot\nTOKEN=$(gh auth token)   # or: TOKEN=github_pat_xxxxxxxx\ncat > ~/.copilot/mcp-config.json <<EOF\n{\n  \"mcpServers\": {\n    \"github-talent\": {\n      \"type\": \"local\",\n      \"command\": \"uvx\",\n      \"args\": [\"github-talent-mcp\"],\n      \"env\": { \"GITHUB_TOKEN\": \"$TOKEN\" },\n      \"tools\": [\"*\"]\n    }\n  }\n}\nEOF\nchmod 600 ~/.copilot/mcp-config.json\n```\n\nQuit Copilot completely and reopen it, then run `/mcp show` — you should see 9 tools under\n`github-talent`. The app also accepts servers under Settings → MCP if you would rather not\ntouch a file.\n\nIf `uvx` is not found, give its full path as `command` (`which uvx` prints it).\n\n#### Claude Code\n\n```bash\nclaude mcp add github-talent --env GITHUB_TOKEN=github_pat_xxxxxxxx -- uvx github-talent-mcp\n```\n\nRestart Claude Code and verify with `/mcp`.\n\n#### Claude Desktop\n\n**Important:** Same token-in-config rule as Copilot applies here.\n\nAdd to `~/Library/Application Support/Claude/claude_desktop_config.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"github-talent\": {\n      \"command\": \"uvx\",\n      \"args\": [\"github-talent-mcp\"],\n      \"env\": {\n        \"GITHUB_TOKEN\": \"github_pat_xxxxxxxx\"\n      }\n    }\n  }\n}\n```\n\nRestart Claude Desktop.\n\n#### Cursor IDE and Cloud Agents (Grok Bot)\n\n**Note:** A marketplace application has been submitted and is currently in review.\n`${GITHUB_TOKEN}` in this repo's `mcp.json` and `.cursor-plugin/plugin.json` is a\n**plugin variable** for that install path. Cloud Agents and a hand-written\n`mcp.json` do **not** expand it. Paste the PAT.\n\n**After marketplace listing (Cursor IDE one-click):**\n\n1. Install `uv` if not already on your machine:\n   ```bash\n   brew install uv\n   ```\n   No Homebrew? `curl -LsSf https://astral.sh/uv/install.sh | sh`\n\n2. In **Cursor IDE**, go to **Plugins → Add**, search for **GitHub Talent Search**,\n   and install it.\n\n3. When prompted, enter your GitHub personal access token (fine-grained with\n   `read:user` and `public_repo` scopes).\n\n**Until marketplace approval — Cursor IDE:**\n\nSymlink this repository to `~/.cursor/plugins/local/github-talent-mcp/`, then\nreload Cursor (**Cmd/Ctrl+Shift+P** → **Reload Window**).\n\n```bash\nmkdir -p ~/.cursor/plugins/local\nln -s /path/to/github-talent-mcp ~/.cursor/plugins/local/github-talent-mcp\n```\n\nOr add a user/project `mcp.json` (`~/.cursor/mcp.json` or `.cursor/mcp.json`)\nwith command `uvx`, args `[\"github-talent-mcp\"]`, and `GITHUB_TOKEN` set to the\nPAT itself. Desktop interpolation, if you use it, is `${env:GITHUB_TOKEN}` — not\n`${GITHUB_TOKEN}`. If spawn fails, set `command` to the full path from `which uvx`\n(often `/opt/homebrew/bin/uvx` on Apple Silicon Homebrew).\n\n**Until marketplace approval — Cloud Agents (cursor.com/agents):**\n\nThere is **no MCP dropdown** on the agents home page (Environment, Secrets, and\n**Set Up Cloud Agents** are not this). The control is the **+** button to the\nleft of the model picker.\n\n1. Put `uvx` on the Cloud Agent VM's default PATH. Stdio MCP spawn does not\n   read `.bashrc`. If `uvx` is only in `~/.local/bin`, the server fails with\n   **`spawn uvx ENOENT`** and loads **0 tools**. Add this to the environment\n   **Install** script, Save, then start a **new** agent:\n\n   ```bash\n   curl -LsSf https://astral.sh/uv/install.sh | sh\n   sudo install -m 0755 \"$HOME/.local/bin/uv\" /usr/local/bin/uv\n   sudo install -m 0755 \"$HOME/.local/bin/uvx\" /usr/local/bin/uvx\n   ```\n\n2. On [cursor.com/agents](https://cursor.com/agents), click **+** → **MCP Servers**.\n   Edit `github-talent` if it is already listed; otherwise **Add MCP**.\n\n3. In **Edit MCP server**:\n   - **Name:** `github-talent`\n   - **Type:** **Command** (not URL). This server is stdio, not HTTP. Cloud Agents\n     do not support SSE.\n   - **Command:** `uvx`\n   - **Arguments:** `github-talent-mcp` (leave extra empty Argument rows blank)\n   - **Secrets:** Key `GITHUB_TOKEN`, Value your PAT (`ghp_` or `github_pat_`).\n     Paste the token. An Environment-panel secret named `GITHUB_TOKEN` does\n     **not** copy into MCP env.\n   - Do **not** set Command to `/home/box/bin/github-talent-mcp.sh`. That path is\n     not on Cloud Agent VMs; the namespace attaches and still loads 0 tools.\n\n4. Save. Toggle `github-talent` on. Start a **new** Cloud Agent — existing runs\n   keep the old launcher. You should see 9 tools under `github-talent`.\n\n#### Grok Build\n\n**Note:** This plugin has **NOT** been submitted to the xAI plugin marketplace yet. These are the install instructions for when that happens.\n\n**Prerequisites:**\n- **`uvx` on PATH** — Install via `brew install uv` or `curl -LsSf https://astral.sh/uv/install.sh | sh`\n- **GitHub Personal Access Token** — Fine-grained PAT with `read:user` and `public_repo` scopes. Create at [github.com/settings/tokens](https://github.com/settings/tokens). Required for API rate limits (5,000/hr vs 60/hr unauthenticated).\n\n**Direct install from repository:**\n\n1. Install the plugin from GitHub:\n   ```bash\n   grok plugin install carolinacherry/github-talent-mcp --trust\n   ```\n\n2. Set `GITHUB_TOKEN` in Grok's MCP environment configuration:\n   - The plugin requires this environment variable to authenticate with GitHub\n   - Set it where Grok configures MCP server environments\n   - Without the token, the server runs unauthenticated and will fail mid-search\n\n3. Verify installation:\n   ```bash\n   grok plugin list\n   ```\n   You should see `github-talent-mcp` in the list.\n\n**After official marketplace listing:**\n\nOnce the plugin is accepted into the xAI marketplace catalog, you'll be able to browse and install it from within Grok Build:\n\n1. Type `/marketplace` in Grok Build\n2. Search for \"GitHub Talent Search\"\n3. Press `i` to install\n4. Configure `GITHUB_TOKEN` in Grok's MCP settings\n\n**Marketplace submission path (not yet done):**\n\nTo submit this plugin to the official marketplace:\n1. Fork [xai-org/plugin-marketplace](https://github.com/xai-org/plugin-marketplace)\n2. Add a plugin entry to `.grok-plugin/marketplace.json` pinned to a full 40-character commit SHA\n3. Run validation: `python3 scripts/validate-catalog.py`\n4. Regenerate the plugin index: `python3 scripts/generate-plugin-index.py`\n5. Open a PR to xai-org/plugin-marketplace\n\nSee `docs/grok-marketplace-submission.md` for the draft entry and detailed submission steps.\n\n#### Checking it actually works\n\nCall **`get_developer_profile`** (the MCP tool, not `python` / `gh` / `curl`). A\nreal profile is 120-170 lines. **Three lines means the call failed** — almost\nalways a missing or unreadable token. Every tool returning three lines while the\nserver still shows as connected is the signature of running unauthenticated.\n\nA formatted Torvalds table is **not** proof of MCP. Cloud Agents can import\n`github_talent_mcp` from this repo and print the same ~149-line profile while\nMCP discovery is still failing (`spawn uvx ENOENT`). Confirm the 9 tools loaded\nand that the call went through the MCP tool.\n\n### Running from source\n\nOnly needed if you want to modify the server:\n\n```bash\ngit clone https://github.com/carolinacherry/github-talent-mcp.git\ncd github-talent-mcp\nuv sync\n```\n\nThen use `uv run --directory /path/to/github-talent-mcp github-talent-mcp` as the command in\nany config above.\n\n## Try It\n\nOnce installed, paste these prompts to verify everything works:\n\n**Basic search:**\n> Find Python developers in Raleigh active in the last 60 days\n\n**Profile deep dive:**\n> Get the full developer profile and activity score for torvalds on GitHub\n\n**Full workflow:**\n> Find 10 ML engineers in San Francisco active in the last 30 days, then rank them for a senior LLM inference engineer role\n\n**Repo contributors:**\n> Get the top contributors to huggingface/transformers and rank them for a founding ML engineer role at an AI startup\n\n**JD scoring:**\n> Score these candidates against this job description: [paste JD]. Candidates: tiangolo, karpathy, hwchase17\n\n**Compare candidates:**\n> Compare tiangolo and hwchase17 for a Senior Python AI Engineer role\n\n**Bulk scoring:**\n> Score these 10 GitHub usernames and give me a ranked table: [paste list]\n\n**Outreach:**\n> Generate a casual recruiter message for tiangolo about a Senior Python role at Acme. My name is Daniel.\n\n## Interview-first sourcing\n\nVague prompts produce vague shortlists, so the server is built to **interview you before it searches**. Ask it to \"find candidates for a role\" and it calls `plan_search` first — it detects the role family and asks targeted follow-ups (seniority, must-have skills, location, dealbreakers) and, most importantly, for the **job description**: paste the full text, or share a public link and paste what it shows. It only sources once it has real criteria.\n\n> **Try it:** *\"Find me senior security engineers.\"* → the assistant should ask for the JD and your must-haves before running anything.\n\nWant a fast, repeatable run instead? Give it everything up front — *\"Rank these 15 usernames against this JD: …\"* — or pin the sourcing to specific repos, and it'll skip the interview.\n\n## Tools\n\n| Tool | Description |\n|---|---|\n| `plan_search` | Intake step — parses a sourcing request, detects the role family, and returns targeted follow-up questions (including: paste the JD or share a public link) to ask before searching. Call this first. |\n| `search_developers` | Search GitHub users by language, location, activity, followers. For topic-based sourcing, use `get_repo_contributors` on relevant repos instead. |\n| `get_developer_profile` | Deep profile enrichment: languages, stars, commits + PRs, OSS contributions, license breakdown, profile README, and activity score with breakdown. |\n| `rank_candidates` | Rank usernames against a job description. Returns sorted candidates with combined score, strengths, gaps, and reasoning. |\n| `score_against_jd` | Score candidates against a JD with per-dimension breakdown (tech stack, experience level, OSS signal, leadership). Returns gaps and personalized interview questions. |\n| `compare_candidates` | Side-by-side comparison of 2-5 candidates. Shows dimension winners and a recommendation. Optionally scored against a JD. |\n| `bulk_score` | Score up to 100 GitHub usernames in one call. Returns a ranked markdown table or CSV. Supports optional JD matching. |\n| `generate_outreach` | Generate personalized recruiter messages (short/medium/detailed) that reference the candidate's actual repos and contributions. Requires your company name and sender name. Casual or formal tone. |\n| `get_repo_contributors` | Top contributors for any repo. Accepts `owner/repo` or full URL. The fastest way to source for a specific domain. |\n\n## Scoring\n\nThe activity score combines two layers: **behavioral signals** (what you did recently) and a **reputation floor** (what you've built over time).\n\n### Behavioral Score (0-205)\n\n| Signal | Max Points | How |\n|---|---|---|\n| Commits + PRs (last 90 days) | 60 | Push commits + PR opens (PRs weighted x3). Captures both push-based and PR-based workflows. |\n| Stars on repos | 40 | Personal repo stars + stars on repos you contribute to. Org repo maintainers get credit. |\n| Profile README | 20 | Presence of a profile README (github.com/username/username). |\n| Followers | 20 | Capped at 20. |\n| Repos with descriptions | 20 | Ratio of repos that have descriptions. Signal of care and polish. |\n| Permissive license repos | 15 | Has at least one repo with MIT, Apache-2.0, BSD, ISC, or Unlicense. |\n| Major OSS contributions | 30 | PRs, pushes, or issues on repos you don't own. Capped at 3 repos (10 pts each). |\n\n### Reputation Floor\n\nThe behavioral score alone penalizes developers whose work doesn't produce GitHub events — Torvalds works through mailing lists, senior maintainers merge via org bots, and many engineers work in private repos.\n\nThe reputation floor ensures cumulative impact isn't erased by a quiet quarter:\n\n| Threshold | Floor |\n|---|---|\n| 10K+ followers **or** 50K+ stars | 150 |\n| 1K+ followers **or** 5K+ stars | 120 |\n| 500+ followers **or** 1K+ stars | 100 |\n| 100+ followers **or** 200+ stars | 80 |\n\nThe final score is `max(behavioral_score, reputation_floor)`. If the floor is applied, the breakdown includes a `reputation_floor` field so you know.\n\n### Score Tiers\n\n- **150+** — exceptional (top OSS maintainers, well-known engineers)\n- **120-149** — strong signal, worth reaching out\n- **80-119** — solid developer with meaningful public work\n- **40-79** — active but limited public signal\n- **<40** — low signal (likely private work or junior)\n\n### Ranking\n\n`rank_candidates` combines the activity score with a **relevance score** (0-100) based on keyword overlap between the job description and the candidate's profile (bio, languages, repo topics, README). The combined score weights relevance at 60% and activity at 40% — a high-activity developer with no overlap to the job shouldn't outrank a relevant one.\n\n## Interactive dashboard\n\nAfter a search produces a shortlist, the server asks whether you want an interactive\ndashboard — search, skill filters, ranking, evidence, and GitHub profile links. Answer yes\nand your assistant builds it with its own artifact tooling (Copilot's canvas, Claude's\nartifacts) from the scored candidate data.\n\nIt only ever offers; nothing is built unless you say yes, and the offer is skipped when a\nsearch produced no usable profiles. Set `GITHUB_TALENT_DASHBOARD_PROMPT=0` to turn it off.\n\nIf the page opens in an inline canvas, note that those panes sandbox their content and\nblock outbound links, so the assistant is also asked to open the saved file in your browser\nwhere the GitHub links work.\n\n## Rate Limits\n\nGitHub REST API: **5,000 requests/hour with a token, 60 without one.** A single enriched\nprofile costs 6-15 calls and a typical workflow (search + enrich 5 candidates + rank) uses\n~60-100, so an unauthenticated server runs out inside one search. Profile results are cached\nwithin a session to avoid redundant calls during ranking.\n\nTwo limits are separate from that hourly budget and worth knowing:\n\n- **Search endpoints** (`/search/commits`, `/search/issues`) allow only 30 requests/minute\n  even with a token. The server treats a failure there as an unknown activity count rather\n  than a failed profile, so a shortlist still comes back — the commit counts may just read 0.\n- **Secondary rate limits** fire on bursts of concurrent requests and return an explicit\n  `Retry-After`. The server waits exactly that long, up to 30 seconds, then gives up rather\n  than retrying into a window that has not lifted.\n\n## Limitations & responsible use\n\nThis tool scores **public GitHub activity** as *one* signal for technical sourcing. Know its limits before you rely on it:\n\n- **Results vary between runs.** It's AI-driven — the assistant decides which repos and searches to explore, so the same prompt can surface a different shortlist each time. The scoring itself is deterministic for a given set of candidates; the variation comes from sourcing. For repeatable runs, constrain the sourcing: name the repos to pull contributors from, or hand it an explicit list of usernames to rank.\n- **GitHub is not the whole engineer.** Public activity is strong evidence of *technical* work but blind to private-repo and internal/enterprise contributions, and to non-GitHub ecosystems (mailing lists, GitLab, etc.). It **cannot** verify people-management or leadership history — confirm those off-GitHub. (The reputation floor exists precisely because low recent activity ≠ low capability.)\n- **Use it as a lead generator, not a filter.** Public OSS visibility correlates with free time, tenure, and circumstance — not just skill — and that skews across demographics. Treat scores as a starting point for outreach and human judgment. Don't use them to automatically exclude candidates, and always pair them with equitable, role-relevant evaluation.\n- **Data is live and rate-limited.** Scores reflect GitHub at query time and shift as activity changes; an unauthenticated server is capped at 60 requests/hour.\n\n## License\n\n[Apache License 2.0](LICENSE) © 2026 Daniel An. Released versions up to and including 0.4.0 remain under the MIT License; 0.4.1 onward is Apache-2.0.\n",
  "bytes": 21656,
  "sha": "fbae95fd113adab19b0b649b94f737784e701023e316be0ad8fb58439d2007d0",
  "repo_slug": "carolinacherry/github-talent-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/plg_carolinacherry_github_talent_mcp_github__782fc288/readme"
}