Platform Detection
How Yavio identifies which AI platform is calling your MCP server
Yavio automatically detects which AI platform is connecting to your MCP server. This powers per-platform analytics, allowing you to compare tool usage and conversion rates across ChatGPT, Claude, Cursor, and other MCP clients.
How it works
Platform detection runs a layered heuristic against signals from the MCP transport connection. The first match wins:
| Priority | Signal | Description |
|---|---|---|
| 1 | clientName | Client name from the MCP initialize handshake |
| 2 | userAgent | HTTP User-Agent header (HTTP transports, via the request's requestInfo) |
| 3 | origin | HTTP Origin header (HTTP transports, via the request's requestInfo) |
| 4 | — | Falls back to "unknown" |
All matching is case-insensitive substring matching (except zed, which requires an exact name to avoid false positives). Specific product names are matched before the generic vendor patterns they contain — claude-code before claude, gemini-cli before gemini, and cursor before vscode (Cursor identifies as cursor-vscode).
Supported platforms
| Platform | Matched pattern | Real-world identity |
|---|---|---|
chatgpt | chatgpt, openai | ChatGPT apps and connectors; also via openai.com / chatgpt.com origin |
codex | codex | OpenAI Codex sends codex-mcp-client |
claude | claude, anthropic | claude.ai and Claude Desktop both send claude-ai; also via claude.ai / anthropic.com origin |
claude-code | claude-code | Claude Code sends claude-code |
cursor | cursor | Cursor sends cursor-vscode |
gemini | gemini | Google Gemini app and Enterprise connector; also via gemini.google.com origin |
gemini-cli | gemini-cli | Gemini CLI sends gemini-cli-mcp-client |
opencode | opencode | opencode sends opencode |
vscode | vscode, visual studio code | VS Code MCP clients (e.g. Copilot agent mode) |
windsurf | windsurf, codeium | Windsurf (formerly Codeium) |
cline | cline | Cline sends @cline/core |
continue | continue | Continue sends continue-client |
zed | zed (exact), zed/ prefix | Zed sends Zed |
unknown | — | No recognised signal, including clients that send no usable identity (e.g. the Python SDK default mcp) |
When detection runs
- On connection: platform is detected when a client connects and stored for the session
- On tool call: if not yet detected (e.g.,
clientNamewasn't available at connect time), the SDK retries detection lazily using the latest available signals
The detected platform is attached to every event as the platform field.
Using platform data
Platform detection is fully automatic. The platform field appears on all events and can be used in the dashboard for:
- Filtering — view events from a specific platform
- Segmentation — compare metrics across platforms
- Funnel analysis — see where users drop off on each platform
Unrecognised clients
If an MCP client isn't in the supported list, it appears as "unknown". The raw client identity from the MCP handshake is persisted on every connection event as client_name and client_version, so unrecognised clients can still be inspected in your data — and promoted to a first-class platform once their identity is known.