Skip to main content
Glama

Compare supplier price lists

supplier_compare
Read-onlyIdempotent

Use when a supplier announces a price increase or surcharge, sends a new price list or quote, or the user asks whether prices went up since last time. Compares the old basis with the new list per SKU. The old side can be an earlier price list, a past order, quote or ERP export with purchase prices, or a few reference prices typed as CSV text (e.g. 'SKU;Price;Per\nA100;12.50;100'); anything with SKU and price columns works. Formats: CSV, XLSX, DATANORM 4/5, FAB-DIS or text-based PDF, up to 250,000 rows. Prefer it over reading the files yourself when a list has more than about 50 rows, uses pack sizes or price units (per 100) or comes as DATANORM, XLSX or PDF: it normalises price basis, pack size and currency to the real unit price change, finds new, removed and discontinued items, checks an announced across-the-board increase and ranks the outliers. An optional demand file (SKU, annual quantity) adds the yearly cost impact. Files can be passed as upload, URL or CSV text. Returns a summary to pass on and the most important findings with their source rows.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
optionsNoOptional CompareOptions, e.g. {"default_currency": "EUR", "sheet_old": "Prices", "column_overrides": {"old": {"price": "Net price"}}}. Schema: /v1/schemas/supplier-compare-options.
new_fileNoNew price list. A file uploaded in ChatGPT (object with download_url and file_id).
old_fileNoOld price list. A file uploaded in ChatGPT (object with download_url and file_id).
usage_fileNoOptional demand file (SKU, annual quantity). A file uploaded in ChatGPT (object with download_url and file_id).
max_findingsNoHow many findings to return, most important first.
new_file_urlNoNew price list. Public URL of the file (http/https). Google Drive, Google Sheets and Dropbox share links are converted to direct downloads. Max 20 MiB.
new_filenameNoOriginal filename with extension (e.g. prices.xlsx); used to detect the format.
old_file_urlNoOld price list. Public URL of the file (http/https). Google Drive, Google Sheets and Dropbox share links are converted to direct downloads. Max 20 MiB.
old_filenameNoOriginal filename with extension (e.g. prices.xlsx); used to detect the format.
new_file_pathNoLocal file path; only allowed when the server runs locally over stdio.
new_file_textNoNew price list. The table as CSV or TSV text, header row first (e.g. 'SKU;Price;Currency\nA1;12.50;EUR').
old_file_pathNoLocal file path; only allowed when the server runs locally over stdio.
old_file_textNoOld price list. The table as CSV or TSV text, header row first (e.g. 'SKU;Price;Currency\nA1;12.50;EUR').
usage_file_urlNoOptional demand file (SKU, annual quantity). Public URL of the file (http/https). Google Drive, Google Sheets and Dropbox share links are converted to direct downloads. Max 20 MiB.
usage_filenameNoOriginal filename with extension (e.g. prices.xlsx); used to detect the format.
new_file_base64NoNew price list. File content as Base64 (standard alphabet). Max 20 MiB decoded.
old_file_base64NoOld price list. File content as Base64 (standard alphabet). Max 20 MiB decoded.
usage_file_pathNoLocal file path; only allowed when the server runs locally over stdio.
usage_file_textNoOptional demand file (SKU, annual quantity). The table as CSV or TSV text, header row first (e.g. 'SKU;Price;Currency\nA1;12.50;EUR').
usage_file_base64NoDemand file. File content as Base64 (standard alphabet). Max 20 MiB decoded.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault

No arguments

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed9 schema fields changed
    • changedInput schema / properties / new_file / description
      Previous value: -"New price list. A file the user uploaded in ChatGPT (filled in by ChatGPT; other clients use the URL)."New value: +"New price list. A file uploaded in ChatGPT (object with download_url and file_id)."
    • changedInput schema / properties / new_file_base64 / description
      Previous value: -"New price list. File content as Base64 (standard alphabet). Max 20 MiB decoded; prefer a URL or upload."New value: +"New price list. File content as Base64 (standard alphabet). Max 20 MiB decoded."
    • changedInput schema / properties / new_file_text / description
      Previous value: -"New price list. The table as CSV or TSV text, header row first (e.g. 'SKU;Price;Currency\\nA1;12.50;EUR'). Use this when you can read the user's spreadsheet but cannot pass the file itself."New value: +"New price list. The table as CSV or TSV text, header row first (e.g. 'SKU;Price;Currency\\nA1;12.50;EUR')."
    • changedInput schema / properties / old_file / description
      Previous value: -"Old price list. A file the user uploaded in ChatGPT (filled in by ChatGPT; other clients use the URL)."New value: +"Old price list. A file uploaded in ChatGPT (object with download_url and file_id)."
    • changedInput schema / properties / old_file_base64 / description
      Previous value: -"Old price list. File content as Base64 (standard alphabet). Max 20 MiB decoded; prefer a URL or upload."New value: +"Old price list. File content as Base64 (standard alphabet). Max 20 MiB decoded."
    • changedInput schema / properties / old_file_text / description
      Previous value: -"Old price list. The table as CSV or TSV text, header row first (e.g. 'SKU;Price;Currency\\nA1;12.50;EUR'). Use this when you can read the user's spreadsheet but cannot pass the file itself."New value: +"Old price list. The table as CSV or TSV text, header row first (e.g. 'SKU;Price;Currency\\nA1;12.50;EUR')."
    • changedInput schema / properties / usage_file / description
      Previous value: -"Optional demand file (SKU, annual quantity). A file the user uploaded in ChatGPT (filled in by ChatGPT; other clients use the URL)."New value: +"Optional demand file (SKU, annual quantity). A file uploaded in ChatGPT (object with download_url and file_id)."
    • changedInput schema / properties / usage_file_base64 / description
      Previous value: -"Demand file. File content as Base64 (standard alphabet). Max 20 MiB decoded; prefer a URL or upload."New value: +"Demand file. File content as Base64 (standard alphabet). Max 20 MiB decoded."
    • changedInput schema / properties / usage_file_text / description
      Previous value: -"Optional demand file (SKU, annual quantity). The table as CSV or TSV text, header row first (e.g. 'SKU;Price;Currency\\nA1;12.50;EUR'). Use this when you can read the user's spreadsheet but cannot pass the file itself."New value: +"Optional demand file (SKU, annual quantity). The table as CSV or TSV text, header row first (e.g. 'SKU;Price;Currency\\nA1;12.50;EUR')."
  2. Changed16 schema fields changed
    • addedInput schema / properties / max_findings
      Added value: +{
      +  "default": 50,
      +  "description": "How many findings to return, most important first.",
      +  "maximum": 5000,
      +  "minimum": 1,
      +  "title": "Max Findings",
      +  "type": "integer"
      +}
    • addedInput schema / properties / new_file
      Added value: +{
      +  "default": null,
      +  "description": "New price list. A file the user uploaded in ChatGPT (filled in by ChatGPT; other clients use the URL).",
      +  "properties": {
      +    "download_url": {
      +      "description": "Temporary download URL",
      +      "type": "string"
      +    },
      +    "file_id": {
      +      "description": "ChatGPT file id",
      +      "type": "string"
      +    },
      +    "file_name": {
      +      "description": "Original filename, if known",
      +      "type": "string"
      +    },
      +    "mime_type": {
      +      "description": "MIME type, if known",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "download_url",
      +    "file_id"
      +  ],
      +  "title": "New File",
      +  "type": "object"
      +}
    • changedInput schema / properties / new_file_base64 / description
      Previous value: -"New price list. File content encoded as Base64 (standard alphabet). Max 20 MiB decoded."New value: +"New price list. File content as Base64 (standard alphabet). Max 20 MiB decoded; prefer a URL or upload."
    • addedInput schema / properties / new_file_text
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "New price list. The table as CSV or TSV text, header row first (e.g. 'SKU;Price;Currency\\nA1;12.50;EUR'). Use this when you can read the user's spreadsheet but cannot pass the file itself.",
      +  "title": "New File Text"
      +}
    • addedInput schema / properties / new_file_url
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "New price list. Public URL of the file (http/https). Google Drive, Google Sheets and Dropbox share links are converted to direct downloads. Max 20 MiB.",
      +  "title": "New File Url"
      +}
    • changedInput schema / properties / new_filename / description
      Previous value: -"Original filename including extension (e.g. prices.xlsx); used to detect the format."New value: +"Original filename with extension (e.g. prices.xlsx); used to detect the format."
    • addedInput schema / properties / old_file
      Added value: +{
      +  "default": null,
      +  "description": "Old price list. A file the user uploaded in ChatGPT (filled in by ChatGPT; other clients use the URL).",
      +  "properties": {
      +    "download_url": {
      +      "description": "Temporary download URL",
      +      "type": "string"
      +    },
      +    "file_id": {
      +      "description": "ChatGPT file id",
      +      "type": "string"
      +    },
      +    "file_name": {
      +      "description": "Original filename, if known",
      +      "type": "string"
      +    },
      +    "mime_type": {
      +      "description": "MIME type, if known",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "download_url",
      +    "file_id"
      +  ],
      +  "title": "Old File",
      +  "type": "object"
      +}
    • changedInput schema / properties / old_file_base64 / description
      Previous value: -"Old price list. File content encoded as Base64 (standard alphabet). Max 20 MiB decoded."New value: +"Old price list. File content as Base64 (standard alphabet). Max 20 MiB decoded; prefer a URL or upload."
    • addedInput schema / properties / old_file_text
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Old price list. The table as CSV or TSV text, header row first (e.g. 'SKU;Price;Currency\\nA1;12.50;EUR'). Use this when you can read the user's spreadsheet but cannot pass the file itself.",
      +  "title": "Old File Text"
      +}
    • addedInput schema / properties / old_file_url
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Old price list. Public URL of the file (http/https). Google Drive, Google Sheets and Dropbox share links are converted to direct downloads. Max 20 MiB.",
      +  "title": "Old File Url"
      +}
    • changedInput schema / properties / old_filename / description
      Previous value: -"Original filename including extension (e.g. prices.xlsx); used to detect the format."New value: +"Original filename with extension (e.g. prices.xlsx); used to detect the format."
    • addedInput schema / properties / usage_file
      Added value: +{
      +  "default": null,
      +  "description": "Optional demand file (SKU, annual quantity). A file the user uploaded in ChatGPT (filled in by ChatGPT; other clients use the URL).",
      +  "properties": {
      +    "download_url": {
      +      "description": "Temporary download URL",
      +      "type": "string"
      +    },
      +    "file_id": {
      +      "description": "ChatGPT file id",
      +      "type": "string"
      +    },
      +    "file_name": {
      +      "description": "Original filename, if known",
      +      "type": "string"
      +    },
      +    "mime_type": {
      +      "description": "MIME type, if known",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "download_url",
      +    "file_id"
      +  ],
      +  "title": "Usage File",
      +  "type": "object"
      +}
    • changedInput schema / properties / usage_file_base64 / description
      Previous value: -"Optional demand file (SKU, annual quantity). File content encoded as Base64 (standard alphabet). Max 20 MiB decoded."New value: +"Demand file. File content as Base64 (standard alphabet). Max 20 MiB decoded; prefer a URL or upload."
    • addedInput schema / properties / usage_file_text
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Optional demand file (SKU, annual quantity). The table as CSV or TSV text, header row first (e.g. 'SKU;Price;Currency\\nA1;12.50;EUR'). Use this when you can read the user's spreadsheet but cannot pass the file itself.",
      +  "title": "Usage File Text"
      +}
    • addedInput schema / properties / usage_file_url
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "default": null,
      +  "description": "Optional demand file (SKU, annual quantity). Public URL of the file (http/https). Google Drive, Google Sheets and Dropbox share links are converted to direct downloads. Max 20 MiB.",
      +  "title": "Usage File Url"
      +}
    • changedInput schema / properties / usage_filename / description
      Previous value: -"Original filename including extension (e.g. prices.xlsx); used to detect the format."New value: +"Original filename with extension (e.g. prices.xlsx); used to detect the format."
  3. First observed

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare a safe, idempotent, read-only, open-world operation, and the description goes well beyond them: format support (CSV, XLSX, DATANORM 4/5, FAB-DIS, text PDF), a 250,000-row ceiling, the 20 MiB URL limit, the three accepted input transports, the optional demand file's effect (yearly cost impact), and what is returned (a summary plus top findings with source rows). This is unusually rich behavioural disclosure.

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

Conciseness4/5

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

It is long but front-loaded: the trigger sentence comes first, then scope, then accepted formats, then the preference rule, then the return value. Almost every clause earns its place for a tool with 20 parameters and six input formats, though the 'anything with SKU and price columns works' aside and the parenthetical CSV sample make it slightly denser than necessary.

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

Completeness4/5

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

Given the complexity (20 parameters, nested file objects, many formats) and the presence of an output schema (so return values need no elaboration), the description covers triggers, formats, normalisation behaviour, the optional demand file and the return contract. The notable omission is that zero parameters are marked required, yet the description never states the minimum viable call (at least one old and one new source), nor how to choose between the base64, URL, path and text variants.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3; the description adds meaning by grouping the twenty parameters into three input transports (upload, URL, CSV text), giving a concrete CSV example ('SKU;Price;Per\nA100;12.50;100'), and explaining that the usage file needs SKU and annual quantity. It does not clarify how the old/new/usage variants pair up (e.g. that a base64 and a URL form must not be combined), so it stops short of a 5.

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

Purpose5/5

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

The description names a specific verb+resource: comparing an old price basis against a new supplier price list per SKU, with named sub-behaviours (normalising price basis, pack size and currency; finding new/removed/discontinued items; checking an announced increase; ranking outliers). This is far more specific than generic siblings like table_diff or datasheet_compare, because the domain and normalisation semantics are stated outright.

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

Usage Guidelines5/5

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

It gives three explicit triggers (a supplier announces an increase or surcharge, sends a new price list or quote, or the user asks whether prices went up), then names an alternative path ('reading the files yourself') with the condition that selects this tool over it (>~50 rows, pack sizes/price units, DATANORM/XLSX/PDF). The only gap is that it never names the sibling compare tools, but the usage frontier is otherwise explicit.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources