
List saved advanced computer searches as id and name. Use getadvancedcomputer_search for a search's criteria and matching computers. Returns the full list (no paging).
Get one advanced computer search by ID: its criteria, display fields, and the computers it matches. Use listadvancedcomputer_searches to find IDs.
List buildings with paging (page/page_size), server-side sort, and an RSQL filter.
Get one building by ID. Use list_buildings to find building IDs.
Create a building. Requires a name; optionally set address fields. Returns the new building including its ID.
Update a building by ID. Only the fields you pass change; pass "" to clear an address field. Use list_buildings to find building IDs.
Delete a building by ID permanently. Use list_buildings to find building IDs.
List categories with paging (page/pagesize), server-side sort, and an RSQL filter. Categories organize scripts and policies; use this to find categoryId values for createscript.
Get one category by ID. Use list_categories to find category IDs.
Create a category. Requires a name; optionally set a Self Service priority. Returns the new category including its ID.
Update a category by ID. Only the fields you pass are changed. Use list_categories to find category IDs.
Delete a category by ID permanently. Jamf allows it while scripts still use the category, and they keep pointing at the deleted ID, so move them first with updatescript (categoryId '-1' for none). Use listcategories to find category IDs.
List computer groups (both smart and static; the issmart flag distinguishes them). Use getcomputer_group for one group's detail. Returns the full list (no paging).
Get one computer group by ID: issmart, site, a smart group's criteria, and the member computers (id, name, serial number). Use listcomputer_groups to find group IDs.
List computer inventory with paging (page/pagesize), server-side sort, and an RSQL filter, e.g. hardware.serialNumber=="C02X". Defaults to GENERAL (name) and HARDWARE (serial number). section replaces the defaults, so include both with others such as OPERATINGSYSTEM, DISKENCRYPTION (FileVault), SECURITY, APPLICATIONS, or GROUPMEMBERSHIPS. Use getcomputerinventory for one computer.
Get inventory detail for one computer by ID. Defaults to GENERAL, HARDWARE (serial number), OPERATINGSYSTEM, and USERANDLOCATION (assigned user). section replaces the defaults, so include GENERAL for the name. Others: DISKENCRYPTION (FileVault), SECURITY, APPLICATIONS (installed apps), GROUPMEMBERSHIPS, EXTENSIONATTRIBUTES, CONFIGURATIONPROFILES. Use listcomputers to find IDs.
List departments with paging (page/page_size), server-side sort, and an RSQL filter.
Get one department by ID. Use list_departments to find department IDs.
Create a department. Requires a name. Returns the new department including its ID.
Update a department by ID. Only the fields you pass are changed. Use list_departments to find department IDs.
Delete a department by ID permanently. Use list_departments to find department IDs.
List computer extension attributes (custom inventory fields) as id, name, and enabled. Use getcomputerextension_attribute for an attribute's data type and description. Returns the full list (no paging).
Get one computer extension attribute by ID, including its data type and description. Use listcomputerextension_attributes to find IDs.
List mobile device groups (both smart and static; the issmart flag distinguishes them). Use getmobiledevicegroup for one group's detail. Returns the full list (no paging).
Get one mobile device group by ID: issmart, site, a smart group's criteria, and the member mobile devices. Use listmobiledevicegroups to find group IDs.
List managed mobile devices (iOS/tvOS) with serial numbers and model details. Supports paging (page/pagesize) and server-side sort. OS version, management, and supervision state are not in the list; use getmobile_device for those.
Get one mobile device's inventory detail by ID. osVersion and managed are top-level; model, supervised, and storage are in the block for the device's OS (ios, tvos, watchos, or visionos). The assigned user is in location and group memberships in groups. Pass include for installed apps, profiles, or certificates. Use listmobiledevices to find IDs.
List policies as {id, name} summaries. Use getpolicy for a policy's full detail and updatepolicy to change a policy.
Get one policy by ID. Core fields (name, enabled, frequency) are under 'general'. Which triggers are on is in the general.trigger* flags and general.triggerother; general.trigger is one label Jamf derives, not the full set. Use list_policies to find policy IDs.
Update a policy by ID: name, enabled, frequency, the trigger flags (check-in, enrollment complete, login, network state change, startup), and the custom event trigger. Only the fields you pass are changed. Returns only success and the ID; use getpolicy to confirm. Use listpolicies to find policy IDs.
List scripts with paging (page/pagesize), server-side sort, and an RSQL filter. Items omit the script body; use getscript for one script's contents.
Get one script by ID, including its contents. Use list_scripts to find script IDs.
Create a script. Requires a name; optionally set priority, contents, and a category. Take categoryId from listcategories: Jamf accepts an ID that doesn't exist. Returns the new script, including its ID, without the body; use getscript to read it.
Update a script by ID. Only the fields you pass change; "" clears a text field. To move it, pass categoryId from listcategories ('-1' for none): Jamf accepts an ID that doesn't exist. Returns the stored script without the body; use getscript to read it. Use list_scripts to find script IDs.
Delete a script by ID permanently. Use list_scripts to find script IDs.
List all sites in the Jamf Pro instance. Sites partition resources across organizational units. Returns the full list (this endpoint has no paging).
List Jamf users as id and name only. Use get_user for a user's full name, email, phone, and position. Returns the full list (no paging).
Get one user by ID, including full name, email, phone, and position. Use list_users to find user IDs.
Validate Jamf credentials by exchanging a token and reading the Jamf Pro version. Returns {success, message}.

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