Skip to main content
Glama
lycheejello

acu-mcp

by lycheejello

acu-mcp (archived — migrated to tuxton-platform)

This TypeScript project has been ported to Python and moved into the tuxton-platform monorepo as apps/acu_mcp/.

New home: /home/huyson/develop/tuxton-platform/apps/acu_mcp/

The port reuses the shared packages/tuxton_acumatica/ client (OAuth2 + entity REST + OData v3) so acu_etl and acu_mcp can evolve together. OData v4 tools were dropped from the initial port because the /ODataV4/ route is currently 406ing at the IIS layer regardless of client — the underlying helpers still exist in tuxton_acumatica and can be re-wired as tools when the server-side issue clears.

This directory is kept in place for historical reference but should not receive new work. Any new Acumatica REST integration goes into apps/acu_mcp/ or packages/tuxton_acumatica/.


An MCP (Model Context Protocol) server that connects Claude to Acumatica ERP for read-only analytics queries.

Tools

Tool

Description

query_sales_orders

List and filter sales orders with OData expressions

get_sales_order

Get a single order with full line item detail

list_inventory_items

List stock items filtered by class, status, etc.

get_inventory_item

Get a specific item with warehouse stock quantities

query_shipments

List and filter shipments

get_shipment

Get a single shipment with line detail

query_invoices

List and filter AR invoices

get_invoice

Get a single invoice with line detail

query_purchase_orders

List and filter purchase orders

get_purchase_order

Get a single purchase order with line detail

query_customers

List and filter customers

get_customer

Get a single customer with contacts and addresses

list_odata_entities

Discover all available Generic Inquiry entity sets via OData

query_odata

Query any Generic Inquiry by name with OData filter, select, orderby, top, skip

Related MCP server: Acumatica MCP Server

Prerequisites

Installation

git clone git@github.com:lycheejello/acu-mcp.git
cd acu-mcp
npm install
npm run build

Configuration

Copy the example env file and fill in your values:

cp .env.example .env
ACU_BASE_URL=https://yourinstance.acumatica.com/YourTenant
# OData URL is derived automatically: {ACU_BASE_URL}/odata/{ACU_COMPANY}
ACU_USERNAME=mcp-user
ACU_PASSWORD=your_password
ACU_COMPANY=YourCompanyLoginName
ACU_ENDPOINT=Default
ACU_VERSION=25.200.001
# Required for OData access (see Acumatica Setup below)
ACU_CLIENT_ID=your_client_id@YourCompanyLoginName
ACU_CLIENT_SECRET=your_client_secret

Warning: Use a dedicated service account (e.g. mcp-user). Do NOT use your personal Acumatica login.

Claude Integration

Claude Code (CLI)

Run once to register the server globally:

claude mcp add --scope user acumatica \
  -e ACU_BASE_URL=https://yourinstance.acumatica.com/YourTenant \
  -e ACU_USERNAME=mcp-user \
  -e ACU_PASSWORD=your_password \
  -e ACU_COMPANY=YourCompanyLoginName \
  -e ACU_ENDPOINT=Default \
  -e ACU_VERSION=25.200.001 \
  -e ACU_CLIENT_ID=your_client_id@YourCompanyLoginName \
  -e ACU_CLIENT_SECRET=your_client_secret \
  -- node /absolute/path/to/acu-mcp/dist/index.js

Restart Claude Code after running this command.

Claude Desktop — macOS

Edit ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "acumatica": {
      "command": "node",
      "args": ["/absolute/path/to/acu-mcp/dist/index.js"],
      "env": {
        "ACU_BASE_URL": "https://yourinstance.acumatica.com/YourTenant",
        "ACU_USERNAME": "mcp-user",
        "ACU_PASSWORD": "your_password",
        "ACU_COMPANY": "YourCompanyLoginName",
        "ACU_ENDPOINT": "Default",
        "ACU_VERSION": "25.200.001",
        "ACU_CLIENT_ID": "your_client_id@YourCompanyLoginName",
        "ACU_CLIENT_SECRET": "your_client_secret"
      }
    }
  }
}

Claude Desktop — Windows

Edit %APPDATA%\Claude\claude_desktop_config.json with the same structure, using a Windows path:

"args": ["C:\\absolute\\path\\to\\acu-mcp\\dist\\index.js"]

Restart Claude Desktop after saving.

Verify

After restarting, ask Claude:

"Show me the last 5 open sales orders"

Claude should call query_sales_orders and return live data.

Acumatica Setup

Connected Applications (required for OData)

OData access requires a Connected Application registered in Acumatica. Create one per integration (e.g. one for this MCP server, one for Azure Functions) so credentials can be managed and revoked independently.

In SM301000 (Connected Applications):

  1. Click + to add a new application

  2. Set Client Name (display name only, e.g. TuxtonTools MCP or TuxtonTools ETL)

  3. Leave Client ID blank to let Acumatica generate one, or set a custom value

  4. Set Flow to Resource Owner Password — this is the grant type used by the code

  5. Save

  6. On the Shared Secrets tab, click +, enter a Description (e.g. acu-mcp-prod), and click Generate Secret — copy the secret password immediately, it will not be shown again

  7. Note the Client ID and the generated Shared Secret password — use these as ACU_CLIENT_ID and ACU_CLIENT_SECRET

Note: Create separate Connected Applications for each integration. This allows independent credential rotation and audit trails.

Service Account

In SM201010 (Users), create a dedicated service account:

  1. Set Login Name (e.g. mcp-user) and a strong password

  2. Enable the Web Service Access checkbox

  3. On the Roles tab, assign read-only viewer roles for each module (Sales Orders, Inventory, AR, AP, etc.)

  4. Set Max Number of API Logins to at least 5 to allow concurrent sessions during development

Development

npm run dev    # run with tsx (no build step)
npm run build  # compile TypeScript → dist/
npm start      # run compiled output

Adding a New Entity

  1. Create src/tools/{entity}.ts and export a register{Entity}Tools(server: McpServer) function

  2. Call it from src/tools/index.ts

  3. No other changes needed

Roadmap

See PLAN.md for the full architecture and phased development plan.

Phase 1 (complete): Core server with 12 REST tools across Sales Orders, Inventory, Shipments, Invoices, Purchase Orders, and Customers. Phase 2 (in progress): OData/GI passthrough done (list_odata_entities + query_odata); GL balance tools and MCP Resources/Prompts still pending. Phase 3: OAuth 2.0, HTTP/SSE transport, production hardening.

Available Tools

16 tools
get_customerA

Get a specific Acumatica customer with full detail including billing, shipping, and credit info.

ParametersJSON Schema
NameRequiredDescriptionDefault
selectNoComma-separated fields to return, e.g. "CustomerID,CustomerName,CreditLimit,Balance". Omit for all fields.
customerIDYesCustomer ID, e.g. '10001'

TDQS

A3.8/5.0
Behavior3/5

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

With no annotations, the description must reveal behavior on its own. It conveys that the operation is a read and includes billing/shipping/credit details, but it does not mention the select parameter's effect, payload size, access permissions, or error behavior. It adds some value but is not fully transparent.

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

Conciseness5/5

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

The description is a single, well-structured sentence that immediately states the action and target, with no filler or redundant information. It earns its place entirely.

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

Completeness4/5

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

For a low-complexity tool with only two parameters and no output schema, the description adequately conveys the core purpose and the kind of information returned. It could mention how the select parameter shapes the response or specify error behavior, but these are optional for a simple get-by-ID operation.

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

Parameters3/5

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

The input schema already documents both parameters fully (e.g., customerID example and select's comma-separated format). The description adds no additional parameter-level semantics beyond implying 'full detail' when select is omitted, so the baseline 3 applies.

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

Purpose5/5

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

The description clearly identifies the tool as retrieving a specific Acumatica customer with full detail (billing, shipping, credit info). The verb 'Get' and the resource 'specific customer' distinguish it from the list-oriented query_customers sibling, so the purpose is unambiguous.

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

Usage Guidelines3/5

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

The word 'specific' implies the tool is for individual customer lookups rather than bulk queries, but no explicit comparison to query_customers or other alternatives is given. It provides context but leaves exclusions and alternatives to the user's inference.

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

get_inventory_itemA

Get a specific Acumatica inventory item with warehouse stock quantities.

ParametersJSON Schema
NameRequiredDescriptionDefault
inventoryIDYesInventory item ID / item code

TDQS

A3.8/5.0
Behavior3/5

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

With no annotations, the description carries the burden. It discloses that the tool returns warehouse stock quantities, which is useful. However, it does not mention failure modes (e.g., not found), access permissions, or whether the item might be a non-stock item. This is minimal but acceptable for a simple read operation.

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

Conciseness5/5

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

A single clear sentence with no filler. It front-loads the action and resource, and every word adds value.

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

Completeness4/5

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

For a tool with one parameter, this description is fairly complete: it states what is returned (item with warehouse stock quantities). It lacks explicit alternates or edge-case behavior, but given the simplicity, the coverage is good. An output schema does not exist, so the description provides the only return info.

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

Parameters3/5

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

Schema coverage is 100%: the schema already documents inventoryID as 'Inventory item ID / item code'. The description adds no further parameter semantics, so the baseline of 3 applies.

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

Purpose5/5

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

The description uses a specific verb ('Get') with a precise resource ('specific Acumatica inventory item') and adds a key detail (warehouse stock quantities). This clearly distinguishes it from siblings like list_inventory_items, which would fetch multiple items, and other get_* tools.

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

Usage Guidelines3/5

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

The description implies use when you need a single, specific inventory item because it says 'specific' and the schema requires an inventoryID. However, it does not explicitly state when to prefer this over list_inventory_items or any other alternative, nor does it mention any prerequisites or exclusions.

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

get_invoiceB

Get a single Acumatica sales invoice with full line item detail.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeYesInvoice type, e.g. 'Invoice', 'Credit Memo', 'Debit Memo'
selectNoComma-separated header fields to return, e.g. "ReferenceNbr,Status,Amount,Customer". Omit for all fields.
referenceNbrYesReference number, e.g. 'AR000001'

TDQS

B3.4/5.0
Behavior3/5

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

With no annotations, the description carries the full burden for behavioral disclosure. It does indicate this is a read operation ('Get') and that the response includes full line item detail, which is useful. However, it does not mention error handling, authentication requirements, or what happens when the invoice is not found, so it is only minimally transparent.

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

Conciseness5/5

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

The description is a single, focused sentence with no extraneous words. It front-loads the key action and resource, and every word contributes to understanding the tool's purpose. This is exemplary conciseness.

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

Completeness2/5

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

The description is too sparse for the tool's context. With no annotations, no output schema, and no mention of how this relates to sibling tools like query_invoices, the agent is left without guidance on when to reach for this tool versus alternatives. While the schema covers parameters, the description does not provide enough operational context (e.g., response shape, error behavior, or why to choose this over query_invoices) to be considered complete.

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

Parameters3/5

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

Schema description coverage is 100%, so all parameters (type, select, referenceNbr) are already well-documented in the schema. The description adds no additional parameter-specific meaning beyond implying that the default response includes line items. This matches the baseline of 3 for high schema coverage.

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

Purpose5/5

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

The description clearly states the verb 'Get' with a specific resource 'a single Acumatica sales invoice' and adds the detail 'with full line item detail,' which distinguishes it from listing tools like query_invoices and other getters like get_shipment. This is a specific and unambiguous purpose.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives such as query_invoices (for querying multiple invoices) or get_shipment. There is no 'when to use' or 'when not to use' context, leaving the agent to infer usage solely from the name and schema.

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

get_purchase_orderA

Get a single Acumatica purchase order with full line item detail.

ParametersJSON Schema
NameRequiredDescriptionDefault
selectNoComma-separated header fields to return, e.g. "OrderNbr,Status,VendorID,OrderTotal". Omit for all fields.
orderNbrYesOrder number, e.g. 'PO000001'
orderTypeYesOrder type, e.g. 'Normal', 'Drop Ship'

TDQS

A3.8/5.0
Behavior3/5

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

With no annotations provided, the description carries the full burden. It discloses a key behavioral trait (returns full line item detail), which is useful context beyond the tool name. However, it does not mention any other behavior such as error handling, access requirements, or response structure, which is a notable gap for a tool without an output schema.

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

Conciseness5/5

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

The description is a single, front-loaded sentence with no filler. It efficiently communicates the tool's core purpose and differentiator without wasting words.

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

Completeness4/5

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

For a simple get operation, the description provides sufficient context: it identifies the entity type, indicates singular retrieval, and mentions that full line item details are included. While there is no output schema, the description partially covers what is returned. It is not exhaustive, but it is adequate for this tool's complexity.

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

Parameters3/5

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

The input schema already describes all three parameters with 100% coverage, so the description is not required to add parameter details. The description does not reference parameters at all, but the baseline of 3 applies because the schema handles the heavy lifting.

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

Purpose5/5

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

The description uses a specific verb ('Get') with a clear resource ('a single Acumatica purchase order') and adds distinguishing detail ('with full line item detail'). This effectively differentiates it from sibling tools like query_purchase_orders (which implies listing/filtering) and get_sales_order or get_shipment (which are for different entities).

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

Usage Guidelines3/5

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

The description implies usage for retrieving one specific purchase order (as opposed to querying multiple), but it does not explicitly state when to use this over alternatives like query_purchase_orders. It provides context but no exclusions or direct alternative references, so it earns a 3 for implied usage.

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

get_sales_orderA

Get a single Acumatica sales order with full line item detail. Use this when you need line-level data for a specific known order.

ParametersJSON Schema
NameRequiredDescriptionDefault
selectNoComma-separated header fields to return, e.g. "OrderNbr,CustomerID,OrderTotal,Status". Omit for all fields.
orderNbrYesOrder number, e.g. '000001'
orderTypeYesOrder type code, e.g. 'SO', 'QT', 'IN'

TDQS

A4/5.0
Behavior3/5

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

No annotations are provided, so the description must convey behavior. It implies a non-mutating read operation ('Get') and promises 'full line item detail,' which is useful. However, it does not disclose error handling, required permissions, or response format nuances, leaving gaps.

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

Conciseness5/5

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

Two sentences, front-loaded with the primary purpose and usage condition. Every word earns its place with no redundancy.

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

Completeness4/5

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

For a simple retrieval tool, the description covers the essential 'what' and 'when.' However, it does not mention the optional 'select' parameter's behavior or describe the return structure in more detail, and since there is no output schema, a bit more would improve completeness.

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

Parameters3/5

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

The input schema has 100% description coverage, with clear descriptions for all three parameters. The tool description adds no parameter-specific semantics beyond what the schema already provides, 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.

Purpose5/5

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

The description clearly states the action ('Get a single Acumatica sales order') and distinguishes it from sibling tools like query_sales_orders by emphasizing 'full line item detail' and 'specific known order'. This is a specific verb+resource with clear scope.

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

Usage Guidelines4/5

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

It provides explicit guidance: 'Use this when you need line-level data for a specific known order.' This tells the user when to choose this tool, though it does not explicitly name alternatives or state when not to use it.

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

get_shipmentA

Get a single Acumatica shipment with full line item detail.

ParametersJSON Schema
NameRequiredDescriptionDefault
selectNoComma-separated header fields to return, e.g. "ShipmentNbr,Status,ShipmentDate,CustomerID". Omit for all fields.
shipmentNbrYesShipment number, e.g. '000001'

TDQS

A3.8/5.0
Behavior3/5

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

With no annotations provided, the description carries the full burden. It discloses that the tool returns full line item detail, which is useful. However, it does not mention error behavior, permissions, or any side effects, though as a 'get' tool, read-only is implied. More detail on response shape or edge cases would improve transparency.

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

Conciseness5/5

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

The description is a single, concise sentence that immediately states the tool's purpose and key distinction (line item detail). No filler or redundancy, earning a top score.

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

Completeness4/5

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

For a simple get tool with 2 parameters and no output schema, the description covers what it does and its key return detail. It lacks explicit usage alternatives, but overall it is sufficiently complete given the tool's simplicity. Not perfect, but above average.

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

Parameters3/5

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

Schema description coverage is 100%, with both 'select' and 'shipmentNbr' clearly described. The description adds no additional parameter meaning; 'full line item detail' complements the schema's 'header fields' for select but doesn't exceed it. Baseline 3 is appropriate.

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

Purpose5/5

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

The description 'Get a single Acumatica shipment with full line item detail' clearly states the verb (get), resource (Acumatica shipment), and scope (single, with full line item detail). This distinguishes it from sibling tools like query_shipments, which likely list multiple shipments, and other get/query tools for different resources.

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

Usage Guidelines3/5

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

The description implies usage for retrieving one specific shipment's details, contrasting with query_shipments for listing shipments. However, it does not explicitly name alternatives or state when not to use the tool, leaving the agent to infer context from sibling names.

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

list_inventory_itemsA

List Acumatica stock/inventory items. Supports OData filtering. Use this to explore inventory, find items by class or status, or get item lists.

ParametersJSON Schema
NameRequiredDescriptionDefault
topNoMax records to return (default 50, max 500)
skipNoRecords to skip for pagination
filterNoOData $filter expression. Examples: "ItemStatus eq 'Active'", "ItemClass eq 'FINISHED'"

TDQS

A4/5.0
Behavior3/5

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

With no annotations provided, the description carries the full burden. It notes OData filtering support and listing items, but does not explicitly state that the operation is read-only or disclose any rate limits or side effects. The read-only nature is strongly implied but not confirmed.

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

Conciseness5/5

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

The description is concise and front-loaded, stating the tool's purpose in the first sentence. The second sentence adds practical usage guidance without unnecessary detail. Every word earns its place.

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

Completeness4/5

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

Given the tool's simplicity (3 optional parameters, no nested objects, no output schema), the description adequately covers the main purpose and use cases. It could mention pagination limits, but these are already documented in the schema, so the description is sufficiently complete.

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

Parameters3/5

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

The input schema already provides 100% coverage of parameters with detailed descriptions and examples. The description adds minimal extra meaning beyond mentioning OData filtering and use cases, which is already partially covered in the schema.

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

Purpose5/5

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

The description clearly states 'List Acumatica stock/inventory items' with a specific verb and resource. It distinguishes from the sibling tool 'get_inventory_item' by focusing on listing multiple items and exploring inventory.

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

Usage Guidelines4/5

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

The description provides context for use: 'Use this to explore inventory, find items by class or status, or get item lists.' This clearly implies a read-only listing scenario, though it does not explicitly mention alternatives like using 'get_inventory_item' for a single item.

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

list_odata_entitiesA

List all available OData entity sets (Generic Inquiries) exposed by Acumatica. Call this first to discover valid entity names before using query_odata.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior3/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It communicates that this is a read-only listing operation and adds the clarifying parenthetical '(Generic Inquiries)', but it does not describe output format, pagination, or other behavioral details. This is adequate for a simple listing tool but leaves some ambiguity.

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

Conciseness5/5

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

The description is two sentences, with the main action front-loaded in the first sentence and the usage guidance in the second. Every sentence adds value, and there is no redundancy or filler.

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

Completeness5/5

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

Given the tool's simplicity (no parameters, no output schema), the description fully covers what the tool does, why it exists, and how it integrates with the broader tool set. It is complete for the tool's purpose.

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

Parameters4/5

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

The tool has zero parameters, so the schema is fully covered (vacuously). The baseline for 0-parameter tools is 4, and the description does not need to explain any parameters. No additional parameter semantics are required.

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

Purpose5/5

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

The description clearly states the tool lists all OData entity sets (Generic Inquiries) exposed by Acumatica, using a specific verb ('list') and resource ('OData entity sets'). It also distinguishes from sibling tools by explicitly positioning it as a discovery step before using query_odata.

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

Usage Guidelines4/5

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

Provides clear context by instructing to 'Call this first to discover valid entity names before using query_odata', which indicates when to use it relative to a major sibling. It does not explicitly mention when not to use it or address the v4 sibling, but the primary usage scenario is well covered.

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

list_odata_v4_entitiesA

List all available OData v4 DAC entity sets exposed by Acumatica. Unlike list_odata_entities (Generic Inquiries), this exposes raw DAC tables (SOOrder, BAccount, InventoryItem, GLTran, etc.). Use the returned names with query_odata_v4.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.4/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It implies a read-only listing operation and provides useful context about the content (raw DAC tables) and the output names. However, it does not explicitly state that it is non-mutating, nor does it disclose possible pagination, rate limits, or return structure beyond the implication that entity set names are returned. This is adequate for a simple list tool but not richly transparent.

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

Conciseness5/5

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

The description is two sentences, front-loaded with the core purpose, followed by a meaningful contrast and a direct usage pointer. Every sentence adds value—no filler, tautology, or redundant restatement.

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

Completeness4/5

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

For a zero-parameter, no-output-schema listing tool, the description covers purpose, sibling differentiation, and downstream usage. It includes concrete examples (SOOrder, BAccount, InventoryItem, GLTran) to anchor expectations. It does not detail the exact return format or mention potential large result sizes, but given the simplicity, it is sufficiently complete for selection and invocation.

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

Parameters4/5

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

The tool has zero parameters, so the baseline is 4. The description adds no parameter-specific detail because none exist, and the input schema is empty, so there is nothing missing. It correctly tells the agent the tool requires no configuration.

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

Purpose5/5

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

The description uses a specific verb ('List') and resource ('OData v4 DAC entity sets exposed by Acumatica'), and explicitly distinguishes itself from list_odata_entities by clarifying that it exposes raw DAC tables rather than Generic Inquiries. This makes its purpose unambiguous and differentiates it from a close sibling tool.

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

Usage Guidelines5/5

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

The description provides clear guidance: it contrasts with list_odata_entities (Generic Inquiries) and explains that the returned names should be used with query_odata_v4. This tells the agent exactly when to choose this tool and what to do with its output, effectively naming the alternative and follow-up.

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

query_customersA

List and filter Acumatica customers. Use this to look up customers by name, class, status, or credit terms for analytics and reporting.

ParametersJSON Schema
NameRequiredDescriptionDefault
topNoMax records to return (default 50, max 500)
skipNoRecords to skip for pagination
filterNoOData $filter expression. Examples: "Status eq 'Active'", "CustomerClass eq 'DEFAULT'", "CustomerName eq 'Acme Corp'"
orderbyNoOData $orderby. Example: "CustomerName asc"

TDQS

A4/5.0
Behavior3/5

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

With no annotations, the description carries full responsibility. It implies a read-only operation through 'list and filter' and gives a purpose, but it does not disclose pagination behavior, return format, or access requirements. It is minimal and not misleading, but lacks rich behavioral context.

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

Conciseness5/5

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

Two concise sentences, front-loaded with the primary action ('List and filter Acumatica customers'), with no unnecessary words. It earns its place by adding a use case.

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

Completeness4/5

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

For a straightforward list tool, the description is fairly complete: it covers the purpose and usage context. It does not explain return values, but no output schema exists and the parameter schema covers query mechanics. It could mention alternatives like get_customer, but that is not critical.

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

Parameters3/5

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

Schema description coverage is 100%, so the parameters are fully documented with examples. The description adds a small hint about filtering by credit terms, which is not in schema examples, but it does not explain syntax or add substantial meaning beyond the schema.

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

Purpose5/5

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

The description clearly states it lists and filters Acumatica customers, using a specific verb and resource. It distinguishes itself from siblings like get_customer (single record) and query_* tools for other entities by focusing on customer list operations.

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

Usage Guidelines4/5

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

The description provides clear usage context: 'Use this to look up customers by name, class, status, or credit terms for analytics and reporting.' It does not explicitly mention alternatives or when not to use it, but the implied use case is well-defined.

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

query_invoicesA

List and filter Acumatica sales invoices (AR). Use this for revenue analytics, finding open or overdue invoices, or summarizing invoice activity by customer.

ParametersJSON Schema
NameRequiredDescriptionDefault
topNoMax records to return (default 50, max 500)
skipNoRecords to skip for pagination
filterNoOData $filter expression. Examples: "Status eq 'Open'", "Type eq 'Invoice'", "Customer eq 'CUST001'", "Date gt '2025-01-01'"
orderbyNoOData $orderby. Example: "Date desc"
inventoryIDNoFilter to invoices that contain this inventory item in any line, e.g. "WIDGET-001"

TDQS

A4/5.0
Behavior3/5

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

With no annotations, the description carries the burden of behavioral disclosure. 'List and filter' implies a non-mutating read operation, which is useful, but it does not mention pagination behavior (top/skip), default limits, or that the result is a collection. This is adequate but not rich.

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

Conciseness5/5

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

The description is two sentences, front-loaded with the primary action and resource, then followed by usage examples. Every sentence adds value, and there is no fluff or redundancy.

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

Completeness4/5

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

Given the straightforward nature of a list/filter tool with a well-covered schema, the description covers the main use cases and indicates the return is a list. It omits details like pagination defaults, but the schema already documents top/skip, and 'list' implies an array. It is reasonably complete for an AI agent.

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

Parameters3/5

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

Schema coverage is 100%, so the baseline is 3. The description does not add any additional meaning beyond the parameter names and schema descriptions; the tool name and context align with the parameters, but no extra guidance is provided.

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

Purpose5/5

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

The description clearly states the action ('List and filter') and the resource ('Acumatica sales invoices (AR)'), making the tool's purpose unmistakable. It also distinguishes from siblings like get_invoice (singular fetch) and query_sales_orders (different document type) by specifying the AR invoicing domain.

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

Usage Guidelines4/5

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

The description provides explicit use cases ('revenue analytics, finding open or overdue invoices, summarizing invoice activity by customer'), which helps an agent decide when to use this tool. However, it does not mention when NOT to use it, such as a single-invoice lookup via get_invoice, so it lacks full exclusion guidance.

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

query_odataA

Query any Acumatica Generic Inquiry via OData. Use list_odata_entities first to find valid entity names. Supports OData $filter, $select, $orderby, $top, and $skip.

ParametersJSON Schema
NameRequiredDescriptionDefault
topNoMax records to return (default 50, max 500)
skipNoRecords to skip for pagination
filterNoOData $filter expression, e.g. "Status eq 'Open'" or "OrderDate gt '2025-01-01'"
selectNoComma-separated field names to return, e.g. "OrderNbr,CustomerID,OrderDate"
orderbyNoOData $orderby expression, e.g. "OrderDate desc"
entityNameYesExact entity name from list_odata_entities, e.g. "SO-SalesOrder" or "AR-Customers"

TDQS

A3.9/5.0
Behavior3/5

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

With no annotations, the description carries the burden of disclosure. It adds value by naming supported OData operators and the prerequisite to list entities, but it omits details like return format, authentication, or error behavior. This is adequate but not comprehensive.

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

Conciseness5/5

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

The description is only two sentences, front-loaded with the tool's purpose, and every word serves a function. It avoids restating schema details and is highly efficient.

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

Completeness3/5

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

Given the tool's complexity (6 params, no output schema, no annotations), the description covers purpose, prerequisite, and supported options. However, it does not mention the response format or clearly distinguish between query_odata and query_odata_v4, leaving minor gaps.

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

Parameters3/5

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

Schema coverage is 100%, with each parameter having a detailed description. The tool description merely lists the OData options ($filter, $select, etc.) without adding new meaning beyond what the schema already provides, so it meets the baseline but adds no extra semantics.

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

Purpose5/5

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

The description clearly states the tool queries any Acumatica Generic Inquiry via OData, using a specific verb and resource. It also distinguishes from sibling tools by emphasizing the generic nature and instructing to use list_odata_entities first, though it does not explicitly differentiate from query_odata_v4.

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

Usage Guidelines4/5

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

Provides clear context by instructing users to call list_odata_entities first to discover valid entity names. However, it does not mention exclusions or alternative tools like query_odata_v4, so it lacks an explicit when-not-to-use statement.

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

query_odata_v4A

Query any Acumatica DAC table directly via OData v4. Exposes raw DAC entities (e.g. SOOrder, BAccount, InventoryItem, GLTran, APTran, INTran). Use list_odata_v4_entities to discover valid entity names. Supports OData $filter, $select, $orderby, $top, and $skip. IMPORTANT: Large tables (e.g. GLTran) will timeout without a filter — always apply a date range or other filter. Always use $select to limit returned fields.

ParametersJSON Schema
NameRequiredDescriptionDefault
topNoMax records to return (default 50, max 500)
skipNoRecords to skip for pagination
filterNoOData $filter expression. Date fields require datetimeoffset format: "TranDate gt 2026-01-01T00:00:00Z". String fields use single quotes: "Status eq 'N'"
selectNoComma-separated DAC field names to return, e.g. "OrderType,OrderNbr,CustomerID,Status"
orderbyNoOData $orderby expression, e.g. "OrderDate desc"
entityNameYesDAC entity name, e.g. "SOOrder", "BAccount", "InventoryItem", "GLTran"

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations, the description carries the full burden. It discloses a critical behavioral trait: large tables (e.g., GLTran) will timeout without a filter, and advises always using $select to limit returned fields. This goes beyond the schema and provides valuable operational context, though it doesn't address error handling or response format.

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

Conciseness5/5

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

The description is five sentences, all informative and earning their place. It front-loads the core purpose, gives entity examples, and ends with critical usage warnings in clear format. No fluff or unnecessary repetition.

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

Completeness4/5

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

The tool has 6 parameters, no output schema, and moderate complexity. The description covers purpose, entity discovery, and critical filtering guidance. It could mention error behavior or pagination details, but the schema covers parameters and the guidance is sufficient for most use cases.

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

Parameters3/5

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

Schema description coverage is 100%, with parameter descriptions that include examples and formats (e.g., filter datetimeoffset, entity names). The description adds no new parameter semantics beyond emphasizing $select usage, so the baseline 3 applies.

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

Purpose5/5

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

The description clearly states the tool queries any Acumatica DAC table directly via OData v4, with a specific verb and resource. It lists example entities (SOOrder, BAccount, InventoryItem) and distinguishes itself from higher-level sibling tools by emphasizing raw DAC access.

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

Usage Guidelines4/5

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

Provides actionable guidance: tells users to use list_odata_v4_entities to discover valid entity names, and warns to always apply filters and $select to avoid timeouts. However, it doesn't explicitly contrast with sibling tools like query_sales_orders, though the 'directly via OData v4' wording implies a low-level use case.

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

query_purchase_ordersA

List and filter Acumatica purchase orders. Use this for procurement analytics, finding open or pending POs, or summarizing spend by vendor.

ParametersJSON Schema
NameRequiredDescriptionDefault
topNoMax records to return (default 50, max 500)
skipNoRecords to skip for pagination
filterNoOData $filter expression. Examples: "Status eq 'Open'", "VendorID eq 'VD001'", "Date gt '2025-01-01'"
orderbyNoOData $orderby. Example: "Date desc"

TDQS

A4/5.0
Behavior3/5

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

With no annotations, the description carries the transparency burden. 'List and filter' implies a non-mutating read operation, and the use cases add context. However, it does not explicitly state read-only behavior, return format, pagination details, or potential side effects, leaving gaps that could be filled.

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

Conciseness5/5

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

The description is exactly two sentences with no wasted words. The first sentence states the core function, the second provides usage context. It is front-loaded and easily scannable.

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

Completeness4/5

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

For a simple list/filter tool with fully documented parameters, the description is mostly complete. It clearly implies a list return via 'List and filter' and covers use cases. However, since there is no output schema, explicitly stating the return structure (e.g., a list of purchase order objects) would improve completeness.

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

Parameters3/5

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

The input schema has 100% coverage, documenting each parameter with descriptions and examples. The tool description adds no additional parameter semantics beyond what the schema already provides, so the baseline of 3 is appropriate.

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

Purpose5/5

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

The description uses the specific verb 'List and filter' with the resource 'Acumatica purchase orders', clearly indicating a query operation. It also lists concrete use cases (procurement analytics, finding open/pending POs, summarizing spend by vendor) that distinguish it from singular get_purchase_order and sales order query tools.

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

Usage Guidelines4/5

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

The description explicitly states when to use: 'Use this for procurement analytics, finding open or pending POs, or summarizing spend by vendor.' This provides clear context but does not explicitly mention alternatives or when not to use it, though sibling tools like get_purchase_order imply the contrast.

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

query_sales_ordersA

Query Acumatica sales orders using the SO-SalesOrder generic inquiry. Use this for lists, analytics, and summaries. Supports OData $filter and $orderby.

ParametersJSON Schema
NameRequiredDescriptionDefault
topNoMax records to return (default 50, max 500)
skipNoRecords to skip for pagination
filterNoOData $filter expression. Examples: "Status eq 'Open'", "OrderDate gt '2025-01-01'", "CustomerID eq 'TUXTON'"
orderbyNoOData $orderby. Example: "OrderDate desc"
inventoryIDNoFilter to orders that contain this inventory item in any line, e.g. "WIDGET-001"
includeDetailsNoSet true to expand line items inline. Increases payload size significantly; use with a low top value.

TDQS

A4/5.0
Behavior3/5

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

With no annotations, the description carries the transparency burden. It states the tool is a query and supports OData filtering/ordering, implying read-only behavior. But it does not disclose output shape, default pagination limits, or potential performance impacts of includeDetails — though some of this is covered in 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.

Conciseness5/5

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

The description is two sentences long, front-loaded with the core purpose and followed by usage context and capability. Every sentence adds value without redundancy.

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

Completeness4/5

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

The description is sufficient for a straightforward query tool: it names the inquiry, explains its intended use, and mentions key OData features. The schema provides rich parameter details, compensating for the absence of an output schema or annotations, though it could have noted default pagination behavior explicitly.

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

Parameters3/5

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

The schema already describes all six parameters with 100% coverage, including examples and constraints. The description adds no parameter-level meaning beyond mentioning OData $filter/$orderby support, which is also in the schema, so the baseline 3 is appropriate.

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

Purpose5/5

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

The description clearly states the tool queries Acumatica sales orders via the SO-SalesOrder generic inquiry, with a specific verb and resource. It also explicitly positions it for lists, analytics, and summaries, distinguishing it from the sibling get_sales_order tool.

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

Usage Guidelines4/5

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

The description provides clear use cases ('lists, analytics, and summaries') and notes OData $filter and $orderby support, giving context for when to use it. However, it does not explicitly name alternatives or state when not to use it, leaving a minor gap.

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

query_shipmentsA

List and filter Acumatica shipments. Use this for shipment analytics, tracking open or completed shipments, or finding shipments by customer or warehouse.

ParametersJSON Schema
NameRequiredDescriptionDefault
topNoMax records to return (default 50, max 500)
skipNoRecords to skip for pagination
filterNoOData $filter expression. Examples: "Status eq 'Open'", "CustomerID eq 'CUST001'", "ShipmentDate gt '2025-01-01'"
orderbyNoOData $orderby. Example: "ShipmentDate desc"

TDQS

A4/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. 'List and filter' strongly implies a read-only operation, but the description does not explicitly confirm safety or disclose behavioral details such as pagination behavior, rate limits, or return format. It adds some context about use cases but not deeper transparency about side effects or limitations.

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

Conciseness5/5

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

The description is two concise sentences. The first sentence states the core function; the second lists example use cases. No redundant or irrelevant information, and the content is front-loaded.

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

Completeness4/5

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

For a simple list/filter tool with 4 well-documented parameters and no output schema, the description is mostly complete. It explains the tool's purpose and common use cases. However, it does not mention that results can be paginated (via top/skip) or that it returns a collection, but these are inferable from the parameters. Given the simplicity and read-only nature, the description sufficiently supports tool selection and invocation.

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

Parameters3/5

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

Schema description coverage is 100%, with each parameter thoroughly described including examples. The tool description adds only high-level use cases (analytics, tracking, finding) that map loosely to the filter parameter, but provides no additional semantic meaning beyond the schema. Per guidelines, baseline 3 is appropriate when schema covers everything.

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

Purpose5/5

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

The description clearly states the tool's function: 'List and filter Acumatica shipments.' This is a specific verb+resource construction that distinguishes it from sibling tools like get_shipment, which likely retrieves a single shipment. The mention of analytics, tracking, and finding by customer or warehouse further clarifies purpose.

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

Usage Guidelines4/5

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

The description provides explicit use cases ('Use this for shipment analytics, tracking open or completed shipments, or finding shipments by customer or warehouse'). This gives clear context for when to choose this tool over others, though it does not explicitly name alternatives or state when not to use it.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 16 tool updatesv0.2.0
    • First observedget_customer
    • First observedget_inventory_item
    • First observedget_invoice
    • First observedget_purchase_order
    • First observedget_sales_order
    • First observedget_shipment
    • First observedlist_inventory_items
    • First observedlist_odata_entities
    • First observedlist_odata_v4_entities
    • First observedquery_customers
    • First observedquery_invoices
    • First observedquery_odata
    • First observedquery_odata_v4
    • First observedquery_purchase_orders
    • First observedquery_sales_orders
    • First observedquery_shipments

TDQS

A3.9/5.0

Scored across 16 tools

Disambiguation4/5

Most tools follow a clear get/query/list pattern with distinct resource scopes, but the specialized query tools (query_sales_orders, query_invoices, etc.) overlap functionally with the generic query_odata tool, which can access the same data. The descriptions help, but an agent might still be unsure which to use for a particular task.

Naming Consistency4/5

Tool names are mostly consistent with a verb_noun pattern (get_* for single entities, query_* for filtered lists, list_* for enumerations). However, 'list_inventory_items' breaks the query_ convention used for similar list operations, and the OData tool naming mixes 'list' and 'query' for related actions.

Tool Count4/5

16 tools is slightly above the typical 3-15 range, but the breadth is justified for an ERP system covering multiple modules (sales, shipping, invoicing, purchasing, inventory, customers) plus generic OData access. The count feels reasonable for the stated scope.

Completeness4/5

The tool set provides comprehensive read/query coverage for key Acumatica resources, and the generic OData tools fill gaps for any entity not covered by specialized wrappers. The main gap is the absence of write operations, but the descriptions emphasize analytics and reporting, making a read-only surface likely intentional.

Maintenance

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    B
    quality
    D
    maintenance
    Enables read-only access to FileMaker databases through the Data API, allowing users to retrieve records, analyze metadata, search across layouts, and infer relationships while maintaining data security.
    16
    -
  • F
    license
    A
    quality
    C
    maintenance
    Provides live, near-real-time read access to Restaurant365 OData API for financial and operational data queries.
    8
    -
  • A
    license
    B
    quality
    C
    maintenance
    Enables read-only access to Epicor Kinetic ERP data, including sales orders, customers, parts, and shipments, through secure MCP tools.
    4
    MIT