Skip to content

Connect Charlie to Claude: Sync employee profiles and bank info

Learn how to connect Charlie to Claude using Truto's SuperAI MCP server. Sync employee profiles, bank information, and leave requests directly into your AI workflows.

Uday Gajavalli Uday Gajavalli · · 7 min read
Connect Charlie to Claude: Sync employee profiles and bank info

Connecting your HRIS directly to Claude unlocks powerful operational capabilities for your HR, finance, and IT teams. By integrating Charlie HR with Claude via the Model Context Protocol (MCP), you can automate employee onboarding, audit bank details, and query leave balances in real time through natural language.

This article is part of a set on integrating Charlie with AI platforms. If your team uses ChatGPT, check out our guide on connecting Charlie to ChatGPT. If you are building custom autonomous workflows, read our post on connecting Charlie to AI Agents.

Here is the step-by-step technical guide to connecting Charlie to Claude using Truto's SuperAI MCP Server.

The Engineering Reality of the Charlie API

Building a custom integration for Charlie is not as simple as wrapping standard CRUD endpoints. When exposing HRIS data to an LLM, you have to account for several domain-specific API characteristics:

  1. Nested Leave Period Constraints: Leave allowances in Charlie are not flat scalar values. The allowance_in_days is deeply tied to period_start, period_end, and specific arrays of leave_types. LLMs struggle to infer this temporality, so tools must cleanly separate historical leave from current period allowance.
  2. Strict Bank Details Formatting: Charlie expects bank information (like UK sort codes) to follow strict formatting conventions. The sort_code field must be submitted without punctuation. If an LLM hallucinates hyphens (e.g., 12-34-56), the API request will fail. We combat this by providing exact JSON Schema instructions in the tool definitions.
  3. Rate Limits and Backoff: Truto does not retry, throttle, or apply backoff on rate limit errors. When the upstream Charlie API returns an HTTP 429 (Too Many Requests), Truto passes that error directly to the caller. Truto normalizes the upstream rate limit information into standard headers (ratelimit-limit, ratelimit-remaining, ratelimit-reset) per the IETF specification. Your client implementation (or the AI orchestration layer) is strictly responsible for handling retries and exponential backoff.

Truto handles the heavy lifting of tool generation by dynamically mapping Charlie's API endpoints, required fields, and response schemas into LLM-ready tools. You do not need to write integration code.

Creating the Charlie MCP Server

An MCP server in Truto maps to a single connected Charlie account. It serves a JSON-RPC 2.0 endpoint that clients like Claude can query. You can spin up this server through the UI or programmatically via the API.

Option 1: Via the Truto UI

  1. Log into your Truto dashboard and navigate to the Integrated Accounts page.
  2. Select your connected Charlie account.
  3. Click on the MCP Servers tab.
  4. Click Create MCP Server.
  5. Select your desired configuration (e.g., restrict to read methods only, add tags, or set an expiry date).
  6. Copy the generated MCP Server URL (e.g., https://api.truto.one/mcp/a1b2c3d4...).

Option 2: Via the API

You can dynamically provision MCP servers for your users by sending a POST request to the Truto API. This creates a secure, hashed token stored in distributed KV.

curl -X POST https://api.truto.one/integrated-account/<INTEGRATED_ACCOUNT_ID>/mcp \
  -H "Authorization: Bearer <YOUR_TRUTO_API_KEY>" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Charlie HR Prod Data",
    "config": {
      "methods": ["read"],
      "tags": ["hr", "payroll"]
    },
    "expires_at": "2026-12-31T23:59:59Z"
  }'

The response will return a ready-to-use JSON-RPC 2.0 URL:

{
  "id": "abc-123",
  "name": "Charlie HR Prod Data",
  "config": { "methods": ["read"], "tags": ["hr", "payroll"] },
  "expires_at": "2026-12-31T23:59:59Z",
  "url": "https://api.truto.one/mcp/a1b2c3d4e5f6..."
}

Connecting to Claude

Once you have your Truto MCP URL, you can plug it into Claude.

The UI Connector Flow (Web / Enterprise)

For Claude Web and Enterprise users, connecting the MCP server is natively supported in the interface:

  1. In Claude, navigate to Settings -> Connectors -> Add custom connector.
  2. Paste the Truto MCP Server URL.
  3. Click Add.

Claude will immediately call the tools/list JSON-RPC method to discover all available Charlie resources and load them into the context window.

The Manual Config File Approach (Claude Desktop)

If you are running Claude Desktop locally and prefer a file-based configuration, you must update your claude_desktop_config.json. Because Truto exposes a remote HTTP endpoint and Claude Desktop expects local stdio binaries, you can use a lightweight SSE proxy utility (like @modelcontextprotocol/sse-client) to bridge the gap.

Edit your configuration file (located at ~/Library/Application Support/Claude/claude_desktop_config.json on macOS):

{
  "mcpServers": {
    "charlie-hris": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/sse-client",
        "https://api.truto.one/mcp/a1b2c3d4e5f6..."
      ]
    }
  }
}

Restart Claude Desktop. The tools will now populate in the interface (identified by the hammer icon).

Tool Inventory

Truto automatically generates precise, documented tools from the Charlie integration. View the complete schema on the Charlie integration page.

Hero Tools

These are the most commonly used endpoints for HR workflows:

get_single_charlie_team_member_by_id

Retrieves the core profile of a team member. Crucial for establishing context before looking up salaries or leave.

  • Contextual Note: Returns standard fields like display_name, work_email, job_title, and nested arrays for teams.
  • Example Prompt: "Get the profile details for employee ID 9012 to confirm their current job title and manager."

list_all_charlie_bank_accounts

Lists all bank accounts across the authenticated company.

  • Contextual Note: Heavily used by finance teams for payroll syncs. The sort_code is returned without punctuation.
  • Example Prompt: "List all bank accounts in Charlie so we can run an audit against our payroll software export."

list_all_charlie_team_member_leave_requests

Fetches historical and pending leave requests for a specific individual.

  • Contextual Note: Requires passing the team member's ID. Returns status (e.g., pending, approved) and dates.
  • Example Prompt: "Pull all leave requests for employee ID 334 to see if their holiday next week was approved."

list_all_charlie_salaries

Retrieves salary histories across the organization.

  • Contextual Note: Returns the pay_rate, pay_currency, and effective_date. Highly sensitive data - best used with strict tag filtering.
  • Example Prompt: "Fetch all salaries in Charlie and calculate the total monthly payroll run in GBP."

create_a_charlie_team_member_note

Allows the LLM to write back to Charlie, adding administrative notes to an employee's file.

  • Contextual Note: Requires team_member ID, the team_member_note_type, and the text content.
  • Example Prompt: "Create a note on employee 882's profile stating they completed their mandatory security compliance training today."

Full Inventory

Here is the complete inventory of additional Charlie tools available. For full schema details, visit the Charlie integration page.

  • list_all_charlie_company: Get details about the company in Charlie that owns the current credentials.
  • list_all_charlie_leave_allowances: List all leave allowances in Charlie.
  • list_all_charlie_leave_requests: List all leave requests across the company.
  • get_single_charlie_leave_request_by_id: Get a specific leave request in Charlie by id.
  • list_all_charlie_offices: List all offices belonging to the authenticated company.
  • get_single_charlie_office_by_id: Get details of a specific office in Charlie using id.
  • get_single_charlie_salary_by_id: Get a specific salary record in Charlie using id.
  • list_all_charlie_team_members: List all team members in the Charlie directory.
  • list_all_charlie_team_member_leave_allowance: Get the current leave allowance for a specific team member.
  • list_all_charlie_team_member_salaries: Get all historic and current salaries for a specific team member.
  • list_all_charlie_teams: List all functional teams configured in Charlie.
  • get_single_charlie_team_by_id: Get details about a specific team using id.
  • get_single_charlie_bank_account_by_id: Get a specific bank account record by id.
  • list_all_charlie_team_member_notes: List notes for a specific team member using id.
  • list_all_charlie_team_member_note_types: List all team member note types and permissions.
  • get_single_charlie_team_member_note_type_by_id: Get details of a specific team member note type.
  • create_a_charlie_team_member_note_type: Create a new team member note type in Charlie.

Workflows in Action

Connecting tools to an LLM is only useful if it solves real operational problems. Here is how specific personas use these tools in Claude.

The Payroll Pre-Flight (Finance Ops)

Before running end-of-month payroll, finance operators need to ensure bank details match the system of record.

"I am running the October payroll audit. Please get all bank accounts currently stored in Charlie, and then fetch all salaries so I can see who is getting paid what into which account."

Step-by-step Execution:

  1. Claude calls list_all_charlie_bank_accounts to gather the master list of account_number and sort_code data tied to employee IDs.
  2. Claude calls list_all_charlie_salaries to fetch the current pay_rate and pay_frequency for the company.
  3. The model joins the data in context and provides the user with a clean markdown table mapping employees, their monthly pay, and their bank details.

The Manager Leave Audit (Team Lead)

Managers frequently need to check if their direct reports have enough PTO left to approve an incoming request.

"Can you check the remaining leave allowance for team member ID 505? Also list any pending leave requests they have right now."

Step-by-step Execution:

  1. Claude calls list_all_charlie_team_member_leave_allowance using ID 505 to extract remaining_allowance_in_days.
  2. Claude calls list_all_charlie_team_member_leave_requests using ID 505 and filters the JSON response for status: pending.
  3. The model informs the manager: "Employee 505 has 8 days remaining in this period. They have one pending request for 3 days starting next Friday. Approving it will leave them with 5 days."

Security and Access Control

Exposing an HRIS API to an LLM requires strict boundaries. Truto provides security and compliance controls right at the MCP server level:

  • Method Filtering: Restrict servers to specific operation types. Setting methods: ["read"] ensures the LLM can never trigger a destructive action like delete or a mutating action like update, no matter what prompt the user enters.
  • Tag Filtering: Only expose subsets of tools. By filtering for a tag like "directory", the MCP server will only expose basic profile tools, completely hiding sensitive salaries and bank_accounts endpoints.
  • require_api_token_auth: Enable dual-layer authentication. When enabled, possession of the MCP URL is not enough; the client must also pass a valid Truto API token in the Authorization header to execute the tools.
  • expires_at: Support temporary AI agent sessions. Generate an MCP server URL that automatically self-destructs at a specific ISO datetime, ensuring the token cannot be reused after the workflow completes.

FAQ

Does Truto automatically retry when the Charlie API hits rate limits?
No. Truto does not retry, throttle, or apply backoff on rate limit errors. When Charlie returns an HTTP 429, Truto passes the error to the caller, normalizing the headers to `ratelimit-limit`, `ratelimit-remaining`, and `ratelimit-reset`. Your client must handle the retry logic.
Can I restrict Claude to only read employee data and prevent writes?
Yes. When generating the MCP server, you can use method filtering to restrict available tools to only 'read' operations, which will exclude 'create', 'update', and 'delete' endpoints.
Do I need to write custom schemas for Charlie endpoints?
No. Truto dynamically generates the required tool descriptions and JSON schemas based on the underlying Charlie integration documentation. Tools update automatically.

More from our Blog