Skip to main content
Glama

Clio Manage MCP

License: MIT Node ≥ 20 TypeScript MCP Build Status: beta

Run your law practice from a chat box. A Model Context Protocol server that connects Clio Manage to Claude as a secure, per-user remote OAuth connector — ask in plain English and your matters, time, billing, calendar, and documents answer back. Each user picks an access tier (read-only, read + write, or read/write/delete) on a consent page before signing in. Deploy it to Azure with azd up, run it as a container anywhere, or use it locally over stdio.

Independent open-source project. Not affiliated with or endorsed by Clio (Themis Solutions Inc.).

Built with

TypeScript Node.js Microsoft Azure Container Apps Docker Bicep Express Clio OAuth 2.1 AES-256-GCM

This server is the boundary between an AI agent (Claude, or any MCP client) and your firm's Clio Manage instance. It speaks Clio v4 fluently — matters, contacts, time, tasks, notes, calendar, documents, bills — and exposes it as a remote custom connector: each attorney adds one URL in Claude, signs in to their own Clio account, and is connected. Tokens are encrypted at rest, every tool call is audited, and one user's Clio data is never visible to another's session.

The one-minute version

azd up                                  # 1 · deploy to Azure Container Apps (OAuth by default)
#  → in Claude: Settings → Connectors → Add custom connector
#  → paste  https://<your-app>.azurecontainerapps.io/mcp
#  → each attorney signs in to their OWN Clio account   →   connected

No API keys to hand around and no shared login: Claude does discovery → registration → PKCE, then the user signs in on Clio's own domain. Prefer to stay local? The same binary runs over stdio for solo and development use.

What's in the box

  • A remote OAuth 2.1 custom connector for Claude: per-user sign-in to Clio, Dynamic Client Registration, PKCE, served from Azure Container Apps

  • Interactive scope tiers: at connect time each user chooses read-only, read + write, or read/write/delete on a branded consent page; the session's tool list reflects exactly what was granted (clio:read / clio:write / clio:destructive)

  • 41 tools across 11 Clio domains, plus a generic clio_api_request escape hatch

  • A composite intake workflow (clio_open_new_matter) that chains client + matter + opening note + intake task into one agent action

  • Per-session, AES-256-GCM encrypted Clio tokens, multi-replica safe on shared storage

  • Append-only JSONL audit log designed around ABA Formal Opinion 512

What's different about this one

  • Per-user OAuth, not a shared key. The headline mode (MCP_AUTH_MODE=oauth) turns this server into an OAuth 2.0 Authorization Server + Protected Resource that bridges each Claude user to their own Clio account. No bearer tokens to hand out, no shared login. Claude does discovery → registration → PKCE → the user signs in on Clio. A simpler shared-token static mode is still available.

  • Azure-native. A single azd up provisions Container Apps + ACR + Key Vault + Azure Files + Log Analytics, defaults to OAuth mode, and auto-sets PUBLIC_BASE_URL from the environment domain. Secrets flow from Key Vault to the container via managed identity — never on disk.

  • End-to-end verified. npm run smoke:stdio, npm run smoke:http, and npm run smoke:oauth drive a real MCP session — including the full OAuth discovery handshake — against the built binary. CI blocks regressions in protocol shape, tool registration, auth gating, and resource publication.

  • Multi-region. US / CA / EU / AU Clio endpoints via one CLIO_REGION env.


Contents

  1. What you can ask Claude

  2. How connecting works

  3. Architecture

  4. Quick start — Azure (remote connector)

  5. Quick start — local (stdio)

  6. Tool catalog

  7. Resources

  8. Configuration

  9. Security & compliance posture

  10. Cost (Azure)

  11. FAQ

  12. Verification

  13. Confirmed Clio API quirks

  14. The Clio Manage plugin

  15. Works with

  16. Optional connectors

  17. Landing page

  18. Development

  19. Related work

  20. Roadmap

  21. License


Related MCP server: filevine-mcp

What you can ask Claude

Once connected, these are real prompts that route through the connector. The tool calls happen transparently; the agent picks what to call from the catalog. In OAuth mode each result reflects that user's Clio account.

Matter lookup

"Show me all open matters for Acme Corp." "What's the status of matter 2024-0042?" "Which matters have been updated since last Monday?"

Time & billing

"How many hours has the team logged on matter 4821 this month?" "What's the outstanding balance on matter 4821 and when was the last invoice issued?" "List all unbilled time entries from Jane in April."

Intake (composite workflow)

"Open a new matter for Jane Smith — landlord/tenant, flat fee $2,500. Add an opening note summarising the consultation, and create an intake task due Friday."

That last one is one clio_open_new_matter call that creates the contact, opens the matter, applies the flat-fee custom rate, attaches the note, and schedules the task.

Drafting (writes a note)

"Add a note to matter 4821: today's call covered scope and engagement letter; client confirmed retainer."

Calendar & tasks

"What do I have on the calendar between April 28 and May 2?" "Show my pending tasks across all open matters, grouped by priority."

Reporting / cleanup

"List all bills in awaiting_payment state older than 60 days, grouped by client." "Find every contact created this year that isn't linked to a matter."

The connector retrieves Clio data live on every request. Nothing is cached or mirrored.


How connecting works

There are two ways to connect, selected by MCP_AUTH_MODE.

OAuth — remote custom connector (headline, Azure default). Each user adds the connector once and signs in to their own Clio account:

  1. In Claude: Settings → Connectors → Add custom connector.

  2. Paste the connector URL: ${PUBLIC_BASE_URL}/mcp (e.g. https://ca-cliomanage-prod.<region>.azurecontainerapps.io/mcp).

  3. Claude runs OAuth discovery, registers itself via Dynamic Client Registration, and starts a PKCE authorization-code flow.

  4. The server shows a consent page where the user picks an access tier — read-only, read + write, or read/write/delete (the last only when the server runs with CLIO_ALLOW_DESTRUCTIVE=true).

  5. The user is redirected to Clio to sign in and authorize.

  6. Clio returns to the server's /oauth/clio/callback, the server bridges the Clio tokens into an MCP session scoped to the chosen tier, and Claude lands back connected — with only the tools that tier covers.

Why tiers live here: Clio Manage's own OAuth has no per-request scopes — an app's access permissions are fixed in Clio's Developer Portal and users must accept all of them. Least-privilege at the connector layer is enforced by this server's own scopes. Also set the narrowest access permissions that work on the Clio Developer Application itself.

No bearer token is pasted anywhere. Each user's Clio tokens are encrypted and isolated to their own session.

Static — shared bearer token (secondary, single-tenant). A simpler mode for solo or single-account setups: one shared bearer token gates /mcp, mapped to a single shared Clio account seeded from a refresh token. See Quick start — Azure (optional static variant) and docs/oauth-setup.md.

Local (stdio). For development and solo use, the binary runs as a local stdio MCP server and authorizes through the loopback OAuth flow — no public URL needed. See Quick start — local.


Architecture

Azure deployment in OAuth mode (primary). The server is an OAuth 2.0 Authorization Server + Protected Resource that bridges each Claude user to their own Clio account:

                    Azure subscription
   ┌──────────────────────────────────────────────────────────┐
   │                                                           │
   │   ┌────────────┐  HTTPS   ┌──────────────┐   ┌─────────┐  │
   │   │  Claude    │─────────►│ Container    │──►│ Clio v4 │  │
   │   │ (each user │  OAuth   │ Apps         │   │  API    │  │
   │   │  signs in) │  + /mcp  │ (stateless)  │   └─────────┘  │
   │   └────────────┘          └──────┬───────┘                │
   │       ▲  per-user Clio sign-in   │                        │
   │       └──────────────────────────┘ (302 via Clio login)   │
   │                  ┌───────────────┼──────────────┐         │
   │                  │               │              │         │
   │             ┌────▼─────┐  ┌──────▼─────┐ ┌──────▼──────┐  │
   │             │ Key Vault│  │ Azure Files│ │ App Insights│  │
   │             │  (RBAC)  │  │  /state    │ │ + Log Anal. │  │
   │             └──────────┘  └────────────┘ └─────────────┘  │
   │                  ▲     (tokens.enc + sessions/ + audit)    │
   │         ┌────────┴─────────┐                               │
   │         │ Managed identity │                               │
   │         │ (KV secrets user │                               │
   │         │  + ACR pull)     │                               │
   │         └──────────────────┘                               │
   └──────────────────────────────────────────────────────────┘

Or as a Mermaid graph (renders inline on GitHub):

flowchart LR
  classDef azure fill:#deebf7,stroke:#08519c,color:#000;
  classDef clio  fill:#fef3c7,stroke:#92400e,color:#000;
  classDef host  fill:#dcfce7,stroke:#166534,color:#000;

  H[Claude<br/>per-user connector]:::host
  subgraph AZ[Azure subscription]
    direction TB
    CA[Container App<br/>OAuth AS + /mcp]:::azure
    KV[Key Vault<br/>RBAC]:::azure
    SF[Azure Files<br/>/state mount]:::azure
    LA[Log Analytics<br/>App Insights]:::azure
    MI[Managed identity]:::azure
    ACR[Azure Container<br/>Registry]:::azure
  end
  CLIO[Clio v4 API<br/>us · ca · eu · au]:::clio

  H -- OAuth discovery + DCR + PKCE --> CA
  H -- user sign-in (302) --> CLIO
  CLIO -- /oauth/clio/callback --> CA
  CA -- REST (per-user token) --> CLIO
  CA --- SF
  CA -. logs/metrics .-> LA
  MI -. pull image .-> ACR
  MI -. read secrets .-> KV
  KV -. inject .-> CA
  ACR -. image .-> CA

Resources provisioned by infra/main.bicep:

Resource

Purpose

Log Analytics + Application Insights

Logs, metrics, traces

Azure Container Registry (Basic)

Private image registry, anonymous pull disabled

User-assigned managed identity

ACR pull + Key Vault Secrets User

Azure Key Vault (RBAC, soft-delete)

Stores the Clio app + encryption secrets

Azure Storage + File Share

Persistent /state mount (tokens.enc, sessions/, audit)

Container Apps environment

Hosts the workload, file share registered

Container App

HTTPS ingress, OAuth default, autoscale 1→4 by default

HTTP surface

Endpoint

Purpose

GET /healthz

Liveness — always 200 ({ status, server, auth_mode, region })

GET /readyz

Readiness — 200 in OAuth mode; in static/hybrid, 503 until the shared account is authenticated

POST /mcp

The MCP endpoint (auth-protected). On 401 it returns WWW-Authenticate with resource_metadata=".../.well-known/oauth-protected-resource/mcp"

GET|DELETE /mcp

405 (the server is stateless POST-only)

In oauth / hybrid mode the server additionally serves the OAuth Authorization Server + Protected Resource surface:

Endpoint

Purpose

GET /.well-known/oauth-authorization-server

Authorization Server metadata (discovery, advertises clio:read clio:write clio:destructive offline_access + S256)

GET /.well-known/oauth-protected-resource/mcp

Protected Resource metadata for /mcp (incl. scopes_supported)

POST /register

Dynamic Client Registration

GET /authorize

Authorization endpoint — renders the scope-consent page

POST /oauth/consent

Consent submission (tier choice) — 302s the user to Clio

POST /token

Token endpoint (PKCE; authorization_code + refresh_token; response carries scope)

POST /revoke

Token revocation

GET /oauth/clio/callback

Clio's redirect target; completes the bridge

Request lifecycle (OAuth mode)

What happens when a connected user invokes a tool — session-token check, Clio token refresh, Clio call, and audit log, end-to-end:

sequenceDiagram
  autonumber
  participant H as Claude<br/>(connected user)
  participant S as Container App<br/>/mcp endpoint
  participant V as OAuth provider<br/>(session verify)
  participant K as Session store<br/>(/state, AES-256-GCM)
  participant C as Clio v4 API
  participant A as Audit log<br/>(/state/audit-*.log)

  H->>+S: POST /mcp · Bearer <MCP session token><br/>{ method: tools/call, name, args }
  S->>V: verify access token
  Note right of V: 401 + WWW-Authenticate<br/>resource_metadata on miss
  V->>K: load session → bridged Clio tokens
  alt Clio token expired (or near expiry)
    K->>+C: POST /oauth/token (refresh_token)
    C-->>-K: new access + refresh
    K->>K: re-encrypt session (AES-256-GCM)
  end
  S->>+C: GET/POST /api/v4/... · Bearer <Clio access>
  C-->>-S: { data, meta }
  S->>A: append { ts, tool, outcome, duration_ms,<br/>user_id, matter_id, result_count, transport, caller_id }
  S-->>-H: JSON-RPC result

Quick start — Azure (remote connector)

Primary path. ~15 minutes the first time. Ends with attorneys adding the connector in Claude and signing in to Clio themselves.

Prerequisites

  • Azure subscription with the Microsoft.App and Microsoft.ContainerRegistry providers registered

  • az, azd, and Docker installed locally

  • A Clio Developer Application (one per deployment). You'll register its redirect URI in step 4, after azd up tells you the public URL.

1. Provision (defaults to OAuth mode)

az login
azd auth login
azd env new clio-manage-prod
azd env set AZURE_LOCATION eastus2
azd env set CLIO_REGION us           # us | ca | eu | au
azd up                                # builds image, runs Bicep, deploys

azd up deploys with MCP_AUTH_MODE=oauth (the infra default) and auto-sets PUBLIC_BASE_URL from the Container Apps environment domain — you never set it by hand.

2. Populate Key Vault (3 secrets)

OAuth mode needs exactly three secrets. (No shared bearer token, no bootstrap refresh token — each user authorizes themselves.)

KV=$(azd env get-values | awk -F= '/AZURE_KEY_VAULT_NAME/{print $2}' | tr -d '"')

az keyvault secret set --vault-name "$KV" --name clio-client-id      --value "<from Clio>"
az keyvault secret set --vault-name "$KV" --name clio-client-secret  --value "<from Clio>"
az keyvault secret set --vault-name "$KV" --name clio-encryption-key --value "$(openssl rand -hex 32)"

3. Roll a fresh revision so the secrets bind

The first azd up starts a revision before the secrets exist, so it stays unhealthy until now. Create a new revision — it re-resolves the Key Vault refs:

APP=$(azd env get-values | awk -F= '/SERVICE_API_NAME/{print $2}' | tr -d '"')
RG=$(azd env get-values | awk -F= '/AZURE_RESOURCE_GROUP/{print $2}' | tr -d '"')
az containerapp update -n "$APP" -g "$RG" --revision-suffix "s$(date +%s)"

4. Register the redirect URI in Clio, then verify

Grab the public URL and register the connector callback on your Clio Developer Application (Settings → Developer Applications):

BASE=$(azd env get-values | awk -F= '/SERVICE_API_URI/{print $2}' | tr -d '"')
echo "Register this Redirect URI in Clio: ${BASE}/oauth/clio/callback"

curl -sS "${BASE}/healthz"
# {"status":"ok","server":"clio-manage-mcp","auth_mode":"oauth","region":"us"}

5. Add the connector in Claude → sign in to Clio

Share the connector URL with each attorney (it's the same for everyone):

${PUBLIC_BASE_URL}/mcp      # e.g. https://<your-app>.<region>.azurecontainerapps.io/mcp

In Claude: Settings → Connectors → Add custom connector → paste the URL. Claude runs OAuth discovery + dynamic client registration, redirects the user to Clio to sign in and authorize, and returns connected. Each user connects their own Clio account.

Full walk-through (custom domain, logs, audit export, rotation, troubleshooting, and the optional shared-account variant): docs/deployment-azure.md.

Optional: shared-account (static) variant

For a single-tenant deployment where one shared Clio login is acceptable, deploy in static mode instead and seed a shared bearer token + refresh token:

azd env set MCP_AUTH_MODE static
azd up
# then also set the two static-mode secrets in Key Vault and restart:
#   clio-http-auth-tokens   (a bearer token your clients present on /mcp)
#   clio-refresh-token      (from examples/bootstrap-refresh-token.mjs)

Details: docs/deployment-azure.md and docs/oauth-setup.md.


Quick start — Docker (any host)

Prefer not to use Azure? A prebuilt image is published to GitHub Container Registry on every push to main. Run it on any host that can terminate TLS in front of it (a VM behind nginx/Caddy/Cloudflare Tunnel, Fly, Render, etc.):

docker run -d --name clio-manage-mcp -p 8765:8765 \
  -e MCP_AUTH_MODE=oauth \
  -e PUBLIC_BASE_URL=https://mcp.yourfirm.com \
  -e CLIO_CLIENT_ID=... \
  -e CLIO_CLIENT_SECRET=... \
  -e CLIO_ENCRYPTION_KEY="$(openssl rand -hex 32)" \
  -e CLIO_REGION=us \
  -v clio-state:/state \
  ghcr.io/patrickking67/clio-manage-mcp:latest

PUBLIC_BASE_URL must be the public HTTPS URL Claude and Clio actually reach (the OAuth issuer + redirect must be absolute https). Point your TLS proxy at port 8765, add https://mcp.yourfirm.com/mcp as the connector in Claude, and register https://mcp.yourfirm.com/oauth/clio/callback on the Clio app.

For local development without a public URL, use stdio (below) or docker compose up --build (see docker-compose.yml).

The GHCR image is published by CI. If docker run reports denied, the package is still private — make it public under the repo's Packages settings, or run docker login ghcr.io first.


Quick start — local (stdio)

Development, single-user, or seeding a shared-account refresh token for static mode.

git clone https://github.com/patrickking67/clio-manage-mcp.git
cd clio-manage-mcp
npm install
npm run build
cp .env.example .env
# fill: CLIO_CLIENT_ID, CLIO_CLIENT_SECRET, CLIO_ENCRYPTION_KEY (openssl rand -hex 32)

Register http://127.0.0.1:5678/callback as a Redirect URI on your Clio Developer Application (Clio allows several, so the same app can serve both local stdio and the remote connector). Then wire the server into Claude Desktop / Claude Code with one of the examples/, and run authenticate with Clio in a conversation. The encrypted token blob lives at ~/.clio-manage-mcp/tokens.enc and auto-refreshes ahead of expiry. Full guide: docs/deployment-local.md.

You can also run the HTTP transport locally in hybrid mode for connector development by setting PUBLIC_BASE_URL=http://localhost:8765 — see docs/deployment-local.md.


Tool catalog

Domain

Tools

Auth

clio_authenticate · clio_auth_status · clio_logout · clio_who_am_i

Matters

clio_list_matters · clio_get_matter · clio_create_matter · clio_update_matter · clio_delete_matter · clio_list_matter_contacts

Contacts

clio_search_contacts · clio_get_contact · clio_create_person_contact · clio_create_company_contact · clio_update_contact · clio_delete_contact

Activities

clio_list_activities · clio_get_activity · clio_create_time_entry · clio_create_expense_entry

Tasks

clio_list_tasks · clio_get_task · clio_create_task · clio_update_task

Notes

clio_list_notes · clio_create_note

Calendar

clio_list_calendar_entries · clio_create_calendar_entry · clio_list_calendars

Documents

clio_list_documents · clio_get_document · clio_get_document_download_url · clio_list_folders

Bills

clio_list_bills · clio_get_bill · clio_get_billing_summary

Users

clio_list_users · clio_get_user

Practice areas

clio_list_practice_areas

Workflows

clio_open_new_matter (client + matter + flat-fee + note + task in one call)

Escape hatch

clio_api_request (raw v4 endpoint with { data: ... } wrapping)

In OAuth mode the auth tools (clio_authenticate, clio_logout) are not used — sign-in happens through Claude's connector flow, not from inside a conversation. clio_auth_status / clio_who_am_i still report the current session.

Destructive operations (clio_delete_*, DELETE via clio_api_request) are disabled unless CLIO_ALLOW_DESTRUCTIVE=true.

By scope tier: 27 read, 12 write, 2 destructive.

How much of the Clio API this covers

Measured against Clio's published OpenAPI document (docs.developers.clio.com/openapi.json, openapi: 3.0.0, info.version: v4), which describes 301 operations across 166 paths in 89 resource groups.

This server wraps 15 of those groups as first-class tools — roughly 59 operations, chosen as the ones a lawyer touches daily:

Covered group

Ops

Group

Ops

Matters

5

Documents

7

Contacts

5

Folders

6

Activities

5

Tasks

5

Bills

5

Notes

5

Calendars

5

Calendar Entries

5

Practice Areas

5

Users

3

Clients

1

Matter Contacts

1

Related Contacts

1

The other 74 groups have no dedicated tool and are reached through clio_api_request, which is bounded by the same scope tiers (GET needs clio:read, POST/PATCH/PUT need clio:write, DELETE needs clio:destructive and CLIO_ALLOW_DESTRUCTIVE=true). The larger ones, if you need them:

Custom Fields · Custom Field Sets · Custom Actions · Communications · Conversations · Relationships · Reminders · Timers · Webhooks · Reports · Report Presets/Schedules · Bank Accounts · Bank Transactions · Trust Line Items · Trust Requests · Clio Payments (Links, Payments) · Credit Memos · Interest Charges · Line Items · Matter Stages · Matter Dockets · Task Templates · Task Types · Text Snippets · Document Templates/Versions/Categories · Expense Categories · Activity Rates · Groups · Damages · Medical Records/Bills · Grants · Utbms Codes/Sets · Jurisdictions

That split is a deliberate 80/20, not an oversight: modelling all 301 operations as tools would blow past any client's tool budget and bury the ones that matter. If you find yourself reaching for clio_api_request repeatedly for the same endpoint, that's the signal it deserves promotion to a real tool — open an issue.


Resources

The server publishes two MCP resources that clients may auto-include at session start:

URI

What it carries

clio://compliance/notice

ABA Opinion 512 reminder + audit-logging summary

clio://auth/status

Live JSON view of authentication state and configuration


Configuration

Variables and which mode they apply to. In an Azure deployment the OAuth-mode variables (MCP_AUTH_MODE, PUBLIC_BASE_URL, transport, ports, state dir) are set by the Bicep template; you only manage the Key Vault secrets.

Variable

Applies to

Required

Default

Purpose

CLIO_CLIENT_ID

all

yes

From your Clio Developer Application

CLIO_CLIENT_SECRET

all

yes

From your Clio Developer Application

CLIO_ENCRYPTION_KEY

all

yes

64-hex (32 bytes). openssl rand -hex 32

CLIO_REGION

all

no

us

us / ca / eu / au

MCP_AUTH_MODE

http

no

hybrid

oauth / static / hybrid. Azure infra default is oauth

PUBLIC_BASE_URL

http (oauth/hybrid)

yes in oauth/hybrid

Public HTTPS base URL of this server. Auto-set by Azure Bicep

MCP_SESSION_TTL_SECONDS

http (oauth/hybrid)

no

2592000

Lifetime of an issued MCP session (30 days). Clio tokens auto-refresh

CLIO_OAUTH_SCOPES

http (oauth/hybrid)

no

(unset)

No-op — leave unset. Clio's authorize endpoint has no scope param

CLIO_HTTP_AUTH_TOKENS

http (static/hybrid)

static: yes

Comma-separated shared bearer tokens accepted on /mcp

CLIO_BOOTSTRAP_REFRESH_TOKEN

http (static/hybrid)

no

Seeds the single shared Clio account on first boot

CLIO_TRANSPORT

all

no

stdio

stdio or http. CLI flags --stdio / --http override

CLIO_HTTP_PORT

http

no

8765

HTTP transport port

CLIO_HTTP_HOST

http

no

0.0.0.0

HTTP transport bind

CLIO_REDIRECT_PORT

stdio

no

5678

Loopback port for the local OAuth callback

CLIO_REDIRECT_HOST

stdio

no

127.0.0.1

Loopback host for the local OAuth callback

CLIO_STATE_DIR

all

no

~/.clio-manage-mcp/

Holds tokens.enc, sessions/, audit log. On Azure: the Files mount

CLIO_API_VERSION

all

no

(account default)

Pins the Clio API version via the X-API-VERSION header

CLIO_AUDIT_MODE

all

no

metadata

none / metadata / full

CLIO_ALLOW_DESTRUCTIVE

all

no

false

Enables DELETE endpoints

CLIO_DEFAULT_PAGE_SIZE

all

no

25

Records per Clio API page

CLIO_MAX_PAGE_SIZE

all

no

200

Hard cap on total records returned by a list tool

CLIO_MAX_RESULT_CHARS

all

no

140000

Truncates an oversized tool result below the client's hard limit

CLIO_DEFAULT_USER_ID

all

no

Default attorney/user id for matter creation

LOG_LEVEL

all

no

info

error / warn / info / debug

† The server's own default is hybrid; the Azure Bicep deploys oauth. The state dir falls back to the legacy ~/.clio-mcp/ when it exists and the new default does not, so pre-rename installs keep their tokens.

In oauth mode the required secrets are just CLIO_CLIENT_ID, CLIO_CLIENT_SECRET, and CLIO_ENCRYPTION_KEY. CLIO_HTTP_AUTH_TOKENS and CLIO_BOOTSTRAP_REFRESH_TOKEN are only consulted in static/hybrid mode.

Versions and compatibility

Verified 2026-07-27. Everything here is a moving target — re-check before assuming.

Thing

Where we are

Notes

Clio Manage API

v4, account default

Current default is 4.0.13 (promoted 2026-01-06). A Multi-Tax release followed 2026-04-08. Pin with CLIO_API_VERSION=4.0.13 to insulate against changes Clio ships to the default.

Clio access token

30 days

Refreshed automatically ~60 s before expiry.

Clio refresh token

Does not expire

A long-lived credential. Always encrypted at rest.

Clio rate limit

50 req/min/token at peak

Higher off-peak, varies by region. The client honours Retry-After and retries 429s on any method; 5xx and network errors are retried on GET only.

@modelcontextprotocol/sdk

1.29.0 (current stable)

v2 is in beta for the 2026-07-28 spec and splits into @modelcontextprotocol/client + /server. v1.x keeps receiving fixes for ≥6 months after v2 ships. Staying on v1 for this release.

MCP auth spec

2025-06-18 via the SDK

Claude accepts 2025-03-26, 2025-06-18, and 2025-11-25.

Node

≥20 (built and shipped on 22)

Client limits worth designing around. Claude.ai and Claude Desktop reject tool results past ~150,000 characters; Claude Code truncates at 25,000 tokens (MAX_MCP_OUTPUT_TOKENS). Claude.ai's request timeout is 300 s. Results are serialised compactly and capped at CLIO_MAX_RESULT_CHARS (default 140,000) with an explicit truncation note, so an oversized list degrades into actionable feedback instead of a silently dropped response — but the better fix is always a narrower limit or fields.


Security & compliance posture

At a glance

Layer

What this server does

What you should still do

OAuth (per-user)

OAuth 2.1 + PKCE bridge; each user signs in on Clio's own domain

Use a single Clio Developer Application per deployment

Token storage

AES-256-GCM at rest, per session; key in Key Vault (Azure) or env

Rotate clio-encryption-key on offboarding

/mcp auth

OAuth session token (oauth) or shared bearer (static), constant-time

In static mode, rotate clio-http-auth-tokens per caller / departure

Audit

Append-only JSONL of every tool call (metadata or redacted args)

Export + retain per firm policy; the server does not rotate

Destructive operations

Off by default (CLIO_ALLOW_DESTRUCTIVE=false)

Keep off unless you have a specific reason

Telemetry

None. Only outbound call is to your configured Clio region's API

Pair with Claude Enterprise / API+ZDR for conversation-side controls

Detail

  • Per-user OAuth 2.1. In OAuth mode the server is an OAuth Authorization Server + Protected Resource. Claude discovers it, registers via Dynamic Client Registration, and runs PKCE. The user logs in directly on Clio's domain; the server never sees a Clio password. Each user's Clio tokens are bridged into an isolated, encrypted MCP session.

  • The encryption key never leaves the host. Tampered ciphertext fails decryption — AES-256-GCM is authenticated encryption, so partial / tampered token blobs cannot be silently used.

  • The audit log captures: ISO timestamp, tool name, outcome, duration in ms, Clio user id, matter id (when applicable), result count, transport identifier, and a per-caller fingerprint. In full mode it also records argument payloads with redaction of known-secret keys.

  • The HTTP transport is stateless POST-only on /mcp. GET and DELETE return 405. An unauthenticated /mcp request returns 401 with an RFC 9728 WWW-Authenticate challenge pointing at the protected-resource metadata. The static-token check uses constant-time comparison to avoid timing side channels.

  • Multi-replica safe. Sessions, registered clients, and pending authorizations live as encrypted records on the shared /state mount, so any replica can serve any request given the same encryption key.

Threat model + Azure-specific notes: docs/security.md.


Cost (Azure)

For a typical firm at moderate volume (single-digit-thousands of tool calls/day) running one warm replica:

Verified against Azure retail pricing (East US, pay-as-you-go, 2026-07):

Component

Idle $/mo

Light use $/mo

Container App (0.5 vCPU, 1 GiB, minReplicas=1, idle rate)

~$10.20

~$10.50–12

Container Apps environment

$0

$0

Azure Container Registry (Basic, flat daily rate)

~$5.07

~$5.07

Key Vault (standard, per-op)

<$0.05

<$0.05

Azure Files (billed on used GiB, not the 10 GiB quota)

~$0.10

~$0.30

Log Analytics (first 5 GB/mo free; 30-day retention free)

$0

$0–1

Application Insights

included with workspace

included

Total

~$15–16/mo

~$16–18/mo

Setting minReplicas=0 (scale-to-zero) drops the total to ~$5–6/mo — ACR Basic becomes the floor — at the cost of a several-second cold start on the first request after idle. For a per-user OAuth connector that attorneys hit throughout the day, one warm replica is the usual choice; for evaluation deployments, scale-to-zero is the obvious setting (azd env set MIN_REPLICAS 0).


FAQ

How do attorneys connect? In OAuth mode (the Azure default), each attorney goes to Settings → Connectors → Add custom connector in Claude, pastes ${PUBLIC_BASE_URL}/mcp, and signs in to their own Clio account when redirected. No token to copy. See How connecting works.

Does everyone share one Clio login? Not in OAuth mode — each user authorizes their own Clio account and only sees their own data. The shared-login model exists only in static mode, for single-tenant setups that opt into it.

Is this safe for client matter data? It's built for it. Clio tokens are encrypted at rest per session, every tool call is audited, no data is cached or mirrored, and no outbound calls happen besides Clio. But this server only secures the Clio-to-AI boundary — pair it with Claude Enterprise or the Claude API with Zero Data Retention so the conversations themselves get the right handling.

Does Claude train on what we send through this? It depends entirely on the Claude tier you pair this with. Claude Pro/Max (consumer): Anthropic does not train on chats by default. Claude Team / Enterprise: explicit no-training contract. Claude API with ZDR: no training, no retention. This server doesn't change any of that; the tier choice you make matters far more than anything in this codebase.

We're on Clio EU / CA / AU. Does it work? Yes. Set CLIO_REGION to eu, ca, or au and the server routes OAuth + API + tokens against the matching regional host. Tokens minted in one region will not authenticate in another, by design.

How do we revoke a user's access? OAuth mode: revoke the connector from the user's side in Claude, or call /revoke; the firm can also revoke the Developer Application in Clio (Settings → Developer Applications), which invalidates everyone. Static mode: remove the bearer token from clio-http-auth-tokens and restart, or delete the clio-refresh-token secret.

Do we have to use Azure? No. Local stdio works completely standalone. Azure Container Apps is the primary production path because it's the cleanest match for a stateless OAuth MCP gateway (HTTPS ingress, managed identity, shared file mount, autoscale), but the Docker image runs on EKS, ECS, Fly, Render, or any other container host — set MCP_AUTH_MODE, PUBLIC_BASE_URL, and the secrets yourself, and mount a shared volume at CLIO_STATE_DIR.

Can we use this with hosts besides Claude? The OAuth connector targets Claude's custom-connector flow. The underlying transport is standard MCP (stdio + Streamable HTTP), verified against Claude Desktop, Claude Code, and the MCP Inspector, and expected to work with any client implementing those transports.

What's the trust story for installing this? This isn't on npm. Clone, audit, build from source. No telemetry. The only outbound calls go to your configured Clio region's API.


Verification

Three protocol-level smoke tests plus a unit-test suite drive a real MCP session against the built binary. They assert on tool count, resource publication, auth enforcement, the OAuth discovery/registration handshake, and error shape. All run on every commit (build.yml).

npm run build
npm run smoke:stdio    # raw JSON-RPC over spawned --stdio child
npm run smoke:http     # SDK Client over Streamable HTTP against spawned --http child (static mode)
npm run smoke:oauth    # OAuth discovery: metadata, dynamic client registration, /authorize -> Clio, 401 + WWW-Authenticate
npm test               # unit tests: encrypted session store + Clio OAuth provider

A passing stdio run:

✓ initialize -> clio-manage-mcp 2.2.0
✓ tools/list -> 41 tools
✓ tool catalog includes expected names
✓ resources/list -> 2 resources
✓ resources/read clio://auth/status -> authenticated:false
✓ tools/call clio_who_am_i (no auth) -> isError:true
ALL CHECKS PASSED ✓

A passing HTTP run (the script pins MCP_AUTH_MODE=static so it needs no public URL):

✓ /healthz ready
✓ /mcp without bearer -> 401
✓ /mcp with wrong bearer -> 401
✓ Client.connect (initialize round-trip) succeeded
✓ tools/list -> 41 tools
✓ resources/read clio://auth/status -> authenticated:false
✓ GET /mcp -> 405 (server is stateless POST-only)
ALL HTTP CHECKS PASSED ✓

Confirmed Clio API quirks

Empirical findings from Clio v4 that surprised someone. Baked into the client + tool descriptions so they don't surprise you, and listed here so the next person doesn't have to re-derive:

  • billing_method at the matter root is silently ignored. To set a flat fee, PATCH the matter with custom_rate: { type: "FlatRate", rates: [...] }. clio_create_matter's flat_rate_amount parameter does this for you.

  • TimeEntry.total = quantity_in_hours × rate (NOT × price). For flat-fee line items use clio_create_expense_entry (total = quantity × price).

  • Activities GET requires explicit fields — a bare GET returns only id

    • etag. description is write-only; on GET use note. rate is not a valid GET field.

  • Activities list filter is matter_id (singular int). matter and matter[id] are silently ignored — you'll get account-wide results back with no error.

  • Enum casing is inconsistent across Clio, and it is case-sensitive. Matter status and task status are lowercase (open, complete) everywhere. Task priority is lowercase in the list filter (high) but capitalized in the create/update body (High). There is no way to guess this — check the spec.

  • Several field names are not what they look like. Bills use state (not status), last_sent_at (not sent_at), and matters plural (a bill can span several). Notes use author and created_at/updated_at (not user, date_created, date_updated). Calendar entries use calendars plural and calendar_entry_event_type. Documents use document_category and have no description field at all.

  • Activities have no billed/non_billable query parameters. A single status filter covers both axes (billed, unbilled, draft, billable, non_billable, written_off). Confusingly, non_billable is valid in the create body — filter and body vocabularies differ.

  • Task date filters are due_at_from / due_at_to, not due_date_start / due_date_end.

  • Sub-resources are nested, not top-level. Email addresses and phone numbers live at /contacts/{id}/email_addresses.json; UTBMS is /utbms/codes.json and /utbms/sets.json; court rules are under /court_rules/; Clio Payments under /clio_payments/; and the timer endpoint is /timer.json, singular.

Every one of the above was verified against Clio's published OpenAPI document (docs.developers.clio.com/openapi.json), and several were live bugs in this repo before that check was run. If you are building against Clio, do the same — the docs pages do not surface enum casing.

  • Mutating payloads must be wrapped { data: ... }. The dedicated tools do this for you. clio_api_request wraps when you pass data:; pass body: to send something verbatim.

  • Address name is enum-validated — exactly Work, Home, Billing, or Other. The tools coerce invalid names to Work.

  • DELETE on bills is soft-delete (void). The bill moves to void state rather than disappearing.

  • Region cross-talk fails. A token minted at app.clio.com will not authenticate against eu.app.clio.com. Pick one and stick with it. The same applies to the OAuth bridge: the redirect and token exchange must both target the configured region.

  • /oauth/authorize has no scope parameter. The full accepted set is client_id, response_type, redirect_uri, state, redirect_on_decline. App permissions are fixed per-application in the Developer Portal and every user accepts all of them, which is exactly why this server implements its own scope tiers. CLIO_OAUTH_SCOPES therefore does nothing — leave it unset.

  • redirect_on_decline defaults to false, which strands users. Without it, a user who clicks Decline stops on a Clio page and the calling application never finds out. This server always sends true. (Clio's docs promise the redirect but do not specify which error parameters come back on it — the server handles both the named-error and bare-redirect cases.)

  • Refresh tokens never expire; access tokens last 30 days. Convenient, but it means a leaked refresh token is valid until someone revokes the app in Clio. Treat it as the crown jewel — it is why every stored copy is encrypted.

  • Rate-limit headers are on every response. X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset (50/min/token at peak, higher off-peak, varies by region). The client currently reacts to a 429 with Retry-After rather than pre-emptively backing off — see the roadmap.


The Clio Manage plugin

The MCP server gives Claude capability — 41 tools against the Clio v4 API. The plugin in plugin/ gives it judgment: which tool to reach for, how to chain them into real workflows, when to stop and ask a human, and what ABA Op 512 requires along the way.

claude /plugin marketplace add patrickking67/clio-manage-mcp
claude /plugin install clio-manage@clio

Then /clio:doctor to verify the connection.

8 commands — complete workflows, not single tool calls:

/clio:doctor

/clio:daily

/clio:intake

/clio:log-time

/clio:conflicts

/clio:wip

/clio:ar

/clio:trust-recon

10 skills that activate on their own — setup, search, best practices, matter intake, time entry, billing, contacts, calendar, document automation, trust accounting.

3 agentsclio-intake-agent (autonomous intake, gated writes), clio-data-analyst (read-only reporting), clio-conflicts-checker (exhaustive conflict search with name-variant expansion, read-only).

3 hooks that make the safety posture real rather than advisory:

Event

Behavior

SessionStart

Reports region, sign-in state, key validity, and whether deletes are enabled — so "why isn't Clio working" is answered before it's asked

PreToolUse on clio_delete_*

Asks you to confirm the specific record id. Client files are firm records with retention obligations

PostToolUse on writes

Local client-writes.jsonl trail. Metadata only — never argument values, because that file isn't encrypted

Full plugin docs: plugin/README.md.


Works with

One server, one set of guidance, every major agent surface.

Surface

How it connects

What it gets

Claude.ai / Desktop

Remote OAuth connector, or the .mcpb bundle

41 tools, 2 resources, per-user Clio sign-in

Claude Code

Plugin + MCP, or .mcp.json

Everything above, plus commands, skills, agents, hooks

Claude Cowork

Portable skills in .agents/skills/

The 10 Clio workflow skills

OpenAI Codex

Reads AGENTS.md + .agents/skills/ natively

Repo instructions and the same workflow skills

Cursor

Reads AGENTS.md directly, plus .cursor/rules/

Repo instructions and glob-scoped source guardrails

GitHub Copilot

.github/copilot-instructions.md

Repo instructions and the non-negotiables

Microsoft Foundry / Copilot Studio

Remote MCP endpoint

See docs/foundry.md

Any MCP client

Streamable HTTP or stdio

The full tool surface

The guidance has one canonical sourceAGENTS.md. Vendor files are thin adapters that point at it, and the Clio skills are authored once in plugin/skills/ and mirrored to .agents/skills/ by npm run sync:ai. npm run check:ai fails CI if any of it drifts: a missing adapter, a version mismatch across the six artifacts that carry it, a stale skills mirror, a tracked user-local file, or a documented command that no longer exists.


Optional connectors

The remote Clio connector is the one your firm consumes from Claude. Other connectors are recommended for specific skills but never required:

Tier

Connector

What it adds

Recommended

Microsoft 365

Outlook, Calendar, SharePoint, Word, Teams

Recommended

Google Workspace

Gmail, Calendar, Drive, Docs

Useful

DocuSign

eSignature for engagement letters

Useful

Stripe

Payments + Clio Payments reconciliation

Useful

Slack / Teams

Internal firm comms

Ops

Sentry / App Insights

Monitor the MCP server in production

Setup steps for each: docs/connectors.md.


Landing page

A static GitHub Pages site lives at docs/ and deploys via .github/workflows/pages.yml. Enable Settings → Pages → Source: GitHub Actions on the repo and the next push to main publishes it. Public URL:

https://patrickking67.github.io/clio-manage-mcp/

The site is built with Tailwind CSS via CDN (no build step) and renders hero, feature, tool-catalog, install, plugin, connectors, security, and FAQ sections from a single docs/index.html.


Development

npm install
npm run dev:stdio        # tsx watch, stdio mode
npm run dev:http         # tsx watch, http mode
npm run lint             # tsc --noEmit
npm run build            # tsc + chmod +x
npm run smoke:stdio      # protocol smoke test (stdio)
npm run smoke:http       # protocol smoke test (http, static mode)
npm run smoke:oauth      # protocol smoke test (http, OAuth discovery)
npm test                 # unit tests (session store, OAuth provider, scopes, client, result cap)
npm run pack:mcpb        # build the production-only .mcpb bundle
npm run smoke:mcpb       # unpack that bundle and run it standalone
npm run inspector        # MCP Inspector against the built binary

The MCP Inspector is the fastest way to iterate on tool schemas against a real Clio account. Source map and declaration files ship with the build so debuggers and IDEs work out of the box.

Building the MCPB bundle

npm run pack:mcpb is the only supported way to produce clio-manage-mcp.mcpb. It never packs the working tree — it stages exactly the runtime inputs (build/, manifest.json, package.json, lockfile, README, LICENSE, icon), runs npm ci --omit=dev in that staging tree, and packs the result. Packing the repo in place would sweep in typescript, tsx, esbuild, and @types/*, which is how the bundle previously reached 17.8 MB. It is now 4.2 MB.

The install is deliberately hermetic: npm_config_* variables exported by the parent npm run are stripped and an empty user config is passed, so the bundle depends on nothing but package-lock.json. (Without this, a developer whose ~/.npmrc sets allow-scripts cannot pack at all — npm 12 rejects that key during a project-scoped install.)

npm run smoke:mcpb is the check that matters. smoke:stdio runs the repo's own build/ against the repo's full node_modules, so it cannot notice a runtime dependency that --omit=dev pruned. smoke:mcpb unpacks the archive to a temp directory and then launches it the way Claude Desktop does — reading manifest.server.mcp_config, substituting ${__dirname} and ${user_config.*}, and spawning from an unrelated working directory so the bundle has to stand on its own absolute paths and bundled node_modules. It asserts none of the declared devDependencies are present, that the manifest's entry point resolves to a real file, and that the user_config → env mapping actually delivers CLIO_CLIENT_ID / CLIO_CLIENT_SECRET / CLIO_ENCRYPTION_KEY — a broken mapping means a fresh install cannot boot, and testing an invented command would never reveal it. Then it drives real JSON-RPC. Both run in CI on every push, and the bundle is uploaded as a build artifact.

Project layout:

src/
├── index.ts              entry point — picks transport from --stdio/--http
├── config.ts             env loading + region routing + auth-mode resolution
├── server.ts             McpServer factory
├── audit.ts              JSONL audit log with secret redaction
├── resources.ts          clio:// MCP resources
├── auth/                 Clio OAuth flow, OAuth AS provider, encrypted session store
├── clio/                 HTTP client (auth refresh, retry, pagination)
├── transports/           stdio + Streamable HTTP (OAuth/static/hybrid)
├── tools/                tool modules, 41 tools
└── util/                 stderr logger, error types
infra/main.bicep          Container Apps + ACR + Key Vault + Files (OAuth default)
Dockerfile                multi-stage build, distroless-style runtime
scripts/smoke-*.mjs       end-to-end MCP protocol tests (stdio, http, oauth, mcpb)
scripts/pack-mcpb.mjs     reproducible production-only MCPB build
docs/                     deployment-local, deployment-azure, oauth, security, connectors
examples/                 client configs + bootstrap-refresh-token.mjs

Two prior open-source Clio MCP implementations informed this one, and both are worth reading if you're evaluating options:

  • oktopeak/clio-mcp — TypeScript, local-stdio focused, ~15 read-mostly tools. Strong on the law-firm-IT install ergonomics; ships an npm package with a clean 6-step setup.

  • lawyered0/clio-mcp — Python / FastMCP, with a deeply documented set of Clio API quirks (flat-fee custom_rate setup, activity field aliases, region routing). Most of the quirks section in this README originates from that prior empirical work.

This implementation contributes: a per-user remote OAuth 2.1 connector for Claude (Authorization Server + Protected Resource bridging to Clio), Azure-native deployment with Bicep + azd, broader tool surface (41 vs. ~15), stateless Streamable HTTP transport with encrypted per-session token storage, end-to-end protocol smoke tests in CI, and a composite intake workflow that chains the most common matter-opening sequence into one agent action.


Roadmap

Shipped in 2.3.0: redirect_on_decline so a declined Clio sign-in returns cleanly instead of stranding the user, a result-size cap below Claude's ~150k-character limit, per-replica audit files (SMB appends are not atomic), a .. guard on the raw-API escape hatch, and a reproducible production-only MCPB build (npm run pack:mcpb) that is verified by unpacking and running it (npm run smoke:mcpb) — 17.8 MB → 4.2 MB.

Shipped in 2.2.0: interactive scope tiers with a consent page, MCPB packaging for Claude Desktop, ETag/If-Match on update tools, X-API-VERSION pinning, truncation-aware list results, GET-only retry (no write duplication), and a Microsoft Foundry / Copilot Studio guide (docs/foundry.md).

Next:

  • Honour Clio's X-RateLimit-Remaining / X-RateLimit-Reset headers to back off before a 429 rather than reacting to one.

  • Sweep stale DCR client registrations — sweep() covers pending records and sessions, but client registrations have no expiry and accumulate.

  • Index sessions by refresh-token hash; today a refresh grant scans and decrypts every session file, which is a network round trip each over Azure Files.

  • Migrate to MCP SDK v2 once it ships stable (2026-07-28 spec).

  • Typed trust accounting tools (/bank_accounts, /bank_transactions, /trust_line_items) — today the highest-stakes domain runs through the raw escape hatch.

  • Communications (/communications.json), custom fields write support, and webhook subscriptions for live matter / task / bill events.

  • OS-keychain integration for the encryption key (macOS Keychain, Linux secret-service, Windows Credential Manager) so the key isn't on disk.

  • Private Endpoint + Front Door / API Management options in Bicep (see docs/foundry.md for the APIM AI Gateway pattern).

  • CIMD (Client ID Metadata Documents) alongside DCR once client support stabilizes, to avoid client-registration buildup on busy deployments.


License

MIT — see LICENSE.

Available Tools

41 tools
clio_api_requestRaw Clio API request (escape hatch)A
Destructive

Issue an arbitrary request against the Clio v4 API. Prefer the dedicated tools — this exists for endpoints not yet wrapped (custom_fields, trust_requests, webhooks, etc.). The path is relative to the API root (/matters.json, /users/who_am_i.json). For POST/PATCH bodies, pass data and we will wrap it in { data: ... }; pass body for already-wrapped JSON.

ParametersJSON Schema
NameRequiredDescriptionDefault
methodNoGET
pathYesPath relative to /api/v4 — e.g. "/matters.json" or "users/who_am_i.json".
queryNoQuery string parameters.
fieldsNoShorthand for query.fields.
dataNoBody content — will be sent as `{ data: <your-value> }` (Clio's required envelope).
bodyNoRaw JSON body (sent verbatim). Use this only if you have already wrapped it yourself.

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already indicate destructiveHint=true, so the agent knows mutations are possible. The description adds useful behavioral context about how POST/PATCH bodies are handled (data vs body wrapping). It does not disclose other behaviors like rate limits or error handling, but given the annotations, the description provides reasonable transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, consisting of two sentences with no wasted words. It is front-loaded with the main action and includes essential usage details efficiently.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity as an escape hatch with no output schema, the description provides adequate context: path format, body handling, and usage examples. It could mention response format or authentication but is sufficient for an advanced agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is high (83%), but the description adds critical meaning: it explains that 'data' will be wrapped in { data: ... } while 'body' is sent verbatim, and that path is relative to the API root with examples. This goes beyond the schema's descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool issues arbitrary requests against the Clio v4 API, specifying it's for endpoints not yet wrapped. It distinguishes from dedicated sibling tools by explicitly advising to prefer them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says 'Prefer the dedicated tools — this exists for endpoints not yet wrapped' and lists examples of unwrapped endpoints (custom_fields, trust_requests, webhooks, etc.), providing strong guidance on when to use this tool versus alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clio_authenticateAuthenticate with ClioA

Starts the OAuth 2.0 authorization-code flow with Clio in the user's default browser, then persists the resulting access + refresh tokens (encrypted with AES-256-GCM) to disk. LOCAL STDIO TRANSPORT ONLY. On a remote/HTTP deployment (the Clio custom connector), each end user authenticates through the connector's own OAuth sign-in — Claude drives that flow when you add the connector — so this tool is unavailable there and is not needed.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses the OAuth flow and encrypted token persistence, adding value beyond annotations. However, it could mention if multiple authentications overwrite existing tokens.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with purpose and key constraint. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Adequately covers purpose, constraints, and token handling. Lacks mention of post-auth behavior, but no output schema makes this acceptable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

No parameters exist; baseline 4 per instructions. Description does not need to add parameter info since there are none.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool starts an OAuth 2.0 authorization-code flow and persists tokens, differentiating it from siblings by specifying transport constraints.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says LOCAL STDIO TRANSPORT ONLY and explains unavailability on remote deployments, providing clear when-to-use and when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clio_auth_statusAuth statusA
Read-only

Reports whether valid Clio credentials are currently available, the Clio user id they were issued to, and when the access token expires. On the remote connector this reflects YOUR own per-user session (established via the connector's OAuth sign-in); on local stdio and static/shared HTTP mode it reflects the single shared account.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation signals no mutation; the description adds the session-type context, which is useful beyond annotations. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no wasted words. Front-loaded with purpose, followed by mode-specific nuance. Efficient and clear.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description fully covers what the tool does, what it returns, and mode-dependent behavior. No output schema exists, but the description is sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Zero parameters, so schema coverage is 100%. The description doesn't need to explain parameters; baseline 4 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool reports credential availability, user ID, and token expiry. It distinguishes itself from siblings like clio_authenticate (which initiates auth) and clio_who_am_i (which lacks token details).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains when to use the tool (check auth status) and clarifies behavioral differences between remote connector (per-user session) and local/static mode (shared account). No explicit exclusions, but context is sufficient.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clio_create_calendar_entryCreate calendar entryA

Creates a calendar entry. All-day events should set all_day=true and use date-only timestamps.

ParametersJSON Schema
NameRequiredDescriptionDefault
summaryYesTitle shown in calendar.
start_atYesISO 8601 timestamp.
end_atYesISO 8601 timestamp.
descriptionNo
locationNo
all_dayNo
calendar_idNo
matter_idNo
event_type_idNo

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds value beyond the annotations by specifying the all-day event behavior (all_day=true, date-only timestamps). Annotations already indicate it's a write (readOnlyHint=false) and non-idempotent, and the description confirms that. This additional context aids correct usage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, consisting of two sentences with no extraneous information. It front-loads the core purpose and then adds a critical usage tip, making it efficient and easily scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 9 parameters, no output schema, and minimal annotations, the description is insufficient. It lacks information on return values, error handling, parameter dependencies (e.g., calendar_id defaulting), and other behavioral nuances needed for an AI agent to invoke it confidently.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With only 33% schema description coverage, the description provides essential guidance for the all_day parameter and related timestamp format for start_at/end_at. However, it fails to explain the remaining six parameters (description, location, calendar_id, matter_id, event_type_id), leaving significant gaps.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Creates a calendar entry,' using a specific verb and resource name. This distinguishes it from sibling tools like clio_list_calendar_entries and other create tools for different entities.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a specific guideline for all-day events (setting all_day=true and using date-only timestamps), which is helpful. However, it does not explicitly state when not to use this tool or compare to alternatives, though the resource name itself makes the intent clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clio_create_company_contactCreate company contactC

Creates a company (entity) contact in Clio — Inc., LLC, Ltd., etc.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesCompany legal name.
email_addressesNo
phone_numbersNo
addressesNo

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=false, and the description adds no behavioral details beyond stating creation. No mention of authorization, idempotency, or error conditions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence, no extra words. Front-loaded with action and resource. Could be slightly more informative without losing conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema, no description of return value, duplicate handling, or validation. Given 4 parameters and no annotation enrichment, the description is incomplete for safe invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 25% (only name has description). The tool description adds no parameter details. For parameters like addresses and phone_numbers, semantics are left to schema alone, which is insufficient.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Creates' and the resource 'company (entity) contact' with examples of entity types (Inc., LLC, Ltd.). This distinguishes it from sibling tools like clio_create_person_contact.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool over alternatives like clio_create_person_contact or any prerequisites. The description does not address selection criteria or context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clio_create_expense_entryCreate expense entry / flat-fee line itemA

Creates an ExpenseEntry. Use this for flat-fee line items as well — total = quantity × price (not rate × hours).

ParametersJSON Schema
NameRequiredDescriptionDefault
matter_idYes
user_idNo
dateYesYYYY-MM-DD.
quantityYesUsually 1 for flat-fee line items.
priceYesPer-unit cost; total = quantity × price.
noteNo
expense_category_idNo
non_billableNo

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate it's a write operation (readOnlyHint=false) and non-idempotent (idempotentHint=false). The description adds behavioral context by explaining the total calculation and that quantity is usually 1 for flat-fee, which goes beyond what annotations provide. However, it doesn't mention side effects like creation of multiple entries on repeat calls.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the main action, and every sentence adds value. No unnecessary text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With 8 parameters, no output schema, and only basic annotations, the description is incomplete. It lacks explanations for many required and optional fields (e.g., expense_category_id, non_billable) and does not describe return values or behavior for repeated calls.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 38% (3 of 8 parameters have descriptions). The description adds meaning for quantity (usually 1) and price (per-unit cost), but fails to explain other parameters like matter_id, user_id, expense_category_id, non_billable, and note. This leaves significant gaps for an agent to understand the full input.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it creates an ExpenseEntry and includes flat-fee line items. It uses a specific verb (creates) and resource (ExpenseEntry), and distinguishes from siblings like clio_create_time_entry by explicitly mentioning the calculation formula (quantity × price vs. rate × hours).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly tells when to use this tool versus the time entry tool by stating 'total = quantity × price (not rate × hours)'. This provides clear guidance on usage context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clio_create_matterCreate matterA

Creates a new matter. client_id is required. If flat_rate_amount is supplied, the matter is created and then PATCHed with the custom_rate association — which is how Clio actually flips billing_method to flat (the top-level billing_method field is silently ignored on POST/PATCH; this is a confirmed Clio API quirk).

ParametersJSON Schema
NameRequiredDescriptionDefault
client_idYesNumeric id of the client contact this matter belongs to.
descriptionYesMatter description / name shown in Clio.
display_numberNoCustom matter number. If omitted Clio auto-assigns.
practice_area_idNo
statusNoOpen
open_dateNoYYYY-MM-DD.
responsible_attorney_idNoFalls back to CLIO_DEFAULT_USER_ID if unset.
originating_attorney_idNo
billableNo
flat_rate_amountNoSet a flat fee for the whole matter. The server will POST the matter and then PATCH it with a custom_rate association (Clio creates the billable line item automatically).
flat_rate_user_idNoUser the flat rate is attributed to. Defaults to responsible_attorney_id or CLIO_DEFAULT_USER_ID.

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses the flat_rate quirk (the two-step process and ignored billing_method), which is beyond annotations. However, it omits other behavioral details like auth needs, idempotency (annotations false but not elaborated), and side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is very concise (two sentences) with front-loaded purpose. Every word adds value, especially the critical flat-rate detail. No wasted text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (11 parameters, creation, no output schema), the description covers the core purpose and one quirk but lacks error handling, return value hints, and differentiation from similar creation tools. It leaves gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 64%, and the description adds meaningful detail for flat_rate_amount by explaining the PATCH behavior. For other parameters, it restates schema info or adds nothing new. Overall, adds moderate value beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it creates a new matter and specifies the required client_id. However, it does not differentiate from the sibling tool clio_open_new_matter, leaving ambiguity about which to use.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for creating matters but provides no guidance on when to use this tool versus alternatives like clio_open_new_matter, nor does it specify prerequisites or context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clio_create_noteCreate noteA

Creates a note on a matter or contact. Notes appear in Clio's matter timeline and survive indefinitely — appropriate for memorializing client conversations and AI-generated summaries.

ParametersJSON Schema
NameRequiredDescriptionDefault
subjectYesShort title — visible in matter timeline.
detailYesNote body. Plain text or HTML.
matter_idNo
contact_idNo
dateNoISO 8601 timestamp. Defaults to now.

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (non-read-only, non-idempotent), the description adds valuable behavioral context: notes 'appear in Clio's matter timeline and survive indefinitely,' indicating persistence and visibility. No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, highly concise, and front-loads the core action. Every word adds value, with no filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 5 parameters and no output schema, the description covers purpose and usage context but omits return value behavior and details on optional parameters. Adequate but not fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 60% schema coverage, the description adds minimal parameter context beyond the schema. It implies that matter_id or contact_id should be used ('on a matter or contact'), but does not clarify if one is required or what happens if both are omitted. The schema already covers subject, detail, and date well.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it 'Creates a note on a matter or contact,' specifying the resource and action. It distinguishes from sibling tools like clio_create_task or clio_create_calendar_entry by focusing on notes and even provides use-case context: 'memorializing client conversations and AI-generated summaries.'

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear when-to-use guidance ('appropriate for memorializing client conversations and AI-generated summaries') but does not explicitly mention when not to use or directly compare with sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clio_create_person_contactCreate person contactC

Creates a person (individual) contact in Clio.

ParametersJSON Schema
NameRequiredDescriptionDefault
first_nameYes
last_nameYes
middle_nameNo
prefixNo
suffixNo
titleNo
company_idNoLink this person to a company contact.
email_addressesNo
phone_numbersNo
addressesNo

TDQS

C2.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate it is not read-only and not idempotent, which is consistent with 'Creates'. However, the description adds no additional behavioral context such as required permissions, duplicate handling, or response structure. For a write operation, this is insufficient.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single succinct sentence, but it is too brief for a tool with 10 parameters. It sacrifices informative content for brevity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity (10 parameters, no output schema, no parameter descriptions), the description is severely incomplete. It fails to explain what the tool returns, how to handle errors, or provide any usage context beyond the basic action.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 10%, meaning most parameters lack descriptions in the schema. The tool description adds no parameter-level information, leaving the agent to infer meanings from names alone. This is a critical gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool creates a person (individual) contact in Clio, using a specific verb and resource. It distinguishes from the sibling tool 'clio_create_company_contact' by specifying 'person' vs 'company'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives. There is no mention of prerequisites, error conditions, or when to prefer 'clio_create_company_contact' or other contact-related tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clio_create_taskCreate taskB

Creates a task. Optionally scoped to a matter and/or assignee.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes
matter_idNo
descriptionNo
priorityNoNormal
due_atNoISO 8601 timestamp or YYYY-MM-DD.
assignee_idNoDefaults to CLIO_DEFAULT_USER_ID.
task_type_idNo

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate a non-read-only, non-idempotent mutation. Description adds no extra behavioral details beyond confirming creation, missing side effects or permission requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One short sentence front-loads the action, but for a 7-parameter tool, it may be overly concise at the cost of completeness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite no output schema and low param coverage, the description does not elaborate on return values, exact parameter usage (e.g., due_at format), or behavior constraints, leaving gaps for agent understanding.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With only 29% schema coverage, the description minimally clarifies matter_id and assignee_id but fails to explain other parameters like task_type_id, description, or priority beyond what's in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Creates') and resource ('a task'), with optional scoping to matter and/or assignee, distinguishing it from read, update, and list sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides context for optional parameters (matter_id, assignee_id) but lacks explicit when-not-to-use or alternative tools like clio_create_note or clio_create_calendar_entry.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clio_create_time_entryCreate time entryA

Logs billable or non-billable time on a matter. TimeEntry.total = quantity_in_hours × rate.

ParametersJSON Schema
NameRequiredDescriptionDefault
matter_idYes
user_idNoDefaults to CLIO_DEFAULT_USER_ID.
dateYesYYYY-MM-DD.
quantity_in_hoursYesHours worked. Drives the total.
noteNoFree-text description (Clio also accepts `description` on POST).
rateNoHourly rate. If omitted Clio uses the user's default.
activity_description_idNo
non_billableNo

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate read-write, non-idempotent. Describes the total calculation formula, which adds value. However, lacks disclosure of side effects, required permissions, or return behavior (e.g., what object is returned on success).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences front-loading purpose and key formula. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 8 parameters and no output schema, description covers core logic but does not explain return values, error conditions, or mention the activity_description_id parameter. Adequate but not comprehensive.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Adds meaning beyond schema by explaining the relationship between quantity_in_hours and rate via total formula. Also clarifies billable vs non-billable. Schema coverage is 63%, and description compensates moderately.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states 'Logs billable or non-billable time on a matter' which is a specific verb-resource combination. Distinguished from siblings like create_expense_entry, create_calendar_entry by focusing on time entry.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives (e.g., create_expense_entry for expenses, create_calendar_entry for calendar events). Does not provide when-not or alternative tool references.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clio_delete_contactDelete contactA
DestructiveIdempotent

Deletes a contact. Disabled unless CLIO_ALLOW_DESTRUCTIVE=true. Returns 409 if the contact has open bills, 422 if they are a client on an open matter.

ParametersJSON Schema
NameRequiredDescriptionDefault
contact_idYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark destructiveHint. Description adds value by disclosing the environment variable gate and specific conflict errors, which are beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with purpose, then conditions, then errors. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple delete tool with one param and no output schema, the description covers prerequisites, error scenarios, and operation. No gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has one parameter (contact_id) with no description. The tool description does not explain what contact_id is or how to obtain it, failing to compensate for the 0% schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it deletes a contact, matching the tool name and distinguishing it from other contact tools like update_contact.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description includes a prerequisite (environment variable requirement) and error conditions (409, 422), which guide when not to use. However, it does not explicitly contrast with alternatives like soft-delete via update.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clio_delete_matterDelete matterA
DestructiveIdempotent

Soft-deletes a matter. Disabled unless CLIO_ALLOW_DESTRUCTIVE=true. Returns 204 on success, 404 if already deleted, 422 if the matter has dependencies (e.g. open bills).

ParametersJSON Schema
NameRequiredDescriptionDefault
matter_idYes

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses soft-delete behavior, which aligns with destructiveHint=true. The idempotentHint is supported by describing that a second delete attempt returns 404. The description adds context about dependency checks (422) beyond what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three succinct sentences: action, prerequisite, return statuses. No unnecessary information, every sentence adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simple parameter set and good annotations, the description covers success, failure, and dependencies. It lacks explanation of what 'soft-delete' implies (e.g., reversibility), but overall it's sufficient for the tool's complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the single integer parameter 'matter_id' is self-explanatory. Description does not add extra semantics beyond the schema, so baseline score is appropriate for a simple parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states 'Soft-deletes a matter' with a specific verb and resource. It distinguishes from sibling tools like clio_create_matter, clio_update_matter, and clio_get_matter by focusing on deletion.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Description notes that the tool is disabled unless CLIO_ALLOW_DESTRUCTIVE=true, providing a clear prerequisite. It also mentions error codes for already deleted (404) and dependencies (422). However, it does not explicitly state when to use alternatives or when not to use this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clio_get_activityGet activityA
Read-onlyIdempotent

Returns a single activity. You MUST request specific fields — Clio's default response is just id + etag.

ParametersJSON Schema
NameRequiredDescriptionDefault
activity_idYes
fieldsNo

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds behavioral context beyond annotations by noting that the default response is only 'id + etag' and that specific fields must be requested. This supplements the readOnlyHint and idempotentHint annotations without contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with two sentences. The first sentence states the purpose, and the second adds a crucial usage requirement. No unnecessary words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only tool with two parameters and no output schema, the description covers the essential behavior and a critical constraint (field requirement). It is largely complete, though it could optionally detail the format of the 'fields' parameter.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With schema description coverage at 0%, the description provides minimal additional meaning. It mentions that specific fields must be requested, which hints at the importance of the 'fields' parameter, but does not explain its format or the 'activity_id' parameter beyond what the schema already shows.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states 'Returns a single activity', specifying the verb and resource. It distinguishes itself from sibling tools like 'clio_list_activities' which returns multiple activities.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description includes an important usage requirement: 'You MUST request specific fields', which guides the agent on how to use the tool effectively. However, it does not explicitly state when to use this tool versus alternatives, such as when a single activity versus a list is needed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clio_get_billGet billA
Read-onlyIdempotent

Returns a single bill by id.

ParametersJSON Schema
NameRequiredDescriptionDefault
bill_idYes

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the tool as read-only and idempotent. The description does not contradict these and adds basic safety context. No extra behavioral details, but the bar is lowered due to annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, compact sentence with no wasted words. It conveys the essential information efficiently.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With only one required parameter and no output schema, the description is mostly adequate. However, it could mention what fields are returned or if the bill is fully expanded.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description only says 'by id' without clarifying the format or constraints of the bill_id parameter. This is insufficient for an agent to construct the parameter correctly.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Returns') and the resource ('a single bill') with the required parameter ('by id'). It distinguishes from sibling list tools like clio_list_bills.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use this tool versus alternatives. Context signals suggest siblings like clio_list_bills and clio_get_billing_summary, but no when-to-use or when-not-to-use information.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clio_get_billing_summaryGet billing summary for a matterA
Read-onlyIdempotent

Aggregates totals across all bills on a matter: total billed, total paid, outstanding balance, and the date of the most-recently-issued bill.

ParametersJSON Schema
NameRequiredDescriptionDefault
matter_idYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Description adds context beyond readOnlyHint and idempotentHint annotations by detailing the aggregated fields returned. No contradictions; behavioral traits are clear.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence that front-loads the purpose and lists specific outputs. No superfluous information; every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only tool with one parameter and no output schema, the description fully explains what the tool returns. No gaps remain.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, but the single parameter 'matter_id' (integer, required) is self-explanatory given the tool name. Description does not add extra meaning but the parameter is simple enough to not require further elaboration.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description uses specific verb 'aggregates totals' and lists exact return fields: total billed, total paid, outstanding balance, date of most-recently-issued bill. Clearly distinguishes from sibling tools like clio_get_bill (individual bill) and clio_list_bills (listing bills).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Implies usage for obtaining a financial summary of a matter, but no explicit guidance on when to use vs alternatives or when not to use. Sibling tools list is extensive but no differentiation mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clio_get_contactGet contactA
Read-onlyIdempotent

Returns full detail for a contact, including all emails, phone numbers, and addresses.

ParametersJSON Schema
NameRequiredDescriptionDefault
contact_idYes
fieldsNo

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint, so the description's mention of 'Returns full detail' aligns but adds no new behavioral context beyond confirming the return type. No mention of performance, rate limits, or other constraints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence of 15 words, front-loading the key purpose and included data. No redundant phrases.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a retrieve tool with no output schema, the description provides core information about what is returned. However, it could mention additional details like the full response structure (e.g., custom fields) or error conditions. Still, it is fairly complete given the tool's simplicity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, meaning the parameters have no descriptions. The tool description does not explain the contact_id (implied but not explicit) or the fields parameter (its purpose or valid values). The description fails to compensate for the lack of parameter documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that the tool returns full detail for a contact, specifying included data (emails, phone numbers, addresses). It distinguishes from sibling tools like search (returns list) and update (modifies). The verb 'Returns' and resource 'full detail for a contact' are specific.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for retrieving full details of a single contact, but does not explicitly state when to use this tool over alternatives such as clio_search_contacts for searches or clio_get_matter for matter-specific contacts. No exclusionary guidance is provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clio_get_documentGet documentB
Read-onlyIdempotent

Returns document metadata.

ParametersJSON Schema
NameRequiredDescriptionDefault
document_idYes

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations provide readOnlyHint and idempotentHint, so the description adds no extra behavioral context. It doesn't disclose error handling or return value details, but the annotations cover the safety profile adequately.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Extremely concise (3 words). For a simple get tool, this is efficient and front-loaded. Could add slight detail without bloat, but it's not wasteful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Missing details about what document metadata includes, how to handle errors, or any return format. Despite good annotations, the description doesn't fully inform the agent about the tool's behavior.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description does not explain the 'document_id' parameter. The description adds no meaning beyond what the schema provides; for a single required param, it should at least mention it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states 'Returns document metadata' with a specific verb and resource. Distinguishes from siblings like clio_get_document_download_url (download URL) and clio_list_documents (list).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool vs alternatives such as clio_get_document_download_url or clio_list_documents. No context on prerequisites or conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clio_get_document_download_urlGet short-lived download URL for a documentA
Read-onlyIdempotent

Resolves the GET /documents/{id}/download.json endpoint and returns the redirect target — a short-lived signed URL. We do NOT proxy the bytes through the MCP server.

ParametersJSON Schema
NameRequiredDescriptionDefault
document_idYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnly and idempotent. The description adds that it returns a redirect target (not the bytes), the URL is short-lived, and bytes are not proxied. This goes beyond annotations, though it could mention TTL or access scope.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no redundancy. Each sentence adds value: first explains the endpoint and return type, second clarifies what is not done. Front-loaded with action verb 'Resolves'.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only tool with one parameter, annotations, and no output schema, the description covers the core behavior (what is returned, what is not proxied) sufficiently. No major gaps for an agent to misuse the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and the description does not explain the parameter 'document_id' beyond hinting at its role in the URL path. It does not clarify expected format, required permissions, or that it is the Clio document ID. Minimal compensation for missing schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it resolves a specific endpoint ('GET /documents/{id}/download.json') and returns a redirect target (short-lived signed URL). This distinguishes it from sibling tools like clio_get_document, which likely returns metadata, and other generic tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for obtaining a download URL but does not explicitly state when to use this over alternatives like clio_api_request or clio_get_document. No exclusions or context about prerequisites (e.g., authentication, document access) are provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clio_get_matterGet matterA
Read-onlyIdempotent

Returns full detail for a single matter by id.

ParametersJSON Schema
NameRequiredDescriptionDefault
matter_idYesNumeric Clio matter id.
fieldsNoOptional comma-separated field list. Default is comprehensive.

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=true, so the description adds little behavioral context beyond stating 'full detail'. It does not contradict annotations; no annotation contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence of 8 words, no filler, and front-loads the key action and resource. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (2 params, no output schema, clear annotations), the description adequately conveys the purpose. Could explicitly mention that it returns a full matter object, but not essential for a get-by-id operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% (both parameters have descriptions). The description adds minimal value beyond the schema ('by id' reiterates the required parameter). Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description 'Returns full detail for a single matter by id' uses a specific verb ('returns') and resource ('single matter') with a clear identifier ('by id'), distinguishing it from sibling tools like clio_list_matters (list multiple) and clio_update_matter (update).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage when you have a specific matter ID, but does not explicitly state when to use this tool over alternatives like clio_list_matters or clio_search_contacts. No exclusions or when-not-to-use guidance is provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clio_get_taskGet taskA
Read-onlyIdempotent

Returns a single task by id.

ParametersJSON Schema
NameRequiredDescriptionDefault
task_idYes

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Description adds no behavioral information beyond annotations (readOnlyHint, idempotentHint). It does not contradict annotations but provides no extra insight into side effects or behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence, directly to the point with no superfluous words. Perfectly concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Simple tool with annotations covering safety and idempotency. Description is adequate for a single-resource retrieval, though could mention error cases or response structure. Minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has 1 parameter (task_id) with 0% description coverage. Description clarifies it is the identifier but adds no format or constraints, which is minimal but acceptable for a straightforward parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states verb 'Returns', resource 'task', and criteria 'by id'. Distinguishes from sibling 'clio_list_tasks' which lists multiple tasks.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implicitly clear given sibling tools; explicitly states it returns a single task by id. No explicit alternatives but context suffices for a simple function.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clio_get_userGet userA
Read-onlyIdempotent

Returns a single user by id.

ParametersJSON Schema
NameRequiredDescriptionDefault
user_idYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint, so the description adds no behavioral context beyond restating the function; minimal additional value.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence with no wasted words, front-loaded with the key action and resource.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple get-by-id tool with annotations, the description is minimally adequate but lacks details on return fields or edge cases, which would be helpful without an output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is only one parameter (user_id) with 0% schema description coverage, and the description does not explain its usage, format, or semantics, requiring the agent to infer from the schema alone.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Returns' and the resource 'a single user by id', distinguishing it from sibling tools like clio_list_users which return multiple users.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies use when needing a specific user but does not explicitly state when to use this tool over alternatives or exclude other tools, providing only implicit guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clio_list_activitiesList activities (time + expense entries)A
Read-onlyIdempotent

Lists time entries and expenses. Filter by matter, user, date range, or type. Defaults to a useful field set since a bare GET on activities returns only id + etag.

ParametersJSON Schema
NameRequiredDescriptionDefault
matter_idNoMUST be a single int — `matter[id]` is silently ignored.
user_idNo
typeNo
start_dateNoYYYY-MM-DD.
end_dateNoYYYY-MM-DD.
non_billableNo
billedNo
fieldsNo
limitNoMax records to return across all pages. Capped by CLIO_MAX_PAGE_SIZE.
page_sizeNoRecords per Clio API page (default from CLIO_DEFAULT_PAGE_SIZE).

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint; description adds that default fields avoid bare ID+etag response, warns about matter_id misuse. Does not cover pagination, but adds non-trivial behavior beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two focused sentences: first states purpose, second explains a key behavior. No wasted words; information is front-loaded and easy to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema, and description does not explain return format, pagination, or default fields beyond mentioning 'useful field set.' For a list endpoint with many parameters, more detail would improve completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50%, but description only mentions filters generically without detailing parameter syntax or semantics beyond what schema provides. Could compensate by explaining fields parameter or date formats, but does not.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly describes the tool as listing time entries and expenses, specifies filtering options by matter, user, date range, or type, and distinguishes from sibling tools like clio_get_activity or create tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

States when to use default field set, and filtering conditions are clear. Lacks explicit guidance on when not to use or alternatives, but context from sibling names implies appropriate use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clio_list_billsList billsA
Read-onlyIdempotent

Lists bills with optional filtering by matter, client, state, or issued-date range.

ParametersJSON Schema
NameRequiredDescriptionDefault
matter_idNo
client_idNo
stateNo
issued_sinceNoISO 8601.
limitNoMax records to return across all pages. Capped by CLIO_MAX_PAGE_SIZE.
page_sizeNoRecords per Clio API page (default from CLIO_DEFAULT_PAGE_SIZE).

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint. Description adds no further behavioral context (e.g., pagination, rate limits). Does not contradict annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single concise sentence effectively communicates core functionality without wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Describes main filters but omits pagination parameters and return value expectations. No output schema, so more detail on response could be helpful.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 50% with descriptions for issued_since, limit, page_size. Description groups four filter parameters but doesn't add details beyond schema for those with descriptions or cover limit/page_size.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the verb 'Lists' and resource 'bills' with specific filter options (matter, client, state, issued-date). Distinguishes from sibling clio_get_bill for single bill retrieval.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool vs alternatives like clio_get_bill. Does not mention when not to use or provide context for selection among siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clio_list_calendar_entriesList calendar entriesA
Read-onlyIdempotent

Lists calendar entries within a date range. Use ISO dates (YYYY-MM-DD).

ParametersJSON Schema
NameRequiredDescriptionDefault
fromYesStart of range, YYYY-MM-DD (inclusive).
toYesEnd of range, YYYY-MM-DD (inclusive).
calendar_idNo
matter_idNo
limitNoMax records to return across all pages. Capped by CLIO_MAX_PAGE_SIZE.
page_sizeNoRecords per Clio API page (default from CLIO_DEFAULT_PAGE_SIZE).

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint, so the description does not need to restate safety. The description adds date format context, but beyond that, no behavioral traits (e.g., pagination, return format) are disclosed. Adequate but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence of 9 words, efficiently stating the purpose and a key format rule. No wasted text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is minimal for a tool with 6 parameters and no output schema. Missing information about pagination, return value structure, and behavior beyond date range. Relies heavily on schema annotations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 67% (4 of 6 parameters described). The description adds 'ISO dates (YYYY-MM-DD)' which is already covered by schema descriptions for 'from' and 'to'. It does not compensate for undocumented parameters (calendar_id, matter_id). Marginal addition.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description 'Lists calendar entries within a date range' uses a specific verb and resource, clearly distinguishing from siblings like clio_list_calendars (which lists calendars) and clio_create_calendar_entry.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a basic guideline on date format ('Use ISO dates (YYYY-MM-DD)'), but does not explicitly state when to use this tool versus alternatives or provide exclusion criteria. Usage is implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clio_list_calendarsList calendarsA
Read-onlyIdempotent

Lists the calendars available to the current user.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax records to return across all pages. Capped by CLIO_MAX_PAGE_SIZE.
page_sizeNoRecords per Clio API page (default from CLIO_DEFAULT_PAGE_SIZE).

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint, indicating safe repeated reads. The description adds no additional behavioral context beyond stating it lists calendars.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, clear sentence with no unnecessary words, perfectly concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the lack of output schema and pagination details, the description is adequate but does not explain return format or how pagination works with limit/page_size.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% – both limit and page_size are already described in the schema. The tool description does not add further meaning about parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb 'Lists' and resource 'calendars available to the current user', clearly distinguishing it from sibling tools like clio_list_calendar_entries (which lists entries within a calendar).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use this tool versus alternatives. While the name and description are self-explanatory, it does not mention context or exclude other list tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clio_list_documentsList documentsB
Read-onlyIdempotent

Lists documents in a matter or folder.

ParametersJSON Schema
NameRequiredDescriptionDefault
matter_idNo
parent_idNoFolder id to list contents of.
queryNoName-substring search.
limitNoMax records to return across all pages. Capped by CLIO_MAX_PAGE_SIZE.
page_sizeNoRecords per Clio API page (default from CLIO_DEFAULT_PAGE_SIZE).

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=true, so the agent knows it is safe. The description correctly identifies the action but adds no further behavioral context (e.g., pagination, ordering, or that matter_id/parent_id may be needed). No contradiction with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is very concise at 8 words, front-loading the core function. While it could benefit from slight expansion (e.g., mentioning pagination), every word is earned and there is no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description should hint at what the list contains (document objects). It covers the basic context but omits that query and pagination are supported, relying on the schema. Adequate for a simple list tool but not fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 80%, with descriptions for most parameters. The tool description adds no parameter-level information beyond what the schema provides. Baseline of 3 is appropriate as the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it lists documents within a matter or folder. The verb 'lists' and resource 'documents' are specific, and the scope ('in a matter or folder') distinguishes it from tools like clio_get_document (single) and clio_list_folders, though not explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives such as clio_list_folders for folders or clio_get_document for a single document. The description does not mention prerequisites or filtering options beyond the schema.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clio_list_foldersList foldersA
Read-onlyIdempotent

Lists folders under a parent, or top-level if no parent_id given.

ParametersJSON Schema
NameRequiredDescriptionDefault
parent_idNo
matter_idNo
limitNoMax records to return across all pages. Capped by CLIO_MAX_PAGE_SIZE.
page_sizeNoRecords per Clio API page (default from CLIO_DEFAULT_PAGE_SIZE).

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=true, so the description adds value by explaining the parent-child behavioral nuance. It does not contradict annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence with no wasted words. It conveys the essential information concisely.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema and 50% schema coverage, the description covers the core behavior but omits details about matter_id usage. It is sufficient for a simple list operation but could be more complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 50% (limit and page_size described). The description adds meaning for parent_id (optionality and effect) but does not mention matter_id. Baseline at 3 because coverage is not low but incomplete.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that it lists folders under a parent or top-level if no parent_id given. It uses a specific verb ('Lists') and resource ('folders'), and distinguishes itself from sibling tools like clio_list_documents or clio_list_calendars.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context on when to use this tool: when listing folders, with behavior dependent on parent_id. However, it does not explicitly mention when not to use it or suggest alternatives, though among siblings, no other folder-listing tool exists.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clio_list_matter_contactsList related contacts on a matterA
Read-onlyIdempotent

Returns related contacts for the given matter (the client plus any related parties).

ParametersJSON Schema
NameRequiredDescriptionDefault
matter_idYes
limitNoMax records to return across all pages. Capped by CLIO_MAX_PAGE_SIZE.
page_sizeNoRecords per Clio API page (default from CLIO_DEFAULT_PAGE_SIZE).

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint, so the safety profile is covered. The description adds that it returns the client and related parties, but does not mention pagination behavior or default limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence with no extraneous words. Every word adds value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple list tool with 3 parameters and no output schema, the description is fairly complete, stating what is returned. It could mention pagination or lack of filtering, but overall adequate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema has 67% description coverage (limit and page_size described). The description provides no additional parameter semantics, leaving matter_id undocumented. With coverage below 80%, description should compensate but does not.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns related contacts for a given matter, specifying it includes the client and related parties. This distinguishes it from sibling tools like clio_search_contacts or clio_list_users.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implicitly suggests using this tool when needing contacts associated with a specific matter, but it does not explicitly state when not to use it or compare it with alternatives like clio_search_contacts.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clio_list_mattersList mattersA
Read-onlyIdempotent

Lists matters with optional filtering. Use query for free-text search across matter names, client_id to scope to a single client, and status to filter by lifecycle stage.

ParametersJSON Schema
NameRequiredDescriptionDefault
statusNoMatter status. Clio enums are case-sensitive.
client_idNoNumeric Clio contact id of the client.
practice_area_idNo
responsible_attorney_idNo
queryNoFree-text search across matter names and descriptions.
updated_sinceNoISO 8601 timestamp — return matters updated after this time.
fieldsNoOverride the default fields list. Default: id,display_number,description,status,open_date,close_date,pending_date,practice_area{id,name},client{id,name,type},responsible_attorney{id,name},originating_attorney{id,name},billable,billing_method
limitNoMax records to return across all pages. Capped by CLIO_MAX_PAGE_SIZE.
page_sizeNoRecords per Clio API page (default from CLIO_DEFAULT_PAGE_SIZE).

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint. The description adds behavioral context: case-sensitive enums, pagination caps, default fields. No contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences: first states core purpose, second provides actionable parameter guidance. No wasted words, front-loaded with key intent.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 9 parameters, high schema coverage, no output schema, and annotations, the description covers filtering, pagination, and case-sensitivity. It could mention output is a list, but implied. Complete enough for a read-only list tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is high (78%). The description explains the purpose of key parameters (query, client_id, status) and mentions case-sensitivity, adding value beyond schema. Some parameters like practice_area_id are not explained.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb-resource pair ('Lists matters') and distinguishes from siblings like clio_get_matter. It lists optional filtering parameters, clearly indicating the scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit guidance on when to use certain parameters (query, client_id, status) but does not contrast with sibling tools like clio_get_matter or clio_search_contacts. It implies usage for listing matters with filters.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clio_list_notesList notesA
Read-onlyIdempotent

Lists notes attached to a matter or contact.

ParametersJSON Schema
NameRequiredDescriptionDefault
matter_idNo
contact_idNo
limitNoMax records to return across all pages. Capped by CLIO_MAX_PAGE_SIZE.
page_sizeNoRecords per Clio API page (default from CLIO_DEFAULT_PAGE_SIZE).

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint: true and idempotentHint: true, so the description doesn't need to repeat safety. However, it adds no further behavioral context (e.g., pagination details, behavior when both matter_id and contact_id are provided). With annotations covering safety, a 3 is appropriate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence with no waste. Front-loaded action and scope. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (list notes with read-only and idempotent annotations, no output schema), the description provides the minimum. It lacks details on ordering, default behavior, or error conditions when no parameters are provided. Could be more complete but meets basic needs.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema includes 4 parameters (matter_id, contact_id, limit, page_size) with 50% description coverage (limit and page_size have descriptions). The description does not add meaning beyond the schema; it does not explain how to use the parameters together or provide examples. Baseline 3 for adequate compensation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description explicitly states 'Lists notes attached to a matter or contact,' clearly identifying the action and scope. It distinguishes from sibling tools like clio_create_note (create) and other list tools by specifying the resource (notes) and filtering context.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use this tool versus alternatives (e.g., clio_search_contacts for broader search). Usage is implied (for listing notes on a matter or contact) but not clarified with when-not scenarios or recommended prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clio_list_practice_areasList practice areasB
Read-onlyIdempotent

Lists practice areas configured on the firm.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax records to return across all pages. Capped by CLIO_MAX_PAGE_SIZE.
page_sizeNoRecords per Clio API page (default from CLIO_DEFAULT_PAGE_SIZE).

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is clear. The description adds no further behavioral details (e.g., pagination behavior, ordering, or caching), but it does not contradict the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, concise sentence that efficiently communicates the tool's function with no wasted words. It is front-loaded and easy to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple list tool with no output schema and well-documented parameters, the description provides the minimum viable information. However, it lacks details about the return format or potential filtering, which would be helpful for completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema coverage is 100%, so both limit and page_size are already well-documented. The description adds no extra semantics or usage context beyond what the schema provides, resulting in a baseline score.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Lists' and the resource 'practice areas', making the tool's purpose immediately obvious. It distinguishes itself from sibling tools by naming a specific entity, though it could be more precise about what 'configured on the firm' entails.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives like clio_list_matters or clio_search_contacts. There is no mention of prerequisites, optimal conditions, or exclusions, leaving the agent without context for selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clio_list_tasksList tasksA
Read-onlyIdempotent

Lists tasks with optional filters by matter, status, priority, due date range, and assignee.

ParametersJSON Schema
NameRequiredDescriptionDefault
matter_idNo
assignee_idNo
statusNo
priorityNo
due_date_startNoYYYY-MM-DD.
due_date_endNoYYYY-MM-DD.
limitNoMax records to return across all pages. Capped by CLIO_MAX_PAGE_SIZE.
page_sizeNoRecords per Clio API page (default from CLIO_DEFAULT_PAGE_SIZE).

TDQS

A3.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already provide readOnlyHint and idempotentHint, so the description does not need to repeat safety information. However, the description adds no additional behavioral context beyond the filter list, missing details like pagination behavior (covered in schema but not enhanced), default ordering, or response format.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that front-loads the verb and resource, lists filters efficiently, and contains no superfluous words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 8 optional parameters and no output schema, the description covers the filtering intent but lacks information about default behavior (e.g., what happens when no filters are applied), pagination details, and return format. It is minimally adequate but leaves gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 50% schema description coverage, the description compensates by explicitly listing the filter parameters (matter, status, priority, due date range, assignee), which maps to 6 of 8 parameters. It does not mention limit and page_size, which are documented in the schema, so overall it adds meaningful semantic grouping but misses two parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the verb 'Lists' and the resource 'tasks', and specifies optional filters (matter, status, priority, due date range, assignee). This distinguishes it from sibling tools like clio_get_task (single task retrieval) and clio_create_task (creation).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage context is implied via the list of optional filters, but there is no explicit guidance on when to use this tool versus alternatives (e.g., clio_get_task for a specific task). The description does not state when not to use it or mention any prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clio_list_usersList usersB
Read-onlyIdempotent

Lists firm users.

ParametersJSON Schema
NameRequiredDescriptionDefault
enabledNo
limitNoMax records to return across all pages. Capped by CLIO_MAX_PAGE_SIZE.
page_sizeNoRecords per Clio API page (default from CLIO_DEFAULT_PAGE_SIZE).

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=true, so the description need not restate them. However, the description adds no extra behavioral context (e.g., pagination behavior, rate limits, or that it returns all users by default). It is adequate but not improved beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise: 'Lists firm users.' This single sentence is necessary and sufficient for a simple list tool, with no wasted words. It is front-loaded and earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has 3 optional parameters and no output schema, the description is too sparse. It does not explain how parameters affect the listing (e.g., filtering by enabled), does not mention pagination, and does not indicate return structure. The schema partially compensates, but the description lacks completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 67%, with 'limit' and 'page_size' explained in the schema. The description does not mention any parameters, especially 'enabled', which has no schema description. While the parameter names are somewhat self-explanatory, the description adds no value beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'lists' and resource 'firm users', making the purpose straightforward. However, it does not differentiate from sibling tools like clio_get_user or other list tools, though the resource name is distinctive enough.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives (e.g., clio_get_user for a single user, or other list tools). There is no mention of prerequisites, context, or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clio_logoutClear stored Clio credentialsA
DestructiveIdempotent

Deletes the encrypted token file for the shared account (local stdio / static HTTP mode). Does not revoke the token on Clio's side — use Clio's Developer Applications screen to fully revoke. On the remote connector, per-user sessions are not cleared by this tool; disconnect the connector in Claude (or revoke the app in Clio) to end a session.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate destructive (destructiveHint=true) and idempotent (idempotentHint=true). Description adds context: it only deletes the local token file, not affecting remote sessions or revoking the token. No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, each serving a purpose: first states core action and scope, second clarifies a critical limitation, third addresses additional context for remote connector. Front-loaded, no fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no parameters, no output schema, and annotations, the description fully covers what the tool does, its limitations, and when to use alternatives. Complete for a simple logout tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Tool has 0 parameters, so schema coverage is 100%. With no parameters to document, the description need not add parameter details. Baseline score 4 for zero-parameter tools.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The title 'Clear stored Clio credentials' and description 'Deletes the encrypted token file for the shared account' clearly state the specific action and resource. Among siblings like clio_authenticate and clio_auth_status, it unambiguously serves as the logout counterpart.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states when to use (to clear local credentials) and when not: it does not revoke the token on Clio's side and does not clear remote per-user sessions. Provides alternatives: use Clio's Developer Applications screen for full revocation, or disconnect the connector in Claude for remote sessions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clio_open_new_matterOpen a new matter (intake workflow)A

End-to-end intake: creates the client contact (or uses an existing one), opens the matter, and optionally seeds an opening note and an intake task. Returns a summary of everything created.

ParametersJSON Schema
NameRequiredDescriptionDefault
existing_client_idNoIf the client already exists in Clio, pass their contact id and skip the new_client_* fields.
new_client_kindNo
new_client_first_nameNo
new_client_last_nameNo
new_client_company_nameNo
new_client_emailNo
new_client_phoneNo
descriptionYesMatter description / name.
practice_area_idNo
responsible_attorney_idNo
flat_rate_amountNo
opening_note_subjectNoIf supplied, create a note on the new matter.
opening_note_detailNo
intake_task_nameNoIf supplied, create a Pending task on the new matter.
intake_task_due_atNoISO 8601 / YYYY-MM-DD.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations provide readOnly=false and idempotent=false. The description adds that it creates multiple entities and returns a summary, which is valuable behavioral context beyond annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero waste. Efficiently communicates the core purpose and optional features.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity (15 parameters, no output schema), the description is too brief. It omits parameter semantics, prerequisites, and error conditions, leaving an agent underinformed for reliable invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 33% (5 of 15 params described). The description does not compensate by detailing parameters; it merely mentions optional note and task. Most parameters lack explanation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the end-to-end intake workflow: creates/uses client, opens matter, optionally adds note and task. It distinguishes this composite tool from simpler siblings like clio_create_matter.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implicitly indicates this is for full intake, handling both new and existing clients. However, it does not explicitly contrast with alternatives or state when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clio_search_contactsSearch contactsA
Read-onlyIdempotent

Search contacts by free-text query (matches name, email, company). Use clio_get_contact for full detail.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesSearch term — name, email, company, phone.
typeNo
limitNoMax records to return across all pages. Capped by CLIO_MAX_PAGE_SIZE.
page_sizeNoRecords per Clio API page (default from CLIO_DEFAULT_PAGE_SIZE).

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=true, covering the safety profile. The description adds no extra behavioral context beyond stating the search functionality; it does not disclose pagination behavior, rate limits, or permissions. With annotations present, a score of 3 is appropriate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loading the purpose and efficiently directing to the alternative. Every word earns its place with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a search tool with no output schema, the description does not explain the return format (e.g., list of contacts with IDs, pagination handling). While parameters cover pagination, the lack of output context leaves a gap. Adequate but not complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 75%, and the description does not add meaning beyond what the schema provides. The description mentions matching fields, but those are already covered in the schema's query parameter description. Baseline of 3 is suitable.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'search' and the resource 'contacts', specifying matching fields (name, email, company) and explicitly directs to clio_get_contact for full detail, distinguishing it from its sibling tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when to use this tool (free-text search) and explicitly names an alternative (clio_get_contact for full detail), but does not include exclusions or when-not-to-use scenarios.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clio_update_contactUpdate contactA

PATCH a contact. Pass only the fields you want to change.

ParametersJSON Schema
NameRequiredDescriptionDefault
contact_idYes
first_nameNo
last_nameNo
nameNoCompany name (Company-type contacts).
titleNo

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate a mutation (readOnlyHint=false). The description adds that it's a PATCH, which is a standard HTTP verb for partial updates. However, it does not disclose potential side effects, authorization needs, or response behavior. For a mutation tool, this is minimal but not contradictory.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short sentences, front-loaded with the action ('PATCH a contact'), and contains no fluff. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has 5 parameters, no output schema, and minimal annotations. The description does not explain return values, required contact_id, or the distinction between company and person contact fields. It is insufficient for an agent to fully understand behavior without additional information.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Parameter schema coverage is only 20% (one parameter described). The description reinforces the PATCH semantics ('pass only fields to change') but adds no per-parameter meaning. The baseline is 3 given low coverage, and the description does not compensate for missing parameter descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it updates a contact via PATCH. It distinguishes from create and delete siblings by using 'update' and the PATCH verb, making the purpose unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description says 'Pass only the fields you want to change,' which implies partial updates. It provides clear context but lacks explicit when-not-to-use or alternative tool references. Given siblings include create and delete, the usage is inferred.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clio_update_matterUpdate matterA

PATCH a matter. Pass only the fields you want to change.

ParametersJSON Schema
NameRequiredDescriptionDefault
matter_idYes
descriptionNo
statusNo
open_dateNo
close_dateNo
pending_dateNo
practice_area_idNo
responsible_attorney_idNo
billableNo

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate the tool is not read-only and not idempotent. The description adds that it uses PATCH semantics, which conveys idempotency implications. However, it does not disclose other behaviors such as return values, side effects, or rate limits, leaving a gap beyond what annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is very short and front-loaded with the action 'PATCH a matter', making it efficient. However, it could be more structured by including key parameter guidance without becoming verbose. It is appropriately sized but misses some useful information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 9 parameters (1 required) and no output schema, the description is insufficient. It does not explain the update behavior, return type, error handling, or any constraints. The context signals indicate high complexity, yet the description adds minimal completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for missing parameter information. The description only advises to pass changed fields but does not explain any parameter meanings, formats, or constraints (e.g., status enum values, date format for open_date). This fails to add significant value over the raw schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the verb (PATCH) and resource (matter). Distinguishes from sibling tools like clio_create_matter (create) and clio_get_matter (read) by specifying it is an update operation. The phrase 'Pass only the fields you want to change' indicates a partial update pattern.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage for updating existing matters and specifies that only changed fields need to be passed. However, it does not explicitly state when to use this tool versus alternatives like clio_open_new_matter or clio_delete_matter, nor does it mention prerequisites or permissions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clio_update_taskUpdate taskB

PATCH a task. Common use: mark complete by setting status=Complete.

ParametersJSON Schema
NameRequiredDescriptionDefault
task_idYes
nameNo
descriptionNo
priorityNo
due_atNo
statusNo
assignee_idNo

TDQS

B3.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false and idempotentHint=false, which align with the PATCH operation. The description adds the common use case but no further behavioral details (e.g., error behavior, partial update semantics).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is very short (two sentences) and front-loads the action and a practical example. It is concise without wasted words, though it could be slightly more informative.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the 7 parameters, 2 enums, and no output schema, the description lacks completeness. It does not cover most parameters, response format, or potential errors, leaving significant gaps for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema coverage, the description should explain parameters. It only mentions the 'status' parameter and its 'Complete' value, ignoring the other 6 parameters (name, description, priority, due_at, assignee_id) and their semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states 'PATCH a task' which clearly indicates the action and resource. It adds a common use case 'mark complete by setting status=Complete', but does not explicitly differentiate from sibling tools like clio_create_task or clio_get_task, though it is implied.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a concrete example usage (marking a task complete) but does not specify when not to use this tool or mention alternatives such as creating or deleting tasks.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clio_who_am_iIdentify the active Clio userA
Read-onlyIdempotent

Calls GET /users/who_am_i.json to confirm credentials work and return the current user record.

ParametersJSON Schema
NameRequiredDescriptionDefault
fieldsNoOptional comma-separated list of fields to return. Defaults to a sensible subset: id,name,email,enabled,roles.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and idempotentHint, so the description primarily confirms it's a GET call. It adds value by specifying the exact endpoint and the return of user data, with no contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence that front-loads the API call and purpose, with no extraneous words. Excellent conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple authentication check with one optional parameter and no output schema, the description is sufficient. Minor omission: no mention of error responses, but not critical for this tool's simplicity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The only parameter (fields) is fully documented in the schema with defaults. The description adds no new information about parameters, so baseline 3 is appropriate given 100% schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool's purpose: calling the GET /users/who_am_i endpoint to confirm credentials and return the current user. It distinguishes itself from siblings like clio_get_user and clio_list_users by focusing on the authenticated user.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies use after authentication to verify credentials, providing clear context. However, it lacks explicit when-not-to-use or comparisons with sibling tools, though the intended use case is obvious.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 41 tool updatesv0.1.0
    • First observedclio_api_request
    • First observedclio_auth_status
    • First observedclio_authenticate
    • First observedclio_create_calendar_entry
    • First observedclio_create_company_contact
    • First observedclio_create_expense_entry
    • First observedclio_create_matter
    • First observedclio_create_note
    • First observedclio_create_person_contact
    • First observedclio_create_task
    • First observedclio_create_time_entry
    • First observedclio_delete_contact
    • First observedclio_delete_matter
    • First observedclio_get_activity
    • First observedclio_get_bill
    • First observedclio_get_billing_summary
    • First observedclio_get_contact
    • First observedclio_get_document
    • First observedclio_get_document_download_url
    • First observedclio_get_matter
    • First observedclio_get_task
    • First observedclio_get_user
    • First observedclio_list_activities
    • First observedclio_list_bills
    • First observedclio_list_calendar_entries
    • First observedclio_list_calendars
    • First observedclio_list_documents
    • First observedclio_list_folders
    • First observedclio_list_matter_contacts
    • First observedclio_list_matters
    • First observedclio_list_notes
    • First observedclio_list_practice_areas
    • First observedclio_list_tasks
    • First observedclio_list_users
    • First observedclio_logout
    • First observedclio_open_new_matter
    • First observedclio_search_contacts
    • First observedclio_update_contact
    • First observedclio_update_matter
    • First observedclio_update_task
    • First observedclio_who_am_i

TDQS

A3.6/5.0
Disambiguation4/5

Tools are generally well-differentiated with clear names and descriptions. However, there is minor potential for confusion between generic contact creation tools (create_company_contact vs. create_person_contact) and the high-level open_new_matter tool that wraps multiple steps, but descriptions clarify distinct use cases.

Naming Consistency5/5

All tools follow a strict 'clio_<verb>_<noun>' pattern (e.g., clio_create_matter, clio_list_bills, clio_get_contact). The verb is always imperative and the noun is singular. This consistent naming makes the tool set predictable and easy to navigate.

Tool Count4/5

At 41 tools, the server is comprehensive but not excessively large for a full-featured legal practice management API. Each tool covers a distinct CRUD operation or domain entity. The inclusion of a generic api_request tool reduces the need for more dedicated tools, keeping the count reasonable.

Completeness4/5

The tool set covers most major entities (matters, contacts, tasks, time/expenses, bills, documents, folders, calendars, notes, users) with create, read, list, update, delete where appropriate. Missing operations like document upload are partly mitigated by the download URL tool and the generic api_request. Minor gaps exist (e.g., trust requests handled only via api_request), but overall coverage is strong.

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    An MCP server for Clio Manage legal practice management software that enables Claude and other MCP clients to read and write Clio data including contacts, matters, and activities directly from chat.
    8
    MIT
  • A
    license
    C
    quality
    A
    maintenance
    MCP server providing full Smokeball API coverage for law firm practice management, enabling natural language interactions with matters, contacts, tasks, billing, and more via Claude Desktop.
    100
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    A Model Context Protocol server that enables Claude (or any MCP client) to read and write Clio Manage data—contacts, matters, activities—directly from chat, with flat-fee billing support in one call.
    -

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/patrickking67/clio-manage-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server