Machine interface

Connect an assistant

JSON-RPC 2.0 over streamable HTTP. Every door on the platform exposes the identical three tools, so an assistant learns the interface once and can then quote against any vendor. No authentication is required for pricing, counts or quote requests. Calls are rate limited per caller per door, and logged.

Replace <vendor> with a door address from the directory.

Client configuration

{
  "mcpServers": {
    "machine-door": {
      "type": "http",
      "url": "https://machinedoors.com/api/public/d/<vendor>/mcp"
    }
  }
}

Direct call

curl -s https://machinedoors.com/api/public/d/<vendor>/mcp \
  -H 'content-type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call",
       "params":{"name":"request_quote",
                 "arguments":{"geography":"us-west",
                              "category":"residential",
                              "quantity":25000}}}'

Tool schemas

get_rate_card

The vendor's current published rate card: line items, units, unit prices, minimums, terms, version and effective date. Prices are the vendor's own published figures.

Guardrail: Pricing and terms only. No records, no customer data. A placeholder rate card is labelled as such in every payload.

{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}

get_coverage_counts

Availability counts, optionally narrowed by geography and/or category code. Returns a count and nothing else.

Guardrail: Counts only. Any extra selector — demographics, attributes, identifiers — is rejected rather than silently ignored.

{
  "type": "object",
  "properties": {
    "geography": {
      "type": "string",
      "description": "Published geography code."
    },
    "category": {
      "type": "string",
      "description": "Published category code."
    }
  },
  "additionalProperties": false
}

request_quote

Price a scoped job against the current rate card and receive an itemised quotation plus an expiring quote token.

Guardrail: A quote request, not an order and not a purchase. Nothing is charged and no inventory is reserved; a human at the vendor closes the order.

{
  "type": "object",
  "properties": {
    "quantity": {
      "type": "integer",
      "minimum": 1
    },
    "geography": {
      "type": "string"
    },
    "category": {
      "type": "string"
    },
    "rush": {
      "type": "boolean"
    }
  },
  "required": [
    "quantity"
  ],
  "additionalProperties": false
}

Plain HTTP

GET/api/public/d/<vendor>/rate-cardCurrent rate card as JSON.
GET/api/public/d/<vendor>/coverage-countsAvailability counts. Optional geography and category query parameters.
GET/api/public/d/<vendor>/discoveryServer descriptor and tool list.
GET/api/public/d/<vendor>/llmsPlain-language context for assistants.
POST/api/public/d/<vendor>/mcpJSON-RPC 2.0 MCP endpoint.
GET/api/public/doors?q=&vertical=&geography=&category=Search published doors. Also the search_doors tool on /api/public/mcp.
GET/api/public/verify-quote?token=<64-hex>Return what a door recorded for a quote token: price, scope, version, expiry.

The older root endpoints /api/public/rate-card, /api/public/coverage-counts and /api/public/mcp still work and serve the reference door.

/api/public/verify-quote is public and rate limited. It returns the quotation the door stored and nothing about whoever asked for it. A token that is malformed or unknown returns 400 or 404 rather than a partial answer.