goods-receipt
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., "@goods-receiptReceive 40 units, 2 damaged, for PO-2001"
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-goods-receipt
MCP server for goods receipt notes against purchase orders: units received, damaged and short, with a discrepancy report. The receiving record for purchase orders: what arrived, against which line, in what quantity and condition.
Works with Claude Desktop, Claude Code, Cursor and any Model Context Protocol client. Runs on your own machine, or hosted with no install.
Product page: https://mcp.zovo.one/s/goods-receipt — what it does, the tools it exposes, and a live token endpoint.
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/goods-receipt 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/goods-receipt/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 goods-receipt.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-goods-receipt.git
cd mcp-goods-receipt
npm install && npm run buildThen point your client at the built entry point:
{
"mcpServers": {
"goods-receipt": {
"command": "node",
"args": ["/absolute/path/to/mcp-goods-receipt/dist/index.js"]
}
}
}
@theluckystrike/mcp-goods-receiptis not published on npm yet, so annpx -y @theluckystrike/mcp-goods-receiptcommand will fail. The three paths above are the working ones and each is exercised by CI.

Read-only mirror of mcp-servers/servers/goods-receipt. See MIRROR.md.
In the official MCP Registry (io.github.theluckystrike/goods-receipt).
Purchase orders and the goods-receipt notes that receive them. A PO carries a reference, a supplier, and dated lines — sku, description, whole units ordered — plus whole-percent over/under tolerances that decide when a receipt is flagged. A GRN is raised against an open PO, one cell per line: units received, units damaged, and any shortage you already know about. Shortage is derived, not typed — ordered minus received, floored at zero — and shows up as a discrepancy the moment the numbers disagree.
Related MCP server: Supply Chain MCP Server
The one rule that decides everything else
Over-tolerance is checked against the cumulative total across every GRN raised on the line, not against each delivery in isolation.
Three deliveries of 40 against an order of 100 at 10% are allowed in ones and tens but the third delivery is refused, because 120 received of 100 ordered breaks the over tolerance even though no single delivery did. Partial deliveries are fine — several GRNs against the same PO is the normal case — and the cumulative rule is what stops them quietly over-receiving.
Two smaller rules follow from it:
Nothing derived is stored. Shortage and discrepancy are worked out on every call from the PO lines and the GRNs already recorded. Damage is the only thing typed in, because it is the only thing the warehouse actually sees.
Receiving past tolerance is refused, never clamped. Unless the extra units are declared damaged, a receipt that breaks the over tolerance writes nothing and says why. Damaged units still count for the tolerance check — "it arrived broken" is not a licence to order 100 and receive 130.
The tools
Tool | What it does |
| Create a purchase order: reference, supplier, dated lines, over/under tolerances |
| Receive goods against an open PO: received/damaged per line, shortage derived |
| Receive one more line onto an open GRN |
| GRNs newest first, filtered by PO or status |
| One GRN: every line with received, damaged, shortage and notes |
| Lines short, over, damaged, or closed with outstanding amounts |
| Close a GRN once the count is settled |
| Every PO: open lines, cumulative received, what is still outstanding |
| GRNs as CSV (Pro) |
| Which tier this install is on and where the key came from |
| Store a Pro key for this server |
Quick start
po_add { "reference": "ACME-1001", "supplier": "Acme Trading",
"lines": [ { "sku": "BRK-8", "description": "Bracket, steel", "ordered": 100 } ] }
grn_add { "po": "PO-0001",
"lines": [ { "line": "L01", "received": 60 } ] }
grn_add { "po": "PO-0001",
"lines": [ { "line": "L01", "received": 35, "damaged": 2 },
{ "line": "L01", "received": 10 } ] } // refused: 105 > 100 + 10%
grn_discrepancy {} // L01 is 5 short of 100Ids look like PO-0001 and GRN-0001; lines inside a PO are L01, L02, ….
Quick start
{ "tool": "po_add", "args": { "reference": "ACME-1005", "supplier": "Acme Trading",
"lines": [{ "sku": "BRK-01", "description": "Bracket, steel", "ordered": 10 }] } }
{ "tool": "grn_add", "args": { "po": "PO-0001", "lines": [{ "line": "L01", "received": 9, "damaged": 1 }] } }
{ "tool": "grn_discrepancy", "args": { "po": "PO-0001" } }A GRN that arrives past the over tolerance is refused; shortage is computed as ordered minus
received and shown as a discrepancy. grn_export_csv (Pro) writes the whole ledger out as CSV.
Free vs Pro
Free | Pro | |
Purchase orders | up to 2,000 | up to 2,000 |
GRNs | up to 5,000 | up to 5,000 |
Lines per PO / per GRN | up to 200 | up to 200 |
| yes | yes |
| no | yes |
The domain is capped estate-wide (2,000 POs, 5,000 GRNs, 200 lines) on every tier — these are hard rules so a store cannot grow past what the file format can hold, not a paywall. Pro unlocks CSV export for pushing receipts into a spreadsheet or an ERP.
Get Pro: https://mcp.zovo.one/buy/goods-receipt (one-time), or all servers for one price at https://mcp.zovo.one/buy/bundle
Privacy
All data stays local, in ${XDG_DATA_HOME:-~/.local/share}/mcp-servers/goods-receipt/, in
store.json (POs and GRNs) and counter.json (the PO- and GRN- series). There is no network
call anywhere in this server, no API key, and no account. The only file it reads that it does
not own is the shared business profile, and it never writes to it.
Built by theluckystrike. Support: support@zovo.one
Use these docs as an MCP server
Any MCP client (Claude, Cursor, Windsurf, VS Code) can read this repository's documentation directly via GitMCP — no install:
Docs MCP URL: https://gitmcp.io/theluckystrike/mcp-goods-receipt
Available Tools
11 toolsgrn_addReceive goods against a purchase orderA
Create a goods-receipt note (GRN) against an open purchase order. Give one cell per PO line: the whole units received and/or damaged. received is checked against the line's ordered quantity and the PO's over tolerance; receiving past the over tolerance is refused unless declared damaged. Shortage is recorded automatically (ordered minus received, floored at zero) and shown as a discrepancy. Partial deliveries are fine: raise several GRNs against the same PO. Free tier, full CRUD.
| Name | Required | Description | Default |
|---|---|---|---|
| po | Yes | Purchase-order id or reference, e.g. PO-0001 | |
| note | No | Memo for the whole GRN | |
| lines | Yes | Which PO lines you are receiving now | |
| carrier | No | Delivered by | |
| receivedAt | No | ISO date of physical receipt (default today) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations by explaining the over-tolerance check, refusal unless damaged, automatic shortage calculation with flooring at zero, discrepancy display, and partial-delivery behavior. It also states 'full CRUD,' clarifying the mutation profile. This adds substantial behavioral context that annotations alone do not provide.
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 moderately sized and front-loaded with the core action. Every sentence contributes useful behavior or constraints, though 'Free tier, full CRUD' is somewhat redundant with annotations and could be trimmed without losing essential invocation guidance.
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 5-parameter mutation tool with no output schema, the description covers the essential validation rules, partial-delivery behavior, and automatic shortage calculation. The main gap is that it does not describe the return value or confirmation response, which would help an agent verify the result of the call.
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 the schema already documents every parameter. The description adds meaningful semantics on top: received is checked against ordered quantity and over tolerance, shortage is auto-calculated as ordered minus received floored at zero, and each line gets one cell for received and/or damaged units. This clarifies the relationship between parameters beyond raw field descriptions.
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 opens with a specific verb and resource: 'Create a goods-receipt note (GRN) against an open purchase order.' It clearly distinguishes this from sibling tools by emphasizing creation of a GRN for receiving goods, not closing, listing, or adding lines to an existing GRN.
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 clear context for when to use the tool: receiving whole units against an open PO, with partial deliveries explicitly supported ('raise several GRNs against the same PO'). It does not explicitly name sibling alternatives or state when not to use it, but the usage context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
grn_closeClose a goods-receipt noteA
Close an open GRN. A closed GRN can no longer take lines, and its discrepancies are treated as resolved. Closing is free-tier and never mutates the PO.
| Name | Required | Description | Default |
|---|---|---|---|
| grn | Yes | Open GRN id, e.g. GRN-0001 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=false, destructiveHint=false, idempotentHint=false. The description adds meaningful behavioral context: a closed GRN can no longer take lines, discrepancies are treated as resolved, and closing never mutates the PO. This goes beyond the annotations and clarifies side effects. It doesn't mention reversibility or whether closing is permanent, but the provided details are valuable.
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, each earning its place: the action, the consequences, and the non-mutation guarantee. Front-loaded with the primary action. No wasted words.
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 single-parameter tool with no output schema, the description covers the action, side effects, and a key non-effect (PO not mutated). It doesn't state whether closing is reversible or what the response contains, but given the simplicity and the annotations, it is reasonably complete.
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 the 'grn' parameter as an open GRN id with an example. The description adds the context that the GRN must be open, which aligns with the schema's 'Open GRN id'. This is a baseline 3 because the schema carries the parameter documentation.
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 clearly states the action ('Close an open GRN') and the resource (GRN), and distinguishes it from siblings by specifying what closing means: no longer takes lines and discrepancies are treated as resolved. This differentiates it from grn_get, grn_list, grn_add, etc.
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 implies when to use it: when a GRN is open and needs to be closed. It also states what closing does (no more lines, discrepancies resolved), which helps an agent decide. It doesn't explicitly name alternatives or say when not to use it, but the context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
grn_discrepancyList discrepanciesA
List lines that are not as ordered: damaged units, a declared shortage, or received below the PO line's under tolerance. Optionally filter to one PO.
| Name | Required | Description | Default |
|---|---|---|---|
| po | No | Only discrepancies on this purchase order | |
| includeResolved | No | Include GRNs that are closed (resolved) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds useful domain context by defining what counts as a discrepancy and implies a read-only listing operation. But annotations do not provide a positive safety profile (readOnlyHint=false, destructiveHint=false), and the description doesn't clarify whether closed/resolved GRNs are excluded by default or whether listing has any side effects. There is no direct contradiction with 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences earn their place. The first defines purpose and criteria; the second covers the one optional filter. There is no filler, repetition, or unnecessary detail.
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 simple tool with zero required parameters and no nested objects, the description plus schema is nearly sufficient. The main gaps are the absence of an output schema and no explicit note about side effects or resolved-GRN behavior, but these are minor given the low complexity.
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 are already documented. The description only restates that the PO parameter is an optional filter and adds no new format, default, or interaction details 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 opens with a specific verb and resource: 'List lines that are not as ordered.' It then enumerates concrete discrepancy types (damaged units, declared shortage, under tolerance), which clearly differentiates this tool from siblings like grn_list and grn_get.
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 intended use is clear: surface receiving discrepancies rather than all GRNs. The optional PO filter is stated. However, it doesn't explicitly name sibling alternatives or give when-not-to-use guidance, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
grn_export_csvExport goods receipts as CSVARead-onlyIdempotent
Pro. Export every GRN (or just one PO's GRNs) as CSV with a header row: grn,po,po_reference,received_at,carrier,status,line,sku,received,damaged,shortage,damage_note,shortage_note. Watermark-free and not truncated.
| Name | Required | Description | Default |
|---|---|---|---|
| po | No | Export GRNs for one purchase order only |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, and non-destructive behavior, so the description adds meaningful context: 'Pro.' licensing, 'Watermark-free and not truncated' guarantees, and the exact output columns. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Packs purpose, scope, output shape, and behavioral guarantees into a few short clauses. The header-row listing earns its place because there is no output schema to document the return format.
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 simple one-parameter tool without an output schema, the description supplies the full CSV column list, scope, and non-truncation/watermark behavior. The only minor gap is explaining what 'Pro.' implies for licensing, though sibling license tools hint at it.
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% for the single optional po parameter, and the description reinforces its meaning with 'just one PO's GRNs'. The description does not add syntax or constraints beyond the schema, but none are necessary here.
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 the exact operation ('Export ... as CSV') and the exact scope ('every GRN or just one PO's GRNs'), and lists the full header row. This clearly distinguishes it from siblings like grn_list or grn_get.
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?
Provides clear context for when to use it: CSV export of all GRNs or filtered to one PO via the optional po parameter. It does not explicitly name alternatives or exclusions, but the scope and optional filter are sufficient for correct selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
grn_getGet one goods-receipt noteARead-onlyIdempotent
Get a single goods-receipt note by id, with its lines, damage and shortage per line.
| Name | Required | Description | Default |
|---|---|---|---|
| grn | Yes | GRN id, e.g. GRN-0001 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description states it returns lines, damage, and shortage per line, which is useful beyond the annotations. The annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, so the tool is safe. It doesn't mention pagination or other potential behaviors, but the constraints are well-covered by the description.
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 a single, concise sentence that front-loads the core purpose ('Get a single goods-receipt note by id') and adds essential details (lines, damage, shortage). No unnecessary words, ideal length.
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 simple read operation with one parameter and no output schema, the description is quite complete. It tells what will be returned. There's no mention of possible errors or edge cases, but those are not critical for a simple fetch. The annotations cover safety, and the schema covers parameters, so the description fills the remaining gap about the response content.
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 covers the parameter fully (100% coverage), providing description and example. The description adds the additional detail that the response will include lines and damage/shortage, which enhances understanding beyond the schema. The parameter itself is well-documented in the schema, so the description's contribution is modest but positive.
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 clearly states the tool's action: get a single goods-receipt note by id, and its scope. It mentions the included lines and damage/shortage details, which is specific and informative. It distinguishes this from sibling grn_list (which likely returns multiple) by specifying 'a single' and 'by id'.
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 implies the tool is for fetching an individual GRN, which is clear from context. It does not explicitly contrast with grn_list or other siblings, but the purpose is clear enough for an agent to infer when to use it. Lacks explicit '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.
grn_line_addAdd a line to an open GRNA
Add another PO line (or more units on a line already open on this GRN) to an existing open goods-receipt note. Useful when one delivery arrives in batches. The over-tolerance gate still applies to the PO line's cumulative received count across every GRN. Free tier, full CRUD.
| Name | Required | Description | Default |
|---|---|---|---|
| grn | Yes | Open GRN id, e.g. GRN-0001 | |
| line | Yes | PO line to receive, e.g. L01 | |
| damaged | No | Whole units received but damaged | |
| received | Yes | Whole units of good stock | |
| damageNote | No | What was damaged | |
| shortageNote | No | Why it is short |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are sparse (readOnlyHint false, etc.), so the description carries the behavioral burden. It adds valuable context: the over-tolerance gate applies to cumulative received counts across all GRNs, and it mentions the free tier and full CRUD. This goes beyond the schema and helps the agent understand side effects. However, it doesn't mention whether the operation is idempotent or what happens to existing data, but given the annotations, the provided context is above average.
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 concise: three sentences, no filler, and the key context (batch usefulness, over-tolerance) is front-loaded before the free tier note. Every sentence earns its place.
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 the tool's moderate complexity (6 params, 3 required) and rich annotations (though limited), the description covers the purpose, batch usage, and a key constraint (over-tolerance). It lacks explicit mention of return behavior, but there is no output schema, so it might be expected. Still, for an agent to call it, it is mostly complete.
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%, and the output schema is absent. The description does not add detail beyond what the schema provides for parameters, but with complete schema coverage, the baseline is 3. The description's focus is on the action, not on parameter specifics, which is acceptable.
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 clear action ('Add') and a resource ('line to an existing open GRN'), with a helpful qualification about adding units to an already-open line. It distinguishes the operation from general GRN creation (grn_add) but does not explicitly name sibling tools, so it's clear but lacks explicit sibling differentiation.
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 identifies the use case: handling batches of one delivery. It doesn't explicitly say when not to use it or name alternatives, but the phrase 'Useful when one delivery arrives in batches' provides clear context for when this tool is appropriate versus others like grn_add or grn_close.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
grn_listList goods-receipt notesARead-onlyIdempotent
List goods-receipt notes, newest first, optionally filtered to one purchase order.
| Name | Required | Description | Default |
|---|---|---|---|
| po | No | Only GRNs against this purchase order | |
| includeLines | No | Include line detail |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only, idempotent, and non-destructive behavior. The description adds useful behavioral context beyond annotations by specifying sort order ('newest first') and optional filtering, which are not derivable from the schema or annotations.
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 a single, front-loaded sentence with no wasted words. It conveys the core action, ordering, and optional filter in minimal space.
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 low-complexity read-only list tool with two optional parameters and complete schema description coverage, the description provides everything an agent needs to invoke it correctly. No output schema exists, but the list semantics are clear from the tool name and description.
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 parameters are fully documented in the input schema. The description restates the PO-filter concept but does not add new meaning beyond the schema, meeting the baseline for high schema coverage.
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—'List goods-receipt notes'—and adds a distinguishing ordering detail ('newest first') and an optional scope ('filtered to one purchase order'). This clearly separates it from siblings like grn_get or grn_status_report.
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 makes the intended use clear: list GRNs, with optional filtering by one PO. It does not explicitly name alternatives or exclusions, but the straightforward list/read semantics combined with sibling names give sufficient context for an agent to choose it appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
grn_status_reportGoods-receipt status reportA
Reconcile every purchase order against every GRN: open POs (not yet fully received), POs fully received within tolerance, POs with at least one discrepancy, and per-line open/short/damaged counts. Nothing is written.
| Name | Required | Description | Default |
|---|---|---|---|
| includeOnlyDiscrepancies | No | Only list POs with at least one discrepancy |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite annotations showing readOnlyHint=false, the description explicitly states 'Nothing is written,' which is valuable behavioral disclosure beyond the structured metadata. It also describes what gets computed and what report sections will appear, giving an agent a faithful model of the operation.
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 a single dense sentence that front-loads the core action and expected output categories, followed by a one-sentence safety note. Every word contributes meaning and there is no padding.
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?
The description explains the scope, the output categories, and the side-effect profile, and the input schema covers the only parameter. With no output schema, it would be even stronger if it described the exact return format, but the listed categories give an agent enough context to invoke 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?
Schema description coverage is 100% and the single boolean parameter includeOnlyDiscrepancies is already clearly described in the schema. The tool description itself adds no extra parameter detail, so the baseline score of 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?
The description uses a specific verb ('Reconcile') with a clear resource scope ('every purchase order against every GRN') and enumerates the report's categories, so an agent can distinguish this from sibling tools like grn_list or grn_discrepancy. It is concrete and informative rather than a restatement of the title.
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 makes clear this is a read-only reconciliation/status tool that compares POs and GRNs, which gives strong context for when to invoke it. It does not explicitly name alternatives or exclusions, but the broad scope and report categories make the intended use clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
license_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.
po_addAdd a purchase orderA
Create a purchase order to receive goods against. Lines carry a sku, a description and an ordered whole-unit quantity. Over/under tolerances are whole percentages allowed above/below ordered before a GRN is flagged. Ids look like PO-0001. Free tier, full CRUD.
| Name | Required | Description | Default |
|---|---|---|---|
| lines | Yes | Lines on this purchase order | |
| supplier | Yes | Who you ordered from | |
| reference | Yes | Your own purchase-order number | |
| overTolerancePct | No | Whole % extra allowed above ordered (default 10) | |
| underTolerancePct | No | Whole % short allowed below ordered (default 10) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With all annotations false, the description carries the burden of explaining behavior. It adds meaningful context: tolerances are percentages allowed before a GRN is flagged, line quantities are whole units, and IDs follow a PO-0001 pattern. It does not cover response shape or auth, but the annotations already flag non-readonly, non-idempotent 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?
Four short sentences each carry distinct information: purpose, line structure, tolerance semantics, and ID/plan context. There is no filler, repetition of schema defaults, or unnecessary detail.
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?
The description covers the business role, line constraints, tolerance meaning, and ID format, which is strong for a create tool. However, with no output schema it never states what a successful call returns, and the relationship between the user-supplied 'reference' and generated 'PO-0001' IDs is left ambiguous.
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 the baseline is 3. The description adds value beyond the schema by explaining that tolerance percentages govern when a GRN is flagged and that ordered quantities are whole units. It does not elaborate on reference or supplier, but the schema already documents those fields.
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 opens with a specific verb and resource, 'Create a purchase order,' and frames the PO as the document goods are received against. It adds concrete details about lines, tolerances, and ID format, making the tool's purpose unmistakable and clearly distinct from the GRN and license siblings.
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 by positioning the PO as the upstream document for GRN flagging, so an agent can infer when to create one. However, it never explicitly names alternatives like grn_add or states when not to use this tool, leaving usage to be inferred from sibling names and workflow framing.
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.
11 tool updates
v0.22.0- First observed
grn_add - First observed
grn_close - First observed
grn_discrepancy - First observed
grn_export_csv - First observed
grn_get - First observed
grn_line_add - First observed
grn_list - First observed
grn_status_report - First observed
license_activate - First observed
license_status - First observed
po_add
TDQS
Scored across 11 tools
Each tool targets a distinct action and resource: PO creation, GRN creation, line addition, GRN retrieval/listing/export/close, discrepancy and status reporting, and license management. The two report tools are cleanly separated by aggregation level, so an agent can tell them apart.
Most tools follow a readable snake_case pattern with prefixes like grn_, po_, and license_. A few names such as grn_discrepancy and license_status are noun phrases rather than verb phrases, but the overall convention is consistent enough to be predictable.
Eleven tools is a well-scoped number for a goods-receipt server covering PO creation, GRN lifecycle, reporting, export, and licensing. No tool feels redundant, and the set is neither bloated nor too thin.
The receiving workflow is covered, but the surface has significant lifecycle gaps: POs can only be created and never listed, updated, or deleted, and GRNs/lines cannot be corrected or removed once added. These gaps can strand agents when an entry is wrong or a PO needs adjustment.
Maintenance
Related MCP Connectors
Goods receipt notes vs purchase orders: tolerances, damaged/short units, CSV export.
Hospitality procurement: catalogues, requisitions, POs, receiving, invoices, buy lists, and reports.
Onboarding and inspection goods-receipts you reuse: dated runs, who ticked what, and a sign-off.
Receipt extraction, invoice-to-PO quantity allocation, and free three-document discrepancy checks.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceDemonstrates a SAP Goods Receipt workflow, enabling AI Agents to interact with production orders and post goods receipts to SAP.-
- FlicenseNot gradedqualityCmaintenanceEnables supply chain management tasks such as tracking shipments, managing inventory, and supplier scorecards through MCP protocol.19 PyPI-
- FlicenseNot gradedqualityBmaintenanceEnables AI-powered warehouse inventory management through MCP, with tools to search products, check stock levels, receive and issue stock, and add products under human-in-the-loop confirmation.-
- AlicenseAqualityAmaintenanceEnables creating and managing packing slips for shipments, tracking cartons, contents, weights, chargeable weight, and shortfalls, with reports and packing slip generation.14MIT