v0.3.0 — one-click install, English throughout
Install by double-clicking oura-mcp.mcpb below. Claude Desktop does the
rest — no terminal, no Python, no Node install. It works immediately on Oura's
official sample data, and every sample response says so, so nothing here can be
mistaken for your own sleep.
To use your own data, ask it for something: it opens Oura's authorization page
for you and picks up where you left off. Oura requires every application to be
registered, so you paste a client ID and secret once — the extension's settings
spell out the exact redirect, including the trailing slash that otherwise
bounces the registration.
Also on PyPI: uvx --from mcp-oura oura-mcp.
What this release is
Everything in English — documentation, comments, tool parameters and CLI
flags. The parameter rename is breaking against 0.2.0: dia → day,
coleccion → collection, inicio → start, fin → end, campos →
fields, ultimo → latest, formato → format. They now match Oura's own
API names.
A TypeScript port, verified against the Python one on the real API: the same
1,231 records in the same order for the two-page heartrate case.
Authorization without a terminal, via MCP URL elicitation.
Sample data announces itself. oura_check said the sandbox data was
synthetic and the queries did not — so a fresh install answered "how did I
sleep?" with a score out of Oura's made-up data and nothing marking whose it
was. Every sandbox response now carries a synthetic key.
Why this exists
Oura's API doesn't error when it can't give you what you asked for. It returns
something different, shaped like a correct answer. One local day of heart rate
is 1,231 samples across 2 pages — a client that doesn't follow next_token
returns 81% of them and says nothing. This server paginates to exhaustion and
reports the page count, fixes the date range Oura applies inconsistently,
rejects latest=true where Oura would silently return the whole collection, and
names field projections Oura ignored.
It deliberately computes nothing: no averages, no correlations, no trends. An
average computed inside the server reaches the model as a number without its
method.
138 Python tests, 40 TypeScript tests. Neither suite touches the network.