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 내보내기와 같은 하루 10회 내보내기 제한도 없습니다.

다른 옵션을 쓰지 않는 이유

  • Terra API는 Cronometer 데이터를 웹훅으로 보내지만 읽기만 가능하며, 음식 일기가 다른 사람의 서버를 거치게 됩니다.

  • gocronometer 및 유사한 내보내기 도구는 읽기만 가능하고 속도 제한이 있습니다.

  • Cronometer 웹사이트를 스크래핑하는 도구는 쓰기가 가능하지만, Cronometer가 업데이트를 배포할 때마다 변경되는 코드에 의존하며 Gold가 필요합니다.

Related MCP server: cronometer-api-mcp

도구

읽기

도구

제공되는 정보

get_food_log

하루 동안의 일기에 있는 모든 항목. 각 음식에는 이름, 출처, 제공량, 제공 횟수, 그리고 해당 음식이 영양소에 추가한 양이 포함됩니다. 또한 칼로리(목표, 섭취, 남음)와 추적하는 모든 영양소의 총계를 얻을 수 있습니다.

get_daily_nutrition

하루 동안의 영양소 총계

get_nutrition_scores

Cronometer의 영양 점수

search_foods

식품 데이터베이스 검색

get_food_details

하나의 음식에 대한 전체 영양소와 제공량

get_targets

일일 총계 옆에 표시되는 영양소 목표

get_macro_targets

단백질, 탄수화물, 지방 목표

list_biometrics

측정할 수 있는 항목과 각 항목이 허용하는 단위

get_biometrics

시간에 따른 단일 측정값

get_fasting_history

두 날짜 사이의 단식 기록

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를 받으므로, 한 번의 호출로 단일 영양소부터 전체 카탈로그까지 전달할 수 있습니다:

{
  "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을 전달하면 해당 음식에 그 영양소가 전혀 없다는 뜻이며, 앱은 이 둘을 다르게 취급하므로 실제로 아는 것만 전달하세요. 인식할 수 없는 이름은 조용히 무시되지 않고 오류로 처리됩니다. 영양소가 조용히 누락된 음식도 여전히 완전해 보이기 때문입니다.

식품 라벨에는 있지만 카탈로그에는 없는 두 가지 편의 기능이 있습니다: energy_kj는 칼로리로, salt_g는 나트륨으로 변환됩니다. 둘 다 전달하지 말고 하나만 전달하세요.

동작 방식

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

서버 자체에는 자체 로그인이 없으며 로컬 머신에서만 수신 대기합니다. 따라서 서버에 도달하는 모든 것은 이미 로그인을 통과한 상태입니다. 이 로그인은 Claude.ai가 설정해 주는 OAuth 토큰 또는 Claude Code에 더 빠른 고정 토큰을 허용합니다.

설치

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

설치 프로그램은 Python과 Node를 설정하고, Cronometer 로그인 정보와 커넥터 로그인 페이지의 비밀번호를 요청한 다음, 토큰을 만들고, 사용자 호스트 이름과 사용자 이름이 채워진 서비스 파일과 nginx 사이트를 작성합니다.

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로 접근 가능한 사용자 머신의 두 서비스입니다.

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

이메일, 비밀번호, 시간대를 입력받아 ~/.config/cronometer-mcp/env에 0600 모드로 저장합니다. 비밀번호는 화면에 표시되지 않으며 셸 기록에도 남지 않습니다. 원한다면 직접 수동으로도 할 수 있습니다:

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. 두 서비스 설치

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과 통신하는 유일한 구성 요소입니다.

증상이 혼란스럽기 때문에 이름을 밝힐 만한 함정이 하나 있습니다: 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

첫 번째는 로그인 세부 정보를 반환합니다. 두 번째는 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와 시크릿은 비워 둡니다. 설치 프로그램이 설정한 비밀번호로 로그인합니다. 이 작업을 한 번만 하면 웹, 데스크톱, 모바일에서 모두 사용할 수 있습니다. 커넥터는 특정 기기가 아니라 계정에 속하기 때문입니다.

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가 같은 머신에서 실행된다면 웹 서버와 로그인을 완전히 건너뛰고 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