Chakudya MCP Server
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 / FatSecretWarum 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) |
|
|
|
|
|
|
| wie oben, über mehrere Einträge iteriert und summiert |
|
|
|
|
|
|
|
|
|
|
| keine — reine BMI/BMR (Mifflin-St Jeor)/TDEE-Berechnung |
|
|
|
|
|
|
|
|
|
|
| keine — reine Holliday-Segar-Berechnung |
| keine — reine Berechnung nach Schofield/WHO-BMR, DRI/FAO 2004 und DRI/IOM 2006 |
| keine — reiner Tabellen-Lookup für IOM 2005 / ASPEN krankes Kind / Frühgeborene |
| keine — reiner Tabellen-Lookup der Wachstumsgeschwindigkeit aus dem ASPEN-Handbuch |
| keine — reiner Tabellen-Lookup des enteralen Ernährungsprotokolls |
| keine — reine Berechnung mit den IOM/DRI (2002/2005) EER-Vorhersagegleichungen, alle Lebensphasen |
| keine — reine MET x Gewicht x Dauer-Berechnung |
| keine — reine Volumen x Proof-Berechnung |
| keine — reine Interpretation der RQ-Referenzwerte |
| keine — reiner Tabellen-Lookup für Flüssigkeit/Energie bei Frühgeborenen |
| keine — reiner Tabellen-Lookup der DRI-Makronährstoff-Prozentbereiche |
| keine — reine REE x Aktivitätsband-Multiplikator-Berechnung |
| keine — reine Fieber-REE-Anpassungsberechnung |
| keine — reine Berechnung mit dem Atwater-Faktor (4/9/4/7) |
| keine — reiner Lookup der DRI-Referenztabelle 2.2 |
| 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 handlerUmgebungsvariablen
Kopiere .env.example zu .env und fülle die Datei aus:
Variable | Erforderlich | Hinweise |
| 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 |
| nein | Wird von keinem aktuellen Tool verwendet; nur erforderlich, wenn du später ein Tool hinzufügst, das nur für Administratoren freigegeben ist |
| nein (Standard: | |
| ja in Produktion | Bearer-Token, das MCP-Clients senden müssen. Ohne dieses Token verweigert der Server in Produktion den Start |
| nein | Kommagetrennte CORS-Origins; leer lassen, um den Browserzugriff zu deaktivieren |
| nein (Standard: | Pro-IP-Grenze für den eigenen |
| nein (Standard: | Für Deployments auf |
Sicherheitsaspekte
Authentifizierung ist in Produktion Pflicht.
env.tsbeendet den Prozess beim Start, wennNODE_ENV=productiongesetzt ist undMCP_AUTH_TOKENfehlt – eine bewusste Fail-Closed-Prüfung, keine bloße Warnung.Dieser Server ist deinen rate-limitierten RAG-Routen vorgeschaltet.
/rag/askauf 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_KEYausschließ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 dietransports-Map insrc/index.tsgegen einen gemeinsamen Store aus.CORS ist standardmäßig deaktiviert. Aktiviere
MCP_ALLOWED_ORIGINSnur, 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 startOder für iterative Entwicklung mit automatischem Neuladen:
npm run devHealth-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.
Pushe dieses Repo auf GitHub (Befehle unten).
Verbinde im Render-Dashboard unter New → Blueprint dein GitHub-Konto und wähle das Repo
chakudya-mcp-serveraus. Render liestrender.yamlautomatisch.Render stellt den Dienst im Free-Tarif bereit und generiert automatisch ein zufälliges
MCP_AUTH_TOKEN(übergenerateValue: 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.Führe das Deployment aus. Dein MCP-Endpunkt wird
https://<your-service-name>.onrender.com/mcpsein (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.
Melde dich bei uptimerobot.com an (kostenloser Tarif, keine Kreditkarte).
Füge einen neuen HTTP(s)-Monitor hinzu:
URL:
https://<your-service>.onrender.com/healthIntervall: 5 Minuten
Speichern.
/healthist bewusst ohne Authentifizierung erreichbar, genau damit dieser Monitor deinMCP_AUTH_TOKENnicht 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 pushBeobachte 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-serverEinfacher VPS mit Prozessmanager
npm install --omit=dev
npm run build
npx pm2 start dist/index.js --name chakudya-mcpPlatziere 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 pushDeploye 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.
This server cannot be installed
Maintenance
Related MCP Connectors
Read-only MCP tools for AI agent discovery, structured resources, and NIULAI information.
A registry of AI agent tools — MCP servers, APIs, CLIs, SDKs — kept current by automated ingestion.
Hosted MCP endpoint with realistic fake data for prototyping agents. 12 tools, no setup.
Unlock the power of food transparency with our Open Food Facts MCP server. Easily look up any food
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceExposes 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.-
- AlicenseDqualityAmaintenanceExposes every endpoint of the Mealie REST API as MCP tools, enabling LLMs to manage recipes, meal plans, shopping lists, and more.2111,1312MIT
- FlicenseNot gradedqualityCmaintenanceExposes 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-
- FlicenseNot gradedqualityCmaintenanceExposes task management (add, list, complete tasks) and document search (RAG) as MCP tools for AI agents.-
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/edisontaimu9-ui/chakudya-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server