Prototype · Preview: every server in the official registry, synced every 30 minutes. Reviews and accounts come in a later step.
PopNx MCPMCP servers for people who use AI · explained in plain words

hybridlog

by Imgrundversion 0.1.13i★ –iComputer or cloud
Registry nameio.github.Imgrund/hybridlog

Install

Overview

Description from the maker (original English)

Reads your own Garmin mirror: readiness, training load, muscle freshness, and read-only SQL.

PopNx MCP’s three pillars

These three are never merged into one score: opinions, measurements and popularity are different things.

What you can do with it

We have not written a plain-language summary for this one yet. Below are the facts we read from the registry.

  • Connection: Computer or cloud
  • Transport: stdio, Streamable HTTP
  • Category: Databases & datasets
  • You need to fill in: DATABASE_URL, APP_KEY

Install

Pick the AI app you use, then copy the settings.

Before you install

  • Basic checks: 1 of 1 passed
  • Runs on the maker’s server: what you ask it goes through their server.
  • You fill in yourself: DATABASE_URL, APP_KEY

Values marked secret are keys to your account. Never share them or paste them into a chat.

You need

Which app do you use?

Pick your app above. We remember it, so next time the button says “Install in …”.

Works in Claude on the web, desktop and mobile:

  1. Open Settings → Connectors
  2. Press Add custom connector
  3. Paste the address below and press Add
  4. If it asks you to sign in, sign in with the maker
SettingsConnectors1+ Add2https://…3
https://{hybridlog_host}/mcp/garmin

The address contains {…} parts that only you know (such as your account), so copy it and fill them in.

Or run it on your computer

Open Claude Desktop → Settings → Developer → Edit Config, and paste this into claude_desktop_config.json

{
  "mcpServers": {
    "hybridlog": {
      "command": "docker",
      "args": [
        "run",
        "-i",
        "--rm",
        "-e",
        "DATABASE_URL",
        "-e",
        "APP_KEY",
        "ghcr.io/imgrund/hybridlog:0.1.13",
        "php",
        "artisan",
        "mcp:start",
        "garmin"
      ],
      "env": {
        "DATABASE_URL": "your-value",
        "APP_KEY": "your-value"
      }
    }
  }
}

Run this in your terminal

claude mcp add --transport http hybridlog 'https://{hybridlog_host}/mcp/garmin'

Or run it on your computer

claude mcp add hybridlog --env DATABASE_URL=your-value --env APP_KEY=your-value -- docker run -i --rm -e DATABASE_URL -e APP_KEY ghcr.io/imgrund/hybridlog:0.1.13 php artisan mcp:start garmin

Fill in the empty values before running it.

The address contains {…} parts that only you know (such as your account), so copy it and fill them in.

Or copy the settings yourself

Paste into .cursor/mcp.json in your project, or ~/.cursor/mcp.json

{
  "mcpServers": {
    "hybridlog": {
      "url": "https://{hybridlog_host}/mcp/garmin"
    }
  }
}

Or run it on your computer

Open in Cursor

Or copy the settings yourself

Paste into .cursor/mcp.json in your project, or ~/.cursor/mcp.json

{
  "mcpServers": {
    "hybridlog": {
      "command": "docker",
      "args": [
        "run",
        "-i",
        "--rm",
        "-e",
        "DATABASE_URL",
        "-e",
        "APP_KEY",
        "ghcr.io/imgrund/hybridlog:0.1.13",
        "php",
        "artisan",
        "mcp:start",
        "garmin"
      ],
      "env": {
        "DATABASE_URL": "your-value",
        "APP_KEY": "your-value"
      }
    }
  }
}

Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.

The address contains {…} parts that only you know (such as your account), so copy it and fill them in.

Or copy the settings yourself

Paste into .vscode/mcp.json in your project

{
  "servers": {
    "hybridlog": {
      "type": "http",
      "url": "https://{hybridlog_host}/mcp/garmin"
    }
  }
}

Or run it on your computer

Open in VS Code

Or copy the settings yourself

Paste into .vscode/mcp.json in your project

{
  "servers": {
    "hybridlog": {
      "type": "stdio",
      "command": "docker",
      "args": [
        "run",
        "-i",
        "--rm",
        "-e",
        "DATABASE_URL",
        "-e",
        "APP_KEY",
        "ghcr.io/imgrund/hybridlog:0.1.13",
        "php",
        "artisan",
        "mcp:start",
        "garmin"
      ],
      "env": {
        "DATABASE_URL": "your-value",
        "APP_KEY": "your-value"
      }
    }
  }
}

Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.

ChatGPT connects only to servers on the internet:

  1. Open ChatGPT on the web → Settings → Connectors (Apps)
  2. Press Create or Add (some plans need Developer mode under Advanced first)
  3. Paste the address below, give it a name and save
  4. If it asks you to sign in, sign in with the maker
SettingsConnectors1+ Create2https://…3
https://{hybridlog_host}/mcp/garmin

The address contains {…} parts that only you know (such as your account), so copy it and fill them in.

Menu names can differ slightly by plan and over time.

Your choice stays on this device in a cookie; no account needed.

Values you fill in

  • DATABASE_URL secret required env
    PostgreSQL URL of the hybridlog database this server reads. The database is created and filled by a hybridlog installation, not by this image.
  • APP_KEY secret required env
    APP_KEY of the same hybridlog installation, so the container can read what that installation encrypted.

These settings are generated from the maker’s registry entry. If the README says otherwise, follow the README.

What it can do

We have not read this server’s tool list yet; we check endpoints in rotation.

Basic checksi

We check information anyone can see; we have not read the code. Checks that do not apply are left out of the count. · Checked Nov 8, 2026

  • ✓ Pass

    Maker matches the repo

    The registry name was verified with the GitHub account Imgrund, which owns the repo

  • … Not checked yet

    Still maintained

    We have not read this repo from GitHub yet

  • … Not checked yet

    Has a licence

    We have not read this repo from GitHub yet

  • – Not applicable

    Endpoint responds

    The address needs your own account values, so we cannot check it for you

  • – Not applicable

    Sign-in with OAuth

    The address needs your own account values, so we cannot check it for you

  • … Not checked yet

    No hidden instructions in tool descriptions

    Not checked yet; we read the tool list when we check the endpoint

Compared with others in Databases & datasetsi

  • More stars than 0% of the other 1144 servers in this category
  • Published to the registry more recently than 26% of the other 1144 servers in this category
  • Basic checks equal to or better than 100% of the other 1144 servers in this category

Compared with every active server in this category in the registry. Stars count only when the publisher owns the repo.

Common questions

Is hybridlog safe?

It passed 1 of 1 applicable basic checks. We have not read the code. Before adding a key or token, see what access the server asks for and use a key with only the permissions you need.

What keys or codes does it need?

You need to fill in: DATABASE_URL, APP_KEY

Does it run on my computer or in the cloud?

Either way works: install it on your computer or connect to the cloud version.

Is it still maintained?

The GitHub repo last changed –, and the latest version (0.1.13) reached the registry 2 months ago.

Which apps can use it?

Apps that support MCP, such as Claude Desktop, Claude Code, Cursor and VS Code. It connects by URL, so apps that accept remote MCP servers work too, such as ChatGPT in developer mode.

What can I use instead?

In the same category: Supabase, MongoDB MCP Server, Elasticsearch MCP Server

Alternatives

Servers in the same category from other makers, sorted by stars.

Reading a card:★ GitHub starsiThree pillars: reviews · checks · usageiUpdated = latest version published to the registryi

Supabase

by supabase

Supabase’s official server lets AI create tables, query data and review project settings in your Supabase database.

Computer or cloud★ 2,993Apache-2.0Updated yesterday
Install

MongoDB MCP Server

by mongodb-js

MongoDB Model Context Protocol Server

Runs on your computer★ 1,157Apache-2.0Updated 3 days ago
Install

README from the maker

Open the README

Copied from the maker’s repo as written. PopNx MCP has not reviewed or endorsed it. HTML, images and scripts are removed. Links lead off this site.

hybridlog

Self-hosted MCP server on your own Garmin data. It mirrors everything Garmin answers into a database you control, computes the models the watch does not (training load, muscle freshness, readiness in context), and hands all of it to a language model over stdio or HTTP, so the things Garmin cannot measure can be dictated into the chat instead of typed into a form. A dashboard comes with it: the body map, the training load, and the login the connector authenticates against. There is no hosted instance, and that is the point: it is a health record, and the model reads it through a role that can only read.

Running, lifting or both on the same day: the models do not care which. Sessions that alternate running with station work get a lap-by-lap breakdown of their own, which is the shape of a HYROX race.

There is a demo to walk through before installing anything: sign in as demo@example.com with the password demo-demo-demo. It runs on generated data and puts itself back every night.

Every number in these three is generated by fetcher/seed_demo.py. The interface is English and ships a German translation; it follows the browser language unless the profile says otherwise.

Read this before you rely on it. The fetcher talks to Garmin

Connect's *unofficial* web API. Garmin can change or close it without

notice. This project is not affiliated with or endorsed by Garmin.

Nothing it computes is a medical statement: readiness, HRV bands, load

ratios and the coach texts are training aids, not diagnoses. It is a

personal project published in the hope it is useful, with no promise of

support or a stable interface.

What it is

  • MCP server: thirteen tools and one prompt over laravel/mcp, in two transports. Local (stdio) for Claude Code and Claude Desktop, hosted (streamable HTTP with OAuth 2.1, PKCE and dynamic client registration) for claude.ai, ChatGPT, Mistral's Le Chat (renamed Vibe), LM Studio and anything else that speaks it.
  • Dashboard: Laravel + Alpine + Chart.js. It draws the body map and the training load, and it is also the login the connector authenticates against and the place where you set what the chat may see.
  • Fetcher: Python (fetcher/), pulls daily metrics and activities via python-garminconnect into one athlete's schema of a PostgreSQL database, which both of the above read through a connection that may only read it, and only that athlete's. Each answer is also kept whole beside the columns read out of it, so a field nobody has built a column for is still there to be asked about, and a day Garmin Connect no longer serves is still in the mirror.

What *no hosted instance* means in practice: the Garmin session sits in a schema of your own database that no reader role can reach, so the SQL a model writes cannot ask for it, and no operator but you holds it. Past Garmin itself, two optional things reach out at all: the weather, which takes a pair of coordinates you fill in yourself, and notifications, where the push service is woken by an empty POST and never carries what it was about.

The tools

Thirteen tools and one prompt. The right-hand column is the switch at /connect that gates each one; everything is on by default.

ToolWhat it answersNeeds
get-health-summary-toolthe current picture in one call: readiness, sleep, load, data freshnessRead health data
get-insights-toolthe app's own verdict per body system, with the recommendation and the early illness patternRead health data, Read body metrics
get-muscle-map-toolper-zone freshness, weekly volume per zone, what to train todayRead health data
get-training-load-toolCTL/ATL/TSB, the acute:chronic ratio, the weekly stimulus splitRead health data
get-strength-progress-toolweek by week per exercise category: reps, tonnage where it was recorded, top weights, what has not movedRead health data
get-race-splits-toolone session lap by lap: running vs. station work, pace per lap, how far the pace driftedRead health data
get-activity-detail-toolone session in depth: zone minutes and shares against the athlete's zone floors, laps, sets, the heart-rate curve, and how it compares with earlier sessions of its kindRead health data
describe-schema-toolthe mirror's tables and columns, so the model can write its own queryRead health data, Read body metrics
query-health-data-tooleverything else, as one read-only SELECT with a 500-row capRead health data, Read body metrics
refresh-data-toolsyncs today and yesterday from Garmin (the header button's job, narrowed to two days) and waits for itStart a fetch
log-symptom-toola strain mentioned in passing, as a marker on the body mapLog how you feel
delete-symptom-tooltakes one off again once it has healedLog how you feel
give-feedback-toola correction that becomes a standing guideline for the connectorProcess feedback
weekly-report (prompt)drives the Sunday review; the report is the conversation's answer and is stored nowhereRead health data

Most of them answer a question the app was built around. Two do not: describe-schema hands the model the mirror's own tables with the comments that say what each column means, and query-health-data runs the SELECT it writes from that. It is the difference between a set of reports and a database somebody can think in, and it is what makes keeping the raw answers worth the disk: a field nobody has promoted to a column is still one question away.

Reading is the whole of it, with one documented exception. Symptoms are the only thing the chat may write, and they go to the app's own schema, never into the Garmin mirror. Free-form SQL runs through app/Garmin/ReadOnlyGarminQuery: a single SELECT or WITH, a keyword blocklist, a read-only transaction, a row cap, on a connection switched into a role that holds SELECT on one athlete's schema and nothing else.

Quickstart (Docker, demo data, no Garmin account)

git clone https://github.com/Imgrund/hybridlog.git

cd hybridlog cp .env.example .env docker compose up -d

That brings up PostgreSQL, the dashboard, a queue worker and a scheduler. The published image covers amd64 and arm64, so the first start downloads rather than compiles. After a git pull, plain up -d keeps running the image it already has: the new code arrives only with --build.

Then fill the mirror with 120 days of plausible data, create the account you log in with, and open the dashboard:

docker compose exec app /opt/fetcher/bin/python fetcher/seed_demo.py

docker compose exec app php artisan app:create-user you@example.com --admin open http://localhost:8080

There is no sign-up page, on purpose: a login nobody can register at has no surface to attack. For anybody but yourself, hand over a link instead of a password:

docker compose exec app php artisan app:invite them@example.com --name="Them"

It prints a one-time link, good for seven days (--days), on which they set their own password. --admin marks the installation owner, who is the account the local stdio transport acts for. Every account keeps its own profile, permissions, symptom log, Garmin sign-in, notifications and mirror, and sees none of anybody else's.

DEMO_MODE=true turns an installation into a shop window instead: one shared account, everything that would reach out of it closed (the Garmin sign-in above all), and php artisan demo:reset putting it back nightly.

A shop window is also the one place worth counting visitors in, and UMAMI_SCRIPT_URL plus UMAMI_WEBSITE_ID render the script tag of an Umami instance you host yourself: page views without a cookie and without an identifier that follows anyone off the site. Both lines are needed, and with either empty, which is the default, nothing is rendered at all and no page requests a host but this one. It is not tied to DEMO_MODE, so a private installation stays free of outside scripts by simply leaving them alone.

Connect an AI

The server reads the same mirror the dashboard draws from, so a chat and the page never disagree. What the page cannot do is answer a question it was not built for: how this week stands against the one before, whether today is a rest day, what a niggle means for tomorrow.

[!IMPORTANT]

This hands a language model your health record. It reads through a role

that may only read, and only your own schema, but it reads all of it.

Which parts is yours to set at /connect, per switch, and the switches

take effect on the next tool call rather than the next reconnect.

One address, the same for every client:

https://<your-domain>/mcp/garmin

Claude, ChatGPT, Langdock, Le Chat and LM Studio all take it and run OAuth against the dashboard's own login, so no client ever sees a password and /connect can cut any of them off again. Claude Code and Claude Desktop can skip the deployment entirely and talk to the repository over stdio. docs/connect-ai.md has the steps per client.

Whichever way it connects, it gets the same thirteen tools and the same switches.

Things worth asking, once it is connected:

How did my training week compare with the one before?

Am I ready for a hard session, or do I need a rest day?

Which muscles are fresh, and what should I train today?

Where did my pace go in Saturday's race, and how much of the clock was

station work?

My left knee hurt on the box jumps.

Setup with your own Garmin account

Sign in under *Garmin* in the account menu, or at /connect/garmin: email, password, and the MFA code if Garmin asks for one. What is stored is an OAuth token pair, never the password. The sign-in runs on a queue worker, so one has to be up.

A first sign-in fills the mirror by itself: a ninety-day backfill on the queue, roughly a quarter of an hour, with the page filling in as the history lands. Ninety days is about the minimum for the models to say anything, since the HRV baseline needs three weeks of nights and the load ratios a rolling six weeks. From then on the scheduler fetches three times a day and the *Fetch from Garmin* button fetches on demand.

Every command works on one athlete (--tenant , the owner where left out). Details, backfills and the manual login are in docs/install.md; how to record so the data is worth reading is in docs/recording.md.

Documentation

  • docs/install.md: installing without Docker, deploying to a platform, backup.
  • docs/connect-ai.md: every client's steps, OAuth and discovery, running the MCP server on a public host.
  • docs/recording.md: recording rules, weather, notifications.

Architecture notes

-

Only the beginning is shown; read the rest in the repo

Ask PopNx