SuperGlookoQuery
SuperGlookoQuery
Talk to Claude Desktop about your Glooko diabetes data, whatever pump or CGM combination you're actually running.
Not medical advice. This is for understanding your own data and preparing sharper questions for your care team. It is not a medical device, and nothing it says should change your therapy on its own. Full text in the disclaimer at the bottom.
This started as a fork of Richard Hall's PodQuery (MIT licensed), which was built around one specific setup: an Omnipod 5 syncing to Glooko. Credit to Richard for the original MCPB packaging and clinical-analysis core. What's different here: the ingestion layer no longer assumes a fixed set of fields belonging to one device. It looks at what your own account's data actually contains and builds its tool list from that. See How device support actually works below for the mechanics.
Early days (v0.1.0). Built and tested end to end against one real setup so far: a Ypsomed YpsoPump running CamAPS FX as the AID app, paired with a Libre 3+ CGM. Other combinations grow in as real accounts contribute data, not by guessing at fields nobody's verified.
Contents
Related MCP server: Diabetes:M MCP Server
What this actually does
SuperGlookoQuery connects to your Glooko diabetes data and hands Claude a set of analytical tools, not a raw data dump. Install the extension, ask a question in plain language, and Claude reaches into your history to answer it, live, in the conversation.
People ask things like:
"How was my time in range last month?"
"Why do I keep going high in the evenings?"
"Show me my worst day and tell me what happened."
That means, under the hood:
Summaries on demand. Time in range, GMI, variability, best/worst days and hours, basal/bolus split, over whatever window you ask about.
Full-resolution CGM data kept locally. Every 5-minute reading is archived so nothing's missed, though Claude is steered toward aggregates first and only pulls raw readings when a question genuinely needs them.
A real chart, not a description of one. A clinical-report-style glucose chart opens directly in your browser: colour-coded ranges, hoverable bolus markers, a day-by-day breakdown.
Bolus context, not just numbers. Each bolus is matched against the ISF, carb ratio, and target active at the time, including split or extended deliveries where a pump reports them, so Claude can actually judge whether a dose made sense.
Basal behaviour as states. Suspended, running at max, or blind after a lost signal, rather than raw delivery units.
Device-specific extras, only when earned. Something like CamAPS FX's own operating-mode breakdown appears once your account's data has actually produced that field, not before.
You never call any of this directly. Claude does it mid-conversation, as many small calls as the question actually needs.
How device support actually works
Glooko doesn't publish a field-level schema, and different pump/CGM pairings send back genuinely different shapes of data. The original PodQuery handled this by hardcoding one device's fields, which made sense given it was built around its own author's Omnipod 5. This fork takes a different approach:
Nothing gets thrown away. Every field Glooko sends is kept, not just the ones a tool currently reads. Anything not yet mapped to a typed column lands in an
extraoverflow column instead of being discarded.Tools are earned, not assumed. A device-specific tool, like the CamAPS pump-mode breakdown, only registers once your own account's data has shown the field it needs at least once. There's no config file to hand-edit and no tool silently misbehaving on hardware it was never written for.
You can contribute your own device's shape, from inside the chat. Ask Claude to review your data for the schema registry, or call
get_registry_contribution_reportyourself. It builds a report of which fields your account populates and how often, with every real value already swapped for a fixed, fabricated placeholder before you ever see it. You review it, then type the confirmation phrase it gives you yourself (this is deliberately not something Claude can do on your behalf), andsubmit_registry_contributionruns an independent second privacy scan plus a content-integrity check before opening a pull request against this project'sschema-registry/folder. Your actual data never leaves your machine at any point in this. Anode src/submit-registry-entry.jsCLI also exists for local development, but it needs a terminal a real Claude Desktop install doesn't have, so the in-chat tools above are the real path for an actual user.
This is genuinely a work in progress: tested end to end against one real account so far. See docs/DESIGN.md for the full architecture, docs/PROMOTION.md for how a discovered field graduates from the overflow column into a proper typed one, and schema-registry/README.md if you'd like to contribute your own device's data.
Who this is for
Anyone syncing pump or CGM data to Glooko. Realistic expectations first: this has been built and tested end to end against one Ypsomed YpsoPump running CamAPS FX, paired with a Libre 3+ CGM. Other pump/CGM combinations gain real support as real accounts contribute discovery reports (see above), not because this README is claiming coverage it hasn't earned. No Glooko account at all? You can still explore using the bundled, entirely synthetic sample data.
What you need
Claude Desktop, free from claude.ai/download. This only runs inside Claude Desktop, macOS or Windows. It's not a standalone server and doesn't work with Claude on web or mobile.
A Glooko account with a device synced to it, if you want to analyse your own data. Not required for the sample dataset.
That's the whole list. No Docker, no separate Node install, no terminal.
Privacy, in plain terms
This handles real medical credentials and real health data, so it's built local-first, on purpose:
No middle server. Your Glooko email and password go straight from this extension to Glooko's own servers. Nothing in between, and nothing Anthropic ever sees.
Everything runs on your machine. The extension process, the local database, and every analysis tool live entirely inside Claude Desktop, on your computer.
Credentials aren't stored in plain text. They sit in Claude Desktop's own secure settings storage; the password field is marked sensitive at the config level.
Schema-registry contributions carry no real values. Every example in a discovery report is a fixed, fabricated placeholder, and the whole flow goes through a mandatory human review, a typed confirmation, and an independent second privacy scan before anything is ever written anywhere.
You're talking to a cloud AI about this data. Most providers let you turn off chat history or model training somewhere in their settings. Worth doing before you get into anything clinical, so your medical history isn't retained anywhere it doesn't need to be.
Want to try it before connecting a real account? The extension ships with a small built-in sample database, entirely fabricated rather than sampled from anyone's real data, so you can explore everything offline: no Glooko login, no network access at all.
The clinical auditor persona
The extension ships a selectable prompt, "Clinical auditor persona," that turns Claude into a direct, no-nonsense reviewer of your own control data.
Managing type 1 diabetes is hard enough without an assistant that softens every finding to keep things pleasant. This persona doesn't do that. It'll say plainly where your bolus timing looks off, where you're over-correcting, or where basal isn't catching an overnight drift, and it's built to reach for summaries first rather than wading through raw readings when it doesn't need to.
The directness is a style choice, not a claim of medical authority. Everything it says exists to help you understand your own data and walk into your next appointment with better questions, not to tell you what to change. It won't hand you a specific new DIA or carb ratio to try. That decision belongs to you and your healthcare professional, always.
Installing it
Grab the
.mcpbfile from this repo's Releases page, if one's been published yet, or build it yourself (see Building the .mcpb yourself).Install it any of these ways, they're equivalent:
Double-click the downloaded
.mcpbfile.Drag it into the Claude Desktop window.
In Claude Desktop: Settings → Extensions → Advanced settings → Install Extension…, then pick the file.
Claude Desktop shows what the extension can do and what permissions it wants. Review it, then confirm.
You'll land on the extension's settings screen next, see Configuring it below. You can always get back here from Settings → Extensions → SuperGlookoQuery.
No separate build step, no container to start, nothing to keep running in a terminal yourself. Claude Desktop starts the process when it's needed and stops it when it isn't.
Claude Desktop's exact menu wording shifts between versions. If something doesn't match exactly, look for the nearest equivalent under Settings.
Configuring it
Claude Desktop builds the settings form for this extension automatically; there's no .env file to create or hand-edit. Most fields arrive pre-filled with sensible defaults and marked required, so the form saves fine as-is against the bundled sample data, or you can adjust anything to match your own setup. The Glooko email and password are the only optional pair; leave both blank to stay in offline sample-data mode.
Setting | What it does |
Glooko email / Glooko password | Your Glooko login. Leave both blank to run offline against the built-in synthetic sample data; no account needed, and Glooko is never contacted. Fill both in to download and keep your own data current. The password field is masked and stored securely by Claude Desktop. |
Glooko account's glucose unit | The unit your Glooko account itself reports in ( |
Display unit | How you want to see glucose: |
Low (hypo) boundary / High (hyper) boundary | Your target range, in whatever display unit you picked. Defaults to |
History to load on first run | Only used once a Glooko login is set (ignored in sample-data mode). Defaults to 3 months back. Set it to however far back you actually have device data, or however far you want visibility into; that's how far the first sync reaches. |
Data folder | Where the local archive lives. Defaults to your Documents folder, with a small |
Switching Display unit to mgdl? Update the Low/High boundaries too. They default to 3.9 / 10.0, both mmol/L values, and don't auto-convert when you change units. The rough mg/dL equivalent is 70 / 180, but use whatever your own care team actually set for you.
Trying the sample data first
Leave the Glooko email and password blank, save, and leave everything else on its defaults. The extension serves its built-in synthetic dataset and never touches the network.
Connecting your own Glooko account
Fill in your Glooko email and password, set the account glucose unit to match your real Glooko setup, then pick your display unit and target range. The first question you ask afterward triggers a one-time history download (seconds to about a minute, depending on how far back you set it), and everything after that reads from the local archive.
Using it
Start a chat in Claude Desktop.
Confirm the SuperGlookoQuery extension is enabled for the conversation, in Claude Desktop's tools/connector picker.
Pick "Clinical auditor persona" from the prompt menu for the full audit experience, or just ask a question directly; the tools work either way.
Ask something. A decent opener:
"Tell me about my diabetes data."
Claude pulls what it needs and gives its read on it. Keep going from there: ask follow-ups, drill into a single day, or ask for a chart. SuperGlookoQuery opens a real, interactive glucose chart directly in your browser rather than describing numbers at you.
Moving from sample data to your own
Started on the sample data and ready to connect a real account?
Open Settings → Extensions → SuperGlookoQuery.
Fill in your Glooko email and Glooko password, and set the rest to match your own setup (see Configuring it).
Clear the existing database first, so sample data doesn't mix with yours: open the Data folder you've configured (your Documents folder by default) and delete the
PodQuerysubfolder inside it.Ask a question. A fresh archive downloads your own history on that first call.
Troubleshooting
This section grows over time. Hit something not covered here? Open an issue.
The extension's tools aren't showing up in a chat. Check it's enabled for the current conversation in Claude Desktop's tools/connector picker, and still enabled under Settings → Extensions.
Asked about a date and got nothing back.
On the sample data (Glooko fields left blank), only its fixed date range exists. Ask Claude what range it holds, or call get_diabetes_summary over a very wide window and read reportRange off the result.
Claude seems to be running old behaviour after an update.
Reinstall the newer .mcpb (Claude Desktop offers to update in place). If something still looks stale, start a fresh conversation so tool descriptions get re-read.
The extension won't start, or shows an error. Check Settings → Extensions → SuperGlookoQuery: are the Glooko credentials correct (or both blank for offline mode), and is the configured Data folder somewhere Claude Desktop can actually write?
Glucose numbers look wrong after connecting my own account. Check "Glooko account's glucose unit" matches your real Glooko account, not the unit you'd prefer to see (that's the separate Display unit field). Getting this wrong corrupts how incoming readings get interpreted. If data's already been ingested under the wrong setting, clear the database (see Moving from sample data to your own) and let it redownload.
Low/High boundaries look wrong after switching to mg/dL. They don't auto-convert when you change Display unit, see the warning under Configuring it. Update them by hand.
A chart didn't open in my browser. SuperGlookoQuery tries to open it automatically in your OS's default browser. If that fails (no recognised default-browser command on your system), Claude tells you the file path instead; open it yourself. Rare, and usually only on unusual system setups.
A device-specific tool I expected, like CamAPS pump-mode, isn't showing up. These only appear once your account's data has actually produced the field they depend on, see How device support actually works. If your device genuinely reports this and it's still missing after a full sync, open an issue.
Get in touch
Something not working? Open an issue so the fix is there for the next person too.
Before attaching a screenshot for support: blur out anything private, medical details or Glooko credentials.
Tool reference
These are the MCP tools this extension registers. You never call them directly, Claude does, mid-conversation, but this is here if you want to know exactly what Claude can (and can't) see, or why it asked a particular follow-up.
A note on timestamps
Every timestamp these tools use is plain wall-clock time, formatted as ISO 8601 (e.g. 2026-01-01T00:00:00.000Z). Despite the trailing "Z", these aren't true UTC instants. Glooko only records the literal date and time your device displayed at the moment of a reading, with no timezone attached, so a reading carries whatever the clock said wherever you physically were. Practically, this means no timezone conversion happens anywhere: Claude turns your relative phrasing ("yesterday", "last 3 weeks") straight into matching wall-clock digits, and presents results exactly as returned. The tradeoff: cross a time zone and the archive has no record of which one a given reading belongs to, so there's no reliable way to compute an elapsed "how long ago" across that boundary. The data is still exactly what your device showed; it's just not zone-stamped.
A note on glucose units
Most tools take optional units, lower, and upper parameters. Left out, Claude falls back to whatever you configured (display unit, target range). It only overrides them for a single question, say, checking time under a different threshold without touching your normal target.
Always-available tools
Tool | Purpose |
| Start here for almost any overview question. Cheap fixed-size aggregates over any span, months or years included. A deliberately wide call is also how Claude works out the full range your archive holds ( |
| Buckets a span into periods (day/week/month/quarter, or a fixed length) and computes each independently, for "how has this changed month by month" style questions in one call. |
| Individual timestamped CGM readings, capped to 21 days, filterable to |
| The main way to actually see a chart. Builds a clinical-report-style glucose chart (colour-coded ranges, shaded target band, min/max spread, hoverable bolus markers, header stats, legend, tooltips), saves it, and opens it straight in your browser. Takes a |
| Downsampled glucose points for plotting, with a min/max band so spikes survive, plus bolus markers. Raw data rather than a rendered page, for when Claude needs to build its own visualisation instead of using the ready-made chart. |
| Every bolus in a window (capped to 92 days), matched with the interpolated glucose at delivery and the ISF/carb-ratio/target/DIA active then, plus delivered-vs-programmed and calculator overrides. Filterable by bolus class. |
| Every split (extended/dual-wave) bolus in a window, one with a genuine extended-delivery portion, plus aggregate stats (split rate, average initial-delivery percent) across the window's whole bolus population. No split boluses in a window is a normal result, not an error. |
| Time in range and average glucose pooled by clock hour across a window. Useful for dawn phenomenon, recurring evening highs, that kind of time-of-day pattern. |
| What the pump's algorithm was doing with basal over time, as behavioural states ( |
| Glooko's own per-day basal/bolus/total figures, shown as-is, for a day-by-day table or total-daily-dose numbers. |
| Every pump setting change in force during a window: DIA, max basal rate, and the time-segmented target/ISF/carb-ratio profiles. |
| Pod/site change and CGM sensor change timestamps, context only, never treated as the cause of nearby glucose swings. Whether Glooko reports these at all depends on the device; confirmed empty for a CamAPS FX + Ypso Pump account. |
| Zooms into one meal or bolus event: 30 minutes before to 3 hours after, with the glucose trace and any boluses inside that window. |
Capability-gated tools (only appear once your account's data supports them)
Tool | Purpose |
| How much of a window CamAPS FX spent in each of its own operating modes (automatic/manual/easeOff/boost/liberty/attempting). Registers only for an account whose data has actually shown this field, see How device support actually works. Unlike everything else above, this is a live call to Glooko every time (a per-window aggregate Glooko computes on request, not something this project archives), so expect it to be slower, and occasionally to hit a transient network error. |
Schema-registry contribution tools (a two-step, human-confirmed flow)
Tool | Purpose |
| Step 1: builds the privacy-guardrailed discovery report for your device(s), see How device support actually works. No real values, only field names, types, and populated-rates. Returns a |
| Step 2: only runs after you've reviewed step 1 yourself and typed its exact confirmation phrase; Claude can't supply that on your behalf. Runs an independent privacy scan and a content-integrity check, writes to |
There's also one MCP prompt: clinical_auditor ("Clinical auditor persona" in the Claude UI), see The clinical auditor persona.
How the code is laid out
(For anyone reading the source. If you just want to use the tool, skip this.)
Data flows in this order: Glooko → sync → store → range → analytics → tools → Claude.
manifest.json: the MCPB manifest: what Claude Desktop reads to install the extension, what settings it asks for, and how it launchessrc/server.js.src/env.js: sanitizes theuser_config-derived environment variables Claude Desktop injects, before anything else reads them. Must stay the first import inserver.js; see its own header comment for the specific Claude Desktop quirk this works around.src/server.js: the MCP server and the tool definitions, what Claude Desktop actually launches over stdio. Thin wrappers around the analytics. Also where capability-gated modules register, after the transport connects.src/analytics.js: the actual clinical maths and data shaping, written as pure functions with no imports of its own, kept deliberately dependency-free for testability.src/chartHtml.js: renders the self-contained HTML pageget_chart_htmlwrites to disk: chart geometry, colour-coding, day segmentation, tooltips, the Chronological/Overlay toggle all live here.src/store.js: the SQLite archive (typed core columns plus a JSONextraoverflow for anything not yet mapped, see How device support actually works), backed by sql.js, a pure WebAssembly build of SQLite chosen so this runs identically on whatever Node runtime Claude Desktop happens to bundle, with no build step. The tradeoff: sql.js is in-memory only, sostore.jsre-serialises the archive to disk itself after each write batch, rather than leaning on SQLite's own file-backed journal.src/discover.js: builds the privacy-guardrailed discovery report: which fields your account's data populates and how often, every real value already swapped for a fixed synthetic placeholder before it's ever returned.src/submit-registry-entry.js: the full submission sequence: show the report in full, require a typed confirmation, run an independent second privacy scan (deliberately not trustingdiscover.js's own redaction logic), a content-integrity hash check, and, ifghis installed and authenticated, opening a PR toschema-registry/.runChatDrivenSubmission()is the versionserver.js's two MCP tools actually call; the human confirmation step happens in the chat itself, so it adds a staleness check the CLI'smain()never needed.src/paths.js: resolves where the archive lives (your configured Data folder, defaulting to Documents) and seeds the bundled sample database into place on a fresh, offline install.src/range.js: the layer the tools actually call; answers from the local archive and tops up from Glooko only when needed. Offline mode is gated here.src/sync.js: the engine pulling Glooko data into the archive: cold start, top-up, startup warm-up.src/glooko.js: the Glooko API client itself, auth and fetching.src/prompt.js: the clinical-auditor persona text.schema-registry/: the contributed catalog of what fields real accounts have shown, split by device component (pumps/,cgms/), see its own README.scripts/generate-sample-data.mjs: regenerates the bundled sample database from entirely synthetic, seeded-random data. Never a real account's data.test/: the automated test suite, see Running the tests.docs/DESIGN.md/docs/PROMOTION.md/docs/TODO.md: the architecture spec, the process for graduating a discovered field into a typed column, and the running roadmap, roughly in order of how deep you want to go.docs/MANUAL_TEST_PLAN.md: the fresh-install/cold-start checklist to run before cutting a release.npm testcovers unit-level logic; this covers everything that only shows up against a genuinely empty starting state or a real Claude Desktop install.
A few invariants hold everywhere: glucose is stored internally in one canonical unit (mmol/L) and only converted on output; bolus is summed from individual events while basal comes from Glooko's own daily totals; every timestamp is plain wall-clock time, never UTC (see the timestamps note above); and per-day rates use the actual observed span of data, not an assumed calendar day.
Building the .mcpb yourself
Not needed to use the extension if a released .mcpb already exists, see Installing it. This is for anyone building from source, auditing the code first, or making changes.
git clone https://github.com/sikcapri/superglookoquery.git
cd superglookoquery
npm install --omit=dev # runtime dependencies only, including sql.js
npm install -g @anthropic-ai/mcpb
mcpb pack # produces superglookoquery.mcpb hereThe repo also ships an .mcpbignore that trims repo-only content (docs, unused sql.js build variants, that sort of thing) from the packed bundle. You shouldn't need to touch it, but it's worth a glance if you're curious what mcpb pack includes and why.
Install the resulting .mcpb file as described under Installing it. See the MCPB specification for how the bundle format itself works.
Running the tests
npm install
npm testRuns the automated suite through Node's own built-in test runner (node --test), no extra test framework needed. Covers the ingestion/schema logic, the discovery report's threshold and redaction behaviour (the area most deserving of scrutiny, since a bug there is a privacy incident, not just a bug), the schema-registry submission gating sequence, and the capability-gated module system. See test/ for the individual files, and docs/TODO.md's Phase 3 section for what's covered and what's still open.
License
Released under the MIT License: free to use, modify, and distribute, commercially included, provided the copyright notice and licence text stay attached. Full text in LICENSE. Forked from Richard Hall's podquery-mcp (also MIT licensed).
The MIT licence covers the code. The bundled sample database is entirely synthetic (fabricated, seeded-random data, see scripts/generate-sample-data.mjs), not sampled from any real account.
Disclaimer
This tool is for informational and educational purposes only. It is not a medical device and is not a substitute for professional medical advice, diagnosis, or treatment. Always talk to your physician or another qualified health provider about any question regarding a medical condition. Any analysis this tool produces, including anything Claude says, needs review by a qualified clinical professional before it changes your insulin therapy or wider medical regimen in any way.
Available Tools
15 toolsget_basal_deliveryBasal delivery state timelineARead-only
What the pump's automated-delivery algorithm 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).
DEVICE COVERAGE: this reads an Omnipod-5-specific Glooko data series. Confirmed empty (never populated) for a CamAPS FX account, likely the same for other non-Omnipod pumps — an empty result means this view genuinely isn't available for that device, NOT that basal ran normally throughout; never present the absence of data as a normal reading. For a CamAPS FX account, get_camaps_pump_mode_breakdown's automatic/manual/ easeOff/boost/liberty/attempting percentages are the nearest available picture of algorithm behaviour, though not a like-for-like replacement for this state timeline.
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?
Beyond the readOnlyHint annotation, the description discloses substantial behavioral context: state meanings, device-specific data availability, the empty-result caveat, plain wall-clock time semantics, a capped span due to collapsed intervals, and the exact shape of the return value. This goes well beyond what annotations provide and contains no contradiction.
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 paragraph earns its place: core definition, device coverage, key distinction from insulin amounts, use cases, time semantics, and return shape. It is front-loaded with the central concept and uses structure and emphasis to keep important caveats scannable. No redundant 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?
Given that there is no output schema, the description thoroughly compensates by explaining exactly what will be returned: per-state minutes/percentages and an intervals array with state, start, end, and minutes. It also covers crucial edge cases such as empty results for unsupported devices, the non-UTC time caveat, and the difference between states and units. Nothing essential is missing for correct invocation.
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 start, end, and includeIntervals in detail. The description reinforces the wall-clock caveat and mention of includeIntervals, but it does not add significant parameter-level meaning beyond what the schema provides. 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 clearly states the tool's purpose with a specific subject ('the pump's automated-delivery algorithm'), resource ('basal over time'), and a precise set of states (normal, suspend, max, limited). It also explicitly differentiates itself from get_daily_insulin by clarifying these are states, not insulin amounts, leaving no ambiguity about what the tool does.
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 provides explicit use cases ('investigate lows', 'rebound patterns', 'how hard the system is working', 'whether excursions coincided with limited mode'), a direct alternative for basal units ('use get_daily_insulin'), and warns against treating empty results as normal for non-Omnipod devices. This is strong when-to-use and when-not-to-use guidance.
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?
Beyond the minimal annotations (readOnlyHint=false, destructiveHint=false), the description discloses file creation, browser opening, downsampling behavior with a `downsample` object, the fallback `html` field, and the critical instruction not to reproduce the chart in the response. It also clarifies the wall-clock time caveat and return fields. No contradiction exists between description and annotations.
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 well-structured and front-loaded: the core purpose and differentiation appear first, followed by multi-day behavior, data resolution, and response handling. Each section is functional, though some redundancy with schema descriptions exists (e.g., resolution details are repeated). Still, it is not padded—every section addresses a real agent decision point.
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?
Despite no output schema, the description enumerates the return fields (ranges, dayCount, unit, pointCount, bolusCount, filePath, openAttempted, downsample, html) and explains their conditions. It also covers edge cases: falling back when browser open fails, how to handle downsampling, and the policy about not emitting the chart as an artifact. An agent has everything needed to call the tool correctly and respond appropriately.
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 has 100% description coverage with detailed parameter explanations (including wall-clock caveat, resolution semantics, and ranges usage). The tool description reinforces these but does not add new parameter-level meaning beyond the schema. This is the expected baseline for a fully self-documenting 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 opens with a specific verb and resource: 'Generates a clinical-report-style glucose chart... saves it to a file, and opens it directly in the patient's default web browser.' It also explicitly differentiates from get_chart_series with 'USE THIS instead of get_chart_series whenever the patient wants to SEE a chart,' making its scope unambiguous.
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 guidance: 'USE THIS instead of get_chart_series' for visual charts, and explains when to use `ranges` versus start/end, and when to offer `resolution` choices. It also defines the fallback scenario for `openAttempted: false`, so an agent knows exactly how to route behavior.
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 plottingARead-only
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?
Annotations only indicate readOnlyHint: true现实,但 description 补充了关键行为细节: returns data not a picture, gives specific rendering instructions, warns against typical auto-chart pitfalls, explains time axis handling with ready-made xAxis object, and clarifies time and unit conventions. This goes far beyond the annotation, giving the agent implementation-level transparency.
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 lengthy, with many paragraphs dedicated to x-axis handling and rendering instructions, which are highly relevant but could be condensed. However, it is well-structured with clear headers (X-AXIS, HOW TO RENDER IT) that front-load critical information. While every sentence earns its place given the tool's complexity, the verbosity may reduce readability. It's not overly concise but is efficiently organized.
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, with no output schema, the description comprehensively covers what is returned (unit, points, events, xAxis), how to interpret each field, and how to render them correctly. It addresses common mistakes (index axis), provides alternative use cases, and specifies time/unit conventions. Nothing essential is missing for an agent to call and use 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% for all three parameters, including detailed descriptions for start/end emphasizing wall-clock time and maxPoints with default/range. The description adds context on usage (e.g., maxPoints 200-400 is ample) and reinforces time semantics, though the schema already covers most meaning. It provides value beyond the schema by clarifying how parameters affect output granularity and cost.
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 states the verb 'get' and the resource 'chart series', specifying it returns downsampled glucose data with min/max bands and bolus markers for charting. It explicitly differentiates from sibling tools like get_glucose and get_chart_html, noting it returns data, not a picture, and is for plotting graphs versus numeric 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?
The description explicitly tells when to use this tool: whenever the patient wants a graph or chart of glucose over a window, or for illustrating 'what a good/bad day looked like'. It contrasts with get_glucose, reserving that for close-up numeric inspection. It also instructs to render the data as a chart and avoid built-in shortcuts that misplot the x-axis, providing clear behavioral guidance.
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)ARead-only
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?
Annotations declare readOnlyHint=true, and the description adds meaningful behavioral context: the most recent day may be flagged provisional if still today and not finalised, and all dates are wall-clock (device-local) days. It also clarifies that the bolus figure is pre-aggregated by Glooko, which is a behavioral nuance beyond the annotation. It does not describe pagination or error behavior, but for a read-only data retrieval tool this is solid.
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 well-structured: a one-sentence summary, a usage paragraph, a provisional-data note, and a return-shape paragraph. Every sentence earns its place, and the most important scoping information is front-loaded. It is detailed but not bloated.
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 read-only tool with two fully documented parameters and no output schema, the description covers the return shape, the source, the provisional flag, and the wall-clock semantics. It also addresses the key distinction from sibling tools. Nothing an agent needs to call it correctly 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 coverage is 100%, so the schema already documents both parameters thoroughly. The description adds value by explaining the wall-clock semantics and the 'Z' format artifact, which is critical for correct usage. It also clarifies that timestamps returned are likewise wall-clock. This goes beyond the schema's own caveats and reinforces the key semantic trap.
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 returns Glooko's own per-day insulin totals (basal, bolus, combined total) plus a window aggregate. It clearly distinguishes itself from sibling tools by noting that bolus here is Glooko's pre-aggregated daily figure, while other tools use event-level aggregation. This is a precise, non-tautological definition.
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 says when to use this tool: when you want device-reported daily totals, e.g., a day-by-day basal/bolus table or total daily dose per day. It also names alternatives (get_diabetes_summary, get_trend) for event-aggregated bolus, and notes that basal is only available from Glooko, so this tool and those share the same basal source. This is strong routing guidance.
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 changesARead-only
Pod/site changes (e.g. the Omnipod is replaced roughly every 3 days) and CGM sensor changes, as timestamped events, kept as two separate lists.
DEVICE COVERAGE: whether Glooko reports these events at all depends on the device — confirmed empty (never populated, over a full 30-day check) for a CamAPS FX + Ypso Pump account. Both counts being zero can mean this device combination doesn't report site/sensor changes to Glooko in a way this project can see, not that no changes happened — never assert the latter from an empty result.
These are point-in-time markers, not amounts. They are most useful as CONTEXT for nearby glucose disruption: a fresh pod/site 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?
The annotations declare readOnlyHint=true, and the description aligns with that while adding substantial behavioral context: device-specific coverage limitations, confirmed-empty results for CamAPS FX + Ypso Pump, wall-clock rather than UTC time semantics, and the caution that empty results do not mean no changes occurred.
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 well-structured with labeled sections and every sentence earns its place. It front-loads the core purpose, then adds coverage caveats, usage guidance, time semantics, and return shape without redundancy.
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 moderate complexity, absent output schema, and read-only annotations, the description covers what the tool returns, how timestamps are represented, device coverage limitations, and how to interpret results. An agent has enough context 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 description coverage is 100%, and the input schema already thoroughly documents both start and end parameters, including the wall-clock caveat and inclusivity. The tool description reinforces these points but does not add significant parameter semantics 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 clearly identifies the tool as returning pod/site changes and CGM sensor changes as timestamped events in two separate lists. The resource and output shape are specific and distinguish this from the sibling glucose, insulin, and trend 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 gives strong context for when to use this tool: to check whether unexplained glucose disruption aligns with a recent pod/sensor change, and explicitly warns against asserting causation. It does not name alternative sibling tools, but the use case is clearly delineated.
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 windowARead-only
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?
Beyond the readOnlyHint annotation, the description discloses important behaviors: fixed-size aggregates regardless of window length, uncapped cheap calls, wall-clock time semantics, explicit ranking tie-breakers, and the basal/bolus calculation rule. This is substantial and consistent with annotations.
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 purpose and usage guidance, followed by a useful tip and a detailed returns section. It is longer than average, but the density is justified by the tool's rich output; each section 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?
There is no output schema, so the description carries the full burden of explaining return values. It enumerates all result groups (reportRange, glucoseControl, glucoseExtremes, bestWorst, insulin, bolusArchitecture, carbs, settings) and clarifies timezone, ranking, and metric semantics. This is complete for a complex summary tool.
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 has 100% coverage with detailed descriptions for all five parameters, including the wall-clock caveat and unit override behavior. The description reinforces these semantics but does not add significant new parameter-level meaning 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/resource and explicitly positions the tool as 'the single best starting point for any overview question'. It also clarifies scope ('no matter how long the span') and distinguishes it from more granular siblings like get_trend or get_daily_insulin.
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 clear usage guidance: use for overview questions, and use a deliberately wide call as an orientation step before drilling into a specific period. It does not name sibling tools explicitly, but the when-to-use instruction is strong enough to guide an agent.
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 logARead-only
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?
Beyond the readOnlyHint annotation, the description discloses critical behavioral details: time is plain wall clock (not UTC), glucose values are in configured units, the 92-day cap, and the meaning of delivered vs programmed (interruption flag). It also outlines the response structure and setting context. This transparency is exceptional and far exceeds what annotations alone provide.
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 lengthy but well-organized, front-loading the core purpose then progressively detailing usage, constraints, and return object. Every sentence adds substantive information without redundancy. While it could be tightened, the structure is logical and aids comprehension, earning a 4 rather than a 5 for its verbosity.
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 (3 parameters, 2 required, rich return object) and the absence of an output schema, the description is highly complete. It explicitly enumerates the return fields, explains the interruption flag, override semantics, and the settings context object, and covers constraints like the 92-day cap and time-zone handling. Nothing an agent needs to call it correctly 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 provides detailed descriptions for all three parameters, including time-zone caveats and valid class enum values. The description adds extra strategic value by recommending the classes filter to 'keep the response small,' which enriches usage semantics beyond the schema. With 100% schema coverage, this goes above the baseline of 3.
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 purpose: return every bolus in the window, enriched with contextual data (CGM, settings, overrides) to judge dose correctness. It clearly distinguishes itself from siblings by emphasizing enrichment and analysis use cases, making it easy for an agent to select this tool over alternatives like get_split_bolus_log or get_daily_insulin.
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 use-case guidance: 'Use it to investigate insulin stacking, bolus-calculator accuracy, interrupted deliveries and user overrides.' It also advises on the classes filter to keep responses small. However, it does not explicitly mention when NOT to use it or contrast it with sibling tools, which would make the guidance fully complete.
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)ARead-only
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?
Beyond the readOnlyHint annotation, the description discloses critical runtime behavior: the 21-day cap on raw points, the plain wall-clock time semantics (explicitly not UTC), and that values follow the configured unit. It also previews the return shape, which is especially valuable given there is 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 longer than average but well structured: a one-line summary, then the band selector explanation, then usage boundaries and caveats, then the return format. Every section adds operational value, though a small amount of repetition with the schema's parameter descriptions keeps it from a perfect score.
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 tool with no output schemathor, the description provides a complete mental model: what the tool returns, the cap, timezone handling, unit behavior, and how it relates to sibling tools. An agent has enough information to call it correctly and interpret the response.
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 has 100% parameter description coverage, so the baseline is 3. The description does reinforce the meaning of 'band' and explains the value of filtering, but it largely restates what the schema already documents rather than adding new parameter-level semantics.
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: 'Individual timestamped CGM readings for a window', clearly identifying the resource and the operation. It further distinguishes itself from sibling tools by noting it returns raw points rather than downsampled chart series or aggregate statistics.
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 usage direction: use 'low'/'high' to pull only excursions without thousands of normal readings, and 'all' for the full trace. It also names concrete alternatives—get_chart_series for wide charts)Skip until get_diabetes_summary or get_trend for aggregates—so an agent knows exactly when to choose another tool.
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) trendsARead-only
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?
Beyond the readOnlyHint annotation, the description discloses a non-obvious behavioral trait: hours are the device's wall-clock hour, not UTC, and must be presented as-is with no conversion. It also explains how data is pooled across the window and what fields the returned rows contain. This adds real value over the annotation.
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?
Every sentence earns its place: core aggregation method, usage scenarios, the critical UTC/wall-clock warning, and the return shape. The structure is front-loaded and there is no filler or redundancy.
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 appropriately lists the output row shape (byHour array, fields, wall-clock 'HH:00') and unit semantics. It is missing details such as whether hours without readings are omitted or zero-filled and the exact scale/data types of timeInRange, timeLow, and timeHigh, which may be needed for correct interpretation.
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%, and the schema already documents all five parameters with detailed caveats (ISO format, wall-clock quirk, overrides). The description only reiterates that glucose values are in the configured unit, which the schema already covers, so the baseline 3 is correct.
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 does: it pools Time In Range and average glucose by clock-hour across the whole window, with a concrete example ('every reading that fell in the 07:00 hour on any day is combined into one 07:00 row'). This is a specific verb/resource/aggregation, clearly distinct from raw glucose retrieval or generic trend 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 gives explicit when-to-use guidance: circadian questions, recurring high/low-at-certain-time patterns, dawn phenomenon, and evening highs. These are concrete use cases, but it does not explicitly say when not to use the tool or name alternatives (e.g., get_trend, get_glucose), so it stops at 4.
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 analysisARead-only
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?
Annotations already declare readOnlyHint=true, so safety is known. The description goes beyond by clarifying time is device-local wall clock (not UTC), glucose units follow configuration or override, and returning specific arrays (glucoseTimeline, associatedBoluses). This adds useful behavioral context without contradicting annotations.
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 well-structured: scope first, then usage, then conventions, then return shape. Every sentence earns its place, with no fluff or repetition. It is detailed but efficient.
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 explicitly lists the return fields (targetEvent, unit, glucoseTimeline, associatedBoluses), satisfying return expectations. The two parameters are fully explained in schema. For a focused read-only analysis tool, 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?
Schema coverage is 100% – both eventTimestamp and units already have detailed descriptions covering wall-clock time, optional override, and unit enums. The description adds some usage context (how to find the event time) but does not materially extend parameter semantics beyond what the schema provides, so 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 a specific verb/resource: a focused analysis window around a single meal bolus event, exactly 30 minutes before and 3 hours after the timestamp. It clearly distinguishes itself from 'pulling whole days' and relates to the sibling get_enriched_bolus_log for finding the event, making its purpose unmistakable.
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 when to use it ('judge a post-meal excursion and how well a dose worked') and even gives a prerequisite workflow: find the event time via get_enriched_bolus_log, then pass it here. This is strong usage guidance that differentiates it from day-level or historical tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_registry_contribution_reportPreview a schema registry contribution (step 1 of 2)ARead-only
Builds the privacy-guardrailed discovery report for this account's device(s) — step 1 of contributing to the public schema registry. Contains NO real values from the account: every example is a fixed, fabricated placeholder (see docs/DESIGN.md section 2b); only field names, types, and how often each is populated are real.
CRITICAL — how to use this: show the patient the FULL entries array verbatim (every field, every example, exactly as returned — never summarise, paraphrase, or omit any of it) and the disclaimer text, then ask them to type the exact confirmation phrase in requiredPhrase if and ONLY if they have personally reviewed it and confirm it contains nothing sensitive. Do NOT proceed to submit_registry_contribution on the patient's behalf without them actually typing that phrase themselves — a paraphrase, a "yes", or your own judgement that it looks fine are not acceptable substitutes for this gate. When they do confirm, call submit_registry_contribution with confirmationPhrase set to EXACTLY what they typed and reportHash set to EXACTLY this call's own reportHash value.
Returns: generatedAt, disclaimer, requiredPhrase (the exact string the patient must type), entries (one per device component: component, deviceName, slug, discoveredAt, windowDaysActual, lowConfidence, fields), and reportHash (an opaque integrity token for the next call — not meant to be shown to the patient).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description reveals critical behavior: it contains NO real values, only fabricated placeholders, and reportHash is an opaque integrity token not meant for the patient. It also openly describes the confirmation gate and warns against substituting judgment. No contradiction with annotations exists.
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 privacy guarantee and then the critical usage gate, and it is well structured with a return summary. It is longer than average due to safety-critical repetition, but nearly every sentence earns its place. A small amount of redundancy could be trimmed without losing meaning.
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 parameters, no output schema, and only a readOnly annotation, the description carries the full burden of explaining the tool. It completely specifies the returned fields, their semantics, how to use them in the follow-up call, and the confirmation requirement. An agent has everything needed to call it correctly and safely.
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 tool has zero parameters, so there are no parameter semantics to clarify. The description appropriately explains the outputs that matter for the next call, including requiredPhrase and reportHash. This matches the 0-parameter baseline of 4.
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 states the tool builds a discovery report and is step 1 of 2 for contributing to the schema registry. It explicitly differentiates itself from submit_registry_contribution and from the many read-only data retrieval siblings. The verb 'Builds' plus the resource and step context make the purpose unambiguous.
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 provides an explicit, detailed usage flow: show the full entries verbatim, obtain the patient's exact typed phrase, then call submit_registry_contribution with confirmationPhrase and reportHash. It also states what not to do, such as proceeding on a paraphrase or 'yes', and names the next sibling to call. This is exceptionally clear guidance.
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 historyARead-only
Every pump 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?
Beyond the readOnlyHint annotation, the description discloses important behavioral caveats: effective timestamps are device-local wall-clock time rather than true UTC, per-segment 'from' times are pump-schedule clock-hours, glucose values use the configured unit, and results are chronological. It also spells out the return shape, which is especially valuable because no output schema is provided.
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 definition, followed by use-case context, critical caveats, and a clear return summary. Every sentence carries necessary information and there is no filler or redundant restatement of the title.
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 fully describing the returned settings array and its nested profile segments. Combined with the input schema, the timezone caveats, and the readOnlyHint annotation, an agent has everything needed to invoke the tool correctly and interpret its results.
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 fully documents the start and end parameters, including the wall-clock caveat and inclusivity. The description reinforces the timezone concept but does not add substantial new parameter-level meaning beyond the schema, so the baseline of 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 the exact verb and resource: retrieve pump setting changes effective during a time window, in chronological order, including DIA, max basal rate, and time-segmented target/ISF/carb-ratio profiles. It clearly differentiates this from sibling tools by focusing on settings history and active-at-a-time semantics.
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 context for when to use it: establish which settings were active at a given time before judging a bolus or excursion, or inspect how settings changed over a long span. It does not name exclusions or specific sibling alternatives, but the usage context is clear enough to route an agent correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_split_bolus_logSplit/extended bolus log and statsARead-only
Every SPLIT (extended/dual-wave) bolus in the window — one with a real extended-delivery portion, not a normal single-shot dose — plus aggregate stats over the whole bolus population for the same window.
Each logged bolus carries initialDeliveryPercent and extendedDeliveryPercent (Glooko reports the split directly as a percent pair, e.g. 60/40), and durationString, Glooko's own raw formatted text for the extended portion's duration (e.g. "2h") — passed through as-is, not parsed, since no confirmed format spec exists for it across devices.
Use it to see whether/how often splitting is actually used, and whether the split ratio correlates with post-meal control (pair with get_meal_window_analysis on individual events).
Capped to 92 days per call. Times are plain wall clock time (device-local), not UTC.
Returns: window, stats (totalBoluses, splitCount, splitRatePercent, avgInitialDeliveryPercent — all null/0 for a window with no split boluses, which is a normal result for an automated closed-loop user, not an error), and a boluses array of the split events themselves.
| 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?
Annotations only declare readOnlyHint=true, but the description adds critical behavioral context: the 92-day cap, wall-clock vs UTC time handling, the pass-through of durationString without parsing, and the interpretation of null/0 stats as a normal result for closed-loop users (not an error). This significantly enriches beyond the annotation.
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?
Well-structured: opens with the purpose, then details the data shape, moves to use cases, and finishes with caps and return format. Each sentence adds value; no redundancy. Though slightly long, the complexity of the tool justifies it.
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?
No output schema exists, so the description fully compensates by enumerating the exact return fields (window, stats, boluses) with sub-fields and their null/0 behavior. It also explains durationString. The description gives everything an agent needs to correctly interpret results and decide on invocation.
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% — both start and end parameters have thorough descriptions including timezone caveats and inclusivity semantics. The tool description adds no extra parameter-level information; it's all covered in the schema. Thus, 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 states a specific resource (split/extended bolus log) with explicit scope (only boluses with an extended-delivery portion, excluding normal single-shot doses) and differentiates it from a general bolus log. It directly addresses the sibling get_enriched_bolus_log by clarifying what makes this tool unique.
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?
Provides explicit use cases: 'see whether/how often splitting is actually used' and 'whether the split ratio correlates with post-meal control' with a concrete pairing recommendation (get_meal_window_analysis). Also imposes a hard cap of 92 days, informing agent decisions on window size.
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 timeframeARead-only
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?
Beyond the readOnlyHint=true annotation, the description discloses that each bucket is computed independently from raw readings ('not by averaging averages'), explains the insulin aggregation rules (bolus summed from events, basal from Glooko's per-day totals), and details the observedDays and coverage percentage for trust assessment. This provides substantial behavioral context that is not captured by the annotation.
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 purpose, then the computation method, and finally the return structure. It is longer than typical but appropriate given the tool's complexity (8 parameters, intricate aggregation logic). Each sentence adds value, and there is no redundancy or 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?
Given the lack of an output schema, the description thoroughly enumerates the return structure, including conditional fields (basalUnits only when Glooko daily data exists) and trust metrics. It also explains edge cases like 'when Glooko daily data exists' and the wall-clock time convention. An agent has all necessary information to invoke and interpret 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?
The input schema has 100% coverage, so parameters are already documented. The description adds interpretive value by explaining how mode affects bucket division (calendar vs. fixed), how insulin rules apply 'same as elsewhere,' and the meaning of the returned aggregates. It does not restate schema descriptions but enriches the conceptual understanding of parameter effects.
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 states the tool computes glucose, insulin, and carb aggregates split into time buckets for period-over-period questions. It explicitly names the resource (aggregates), the action (trend over any timeframe), and the context ('how have things changed month by month over the last year'). It also differentiates from summary calls by emphasizing single-call multi-bucket retrieval.
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 guidance to 'Prefer this over making many separate summary calls for a multi-period comparison,' which clearly indicates when this tool should be used. It does not mention specific sibling tools or when not to use it, but the alternative suggestion and the uniqueness of the bucketed approach are adequate 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.
submit_registry_contributionConfirm and submit a schema registry contribution (step 2 of 2)ADestructive
Step 2: after the patient has reviewed get_registry_contribution_report's output IN FULL and typed its exact confirmation phrase themselves, call this with that phrase and the report's reportHash to actually write and submit the contribution. Runs the full gating sequence: exact-match phrase check, an INDEPENDENT second privacy scan (does not trust discover.js's own redaction — re-checks against a hard allowlist), a content-integrity hash check (refuses if the archive changed since the report was reviewed — re-call get_registry_contribution_report and re-confirm if this happens), then writes to schema-registry/ and opens a PR via the GitHub CLI if it is installed and authenticated.
If gh is not available, or nothing needs submitting, or the PR step fails, files are still written and hash-verified locally — nothing is ever lost, and this is reported clearly rather than silently.
| Name | Required | Description | Default |
|---|---|---|---|
| reportHash | Yes | The `reportHash` value from the get_registry_contribution_report call the patient actually reviewed, passed through verbatim. | |
| confirmationPhrase | Yes | EXACTLY what the patient themselves typed in response to the required phrase from get_registry_contribution_report — not your own paraphrase or judgement call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as destructive (destructiveHint=true) and not read-only. The description goes far beyond that by detailing the full gating sequence: exact-match phrase check, independent second privacy scan, content-integrity hash check, writing to schema-registry/, and the fallback behavior when `gh` is missing or PR fails, including local verification and clear reporting. It also clarifies that it does not trust earlier redaction, adding significant behavioral context beyond the annotation.
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 lengthy, every sentence adds necessary detail about the gating sequence, fallback, and error handling. It's front-loaded with the step and prerequisite, and the structure is logical (prerequisite → action → checks → outcome). No filler or redundancy; the length is justified by the tool's complexity.
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 description is highly complete for a complex destructive tool: it covers inputs, prerequisites, detailed behavioral checks, and failure scenarios. The only gap is that it doesn't describe the return value or response format, and there's no output schema to compensate. For a submission tool, an agent might need to know what it returns (e.g., PR URL, status), but the description's thoroughness elsewhere makes this a minor omission.
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 for both parameters is 100%, and the schema descriptions already state exactly what each parameter must be (verbatim reportHash and the patient's own typed phrase). The tool description reiterates that requirement but doesn't add new meaning beyond the schema. Thus, a baseline score of 3 is appropriate per the rubric.
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 states the tool's purpose: it's step 2 of a two-step process to submit a schema registry contribution, explicitly naming the exact inputs (confirmation phrase and reportHash) and the action (write and submit). It distinguishes itself from the get_registry_contribution_report sibling by framing it as the follow-up step.
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 clearly defines when to call this tool: after the patient has reviewed the report IN FULL and typed the exact confirmation phrase. It also conditions the call on having the reportHash and phrase. While it doesn't explicitly state when NOT to call, the prerequisites are unambiguous, and there are no alternative submit tools among siblings, so the context is clear. A slight bump to 5 would require explicit exclusions or alternatives, which aren't present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
15 tool updates
v0.1.0- First observed
get_basal_delivery - First observed
get_chart_html - First observed
get_chart_series - First observed
get_daily_insulin - First observed
get_device_events - First observed
get_diabetes_summary - First observed
get_enriched_bolus_log - First observed
get_glucose - First observed
get_hourly_trends - First observed
get_meal_window_analysis - First observed
get_registry_contribution_report - First observed
get_settings_history - First observed
get_split_bolus_log - First observed
get_trend - First observed
submit_registry_contribution
TDQS
Scored across 15 tools
Every tool targets a distinct resource or aggregation level: summary, daily totals, individual bolus, split bolus, hourly trends, settings history, time buckets, chart data, chart rendering, basal states, device events, raw glucose, meal windows, and the two-step registry contribution workflow. When overlap is possible (chart_series vs chart_html, summary vs trend), the descriptions explicitly disambiguate them.
All tools follow a consistent verb_noun snake_case pattern (get_* for queries, submit_* for the single write action). The names clearly communicate the resource and granularity, making the set predictable and easy to navigate.
15 tools is at the upper end of the typical range, but each one covers a genuinely separate analytical need for diabetes data, with no redundancy. The count feels well-scoped for the breadth of queries supported.
The surface is remarkably complete for a read-only diabetes data domain: glucose (raw, downsampled, charted), insulin (daily, bolus, basal states), settings history, device events, meal analysis, and a full contribution workflow. There are no obvious dead ends or missing operations for the stated purpose.
Maintenance
Related MCP Connectors
- NightscoutOAuthai.b77
Your Nightscout glucose data, conversational.
WHOOP recovery, strain, sleep and workouts in Claude via official WHOOP OAuth. Free, open source.
Garmin data in Claude: 135 tools — activities, sleep, HRV, training, workouts. Free, open source.
- SomviaOAuthapp.somvia
Private Apple Health metrics and workout detail for ChatGPT, Claude, and any MCP client.
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
- AlicenseNot gradedqualityCmaintenanceA Model Context Protocol (MCP) server that connects Claude to your personal Dexcom CGM (Continuous Glucose Monitor) for assistive diabetes management intelligence.MIT
- 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