{
  "markdown": "# Lusha for Recruiting — MCP Plugin\n\nSource talent for an open position, keep a saved talent pipeline current, and catch the\nweeks after a leadership change — from inside your AI assistant.\n\nSupports **Claude Code** (CLI / Cowork), **Cursor** (plugins), **Codex** (plugins), **VS\nCode Copilot** (GitHub Copilot Chat with MCP), and **Gemini CLI** (extensions).\n\nThis is the recruiting counterpart of\n[lusha-mcp-plugin](https://github.com/lusha-oss/lusha-mcp-plugin). Same shape, different\nsurface: it connects to the Lusha recruiting MCP deployment, which serves 26 tools under\nrecruiter-facing names (`talent_search`, `candidate_profile`, `list_read`) rather than the\ngeneral Lusha surface.\n\n## Skills\n\n| Skill | What it does |\n|-------|-------------|\n| `source-movable-talent` | A position to fill → an ordered shortlist of people who fit it and have been in their job long enough to be open to a move, each with a reason to approach them now |\n| `keep-a-list-live` | A pipeline saved weeks ago → only what changed since the last check: who moved, who was promoted, who newly crossed the tenure threshold, what happened at their employer |\n| `leadership-change-sourcing` | An executive departure or replacement → the people one level below, grouped by company, each traced to a dated event |\n\nAll three load the same shared reference: terminology, fifteen hard rules, the tenure\nmechanism, the ordering rules and the cost table. The canonical copy is\n`skills/_shared/SHARED-REFERENCE.md`; each skill carries a generated mirror at\n`references/shared-reference.md`, because hosts differ on whether they bundle a directory\noutside the skill folder. CI enforces byte-equality.\n\n## How it works\n\nEvery client loads the **same** `skills/*/SKILL.md` files and the same MCP server. Only the\nmanifest and the store segment differ:\n\n| Client | Manifest | MCP endpoint | How to invoke |\n|--------|----------|--------------|---------------|\n| Claude Code | `.claude-plugin/plugin.json` | `mcp-hr.lusha.com/mcp/claude` | `/source-movable-talent`, `/keep-a-list-live`, `/leadership-change-sourcing` |\n| Cursor | `.cursor-plugin/plugin.json` | `mcp-hr.lusha.com/mcp/cursor` | Skills activate from natural language |\n| Codex | `.codex-plugin/plugin.json` + `mcp.json` | `mcp-hr.lusha.com/mcp/codex` | Skills activate from natural language |\n| VS Code Copilot | `.github/plugin/plugin.json` | `mcp-hr.lusha.com/mcp/copilot` | `/source-movable-talent`, etc. |\n| Gemini CLI | `gemini-extension.json` | `mcp-hr.lusha.com/mcp/gemini` | Gemini activates the matching skill on demand |\n\nSkills name tools by their bare recruiter-facing name, so one skill source works on every\nclient. Each manifest also sends `X-Lusha-Plugin: <store>-hr` and\n`X-Lusha-Plugin-Version`, which is how usage from this plugin is attributed separately from\nthe general one.\n\n**The host is the whole selector.** The recruiting surface is a dedicated deployment, not a\npath: `mcp-hr.lusha.com` serves recruiter names on every mount, and `mcp.lusha.com` serves\nthe general ones. There is no `/mcp/hr` path — pointing a manifest at one gets an unknown\nstore.\n\n## Prerequisites\n\n- A Lusha account with API access, and the recruiting surface enabled for it\n\n## Install\n\n### Claude Code (CLI / Cowork)\n\n```\n/plugin marketplace add lusha-oss/lusha-mcp-talent-sourcing-plugin\n/plugin install lusha-talent-sourcing\n```\n\n### Cursor\n\nCursor reads `.cursor-plugin/plugin.json` and discovers the bundled `skills/`\nautomatically. Add the repo as a plugin marketplace, then install from\n`.cursor-plugin/marketplace.json` (catalog `lusha-recruiting-plugins`, plugin\n`lusha-talent-sourcing`).\n\n### Codex\n\nCodex discovers the plugin through the repo catalog at `.agents/plugins/marketplace.json`,\nwhich uses a `url` source pinned to a ref. A `url` source is used instead of a local path\nbecause Codex rejects a local plugin path that resolves to the repo root\n([codex#17066](https://github.com/openai/codex/issues/17066)) and silently drops symlinks\nduring install ([codex#18863](https://github.com/openai/codex/issues/18863)); cloning over\n`url` keeps `skills/` as real files at the plugin root.\n\n```\ncodex plugin marketplace add lusha-oss/lusha-mcp-talent-sourcing-plugin\ncodex\n/plugins\n```\n\nSelect the catalog, install, then start a new thread so the skills and MCP tools load.\n\n### VS Code Copilot\n\nRequires a VS Code version with agent-plugin support and the GitHub Copilot extension.\n\n1. Open the **Command Palette** (`Cmd+Shift+P` / `Ctrl+Shift+P`).\n2. Run **Chat: Install Plugin From Source**.\n3. Paste the repository name: `lusha-oss/lusha-mcp-talent-sourcing-plugin`.\n\n### Gemini CLI\n\n```\ngemini extensions install https://github.com/lusha-oss/lusha-mcp-talent-sourcing-plugin\n```\n\n## Editing this repo\n\n**The manifests are generated. Do not hand-edit them.** `plugin.config.json` is the single\nsource for the name, version, description, display fields and per-client endpoint;\n`scripts/build-manifests.mjs` writes the five manifests, `mcp.json` and the three catalogs\nfrom it, and `scripts/check.mjs` fails if any committed file has drifted. This exists\nbecause the display name is Marketing's to change and the description is ~1,400 characters:\nsix hand-synced copies is six chances to update five of them.\n\n```\nnpm run build    # regenerate manifests + mirrored references\nnpm run check    # the CI gate, four checks\n```\n\n### Testing against a different endpoint\n\nTo point the plugin at a different recruiting MCP deployment (a staging environment, or a\nlocally-run one), set the `LUSHA_MCP_ORIGIN` env var before building rather than editing\n`plugin.config.json`:\n\n```\nLUSHA_MCP_ORIGIN=https://<your-endpoint> npm run build\n```\n\nThe committed endpoint is then never the thing you touch by hand, and `npm run check` —\nwhich reads `plugin.config.json` and ignores the env override — fails on a tree still\ncarrying a non-production endpoint, so an accidental local build can't be committed.\n\n`npm run check` enforces:\n\n1. Every skill has parseable frontmatter whose `name` matches its folder, with a\n   description long enough to route on.\n2. **No sales vocabulary** in anything a host loads — no `prospect`, `ICP`, `buying\n   intent`, `decision maker`, `seniority` (the reference says level) or `lead`, and\n   `contact` only inside `contact details` / `contact information` / `make contact`.\n   Code spans and fenced blocks are exempt, because they carry upstream API field names\n   that are not ours to rewrite. A `<!-- vocab-gate:off -->` region opts out explicitly,\n   which the reference needs in order to state the rule at all.\n3. The mirrored shared references are byte-identical to the canonical one.\n4. The manifests match `plugin.config.json`, Gemini uses `httpUrl`, and every endpoint,\n   attribution header and version lines up.\n\nThis repo does not maintain its own copy of which tool names the recruiter MCP server\nserves — that list is server-owned and changes on the server's schedule, so a skill\nsending the model at a tool this surface doesn't have is caught server-side rather than by\na mirror here that could drift.\n\n### Where the words come from\n\nThe skills and the shared reference are maintained by the Lusha recruiting team as the\nsource of truth for this plugin's terminology, guardrails and behaviour — if a skill file\nand any other internal note disagree, the skill file wins.\n\n### Placeholders\n\nThese are display-only fields, owned by Marketing, and all three live in\n`plugin.config.json`:\n\n| Field | Current value |\n|-------|---------------|\n| `display.displayName` | `Lusha Talent Sourcing` |\n| `display.shortDescription` | `Find best-fit talent, get verified contact details, and see who may be open to a move` |\n| `display.category` | `Productivity + data` — confirm against each host's accepted category list at submission |\n| `descriptionTemplate` | The store-listing copy. It reaches Codex as `interface.longDescription` and Gemini as the manifest `description`; every other manifest gets the one-liner instead |\n\nThe long copy is written by Marketing but still passes the vocabulary gate above, so a\ndraft saying \"seniority\" or \"contact data\" comes back as `level` and `contact details`.\n\nThe machine name is `lusha-talent-sourcing`. It was `lusha-hr` in 0.1.0, so anyone who\ninstalled that version reinstalls rather than updates. Treat it as fixed from here:\nrenaming it again after install breaks existing installs.\n\n## License\n\nMIT. See [LICENSE](LICENSE).\n",
  "bytes": 8443,
  "sha": "b19fd075f6180278e27b24129e1c2a309daa2fcd59b620ee3ca79dd909afa035",
  "repo_slug": "lusha-oss/lusha-mcp-talent-sourcing-plugin",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/plg_lusha_oss_lusha_mcp_talent_sourcing_plug_5cd6d1da/readme"
}