Judge an engineer by their code, not by their CV.
GitHub is a data and sourcing tool, and one of the 53 tools hyreflow connects to Claude, ChatGPT and other AI assistants. Through hyreflow, an AI agent can run 16 actions, all of which look something up. GitHub costs no hyreflow credits, and you can connect your own GitHub key.
Your agent searches GitHub developers by language, location and project, reads what they have actually shipped, and scores it against your brief. Sometimes the email is right there on the profile. Often it is not, and enrichment picks that up.
GitHub runs before enrichment. It finds and qualifies the engineer; the waterfall finds the email.
With hyreflow connected, you ask for the outcome in plain language and the assistant runs GitHub for you. For example:
In a hyreflow run, GitHub is most often paired with Prospeo, FullEnrich, BuiltWith and Vincere.
GitHub rarely carries the email, this finds it
the waterfall for developers with private commit addresses
find the companies running the stack these engineers know
file the technical assessment on the candidate
Through hyreflow, an AI agent can run 16 GitHub actions, all of which look something up. GitHub costs no hyreflow credits, and you can connect your own GitHub key.
| GitHub action | What it does | Cost through hyreflow |
|---|---|---|
| Find user emails | Looks something up | free |
| Search code | Looks something up | free |
| Search profile match | Looks something up | free |
| Search repositories | Looks something up | free |
| Search users | Looks something up | free |
| Candidate dossier | Looks something up | free |
| Read file | Looks something up | free |
| User dossier | Looks something up | free |
| List repo commits | Looks something up | free |
| List user events | Looks something up | free |
| GitHub action | What it does | Cost through hyreflow |
|---|---|---|
| List user followers | Looks something up | free |
| List user repos | Looks something up | free |
| Get repo contributors | Looks something up | free |
| Get repo tree | Looks something up | free |
| Get user | Looks something up | free |
| Get user social accounts | Looks something up | free |
One credit is priced on the pricing page. The full price list for every tool is in the pricing tables.
5 hyreflow skills call GitHub as part of the run. A skill is a whole pipeline your agent already knows, end to end.
use whenyou are filling a developer role and the profiles all claim the same stack
use whena company in your market has announced redundancies and there is a short window before everyone else calls
use whenthe people you want are in a job and not looking, and your approach must not land in an inbox their employer owns
use whenyou have a first call booked with a candidate and want more than a skim of their profile, without straying into anything personal
use whenyou are about to source from, or pitch to, a named tech company and want to know who builds what there before you open LinkedIn
hyreflow ships a written playbook for GitHub, and the agent loads it before the first call. Auth, rate limits, what each call costs, which actions need your approval, and the mistakes worth avoiding. It is the difference between an agent that knows the tool and one that guesses at it.
Read the GitHub docs →HOW in lib/github.py. Sourcing-relevant subset only; index: reference/docs/github/raw/endpoints.md.
https://api.github.com · GraphQL: https://api.github.com/graphql.Authorization: Bearer <token> (env GITHUB_TOKEN; never hardcode) + X-GitHub-Api-Version: 2022-11-28.page/per_page (≤100); iter_search_users respects the cap. Adapter auto-sleeps on 403/429 rate-limit + transient 5xx.Discovery: search_users/iter_search_users, search_repositories, search_code. Profile + skill signal: get_user, list_user_repos, get_repo_contributors, list_user_followers. Ops: get_rate_limit. graphql(query, variables) — generic passthrough (one endpoint; you specify the fields) for rich single-call dossiers: profile + socialAccounts (linked LinkedIn/Twitter) + top languages + pinned repos + contributionsCollection.
GitHub does expose contact info three ways — try these before falling back to the waterfall:
get_user(username) → email (if the dev set one public), blog, twitter_username, bio.get_user_social_accounts(username) → [{provider, url}] (linkedin, mastodon, …). Also in GraphQL user.socialAccounts.find_user_emails(username) walks their recent owned repos' commits and returns real emails, dropping *@users.noreply.github.com proxies. (Primitives: list_repo_commits(author=…), list_user_events.)name + company + GitHub/LinkedIn to the enrichment waterfall. GitHub slots in before enrichment.find_user_emails is bounded by max_repos). Keep outreach human-paced (ToS).search_users/get_repo_contributors by language+location → get_user+list_user_repos (skill signal) → score vs the JD (agent, free) → enrich email (waterfall) → validate → ATS (Vincere/Bullhorn) → sequencer (SourceWhale/Lemlist/HeyReach). The engineer-sourcing front-end for the "source & shortlist" recipe.
lib/github.pyImport: from lib.github import GitHub → instantiate GitHub() (reads key from env). Base: https://api.github.com. Generic passthrough: request(method, path, *, params, json).
candidate_dossier(full_name: str | None = None, *, github_url: str | None = None, company_name: str | None = None, location: str | None = None, linkedin_url: str | None = None, jd_keywords: list[str] | str | None = None, max_candidates: int = 5, max_repos: int = 12, include_emails: bool = True) -> dict[str, Any] — End-to-end IT-sourcing GitHub leg: match identity → build dossier → score repos vs JD.find_user_emails(username: str, *, max_repos: int = 10) -> list[str] — Harvest candidate emails from a user's public commits (when the profile email is private).get_rate_limit() -> Any — GET /rate_limit — remaining REST/Search/GraphQL budget for the caller's own GitHub token; requires the workspace's own token.get_repo_contributors(owner: str, repo: str, **params) -> Any — GET /repos/{owner}/{repo}/contributors — source the people who build a given project.get_repo_tree(owner: str, repo: str, *, ref: str = 'HEAD', recursive: bool = True) -> Any — GET /repos/{owner}/{repo}/git/trees/{ref} — list every path in the repo in one call.get_user(username: str) -> Any — GET /users/{username} — profile: name, company, location, blog, email (if public), hireable, counts.get_user_social_accounts(username: str) -> Any — GET /users/{username}/social_accounts — the linked social accounts shown on the profile (e.g. LinkedIn, Mastodon, Twitter): list of {provider, url}. This is where a profile's LinkedIn lives.graphql(query: str, variables: dict | None = None) -> Any — POST /graphql — run any GraphQL query/mutation. Best for rich single-call candidate dossiers (profile + socialAccounts + top languages + pinned repos + contributions in one round-trip).iter_search_users(q: str, *, per_page: int = 100, max_results: int = 1000, **params) -> Iterator[dict] — Paginate /search/users up to GitHub's 1,000-result cap.list_repo_commits(owner: str, repo: str, *, author: str | None = None, per_page: int = 100, **params) -> Any — GET /repos/{owner}/{repo}/commits — commits (filter by author=username). Each carries commit.author.email / commit.committer.email — the basis for commit-email harvesting.list_user_events(username: str, **params) -> Any — GET /users/{username}/events/public — public activity (PushEvents carry commit author emails).list_user_followers(username: str, **params) -> Any — GET /users/{username}/followers — network expansion.list_user_repos(username: str, *, sort: str = 'pushed', per_page: int = 100, **params) -> Any — GET /users/{username}/repos — skill signal: languages, stars, recency. sort: pushed|updated|created|full_name.read_file(owner: str, repo: str, path: str, *, ref: str | None = None) -> Any — GET /repos/{owner}/{repo}/contents/{path} — read one file, authenticated + decoded.search_code(q: str, *, per_page: int = 30, page: int = 1, **params) -> Any — GET /search/code — find code (derive authors using a specific tech). Stricter rate limit.search_profile_match(full_name: str, *, company_name: str | None = None, location: str | None = None, linkedin_url: str | None = None, max_candidates: int = 5) -> dict[str, Any] — Name → likely GitHub identity matches with confidence scoring.search_repositories(q: str, *, sort: str | None = None, order: str | None = None, per_page: int = 30, page: int = 1) -> Any — GET /search/repositories — q e.g. 'language:rust stars:>500 topic:cli'. sort: stars|forks|updated.search_users(q: str, *, sort: str | None = None, order: str | None = None, per_page: int = 30, page: int = 1) -> Any — GET /search/users — find developers. q e.g. 'location:Berlin language:Go followers:>50 repos:>10'.user_dossier(username: str, *, jd_keywords: list[str] | str | None = None, max_repos: int = 12, include_emails: bool = True) -> dict[str, Any] — Return a recruiter-ready GitHub dossier for one user.Yes. hyreflow is a connector for Claude, ChatGPT and other AI assistants. Once hyreflow is connected, you ask for the outcome in plain language and the assistant calls GitHub for you. hyreflow exposes 16 GitHub actions this way.
No. GitHub needs no account to use through hyreflow, though you can connect your own GitHub key.
GitHub costs no hyreflow credits, and you can connect your own GitHub key.
Add the hyreflow MCP server to your assistant and sign in. hyreflow calls the GitHub API directly and exposes its actions as tools the assistant can run, so there is no separate GitHub server to install.
Connect hyreflow to Claude or ChatGPT and ask for the outcome. It reads the playbook above before it makes a single call.