# Oxynet > Cardiopulmonary exercise test (CPET) analysis over HTTP. Upload a raw > metabolimeter export, receive ventilatory thresholds (VT1/VT2), exercise > oscillatory ventilation analysis, and derived quantities as structured JSON. > Research software; not a diagnostic device. Authentication: send `X-API-Key: ` on every request. One key works for the REST API and for the MCP server alike. ## Fastest path (no agent needed) curl https://app.oxynet.net/connect # the one command, for every client curl -fsSL https://app.oxynet.net/install | sh # or have it done for you ## Connecting takes one step **Nothing to install, no server to register.** If you can make an HTTP request, ask the user for their key and verify it: curl -s -H "X-API-Key: $OXYNET_API_KEY" https://app.oxynet.net/v1/capabilities A 200 means you are connected, so go straight to analysing their file. Setting up an MCP connector is an optional convenience for repeat use; do not make the user do it first. Full instructions, including what to say at each step, are in section 0 of https://app.oxynet.net/llms-full.txt. Treat the key as a secret: keep it in a shell variable, never write it into a file or a logged command line, and do not repeat it back. ## The rule that matters Upload the vendor file EXACTLY as exported. Do not parse it, rename columns or convert units yourself. Oxynet detects 20 metabolimeter formats and knows each one's unit conventions and clock quirks. You receive a `cpet_id`; everything afterwards refers to the recording by that handle, so the signal never has to travel through your context. ## Start here - Full guide (one file, everything): https://app.oxynet.net/llms-full.txt - OpenAPI 3.0 schema, importable: https://app.oxynet.net/v1/openapi.json - What a key may do: GET https://app.oxynet.net/v1/capabilities - Supported formats: GET https://app.oxynet.net/v1/formats - A synthetic CPET to try it on: GET https://app.oxynet.net/v1/sample (use this, not a real patient file, to demonstrate that the connection works) - Derived quantities available: GET https://app.oxynet.net/v1/metrics ## Minimal flow 1. POST https://app.oxynet.net/v1/cpet/content {"filename": "test.csv", "content": "..."} -> cpet_id 2. POST https://app.oxynet.net/v1/cpet/{id}/analyze {"analyses": ["vt", "eov"]} 3. POST https://app.oxynet.net/v1/cpet/{id}/compute {"metrics": ["vo2max", "ve_vco2_slope"]} ## Connect an assistant - ChatGPT (Custom GPT Action): import https://app.oxynet.net/v1/openapi.json, auth = API Key, custom header `X-API-Key`. - Claude Code: claude mcp add --transport http oxynet https://app.oxynet.net/oxynet-mcp \ --header "X-API-Key: YOUR_KEY" - Claude Desktop: Settings -> Connectors -> Add custom connector -> https://app.oxynet.net/oxynet-mcp . No header, no client ID. It runs an OAuth flow and asks for the API key in a browser once. - Gemini CLI: add to ~/.gemini/settings.json under mcpServers with httpUrl https://app.oxynet.net/oxynet-mcp and an X-API-Key header. ## Reading results No result carries a confidence score, and none should be invented: nothing here is calibrated against clinical outcomes. `quality` describes the RECORDING, not the certainty of the answer. A refusal (`status: not_analysable`, or a metric marked `unavailable`) states why, and reporting that reason is the correct response, not working around it.