{
  "info": {
    "_postman_id": "40dc0984-58db-4034-91ab-522728cd97a2",
    "name": "Trident Taxis MCP",
    "description": "One request per MCP tool at https://tridenttaxis.online/mcp. Set the `mcpEndpoint` and (optionally) `accessToken` collection variables. To use OAuth mode, enable the Authorization header on each request.",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json",
    "_exporter_id": "trident-taxis"
  },
  "item": [
    {
      "name": "estimate_fare — Estimate fare",
      "request": {
        "method": "POST",
        "description": "Live GBP quote between a UK pickup and dropoff using the Argyll & Bute council tariff, vehicle rate mapping, and surcharges (airport, meet & greet, 8-seater local, pre-booking). Returns distance, duration, applied rules, and the tariff version.",
        "header": [
          {
            "key": "Content-Type",
            "value": "application/json"
          },
          {
            "key": "Accept",
            "value": "application/json, text/event-stream",
            "description": "Both media types required by MCP Streamable HTTP — omitting text/event-stream returns HTTP 406."
          },
          {
            "key": "MCP-Protocol-Version",
            "value": "2025-06-18"
          },
          {
            "key": "Authorization",
            "value": "Bearer {{accessToken}}",
            "description": "OAuth mode only. Leave the accessToken variable blank in public mode; Postman will still send an empty header, which the server ignores.",
            "disabled": true
          }
        ],
        "url": {
          "raw": "{{mcpEndpoint}}",
          "host": [
            "{{mcpEndpoint}}"
          ]
        },
        "body": {
          "mode": "raw",
          "raw": "{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"tools/call\",\n  \"params\": {\n    \"name\": \"estimate_fare\",\n    \"arguments\": {\n      \"pickup\": \"Helensburgh Central Station\",\n      \"dropoff\": \"Glasgow Airport\",\n      \"vehicleType\": \"executive\",\n      \"meetAndGreet\": false\n    }\n  }\n}",
          "options": {
            "raw": {
              "language": "json"
            }
          }
        }
      },
      "response": [],
      "event": [
        {
          "listen": "test",
          "script": {
            "exec": [
              "pm.test('HTTP 2xx', () => pm.response.to.be.success);",
              "const ct = pm.response.headers.get('content-type') || '';",
              "if (ct.includes('application/json')) {",
              "  const json = pm.response.json();",
              "  pm.test('JSON-RPC result present', () => pm.expect(json).to.have.property('result'));",
              "} else if (ct.includes('text/event-stream')) {",
              "  const raw = pm.response.text();",
              "  const frames = raw.split(/\\r?\\n\\r?\\n/)",
              "    .map(evt => evt.split(/\\r?\\n/).filter(l => l.startsWith('data:')).map(l => l.slice(5).replace(/^ /, '')).join('\\n'))",
              "    .filter(Boolean);",
              "  pm.test('SSE stream had a final JSON-RPC frame', () => {",
              "    const last = JSON.parse(frames[frames.length - 1]);",
              "    pm.expect(last).to.have.property('id');",
              "  });",
              "}"
            ],
            "type": "text/javascript"
          }
        }
      ]
    },
    {
      "name": "get_service_info — Get service info",
      "request": {
        "method": "POST",
        "description": "Overview of the operator: coverage area, vehicle fleet with passenger capacity, tariff bands, surcharge summary, and booking channels. No input required.",
        "header": [
          {
            "key": "Content-Type",
            "value": "application/json"
          },
          {
            "key": "Accept",
            "value": "application/json, text/event-stream",
            "description": "Both media types required by MCP Streamable HTTP — omitting text/event-stream returns HTTP 406."
          },
          {
            "key": "MCP-Protocol-Version",
            "value": "2025-06-18"
          },
          {
            "key": "Authorization",
            "value": "Bearer {{accessToken}}",
            "description": "OAuth mode only. Leave the accessToken variable blank in public mode; Postman will still send an empty header, which the server ignores.",
            "disabled": true
          }
        ],
        "url": {
          "raw": "{{mcpEndpoint}}",
          "host": [
            "{{mcpEndpoint}}"
          ]
        },
        "body": {
          "mode": "raw",
          "raw": "{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"tools/call\",\n  \"params\": {\n    \"name\": \"get_service_info\",\n    \"arguments\": {}\n  }\n}",
          "options": {
            "raw": {
              "language": "json"
            }
          }
        }
      },
      "response": [],
      "event": [
        {
          "listen": "test",
          "script": {
            "exec": [
              "pm.test('HTTP 2xx', () => pm.response.to.be.success);",
              "const ct = pm.response.headers.get('content-type') || '';",
              "if (ct.includes('application/json')) {",
              "  const json = pm.response.json();",
              "  pm.test('JSON-RPC result present', () => pm.expect(json).to.have.property('result'));",
              "} else if (ct.includes('text/event-stream')) {",
              "  const raw = pm.response.text();",
              "  const frames = raw.split(/\\r?\\n\\r?\\n/)",
              "    .map(evt => evt.split(/\\r?\\n/).filter(l => l.startsWith('data:')).map(l => l.slice(5).replace(/^ /, '')).join('\\n'))",
              "    .filter(Boolean);",
              "  pm.test('SSE stream had a final JSON-RPC frame', () => {",
              "    const last = JSON.parse(frames[frames.length - 1]);",
              "    pm.expect(last).to.have.property('id');",
              "  });",
              "}"
            ],
            "type": "text/javascript"
          }
        }
      ]
    },
    {
      "name": "start_booking — Start booking",
      "request": {
        "method": "POST",
        "description": "Builds a prefilled booking URL with a live fare quote embedded in the query string. Does NOT confirm a booking — the passenger completes name, phone, date and payment on the site.",
        "header": [
          {
            "key": "Content-Type",
            "value": "application/json"
          },
          {
            "key": "Accept",
            "value": "application/json, text/event-stream",
            "description": "Both media types required by MCP Streamable HTTP — omitting text/event-stream returns HTTP 406."
          },
          {
            "key": "MCP-Protocol-Version",
            "value": "2025-06-18"
          },
          {
            "key": "Authorization",
            "value": "Bearer {{accessToken}}",
            "description": "OAuth mode only. Leave the accessToken variable blank in public mode; Postman will still send an empty header, which the server ignores.",
            "disabled": true
          }
        ],
        "url": {
          "raw": "{{mcpEndpoint}}",
          "host": [
            "{{mcpEndpoint}}"
          ]
        },
        "body": {
          "mode": "raw",
          "raw": "{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"tools/call\",\n  \"params\": {\n    \"name\": \"start_booking\",\n    \"arguments\": {\n      \"pickup\": \"Helensburgh Central Station\",\n      \"dropoff\": \"Glasgow Airport\",\n      \"vehicleType\": \"mpv\",\n      \"passengers\": 6,\n      \"meetAndGreet\": true\n    }\n  }\n}",
          "options": {
            "raw": {
              "language": "json"
            }
          }
        }
      },
      "response": [],
      "event": [
        {
          "listen": "test",
          "script": {
            "exec": [
              "pm.test('HTTP 2xx', () => pm.response.to.be.success);",
              "const ct = pm.response.headers.get('content-type') || '';",
              "if (ct.includes('application/json')) {",
              "  const json = pm.response.json();",
              "  pm.test('JSON-RPC result present', () => pm.expect(json).to.have.property('result'));",
              "} else if (ct.includes('text/event-stream')) {",
              "  const raw = pm.response.text();",
              "  const frames = raw.split(/\\r?\\n\\r?\\n/)",
              "    .map(evt => evt.split(/\\r?\\n/).filter(l => l.startsWith('data:')).map(l => l.slice(5).replace(/^ /, '')).join('\\n'))",
              "    .filter(Boolean);",
              "  pm.test('SSE stream had a final JSON-RPC frame', () => {",
              "    const last = JSON.parse(frames[frames.length - 1]);",
              "    pm.expect(last).to.have.property('id');",
              "  });",
              "}"
            ],
            "type": "text/javascript"
          }
        }
      ]
    }
  ],
  "variable": [
    {
      "key": "mcpEndpoint",
      "value": "https://tridenttaxis.online/mcp",
      "type": "string"
    },
    {
      "key": "accessToken",
      "value": "",
      "type": "string"
    }
  ]
}
