
List or search time entries and expenses. Filter server-side by matter, user, type, billing status, or date range. Note that a TimeEntry's 'quantity' is in seconds; 'quantityinhours' gives the same value in hours.
Get one time entry or expense by ID. Use list_activities to find activity IDs. A TimeEntry's 'quantity' is in seconds.
Log a time entry or expense against a matter. type, date, and quantity are required — quantity is in SECONDS for a TimeEntry (3600 = one hour). Use listmatters for matterid, listactivitydescriptions for activitydescriptionid, and listexpensecategories for expensecategoryid.
Update a time entry or expense. quantity is in SECONDS for a TimeEntry. An entry already billed may be rejected. Use list_activities to find activity IDs.
Delete a time entry or expense permanently. An entry already on a bill may be rejected. Use list_activities to find activity IDs.
List the firm's activity descriptions and their default rates. Call this before createactivity to get a valid activitydescription_id — descriptions are firm-defined and cannot be guessed.
List the firm's expense categories. Call this before createactivity with type='ExpenseEntry' to get a valid expensecategory_id — categories are firm-defined and cannot be guessed.
List the firm's Clio users. Call this to get the user IDs that creatematter (responsibleattorneyid, originatingattorneyid), createtask (assigneeid), and createactivity (user_id) require.
Get one Clio user by ID. Use listusers to find user IDs, or getcurrent_user for the signed-in user.
Get the Clio user the connection is authenticated as, including their firm account and notificationmethods. Use this to resolve 'me' or 'my matters', and to get the notificationmethodid that createreminder requires.
List the firm's groups, which control matter permissions and rates. Use this to find the groupid that creatematter and update_matter accept.
Get one Clio group by ID, including its members. Use list_groups to find group IDs.
List the currencies available on the Clio account, with their codes and symbols.
List the webhooks registered on this Clio connection. Check expiresat — webhooks lapse after at most 31 days unless extended with updatewebhook.
Get one Clio webhook by ID, including its status and expiry. Use list_webhooks to find webhook IDs.
Register a webhook so Clio posts events to your HTTPS URL. url, model, and events are required; non-HTTPS URLs are rejected. Webhooks expire after 3 days by default and 31 days at most — set expiresat and renew with updatewebhook.
Update a webhook's URL, events, payload fields, or expiry. Use this to renew a webhook before expiresat passes. Use listwebhooks to find webhook IDs.
Delete a Clio webhook so it stops delivering events. Use list_webhooks to find webhook IDs.
List or search Clio calendar entries (appointments and deadlines). Filter server-side by matter, calendar, or date range with datefrom/dateto. Set expanded=true with a date range to expand recurring events into instances. Use this to find calendar entry IDs.
Get one Clio calendar entry by ID, including matter, attendees, and recurrence rule. Use listcalendarentries to find IDs. Check recurrence_rule before updating or deleting — a non-null value means the entry is part of a series.
Create a Clio calendar entry. summary, startat, endat and calendarownerid are all required — call listcalendars with writeable=true first for a valid calendarownerid. Use listmatters for matterid and listcalendarentryeventtypes for eventtype_id.
Update a Clio calendar entry. Only supplied fields change. Call getcalendarentry first and check recurrence_rule: if it is not null the entry is part of a series, and the change applies to the whole series.
Delete a Clio calendar entry permanently. Call getcalendarentry first and check recurrence_rule: if it is not null this deletes the whole series, not just one occurrence.
List the calendars visible to the authenticated user. Call this before createcalendarentry to get a valid calendarownerid. Set writeable=true to see only calendars entries can be created on.
Get one Clio calendar by ID. Use list_calendars to find calendar IDs.
List the firm's calendar entry event types. Call this before createcalendarentry or updatecalendarentry to get a valid eventtypeid — event types are firm-defined and cannot be guessed.
Get one calendar entry event type by ID. Use listcalendarentryeventtypes to find event type IDs.
List reminders set on calendar entries or tasks. Filter by subjecttype plus subjectid to see the reminders on one entry or task. Use listcalendarentries or list_tasks to find subject IDs.
Get one Clio reminder by ID. Use list_reminders to find reminder IDs.
Set a reminder on a calendar entry or task, firing durationvalue durationunits before it. Call getcurrentuser first for a notificationmethodid — Clio requires one. Use listcalendarentries or listtasks for subjectid, and set subject_type to match.
Change how long before its subject a reminder fires, or which notification method delivers it. Pass durationvalue and durationunit together. Use list_reminders to find reminder IDs.
Delete a reminder. The calendar entry or task it belongs to is unaffected. Use list_reminders to find IDs.
List or search Clio contacts (people and companies). Pass query for free-text search across name, email, and phone, or filter server-side by type or clientonly. Use this to find contact IDs for creatematter and the other contact tools. Page forward with page_info.cursor.
Get one Clio contact by ID. Use listcontacts to find contact IDs. Pass 'fields' to widen the response, e.g. to include addresses or customfield_values.
Create a Clio contact. type is required: use 'Person' with firstname and lastname, or 'Company' with name. For customfieldvalues, call listcustomfields with parent_type='contact' first to get valid field IDs.
Update fields on a Clio contact. Only supplied fields change. For nested lists such as emailaddresses, include an entry's 'id' to update it or 'destroy': true to remove it. Use list_contacts to find contact IDs.
Delete a Clio contact permanently. Fails if the contact is the client on a matter — reassign the matter first with updatematter. Use listcontacts to find contact IDs.
List every email address on a contact, with its label and which one is the default. Use listcontacts to find contact IDs. getcontact returns only the primary address.
List every phone number on a contact, with its label and which one is the default. Use listcontacts to find contact IDs. getcontact returns only the primary number.
List the firm's custom fields on matters or contacts, with each picklist field's allowed options. Call this before creatematter, updatematter, createcontact, or updatecontact to get the field IDs and picklist option IDs those tools need for customfieldvalues.
Get one custom field by ID, including its picklist options. Use listcustomfields to find custom field IDs.
Create a custom field on matters or contacts. name, parenttype, and fieldtype are required. For fieldtype='picklist' also supply picklistoptions. Call listcustomfields first to avoid duplicating a field.
Update a custom field's label, visibility, or picklist options. parenttype and fieldtype cannot be changed after creation. Use listcustomfields to find custom field IDs.
Delete a custom field. Values already recorded on matters or contacts are removed with it. To hide the field instead, call updatecustomfield with displayed=false. Use listcustomfields to find IDs.
List custom field sets, which group related custom fields on matters or contacts. Use listcustomfields for the individual fields and their picklist options.
Get one custom field set by ID, including the fields it groups. Use listcustomfield_sets to find set IDs.
Create a custom field set grouping existing custom fields. name and parenttype are required. Use listcustomfields to find the IDs for customfield_ids.
Rename a custom field set or replace the fields it groups. Passing customfieldids replaces the whole membership. Use listcustomfield_sets to find set IDs.
Delete a custom field set. The custom fields it grouped are not deleted. Use listcustomfield_sets to find set IDs.
List or search Clio documents by name, matter, contact, folder, or category. Returns metadata only — use downloaddocument for content. Use this to find document IDs. Page forward with pageinfo.cursor.
Get one Clio document's metadata by ID — name, size, category, and where it is filed. Returns no file content; use downloaddocument for that. Use listdocuments to find document IDs.
Upload a new document into Clio, filed under a matter, folder, or contact. Pass the file as base64 in contentbase64, or as filereference from the file upload API (POST /api/v1/files/) for large files. Use listmatters, listfolders, or listcontacts for parentid, and listdocumentcategories for documentcategoryid. Returns the new document_id.
Upload a new version of an existing Clio document, preserving its history. Pass the file as base64 in contentbase64, or as filereference from the file upload API (POST /api/v1/files/) for large files. Use listdocuments to find documentid. To create a new document instead, use upload_document.
Download a Clio document's content by ID. Text-like files come back as UTF-8 text; anything else as base64 — check the 'encoding' field before using 'content'. Files over maxbytes (10 MB by default) return truncated=true; set returndownloadurl=true instead for a short-lived download URL, which handles any size. Use listdocuments to find document IDs.
Update a Clio document's metadata — rename it, refile it under a different parent, or change its category. Does not change file content; use uploaddocumentversion for that. Set restore=true to recover a trashed document.
Move a Clio document to the trash. Recover it with updatedocument and restore=true. Use listdocuments to find document IDs.
Copy a Clio document into another matter, folder, or contact, leaving the original in place. Use listdocuments for documentid and listmatters or listfolders for parent_id.
List the version history of a Clio document, highest versionnumber first. Use the returned version IDs with restoredocumentversion, and listdocuments to find document IDs.
Promote an earlier version of a Clio document to be the latest. Returns only a success flag — call downloaddocument or listdocumentversions afterwards to confirm. Use listdocumentversions to find documentversion_id.
List or search Clio folders by name, matter, contact, or parent folder. Use this to find folder IDs for uploaddocument and createfolder. For the mixed contents of one folder, use listfoldercontents.
List folders and documents together in one call. Pass matterid or contactid to list that record's contents, or parentid with a FOLDER id to list inside a folder. Use this to walk the document tree instead of calling listfolders and list_documents separately.
Get one Clio folder by ID. Use list_folders to find folder IDs.
Create a folder inside a matter, contact, or another folder. Use listmatters, listcontacts, or listfolders to find parentid, and set parent_type to match.
Rename a Clio folder or move it under a different parent. Set restore=true to recover a trashed folder. Use list_folders to find folder IDs.
Move a Clio folder and its contents to the trash. Recover it with updatefolder and restore=true. Use listfolders to find folder IDs.
List the firm's document categories. Call this before uploaddocument or updatedocument to get a valid documentcategoryid — categories are firm-defined and cannot be guessed.
Get one Clio document category by ID. Use listdocumentcategories to find category IDs.
Create a document category for filing documents. Call listdocumentcategories first to avoid duplicating an existing one.
Rename a Clio document category. Use listdocumentcategories to find category IDs.
Delete a document category. Documents filed under it are not deleted but lose the category. Use listdocumentcategories to find category IDs.
List or search Clio matters (cases). Filter server-side by status, client, practice area, or responsible attorney, or pass query for free-text search. Use this to find matter IDs for every other matter-scoped tool. Page forward by passing page_info.cursor back as 'cursor'.
Get one Clio matter by ID, including client, practice area, stage, and responsible attorney. Use listmatters to find matter IDs. Pass 'fields' to widen the response, e.g. to include customfield_values.
Create a Clio matter for an existing client contact. clientid and description are required — use listcontacts to find the client. For practiceareaid use listpracticeareas, for matterstageid use listmatterstages, for attorney IDs use listusers, and for customfieldvalues use listcustom_fields.
Update fields on a Clio matter. Only supplied fields change; omitted fields are left alone. Use listmatters to find matter IDs, listmatterstages for stage IDs, and listcustom_fields for custom field IDs.
Delete a Clio matter permanently, along with its associated records. This cannot be undone — to close a matter instead, call updatematter with status='closed'. Use listmatters to find matter IDs.
List every contact associated with a matter, including the client and all related contacts. Use listmatters to find matter IDs. For only the non-client related contacts, use listrelated_contacts instead.
List the related (non-client) contacts on a matter, such as opposing counsel or witnesses. Each entry's contactid is the contact's own ID — pass that, not id, to getcontact. Use listmattercontacts for all contacts including the client.
List the firm's practice areas. Call this before creatematter or updatematter to get a valid practiceareaid — these are firm-defined and cannot be guessed.
List the firm's matter stages, optionally filtered to one practice area. Call this before creatematter or updatematter to get a valid matterstageid — stages are firm-defined per practice area and cannot be guessed. Each stage's 'order' field gives its position in the workflow; Clio returns them unsorted.
List matter-to-contact relationships, optionally filtered by matter or contact. Each entry describes how a contact relates to a matter. Use listmatters and listcontacts to find the filter IDs.
Get one matter-to-contact relationship by ID. Use list_relationships to find IDs.
Relate an existing contact to a matter, e.g. as opposing counsel or a witness. Use listmatters for matterid and listcontacts for contactid. To set the matter's client instead, use update_matter.
Update the description on a matter-to-contact relationship. Use list_relationships to find relationship IDs.
Remove a contact's relationship to a matter. The contact itself is not deleted. Use list_relationships to find relationship IDs.
List or search Clio notes on matters and contacts. Filter server-side by matterid, contactid, or type, or pass query for free-text search. Use this to find note IDs. Page forward with page_info.cursor.
Get one Clio note by ID, including its full detail body. Use list_notes to find note IDs.
Create a note on a matter or a contact. Set type='Matter' with matterid, or type='Contact' with contactid — the two must match. Use listmatters or listcontacts to find the ID.
Update a Clio note's subject, detail, or date. The matter or contact it is filed against cannot be changed. Use list_notes to find note IDs.
Delete a Clio note permanently. Use list_notes to find note IDs.
List comments left on documents and folders. Pass itemid to see the comments on one of them — use listdocuments or listfolders to find IDs. For notes on a matter, use listnotes instead.
Get one comment by ID. Use list_comments to find comment IDs.
Comment on a document or folder. Pass its ID as itemid — use listdocuments or listfolders to find one. To add a note to a matter instead, use createnote.
Edit the text of a comment. Use list_comments to find comment IDs.
Delete a comment from a document or folder. Use list_comments to find comment IDs.
List or search logged phone calls and emails. Filter server-side by matter, contact, user, type, or received-date range. Use this to find communication IDs. Page forward with page_info.cursor.
Get one logged phone call or email by ID, including its body and parties. Use list_communications to find communication IDs.
Log a phone call or email against a matter. Set type to PhoneCommunication or EmailCommunication. Use listmatters for matterid and list_contacts for the IDs in senders and receivers. This records a communication; it does not send one.
Update a logged phone call or email. Use list_communications to find communication IDs.
Delete a logged phone call or email. Use list_communications to find communication IDs.
List Clio audit-log entries recording who accessed firm data and when. Read-only and account-wide; filter with created_since to bound the range.
List or search Clio tasks. Filter server-side by matter, assignee, status, priority, or due-date range, or pass query for free-text search on the name. Use this to find task IDs. Page forward with page_info.cursor.
Get one Clio task by ID, including matter, assignee, and due date. Use list_tasks to find task IDs.
Create a Clio task. name, assigneeid and assigneetype are all required — Clio rejects an unassigned task. Use listusers for a user assignee (set assigneetype='User') or listcontacts for a contact one. Use listmatters for matterid and listtasktypes for tasktype_id.
Update a Clio task. Only supplied fields change. Set status='complete' to close the task. Use listtasks to find task IDs and listusers for a new assigneeid (set assigneetype='User').
Delete a Clio task permanently. To mark it done instead, call updatetask with status='complete'. Use listtasks to find task IDs.
List the firm's task types. Call this before createtask or updatetask to get a valid tasktypeid — task types are firm-defined and cannot be guessed. Retired types carry a deleted_at; pass enabled=true to exclude them.
Get one Clio task type by ID. Use listtasktypes to find task type IDs.
Create a task type the firm can assign to tasks. Use listtasktypes to check for an existing one first.
Rename or retire a Clio task type. Clio has no delete endpoint for task types: retire one by setting deletedat to a timestamp. Use listtask_types to find task type IDs.
Check that the Clio connection works by fetching the signed-in user.

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