{
  "agentsJson": "0.1.0",
  "info": {
    "title": "Braidwater Rail",
    "description": "A regional-railway passenger-desk demo showing a website assistant grounded in the operator's own published conditions of travel and refund policy, opening a delay-repay or refund claim as a structured ticket through an in-chat form card, serving its service catalogue and ticket data over its own MCP server, registering its page actions over WebMCP, and reading back a signed-in passenger's own tickets through the identity hand-off.",
    "version": "1.0.0"
  },
  "sources": [
    {
      "id": "mcp",
      "path": "https://zendesk.demo.busymate.ai/openapi.json"
    }
  ],
  "flows": [
    {
      "id": "list_services",
      "title": "list services",
      "description": "The full Braidwater Rail catalogue — every service on offer, with its code, what it covers, which plan it belongs to and how long it takes.",
      "actions": [
        {
          "id": "call",
          "sourceId": "mcp",
          "operationId": "mcpJsonRpcCall"
        }
      ],
      "fields": {
        "parameters": [],
        "responses": {
          "success": {
            "type": "object",
            "description": "The JSON-RPC 2.0 tools/call result for this tool."
          }
        }
      }
    },
    {
      "id": "list_plans",
      "title": "list plans",
      "description": "Braidwater Rail's plans and what each one costs, including which services each tier covers and who it suits.",
      "actions": [
        {
          "id": "call",
          "sourceId": "mcp",
          "operationId": "mcpJsonRpcCall"
        }
      ],
      "fields": {
        "parameters": [],
        "responses": {
          "success": {
            "type": "object",
            "description": "The JSON-RPC 2.0 tools/call result for this tool."
          }
        }
      }
    },
    {
      "id": "search_knowledge",
      "title": "search knowledge",
      "description": "Search everything Braidwater Rail publishes — the services, the plan detail and the answers on its FAQ — by keyword. Use this before answering from memory.",
      "actions": [
        {
          "id": "call",
          "sourceId": "mcp",
          "operationId": "mcpJsonRpcCall"
        }
      ],
      "fields": {
        "parameters": [
          {
            "name": "query",
            "description": "A keyword or short phrase, e.g. a service name, a price question or a policy.",
            "required": true,
            "type": "string"
          }
        ],
        "responses": {
          "success": {
            "type": "object",
            "description": "The JSON-RPC 2.0 tools/call result for this tool."
          }
        }
      }
    },
    {
      "id": "get_ticket",
      "title": "get ticket",
      "description": "Look up one ticket at Braidwater Rail by its ticket number together with the email it was raised under. Both are needed — a ticket number alone never returns anything.",
      "actions": [
        {
          "id": "call",
          "sourceId": "mcp",
          "operationId": "mcpJsonRpcCall"
        }
      ],
      "fields": {
        "parameters": [
          {
            "name": "reference",
            "description": "The ticket number.",
            "required": true,
            "type": "string"
          },
          {
            "name": "email",
            "description": "The email address it belongs to.",
            "required": true,
            "type": "string"
          }
        ],
        "responses": {
          "success": {
            "type": "object",
            "description": "The JSON-RPC 2.0 tools/call result for this tool."
          }
        }
      }
    },
    {
      "id": "my_tickets",
      "title": "my tickets",
      "description": "Every ticket belonging to the SIGNED-IN visitor at Braidwater Rail, with its current state and what happens next. Only ever call this for the person actually signed in — never for an address somebody types.",
      "actions": [
        {
          "id": "call",
          "sourceId": "mcp",
          "operationId": "mcpJsonRpcCall"
        }
      ],
      "fields": {
        "parameters": [
          {
            "name": "email",
            "description": "The signed-in visitor's own email address, taken from their identity — never asked for in the chat.",
            "required": true,
            "type": "string"
          }
        ],
        "responses": {
          "success": {
            "type": "object",
            "description": "The JSON-RPC 2.0 tools/call result for this tool."
          }
        }
      }
    },
    {
      "id": "open_ticket",
      "title": "open ticket",
      "description": "Do NOT ask the person for these fields one at a time — calling this with whatever is already known IS how the form opens. Open a ticket at Braidwater Rail, and report back what was recorded.",
      "actions": [
        {
          "id": "call",
          "sourceId": "mcp",
          "operationId": "mcpJsonRpcCall"
        }
      ],
      "fields": {
        "parameters": [
          {
            "name": "subject",
            "description": "Which service it concerns — a code from list_services. Leave blank if unknown; the form lets the person pick.",
            "required": false,
            "type": "string"
          },
          {
            "name": "summary",
            "description": "One line of detail in the person's own words.",
            "required": false,
            "type": "string"
          },
          {
            "name": "urgency",
            "description": "How soon it matters, or the slot they want.",
            "required": false,
            "type": "string"
          },
          {
            "name": "name",
            "description": "Who it is for.",
            "required": false,
            "type": "string"
          },
          {
            "name": "email",
            "description": "The email the confirmation goes to.",
            "required": false,
            "type": "string"
          }
        ],
        "responses": {
          "success": {
            "type": "object",
            "description": "The JSON-RPC 2.0 tools/call result for this tool."
          }
        }
      }
    }
  ],
  "version": "1.0",
  "content": {
    "llms": "https://zendesk.demo.busymate.ai/llms.txt",
    "llmsFull": "https://zendesk.demo.busymate.ai/llms-full.txt",
    "sitemap": "https://zendesk.demo.busymate.ai/sitemap.xml",
    "markdown": {
      "contentNegotiation": true,
      "fallbackSuffix": ".md"
    }
  },
  "interfaces": [
    {
      "type": "mcp",
      "url": "https://zendesk.demo.busymate.ai/mcp",
      "transport": "streamable-http"
    },
    {
      "type": "webmcp",
      "url": "https://zendesk.demo.busymate.ai/webmcp-catalog.json",
      "transport": "in-page"
    }
  ],
  "authentication": {
    "oauth": null
  },
  "contact": {
    "human": "mailto:passengers@braidwaterrail.example"
  },
  "name": "Braidwater Rail",
  "url": "https://zendesk.demo.busymate.ai",
  "description": "A regional-railway passenger-desk demo showing a website assistant grounded in the operator's own published conditions of travel and refund policy, opening a delay-repay or refund claim as a structured ticket through an in-chat form card, serving its service catalogue and ticket data over its own MCP server, registering its page actions over WebMCP, and reading back a signed-in passenger's own tickets through the identity hand-off.",
  "mcp": {
    "url": "https://zendesk.demo.busymate.ai/mcp",
    "transport": "http",
    "auth": "none"
  },
  "webmcp": {
    "transport": "in-page",
    "registers": "document.modelContext"
  },
  "tools": [
    {
      "name": "list_services",
      "description": "The full Braidwater Rail catalogue — every service on offer, with its code, what it covers, which plan it belongs to and how long it takes.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "readOnlyHint": true,
      "access": "public",
      "transport": "mcp+webmcp"
    },
    {
      "name": "list_plans",
      "description": "Braidwater Rail's plans and what each one costs, including which services each tier covers and who it suits.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "readOnlyHint": true,
      "access": "public",
      "transport": "mcp+webmcp"
    },
    {
      "name": "search_knowledge",
      "description": "Search everything Braidwater Rail publishes — the services, the plan detail and the answers on its FAQ — by keyword. Use this before answering from memory.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "description": "A keyword or short phrase, e.g. a service name, a price question or a policy."
          }
        },
        "required": [
          "query"
        ],
        "additionalProperties": false
      },
      "readOnlyHint": true,
      "access": "public",
      "transport": "mcp+webmcp"
    },
    {
      "name": "get_ticket",
      "description": "Look up one ticket at Braidwater Rail by its ticket number together with the email it was raised under. Both are needed — a ticket number alone never returns anything.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "reference": {
            "type": "string",
            "description": "The ticket number."
          },
          "email": {
            "type": "string",
            "description": "The email address it belongs to."
          }
        },
        "required": [
          "reference",
          "email"
        ],
        "additionalProperties": false
      },
      "readOnlyHint": true,
      "access": "public",
      "transport": "mcp+webmcp"
    },
    {
      "name": "my_tickets",
      "description": "Every ticket belonging to the SIGNED-IN visitor at Braidwater Rail, with its current state and what happens next. Only ever call this for the person actually signed in — never for an address somebody types.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "email": {
            "type": "string",
            "description": "The signed-in visitor's own email address, taken from their identity — never asked for in the chat."
          }
        },
        "required": [
          "email"
        ],
        "additionalProperties": false
      },
      "readOnlyHint": true,
      "access": "identified",
      "transport": "mcp+webmcp"
    },
    {
      "name": "open_ticket",
      "description": "Do NOT ask the person for these fields one at a time — calling this with whatever is already known IS how the form opens. Open a ticket at Braidwater Rail, and report back what was recorded.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "subject": {
            "type": "string",
            "description": "Which service it concerns — a code from list_services. Leave blank if unknown; the form lets the person pick."
          },
          "summary": {
            "type": "string",
            "description": "One line of detail in the person's own words."
          },
          "urgency": {
            "type": "string",
            "description": "How soon it matters, or the slot they want."
          },
          "name": {
            "type": "string",
            "description": "Who it is for."
          },
          "email": {
            "type": "string",
            "description": "The email the confirmation goes to."
          }
        },
        "additionalProperties": false
      },
      "readOnlyHint": false,
      "access": "public",
      "transport": "mcp",
      "confirmationRequired": true
    },
    {
      "name": "highlight_service",
      "description": "Scroll Braidwater Rail's catalogue to one entry and highlight it on the page the visitor is reading. Runs in the page; it changes what is on screen, not any record.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "code": {
            "type": "string",
            "description": "The catalogue code to bring into view, from list_services."
          }
        },
        "required": [
          "code"
        ],
        "additionalProperties": false
      },
      "readOnlyHint": true,
      "access": "public",
      "transport": "webmcp"
    },
    {
      "name": "open_desk_form",
      "description": "Open Braidwater Rail's open a ticket form already on this page, with any known details filled in. Runs in the page — it opens a form, it does not submit one.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "subject": {
            "type": "string",
            "description": "The catalogue code to preselect."
          },
          "summary": {
            "type": "string",
            "description": "Text to put in the detail field."
          }
        },
        "additionalProperties": false
      },
      "readOnlyHint": true,
      "access": "public",
      "transport": "webmcp"
    }
  ],
  "identity": {
    "supported": true,
    "docs": "https://busymate.ai/docs/guides/identified-visitors"
  },
  "humanHandoff": true
}
