ottotheagent
otto-dsh
Book real flights, hotels & cars with Otto from DeepSeek Harness (dsh) — the otto-travel MCP connector as a dsh plugin.
- Stars
- 1
- Language
- Python
- Created
- Aug 14, 2026
- Updated
- Aug 14, 2026
Introduction
Otto Travel — DeepSeek Harness (dsh) plugin
Created: 2026-08-14 · Last Updated: 2026-08-14
Book real flights, hotels, and cars with Otto from inside DeepSeek Harness
(dsh). This plugin mounts
Otto's remote MCP connector into a dsh composition; the agent then calls Otto's
tools like any other, and bookings execute inside Otto (real Spotnana PNR, the
authenticated user's stored payment method).
It is the dsh counterpart of Otto's Claude Code / Cowork plugin — both wrap the
same production MCP endpoint, https://api.ottotheagent.com/mcp. There is no
Otto-side code to change: Otto is already the MCP server, dsh is just another
client.
What you get
Otto's tools land in the model namespace as mcp__otto__<tool>:
mcp__otto__search_flights · query_flights · book_flight ·
search_hotels · get_hotel_rooms · book_hotel · search_cars ·
book_car · get_bookings · cancel_booking · read_skill ·
list_managed_travelers · read_preferences / write_preference ·
read_loyalty_programs / write_loyalty_program · task_status
Skill-gating, rate-limiting, input validation, delegate access, and client identity are all enforced server-side — the plugin adds nothing that could weaken them.
Authentication — OAuth (via mcp-remote)
Otto's /mcp is an OAuth-protected MCP resource (OAuth 2.1 + dynamic client
registration, RFC 9728 discovery) — the same auth model the Otto Claude
connector uses. Access is always as a specific Otto user (their profile,
preferences, and payment method); the connector never auto-provisions accounts.
@deepseek-ai/dsh-mcp-client can only send a static Authorization header — it
doesn't run the OAuth flow itself. So this plugin bridges through
mcp-remote, the standard helper that
performs the full OAuth 2.1 + PKCE + dynamic-client-registration handshake and
caches/refreshes tokens transparently (the same tool Claude Desktop uses for
remote OAuth connectors). dsh launches it as a stdio MCP server via npx — see
cordis.otto.patch.yml.
There is nothing to configure and no API key:
dsh plugin addthis plugin (below).- On the first agent run,
mcp-remoteopens a browser to authorize once. Tokens are cached under~/.mcp-authand refreshed automatically thereafter. - Optional non-prod endpoint:
export OTTO_MCP_URL="https://<stg-host>/mcp"before booting dsh.
Requirements: Node/npx (already present — dsh is Node-based).
Who can actually book (gates)
- The authenticated user must be a provisioned, enabled Otto user (a real Otto account backed by a Spotnana traveler profile + payment method). The connector does not auto-provision accounts.
- Single traveler per PNR —
book_flightbooks one traveler. To book for someone who granted you delegate access, pass their id frommcp__otto__list_managed_travelers(books as them, not N pax on one ticket). - Payment and preferences always come from Otto, never from dsh.
Install
Option A — from source (recommended while dsh is developer-preview)
dsh plugin add https://github.com/ottotheagent/otto-dsh
# or, to inspect first:
git clone https://github.com/ottotheagent/otto-dsh
dsh plugin add ./otto-dsh
dsh plugin add reads package.json → dsh.bundle → the cordis patch, and
stacks it onto your active profile. Inspecting the source before mounting is
encouraged — this connector books real flights.
Option B — paste the mount into your own composition
Add the entry from cordis.otto.patch.yml to your
cordis.yml (or a profile patch). That's the entire integration.
Verify what actually mounted:
dsh --dump-config # confirm the mcp-otto entry is present
Smoke test
smoke/ drives a real booking turn through dsh against a chosen Otto
endpoint using the deepseek-harness-sdk. See smoke/README.md.
Notes / caveats
- dsh is developer-preview (rc) — the
package.jsondsh.bundlemanifest key anddsh-mcp-clientconfig schema can shift between releases. The mount config here matches the current@deepseek-ai/dsh-mcp-clientdocs (transport: streamable-http+url+headers); re-verify withdsh --dump-configafter upgrading dsh. - No resident skills yet. This plugin does not ship client-side copies of
Otto's skill guides — the agent fetches them over the wire via
mcp__otto__read_skill. Shipping resident skills for dsh is a possible future enhancement. - Discoverability. Intent tokens (flight, hotel, car, book travel,
itinerary) are front-loaded in
package.jsonkeywords/description and in Otto's server-side tool descriptions so dsh plugin search surfaces Otto on "book a flight," not just "travel."