Developer documentation

Connect your assistant to Duoly

Use the Duoly MCP server to discover gaming teammates and coaching, calculate a quote and prepare a booking link. All v1 tools are public and read only. Payment stays on duoly.gg.

Coming soon. Use this guide to prepare your integration.

Connection details

Endpoint
https://duoly.gg/mcp
Transport
Stateless Streamable HTTP
Protocol versions
2026-07-28, 2025-11-25, 2025-06-18
Authentication
None in v1. No API key, OAuth token or Duoly login.
Scope
Public catalog, quotes, availability and booking links. Social sessions are excluded.

Use POST for one JSON-RPC message with Content-Type: application/json and Accept: application/json, text/event-stream. JSON responses are returned. GET and DELETE return 405. Batches, subscriptions and streams are not supported.

For 2025-11-25 and 2025-06-18, initialize your client, then use tools/list and tools/call. Send the negotiated MCP-Protocol-Version header. The transport is stateless with no session ID.

For 2026-07-28, use server/discover without initialization. Each request needs MCP-Protocol-Version: 2026-07-28, Mcp-Method matching the method, and Mcp-Name matching the tool for tool calls. Include protocol version, client info and client capabilities in params._meta. Use an SDK matching the protocol revision.

Five public tools

Use game and service identifiers returned by the catalog. An availability signal or quote does not create an order. The booking link selects a game and optional service on Duoly for the user to review. It does not preserve rank, region, quantity or edition. Users select those on duoly.gg.

v1 tool reference
ToolInputsOutput
list_gamesNonegames: id, slug, name, url; canonical catalog url. Social is excluded.
list_servicesgame (required)game, services (id, name, category, unit, ranks, regions, editions, requiredInputs, url), url.
get_quotegame, service, quantity (integer 1 to 10), currency (EUR or USD), server (required); rank and edition (Java or Bedrock) when the service requires themkind, basis, notReserved, currency, amountMinor, amountEurMinor, formattedPrice, unit, quantity, quotedAt, fx, notice, bookUrl, url. Base price before account perks.
get_availabilitygame (optional)game (optional), online, onlineByGame, label, readAt, cacheSeconds, notice, url; medianMatchSeconds, medianWindowDays and medianScope when available. No reservation.
create_booking_linkgame (required); service (optional)bookUrl, url, notice. Selects the game and optional service. No order is created.

Availability uses a 30-second cached aggregate. Online counts can include teammates already in a session. Null means no reliable count is available. Overall totals are omitted. Any historical match median covers sitewide accepted orders from the last 30 days, including services outside this catalog. It does not predict a wait time for a game.

Amounts depend on the game, service, rank, quantity and currency. Get a fresh quote when those choices change. Checkout calculates the final price, including any applicable account eligibility. USD quotes are estimates. Use exact rank and region tokens from list_services. Omit rank for flat-priced services. Minecraft requires a server or world string and a Java or Bedrock edition. Teams and dynamic streamer bookings are excluded from this catalog.

Request a quote

The following legacy JSON-RPC example uses protocol 2025-11-25 after initialization. Discover valid service and rank values with list_services first.

Request

{
  "jsonrpc": "2.0",
  "id": 2,
  "method": "tools/call",
  "params": {
    "name": "get_quote",
    "arguments": {
      "game": "val",
      "service": "duo2",
      "rank": "Platinum",
      "server": "EU",
      "quantity": 1,
      "currency": "EUR"
    }
  }
}

Response

A successful call returns MCP content and structured quote data. This example was generated from the v1 tool implementation on 6 November 2026 with a fixed exchange-rate fixture. It illustrates the response shape, not a live price offer.

{
  "jsonrpc": "2.0",
  "id": 2,
  "result": {
    "structuredContent": {
      "kind": "preview",
      "basis": "base price before account perks",
      "notReserved": true,
      "currency": "EUR",
      "amountMinor": 649,
      "amountEurMinor": 649,
      "formattedPrice": "€6.49",
      "unit": "game",
      "quantity": 1,
      "quotedAt": "2026-11-06T08:12:35.570Z",
      "fx": {
        "rate": 1.08,
        "source": "fallback",
        "date": "2026-11-06",
        "fetchedAt": 0
      },
      "notice": "Base price before account perks. USD is an estimate. Final payment and any account perks are reviewed on duoly.gg. No teammate is reserved.",
      "bookUrl": "https://duoly.gg/?game=val&service=duo2&agent=other#modes-h",
      "url": "https://duoly.gg/games/valorant"
    },
    "content": [
      {
        "type": "text",
        "text": "€6.49 base price before account perks. No reservation. https://duoly.gg/games/valorant"
      }
    ]
  }
}

Handle tool errors before showing a price or link. Do not treat an error message, stale quote or empty availability result as a confirmed session.

Test with MCP Inspector

After launch, start the Inspector locally, open its printed URL and connect using Streamable HTTP with the endpoint above and no authentication. Initialize, list tools and try a catalog request before a quote.

npx @modelcontextprotocol/inspector

For a command-line discovery check:

npx @modelcontextprotocol/inspector --cli https://duoly.gg/mcp --transport http --method tools/list

Rate limits and privacy

Limits are 60 requests per minute and 2,000 per day per IP. On HTTP 429, respect the response’s retry guidance and back off. Do not retry in a tight loop or rotate addresses to bypass the limit. Each accepted POST counts, including discovery and initialization. Request bodies are limited to 16,384 bytes; structured tool output is capped at 65,536 bytes. HTTP 429 includes Retry-After and error.data.retryAfterSeconds. HTTP 503 means required server configuration is unavailable.

Any HTTPS origin may call the endpoint, so assistants such as Claude and ChatGPT can connect directly. Native and server clients may omit Origin. Malformed, opaque and plain HTTP origins are rejected. No cookies or credentials are accepted.

Send only the structured catalog choices needed by a tool. Never send names, emails, chat history, passwords, card details or account tokens. The tools do not read accounts or store personal booking data. Abuse prevention uses an IP-derived identifier; hosting infrastructure also processes connection metadata.

These tools cannot charge, reserve, cancel or read a private order. Never promise a specific start time, teammate rank or in-game result. Link users to Duoly to review and complete their own booking. See our privacy policy and terms.

Building a Duoly integration?

Contact the team for partner questions and compatibility checks.

Contact Duoly