PodQuery
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 正在积极开发中。核心工具和数据管道已端到端可用(捆绑示例数据集背后就是我自己的真实数据),但界面、默认值和工具行为在版本之间仍可能发生变化。非常欢迎反馈和问题。
[!TIP] 对说明文档过敏?让 AI 来代劳。 🤖 将这份对话式安装提示粘贴到任何 AI 助手中,它会按照你的节奏引导你完成扩展的安装和配置。
📖 目录
Related MCP server: Diabetes:M MCP Server
🌟 什么是 PodQuery?
PodQuery 是连接你的糖尿病数据与 Claude 的桥梁。它以 MCPB(MCP Bundle)形式打包——这是 Claude Desktop 的一键式本地扩展格式——因此安装只需双击一次,无需你管理单独的服务器、容器或配置文件。无需在网站和 AI 之间复制粘贴数据,也没有 API 费用。
你只需与 Claude 对话。用日常语言提问,Claude 会通过此扩展提供的工具访问你的数据,精确提取所需内容并为你分析,全程都在对话中完成。
你可以这样问:
“我上个月的目标范围内时间怎么样?”
“为什么我晚上总是血糖偏高?”
“给我看看我最糟糕的一天,并告诉我发生了什么。”
🚀 它实际能做什么?
PodQuery 将你的糖尿病历史数据呈现为一组 Claude 可以调用的分析工具:
摘要与趋势: 目标范围内时间、GMI、变异性、最佳和最差的天与时段、基础/追加剂量平衡,覆盖你询问的任何时间段。
高保真 CGM 数据: 每 5 分钟一次的读数都会被捕获,因此不会遗漏任何峰值或低谷,但 Claude 会被引导先提取聚合数据,只有在确实需要时才获取原始读数。
现成的可视化图表: 临床报告风格的血糖图表,直接在浏览器中打开,带有可悬停的追加剂量标记和每日细分,而不仅仅是表格中的数字。
增强的追加剂量分析: 每次追加剂量都会与当时的血糖值以及当时生效的泵设置(ISF、碳水系数、目标值)进行匹配,因此 Claude 可以判断该剂量是否合理。
Omnipod 5 行为: 算法何时暂停、何时以最大速率运行、何时因失去信号而盲跑。
Claude 会在与你对话时实时调用这些工具,自行完成所有分析。
“顿悟”时刻
这个项目源于我个人的一个困扰。在尝试将我的糖尿病数据集成到 Home Assistant 仪表板时,我发现 Glooko 中存储的丰富历史数据(尤其是来自 Omnipod 5 的数据)是一座金矿。我意识到,如果我把这些数据交给 AI 助手并让它直接查询,它就能发现数月手动记录从未揭示的模式。
我为什么构建这个项目
我构建这个项目是为了把主动权交还给患者。我们通常每隔几个月才能与专科医生见面 15 分钟。这个工具让你能够:
主动出击: 在下次就诊前发现趋势。
保护隐私: 你的数据和凭据只留在你自己的机器上。
即刻使用: 一键安装,无需运行任何基础设施。
👤 适用人群
这个项目是为使用 Omnipod 5 混合闭环胰岛素输注系统并将数据同步到 Glooko 的用户构建的。如果你不是这类用户,你仍然可以使用内置的三个月的示例数据(我的数据)来探索这个项目——这条路径不需要 Omnipod 5 或 Glooko 账户。
前提条件
Claude Desktop — 从 claude.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] 想在连接自己的账户之前先试试?此扩展附带一个小的内置示例数据库,包含真实数据(三个月,我的数据),因此从安装那一刻起,你就可以完全离线探索所有功能,无需 Glooko 登录,也无需任何网络连接。
🧐 “严厉的爱” AI 人设
该工具内置了一个 AI 人设:一位**“严厉的爱”内分泌科医生**。
管理 1 型糖尿病很艰难,而安抚用户并不能改善目标范围内时间。这个人设直接、分析性强、毫不妥协。它不会粉饰数据;它会告诉你追加剂量时机哪里不对、哪里过度纠正、或者基础率在哪里未能阻止血糖漂移。它还以高效方式工作,先提取摘要,只在需要时才深入挖掘细粒度数据。
安装后,这个人设会作为名为 “Clinical auditor persona” 的可选提示出现在 Claude 的提示/附件菜单中。选择它就能把 Claude 变成那位内分泌科医生。
它的直接是一种刻意的风格,而非权威。它所说的一切都是为了帮助你理解正在发生的事情,并向你的糖尿病护理团队提出更好的问题。它不会也不应该告诉你去更改 DIA 或碳水系数等设置。任何治疗方案的变更都应由你和你的医疗专业人员共同商议。
🛠️ 安装扩展
从本仓库的 Releases 页面 下载
.mcpb文件(或自行构建——参见自行构建 .mcpb)。安装它,使用以下任一方式(效果相同):
双击下载的
.mcpb文件。将
.mcpb文件拖放到 Claude Desktop 窗口中。在 Claude Desktop 中:设置 → 扩展 → 高级设置 → 安装扩展…,然后选择
.mcpb文件。
Claude Desktop 会显示一个安装界面,列出扩展可以执行的操作以及所需的权限。查看后确认。
接下来你会进入扩展的设置界面——参见下面的配置你的设置。之后你也可以随时通过 设置 → 扩展 → PodQuery 回到这里。
就是这样——没有单独的构建步骤,没有需要启动的容器,也没有需要在终端中保持运行的东西。Claude Desktop 会按需启动扩展进程,并在不需要时将其停止。
[!NOTE] Claude Desktop 中确切的菜单措辞可能因版本而异。如果某些内容不完全匹配,请寻找最接近的等效项(设置中的“扩展”或“连接器”区域就是正确的位置)。
⚙️ 配置你的设置
Claude Desktop 会自动为此扩展生成设置表单——无需手动创建或编辑 .env 文件。大多数字段已预填合理的默认值并标记为必填,因此表单无法留空保存;你可以按原样接受默认值,立即开始使用捆绑的示例数据,也可以调整任何字段以匹配你自己的设置。只有 Glooko 邮箱和密码是可选的——两者都留空即可保持离线示例数据模式。
设置 | 作用 |
Glooko 邮箱 / Glooko 密码 | 您的 Glooko 登录信息。仅有的两个可选字段。将两者都留空即可在离线模式下使用内置的 3 个月示例数据集——无需账户,且不会联系 Glooko。填写两者即可下载并保持您自己的数据最新。密码字段会被掩码,并由 Claude Desktop 安全存储。 |
Glooko 账户的血糖单位 | 您的 Glooko 账户提供数据的单位( |
显示单位 | 您希望如何查看血糖: |
低(低血糖)边界 / 高(高血糖)边界 | 您的目标范围,使用上面的显示单位。默认为 3.9 / 10.0,这些是 mmol/L 值。每个工具默认使用这些值;您(或 Claude)仍然可以询问不同的临时阈值,而无需更改此设置。 |
首次运行时加载的历史记录 | 仅在设置了 Glooko 登录信息后使用(在示例数据模式下忽略)。默认为 |
数据文件夹 | 扩展程序保存其下载数据本地数据库的位置。默认为您的 Documents 文件夹(其中会自动创建一个小的 |
[!WARNING] 如果您将显示单位设置为
mgdl,请同时更新低/高边界。 它们默认为3.9/10.0,这些是 mmol/L 值,并且在您切换单位时不会自动转换。对于 mg/dL,等效的目标范围通常约为70/180——请根据您的护理团队为您设定的值进行调整。
使用示例数据试用(无需 Glooko 账户)
只需将 Glooko 邮箱和密码留空并保存;其余字段可以保持默认值。扩展程序会提供内置的 3 个月示例数据库(作者自己的真实数据,特意分享),并且永远不会联系 Glooko 或网络。
使用您自己的 Glooko 数据
填写您的 Glooko 邮箱和密码,将 Glooko 账户的血糖单位设置为与您的实际 Glooko 账户一致,并设置您偏好的显示单位和目标范围。之后您的第一个问题会触发一次性下载您的历史记录(根据您要求回溯的时间范围,大约几秒到一分钟);之后,数据会存储在本地,回答速度很快。
💬 使用
在 Claude Desktop 中开始聊天。
确保 PodQuery 扩展/连接器已为对话启用(Claude Desktop 会在其工具/连接器选择器中显示已安装的扩展)。
从提示菜单中选择 "Clinical auditor persona" 提示,以获得完整的"严厉的爱"式审计体验——或者直接提问;两种方式工具都能正常工作。
尽管提问。一个好的第一个问题:
"告诉我我的糖尿病数据。"
Claude 会拉取数据并给出其解读。然后您可以讨论发现、提出后续问题、深入查看某一天或某次波动,或要求生成图表——PodQuery 会在您的浏览器中直接打开一个真实的交互式血糖图表,而不是仅仅描述数字。
🔁 从示例数据切换到您自己的数据
打开 设置 → 扩展 → PodQuery。
填写您的 Glooko 邮箱和 Glooko 密码,并将其他字段设置为与您匹配(请参阅 配置您的设置)。
删除现有数据库,以免示例数据与您的数据混合:打开您配置的 数据文件夹(或其默认位置,即您的 Documents 文件夹),并删除其中的
PodQuery子文件夹。提出一个问题。扩展程序会在第一次查询时将您自己的历史记录下载到一个全新的存档中。
🛠️ 故障排除
[!NOTE] 本部分将随时间不断扩充。如果您遇到此处未涵盖的问题,请提交一个 issue,我会提供帮助。
扩展程序的工具没有出现在聊天中。 请检查 PodQuery 扩展是否已在 Claude Desktop 的工具/连接器选择器中为当前对话启用,以及它是否仍在 设置 → 扩展 中启用。
我询问某个日期,但没有得到任何结果。
如果您正在使用示例数据(Glooko 字段留空),则只有其日期范围可用。请先询问 Claude 它包含的日期范围,或者在一个非常宽的时间窗口上请求 get_diabetes_summary 并读取 reportRange。
更新扩展后,Claude 似乎仍在运行旧行为。
重新安装较新的 .mcpb(Claude Desktop 会提供就地更新);如果仍然存在过时的回答,请开始一个新的对话,以便重新读取工具描述。
扩展程序无法启动 / 显示错误。 打开 设置 → 扩展 → PodQuery,检查配置的 Glooko 凭据是否正确(或两者都留空以用于离线模式),以及配置的数据文件夹是否是 Claude Desktop 可以写入的位置。
连接我自己的账户后,血糖数字看起来不对。 请仔细检查"Glooko 账户的血糖单位"是否与您的实际 Glooko 账户设置一致,而不是您希望看到的单位(那是单独的"显示单位"字段)。此处不匹配会破坏对传入读数的解释;如果您已经在错误设置下导入了数据,请清除数据库(请参阅 从示例数据切换到您自己的数据)并让它重新正确下载。
切换到 mg/dL 后,我的低/高边界看起来不对。 当您更改显示单位时,低/高边界字段不会自动转换——请参阅 配置您的设置 中的警告。请手动更新它们以匹配您的单位。
图表没有在我的浏览器中打开。 PodQuery 会尝试在操作系统的默认浏览器中自动打开图表文件;如果失败(您的机器上没有可识别的默认浏览器命令),Claude 会改为告诉您文件路径——请手动打开它。这种情况很少见,通常只影响不常见的系统配置。
📬 联系我们
无论您是安装时遇到困难,还是想分享审计如何改善了您的目标范围内时间,我都乐意提供帮助。
技术帮助
如果某些功能无法正常工作,请 提交 Issue,这样其他人也能从解决方案中受益。
个人与专业
[!NOTE] 隐私提醒: 如果您发送截图以寻求支持,请先模糊掉任何私人医疗信息或 Glooko 凭据。
🔌 工具参考
这些是此扩展程序向 Claude 注册的 MCP 工具。您永远不会直接调用它们——Claude 会在您聊天时为您调用它们——但如果您想确切了解 Claude 能(和不能)看到什么,或者它为什么会提出某个特定的后续问题,这会很有用。
关于时间戳的说明
这些工具使用的所有时间戳都是普通的挂钟时间,格式为 ISO 8601,例如 2026-01-01T00:00:00.000Z——尽管末尾有 "Z",但这些并不是真正的 UTC。Glooko 只记录您设备在每次读数时显示的字面日期/时间,不附带时区或偏移量,因此读数会标记为您实际所在的位置。这意味着任何方向都不会发生时区转换:Claude 会将您的相对措辞("昨天"、"最近 3 周")直接解析为匹配的挂钟数字,并在结果中按原样呈现时间,不进行转换。唯一的权衡是:如果您跨时区旅行,存档中没有记录某个读数属于哪个时区,因此无法可靠地计算跨时区变化后的"几小时前"之类的内容——数据仍然是您的设备显示的内容,只是没有附加时区。
关于血糖单位的说明
大多数工具接受可选的 units、lower 和 upper 参数。如果 Claude 省略它们,则使用您在扩展程序设置中配置的值(显示单位和目标范围)。Claude 仅在单个问题中传递它们以覆盖默认值——例如,在不更改您的正常目标的情况下检查低于不同阈值的时间。
工具
工具 | 用途 |
| 任何概览类问题的最佳起点。对任意时间窗口进行固定大小的聚合计算,因此即使跨越数月或数年,开销也很小。刻意进行宽范围调用也是 Claude 发现存档完整日期范围( |
| 将一段时间跨度划分为多个时间桶(日/周/月/季度,或固定长度),并基于原始读数独立计算每个桶,一次调用即可回答“逐月变化如何”这类问题。 |
| 返回某个时间窗口内带时间戳的逐条 CGM 读数,上限为 21 天,可选择过滤为 |
| 查看图表的主要方式。 生成一张完整的临床报告风格血糖图表(按颜色区分目标范围内/低/高血糖的曲线、阴影目标带、最小/最大范围、可独立悬停查看的大剂量给药标记、顶部统计信息、图例、工具提示),保存到文件并直接在浏览器中打开。接受 |
| 将血糖数据抽稀到目标数量的绘图点,每个点带有最小/最大范围带,确保峰值不会丢失,并附带大剂量给药事件标记。返回原始图表数据而非渲染后的页面——用于 Claude 需要自行构建自定义可视化,而非使用 |
| 返回某个时间窗口内的每一次大剂量给药(上限 92 天),并附带给药时刻的插值 CGM 值以及当时生效的 ISF/碳水系数/目标/DIA,此外还包含实际给药量对比计划给药量以及计算器覆盖情况。可按大剂量给药类别进行过滤。 |
| 按时钟小时汇总某个时间窗口内的目标范围内时间和平均血糖——适用于分析黎明现象、持续性的晚间高血糖以及其他时段性规律。 |
| Omnipod 5 算法在一段时间内对基础输注的实际行为,以行为状态( |
| Glooko 自身的每日基础/大剂量/总胰岛素总量,按原样显示,用于逐日表格或每日总剂量数据。 |
| 某个时间窗口内生效的每一次 Omnipod 5 设置变更:DIA、最大基础输注率,以及按时间段划分的目标/ISF/碳水系数配置。 |
| Pod 更换和 CGM 传感器更换的时间戳——仅作为背景信息,绝不将其断言为附近血糖波动的诱因。 |
| 对某一餐食或大剂量给药事件的聚焦分析:从餐前 30 分钟到餐后 3 小时,包含该时间窗口内的血糖曲线和所有大剂量给药。 |
此外还有一个 MCP 提示词,clinical_auditor(在 Claude 的界面中显示为“临床审计员角色”)——参见“严厉的爱”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 启动的内容)。是对 analytics 的薄封装。src/analytics.js—— 核心:所有临床计算和数据整形,均以纯函数编写。src/chartHtml.js—— 渲染get_chart_html写入磁盘的自包含 HTML 页面:图表几何、颜色编码、按天分段、工具提示,以及“按时间顺序/叠加”切换,全部都在这里。src/store.js—— SQLite 存档(规范化后的行,而非 Glooko 原始数据块),由 sql.js 驱动——这是 SQLite 的纯 WebAssembly 构建。之所以刻意选择它,而不是 Node 内置的node:sqlite或better-sqlite3之类的原生插件:作为 MCPB,这个服务器可以在 macOS 或 Windows 上由 Claude Desktop 捆绑的任何 Node 运行时启动,无需构建步骤,也无法提前知道其确切版本。纯 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—— 临床审计员角色。
有几个不变量贯穿始终:葡萄糖在内部以单一规范单位(mmol/L)存储,仅在输出时转换;追加剂量(bolus)由单个事件累加,而基础剂量(basal)来自 Glooko 的每日总量;所有时间都是普通的挂钟时间,而非 UTC(参见上文“关于时间戳的说明”);每日速率使用实际观测到的数据跨度。
🏗️ 自行构建 .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,用于从打包后的 bundle 中剔除仅仓库才有的内容(文档、GitHub README 横幅、未使用的 sql.js 构建变体等)——你不需要去动它,但如果你好奇 mcpb pack 打包了什么以及为什么,值得一看。
然后按照安装扩展中的说明安装生成的 .mcpb 文件。关于 bundle 格式的工作原理,请参阅 MCPB 规范。
📄 许可证
本项目以 MIT 许可证 发布——你可以自由使用、修改和分发,包括用于商业目的,前提是保留版权声明和许可证文本。完整文本请参阅 LICENSE 文件。
MIT 许可证覆盖的是代码。随附的示例数据库是作者自己的数据,分享出来供探索之用;请在使用时多加体谅。
免责声明
本工具仅供信息和教育用途。它不是医疗设备,也不能替代专业的医疗建议、诊断或治疗。如有任何与健康状况相关的问题,请务必咨询你的医生或其他合格的医疗提供者。在借助本工具生成的任何分析(包括 AI 生成的建议)基础上,对胰岛素治疗或医疗方案做出任何更改之前,必须先由合格的临床专业人员审阅。
Available Tools
12 toolsget_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).
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | Required. 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. | |
| start | Yes | Required. 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. | |
| includeIntervals | No | Optional (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
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | Required. 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. | |
| lower | No | Optional. 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. | |
| start | No | Required. 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. | |
| units | No | Optional. 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. | |
| upper | No | Optional. 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. | |
| ranges | No | Optional. 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. | |
| embedHtml | No | Optional (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. | |
| maxPoints | No | Optional, 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. | |
| resolution | No | Optional. 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
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.
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.
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.
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.
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.
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, usinglabelas 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'slabelcentred 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.daysis empty for a single-day window (nothing to divide) and for very long windows (too many days to label individually —ticksswitches 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.
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | Required. 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. | |
| start | Yes | Required. 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. | |
| maxPoints | No | Optional (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
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | Required. 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. | |
| start | Yes | Required. 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
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | Required. 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. | |
| start | Yes | Required. 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
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | Required. 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. | |
| lower | No | Optional. 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. | |
| start | Yes | Required. 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. | |
| units | No | Optional. 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. | |
| upper | No | Optional. 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
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | Required. 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. | |
| start | Yes | Required. 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. | |
| classes | No | Optional 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
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.
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.
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.
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.
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.
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").
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | Required. 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. | |
| band | No | Optional (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 |
| lower | No | Optional. 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. | |
| start | Yes | Required. 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. | |
| units | No | Optional. 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. | |
| upper | No | Optional. 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
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.
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.
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.
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.
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.
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_hourly_trendsHourly (circadian) trendsA
Time In Range and average glucose pooled by clock-hour across the whole window, so every reading that fell in the 07:00 hour on any day is combined into one 07:00 row, and so on for all 24 hours.
Use it for "why am I always high/low at a certain time" questions, recurring circadian patterns, the dawn phenomenon and evening highs.
Hours are the device's own wall-clock hour (not UTC) — this already IS the patient's local hour at the time each reading was taken, so present it as-is with no conversion.
Returns: a byHour array of up to 24 rows, each with hour (wall clock, "HH:00"), averageBG, timeInRange, timeLow, timeHigh and the reading count for that hour. Glucose values are in the configured unit.
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | Required. 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. | |
| lower | No | Optional. 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. | |
| start | Yes | Required. 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. | |
| units | No | Optional. 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. | |
| upper | No | Optional. 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
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it delivers: it explains the pooling semantics, the critical wall-clock vs UTC nuance, that hours are presented as-is without conversion, and the exact return fields. This is unusually transparent about a subtle timezone behavior that could easily cause misuse.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured: core behavior first, then use cases, then the timezone warning, then return format. Every sentence earns its place and no information is redundant with the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 is remarkably complete. It covers what the tool computes, when to use it, the timezone interpretation, the unit convention, and the structure of the byHour result. An agent has enough to invoke it correctly without resorting to guesses.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 input schema fully documents start, end, lower, upper, and units. The description reinforces the window concept and timezone caveat already present in the schema but does not add new parameter-level information.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise definition: 'Time In Range and average glucose pooled by clock-hour across the whole window', naming both the resource and the aggregation behavior. It clearly distinguishes itself from ordinary time-series tools by emphasizing that all readings from the same wall-clock hour across days are combined into a single row.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly lists concrete use cases: 'why am I always high/low at a certain time' questions, recurring circadian patterns, dawn phenomenon, and evening highs. It does not name sibling tools or say when not to use this tool, but the 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_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.
| Name | Required | Description | Default |
|---|---|---|---|
| units | No | Optional. 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. | |
| eventTimestamp | Yes | The 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
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | Required. 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. | |
| start | Yes | Required. 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
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | Required. 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. | |
| mode | No | Optional (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 |
| lower | No | Optional. 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. | |
| start | Yes | Required. 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. | |
| units | No | Optional. 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. | |
| upper | No | Optional. 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. | |
| granularity | No | Optional (default: "month"). Calendar bucket size. Only used when mode is "calendar". One of: "day", "week", "month", "quarter". | month |
| fixedSizeDays | No | Optional (default: 7). Length of each bucket in days. Only used when mode is "fixed". |
TDQS
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.
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.
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.
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.
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.
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
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.
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.
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.
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
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
WHOOP recovery, strain, sleep and workouts in Claude via official WHOOP OAuth. Free, open source.
Garmin data in Claude & ChatGPT via the Garmin Health API. OAuth sign-in, no password sharing.
Connect Claude to Fathom meeting recordings, transcripts, and summaries
63 tools for Apple Health, Fitbit, Oura & Health Connect data in Claude, ChatGPT, Grok & Mistral.
Related MCP Servers
- AlicenseAqualityAmaintenanceEnables access to FreeStyle Libre glucose data through Claude Desktop, providing current readings, historical data, statistics, and trend analysis from LibreLinkUp accounts with secure credential storage.101MIT
- AlicenseAqualityAmaintenanceIntegrates Diabetes:M data with Claude Desktop to access glucose readings, insulin data, food diary, and health metrics through natural language conversations.11MIT
- FlicenseNot gradedqualityDmaintenanceEnables reading real-time continuous glucose monitor data from Dexcom sensors via the Share API, allowing Claude to access glucose levels, trends, and statistics.
- AlicenseAqualityBmaintenanceEnables Claude to access Abbott Freestyle Libre CGM data from multiple providers (LibreView, Terra, Thryve) to retrieve current glucose, history, and summaries via natural language.42MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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