Personio MCP server for AI agents

Live

API CREDENTIALS (OAUTH 2.0 CLIENT CREDENTIALS)

HR MANAGEMENT

Productivity

Personio gives your agent HR data and actions: look up employees and employments, track absences and attendance, run custom reports, read salary bands and compensation, and work with recruiting candidates and applications.

  • One service account: you connect Personio once with API credentials, and Scalekit authenticates every call.
  • 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.
Personio
agent · Acme Q3
Run
Who has approved time off next week?
S
personio_absence_period_list
119ms
HR agent
3 people have approved time off next week. 2 are on vacation all week and 1 is out on Friday.
Sources: Personio absences, 3 periods
personio
3 absences
18:29
Message Claude...

Tools your HR agent reaches for on Personio, scoped before every call.

CALL ANY TOOL
53 tools for HR management in Personio: people and employments, absences and attendance, projects, compensation and salary bands, custom reports, org units, and recruiting candidates and applications.
personio_absence_period_breakdown_list
List absence period breakdown
List the day-by-day breakdown of one absence period in Personio. Returns one entry per day with the date and the effective duration of the absence on that day. Use this to see how much time an absence actually takes on each day. Use personio_absence_period_get for the absence itself.
Parameters
Name
Type
Required
Description
absence_period_id
string
Required
The ID of the absence period. Get it from personio_absence_period_list. Example: 493eff0a-2c5a-467e-8966-f70b4e3805a6.
cursor
string
Optional
Pagination cursor for the breakdowns list. Leave empty for the first page. To get the next page, pass the cursor from the previous response's _meta.links.next.href (the value of its cursor query parameter). Example: cur_82sQwR2eZvKilo2duNh219Kw.
limit
integer
Optional
Maximum number of daily breakdowns to return in one page, from 1 to 100. Leave empty to use the Personio default of 28. Example: 50.
personio_absence_period_create
Create absence period
personio_absence_period_get
Get absence period
personio_absence_period_list
List absence period
personio_absence_period_update
Update absence period
personio_absence_type_get
Get absence type
personio_attendance_period_create
Create attendance period
personio_attendance_period_list
List attendance period
personio_compensation_type_create
Create compensation type
personio_compensation_type_list
List compensation type
personio_cost_center_list
List cost center
personio_document_update
Update document
personio_employment_get
Get employment
personio_employment_list
List employment
personio_legal_entity_get
Get legal entity
personio_legal_entity_list
List legal entity
personio_person_get
Get person
personio_person_list
List person
personio_person_update
Update person
personio_project_create
Create project
personio_project_list
List project
personio_project_member_add
Add project member
personio_recruiting_application_get
Get recruiting application
personio_recruiting_application_list
List recruiting application
personio_recruiting_candidate_list
List recruiting candidate
personio_recruiting_category_get
Get recruiting category
personio_recruiting_category_list
List recruiting category
personio_report_attribute_list
List report attribute
personio_report_get
Get report
personio_salary_band_list
List salary band

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);

// Personio tools available to this agent
const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["personio"], toolNames: [
    "personio_person_list",
    "personio_absence_type_list",
    "personio_absence_period_create"] },
  pageSize: 100,
});

const agent = createReactAgent({ llm, tools });
await agent.invoke({ messages: [{ role: "user", content: "Book 3 days of paid vacation for Sam Lee starting December 22" }] });
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: ["personio"] }, pageSize: 100,
});

const res = await openai.chat.completions.create({
  model: "gpt-5",
  messages: [{ role: "user", content: "Book 3 days of paid vacation for Sam Lee starting December 22" }],
  tools,
});

// Execute the tool call with the vaulted Personio service account credentials
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: ["personio"] }, pageSize: 100,
});

const msg = await anthropic.messages.create({
  model: "claude-sonnet-5",
  max_tokens: 1024,
  messages: [{ role: "user", content: "Book 3 days of paid vacation for Sam Lee starting December 22" }],
  tools,
});

// Tool call runs with the vaulted Personio service account credentials
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: ["personio"] }, pageSize: 100,
});

const agent = new Agent({
  name: "hr_agent",
  model: "gemini-2.5-pro",
  instruction: "Personio tools available to this agent",
  tools,
});

await agent.run("Book 3 days of paid vacation for Sam Lee starting December 22");
Try these prompts
Copy any prompt into your agent. Each maps directly to a Personio tool. Click to copy, paste into your agent, done.
People
Copy the prompt
Copied
Look up the employment details for dana.kim@acme.com.
Copy the prompt
Copied
List people created in Personio in the last 30 days.
Copy the prompt
Copied
Set Maria Lopez as the supervisor on Alex Rivera's employment.
Time
Copy the prompt
Copied
Who has approved time off next week?
Copy the prompt
Copied
Book 3 days of paid vacation for Sam Lee starting December 22.
Copy the prompt
Copied
Log 8 hours of attendance for Chen Wei on the Website Redesign project yesterday.
Reports and recruiting
Copy the prompt
Copied
Run the Headcount by Department report.
Copy the prompt
Copied
List recruiting applications updated this week.
Copy the prompt
Copied
Show the salary band for the Senior Product Manager job.
SEE HOW AUTH WORKS
You connect Personio once with a service account, and Scalekit authenticates every call. Service account credentials stay vaulted, every call is scope checked, and every action is logged.
1
Authorize
Your user connects
Personio
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
Personio
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
Personio
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
Personio
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 auth pattern across other HR and finance 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.
People Ops and HR teams
Performance review collector
Collects review feedback from Airtable and Google Forms scoped to each manager's direct reports, writes per-employee summaries to Notion, and DMs the manager a Slack digest.
Test other agents
See the same auth pattern across other HR and finance 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.
PEOPLE OPS
Performance review collector agent
Collect review feedback from Airtable and Google Forms per manager, summarise each report in Notion, and DM the digest in Slack.
Why Scalekit
Secure your agent's access. Connectors ship in minutes
01.
Service account secrets stay out of agent code
Pasting a Personio client secret into agent code puts it one log line away from a leak. Scalekit keeps the service account credentials in its vault, authenticates each call at request time, and records which agent run made it.
// secret in code
env → prompt, logs

// scalekit
vault → call ✓
02.
Authentication is not authorization
03.
Multi-tenancy is architectural
04.
Personio 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 use a shared service account for Personio?
Yes. You connect Personio once with a service account, and Scalekit authenticates every call with those Personio API credentials (OAuth 2.0 client credentials). The agent reaches the data those credentials can access, and audit logs record every action the agent takes.
Where are the Personio service account credentials stored?
In Scalekit's managed AES-256 token vault, namespaced per tenant. Revocation is a single dashboard action. Credentials never appear in prompts, logs, or LLM context.
Can I limit what the agent does in Personio?
Yes. Filter by tool name in listScopedTools to expose only what you want, for example the people, absence, and report read tools without personio_compensation_create or personio_employment_update. No Personio tool deletes data. Scalekit also enforces scope checks before every API call.
What happens when Personio access is turned off?
Disable the connection in the Scalekit dashboard and the next tool call fails closed with a clear error. Other tenants are unaffected, and the change is logged.
Which Personio data can the agent change?
Absences and attendance periods, people and their employments, compensations and compensation types, attendance projects and their members, document metadata, and new recruiting applications. Reports, salary bands, org units, legal entities, and jobs are read-only.
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"": {
""personio"": {
""url"": ""https://mcp.scalekit.com/personio"",
""headers"": { ""Authorization"": ""Bearer $SCALEKIT_TOKEN"" }
}
}
}
Codex Code REPL
# ~/.codex/config.toml
[mcp_servers.personio]
url = ""https://mcp.scalekit.com/personio""
auth_env = ""SCALEKIT_TOKEN""
Copilot Code REPL
# .vscode/mcp.json
{
""servers"": {
""personio"": {
""url"": ""https://mcp.scalekit.com/personio"",
""type"": ""http""
}
}
}