Spec Driven Development
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
คำอธิบายจากผู้ทำ (ภาษาอังกฤษตามต้นฉบับ)
Adaptive AI training coach MCP server backed by Garmin Connect
สามเรื่องนี้ไม่รวมเป็นคะแนนเดียว เพราะความเห็น การวัด และความนิยม เป็นคนละเรื่องกัน
ตัวนี้ยังไม่ได้เรียบเรียงเป็นภาษาไทย ด้านล่างคือข้อเท็จจริงที่เราอ่านจาก registry
เลือกโปรแกรม AI ที่คุณใช้ แล้วคัดลอกค่าตั้งไปวาง
GARMIN_EMAIL, GARMIN_PASSWORD, COACH_DATA_DIRค่าที่ติดป้ายความลับคือกุญแจของบัญชีคุณ อย่าส่งให้ใคร และอย่าวางในแชต
ต้องเตรียมก่อน
คุณใช้แอปไหน
เลือกแอปด้านบน เราจำไว้ให้ ครั้งหน้าปุ่มจะขึ้นว่า “ติดตั้งลง …”
เปิด Claude Desktop → Settings → Developer → Edit Config แล้ววางค่านี้ในไฟล์ claude_desktop_config.json
{
"mcpServers": {
"coach": {
"command": "uvx",
"args": [
"garmin-coach-mcp"
],
"env": {
"GARMIN_EMAIL": "ใส่ค่าของคุณ",
"GARMIN_PASSWORD": "ใส่ค่าของคุณ",
"COACH_DATA_DIR": "ใส่ค่าของคุณ"
}
}
}
}พิมพ์คำสั่งนี้ใน Terminal
claude mcp add coach --env GARMIN_EMAIL='ใส่ค่าของคุณ' --env GARMIN_PASSWORD='ใส่ค่าของคุณ' --env COACH_DATA_DIR='ใส่ค่าของคุณ' -- uvx garmin-coach-mcpเติมค่าที่เว้นว่างไว้ก่อนรัน
วางในไฟล์ .cursor/mcp.json ของโปรเจกต์ หรือ ~/.cursor/mcp.json
{
"mcpServers": {
"coach": {
"command": "uvx",
"args": [
"garmin-coach-mcp"
],
"env": {
"GARMIN_EMAIL": "ใส่ค่าของคุณ",
"GARMIN_PASSWORD": "ใส่ค่าของคุณ",
"COACH_DATA_DIR": "ใส่ค่าของคุณ"
}
}
}
}เบราว์เซอร์จะถามก่อนเปิดแอป จากนั้นแอปแสดงค่าตั้งให้ตรวจแล้วกดยืนยัน ช่อง key เว้นว่างไว้ให้คุณใส่เอง
วางในไฟล์ .vscode/mcp.json ของโปรเจกต์
{
"servers": {
"coach": {
"type": "stdio",
"command": "uvx",
"args": [
"garmin-coach-mcp"
],
"env": {
"GARMIN_EMAIL": "ใส่ค่าของคุณ",
"GARMIN_PASSWORD": "ใส่ค่าของคุณ",
"COACH_DATA_DIR": "ใส่ค่าของคุณ"
}
}
}
}เบราว์เซอร์จะถามก่อนเปิดแอป จากนั้นแอปแสดงค่าตั้งให้ตรวจแล้วกดยืนยัน ช่อง key เว้นว่างไว้ให้คุณใส่เอง
ตัวนี้รันในเครื่องคุณ แต่ ChatGPT ต่อได้เฉพาะ server บนอินเทอร์เน็ต ลองเลือกแอปอื่น
ตัวเลือกเก็บในคุกกี้บนเครื่องนี้ ไม่ต้องมีบัญชี
COACH_DATA_DIR envค่าตั้งนี้สร้างจากข้อมูลใน registry ของผู้ทำ ถ้าไม่ตรงกับ README ให้เชื่อ README
รันในเครื่องคุณ รายการเครื่องมือจะขึ้นในแอป AI หลังติดตั้ง
เราตรวจจากข้อมูลที่ใครก็เปิดดูได้ ยังไม่ได้อ่านโค้ด ข้อที่ไม่เกี่ยวกับตัวนี้ไม่นับในตัวหาร · ตรวจเมื่อ 8 พ.ย. 2569
ชื่อใน registry ยืนยันด้วยบัญชี GitHub snoozelieb ซึ่งเป็นเจ้าของ repo
ยังไม่ได้อ่านข้อมูล repo จาก GitHub
ยังไม่ได้อ่านข้อมูล repo จาก GitHub
ตัวนี้รันบนเครื่องคุณ ไม่มี endpoint บนอินเทอร์เน็ต
ตัวนี้รันบนเครื่อง ใช้ค่าที่ตั้งในเครื่องแทน
รันในเครื่องคุณ เราอ่านรายการเครื่องมือได้เฉพาะตัวที่มี endpoint บนอินเทอร์เน็ต
เทียบกับทุก server ที่ยังใช้งานในหมวดนี้ทั้งทะเบียน ดาวนับเฉพาะเมื่อผู้ลงทะเบียนเป็นเจ้าของ repo
จากการตรวจเบื้องต้นของเรา ผ่าน 1 จาก 1 ข้อที่ตรวจได้ เรายังไม่ได้อ่านโค้ด ก่อนใส่กุญแจหรือ token ให้ดูว่า server ขอสิทธิ์อะไร และเลือกกุญแจที่ทำได้เท่าที่จำเป็น
ต้องใส่ค่าเหล่านี้: GARMIN_EMAIL, GARMIN_PASSWORD
รันบนเครื่องของคุณ โปรแกรม AI จะเปิด server ขึ้นมาเองเมื่อใช้ ข้อมูลไม่ต้องผ่านเซิร์ฟเวอร์ของผู้ทำ (ยกเว้นตัวที่ไปเรียกบริการออนไลน์ต่อ)
repo บน GitHub มีการแก้โค้ดล่าสุด – และส่งรุ่นล่าสุด (1.4.0) เข้า registry เมื่อวาน
โปรแกรมที่รองรับ MCP เช่น Claude Desktop, Claude Code, Cursor และ VS Code ตัวนี้ต้องมี Python (uv) ในเครื่องด้วย
ในหมวดเดียวกันมี Spec Driven Development, Remote Desktop Commander, Funooy Krillion Reference
server หมวดเดียวกันจากผู้ทำคนอื่น เรียงตามดาว
อ่านการ์ด:★ ดาว GitHubiสามเสา: รีวิว · ผลตรวจ · การใช้งานiอัปเดต = วันที่ส่งรุ่นล่าสุดเข้า registryi
MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.
Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.
Funooy trivia references in six languages, with rules and fixed scoring. No daily spoilers.
ส่วนนี้คัดจาก repo ของผู้ทำตามต้นฉบับ PopNx MCP ไม่ได้ตรวจหรือรับรองเนื้อหา ตัด HTML รูปภาพ และสคริปต์ออกแล้ว ลิงก์จะพาออกนอกเว็บ
An opinionated AI training coach as an MCP server. It pulls your real data from Garmin Connect and prescribes with authority — science-based load management (ACWR), code-enforced injury gates (the server rejects plans that violate an active injury restriction, no matter what the LLM says), and persistent coaching memory so decisions, rationale, and your adaptation patterns survive between conversations. It will tell you "no" when your enthusiasm exceeds your capacity.
All health data and credentials stay on your machine — see Security & Privacy.
You need Python 3.12+, a free Garmin Connect account, and an MCP client (Claude Code, Claude Desktop, or Cursor).
No install step — your MCP client runs the server on demand:
uvx garmin-coach-mcp
Jump to Connect your MCP client and use uvx as the command.
git clone https://github.com/snoozelieb/coach-mcp.git
cd coach-mcp
python -m venv .venv
source .venv/bin/activate
.venv\Scripts\activate
pip install -r requirements.txt cp .env.example .env # then edit: GARMIN_EMAIL, GARMIN_PASSWORD python server.py
The server needs two environment variables: GARMIN_EMAIL and GARMIN_PASSWORD. Optional: COACH_DATA_DIR (where your coaching data lives); COACH_TOKEN_DIR, COACH_TRANSPORT and COACH_CODE_MODE are covered under Security & Privacy and Advanced. From a source checkout, a .env file works too.
After one successful login the server runs from the stored Garmin tokens (garmin-coach-login performs that login, MFA included), so a client that cannot expand variables in its config can leave GARMIN_PASSWORD out.
To run the server or the helpers from a terminal, set the two variables in that shell first. PowerShell and bash quote differently:
$env:GARMIN_EMAIL = "you@example.com"
$env:GARMIN_PASSWORD = "your-password"
export GARMIN_EMAIL=you@example.com GARMIN_PASSWORD=your-password
claude mcp add coach-mcp \
--env GARMIN_EMAIL=you@example.com \ --env GARMIN_PASSWORD=your_garmin_password \ -- uvx garmin-coach-mcp
Or in .mcp.json (Claude Code expands ${VAR} from your shell environment, so a committed file holds no secret):
{
"mcpServers": { "coach-mcp": { "command": "uvx", "args": ["garmin-coach-mcp"], "env": { "GARMIN_EMAIL": "you@example.com", "GARMIN_PASSWORD": "${GARMIN_PASSWORD}", "COACH_DATA_DIR": "/path/to/your/coach-data" } } } }
Running from source instead: claude mcp add coach-mcp -- python /full/path/to/coach-mcp/server.py
In claude_desktop_config.json (Settings → Developer → Edit Config):
{
"mcpServers": { "coach-mcp": { "command": "uvx", "args": ["garmin-coach-mcp"], "env": { "COACH_DATA_DIR": "/path/to/your/coach-data" } } } }
Claude Desktop reads this file as written (no variable expansion), so keep the Garmin password out of it: run garmin-coach-login once in a terminal with GARMIN_EMAIL and GARMIN_PASSWORD set for that command, and the server logs in from the stored tokens from then on. When they expire the tools say so; run the login again.
In .cursor/mcp.json (project) or ~/.cursor/mcp.json (global):
{
"mcpServers": { "coach-mcp": { "command": "uvx", "args": ["garmin-coach-mcp"], "env": { "GARMIN_EMAIL": "you@example.com", "GARMIN_PASSWORD": "${env:GARMIN_PASSWORD}", "COACH_DATA_DIR": "/path/to/your/coach-data" } } } }
If you installed with pip install garmin-coach-mcp instead of uvx, use "command": "garmin-coach-mcp" with no args in any of the blocks above.
garmin-coach-setup # pip / uvx install
python scripts/setup_wizard.py # source checkout
Until a profile exists the server runs in setup mode: plan, program and push writes answer setup_required and name the data directory they looked in.
It creates your athlete profile, training config, and empty plan/memory files in the data directory. Alternatively, create the two required files by hand and let the coach fill in the rest via conversation:
echo '{"personal":{"name":null},"injury_history":[],"life_constraints":{}}' > data/athlete.json
echo '{"events":[],"current_block":{"phase":"base"}}' > data/training_config.json
"Run refresh_athlete_baseline and set up my training."
The coach pulls your name, weight, age, HR data, and training capacity from Garmin, then starts the onboarding conversation — goals, constraints, injury history, race calendar.
AUTH_REQUIRED, recover with: garmin-coach-login # pip / uvx install
python scripts/garmin_login.py # source checkout
It does a fresh credential login, prompts for the MFA code if Garmin asks, and saves new tokens. Restart the MCP server afterwards.
get_coaching_snapshot(): current time context, 7-day week grid (rest days explicit), fitness metrics, plan adherence, open anomalies, injuries, sleep gate.update_weekly_plan and push_plan_to_garmin reject sessions that violate an active injury's restricted activities, and every non-rest session must carry a purpose or the save is refused. Multi-week programs (training_program) are rejected if their starting capacity contradicts your actual history.grounding_warnings.54 tools — you don't call them directly; the coach uses them during conversation:
| Category | Tools |
|---|---|
| Coaching core | get_coaching_snapshot (canonical, sectioned), get_compliance_report, get_coaching_score |
| Planning | get_weekly_plan, update_weekly_plan, preview_workout (render one session the way the watch will show it, or fetch the session contract), push_plan_to_garmin (preview with the step tree per session, then confirm), training_program (action=get/set; multi-week programs, capacity-anchored and injury-gated), get_week_constraints, get_weekly_prescription, get_periodization_status, update_phase |
| Garmin data | query_metrics (kind=fitness/sport_history/intensity/daily/readiness/personal_records), get_activities_range |
| Athlete | get_athlete, update_athlete, set_ftp, set_threshold_pace, analyze_ftp_test, refresh_athlete_baseline, refresh_fitness_history, backfill_history, get_onboarding_guide |
| Methodology | get_methodology, update_methodology |
| Races | races (action=list/add/update/research), remove_race |
| Strength | sync_strength_session, get_strength_baseline, approve_progression, set_exercise_preference, generate_strength_workout, add_exercise |
| Injuries | diagnose_injury, research_injury, update_injury_status |
| Research | research_exercise, list_exercises, research_sport |
| Memory | log_coaching_decision, get_active_decisions, update_decision_status, record_athlete_response, get_response_patterns, resolve_anomaly |
| Approvals | propose_coaching_action, list_pending_approvals, approve_proposal, reject_proposal |
| Weather | get_weather_outlook (wind, gusts, rain and daylight at the profile location — Open-Meteo, no key), set_location |
| Interactive | generate_smart_brief, interactive_check_in |
Every tool carries MCP annotations (read-only / destructive / idempotent / open-world), enforced by tests.
7 prompts: weekly_planning, morning_brief, injury_assessment, week_review, onboarding, race_program, author_session.
7 resources: coach://athlete/profile, coach://plan/current, coach://config/training, coach://coaching/decisions, coach://context/now, coach://coaching/doctrine (the long-form coaching doctrine), coach://authoring/contract (the generated session contract).
Everything stays on your machine:
GARMIN_EMAIL/GARMIN_PASSWORD live in your MCP client config or a local .env. Garmin OAuth tokens are cached in a local token store (.garth/ in a source checkout, a per-user garmin-tokens directory for installed copies; override with COACH_TOKEN_DIR).COACH_HTTP_TOKEN and validate Host/Origin on every request; research fetches go only to public https addresses, pinned to the address that passed the check.COACH_DATA_DIRs.See SECURITY.md for details and how to report issues.
Resolution order: COACH_DATA_DIR env var → data/ in a source checkout → a per-user data directory (created on first run for installed packages). The only file shipped with the package is methodology.json (safety rules, race templates, personas); everything personal is created locally and never committed.
# HTTP transport instead of stdio: a bearer token is required (clients send
COACH_HTTP_TOKEN="$(python -c 'import secrets; print(secrets.token_urlsafe(32))')" COACH_TRANSPORT=http FASTMCP_PORT=8000 garmin-coach-mcp
pip install fastmcp[code-mode] COACH_CODE_MODE=1 garmin-
ตัดมาแค่ช่วงต้น อ่านต่อใน repo