Ashby MCP server for AI agents

Live

API KEY

RECRUITING

Productivity

Ashby gives your agent recruiting operations: search candidates and applications, move applications between stages, schedule interviews, collect and submit feedback, manage jobs, postings, and openings, and run the offer process.

  • Per-user credentials: each call uses the actual user's API key, never a shared bot.
  • Encrypted per-tenant vault: AES-256, resolved at request time, never in LLM context.
  • Scoped before every call: pre-call scope check, 90-day SIEM-exportable audit chain.
Ashby
agent · Acme Q3
Run
Who is at the onsite stage for the Senior Backend Engineer job?
S
ashby_applications_list
126ms
Recruiting agent
4 candidates are at the onsite stage for Senior Backend Engineer. Maya Chen moved there yesterday.
Sources: 1 job, 27 applications
ashby
27 applications
18:29
Message Claude...

Tools your recruiting agent reaches for on Ashby, scoped per user.

CALL ANY TOOL
98 tools for recruiting in Ashby: search candidates and applications, change stages, schedule interviews, submit feedback, manage jobs and postings, and start offers.
ashby_application_create
Create application
Create an application that considers an existing Ashby candidate for a job, optionally choosing the interview plan, starting stage, source and credited user. Returns the created application record including its id and current interview stage. Use after ashby_candidate_create to put a candidate into a job's pipeline. Use ashby_application_transfer to move an existing application to another job. Requires the candidatesWrite permission on the Ashby API key.
Parameters
Name
Type
Required
Description
candidate_id
string
Required
The id of the candidate to consider for a job. Example: e9ed20fd-d45f-4aad-8a00-a19bfba0083e.
job_id
string
Required
The id of the job to consider the candidate for. Example: e9ed20fd-d45f-4aad-8a00-a19bfba0083e.
application_history
array
Optional
Optional history events to create the application with. Each event needs the stage id, a stage number (0 for the first; the highest number is the current stage) and the time the application entered that stage; an archive reason id is needed when the stage is of type Archived. Example: [{"stageId": "e9ed20fd-d45f-4aad-8a00-a19bfba0083e", "stageNumber": 0, "enteredStageAt": "2024-01-15T10:30:00Z"}].
created_at
string
Optional
An ISO date string to set the application's createdAt timestamp. Defaults to the time the call was made when not provided. Example: 2022-08-12T20:29:56.964Z.
credited_to_user_id
string
Optional
The id of the user the application will be credited to. Example: e9ed20fd-d45f-4aad-8a00-a19bfba0083e.
interview_plan_id
string
Optional
The id of the interview plan to place the application in. If none is provided, the default interview plan is used. Example: e9ed20fd-d45f-4aad-8a00-a19bfba0083e.
interview_stage_id
string
Optional
The interview stage to place the application in. Use a stage id from ashby_interview_stages_list, or the value FirstPreInterviewScreen for the first pre-interview screen stage. Defaults to the first Lead stage. Example: e9ed20fd-d45f-4aad-8a00-a19bfba0083e.
source_id
string
Optional
The source to set on the application being created. Example: e9ed20fd-d45f-4aad-8a00-a19bfba0083e.
ashby_application_feedback_list
List application feedback
ashby_application_feedback_submit
Submit application feedback
ashby_application_get
Get application
ashby_application_hiring_team_member_add
Add application hiring team member
ashby_application_hiring_team_member_remove
Remove application hiring team member
ashby_application_update
Update application
ashby_applications_list
List applications
ashby_candidate_note_create
Create candidate note
ashby_candidate_notes_list
List candidate notes
ashby_candidates_list
List candidates
ashby_candidates_search
Search candidates
ashby_custom_field_value_set
Set custom field value
ashby_department_get
Get department
ashby_departments_list
List departments
ashby_interview_briefing_get
Get interview briefing
ashby_interview_events_list
List interview events
ashby_interview_schedule_cancel
Cancel interview schedule
ashby_interview_stages_list
List interview stages
ashby_interviewer_pool_get
Get interviewer pool
ashby_job_boards_list
List job boards
ashby_job_create
Create job
ashby_job_posting_get
Get job posting
ashby_job_update
Update job
ashby_locations_list
List locations
ashby_offer_process_start
Start offer process
ashby_opening_create
Create opening
ashby_opening_get
Get opening
ashby_openings_search
Search openings
ashby_projects_list
List projects

For more tools, view docs.

Build your Agent
Same auth pattern across LangChain, OpenAI, Anthropic, and Google ADK.
Python · LlamaIndex
import { ScalekitClient } from "@scalekit-sdk/node";
import { createReactAgent } from "@langchain/langgraph/prebuilt";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

// Ashby tools scoped to this user
const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["ashby"], toolNames: [
    "ashby_candidates_search",
    "ashby_application_stage_change",
    "ashby_interview_schedule_create"] },
  pageSize: 100,
});

const agent = createReactAgent({ llm, tools });
await agent.invoke({ messages: [{ role: "user", content: "Move Maya Chen to the onsite stage and schedule her technical interview for Thursday" }] });
import OpenAI from "openai";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const openai = new OpenAI();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["ashby"] }, pageSize: 100,
});

const res = await openai.chat.completions.create({
  model: "gpt-5",
  messages: [{ role: "user", content: "Move Maya Chen to the onsite stage and schedule her technical interview for Thursday" }],
  tools,
});

// Execute the tool call with the user's vaulted Ashby API key
await sk.tools.executeTool(res.choices[0].message.tool_calls[0], "user_123");
import Anthropic from "@anthropic-ai/sdk";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const anthropic = new Anthropic();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["ashby"] }, pageSize: 100,
});

const msg = await anthropic.messages.create({
  model: "claude-sonnet-5",
  max_tokens: 1024,
  messages: [{ role: "user", content: "Move Maya Chen to the onsite stage and schedule her technical interview for Thursday" }],
  tools,
});

// Tool call runs with the user's vaulted Ashby API key
await sk.tools.executeTool(msg.content, "user_123");
import { Agent } from "@google/adk/agents";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["ashby"] }, pageSize: 100,
});

const agent = new Agent({
  name: "recruiting_agent",
  model: "gemini-2.5-pro",
  instruction: "Ashby tools scoped to this user",
  tools,
});

await agent.run("Move Maya Chen to the onsite stage and schedule her technical interview for Thursday");
Try these prompts
Copy any prompt into your agent. Each maps directly to a Ashby tool. Click to copy, paste into your agent, done.
Candidates
Copy the prompt
Copied
Find the candidate with email maya.chen@example.com.
Copy the prompt
Copied
Add a note to Maya Chen's profile about her salary expectations.
Copy the prompt
Copied
Add Maya Chen to the Q4 backend sourcing project.
Pipeline
Copy the prompt
Copied
Move Maya Chen's application to the onsite stage.
Copy the prompt
Copied
Schedule a 45-minute technical interview for Maya Chen on Thursday.
Copy the prompt
Copied
Show the feedback submitted on Maya Chen's application.
Jobs and offers
Copy the prompt
Copied
Create a Product Designer job in the London office.
Copy the prompt
Copied
Unpublish the Senior Backend Engineer posting.
Copy the prompt
Copied
Start the offer process for Maya Chen.
SEE HOW AUTH WORKS
Each user connects their own Ashby API key once, and Scalekit sends it with every call. Keys stay vaulted, every call is scope checked, and every action is logged.
1
Authorize
Your user connects
Ashby
once. We tie it to their identity and the meetings they approved — no shared bot account, no org-wide access
Who:
user ‘A’
when:
Once per user
access:
Limited to user
2
Store
Their
Ashby
token lives in a vault scoped to them. User A's meetings are never reachable by an agent acting for user B, even on the same connection
vault:
encrypted
scope:
per-user
tokens:
auto-refreshed
3
Resolve
When your agent calls a
Ashby
tool, we fetch the right token server-side. It never touches your agent, never appears in the LLM context, never shows up in your logs
speed:
~40ms
check:
before every call
seen by:
nobody
4
Audit
Every
Ashby
tool call is logged — who triggered it, which meeting was fetched, what came back. 90 days of history, tied to the user who authorized it
history:
90 days
export:
SIEM-ready
logged:
every call
Test other agents
See the same per-user auth pattern across other recruiting and HR connectors.
People Ops and HR teams
Offer letter routing agent
Drafts the offer in PandaDoc, blocks on the hiring manager's approval in Slack, then emails the candidate their e-signature link. Every call runs as the recruiter who triggered it, never a shared HR bot.
Support and Ops Teams
Meeting prep
Pulls agenda, participant context, and open action items before every meeting.
Test other agents
See the same per-user auth pattern across other recruiting and HR connectors.
PEOPLE OPS
Offer letter routing agent
Draft the offer in PandaDoc, gate it on hiring manager approval in Slack, then email the candidate their signature link.
OPS
Meeting prep agent
Assemble the agenda, HubSpot attendee history, and open action items from Gmail before every meeting on the calendar.
Why Scalekit
Secure your agent's access. Connectors ship in minutes
01.
Shared tokens break per-user analytics
A shared Ashby API key looks fine in a demo. In production every stage change and offer looks like one service account, and you cannot tell which user triggered it. Scalekit resolves the credential of the actual user who triggered the agent, never a shared bot.
// shared key
audit → bot_service_account

// scalekit
audit → user_abc ✓
02.
Authentication is not authorization
03.
Multi-tenancy is architectural
04.
Ashby today. Ten connectors tomorrow.
“Our agents act across Salesforce, Gong, Google Drive, and more, on behalf of every customer. Scalekit behind the scenes meant we can keep adding tools without ever rebuilding how credentials or tool calling work.”
Venu Madhav Kattagoni
Head of Engineering / Von
FAQs
Frequently Asked Questions
Does the agent access Ashby as the user or through a shared key?
As the user. Each user connects their own Ashby API key once, and Scalekit sends it with every call. Audit logs attribute every stage change, note, and offer to that user, not a shared service account.
Where is the Ashby API key stored?
In Scalekit's managed AES-256 token vault, namespaced per tenant. To rotate it, the user reconnects with a new API key. Revocation is a single dashboard action. Credentials never appear in prompts, logs, or LLM context.
Can I limit what the agent does in Ashby?
Yes. Filter by tool name in listScopedTools to expose only what you want, for example the search and list tools without ashby_offer_create or ashby_interview_schedule_cancel. Scalekit also enforces scope checks before every API call.
What happens when a user revokes Ashby access?
The connection is invalidated on the next tool call. Subsequent requests for that user fail closed with a clear error. Other users in the tenant remain unaffected. The event is logged for audit.
Can the agent submit interview feedback in Ashby?
Yes. ashby_application_feedback_submit submits a feedback form for an application, and ashby_application_feedback_request_create asks an Ashby user to submit theirs. ashby_application_feedback_list returns the feedback already submitted.
Start in your coding agent
Up and running in one command
Install the Scalekit skill in your editor of choice. Connector, auth, tools, prompt, all wired up
Claude Code REPL
/plugin marketplace add scalekit-inc/claude-code-authstack
/plugin install agentkit@scalekit-auth-stack
Cursor Code REPL
# ~/.cursor/mcp.json
{
""mcpServers"": {
""ashby"": {
""url"": ""https://mcp.scalekit.com/ashby"",
""headers"": { ""Authorization"": ""Bearer $SCALEKIT_TOKEN"" }
}
}
}
Codex Code REPL
# ~/.codex/config.toml
[mcp_servers.ashby]
url = ""https://mcp.scalekit.com/ashby""
auth_env = ""SCALEKIT_TOKEN""
Copilot Code REPL
# .vscode/mcp.json
{
""servers"": {
""ashby"": {
""url"": ""https://mcp.scalekit.com/ashby"",
""type"": ""http""
}
}
}