
List contracts in the organization. Filter server-side by type, status, team, legal entity, country, currency, or a title/worker-name search. Supports cursor pagination.
Get a single contract by id. Use list_contracts to find valid IDs.
Create an independent-contractor (IC) contract. Discover required IDs first: listgroups (teamid), listlegalentities (legalentityid), listjobtitles, listsenioritylevels, listcountries, listcurrencies. Creates only the core IC contract record — contractor invoicing, timesheet submission, milestone execution, invoice adjustments, and payments are out of scope for this connector.
Terminate a non-EOR contract (independent-contractor, PAYG, etc). Use terminateeorcontract instead for contracts where getcontract's type is 'eor'. Provide either terminatenow=true or completiondate. Use getcontract first to confirm the contract's type before calling this. Use listcontractterminationreasons to find a valid terminationreason_id.
Initiate offboarding/termination for an EOR (Employer of Record) contract. Use terminatecontract instead for non-EOR contract types. Use getcontract first to confirm the contract's type is 'eor' before calling this. reasondetail must be at least 100 characters. usedtime_off's shape is unconfirmed by Deel — try {} first (sends no fields at all); if rejected, investigate manually.
Amend an existing contract's terms (compensation, job title, seniority, scope of work, etc). Only send the fields that are changing. Use listjobtitles / listsenioritylevels / list_currencies to find valid IDs/codes for those fields.
List contract termination reasons available in this organization. Use for terminatecontract's terminationreason_id.
List the custom field definitions available on people profiles in this organization (name, type, and whether required). Use this before getpersoncustom_fields to know which field ids/types to expect.
Get the custom field values set on one person's profile. Use listpeople to find the worker id, and discoverpersoncustomfields to understand each field's type.
Set a custom field's value on one person's profile. Use listpeople to find the worker id, and discoverpersoncustomfields to find the customfieldid and its type (which determines the shape of field_value).
List groups (teams) in the organization. Use this to find team/group IDs for other tools.
Create a group (team).
Rename a group (team). Use list_groups to find valid IDs.
Archive (delete) a group by id. Use list_groups to find valid IDs.
List legal entities in the organization. Use this to find legalentityid for create_contract.
List job titles available in this organization. Use for createcontract's jobtitle_id.
List countries supported by Deel, with ISO codes. Use for createcontract's countrycode.
List seniority levels available in this organization. Use for createcontract's seniorityid.
List supported currencies (ISO 4217 codes). Use for createcontract's compensationdetails currency.
List global time-off category names (e.g. VACATION, SICKLEAVE) for reference only — these are not valid timeofftypeid values. Use listtimeoffpolicies for the policyid and timeofftypeid needed by createtimeoffrequest.
List working locations configured for this organization. Use for updatepersonworklocation's workinglocation_id.
List organization structures (team hierarchies, roles) for this organization.
List people (HRIS profiles) in the organization. Supports search by name, and filtering by team, hiring status, hiring type, and person status. Use this to find a person's HRIS profile id for other tools (time off, custom fields).
Get a single person's HRIS profile by id. Use list_people to find valid IDs.
Update a person's working location. Use listpeople to find the HRIS profile id, and listworkinglocations to find a valid workinglocation_id.
List the time-off policies available to one HRIS profile (e.g. vacation, sick leave). Use listpeople to find the hrisprofileid, and this tool's output for a policyid when creating a time-off request.
List existing time-off requests for one HRIS profile, with their id, status, and dates. Use listpeople to find the hrisprofileid. This is the tool to call before updatetimeoffrequest, reviewtimeoffrequest, or deletetimeoffrequest — Deel has no other way to discover an existing request's id.
Create a time-off request for a person. Use listpeople to find recipientprofileid, and listtimeoffpolicies for policyid and its timeofftypes[].id (timeofftypeid must be an id from there, not a value from listtimeoff_types).
Update an existing time-off request. Use listtimeoff_requests to find the request id first.
Approve or reject one or more time-off requests in a single call. Use listtimeoff_requests to find pending request IDs. Rejections are permanent.
Cancel (delete) a time-off request by id. Use listtimeoff_requests to find the request id first. This immediately sets the request to CANCELED regardless of its current status and cannot be reversed.
Validate Deel credentials by fetching the authenticated profile. Verifies credentials during setup.
List webhook subscriptions registered for this organization.
Create a webhook subscription. Use listwebhookevent_types to find valid event names for the events list.
Update a webhook subscription's status (enabled/disabled) or child-org visibility. Use list_webhooks to find valid IDs. To change the URL or events, delete and recreate.
Delete a webhook subscription by id. Use list_webhooks to find valid IDs.
List the webhook event types available for subscription. Use for create_webhook's events list.

In an mcp.json file, add the configuration below, and restart Cursor.
Learn more in the official documentation ↗
1{
2 "mcpServers": {
3 "agent-handler": {
4 "url": "https://ah-api-develop.merge.dev/api/v1/tool-packs/{TOOL_PACK_ID}/registered-users/{REGISTERED_USER_ID}/mcp",
5 "headers": {
6 "Authorization": "Bearer yMt*****"
7 }
8 }
9 }
10}
11Open your Claude Desktop configuration file and add the server configuration below. You'll also need to restart the application for the changes to take effect.
Make sure Claude is using the Node v20+.
Learn more in the official documentation ↗
1{
2 "mcpServers": {
3 "agent-handler": {
4 "command": "npx",
5 "args": [
6 "-y",
7 "mcp-remote@latest",
8 "https://ah-api-develop.merge.dev/api/v1/tool-packs/{TOOL_PACK_ID}/registered-users/{REGISTERED_USER_ID}/mcp",
9 "--header",
10 "Authorization: Bearer ${AUTH_TOKEN}"
11 ],
12 "env": {
13 "AUTH_TOKEN": "yMt*****"
14 }
15 }
16 }
17}Open your Windsurf MCP configuration file and add the server configuration below.
Click on the refresh button in the top right of the Manage MCP server page or in the top right of the chat box in the box icon.
Learn more in the official documentation ↗
1{
2 "mcpServers": {
3 "agent-handler": {
4 "command": "npx",
5 "args": [
6 "-y",
7 "mcp-remote@latest",
8 "https://ah-api.merge.dev/api/v1/tool-packs/<tool-pack-id>/registered-users/<registered-user-id>/mcp",
9 "--header",
10 "Authorization: Bearer ${AUTH_TOKEN}"
11 ],
12 "env": {
13 "AUTH_TOKEN": "<ah-production-access-key>"
14 }
15 }
16 }
17 }In Command Palette (Cmd+Shift+P on macOS, Ctrl+Shift+P on Windows), run "MCP: Open User Configuration".
You can then add the configuration below and press "start" right under servers. Enter the auth token when prompted.
Learn more in the official documentation ↗
1{
2 "inputs": [
3 {
4 "type": "promptString",
5 "id": "agent-handler-auth",
6 "description": "Agent Handler AUTH_TOKEN", // "yMt*****" when prompt
7 "password": true
8 }
9 ],
10 "servers": {
11 "agent-handler": {
12 "type": "stdio",
13 "command": "npx",
14 "args": [
15 "-y",
16 "mcp-remote@latest",
17 "https://ah-api-develop.merge.dev/api/v1/tool-packs/{TOOL_PACK_ID}/registered-users/{REGISTERED_USER_ID}/mcp",
18 "--header",
19 "Authorization: Bearer ${input:agent-handler-auth}"
20 ]
21 }
22 }
23}Whether you're an engineer experimenting with agents or a product manager looking to add tools, you can get started for free now