Supabase
MCP server for interacting with the Supabase platform
제작자가 쓴 설명(영어 원문)
Reads your own Garmin mirror: readiness, training load, muscle freshness, and read-only SQL.
이 세 가지는 절대 하나의 점수로 합치지 않아요. 의견, 측정, 인기는 서로 다른 것이니까요.
이 서버는 아직 쉬운 말로 된 요약을 쓰지 못했어요. 아래는 레지스트리에서 읽어 온 사실이에요.
쓰고 있는 AI 앱을 고른 다음 설정을 복사하세요.
DATABASE_URL, APP_KEY비밀로 표시된 값은 내 계정의 열쇠예요. 절대 다른 사람과 공유하거나 채팅에 붙여 넣지 마세요.
필요한 것
어떤 앱을 쓰세요?
위에서 앱을 고르세요. 기억해 두었다가 다음부터는 버튼에 “…에 설치”라고 표시해요.
웹, 데스크톱, 모바일의 Claude에서 쓸 수 있어요:
https://{hybridlog_host}/mcp/garmin주소에 나만 아는 {…} 부분(예: 내 계정)이 있어서, 복사한 뒤 직접 채워 주세요.
Claude Desktop → Settings → Developer → Edit Config를 열고 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"
}
}
}
}터미널에서 이 명령어를 실행하세요
claude mcp add --transport http hybridlog 'https://{hybridlog_host}/mcp/garmin'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실행하기 전에 빈 값을 채워 주세요.
주소에 나만 아는 {…} 부분(예: 내 계정)이 있어서, 복사한 뒤 직접 채워 주세요.
프로젝트의 .cursor/mcp.json 또는 ~/.cursor/mcp.json에 붙여 넣으세요
{
"mcpServers": {
"hybridlog": {
"url": "https://{hybridlog_host}/mcp/garmin"
}
}
}프로젝트의 .cursor/mcp.json 또는 ~/.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"
}
}
}
}브라우저가 앱을 열지 물어본 다음, 앱이 설정을 보여 주고 확인을 요청해요. 키 값은 비워 두니 직접 입력하세요.
주소에 나만 아는 {…} 부분(예: 내 계정)이 있어서, 복사한 뒤 직접 채워 주세요.
프로젝트의 .vscode/mcp.json에 붙여 넣으세요
{
"servers": {
"hybridlog": {
"type": "http",
"url": "https://{hybridlog_host}/mcp/garmin"
}
}
}프로젝트의 .vscode/mcp.json에 붙여 넣으세요
{
"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"
}
}
}
}브라우저가 앱을 열지 물어본 다음, 앱이 설정을 보여 주고 확인을 요청해요. 키 값은 비워 두니 직접 입력하세요.
ChatGPT는 인터넷에 있는 서버에만 연결할 수 있어요:
https://{hybridlog_host}/mcp/garmin주소에 나만 아는 {…} 부분(예: 내 계정)이 있어서, 복사한 뒤 직접 채워 주세요.
메뉴 이름은 요금제나 시기에 따라 조금 다를 수 있어요.
선택한 앱은 이 기기의 쿠키에만 저장돼요. 계정은 필요 없어요.
이 설정은 제작자의 레지스트리 정보로 만들었어요. README와 다르면 README를 따르세요.
아직 이 서버의 도구 목록을 읽지 않았어요. 엔드포인트는 차례대로 돌아가며 점검해요.
누구나 볼 수 있는 정보를 점검했고, 코드는 읽지 않았어요. 해당하지 않는 항목은 개수에서 뺐어요. · 2026년 11월 7일 점검
레지스트리 이름이 GitHub 계정 Imgrund 기준으로 확인되었고, 이 계정이 저장소를 소유하고 있어요
아직 GitHub에서 이 저장소를 읽어 오지 않았어요
아직 GitHub에서 이 저장소를 읽어 오지 않았어요
주소에 내 계정 값이 필요해서 대신 점검할 수 없어요
주소에 내 계정 값이 필요해서 대신 점검할 수 없어요
아직 점검하지 않았어요. 엔드포인트를 점검할 때 도구 목록을 읽어요
레지스트리에서 이 카테고리의 활성 서버 전체와 비교했어요. 스타는 게시자가 저장소를 소유한 경우에만 세요.
해당하는 기본 점검 1개 중 1개를 통과했어요. 코드는 읽지 않았어요. 키나 토큰을 넣기 전에 서버가 어떤 권한을 요구하는지 확인하고, 꼭 필요한 권한만 있는 키를 쓰세요.
입력해야 할 값: DATABASE_URL, APP_KEY
둘 다 가능해요. 내 컴퓨터에 설치해도 되고, 클라우드 버전에 연결해도 돼요.
GitHub 저장소는 마지막으로 – 변경됐고, 최신 버전(0.1.13)은 2개월 전 레지스트리에 올라왔어요.
Claude Desktop, Claude Code, Cursor, VS Code처럼 MCP를 지원하는 앱에서 쓸 수 있어요. URL로 연결되기 때문에, 원격 MCP 서버를 지원하는 앱(예: 개발자 모드의 ChatGPT)에서도 쓸 수 있어요.
같은 카테고리에는: Supabase, MongoDB MCP Server, Elasticsearch MCP Server
같은 카테고리에서 다른 제작자가 만든 서버예요. 스타 순으로 정렬했어요.
카드 보는 법:★ GitHub 스타i세 기둥: 리뷰 · 점검 · 사용 정도i업데이트 = 최신 버전을 레지스트리에 공개한 날i
MCP server for interacting with the Supabase platform
MongoDB Model Context Protocol Server
MCP server for interacting with Elasticsearch
제작자의 저장소에서 쓰인 그대로 가져왔어요. PopNx MCP가 검토하거나 보증한 내용이 아니에요. HTML, 이미지, 스크립트는 제거했어요. 링크를 누르면 이 사이트를 벗어나요.
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.
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.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.
Thirteen tools and one prompt. The right-hand column is the switch at /connect that gates each one; everything is on by default.
| Tool | What it answers | Needs |
|---|---|---|
get-health-summary-tool | the current picture in one call: readiness, sleep, load, data freshness | Read health data |
get-insights-tool | the app's own verdict per body system, with the recommendation and the early illness pattern | Read health data, Read body metrics |
get-muscle-map-tool | per-zone freshness, weekly volume per zone, what to train today | Read health data |
get-training-load-tool | CTL/ATL/TSB, the acute:chronic ratio, the weekly stimulus split | Read health data |
get-strength-progress-tool | week by week per exercise category: reps, tonnage where it was recorded, top weights, what has not moved | Read health data |
get-race-splits-tool | one session lap by lap: running vs. station work, pace per lap, how far the pace drifted | Read health data |
get-activity-detail-tool | one 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 kind | Read health data |
describe-schema-tool | the mirror's tables and columns, so the model can write its own query | Read health data, Read body metrics |
query-health-data-tool | everything else, as one read-only SELECT with a 500-row cap | Read health data, Read body metrics |
refresh-data-tool | syncs today and yesterday from Garmin (the header button's job, narrowed to two days) and waits for it | Start a fetch |
log-symptom-tool | a strain mentioned in passing, as a marker on the body map | Log how you feel |
delete-symptom-tool | takes one off again once it has healed | Log how you feel |
give-feedback-tool | a correction that becomes a standing guideline for the connector | Process feedback |
weekly-report (prompt) | drives the Sunday review; the report is the conversation's answer and is stored nowhere | Read 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.
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.
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.
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.
-
앞부분만 보여 드려요. 나머지는 저장소에서 읽어 보세요