Great stays.
Seamless integrations.
Your guide to building with CDS. From your first hotel search to a complete booking journey — every endpoint, example and tool in one place.
Find your starting point.
A clear path, whether you’re integrating or exploring.
One journey. Every step.
curl --request POST \
--url 'https://bookings.cdsgroupe.com/cds-api-test/v1/Authenticate' \
--header 'Content-Type: application/json' \
--data '{
"Username": "YOUR_USERNAME",
"Password": "YOUR_PASSWORD",
"Language": "EN"
}'Your first connection.
Authenticate once, then use your JWT to search hotels, check availability and manage bookings.
1. Get sandbox credentials
Contact your CDS technical representative for a sandbox username and password.
Contact support ↗2. Exchange credentials for a token
Send a JSON request with the following fields.
Usernamestring · required | Your CDS API username. |
Passwordstring · required | Your CDS API password. |
Languagestring · optional | Error message language. Default: EN. |
TokenExpiration for the exact validity.3. Start searching
Include Authorization: Bearer <token> in subsequent requests.
Request example
SandboxUse CDS from your AI assistant
The CDS Groupe MCP Server exposes the booking platform as 21 typed Model Context Protocol tools — 18 mapped to CDS API endpoints plus 3 orchestration tools. Plug it into Claude, Cursor, Windsurf, ChatGPT Desktop, VS Code, JetBrains AI or any MCP-compatible client and the LLM drives the full cycle — search, live rates, book, read, sync, cancel — plus traveller profiles, booking vouchers and GDS PNR retrieval.
A session/scope layer and booking guards make it safe to hand to an LLM: company-scoped results, role-gated book-for-others, card-data stripping (PAN/CVV never transit the server), no-retry create, ownership-checked cancel. ~97% coverage of the native booking portal cycle.
Connect with just a URL — sign in through the secure OAuth flow with your CDS credentials and the CDS endpoint of your choice (Sandbox, Live, regional cluster, white-label proxy). Nothing to install; credentials go only to the CDS API.
Hosted endpoint — one URL, nothing to install
Add the URL below to your MCP client. On first use it opens a browser to sign in with your CDS API URL + username + password (OAuth 2.1). No local install, no credentials in config files. Works in Claude Desktop, Claude Code, Cursor, Windsurf, VS Code, ChatGPT Desktop, JetBrains, Zed.
{
"mcpServers": {
"cds": {
"url": "https://mcp.cdsgroupe.com"
}
}
}
Config file location per client:
Claude Desktop %APPDATA%\Claude\claude_desktop_config.json ·
Cursor ~/.cursor/mcp.json ·
Windsurf ~/.codeium/windsurf/mcp_config.json ·
Zed ~/.config/zed/settings.json.
For Claude Code: claude mcp add --transport http cds https://mcp.cdsgroupe.com.
Self-hosted (stdio) — offline / development
Run the server locally when you can't reach the hosted endpoint (air-gapped network, local development). Requires Node 20+ and a clone of the MCP server repo. Credentials live in your client config.
{
"mcpServers": {
"cds": {
"command": "node",
"args": ["C:\\path\\to\\cds-mcp\\dist\\server.js"],
"env": {
"CDS_USERNAME": "your-username",
"CDS_PASSWORD": "your-password",
"CDS_BASE_URL": "https://bookings.cdsgroupe.com/cds-api-test/v1"
}
}
}
}
Build it into your own app
Web and mobile apps connect to the hosted endpoint over HTTPS using the official MCP SDK. The OAuth flow opens a browser/web view; tokens are managed by the SDK — your app never handles CDS credentials.
// npm i @modelcontextprotocol/sdk
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
const transport = new StreamableHTTPClientTransport(
new URL('https://mcp.cdsgroupe.com/mcp'),
{ authProvider /* your OAuth 2.1 provider — opens the CDS login */ },
);
const client = new Client({ name: 'my-app', version: '1.0.0' }, { capabilities: {} });
await client.connect(transport);
// resolve scope once: active company, roles, PrsId
await client.callTool({ name: 'cds_resolve_session', arguments: {} });
// free text → coordinates (or use cds_autocomplete for hotels / POIs)
const result = await client.callTool({
name: 'cds_search_hotels',
arguments: {
latitude: 48.8566, longitude: 2.3522, radius: 5,
checkin: '2026-07-01', checkout: '2026-07-02', room: 1, guest: 2,
},
});
The 21 tools
18 mapped to CDS API endpoints + 3 orchestration tools — strict typed schemas, enums and required fields surfaced to the LLM.
Search & content
cds_autocompleteFree text → city, hotel, company, POI or transport hubcds_search_hotelsGeo-radius search, company-scoped, eco filter (byEco)cds_get_availabilityLive rooms & negotiated rates for a propertycds_get_hotel_by_codeFull content: description, photos, amenitiescds_get_hotelsCountry-prefix / free-text hotel listing
Booking cycle
cds_create_bookingGuarded create — PC, Stripe or legacy cardcds_read_bookingsList or detail bookingscds_sync_bookingReconcile a booking with the suppliercds_cancel_bookingCancel, with ownership + precondition checkscds_get_payment_methodPayment method(s) of a bookingcds_get_documentBooking voucher as PDF
Session & scope
cds_authenticateCredentials → JWT (auto-refreshed)cds_resolve_sessionActive company, roles, PrsId — once after authcds_set_active_companySwitch company (agent / multi-company)cds_get_poolsCompanies the user can accesscds_get_rolesRole flags that drive the scopecds_get_profileConnected user identity + company flagscds_get_field_valuesPer-company checkout field schema
Book for others
cds_get_profilesSaved travellers of the companycds_search_travellersTraveller type-aheadcds_retrieve_pnrTraveller(s) from a GDS PNR — checkout autofill
Everything you need to integrate.
HtlSubType
stringProperty sub-category, serialized as the enum **name** (mirror of
Cds.Model.Enums.HtlSubType). Only present when known. Values include
Hotel, Aparthotel, Apartment, GuestHouse, Hostel, Inn,
Motel, Resort, AllInclusiveResort, Residence, Villa, Chalet,
Lodge, HolidayPark, BudgetHotel, BedAndBreakfast, Campsite…
New values may be added — do not fail on unknown values.
Example
"Aparthotel"
