Skip to main content
Glama

License: MIT Version Platform Node

PodQuery — Claude Desktop 向け臨床監査ツール

Glooko / Omnipod 5 の糖尿病データを Claude に直接接続して、分析を任せましょう。

[!IMPORTANT] 医学的助言ではありません。 このツールは、あなたのデータを理解し、糖尿病ケアチームにより良い質問をするためのものです。医療機器ではなく、治療内容を変更するために使用してはなりません。完全な免責事項をご覧ください。

[!NOTE] これは MCPB(MCP Bundle)版で、Claude Desktop 専用に作られています。このプロジェクトの以前の Docker ベース版(Open WebUI と生の Web API にも対応していました)を、ワンクリックでインストールできる単一の .mcpb ファイルに置き換えたものです。Docker もターミナルも、設定ファイルの手動編集も不要です。代わりにマルチプラットフォーム対応の Docker 版が必要な場合は、元の Web アプリまたはこのリポジトリの以前のタグを参照してください。

[!NOTE] 初期の概念実証(v0.2.1)です。 PodQuery は活発に開発中です。中核となるツールとデータパイプラインはエンドツーエンドで動作しています(同梱のサンプルデータセットの背後にあるのは、私自身の実際のデータです)。ただし、インターフェース、デフォルト設定、ツールの動作はリリース間で変更される可能性があります。フィードバックや issue は大歓迎です。

[!TIP] 説明書は苦手? AI に任せましょう。 🤖 この会話形式のセットアッププロンプトを任意の AI アシスタントに貼り付ければ、自分のペースで拡張機能のインストールと設定を案内してくれます。


📖 目次


Related MCP server: Diabetes:M MCP Server

🌟 PodQuery とは?

PodQuery は、あなたの糖尿病データと Claude をつなぐブリッジです。MCPB(MCP Bundle)— Claude Desktop のワンクリックローカル拡張形式 — としてパッケージ化されているため、インストールはダブルクリックするだけです。管理すべき独立したサーバーやコンテナ、設定ファイルはありません。Web サイトと AI の間でデータをコピー&ペーストする必要も、API コストもかかりません。

あなたはただ Claude と話すだけです。平易な言葉で質問すると、Claude はこの拡張機能が提供するツールを通じてあなたのデータにアクセスし、必要なものを正確に取得して、会話の中で分析してくれます。

次のような質問ができます:

  • 「先月のタイムインレンジはどうだった?」

  • 「なぜ夕方に高血糖が続くの?」

  • 「一番悪かった日のデータを見せて、何が起きたか教えて。」

🚀 実際にできること

PodQuery は、あなたの糖尿病の履歴を、Claude が呼び出せる一連の分析ツールとして公開します:

  • サマリーとトレンド: タイムインレンジ、GMI、変動性、最良・最悪の日と時間帯、基礎/追加インスリンのバランスを、指定した任意の期間について確認できます。

  • 高忠実度の CGM データ: 5 分ごとの測定値がすべて記録されるため、スパイクや低下も見逃しません。ただし Claude はまず集計値を取得し、本当に必要なときだけ生データを取得するように誘導されます。

  • すぐ使えるビジュアルチャート: 臨床レポート風の血糖チャートをブラウザで直接開きます。ホバー可能なボーラスマーカーと日別の内訳付きで、表の数字だけではありません。

  • 拡張されたボーラス分析: 各ボーラスは、投与時の血糖値と、その時有効だったポンプ設定(ISF、炭水化物比、目標値)と照合されるため、Claude はその投与量が妥当だったかを判断できます。

  • Omnipod 5 の動作: アルゴリズムが一時停止していたとき、最大で動作していたとき、または信号喪失後に盲目的に動作していたときを確認できます。

Claude は、あなたと会話しながらこれらのツールを呼び出し、これらすべてをライブで自ら実行します。

「Aha!」の瞬間

このプロジェクトは個人的な不満から始まりました。Home Assistant ダッシュボードに糖尿病データを統合しようとしたとき、Glooko(特に Omnipod 5 由来)に保存されている豊富な履歴データが宝の山であることに気づいたのです。そのデータを AI アシスタントに渡して直接クエリさせれば、何か月もの手動記録では決して見つからなかったパターンを発見できるだろうと気づきました。

作った理由

これを開発したのは、力を患者の手に取り戻すためです。私たちは数か月に一度、担当医と 15 分しか時間を取れないことがよくあります。このツールを使えば、次のことが可能になります:

  1. 先手を打つ: 次の予約前にトレンドを発見できます。

  2. プライバシーを守る: データと認証情報は自分のマシンに留まります。

  3. 即座に始める: ワンクリックでインストールでき、実行するインフラは不要です。


👤 対象となる人

このプロジェクトは、Omnipod 5 ハイブリッドクローズドループインスリン送達システムを使用し、データを Glooko に同期している人向けに作られています。当てはまらない場合でも、3 か月分の組み込みサンプルデータ(私のデータ)を使ってプロジェクトを試すことができます。その場合、Omnipod 5 や Glooko アカウントは不要です。

前提条件

  • Claude Desktopclaude.ai/download から無料でダウンロードできます。この拡張機能は Claude Desktop(macOS または Windows)内でのみ動作します。スタンドアロンサーバーではなく、Web 版やモバイル版の Claude では動作しません。

  • 自分のデータを分析する場合: Omnipod 5 と、それを同期した Glooko アカウントが必要です。サンプルデータセットでツールを試す場合は不要です。

これ以外は何も必要ありません。Docker も、Node.js のインストールも、ターミナルも不要です。


🔒 プライバシーとセキュリティ:あなたのデータ、あなたのコントロール

機密性の高い医療認証情報とデータを扱うため、「ローカルファースト」アーキテクチャで設計されています。

  • 中間業者なし: Glooko のユーザー名とパスワードがあなたのマシンから出ることはありません。この拡張機能から Glooko のサーバーに直接送信されます。第三者のサーバーも、Anthropic も、それらを見ることはありません。

  • あなたのコンピュータ上で動作: 拡張機能のプロセス、ローカルデータベース、分析ツールはすべて Claude Desktop 内で、完全にあなたのマシン上で実行されます。

  • 認証情報は Claude Desktop 自身の安全な設定ストレージに保存されます(拡張機能の設定でパスワードフィールドは機密扱いとマークされています)。プレーンテキストファイルではありません。

[!IMPORTANT] このデータについて Claude(クラウド AI)と会話するため、ほとんどのプロバイダーには会話を「トレーニング」に使用することを許可する設定があります。臨床データについて話す前に、Claude のプライバシー設定でチャット履歴 / モデルのトレーニングをオフにすることを検討してください。そうすれば、あなたの病歴はプライベートなまま保たれます。

[!TIP] 自分のアカウントを接続する前に試してみたいですか? この拡張機能には、実際のデータ(3 か月分、私のデータ)の小さな組み込みサンプルデータベースが同梱されています。インストールした瞬間から、Glooko へのログインもネットワークアクセスも一切なしで、オフラインですべてを試すことができます。


🧐 「厳しい愛」の AI ペルソナ

このツールには、組み込みの AI ペルソナ、「厳しい愛」の内分泌科医が同梱されています。

1 型糖尿病の管理は大変であり、ユーザーをなだめてもタイムインレンジは改善しません。このペルソナは、直接的で、分析的で、妥協がありません。データを甘く飾ることはせず、ボーラスのタイミングがずれている箇所、過剰補正している箇所、基礎インスリンが変動を捉えきれていない箇所を指摘します。また、効率的に動作するように作られており、まずサマリーを取得し、必要なときだけ詳細なデータに掘り下げます。

インストール後、このペルソナは Claude のプロンプト/添付メニューで 「Clinical auditor persona」 という選択可能なプロンプトとして利用できます。これを選択することで、Claude が内分泌科医になります。

その率直さは意図的なスタイルであり、権威ではありません。それが言うことはすべて、何が起きているかを理解し、糖尿病ケアチームにより良い質問をするための助けです。DIA や炭水化物比などの設定変更を指示することはなく、またすべきでもありません。治療の変更は、あなたと医療専門家との間で話し合うべきことです。


🛠️ 拡張機能のインストール

  1. このリポジトリの Releases ページ から .mcpb ファイルをダウンロードします(または自分でビルドします — .mcpb を自分でビルドする を参照)。

  2. 次のいずれかの方法でインストールします(すべて同等です):

    • ダウンロードした .mcpb ファイルをダブルクリックする。

    • .mcpb ファイルを Claude Desktop のウィンドウにドラッグ&ドロップする。

    • Claude Desktop で:Settings → Extensions → Advanced settings → Install Extension… を選択し、.mcpb ファイルを選択する。

  3. Claude Desktop に、拡張機能ができることと必要な権限を一覧表示するインストール画面が表示されます。内容を確認して、確定します。

  4. 次に拡張機能の設定画面が表示されます — 下記の 設定の構成 を参照してください。後から Settings → Extensions → PodQuery でいつでもこの画面に戻れます。

これだけです — 別途ビルド手順も、起動するコンテナも、ターミナルで実行し続けるものもありません。Claude Desktop は必要に応じて拡張機能のプロセスを起動し、不要になると停止します。

[!NOTE] Claude Desktop のメニューの正確な表記はバージョンによって異なる場合があります。完全に一致しない場合は、最も近い相当項目を探してください(いずれにせよ、Settings 内の「Extensions」または「Connectors」エリアが該当します)。


⚙️ 設定の構成

Claude Desktop はこの拡張機能の設定フォームを自動的に生成します — 手動で作成・編集する .env ファイルはありません。ほとんどのフィールドは適切なデフォルト値が事前に入力され、必須とマークされているため、フォームを空のまま保存することはできません。デフォルト値をそのまま受け入れて、同梱のサンプルデータに対してすぐに拡張機能を使い始めることも、自分の環境に合わせて調整することもできます。Glooko のメールアドレスとパスワードだけは任意です — 両方とも空のままにすると、オフラインのサンプルデータモードのままになります。

設定

説明

Glooko メール / Glooko パスワード

あなたの Glooko ログイン情報です。唯一の任意項目です。両方空欄にすると、組み込みの3か月分サンプルデータセットに対するオフラインモードで動作します。アカウントは不要で、Glooko に接続されることはありません。両方入力すると、自分のデータをダウンロードして最新に保てます。パスワード欄はマスクされ、Claude Desktop によって安全に保存されます。

Glooko アカウントのグルコース単位

Glooko アカウントがデータを配信する単位です(mmol または mgdl。米国アカウントでは多くの場合 mgdl)。デフォルトは mmol です。上で Glooko ログインを設定した場合にのみ重要で、間違えると保存データが壊れます。これは下の表示単位とは別のものです。

表示単位

グルコースを表示する単位です:mmol(mmol/L)または mgdl(mg/dL)。デフォルトは mmol です。上記の Glooko アカウント単位とは独立しています。たとえば、mgdl の Glooko アカウントを使う米国ユーザーでも、すべてを mmol で表示するよう選択できます。

低値(低血糖)境界 / 高値(高血糖)境界

上記の表示単位での目標範囲です。デフォルトは 3.9 / 10.0 で、これは mmol/L の値です。すべてのツールはデフォルトでこれらを使用します。あなた(または Claude)はこれを変更せずに、一回限りの異なるしきい値を尋ねることもできます。

初回実行時に読み込む履歴

Glooko ログインが設定されている場合にのみ使用されます(サンプルデータモードでは無視されます)。デフォルトは 2025-01-01 です。Omnipod データがある最も古い日付、または単に可視化したい最も古い日付に設定してください。最初の同期がそこまで遡ってダウンロードします。

データフォルダー

拡張機能がダウンロードしたデータのローカルデータベースを保存する場所です。デフォルトはドキュメントフォルダーです(その中に小さな PodQuery サブフォルダーが自動的に作成されます)。これはお使いのマシンに残り、拡張機能のアップデート後も保持されます。

[!WARNING] 表示単位を mgdl に設定した場合は、低値/高値の境界も更新してください。 これらはデフォルトで 3.9 / 10.0 ですが、これは mmol/L の値であり、単位を切り替えても自動的には変換されません。mg/dL の場合、同等の目標範囲は通常およそ 70 / 180 です。担当の医療チームが設定した値に合わせて調整してください。

サンプルデータで試す(Glooko アカウントなし)

Glooko のメールとパスワードを空欄のまま保存するだけです。他のフィールドはデフォルトのままで構いません。拡張機能は組み込みの3か月分サンプルデータベース(作者自身の実際のデータを意図的に共有したもの)を提供し、Glooko やネットワークに接続することはありません。

自分の Glooko データを使う

Glooko のメールとパスワードを入力し、Glooko アカウントのグルコース単位を実際の Glooko アカウントに合わせて設定し、希望の表示単位と目標範囲を設定します。その後、最初の質問で履歴の一回限りのダウンロードが開始されます(どの程度遡るように指定したかに応じて、数秒から約1分かかります)。その後はデータがローカルに保存され、回答が高速になります。


💬 使い方

  1. Claude Desktop でチャットを開始します。

  2. 会話に対して PodQuery 拡張機能/コネクタが有効になっていることを確認します(Claude Desktop はインストール済みの拡張機能をツール/コネクタピッカーに表示します)。

  3. プロンプトメニューから、"Clinical auditor persona" プロンプトを選択すると、本格的な手厳しい監査体験が得られます。または、直接質問するだけでも構いません。ツールはどちらの方法でも機能します。

  4. どんどん質問してください。最初の質問としておすすめなのは:

    "私の糖尿病データについて教えてください。"

Claude がデータを取得し、その解釈を示します。その後、結果について話し合ったり、追加の質問をしたり、特定の日や血糖変動に掘り下げたり、チャートを依頼したりできます。PodQuery は数値を説明するだけでなく、実際のインタラクティブなグルコースチャートをブラウザで直接開きます。


🔁 サンプルデータから自分のデータへの切り替え

  1. 設定 → 拡張機能 → PodQuery を開きます。

  2. Glooko メールGlooko パスワード を入力し、他のフィールドを自分に合わせて設定します(設定の構成 を参照)。

  3. 既存のデータベースを削除して、サンプルデータが自分のデータと混ざらないようにします。設定した データフォルダー(またはデフォルトのドキュメントフォルダー)を開き、その中の PodQuery サブフォルダーを削除します。

  4. 質問をします。拡張機能はその最初のクエリで、自分の履歴を新しいアーカイブにダウンロードします。


🛠️ トラブルシューティング

[!NOTE] このセクションは今後も拡充される予定です。ここに記載されていない問題に遭遇した場合は、Issue を開いてください。お手伝いします。

拡張機能のツールがチャットに表示されません。 Claude Desktop のツール/コネクタピッカーで、現在の会話に対して PodQuery 拡張機能が有効になっていること、および 設定 → 拡張機能 で引き続き有効になっていることを確認してください。

日付について質問したのに何も返ってきません。 サンプルデータ(Glooko フィールドを空欄にした状態)に対して実行している場合、その日付範囲のみが利用可能です。まず Claude に保持している日付範囲を尋ねるか、非常に広い期間で get_diabetes_summary を依頼して reportRange を読んでください。

拡張機能を更新した後、Claude が古い動作をしているようです。 新しい .mcpb を再インストールしてください(Claude Desktop がその場で更新を提案します)。古い回答が続く場合は、新しい会話を開始してツールの説明が再読込されるようにしてください。

拡張機能が起動しない / エラーが表示されます。 設定 → 拡張機能 → PodQuery を開き、設定した Glooko の認証情報が正しいこと(またはオフラインモードでは両方空欄であること)、および設定したデータフォルダーが Claude Desktop が書き込み可能な場所であることを確認してください。

自分のアカウントを接続した後、グルコースの数値がおかしく見えます。 "Glooko アカウントのグルコース単位" が、実際の Glooko アカウントに設定されているものと一致していることを再確認してください。見たい単位(それは別の "表示単位" フィールドです)ではなく。ここが一致しないと、受信した測定値の解釈が壊れます。すでに誤った設定でデータを取り込んだ場合は、データベースをクリアして(サンプルデータから自分のデータへの切り替え を参照)、正しく再ダウンロードさせてください。

mg/dL に切り替えた後、低値/高値の境界がおかしく見えます。 低値/高値の境界フィールドは、表示単位を変更しても自動変換されません。設定の構成 の警告を参照してください。単位に合わせて手動で更新してください。

ブラウザでチャートが開きませんでした。 PodQuery はチャートファイルを OS のデフォルトブラウザで自動的に開こうとします。それが失敗した場合(お使いのマシンに認識されたデフォルトブラウザのコマンドがない場合)、Claude が代わりにファイルパスを教えてくれるので、手動で開いてください。これはまれで、通常は特殊なシステム構成でのみ発生します。


📬 お問い合わせ

インストールで行き詰まっている場合でも、監査によって Time in Range がどのように改善されたかを共有したい場合でも、喜んでお手伝いします。

技術的なヘルプ

何かがうまく機能しない場合は、Issue を開く でお知らせください。他の人もその解決策の恩恵を受けられます。

個人・プロフェッショナル向け

LinkedIn

[!NOTE] プライバシーに関する注意: サポート用にスクリーンショットを送る場合は、まず個人の医療情報や Glooko の認証情報をぼかしてください。


🔌 ツールリファレンス

これらは、この拡張機能が Claude に登録する MCP ツールです。あなたが直接呼び出すことはありません。チャット中は Claude が代わりに呼び出します。しかし、Claude が正確に何を見られるか(または見られないか)、なぜ特定のフォローアップを尋ねたのかを理解したい場合に役立ちます。

タイムスタンプに関する注意

これらのツールが使用するすべてのタイムスタンプは、ISO 8601 形式の単純な壁時計時刻です。例:2026-01-01T00:00:00.000Z — 末尾の"Z"にもかかわらず、これらは真の UTC ではありません。Glooko は、各測定の瞬間にデバイスが表示した文字通りの日時のみを記録し、タイムゾーンやオフセットは付加されません。そのため、測定値には、そのとき物理的にいた場所の時刻が刻印されます。つまり、タイムゾーンの変換はどちらの方向にも一切行われません。Claude は"昨日"、"過去3週間"などの相対的な表現を、一致する壁時計の数字に直接解決し、結果の時刻も変換せずにそのまま表示します。唯一のトレードオフは、タイムゾーンをまたいで移動した場合、アーカイブには特定の測定値がどのゾーンに属するかの記録がないため、ゾーンが変わった場合の"何時間前"などの計算を確実に行う方法がないことです。データはデバイスが表示したものと正確に同じですが、ゾーンが付加されていないだけです。

グルコース単位に関する注意

ほとんどのツールは、オプションの unitslowerupper パラメーターを受け入れます。Claude がこれらを省略した場合、拡張機能の設定で構成した値(表示単位と目標範囲)が使用されます。Claude は、単一の質問についてデフォルトを上書きする場合にのみこれらを渡します。たとえば、通常の目標を変更せずに、異なるしきい値未満の時間を確認する場合などです。

ツール

Tool

目的

get_diabetes_summary

あらゆる概要質問の最良の出発点。任意のウィンドウに対する固定サイズの集計なので、数か月や数年にわたっても低コスト。意図的に広い呼び出しを行うことで、Claude がアーカイブが保持する完全な日付範囲(reportRange)を発見することもできます。血糖コントロール(TIR、GMI、CV、stdDev)、血糖の極値、最良/最悪の日と時間、インスリン、ボーラス構成、炭水化物、および有効な設定を返します。

get_trend

スパンを時間バケット(日/週/月/四半期、または固定長)に分割し、各バケットを生の測定値から独立して計算します。「月ごとにどう変化したか」というタイプの質問を1回の呼び出しで処理します。

get_glucose

ウィンドウ内の個々のタイムスタンプ付きCGM測定値。最大21日間に制限され、オプションでlow(低血糖)、high(高血糖)、target、またはallにフィルタリングできます。

get_chart_html

チャートを見るための主要な方法。 完全な臨床レポートスタイルの血糖チャート(範囲内/低/高の色分けトレース、網掛けの目標帯、最小/最大スプレッド、ホバー可能なボーラスマーカー、ヘッダー統計、凡例、ツールチップ)を構築し、ファイルに保存してブラウザで直接開きます。ranges配列を受け入れて、1つのチャートで複数の非連続日付を比較できます。複数日のウィンドウには、時系列/オーバーレイの切り替えと日別フィルターチップ(表示中の日付に応じて統計が再計算される)があり、さらに各暦日ごとに折りたたみ可能な**「日別詳細」**パネルがあり、その日の完全な臨床数値と平易な英語のツールチップが表示されます。典型的なウィンドウ(約1か月まで)では、すべての実際の測定値をネイティブの約5分間隔でプロットします。より広いウィンドウはデフォルトで軽く間引かれ(応答のdownsampleフィールドでフラグ付け)、resolutionパラメータ(1 = すべての測定値、2 = 1つおき、以下同様)で完全な詳細を再リクエストできます。

get_chart_series

プロット用に目標ポイント数にダウンサンプリングされた血糖値。ポイントごとに最小/最大バンドがあるためスパイクが失われず、ボーラスイベントマーカーも含まれます。レンダリングされたページではなく生のチャートデータを返します — Claude がget_chart_htmlが生成する既製のチャートではなく、独自のカスタムビジュアライゼーションを構築する必要がある場合に使用します。

get_enriched_bolus_log

ウィンドウ内のすべてのボーラス(最大92日間)。送達時の補間されたCGM値と、その時点で有効なISF/炭水化物比/目標/DIA、さらに送達量とプログラム量の比較および計算機のオーバーライドが強化されています。ボーラスクラスでフィルタリング可能。

get_hourly_trends

ウィンドウ全体で時計時間ごとにプールされた目標範囲内時間と平均血糖値 — 暁現象、一貫した夕方の高血糖、その他の時間帯パターンの分析に役立ちます。

get_basal_delivery

Omnipod 5アルゴリズムが時間の経過とともに基礎インスリン送達で何を行っていたか。単位ではなく行動状態(normal / suspend / max / limited)として表されます。

get_daily_insulin

Glooko独自の日別基礎/ボーラス/総インスリン合計をそのまま表示。日別テーブルまたは総1日投与量の数値に使用します。

get_settings_history

ウィンドウ中に有効だったすべてのOmnipod 5設定変更:DIA、最大基礎レート、および時間セグメント化された目標/ISF/炭水化物比プロファイル。

get_device_events

ポッド交換とCGMセンサー交換のタイムスタンプ — コンテキストのみであり、近くの血糖変動の原因として断言されることはありません。

get_meal_window_analysis

1つの食事またはボーラスイベントに焦点を当てた分析:30分前から3時間後まで、そのウィンドウ内の血糖トレースとボーラスを含みます。

MCP プロンプトも1つあります。clinical_auditor(ClaudeのUIでは「Clinical auditor persona」)— 「Tough Love」AIペルソナを参照してください。


コードの構成

(ソースを読む開発者向け。ツールを使うだけの場合は、この節は無視して構いません。)

データの流れ: Glooko → sync → store → range → analytics → tools → Claude。

  • manifest.json — MCPBマニフェスト: Claude Desktopが拡張機能をインストールする際に読み取るもの、ユーザーに求める設定、そしてsrc/server.jsの起動方法を定義します。

  • src/env.js — Claude Desktopが注入するuser_config由来の環境変数を、他の何よりも先にサニタイズします。server.jsで最初にインポートされる必要があります。回避している特定のClaude Desktopの癖については、ファイル冒頭のコメントを参照してください。

  • src/server.js — MCPサーバーとツール定義(Claude Desktopがstdio経由で起動するもの)。アナリティクスに対する薄いラッパーです。

  • src/analytics.js — 中核: すべての臨床計算とデータ整形を、純粋関数として実装しています。

  • src/chartHtml.jsget_chart_htmlがディスクに書き込む自己完結型HTMLページをレンダリングします: チャートのジオメトリ、色分け、日付セグメンテーション、ツールチップ、Chronological/Overlayトグルはすべてここにあります。

  • src/store.js — SQLiteアーカイブ(生のGlookoブロブではなく正規化された行)、sql.jsをバックエンドに使用 — SQLiteの純粋なWebAssemblyビルドです。これは意図的に、Node組み込みのnode:sqlitebetter-sqlite3のようなネイティブアドオンではなく選ばれました: MCPBとして、このサーバーはClaude Desktopがバンドルする任意のNodeランタイムでmacOSまたはWindows上で起動でき、ビルドステップが不要で、事前に正確なバージョンを知る方法もありません。純粋なWASMエンジンは、Nodeが動作するどこでも同じように動作します。唯一のトレードオフは、sql.jsがインメモリのみであるため、store.jsがSQLite自身のファイルバックアップジャーナルに頼るのではなく、各書き込みバッチの後にアーカイブをディスクに再シリアライズすることです。

  • src/paths.js — アーカイブの場所(ユーザー設定の「データフォルダ」、デフォルトはドキュメントフォルダ)を解決し、新規のオフラインインストール時にバンドルされたサンプルデータベースを所定の場所にシードします。

  • src/range.js — ツールが呼び出すレイヤー。ローカルアーカイブから回答し、必要なときだけGlookoから補充します。オフラインモードはここでゲートされます。

  • src/sync.js — Glookoデータをアーカイブに取り込むエンジン(コールドスタート、補充、起動時ウォームアップ)。

  • src/glooko.js — Glooko APIクライアント(認証とフェッチ)。元のプロジェクトから変更なし — Glookoのダウンロードと保存機能はすべて以前とまったく同じです。

  • src/prompt.js — 臨床監査ペルソナ。

全体を通していくつかの不変条件が成り立ちます: グルコースは内部的に1つの標準単位(mmol/L)で保存され、出力時のみ変換されます。ボーラスは個々のイベントから合計され、ベーサルはGlookoの日次合計から取得されます。すべての時刻はUTCではなく単純な壁時計時刻です(上記の「タイムスタンプに関する注記」を参照)。また、1日あたりのレートは実際に観測されたデータの範囲を使用します。


🏗️ .mcpb を自分でビルドする

拡張機能を使うためにこれを行う必要はありません — リリースされた.mcpbをダウンロードしてください。これはソースからビルドしたい人、インストール前にコードを監査したい人、または変更を加えたい人のためのものです。

git clone https://github.com/rilhia/podquery-mcp.git
cd podquery-mcp
npm install --omit=dev          # installs runtime dependencies, including sql.js, into node_modules
npm install -g @anthropic-ai/mcpb
mcpb pack                       # produces podquery-mcp.mcpb in this folder

リポジトリには.mcpbignoreも同梱されており、パックされたバンドルからリポジトリ専用コンテンツ(ドキュメント、GitHub READMEバナー、未使用のsql.jsビルドバリアントなど)をトリミングします — 触る必要はありませんが、mcpb packが何を含み、なぜ含むのか気になるなら一見の価値があります。

次に、拡張機能のインストールで説明されているように、結果の.mcpbファイルをインストールします。バンドル形式の仕組みについてはMCPB仕様を参照してください。


📄 ライセンス

このプロジェクトはMITライセンスの下でリリースされています — 著作権表示とライセンス文が保持される限り、商用目的を含め、自由に使用、変更、配布できます。全文はLICENSEファイルを参照してください。

MITライセンスはコードを対象としています。バンドルされたサンプルデータベースは作者自身のデータであり、探索用に共有されています。使用方法にはご配慮ください。


免責事項

このツールは情報提供および教育目的のみです。医療機器ではなく、専門的な医学的アドバイス、診断、治療の代替ではありません。医学的状態に関する質問は、常に医師または他の資格のある医療提供者のアドバイスを求めてください。このツールの助けを借りて生成された分析(AI生成の提案を含む)は、インスリン療法や医療レジメンに変更を加える前に、資格のある臨床専門家によるレビューを受ける必要があります。

Available Tools

12 tools
get_basal_deliveryBasal delivery state timelineA

What the Omnipod 5 was doing with basal over time: delivering normally, pausing it (suspend), running at its ceiling (max), or running blind on a fixed preset because it lost CGM signal (limited).

IMPORTANT: these are STATES describing the algorithm's behaviour, NOT insulin amounts. "suspend" means paused, "max" means at the ceiling; neither is a number of units. (For basal units, use get_daily_insulin.)

Use it to investigate lows (was basal already suspended beforehand?), rebound patterns (max, then suspend, then a low), how hard the system is working, and whether excursions coincided with limited mode (algorithm not adjusting at all).

Times are plain wall clock time (device-local), not UTC. Capped to a generous span since it returns collapsed intervals, not raw points.

Returns: a summary of minutes and percentage per state (normal/suspend/max/limited) and, unless includeIntervals is false, an intervals array (state, start, end, minutes).

ParametersJSON Schema
NameRequiredDescriptionDefault
endYesRequired. Window end as an ISO 8601 timestamp, e.g. 2026-06-20T00:00:00.000Z — plain wall clock time, same caveat as start (the "Z" is a format artifact, not a UTC claim). Treated as inclusive and must be after start. All timestamps returned by this API are likewise plain wall clock time, unconverted.
startYesRequired. Window start as an ISO 8601 timestamp, e.g. 2026-06-19T00:00:00.000Z. IMPORTANT: despite the trailing "Z", this is plain WALL CLOCK time, not true UTC — Glooko records only the literal date/time the patient's device showed, with no timezone attached. Use the patient's own wall-clock digits directly (no conversion): resolve "yesterday" or "last 3 weeks" straight into the matching wall-clock date and time. Treated as inclusive.
includeIntervalsNoOptional (default: true). Whether to include the full interval timeline. Set false to get only the per-state summary totals, which is much smaller over a long span.

TDQS

A4.9/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does an excellent job: it explains the meaning of each state, that output is collapsed intervals rather than raw points, that times are device-local wall clock (not UTC), and that results are capped. It even details the conditional intervals array and the summary metrics returned.

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?

The description is fairly long but every clause earns its place: state definitions, use cases, the critical units distinction, time semantics, cap rationale, and return shape. The most important semantic warning — states not insulin amounts — is front-loaded.

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

Completeness5/5

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

There is no output schema, but the description compensates by stating exactly what the agent will receive: per-state minute/percentage summaries and an optional intervals array with start, end, and minutes. Combined with thorough parameter schema text and timezone clarification, an agent has enough to select and invoke the tool correctly.

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%, so the baseline is 3; the description adds a little extra by reiterating the wall-clock caveat and explaining why the time span is capped ('returns collapsed intervals, not raw points'). Most parameter-level detail already lives in the schema, so the added marginal value is moderate, not maximal.

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 states exactly what the tool returns: a timeline of basal algorithm states (normal/suspend/max/limited), not insulin amounts. It explicitly differentiates from get_daily_insulin, making it easy for an agent to distinguish this from sibling tools.

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

Usage Guidelines5/5

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

It gives concrete scenarios for using the tool — investigating lows, rebound patterns, system workload, and limited mode coinciding with excursions. It also tells agents when NOT to use it: when they need basal units, use get_daily_insulin instead.

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

get_chart_htmlOpen a clinical glucose chart in the browserA

Generates a clinical-report-style glucose chart for a window (or several separate windows via ranges) — line trace colour-coded in-range/low/high, a shaded target-range band, a min/max spread band, bolus markers (hoverable in their own right for that bolus's units/ carbs/type, in addition to the aligned CGM reading's own tooltip), a header stat row (time in range, average glucose, time low, time high), a legend, and hover tooltips — saves it to a file, and opens it directly in the patient's default web browser. USE THIS instead of get_chart_series whenever the patient wants to SEE a chart.

Multi-day charts open with a Chronological/Overlay toggle: chronological is the usual continuous timeline; overlay re-plots every calendar day on a shared 0-24h axis (colour-coded per day, with a day legend) so days can be compared directly. Use ranges instead of start/end when the patient wants to compare specific, possibly non-contiguous dates together (e.g. "the 20th, 23rd and 30th") — every requested day gets equal width on the axis regardless of the calendar gap between them. The page also has a day-filter chip per day (in both views) so the patient can hide/show individual days themselves, with the header stats recalculating for whichever days are still visible — you never need a new call just to compare a subset of the days already shown.

The page also includes a "Day details" panel per calendar day (open by default for a single day, collapsed for multiple), with that day's full glucose control (average, GMI, TIR/low/high, std dev, CV), extremes (highest/lowest with times), best/worst hour, insulin (bolus units/count/ avg, basal units, bolus-basal split), bolus type counts, carbs, and the settings in force — the SAME figures get_diabetes_summary would return for that single day, computed by the identical aggregator so the two never disagree. Hiding a day's filter chip hides its detail panel too.

DATA RESOLUTION: a routine call (no resolution/maxPoints given) already plots every single CGM reading with NO smoothing for a typical window (a day, a week, a full month) — the point budget only kicks in on wider windows, where it keeps each bucket's true min/max so no low or high excursion is ever smoothed away, only the moment-to-moment trace between them is thinned. When a call DOES get thinned this way, the result includes a downsample object naming the raw vs plotted reading counts — treat that as an invitation to offer the patient a choice, not as data that has become unavailable: mention it in plain terms ("I plotted a lightly smoothed version of this wide a window — want the full-detail version instead? It may take a little longer to load") and, if they want more detail, re-call with resolution set to how much of the real data to use — 1 for every single reading, 2 for every other one, 3 for every third, and so on. Never decide this smoothing tradeoff silently on the patient's behalf beyond the routine default.

CRITICAL — how to respond after calling this, this is what keeps it fast: this tool does the displaying itself. Do NOT copy, re-type, rebuild, or paste the chart as an artifact/code block/canvas yourself — reproducing a large HTML page as your own output is exactly the slow path this tool exists to avoid, and it is unnecessary work since the browser window is already open by the time you respond. If the JSON result has openAttempted: true, just tell the patient in one short sentence that the chart has opened in their browser — do not describe or restate its contents in detail, do not emit any HTML/code, and treat the tool call as already complete. If openAttempted: false, the auto-open could not be launched from this machine (e.g. no recognised default-browser command) — tell the patient to open the file at the returned filePath themselves; only in that fallback case, or if embedHtml was explicitly requested, does the response also include a full html field. Do NOT reach for a quick/built-in "auto-visualize this data" shortcut either — this tool already produces the real chart.

Times are plain wall clock time (device-local), not UTC.

Returns: ranges (the resolved windows actually used), dayCount, unit, pointCount, bolusCount, filePath (where the page was saved), openAttempted (whether the browser launch was attempted without an immediate error), downsample (only present when the plotted points were thinned from the raw CGM readings — see DATA RESOLUTION above), and — only as a fallback — html.

ParametersJSON Schema
NameRequiredDescriptionDefault
endNoRequired. Window end as an ISO 8601 timestamp, e.g. 2026-06-20T00:00:00.000Z — plain wall clock time, same caveat as start (the "Z" is a format artifact, not a UTC claim). Treated as inclusive and must be after start. All timestamps returned by this API are likewise plain wall clock time, unconverted. Omit this (and start) when passing `ranges` instead for several separate windows.
lowerNoOptional. Low (hypo) boundary in the chosen unit; readings below it count as time-low. Omit to use the server default (OMNI_LOWER). Pass only to override for this one call, e.g. to ask about time under a different threshold.
startNoRequired. Window start as an ISO 8601 timestamp, e.g. 2026-06-19T00:00:00.000Z. IMPORTANT: despite the trailing "Z", this is plain WALL CLOCK time, not true UTC — Glooko records only the literal date/time the patient's device showed, with no timezone attached. Use the patient's own wall-clock digits directly (no conversion): resolve "yesterday" or "last 3 weeks" straight into the matching wall-clock date and time. Treated as inclusive. Omit this (and end) when passing `ranges` instead for several separate windows.
unitsNoOptional. Glucose unit for this call. Omit to use the unit configured on the server (OMNI_UNITS). One of: "mmol" (mmol/L) or "mgdl" (mg/dL). Pass only to override the configured unit for this one call.
upperNoOptional. High (hyper) boundary in the chosen unit; readings above it count as time-high. Omit to use the server default (OMNI_UPPER). Pass only to override for this one call.
rangesNoOptional. Use this INSTEAD OF start/end to show several separate, possibly non-contiguous windows on ONE chart -- e.g. "the 20th, 23rd and 30th of June" is ranges: [{start:"2026-06-20T00:00:00.000Z", end:"2026-06-21T00:00:00.000Z"}, {start:"2026-06-23T00:00:00.000Z", end:"2026-06-24T00:00:00.000Z"}, {start:"2026-06-30T00:00:00.000Z", end:"2026-07-01T00:00:00.000Z"}] (each entry is that day's own midnight to the next day's midnight). Ranges can be single days or multi-day spans, do not need to be contiguous, and do not need to be given in order -- the chart always lays them out chronologically and gives every calendar day equal width on the axis, so a 10-day gap between two selected dates does not waste space. The combined span across all ranges is still capped like a normal window. The chart itself also lets the viewer hide/show individual days afterward without a new call.
embedHtmlNoOptional (default: false). Force the full HTML page to also be included in the response even when the browser auto-open succeeded. Leave this false in normal use — including it costs exactly the slow, large-response-body path this tool is designed to avoid. Only set true if the patient explicitly asks to see the raw page/markup.
maxPointsNoOptional, advanced. A precise total-point-budget alternative to `resolution` (20-50000), shared across all ranges when `ranges` is used; ignored if `resolution` is also given. Omit both in normal use: the routine default is up to 12000 points, which covers a full month at native cadence with no downsampling -- see DATA RESOLUTION above.
resolutionNoOptional. The simple, patient-facing way to control chart detail: a plain divisor for how much of the real CGM data to plot, applied to each range independently. 1 = ALL readings (full native ~5-minute resolution, no downsampling at all, however wide the window -- use this whenever the patient wants full detail and is fine with a larger/slower-to-load file). 2 = every 2nd reading (roughly half), 3 = every 3rd (roughly a third), and so on. Omit this in normal use -- see DATA RESOLUTION above for when to offer it as a choice. Overrides `maxPoints` when both are given.

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations, the description carries the full burden, and it goes far beyond a basic summary: it discloses that the tool opens the browser itself, what openAttempted true/false means, that `html` is only a fallback, that wall-clock time is used rather than UTC, that downsampling preserves true min/max, and that the chart's day-details panel uses the same aggregator as get_diabetes_summary. This is exemplary behavioral disclosure.

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 long, but the length is largely earned: it is organized into labelled sections (DATA RESOLUTION, CRITICAL, Returns) and front-loads the most operationally important rule ('do not rebuild the chart yourself'). There is minor redundancy around the 'do not reproduce the HTML' instruction, so it is not perfectly tight, but every major paragraph serves a real decision an agent must make.

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

Completeness5/5

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

Given 9 parameters, no annotations, and no output schema, this description is remarkably complete. It covers return fields, success/failure fallback behavior, time-zone semantics, downsampling policy, response etiquette, and how to compare against sibling tools. An agent has everything it needs to call the tool and behave correctly afterward.

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%, so the baseline is 3. The description adds substantial value by explaining the `ranges` alternative in depth (non-contiguous windows, equal day width, ordering), the `resolution` divisor semantics, the interaction between `resolution` and `maxPoints`, and the cost of `embedHtml`. Parameters like lower/upper rely on the schema, but overall the description clearly exceeds the baseline.

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 opens with a specific verb and resource: it 'Generates a clinical-report-style glucose chart', saves it to a file, and opens it in the browser. It also explicitly distinguishes itself from the sibling get_chart_series ('USE THIS instead of get_chart_series whenever the patient wants to SEE a chart'), so an agent can select it correctly without inspecting schemas.

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

Usage Guidelines5/5

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

The description is explicit about when to use this tool over get_chart_series, when to use `ranges` instead of start/end, when to offer `resolution`, and when `embedHtml` should be set. It even gives a patient-facing script for the downsampling tradeoff. This is the strongest possible usage guidance.

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

get_chart_seriesDownsampled series for plottingA

Glucose downsampled to a target number of points for drawing a chart, with a min/max band per point so spikes are not lost, plus bolus events as overlay markers.

Use this whenever the patient wants a GRAPH or CHART of glucose over a window, or when illustrating "what a good/bad day looked like" — a picture of the trace is far more useful here than a table of numbers. It returns a few hundred points instead of every 5-minute reading, so it is far cheaper than get_glucose and a chart cannot show more points than its pixel width anyway. Reserve get_glucose for close-up numeric inspection of a short window, not for wide charts.

IMPORTANT — this tool returns DATA, not a picture: after calling it, actually render the points as a visual line/area chart with time on the x-axis and glucose on the y-axis, shading the target range and marking boluses, rather than only describing the numbers in prose. Producing that chart is the point of calling this tool at all.

HOW TO RENDER IT — DO NOT use a quick/built-in auto-chart shortcut for this: any lightweight "visualize this data" feature that infers its own axis from a plain array almost always falls back to plotting by point POSITION (1, 2, 3, ...) because it never looks at the t field or the xAxis data below — this has been confirmed to happen and produces a meaningless, unlabelled time axis. Instead, BUILD A CUSTOM CHART YOURSELF (e.g. an HTML/SVG or JS-charting-library artifact you write) where you explicitly control the x-axis scale and can use the xAxis data below directly. If your environment offers both a quick chart shortcut and the ability to write custom HTML/code, always choose the custom option for this tool's output.

X-AXIS — READ THIS CAREFULLY, this is commonly gotten wrong: the x-axis MUST be a genuine TIME SCALE, NEVER a plain category/index axis showing point position (1, 2, 3, ... maxPoints, or "286"). Points are NOT evenly spaced in time (a sensor gap or the short-fidelity path below means the interval between consecutive points can vary), so an index axis silently distorts time and every tick is meaningless to the reader.

To make this hard to get wrong, the response includes a ready-made xAxis object — USE IT DIRECTLY instead of inventing your own tick scheme:

  • xAxis.ticks: an array of {t, label} already spaced sensibly for the window's span (every 3-4 hours for anything up to ~10 days, daily beyond that). Plot these as the x-axis tick marks, using label as the tick text VERBATIM — do not recompute your own tick positions or labels.

  • xAxis.days: one {startT, endT, label} entry per calendar day the window touches (e.g. "Wed 17 Jun"), present whenever the window spans more than a single day. For a multi-day chart, this is what makes it read correctly: divide the plot into these segments with a vertical divider at each boundary, and print each segment's label centred underneath — e.g. three equal sections labelled "Wed 17 Jun", "Thu 18 Jun", "Fri 19 Jun" for a 3-day window, each showing that day's own hour ticks above it. This is exactly the "N equally spaced, dated sections" layout a multi-day glucose chart needs. days is empty for a single-day window (nothing to divide) and for very long windows (too many days to label individually — ticks switches to one date label per tick there instead).

  • A gap in the data (missing points) must still show as a visual gap or interrupted line against this time scale — never compressed away.

Glucose values are in the configured unit; times are plain wall clock time (device-local), not UTC.

Returns: unit, a points array (t, avg, min, max, n per point), an events array of bolus markers for overlay, and xAxis (spanHours, ticks, days) as described above.

ParametersJSON Schema
NameRequiredDescriptionDefault
endYesRequired. Window end as an ISO 8601 timestamp, e.g. 2026-06-20T00:00:00.000Z — plain wall clock time, same caveat as start (the "Z" is a format artifact, not a UTC claim). Treated as inclusive and must be after start. All timestamps returned by this API are likewise plain wall clock time, unconverted.
startYesRequired. Window start as an ISO 8601 timestamp, e.g. 2026-06-19T00:00:00.000Z. IMPORTANT: despite the trailing "Z", this is plain WALL CLOCK time, not true UTC — Glooko records only the literal date/time the patient's device showed, with no timezone attached. Use the patient's own wall-clock digits directly (no conversion): resolve "yesterday" or "last 3 weeks" straight into the matching wall-clock date and time. Treated as inclusive.
maxPointsNoOptional (default: 250). Target number of plotted points (20-1000). 200-400 is plenty for a smooth chart at typical screen widths; higher values cost more for little visual gain.

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It clearly states the tool returns data, not a rendered picture; explains the downsampling and min/max banding; warns that points are not evenly spaced in time; explains the xAxis object is ready to use; and documents wall-clock vs UTC behavior. This is unusually thorough.

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 long, but it is well-structured with bolded section headers, bullet lists, and clear warnings. It front-loads the core purpose and then organizes rendering and x-axis guidance so an agent can act on it. Some points are restated for emphasis, but the extra length is largely justified by the tool's easy-to-misuse output.

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

Completeness5/5

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

There is no output schema, so the description must explain the return shape, and it does: unit, points array with t/avg/min/max/n, events array for bolus markers, and xAxis with spanHours, ticks, and days. It also covers rendering requirements, timezone conventions, gap behavior, and multi-day chart layout. This is complete enough for an agent to call and use the result correctly.

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 schema already covers all three parameters with high coverage, so the baseline is 3. The description adds useful extra context beyond the schema, such as the target-point guidance that 200-400 is plenty for a smooth chart and that a chart cannot show more points than its pixel width, which helps an agent choose maxPoints sensibly.

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 opens with a specific statement of what the tool does: it returns glucose downsampled for chart drawing, with min/max bands per point and bolus overlay events. It further distinguishes itself by explicitly saying it returns data and not a picture, and by naming get_glucose as the alternative for numeric close-up inspection.

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

Usage Guidelines5/5

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

It explicitly says to use this tool whenever a graph or chart of glucose over a window is needed, and tells the agent to render the returned data as a visual line/area chart. It also gives a when-not-to-use direction by reserving get_glucose for close-up numeric inspection rather than wide charts.

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

get_daily_insulinDaily insulin totals (Glooko per-day figures)A

Glooko's own per-day insulin totals shown verbatim: basal units, bolus units and the combined total for each day, plus a window aggregate.

Use this when you specifically want the device-reported daily totals (for example a day-by-day basal/bolus table, or "what was my total daily dose each day"). Note: the bolus here is Glooko's pre-aggregated daily figure. For bolus aggregated from individual events (the project-wide method used everywhere else), use get_diabetes_summary or get_trend. Basal is only available from Glooko, so this and those tools share the same basal source.

The most recent day may be flagged provisional if it is still today and not yet finalised.

Returns: source ("glooko-daily"), a days array (date, basalUnits, bolusUnits, totalUnits, provisional), and an aggregate (daysWithData, basalUnits, bolusUnits, totalUnits, basalUnitsPerDay, bolusUnitsPerDay, totalUnitsPerDay, basalPercent). All dates are wall-clock (device-local) days.

ParametersJSON Schema
NameRequiredDescriptionDefault
endYesRequired. Window end as an ISO 8601 timestamp, e.g. 2026-06-20T00:00:00.000Z — plain wall clock time, same caveat as start (the "Z" is a format artifact, not a UTC claim). Treated as inclusive and must be after start. All timestamps returned by this API are likewise plain wall clock time, unconverted.
startYesRequired. Window start as an ISO 8601 timestamp, e.g. 2026-06-19T00:00:00.000Z. IMPORTANT: despite the trailing "Z", this is plain WALL CLOCK time, not true UTC — Glooko records only the literal date/time the patient's device showed, with no timezone attached. Use the patient's own wall-clock digits directly (no conversion): resolve "yesterday" or "last 3 weeks" straight into the matching wall-clock date and time. Treated as inclusive.

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations available, the description carries the full burden. It discloses the data source (Glooko verbatim), the provisional flag on the current day before finalisation, and the wall-clock date semantics. It does not explicitly address read-only/no side-effect status or potential auth/rate-limit constraints, but its behavioral claims are clear and consistent.

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?

The description is front-loaded with the core purpose, then usage guidance, then important caveats, then a necessary return-shape listing because there is no output schema. Every sentence earns its place; no filler or repetition.

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

Completeness5/5

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

Given two clearly documented parameters, no output schema, and no annotations, the description supplies all essential context: return fields, date interpretation, provisional-day caveat, and sibling-tool routing. Nothing an agent needs to correctly call this tool is missing.

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 description coverage is 100%, so the schema already documents start and end meaningfully, including wall-clock caveats. The description reinforces the wall-clock convention but adds no parameter-specific semantics beyond the schema, which matches the baseline for full schema coverage.

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 first sentence states exactly what the tool returns — Glooko's verbatim per-day totals with basal units, bolus units, combined total, and a window aggregate — using a specific verb and resource. It also distinguishes itself from get_diabetes_summary and get_trend by positioning this as the device-reported daily method versus the event-aggregated method.

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

Usage Guidelines5/5

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

The description gives explicit when-to-use context ('Use this when you specifically want the device-reported daily totals') and explicit alternatives with the condition for choosing them ('For bolus aggregated from individual events... use get_diabetes_summary or get_trend'). This leaves no ambiguity about tool selection.

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

get_device_eventsPod and CGM sensor changesA

Pod changes (the Omnipod is replaced roughly every 3 days) and CGM sensor changes, as timestamped events, kept as two separate lists.

These are point-in-time markers, not amounts. They are most useful as CONTEXT for nearby glucose disruption: a fresh pod can run high for the first hours while the cannula settles, and a new sensor can read erratically while it warms up. Use them to check whether an unexplained high or a run of odd readings lines up with a recent change. Treat any such link as a possible contributing factor, never assert it as the cause.

Times are plain wall clock time (device-local), not UTC.

Returns: podChanges and sensorChanges arrays of wall-clock timestamps, plus a count for each.

ParametersJSON Schema
NameRequiredDescriptionDefault
endYesRequired. Window end as an ISO 8601 timestamp, e.g. 2026-06-20T00:00:00.000Z — plain wall clock time, same caveat as start (the "Z" is a format artifact, not a UTC claim). Treated as inclusive and must be after start. All timestamps returned by this API are likewise plain wall clock time, unconverted.
startYesRequired. Window start as an ISO 8601 timestamp, e.g. 2026-06-19T00:00:00.000Z. IMPORTANT: despite the trailing "Z", this is plain WALL CLOCK time, not true UTC — Glooko records only the literal date/time the patient's device showed, with no timezone attached. Use the patient's own wall-clock digits directly (no conversion): resolve "yesterday" or "last 3 weeks" straight into the matching wall-clock date and time. Treated as inclusive.

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations provided, the description shoulders the transparency burden and does well: it discloses that events are point-in-time markers, that times are 'plain wall clock time (device-local), not UTC,' and that the result contains podChanges/sensorChanges arrays plus a count. It also explains the intended interpretation to prevent misuse. It does not mention pagination or ordering, but for a simple read-only list tool that is not a major gap.

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 organized into short paragraphs: what is returned, when to use it, timezone caveat, and return shape. It is front-loaded and avoids fluff, though the middle paragraph on clinical context is somewhat extended. Overall it is efficient and readable.

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 and no annotations, the description compensates by specifying the return structure (two arrays and counts), the timestamp semantics, and the practical use case. It also warns against over-interpretation. The tool is simple enough (two required params, no nested objects) that nothing critical is missing.

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?

The input schema already documents start and end in detail, including ISO 8601 format, inclusive bounds, ordering, and the wall-clock caveat. The description reaffirms the wall-clock caveat but adds no new parameter-specific semantics beyond the schema's 100% coverage, so a baseline 3 is appropriate.

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 states exactly what the tool provides: 'Pod changes ... and CGM sensor changes, as timestamped events, kept as two separate lists.' It also clarifies these are point-in-time markers, not amounts, and names the returned fields (podChanges and sensorChanges), so the agent understands the resource without ambiguity. This clearly distinguishes it from sibling glucose/insulin tools by subject matter.

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 gives a concrete use case: use the events as 'CONTEXT for nearby glucose disruption' to check whether an unexplained high or odd readings 'lines up with a recent change.' It also tells the agent how to interpret results ('possible contributing factor, never assert it as the cause'). It does not name explicit exclusions or sibling alternatives, but among the visible siblings none overlap directly with device-change events, so the omission is minor.

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

get_diabetes_summaryDiabetes summary for a windowA

The single best starting point for any overview question ("how was my control yesterday / over the last 3 weeks / last 6 months"). Returns fixed-size aggregates no matter how long the span, so it is cheap to call over months and tolerates very long windows.

TIP: because this tool is uncapped, a deliberately wide call (e.g. start 2000-01-01T00:00:00.000Z, end tomorrow) is the quickest way to discover how much data the system actually holds: the returned reportRange.start and reportRange.end are the first and last readings present in the archive. Use it as an orientation call before drilling into a specific period.

Insulin uses the project-wide rule: bolus is summed from individual events; basal comes from Glooko's per-day totals. The basal/bolus split is reported as percentages on a per-day-rate basis (a useful balance metric for a closed-loop system). GMI and CV are computed from the CGM readings.

Best/worst day and hour are ranked decisively: Time In Range first, then closeness to the glucose target in force at each reading (median absolute deviation), then variability, and each carries those figures so the ranking is explainable.

Returns: reportRange (start, end, days, reflecting the actual data present), glucoseControl (averageBG, gmiEstimatedA1c, stdDev, coefficientOfVariation, variability flag, timeInRange/timeLow/timeHigh, cgmReadingCount); glucoseExtremes (highest and lowest readings, each with every timestamped instance); bestWorst (bestDay, worstDay, bestHour, worstHour, each with tir, medianAbsTargetDev, cv); insulin (observedDays, bolusUnits, bolusUnitsPerDay, bolusEventCount, avgUnitsPerBolus, and when Glooko daily data exists basalUnits, basalDayCount, averageBasalUnitsPerDay, basalPercent, bolusPercent); bolusArchitecture (counts by bolus type); carbs (carbsGrams, carbsPerDay, carbEntryCount); and settings (the time-segmented profiles in force). All timestamps are plain wall clock time (see start/end parameter notes), not UTC.

ParametersJSON Schema
NameRequiredDescriptionDefault
endYesRequired. Window end as an ISO 8601 timestamp, e.g. 2026-06-20T00:00:00.000Z — plain wall clock time, same caveat as start (the "Z" is a format artifact, not a UTC claim). Treated as inclusive and must be after start. All timestamps returned by this API are likewise plain wall clock time, unconverted.
lowerNoOptional. Low (hypo) boundary in the chosen unit; readings below it count as time-low. Omit to use the server default (OMNI_LOWER). Pass only to override for this one call, e.g. to ask about time under a different threshold.
startYesRequired. Window start as an ISO 8601 timestamp, e.g. 2026-06-19T00:00:00.000Z. IMPORTANT: despite the trailing "Z", this is plain WALL CLOCK time, not true UTC — Glooko records only the literal date/time the patient's device showed, with no timezone attached. Use the patient's own wall-clock digits directly (no conversion): resolve "yesterday" or "last 3 weeks" straight into the matching wall-clock date and time. Treated as inclusive.
unitsNoOptional. Glucose unit for this call. Omit to use the unit configured on the server (OMNI_UNITS). One of: "mmol" (mmol/L) or "mgdl" (mg/dL). Pass only to override the configured unit for this one call.
upperNoOptional. High (hyper) boundary in the chosen unit; readings above it count as time-high. Omit to use the server default (OMNI_UPPER). Pass only to override for this one call.

TDQS

A4.4/5.0
Behavior5/5

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

With no annotations, the description carries the full behavioral burden and does so exceptionally well. It discloses fixed-size output, cheap long-window calls, uncapped orientation behavior, insulin aggregation rules, tie-breaking logic for ranking, and the plain-wall-clock timezone convention. This gives an agent a reliable model of how the tool behaves.

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 long but its length is largely earned: it front-loads purpose, adds a practical discovery tip, then explains computational caveats and the return contract, which is necessary because there is no output schema. A few parenthetical asides are slightly expendable, but overall it is well-ordered and information-dense.

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

Completeness5/5

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

For a complex aggregation tool with no annotations and no output schema, this description is remarkably complete. It explains the full set of returned fields, how aggregates are computed, how rankings are resolved, and the timezone convention. An agent has everything it needs to invoke the tool correctly and interpret the result.

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 description coverage is 100%, so the baseline is 3. The description reinforces the wall-clock timestamp caveat and refers to the parameter notes, but the schema already documents defaults, overrides, and formats for all five parameters. No additional parameter meaning is needed.

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 first sentence names the tool as 'the single best starting point for any overview question' and specifies that it returns fixed-size aggregates over a window. It clearly positions itself as distinct from the sibling period-specific tools by framing itself as an orientation call before drilling into a specific period.

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 recommends using this tool for overview questions and as an orientation call to discover how much data the system holds before drilling into a specific period. It does not explicitly name alternatives or give when-not-to-use conditions, but the usage context is strongly established.

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

get_enriched_bolus_logEnriched bolus logA

Every bolus in the window, each enriched with the context needed to judge whether it was the right dose: the interpolated CGM value at the moment of delivery, and the ISF, carb ratio, target and DIA in force at that time.

Each record also carries delivered vs programmed units (delivered < programmed means the bolus was interrupted, flagged interrupted=true); the calculator recommendation broken into recCorrection, recCarbs and recTotal; whether the user overrode it (override: "above" or "below"); the bloodGlucoseInput and its source the calculator used; the bolus class; and isManual.

Use it to investigate insulin stacking, bolus-calculator accuracy, interrupted deliveries and user overrides. Filter with "classes" to pull only the bolus types you care about and keep the response small.

Capped to 92 days per call. All glucose values are in the configured unit; times are plain wall clock time (device-local), not UTC.

Returns: count, the classes filter applied, and a boluses array of enriched records (each with time, units, delivered, programmed, interrupted, recCorrection, recCarbs, recTotal, override, bgInput, bgSource, cgm_val, class, isManual, and a context object of the settings in force).

ParametersJSON Schema
NameRequiredDescriptionDefault
endYesRequired. Window end as an ISO 8601 timestamp, e.g. 2026-06-20T00:00:00.000Z — plain wall clock time, same caveat as start (the "Z" is a format artifact, not a UTC claim). Treated as inclusive and must be after start. All timestamps returned by this API are likewise plain wall clock time, unconverted.
startYesRequired. Window start as an ISO 8601 timestamp, e.g. 2026-06-19T00:00:00.000Z. IMPORTANT: despite the trailing "Z", this is plain WALL CLOCK time, not true UTC — Glooko records only the literal date/time the patient's device showed, with no timezone attached. Use the patient's own wall-clock digits directly (no conversion): resolve "yesterday" or "last 3 weeks" straight into the matching wall-clock date and time. Treated as inclusive.
classesNoOptional filter. Array of bolus classes to include. Valid values (use these exact strings): "Meal Bolus" (carb-only dose), "Manual Correction Bolus" (user-initiated correction for a high), "System Correction Bolus" (algorithm-initiated correction), "Meal With Correction Bolus" (combined carb + correction dose). Provide one or more to combine, e.g. ["Manual Correction Bolus", "System Correction Bolus"]. Omit or leave empty to return all classes.

TDQS

A4.7/5.0
Behavior5/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, and it is unusually thorough: it discloses the 92-day cap, wall-clock versus UTC handling, the configured glucose unit, the interrupted flag semantics, override values, and the complete return record shape. It also explains the 'Z' caveat in the schema, going beyond what structured data conveys.

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 long but tightly organized into purpose, field explanation, use cases, constraints, and return contract. The final return-list paragraph is somewhat redundant with the field names already mentioned, but given the record complexity it is justified and every other sentence earns its place.

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

Completeness5/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 fully defines the return contract by listing every field in the boluses array and the top-level count and filter echo. It covers time handling, unit handling, result caps, and filtering behavior, making it complete enough to call correctly.

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

Parameters5/5

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

Although schema coverage is 100%, the description adds substantial meaning: it clarifies that start/end times are plain wall-clock device-local times despite the trailing 'Z', that end is inclusive and must be after start, and it expands each 'classes' enum value with practical meaning and combination examples. This materially improves correct invocation beyond the 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?

The description states a specific verb and resource: it retrieves every bolus in the window and explains exactly what 'enriched' means (interpolated CGM, ISF, carb ratio, target, DIA). This clearly differentiates it from the sibling tools, which address trends, glucose, basals, settings, or chart data.

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 explicitly says 'Use it to investigate insulin stacking, bolus-calculator accuracy, interrupted deliveries and user overrides,' giving clear use cases. It also advises using the 'classes' filter to keep responses small. It doesn't explicitly contrast with sibling tools or state when not to use it, but the context is strong enough for selection.

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

get_glucoseGlucose readings for a window (filterable by band)A

Individual timestamped CGM readings for a window, optionally filtered to just the part of the range you care about.

The "band" option decides which readings come back: "low" (below the low boundary, i.e. hypos), "high" (above the high boundary), "target" (in range), or "all" (every reading, each tagged with its band). Use "low"/"high" to pull only excursions for a close look without dragging in thousands of normal readings; "all" gives the full trace.

This returns raw points, so it is capped to 21 days. For a wide chart use get_chart_series (downsampled); for aggregate stats use get_diabetes_summary or get_trend rather than computing over a raw array yourself.

Glucose values are in the configured unit; times are plain wall clock time (device-local), not UTC.

Returns: window, thresholdsUsed (lower, upper, unit), the band requested, count, and a readings array (time, value, velocity, plus band when band="all").

ParametersJSON Schema
NameRequiredDescriptionDefault
endYesRequired. Window end as an ISO 8601 timestamp, e.g. 2026-06-20T00:00:00.000Z — plain wall clock time, same caveat as start (the "Z" is a format artifact, not a UTC claim). Treated as inclusive and must be after start. All timestamps returned by this API are likewise plain wall clock time, unconverted.
bandNoOptional (default: "all"). Which readings to return. "low" = below the low boundary (hypo); "high" = above the high boundary (hyper); "target" = in range, between the boundaries inclusive; "all" = every reading, each tagged with its band.all
lowerNoOptional. Low (hypo) boundary in the chosen unit; readings below it count as time-low. Omit to use the server default (OMNI_LOWER). Pass only to override for this one call, e.g. to ask about time under a different threshold.
startYesRequired. Window start as an ISO 8601 timestamp, e.g. 2026-06-19T00:00:00.000Z. IMPORTANT: despite the trailing "Z", this is plain WALL CLOCK time, not true UTC — Glooko records only the literal date/time the patient's device showed, with no timezone attached. Use the patient's own wall-clock digits directly (no conversion): resolve "yesterday" or "last 3 weeks" straight into the matching wall-clock date and time. Treated as inclusive.
unitsNoOptional. Glucose unit for this call. Omit to use the unit configured on the server (OMNI_UNITS). One of: "mmol" (mmol/L) or "mgdl" (mg/dL). Pass only to override the configured unit for this one call.
upperNoOptional. High (hyper) boundary in the chosen unit; readings above it count as time-high. Omit to use the server default (OMNI_UPPER). Pass only to override for this one call.

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations provided, the description carries the full behavioral burden, and it is unusually thorough: it discloses the 21-day cap, that times are device-local wall-clock rather than UTC, that glucose values use the configured unit, that thresholds can be overridden, and what the returned object contains. This goes well beyond a minimal read-only statement.

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?

Although the description is longer than average, every sentence earns its place: purpose, filtering semantics, use-case guidance, caveats, and return shape are each covered once and in logical order. It is front-loaded with the core purpose and avoids redundant restatements of the tool name.

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

Completeness5/5

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

There is no output schema, so the description correctly compensates by enumerating the return fields: window, thresholdsUsed, band, count, and the readings array with its per-point fields. Combined with the time-zone warning, the 21-day cap, and explicit sibling-tool routing, an agent has everything needed to invoke and interpret this tool correctly.

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 description coverage is 100%, so the input schema already documents all six parameters in detail, including enums, defaults, requirements, and the wall-clock caveat. The description usefully reinforces the band semantics and the meaning of the optional boundaries, but it does not add significant new per-parameter meaning beyond what the schema already provides.

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 opens with a precise statement: 'Individual timestamped CGM readings for a window', which names the resource, the verb, and the scope. It also distinguishes itself from siblings by clarifying that this returns raw points, while get_chart_series is downsampled and get_diabetes_summary/get_trend are aggregate tools.

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

Usage Guidelines5/5

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

The description explicitly tells the agent when to use band='low'/'high' vs 'all', and names concrete alternatives for other use cases: get_chart_series for wide charts, get_diabetes_summary or get_trend for aggregate stats. It also warns about the 21-day cap, leaving no ambiguity about when this tool is appropriate.

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

get_meal_window_analysisPost-meal target window analysisA

A focused look around a single event (typically a meal bolus): exactly 30 minutes before and 3 hours after the timestamp you pass.

Use it to judge a post-meal excursion and how well a dose worked, without pulling whole days. Find the event time first (e.g. from get_enriched_bolus_log), then pass it here.

Glucose values are in the configured unit; times are plain wall clock time (device-local), not UTC.

Returns: targetEvent (the timestamp you passed), unit, a glucoseTimeline array (time, value) across the window, and an associatedBoluses array of enriched bolus records that fall in the window.

ParametersJSON Schema
NameRequiredDescriptionDefault
unitsNoOptional. Glucose unit for this call. Omit to use the unit configured on the server (OMNI_UNITS). One of: "mmol" (mmol/L) or "mgdl" (mg/dL). Pass only to override the configured unit for this one call.
eventTimestampYesThe concrete ISO 8601 timestamp of the meal/bolus event, in plain wall clock time (device-local) — use the exact wall-clock digits, no UTC conversion. Returned times are likewise wall clock, not UTC.

TDQS

A4.3/5.0
Behavior4/5

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

With no annotations, the description carries the behavioral burden and mostly succeeds. It discloses the exact time window, states that times are wall-clock device-local and not UTC, and clarifies that glucose values follow the configured/overridden unit. It also outlines the returned fields. Minor caveat: the phrase 'configured unit' does not explicitly restate the effect of the units override, but the schema compensates.

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?

The description is tight and front-loaded: first the exact window, then the use case, then time/unit caveats, then the return shape. Every sentence earns its place without fluff or repetition.

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

Completeness5/5

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

The tool has no output schema, but the description compensates by enumerating returned fields and their semantics. It also covers the key operational details: wall-clock times, unit conventions, and how to obtain the required timestamp. Nothing essential is missing for a caller to invoke it correctly.

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 description coverage is 100%, so the schema already explains both parameters thoroughly. The description adds context about the event source and the analysis window, but it does not materially enhance the meaning of eventTimestamp or units beyond what the input schema already provides.

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 identifies the tool as a focused single-event analysis: 'exactly 30 minutes before and 3 hours after the timestamp you pass.' It distinguishes itself from broader sibling tools by saying 'without pulling whole days' and even points to a specific sibling for the prerequisite event time.

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 explicitly states when to use the tool: 'Use it to judge a post-meal excursion and how well a dose worked.' It also gives a concrete workflow by directing the user to find the event time from get_enriched_bolus_log first. It does not enumerate every alternative or exclusion, but the guidance is clear and actionable.

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

get_settings_historyPump settings historyA

Every Omnipod 5 setting change that was in effect during the window, in chronological order: DIA, max basal rate, and the time-segmented target, ISF and carb-ratio profiles.

Use it to establish which settings were active at a given time (essential before judging a bolus or an excursion), or to see how settings have been adjusted over a long span.

Glucose-based values (target, ISF) are in the configured unit. Effective timestamps are plain wall clock time (device-local), not UTC; the per-segment "from" times are pump-schedule clock-hours.

Returns: a settings array, each entry with its effective timestamp, DIA_hours, maxBasalRate, and the targetBg, isf and carbRatio profiles (each a list of {from, value} time segments).

ParametersJSON Schema
NameRequiredDescriptionDefault
endYesRequired. Window end as an ISO 8601 timestamp, e.g. 2026-06-20T00:00:00.000Z — plain wall clock time, same caveat as start (the "Z" is a format artifact, not a UTC claim). Treated as inclusive and must be after start. All timestamps returned by this API are likewise plain wall clock time, unconverted.
startYesRequired. Window start as an ISO 8601 timestamp, e.g. 2026-06-19T00:00:00.000Z. IMPORTANT: despite the trailing "Z", this is plain WALL CLOCK time, not true UTC — Glooko records only the literal date/time the patient's device showed, with no timezone attached. Use the patient's own wall-clock digits directly (no conversion): resolve "yesterday" or "last 3 weeks" straight into the matching wall-clock date and time. Treated as inclusive.

TDQS

A4.3/5.0
Behavior4/5

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

With no annotations, the description carries the full burden of behavioral disclosure and does substantial work. It flags the wall-clock-not-UTC convention, warns that the trailing 'Z' is a format artifact, clarifies per-segment times as pump-schedule clock-hours, and states glucose units. It omits auth or rate-limit details, but covers the behaviors most likely to cause misinterpretation.

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?

The description is compact and front-loaded: the first sentence states exactly what is returned, the second gives usage context, and the remaining sentences add only high-value details about time handling and output shape. Every sentence earns its place without filler.

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

Completeness5/5

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

There is no output schema, but the description compensates by explicitly describing the returned settings array, its per-entry fields, and the time-segment shape ({from, value}). Combined with the 100%-covered input schema, an agent has enough information to invoke the tool and interpret its results correctly.

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 description coverage is 100%, so the baseline applies. The schema already documents start and end as required ISO 8601 wall-clock timestamps, inclusive behavior, and the timezone caveat. The description reinforces the window concept but adds little parameter-specific meaning beyond what the schema already provides.

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 opens with a specific verb and resource: it retrieves every Omnipod 5 setting change in effect during a window, in chronological order, and enumerates exactly what is included (DIA, max basal rate, target/ISF/carb-ratio profiles). This scope is distinct from the sibling tools, which focus on glucose, trends, boluses, and device events.

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 gives concrete use cases: establishing which settings were active before judging a bolus or excursion, and reviewing how settings changed over a long span. It does not explicitly name sibling alternatives or state when not to use this tool, but the usage context is clear enough for an agent to select it appropriately.

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

get_trendBucketed trend over any timeframeA

Glucose, insulin and carb aggregates split into time buckets across a span, for "how have things changed month by month over the last year" style questions.

Each bucket is computed independently from the raw readings (not by averaging averages), so a year split by month returns 12 correct rows in a single call without pulling raw data back to you. Prefer this over making many separate summary calls for a multi-period comparison.

Insulin per bucket follows the same rule as elsewhere: bolus is summed from individual events; basal comes from Glooko's per-day totals. Each bucket also reports observedDays (the real decimal span of data in it) and a coverage percentage, so you can judge which rows to trust.

Returns: bucketCount and a buckets array. Each row has: bucket (period key), start, end, observedDays; glucose (avg, timeInRange, timeLow, timeHigh, stdDev, coefficientOfVariation, gmiEstimatedA1c, cgmReadingCount); insulin (bolusUnits, bolusUnitsPerDay, bolusEventCount, avgUnitsPerBolus, and when Glooko daily data exists basalUnits, basalDayCount, averageBasalUnitsPerDay, basalPercent, bolusPercent); carbs (carbsGrams, carbsPerDay, carbEntryCount); and coverage (cgmReadingCount, expectedReadingCount, coveragePercent, trustworthy).

ParametersJSON Schema
NameRequiredDescriptionDefault
endYesRequired. Window end as an ISO 8601 timestamp, e.g. 2026-06-20T00:00:00.000Z — plain wall clock time, same caveat as start (the "Z" is a format artifact, not a UTC claim). Treated as inclusive and must be after start. All timestamps returned by this API are likewise plain wall clock time, unconverted.
modeNoOptional (default: "calendar"). How the span is divided into buckets. "calendar" uses real calendar units (days/weeks/months/quarters) with ragged edges at the ends; "fixed" uses equal-length buckets of fixedSizeDays counting from the start date. Choose the bucket size with "granularity" (calendar) or "fixedSizeDays" (fixed).calendar
lowerNoOptional. Low (hypo) boundary in the chosen unit; readings below it count as time-low. Omit to use the server default (OMNI_LOWER). Pass only to override for this one call, e.g. to ask about time under a different threshold.
startYesRequired. Window start as an ISO 8601 timestamp, e.g. 2026-06-19T00:00:00.000Z. IMPORTANT: despite the trailing "Z", this is plain WALL CLOCK time, not true UTC — Glooko records only the literal date/time the patient's device showed, with no timezone attached. Use the patient's own wall-clock digits directly (no conversion): resolve "yesterday" or "last 3 weeks" straight into the matching wall-clock date and time. Treated as inclusive.
unitsNoOptional. Glucose unit for this call. Omit to use the unit configured on the server (OMNI_UNITS). One of: "mmol" (mmol/L) or "mgdl" (mg/dL). Pass only to override the configured unit for this one call.
upperNoOptional. High (hyper) boundary in the chosen unit; readings above it count as time-high. Omit to use the server default (OMNI_UPPER). Pass only to override for this one call.
granularityNoOptional (default: "month"). Calendar bucket size. Only used when mode is "calendar". One of: "day", "week", "month", "quarter".month
fixedSizeDaysNoOptional (default: 7). Length of each bucket in days. Only used when mode is "fixed".

TDQS

A4.7/5.0
Behavior5/5

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

With no annotations provided, the description carries the full burden, and it delivers: it explains that buckets are computed independently rather than by averaging averages, details insulin aggregation rules for bolus versus basal, and discloses observedDays/coverage percentages so the agent can judge trustworthiness. It also describes the exact return shape, which is critical given no output schema.

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?

The description is long but every section earns its place: use-case framing, computation semantics, insulin rules, trust metrics, and a complete return-field listing. It is front-loaded with the primary purpose and avoids filler or repetition.

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

Completeness5/5

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

Given the tool's complexity, 8 parameters, and no output schema, the description is unusually complete. It documents the full return structure, covers edge semantics like independence of buckets and observedDays trust metrics, and complements the schema's timezone caveats and parameter documentation. Nothing essential for correct invocation appears missing.

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%, with all parameters, defaults, enums, and units already documented in the input schema. The description adds useful context about bucket independence and returned fields, but it does not materially expand parameter-level meaning beyond what the schema already provides, so the baseline of 3 applies.

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 uses a specific verb and resource: it returns glucose, insulin, and carb aggregates split into time buckets across a span. It clearly distinguishes this from other tools by framing it as a multi-period trend comparison, and the title reinforces the bucketed trend concept.

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

Usage Guidelines5/5

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

It explicitly says to prefer this tool over making many separate summary calls for multi-period comparison. It explains the benefit — 12 correct rows in a single call without pulling raw data — which gives an agent a concrete decision rule for when this tool is appropriate.

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

TDQS

A4.6/5.0
Disambiguation5/5

Every tool targets a clearly distinct analytical purpose: overview aggregates, time-bucketed trends, circadian patterns, raw glucose, bolus-level detail, basal states, settings history, device-change markers, and chart data vs. rendered charts. Descriptions explicitly cross-reference alternatives (e.g., get_chart_series vs. get_chart_html), so an agent can reliably choose the right tool.

Naming Consistency5/5

All 12 tools follow the same `get_<domain_specific_noun>` pattern, making the surface predictable and easy to scan. Names like get_diabetes_summary, get_daily_insulin, and get_settings_history clearly indicate both the action and the data being retrieved.

Tool Count5/5

Twelve tools is a well-scoped size for a diabetes data analytics server: each tool covers a meaningful slice of the domain without redundancy or bloat. The count is comfortably within the ideal range and every tool appears justified by a distinct use case.

Completeness5/5

The set covers the core read-only query workflows end to end: high-level summaries, trends, raw CGM readings, chart rendering, bolus and basal insulin analysis, settings history, device events, and meal-window investigation. Cross-references between tools (e.g., meal analysis pointing to bolus log, chart rendering to raw glucose) leave no obvious dead ends for an agent.

Maintenance

ActivityMaintained
ResponsivenessSyncing

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

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/rilhia/podquery-mcp'

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