
List the approval templates the user can see, for createapprovalfromtemplate. The API has no server-side filter or paging, so namecontains, limit, and offset are applied after fetching. Needs the Adobe sign-in or server-to-server connection.
Get one approval template with its stages and default participants. Use listapprovaltemplates to find template IDs. Needs the Adobe sign-in or server-to-server connection.
Create a reusable document approval template with named stages and default approvers. Use searchusers for user IDs and searchobjects (obj_code 'TEAMOB') for teams. Needs the Adobe sign-in or server-to-server connection.
Update an approval template's name and stages. The API requires the full name and stage list, so call getapprovaltemplate first and resend what should stay. Use listapprovaltemplates for IDs. Needs the Adobe sign-in or server-to-server connection.
Permanently delete an approval template. Approvals already created from it are kept. Use listapprovaltemplates to find template IDs. Needs the Adobe sign-in or server-to-server connection.
Get the approval on a document version: status, stages, and participants with their decisions. Returns approvalid null when none exists yet. Use getdocument or searchobjects (objcode 'DOCV') for the version ID. Needs the Adobe sign-in or server-to-server connection.
Start an approval on a document version with one or more stages of approvers/reviewers. Use searchusers for user IDs and searchobjects (objcode 'TEAMOB') for team IDs; use createapprovalfromtemplate to reuse a template. Needs the Adobe sign-in or server-to-server connection.
Apply an approval template to a document version: reads the template, then adds its stages (creating the approval if needed). Use listapprovaltemplates for template IDs and getdocument or searchobjects (obj_code 'DOCV') for the version ID. Needs the Adobe sign-in or server-to-server connection.
Replace the stages of a document version's approval: add, remove, or reorder stages or paths. Unstarted stages left out are deleted; stages already started are kept. Call getdocumentapproval first. Needs the Adobe sign-in or server-to-server connection.
Update one approval stage's name, deadline, participants, or rules. Send the full participant list. Use getdocumentapproval for stage IDs and search_users for user IDs. Needs the Adobe sign-in or server-to-server connection.
Delete one stage that has not started yet (e.g. a later stage waiting on another) from a document version's approval. Use getdocumentapproval for stage IDs and statuses; use deletedocumentapproval to remove it all. Needs the Adobe sign-in or server-to-server connection.
Delete the whole approval (every stage, participant, and decision) from a document version. Use getdocumentapproval to confirm it exists; use deleteapprovalstage to remove one stage instead. Needs the Adobe sign-in or server-to-server connection.
Add approvers or reviewers to an existing approval. Set stageid (from getdocumentapproval) on each for multi-stage approvals. Use searchusers for user IDs and searchobjects (objcode 'TEAMOB') for teams. Needs the Adobe sign-in or server-to-server connection.
Remove a user or team from a document version's approval. Removing the last participant deletes the approval (deleted=true). Use getdocumentapproval to see participants. Needs the Adobe sign-in or server-to-server connection.
Send a reminder to one approval participant. Pass stageid to remind them about a specific stage (uses the stage-scoped endpoint). Use getdocument_approval for participant and stage IDs. Needs the Adobe sign-in or server-to-server connection.
Send reminders to every participant who has not decided yet on a document version's approval, or only on one stage when stageid is given (from getdocument_approval). Needs the Adobe sign-in or server-to-server connection.
List the comments on a project, task, issue, or document (objcode + objectid), or search comments across objects with filters (e.g. ownerID), replies included (parentNoteID marks a reply), with sorting and paging. Returns comment IDs for replies, updates, and likes.
Count the comments on a project, task, issue, or document, or across objects with filters, without fetching them.
Get one comment by ID, with its text, author, and thread. Use list_comments to find IDs.
Post a comment on a project, task, issue, or document (objcode + objectid from the matching list tool), or reply to one by setting parentcommentid from list_comments. Returns the new comment ID.
Replace a comment's text. Use list_comments to find the ID; only the author can edit.
Permanently delete a comment. Use list_comments to find the ID.
Like a comment as the signed-in user. Use listcomments to find the ID; undo with unlikecomment.
Remove the signed-in user's like from a comment. Use list_comments to find the ID.
List every Workfront object type with its code (PROJ, TASK, OPTASK, PORT, PRGM, TMPL, DOCV, HOURT, ...). Use the codes with getobjectmetadata and the generic searchobjects/getobject/create_object tools.
Get an object type's schema: field names and types, references and collections (for 'owner:name' style field paths), searchable fields, and actions. Call this before any create/update or runobjectaction to find valid field and action names.
Search any Workfront object type (portfolios, programs, templates, document versions, hour types, teams, groups, ...) with Workfront filters, sorting, and paging. Use listobjecttypes for codes. Projects, tasks, issues, hours, users, documents, comments, and custom forms have dedicated list tools.
Count Workfront objects of any type that match filters, without fetching them — e.g. how many current projects or overdue tasks. Use listobjecttypes for codes and count_comments for comments.
Group and aggregate Workfront objects server-side — e.g. hours summed per project, or project counts per status. Use listobjecttypes for codes and getobjectmetadata for groupable field names.
Get one Workfront object of any type by ID, with chosen fields (e.g. 'name,owner:name,DE:Region'). Use search_objects to find IDs. Projects, tasks, issues, hours, users, documents, comments, and custom forms have dedicated get tools.
Create a Workfront object of any type (portfolio, program, company, assignment, ...). Call getobjectmetadata first for required field names. Projects, tasks, issues, hours, and comments have dedicated create tools. Returns the new object's ID.
Update fields on a Workfront object of any type. Call getobjectmetadata for field names; use search_objects for IDs. Collections passed replace the existing ones. Projects, tasks, issues, hours, and comments have dedicated update tools.
Permanently delete a Workfront object of any type by ID. Use search_objects to find IDs; set force=true to remove dependants too. Projects, tasks, issues, hours, documents, and comments have dedicated delete tools.
Run a Workfront action on any object: move a task (projectID), convert an issue to a project or task, assign, mark done, approve/reject/recall an approval, recalculate a timeline. Call getobjectmetadata for the object's action names and arguments.
List custom forms, optionally only those for one object type (e.g. 'PROJ'). Call getcustomform next for field names, then pass them as custom_fields on create/update tools (with the form's ID as categoryID).
Get a custom form's fields: names (use as customfields keys), labels, types, required flags, and dropdown options. Use listcustom_forms to find form IDs.
List documents, optionally only those attached to one project, task, or issue (attachedtoobjcode + attachedto_id), or by name. Returns document IDs and currentVersionID, the version ID the document approval tools take.
Get one document by ID, including its current version (ID, number, file name, type, size). Use listdocuments to find IDs; list every version with searchobjects obj_code 'DOCV' and filter {'documentID': <id>}.
Permanently delete a document and all its versions. Use list_documents to find the ID.
List logged hours with server-side filters (project, task, issue, user, entry date range) plus any Workfront filter, sorting, and paging. Use reportobjects with objcode 'HOUR' to total hours instead of listing them.
Get one hour entry by ID with chosen fields. Use list_hours to find IDs.
Log hours against exactly one task (listtasks), issue (listissues), or project (listprojects). Use searchobjects with obj_code 'HOURT' for hour type IDs. Returns the new hour entry ID.
Change an hour entry's hours, date, hour type, or note. Use listhours for the ID and searchobjects obj_code 'HOURT' for hour type IDs.
Permanently delete an hour entry. Use list_hours to find the ID.
List issues and requests with server-side filters (project, status, priority, type, assignee, name) plus any Workfront filter, sorting, and paging. Use list_projects for project IDs.
Get one issue or request by ID with chosen fields. Use list_issues to find IDs.
Log an issue or request on a project (projectid from listprojects). Use searchusers for assignee IDs. Returns the new issue ID. To convert it later use runobject_action (convertToTask / convertToProject).
Update an issue's name, status, priority, severity, type, assignee, due date, or custom fields. Use list_issues for the ID.
Permanently delete an issue. Use list_issues for the ID; force=true also deletes logged hours.
List the signed-in user's open work — the tasks and issues in their My Work list. Use listtasks or listissues with assignedtoid to page or filter someone else's work.
List the fields of a Workfront Planning record type (cursor pagination). Returns the field IDs that record data, searchrecords filters, and views use. Call this before createrecord. Use listrecordtypes for the record type ID. Needs the Adobe sign-in or server-to-server connection.
Get one Workfront Planning field, including its type, select options, and type settings. Use list_fields to find the ID. Needs the Adobe sign-in or server-to-server connection.
Add a field to a Workfront Planning record type (listrecordtypes for the ID). Date, number, percentage, currency, and user fields need their options in field_config; selects need options. Needs the Adobe sign-in or server-to-server connection.
Change a Workfront Planning field's name, description, select options, or type settings; unset inputs are kept. Use listfields for the ID and getfield to read current options. Needs the Adobe sign-in or server-to-server connection.
Delete a Workfront Planning field and its values on every record. Use list_fields to find the ID. Needs the Adobe sign-in or server-to-server connection.
Search or browse records of a Workfront Planning record type, with filter, sort, grouping, field selection, and page/size paging. Use listrecordtypes for the record type ID and list_fields for field IDs used in filters and data. Needs the Adobe sign-in or server-to-server connection.
Get one Workfront Planning record with its field values keyed by field ID. Use searchrecords to find the ID and listfields to read the field IDs. Needs the Adobe sign-in or server-to-server connection.
Create one Workfront Planning record. Call listfields first to get the field IDs for data keys; use listrecordtypes for the record type ID. For many records use bulkrecord_actions. Needs the Adobe sign-in or server-to-server connection.
Change field values on a Workfront Planning record; fields not given are kept. Use searchrecords for the record ID and listfields for the field IDs. Needs the Adobe sign-in or server-to-server connection.
Delete one Workfront Planning record. Use searchrecords to find the ID; for many records use bulkrecord_actions with action 'delete'. Needs the Adobe sign-in or server-to-server connection.
Create, update (replace data), patch (change given fields), or delete up to 100 Workfront Planning records of one record type in a single call; reports per-item results. Use listrecordtypes, searchrecords, and listfields for IDs. Needs the Adobe sign-in or server-to-server connection.
Reorder Workfront Planning records by placing them before or after another record. Use listrecordtypes for the record type ID and search_records for record IDs. Needs the Adobe sign-in or server-to-server connection.
List the field change history of a Workfront Planning record (cursor pagination). Use search_records to find the record ID. Needs the Adobe sign-in or server-to-server connection.
List the record types in a Workfront Planning workspace (cursor pagination). Returns the record type IDs that searchrecords, createrecord, listfields, and listviews need. Use list_workspaces for the workspace ID. Needs the Adobe sign-in or server-to-server connection.
Get one Workfront Planning record type. Use listrecordtypes to find the ID; its fields come from list_fields. Needs the Adobe sign-in or server-to-server connection.
Create a record type (e.g. 'Campaign') in a Workfront Planning workspace. Use listworkspaces for the workspace ID; add fields afterwards with createfield. Needs the Adobe sign-in or server-to-server connection.
Change a Workfront Planning record type's name, description, icon, color, or primary field; unset fields are kept. Use listrecordtypes for the ID and list_fields for the primary field ID. Needs the Adobe sign-in or server-to-server connection.
Permanently delete a Workfront Planning record type and all of its records. Use listrecordtypes to find the ID. To only remove a global record type from one workspace, use detachglobalrecord_type. Needs the Adobe sign-in or server-to-server connection.
List global record types a Workfront Planning workspace can use (cursor pagination). Adding one is done in the Workfront UI: the API has no add endpoint. Use list_workspaces for the ID. Needs the Adobe sign-in or server-to-server connection.
Remove a global record type from one Workfront Planning workspace without deleting it. Use listworkspaces and listrecord_types for the IDs. The Planning API has no public endpoint to attach one again. Needs the Adobe sign-in or server-to-server connection.
List who has access to a Workfront Planning workspace, record type, record, view, or field, with each member's role. IDs come from listworkspaces, listrecordtypes, searchrecords, listviews, or listfields. Needs the Adobe sign-in or server-to-server connection.
Grant, change, or revoke access to a Workfront Planning workspace, record type, record, view, or field; for records and fields, also set who else can see them. Use searchusers for user IDs and getplanning_sharing for current members. Needs the Adobe sign-in or server-to-server connection.
List the saved views (table, timeline, calendar, list, gallery) of a Workfront Planning record type (cursor pagination). Use listrecordtypes for the record type ID. Needs the Adobe sign-in or server-to-server connection.
Get one Workfront Planning view with its filter, sorting, grouping, and layout settings. Use list_views to find the ID. Needs the Adobe sign-in or server-to-server connection.
Create a saved view of a Workfront Planning record type. Use listrecordtypes for the record type ID and list_fields for field IDs in filter, sorting, grouping, and timeline metadata. Needs the Adobe sign-in or server-to-server connection.
Change a Workfront Planning view's name, filter, sorting, grouping, layout, or visibility; unset inputs are kept. Use listviews for the ID and listfields for field IDs. Needs the Adobe sign-in or server-to-server connection.
Delete a Workfront Planning view; the records it showed are kept. Use list_views to find the ID. Needs the Adobe sign-in or server-to-server connection.
List Workfront Planning workspaces with cursor pagination. Returns the workspace IDs that listrecordtypes and createrecordtype need. Needs the Adobe sign-in or server-to-server connection; Workfront API keys cannot call Planning.
Get one Workfront Planning workspace, including its record type sections. Use list_workspaces to find the ID. Needs the Adobe sign-in or server-to-server connection.
Create a Workfront Planning workspace. Returns its ID for createrecordtype. Needs the Adobe sign-in or server-to-server connection; Workfront API keys cannot call Planning.
Change a Workfront Planning workspace's name, description, color, icon, or record type sections; unset fields are kept. Use listworkspaces for the ID and listrecord_types for section record type IDs. Needs the Adobe sign-in or server-to-server connection.
Permanently delete a Workfront Planning workspace and everything in it. Use list_workspaces to find the ID. Needs the Adobe sign-in or server-to-server connection.
List projects with server-side filters (status, owner, portfolio, program, group, name) plus any Workfront filter, sorting, and paging. Returns project IDs for getproject, createtask, and list_tasks.
Get one project by ID with chosen fields (e.g. 'name,status,owner:name,DE:Budget'). Use list_projects to find IDs.
Create a project, optionally from a template (templateid via searchobjects objcode 'TMPL'). Use searchusers for owner IDs and listcustomforms/getcustomform for custom fields. Returns the new project ID.
Update a project's name, status, dates, owner, portfolio/program, or custom fields. Use listprojects for the ID and getobjectmetadata objcode 'PROJ' for other field names.
Permanently delete a project. Use listprojects for the ID; force=true also deletes its tasks, issues, and hours. Consider updateproject with status 'DED' instead.
List tasks with server-side filters (project, status, assignee, parent, name) plus any Workfront filter, sorting, and paging. Use listprojects for project IDs. Returns task IDs for gettask and update_task.
Get one task by ID with chosen fields (e.g. 'name,status,assignments:assignedTo:name'). Use list_tasks to find IDs.
Create a task in a project (projectid from listprojects). Use searchusers for assignee IDs and listtasks for parent IDs. Returns the new task ID. To move a task later use runobjectaction action 'move'.
Update a task's name, status, percent complete, dates, assignee, priority, or custom fields. Use listtasks for the ID. Use runobject_action to move it to another project.
Permanently delete a task. Use list_tasks for the ID; force=true also deletes subtasks and logged hours.
Search Workfront users by name, email, active status, or home group, plus any Workfront filter. Returns user IDs for ownerid, assignedto_id, approval participants, and sharing grants.
Get one user by ID with chosen fields. Use search_users to find IDs.
Get the Workfront user the connection acts as — their ID, name, email, and access level. Use the ID wherever a tool asks for the signed-in user.
Validate the Workfront domain and credentials by reading the signed-in user. Use this to confirm setup before calling other tools.

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