Agent-native · Model Context Protocol

Agent-native.
Not AI-bolted-on.

Most tools staple a chatbot onto the sidebar. FairHire ships an 200-tool MCP catalog so your agent operates the real hiring pipeline — the same permission-checked, audited surface a recruiter uses. It sources, screens, scores trials, and reads the numbers. The decisions that matter stay human.

# discover what this key may do
 fairhire.whoami()
  { org, role: "agent", permissions: […] }
 
# reads are broad
 fairhire.workflow.needs_attention()
 fairhire.trial.score({ trialId, score: 9.2 })
  → composite: 9.2 × .50 = 4.60
 
# the decision is a human gate
 fairhire.stage.advance({ to: "offer" })
  ✋ human_gate — post a note, @mention a human
 fairhire.notes.add({ mentions: ["@lena"] })
200 typed MCP tools one catalog, fully schema-validated
15 route domains the whole hiring pipeline
1 guarded surface agents use the same path as humans
0 unchecked writes every write is permission-gated
The architecture

Your agent runs the same rails your team does

One guarded service, two callers

Every tool is a thin, typed wrapper over the exact service function the human UI calls. Permission checks, org-scoping, and actor-tagging live in the service — so an agent can never reach a code path a recruiter couldn’t.

The same math, never recomputed

Composite scores, funnel metrics, and bottlenecks come from the one shared scoring the dashboard uses. The number your agent reads is the number your committee sees. No drift, by construction.

Every action is on the record

Agent writes are tagged as agent actions and land in the same activity feed, stage history, and immutable hash-chained audit log as human ones. The fairness trail doesn’t care who acted — only what happened.

The catalog

200 tools across the whole pipeline

The fairhire.* catalog covers every stage of hiring, from sourcing a passive candidate to assembling a fairness page. Each tool is input-validated and returns structured results your agent can act on.

Requisitions

7

Open roles as the agent’s unit of work — with live health, pipeline config, and hiring teams.

  • fairhire.req.list
  • fairhire.req.get
  • fairhire.req.create
  • fairhire.req.set_status
  • fairhire.req.needs_attention

Candidates & profiles

8

Browse, search, create, dedupe, and merge. Resume parsing is local and $0 — candidate data never leaves the stack.

  • fairhire.candidates.search
  • fairhire.candidate.parse_resume
  • fairhire.candidate.find
  • fairhire.candidate.merge

Talent CRM

14

Source passive candidates, tag, pool, filter, dedupe, and re-engage — email-deduped, DNC honored.

  • fairhire.candidates.source
  • fairhire.candidates.import
  • fairhire.candidates.filter
  • fairhire.pools.add

Funnel & stages

7

Move candidates through exit gates. A blocked gate returns the missing requirement — the agent never force-moves.

  • fairhire.stage.advance
  • fairhire.workflow.get_stages
  • fairhire.workflow.needs_attention
  • fairhire.stages.list

Scorecards

2

Weighted criteria roll into one composite via the shared scoring — the same number the UI shows.

  • fairhire.scorecard.upsert
  • fairhire.composite.get

Paid trials

6

Scope, track deliverables, score the real work, and record payment. The heaviest signal in the composite.

  • fairhire.trial.create
  • fairhire.trial.score
  • fairhire.trial.recordDeliverable
  • fairhire.trial.recordPayment

Interviews

7

Draft rubric-mapped kits, propose slots, schedule, attach transcripts, and score panels.

  • fairhire.interviewKit.draft
  • fairhire.interview.propose
  • fairhire.interview.attachTranscript
  • fairhire.interview.score

Collaboration

6

Notes, threaded comments, and blind-by-default reviews. Agent actions are badged in the feed.

  • fairhire.notes.add
  • fairhire.candidate.comment
  • fairhire.candidate.review
  • fairhire.candidate.activity

Communications

12

Templates, messages, and multi-step sequences — with per-candidate contact preferences respected.

  • fairhire.templates.create
  • fairhire.messages.send
  • fairhire.sequences.enroll
  • fairhire.sequences.stop

Offers

4

Draft, read, and template offers. There is deliberately no tool to approve or send one — that stays human.

  • fairhire.offer.draft
  • fairhire.offer.get
  • fairhire.offer.list
  • fairhire.offerTemplate.list

Transparency

5

Assemble and preview a fairness snapshot freely; publishing and external grants are human-gated.

  • fairhire.transparency.assemble
  • fairhire.transparency.publish
  • fairhire.transparency.grant
  • fairhire.transparency.revoke

Analytics, audit & meta

10

Whoami, dashboard stats, the same funnel/bottleneck/conversion numbers as the UI, and the immutable audit chain. Fairness stats are aggregate-only.

  • fairhire.whoami
  • fairhire.analytics.funnel
  • fairhire.audit.query
  • fairhire.audit.verify_chain
Human gates

Automation stops at the lines that matter

The agent can do almost everything a recruiter can — but the consequential decisions are hard-gated in code. A default operator key hitting one of these gets a human_gate error and is told to post a note and @mention a human, not to retry. There is no flag that lets an operator agent override them.

  • Advance into an offer Extending an offer is a hiring decision, not a pipeline move.
  • Reject a candidate A rejection is irreversible from the candidate’s side — a human owns it.
  • Approve or send an offer There is no tool for it. The agent can draft; a person sends.
  • Publish or grant a fairness page Exposing a snapshot to an outsider needs an elevated, human-held permission.
  • Mint or manage agent keys No agent key can create another key. Issuance is admin-only tooling.
Key security

Org-scoped keys you can revoke in one call

Hashed, shown once

A key is minted as fairhire_sk_… and shown a single time. Only its SHA-256 hash is stored — the plaintext is never recoverable, even by us.

Revoke takes effect immediately

Every MCP call re-resolves the key into a fresh, org-scoped actor context. Revoke or expire a key and the very next call fails — no session to wait out.

Scoped to one workspace

A key is bound to one organization and one role. It never sees another workspace’s reqs, candidates, or tags — org-scoping is enforced in the service on every read and write.

No key mints another key

Key issuance and role management are admin-only tooling — never exposed as agent tools. Elevated permissions (publishing, DEI reads, audit reads, gate overrides) are opt-in, not the default.

Give your agent a real seat — and real guardrails.

Mint a scoped key, point your MCP client at FairHire, and let it run the funnel while the decisions stay yours.