Skip to main content
Glama

Chakudya MCP Server

Ein MCP (Model Context Protocol) Server, der die API der Chakudya Nutrition Registry (CNR) als eine Reihe von MCP-Tools bereitstellt, sodass jeder MCP-kompatible Client (Claude, Claude Code, andere LLM-Agenten) direkt malawische Lebensmitteldaten durchsuchen, klinische Ernährungs-Lookups ausführen und die RAG-Wissensdatenbank abfragen kann.

Dies ist eine neue, separate Schicht. Sie ersetzt oder modifiziert den Chakudya Worker nicht. Es ist ein kleiner Node/TypeScript-HTTP-Dienst, der vor deiner bestehenden API sitzt und MCP-Tool-Aufrufe in einfache HTTP-Anfragen an die Routen übersetzt, die dein Worker bereits bedient.

MCP Client (Claude, etc.)
        │  Streamable HTTP (JSON-RPC over HTTP + SSE)
        ▼
Chakudya MCP Server  (this project)
        │  plain HTTPS fetch()
        ▼
Chakudya Worker API  (unchanged) → Supabase / Cohere / Groq / USDA / OFF / FatSecret

Warum ein separater Server und kein Worker

Der offizielle StreamableHTTPServerTransport des MCP TypeScript SDK ist für die http.IncomingMessage/ServerResponse von Node gebaut. Cloudflare Workers nutzen stattdessen die Fetch API, und die Web-Standard-Variante des SDK (WebStandardStreamableHTTPServerTransport) ist neuer und für das Sitzungsmanagement in der Produktion weniger ausgereift. Dies als einfachen Node-Dienst zu betreiben (Docker, Render, Fly.io, eine VPS usw.) ist heute der üblichere, besser dokumentierte Weg, und es hält dieses Anliegen vollständig vom Deploy-Zyklus deines Workers entkoppelt. Nichts hindert dich daran, es später auf den Web-Standard-Transport auf Workers zu portieren, wenn du ein Deployment auf einer einzigen Plattform möchtest — die Tool-Logik in src/tools/* kümmert sich nicht darum, welcher Transport sie umhüllt.

Related MCP server: mealie-mcp

Tools

Alle 31 Tools rufen entweder deinen bestehenden Chakudya Worker per HTTPS auf oder sind reine In-Process-Berechnungs-/Tabellen-Lookups — keines davon greift direkt auf Supabase, Cohere oder Groq zu, und keines benötigt ADMIN_API_KEY (jede verwendete Route ist öffentlich).

Tool

Verwendete Chakudya-Route(n)

search_food

GET /foods → fällt zurück auf GET /foods/lookup

get_food_details

GET /foods/:id

calculate_nutrients

GET /foods oder /foods/:id, skaliert dann die Pro-100-g-Werte in-process

analyze_meal

wie oben, über mehrere Einträge iteriert und summiert

barcode_lookup

GET /packaged?barcode= → fällt zurück auf GET /foods/lookup?barcode=

packaged_food_search

GET /packaged und/oder GET /products

diabetes_exchange_lookup

GET /exchange

renal_exchange_lookup

GET /renal

enteral_formula_lookup

GET /formulas

nutrition_calculator

keine — reine BMI/BMR (Mifflin-St Jeor)/TDEE-Berechnung

rag_retrieve

POST /rag/retrieve

search_guidelines

POST /rag/ask (context: "clinical")

retrieve_evidence

POST /rag/ask (context: "both", höheres top_k)

disease_information

POST /rag/ask, Abfrage für eine edukative Krankheitsübersicht formuliert

medicine_information

POST /rag/ask, Abfrage mit ausdrücklicher Anweisung, Dosierung/Verschreibungen auszuschließen

pediatric_fluid_requirements

keine — reine Holliday-Segar-Berechnung

pediatric_energy_requirements

keine — reine Berechnung nach Schofield/WHO-BMR, DRI/FAO 2004 und DRI/IOM 2006

pediatric_protein_requirements

keine — reiner Tabellen-Lookup für IOM 2005 / ASPEN krankes Kind / Frühgeborene

pediatric_growth_velocity

keine — reiner Tabellen-Lookup der Wachstumsgeschwindigkeit aus dem ASPEN-Handbuch

pediatric_enteral_feed_advancement

keine — reiner Tabellen-Lookup des enteralen Ernährungsprotokolls

iom_dri_eer_calculator

keine — reine Berechnung mit den IOM/DRI (2002/2005) EER-Vorhersagegleichungen, alle Lebensphasen

met_activity_energy_calculator

keine — reine MET x Gewicht x Dauer-Berechnung

alcohol_kcal_calculator

keine — reine Volumen x Proof-Berechnung

respiratory_quotient_interpreter

keine — reine Interpretation der RQ-Referenzwerte

preterm_fluid_energy_requirements

keine — reiner Tabellen-Lookup für Flüssigkeit/Energie bei Frühgeborenen

macronutrient_distribution_check

keine — reiner Tabellen-Lookup der DRI-Makronährstoff-Prozentbereiche

tee_activity_band_estimator

keine — reine REE x Aktivitätsband-Multiplikator-Berechnung

fever_stress_ree_adjustment

keine — reine Fieber-REE-Anpassungsberechnung

atwater_food_energy_calculator

keine — reine Berechnung mit dem Atwater-Faktor (4/9/4/7)

dri_eer_reference_lookup

keine — reiner Lookup der DRI-Referenztabelle 2.2

who_growth_zscore

keine — reine LMS-Z-Score/Perzentil-Berechnung anhand der WHO-Wachstumsreferenz (Gewicht-für-Alter, Größe-für-Alter, BMI-für-Alter 0-5 Jahre, BMI-für-Alter 5-19 Jahre, Kopfumfang-für-Alter, Gewicht-für-Länge, Gewicht-für-Größe)

disease_information und medicine_information geben neben der Antwort immer einen edukativen Haftungsausschluss zurück und sind per Prompt angewiesen, Diagnose-/Verschreibungssprache zu vermeiden — aber es handelt sich weiterhin um LLM-generierten Text, der auf dem basiert, was in deiner RAG-Wissensdatenbank steht, nicht um eine verifizierte medizinische Referenz. Behandle sie als Ausgangspunkt für Lernende, genau wie die übrigen RAG-gestützten Tools.

Die pediatric_*-Tools (Quelle: BND 415 Clinical Nutrition — Paediatric Medicine Resources) und iom_dri_eer_calculator/met_activity_energy_calculator/alcohol_kcal_calculator/respiratory_quotient_interpreter (Quelle: Nelms/Ireton-Jones, Nutrition Therapy and Pathophysiology, Kap. 2) sind reine Berechnungs-/Lookup-Tools — kein Netzwerkaufruf, keine CNR-Datenabhängigkeit. Es gilt weiterhin der Vorbehalt, dass es sich nur um Schätzungen handelt: kein Ersatz für eine individuelle klinische Beurteilung oder gemessene indirekte Kalorimetrie.

Projektstruktur

src/
├── index.ts                 Express app, Streamable HTTP session wiring, graceful shutdown
├── config/env.ts            Zod-validated environment config, loaded once at startup
├── clients/chakudyaClient.ts  Fetch wrapper for the Chakudya Worker (GET/POST, error normalization)
├── server/
│   ├── createServer.ts      Builds one McpServer instance and registers all tool modules
│   └── security.ts          Bearer auth + per-IP rate limiting for this server's /mcp endpoint
├── tools/
│   ├── foodTools.ts
│   ├── clinicalTools.ts
│   ├── ragTools.ts
│   ├── educationTools.ts
│   ├── pediatricTools.ts        Pediatric fluid/energy/protein/growth/enteral-feed calculators
│   └── energyExpenditureTools.ts  IOM/DRI EER, MET activity, alcohol kcal, RQ interpreter
│   └── whoGrowthTools.ts        WHO Child Growth Standards z-score/percentile calculator (LMS)
├── data/
│   └── who/                     WHO Child Growth Standards LMS tables (JSON, per standard+sex)
└── utils/
    ├── logger.ts             Structured JSON logging
    └── toolResult.ts         Consistent success/error shaping for every tool handler

Umgebungsvariablen

Kopiere .env.example zu .env und fülle die Datei aus:

Variable

Erforderlich

Hinweise

CHAKUDYA_API_BASE_URL

nein (Standard: der eigene Worker des Maintainers)

Wenn du dieses Repo forkst, um es deiner eigenen CNR-Instanz vorzuschalten, setze dies auf die URL deines eigenen Workers, statt dich auf den Standard zu verlassen

CHAKUDYA_ADMIN_API_KEY

nein

Wird von keinem aktuellen Tool verwendet; nur erforderlich, wenn du später ein Tool hinzufügst, das nur für Administratoren freigegeben ist

PORT

nein (Standard: 8787)

MCP_AUTH_TOKEN

ja in Produktion

Bearer-Token, das MCP-Clients senden müssen. Ohne dieses Token verweigert der Server in Produktion den Start

MCP_ALLOWED_ORIGINS

nein

Kommagetrennte CORS-Origins; leer lassen, um den Browserzugriff zu deaktivieren

MCP_RATE_LIMIT_PER_MIN

nein (Standard: 60)

Pro-IP-Grenze für den eigenen /mcp-Endpunkt des Servers

NODE_ENV

nein (Standard: development)

Für Deployments auf production setzen

Sicherheitsaspekte

  • Authentifizierung ist in Produktion Pflicht. env.ts beendet den Prozess beim Start, wenn NODE_ENV=production gesetzt ist und MCP_AUTH_TOKEN fehlt – eine bewusste Fail-Closed-Prüfung, keine bloße Warnung.

  • Dieser Server ist deinen rate-limitierten RAG-Routen vorgeschaltet. /rag/ask auf deinem Worker ist auf 15 req/min pro IP begrenzt – aber diese Begrenzung gilt pro Client-IP, wie sie der Worker sieht, und das wäre nach dem Deployment die IP dieses Servers, die sich alle Nutzer teilen. Der Rate-Limiter auf MCP-Ebene (MCP_RATE_LIMIT_PER_MIN) existiert, damit ein einzelner MCP-Client mit Fehlverhalten dieses Budget nicht lautlos für alle anderen aufbrauchen kann. Setze ihn niedriger an, wenn du mit mehreren gleichzeitigen MCP-Clients rechnest.

  • Es ist kein Admin-Schlüssel eingebettet und keiner erforderlich. Jedes Tool ruft eine öffentliche CNR-Route auf. Wenn du später ein Tool hinzufügst, das nur Administratoren verwenden dürfen, behalte CHAKUDYA_ADMIN_API_KEY ausschließlich serverseitig – gib ihn niemals an den MCP-Client weiter.

  • Der Sitzungszustand liegt im Speicher, pro Prozess. Das ist für eine einzelne Instanz in Ordnung. Wenn du jemals hinter einem Load-Balancer auf mehrere Instanzen skalierst, aktiviere entweder Sticky Sessions (Routing über Mcp-Session-Id) oder tausche die transports-Map in src/index.ts gegen einen gemeinsamen Store aus.

  • CORS ist standardmäßig deaktiviert. Aktiviere MCP_ALLOWED_ORIGINS nur, wenn du einen konkreten browserbasierten MCP-Client hast; Server-zu-Server-MCP-Clients (Claude Desktop, Claude Code usw.) benötigen es nicht.

Lokal ausführen

cd ~
git clone https://github.com/edisontaimu9-ui/chakudya-mcp-server.git
cd chakudya-mcp-server
cp .env.example .env
# edit .env: set MCP_AUTH_TOKEN to a long random string
npm install
npm run build
npm start

Oder für iterative Entwicklung mit automatischem Neuladen:

npm run dev

Health-Check: curl http://localhost:8787/health

Verbinden eines MCP-Clients

Richte einen beliebigen Streamable-HTTP-fähigen MCP-Client auf Folgendes aus:

POST/GET/DELETE  https://<your-deployed-host>/mcp
Header: Authorization: Bearer <MCP_AUTH_TOKEN>

Für Claude Desktop / Claude Code fügst du ihn als Remote-MCP-Server hinzu, der auf diese URL mit demselben Bearer-Token zeigt. Die genaue Syntax der Konfigurationsdatei findest du in der aktuellen Dokumentation von Anthropic, da sich diese im Laufe der Zeit geändert hat – prüfe unter https://docs.claude.com das aktuelle mcpServers-Format für Remote-Server.

Deployment: Render (empfohlen – kostenlos, keine Kreditkarte)

Dieses Repo enthält render.yaml, sodass die Blueprint-Funktion von Render das Deployment ohne manuelle Dashboard-Konfiguration übernimmt.

  1. Pushe dieses Repo auf GitHub (Befehle unten).

  2. Verbinde im Render-Dashboard unter New → Blueprint dein GitHub-Konto und wähle das Repo chakudya-mcp-server aus. Render liest render.yaml automatisch.

  3. Render stellt den Dienst im Free-Tarif bereit und generiert automatisch ein zufälliges MCP_AUTH_TOKEN (über generateValue: true). Gehe nach dem ersten Deployment zum Tab Environment des Dienstes, um das generierte Token zu kopieren – du brauchst es in deiner MCP-Client-Konfiguration.

  4. Führe das Deployment aus. Dein MCP-Endpunkt wird https://<your-service-name>.onrender.com/mcp sein (prüfe im Render-Dashboard die tatsächlich generierte URL – sie kann ein zufälliges Suffix enthalten, wenn dein gewählter Name bereits vergeben ist).

Das Sleep-Problem im Free-Tarif und die Lösung

Die kostenlosen Webdienste von Render werden nach 15 Minuten ohne Datenverkehr heruntergefahren und benötigen dann 30–60 Sekunden, um beim nächsten Request wieder aufzuwachen. Das ist für einen Health-Check in Ordnung, kann aber eine laufende MCP-Sitzung beenden (der Sitzungszustand liegt im Speicher – siehe src/index.ts), wenn der Client mitten in einer Unterhaltung zu lange schweigt.

Lösung: Halte den Dienst mit einem kostenlosen Uptime-Monitor warm, der /health alle 5–10 Minuten anpingt.

  1. Melde dich bei uptimerobot.com an (kostenloser Tarif, keine Kreditkarte).

  2. Füge einen neuen HTTP(s)-Monitor hinzu:

    • URL: https://<your-service>.onrender.com/health

    • Intervall: 5 Minuten

  3. Speichern. /health ist bewusst ohne Authentifizierung erreichbar, genau damit dieser Monitor dein MCP_AUTH_TOKEN nicht benötigt.

Dadurch bleibt der Dienst im Rahmen der 750 Stunden/Monat des kostenlosen Tarifs rund um die Uhr warm (deutlich unter dem Limit für einen auf diese Weise angepingten Dienst).

Aktualisieren nach einer Codeänderung

Render deployt bei jedem Push in deinen verbundenen Branch automatisch neu – kein zusätzlicher Schritt nötig:

git add .
git commit -m "Update MCP server"
git push

Beobachte das Deployment im Tab Events des Render-Dashboards; bei einem Projekt dieser Größe ist es in der Regel nach 1–2 Minuten abgeschlossen.

Weitere Deployment-Optionen

Docker überall

docker build -t chakudya-mcp-server .
docker run -d -p 8787:8787 \
  -e NODE_ENV=production \
  -e MCP_AUTH_TOKEN=<long-random-string> \
  -e CHAKUDYA_API_BASE_URL=<your-chakudya-worker-url> \
  --name chakudya-mcp chakudya-mcp-server

Einfacher VPS mit Prozessmanager

npm install --omit=dev
npm run build
npx pm2 start dist/index.js --name chakudya-mcp

Platziere den Dienst hinter Nginx/Caddy für die TLS-Terminierung, falls du nicht bereits etwas vorgeschaltet hast, das HTTPS übernimmt.

Aktualisieren über die Befehlszeile

cd ~
# first time only:
git clone https://github.com/edisontaimu9-ui/chakudya-mcp-server.git
cd chakudya-mcp-server

# after any file update:
cp <path-to-updated-file>.ts src/<path>/<updated-file>.ts
git add .
git commit -m "Update MCP server"
git push

Deploye anschließend auf der Plattform deiner Wahl neu (Render/Railway/Fly deployen bei Push automatisch neu, wenn du das GitHub-Repo verbunden hast; andernfalls stoße ein manuelles Deployment an oder führe die Docker/pm2-Befehle von oben auf deinem Host erneut aus).

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

No tool schema history has been recorded yet.

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    C
    maintenance
    Exposes tools from the Ecuro Light API for managing clinical appointments, patient records, and clinic availability. It enables users to perform healthcare management tasks such as scheduling, patient search, and report generation through MCP-compatible clients.
    -
  • F
    license
    Not graded
    quality
    C
    maintenance
    Exposes retrieval capabilities of two RAG systems as authenticated MCP tools, allowing any MCP client to perform graph-augmented and hybrid retrieval with JWT auth.
    1
    -

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/edisontaimu9-ui/chakudya-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server