Skip to main content
Glama

Chakudya MCP Server

MCP(Model Context Protocol)サーバーで、Chakudya Nutrition Registry (CNR) API を一連の MCP ツールとして公開します。これにより、MCP 互換のクライアント(Claude、Claude Code、 その他の LLM エージェント)は、マラウイの食品データの検索、臨床栄養ルックアップ、RAG ナレッジベースのクエリを直接実行できます。

これは新しい独立したレイヤーです。Chakudya Worker を置き換えたり変更したりするものではありません。 既存の API の前面に配置される小さな Node/TypeScript HTTP サービスであり、MCP ツール呼び出しを Worker がすでに提供しているルートに対する通常の HTTP リクエストに変換します。

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

別サーバーにする理由(Worker ではなく)

公式 MCP TypeScript SDK の StreamableHTTPServerTransport は Node の http.IncomingMessage/ServerResponse 用に構築されています。Cloudflare Workers は代わりに Fetch API を使用し、SDK の Web 標準バリアント(WebStandardStreamableHTTPServerTransport)は新しいため、本番環境のセッション管理においては実績が浅いと言えます。これを通常の Node サービス(Docker、Render、Fly.io、VPS など)として実行する方が、現在ではより標準的でドキュメントも充実した方法であり、この関心事を Worker のデプロイサイクルから完全に分離できます。後で Web 標準トランスポートに移植して Workers 上でシングルプラットフォーム展開をしたい場合は、それを妨げるものは何もありません。src/tools/* のツールロジックは、どのトランスポートがそれをラップするかに依存しないからです。

Related MCP server: mealie-mcp

ツール

31 個すべてのツールは、既存の Chakudya Worker を HTTPS 経由で呼び出すか、プロセス内の純粋な計算・テーブル ルックアップのいずれかです。Supabase、Cohere、Groq に直接アクセスするものはなく、ADMIN_API_KEY も必要ありません(使用するすべてのルートは公開されています)。

ツール

使用する Chakudya ルート

search_food

GET /foods → フォールバック: GET /foods/lookup

get_food_details

GET /foods/:id

calculate_nutrients

GET /foods または /foods/:id、その後プロセス内で 100g あたりの値にスケーリング

analyze_meal

上記と同じ、複数アイテムにわたってループして合算

barcode_lookup

GET /packaged?barcode= → フォールバック: GET /foods/lookup?barcode=

packaged_food_search

GET /packaged および/または GET /products

diabetes_exchange_lookup

GET /exchange

renal_exchange_lookup

GET /renal

enteral_formula_lookup

GET /formulas

nutrition_calculator

なし — 純粋な BMI/BMR(Mifflin-St Jeor)/TDEE 計算

rag_retrieve

POST /rag/retrieve

search_guidelines

POST /rag/askcontext: "clinical"

retrieve_evidence

POST /rag/askcontext: "both"、より高い top_k

disease_information

POST /rag/ask、教育目的の疾患概要用にクエリを構成

medicine_information

POST /rag/ask、投与量・処方情報を除外するよう明示的に指示したクエリ

pediatric_fluid_requirements

なし — 純粋な Holliday-Segar 計算

pediatric_energy_requirements

なし — 純粋な Schofield/WHO BMR + DRI/FAO 2004 + DRI/IOM 2006 計算

pediatric_protein_requirements

なし — 純粋な IOM 2005 / ASPEN 病児 / 早産児テーブルルックアップ

pediatric_growth_velocity

なし — 純粋な ASPEN ハンドブック成長速度テーブルルックアップ

pediatric_enteral_feed_advancement

なし — 純粋な経腸栄養プロトコルテーブルルックアップ

iom_dri_eer_calculator

なし — 純粋な IOM/DRI (2002/2005) EER 予測式計算、全ライフステージ

met_activity_energy_calculator

なし — 純粋な MET × 体重 × 時間の計算

alcohol_kcal_calculator

なし — 純粋な容量 × プルーフの計算

respiratory_quotient_interpreter

なし — 純粋な RQ 基準値の解釈

preterm_fluid_energy_requirements

なし — 純粋な早産児の水分・エネルギー要件テーブルルックアップ

macronutrient_distribution_check

なし — 純粋な DRI マクロ栄養素 % 範囲テーブルルックアップ

tee_activity_band_estimator

なし — 純粋な REE × 活動帯域乗数の計算

fever_stress_ree_adjustment

なし — 純粋な発熱 REE 補正計算

atwater_food_energy_calculator

なし — 純粋な Atwater 係数 (4/9/4/7) 計算

dri_eer_reference_lookup

なし — 純粋な DRI 表 2.2 参照テーブルルックアップ

who_growth_zscore

なし — 純粋な WHO 成長基準 LMS Z スコア/パーセンタイル計算(年齢別体重、年齢別身長、年齢別 BMI 0〜5 歳、年齢別 BMI 5〜19 歳、年齢別頭囲、身長別体重、身長別体重)

disease_informationmedicine_information は、回答とともに常に教育的免責事項を返し、診断・処方の表現を避けるようにプロンプトが設定されています。ただし、これらは依然として RAG ナレッジベースの内容に基づく LLM 生成テキストであり、検証済みの医学的参考文献ではありません。他の RAG ベースのツールと同様に、学習者の出発点として扱ってください。

pediatric_* ツール(出典: BND 415 Clinical Nutrition — Paediatric Medicine Resources)および iom_dri_eer_calculator/met_activity_energy_calculator/alcohol_kcal_calculator/ respiratory_quotient_interpreter(出典: Nelms/Ireton-Jones、Nutrition Therapy and Pathophysiology、 Ch. 2)は純粋な計算・ルックアップツールです。ネットワーク呼び出しも CNR データ依存もありません。推定値のみという同じ注意事項が適用されます。個別化された臨床評価や実測による間接熱量測定の代わりにはなりません。

プロジェクト構成

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

環境変数

.env.example.env にコピーして、以下を入力してください:

変数

必須

備考

CHAKUDYA_API_BASE_URL

いいえ(デフォルトはメンテナ自身のWorker)

このリポジトリをフォークして独自のCNRインスタンスの前面に置く場合は、デフォルトに頼らずにご自身のWorkerのURLを設定してください

CHAKUDYA_ADMIN_API_KEY

いいえ

現在のどのツールでも使用されません。後でadmin限定のツールを追加する場合にのみ必要です

PORT

いいえ(デフォルトは8787

MCP_AUTH_TOKEN

本番環境では必須

MCPクライアントが送信しなければならないBearerトークン。本番環境ではこれがないとサーバーは起動を拒否します

MCP_ALLOWED_ORIGINS

いいえ

カンマ区切りのCORSオリジン。ブラウザからのアクセスを無効にするには空白のままにします

MCP_RATE_LIMIT_PER_MIN

いいえ(デフォルトは60

このサーバー自身の/mcpエンドポイントに対するIPごとの上限

NODE_ENV

いいえ(デフォルトはdevelopment

デプロイ時はproductionに設定します

セキュリティ上の考慮事項

  • 認証は本番環境では必須です。 env.tsは、NODE_ENV=productionかつMCP_AUTH_TOKENが未設定の場合、起動時にプロセスを終了します。これは単なる警告ではなく、意図的なフェイルクローズド(fail-closed)チェックです。

  • このサーバーは、レート制限付きのRAGルートの前面に配置されます。 Workerの/rag/askはIPごとに毎分15リクエストに制限されていますが、これはWorkerから見たクライアントIPごとの制限であり、デプロイ後はこのサーバーのIPがそれに該当し、それを利用する全員で共有されます。MCPレベルのレートリミッター(MCP_RATE_LIMIT_PER_MIN)は、1つの問題のあるMCPクライアントが他の全員の分の予算を静かに使い果たすことを防ぐためにあります。複数の同時MCPクライアントを想定する場合は、この値を引き下げてください。

  • 管理者キーは埋め込まれておらず、必要でもありません。 すべてのツールは公開CNRルートを呼び出します。後でadmin限定のツールを追加する場合は、CHAKUDYA_ADMIN_API_KEYをサーバー側にのみ保持し、MCPクライアントに絶対に公開しないでください。

  • セッション状態はインメモリのプロセス単位です。 単一インスタンスには問題ありません。ロードバランサの背後で複数インスタンスにスケールする場合は、スティッキーセッションを有効にするか(Mcp-Session-Idでルーティング)、src/index.tstransportsマップを共有ストアに置き換えてください。

  • CORSはデフォルトでオフです。 特定のブラウザベースのMCPクライアントがある場合にのみMCP_ALLOWED_ORIGINSを有効にしてください。サーバー間のMCPクライアント(Claude Desktop、Claude Codeなど)には必要ありません。

ローカルでの実行

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

または、自動リロード付きの反復開発を行う場合:

npm run dev

ヘルスチェック: curl http://localhost:8787/health

MCPクライアントの接続

Streamable-HTTP対応のMCPクライアントを次の場所に向けてください:

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

Claude Desktop / Claude Codeの場合は、そのURLを指すリモートMCPサーバーとして、同じBearerトークンを使用して追加してください。正確な設定ファイルの構文は時間とともに変更されているため、Anthropicの現在のドキュメントを参照してください。最新のmcpServersリモートサーバー形式についてはhttps://docs.claude.comを確認してください。

デプロイ: Render(推奨 — 無料、クレジットカード不要)

このリポジトリにはrender.yamlが含まれているため、RenderのBlueprint機能を使えば、ダッシュボードでの手動設定なしでデプロイできます。

  1. このリポジトリをGitHubにプッシュします(コマンドは以下)。

  2. Renderダッシュボードで: New → Blueprintを選択し、GitHubアカウントを接続して、 chakudya-mcp-serverリポジトリを選択します。Renderがrender.yamlを自動的に読み取ります。

  3. RenderはFreeプランでサービスをプロビジョニングし、ランダムなMCP_AUTH_TOKENを自動生成します(generateValue: trueによる)。最初のデプロイ後、サービスのEnvironmentタブに移動して、生成されたトークンをコピーしてください。MCPクライアントの設定で必要になります。

  4. デプロイします。MCPエンドポイントはhttps://<your-service-name>.onrender.com/mcpになります(実際に生成されたURLはRenderダッシュボードで確認してください。選択した名前が既に使用されている場合、ランダムなサフィックスが含まれることがあります)。

無料プランのスリープ問題とその対処法

Renderの無料Webサービスは、トラフィックがない状態が15分続くとスピンダウンし、次のリクエストで復帰するまでに30〜60秒かかります。ヘルスチェックには問題ありませんが、クライアントが会話の途中で長時間静かになると、進行中のMCPセッションが切断される可能性があります(セッション状態はメモリ上に保持されます — src/index.tsを参照)。

対処法: 無料のアップタイムモニターで5〜10分ごとに/healthへpingを送信し、サービスをウォーム状態に保ちます。

  1. uptimerobot.comでサインアップします(無料プラン、カード不要)。

  2. 新しい**HTTP(s)**モニターを追加します:

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

    • 間隔: 5分

  3. 保存します。/healthは設計上認証不要であり、このモニターがMCP_AUTH_TOKENを必要としないようになっています。

これにより、サービスは無料プランの月750時間の範囲内で24時間365日ウォーム状態を維持できます(この方法でpingされる1つのサービスでは、上限を大きく下回ります)。

コード変更後の更新

Renderは、接続されたブランチへのプッシュのたびに自動再デプロイします — 追加の手順は不要です:

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

デプロイの進行状況はRenderダッシュボードのEventsタブで確認できます。この規模のプロジェクトでは通常1〜2分で完了します。

その他のデプロイオプション

どこでもDocker

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

プロセスマネージャーを使用した素のVPS

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

すでにHTTPSを処理する何かで前面を保護していない場合は、TLS終端のためにNginx/Caddyの背後に配置してください。

コマンドラインでの更新

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

その後、選択したプラットフォームで再デプロイします(GitHubリポジトリを接続している場合、Render/Railway/Flyはプッシュ時に自動再デプロイします。それ以外の場合は、手動再デプロイをトリガーするか、上記のDocker/pm2コマンドをホスト上で再実行してください)。

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