Skip to main content
Glama
nate-raubenheimer

LawPracticeZA MCP

LawPracticeZA MCP

CI

MCP (Model Context Protocol) server for LawPracticeZA, South African legal practice software. It exposes curated tools for clients, matters, WIP fees, billing, and accounting — not a 1:1 dump of every undocumented object/method.

The stdio server registers curated read tools (APP-132), write tools for clients/matters/transfers/WIP (APP-137), and a bootstrap lpza_ping helper. Live LawPracticeZA calls require LPZA_DATABASE, LPZA_LOGIN_CODE, and LPZA_PASSWORD; without them, tools return a configuration error. CI uses fixture-backed mock HTTP only.

Requirements

  • Node.js 20 or later

  • npm

Related MCP server: lawruler-mcp

Run

npm install
npx tsx src/index.ts

Or npm start. The server waits on stdin. Logs go to stderr; stdout is the MCP JSON-RPC channel.

Exercise it without a host:

npx @modelcontextprotocol/inspector npx tsx src/index.ts

Environment variables

Variable

Required

Description

LPZA_DATABASE

yes (for live tools)

LawPracticeZA firm database name

LPZA_LOGIN_CODE

yes (for live tools)

API login code

LPZA_PASSWORD

yes (for live tools)

API password

LPZA_BASE_URL

no

Defaults to https://lawpracticeza.com/api

Copy .env.example to .env for local values. Never commit credentials.

Cloud Agent / CI secrets

For live verification in Cursor Cloud Agents, add these as environment secrets (not committed files):

Secret name

Value

LPZA_DATABASE

MS&B Inc firm code / database name

LPZA_LOGIN_CODE

Bookkeeper API user login code

LPZA_PASSWORD

API password

Once secrets are configured, run:

npm run verify:login

The script calls access.login and access.status and prints only non-sensitive fields (database name, login name). It exits non-zero when credentials are missing or login fails.

MCP tools

Bootstrap

Tool

Description

lpza_ping

Confirms the stdio process is alive; does not call LawPracticeZA

Session / lookups

Tool

LawPracticeZA API

Notes

lpza_status

access.status

Session logged-in state and login identity

lpza_firm_details

company.detail/only

Firm name, VAT flag, contact details

lpza_list_departments

department/list or listforselection

Optional for_selection: true

lpza_list_fee_earners

salesagent/list

Fee earners

lpza_list_posting_codes

product/list

Posting codes (products)

Clients / matters (read)

Tool

LawPracticeZA API

Notes

lpza_list_clients

customer/list

lpza_get_client

customer/detail/{customer_id}

Requires customer_id

lpza_list_matters

matter/list

lpza_get_matter

matter/detail/{matter_id}

Optional lookup: "" for raw FK IDs

Accounting reads

Tool

LawPracticeZA API

Notes

lpza_matter_balances

matter.balances/{matter_id}

Business, trust, investment balances

lpza_matter_statement

matter.statement2/{matter_id}

Optional customer_id, startdate, stopdate

lpza_matter_business_entries

matter.statement3/{matter_id}

Business ledger entries (invoice level)

Clients / matters / WIP (write)

Tool

API

Notes

lpza_create_client

customer.insert

Requires customer_name, customer_code, department_id

lpza_create_matter

matter.insert

Creates a matter under a client

lpza_update_matter

matter.detail + matter.update

Fetch-merge-full-update (not partial)

lpza_create_transfer

matterset.createtransfer

Buyer/seller matters for conveyancing

lpza_list_unbilled

matterdraftlineitem.childlist

WIP draft fees for a matter

lpza_upsert_draft_fee

matterdraftlineitem.upsert

Caller supplies unitprice / tax / trantotal

lpza_delete_draft_fee

matterdraftlineitem.quickdelete

Requires confirm: true

Errors

Read tools return JSON with isError: true when credentials are missing (credentials_missing) or LawPracticeZA returns HTTP 403 (LpzaAuthError), 406 (LpzaValidationError), or 500 (LpzaServerError). Write tools refuse without credentials or when confirm: true is missing on destructive actions.

Planned later: billing with confirm gates and lpza_api_call escape hatch.

Development

npm run typecheck
npm test
npm run verify:login   # requires LPZA_* env; see README

CI runs typecheck and tests on push and pull request to main.

HTTP client (src/lpza/)

Module

Role

client.ts

LpzaClient.call() — form-urlencoded POST to {base}/{object}/{method}/{positional…}

auth.ts

access.login, in-memory token, X-token header, access.status()

errors.ts

Typed errors for HTTP 200 / 403 / 406 / 500

types.ts

Schema types: customer, matter, matterdraftlineitem, product, etc.

Fixture tests in tests/lpza-client.test.ts, tests/read-tools.test.ts, and tests/write-tools.test.ts mock HTTP — no live credentials required.

Limits

  • Without env credentials, read and write tools refuse with a configuration error (no live session).

  • Trust/investment write operations are out of scope unless the official guide documents them. Do not invent them.

  • Do not hardcode VAT at 14% (2017 examples) or 15%. Callers supply amounts.

  • Remote / HTTP MCP hosting is out of scope for v1 (stdio only: Cursor, Claude Desktop).

License

GNU General Public License v3.0 only.

Available Tools

8 tools
lpza_create_clientB

Create a new client (debtor) via customer.insert. Requires customer_name, customer_code, and department_id.

ParametersJSON Schema
NameRequiredDescriptionDefault
telNo
cellNo
emailNo
tradingasNo
customer_codeYesUnique client code.
customer_nameYesDisplay name for the new client.
department_idYesDepartment ID for the client.
postaladdressNoPostal address lines.

TDQS

B3.4/5.0
Behavior3/5

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

No annotations are provided, so the description must convey behavior. It discloses the creation via 'customer.insert' and lists required fields, but does not mention side effects, uniqueness constraints, authentication needs, or error behavior. The core 'create' action is clear, but additional behavioral context is limited.

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 succinct with two sentences and gets straight to the point. However, the second sentence merely echoes the schema's required fields, making it slightly redundant, but overall it is tidy.

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 8 parameters, missing annotations, and no output schema, the description provides minimal context. It lacks explanations for the undocumented parameters and gives no sense of the return value or operational constraints, making it inadequate for an agent to fully understand the tool's scope.

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 50%, with four parameters (tel, cell, email, tradingas) lacking any description. The description does not elaborate on these parameters or add meaning beyond the schema's required-field note; it merely repeats the required fields that the schema already declares, so it fails to compensate for the coverage 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 uses the specific verb 'Create' with the resource 'client (debtor)' and explicitly names the underlying operation 'customer.insert'. This clearly distinguishes it from sibling creation tools like lpza_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 Guidelines3/5

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

The description states what the tool does and implies its use for creating clients, but it does not explicitly differentiate when to use this versus alternative create tools (e.g., lpza_create_matter) or mention any prerequisites or exclusions.

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

lpza_create_matterA

Create a new matter via matter.insert. Fees can only be posted to a matter.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateopenedNoDate opened (YYYY-MM-DD). Defaults to today if omitted.
customer_idYesClient ID the matter belongs to.
matter_codeYesUnique matter code.
matter_nameYesDisplay name for the matter.
department_idNo
owner_salesagent_idNoFee earner (salesagent) ID.

TDQS

A3.7/5.0
Behavior2/5

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

No annotations are provided, so the description must carry the behavioral burden. It only mentions a fee relationship, not side effects, permissions, uniqueness handling, or error behavior. For a mutating create 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.

Conciseness5/5

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

The description is only two sentences with no wasted words. It front-loads the purpose and adds relevant context about fees, making it concise and structured effectively.

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?

It is adequate for a simple create tool, but it lacks behavioral depth such as duplicate handling, required auth, or response details. With no output schema, return info is not required, but the description could still provide more context about preconditions.

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 83%, which qualifies as high, so the baseline is 3. The description adds no parameter-level details beyond what the schema already provides, but the schema is mostly self-explanatory.

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 'Create a new matter via matter.insert' with a specific verb and resource. It distinguishes itself from sibling tools like lpza_create_client and lpza_update_matter by focusing on matter creation.

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 second sentence, 'Fees can only be posted to a matter,' implies usage context: you need a matter before posting fees. However, it does not explicitly state when not to use this tool or mention alternative tools.

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

lpza_create_transferA

Create buyer and seller matters for a conveyancing transfer via matterset.createtransfer.

ParametersJSON Schema
NameRequiredDescriptionDefault
matterset_nameYesReference or ID for the whole transfer transaction.
buyer_customer_idYesExisting buyer client ID.
buyer_matter_codeYesMatter code for the buyer side.
buyer_matter_nameYesMatter name for the buyer side.
seller_customer_idYesExisting seller client ID.
seller_matter_codeYesMatter code for the seller side.
seller_matter_nameYesMatter name for the seller side.
buyer_owner_salesagent_idYesFee earner ID for the buyer matter.
seller_owner_salesagent_idYesFee earner ID for the seller matter.

TDQS

A3.6/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden. It only says 'create' without disclosing side effects, whether the operation is atomic, prerequisite requirements, or return values. For a mutation tool, this is a significant gap.

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, focused sentence that conveys purpose and method without unnecessary words. It is well-structured and front-loaded.

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 9 required parameters and no output schema or annotations, the description should explain the overall workflow, expected outcomes, or error handling. It only gives a bare statement of action, leaving the agent without enough context to anticipate behavior beyond parameter definitions.

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%, with each parameter having a basic description. The tool description adds little beyond referencing the underlying method. Baseline 3 is appropriate because the schema does the heavy lifting.

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 buyer and seller matters for a conveyancing transfer, using the specific 'matterset.createtransfer' operation. This distinguishes it from siblings like lpza_create_matter and lpza_create_client.

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 that this tool is for conveyancing transfers, implying when to use it. However, it does not explicitly mention alternatives or exclusions (e.g., when to use lpza_create_matter separately), so it stops short of a full 5.

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

lpza_delete_draft_feeA

Delete an unbilled draft fee or disbursement via matterdraftlineitem.quickdelete. Requires confirm: true.

ParametersJSON Schema
NameRequiredDescriptionDefault
srcidNoExternal srcid to delete by (alternative to uid).
confirmYesMust be true to delete the draft fee or disbursement.
matterdraftlineitem_uidNoDraft item UID to delete.

TDQS

A3.8/5.0
Behavior3/5

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

With no annotations, the description must carry the safety burden, and it does disclose that this is a deletion and requires confirm: true. It adds context that only unbilled draft items are affected, but it does not state whether deletion is permanent/irreversible or what authorization is required.

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 short sentences, with the key verb and object first. No filler; the implementation detail and guard are both meaningful.

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?

Although the core purpose and the confirm guard are present, the tool has three parameters and no output schema, and the schema only marks confirm as required, leaving ambiguous whether an identifier (srcid or matterdraftlineitem_uid) must also be supplied. The description does not clarify this or describe expected return/error behavior, which is a significant gap for a destructive 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 coverage is 100%, so the parameters are already named and described (srcid, confirm, matterdraftlineitem_uid). The description only repeats the confirm requirement and adds no new distinctions such as when to use srcid versus uid.

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 opens with 'Delete an unbilled draft fee or disbursement' — a specific verb and resource that clearly names the operation. This distinguishes it from sibling create/update/list tools, and the mention of 'matterdraftlineitem.quickdelete' identifies the exact mechanism.

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 phrase 'unbilled draft fee or disbursement' signals when the tool is appropriate and implicitly excludes billed items. It also warns that confirm: true is required, but it does not explicitly contrast with alternatives such as upsert_draft_fee or describe when a plain update is preferred.

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

lpza_list_unbilledA

List all unbilled (WIP) draft fees and disbursements for a matter via matterdraftlineitem.childlist.

ParametersJSON Schema
NameRequiredDescriptionDefault
lookupNoOptional lookup mode. Omit for raw IDs; set to include foreign name lookups.
matter_idYesMatter ID to list unbilled WIP items for.

TDQS

A3.7/5.0
Behavior3/5

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

With no annotations provided, the description carries the full burden of disclosing behavior. 'List' implicitly indicates a read-only operation, and the mention of the endpoint adds some technical context. However, it does not explicitly state that the operation is non-mutating, describe output format, or mention any potential side effects or prerequisites, leaving some transparency gaps.

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, well-structured sentence that front-loads the action and resource. It avoids unnecessary fluff and earns its place by clearly defining what the tool does.

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 low complexity (2 params, no output schema), the description is mostly sufficient but lacks some details that would help an agent: it does not describe the return structure, whether results are paginated, or how the 'lookup' parameter affects output beyond what the schema states. Without annotations or an output schema, a bit more context would be beneficial.

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 schema already provides 100% coverage of the two parameters ('lookup' and 'matter_id'), so the description does not need to add much. The description's mention of 'for a matter' aligns with the matter_id parameter but adds no new meaning beyond what the schema documents. Baseline of 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 clearly states the action (List), the resource (unbilled draft fees and disbursements), and the context (for a matter). It also mentions the underlying endpoint (matterdraftlineitem.childlist), making the purpose unambiguous and distinguishable from sibling tools like create/update/delete operations.

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 (to list unbilled WIP items for a matter) but does not explicitly state when to use this tool over alternatives or when not to use it. There are no references to sibling lookup tools or exclusions, so usage is only implied, not directly guided.

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

lpza_pingA

Confirm the LawPracticeZA MCP server process is running. Does not call the LawPracticeZA API. Live access is not available until credentials are configured.

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?

With no annotations, the description carries the full burden. It discloses that no API call is made and that live access is unavailable until credentials are configured. This gives the agent important context about the tool's non-invasive, connectivity-check nature.

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, no fluff, and the core purpose is front-loaded. 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, zero-parameter ping tool with no output schema, the description is complete: it states the purpose, what it doesn't do, and a prerequisite (credentials). No significant 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?

The tool takes zero parameters, so the description does not need to explain any. The baseline of 4 applies because there is nothing to add beyond the empty 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 uses a specific verb ('confirm') with a clear resource ('the LawPracticeZA MCP server process'), and it explicitly states what it does ('is running'). This differentiates it from sibling tools that handle clients, matters, and fees.

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?

It clearly states what the tool does not do ('Does not call the LawPracticeZA API') and provides a contextual caveat about credentials. However, it does not explicitly name alternative tools or say 'use this when you need to check connectivity,' which would make the guideline stronger.

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

lpza_update_matterA

Update an existing matter via matter.update. Fetches matter.detail with lookup="" first, merges changes, and POSTs every field (full record, not a partial patch).

ParametersJSON Schema
NameRequiredDescriptionDefault
faxNo
cellNo
emailNo
titleNo
addressNo
surnameNo
firstnameNo
matter_idYesMatter ID to update.
workphoneNo
dateopenedNo
customer_idNo
matter_codeNo
matter_nameNo
reservetrustNo
accountsemailNo
department_idNo
deadfilenumberNo
owner_salesagent_idNo

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations, the description discloses the non-obvious read-modify-write behavior (fetch, merge, POST all fields), which is critical for an agent to understand side effects. However, it doesn't mention error handling or what happens if the matter does not exist.

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, no fluff, front-loaded with the core action. Perfectly sized.

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 18 parameters and no output schema, the description covers behavior but not parameter specifics or expected return value. It also leaves the 'lookup' term unexplained, requiring external knowledge.

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 6% (matter_id). The tool description says it merges changes but provides no explanation of the 18 parameters, leaving the agent without meaning for fields like reservetrust or deadfilenumber.

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 updates an existing matter via matter.update, specifying both the action and resource. It distinguishes from sibling lpza_create_matter by focusing on update, and the phrase 'full record, not a partial patch' further clarifies its specific behavior.

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 describes the internal flow (fetches detail first, merges changes) and provides an important exclusion: this is not a partial patch. This helps the agent decide when to use it rather than a partial-update tool, though no explicit sibling alternatives are named.

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

lpza_upsert_draft_feeA

Insert or update an unbilled draft fee via matterdraftlineitem.upsert. Pass unitprice, tax, and trantotal as supplied — VAT is not calculated in this tool. Update by matterdraftlineitem_uid or srcid.

ParametersJSON Schema
NameRequiredDescriptionDefault
qtyNoQuantity. Defaults to 1.
taxYesVAT amount (caller-supplied; do not hardcode a rate).
dateNoTransaction date (YYYY-MM-DD).
srcidNoExternal unique ID for upsert-by-srcid.
minutesNo
matter_idYesMatter to post the fee to.
trantotalYesTransaction total including VAT (caller-supplied).
unitpriceYesUnit price excluding VAT (caller-supplied).
product_idYesPosting code (product) ID.
salesagent_idYesFee earner (salesagent) ID.
matterdraftlineitem_uidNoExisting draft item UID to update.
matterdraftlineitem_nameNoDescription of the fee or disbursement.

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It explains the upsert nature, explicitly warns that VAT is not calculated (a critical gotcha), and specifies the update keys. However, it does not describe side effects like what happens when neither update key is provided or how conflicts are resolved.

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 exactly two sentences, front-loaded with the core purpose, followed by the most critical usage caveat (VAT not calculated). Every word earns its place; there is no redundant or vague content.

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 tool with 12 parameters and no output schema, the description covers the core purpose, key operational details, and update mechanisms. The schema fills in most parameter definitions, and the added warning about VAT calculation is essential. It lacks explicit guidance on response format or conflict behavior, but overall it is adequate for this complexity level.

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 high (92%), so the baseline is 3. The description reinforces the semantics of unitprice, tax, and trantotal by emphasizing they are caller-supplied, but the schema already provides similar descriptions. It adds minimal new information beyond the schema, mostly highlighting the update keys.

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 action as 'Insert or update an unbilled draft fee' via a specific endpoint, which is a distinct verb and resource. It also distinguishes this from sibling tools like lpza_delete_draft_fee and lpza_list_unbilled by focusing on the upsert operation.

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 usage context by stating that unitprice, tax, and trantotal must be passed as supplied, and that VAT is not calculated. It also indicates update keys (matterdraftlineitem_uid or srcid), though it does not explicitly contrast with alternative tools, which is acceptable given the absence of a direct sibling for draft fee creation.

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. 8 tool updatesv0.1.0
    • First observedlpza_create_client
    • First observedlpza_create_matter
    • First observedlpza_create_transfer
    • First observedlpza_delete_draft_fee
    • First observedlpza_list_unbilled
    • First observedlpza_ping
    • First observedlpza_update_matter
    • First observedlpza_upsert_draft_fee

TDQS

A4/5.0
Disambiguation5/5

All eight tools have clearly distinct purposes: health check, client creation, matter creation/update, transfer creation, listing unbilled items, and upsert/delete of draft fees. No two tools could be confused, and the descriptions reinforce their specific roles.

Naming Consistency5/5

Every tool follows the consistent pattern 'lpza_' + verb + noun (e.g., create_client, update_matter, list_unbilled, delete_draft_fee). The verb-noun structure is uniform and predictable across the entire set.

Tool Count5/5

Eight tools is well within the ideal range for a focused domain server. Each tool covers a distinct operation needed for managing clients, matters, and unbilled fees without unnecessary redundancy or bloat.

Completeness4/5

The domain is well covered for core workflows: client creation, matter creation/update, transfer creation, and draft fee lifecycle (upsert/delete/list). Minor gaps include missing client read/update/delete, matter delete/list, and a dedicated matter get, but these can be worked around using existing tools (e.g., update_matter fetches detail).

Maintenance

ActivityMaintained
ResponsivenessNo issues

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

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/nate-raubenheimer/lawpracticeza-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server