Skip to main content
Glama

Agentic Dealer Network

Export the catalog

network_snapshot
Read-onlyIdempotent

Export the whole network catalog (or one rooftop with rooftop_slug) as one gzip artifact instead of paging: returns a descriptor with a generation URL, strong ETag, row and byte counts, expiry and (when available) sync_cursor; small results are inlined as rows_inline. Views: manifest (identity, pricing, key attributes; default), summary (the network_search row), full (the inventory_get row). Formats: csv (default), json. Example: {"view": "manifest", "format": "csv"}. Re-download only when the ETag changes; poll inventory_changes with sync_cursor to stay current. Pass country=CA for Canadian dealers.

Input Schema

NameRequiredDescriptionDefault
viewNomanifest
formatNocsv
countryNoMarket to search; rooftops in the other country are excluded. Prices are in that country's currency; the radius stays in miles.US
rooftop_slugNo

Output Schema

NameRequiredDescriptionDefault
dataNo
errorNoUnknown and foreign thread ids are deliberately indistinguishable: both return invalid_params with message "unknown thread_id" (anti-enumeration).
freshnessNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "data": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "as_of_business_date": {
      +          "format": "date",
      +          "type": "string"
      +        },
      +        "bytes": {
      +          "minimum": 0,
      +          "type": "integer"
      +        },
      +        "bytes_compressed": {
      +          "minimum": 0,
      +          "type": "integer"
      +        },
      +        "catalog_version": {
      +          "type": "string"
      +        },
      +        "etag": {
      +          "type": "string"
      +        },
      +        "expires_at": {
      +          "format": "date-time",
      +          "type": "string"
      +        },
      +        "format": {
      +          "enum": [
      +            "csv",
      +            "json"
      +          ]
      +        },
      +        "generated_at": {
      +          "format": "date-time",
      +          "type": "string"
      +        },
      +        "market": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "country": {
      +              "enum": [
      +                "US",
      +                "CA"
      +              ],
      +              "type": "string"
      +            },
      +            "currency": {
      +              "type": "string"
      +            },
      +            "odometer_unit": {
      +              "enum": [
      +                "mi",
      +                "km"
      +              ],
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "country",
      +            "currency",
      +            "odometer_unit"
      +          ],
      +          "type": "object"
      +        },
      +        "rows": {
      +          "minimum": 0,
      +          "type": "integer"
      +        },
      +        "rows_inline": {
      +          "items": {
      +            "type": "object"
      +          },
      +          "type": "array"
      +        },
      +        "schema_version": {
      +          "const": 1
      +        },
      +        "scope": {
      +          "anyOf": [
      +            {
      +              "pattern": "^network:(?:US|CA)$",
      +              "type": "string"
      +            },
      +            {
      +              "pattern": "^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$",
      +              "type": "string"
      +            }
      +          ]
      +        },
      +        "snapshot_id": {
      +          "pattern": "^[0-9a-f]{24}$",
      +          "type": "string"
      +        },
      +        "sync_cursor": {
      +          "type": "string"
      +        },
      +        "url": {
      +          "format": "uri",
      +          "type": "string"
      +        },
      +        "view": {
      +          "enum": [
      +            "manifest",
      +            "summary",
      +            "full"
      +          ]
      +        }
      +      },
      +      "required": [
      +        "snapshot_id",
      +        "schema_version",
      +        "scope",
      +        "view",
      +        "format",
      +        "generated_at",
      +        "as_of_business_date",
      +        "rows",
      +        "bytes",
      +        "bytes_compressed",
      +        "etag",
      +        "url",
      +        "expires_at",
      +        "catalog_version"
      +      ],
      +      "type": "object"
      +    },
      +    "error": {
      +      "additionalProperties": false,
      +      "description": "Unknown and foreign thread ids are deliberately indistinguishable: both return invalid_params with message \"unknown thread_id\" (anti-enumeration).",
      +      "properties": {
      +        "auth_help_url": {
      +          "description": "Present only when no credential was supplied for a capability that requires one. Points to human documentation for obtaining a key. Absent for invalid, pending, or disabled credentials, which are deliberately indistinguishable.",
      +          "format": "uri",
      +          "maxLength": 500,
      +          "type": "string"
      +        },
      +        "code": {
      +          "enum": [
      +            "rooftop_not_found",
      +            "rooftop_inactive",
      +            "unit_not_found",
      +            "invalid_params",
      +            "rate_limited",
      +            "upstream_unavailable",
      +            "capability_unavailable",
      +            "identity_required",
      +            "quota_exceeded",
      +            "unit_held",
      +            "quote_expired",
      +            "rooftop_paused",
      +            "handoff_duplicate",
      +            "idempotency_conflict",
      +            "price_unavailable",
      +            "snapshot_expired",
      +            "artifact_too_large",
      +            "cursor_invalid",
      +            "cursor_expired",
      +            "ambiguous_identity",
      +            "unsupported_in_country"
      +          ]
      +        },
      +        "message": {
      +          "maxLength": 500,
      +          "type": "string"
      +        },
      +        "retry_after_seconds": {
      +          "minimum": 0,
      +          "type": "integer"
      +        },
      +        "retryable": {
      +          "type": "boolean"
      +        }
      +      },
      +      "required": [
      +        "code",
      +        "message",
      +        "retryable"
      +      ],
      +      "type": "object"
      +    },
      +    "freshness": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "by_rooftop": {
      +          "additionalProperties": {
      +            "additionalProperties": false,
      +            "properties": {
      +              "last_ingest_at": {
      +                "format": "date-time",
      +                "maxLength": 40,
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              },
      +              "status": {
      +                "enum": [
      +                  "fresh",
      +                  "stale",
      +                  "no_data"
      +                ]
      +              }
      +            },
      +            "required": [
      +              "status",
      +              "last_ingest_at"
      +            ],
      +            "type": "object"
      +          },
      +          "maxProperties": 500,
      +          "type": "object"
      +        }
      +      },
      +      "required": [
      +        "by_rooftop"
      +      ],
      +      "type": "object"
      +    }
      +  },
      +  "type": "object"
      +}
  2. Changed1 schema field changed
    • addedInput schema / properties / country
      Added value: +{
      +  "default": "US",
      +  "description": "Market to search; rooftops in the other country are excluded. Prices are in that country's currency; the radius stays in miles.",
      +  "enum": [
      +    "US",
      +    "CA"
      +  ],
      +  "type": "string"
      +}
  3. Added

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive and openWorld, so the safety profile is covered. The description goes further with behavior the annotations cannot express: the response is a descriptor (generation URL, strong ETag, row/byte counts, expiry, optional sync_cursor), with small results inlined as rows_inline — i.e. it may not return the data inline at all. Auth requirements and rate limits are not mentioned, which keeps it from a 5.

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?

Front-loaded with the core action, then structured as labeled lists (Views, Formats, Example) separated by semicolons, with a concrete JSON example. Dense but every clause is load-bearing; it is long only because the tool genuinely has three views, two formats and a caching protocol to describe.

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

Completeness5/5

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

The tool is complex (bulk export, ETag caching, sync_cursor), and the description covers scope, views, formats, an example, the caching protocol and the country switch. An output schema exists, yet the descriptor shape is still summarized, which is helpful rather than redundant. Nothing an agent needs to invoke this correctly is missing.

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 coverage is only 25% (country alone), so the description must carry the load and largely does: it defines what each view actually contains (manifest = identity/pricing/key attributes, summary = the network_search row, full = the inventory_get row), the two formats, the default values, and the single-rooftop mode. Only rooftop_slug's format is left to the schema pattern, so it falls just short of complete.

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?

States a specific verb and resource ('Export the whole network catalog ... as one gzip artifact instead of paging') and immediately contrasts the scope with per-row access. The view mapping to sibling rows (summary = the network_search row, full = the inventory_get row) lets an agent distinguish this from network_search and inventory_get without opening any schema.

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

Usage Guidelines5/5

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

Explicit when-to-use ('instead of paging'), explicit re-download policy ('Re-download only when the ETag changes'), and an explicit follow-up path ('poll inventory_changes with sync_cursor to stay current'), naming the sibling responsible for that. It also carves out the single-rooftop case via rooftop_slug and the Canadian market via country=CA.

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