Duoly
Find rank-verified gaming teammates and coaches, compare session prices and prepare booking links. Public tools need no account. Payment stays on duoly.gg.
Hosted MCP Server
npx add-mcp 'https://duoly.gg/mcp'Installs into Claude Code, Codex, Cursor and more
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. Catalog tools are public. Order status needs a private per-order code. All tools are read only. Payment stays on duoly.gg.
Available. Public tools are read only.
Connection details
Endpoint
https://duoly.gg/mcp
Transport
Stateless Streamable HTTP
Protocol versions
2026-07-28, 2025-11-25, 2025-06-18
Authentication
No account connection. Order status requires a private dos_ code.
Scope
Public catalog, quotes, availability and booking links, plus limited order status with a customer-generated code. 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 Claude attribution, use https://duoly.gg/mcp?client=claude. The client query hint also accepts chatgpt or gemini. It affects only the agent tag on booking links, never identity, pricing or permissions.
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.
Six public tools and private order status
Call find_session first to find a teammate or coach with real prices and a booking link. Each result has one readable summary and full schema-validated structuredContent, without JSON duplicated into text. Card-only data stays in result metadata. Share bookUrl as the primary link so the user can book. Use exact game, rank and region tokens from 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 preserves supplied rank, region and quantity, plus role, coaching character, voice, mood and teammate count. Minecraft links also preserve server/world and edition. Use list_services for exact role and seat options. Private notes, IGN and payment choices stay on Duoly. Users confirm remaining options on duoly.gg. Use get_quote only for a selected service and create_booking_link only to produce a final link. Rank-priced services show a from price and a typical one-unit price; exact totals include bundle savings.
| Tool | Inputs | Output |
|---|---|---|
list_games | None | games: id, slug, name, bookUrl, url; canonical catalog url. Social is excluded. |
list_services | game (required) | game, services (id, name, description, fromPrice, category, unit, ranks, regions, editions, requiredInputs, bookUrl, url), url. |
find_session | game (required); goal or category, rank, region or server, quantity, budget, currency (EUR or USD), edition (optional) | Up to three matching services with descriptions, real calculated prices, bookUrls and missingInputs. Start here for a teammate or coach. Incomplete selections have labelled from prices. |
get_quote | game, service, quantity (integer 1 to 10), currency (EUR or USD), server (required); rank and edition (Java or Bedrock) when the service requires them | kind, basis, notReserved, currency, amountMinor, amountEurMinor, formattedPrice, unit, quantity, quotedAt, fx, notice, bookUrl, url. Base price before account perks. |
get_availability | game (optional) | game (optional), positive online counts when available, onlineByGame, bookUrl, label, readAt, cacheSeconds, notice, url; medianMatchSeconds, medianWindowDays and medianScope when available. No reservation. |
get_order_status | token (required): the private dos_ code generated in your order room | One order status, game, service, quantity, current acceptance, teammate display names, team seat progress, nextStep and updatedAt. Revocable, read only and limited to this order. |
create_booking_link | game (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. Counts are shown only when positive. Zero and unavailable counts are omitted, as are overall totals. 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. Services appear only when the pricing code accepts them. Dynamic streamer bookings are excluded. list_services includes catalog descriptions and a calculated from price in EUR for one game or hour. find_session returns up to three matching services, a total price for the requested quantity and missingInputs. Incomplete selections have labelled from prices; unspecified quantity and currency use one unit and EUR for that preview. A budget is a total cap and needs a currency before it is applied. Goal tokens are duo, coaching, ranked, casual and teams; training and other are category aliases.
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 captured from the local tool implementation on 7 November 2026 using the real pricing calculator and FX loader. It illustrates the response shape; request a fresh quote before booking.
{
"result": {
"content": [
{
"type": "text",
"text": "EUR 6.49 total for 1 game; EUR 6.49 per game. Base price before account perks. No reservation. https://duoly.gg/?game=val&service=duo2&agent=claude&rank=Platinum®ion=EU&qty=1#modes-h"
}
],
"structuredContent": {
"kind": "preview",
"basis": "base price before account perks",
"notReserved": true,
"currency": "EUR",
"amountMinor": 649,
"amountEurMinor": 649,
"perUnitMinor": 649,
"savingMinor": 0,
"bundleDiscountPercent": 0,
"formattedPrice": "€6.49",
"unit": "game",
"quantity": 1,
"quotedAt": "2026-11-07T11:03:03.938Z",
"fx": {
"rate": 1.1165,
"source": "ecb",
"date": "2026-11-06",
"fetchedAt": 1794049003630
},
"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=claude&rank=Platinum®ion=EU&qty=1#modes-h",
"url": "https://duoly.gg/games/valorant"
}
},
"jsonrpc": "2.0",
"id": 2
}
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; the complete tool response 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. Catalog tools do not read accounts. get_order_status reads only the limited order projection authorized by its code. Never log or persist that code. Abuse prevention uses an IP-derived identifier; hosting infrastructure also processes connection metadata.
These tools cannot charge, reserve or cancel. A private order code allows only a limited read of that one 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.