Skip to main content
Glama
MayankKapgate

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

FastMCP

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:#000

Verantwortlichkeiten 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 sqlite3

Persistiert Daten in einer einzigen Datei fitness_tracker.db


🔄 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 file

Dateiaufschlüsselung

Datei

Zeilen

Beschreibung

server.py

~322

Vollständiger MCP-Server: DB-Initialisierung, Pydantic-Modelle, CRUD-Operationen, FastMCP-Tooldefinitionen und stdio-Einstiegspunkt

test_server.py

~265

22 Tests in 6 Klassen – Schema-Validierung (gültige + ungültige Eingaben), DB-Einfügungen, tägliche Aggregation, Datumsisolierung und SQL-Injection-Sicherheit

requirements.txt

3

fastmcp, pydantic, pytest


🚀 Erste Schritte

Voraussetzungen

  • Python 3.10+ installiert

  • pip-Paketmanager

1. Repository klonen

git clone https://github.com/MayankKapgate/fitness-tracker-mcp.git
cd MCP_Project

2. Virtuelle Umgebung erstellen & aktivieren (empfohlen)

# Windows
python -m venv myvenv
myvenv\Scripts\activate

# macOS / Linux
python3 -m venv myvenv
source myvenv/bin/activate

3. Abhängigkeiten installieren

pip install -r requirements.txt

4. Tests ausführen

pytest test_server.py -v

Sie sollten 22 bestandene Tests sehen ✅

5. Server starten (eigenständig)

python server.py

Hinweis: Der Server verwendet stdio-Transport – er liest JSON-RPC von stdin und schreibt nach stdout. 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.py

Tipp: 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: stdio

  • Befehl: python server.py (oder vollständiger Pfad zu server.py)


🛠️ Tool-Referenz (API)

Der Server stellt 3 MCP-Tools bereit:

1. log_workout

Protokolliert eine einzelne Trainingseinheit.

Parameter

Typ

Einschränkungen

Beispiel

date

string

ISO 8601 (YYYY-MM-DD)

"2026-08-04"

type

string

1–100 Zeichen

"running"

duration

float

> 0 (Minuten)

30.0

calories

float

≥ 0 (kcal)

300.0

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

date

string

ISO 8601 (YYYY-MM-DD)

"2026-08-04"

protein

float

≥ 0 (Gramm)

150.0

carbs

float

≥ 0 (Gramm)

200.0

fat

float

≥ 0 (Gramm)

60.0

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

date

string

ISO 8601 (YYYY-MM-DD)

"2026-08-04"

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"

log_workout

Speichert das Training für das heutige Datum

„Protokolliere mein Mittagessen: 40g Protein, 60g Kohlenhydrate, 15g Fett"

log_macros

Erfasst einen Makro-Eintrag

„Wie war mein Tag heute?"

get_daily_summary

Gibt aggregierte Summen für das aktuelle Datum zurück

„Was war mein Training am 4. August?"

get_daily_summary

Ruft Daten für 2026-08-04 ab


🧪 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

TestWorkoutSchema

10

Gültiges Training, ungültige Daten, negative/null Dauer, negative Kalorien, leerer/zu langer Typ, fehlende Felder, falsche Typen

TestMacrosSchema

6

Gültige Makros, ungültiges Datum, negative Protein/Kohlenhydrate/Fett, fehlende Felder

TestDailySummarySchema

2

Gültige Anfrage, ungültiges Datum

TestWorkoutDB

3

Einfügen & Abrufen, mehrere Einfügungen, SQL-Injection-Sicherheit

TestMacrosDB

2

Einfügen & Abrufen, SQL-Injection über das Datumsfeld

TestDailySummary

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 ?-Platzhalter – Benutzereingaben werden niemals in SQL-Strings interpoliert

Fehlerhafte LLM-Ausgabe

Jede Tool-Eingabe durchläuft ein Pydantic-v2-Schema mit strengen Feldvalidatoren, bevor sie die Datenbank erreicht

Datumsvalidierung

Ein benutzerdefinierter @field_validator stellt die ISO-8601-Konformität sicher; unsinnige Zeichenketten wie "yesterday" oder "'; DROP TABLE" werden abgelehnt

Typumwandlung

Der strikte Modus von Pydantic fängt wirklich inkompatible Typen ab (z. B. "slow" für ein float-Feld)

Netzwerkexposition

stdio-Transport – kein Netzwerkverkehr, keine offenen Ports, keine API-Schlüssel erforderlich

Datenschutz

Alle Daten verbleiben in einer lokalen fitness_tracker.db-Datei auf Ihrem Rechner – nichts verlässt Ihr System


📝 Lizenz

MIT – frei verwendbar.

F
license - not found
Not graded
quality - not tested
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

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

  • F
    license
    B
    quality
    D
    maintenance
    A 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
  • A
    license
    Not graded
    quality
    B
    maintenance
    A 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.
    20
    MIT
  • F
    license
    Not graded
    quality
    B
    maintenance
    Local-first nutrition tracker MCP server for Hermes, enabling food, alias, recipe, and meal log management with SQLite persistence.
  • F
    license
    A
    quality
    B
    maintenance
    Personal 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

View all related MCP servers

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

View all MCP Connectors

Latest Blog Posts

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