Connect your AI Agents to Clio in minutes

Available tools
list_activities
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_activity
Get one time entry or expense by ID. Use list_activities to find activity IDs. A TimeEntry's 'quantity' is in seconds.
create_activity
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_activity
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_activity
Delete a time entry or expense permanently. An entry already on a bill may be rejected. Use list_activities to find activity IDs.
list_activity_descriptions
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_expense_categories
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_users
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_user
Get one Clio user by ID. Use listusers to find user IDs, or getcurrent_user for the signed-in user.
get_current_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_groups
List the firm's groups, which control matter permissions and rates. Use this to find the groupid that creatematter and update_matter accept.
get_group
Get one Clio group by ID, including its members. Use list_groups to find group IDs.
list_currencies
List the currencies available on the Clio account, with their codes and symbols.
list_webhooks
List the webhooks registered on this Clio connection. Check expiresat — webhooks lapse after at most 31 days unless extended with updatewebhook.
get_webhook
Get one Clio webhook by ID, including its status and expiry. Use list_webhooks to find webhook IDs.
create_webhook
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_webhook
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_webhook
Delete a Clio webhook so it stops delivering events. Use list_webhooks to find webhook IDs.
list_calendar_entries
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_calendar_entry
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_calendar_entry
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_calendar_entry
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_calendar_entry
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_calendars
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_calendar
Get one Clio calendar by ID. Use list_calendars to find calendar IDs.
list_calendar_entry_event_types
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_calendar_entry_event_type
Get one calendar entry event type by ID. Use listcalendarentryeventtypes to find event type IDs.
list_reminders
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_reminder
Get one Clio reminder by ID. Use list_reminders to find reminder IDs.
create_reminder
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.
update_reminder
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_reminder
Delete a reminder. The calendar entry or task it belongs to is unaffected. Use list_reminders to find IDs.
list_contacts
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_contact
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_contact
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_contact
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_contact
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_contact_email_addresses
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_contact_phone_numbers
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_custom_fields
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_custom_field
Get one custom field by ID, including its picklist options. Use listcustomfields to find custom field IDs.
create_custom_field
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_custom_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_custom_field
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
List custom field sets, which group related custom fields on matters or contacts. Use listcustomfields for the individual fields and their picklist options.
get_custom_field_set
Get one custom field set by ID, including the fields it groups. Use listcustomfield_sets to find set IDs.
create_custom_field_set
Create a custom field set grouping existing custom fields. name and parenttype are required. Use listcustomfields to find the IDs for customfield_ids.
update_custom_field_set
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_custom_field_set
Delete a custom field set. The custom fields it grouped are not deleted. Use listcustomfield_sets to find set IDs.
list_documents
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_document
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_document
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_document_version
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_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_document
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.
delete_document
Move a Clio document to the trash. Recover it with updatedocument and restore=true. Use listdocuments to find document IDs.
copy_document
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_document_versions
List the version history of a Clio document, highest versionnumber first. Use the returned version IDs with restoredocumentversion, and listdocuments to find document IDs.
restore_document_version
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_folders
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_folder_contents
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_folder
Get one Clio folder by ID. Use list_folders to find folder IDs.
create_folder
Create a folder inside a matter, contact, or another folder. Use listmatters, listcontacts, or listfolders to find parentid, and set parent_type to match.
update_folder
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.
delete_folder
Move a Clio folder and its contents to the trash. Recover it with updatefolder and restore=true. Use listfolders to find folder IDs.
list_document_categories
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_document_category
Get one Clio document category by ID. Use listdocumentcategories to find category IDs.
create_document_category
Create a document category for filing documents. Call listdocumentcategories first to avoid duplicating an existing one.
update_document_category
Rename a Clio document category. Use listdocumentcategories to find category IDs.
delete_document_category
Delete a document category. Documents filed under it are not deleted but lose the category. Use listdocumentcategories to find category IDs.
list_matters
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_matter
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_matter
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_matter
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_matter
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_matter_contacts
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_related_contacts
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_practice_areas
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_matter_stages
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_relationships
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_relationship
Get one matter-to-contact relationship by ID. Use list_relationships to find IDs.
create_relationship
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_relationship
Update the description on a matter-to-contact relationship. Use list_relationships to find relationship IDs.
delete_relationship
Remove a contact's relationship to a matter. The contact itself is not deleted. Use list_relationships to find relationship IDs.
list_notes
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_note
Get one Clio note by ID, including its full detail body. Use list_notes to find note IDs.
create_note
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_note
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_note
Delete a Clio note permanently. Use list_notes to find note IDs.
list_comments
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_comment
Get one comment by ID. Use list_comments to find comment IDs.
create_comment
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.
update_comment
Edit the text of a comment. Use list_comments to find comment IDs.
delete_comment
Delete a comment from a document or folder. Use list_comments to find comment IDs.
list_communications
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_communication
Get one logged phone call or email by ID, including its body and parties. Use list_communications to find communication IDs.
create_communication
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_communication
Update a logged phone call or email. Use list_communications to find communication IDs.
delete_communication
Delete a logged phone call or email. Use list_communications to find communication IDs.
list_log_entries
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_tasks
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_task
Get one Clio task by ID, including matter, assignee, and due date. Use list_tasks to find task IDs.
create_task
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_task
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_task
Delete a Clio task permanently. To mark it done instead, call updatetask with status='complete'. Use listtasks to find task IDs.
list_task_types
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_task_type
Get one Clio task type by ID. Use listtasktypes to find task type IDs.
create_task_type
Create a task type the firm can assign to tasks. Use listtasktypes to check for an existing one first.
update_task_type
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.
validate_credential
Check that the Clio connection works by fetching the signed-in user.

How to set up Merge Agent Handler
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}FAQs on using Merge's Clio MCP server
FAQs on using Merge's Clio MCP server
Ready to try it out?
Whether you're an engineer experimenting with agents or a product manager looking to add tools, you can get started for free now

























