Skip to content
AutomotiveMCP
Spec§3RFC / v0.1

Core Concepts

The building blocks every conformant server shares: resources, tools, errors, pagination, and eventing — expressed in MCP terms.


3.1 Resources and tools

The specification models the dealership as two kinds of capability, mapped onto MCP:

  • Resources are things an agent can read — a vehicle in inventory, a lead, a repair order. Resources are addressable, typed, and stable.
  • Tools are things an agent can do — create a lead, request a trade valuation, book a service appointment. Tools have typed inputs, typed outputs, and an explicit error contract.

A read MUST NOT have side effects. Any state change MUST be expressed as a tool call.

3.2 Tenancy and dealership scoping

Every resource exists within a dealership (the tenant). A conformant server MUST scope all reads and tools to an explicit dealership context — never return or mutate data across dealerships in a single call. The dealership is identified by a stable dealership_id.

How the context is supplied is implementation-defined (a parameter on the call or a value bound to the access token), but it MUST be explicit and MUST be enforced server-side. A token scoped to one dealership MUST NOT be able to read or act on another. Multi-rooftop groups are modeled as multiple dealerships, not as a blended tenant.

3.3 Identifiers

Every resource MUST carry a stable id that is unique within its namespace for that dealership. Where an industry identifier exists (for example a vin for a vehicle), it MUST be exposed as a named field in addition to id — never as the primary id itself, which is server-scoped.

3.4 Pagination

List operations MUST be cursor-based. A list response includes the page of items and an opaque next_cursor that is absent when the list is exhausted. Servers MUST treat cursors as opaque and MUST NOT require clients to construct them.

{
  "items": [ /* ... */ ],
  "next_cursor": "eyJvIjoyNX0"
}

3.5 Errors

Tools and resources MUST return structured, machine-readable errors with a stable code, a human-readable message, and an optional details object. Codes are namespaced and stable so agents can branch on them.

{
  "error": {
    "code": "deals.trade_value_unavailable",
    "message": "No trade valuation is available for this VIN in this market.",
    "details": { "vin": "1HGCM82633A004352" }
  }
}

Servers SHOULD distinguish retryable from terminal errors and SHOULD NOT leak provider internals or PII in error messages.

3.6 Eventing

For Level 3, a server exposes subscriptions so agents can react to change — a new lead, a status change on a repair order — rather than polling. Events reference the resource by id and carry a change type (created, updated, deleted). Delivery is at-least-once; consumers MUST be idempotent on the resource id and event identifier.

3.7 Time, money, and units

  • Timestamps MUST be RFC 3339 / ISO 8601 with an explicit offset.
  • Monetary amounts MUST be expressed as a minor-unit integer plus an ISO 4217 currency — never a float.
  • Measures (mileage, etc.) MUST carry an explicit unit field.