MyCase MCP Server — Tool Catalog
This catalog documents the 74 tools the MyCase MCP Server exposes — the same name, description, parameter, and annotation data every MCP client receives from tools/list — organized by domain.
- Access is user-scoped: every call authenticates as an individual MyCase user via OAuth and can only see what that user can in MyCase.
- This server is READ-ONLY: no tool creates, updates, or deletes firm data — record changes must be made in the MyCase app.
- report_feedback files a bug report or feature request about these tools with the MyCase team; it is badged write because it has an effect outside MyCase, but it reads and changes no firm data.
Legal Terms
This will give Claude permission to view your MyCase data, including cases, contacts, documents, calendar events, tasks, notes, leads, invoices, trust and IOLTA account data, and staff records. It also includes your firm's communications: client portal messages, text message (SMS) conversations, internal staff chat, and comments left on tasks, documents, and calendar events. Claude can't change your MyCase data today. Write-enabled tools — which would let Claude create, modify, and overwrite records such as case details, notes, documents, and client communications — may be released in the future.
Before you connect, please read the following:
- This is experimental. The MCP is currently a Beta Service, provided "as is" and "as available." It may contain defects or produce errors, may change without notice, and may be suspended or discontinued at any time.
- Your data goes to Claude. Once you connect, Claude — a Third-Party Service operated by Anthropic — can retrieve data across your firm's MyCase account. This may include privileged attorney-client communications, attorney work product, and other confidential or sensitive client information.
- Write actions may not be reversible or fully visible. If write tools are released, writes will appear in your firm's Recent Activities log, tagged to the connector and the acting user, but that log is a summary and doesn't show what the record said before. These records have no version history or undo, so an approved overwrite can't be restored, and some actions can't be undone. Because these writes can't be undone, review and approve each one individually. Don't use Claude's "Always allow" option for any task requiring an attorney's judgment, review, or supervision.
- Data leaves MyCase. Information accessed through the connector is processed in your Claude instance under your firm's agreement with Anthropic, not your agreement with 8am. 8am doesn't control, and isn't responsible for, how Anthropic or your Claude instance stores, uses, retains, or secures it. Review Anthropic's terms and your Claude settings, including model-training, retention, and deletion settings, before connecting.
- Your Claude plan matters. You must hold and keep a Claude Team or Enterprise subscription that excludes firm data from model training by default. On consumer plans, inputs may be used to train AI models. Courts and bar authorities have treated such disclosure as defeating confidentiality and, in some cases, waiving privilege and work-product protection. Downgrading, using a personal account, or turning on training or data-sharing settings may defeat the confidentiality privilege depends on. 8am cannot verify your Claude plan or settings nor detect a change to either.
- Access may be ongoing and automated. Depending on how you configure Claude, the connector may run scheduled or automated tasks that access your MyCase data on a recurring basis after your initial authorization, without approval for each run.
- AI output may be inaccurate. Claude may produce incomplete, inaccurate, or misleading output, including about case details, deadlines, and financial figures. You are responsible for approving AI-generated actions and verifying all output before relying on it in a client matter. Applicable rules of professional conduct require human supervision of AI-generated client communications and record changes and may require your client's informed consent before you delegate substantive work to an AI tool. The connector doesn't reduce your duties of confidentiality, competence, supervision, and client communication.
- Restricted uses. You may not use the connector to make, or materially influence, decisions about employment, credit, finance, housing, insurance, health care, education, or public benefits.
- You control access. Your firm decides organizational safeguards, including who may connect and when to disconnect. Disconnecting stops future access but doesn't delete information already shared with Claude.
- You assume the risk. Your use of the connector is at your own risk. To the maximum extent permitted by law, 8am disclaims all liability to you, your firm, and any third party for any harm arising out of or in connection with the connector. The Beta Services and Third-Party Services provisions of the 8am Terms of Service apply.
Connect Claude to MyCase
MyCase isn't listed in Claude's connector directory, so add it as a custom connector. The install links below open Claude's own dialog with the connector name and URL already filled in; the URL is spelled out further down if you'd rather enter it yourself. One connector covers everywhere you use Claude — the web app, Claude Desktop, and Cowork — because connectors are configured on your Claude account rather than per device.
Install link for your firm
If you administer your firm's Claude organization, this link prefills the connector for everyone in it. Claude flags that the values arrived from an external link and adds nothing until you review them and confirm.
As a Claude organization owner, open the prefilled install link for a Claude organization.
Install link for one person
If your Claude plan lets you add your own connectors, this link prefills the same dialog for your account alone. Where connectors are administered centrally, an organization owner adds the connector once and it then appears in your own connector settings for you to turn on.
For your own Claude account, open the prefilled install link for a single Claude account.
Connector URL
The links above only prefill Claude's dialog. If one doesn't open it, add this URL as a custom connector by hand instead:
https://mcp.mycase.com/mcp
You sign in with your own MyCase account, and every tool call runs as your MyCase user, held to that user's permissions.
For the steps in Claude, see Anthropic's guide to adding a custom connector.
Billing
get_case_billing_summary
Get Case Billing Summary read-only
Get a case's billing snapshot: fee_structure, totals (billed/collected/outstanding/overdue), balances (trust/credit funds held), aging, bills_by_status, unbilled work in progress, most_recent_payment, and most_recent_bill. Sections the user may not view are OMITTED, not zeroed: totals, balances, aging, bills_by_status, and most_recent_* require permissions.view_bills; unbilled is omitted only when the user has neither view_bills nor view_time_expenses (or the token lacks read_expenses). The permissions block is always present — use it to tell 'no access' from 'no billing on this case'. fee_structure (billing_type, agreed flat_fee, billing_contact) is the only source of the case's fee arrangement; unbilled.flat_fees is the flat-fee amount REMAINING to bill, distinct from the agreed fee_structure.flat_fee (itemized flat-fee line items come from list_case_billing_flat_fees). balances are client funds held, separate from the bill-side totals — a client can owe outstanding and still hold trust/credit; report both, never net them. credit is a per-contact, firm-wide snapshot with no provenance surface — do not sum a contact's credit across their cases, and do not claim where it came from. totals, aging, and bills_by_status exclude balance-forwarded bills, which list_case_invoices includes (status 'forwarded') — counts may legitimately differ. These billing tools do not surface retainer requests, payment plans or installment schedules, saved payment methods, failed or declined payment attempts, or write-off/discount line-item detail beyond get_case_invoice_line_items — direct the user to the MyCase app for those.
| Parameter | Type | Required | Description |
|---|---|---|---|
case_id | integer | yes |
get_case_invoice_line_items
Get Case Invoice Line Items read-only
Get the line items that compose one invoice, grouped by kind — time_entries, expenses, flat_fees, discounts — plus balances_forwarded (prior invoices whose unpaid balance rolled into this one) and the invoice header. Reconciliation: total_amount = billable time_entries' total + billable expenses' total + billable flat_fees' amount + all SIGNED discount amounts + balances_forwarded amounts, clamped at zero; nonbillable items appear with billable false and contribute nothing, and some firms fold payment surcharges into total_amount that are not itemized here. discounts rows are not all reductions: type discount/write_off is stored NEGATIVE, interest/tax/addition POSITIVE — sum amounts as-is, never flip signs by label. flat_fees are the BILLED flat-fee line items, distinct from the agreed fee_structure.flat_fee and from summary unbilled.flat_fees (remaining to bill). Visibility is the invoice's: a user without billing permission gets not_found (the invoice is invisible), so cross-check get_case_billing_summary's permissions.view_bills before concluding the invoice does not exist; unlike the case billing time/expense feeds, no read_expenses scope is needed because items are read as parts of the invoice document. Not paginated — one response carries the invoice's full contents.
| Parameter | Type | Required | Description |
|---|---|---|---|
case_id | integer | yes | |
invoice_id | integer | yes |
list_case_billing_expenses
List Case Billing Expenses read-only
List a case's expenses with a server-computed total. filter_billed reflects actual invoice association (the same definition the billing summary uses); billed=false does NOT imply billable — also check the billable field when reconciling against summary.unbilled. Requires the read_expenses token scope (same as list_all_expenses) plus the time-entries-and-expenses OR billing user permission, and returns 403 without them — given the scope, a billing-permission-only user can use this tool even where list_all_expenses is denied.
| Parameter | Type | Required | Description |
|---|---|---|---|
case_id | integer | yes | |
filter_updated_after | string | no | Only records updated strictly after this ISO8601 timestamp (exclusive bound, unlike the inclusive entry-date filters) |
filter_entry_date_after | string | no | Only expenses dated on or after this date-only ISO8601 date (YYYY-MM-DD); the bound is inclusive |
filter_entry_date_before | string | no | Only expenses dated on or before this date-only ISO8601 date (YYYY-MM-DD); the bound is inclusive |
filter_billed | boolean | no | true → only expenses already on an invoice; false → only expenses not yet invoiced |
page_size | integer | no | Items per page (default 25, max 1000) |
page_token | string | no | Token from the previous response's pagination.next_page_token. Re-send it together with every filter/search/field param used on the first page — the token carries only the cursor, so any param omitted here is dropped from the query and the results silently widen instead of erroring. A response with no next_page_token is the last page. |
list_case_billing_flat_fees
List Case Billing Flat Fees read-only
List a case's flat-fee billing line items: fixed-amount charges with no activity, rate, or duration — the third line-item type alongside time entries and expenses. Flat fees never appear in the time-entry feed, and BILLED flat fees appear in get_case_invoice_line_items (its flat_fees group); but UNBILLED flat fees appear only here, so a work-in-progress total built without this tool misses unbilled flat-fee revenue. They are also distinct from flat-RATE time entries, which list_case_billing_time_entries does include. amount is the charge (total is the same value, for symmetry with the sibling feeds). filter_billed reflects actual invoice association, and billed=false does NOT imply billable — also check the billable field. Do not reconcile this feed against summary.unbilled.flat_fees: that rollup is the agreed fee_structure.flat_fee minus billed billable items, not a sum of the unbilled rows here. Requires the read_expenses token scope plus the time-entries-and-expenses OR billing user permission, and returns 403 without them — given the scope, a billing-permission-only user can use this tool even where list_all_time_entries is denied.
| Parameter | Type | Required | Description |
|---|---|---|---|
case_id | integer | yes | |
filter_updated_after | string | no | Only records updated strictly after this ISO8601 timestamp (exclusive bound, unlike the inclusive entry-date filters) |
filter_entry_date_after | string | no | Only flat fees dated on or after this date-only ISO8601 date (YYYY-MM-DD); the bound is inclusive |
filter_entry_date_before | string | no | Only flat fees dated on or before this date-only ISO8601 date (YYYY-MM-DD); the bound is inclusive |
filter_billed | boolean | no | true → only flat fees already on an invoice; false → only flat fees not yet invoiced |
page_size | integer | no | Items per page (default 25, max 1000) |
page_token | string | no | Token from the previous response's pagination.next_page_token. Re-send it together with every filter/search/field param used on the first page — the token carries only the cursor, so any param omitted here is dropped from the query and the results silently widen instead of erroring. A response with no next_page_token is the last page. |
list_case_billing_payments
List Case Billing Payments read-only
List successful payments applied to a case's bills. Bill payments only: retainer, subscription, and quick-bill receipts are excluded, and so are pending/failed transactions — never infer 'no failed charges' from this feed. For any of those (all payable types, all statuses) scoped to this same case, use list_all_payments with filter_case_id. amount is SIGNED: refunds/voids are negative with is_refund true, so summing the list gives the correct net — do not count refunds as income. client on each payment is the bill's billing contact, never the staff member who recorded it. Requires the caller's billing permission and returns 403 without it, so an empty list means the case genuinely has no matching payments.
| Parameter | Type | Required | Description |
|---|---|---|---|
case_id | integer | yes | |
filter_updated_after | string | no | Only records updated strictly after this ISO8601 timestamp (exclusive bound) |
page_size | integer | no | Items per page (default 25, max 1000) |
page_token | string | no | Token from the previous response's pagination.next_page_token. Re-send it together with every filter/search/field param used on the first page — the token carries only the cursor, so any param omitted here is dropped from the query and the results silently widen instead of erroring. A response with no next_page_token is the last page. |
list_case_billing_time_entries
List Case Billing Time Entries read-only
List a case's time entries with a server-computed total that prices flat-rate entries correctly — prefer it over summing rows. Flat-FEE billing line items are separate records that NEVER appear in any time-entry feed — include list_case_billing_flat_fees when totaling case billing (flat-RATE time entries, by contrast, are ordinary rows here). filter_billed reflects actual invoice association (the same definition the billing summary uses); billed=false does NOT imply billable — also check the billable field when reconciling against summary.unbilled. Requires the read_expenses token scope (same as list_all_time_entries) plus the time-entries-and-expenses OR billing user permission, and returns 403 without them — given the scope, a billing-permission-only user can use this tool even where list_all_time_entries is denied.
| Parameter | Type | Required | Description |
|---|---|---|---|
case_id | integer | yes | |
filter_updated_after | string | no | Only records updated strictly after this ISO8601 timestamp (exclusive bound, unlike the inclusive entry-date filters) |
filter_entry_date_after | string | no | Only entries dated on or after this date-only ISO8601 date (YYYY-MM-DD); the bound is inclusive |
filter_entry_date_before | string | no | Only entries dated on or before this date-only ISO8601 date (YYYY-MM-DD); the bound is inclusive |
filter_billed | boolean | no | true → only entries already on an invoice; false → only entries not yet invoiced |
page_size | integer | no | Items per page (default 25, max 1000) |
page_token | string | no | Token from the previous response's pagination.next_page_token. Re-send it together with every filter/search/field param used on the first page — the token carries only the cursor, so any param omitted here is dropped from the query and the results silently widen instead of erroring. A response with no next_page_token is the last page. |
list_case_invoices
List Case Invoices read-only
List a case's invoices (bills), scoped to the case server-side. On a case the caller can see, list_all_invoices with filter_case_id at its default only_allowed_online_payments=false returns the same rows for the same caller; on a case they cannot see, this tool 404s while that one applies no case check at all and returns whatever bills on it are shared with them. Each invoice carries balance_due, and its due_date is the bill's actual next payment due date (payment-plan aware, matching the UI's overdue math). Includes balance-forwarded bills (status 'forwarded'), which the billing summary's totals exclude — counts may legitimately differ. Requires the caller's billing permission and returns 403 without it, so an empty list is never a permission artifact — but it is still not proof the case has no invoices: a caller who cannot view all firm cases sees only the bills shared with them, and the billing summary's bill-side sections are narrowed by that same rule, so neither tool can reveal the rest. Send the user to the MyCase app when a bill they expect is missing.
| Parameter | Type | Required | Description |
|---|---|---|---|
case_id | integer | yes | |
filter_updated_after | string | no | Only records updated strictly after this ISO8601 timestamp (exclusive bound) |
page_size | integer | no | Items per page (default 25, max 1000) |
page_token | string | no | Token from the previous response's pagination.next_page_token. Re-send it together with every filter/search/field param used on the first page — the token carries only the cursor, so any param omitted here is dropped from the query and the results silently widen instead of erroring. A response with no next_page_token is the last page. |
Calls
get_call
Get Call read-only
Get a specific call log entry by ID.
| Parameter | Type | Required | Description |
|---|---|---|---|
call_id | integer | yes |
list_callers
List Callers read-only
List all callers (clients and leads that can appear in call logs).
| Parameter | Type | Required | Description |
|---|---|---|---|
filter_updated_after | string | no | |
page_size | integer | no | Items per page (default 25, max 1000) |
page_token | string | no | Token from the previous response's pagination.next_page_token. Re-send it together with every filter/search/field param used on the first page — the token carries only the cursor, so any param omitted here is dropped from the query and the results silently widen instead of erroring. A response with no next_page_token is the last page. |
list_calls
List Calls read-only
List all call log entries.
| Parameter | Type | Required | Description |
|---|---|---|---|
filter_updated_after | string | no | |
page_size | integer | no | Items per page (default 25, max 1000) |
page_token | string | no | Token from the previous response's pagination.next_page_token. Re-send it together with every filter/search/field param used on the first page — the token carries only the cursor, so any param omitted here is dropped from the query and the results silently widen instead of erroring. A response with no next_page_token is the last page. |
Case Stages
get_case_stage
Get Case Stage read-only
Get a specific case stage by ID.
| Parameter | Type | Required | Description |
|---|---|---|---|
case_stage_id | integer | yes |
list_case_stages
List Case Stages read-only
List all case stages.
| Parameter | Type | Required | Description |
|---|---|---|---|
filter_updated_after | string | no | |
search_starts_with | string | no | |
page_size | integer | no | Items per page (default 25, max 1000) |
page_token | string | no | Token from the previous response's pagination.next_page_token. Re-send it together with every filter/search/field param used on the first page — the token carries only the cursor, so any param omitted here is dropped from the query and the results silently widen instead of erroring. A response with no next_page_token is the last page. |
Cases
get_case
Get Case read-only
Get a specific case by ID. Includes the full staff roster (per-staff lead_lawyer, originating_lawyer, and rate details) and latest_status_update — the newest free-text status write-up firm staff keep on the matter, or null if there is none. Status updates are firm-internal: clients never see them, so do not quote one into client-facing text. Use list_case_status_updates for the full history. Note that outstanding_balance is NOT money owed despite its name — it carries the case's flat-fee amount; use get_case_billing_summary for what is actually outstanding.
| Parameter | Type | Required | Description |
|---|---|---|---|
case_id | integer | yes |
get_case_folder
Get Case Folder read-only
Get the root document folder for a case.
| Parameter | Type | Required | Description |
|---|---|---|---|
case_id | integer | yes |
list_case_documents
List Case Documents read-only
List documents for a case.
| Parameter | Type | Required | Description |
|---|---|---|---|
case_id | integer | yes | |
filter_updated_after | string | no | |
page_size | integer | no | Items per page (default 25, max 1000) |
page_token | string | no | Token from the previous response's pagination.next_page_token. Re-send it together with every filter/search/field param used on the first page — the token carries only the cursor, so any param omitted here is dropped from the query and the results silently widen instead of erroring. A response with no next_page_token is the last page. |
list_case_notes
List Case Notes read-only
List notes for a case. Case notes are a distinct record type from Status updates, with their own subject, date and archived state — use list_case_status_updates for the running status write-ups.
| Parameter | Type | Required | Description |
|---|---|---|---|
case_id | integer | yes | |
filter_status | string | no | One of: active, archived. |
filter_updated_after | string | no | |
page_size | integer | no | Items per page (default 25, max 1000) |
page_token | string | no | Token from the previous response's pagination.next_page_token. Re-send it together with every filter/search/field param used on the first page — the token carries only the cursor, so any param omitted here is dropped from the query and the results silently widen instead of erroring. A response with no next_page_token is the last page. |
list_case_roles
List Case Roles read-only
List all case roles.
| Parameter | Type | Required | Description |
|---|---|---|---|
filter_updated_after | string | no | |
page_size | integer | no | Items per page (default 25, max 1000) |
page_token | string | no | Token from the previous response's pagination.next_page_token. Re-send it together with every filter/search/field param used on the first page — the token carries only the cursor, so any param omitted here is dropped from the query and the results silently widen instead of erroring. A response with no next_page_token is the last page. |
list_case_status_updates
List Case Status Updates read-only
List a case's Status update history, newest first. These are the short free-text write-ups firm staff keep on a matter — outreach attempts, investigator contact details, next steps. Each carries its author and timestamps; updated_by is null until an update is edited. Firm-internal: clients never see them. get_case returns only the newest one. Not an audit trail: any staffer who can edit the case can overwrite an entry in place, and deleted entries leave no trace.
| Parameter | Type | Required | Description |
|---|---|---|---|
case_id | integer | yes | |
page_size | integer | no | Items per page (default 25, max 100) |
page_token | string | no | Token from the previous response's pagination.next_page_token. Re-send it together with every filter/search/field param used on the first page — the token carries only the cursor, so any param omitted here is dropped from the query and the results silently widen instead of erroring. A response with no next_page_token is the last page. |
list_cases
List Cases read-only
List all cases. Supports filtering by status, updated_after, and text search. Each case carries a staff summary (staff_count and lead_lawyer) instead of the full staff roster; use get_case for full staff assignments. Note that outstanding_balance is NOT money owed despite its name — it carries each case's flat-fee amount; use get_case_billing_summary for what is actually outstanding.
| Parameter | Type | Required | Description |
|---|---|---|---|
filter_status | string | no | Filter by case status. One of: open, closed. |
filter_updated_after | string | no | ISO8601 datetime |
search_starts_with | string | no | Text search on case name |
page_size | integer | no | Items per page (default 25, max 200) |
page_token | string | no | Token from the previous response's pagination.next_page_token. Re-send it together with every filter/search/field param used on the first page — the token carries only the cursor, so any param omitted here is dropped from the query and the results silently widen instead of erroring. A response with no next_page_token is the last page. |
Clients
get_client
Get Client read-only
Get a specific client by ID.
| Parameter | Type | Required | Description |
|---|---|---|---|
client_id | integer | yes |
list_client_cases
List Client Cases read-only
List cases for a specific client. Note that outstanding_balance is NOT money owed despite its name — it carries each case's flat-fee amount; use get_case_billing_summary for what is actually outstanding.
| Parameter | Type | Required | Description |
|---|---|---|---|
client_id | integer | yes | |
filter_status | string | no | One of: open, closed. |
filter_updated_after | string | no | |
page_size | integer | no | Items per page (default 25, max 1000) |
page_token | string | no | Token from the previous response's pagination.next_page_token. Re-send it together with every filter/search/field param used on the first page — the token carries only the cursor, so any param omitted here is dropped from the query and the results silently widen instead of erroring. A response with no next_page_token is the last page. |
list_client_message_threads
List Client Message Threads read-only
List message threads for a client.
| Parameter | Type | Required | Description |
|---|---|---|---|
client_id | integer | yes | |
filter_updated_after | string | no | |
page_size | integer | no | Items per page (default 25, max 1000) |
page_token | string | no | Token from the previous response's pagination.next_page_token. Re-send it together with every filter/search/field param used on the first page — the token carries only the cursor, so any param omitted here is dropped from the query and the results silently widen instead of erroring. A response with no next_page_token is the last page. |
list_client_notes
List Client Notes read-only
List notes for a client.
| Parameter | Type | Required | Description |
|---|---|---|---|
client_id | integer | yes | |
filter_status | string | no | One of: active, archived. |
filter_updated_after | string | no | |
page_size | integer | no | Items per page (default 25, max 1000) |
page_token | string | no | Token from the previous response's pagination.next_page_token. Re-send it together with every filter/search/field param used on the first page — the token carries only the cursor, so any param omitted here is dropped from the query and the results silently widen instead of erroring. A response with no next_page_token is the last page. |
list_clients
List Clients read-only
List all clients. Supports filtering by name, email, phone, and text search.
| Parameter | Type | Required | Description |
|---|---|---|---|
filter_updated_after | string | no | |
filter_email | string | no | |
filter_first_name | string | no | |
filter_last_name | string | no | |
filter_cell_phone_number | string | no | |
filter_work_phone_number | string | no | |
filter_home_phone_number | string | no | |
filter_fax_phone_number | string | no | |
search_starts_with | string | no | |
page_size | integer | no | Items per page (default 25, max 1000) |
page_token | string | no | Token from the previous response's pagination.next_page_token. Re-send it together with every filter/search/field param used on the first page — the token carries only the cursor, so any param omitted here is dropped from the query and the results silently widen instead of erroring. A response with no next_page_token is the last page. |
Companies
get_company
Get Company read-only
Get a specific company by ID.
| Parameter | Type | Required | Description |
|---|---|---|---|
company_id | integer | yes |
list_companies
List Companies read-only
List all companies. Supports filtering by status, name, email, phone, and text search.
| Parameter | Type | Required | Description |
|---|---|---|---|
filter_status | string | no | Filter by company status. One of: active, archived. |
filter_updated_after | string | no | |
filter_email | string | no | |
filter_name | string | no | |
filter_fax_phone_number | string | no | |
filter_main_phone_number | string | no | |
search_starts_with | string | no | |
page_size | integer | no | Items per page (default 25, max 1000) |
page_token | string | no | Token from the previous response's pagination.next_page_token. Re-send it together with every filter/search/field param used on the first page — the token carries only the cursor, so any param omitted here is dropped from the query and the results silently widen instead of erroring. A response with no next_page_token is the last page. |
list_company_notes
List Company Notes read-only
List notes for a company.
| Parameter | Type | Required | Description |
|---|---|---|---|
company_id | integer | yes | |
filter_status | string | no | One of: active, archived. |
filter_updated_after | string | no | |
page_size | integer | no | Items per page (default 25, max 1000) |
page_token | string | no | Token from the previous response's pagination.next_page_token. Re-send it together with every filter/search/field param used on the first page — the token carries only the cursor, so any param omitted here is dropped from the query and the results silently widen instead of erroring. A response with no next_page_token is the last page. |
Contacts
list_contacts
List Contacts read-only
List all contacts (clients, companies, leads) across the firm.
| Parameter | Type | Required | Description |
|---|---|---|---|
filter_updated_after | string | no | |
page_size | integer | no | Items per page (default 25, max 1000) |
page_token | string | no | Token from the previous response's pagination.next_page_token. Re-send it together with every filter/search/field param used on the first page — the token carries only the cursor, so any param omitted here is dropped from the query and the results silently widen instead of erroring. A response with no next_page_token is the last page. |
Custom Fields
get_custom_field
Get Custom Field read-only
Get a specific custom field definition by ID.
| Parameter | Type | Required | Description |
|---|---|---|---|
custom_field_id | integer | yes |
list_custom_field_options
List Custom Field Options read-only
List options for a list-type custom field.
| Parameter | Type | Required | Description |
|---|---|---|---|
custom_field_id | integer | yes | |
page_size | integer | no | Items per page (default 25, max 1000) |
page_token | string | no | Token from the previous response's pagination.next_page_token. Re-send it together with every filter/search/field param used on the first page — the token carries only the cursor, so any param omitted here is dropped from the query and the results silently widen instead of erroring. A response with no next_page_token is the last page. |
list_custom_fields
List Custom Fields read-only
List all custom field definitions.
| Parameter | Type | Required | Description |
|---|---|---|---|
filter_parent_type | string | no | One of: case, client, company, expense, time, time_and_expense. |
filter_updated_after | string | no | |
page_size | integer | no | Items per page (default 25, max 1000) |
page_token | string | no | Token from the previous response's pagination.next_page_token. Re-send it together with every filter/search/field param used on the first page — the token carries only the cursor, so any param omitted here is dropped from the query and the results silently widen instead of erroring. A response with no next_page_token is the last page. |
Documents
download_document
Download Document read-only
Get a presigned download URL for the raw file content of a document. Returns a short-lived redirect URL to the raw file in storage. The file is returned as-is — for server-extracted text, use get_document_text instead.
| Parameter | Type | Required | Description |
|---|---|---|---|
document_id | integer | yes |
download_document_version
Download Document Version read-only
Get a presigned download URL for the raw file content of a specific document version. Returns a short-lived redirect URL to the raw file in storage. The file is returned as-is — for server-extracted text of the latest parsed version, use get_document_text instead.
| Parameter | Type | Required | Description |
|---|---|---|---|
document_id | integer | yes | |
version_number | integer | yes |
get_document
Get Document read-only
Get document metadata by ID. Returns metadata only — use download_document for the raw file or get_document_text for extracted text.
| Parameter | Type | Required | Description |
|---|---|---|---|
document_id | integer | yes |
get_document_text
Get Document Text read-only
Get server-extracted plain text for a document. Returns a short-lived URL to the extracted text plus metadata (content_length, page_count, parsed_at). Fetch the URL promptly with your available tools — it expires in about 5 minutes and serves text/plain. For large documents, prefer downloading and searching locally over reading the whole text into context. Text reflects the document version current when it was parsed (see parsed_at); newly uploaded versions are not re-extracted. When no extracted text exists, returns not_found with a detail field — error 'no_parsed_text' plus a parsing_status: 'not_parsed' means extraction has not completed for the current version and may still be in progress for a recently uploaded document (retry later); other statuses (e.g. 'failed', 'unparseable', 'not_supported', 'scanned', 'ocr_disabled', 'large_document') are terminal for the current version. Detail error 'not_found' means the document itself does not exist.
| Parameter | Type | Required | Description |
|---|---|---|---|
document_id | integer | yes |
list_document_versions
List Document Versions read-only
List all versions of a document.
| Parameter | Type | Required | Description |
|---|---|---|---|
document_id | integer | yes | |
filter_updated_after | string | no | |
page_size | integer | no | Items per page (default 25, max 1000) |
page_token | string | no | Token from the previous response's pagination.next_page_token. Re-send it together with every filter/search/field param used on the first page — the token carries only the cursor, so any param omitted here is dropped from the query and the results silently widen instead of erroring. A response with no next_page_token is the last page. |
list_document_versions_all
List Document Versions All read-only
List all document versions across the firm.
| Parameter | Type | Required | Description |
|---|---|---|---|
filter_updated_after | string | no | |
page_size | integer | no | Items per page (default 25, max 1000) |
page_token | string | no | Token from the previous response's pagination.next_page_token. Re-send it together with every filter/search/field param used on the first page — the token carries only the cursor, so any param omitted here is dropped from the query and the results silently widen instead of erroring. A response with no next_page_token is the last page. |
list_documents
List Documents read-only
List all documents across the firm. Returns document metadata only — use get_document_text for extracted text or download_document for the raw file.
| Parameter | Type | Required | Description |
|---|---|---|---|
filter_updated_after | string | no | |
page_size | integer | no | Items per page (default 25, max 1000) |
page_token | string | no | Token from the previous response's pagination.next_page_token. Re-send it together with every filter/search/field param used on the first page — the token carries only the cursor, so any param omitted here is dropped from the query and the results silently widen instead of erroring. A response with no next_page_token is the last page. |
list_folder_documents
List Folder Documents read-only
List documents within a folder.
| Parameter | Type | Required | Description |
|---|---|---|---|
folder_id | integer | yes | |
filter_updated_after | string | no | |
page_size | integer | no | Items per page (default 25, max 1000) |
page_token | string | no | Token from the previous response's pagination.next_page_token. Re-send it together with every filter/search/field param used on the first page — the token carries only the cursor, so any param omitted here is dropped from the query and the results silently widen instead of erroring. A response with no next_page_token is the last page. |
list_folder_subfolders
List Folder Subfolders read-only
List subfolders within a folder.
| Parameter | Type | Required | Description |
|---|---|---|---|
folder_id | integer | yes | |
filter_updated_after | string | no | |
page_size | integer | no | Items per page (default 25, max 1000) |
page_token | string | no | Token from the previous response's pagination.next_page_token. Re-send it together with every filter/search/field param used on the first page — the token carries only the cursor, so any param omitted here is dropped from the query and the results silently widen instead of erroring. A response with no next_page_token is the last page. |
Events
get_event
Get Event read-only
Get a specific event by ID. When starting from a full_text_search result, pass its appointment_rule_id — an event search result's id identifies a single occurrence on the calendar, drawn from a different table, so passing it here usually 404s and can otherwise return an unrelated event.
| Parameter | Type | Required | Description |
|---|---|---|---|
event_id | integer | yes |
list_events
List Events read-only
List all calendar events.
| Parameter | Type | Required | Description |
|---|---|---|---|
filter_updated_after | string | no | |
page_size | integer | no | Items per page (default 25, max 1000) |
page_token | string | no | Token from the previous response's pagination.next_page_token. Re-send it together with every filter/search/field param used on the first page — the token carries only the cursor, so any param omitted here is dropped from the query and the results silently widen instead of erroring. A response with no next_page_token is the last page. |
Expenses
get_expense
Get Expense read-only
Get a specific expense by ID.
| Parameter | Type | Required | Description |
|---|---|---|---|
expense_id | integer | yes |
list_all_expenses
List All Expenses read-only
List all expenses across the firm. Optionally filter by case.
| Parameter | Type | Required | Description |
|---|---|---|---|
filter_case_id | integer | no | Filter expenses to a specific case ID |
filter_updated_after | string | no | |
page_size | integer | no | Items per page (default 25, max 1000) |
page_token | string | no | Token from the previous response's pagination.next_page_token. Re-send it together with every filter/search/field param used on the first page — the token carries only the cursor, so any param omitted here is dropped from the query and the results silently widen instead of erroring. A response with no next_page_token is the last page. |
Feedback
report_feedback
Report Feedback write
Report a bug or request a feature for the MyCase MCP server itself. Call this when a tool fails repeatedly or behaves unexpectedly, or when the user wants a capability these tools don't provide. Confirm with the user before submitting. Do NOT include client names, case details, or document contents — describe the problem generically.
| Parameter | Type | Required | Description |
|---|---|---|---|
feedback_type | string | yes | One of: bug, feature_request. |
summary | string | yes | One-line description of the problem or request |
details | string | no | Expected vs. actual behavior, and exact error text if any |
related_tool | string | no | Name of the MCP tool this feedback concerns |
Firm
get_firm
Get Firm read-only
Get information about the current firm.
get_me
Get Me read-only
Get information about the currently authenticated user.
Invoices
get_invoice
Get Invoice read-only
Get a specific invoice by ID, including invoices that have online payments disabled: the by-id lookup uses the same wide invoice scope as list_all_invoices, so any invoice that appears there can also be fetched here.
| Parameter | Type | Required | Description |
|---|---|---|---|
invoice_id | integer | yes |
list_all_invoices
List All Invoices read-only
List invoices (bills) across the firm, or scope to a single case with filter_case_id. At this tool's default only_allowed_online_payments=false, filter_case_id returns the same rows as list_case_invoices for the same caller, balance-forwarded bills (status 'forwarded') included. Requires the caller's billing permission and returns 403 without it. But unlike list_case_invoices, which 404s a case the caller cannot see, an unknown filter_case_id here returns an empty list — so an empty result is not proof that the case exists or that it has no invoices. Confirm the case with get_case before reporting either. Case visibility and bill visibility are separate rules: a caller without all-cases access still sees the bills shared with them, so this tool can return rows for a case list_case_invoices 404s.
| Parameter | Type | Required | Description |
|---|---|---|---|
filter_case_id | integer | no | Only invoices on this case — the server-side case scope, so one case's invoices need no client-side filtering. It composes with the caller's own authorization scope and never widens it: a caller who cannot view all firm cases still sees only the bills shared with them. Setting only_allowed_online_payments true alongside it drops invoices that have online payments disabled, narrowing below what list_case_invoices shows. |
filter_updated_after | string | no | Only records updated strictly after this ISO8601 timestamp (exclusive bound) |
only_allowed_online_payments | boolean | no | When true, returns only invoices that allow online payments. Defaults to false so all invoices are listed. |
page_size | integer | no | Items per page (default 25, max 1000) |
page_token | string | no | Token from the previous response's pagination.next_page_token. Re-send it together with every filter/search/field param used on the first page — the token carries only the cursor, so any param omitted here is dropped from the query and the results silently widen instead of erroring. A response with no next_page_token is the last page. |
list_all_payments
List All Payments read-only
List payment transactions across ALL payable types — bill, retainer, subscription, and quick-bill payments — including pending and failed rows (pass filter_status to narrow); each row's payable_type names its kind. amount is SIGNED: refunds/voids are negative with is_refund true, so they net out rather than inflate a total. To total true settled receipts, sum only status=success rows — pending and failed rows are returned here by default and never settled. Scope to one case with filter_case_id (spanning every payable type and status for that case) or to one invoice with filter_payable_id. For a case's SETTLED BILL receipts only — retainer, subscription, and quick-bill receipts and pending/failed transactions excluded — use list_case_billing_payments instead; the two feeds agree on amount sign and both report client as the payable's billing contact (never the staff member who recorded the payment), differing only in payable-type and status breadth. For incremental sync, pass filter_updated_after instead of re-paginating the full payment history.
| Parameter | Type | Required | Description |
|---|---|---|---|
filter_payable_id | integer | no | Filter by invoice ID |
filter_case_id | integer | no | Filter to payments whose payable (bill/retainer/subscription/quick-bill) is on this case — the server-side case scope for firm-wide payment analysis, so a single case's payments need no client-side assembly. Spans all payable types and statuses for the case; list_case_billing_payments is the bill-only, successful-only case feed. |
filter_status | string | no | Filter by payment status. One of: pending, success, failure, error, timeout. |
filter_updated_after | string | no | ISO8601 datetime; returns only payments whose payment record's own updated_at is strictly after this bound (exclusive). Keys off the payment transaction itself — an update to the parent invoice/bill does not surface its payments. |
page_size | integer | no | Items per page (default 25, max 1000) |
page_token | string | no | Token from the previous response's pagination.next_page_token. Re-send it together with every filter/search/field param used on the first page — the token carries only the cursor, so any param omitted here is dropped from the query and the results silently widen instead of erroring. A response with no next_page_token is the last page. |
Leads
get_lead
Get Lead read-only
Get a specific lead by ID.
| Parameter | Type | Required | Description |
|---|---|---|---|
lead_id | integer | yes |
list_leads
List Leads read-only
List all leads. Supports filtering by status, name, email, phone, and text search.
| Parameter | Type | Required | Description |
|---|---|---|---|
filter_status | string | no | One of: approved, unapproved. |
filter_updated_after | string | no | |
filter_email | string | no | |
filter_first_name | string | no | |
filter_last_name | string | no | |
filter_cell_phone_number | string | no | |
filter_work_phone_number | string | no | |
filter_home_phone_number | string | no | |
search_starts_with | string | no | |
page_size | integer | no | Items per page (default 25, max 1000) |
page_token | string | no | Token from the previous response's pagination.next_page_token. Re-send it together with every filter/search/field param used on the first page — the token carries only the cursor, so any param omitted here is dropped from the query and the results silently widen instead of erroring. A response with no next_page_token is the last page. |
Locations
get_location
Get Location read-only
Get a specific location by ID.
| Parameter | Type | Required | Description |
|---|---|---|---|
location_id | integer | yes |
list_locations
List Locations read-only
List all locations.
| Parameter | Type | Required | Description |
|---|---|---|---|
filter_updated_after | string | no | |
search_starts_with | string | no | |
page_size | integer | no | Items per page (default 25, max 1000) |
page_token | string | no | Token from the previous response's pagination.next_page_token. Re-send it together with every filter/search/field param used on the first page — the token carries only the cursor, so any param omitted here is dropped from the query and the results silently widen instead of erroring. A response with no next_page_token is the last page. |
Messages
get_message_thread
Get Message Thread read-only
Get a message thread's metadata by ID: subject, sender, participants (clients and staff), related case, and the opening message body. Use list_thread_messages to read the full conversation.
| Parameter | Type | Required | Description |
|---|---|---|---|
thread_id | integer | yes |
list_message_threads
List Message Threads read-only
List message threads the authorizing user can view, including staff-only threads (list_client_message_threads only covers threads with a specific client). Returns thread metadata plus the opening message; use list_thread_messages to read a full conversation.
| Parameter | Type | Required | Description |
|---|---|---|---|
filter_updated_after | string | no | |
page_size | integer | no | Items per page (default 25, max 1000) |
page_token | string | no | Token from the previous response's pagination.next_page_token. Re-send it together with every filter/search/field param used on the first page — the token carries only the cursor, so any param omitted here is dropped from the query and the results silently widen instead of erroring. A response with no next_page_token is the last page. |
list_thread_messages
List Thread Messages read-only
List every message in a message thread — the opening message and all replies, oldest first — with each message's sender and timestamp.
| Parameter | Type | Required | Description |
|---|---|---|---|
thread_id | integer | yes | |
page_size | integer | no | Items per page (default 25, max 1000) |
page_token | string | no | Token from the previous response's pagination.next_page_token. Re-send it together with every filter/search/field param used on the first page — the token carries only the cursor, so any param omitted here is dropped from the query and the results silently widen instead of erroring. A response with no next_page_token is the last page. |
Notes
get_note
Get Note read-only
Get a specific note by ID.
| Parameter | Type | Required | Description |
|---|---|---|---|
note_id | integer | yes |
People Groups
get_people_group
Get People Group read-only
Get a specific people group by ID.
| Parameter | Type | Required | Description |
|---|---|---|---|
people_group_id | integer | yes |
list_people_groups
List People Groups read-only
List all people groups (contact groups).
| Parameter | Type | Required | Description |
|---|---|---|---|
filter_updated_after | string | no | |
page_size | integer | no | Items per page (default 25, max 1000) |
page_token | string | no | Token from the previous response's pagination.next_page_token. Re-send it together with every filter/search/field param used on the first page — the token carries only the cursor, so any param omitted here is dropped from the query and the results silently widen instead of erroring. A response with no next_page_token is the last page. |
Practice Areas
get_practice_area
Get Practice Area read-only
Get a specific practice area by ID.
| Parameter | Type | Required | Description |
|---|---|---|---|
practice_area_id | integer | yes |
list_practice_areas
List Practice Areas read-only
List all practice areas.
| Parameter | Type | Required | Description |
|---|---|---|---|
filter_updated_after | string | no | |
search_starts_with | string | no | |
page_size | integer | no | Items per page (default 25, max 1000) |
page_token | string | no | Token from the previous response's pagination.next_page_token. Re-send it together with every filter/search/field param used on the first page — the token carries only the cursor, so any param omitted here is dropped from the query and the results silently widen instead of erroring. A response with no next_page_token is the last page. |
Referral Sources
get_referral_source
Get Referral Source read-only
Get a specific referral source by ID.
| Parameter | Type | Required | Description |
|---|---|---|---|
referral_source_id | integer | yes |
list_referral_sources
List Referral Sources read-only
List all referral sources.
| Parameter | Type | Required | Description |
|---|---|---|---|
filter_updated_after | string | no | |
search_starts_with | string | no | |
page_size | integer | no | Items per page (default 25, max 1000) |
page_token | string | no | Token from the previous response's pagination.next_page_token. Re-send it together with every filter/search/field param used on the first page — the token carries only the cursor, so any param omitted here is dropped from the query and the results silently widen instead of erroring. A response with no next_page_token is the last page. |
Search
full_text_search
Full Text Search read-only
Search across the firm's records by text query: cases, contacts, documents, notes, tasks, events, leads, messages, expenses, and call log entries. Matches names, descriptions, numbers, and notes, and returns matched-text highlights. Only record types the connection is authorized to read are searched; the response's requested_types field lists the types the search was submitted with, narrowed by scope and by case_id, and is not proof each one was searched — a type the firm has disabled is dropped upstream without being echoed back. Pass case_id to confine the search to a single case instead of the whole firm. Event results are keyed by appointment_rule_id, not by id — pass appointment_rule_id to get_event.
| Parameter | Type | Required | Description |
|---|---|---|---|
query | string | yes | Search text, 3-100 characters |
types | array[string] | no | Record types to search. Defaults to every type the connection can read. Searching 'documents' alone also matches document file content where the firm has content search enabled. One of: calls, cases, contacts, documents, events, expenses, leads, messages, notes, tasks. |
case_id | integer | no | Scope the search to one case: only records associated with that case are returned. Firm-level documents — those filed outside any case — are excluded, so omit case_id to reach them. contacts and leads cannot be case-scoped: they are dropped from a case-scoped search and requested_types echoes the reduced list, and asking for only contacts or leads together with case_id is rejected. A message's case association can be stale, so message hits are best-effort. A case id that does not exist, or that this user cannot see, returns an empty result set rather than an error — indistinguishable from a case that simply has no matches, so do not read empty results as proof the case is empty. Where the firm's search index cannot apply the case filter, the scope is enforced after each upstream page is fetched, so a page may return fewer than page_size results — even zero — while later pages still hold matches. Judge that by the token and never by page length: a short page still carries pagination.next_page_token when more results remain. |
page_size | integer | no | Results per page (default 10, max 50) |
page_token | string | no | Token from the previous response's pagination.next_page_token, to fetch the next page. Pass it back with the same query, types and case_id it was issued for; a token replayed against a different search is rejected rather than answered. page_size is not part of that match — it may be changed mid-sweep, and the new value applies from that page on. A response with no next_page_token is the last page. |
Staff
get_staff
Get Staff read-only
Get a specific staff member by ID.
| Parameter | Type | Required | Description |
|---|---|---|---|
staff_id | integer | yes |
list_staff
List Staff read-only
List all staff members.
| Parameter | Type | Required | Description |
|---|---|---|---|
filter_status | string | no | One of: active, inactive. |
filter_updated_after | string | no | |
search_starts_with | string | no | |
page_size | integer | no | Items per page (default 25, max 1000) |
page_token | string | no | Token from the previous response's pagination.next_page_token. Re-send it together with every filter/search/field param used on the first page — the token carries only the cursor, so any param omitted here is dropped from the query and the results silently widen instead of erroring. A response with no next_page_token is the last page. |
Tasks
get_task
Get Task read-only
Get a specific task by ID.
| Parameter | Type | Required | Description |
|---|---|---|---|
task_id | integer | yes |
list_tasks
List Tasks read-only
List all tasks. Optionally filter by case or updated_after (ISO8601).
| Parameter | Type | Required | Description |
|---|---|---|---|
filter_case_id | integer | no | Filter tasks to a specific case ID |
filter_updated_after | string | no | ISO8601 datetime to filter tasks updated after this time |
page_size | integer | no | Items per page (default 25, max 1000) |
page_token | string | no | Token from the previous response's pagination.next_page_token. Re-send it together with every filter/search/field param used on the first page — the token carries only the cursor, so any param omitted here is dropped from the query and the results silently widen instead of erroring. A response with no next_page_token is the last page. |
Time Entries
get_time_entry
Get Time Entry read-only
Get a specific time entry by ID. Includes the server-computed total (always present); billing_status ('unbilled', 'on_draft_invoice', or 'invoiced') and the invoices list are included only with billing access (the caller's billing permission plus the read_invoices scope) and are withheld otherwise.
| Parameter | Type | Required | Description |
|---|---|---|---|
time_entry_id | integer | yes |
list_all_time_entries
List All Time Entries read-only
List all time entries across the firm. Optionally filter by case. Each entry carries a server-computed total that prices flat-rate entries correctly — prefer it over hours x rate math; total is always present. With billing access (the caller's billing permission plus the read_invoices scope) each entry also carries a billing_status of 'unbilled', 'on_draft_invoice', or 'invoiced' and an invoices list reflecting actual invoice association including draft invoices; without that access those billing fields are withheld, so their absence does not mean an entry is unbilled. billed does NOT imply the entry was billable — check the billable field when reconciling. Flat-fee billing line items are separate records that never appear in time-entry results — use list_case_billing_flat_fees for a case's flat fees; billed flat fees also appear in get_case_invoice_line_items, but unbilled flat-fee revenue appears only via list_case_billing_flat_fees, so a work-in-progress total built without it misses that revenue.
| Parameter | Type | Required | Description |
|---|---|---|---|
filter_case_id | integer | no | Filter time entries to a specific case ID |
filter_updated_after | string | no | Only entries updated strictly after this ISO8601 timestamp (exclusive bound, unlike the inclusive entry-date filters) |
filter_entry_date_after | string | no | Only entries dated on or after this date-only ISO8601 date (YYYY-MM-DD); the bound is inclusive |
filter_entry_date_before | string | no | Only entries dated on or before this date-only ISO8601 date (YYYY-MM-DD); the bound is inclusive |
filter_billed | boolean | no | true → only entries already on an invoice (draft or finalized — use billing_status to distinguish); false → only entries not yet invoiced |
page_size | integer | no | Items per page (default 25, max 1000) |
page_token | string | no | Token from the previous response's pagination.next_page_token. Re-send it together with every filter/search/field param used on the first page — the token carries only the cursor, so any param omitted here is dropped from the query and the results silently widen instead of erroring. A response with no next_page_token is the last page. |
Trust
list_trust_account_balances
List Trust Account Balances read-only
Current per-client trust (IOLTA) holdings — the rows behind the MyCase Trust Account Summary report. Each row is one client's balance in one trust bank account, either allocated to a case or unallocated: unallocated=true rows (case is null) are client-wide trust funds not tied to any case. A client's total trust = the sum of their rows, which equals list_trust_ledger_entries net change summed over that client's ENTIRE unfiltered history — never a date-filtered ledger sum. A case's trust picture = its allocated rows PLUS its clients' unallocated rows, which get_case_billing_summary.balances.trust also reports; the two are independent reads that use different case-allocation predicates, so they usually agree but may legitimately differ — treat them as corroborating, not a guaranteed identity. Balances are current as of now (no as-of-date support); for changes over a period use list_trust_ledger_entries. Zero-balance rows are included unless filter_include_zero_balances=false. Trust money is client money, never firm revenue. Requires the billing user permission and returns 403 without it.
| Parameter | Type | Required | Description |
|---|---|---|---|
filter_client_id | integer | no | Only holdings of this client (contact) ID |
filter_case_id | integer | no | Only holdings ALLOCATED to this case — excludes the clients' unallocated (client-wide) rows, so this alone understates the case's available trust |
filter_bank_account_id | integer | no | Only holdings in this trust bank account ID |
filter_include_zero_balances | boolean | no | false → omit zero-balance rows (clients whose trust is fully disbursed); default true |
page_size | integer | no | Items per page (default 25, max 1000) |
page_token | string | no | Token from the previous response's pagination.next_page_token. Re-send it together with every filter/search/field param used on the first page — the token carries only the cursor, so any param omitted here is dropped from the query and the results silently widen instead of erroring. A response with no next_page_token is the last page. |
list_trust_bank_accounts
List Trust Bank Accounts read-only
List the firm's trust (IOLTA) bank accounts with the total client funds currently held in each. balance is CLIENT money the firm holds in trust — never firm revenue; do not mix it with billing totals (invoices, payments, collected). balance equals the sum of list_trust_account_balances rows for the account, and clients_with_balance counts distinct clients with a nonzero balance. Deleted accounts are excluded. Requires the billing user permission and returns 403 without it — an empty list really means the firm has no trust accounts.
| Parameter | Type | Required | Description |
|---|---|---|---|
page_size | integer | no | Items per page (default 25, max 1000) |
page_token | string | no | Token from the previous response's pagination.next_page_token. Re-send it together with every filter/search/field param used on the first page — the token carries only the cursor, so any param omitted here is dropped from the query and the results silently widen instead of erroring. A response with no next_page_token is the last page. |
list_trust_ledger_entries
List Trust Ledger Entries read-only
Trust (IOLTA) ledger activity — the rows of the MyCase Trust Account Activity report: deposits into trust and payments/withdrawals out of trust, including the incoming deposits that invoice-payment feeds never show. Each entry carries credit (client funds INTO trust) or debit (funds OUT of trust) as non-negative amounts with exactly one nonzero; net change over a set = sum(credit) - sum(debit). That net change equals a client's current trust balance ONLY when summing ALL of that client's entries with no date filter (their entire unfiltered history); a date-windowed sum is just the net change for that window, not the as-of-now balance — for current balances use list_trust_account_balances. No running balance is served. case is null for activity on a client's unallocated (client-wide) trust; related_to names the invoice, retainer request, or subscription the money was applied to, when any. Refunds and voided checks appear as opposite-side entries (a voided trust withdrawal shows as a credit), never as deletions. Results are ordered by id (creation order), not by date — use the inclusive filter_pay_date_after/_before bounds for date windows. Trust money is client money, never firm revenue — do not sum it into billing totals. Requires the billing user permission and returns 403 without it, so an empty list really means no matching trust activity.
| Parameter | Type | Required | Description |
|---|---|---|---|
filter_client_id | integer | no | Only entries for this client (contact) ID |
filter_case_id | integer | no | Only entries on trust buckets allocated to this case; excludes the clients' unallocated (client-wide) activity |
filter_bank_account_id | integer | no | Only entries touching this trust bank account ID |
filter_pay_date_after | string | no | Only entries dated on or after this date-only ISO8601 date (YYYY-MM-DD); the bound is inclusive |
filter_pay_date_before | string | no | Only entries dated on or before this date-only ISO8601 date (YYYY-MM-DD); the bound is inclusive |
filter_updated_after | string | no | Only records updated strictly after this ISO8601 timestamp (exclusive bound, unlike the inclusive pay-date filters) |
page_size | integer | no | Items per page (default 25, max 1000) |
page_token | string | no | Token from the previous response's pagination.next_page_token. Re-send it together with every filter/search/field param used on the first page — the token carries only the cursor, so any param omitted here is dropped from the query and the results silently widen instead of erroring. A response with no next_page_token is the last page. |