Skip to main content
Glama

Agentic Dealer Network

Preview an out-the-door price

quote_preview
Read-onlyIdempotent

Read-only out-the-door price preview for one available unit at a named rooftop (pass rooftop_slug): base price plus itemized fees and taxes — fees already included in the listed price are flagged included_in_price and add nothing on top. Persists nothing; free to call while browsing. Fee schedules may be incomplete — an unlisted fee is not a guarantee that no such fee applies; confirm final charges with the dealer. Totals are estimates at best; when pricing_coverage is "partial_estimate", present the total as a subtotal excluding the charges in excluded. Always relay pricing_disclosure.

Input Schema

NameRequiredDescriptionDefault
identityYes
rooftop_slugYes

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": {
      +        "assumptions": {
      +          "items": {
      +            "maxLength": 500,
      +            "type": "string"
      +          },
      +          "maxItems": 50,
      +          "type": "array"
      +        },
      +        "freshness_disclosure": {
      +          "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"
      +            },
      +            "generated_at": {
      +              "format": "date-time",
      +              "type": "string"
      +            },
      +            "inventory_last_seen_at": {
      +              "format": "date-time",
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            }
      +          },
      +          "required": [
      +            "generated_at",
      +            "inventory_last_seen_at",
      +            "by_rooftop"
      +          ],
      +          "type": "object"
      +        },
      +        "pricing": {
      +          "additionalProperties": false,
      +          "dependentRequired": {
      +            "excluded": [
      +              "pricing_coverage",
      +              "pricing_disclosure"
      +            ],
      +            "pricing_coverage": [
      +              "excluded",
      +              "pricing_disclosure"
      +            ],
      +            "pricing_disclosure": [
      +              "pricing_coverage",
      +              "excluded"
      +            ]
      +          },
      +          "properties": {
      +            "base_price": {
      +              "description": "Exact decimal amount with two places (never a JSON float).",
      +              "pattern": "^-?[0-9]+\\.[0-9]{2}$",
      +              "type": "string"
      +            },
      +            "currency": {
      +              "const": "USD"
      +            },
      +            "excluded": {
      +              "items": {
      +                "additionalProperties": false,
      +                "properties": {
      +                  "code": {
      +                    "enum": [
      +                      "sales_tax",
      +                      "title",
      +                      "registration"
      +                    ]
      +                  },
      +                  "label": {
      +                    "maxLength": 40,
      +                    "type": "string"
      +                  },
      +                  "reason": {
      +                    "const": "varies_by_location"
      +                  }
      +                },
      +                "required": [
      +                  "code",
      +                  "label",
      +                  "reason"
      +                ],
      +                "type": "object"
      +              },
      +              "maxItems": 3,
      +              "type": "array"
      +            },
      +            "fees_total": {
      +              "description": "Exact decimal amount with two places (never a JSON float).",
      +              "pattern": "^-?[0-9]+\\.[0-9]{2}$",
      +              "type": "string"
      +            },
      +            "line_items": {
      +              "items": {
      +                "additionalProperties": false,
      +                "properties": {
      +                  "amount": {
      +                    "description": "Exact decimal amount with two places (never a JSON float).",
      +                    "pattern": "^-?[0-9]+\\.[0-9]{2}$",
      +                    "type": "string"
      +                  },
      +                  "basis": {
      +                    "enum": [
      +                      "firm",
      +                      "estimated"
      +                    ]
      +                  },
      +                  "category": {
      +                    "maxLength": 40,
      +                    "type": "string"
      +                  },
      +                  "code": {
      +                    "maxLength": 80,
      +                    "type": "string"
      +                  },
      +                  "fee_type": {
      +                    "enum": [
      +                      "flat",
      +                      "percent"
      +                    ]
      +                  },
      +                  "included_in_price": {
      +                    "type": "boolean"
      +                  },
      +                  "label": {
      +                    "maxLength": 200,
      +                    "type": "string"
      +                  },
      +                  "taxable": {
      +                    "type": "boolean"
      +                  }
      +                },
      +                "required": [
      +                  "code",
      +                  "label",
      +                  "category",
      +                  "fee_type",
      +                  "amount",
      +                  "taxable"
      +                ],
      +                "type": "object"
      +              },
      +              "maxItems": 100,
      +              "type": "array"
      +            },
      +            "otd_total": {
      +              "description": "Exact decimal amount with two places (never a JSON float).",
      +              "pattern": "^-?[0-9]+\\.[0-9]{2}$",
      +              "type": "string"
      +            },
      +            "pricing_coverage": {
      +              "enum": [
      +                "otd_estimate",
      +                "partial_estimate"
      +              ]
      +            },
      +            "pricing_disclosure": {
      +              "maxLength": 500,
      +              "type": "string"
      +            },
      +            "tax_total": {
      +              "description": "Exact decimal amount with two places (never a JSON float).",
      +              "pattern": "^-?[0-9]+\\.[0-9]{2}$",
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "base_price",
      +            "fees_total",
      +            "tax_total",
      +            "otd_total",
      +            "currency",
      +            "line_items"
      +          ],
      +          "type": "object"
      +        },
      +        "unit": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "condition": {
      +              "enum": [
      +                "new",
      +                "used"
      +              ]
      +            },
      +            "identity": {
      +              "maxLength": 30,
      +              "minLength": 5,
      +              "type": "string"
      +            },
      +            "make": {
      +              "maxLength": 80,
      +              "type": "string"
      +            },
      +            "model": {
      +              "maxLength": 80,
      +              "type": "string"
      +            },
      +            "model_year": {
      +              "maximum": 2100,
      +              "minimum": 1950,
      +              "type": "integer"
      +            }
      +          },
      +          "required": [
      +            "identity",
      +            "condition",
      +            "model_year",
      +            "make",
      +            "model"
      +          ],
      +          "type": "object"
      +        }
      +      },
      +      "required": [
      +        "unit",
      +        "pricing",
      +        "assumptions",
      +        "freshness_disclosure"
      +      ],
      +      "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. Added

TDQS

A3.9/5.0
Behavior5/5

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

Goes well beyond the readOnly/idempotent/non-destructive annotations: it discloses that nothing is persisted, that fees may be flagged included_in_price, that fee schedules can be incomplete, how to present totals when pricing_coverage is 'partial_estimate', and the directive to always relay pricing_disclosure. This is exactly the behavioral context annotations cannot carry.

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?

Dense but front-loaded — the core purpose leads and the caveats follow. Every sentence carries information, though the fee/disclaimer content is packed tightly enough that it borders on run-on.

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?

An output schema exists, so return values need not be enumerated, and the description still frames key response fields (pricing_coverage, excluded, pricing_disclosure). The unexplained 'identity' parameter is the one real completeness gap.

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

Parameters2/5

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

Schema description coverage is 0%, so the description must document both parameters. It explains rooftop_slug only by role ('named rooftop'), and the required 'identity' parameter (5-30 chars) is never mentioned at all, leaving an agent to guess its format and purpose.

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

Purpose4/5

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

States a specific verb and resource with scope: 'read-only out-the-door price preview for one available unit at a named rooftop'. The 'persists nothing' clause implicitly separates it from deal_quote's committed quote, but no sibling is named explicitly, so the differentiation must be inferred.

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

Usage Guidelines4/5

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

Gives clear usage context ('free to call while browsing', 'persists nothing') and a boundary ('confirm final charges with the dealer'). It never names an alternative tool or an explicit when-not-to-use condition, so it stops short of a 5.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources