UMO · strength for endurance · Get started · Log in

Ask your AI assistant about your own training

Connect UMO once and your assistant can see your sessions, sleep and training load — then tell you what strength work actually fits the week you're already running, and what to skip when you're carrying fatigue. No app to install. Takes about two minutes.

What you get

Strength that respects your run week

Heavy legs the day before a quality session is how you lose the session. Your plan gets placed around the running, not on top of it.

Built from your real data

Fitness, fatigue and form come from the sessions your watch already recorded — not from a questionnaire.

Answers in your language

You're an expert at endurance and a beginner in the gym. It explains the gym part, and doesn't lecture you about the running.

It says when to back off

Recovery is low, load spiked, the data looks wrong — you get told, instead of getting a confident plan built on nonsense.

Things to ask once it's connected

Type these in plain language. There are no commands to learn.

"How's my training load looking?" — fitness, fatigue and form, as a chart
"What strength work should I do this week?" — placed around your actual runs
"I've got 30 minutes and a pair of dumbbells. What should I do today?"
"What are my biggest strength gaps for a half marathon?"
"My knee's sore — change today's session."
"Build me a 10k block, I race in 8 weeks off 25 km a week."

Connect your assistant

Pick the app you use. You'll sign in to your UMO account — email, Google or Apple — in your browser, never in the chat.

  1. Add UMO — run this in your terminal:

    claude mcp add --transport http umo https://webapp.umo-health.com/mcp

    Add --scope user if you want UMO available in every project, not just this one.

  2. Sign in — start Claude Code and run:

    /mcp

    Pick umo and choose to authenticate. Your browser opens; sign in to your UMO account. That's it — the connection renews itself from then on.

  3. Try it. Ask "how's my training load looking?"

Works in the Claude desktop app and on claude.ai.

  1. Open Settings → Connectors and choose Add custom connector.

  2. Give it the name UMO and this URL:

    https://webapp.umo-health.com/mcp
  3. Click Connect. Sign in to your UMO account on the page that opens.

  4. Start a new chat and ask "what strength work should I do this week?"

    A chat only picks up new tools when it starts, so use a fresh chat after connecting.

For GitHub Copilot's agent mode in VS Code.

  1. Open the Command Palette (Cmd/Ctrl + Shift + P) and run MCP: Add Server. Choose HTTP, paste the URL, and name it umo:

    https://webapp.umo-health.com/mcp
  2. Prefer editing the file yourself? Put this in .mcp.json at the root of your workspace (or your user mcp.json):

    {
      "servers": {
        "umo": {
          "type": "http",
          "url": "https://webapp.umo-health.com/mcp"
        }
      }
    }
  3. VS Code will prompt you to allow and then sign in. Sign in to your UMO account in the browser window it opens.

  4. Open Copilot Chat in Agent mode and ask "how's my training load looking?"

  1. Add UMO — open your workspace's .agents/mcp_config.json file. To make it available in every project instead, use ~/.gemini/config/mcp_config.json. Add this entry inside mcpServers (keep any servers already there):

    {
      "mcpServers": {
        "umo": {
          "serverUrl": "https://webapp.umo-health.com/mcp"
        }
      }
    }

    Antigravity CLI requires serverUrl for remote MCP servers; url and httpUrl will not connect.

  2. Authenticate — start (or restart) Antigravity CLI with agy, then enter /mcp. Select umo and choose Authenticate.

    Your browser opens to UMO. Sign in with your normal UMO account, then return to Antigravity CLI when the browser says you can.

  3. Try it. Ask "how's my training load looking?"

  1. Add UMO — run this in your terminal:

    gemini mcp add --transport http umo https://webapp.umo-health.com/mcp

    Prefer editing the file yourself? Put this in your project's .gemini/settings.json (or your user ~/.gemini/settings.json) under mcpServers instead:

    {
      "mcpServers": {
        "umo": {
          "httpUrl": "https://webapp.umo-health.com/mcp"
        }
      }
    }
  2. Sign in — start Gemini CLI and run:

    /mcp auth umo

    Your browser opens; sign in to your UMO account. Gemini CLI will also offer this automatically the first time it tries to use a UMO tool.

  3. Try it. Ask "how's my training load looking?"

ChatGPT can talk to UMO, but custom connectors are the least settled part of its product — they need a paid plan, and where the setting lives moves around. If you can't find it, one of the other clients above will be quicker.

  1. Open Settings → Connectors. If you see a Developer mode or Advanced toggle, turn it on — that's what reveals custom connectors.

  2. Add a connector named UMO with this URL:

    https://webapp.umo-health.com/mcp
  3. Choose OAuth when asked how to authenticate, then sign in to your UMO account.

    If it asks for a client ID and secret instead, leave them blank — UMO registers your client automatically.

  4. If OAuth isn't offered at all, use an access token instead: create one here and paste it as an Authorization header with the value Bearer <your token>.

Cursor, Windsurf, Zed, Claude Desktop's config file, your own script — anything that speaks MCP over HTTP works the same way.

  1. Point it at this URL, as a streamable HTTP (not stdio) server:

    https://webapp.umo-health.com/mcp

    Most clients use a config file shaped like this:

    {
      "mcpServers": {
        "umo": {
          "url": "https://webapp.umo-health.com/mcp"
        }
      }
    }
  2. If the client supports OAuth, it will offer to sign you in — take that path.

  3. If it doesn't, create an access token and send it as a header:

    {
      "mcpServers": {
        "umo": {
          "url": "https://webapp.umo-health.com/mcp",
          "headers": {
            "Authorization": "Bearer umo_pat_..."
          }
        }
      }
    }

    Treat that token like a password. It expires on its own; changing your UMO password invalidates it immediately.

If something's not working

My assistant doesn't see any UMO tools

Almost always one of two things:

You're in an old chat. Tools are loaded when a conversation starts. Open a new chat.

You haven't finished signing in. Ask your assistant to run whoami. If it can't, or says you're not connected, go back through the connect steps — the sign-in step is the one people miss.

My assistant says my watch isn't connected, but it is

Ask it to check your connected wearables specifically. It can read the list of devices linked to your UMO account directly — if it told you nothing was connected after looking at your training data instead, it was guessing from an empty result.

If the list does show your device but there's no data yet, the connection is fine: data takes a little while to come through after you link a provider. Nothing to redo.

It says I'm not authorised, or asks me to sign in again

Sign-ins expire if unused for a month, and are cancelled immediately if you change your UMO password or sign out everywhere. Reconnecting is the fix — same steps as the first time. Nothing is lost.

"No UMO account is linked to this identity"

You signed in successfully, but that email isn't an UMO athlete account. Use the same email you use in the UMO app. If you're sure it's right, contact UMO support — the account exists but isn't linked.

It says it has no training data for me

UMO reads from a connected watch or wellness app. Ask your assistant to "connect my Garmin" (or Fitbit, Oura, Whoop, and others) and it'll give you a link. That part needs UMO Pro. Data starts appearing within a few hours of connecting, not instantly.

The numbers look wrong

Ask "is there anything wrong with my data?" — UMO checks for the common causes (walks labelled as runs, broken GPS distances, gaps in recording) and will tell you which one it thinks is happening rather than quietly planning around bad numbers.

Questions

Does my assistant see other people's data?

No, and it can't be asked to. There is no field anywhere in this system for "whose data" — every answer is scoped to the account that signed in, worked out from your sign-in rather than from anything the assistant sends. This is enforced server-side, not by asking the model nicely.

Where does my password go?

To UMO's login provider, from your own browser, on the sign-in page — and nowhere else. It is never typed into a chat, never sent to your assistant, and never reaches the server behind this page. What your assistant ends up holding is a token that only works against this service and only for your own training data.

How do I disconnect?

Remove the connector in your assistant's settings (in Claude Code: claude mcp remove umo). To cut every client off at once, including ones you no longer have access to, change your UMO password.

Do I need UMO Pro?

Not to connect, and not for any of the analysis or planning. Connecting a new wearable through your assistant needs Pro, the same as it does in the UMO app.

Is this medical advice?

No. It's guidance built from established strength-and-endurance research applied to your own training data. Pain, injury and anything that feels wrong are for a physiotherapist or doctor — UMO will say so rather than train you through it.

Can I use several assistants at once?

Yes. Each one signs in separately and they don't interfere. Nothing about your plan is stored per-client.

For developers

Everything below is optional reading.

Endpoints and transport

A single hosted MCP server speaking streamable HTTP. There is no local process, no SDK and no package to install for normal use.

PathWhat it is
/mcpThe MCP endpoint. Requires a bearer token.
/.well-known/oauth-protected-resource/mcp Protected resource metadata (RFC 9728).
/.well-known/oauth-authorization-server Authorization server metadata (RFC 8414).
/registerDynamic client registration (RFC 7591).
/authorize, /token, /revoke Authorization code + PKCE (S256), refresh, revocation.
/personal-tokenIssues a long-lived bearer token by hand.
/health Unauthenticated health check. (/healthz works too, but not behind Cloud Run — its frontend answers that path itself.)

An unauthenticated call to /mcp answers 401 with a WWW-Authenticate header carrying resource_metadata, which is where a spec-compliant client starts discovery. Scope issued: umo:athlete.

Authentication model

Identity is Firebase — the same accounts as the UMO app, not a second user system. The sign-in page runs the Firebase JS SDK in your browser; the server only ever handles an ID token it verifies against Google's public keys, then maps to an internal athlete id. No tool takes an athlete id as an argument.

Tokens this server issues are HMAC-signed and carry their own contents, so there is no session store to shard or scale. The trade-off is that individual tokens can't be deleted server-side: instead every refresh and every personal token is re-checked against Firebase's own revocation timestamp, so a password change cuts off access everywhere within minutes.

Three bearer shapes are accepted at /mcp: an OAuth access token (1 hour, refreshed automatically), a personal access token, or — for backward compatibility with the legacy local bridge — a raw Firebase ID token.

Testing it by hand

Create a token at /personal-token, then:

curl -s https://webapp.umo-health.com/mcp \
  -H "Authorization: Bearer $UMO_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

Or point the MCP Inspector at https://webapp.umo-health.com/mcp and let it drive the OAuth flow.