Skip to main content
Glama
ojimpo
by ojimpo

health-mcp

health.ojimpo.com(Cultural Health Dashboard)の健康・文化活動データを Claude から会話で扱えるようにする読み取り専用 MCP サーバーです。

背景・動機

health-ojimpo は、音楽・読書・運動・SNS などの日常の文化的活動を外部サービスから自動収集し、個人の基準値に対するスコアとして可視化することで、メンタルヘルスの変調を早期に察知するダッシュボードです。

ダッシュボードは「眺める」には良いのですが、「先月と比べて音楽が減ってるのはなぜ?」「この1年で読書が多かった月は?」のような問いかけにはAIとの対話のほうが向いています。そこでダッシュボードのデータをMCPツールとして公開し、claude.ai / Claude Code のどちらからでも自然言語で健康データを分析できるようにしました。

同じ構成の自作MCPサーバー otp-mcp(乗換案内)・cosense-mcp(Cosense)に続く3つ目で、足場(stdio/HTTP両対応のトランスポート層)はそれらから流用しています。

Related MCP server: oura-mcp

設計思想

  • 読み取り専用: データの取り込みや設定変更は載せない。MCP経由での誤操作リスクをゼロにし、認証なし運用(後述)を許容できるようにする

  • バックエンドに寄生しない: health-ojimpo の REST API を叩くだけの薄いクライアント。スコアリングロジックはバックエンド側の単一実装のまま

  • 出力サイズを制御: スコア履歴のカテゴリ列はオプトイン、生データは件数上限 + 週/月集計モードで、LLMのコンテキストを溢れさせない

  • stdio と Streamable HTTP の両対応: ローカルの Claude Code からは stdio、claude.ai からは Cloudflare Tunnel 経由の HTTP で同じサーバーに接続する

ツール

ツール

説明

get_current_status

現在の健康/文化スコア・ステータス、カテゴリ別の今週vs先週、コンディション(睡眠/Readiness/ストレス等)、トレンドコメント

get_score_history

スコアの時系列(1m/3m=日次、1y=週次)。カテゴリ列は必要な分だけ指定

get_recent_activities

直近の具体的なアクティビティ(聴いた曲、運動、観た映画など)

list_sources

設定済みデータソース一覧(カテゴリ・分類・基準値)。query_records の引数探索用

query_records

生の日次レコードを日付範囲で取得。source/categoryフィルタ、week/month集計対応

構成

claude.ai ──HTTPS──> Cloudflare Tunnel ──> localhost:4102 ──> health-mcp(Docker)
Claude Code ──stdio──> node build/index.js                        │ HTTP (docker network)
                                              health-ojimpo backend (FastAPI) <──┘
  • health-mcp コンテナは health-ojimpo の Docker ネットワーク(health-ojimpo_default)に相乗りし、http://backend:8000 でAPIに到達します

  • stdio モード(Claude Code)はホストの http://localhost:8400(backendのlocalhost公開ポート)を使います

セットアップ

ビルド

npm install
npm run build

CLI(動作確認用)

export HEALTH_API_BASE_URL=http://localhost:8400
node build/index.js status
node build/index.js history 3m music,sleep
node build/index.js recent 5
node build/index.js sources
node build/index.js records 2026-06-01 2026-06-30 lastfm '' week

Docker(HTTP モード)

docker compose up -d --build
curl http://localhost:4102/health   # {"status":"ok"}

※ health-ojimpo のスタックが先に起動している必要があります(externalネットワーク参照のため)。

Claude Code への登録(stdio)

claude mcp add --scope user health \
  --env HEALTH_API_BASE_URL=http://localhost:8400 \
  -- node /path/to/health-mcp/build/index.js

claude.ai への登録(リモートコネクタ)

  1. Cloudflare Tunnel の ingress に health-mcp.example.com → http://localhost:4102 を追加

  2. claude.ai → Settings → Connectors → Add custom connector → URL に https://health-mcp.example.com/mcp を指定

環境変数

変数

既定値

説明

HEALTH_API_BASE_URL

http://localhost:8400

health-ojimpo バックエンドのベースURL(Docker内は http://backend:8000

TRANSPORT

stdio

http で Streamable HTTP サーバーとして起動

PORT

3000

HTTPモードのリッスンポート

MCP_AUTH_TOKEN

(空)

設定すると /mcp にBearer認証を要求。claude.aiカスタムコネクタは静的トークン未対応のため通常は空

将来の展望

  • 主観フィードバック(気分の記録)ツール — バックエンド側にエンドポイントができたら書き込み系として追加検討

  • スコア変動の要因分解ツール(どのソースがスコアを下げているかの内訳)

Available Tools

5 tools
get_current_statusA

Get the current snapshot of the personal health dashboard (health.ojimpo.com): overall health score/status (NORMAL/CAUTION/CRITICAL) and cultural activity score/status (RICH/MODERATE/LOW), per-category cards (this week vs previous week with change), condition state cards (sleep/readiness/stress/weight/outing/CTL), and trend comments. Scores are percentages of personal baselines (100 = baseline met). Use this first for any 'how am I doing' question.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must disclose behavioral traits. It describes the tool as a 'snapshot' implying a read operation without side effects, but it does not explicitly state read-only, auth requirements, or rate limits. The description adds context about scores being percentages of baselines but lacks full transparency on behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is one long sentence but front-loaded with the core purpose and efficiently lists the returned elements. It is fairly concise with no wasted words, though it could be broken into multiple sentences for readability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description adequately describes the return structure: overall scores, per-category cards, condition state cards, and trend comments. It also explains score interpretation (percentages of baselines). The usage guidance adds completeness. Minor gaps: does not detail card structure or trend comment format.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There are no parameters, and the schema coverage is trivially 100%. Per guidelines, baseline is 4. The description does not need to add parameter details since there are none.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it retrieves the current snapshot of the health dashboard, listing specific components like overall health status, cultural activity score, per-category cards, condition state cards, and trend comments. It distinguishes from siblings like get_recent_activities (activities), get_score_history (history), and query_records (general query).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly advises to use this tool first for any 'how am I doing' question, providing strong usage guidance. It does not list exclusions or alternative tools for specific cases, but the context makes it clear this is the primary status tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_recent_activitiesA

List the most recent concrete activities across all sources (e.g. tracks listened, workouts, movies watched, commits) as human-readable lines with relative time. The backend keeps the latest 8.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax items (default 8).

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Description reveals it returns human-readable lines with relative time and a backend limit of 8, but lacks disclosure on side effects given no annotations. Adequate for listed behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences front-load the main functionality and include important details without unnecessary text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple list tool with one parameter and no output schema, the description adequately covers functionality and constraints.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%; the description mentions 'latest 8' which aligns with the parameter's default and max, adding no new meaning beyond schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states it lists recent activities across multiple sources with human-readable lines and relative time, distinguishing it from siblings like get_current_status or query_records.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Implies usage for retrieving recent activities, but does not explicitly specify when to use vs alternatives or provide exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_score_historyA

Get the score time series: one row per date with overall health_score and cultural_score, plus optional per-category score columns. range 1m/3m = daily points, 1y = weekly points. Valid category names — activity: music, exercise, reading, movie, sns, coding, calendar, live, shopping, vitality, outing_activity, cd, podcast, game, like, study; state: sleep, readiness, stress, weight, outing, ctl. Add only the categories you need to keep output small.

ParametersJSON Schema
NameRequiredDescriptionDefault
rangeNoTime range (default 3m). 1m/3m = daily, 1y = weekly.
categoriesNoOptional category columns to include in addition to the overall scores.

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It describes output structure (per-date rows with overall scores and optional category columns) and granularity by range. It does not disclose potential limitations like empty data, rate limits, or auth needs, but it is reasonably transparent for a read-only query tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with two sentences, front-loading the main purpose and data structure. It efficiently conveys key details, though the default range could be explicitly highlighted instead of implied.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description explains output structure well. It covers granularity, optional categories, and category naming. It lacks pagination or limit info but is adequate for a simple query tool with two optional parameters.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the description adds value beyond schema: it states the default range (3m), lists valid category names, and provides usage advice to limit categories. This extra context aids correct parameter selection.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves a score time series with overall health_score and cultural_score per date, plus optional per-category columns. It specifies granularity based on range and distinguishes from siblings like get_current_status (current snapshot) and get_recent_activities (activity list).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It advises to add only needed categories to keep output small, which guides parameter selection. However, it does not explicitly state when to use this tool versus alternatives, though context signals imply it for time series vs. current state or recent activity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_sourcesA

List all configured data sources with their category, display_type (activity/card_only/state), classification (baseline/event/health_only/both), status, and baseline (base_value per aggregation period). Use to discover valid 'source' and 'category' values for query_records.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description relies on the word 'List' to imply a read-only operation. It lacks explicit statements about safety, authentication, or side effects, which would be beneficial for full transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no redundant information. The first sentence states the action and lists returned fields; the second provides a clear usage directive. Maximum efficiency.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no parameters and no output schema, the description adequately covers what the tool returns and its primary use case. It could mention any ordering or limits but is sufficient for a simple list tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has no parameters, so the input schema is trivial. The description adds meaning by detailing the output fields (category, display_type, classification, etc.), which helps an agent understand what information will be returned.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists all configured data sources, specifying key attributes returned (category, display_type, etc.), and distinguishes itself from sibling tools by highlighting its utility for discovering valid source/category values for query_records.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly tells when to use this tool: 'Use to discover valid source and category values for query_records.' It does not provide explicit exclusions but the context implies it is not for status or activity data.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

query_recordsA

Query raw daily activity records (one row per date x source x category: minutes, raw_value, raw_unit). Requires a from/to date range (YYYY-MM-DD). Filter by source and/or category (see list_sources). For ranges over ~2 months prefer group_by week or month to keep output small; raw mode is capped by 'limit' and reports truncation.

ParametersJSON Schema
NameRequiredDescriptionDefault
toYesEnd date YYYY-MM-DD (inclusive).
fromYesStart date YYYY-MM-DD (inclusive).
limitNoMax raw rows (default 500).
sourceNoFilter by source id, e.g. lastfm.
categoryNoFilter by category, e.g. music.
group_byNoAggregate sums per period instead of raw rows.

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. Discloses truncation behavior and grouping aggregation. However, does not mention return format, permissions, or rate limits. Adequate but could be richer.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

4 sentences, front-loaded with purpose, efficient. Every sentence adds value. Could be slightly more structured but overall concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a query tool with 6 params and no output schema, description covers key aspects: data format, grouping, filtering, date range, limit, truncation, and reference to list_sources. Complete for typical usage scenarios.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, baseline 3. Description adds meaning beyond schema by explaining the data structure (one row per date x source x category) and that grouping aggregates sums. Provides context for source/category filtering via list_sources.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly specifies 'Query raw daily activity records' with detail on data structure (one row per date x source x category: minutes, raw_value, raw_unit). Distinguishes from siblings like get_recent_activities by focusing on raw daily records with filtering and grouping.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

States requirement for from/to date range, suggests filtering by source/category with reference to list_sources, and provides guidance to prefer grouping for ranges over ~2 months to keep output small, mentioning raw mode cap and truncation. Does not explicitly contrast with siblings but gives clear context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 5 tool updatesv0.1.0
    • First observedget_current_status
    • First observedget_recent_activities
    • First observedget_score_history
    • First observedlist_sources
    • First observedquery_records

TDQS

A4.3/5.0
Disambiguation5/5

Each tool has a clearly distinct purpose: snapshot status, recent activities, historical scores, source metadata, and raw data queries. No overlap in functionality.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern (e.g., get_current_status, list_sources, query_records), making the set predictable and easy to navigate.

Tool Count5/5

Five tools is an appropriate scope for a health dashboard, covering key operations without being too sparse or overly heavy.

Completeness5/5

The set provides a complete view of health data: current status, recent activities, historical trends, source configurations, and raw data access. No obvious gaps for a read-only dashboard.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

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

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    Read-only MCP server that exposes Apple Health data (steps, workouts, sleep, etc.) from a local SQLite store, allowing AI agents to query health metrics without sending data to hosted services.
    7
    Apache 2.0
  • A
    license
    B
    quality
    B
    maintenance
    MCP server for accessing Oura Ring data from Claude Code and claude.ai, providing summarized health metrics and raw API data.
    11
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Hosted MCP server that syncs health data from Apple Health, Fitbit, Oura, and Google Health Connect, enabling Claude and ChatGPT to query workouts, sleep, nutrition, and recovery in plain English with interactive charts.
    2
    73
    2
    MIT

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/ojimpo/health-mcp'

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