ingrammicro-mcp
Click on "Install 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., "@ingrammicro-mcpCheck stock and pricing for the Lenovo ThinkPad X1 Carbon (US)"
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.
ingrammicro-mcp
MCP server for the entire Ingram Micro Reseller purchasing lifecycle — a stateless HTTP MCP service wrapping the full non-webhook surface of Ingram Micro's Reseller REST API: product catalog/pricing, quotes, order placement/change/cancel/lookup, invoices, renewals, special-pricing deals, returns, and freight estimates.
Tech stack: Python 3.12 + uv + FastMCP (Starlette/Uvicorn)
Why this exists instead of just using Ingram Micro's own MCP Server
Ingram Micro also publishes its own official, remote-hosted MCP Server
(developer.ingrammicro.com/reseller/mcp-server). Verified directly
against that page's own content (2026-09-01): it is query-only —
product/pricing search, quotes, invoices, returns, renewals, subscriptions,
and freight estimate. It never mentions "Create Order" or "Place Order"
anywhere, so it cannot place a purchase order.
Rather than deploying two separate Ingram Micro connectors (their query- only MCP plus a second one just for ordering — which would mean provisioning two separate sets of credentials for the same vendor, and the agent having to pick between two connectors for overlapping capability), this server reimplements the official MCP's query capabilities itself, directly against the same underlying Reseller REST API, and adds the order-placement/change/cancel capability the official one lacks. One connector, one set of credentials, full coverage — this server is meant to fully replace Ingram Micro's own MCP Server for MSPbots' purposes, not run alongside it.
Related MCP server: pax8-mcp
Authentication
OAuth2 client_credentials grant — pure server-to-server, no browser
redirect — but via Ingram Micro's own documented shape: GET /oauth/oauth20/token with client_id/client_secret as query
parameters, not the more common HTTP Basic Auth header. Verified against
Ingram Micro's own published OpenAPI spec
(github.com/ingrammicro-xvantage/xi-sdk-openapispec,
openapispec/unified/XI-Resellers-API-Spec.json, checked 2026-09-01), not
guessed.
Every real Orders/Quote-to-Order call additionally requires three
business-context headers Ingram Micro's own docs mark mandatory —
IM-CustomerNumber, IM-CountryCode, IM-CorrelationID — plus an
optional IM-SenderID. IM-CorrelationID must be unique per transaction,
so this server generates a fresh UUID for every call itself; it is not
something the caller supplies.
Getting credentials is not self-serve. Per Ingram Micro's own onboarding docs, applying for API access requires:
An existing, active Ingram Micro reseller account in good standing
Current sales history with Ingram Micro
Sandbox testing, then a formal app-approval submission (~2 business days)
This is a real prerequisite, not a formality — confirm the tenant already has an active Ingram Micro reseller relationship before attempting to provision credentials for this server.
Since this is a stateless multi-tenant service, the token is not
cached — every tool call re-authenticates from scratch (same pattern as
cisco-umbrella-mcp/covedataprotection-mcp/webroot-mcp).
HEADER 授权参数说明
Header | 类型 | 是否必填 | 默认值 | 枚举值 | 字段描述 | Example |
| string | 是 | 无 | 无 | OAuth2 client_credentials 的 Client ID |
|
| string | 是 | 无 | 无 | OAuth2 client_credentials 的 Client Secret |
|
| string | 是 | 无 | 无 | Ingram Micro 经销商账号(对应上游 |
|
| string | 是 | 无 | 无 | 两位 ISO 国家代码(对应上游 |
|
Missing any of the four required headers returns 401 Unauthorized.
Quick Start
Docker (recommended)
docker compose up --buildThe server starts on http://localhost:8080.
Local (uv)
uv sync
python -m ingrammicro_mcpHealth Check
curl http://localhost:8080/health
# {"status": "ok"}No credentials are required for the health endpoint.
Environment Variables
Variable | Default | Description |
|
|
|
|
| Listening port |
|
| Listening host |
|
|
|
| — | Only used in |
|
|
|
|
| Override for sandbox testing (see Known Gaps — the exact sandbox URL is unverified) |
Tool List
24 tools, covering every non-webhook endpoint in Ingram Micro's Resellers API. Every order-placing/modifying tool spends real money against the reseller's Ingram Micro net-terms account — Ingram Micro does not support credit-card API ordering, only net-terms trade credit, so a mistaken order is a real invoice, not a rejected charge.
Catalog(对应官方MCP:Product Info & Pricing)
Tool | 功能 | 方法+路径 |
| 按关键词/厂商/分类搜索产品目录 | GET /resellers/v6/catalog |
| 按Ingram Part Number查产品详情 | GET /resellers/v6/catalog/details/{ingramPartNumber} |
| 按厂商料号/订阅计划id或名查产品详情 | GET /resellers/v6/catalog/details |
| 查实时价格与库存 | POST /resellers/v6/catalog/priceandavailability |
Quotes(对应官方MCP:Quotes)
Tool | 功能 | 方法+路径 |
| 搜索报价单 | GET /resellers/v6/quotes/search |
| 查报价单详情 | GET /resellers/v6/quotes/{quoteNumber} |
| 创建报价单(占价,不是下单) | POST /resellers/v6/quotes/create |
| 转单前校验报价,返回必填字段 | GET /resellers/v6/q2o/validatequote |
Orders(对应官方MCP:Orders,但官方只读;下单/改单/取消是官方没有的能力)
Tool | 功能 | 方法+路径 | 主要参数 |
| 下单:库存/直发/授权/保修类SKU | POST /resellers/v6/orders |
|
| 下单:云订阅 / Quote-to-Order / Configure-to-Order(异步,结果通过webhook推送,不在本次响应里) | POST /resellers/v7/orders |
|
| 改单:仅限带customer-hold标记、下单后24小时内的订单 | PUT /resellers/v6/orders/{orderNumber} |
|
| 取消订单:仅限尚未放行到仓库前 | DELETE /resellers/v6/orders/{OrderNumber} |
|
| 查单个订单详情/物流状态 | GET /resellers/v6.1/orders/{ordernumber} | |
| 按PO号/状态/产品搜索订单 | GET /resellers/v6/orders/search |
Invoices(对应官方MCP:Invoices)
Tool | 功能 | 方法+路径 |
| 搜索发票 | GET /resellers/v6/invoices |
| 查发票详情 | GET /resellers/v6.1/invoices/{invoiceNumber} |
Renewals(对应官方MCP:Subscriptions/Renewals)
Tool | 功能 | 方法+路径 |
| 搜索续订机会 | POST /resellers/v6/renewals/search |
| 查续订详情 | GET /resellers/v6/renewals/{renewalId} |
Deals(特价/Special Bid,官方MCP未单独列出,但同属查询类能力)
Tool | 功能 | 方法+路径 |
| 搜索特价/Special Bid | GET /resellers/v6/deals/search |
| 查特价详情 | GET /resellers/v6/deals/{dealId} |
Returns(对应官方MCP:Returns)
Tool | 功能 | 方法+路径 |
| 搜索退货(RMA)申请 | GET /resellers/v6/returns/search |
| 查退货详情 | GET /resellers/v6/returns/{caseRequestNumber} |
| 提交退货申请 | POST /resellers/v6/returns/create |
Freight(对应官方MCP:Freight & Shipping)
Tool | 功能 | 方法+路径 |
| 运费预估 | POST /resellers/v6/freightestimate |
复杂嵌套参数(lines/ship_to_info/end_user_info/reseller_info/shipment_details/additional_attributes/products/returns等)以 dict/list[dict] 形式传入,具体字段见每个工具自己的参数说明(已对照官方 OpenAPI spec 核实字段名)。
ingrammicro_search_quotes/ingrammicro_create_quote/ingrammicro_get_freight_estimate 额外要求一个 requester_email 参数(对应上游 IM-CustomerContact/CustomerContact:发起请求的登录用户邮箱)——这是调用方个人身份信息,不是租户级凭据,所以做成工具参数而不是网关 Header。
测试示例
curl -X POST http://localhost:8080/mcp \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-H "X-IngramMicro-Client-Id: <client_id>" \
-H "X-IngramMicro-Client-Secret: <client_secret>" \
-H "X-IngramMicro-Customer-Number: 20-222222" \
-H "X-IngramMicro-Country-Code: US" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "ingrammicro_validate_quote_to_order",
"arguments": { "quote_number": "QUO-14551943-D2Y9L9" }
}
}'⚠️ 本仓库为公开仓库,请勿在任何提交的文件中写入真实的 client_id/client_secret/customer_number 等敏感信息。
API Reference
Official OpenAPI 3.0 spec (source of truth used for this build): https://github.com/ingrammicro-xvantage/xi-sdk-openapispec/blob/main/openapispec/unified/XI-Resellers-API-Spec.json
Reseller API documentation portal: https://developer.ingrammicro.com/reseller/api-documentation/orders
Getting started / account prerequisites: https://developer.ingrammicro.com/reseller/getting-started/api-overview
Ingram Micro's own official MCP Server (query-only; this server supersedes it for MSPbots' purposes — see above): https://developer.ingrammicro.com/reseller/mcp-server
Known Gaps
⚠️ Not yet verified against a real Ingram Micro account. This build was written entirely from Ingram Micro's own published OpenAPI spec — schema/tool count confirmed via the real MCP protocol (
tools/list, 24 tools) and unit tests passing, but no call has been exercised against a real, credentialed Ingram Micro reseller account. Getting one requires an existing reseller relationship with sales history (see Authentication) — needs re-verification once real sandbox or production credentials are available.Sandbox base URL is unconfirmed. Ingram Micro's own sources disagree: the support/auth documentation references a
https://api.ingrammicro.com:443/sandboxpath, while the official OpenAPI spec's ownserversblock lists a single URL (https://api.ingrammicro.com:443/) labeled "Sandbox" with no/sandboxsuffix.INGRAMMICRO_BASE_URLis fully overridable specifically so this can be corrected without a code change once confirmed.IM-ApplicationIDvsIM-SenderID: Ingram's own spec documents Invoices/Deals-details as requiringIM-ApplicationIDwhile every other endpoint documents the identical concept asIM-SenderID. Treated as a spec-naming inconsistency rather than two different things — this server sends both headers with the same configured sender id on every call rather than guessing which name a given endpoint actually validates.Webhooks (
Order Status,Stock Update) are out of scope. These are inbound push notifications Ingram Micro sends to a callback URL a reseller registers — not something an MCP tool (which the agent calls) can meaningfully wrap.ingrammicro_create_cloud_order(v7) is documented as asynchronous specifically because its real result arrives via this webhook mechanism, not in the tool's own response — there is no tool here to receive or poll for that result; a separate webhook receiver component would be needed for that, out of scope for this build.Complex nested body parameters (
lines,ship_to_info,end_user_info,reseller_info,shipment_details,additional_attributes) are passed through asdict/list[dict]rather than fully typed as individual Python parameters — the real request bodies have dozens of optional nested fields per object (verified against the spec, field names are accurate), but modeling every one as a typed parameter was out of scope. Field names/shapes are documented in each parameter's own description.
Available Tools
24 toolsingrammicro_cancel_orderADestructiveIdempotent
Cancel an order before it reaches Ingram Micro's warehouse.
Irreversible once it fails: an order already released to the
warehouse CANNOT be canceled through this API at all — Ingram
Micro requires the order to still be on customer hold. Confirm
with a human before calling; there is no way to check "is it too
late" ahead of time other than trying and reading the error.
| Name | Required | Description | Default |
|---|---|---|---|
| order_number | Yes | Ingram Micro's own sales order number, e.g. "20-RD128". |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the destructiveHint and idempotentHint annotations, the description discloses the irreversible failure behavior, the customer-hold requirement, and the lack of a preflight check. This is exactly the sort of contextual risk information an agent needs before invoking a destructive API.
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 slightly verbose but every sentence adds meaningful warning or constraint information. The opening sentence states the core purpose immediately, and the subsequent block explains critical edge-case behavior without unnecessary fluff.
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 single parameter, the presence of an output schema, and strong annotations, the description covers all essential guidance for a destructive operation: when it is valid, what makes it fail, why human confirmation is needed, and what cannot be determined in advance. Nothing critical 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 input schema already fully describes the single parameter, order_number, including a concrete example. The tool description adds no additional parameter-level detail, but since schema coverage is 100%, 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 states a specific verb and resource: 'Cancel an order before it reaches Ingram Micro's warehouse.' This clearly distinguishes the tool from sibling order-related tools like create_order, modify_order, and get_order by focusing on the cancellation action and its timing constraint.
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 provides explicit timing conditions for use: cancellation is only possible before the order reaches the warehouse and while it is on customer hold. It also warns against using it after release and advises human confirmation. It does not explicitly name alternative tools, but the guidance is practical and clear enough for an agent to decide when to call it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ingrammicro_create_cloud_orderADestructive
Place a cloud-subscription order, or convert an existing Quote (Quote-to-Order / Configure-to-Order) into a real order. Asynchronous: this call only returns a confirmationNumber acknowledging receipt — Ingram Micro pushes the actual order result (success or error) later via its own webhook, not in this response.
For standard stocked/direct-ship/licensing/warranty SKUs (not
cloud, not quote-based), use ingrammicro_create_order instead.
Real money against the reseller's net-terms account — no dry-run,
no credit-card ordering. Always validate a quote first with
ingrammicro_validate_quote_to_order before passing quote_number
here.
| Name | Required | Description | Default |
|---|---|---|---|
| lines | No | Standard-order line items (ignored in Quote-to-Order mode): [{"customerLineNumber", "ingramPartNumber", "vendorPartNumber", "quantity", "unitPrice", "endUserPrice" (required for export orders), "specialBidNumber", "notes"}]. Required unless quote_number is given. | |
| notes | No | Order header-level notes. | |
| quote_number | No | Ingram Micro quote number for Quote-to-Order or Configure-to-Order. When given, any SKU/quantity/price in `lines` is IGNORED — the quote's own details are used instead. Validate it first with ingrammicro_validate_quote_to_order to learn any vendor-mandatory fields to pass here. | |
| ship_to_info | No | Optional shipping destination override: {"addressId" (Ingram-issued address id from onboarding), "contact", "companyName", "name1", "name2", "addressLine1/2/3", "city", "state", "postalCode", "countryCode", "phoneNumber", "email"}. Omit to ship to the address tied to addressId on the account. | |
| end_user_info | No | Optional end-customer identity, used for pricing/discount purposes: {"endUserId", "contact", "companyName", "name1", "name2", "addressLine1/2/3", "city", "state", "postalCode", "countryCode", "phoneNumber", "email"}. | |
| reseller_info | No | Optional reseller identity/address override: {"resellerId", "companyName", "contact", "addressLine1/2/3", "city", "state", "postalCode", "countryCode", "phoneNumber", "email"}. Omit to use the account's on-file reseller info. | |
| shipment_details | No | Optional shipping instructions: {"carrierCode", "freightAccountNumber" (bill reseller's own carrier account directly), "shipComplete" ("true"/"C"=hold until all lines ship, "P"=ship-complete per line, "E"=ship-complete across all distributions), "requestedDeliveryDate" (date, not guaranteed), "signatureRequired" (bool), "shippingInstructions"}. | |
| accept_back_order | No | Accept the order even if backordered. | |
| bill_to_address_id | No | Billing address suffix from onboarding. | |
| special_bid_number | No | Header-level special-pricing bid number. | |
| vendor_auth_number | No | Vendor authorization number, if the specific vendor requires it. | |
| additional_attributes | No | Optional Ingram-specific flags as [{"attributeName", "attributeValue"}] pairs — e.g. allowPartialOrder, allowDuplicateCustomerOrderNumber, government-order fields (govtProgramType, govtEndUserType, etc). Rarely needed; omit unless a specific Ingram-documented flag is required. | |
| customer_order_number | No | Your own order number for reference (max 18 chars). Strongly recommended even though not strictly required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing asynchronous behavior (only returns confirmationNumber, actual result via webhook), real-money impact, and no dry-run capability. This is critical for setting an agent's expectations about side effects. No contradiction with the destructiveHint annotation.
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?
Every sentence carries operational weight: purpose, async caveat, sibling disambiguation, financial warning, and validation prerequisite. There is no filler, and the core action is front-loaded. The length is appropriate for the complexity.
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 13 parameters with zero required fields and a rich schema, the description covers the essential operational context: async receipt, webhook-based results, financial consequences, and quote validation. It does not need to enumerate all parameters because the schema already documents them thoroughly.
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 top-level description adds meaningful context about the quote_number dependency, the need to validate quotes, and the distinction between quote-based and line-item ordering. This supplements the schema's already-strong parameter 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 states specific actions: placing a cloud-subscription order or converting a Quote-to-Order/Configure-to-Order into a real order. It also explicitly differentiates itself from ingrammicro_create_order by naming that sibling for standard SKUs. This makes the tool's purpose unambiguous.
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 explicit when-to-use and when-not-to-use guidance: standard SKUs should use ingrammicro_create_order instead. It also instructs the agent to validate a quote first with ingrammicro_validate_quote_to_order before passing quote_number. This is direct and actionable routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ingrammicro_create_orderADestructive
Place a real purchase order for stocked, direct-ship, licensing, or warranty SKUs. Real money against the reseller's net-terms account — Ingram does not support credit-card API ordering.
For cloud subscriptions, Quote-to-Order, or Configure-to-Order, use
ingrammicro_create_cloud_order instead — this tool is for standard
SKU ordering only. Confirm every SKU/quantity/price with a human
first; there is no dry-run mode. Returns per-line success/error/
warning counts and, on partial failure, a rejectedLineItems list
naming exactly which lines failed and why.
| Name | Required | Description | Default |
|---|---|---|---|
| lines | Yes | Order line items: [{"customerLineNumber": <unique numeric string, 1-884>, "ingramPartNumber": <Ingram's own SKU, required>, "quantity": <int>, "unitPrice": <optional decimal, not guaranteed>, "specialBidNumber": <optional, line-level pricing bid>, "notes": <optional>}]. Resolve ingramPartNumber via Ingram Micro's own MCP Server's product/catalog search first — this server has no catalog lookup of its own. | |
| notes | No | Order-level notes. | |
| ship_to_info | No | Optional shipping destination override: {"addressId" (Ingram-issued address id from onboarding), "contact", "companyName", "name1", "name2", "addressLine1/2/3", "city", "state", "postalCode", "countryCode", "phoneNumber", "email"}. Omit to ship to the address tied to addressId on the account. | |
| end_user_info | No | Optional end-customer identity, used for pricing/discount purposes: {"endUserId", "contact", "companyName", "name1", "name2", "addressLine1/2/3", "city", "state", "postalCode", "countryCode", "phoneNumber", "email"}. | |
| reseller_info | No | Optional reseller identity/address override: {"resellerId", "companyName", "contact", "addressLine1/2/3", "city", "state", "postalCode", "countryCode", "phoneNumber", "email"}. Omit to use the account's on-file reseller info. | |
| shipment_details | No | Optional shipping instructions: {"carrierCode", "freightAccountNumber" (bill reseller's own carrier account directly), "shipComplete" ("true"/"C"=hold until all lines ship, "P"=ship-complete per line, "E"=ship-complete across all distributions), "requestedDeliveryDate" (date, not guaranteed), "signatureRequired" (bool), "shippingInstructions"}. | |
| accept_back_order | No | Accept the order even if a line is backordered. Ignored if shipment_details.shipComplete is set. | |
| bill_to_address_id | No | Billing address suffix issued during onboarding. Omit for the default. | |
| special_bid_number | No | Header-level special-pricing bid number from the vendor. Line-level bids in `lines` take precedence. | |
| vendor_auth_number | No | Vendor authorization number — REQUIRED for warranty-SKU orders (the specific vendor mandates this; ask Ingram Micro sales which vendors need it). Without it, warranty orders are placed on hold. | |
| additional_attributes | No | Optional Ingram-specific flags as [{"attributeName", "attributeValue"}] pairs — e.g. allowPartialOrder, allowDuplicateCustomerOrderNumber, government-order fields (govtProgramType, govtEndUserType, etc). Rarely needed; omit unless a specific Ingram-documented flag is required. | |
| customer_order_number | Yes | Your own unique PO/order number for this order (max 35 chars). Ingram Micro tracks orders by this, not just its own order number — reuse of a number that already exists is rejected unless allowDuplicateCustomerOrderNumber is set via additional_attributes. | |
| end_customer_order_number | No | The end customer's own PO number, if any. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the operation as destructive and non-idempotent, and the description meaningfully enlarges on that: real money against net-terms, no credit-card API support, no dry-run mode, and partial-failure behavior via rejectedLineItems. This is exactly the kind of behavioral context the annotations alone cannot convey.
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 compact and front-loaded with the most important warning: 'Real money... no dry-run mode.' Every sentence earns its place, covering funding constraints, tool routing, approval requirements, and response behavior without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a high-stakes, 13-parameter ordering tool, the description plus fully documented schema and output schema covers scope, exclusions, risk, prerequisites, and post-call outcomes. Nothing essential is missing for an agent to decide whether and how to invoke the tool.
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 schema already documents all 13 parameters in detail, so the description correctly avoids re-explaining them. The description adds process-level context like confirming SKUs with a human, but this is not parameter-specific semantic detail, 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.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific action and resource: 'Place a real purchase order for stocked, direct-ship, licensing, or warranty SKUs.' It also explicitly names the sibling tool to use instead for cloud/quote/configure-to-order, making differentiation from the large sibling list immediate.
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 explicit when-to-use guidance: use this tool for standard SKU ordering, and use ingrammicro_create_cloud_order for cloud subscriptions, Quote-to-Order, or Configure-to-Order. It also prescribes a human-approval step, since there is no dry-run mode.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ingrammicro_create_quoteA
Create a new quote — a price hold, not a purchase. Convert it to a real order later with ingrammicro_create_cloud_order(quote_number=...) after validating with ingrammicro_validate_quote_to_order.
| Name | Required | Description | Default |
|---|---|---|---|
| deal_id | No | Special-pricing deal id to apply to the quote. | |
| products | Yes | Line items: [{"customerLineNumber", "ingramPartNumber", "vendorPartNumber", "quantity", "specialBid", "lineLevelNotes", "pricingType"}]. | |
| last_name | No | Requester's last name. | |
| first_name | No | Requester's first name. | |
| quote_name | No | Reference name for the quote. | |
| pricing_type | No | Pricing type for the quote. | |
| customer_need | No | Free-text note on what the customer needs. | |
| end_user_info | No | Optional end-customer identity: {"companyName", "contact", "addressLine1/2", "city", "state", "postalCode", "countryCode", "email", "phoneNumber"}. | |
| requester_email | Yes | Email of the person creating this quote (Ingram requires it). | |
| send_quote_copy | No | Comma-separated emails to send the quote to (max 10). | |
| quote_expiry_date | No | Date the quote should expire. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It mentions that the quote is a 'price hold, not a purchase' (implying non-finality) and notes that Ingram requires the requester's email. However, it does not disclose potential side effects (e.g., sending emails via send_quote_copy), success/failure behaviors, or authentication/permission requirements, leaving 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, consisting of two sentences that efficiently convey the purpose and workflow. It avoids redundancy and is well-structured, with the core action and important clarifications presented in a compact manner.
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 provides key contextual information: it explains the non-purchase nature, the conversion path, and the required requester_email. It does not elaborate on output or further details, but since an output schema exists (per context signals), explaining return values is unnecessary. Overall, the description gives sufficient context for an agent to decide when to invoke this tool.
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 descriptions cover 100% of the parameters, providing clear meaning for each field (e.g., requester_email, products, end_user_info). The tool description does not add extra semantics beyond the schema, so the score aligns with the baseline for full 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 clearly states the tool's purpose: create a new quote as a price hold, not a purchase. It explicitly contrasts with order creation and provides the subsequent conversion path via ingrammicro_create_cloud_order and validation via ingrammicro_validate_quote_to_order, which distinguishes it from sibling tools.
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 indicates when to use the tool (when creating a quote) and clarifies that it is not a purchase, while also guiding the user on the recommended next steps (conversion and validation). This effectively communicates the usage context and alternative pathways.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ingrammicro_create_returnADestructive
File one or more return (RMA) requests against already-invoiced product. Each entry needs the original invoice, a quantity, primary/secondary reason, box count, and a full ship-from address — Ingram rejects a request missing any of those. Confirm with a human before filing; a filed return cannot be un-filed through this API.
| Name | Required | Description | Default |
|---|---|---|---|
| returns | Yes | Return line requests: [{"invoiceNumber" (required), "invoiceDate" (required, YYYY-MM-DD), "customerOrderNumber", "ingramPartNumber", "vendorPartNumber", "serialNumber", "quantity" (required), "primaryReason" (required), "secondaryReason" (required), "notes", "referenceNumber", "billToAddressId", "numberOfBoxes" (required), "shipFromInfo" (required): [{"companyName", "contact", "addressLine1", "city", "state", "postalCode", "countryCode", "email" — all required, "addressLine2/3", "phoneNumber" optional}]}]. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true and idempotentHint=false. The description adds that a filed return cannot be un-filed through this API, explicitly explaining the destructive consequence. This is valuable behavioral context beyond the annotation flags.
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 compact and front-loaded, with the core action stated first, followed by required fields and a critical warning. No wasted words; every sentence contributes necessary 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 destructive creation operation, the description covers prerequisites, field requirements, rejection behavior, and irreversibility. An expected output schema exists (though not shown), so return details need not be described. Minor omission: no mention of response format or any operation-specific rate limits, but these are less critical given the output schema and basic usage context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description covers 100% of parameters with detailed field lists and required markers. The tool description repeats the key fields and adds that missing any causes rejection, which is somewhat redundant but reinforces the schema. Since schema coverage is complete, the description doesn't need to add much parameter-level detail.
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 function: filing one or more return (RMA) requests against already-invoiced product. It uses a specific verb ('file') and resource ('return requests'), and is easily distinguished from sibling tools like search_returns or get_return.
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 specifies when to use the tool: against already-invoiced product, and notes that a request is rejected if required fields are missing. It also instructs to confirm with a human before filing, which is critical usage guidance. It does not explicitly contrast with alternative tools, but the context strongly implies it is for creation, not lookup.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ingrammicro_get_dealARead-onlyIdempotent
Get full detail for one special-pricing deal, including which products/vendors it covers.
| Name | Required | Description | Default |
|---|---|---|---|
| deal_id | Yes | Ingram Micro's unique deal id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the read-only and idempotent nature is covered. The description adds only return-content context (covered products/vendors), not behavioral traits such as error behavior or auth requirements. This is acceptable given the strong annotation coverage.
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 that quickly states the operation and its key output. There is no wasted wording, and the most important information ('get full detail for one deal') appears first.
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?
With one well-described required parameter, a read-only/idempotent annotation profile, and an output schema available, this description is sufficient for an agent to call the tool correctly. The only missing context is how to discover a deal_id, but that is the job of sibling search tools and not essential for this get-by-id operation.
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 100% coverage: deal_id is described as 'Ingram Micro's unique deal id.' The description adds no further meaning about how to use or format the parameter, so the baseline score of 3 applies where the schema already documents 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 clearly states the operation ('Get full detail'), the resource ('one special-pricing deal'), and a key aspect of the result ('which products/vendors it covers'). However, it does not explicitly differentiate itself from sibling tools like ingrammicro_search_deals, relying on the reader to infer that a 'detail' endpoint for a single deal is distinct from a search endpoint.
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?
No guidance is given about when to use this tool versus alternatives such as ingrammicro_search_deals. The description does not mention that this tool is intended for retrieving details after finding a deal, nor does it provide any prerequisites for obtaining a deal_id.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ingrammicro_get_freight_estimateARead-onlyIdempotent
Estimate freight/shipping cost for a set of SKUs and quantities before placing an order — check this when shipping cost matters to the customer's decision.
| Name | Required | Description | Default |
|---|---|---|---|
| lines | Yes | Line items to estimate: [{"customerLineNumber", "ingramPartNumber", "quantity", "warehouseId", "carrierCode"}]. | |
| requester_email | Yes | Email of the person requesting this estimate (Ingram requires it). | |
| ship_to_address | No | Shipping destination(s) (used only if ship_to_address_id is not given): [{"companyName", "addressLine1/2/3", "city", "state", "postalCode", "countryCode"}]. | |
| bill_to_address_id | No | Billing address suffix from onboarding. | |
| ship_to_address_id | No | Ingram-issued shipping address id from onboarding. Preferred over ship_to_address. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the description does not need to restate safety. It adds the context that this happens before order placement, but does not disclose any additional behavioral traits such as return format, side effects, or prerequisites beyond what annotations and schema already 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 short, front-loaded with the core action, and includes a practical usage condition. Every sentence contributes value, and there is no redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the rich input schema, output schema, and read-only/idempotent annotations, the description is complete enough for an agent to select and invoke the tool correctly. The purpose and usage context are clearly stated, and no critical information 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?
Schema description coverage is 100%, so the parameters are fully documented. The description's 'SKUs and quantities' loosely maps to the lines parameter but does not add meaningful detail beyond the schema. Baseline 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 clearly identifies the tool's function: estimating freight/shipping costs for SKUs and quantities before placing an order. It uses a specific verb and resource, and the 'before placing an order' context differentiates it from order-placement 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 explicitly states when to use the tool: when shipping cost matters to the customer's decision. It does not name alternatives or provide when-not-to-use guidance, but no obvious freight-estimate sibling exists, so the context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ingrammicro_get_invoiceARead-onlyIdempotent
Get full line-level detail for one invoice.
| Name | Required | Description | Default |
|---|---|---|---|
| invoice_number | Yes | Ingram Micro invoice number. | |
| include_serial_numbers | No | Include per-unit serial numbers in the response. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, covering safety. The description adds the behavioral trait that it returns 'full line-level detail', indicating the response includes detailed invoice lines rather than a summary. This adds context beyond annotations and aligns with the read-only nature.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single highly informative sentence that front-loads the verb and resource. No filler or redundant words; every word contributes to understanding the tool's purpose and scope.
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-only tool with 2 parameters (1 required), full schema coverage, and an output schema, the description is complete. It specifies the core purpose and scope, and the schema and annotations cover the remaining details such as optional serial numbers and safety. No critical information 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?
Schema description coverage is 100%, with both parameters documented ('Ingram Micro invoice number' and 'Include per-unit serial numbers in the response'). The description does not add additional parameter meaning beyond the schema; the baseline of 3 applies since the schema carries the burden.
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 verb ('Get'), a specific resource ('invoice'), and a specific scope ('full line-level detail for one invoice'). This distinguishes it from sibling search tools like ingrammicro_search_invoices, which handle lists, and other get tools focusing on different resources. An agent can understand exactly what this tool does.
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 usage when a specific invoice number is known and line-level detail is needed, but it does not explicitly mention alternatives or exclusions. It could have stated 'Use ingrammicro_search_invoices to find invoices' or noted this tool is for a single invoice only. The context is clear but the guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ingrammicro_get_orderARead-onlyIdempotent
Get full status/line detail for one order — shipping status, tracking, per-line fulfillment. Use ingrammicro_search_orders instead if you don't already have the exact order number.
| Name | Required | Description | Default |
|---|---|---|---|
| order_number | Yes | Ingram Micro's own sales order number, e.g. "20-RD3QV". | |
| vendor_number | No | Filter/scope by vendor number. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the safety profile is covered. The description adds that the result includes shipping status, tracking, and per-line fulfillment, which is useful context beyond the schema, but it doesn't disclose additional behavioral details such as rate limits or authentication requirements.
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 compact sentences with no filler. The primary purpose and scope are front-loaded, and the routing instruction is placed at the end where it belongs.
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 tool is simple, has annotations covering safety, an output schema for return shape, and fully documented parameters. The description is sufficient for an agent to select and invoke this tool 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%, so the schema already documents both parameters. The description reinforces that an exact order number is required, but it doesn't add new semantic meaning beyond what the schema provides. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the operation: get full status/line detail for one order, including shipping status, tracking, and per-line fulfillment. This distinguishes it from the sibling search_orders tool by emphasizing that it targets a specific order.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent when to use the alternative: use ingrammicro_search_orders if you don't already have the exact order number. This provides a clear routing condition and prevents misuse.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ingrammicro_get_price_and_availabilityARead-onlyIdempotent
Get real-time price and/or stock availability for one or more SKUs — the step before placing an order, to confirm current price and that stock exists before calling ingrammicro_create_order.
| Name | Required | Description | Default |
|---|---|---|---|
| products | Yes | Products to price/check: [{"ingramPartNumber"} or {"vendorPartNumber"}]. Mix of both forms across entries is fine. | |
| include_pricing | No | Include live pricing in the response. | |
| include_availability | No | Include per-warehouse stock availability in the response. | |
| availability_by_warehouse | No | Restrict availability to specific warehouses: [{"availabilityByWarehouseId": <id>}]. | |
| include_product_attributes | No | Also include detailed product attributes. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the safety profile is covered. The description adds useful context about real-time data and pre-order usage, but does not disclose additional behavioral details such as constraints, warehouse-related behavior, or response semantics beyond what the output schema and parameter descriptions already 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 a single, focused sentence with the core action front-loaded and the business context following afterward. There is no redundant wording or repetition of schema details.
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 fully documented input schema, an output schema, and annotations covering safety and idempotency, the description provides the missing business context: this is the pre-order verification step. Nothing essential is left unexplained for an agent to select and invoke the tool 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%, so the input schema already explains the products, include_pricing, include_availability, availability_by_warehouse, and include_product_attributes parameters. The description only paraphrases the high-level purpose ('price and/or stock availability' and 'one or more SKUs') without adding meaning 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 uses a specific verb ('Get'), a clear resource (real-time price and/or stock availability), and scopes the operation to one or more SKUs. It also distinguishes itself from order creation by explicitly positioning this as the pre-order check before calling ingrammicro_create_order.
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 clearly states when to use it: before placing an order, to confirm current price and stock. It names the downstream sibling (ingrammicro_create_order), though it does not explicitly discuss when not to use it or compare it with search/products/detail alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ingrammicro_get_product_detailARead-onlyIdempotent
Get full catalog detail for one product by its Ingram Micro part number (from ingrammicro_search_products). Use ingrammicro_get_product_detail_by_reference instead if you only have the vendor's own part number or a subscription plan id/name.
| Name | Required | Description | Default |
|---|---|---|---|
| ingram_part_number | Yes | Ingram Micro's own unique SKU for the product (max 6 chars). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the description need not restate safety. It adds context that the part number comes from ingrammicro_search_products, which is useful, but does not disclose any additional behavioral traits such as error handling, pagination, or rate limits. With annotations covering the core safety profile, a 3 is appropriate for the minimal extra context.
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 zero redundancy. The first sentence states the primary action and the source of the parameter; the second sentence provides the alternative usage. It is front-loaded with the most important information and 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 read-only tool with an output schema available, the description is complete. It tells the agent what the tool does, where to get the required parameter, and when to use a different tool. Nothing an agent needs to invoke 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?
Schema description coverage is 100% for the single parameter, and the schema already states it's a unique SKU with a max length. The tool description adds valuable context by telling the agent that the part number is obtained from ingrammicro_search_products, which ties the parameter to a specific source and helps the agent understand how to populate it correctly. This goes beyond the schema's basic 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 clearly states the tool's purpose: 'Get full catalog detail for one product by its Ingram Micro part number'. It also differentiates from the sibling tool ingrammicro_get_product_detail_by_reference by naming the condition (when you only have vendor part number or subscription plan id/name). This gives an agent precise understanding of what this tool does and how it differs from its sibling.
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 explicitly states when to use this tool (when you have the Ingram part number from ingrammicro_search_products) and when to use the alternative (ingrammicro_get_product_detail_by_reference for vendor part numbers or subscription plan id/name). This is a clear, direct usage guideline with an explicit alternative and condition, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ingrammicro_get_product_detail_by_referenceARead-onlyIdempotent
Get catalog detail for a product identified by the vendor's own part number, or by subscription plan id/name — for when you don't have Ingram's own part number. Exactly one of vendor_part_number, plan_id, or plan_name must be given.
| Name | Required | Description | Default |
|---|---|---|---|
| plan_id | No | Subscription plan id (for cloud/subscription SKUs). | |
| plan_name | No | Subscription plan name (for cloud/subscription SKUs). | |
| vendor_part_number | No | The vendor's own part number for the product. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered; the description adds the cross-parameter constraint that exactly one of the three identifiers must be supplied, which is genuine behavioral disclosure not present in the schema. Since an output schema exists, the absence of return-format detail is not a gap. 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?
Two tight sentences, front-loaded with verb and resource, followed by the routing condition and the invocation constraint. Every clause earns its place; there is no filler or repetition of schema content.
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 3-parameter lookup with an output schema and safety annotations, the description covers the essential decisions: what it does, when to use it, and the exactly-one parameter rule. The only minor gap is not naming the alternative tool explicitly and not stating failure behavior when the constraint is violated, but the tool remains correctly callable from the given information.
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 documents each parameter individually. The description adds the exactly-one-of-three mutual-exclusivity rule, which the individual parameter descriptions do not convey — meaningful cross-parameter semantics above the baseline.
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-resource pair ('Get catalog detail') and precisely scopes the lookup to reference identifiers (vendor part number, plan id/name). The phrase 'for when you don't have Ingram's own part number' distinguishes this tool from the sibling ingrammicro_get_product_detail, which is keyed by Ingram's part number, and it also separates it from search_products.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'for when you don't have Ingram's own part number' gives an explicit trigger condition that routes the agent to this tool rather than the Ingram-part-number alternative. The 'Exactly one of...' sentence is a hard operational constraint for correct invocation. It does not name the alternative sibling explicitly or say when to prefer plan_id over plan_name, but the context is sufficiently clear for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ingrammicro_get_quoteARead-onlyIdempotent
Get full detail for one quote — line items, pricing, expiry, and current status.
| Name | Required | Description | Default |
|---|---|---|---|
| quote_number | Yes | Quote number, e.g. "QUO-10926-Y8G1B3". |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the safe read nature is covered. The description adds value by specifying the return components (line items, pricing, expiry, status), giving the agent a clear expectation of the response. However, it does not disclose error behavior, permission requirements, or any other non-obvious behavior, which would elevate beyond a 3.
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 focused sentence with no filler. The main action and key components are front-loaded. Every word contributes to understanding the tool's purpose and output.
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 low complexity (one parameter, read-only annotations, output schema provided), the description covers what an agent needs to invoke it correctly. It states what the response contains and the resource acted upon. A slight gap is the absence of any note about alternatives or error cases, but these are not critical for a read-only get-by-ID tool.
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 input schema already provides 100% documentation for the only parameter, including a concrete example. The description does not add any parameter-specific semantics beyond what the schema gives, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Get') and resource ('full detail for one quote'), and enumerates the actual content (line items, pricing, expiry, status). This clearly differentiates the tool from siblings like search_quotes, which focus on searching rather than retrieving a single quote's full detail.
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 usage for retrieving a single quote's full detail, contrasting with search_quotes which naturally handles discovery. However, it does not explicitly state when to use this tool over alternatives, nor does it mention exclusions or prerequisites. Usage guidance is present but only implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ingrammicro_get_renewalARead-onlyIdempotent
Get full detail for one renewal opportunity.
| Name | Required | Description | Default |
|---|---|---|---|
| renewal_id | Yes | Ingram Micro's unique renewal id. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, covering the non-mutating behavior. The description's 'Get full detail' aligns with those hints but does not add extra behavioral context such as error conditions or data freshness.
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 clear sentence that front-loads the purpose with no filler. It is minimal without being under-specified.
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?
With an output schema, a single fully documented parameter, and safety hints in annotations, the description is largely sufficient. It could add a note on how to obtain renewal_id or when results might be empty, but these are not critical for such a simple retrieval tool.
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 sole parameter renewal_id is fully described in the schema as 'Ingram Micro's unique renewal id', so schema coverage is 100%. The description adds no additional parameter-level meaning beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description uses a specific verb ('Get'), a specific resource ('renewal opportunity'), and scopes it to 'one' item with 'full detail'. This clearly distinguishes it from siblings like ingrammicro_search_renewals, which would return a list.
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 need for a single renewal_id implies the agent should already have a specific ID, likely from a search tool, but no explicit when-to-use or alternative guidance is given. There is no mention of using search_renewals first or any exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ingrammicro_get_returnARead-onlyIdempotent
Get full detail and current status for one return (RMA) request.
| Name | Required | Description | Default |
|---|---|---|---|
| case_request_number | Yes | Unique return request number. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the description's claim of getting details aligns with those. It adds that the response includes 'full detail and current status', but no further behavioral context (e.g., error cases, permissions) is provided. No contradiction exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, concise sentence that front-loads the purpose. No wasted words, and it clearly communicates the resource and the kind of information returned.
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 read-only tool with readOnly/idempotent annotations and an output schema, the description is sufficient. The lack of detail about status values or possible response nuances is a minor gap, but not critical given the output schema.
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 parameter 'case_request_number' is well-documented as 'Unique return request number.' The description does not add extra meaning beyond the schema, so it meets the baseline for complete 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 ('Get'), resource ('return (RMA) request'), and scope ('full detail and current status', 'one'). It clearly differentiates from sibling search_returns by focusing on a single return's detail, though it does not explicitly name the sibling.
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 use when you need details/status of a specific return (RMA) using its case_request_number, while search_returns would be for finding returns. It does not explicitly state when to prefer this tool over alternatives or provide exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ingrammicro_modify_orderAIdempotent
Change an order placed with the customer-hold flag — add/update/ delete lines, change ship-to, or release the hold.
ONLY works within roughly 24 hours of placement, and only if the order was created with the customer-hold flag (void after 24h if never released). An order placed WITHOUT customer-hold cannot be modified — this call fails. Confirm with a human before changing quantities or the shipping address.
| Name | Required | Description | Default |
|---|---|---|---|
| lines | No | Line changes: [{"ingramPartNumber", "ingramLineNumber", "customerLineNumber", "addUpdateDeleteLine": "ADD"|"UPDATE"|"DELETE", "quantity", "notes"}]. ingramLineNumber identifies an existing line for UPDATE/DELETE; omit it when adding a new line. | |
| notes | No | Shipment-level notes. | |
| action_code | No | Set to "release" to release an order held with the customer-hold flag. | |
| order_number | Yes | Ingram Micro's own sales order number, e.g. "20-RC1RD". | |
| ship_to_info | No | Optional shipping destination override: {"addressId" (Ingram-issued address id from onboarding), "contact", "companyName", "name1", "name2", "addressLine1/2/3", "city", "state", "postalCode", "countryCode", "phoneNumber", "email"}. Omit to ship to the address tied to addressId on the account. | |
| additional_attributes | No | Optional Ingram-specific flags as [{"attributeName", "attributeValue"}] pairs — e.g. allowPartialOrder, allowDuplicateCustomerOrderNumber, government-order fields (govtProgramType, govtEndUserType, etc). Rarely needed; omit unless a specific Ingram-documented flag is required. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare idempotentHint, so the description carries the burden of behavioral disclosure. It adds important operational constraints: the 24-hour window, the void-after-24h behavior, failure on non-held orders, and the human-confirmation requirement. This goes well beyond what the schema or annotations alone 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 compact and front-loaded: the primary purpose is stated first, followed by critical constraints and a safety note. Every sentence earns its place; there is no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutating order-modification tool, the description covers prerequisites, the time window, failure behavior, and the need for human confirmation. Return-value details are covered by the output schema, and parameter details by the input schema. Nothing essential is missing for an agent to decide correctly when and how to invoke 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 description coverage is 100%, with each parameter already thoroughly documented via descriptions and examples. The description adds high-level operation mapping (lines, ship-to, release) but does not materially improve on the detailed parameter docs already present in 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 uses a specific verb ('Change') with a clear resource ('an order placed with the customer-hold flag') and enumerates the exact operations: add/update/delete lines, change ship-to, or release the hold. This clearly distinguishes it from sibling tools like cancel_order or create_order.
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 explicitly states when the tool works (within ~24 hours, customer-hold flag required) and gives a hard exclusion: orders without the flag cannot be modified and the call fails. It also advises human confirmation before changing quantities or shipping address. It does not name specific sibling tools as alternatives, so it falls just 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.
ingrammicro_search_dealsARead-onlyIdempotent
Search special-pricing deals (vendor discount bids) by vendor or end customer. A deal's id can be passed as special_bid_number when placing an order, or as deal_id when creating a quote. Use this to find the exact deal id before ingrammicro_get_deal.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number. | |
| size | No | Records per page, max 100. | |
| vendor | No | Vendor/manufacturer name. | |
| deal_id | No | Deal/special-bid number. | |
| end_user | No | End-customer name. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the safety profile is covered. The description adds useful context about how a found deal id is consumed in orders and quotes, which helps the agent understand the broader workflow.
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 with no filler: purpose, practical identifier significance, and workflow routing. Every sentence contributes information the agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description, complete parameter schema, annotations, and presence of an output schema fully cover what an agent needs to invoke this search tool correctly. Optional filters and pagination are documented in the schema.
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 all five parameters are already documented. The description reinforces vendor and end-customer search intent, but it does not add meaningful syntax or formatting detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Search special-pricing deals') and defines the resource precisely as vendor discount bids. It distinguishes itself from ingrammicro_get_deal by noting this tool finds the exact deal id before retrieval.
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 explicitly names the companion tool ingrammicro_get_deal and states that this search should be used first to obtain the deal id. The filtering dimensions by vendor or end customer are also stated up front.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ingrammicro_search_invoicesARead-onlyIdempotent
Search invoices by order, invoice number, date range, or status. Use this to find the exact invoice number before calling ingrammicro_get_invoice.
| Name | Required | Description | Default |
|---|---|---|---|
| page_size | No | Records per page, max 100, default 25. | |
| page_number | No | Page number, default 1. | |
| invoice_date | No | Invoice date, YYYY-MM-DD. | |
| invoice_type | No | Invoice type. | |
| order_number | No | Order number the invoice is for. | |
| serial_number | No | Product serial number. | |
| invoice_number | No | Ingram Micro invoice number. | |
| invoice_status | No | Invoice status. | |
| delivery_number | No | Delivery number. | |
| invoice_to_date | No | Invoice date range end, YYYY-MM-DD. | |
| invoice_due_date | No | Invoice due date, YYYY-MM-DD. | |
| invoice_from_date | No | Invoice date range start, YYYY-MM-DD. | |
| special_bid_number | No | Special-pricing bid number. | |
| customer_order_number | No | Your own PO/order number. | |
| end_customer_order_number | No | The end customer's own PO number. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, covering the safety profile. The description does not add further behavioral context such as pagination limits or result size, but that is available in the parameter schema. With annotations carrying the safety burden, a 3 is appropriate because it adds no extra behavioral disclosure beyond a read-only search.
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, front-loaded with the core action and immediately followed by the workflow note. No redundant words or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the high schema coverage and annotations, plus an output schema, the description is complete: it states the purpose, the filter scope, and how it fits with get_invoice. An agent has enough 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?
Schema description coverage is 100%, so every parameter (page_size, invoice_date, order_number, etc.) is already documented with formats and defaults. The description only summarizes the filter categories without adding new meaning beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses the specific verb 'Search' with the resource 'invoices', enumerates searchable criteria (order, invoice number, date range, status), and differentiates itself from sibling ingrammicro_get_invoice by framing this as the discovery step. This is clear and distinguishes the tool from related order/search tools.
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 explicitly tells the agent to use this tool to find the exact invoice number before calling ingrammicro_get_invoice. This gives both a clear use case and an alternative, with the relationship stated. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ingrammicro_search_ordersARead-onlyIdempotent
Search past/current orders by PO number, status, product, or date. Use this to find the exact order number before calling ingrammicro_get_order, ingrammicro_modify_order, or ingrammicro_cancel_order.
| Name | Required | Description | Default |
|---|---|---|---|
| page_size | No | Records per page, max 100, default 25. | |
| order_date | No | Order date, YYYY-MM-DD. | |
| page_number | No | Page number, default 1. | |
| vendor_name | No | Vendor/manufacturer name. | |
| order_status | No | One of "SHIPPED", "PROCESSING", "ON HOLD", "BACKORDERED", "CANCELLED". | |
| serial_number | No | Product serial number. | |
| tracking_number | No | Shipment tracking number (not available in Australia). | |
| ingram_part_number | No | Ingram Micro SKU on the order. | |
| special_bid_number | No | Special-pricing bid number. | |
| vendor_part_number | No | Vendor's SKU on the order. | |
| ingram_order_number | No | Ingram Micro's order number. | |
| customer_order_number | No | Your own PO/order number for the order. | |
| end_customer_order_number | No | The end customer's own PO number. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and idempotentHint, so the description is not required to restate safety. It adds the behavioral context that this search returns order-identifying information needed for subsequent operations, and clarifies it covers past and current orders. This goes beyond the annotations without contradicting them, though it does not detail pagination or output shape (partly covered by 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences with no filler. The core action and criteria are front-loaded, followed by the critical workflow context naming downstream tools. Every word 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 13 optional parameters fully documented in the schema, the annotations covering read-only/idempotent behavior, and the existence of an output schema, the description provides all necessary contextual information: what it searches, the workflow it supports, and the tools it precedes. Nothing critical 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?
Schema description coverage is 100% — every parameter already has a meaningful description including defaults and allowed values for order_status. The tool description merely mentions general search criteria already present in the schema, adding no extra semantic nuance, so baseline 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 clearly states the verb 'Search' and the resource 'past/current orders', listing key filter dimensions (PO number, status, product, date). It also distinguishes itself from downstream operations like get/modify/cancel by explicitly naming them, making its role unambiguous relative to sibling tools.
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 explicit guidance: 'Use this to find the exact order number before calling ingrammicro_get_order, ingrammicro_modify_order, or ingrammicro_cancel_order.' This tells an agent when to invoke this tool and positions it as a prerequisite step in an order workflow, which is exactly what an agent needs to route correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ingrammicro_search_productsARead-onlyIdempotent
Search Ingram Micro's product catalog by keyword, vendor, category, or SKU type. "What's the Ingram part number for Cisco switch model X" or "list Microsoft cloud SKUs with discounts" both start here. Returns matching products with Ingram/vendor part numbers; call ingrammicro_get_price_and_availability next for live pricing/stock.
| Name | Required | Description | Default |
|---|---|---|---|
| vendor | No | Vendor/manufacturer name(s). | |
| keyword | No | Free-text keyword(s): Ingram/vendor part number, product title, or vendor name. | |
| category | No | Product category, e.g. "Displays". | |
| sku_type | No | SKU type: "IM::physical", "IM::digital", or "IM::any". | |
| page_size | No | Records per page, max 100, default 25. | |
| page_number | No | Page number, default 1. | |
| has_discounts | No | Filter to products with an available discount. | |
| vendor_number | No | Vendor number. | |
| vendor_part_number | No | Vendor's own part number(s). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds behavior beyond that by explaining that it returns matching products with Ingram/vendor part numbers and that pricing/stock requires a follow-up call, giving the agent a clear expectation of the operation's outcome.
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 states scope and search dimensions, the second provides examples and a forward pointer to the pricing tool. All information is relevant and efficiently front-loaded.
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 search tool with a rich output schema, read-only annotations, and self-explanatory parameters, the description covers the essential purpose, examples, and next step. Nothing necessary for correct invocation 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?
Schema coverage is 100%, so all nine parameters are already documented with descriptions. The description mentions keyword, vendor, category, and SKU type but adds no semantic detail beyond the schema. It provides examples that imply usage but does not deepen parameter understanding, so baseline 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?
Description states a specific verb (search) and resource (product catalog) with clear search dimensions (keyword, vendor, category, SKU type). Concrete example queries make the purpose unmistakable and distinguish it from sibling get_product_detail by focusing on search over retrieval.
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 on when to use it via realistic example queries and explicitly routes the agent to ingrammicro_get_price_and_availability for live pricing/stock. It does not explicitly exclude alternatives, but the guidance is sufficient for an agent to select this tool for catalog search.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ingrammicro_search_quotesARead-onlyIdempotent
Search quotes by number, status, vendor, or end customer. Use this to find a quote's number before ingrammicro_get_quote, ingrammicro_validate_quote_to_order, or converting it to an order with ingrammicro_create_cloud_order.
| Name | Required | Description | Default |
|---|---|---|---|
| status | No | Quote status, e.g. "Ready to Order". | |
| page_size | No | Records per page, default 25. | |
| quote_name | No | Quote name given at creation time. | |
| page_number | No | Page number, default 1. | |
| vendor_name | No | Vendor/manufacturer name. | |
| quote_number | No | Quote number, e.g. "QUO-10985-C4C3F7". | |
| requester_email | Yes | Email of the person requesting this search (Ingram requires it). | |
| end_user_contact | No | End-customer name on the quote. | |
| special_bid_number | No | Special-pricing bid number. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, covering the safety profile. The description adds no additional behavioral context beyond the search intent—no mention of pagination behavior, error conditions, or response shape. It does not contradict the annotations, but it also does not enrich them. With annotations in place, a score of 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded: the first sentence states the action and filters, and the second sentence explains the usage context. No wasted words. It could be considered slightly repetitive in listing filters that are also in the schema, but overall it is well-structured and efficient.
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 that this is a search tool with an output schema, annotations for read-only and idempotency, and 100% parameter coverage in the schema, the description provides the needed context for when to use it and how it fits into a workflow. It does not explain the output structure, but that is already covered by the output schema. Minor gap: it doesn't mention that this is a paginated query, though the schema already documents page_size and page_number defaults, so 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%, with each parameter already described (e.g., status, page_size, quote_name, etc.). The description's mention of search criteria (number, status, vendor, end customer) partially mirrors those parameters but adds no new meaning beyond the schema. Baseline 3 is correct when 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 uses a specific verb 'Search' with the resource 'quotes' and lists distinct filter criteria (number, status, vendor, end customer). It clearly distinguishes itself from sibling tools like ingrammicro_get_quote (which retrieves a single known quote) by positioning itself as the way to find a quote number before subsequent operations. The purpose is unambiguous and non-tautological.
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 explicitly states when to use this tool: 'Use this to find a quote's number before ingrammicro_get_quote, ingrammicro_validate_quote_to_order, or converting it to an order with ingrammicro_create_cloud_order.' This gives clear context and connects to related tools. However, it does not explicitly state when not to use it or mention alternative search tools, so it falls just 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.
ingrammicro_search_renewalsARead-onlyIdempotent
Search upcoming or past subscription/support renewals by order, vendor, end customer, or opportunity status. Use this to find the renewal id before ingrammicro_get_renewal.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number. | |
| size | No | Records per page, default 25. | |
| vendor | No | Vendor/manufacturer name. | |
| end_user | No | End-customer name. | |
| serial_number | No | Product serial number. | |
| opportunity_status | No | Renewal opportunity status: "Open" or "Closed". | |
| customer_order_number | No | Your own PO/order number. | |
| opportunity_sub_status | No | Sub-status, e.g. "Ready to order", "Quote pending", "Expired", "Ordered" — see Ingram Micro docs for the full list. | |
| ingram_purchase_order_number | No | Ingram Micro sales order number. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the operation is read-only and idempotent, so the safety profile is covered. The description adds some scope information by stating 'upcoming or past' renewals and noting the lookup workflow, but it does not add behavioral details like pagination behavior, result size limits, or API quirks. This is acceptable given the strong annotation coverage.
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 compact: two sentences with no filler. The first sentence states the action and filter scope, while the second explains the tool's role in the larger workflow. 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 read-only/idempotent annotations, a 100%-covered schema, and the presence of an output schema, the description provides what an agent needs to select and invoke this tool correctly. It explains the tool's purpose and how it connects to ingrammicro_get_renewal without duplicating structured metadata.
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 all nine parameters are already documented in the schema. The description mentions several filter categories (order, vendor, end customer, opportunity status) but does not add meaningful semantics beyond what the schema provides. Baseline 3 is appropriate since the schema carries the parameter burden.
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 ('Search') and resource ('renewals'), and identifies the key filter dimensions: order, vendor, end customer, and opportunity status. It also contextualizes the tool within a workflow by mentioning it is used to find the renewal id before ingrammicro_get_renewal, which clearly distinguishes it from other search/get tools.
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 usage context: 'Use this to find the renewal id before ingrammicro_get_renewal.' This makes the intended workflow explicit, though it does not spell out when-not-to-use alternatives or contrast with related search tools such as ingrammicro_search_orders or ingrammicro_search_deals.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ingrammicro_search_returnsARead-onlyIdempotent
Search return (RMA) requests by invoice, product, or status. Use this to find the exact case_request_number before calling ingrammicro_get_return.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number. | |
| size | No | Records per page, default 25. | |
| return_status | No | Comma-separated statuses: Open, Approved, Partially Approved, Denied, Voided. | |
| invoice_number | No | Invoice number the return is against. | |
| return_claim_id | No | Unique return claim id. | |
| reference_number | No | Return reference number. | |
| ingram_part_number | No | Ingram Micro SKU being returned. | |
| vendor_part_number | No | Vendor SKU being returned. | |
| case_request_number | No | Unique return request number. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, covering the safety profile. The description adds useful context about searchable criteria and the downstream use of the result, but it does not discuss pagination or result behavior beyond that, which is a minor gap given 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?
The description is two concise sentences with no redundancy. The main action and resource are front-loaded, and the follow-up instruction about calling ingrammicro_get_return earns its place by clarifying the tool's purpose in the workflow.
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 essential workflow for a search tool: find returns and retrieve the case_request_number for use in a follow-up call. All 9 parameters are documented in the schema, and an output schema exists, so the only minor gap is that the description does not enumerate every possible search key.
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 every parameter already has a clear description. The description references invoice, product, and status filters, but it does not add meaning beyond what the schema provides, warranting the baseline score.
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, 'Search', and names a concrete resource: 'return (RMA) requests'. It also lists meaningful search dimensions — invoice, product, or status — and clearly separates this tool from ingrammicro_get_return by presenting it as the prerequisite lookup step.
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 explicitly tells the agent to use this tool to find the exact case_request_number before calling ingrammicro_get_return. This establishes a clear retrieval workflow and identifies the relevant sibling tool to use next.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ingrammicro_validate_quote_to_orderARead-onlyIdempotent
Validate a quote before converting it to an order, and learn which fields the vendor requires at header and line level for the Quote-to-Order call.
Always call this before ingrammicro_create_cloud_order(quote_number=...)
— the response's vmfAdditionalAttributes (header level) and each
line's vmfAdditionalAttributesLines name the exact vendor-mandatory
fields to copy into that call's additional_attributes.
| Name | Required | Description | Default |
|---|---|---|---|
| quote_number | Yes | Ingram Micro quote number, e.g. "QUO-14551943-D2Y9L9". |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, so the read-only, side-effect-free behavior is covered. The description adds valuable context about the response structure: vmfAdditionalAttributes at header level and vmfAdditionalAttributesLines at line level, which describe what the validation returns beyond 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?
The description is tightly structured: purpose first, then the exact call sequence, then what to extract from the response. Every sentence adds actionable guidance with no filler or redundant restating of the tool name.
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?
With one documented parameter, an output schema present, and clear instructions on how to use the response, the description fully equips an agent to call this tool and act on its results. It also names the prerequisite relationship with a sibling, making the integration context 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 single quote_number parameter is already well documented. The description reinforces the parameter's purpose by showing it passed to create_cloud_order, but it does not add new semantic detail beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('Validate'), a specific resource ('a quote before converting it to an order'), and a secondary outcome ('learn which fields the vendor requires'). It clearly distinguishes the tool from siblings like ingrammicro_create_cloud_order and ingrammicro_create_order by positioning it as a prerequisite validation step.
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 explicitly says 'Always call this before ingrammicro_create_cloud_order(quote_number=...)' and names the exact sibling tool to pair with. This leaves no ambiguity about when to use this tool versus the order-creation alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Each tool targets a distinct resource and action, with search/get pairs clearly separated by whether an exact ID is known. Potential overlaps like create_order vs create_cloud_order and get_product_detail vs get_product_detail_by_reference are explicitly disambiguated in the descriptions.
All tools follow the consistent ingrammicro_ prefix with verb_noun snake_case naming. Verbs like get, search, create, modify, cancel, and validate are used predictably across the set, making intent easy to infer.
At 24 tools, this is slightly above the typical well-scoped range, but the count is justified by the broad distribution domain covering products, orders, quotes, invoices, returns, renewals, deals, and freight. Each tool has a clear place, so the set feels substantial rather than bloated.
The toolset covers the core reseller workflow end-to-end: product search/detail/pricing, order placement with modification/cancellation, quote creation through validation and conversion, plus invoices, returns, renewals, deals, and freight estimates. No significant dead ends or missing lifecycle operations for the stated domain are apparent.
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Search multi-merchant supply, checkout, and track orders via MCP.
Unified MCP server for 70+ eCommerce platforms: products, orders, customers, and more.
Sherweb Platform MCP server to manage subscriptions and orders. Use OpenID Connect to authenticate.
Search, document and execute authenticated API calls across 700+ apps via one MCP server
Related MCP Servers
- AlicenseAqualityAmaintenanceMCP server for Sherweb Partner API - distributor billing, service provider management, customer subscriptions, and payable charges12Apache 2.0
- AlicenseNot gradedqualityCmaintenanceStateless HTTP MCP service that exposes the Pax8 Partner API as tools for AI assistants to query companies, subscriptions, invoices, orders, products, and usage data.Apache 2.0

Devnors Data MCP Serverofficial
AlicenseNot gradedqualityCmaintenanceEnables MCP clients to discover capabilities and call legal, enterprise, content, and express APIs using a Devnors Data API Key.137MIT- AlicenseNot gradedqualityDmaintenanceProvides a multilingual, region-aware brand catalogue and click-through URL generation for MCP-compatible agents, enabling commerce recommendations with attribution tracking.MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/MSPbotsAI/ingrammicro-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server