cronometer-api-mcp について
cronometer-api-mcpは、Cronometerの利用者向けに食事日記を読み書きするMCPサーバーです。モバイルアプリのREST APIを使い、断食、目標、身体指標も扱います。
主な機能
- 01日々の食事記録と栄養合計の取得
- 02食品検索と栄養詳細の表示
- 03日記項目とレシピの管理
- 04カスタム食品と目標の管理
- 05断食履歴と統計の確認
- 06期間指定での身体指標の取得
活用シーン
- 01日々のカロリーと栄養摂取量の確認
- 02食事を記録する前の食品検索
- 03日記の複製や一日分の完了処理
- 04断食や身体指標の推移の追跡
MCP 対応
MCPクライアントにCronometerの食品、日記、栄養、断食、目標、身体指標のツールを提供します。stdioトランスポートを使用します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
uvx cronometer-api-mcpCRONOMETER_USERNAMEYour Cronometer account emailCRONOMETER_PASSWORDシークレットYour Cronometer account passwordCRONOMETER_TOTP_SECRETシークレットBase32 key for accounts with two-factor authenticationCRONOMETER_ACCOUNT_TZOptional IANA timezone override, for example America/Los_Angelesローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
cronometer-api-mcp
Claude.ai、ChatGPT、Grok 向けのホスト版を近日公開予定です。 ウェイトリストに登録 →
Cronometer の栄養管理向け MCP(Model Context Protocol) サーバーです。リバースエンジニアリングしたモバイル REST API を基盤としています。
Cronometer のウェブバックエンドに対して包括的な GWT-RPC アプローチを採用する cronometer-mcp とは異なり、このサーバーは Cronometer Android アプリが使用するものと同じ JSON REST API と通信します。ペイロードはシンプルで、エンドポイントは安定したバージョン管理がされています。
機能
- 食事記録 -- 食品名、量、食事グループを含む記録項目
- 栄養データ -- 毎日の主要栄養素・微量栄養素の合計と、栄養素ごとの信頼度を含む栄養スコア
- 食品検索 -- Cronometer の食品データベースを検索し、詳細な栄養情報を取得
- 食事記録の管理 -- 記録項目の追加・削除、日付のコピー、日の完了マーク付け
- カスタム食品 -- 独自の栄養データを使った食品の作成
- 主要栄養素の目標値 -- 週間スケジュールと保存済みテンプレートの確認
- 断食 -- 履歴と集計統計の表示
- 生体指標 -- 日付範囲内で記録された体重、体脂肪率、心拍数などの指標
クイックスタート
1. uv をインストールする
curl -LsSf https://astral.sh/uv/install.sh | sh
2. 認証情報を設定する
export CRONOMETER_USERNAME="[email protected]"
export CRONOMETER_PASSWORD="your-password"
オプション:二要素認証
アカウントで二要素認証が有効になっている場合、リクエストに現在の6桁のコードが含まれていないと、/api/v2/login
は TOTP_CODE_REQUIRED を返します。2FA の設定時に Cronometer に表示された Base32 キー(認証アプリにスキャンしたものと同じキー)をサーバーに渡すと、ログインのたびにコードが自動生成されます(RFC 6238、SHA-1、30秒周期)。
export CRONOMETER_TOTP_SECRET="ABCD EFGH IJKL MNOP QRST UVWX YZ23 4567"
スペースや小文字を含めても問題ありません。2FA を使用しないアカウントでは、設定しないでください。
オプション:アカウントのタイムゾーンを上書きする
食事記録には Cronometer アカウントのタイムゾーンが設定され、サーバーはログイン時にそのタイムゾーンを報告します。タイムゾーンが誤っている場合(たとえば、以前のビルドでリセットされた場合)、アカウント設定を変更せずに、特定の IANA タイムゾーンを強制できます。
export CRONOMETER_ACCOUNT_TZ="America/Los_Angeles"
設定すると、ログイン時に報告された値とキャッシュ済みセッションの両方よりも優先されるため、古いキャッシュ済みタイムゾーンも上書きされます。
3. MCP クライアントを設定する
uvx は必要に応じてサーバーをダウンロードして実行するため、別途インストールする必要はありません。
OpenCode(opencode.json)
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"cronometer": {
"type": "local",
"command": ["uvx", "cronometer-api-mcp"],
"environment": {
"CRONOMETER_USERNAME": "{env:CRONOMETER_USERNAME}",
"CRONOMETER_PASSWORD": "{env:CRONOMETER_PASSWORD}",
"CRONOMETER_TOTP_SECRET": "{env:CRONOMETER_TOTP_SECRET}",
"CRONOMETER_ACCOUNT_TZ": "{env:CRONOMETER_ACCOUNT_TZ}"
},
"enabled": true
}
}
}
Claude Desktop(claude_desktop_config.json)
{
"mcpServers": {
"cronometer": {
"command": "uvx",
"args": ["cronometer-api-mcp"],
"env": {
"CRONOMETER_USERNAME": "[email protected]",
"CRONOMETER_PASSWORD": "your-password",
"CRONOMETER_TOTP_SECRET": "your-base32-key",
"CRONOMETER_ACCOUNT_TZ": "America/Los_Angeles"
}
}
}
}
利用可能なツール
食事記録と栄養
| ツール | 説明 |
|---|---|
get_food_log | 指定日の食事記録項目。各項目には食品名、入手元、1食分の単位・数量、その食品が各記録項目に含む栄養素の量に加え、エネルギーの概要(目標/摂取量/残りの kcal)と、追跡対象のすべての栄養素について摂取量をまとめた栄養の概要が含まれます |
get_daily_nutrition | Cronometer で追跡されるすべての栄養素について、摂取した主要栄養素と微量栄養素の合計 |
get_nutrition_scores | カテゴリ別スコア(ビタミン、ミネラルなど)と、栄養素ごとの摂取量および信頼度 |
食品検索と詳細
| ツール | 説明 |
|---|---|
search_foods | 名前で Cronometer の食品データベースを検索 |
get_food_details | 食品の詳細な栄養プロファイルと1食分のサイズ |
日記管理
| ツール | 説明 |
|---|---|
add_food_entry | 食品の1食分を日記に記録します |
remove_food_entry | 日記の記録を1件以上削除します |
add_custom_food | 指定した栄養情報と任意のバーコードを使ってカスタム食品を作成します |
update_custom_food | カスタム食品の名前、栄養情報、1食分の量、またはバーコードをその場で編集します |
delete_custom_food | カスタム食品を無効化し、検索結果とカスタム食品リストから除外します(既存の日記記録は保持されます) |
add_recipe | IDとグラム数で指定した既存の食品からレシピを作成します |
import_recipe | 自由記述の材料リストからレシピを作成します。Cronometerが各行をデータベース内の食品に照合し、量をグラムに換算します |
copy_day | 前日の記録をすべてコピーします |
mark_day_complete | 日記の日を完了または未完了としてマークします |
目標とトラッキング
| ツール | 説明 |
|---|---|
get_macro_targets | 週間のマクロ栄養素スケジュールと保存済みの目標テンプレートを取得します |
get_fasting_history | 指定した日付範囲の断食履歴を取得します |
get_fasting_stats | 断食統計の集計を取得します |
list_biometrics | トラッキング可能な生体指標とその単位を一覧表示します |
get_biometrics | 指定した日付範囲の生体指標時系列データ(例:体重、体脂肪率)を取得します |
日付パラメーターにはすべて YYYY-MM-DD 形式を使用します。省略した場合は今日が既定値になります。
相対日付と直近の日付
get_food_log、get_daily_nutrition、get_nutrition_scores では、date に
"today"、"yesterday"、"N days ago" も指定できます。これらは呼び出し時に
Cronometerアカウントのタイムゾーンを使って解決されるため、長い会話の前半に出てきた
日付に頼らず、Claudeが相対的な入力を渡せます。
get_food_log と get_daily_nutrition では、包括的な終了日 date からさかのぼって数える
days(1~31、既定値は1)を指定できます。
get_food_log(date="yesterday")
get_nutrition_scores(date="3 days ago")
get_daily_nutrition(days=3) # Last 3 days, including today
get_daily_nutrition(date="yesterday", days=3) # Previous 3 complete calendar days
get_food_log(days=7) # Recent meals, including today
「ここ数日のカロリー」を確認する場合は、get_daily_nutrition(days=3) を使用します。
単日レスポンスの形式は従来どおりです。複数日のレスポンスには start_date、end_date、
および日ごとの結果を古い順に並べた days リストが含まれます。
返される日付は常に具体的な YYYY-MM-DD の値です。
トランスポート
stdioのみです。リモート/ホスト環境で使用する場合、stdioサーバーは
supergateway(Dockerfile を参照)でラップされます。
supergatewayがHTTPリスナーを管理し、/mcp でMCP streamable-HTTPを公開します。
サーバーには認証機能が組み込まれていません。リモートにデプロイする場合は、
必ず認証ゲートウェイまたはリバースプロキシの背後に配置してください。
開発
ローカル開発では、.env.example を .env にコピーし、認証情報を入力してください。
cp .env.example .env
# edit .env
uv run cronometer-api-mcp
CLIは起動時に .env を自動的に読み込みます(開発時の利便性のみ)。実際の環境変数は常に
.env より優先されるため、本番環境へのデプロイやMCPクライアントの env ブロックには影響しません。
動作の仕組み
このサーバーは mobile.cronometer.com と通信します。これはCronometerのAndroid/Flutterアプリが
使用するものと同じREST APIです。APIは次の方法でリバースエンジニアリングされました。
- APK内の
libapp.so(Dart AOTスナップショット)を静的解析してエンドポイント名を特定 - Fridaとmitmproxyでトラフィックを傍受し、正確なリクエスト/レスポンス形式を取得
- 稼働中のAPIに対する試行錯誤を行い、ペイロードの形式を確認
APIは2つのプロトコルを使用します。
- v2(
POST /api/v2/*) — JSON本文による認証。主な操作(食品検索、日記の読み書き、栄養、断食、マクロ栄養素、生体指標)で使用 - v3(
DELETE /api/v3/user/{id}/*) — ヘッダーベースの認証(x-crono-session)。日記記録の削除で使用
レシピのインポートは唯一の非同期操作です。import_recipe はジョブIDを返し、サーバーが進捗率100%を報告して解析済みの材料を添付するまで、poll_async_result をポーリングします。
Python API
クライアントを直接使用できます。
from cronometer_api_mcp.client import CronometerClient
from datetime import date
client = CronometerClient()
# Search for foods
results = client.search_food("chicken breast")
# Get food details
food = client.get_food(results[0]["id"])
# Log a serving
client.add_serving(
food_id=food["id"],
measure_id=food["defaultMeasureId"],
grams=200,
)
# Get today's diary
diary = client.get_diary()
# Import a recipe from a free-text ingredient list
recipe = client.import_recipe("one hot dog\nketchup\nbun")
print(recipe["food_id"], recipe["ingredients"])
# Parse without saving, to review the matches first
preview = client.import_recipe("2 tbsp olive oil\n200g chicken", save=False)
# Get nutrition scores
scores = client.get_nutrition_scores()
ライセンス
MIT
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。