Skip to main content
Glama
rollecode

Cronometer MCP server

by rollecode

Cronometer MCP server

Version Python Node OAuth

Claude.ai と Claude Code から Cronometer の食事記録を読み書きします。これは Cronometer Android アプリが使用するのと同じ API mobile.cronometer.com と通信し、その前に OAuth 2.1 ログインを配置するため、Claude.ai にカスタムコネクタとして追加できます。Claude Code は代わりにプレーンなトークンを使用できます。Gold サブスクリプションは不要で、CSV エクスポートのように 1 日 10 件のエクスポート制限もありません。

他の選択肢ではだめな理由

  • Terra API は Cronometer のデータを webhook に送信しますが、読み取り専用であり、食事ログは他人のサーバーを経由します。

  • gocronometer や同様のエクスポートツールは読み取り専用で、レート制限があります。

  • Cronometer のウェブサイトをスクレイピングするツールは書き込みができますが、Cronometer がアップデートをリリースするたびに変わるコードに依存しており、Gold が必要です。

Related MCP server: cronometer-api-mcp

ツール

読み取り

ツール

取得内容

get_food_log

1 日分の食事記録のすべて。各食品には、名前、出典、分量、摂取回数、およびその食品が栄養素に追加した量が含まれます。また、カロリー(目標、摂取済み、残り)と、追跡しているすべての栄養素の合計も取得できます。

get_daily_nutrition

1 日分の栄養素の合計

get_nutrition_scores

Cronometer の栄養スコア

search_foods

食品データベースを検索

get_food_details

1 つの食品の完全な栄養素と分量

get_targets

毎日の合計の横に表示される栄養素の目標

get_macro_targets

タンパク質、炭水化物、脂質の目標

list_biometrics

測定できる項目と、各項目が受け付ける単位

get_biometrics

時系列での 1 つの測定値

get_fasting_history

2 つの日付の間の断食

get_fasting_stats

断食の合計と平均

list_nutrients

カスタム食品に設定できるすべての栄養素とその単位

書き込み

ツール

機能

add_food_entry

食事に食品を追加

edit_food_entry

摂取量または摂取日時を変更

remove_food_entry

食品エントリを削除

add_custom_food

最大 94 種類すべての栄養素を含む独自の食品を作成

retire_custom_food

カスタム食品を廃止する、または復活させる

add_note

日にノートを書く

edit_note

ノートを書き直す

add_biometric

体重や体脂肪などの測定値を記録

edit_biometric

間違った測定値を修正

add_exercise

エクササイズを追加

edit_exercise

エクササイズの時間や消費カロリーを変更

add_fast

完了した断食または進行中の断食を記録

edit_fast

断食の時間や目標を変更(進行中の断食を終了する場合も含む)

delete_fast

断食を削除

copy_day

ある日の食事記録を別の日にコピー

mark_day_complete

日を完了にする、または完了しない

カスタム食品

add_custom_food は栄養素名から量への dict を受け取るため、1 つの栄養素からカタログ全体までを 1 回の呼び出しで指定できます:

{
  "name": "Vaasan Ruispalat",
  "serving_name": "1 slice",
  "serving_grams": 33,
  "nutrients": {
    "energy": 79, "protein": 3.1, "carbs": 12.5, "fiber": 3.4,
    "fat": 0.8, "saturated": 0.2, "salt_g": 0.36,
    "iron": 0.9, "magnesium": 26, "b1_thiamine": 0.09, "folate": 11
  }
}

量は 1 回分全体に対するもので、それぞれがその栄養素独自の単位です。受け付けられる名前は、ここに組み込まれたテーブルではなく、アカウント自身のカタログから取得されるため、list_nutrients を呼び出してください。

省略した栄養素は Cronometer では空白のままになります。代わりに 0 を渡すと、その食品にはその栄養素が含まれていないことを示し、アプリはこの 2 つを区別して扱うため、実際に分かっているものだけを渡してください。認識されない名前は黙って無視されるのではなくエラーになります。なぜなら、栄養素が静かに失われた食品でも完全に見えるからです。

食品ラベルにはあるがカタログにはない 2 つの便利な機能があります。energy_kj はカロリーに変換され、salt_g はナトリウムに変換されます。両方ではなく、どちらか一方を渡してください。

仕組み

サーバー自体には独自のログインはなく、ローカルマシン以外ではリッスンしません。そのため、サーバーに到達するものはすべて、すでにログインを通過しています。そのログインは、Claude.ai が設定する OAuth トークンか、Claude Code にとってより迅速な固定トークンのいずれかを受け入れます。

Claude.ai / Claude Code
        |  HTTPS
   Cloudflare Tunnel, or any proxy that gives you HTTPS
        |
   nginx  127.0.0.1:8431
        |
   auth-server.js  :8432    handles the login and the tokens
        |
   cronometer-mcp  :8430    the server itself, local only
        |
   mobile.cronometer.com

インストール

インストーラーは Python と Node をセットアップし、Cronometer のログイン情報とコネクタのログインページのパスワードを尋ね、トークンを作成し、サービスファイルと nginx サイトを自分のホスト名とユーザー名で埋めて書き込みます。

git clone https://github.com/rollecode/cronometer-mcp.git
cd cronometer-mcp
./install.sh

Node 18 以降、Python 3.12 以降、および uv が必要です。

サーバーをオンラインにすることはあなたに委ねられています。なぜなら、ここがセットアップが最も異なる部分であり、ここで間違った推測をすると、食事記録が公開インターネットにさらされることになるからです。トンネルまたはプロキシを 127.0.0.1:8431 に向けてください。Cloudflare Tunnel の場合:

ingress:
  - hostname: cronometer-mcp.example.com
    service: http://localhost:8431

HTTPS である必要があります。OAuth は平文 HTTP では機能しません。

手動でのセルフホスティング

インストーラーを実行するよりもすべての手順を確認したい場合は、これがすべてです。最終状態は、HTTPS 経由で到達可能な自分のマシン上の 2 つのサービスです。

1. コードとその依存関係を取得

git clone https://github.com/rollecode/cronometer-mcp.git
cd cronometer-mcp
npm install --omit=dev
uv venv && uv pip install -e .

2. Cronometer のログイン情報を保存

./set-credentials.sh

メールアドレス、パスワード、タイムゾーンを尋ね、それらをモード 0600 で ~/.config/cronometer-mcp/env に書き込みます。パスワードはエコーバックされず、シェル履歴にも残りません。必要に応じて手動で行うこともできます:

mkdir -p ~/.config/cronometer-mcp && chmod 700 ~/.config/cronometer-mcp
cat > ~/.config/cronometer-mcp/env <<'EOF'
CRONOMETER_USERNAME=you@example.com
CRONOMETER_PASSWORD=your-password
CRONOMETER_ACCOUNT_TZ=Europe/Helsinki
EOF
chmod 600 ~/.config/cronometer-mcp/env

先に進む前に動作を確認してください。これはログインして食事記録を表示します:

set -a && . ~/.config/cronometer-mcp/env && set +a
.venv/bin/python -c "from cronometer_mcp import CronometerClient; c=CronometerClient(); print(c.get_diary()['summary'])"

3. コネクタのパスワードとトークンを設定

パスワードは、Claude.ai でコネクタを追加するときにサインインページで入力するものです。保存されるのは scrypt ハッシュのみです。

CONFIG_DIR=~/.config/cronometer-mcp node set-password.js 'your-password-here'

トークンは Claude Code 用のショートカットで、ヘッダーを送信してブラウザーを完全にスキップします。

openssl rand -hex 32 > ~/.config/cronometer-mcp/token
chmod 600 ~/.config/cronometer-mcp/token

4. 2 つのサービスをインストール

systemd/ には両方のユニットファイルが含まれています。YOUR_USER を自分のユーザー名に、cronometer-mcp.example.com を自分のホスト名に置き換えてから:

mkdir -p ~/.cache/cronometer-mcp
sudo cp systemd/cronometer-mcp.service systemd/cronometer-mcp-auth.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now cronometer-mcp cronometer-mcp-auth
systemctl status cronometer-mcp cronometer-mcp-auth

cronometer-mcp は :8430 で実行されるサーバー自体で、実行中のマシンからのみ到達可能です。cronometer-mcp-auth は :8432 のログインレイヤーであり、:8430 と通信するのはこれだけです。

症状が紛らわしいため、名前を挙げる価値がある落とし穴が 1 つあります。cronometer-mcp.serviceIPAddressDeny=any を追加しないでください。これはローカルファイルのみを読み取るサーバーにとっては賢明な強化策ですが、このサーバーは mobile.cronometer.com に到達する必要があり、これを設定すると、systemd がサービスをアクティブと報告している間も、すべてのツール呼び出しがタイムアウトするまでハングします。また、サーバーはすでにローカルマシン以外でのリッスンを拒否しているため、これによって得られるものもありません。

5. nginx を前面に配置

sudo cp nginx/cronometer-mcp.conf /etc/nginx/sites-enabled/cronometer-mcp
sudo nginx -t && sudo systemctl reload nginx

これは 127.0.0.1:8431 でリッスンし、すべてをログインレイヤーに渡します。長い読み取りタイムアウトと proxy_buffering off が重要です。MCP は接続を開いたままにして送信するため、バッファリングがあると停止するからです。

6. HTTPS アドレスを割り当てる

Cloudflare Tunnel を使用すると、ルーターのポートを開く必要がありません。どの HTTPS リバースプロキシでも同様に機能します。

ingress:
  - hostname: cronometer-mcp.example.com
    service: http://localhost:8431
cloudflared tunnel route dns YOUR_TUNNEL cronometer-mcp.example.com
sudo systemctl restart cloudflared

7. 外部から確認

curl https://cronometer-mcp.example.com/.well-known/oauth-authorization-server
curl -o /dev/null -w '%{http_code}\n' -X POST https://cronometer-mcp.example.com/mcp

最初のコマンドはログイン詳細を返します。2 番目のコマンドは 401 を返す必要があります。それ以外はログインレイヤーがバイパスされて食事記録が公開されていることを意味します。

次に、接続 で説明されているようにクライアントを接続します。

更新

git pull
uv pip install -e . && npm install --omit=dev
sudo systemctl restart cronometer-mcp cronometer-mcp-auth

ツールを追加または名前変更した後、Claude.ai のコネクタで再接続を押してください。これにより、すでに開いている会話内のツールリストが更新されます。トークンはメモリ内ではなくディスク上の oauth.db に保存されるため、サインインは維持されます。

問題が発生した場合

journalctl -u cronometer-mcp -n 50 --no-pager
journalctl -u cronometer-mcp-auth -n 50 --no-pager

表示内容

通常の原因

ツール呼び出しがハングし、サービスはアクティブと表示

MCPユニット上の IPAddressDeny。手順4を参照

Claude Code からのすべての呼び出しで 401

トークンの不一致。ヘッダーを ~/.config/cronometer-mcp/token と比較

サインインページがパスワードを拒否

ハッシュがまだ保存されていません。手順3を実行

2FAコードを求められてログインが失敗

2要素認証を使用する場合 を参照

nginx からの 502

ログインレイヤーが停止しています。systemctl status cronometer-mcp-auth

接続

Claude.ai。 設定、コネクタ、カスタムコネクタの追加の順に移動し、https://your-host/mcp を指定します。クライアントIDとシークレットは空のままにします。インストーラーが設定したパスワードでサインインします。これを一度行うと、ウェブ、デスクトップ、モバイルのすべてで有効です。コネクタは1つのデバイスではなくアカウントに属しているためです。

Claude Code(ブラウザ経由):

claude mcp add --transport http cronometer https://your-host/mcp --scope user

次に /mcp を実行してサインインします。

Claude Code(トークン使用、ブラウザなし):

claude mcp add --transport http cronometer https://your-host/mcp \
  --header "Authorization: Bearer $(cat ~/.config/cronometer-mcp/token)" \
  --scope user

サーバーを使わずに利用する

Claude が同じマシンで動作している場合は、ウェブサーバーとログインを完全にスキップして、Claude に MCP を直接起動させてください:

claude mcp add cronometer -- /path/to/cronometer-mcp/.venv/bin/cronometer-mcp

ログイン情報は ~/.config/cronometer-mcp/env または .env ファイルから読み取られます。

設定

変数

説明

CRONOMETER_USERNAME

あなたのCronometerメール

CRONOMETER_PASSWORD

あなたのCronometerパスワード

CRONOMETER_ACCOUNT_TZ

日記の日付が計上されるタイムゾーン

CRONOMETER_TOTP_SECRET

2要素認証のシークレット。2要素認証を有効にしている場合のみ。totp エクストラが必要

ISSUER

サーバーの公開アドレス

PORT

ログインサーバーのポート。デフォルトは8432

UPSTREAM

MCPサーバーの場所。デフォルトは http://127.0.0.1:8430

CONFIG_DIR

パスワード、トークン、データベースが保存される場所

CALL_TIMEOUT_MS

呼び出しが無音のまま切断されるまでの時間。デフォルトは120000

MCP_PORT

MCPサーバーのポート。デフォルトは8430

MCP_PUBLIC_URL

公開アドレス。クライアントにアイコンを通知するために使用

機密情報はすべて ~/.config/cronometer-mcp/ に保存され、あなただけが読み取れます:env はCronometerのログイン情報、password-hash はコネクタのログインページ用パスワード、token は固定トークン、oauth.db はログインサーバーが発行したアプリとトークンを保持します。トークンはスクランブルされて保存されるため、データベースを盗まれても誰も有効なキーを取得できません。

Cronometerのセッションは ~/.cache/cronometer-mcp/session.json に保存されるため、サーバーを再起動しても何度もログインし直してCronometerの制限に達することはありません。

2要素認証を使用する場合

サーバーを単独で稼働させたままにするとコードを入力できないため、コードの代わりにその背後にあるシークレットが必要です:

uv pip install -e '.[totp]'

次に、CRONOMETER_TOTP_SECRET を認証アプリのシークレットに設定します。これがないと、2要素認証が有効なアカウントはログインに失敗し、その旨が正確に表示されます。

コードの開発

uv venv && uv pip install -e . && uv pip install pytest ruff
.venv/bin/python -m pytest tests -q
.venv/bin/python -m ruff check src/ tests/

クレジット

Cronometerクライアントは、rwestergren/cronometer-api-mcp のコピーとして始まりました。ログインレイヤーは rollecode/obsidian-remote-mcp に由来します。

A
license - permissive license
-
quality - not tested
A
maintenance

Maintenance

Maintainers
Response time
0dRelease cycle
7Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

View all related MCP servers

Related MCP Connectors

  • WHOOP recovery, strain, sleep and workouts in Claude via official WHOOP OAuth. Free, open source.

  • Garmin data in Claude & ChatGPT via the Garmin Health API. OAuth sign-in, no password sharing.

  • Connect Claude to Fathom meeting recordings, transcripts, and summaries

View all MCP Connectors

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/rollecode/cronometer-mcp'

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