MCP quick-start
Connect an MCP client to the travel tools and walk through a whole booking: search, compare, price, hold, request the booking, and approve it in the console. Read the overview first for what the toolsets are and how agents stay safe. To let an agent sign your company up and certify the integration itself, see the agent workflow.
Preview. The hosted MCP endpoint is not open to customers yet. When it opens, the travel tools take an API key for agents from your console; signing in with OAuth instead is planned but not available yet. Until then the examples below use
https://YOUR-MCP-HOSTfor the endpoint's address andYOUR_MCP_TOKENfor the agent's key. The real address will be published on this page when the endpoint opens.
What you need
A sandbox account, so the agent's bookings are test bookings.
The endpoint address. Each toolset has its own path:
/mcp/publicfor the travel tools,/mcp/console,/mcp/supplierand/mcp/partnerfor the others.For the travel tools, the agent's token. The console and supplier tools need no token: you sign in yourself (see Connect the console or supplier tools).
An MCP client that speaks streamable HTTP: Claude Code, Cursor, Claude Desktop or your own.
Keep the token out of files you commit. The examples read it from an environment variable.
1. Add the server to your client
Claude Code
claude mcp add --transport http travel https://YOUR-MCP-HOST/mcp/public \
--header "Authorization: Bearer $YOUR_MCP_TOKEN"Or add it to a project's .mcp.json. Claude Code expands ${VAR} from your environment, so the token stays out of the file:
{
"mcpServers": {
"travel": {
"type": "http",
"url": "https://YOUR-MCP-HOST/mcp/public",
"headers": { "Authorization": "Bearer ${YOUR_MCP_TOKEN}" }
}
}
}Cursor
Add this to ~/.cursor/mcp.json, or to .cursor/mcp.json in a project:
{
"mcpServers": {
"travel": {
"url": "https://YOUR-MCP-HOST/mcp/public",
"headers": { "Authorization": "Bearer ${env:YOUR_MCP_TOKEN}" }
}
}
}Claude Desktop
For the console and supplier tools, which sign you in with OAuth, add a custom connector in Claude Desktop's settings with the endpoint address; Claude opens the sign-in for you.
For the travel tools, which take a token, use the open-source mcp-remote bridge. Edit claude_desktop_config.json (Settings → Developer → Edit Config) and restart Claude Desktop:
{
"mcpServers": {
"travel": {
"command": "npx",
"args": ["-y", "mcp-remote", "https://YOUR-MCP-HOST/mcp/public", "--header", "Authorization:${AUTH_HEADER}"],
"env": { "AUTH_HEADER": "Bearer YOUR_MCP_TOKEN" }
}
}
}Any MCP client
The server speaks streamable HTTP. A session starts with initialize; the session id comes back in the Mcp-Session-Id header, and every later request sends it:
curl -sD - https://YOUR-MCP-HOST/mcp/public \
-H "Authorization: Bearer $YOUR_MCP_TOKEN" \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"my-agent","version":"1.0"}}}'Once connected, tools/list returns the travel tools and resources/templates/list the resources they read. Both are in the travel tools reference.
2. Search, price, hold and request the booking
Ask the agent in plain language, for example "Find a hotel in Lisbon for two adults, 10 to 12 November, hold the best offer and request the booking for Ana Silva". It makes calls like these:
| Step | Tool | Arguments | What comes back |
|---|---|---|---|
| Search | search_trips | {"query": "Hotel in Lisbon", "domain": "HTL", "destination": "LIS", "dates": {"start": "2026-11-10", "end": "2026-11-12"}, "travelers": {"adults": 2}} | offers, each with an offerRef |
| Compare | compare_offers | {"offerRefs": ["<offerRef>"], "domain": "HTL"} | rooms, rates and conditions side by side |
| Price | v1_reprice | {"domain": "HTL", "message": {"offerRef": "<offerRef>"}} | the live price, and priceChanged when it moved |
| Hold | hold_offer | {"offerRef": "<offerRef>", "domain": "HTL"} | a free hold, with holdRef and holdExpiresAt |
| Request the booking | book_offer | {"offerRef": "<offerRef>", "domain": "HTL", "travelers": [{"firstName": "Ana", "lastName": "Silva", "type": "ADT"}]} | AWAITING_HUMAN_APPROVAL, a proposalId and the amount |
| Follow it | get_proposal_status | {"proposalId": "<proposalId>"} | OPEN until a person decides |
Two things to know:
hold_offermoves no money, but it is still a change: where your account has not allowed agents to hold, it answersAPPROVAL_REQUIRED.book_offerhas not booked anything. Its answer says so: it filed a request, and nothing happens until a person approves it. Typing "yes" in the chat is not an approval.
3. Approve the request in the console
A person approves in their own signed-in session, never the agent:
Sign in to the console and open Agent desk. Its inbox lists open requests, newest first.
Open the request (
/console/agents/proposals/<proposalId>, with theproposalIdthe agent was given). It shows what the agent asked for, the exact amount, the effect and the evidence.Press Approve, or Reject with a reason. On approval the platform carries out the booking once, at the amount you saw.
Back in the agent,
get_proposal_statusreadsAPPROVED, with the order reference.
Connect the console or supplier tools
These toolsets sign the agent in as you, so there is no token to copy.
Add the endpoint to your client the same way as above, with no
Authorizationheader:https://YOUR-MCP-HOST/mcp/console, or/mcp/supplierfor the supplier console.On first use the client opens your browser. Sign in, check the client's name and what it asks to read, untick anything you do not want, and approve.
The agent can now use the reads you allowed, for up to 8 hours and never past your own session.
A client that cannot open a browser shows a code instead. Type it on the console's connect page (/console/connect, or /supplier/connect).
To disconnect an agent, open Connected agents (Administration → Connected agents in the console, Account → Connected agents in the supplier console) and revoke it. It loses access within a minute.
Troubleshooting
| You see | Why | Fix |
|---|---|---|
401 on every request | The token is missing or wrong | Check the Authorization: Bearer header |
APPROVAL_REQUIRED on a hold or other change | Your account has not allowed agents to make that change | Do it yourself, or have an Owner allow it |
CREDENTIAL_KIND_NOT_SUPPORTED | The toolset needs another kind of sign-in | Travel tools take a token; console and supplier tools sign you in |
PERMISSION_DENIED on a console or supplier read | You did not tick that read when you connected | Revoke the connection and connect again |
TAB_DISABLED | Your account does not sell that product | Check v1_capabilities for what it sells |
RATE_LIMITED | Too many calls in a short time | Retry after a short wait |
get_proposal_status stays OPEN | Nobody has approved the request yet | Approve or reject it in the console's Agent desk |
Every code and what to do about it is in the overview.