Chakudya MCP Server
Chakudya MCP Server
Un servidor MCP (Model Context Protocol) que expone la API de Chakudya Nutrition Registry (CNR) como un conjunto de herramientas MCP, de modo que cualquier cliente compatible con MCP (Claude, Claude Code, otros agentes LLM) pueda buscar datos de alimentos de Malaui, realizar consultas de nutrición clínica y consultar la base de conocimiento RAG directamente.
Esta es una capa nueva y separada. No reemplaza ni modifica el Chakudya Worker. Es un pequeño servicio HTTP de Node/TypeScript que se sitúa delante de tu API existente y traduce las llamadas a herramientas MCP en solicitudes HTTP simples contra las rutas que tu Worker ya sirve.
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 / FatSecretPor qué un servidor separado, no un Worker
El StreamableHTTPServerTransport del SDK oficial de MCP TypeScript está construido para http.IncomingMessage/ServerResponse de Node. Cloudflare Workers usa la Fetch API en su lugar, y la variante estándar web del SDK (WebStandardStreamableHTTPServerTransport) es más nueva y menos probada en batalla para la gestión de sesiones en producción. Ejecutar esto como un servicio Node simple (Docker, Render, Fly.io, un VPS, etc.) es la ruta más estándar y mejor documentada hoy en día, y mantiene esta preocupación completamente desacoplada del ciclo de despliegue de tu Worker. Nada te impide portarlo al transporte estándar web en Workers más adelante si quieres un despliegue de plataforma única: la lógica de herramientas en src/tools/* no le importa qué transporte lo envuelve.
Related MCP server: mealie-mcp
Herramientas
Las 31 herramientas o bien llaman a tu Chakudya Worker existente a través de HTTPS, o son cálculos puros en proceso / búsquedas en tablas: ninguna de ellas toca Supabase, Cohere o Groq directamente, y ninguna necesita ADMIN_API_KEY (todas las rutas que usan son públicas).
Tool | Chakudya route(s) used |
|
|
|
|
|
|
| igual que arriba, en bucle y sumado entre varios elementos |
|
|
|
|
|
|
|
|
|
|
| ninguno — cálculo puro de IMC/TMB (Mifflin-St Jeor)/TDEE |
|
|
|
|
|
|
|
|
|
|
| ninguno — cálculo puro de Holliday-Segar |
| ninguno — cálculo puro de Schofield/OMS TMB + DRI/FAO 2004 + DRI/IOM 2006 |
| ninguno — búsqueda pura en tablas de IOM 2005 / ASPEN niño enfermo / pretérmino |
| ninguno — búsqueda pura en tabla de velocidad de crecimiento del manual ASPEN |
| ninguno — búsqueda pura en tabla de protocolo de alimentación enteral |
| ninguno — cálculo puro de ecuaciones de predicción de EER de IOM/DRI (2002/2005), todas las etapas de la vida |
| ninguno — cálculo puro de MET x peso x duración |
| ninguno — cálculo puro de volumen x graduación |
| ninguno — interpretación pura de valores de referencia de RQ |
| ninguno — búsqueda pura en tabla de líquidos/energía para pretérmino |
| ninguno — búsqueda pura en tabla de rangos de % de macronutrientes DRI |
| ninguno — cálculo puro de REE x multiplicador de banda de actividad |
| ninguno — cálculo puro de ajuste de REE por fiebre |
| ninguno — cálculo puro de factor de Atwater (4/9/4/7) |
| ninguno — búsqueda pura en tabla de referencia DRI Tabla 2.2 |
| ninguno — cálculo puro de puntuación z/percentil LMS de referencia de crecimiento de la OMS (peso para la edad, talla para la edad, IMC para la edad 0-5 años, IMC para la edad 5-19 años, perímetro cefálico para la edad, peso para la longitud, peso para la talla) |
disease_information y medicine_information siempre devuelven un descargo de responsabilidad educativo junto con la respuesta y están programadas para evitar lenguaje de diagnóstico/prescripción, pero siguen siendo texto generado por LLM basado en lo que haya en tu base de conocimiento RAG, no una referencia médica verificada. Trátalas como un punto de partida para un aprendiz, igual que el resto de las herramientas respaldadas por RAG.
Las herramientas pediatric_* (fuente: BND 415 Clinical Nutrition — Paediatric Medicine Resources) y iom_dri_eer_calculator/met_activity_energy_calculator/alcohol_kcal_calculator/respiratory_quotient_interpreter (fuente: Nelms/Ireton-Jones, Nutrition Therapy and Pathophysiology, cap. 2) son herramientas puras de cálculo/consulta: sin llamada de red, sin dependencia de datos CNR. Se aplica la misma advertencia de solo estimación: no sustituyen una evaluación clínica individualizada ni una calorimetría indirecta medida.
Estructura del proyecto
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 handlerVariables de entorno
Copia .env.example a .env y complétalo:
Variable | Required | Notes |
| no (por defecto usa el Worker del mantenedor) | Si vas a hacer un fork de este repositorio para servir tu propia instancia de CNR, define aquí la URL de tu propio Worker en lugar de depender de la predeterminada |
| no | No la usa ninguna herramienta actual; solo es necesaria si añades más adelante una herramienta con acceso restringido a administradores |
| no (por defecto | |
| sí en producción | Bearer token que los clientes MCP deben enviar. El servidor se niega a arrancar en producción sin él |
| no | Orígenes CORS separados por comas; déjalo vacío para desactivar el acceso desde el navegador |
| no (por defecto | Límite por IP en el endpoint |
| no (por defecto | Establécelo en |
Consideraciones de seguridad
La autenticación es obligatoria en producción.
env.tstermina el proceso al arrancar siNODE_ENV=productionyMCP_AUTH_TOKENno está definida; esto es una comprobación deliberada de fallo cerrado, no solo una advertencia.Este servidor se sitúa delante de tus rutas RAG con límite de velocidad.
/rag/asken tu Worker tiene un tope de 15 req/min por IP, pero eso es por IP de cliente tal como la ve el Worker, que una vez desplegado sería la IP de este servidor, compartida por todos los que lo usen. El limitador de velocidad a nivel de MCP (MCP_RATE_LIMIT_PER_MIN) existe para que un cliente MCP con mal comportamiento no pueda agotar silenciosamente ese presupuesto para los demás. Redúcelo si esperas varios clientes MCP concurrentes.No se incrusta ni se requiere ninguna clave de administrador. Cada herramienta llama a una ruta CNR pública. Si más adelante añades una herramienta con acceso restringido a administradores, mantén
CHAKUDYA_ADMIN_API_KEYsolo en el lado del servidor; nunca la expongas al cliente MCP.El estado de sesión está en memoria, por proceso. Perfecto para una instancia única. Si alguna vez escalas a varias instancias detrás de un balanceador de carga, habilita sesiones persistentes (enrutando por
Mcp-Session-Id) o cambia el mapatransportsensrc/index.tspor un almacén compartido.CORS está desactivado por defecto. Activa
MCP_ALLOWED_ORIGINSsolo si tienes un cliente MCP específico basado en navegador; los clientes MCP de servidor a servidor (Claude Desktop, Claude Code, etc.) no lo necesitan.
Ejecutar localmente
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 startO para desarrollo iterativo con recarga automática:
npm run devComprobación de estado: curl http://localhost:8787/health
Conexión de un cliente MCP
Apunta cualquier cliente MCP compatible con Streamable-HTTP a:
POST/GET/DELETE https://<your-deployed-host>/mcp
Header: Authorization: Bearer <MCP_AUTH_TOKEN>Para Claude Desktop / Claude Code, añádelo como un servidor MCP remoto que apunte a esa URL con el mismo bearer token. Consulta la documentación actual de Anthropic para conocer la sintaxis exacta del archivo de configuración, ya que ha cambiado con el tiempo; comprueba https://docs.claude.com para ver el formato más reciente de servidor remoto mcpServers.
Despliegue: Render (recomendado — gratis, sin tarjeta de crédito)
Este repositorio incluye render.yaml, por lo que la función Blueprint de Render lo despliega sin necesidad de configuración manual en el panel.
Sube este repositorio a GitHub (comandos más abajo).
En el panel de Render: Nuevo → Blueprint, conecta tu cuenta de GitHub y elige el repositorio
chakudya-mcp-server. Render leerender.yamlautomáticamente.Render aprovisiona el servicio en el plan Free y genera automáticamente un
MCP_AUTH_TOKENaleatorio (mediantegenerateValue: true). Tras el primer despliegue, ve a la pestaña Environment del servicio para copiar ese token generado; lo necesitarás en la configuración de tu cliente MCP.Despliega. Tu endpoint MCP será
https://<your-service-name>.onrender.com/mcp(consulta el panel de Render para ver tu URL generada real; puede incluir un sufijo aleatorio si el nombre que hayas elegido ya está ocupado).
El problema de la suspensión del plan gratuito y su solución
Los servicios web gratuitos de Render se suspenden tras 15 minutos sin tráfico y luego tardan entre 30 y 60 segundos en reactivarse con la siguiente solicitud. Eso está bien para una comprobación de estado, pero puede interrumpir una sesión MCP en curso (el estado de sesión vive en memoria; ver src/index.ts) si el cliente permanece en silencio a mitad de una conversación durante demasiado tiempo.
Solución: mantenlo activo con un monitor de disponibilidad gratuito que haga ping a /health cada 5-10 minutos.
Regístrate en uptimerobot.com (plan gratuito, sin tarjeta).
Añade un nuevo monitor HTTP(s):
URL:
https://<your-service>.onrender.com/healthIntervalo: 5 minutos
Guarda.
/healthno requiere autenticación por diseño, precisamente para que este monitor no necesite tuMCP_AUTH_TOKEN.
Esto mantiene el servicio activo 24/7 dentro de las 750 h/mes del plan gratuito (muy por debajo del límite para un servicio al que se le hace ping de esta manera).
Actualización tras un cambio de código
Render vuelve a desplegar automáticamente en cada push a tu rama conectada; no se necesita ningún paso adicional:
git add .
git commit -m "Update MCP server"
git pushObserva el despliegue en la pestaña Events del panel de Render; normalmente tarda entre 1 y 2 minutos en un proyecto de este tamaño.
Otras opciones de despliegue
Docker en cualquier lugar
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-serverVPS básico con un gestor de procesos
npm install --omit=dev
npm run build
npx pm2 start dist/index.js --name chakudya-mcpPonlo detrás de Nginx/Caddy para la terminación TLS si no tienes ya algo delante que gestione HTTPS.
Actualización mediante la línea de comandos
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 pushDespués, vuelve a desplegarlo en la plataforma que hayas elegido (Render/Railway/Fly se redespliegan automáticamente al hacer push si has conectado el repositorio de GitHub; si no, activa un redespliegue manual o vuelve a ejecutar los comandos de Docker/pm2 anteriores en tu host).
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