fitness-tracker-mcp
🏋️ Fitness Tracker — MCP Server
Ein vollständig offline arbeitender Model Context Protocol (MCP)-Server, der es jedem MCP-kompatiblen KI-Client – wie Claude Code, Claude Desktop oder Cursor – ermöglicht, Workouts zu protokollieren, Makronährstoffe zu verfolgen und tägliche Gesundheitsübersichten abzurufen – alles gestützt auf eine lokale SQLite-Datenbank ohne Netzwerkabhängigkeit.
📖 Inhaltsverzeichnis
Related MCP server: Nutrition MCP
💡 Warum dieses Projekt?
Große Sprachmodelle sind großartig in Konversationen, aber sie können Benutzerdaten nicht nativ über Sitzungen hinweg persistieren. Das Model Context Protocol schließt diese Lücke, indem es LLMs ermöglicht, externe Tools aufzurufen – und die KI so in einen echten Assistenten verwandelt, der strukturierte Daten im Namen des Benutzers lesen, schreiben und abfragen kann.
Dieses Projekt demonstriert eine praktische MCP-Integration: einen Fitnesstracker, den ein KI-Assistent freihändig bedienen kann. Bitten Sie Ihre KI: „Logge einen 30-minütigen Lauf, der 300 Kalorien verbrannt hat" – und sie wird die Daten validieren, in SQLite speichern und bestätigen – ganz ohne dass Sie jemals eine Tabellenkalkulation öffnen.
✨ Hauptfunktionen
Funktion | Beschreibung |
Workout-Protokollierung | Erfasst Trainingseinheiten mit Typ, Dauer und verbrannten Kalorien |
Makro-Tracking | Protokolliert tägliche Protein-, Kohlenhydrat- und Fettaufnahme pro Mahlzeit oder pro Tag |
Tägliche Zusammenfassungen | Aggregierte Ansicht von Workouts + Ernährung mit Kalorienberechnungen |
Vollständig offline | stdio-Transport – keine Netzwerkaufrufe, keine API-Schlüssel, keine Cloud-Abhängigkeit |
Strenge Validierung | Pydantic-v2-Schemata fangen fehlerhafte LLM-Ausgaben ab, bevor sie die Datenbank erreichen |
SQL-Injection-sicher | Durchgängig parametrisierte Abfragen – Benutzereingaben gelangen nie in rohes SQL |
Umfassende Tests | 22 Pytest-Fälle für Schema-Validierung, DB-Logik und Randfälle |
🧱 Technologie-Stack
Ebene | Technologie | Zweck |
MCP-Framework | Stellt Python-Funktionen als MCP-Tools über stdio bereit | |
Datenbank | SQLite 3 | Leichte, konfigurationsfreie lokale Persistenz |
Validierung | Pydantic v2 | Schema-Durchsetzung und Typumwandlung für LLM-Eingaben |
Tests | Pytest | Isolierte In-Memory-Datenbanken pro Test |
Sprache | Python 3.10+ | Kernlaufzeit |
🏗️ Architekturübersicht
Das System folgt einer Schichtenarchitektur mit klarer Trennung der Zuständigkeiten:
graph TB
subgraph Client Layer
A["🤖 MCP Client<br/>(Claude Code / Claude Desktop / Cursor)"]
end
subgraph Transport Layer
B["📡 stdio<br/>(JSON-RPC over stdin/stdout)"]
end
subgraph MCP Server ["MCP Server (server.py)"]
direction TB
C["🔧 FastMCP Tool Router<br/>Routes tool calls to handlers"]
D["📋 Pydantic Schemas<br/>WorkoutInput · MacrosInput · DailySummaryRequest"]
E["⚙️ Core Business Logic<br/>insert_workout · insert_macros · fetch_daily_summary"]
F["🗄️ Database Layer<br/>get_connection · init_db"]
end
subgraph Storage
G[("💾 SQLite<br/>fitness_tracker.db")]
end
A <-->|"JSON-RPC"| B
B <-->|"Tool calls & responses"| C
C --> D
D -->|"Validated data"| E
E <--> F
F <--> G
style A fill:#4A90D9,stroke:#2C5F8A,color:#fff
style B fill:#F5A623,stroke:#C77E1A,color:#fff
style C fill:#7B68EE,stroke:#5A4DB2,color:#fff
style D fill:#50C878,stroke:#3A9458,color:#fff
style E fill:#FF6B6B,stroke:#CC5555,color:#fff
style F fill:#DDA0DD,stroke:#AA70AA,color:#fff
style G fill:#87CEEB,stroke:#5F9EAF,color:#000Verantwortlichkeiten der Schichten
Ebene | Komponente | Verantwortung |
Client | Claude Code / Desktop | Sendet natürliche Sprache → MCP-Toolaufrufe |
Transport | stdio (JSON-RPC) | Serialisiert Toolaufrufe über stdin/stdout – kein HTTP, keine Ports |
Router | FastMCP | Ordnet eingehende Toolnamen den Python-Handlerfunktionen zu |
Validierung | Pydantic-Schemata | Parst und validiert jedes Eingabefeld vor dem DB-Zugriff |
Geschäftslogik | Kernfunktionen | Führt Einfügungen, Aggregationen und Kalorienberechnungen aus |
Speicherung | SQLite über | Persistiert Daten in einer einzigen Datei |
🔄 Datenfluss
Eine Schritt-für-Schritt-Verfolgung dessen, was passiert, wenn ein Benutzer sagt: „Logge einen 30-minütigen Lauf":
sequenceDiagram
participant User
participant Client as MCP Client (Claude)
participant Transport as stdio (JSON-RPC)
participant Router as FastMCP Router
participant Schema as Pydantic Validator
participant Logic as Business Logic
participant DB as SQLite DB
User->>Client: "Log a 30-minute run that burned 300 calories"
Client->>Transport: tool_call: log_workout(date, type, duration, calories)
Transport->>Router: Deserialize JSON-RPC request
Router->>Schema: WorkoutInput(date, type, duration, calories)
alt Validation Fails
Schema-->>Router: ❌ ValidationError (clear message)
Router-->>Transport: Error response
Transport-->>Client: Display error to user
end
Schema-->>Router: ✅ Validated WorkoutInput object
Router->>Logic: insert_workout(validated_data)
Logic->>DB: INSERT INTO workouts (date, type, duration, calories) VALUES (?, ?, ?, ?)
DB-->>Logic: Row ID
Logic-->>Router: {status: success, workout: {...}}
Router-->>Transport: JSON-RPC response
Transport-->>Client: "Logged: 30 min running — 300 kcal burned ✅"
Client-->>User: Confirmation message🗃️ Datenbankschema
Die SQLite-Datenbank (fitness_tracker.db) wird beim ersten Start automatisch erstellt und enthält zwei Tabellen:
erDiagram
WORKOUTS {
INTEGER id PK "Auto-increment"
TEXT date "YYYY-MM-DD (NOT NULL)"
TEXT type "e.g. running, cycling (NOT NULL)"
REAL duration "Minutes, > 0 (NOT NULL)"
REAL calories "kcal burned, >= 0 (NOT NULL)"
}
MACROS {
INTEGER id PK "Auto-increment"
TEXT date "YYYY-MM-DD (NOT NULL)"
REAL protein "Grams, >= 0 (NOT NULL)"
REAL carbs "Grams, >= 0 (NOT NULL)"
REAL fat "Grams, >= 0 (NOT NULL)"
}Kalorienberechnung
Die tägliche Zusammenfassung berechnet geschätzte aufgenommene Kalorien aus den Makronährstoffen mithilfe der standardmäßigen Atwater-Faktoren:
$$\text{Calories} = (\text{Protein} \times 4) + (\text{Carbs} \times 4) + (\text{Fat} \times 9) ;\text{kcal}$$
📂 Projektstruktur
MCP_Project/
├── server.py # MCP server — tools, schemas, DB helpers, entrypoint
├── test_server.py # Pytest suite (22 tests across 6 test classes)
├── requirements.txt # Python dependencies (fastmcp, pydantic, pytest)
├── fitness_tracker.db # SQLite database (auto-created on first run)
├── .gitignore # Ignores venv, __pycache__, .env
├── .env # Environment variables (git-ignored)
└── README.md # This fileDateiaufschlüsselung
Datei | Zeilen | Beschreibung |
| ~322 | Vollständiger MCP-Server: DB-Initialisierung, Pydantic-Modelle, CRUD-Operationen, FastMCP-Tooldefinitionen und stdio-Einstiegspunkt |
| ~265 | 22 Tests in 6 Klassen – Schema-Validierung (gültige + ungültige Eingaben), DB-Einfügungen, tägliche Aggregation, Datumsisolierung und SQL-Injection-Sicherheit |
| 3 |
|
🚀 Erste Schritte
Voraussetzungen
Python 3.10+ installiert
pip-Paketmanager
1. Repository klonen
git clone https://github.com/MayankKapgate/fitness-tracker-mcp.git
cd MCP_Project2. Virtuelle Umgebung erstellen & aktivieren (empfohlen)
# Windows
python -m venv myvenv
myvenv\Scripts\activate
# macOS / Linux
python3 -m venv myvenv
source myvenv/bin/activate3. Abhängigkeiten installieren
pip install -r requirements.txt4. Tests ausführen
pytest test_server.py -vSie sollten 22 bestandene Tests sehen ✅
5. Server starten (eigenständig)
python server.pyHinweis: Der Server verwendet stdio-Transport – er liest JSON-RPC von
stdinund schreibt nachstdout. Sie werden keine Shell-Eingabeaufforderung sehen; das ist beabsichtigt für die Nutzung durch MCP-Clients.
🔌 Verbindung zu MCP-Clients herstellen
Claude Code
Registrieren Sie den Server einmal über Ihr Terminal:
claude mcp add fitness-tracker --transport stdio -- python server.pyTipp: Wenn Claude Code nicht aus dem Projektverzeichnis gestartet wird, verwenden Sie den vollständigen Pfad:
claude mcp add fitness-tracker --transport stdio -- python "C:\Users\Mayan\OneDrive\Documents\MCP_Project\server.py"
Claude Desktop
Fügen Sie Folgendes zu Ihrer claude_desktop_config.json hinzu:
{
"mcpServers": {
"fitness-tracker": {
"command": "python",
"args": ["C:\\Users\\Mayan\\OneDrive\\Documents\\MCP_Project\\server.py"],
"transport": "stdio"
}
}
}Andere MCP-Clients
Jeder MCP-kompatible Client kann sich mit Folgendem verbinden:
Transport:
stdioBefehl:
python server.py(oder vollständiger Pfad zuserver.py)
🛠️ Tool-Referenz (API)
Der Server stellt 3 MCP-Tools bereit:
1. log_workout
Protokolliert eine einzelne Trainingseinheit.
Parameter | Typ | Einschränkungen | Beispiel |
|
| ISO 8601 ( |
|
|
| 1–100 Zeichen |
|
|
| > 0 (Minuten) |
|
|
| ≥ 0 (kcal) |
|
Rückgabe:
{
"status": "success",
"workout": {
"id": 1,
"date": "2026-08-04",
"type": "running",
"duration": 30.0,
"calories": 300.0
}
}2. log_macros
Protokolliert Nahrungs-Makronährstoffe für eine Mahlzeit oder einen ganzen Tag.
Parameter | Typ | Einschränkungen | Beispiel |
|
| ISO 8601 ( |
|
|
| ≥ 0 (Gramm) |
|
|
| ≥ 0 (Gramm) |
|
|
| ≥ 0 (Gramm) |
|
Rückgabe:
{
"status": "success",
"macros": {
"id": 1,
"date": "2026-08-04",
"protein": 150.0,
"carbs": 200.0,
"fat": 60.0
}
}3. get_daily_summary
Ruft eine kombinierte Zusammenfassung von Training und Ernährung für ein bestimmtes Datum ab.
Parameter | Typ | Einschränkungen | Beispiel |
|
| ISO 8601 ( |
|
Rückgabe:
{
"date": "2026-08-04",
"workouts": {
"count": 2,
"entries": [
{"id": 1, "date": "2026-08-04", "type": "running", "duration": 30.0, "calories": 300.0},
{"id": 2, "date": "2026-08-04", "type": "weights", "duration": 45.0, "calories": 250.0}
],
"total_duration_min": 75.0,
"total_calories_burned": 550.0
},
"macros": {
"count": 1,
"entries": [
{"id": 1, "date": "2026-08-04", "protein": 150.0, "carbs": 200.0, "fat": 60.0}
],
"total_protein_g": 150.0,
"total_carbs_g": 200.0,
"total_fat_g": 60.0,
"total_calories_consumed": 1940.0
}
}💬 Beispielverwendung
Nach der Verbindung können Sie einfach auf natürliche Weise mit Ihrem KI-Assistenten chatten:
Sie sagen | Aufgerufenes Tool | Was passiert |
„Ich bin 30 Minuten gelaufen und habe 300 Kalorien verbrannt" |
| Speichert das Training für das heutige Datum |
„Protokolliere mein Mittagessen: 40g Protein, 60g Kohlenhydrate, 15g Fett" |
| Erfasst einen Makro-Eintrag |
„Wie war mein Tag heute?" |
| Gibt aggregierte Summen für das aktuelle Datum zurück |
„Was war mein Training am 4. August?" |
| Ruft Daten für |
🧪 Tests
Die Testsuite (test_server.py) enthält 22 Tests in 6 Testklassen und verwendet für jeden Test isolierte temporäre SQLite-Datenbanken:
Testklasse | Tests | Abgedeckte Bereiche |
| 10 | Gültiges Training, ungültige Daten, negative/null Dauer, negative Kalorien, leerer/zu langer Typ, fehlende Felder, falsche Typen |
| 6 | Gültige Makros, ungültiges Datum, negative Protein/Kohlenhydrate/Fett, fehlende Felder |
| 2 | Gültige Anfrage, ungültiges Datum |
| 3 | Einfügen & Abrufen, mehrere Einfügungen, SQL-Injection-Sicherheit |
| 2 | Einfügen & Abrufen, SQL-Injection über das Datumsfeld |
| 3 | Leerer Tag, gefüllter Tag mit Aggregation, datumsübergreifende Isolierung |
Tests ausführen
# Run all tests with verbose output
pytest test_server.py -v
# Run a specific test class
pytest test_server.py::TestWorkoutSchema -v
# Run with coverage (requires pytest-cov)
pip install pytest-cov
pytest test_server.py --cov=server --cov-report=term-missing🔒 Sicherheit & Schutz
Bedenken | Gegenmaßnahme |
SQL-Injection | Alle Datenbankabfragen verwenden parametrisierte |
Fehlerhafte LLM-Ausgabe | Jede Tool-Eingabe durchläuft ein Pydantic-v2-Schema mit strengen Feldvalidatoren, bevor sie die Datenbank erreicht |
Datumsvalidierung | Ein benutzerdefinierter |
Typumwandlung | Der strikte Modus von Pydantic fängt wirklich inkompatible Typen ab (z. B. |
Netzwerkexposition | stdio-Transport – kein Netzwerkverkehr, keine offenen Ports, keine API-Schlüssel erforderlich |
Datenschutz | Alle Daten verbleiben in einer lokalen |
📝 Lizenz
MIT – frei verwendbar.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- FlicenseBqualityDmaintenanceA personal fitness tracking server that enables logging and querying workouts, nutrition, and body metrics through a local SQLite database. Integrates with OpenNutrition MCP for food logging and supports exercise history tracking for workout progression.17
- AlicenseNot gradedqualityBmaintenanceA filesystem-based MCP server that turns any MCP-capable AI agent into a conversational calorie and protein tracker with natural-language estimates, confidence-aware logging, daily/weekly progress, food-history search, and export, working offline with local fallback data.20MIT
- FlicenseNot gradedqualityBmaintenanceLocal-first nutrition tracker MCP server for Hermes, enabling food, alias, recipe, and meal log management with SQLite persistence.
- FlicenseAqualityBmaintenancePersonal workout coach MCP server that logs exercises in natural language, tracks progress with SQLite, and provides coaching signals like estimated 1RM and volume trends.6
Related MCP Connectors
MCP server for Withings health data — sleep, activity, heart, and body metrics.
GibsonAI MCP server: manage your databases with natural language
MCP server for Argo RPG Platform — connects AI assistants to campaign data via OAuth2
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/MayankKapgate/fitness-tracker-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server