Skip to content

Connect Lever to Claude: Automate Interviews and Feedback Loops

Learn how to build a secure MCP server to connect Lever to Claude. Automate interview feedback, candidate sourcing, and pipeline management workflows.

Uday Gajavalli Uday Gajavalli · · 9 min read

If your team needs to connect Lever to Claude to automate candidate sourcing, extract interview feedback, or manage complex pipeline progressions, you need a Model Context Protocol (MCP) server. This server acts as the translation layer between Claude's natural language tool calls and Lever's REST APIs. You can either build and maintain this infrastructure yourself - dealing with token refresh lifecycles and schema mapping - or use a managed integration platform like Truto to dynamically generate a secure, authenticated MCP server URL. If your team uses ChatGPT, check out our guide on /connect-lever-to-chatgpt-manage-full-cycle-hiring-and-pipelines/ or explore our broader architectural overview on /connect-lever-to-ai-agents-orchestrate-job-postings-and-sourcing/.

Giving a Large Language Model (LLM) read and write access to a specialized applicant tracking system (ATS) like Lever is an engineering challenge. You have to handle OAuth 2.0 token lifecycles, map complex JSON schemas to MCP tool definitions, and deal with Lever's strict domain-specific data constraints. Every time Lever updates an endpoint or changes how feedback fields are structured, you have to update your server code, redeploy, and test the integration.

This guide breaks down exactly how to use Truto to generate a secure, managed MCP server for Lever, connect it natively to Claude, and execute complex recruiting workflows using natural language.

The Engineering Reality of the Lever API

A custom MCP server is a self-hosted integration layer. While the open MCP standard provides a predictable way for models to discover tools, the reality of implementing it against specialized ATS APIs is painful. Lever is built to manage massive applicant pipelines, complex interview panels, and highly structured feedback forms. Its API reflects that complexity.

If you decide to build a custom Lever MCP server from scratch, here are the specific integration challenges you will face:

Complex Nested Feedback Structures Feedback forms in Lever are not simple flat key-value pairs. Submitting or reading feedback involves nested arrays of field objects that contain scores, text responses, and predefined options. An LLM cannot simply guess this payload structure. A managed MCP server exposes tools like create_a_lever_feedback with strictly defined JSON schemas (derived directly from API documentation) that explicitly guide the LLM to provide the correct field arrays and stage parameters.

Pipeline Stage Progression Mechanics Moving a candidate in Lever is not a matter of simply updating a status string on a profile. You have to query the available pipeline stages, extract the correct stage ID, and execute a specific stage-change operation. This often results in a stage-change note being appended to the opportunity. Without strict tool definitions, LLMs will attempt to simply PATCH an opportunity object, resulting in validation errors.

Strict Rate Limits Without Safety Nets Lever enforces strict rate limits to protect its infrastructure. When building an integration, you must account for HTTP 429 Too Many Requests errors. It is a critical factual note that Truto does not retry, throttle, or apply backoff on rate limit errors. When the upstream Lever API returns a 429, Truto passes that error directly to the caller. However, Truto normalizes the upstream rate limit information into standardized headers (ratelimit-limit, ratelimit-remaining, ratelimit-reset) per the IETF specification. The caller (your LLM agent framework or orchestration layer) is strictly responsible for inspecting these headers and applying its own retry and backoff logic.

Creating the Lever MCP Server

Truto dynamically generates MCP tools based on the documentation and schema definitions of the underlying integration. You can generate a Lever MCP server using either the Truto user interface or programmatically via the API.

Method 1: Via the Truto UI

For administrators and internal tooling teams, the quickest way to spin up an MCP server is through the dashboard:

  1. Navigate to the Integrated Accounts page in your Truto dashboard and select your connected Lever account.
  2. Click the MCP Servers tab.
  3. Click Create MCP Server.
  4. Select your desired configuration. You can assign a human-readable name, filter by specific methods (e.g., read-only), and set an optional expiration date.
  5. Click Create and immediately copy the generated MCP server URL. (You will not be able to see the raw token again).

Method 2: Via the Truto API

For engineering teams building multi-tenant AI applications, you will want to provision MCP servers dynamically. You can do this by making an authenticated POST request to the Truto API.

// Example: Generating a Lever MCP Server via API
const response = await fetch('https://api.truto.one/integrated-account/{integrated_account_id}/mcp', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_TRUTO_API_KEY',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    name: "Claude-Lever-Integration",
    config: {
      methods: ["read", "write"], // Expose both read and write operations
      tags: ["recruiting", "candidates"]
    },
    expires_at: "2026-12-31T23:59:59Z"
  })
});
 
const mcpServer = await response.json();
console.log(mcpServer.url); 
// Output: https://api.truto.one/mcp/a1b2c3d4e5f6...

This API call validates that the integration has tools available, generates a secure cryptographically hashed token, stores it in a distributed Key-Value store, and schedules cleanup alarms for the expiration date. The resulting URL contains everything Claude needs to authenticate and discover tools.

Connecting the MCP Server to Claude

Once you have your MCP server URL, you need to register it with your LLM client. Truto's MCP servers communicate using JSON-RPC 2.0 over standard HTTP POST, making them highly compatible.

Method A: Via the Claude UI (or ChatGPT)

If you are using consumer interfaces that support custom connectors, adding the server takes seconds:

  1. In your AI client (e.g., Claude Desktop, ChatGPT), navigate to Settings -> Integrations (or Connectors).
  2. Click Add MCP Server or Add Custom Connector.
  3. Paste the Truto MCP URL (https://api.truto.one/mcp/...).
  4. Click Add or Save. The client will immediately perform a handshake, calling the initialize and tools/list endpoints to discover the available Lever tools.

Method B: Via the Claude Desktop Configuration File

If you are configuring Claude Desktop locally for development, you can add the server using the configuration file and the standard Server-Sent Events (SSE) transport adapter.

Open your claude_desktop_config.json file (typically found at ~/Library/Application Support/Claude/claude_desktop_config.json on macOS) and add the following:

{
  "mcpServers": {
    "lever-truto": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-sse",
        "--url",
        "https://api.truto.one/mcp/YOUR_SECURE_TOKEN_HERE"
      ]
    }
  }
}

Restart Claude Desktop. The application will connect to the server, and the model will instantly understand how to read and write to your Lever instance.

Hero Tools for Lever Automation

Truto maps Lever's REST endpoints into heavily documented, schema-validated MCP tools. Below are the highest-leverage tools for automating recruiting workflows.

List All Lever Opportunities

This tool retrieves all pipeline opportunities for contacts. It is the primary entry point for agentic workflows, allowing Claude to find candidate IDs based on name, stage, or tags.

"Claude, find all opportunities currently in the 'Onsite Interview' stage and summarize their current tags and origins."

Lever Opportunities Move

Moving an opportunity to a different pipeline stage. This tool takes the opportunity ID and the target stage ID, returning the ID of the auto-generated stage-change note.

"Move candidate ID 12345 to the 'Offer Extended' stage."

List All Lever Interviews

Retrieves all scheduled and past interviews for a specific opportunity. It returns critical panel data, subject details, timezones, and the specific interviewers assigned to the candidate.

"Pull the interview schedule for candidate ID 98765. Who is on their technical panel this Thursday?"

Create a Lever Feedback

Submits a new feedback form for a Lever opportunity. This tool expects a specific array of fields containing the submitted values and options, mapping directly to Lever's complex feedback architecture.

"Submit interview feedback for candidate 44556. Use the standard engineering rubric, score the technical communication as a 4 out of 5, and add a note that they excelled at system design."

List All Lever Resumes

Lists all resumes attached to a specific Lever opportunity. Crucially, this returns not just file metadata, but the parsedData object containing the candidate's extracted positions and education history.

"Fetch the parsed resume data for the latest applicant to the Senior DevOps role and summarize their past three job titles."

Create a Lever Posting

Creates a new job posting in the Lever account. It requires text, categories (team, department, location), and manages the state (defaulting to draft). API-created postings skip the approvals chain.

"Draft a new job posting for a 'Backend Engineer' in the Engineering department based in New York. Leave it in the draft state for my review."

To view the complete inventory of available Lever tools, including schemas for users, notes, files, and requisitions, visit the Lever Integration Page.

Workflows in Action

By exposing these tools to Claude, you can orchestrate complex, multi-step workflows that historically required manual data entry by recruiters.

Scenario 1: Automated Interview Debrief Summarization

Persona: Engineering Hiring Manager

"Claude, pull all the interview feedback for Jane Doe (opportunity ID 55432) from yesterday's onsite loop. Summarize the technical scores, highlight any red flags, and draft a final debrief note to post on her profile."

  1. Claude calls list_all_lever_interviews with the opportunity ID to confirm the panel.
  2. Claude calls list_all_lever_feedback to extract the submitted forms and scores from the interviewers.
  3. Claude processes the raw JSON, analyzing the nested score arrays to determine consensus.
  4. Claude calls create_a_lever_note to post the synthesized debrief summary directly to the candidate's Lever profile.
sequenceDiagram
    participant User as Hiring Manager
    participant Agent as Claude
    participant Truto as Truto MCP Server
    participant Upstream as Lever API

    User->>Agent: "Summarize feedback for Jane Doe and post debrief note"
    Agent->>Truto: Call list_all_lever_feedback(opportunity_id)
    Truto->>Upstream: GET /opportunities/{id}/feedback
    Upstream-->>Truto: Return nested feedback arrays
    Truto-->>Agent: JSON Schema validated response
    Agent->>Agent: Analyze scores and text responses
    Agent->>Truto: Call create_a_lever_note(opportunity_id, text)
    Truto->>Upstream: POST /opportunities/{id}/notes
    Upstream-->>Truto: Return note ID
    Truto-->>Agent: Success confirmation
    Agent-->>User: "Debrief posted to Lever profile."

Scenario 2: Resume Screening and Pipeline Progression

Persona: Technical Sourcer

"Review the resumes for all new applicants in the 'New Lead' stage. If their parsed resume shows more than 5 years of experience using Kubernetes, move them to the 'Recruiter Screen' stage."

  1. Claude calls list_all_lever_opportunities to get a batch of candidates in the starting stage.
  2. Claude loops through the IDs, calling list_all_lever_resumes for each to access the parsedData.
  3. Claude evaluates the parsed work history against the user's criteria (Kubernetes, 5+ years).
  4. For candidates who pass, Claude calls list_all_lever_stages to find the target stage ID.
  5. Claude calls lever_opportunities_move to advance the qualified candidates, leaving the rest for manual review.
graph TD
    A["Get New Leads<br>(list_all_lever_opportunities)"] --> B["Extract Parsed Data<br>(list_all_lever_resumes)"]
    B --> C{"Experience > 5 yrs<br>Kubernetes?"}
    C -->|"Yes"| D["Get Stage ID<br>(list_all_lever_stages)"]
    C -->|"No"| E["Skip Candidate"]
    D --> F["Advance Candidate<br>(lever_opportunities_move)"]

Security and Access Control

Giving an LLM write access to your primary ATS requires strict governance. Truto's MCP servers provide granular access controls enforced at the token layer:

  • Method Filtering: You can restrict a server to read-only access by passing methods: ["read"] during creation. If Claude attempts to invoke a create or update tool, the server will reject it.
  • Tag Filtering: You can isolate scopes by functional area. Passing tags: ["recruiting"] ensures only tools related to candidates and jobs are exposed, hiding sensitive administrative or billing endpoints.
  • Expiration (TTL): Set an expires_at timestamp for contractor or temporary workflow access. Truto's distributed architecture uses scheduled alarms to automatically tear down the server and purge the keys exactly when time expires.
  • Extra Authentication: By enabling require_api_token_auth, the MCP server will mandate that the client provides a valid Truto API token in the Authorization header. This guarantees that possession of the URL alone is insufficient to execute tools.

Architecting for Scale

Integrating Lever with Claude transforms how recruiting teams operate. Instead of clicking through complex UI tabs to extract interview scores or update pipeline stages, teams can leverage autonomous agents to synthesize data and execute workflows in seconds.

By utilizing an MCP server backed by a platform like Truto, you bypass the friction of custom API development. You don't have to write TypeScript interfaces for Lever's deeply nested feedback forms, nor do you have to build infrastructure to manage OAuth tokens. You get documentation-driven tool generation, strictly enforced JSON schemas, and transparent error handling - allowing your engineers to focus on AI logic rather than API plumbing.

FAQ

Does the Truto MCP server handle Lever's rate limits automatically?
No. Truto does not retry, throttle, or apply backoff on rate limit errors. When the Lever API returns an HTTP 429 error, Truto passes that error directly to the caller, normalizing the upstream rate limit information into standardized headers (ratelimit-limit, ratelimit-remaining, ratelimit-reset). Your LLM or agent framework must handle the retry logic.
Can I restrict Claude to only read data from Lever?
Yes. When generating the MCP server via Truto, you can pass a configuration object with method filtering (e.g., methods: ["read"]). This ensures the server only exposes GET and LIST operations, preventing the LLM from creating or updating Lever records.
How does Claude handle complex data structures like Lever feedback forms?
Truto dynamically generates MCP tools based on Lever's API documentation, injecting strict JSON schema definitions for the request body. When Claude calls a tool like create_a_lever_feedback, it is guided by this schema to properly format the nested arrays and field objects Lever expects.
How do I connect the Lever MCP server to Claude Desktop?
You can connect it via the Claude Desktop UI by adding a custom connector and pasting the Truto URL, or by editing the claude_desktop_config.json file to use the @modelcontextprotocol/server-sse transport adapter pointing to your generated Truto URL.

More from our Blog