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.
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:
- Nested Leave Period Constraints: Leave allowances in Charlie are not flat scalar values. The
allowance_in_daysis deeply tied toperiod_start,period_end, and specific arrays ofleave_types. LLMs struggle to infer this temporality, so tools must cleanly separate historical leave from current period allowance. - Strict Bank Details Formatting: Charlie expects bank information (like UK sort codes) to follow strict formatting conventions. The
sort_codefield 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. - 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
- Log into your Truto dashboard and navigate to the Integrated Accounts page.
- Select your connected Charlie account.
- Click on the MCP Servers tab.
- Click Create MCP Server.
- Select your desired configuration (e.g., restrict to
readmethods only, add tags, or set an expiry date). - 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:
- In Claude, navigate to Settings -> Connectors -> Add custom connector.
- Paste the Truto MCP Server URL.
- 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 forteams. - 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_codeis 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, andeffective_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_memberID, theteam_member_note_type, and the textcontent. - 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:
- Claude calls
list_all_charlie_bank_accountsto gather the master list ofaccount_numberandsort_codedata tied to employee IDs. - Claude calls
list_all_charlie_salariesto fetch the currentpay_rateandpay_frequencyfor the company. - 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:
- Claude calls
list_all_charlie_team_member_leave_allowanceusing ID 505 to extractremaining_allowance_in_days. - Claude calls
list_all_charlie_team_member_leave_requestsusing ID 505 and filters the JSON response forstatus: pending. - 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 likedeleteor a mutating action likeupdate, 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 sensitivesalariesandbank_accountsendpoints. - 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
Authorizationheader 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.