mcp-bill-of-sale
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mcp-bill-of-saleCreate a bill of sale: 2015 Honda Civic, VIN 1HGCM82633A004352, to Jane Doe for $8,500."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
mcp-bill-of-sale
MCP server for a bill of sale generator: bills of sale for vehicles, equipment and stock with signature lines. Record a sale of equipment, a vehicle or stock and get a printable bill of sale with signature lines.
Works with Claude Desktop, Claude Code, Cursor and any Model Context Protocol client. Runs on your own machine, or hosted with no install.
Install
Hosted, nothing to install. Get a token from https://mcp.zovo.one/mcp/connect (the connect page) or https://mcp.zovo.one/mcp/token (the same token as JSON); a free anonymous one is issued on the spot and a Pro key works the same way. Then point an MCP client at https://mcp.zovo.one/mcp/bill-of-sale over streamable-http and send the token as Authorization: Bearer <token>.
If your client cannot set headers, put the token in the path instead: https://mcp.zovo.one/mcp/bill-of-sale/t/<token>. Both forms work. The bare URL with no token answers 401 on tools/call, so the token is not optional.
Claude Desktop, one click. Download bill-of-sale.mcpb from the latest release and double-click it.
From source. The mirror is self-contained: every @theluckystrike/* dependency is vendored, so a fresh clone builds with no extra setup.
git clone https://github.com/theluckystrike/mcp-bill-of-sale.git
cd mcp-bill-of-sale
npm install && npm run buildThen point your client at the built entry point:
{
"mcpServers": {
"bill-of-sale": {
"command": "node",
"args": ["/absolute/path/to/mcp-bill-of-sale/dist/index.js"]
}
}
}
@theluckystrike/mcp-bill-of-saleis not published on npm yet, so annpx -y @theluckystrike/mcp-bill-of-salecommand will fail. The three paths above are the working ones and each is exercised by CI.

Read-only mirror of mcp-servers/servers/bill-of-sale. See MIRROR.md.
Record a sale and get a signed-paper-ready bill of sale. Tell your assistant who sold, who bought, what the item is -- with the VIN, serial number or IMEI where it has one -- the price and the date, and the server writes the document: parties, item, price, an as-is clause for second-hand sales, any warranty in your own words, and signature lines for both sides. Work on it as a draft, finalize it into the frozen signing copy, and print it as Markdown or as a single self-contained HTML file that prints to PDF from any browser with no assets beside it. Everything stays on your machine; there is no account and no network call in this server at all.
Built by theluckystrike.
npm publish for @theluckystrike/mcp-bill-of-sale is pending, so npx -y @theluckystrike/mcp-bill-of-sale returns 404 today. Until then, a clone+build is the working path.
Related MCP server: signbee-mcp
Install
Claude Desktop
macOS ~/Library/Application Support/Claude/claude_desktop_config.json, Windows %APPDATA%\Claude\claude_desktop_config.json:
{
"mcpServers": {
"bill-of-sale": {
"command": "npx",
"args": ["-y", "@theluckystrike/mcp-bill-of-sale"]
}
}
}Claude Code
claude mcp add bill-of-sale -- npx -y @theluckystrike/mcp-bill-of-saleCursor
~/.cursor/mcp.json (global) or .cursor/mcp.json (project), same entry as Claude Desktop.
Tools
tool | what it does |
| Record a sale and generate the bill of sale: seller, buyer, item with VIN/serial/IMEI where it has one, price in minor units, date. Returns |
| Change anything on a draft before signing: price, parties, item details, identifiers, the as-is clause, warranty, notes. Empty string clears an optional field |
| Freeze the draft into the signing copy. From here |
| Every bill of sale, newest first: id, status, date, item, buyer, seller, price. Filter to drafts or finalized |
| One bill of sale in full by its BOS number |
| Delete a draft outright; a finalized document needs |
| Print the document: Markdown, a self-contained HTML file for print-to-PDF, or both, with signature lines. Drafts carry a DRAFT watermark so a review copy cannot be signed by mistake |
| The book at a glance: draft and finalized counts, total value per currency. Currencies are never added together |
| Free or Pro, and the key |
Free vs Pro
Free | Pro | |
Open drafts | 10 | Unlimited |
Finalized documents | 5 | Unlimited |
Render to Markdown and HTML ( | Unlimited | Unlimited |
Read, list and summarize ( | Unlimited | Unlimited |
Delete ( | Yes | Yes |
The document itself is never metered. Whether you hold a signed record of the sale is the question this server exists to answer, and a free tier that withholds the document is a demo. What is metered is the volume of records held: ten open drafts and five finalized documents is a real year of side-business sales, not a trial. sale_delete is free for the same reason the cap is on records held: a draft typed in twice would otherwise cost a slot with no way back but a key.
Get Pro: https://mcp.zovo.one/buy/bill-of-sale -- $19 one-time for this server, or $39 for the bundle.
How a sale flows
sale_createwith the facts. The seller defaults to the shared business profile's name when the profile has one, so the seller block is typed once for the whole suite.sale_renderprints the review copy, watermarked DRAFT.sale_updatefixes anything the buyer or seller spots.sale_finalizefreezes it.sale_rendernow prints the signing copy: sign the printed page or print the HTML to PDF, and both parties keep a copy.
Every amount is an integer number of minor units, a price is never a float, and dates are checked as real calendar dates. A VIN that is not 17 characters or an IMEI that is not 15 digits is stored as given but flagged in the response, because those are the two identifiers a buyer most often misreads.
Privacy
All data stays local, in ${XDG_DATA_HOME:-~/.local/share}/mcp-servers/bill-of-sale/. Two files: sales.json, counter.json, plus rendered documents under documents/. Nothing is sent anywhere, there is no account, no API key and no network call in this server at all. License keys are verified offline.
The rendered document is a generic template, not legal advice. Bills of sale for vehicles, boats and regulated goods may have statutory form or filing requirements where the sale happens.
Built by theluckystrike. https://github.com/theluckystrike
Available Tools
10 toolslicense_activateActivate licenseA
Activate a Pro key (MCPL1.xxx.yyy) from checkout: verified offline against a built-in public key, saved to your config file. A wrong, malformed or expired key is refused, unsaved. license_status reads it back.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | License key from the checkout confirmation page |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It discloses that verification happens offline against a built-in public key, that the key is persisted to the config file, and that invalid keys are refused and left unsaved. This is substantial transparency for an activation tool, though it could mention overwriting an existing key or the exact return behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler. The first sentence front-loads the main action, source, verification method, and persistence. The second sentence efficiently covers error handling and points to the related read-back tool. Every clause adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a single-parameter tool with no output schema and no annotations, the description covers activation behavior, verification mechanism, persistence, error outcomes, and how to read the result later. The only minor gap is an explicit statement of what the function returns upon success or failure, but the phrase 'refused, unsaved' implies a feedback mechanism. Overall, it is sufficiently complete for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents the 'key' parameter at 100% coverage, so the baseline is 3. The description adds meaningful semantics by giving the concrete key format ('MCPL1.xxx.yyy'), confirming the key comes from the checkout page, and explaining that malformed or expired keys will be rejected. This goes beyond the schema's one-line description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Activate a Pro key'), the exact key format ('MCPL1.xxx.yyy'), the source ('from checkout'), and the core mechanism ('verified offline against a built-in public key'). It also differentiates itself from the sibling license_status by noting that license_status reads the activation back, so there is no ambiguity about which tool does what.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context: use this when you have a Pro key from checkout that needs to be activated. It also points to license_status as the read-back tool, which implies when to use a related sibling. It does not explicitly spell out 'do not use for checking status' or list other alternatives, but the context is strong enough to avoid misuse.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
license_statusLicense statusA
Report this server's licence state: product, tier free or pro, licence id, expiry, the key source and the upgrade URL. No arguments, no network. Explains a free-tier refusal; license_activate installs a key.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are absent, so the description carries the full burden of behavioral disclosure. It discloses that the call is local ('no network') and argument-free, and it mentions a specific explanatory behavior. The word 'Report' implies read-only, though it does not explicitly state non-destructive or permission requirements; this is adequate for a status command.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The first sentence lists the output fields; the second adds constraints and the sibling pointer. Every clause contributes meaningful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter status tool with no output schema, the description lists the expected output fields, behavioral constraints, and the relevant alternative tool. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has zero parameters and the description reinforces this with 'No arguments'. It adds value by listing the reported fields, helping an agent understand what the empty input will yield. The baseline for zero-parameter tools is high, and the description meets it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Report'), a clear resource ('this server's licence state'), and enumerates the exact fields returned. It also names the sibling 'license_activate' as the tool that does something different, so an agent can distinguish them immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage constraints: no arguments, no network, and explains a free-tier refusal. It also directs the agent to license_activate when the task is to install a key, serving as an explicit pointer to the relevant alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sale_createRecord a saleA
Record a sale and generate the bill of sale: who sold, who bought, what item (with VIN, serial or IMEI where it has one), the price in minor units and the date. Returns the BOS-YYYY-NNNN number of the draft. The draft can still be changed with sale_update; sale_finalize freezes it into the signing copy and sale_render prints it. Free tier: 10 drafts.
| Name | Required | Description | Default |
|---|---|---|---|
| vin | No | Vehicle Identification Number, 17 characters, for a vehicle sale | |
| date | No | The date of the sale, YYYY-MM-DD. Default today | |
| imei | No | IMEI, 15 digits, for a phone or tablet | |
| as_is | No | Include the as-is clause: sold with all faults, no warranties except any written here. Default true, the norm for second-hand sales; pass false to leave it out | |
| notes | No | Anything else the document should say, e.g. payment method or what is included in the sale | |
| serial | No | Serial number, for equipment and electronics | |
| currency | Yes | ISO code the price is in | |
| quantity | No | How many units this document covers. Default 1 | |
| warranty | No | A warranty the seller does give, in their own words, e.g. The seller warrants the engine for 30 days from the sale date | |
| condition | No | The condition at handover, e.g. used, good working order, or new, sealed | |
| buyer_name | Yes | Who is buying, e.g. Jane Kowalska or Northwind Sp. z o.o. | |
| buyer_email | No | The buyer's email | |
| buyer_phone | No | The buyer's phone number | |
| price_minor | Yes | The sale price in whole minor units (integer cents). 120000 is USD 1,200.00 | |
| seller_name | No | Who is selling. Defaults to the shared business profile's name when the profile has one | |
| duplicate_ok | No | Record it even though an identical sale to the same buyer exists, for a genuinely repeated sale. Default false | |
| seller_email | No | The seller's email | |
| seller_phone | No | The seller's phone number | |
| buyer_address | No | The buyer's postal address, one string | |
| item_category | No | What kind of item, e.g. vehicle, equipment, electronics, stock | |
| seller_address | No | The seller's postal address, one string | |
| identifier_other | No | Any other identifying number, e.g. a hull number or an asset tag | |
| item_description | Yes | What was sold, specific enough to identify it, e.g. 2019 Honda Civic 1.5 petrol, grey, or MacBook Pro 14-inch 2021 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It discloses the return value (BOS-YYYY-NNNN), the mutable-draft state, and the free-tier quota, but says nothing about permissions, duplicate-detection errors (only the duplicate_ok param implies it), or what happens when the quota is exhausted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core action and output, then the sibling workflow, then the quota. No filler; every clause carries information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 23-parameter creation tool with no annotations and no output schema, the description supplies the return identifier, the lifecycle context, and the quota. It stops just short of describing failure modes such as duplicate rejection, though the schema's duplicate_ok parameter partly covers that.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with 23 well-documented properties, so the schema already does the heavy lifting. The description recaps the required concepts (who sold, who bought, item with VIN/serial/IMEI, price in minor units, date) but adds no syntax or format detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('record a sale'), then immediately scopes it as generating the bill of sale draft. It is clearly distinguishable from the sibling lifecycle tools it names.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent through the workflow: the draft created here can be changed with sale_update, frozen by sale_finalize, printed by sale_render. It also flags the free-tier limit of 10 drafts, which is a concrete when-to-call constraint.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sale_deleteDelete a bill of saleA
Delete a bill of sale by its BOS number. A draft goes outright. A finalized document needs confirm_finalized true, because it is the local copy of a record the buyer may hold. The BOS number is never reissued, so a gap in the series is the record that a document was deleted.
| Name | Required | Description | Default |
|---|---|---|---|
| sale | Yes | The bill of sale id, e.g. BOS-2026-0001 | |
| confirm_finalized | No | Required true to delete a finalized document. Default false |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses irreversibility, the gated path for finalized documents, and the non-reissuance of BOS numbers, so the agent understands the consequence of leaving a gap in the series. It omits permissions/auth requirements and any response behavior, but the substantive deletion semantics are covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the action and selector, then the conditional rule, then the lasting consequence. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an unannotated delete tool with no output schema, the description supplies the essential context: how to target the record, the confirmation gate, and irreversibility. Only auth/permission expectations and any error behavior are left unaddressed, which is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so a baseline of 3 would be defensible, but the description adds real meaning beyond the schema: it explains why confirm_finalized exists (the local copy may correspond to a record the buyer holds) rather than merely restating that it must be true for finalized documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence gives a specific verb (delete) and resource (bill of sale) with the key selector (BOS number), which cleanly separates it from siblings like sale_finalize, sale_get, or sale_update. An agent can route here without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the conditional branch that governs usage: drafts delete outright, finalized documents require confirm_finalized=true. It does not name alternative tools or explicitly state when not to delete, but the draft-vs-finalized rule is concrete operational guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sale_finalizeFinalize the bill of sale for signingA
Finalize a bill of sale so it is ready to sign: the document is frozen from this call on, sale_update refuses it, and every later render is the signing copy without the DRAFT watermark. Free tier: 5 finalized documents.
| Name | Required | Description | Default |
|---|---|---|---|
| sale | Yes | The bill of sale id, e.g. BOS-2026-0001 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so well: it discloses an irreversible state change (frozen from this call on), the downstream effect on sale_update (refuses the document), the effect on rendering (signing copy, no DRAFT watermark), and a concrete quota (free tier: 5 finalized documents). That is exactly the mutation, side-effect, and limit information an agent needs before calling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One tight sentence with a colon that front-loads the outcome (ready to sign) before the consequences, plus a short quota sentence. Every clause earns its place: freeze, sale_update refusal, render change, and tier limit.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter state-transition tool with no annotations and no output schema, the description covers the mutation, its irreversibility, downstream effects, and rate/quota limits. It could add whether the call is idempotent on an already-finalized document or the failure mode when the free-tier cap is hit, but nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter (sale) with 100% schema description coverage, including a format example (BOS-2026-0001). Per the calibration baseline, the schema does the heavy lifting here and the description adds no additional parameter meaning, so a 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Finalize) and resource (bill of sale) and immediately characterizes the resulting state: ready to sign. It also distinguishes itself from siblings by noting sale_update will refuse the document afterward and sale_render will emit the signing copy, so an agent can tell it apart from those tools without opening their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It makes the use context clear (once finalized the document is frozen and becomes the signing copy) and effectively rules out sale_update as a follow-up path. It stops short of an explicit when-to-use/when-not statement or naming an alternative for un-finalizing, but the implied usage is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sale_getRead one bill of saleA
Read one bill of sale in full by its BOS number: both parties, the item and its identifiers, price, terms, and whether it is still a draft or the finalized signing copy.
| Name | Required | Description | Default |
|---|---|---|---|
| sale | Yes | The bill of sale id, e.g. BOS-2026-0001 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description carries the burden. It usefully discloses that the record can be a draft or the finalized signing copy (state awareness). However, it says nothing about read-only nature, permission/authentication requirements, or behavior for an unknown/archived id.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. The key retrieval verb leads, followed by the identifier, then the returned fields. Nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-param read tool with no output schema, the description adequately telegraphs the returned fields and draft/finalized state. It is nearly complete but omits error/not-found behavior and access constraints, which would round it out.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter, and schema coverage is 100% with an example format (BOS-2026-0001). The description adds the semantic meaning of 'BOS number' and that it must be singular, but adds no format or validation detail beyond the schema. Baseline 3 fits.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Read) and resource (one bill of sale), identified by BOS number, and enumerates the full field set returned. It clearly distinguishes itself from siblings like sale_list (which lists many) and sale_summary (which presumably condenses).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'in full' implies this is the verbose/single-record retrieval path, and naming the BOS number as the key implies how to call it. But there is no explicit when-to-use/when-not guidance or named alternative (e.g., 'use sale_summary for a condensed view'). Usable but not routing-grade.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sale_listList bills of saleA
List every bill of sale, drafts and finalized, newest first: id, status, date, item, buyer, seller and price. Filter to drafts or finalized documents with status.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum rows, default 500 | |
| status | No | Which documents to list: all (default), draft, or final |
TDQS
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 does add real behavioral context — default result set includes drafts and finalized, ordering is newest-first, and the returned columns are enumerated — but it says nothing about permissions, pagination beyond the schema's limit, or how large result sets are handled.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the core action and scope, with the filter behavior second. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a list tool with no output schema, the description compensates well by enumerating the returned fields (id, status, date, item, buyer, seller, price). Only pagination/offset behavior and permission requirements are left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (limit, status) are already fully documented with an enum and default. The description restates the status filter behavior without adding syntax or semantics beyond the schema, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List), resource (bills of sale), and scope (drafts and finalized, newest first), plus the returned fields. An agent can distinguish this from sale_get or sale_summary without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The second sentence implies when the status filter is useful (to narrow to drafts or finalized), but there is no explicit when-to-use guidance relative to siblings like sale_get or sale_summary, and no exclusions stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sale_renderPrint the bill of saleA
Render a bill of sale as a clean printable document: Markdown, a self-contained HTML file ready for print-to-PDF, or both, with signature lines for seller and buyer. Drafts render with a DRAFT watermark so a review copy cannot be signed by mistake. Files default to the server's documents folder; pass out_path to choose. Free.
| Name | Required | Description | Default |
|---|---|---|---|
| sale | Yes | The bill of sale id, e.g. BOS-2026-0001 | |
| format | No | What to render: markdown, html, or both (default). The HTML is one self-contained file, no external assets | |
| out_path | No | Where to write. With format both this is a stem and .md / .html are appended. Default: the server's documents folder under the data directory | |
| overwrite | No | Replace an existing file at out_path. Default false: an occupied explicit path is refused, a derived one gets -2, -3, ... |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does well: it discloses that files are written to a default documents folder, that out_path overrides it, that drafts get a DRAFT watermark to prevent mis-signing, and that it costs nothing. It stops short of stating permission requirements, whether rendering a finalized sale is required, or the failure/error profile, and it leaves overwrite semantics entirely to the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and free of filler; the trailing one-word 'Free.' sentence earns its place as a cost signal. Slight redundancy with the schema's enum and default path keeps it short of a perfect score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, and the description compensates by describing the artefacts produced and their nature (self-contained HTML, signature lines) rather than the return payload. It is nearly complete for a simple render tool, though it does not say what the call returns (e.g., written file paths) on success.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all four parameters, and the baseline is 3. The description restates the format choices (markdown/html/both) and the default output location, adding context about DRAFT rendering but no syntax or constraints beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Render a bill of sale') plus the concrete artefacts produced (Markdown, self-contained HTML for print-to-PDF, or both). This is plainly distinguishable from the sibling CRUD tools (sale_create, sale_update, sale_finalize, sale_get, etc.) without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: the reader infers this is the output/print step, and the mention of the DRAFT watermark hints at the draft-vs-final lifecycle that sale_finalize governs. However, there is no explicit 'use this after sale_finalize' or 'do not use for X' guidance, so the routing decision is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sale_summarySummarize the sales bookA
Summarize the book: how many drafts and finalized documents, and the total sold value per currency, drafts separate from finalized. Currencies are never added together. Free.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose meaningful behavior: drafts are reported separately from finalized documents and currencies are never added together, which tells the agent exactly how the aggregation is scoped. It also flags that the call is free. It does not confirm read-only status or permission requirements, but for a no-parameter summary the key behavioral semantics are covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the core action and its outputs, with the two key aggregation rules attached immediately after. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must convey the return shape and it does: counts by state and totals per currency. It leaves minor questions open (e.g., whether deleted or archived sales are counted, what 'sold value' includes relative to discounts), but is complete enough to call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to clarify and the baseline of 4 applies. No hidden filtering inputs are implied.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (summarize) and resource (the sales book), then enumerates exactly what is computed: draft vs finalized document counts and total sold value per currency. This is clearly distinguishable from siblings like sale_list or sale_get, which retrieve records rather than aggregate them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description never says when to prefer this over sale_list or sale_get, nor any precondition for calling it. 'Free' hints that it is a cheap call, but that is a cost note, not usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sale_updateChange a bill of sale before signingA
Change anything on a bill of sale that is not finalized yet: price, buyer, seller, item details, identifiers, the as-is clause, warranty or notes. Pass an empty string to clear an optional field. A finalized document cannot be edited.
| Name | Required | Description | Default |
|---|---|---|---|
| vin | No | ||
| date | No | The date of the sale, YYYY-MM-DD | |
| imei | No | ||
| sale | Yes | The bill of sale id, e.g. BOS-2026-0001 | |
| as_is | No | ||
| notes | No | ||
| serial | No | ||
| currency | No | ||
| quantity | No | ||
| warranty | No | ||
| condition | No | ||
| buyer_name | No | Who is buying | |
| buyer_email | No | ||
| buyer_phone | No | ||
| price_minor | No | The sale price in whole minor units (integer cents) | |
| seller_name | No | Who is selling | |
| seller_email | No | ||
| seller_phone | No | ||
| buyer_address | No | ||
| item_category | No | ||
| seller_address | No | ||
| identifier_other | No | ||
| item_description | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It usefully discloses mutation semantics, the finalized-document restriction, and the empty-string clearing behavior, but omits permissions, side effects, and return behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly written sentences with no wasted words. The main action is front-loaded, followed by field examples, clearing semantics, and the finalized restriction.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 23-parameter mutation tool with no annotations, low schema coverage, and no output schema, the description is incomplete. It omits auth requirements, whether unspecified fields are preserved, failure behavior beyond finalization, and any response context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 22%, so the description must compensate. It groups updatable fields and adds the important empty-string clearing rule, but many parameters and their formats remain unexplained beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Change anything on a bill of sale') and scopes it to non-finalized documents. This clearly distinguishes it from siblings like sale_create and sale_finalize, which handle creation and finalization.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear condition for use ('not finalized yet') and an explicit when-not ('A finalized document cannot be edited'). It does not name alternative tools, but the usage boundary is unambiguous.
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.
10 tool updates
v0.21.0- First observed
license_activate - First observed
license_status - First observed
sale_create - First observed
sale_delete - First observed
sale_finalize - First observed
sale_get - First observed
sale_list - First observed
sale_render - First observed
sale_summary - First observed
sale_update
TDQS
Scored across 10 tools
Each tool has a distinct lifecycle or query role: create/update/finalize/render/list/get/delete/summary cover separate actions, while license_status and license_activate are clearly separated. No overlapping purposes or ambiguous boundaries are apparent.
All tools use snake_case with resource prefixes (sale_* and license_*), making the set predictable. The suffix choices are consistent enough for an agent to infer the target domain and action.
Ten tools is well-scoped for a bill-of-sale server with license management. Each tool earns its place, covering core document lifecycle plus necessary licensing checks.
The surface covers full lifecycle: create, read/list, update, finalize, render, delete, summarize, and license activation/status. No obvious gaps for the stated bill-of-sale domain.
Maintenance
Related MCP Connectors
Bills of sale for equipment, vehicles and stock: draft, finalize, print with signature lines.
101Draft UK vehicle sales invoices from supplied deal facts, with totals and a private review link.
Generate attorney-drafted NDAs, MSAs, DPAs, and more as PDF, ODT, or Markdown. No account required.
Turn a description into a shareable, editable PDF — invoices, certificates, reports, resumes.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables creation and management of invoices with JSON storage and LaTeX-based PDF rendering. Supports draft creation and professional PDF generation through customizable LaTeX templates.Apache 2.0
- AlicenseAqualityCmaintenanceDocument signing for AI agents. Send markdown or PDF for two-party e-signing with a single tool call — handles PDF generation, email verification, and SHA-256 certified delivery.2176MIT

Dokmatiq DocGenofficial
AlicenseAqualityCmaintenancePDF/DOCX/Excel generation from HTML/Markdown with stationery overlay, ZUGFeRD/XRechnung e-invoicing, digital signing, form filling, and AI receipt OCR with DATEV/SKR03 export.40MIT- AlicenseNot gradedqualityCmaintenanceBlockchain-anchored e-signatures. Create, send, negotiate, and verify legally binding agreements — every signature anchored to XRPL + Bitcoin with public verification. Agents can pay autonomously.MIT