
List case notes, newest first. Filter with caseid for one case's notes. Use listcases to find case IDs and createcasenote to add one.
Get one case note by ID. Use listcasenotes to find note IDs.
Add a note to a case. Use listcases for caseid, listcaseworkers for directedtoids, and listnotecategories for notecategoryids. To change a note afterwards use updatecase_note; a note cannot be moved between cases.
Update a case note's text, recipients, or categories. Only the fields supplied change, but directedtoids and notecategoryids replace the whole set rather than adding to it. Use listcasenotes for note_id.
List case tasks. Filter with caseid for one case or directedtoid for one assignee's workload; CasePeer offers no completion filter, so read the 'complete' field on each task. Use listcaseworkers for caseworker IDs.
Get one case task by ID. Use listcasetasks to find task IDs.
Create a task. createdbyid and directedtoid are both required caseworker IDs — call listcaseworkers first. caseid is optional and comes from listcases; priorityid comes from listpriorities. Use createreminder to have CasePeer remind someone about it.
List task reminders. Filter with directedtoid for one person's reminders or wassent to separate pending from delivered. CasePeer offers no per-task filter, so read the casetask link on each result.
Get one reminder by ID. Use list_reminders to find reminder IDs.
Add a reminder to an existing case task. Create the task first with createcasetask, then pass its ID as casetaskid. directedtoids are caseworker IDs from list_caseworkers. Date is YYYY-MM-DD and time is HH:MM:SS.
List costs recorded against cases. Filter with caseid for one case's costs; CasePeer offers no payee filter, so read the contact link on each result. Use listcases to find case IDs.
Get one cost by ID. Use list_costs to find cost IDs.
Record a cost against a case. caseid, contactid, and amount are all required — use listcases for the case and listcontacts for the payee. The address override fields change the payee address for this cost only.
List health liens — what medical providers are owed out of a settlement. Filter with caseid for one case; CasePeer offers no provider filter, so read the contact link on each result. Use listcases to find case IDs.
Get one health lien by ID. Use listhealthliens to find lien IDs.
Record a health lien against a case. caseid is required; use listcases. contactid must be a hospital-type contact, so call listcontacttypes for the hospital type and listcontacts filtered to it.
Update a health lien's amounts, dates, or provider. Only the fields supplied change; the rest of the record is left alone. Use listhealthliens for healthlienid. A lien cannot be moved to a different case.
Get the firm the connection is authorized against. Use this to confirm which CasePeer firm the connection points at before reading or writing case data.
List the firm's cases, newest first. Filter with clientid, namecontains, or closed; sort with sort; narrow the payload with fields. Returns pageinfo.cursor for the next page. Use getcase for one case's full record.
Get one case by ID, including its client, status, type, staffing, and incident links. Use list_cases to find case IDs. Pass include to pull related records inline, e.g. ['caseclient'].
List incidents — the location, description, and client role behind each case. Filter with caseid to get the incident for one case. Use listcases to find case IDs.
Get one incident by ID. Use list_incidents to find incident IDs.
List injuries recorded on cases. Filter with caseid for one case's injuries. Use listcases to find case IDs and update_injury to change whether an injury is current.
Get one injury by ID. Use list_injuries to find injury IDs.
Update an injury's current-state description. This is free text, not a picklist value, and it replaces whatever is recorded now rather than appending. Use list_injuries to find injury IDs.
List case documents. Filter with caseid for one case, folderid for one folder, or rootlevelonly with caseid for documents filed outside any folder. Check downloadstatus before calling downloadcasedocument.
Get one case document by ID. Use this to poll downloadstatus after createcasedocument with fileurl: the file is only downloadable once it reads Completed, and Failed means the transfer did not finish. A filereference upload has already waited, so it needs no poll. Use listcase_documents for IDs.
File a document on a case. With filereference from the file upload API the call waits for CasePeer's fetch and returns once downloadstatus is Completed — an error means it did not land. With fileurl you host the file: the call returns Pending, so keep it reachable and poll getcasedocument. Needs the firm's document storage connected. Use listcases for case_id; other IDs name a lookup tool.
List the stored versions of a case document. Use listcasedocuments for the document ID, and downloadcasedocument_version to fetch one version's bytes.
Download a case document's file content by ID. Returns UTF-8 text as text and anything else as base64 — check 'encoding' before use. Files over maxbytes (10 MB default) come back flagged truncated with no content; set returndownloadurl=true instead for a download URL, which handles any size. Only works once downloadstatus is Completed; check it with getcasedocument.
Download one stored version of a case document. Returns UTF-8 text as text and anything else as base64 — check 'encoding' before use. Files over maxbytes (10 MB default) come back flagged truncated with no content; set returndownloadurl=true instead for a download URL, which handles any size. Use listcasedocumentversions to find version IDs.
List case document folders. Filter with caseid for one case's whole tree, parentfolderid for one folder's children, or rootlevelonly with caseid for top-level folders. Use listfolderdocuments for a folder's contents.
Get one case document folder by ID. Use listcasedocument_folders to find folder IDs.
List the documents inside a folder, including those in its nested subfolders. Use listcasedocumentfolders to find folder IDs. To list a case's documents regardless of folder, use listcasedocuments with caseid.
Create a document folder on a case. Pass parentfolderid to nest it, which must belong to the same case. Use listcases for caseid and listcasedocumentfolders for parentfolder_id.
List the document categories the firm files documents under. Call this before createcasedocument for its category_ids.
Get one document category by ID. Use listdocumentcategories to find category IDs.
Create a document category for the firm. Check listdocumentcategories first so an existing category is reused rather than duplicated.
List case photos. Filter with caseid for one case's photos. Use downloadcase_photo to fetch a photo's bytes.
Get one case photo by ID. Use listcasephotos to find photo IDs.
File a photo on a case. With filereference from the file upload API, the call waits for CasePeer to fetch the image and returns once it is retrievable — an error means it did not land. With fileurl you host the image: the call returns as soon as CasePeer accepts it, so keep that URL reachable. Use listcases for caseid. For anything that is not a photo, use createcasedocument.
Download a case photo's bytes by ID. Images come back base64-encoded — check 'encoding' before use. Files over maxbytes (10 MB default) come back flagged truncated with no content; set returndownloadurl=true instead for a download URL, which handles any size. Use listcase_photos to find photo IDs.
List the contact types a contact can be created as, such as hospital, attorney, or court. Call this before createcontact for its contacttypeid, before listcontacts to filter by type, and before createhealthlien, which needs a hospital-type contact.
Get one contact type by ID. Use listcontacttypes to find contact type IDs.
List the defendant types configured for the firm. listdefendants accepts no filters, so match these IDs against each defendant's returned defendanttype relationship rather than filtering the collection.
Get one defendant type by ID. Use listdefendanttypes to find defendant type IDs.
List the expert witness specialties configured for the firm. Call this before createcontact for its expertwitnesstypeids.
Get one expert witness type by ID. Use listexpertwitness_types to find these IDs.
List the languages a client can be assigned. Call this before updateclient for its languageid.
Get one language by ID. Use list_languages to find language IDs.
List the note categories configured for the firm. Call this before createcasenote or updatecasenote for their notecategoryids.
Get one note category by ID. Use listnotecategories to find note category IDs.
List the task priorities configured for the firm. Call this before createcasetask for its priority_id.
Get one priority by ID. Use list_priorities to find priority IDs.
List the treatment specialties configured for the firm. Call this before createcontact for its treatmentcategory_ids on a medical contact.
Get one treatment category by ID. Use listtreatmentcategories to find these IDs.
List the yes/no/maybe values CasePeer uses for three-state fields. Call this before createcontact for its acceptslien_id, which is the only field that takes one.
Get one yes/no/maybe value by ID. Use listyesno_maybe to find these IDs.
List the firm's clients — the people cases belong to. Narrow the payload with fields, and use updateclient to change a client's contact details. Use listcases to see which cases a client has.
Get one client by ID. Use list_clients to find client IDs.
Update a client's details. Only the fields supplied change; the rest of the record is left alone. Use listclients for clientid and listlanguages for languageid.
List the firm's contacts — providers, attorneys, courts, experts, and companies. Filter with contacttypeid or contacttypename from listcontacttypes; filtering to one type also narrows each record to that type's own fields.
Get one contact by ID. The fields returned depend on the contact's type — a hospital exposes different attributes than an attorney. Use list_contacts to find contact IDs; that tool also supports include, which this route does not.
Create a firm contact. Call listcontacttypes first: contacttypeid decides which other fields CasePeer requires. Hospital and medical types require treatmentcategoryids (listtreatmentcategories) and acceptslienid (listyesno_maybe); person types such as attorney require firstname and lastname; police and court need neither. A rejection names the missing field.
Update a contact's details. Only the fields supplied change; the rest of the record is left alone. Use listcontacts for contactid and listcontacttypes if changing contacttypeid.
List defendants across the firm's cases. Each defendant links to a contact record, a case and a defendant type. CasePeer accepts no filters here, so page through and narrow on the returned relationships.
Get one defendant by ID. Use list_defendants to find defendant IDs.
List the firm's users. Call this for the caseworker IDs createcasetask, createcasenote, createreminder and createcasedocument take. CasePeer accepts no filters here; read the isactive field to skip deactivated users.
Get one caseworker by ID. Use list_caseworkers to find caseworker IDs.
List the insurance policies attached to clients' cases. Filter with caseid for one case, and pass include=['insurance'] to get the policy details inline rather than just the link. For the other side of a claim, use listdefendant_insurances.
Get one client insurance link by ID. Use listclientinsurances to find these IDs, and include=['insurance'] for the policy details.
List the insurance policies attached to defendants. Filter with defendantid for one defendant. Pass include=['insurance'] for the policy details. For the client's own coverage, use listclient_insurances.
Get one defendant insurance link by ID. Use listdefendantinsurances to find these IDs, and include=['insurance'] for the policy details.
Check that the CasePeer connection works by reading the authorized user's firm.

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