PodQuery
PodQuery — Claude Desktop용 임상 감사 도구
Glooko / Omnipod 5 당뇨 데이터를 Claude에 직접 연결하고 분석을 맡기세요.
[!IMPORTANT] 의학적 조언이 아닙니다. 이 도구는 데이터를 이해하고 당뇨 관리팀에 더 나은 질문을 하도록 돕기 위한 것입니다. 의료 기기가 아니며 치료를 변경하는 데 사용해서는 절대 안 됩니다. 전체 면책 조항을 참조하세요.
[!NOTE] MCPB(MCP Bundle) 에디션으로, Claude Desktop 전용으로 제작되었습니다. 이 프로젝트의 이전 Docker 기반 버전(Open WebUI 및 원시 웹 API도 지원)을 한 번의 클릭으로 설치할 수 있는 단일
.mcpb파일로 대체합니다. Docker도, 터미널도, 수동으로 구성 파일을 편집할 필요도 없습니다. 대신 다중 플랫폼 Docker 버전이 필요하다면 원본 웹 앱 또는 이 저장소의 이전 태그를 참조하세요.
[!NOTE] 초기 개념 증명(v0.2.1). PodQuery는 활발히 개발 중입니다. 핵심 도구와 데이터 파이프라인은 종단 간 작동하지만(번들 샘플 세트 뒤에는 제 실제 데이터입니다), 인터페이스, 기본값 및 도구 동작은 릴리스 간에 변경될 수 있습니다. 피드백과 이슈 제기를 환영합니다.
[!TIP] 설명서가 싫으신가요? AI가 대신 안내하게 하세요. 🤖 이 대화형 설정 프롬프트를 아무 AI 어시스턴트에 붙여넣으면 원하는 속도로 확장 프로그램 설치와 구성을 안내해 줍니다.
📖 목차
Related MCP server: Diabetes:M MCP Server
🌟 PodQuery란 무엇인가요?
PodQuery는 당뇨 데이터와 Claude 사이의 다리 역할을 합니다. MCPB(MCP Bundle) — Claude Desktop의 원클릭 로컬 확장 프로그램 형식 — 로 패키징되므로 설치는 한 번의 더블 클릭으로 끝나고, 별도로 관리할 서버, 컨테이너 또는 구성 파일이 없습니다. 웹사이트와 AI 사이에서 데이터를 복사하고 붙여넣을 필요도 없고 API 비용도 없습니다.
Claude와 대화만 하면 됩니다. 일상적인 언어로 질문하면 Claude가 이 확장 프로그램이 제공하는 도구를 통해 데이터에 접근하여 필요한 것을 정확히 가져와 대화 안에서 분석해 줍니다.
다음과 같은 질문을 할 수 있습니다:
"지난달 목표 범위 내 시간은 어땠나요?"
"왜 저녁마다 혈당이 계속 높아질까요?"
"최악의 하루를 보여주고 무슨 일이 있었는지 알려주세요."
🚀 실제로 무엇을 하나요?
PodQuery는 당뇨 기록을 Claude가 호출할 수 있는 일련의 분석 도구로 제공합니다:
요약 및 추세: 목표 범위 내 시간, GMI, 변동성, 최고/최악의 날과 시간, 기저/볼루스 균형 등 질문한 기간에 대해 제공합니다.
고충실도 CGM 데이터: 5분 간격의 모든 측정값이 캡처되어 급등이나 급락을 놓치지 않지만, Claude는 먼저 집계 데이터를 가져오고 정말 필요할 때만 원시 측정값을 가져오도록 안내됩니다.
즉시 사용 가능한 시각적 차트: 임상 보고서 스타일의 혈당 차트를 브라우저에서 직접 열 수 있으며, 호버 가능한 볼루스 마커와 일별 분석을 제공합니다. 표의 숫자만이 아닙니다.
강화된 볼루스 분석: 각 볼루스는 당시의 혈당과 활성화되어 있던 펌프 설정(ISF, 탄수화물 비율, 목표치)과 매칭되므로 Claude가 용량이 적절했는지 판단할 수 있습니다.
Omnipod 5 동작: 알고리즘이 언제 일시 중지했는지, 최대로 작동했는지, 신호 손실 후 맹목적으로 작동했는지 알 수 있습니다.
Claude는 대화 중에 이러한 도구를 호출하여 이 모든 작업을 실시간으로 스스로 수행합니다.
"Aha!"의 순간
이 프로젝트는 개인적인 답답함에서 시작되었습니다. 당뇨 데이터를 Home Assistant 대시보드에 통합하려고 시도하던 중, Glooko(특히 Omnipod 5에서)에 저장된 방대한 과거 데이터가 금광이라는 것을 발견했습니다. 그 데이터를 AI 어시스턴트에 주고 직접 쿼리하게 하면 수개월간의 수동 기록으로는 결코 보여주지 못했을 패턴을 찾아낼 수 있다는 것을 깨달았습니다.
이것을 만든 이유
환자의 손에 권한을 되돌려주기 위해 이것을 만들었습니다. 우리는 몇 달에 한 번씩 전문의와 15분밖에 시간을 갖지 못하는 경우가 많습니다. 이 도구를 사용하면 다음을 할 수 있습니다:
능동적으로 대처: 다음 진료 전에 추세를 파악하세요.
비공개 유지: 데이터와 자격 증명은 자신의 기기에만 남습니다.
즉시 사용: 설치 한 번 클릭, 실행할 인프라 없음.
👤 대상 사용자
이 프로젝트는 Omnipod 5 하이브리드 폐루프 인슐린 전달 시스템을 사용하고 데이터를 Glooko에 동기화하는 사람들을 위해 제작되었습니다. 해당되지 않더라도 3개월 분량의 내장 샘플 데이터(제 데이터)로 프로젝트를 탐색할 수 있습니다. 이 경로에는 Omnipod 5나 Glooko 계정이 필요 없습니다.
사전 요구 사항
Claude Desktop — claude.ai/download에서 무료로 다운로드할 수 있습니다. 이 확장 프로그램은 Claude Desktop(macOS 또는 Windows) 내에서만 실행됩니다. 독립 실행형 서버가 아니며 웹이나 모바일의 Claude에서는 작동하지 않습니다.
자신의 데이터를 분석하려면: Omnipod 5와 동기화된 Glooko 계정이 필요합니다. 샘플 데이터셋으로 도구를 사용해 보는 데는 필요하지 않습니다.
그 외에는 아무것도 필요 없습니다. Docker도, Node.js 설치도, 터미널도 필요 없습니다.
🔒 개인정보 및 보안: 내 데이터, 내 통제
민감한 의료 자격 증명과 데이터를 다루기 때문에 "로컬 우선" 아키텍처로 설계되었습니다.
중개자 없음: Glooko 사용자 이름과 비밀번호는 기기를 떠나지 않습니다. 이 확장 프로그램에서 Glooko 서버로 직접 전송됩니다. 어떤 제3자 서버도, Anthropic도 이를 볼 수 없습니다.
컴퓨터에서 실행: 확장 프로그램 프로세스, 로컬 데이터베이스, 분석 도구가 모두 Claude Desktop 내부, 전적으로 내 기기에서 실행됩니다.
자격 증명은 Claude Desktop 자체의 보안 설정 저장소에 저장됩니다(확장 프로그램 구성에서 비밀번호 필드는 민감 정보로 표시됨). 일반 텍스트 파일이 아닙니다.
[!IMPORTANT] 이 데이터에 대해 Claude(클라우드 AI)와 대화하기 때문에 대부분의 제공업체에는 대화를 "학습"에 사용할 수 있는 설정이 있습니다. 임상 데이터를 논의하기 전에 Claude의 개인정보 설정에서 채팅 기록/모델 학습을 끄는 것을 고려하여 의료 기록을 비공개로 유지하세요.
[!TIP] 자신의 계정을 연결하기 전에 먼저 사용해 보고 싶으신가요? 이 확장 프로그램에는 실제 데이터(3개월 분량, 제 데이터)로 구성된 작은 내장 샘플 데이터베이스가 포함되어 있어 설치하는 순간부터 Glooko 로그인이나 네트워크 접속 없이도 모든 것을 오프라인으로 탐색할 수 있습니다.
🧐 "Tough Love" AI 페르소나
이 도구에는 내장 AI 페르소나인 "Tough Love" 내분비내과 의사가 포함되어 있습니다.
1형 당뇨를 관리하는 것은 어렵고, 사용자를 달래는 것은 목표 범위 내 시간(Time in Range)을 개선하지 않습니다. 이 페르소나는 직설적이고 분석적이며 타협하지 않습니다. 데이터를 미화하지 않습니다. 볼루스 타이밍이 어긋난 곳, 과교정하고 있는 곳, 기저 인슐린이 변동을 잡지 못하는 곳을 알려줍니다. 또한 효율적으로 작동하도록 설계되어 먼저 요약을 가져오고 필요할 때만 세부 데이터를 파고듭니다.
설치 후 이 페르소나는 Claude의 프롬프트/첨부 파일 메뉴에서 "Clinical auditor persona" 라는 선택 가능한 프롬프트로 제공됩니다. 이를 선택하면 Claude가 내분비내과 의사로 변신합니다.
그 직설성은 의도된 스타일이지 권위가 아닙니다. 페르소나가 말하는 모든 것은 상황을 이해하고 당뇨 관리팀에 더 나은 질문을 하도록 돕기 위한 것입니다. DIA나 탄수화물 비율 같은 설정을 변경하라고 말하지 않으며, 말해서도 안 됩니다. 치료 변경은 사용자와 의료 전문가가 상의할 문제입니다.
🛠️ 확장 프로그램 설치
이 저장소의 Releases 페이지에서
.mcpb파일을 다운로드합니다(또는 직접 빌드 — 직접 .mcpb 빌드하기 참조).다음 중 하나를 사용하여 설치합니다(모두 동일한 방법입니다):
다운로드한
.mcpb파일을 더블 클릭합니다..mcpb파일을 Claude Desktop 창에 끌어다 놓습니다.Claude Desktop에서: Settings → Extensions → Advanced settings → Install Extension… 을 선택한 다음
.mcpb파일을 선택합니다.
Claude Desktop에 확장 프로그램이 할 수 있는 작업과 필요한 권한을 나열하는 설치 화면이 표시됩니다. 검토한 후 확인합니다.
다음으로 확장 프로그램의 설정 화면이 표시됩니다 — 아래의 설정 구성을 참조하세요. 나중에 Settings → Extensions → PodQuery에서 언제든지 다시 돌아올 수 있습니다.
그게 전부입니다 — 별도의 빌드 단계도, 시작할 컨테이너도, 터미널에서 계속 실행할 것도 없습니다. Claude Desktop은 필요할 때 확장 프로그램 프로세스를 시작하고 필요하지 않으면 중지합니다.
[!NOTE] Claude Desktop의 정확한 메뉴 표기는 버전에 따라 변경될 수 있습니다. 정확히 일치하지 않으면 가장 유사한 항목을 찾으세요(어느 쪽이든 Settings의 "Extensions" 또는 "Connectors" 영역이 올바른 위치입니다).
⚙️ 설정 구성
Claude Desktop은 이 확장 프로그램의 설정 양식을 자동으로 생성합니다 — 직접 만들거나 편집할 .env 파일이 없습니다. 대부분의 필드는 합리적인 기본값으로 미리 채워져 필수로 표시되므로 양식을 비워 둔 채 저장할 수 없습니다. 기본값을 그대로 수락하고 번들 샘플 데이터로 즉시 확장 프로그램을 사용하거나, 자신의 설정에 맞게 조정할 수 있습니다. Glooko 이메일과 비밀번호만 선택 사항입니다 — 둘 다 비워 두면 오프라인 샘플 데이터 모드로 유지됩니다.
설정 | 설명 |
Glooko 이메일 / Glooko 비밀번호 | Glooko 로그인 정보입니다. 유일한 선택 입력 필드 두 개입니다. 둘 다 비워 두면 내장된 3개월 샘플 데이터셋으로 오프라인 모드에서 실행됩니다 — 계정이 필요 없으며 Glooko에 연결되지 않습니다. 둘 다 입력하면 자신의 데이터를 다운로드하여 최신 상태로 유지할 수 있습니다. 비밀번호 필드는 마스킹되며 Claude Desktop이 안전하게 저장합니다. |
Glooko 계정의 혈당 단위 | Glooko 계정이 데이터를 제공하는 단위입니다 ( |
표시 단위 | 혈당을 표시하는 방식을 선택합니다: |
저(저혈당) 경계 / 고(고혈당) 경계 | 위의 표시 단위로 된 목표 범위입니다. 기본값은 3.9 / 10.0이며, 이는 mmol/L 값입니다. 모든 도구는 기본적으로 이 값을 사용합니다. 이 설정을 변경하지 않고도 사용자(또는 Claude)가 다른 일회성 임계값을 요청할 수 있습니다. |
첫 실행 시 불러올 기록 | Glooko 로그인이 설정된 경우에만 사용됩니다(샘플 데이터 모드에서는 무시됨). 기본값은 |
데이터 폴더 | 확장 프로그램이 다운로드한 데이터의 로컬 데이터베이스를 보관하는 위치입니다. 기본값은 내 문서(Documents) 폴더입니다(그 안에 작은 |
[!WARNING] 표시 단위를
mgdl로 설정한 경우 저/고 경계도 함께 업데이트하세요. 기본값은3.9/10.0이며, 이는 mmol/L 값입니다. 단위를 전환해도 자동으로 변환되지 않습니다. mg/dL의 경우 해당 목표 범위는 일반적으로70/180정도입니다 — 담당 의료진이 설정한 값에 맞게 조정하세요.
샘플 데이터로 사용해 보기 (Glooko 계정 없이)
Glooko 이메일과 비밀번호를 비워 두고 저장하기만 하면 됩니다. 나머지 필드는 기본값으로 두면 됩니다. 확장 프로그램은 내장된 3개월 샘플 데이터베이스(작성자 자신의 실제 데이터를 의도적으로 공유한 것)를 제공하며 Glooko나 네트워크에 절대 연결하지 않습니다.
자신의 Glooko 데이터 사용하기
Glooko 이메일과 비밀번호를 입력하고, Glooko 계정의 혈당 단위를 실제 Glooko 계정과 일치하도록 설정한 다음, 원하는 표시 단위와 목표 범위를 설정하세요. 이후 첫 질문은 기록을 일회성으로 다운로드합니다(요청한 과거 기간에 따라 몇 초에서 약 1분 정도 소요). 그 후에는 데이터가 로컬에 저장되어 답변이 빠릅니다.
💬 사용하기
Claude Desktop에서 채팅을 시작합니다.
대화에 PodQuery 확장 프로그램/커넥터가 활성화되어 있는지 확인합니다(Claude Desktop은 설치된 확장 프로그램을 도구/커넥터 선택기에 표시합니다).
프롬프트 메뉴에서 "Clinical auditor persona" 프롬프트를 선택하면 완전한 직설적인 감사 경험을 얻을 수 있습니다 — 또는 바로 질문해도 됩니다. 도구는 어느 쪽이든 작동합니다.
질문하세요. 좋은 첫 질문은:
"내 당뇨 데이터에 대해 알려줘."
Claude가 데이터를 가져와 해석을 제공합니다. 그런 다음 결과에 대해 논의하고, 후속 질문을 하고, 특정 날짜나 일탈(고/저혈당)을 자세히 살펴보거나, 차트를 요청할 수 있습니다 — PodQuery는 숫자만 설명하는 대신 실제 대화형 혈당 차트를 브라우저에서 직접 엽니다.
🔁 샘플 데이터에서 자신의 데이터로 전환하기
샘플 데이터로 시작했는데 이제 실제 Glooko 계정을 연결하려면:
설정 → 확장 프로그램 → PodQuery를 엽니다.
Glooko 이메일과 Glooko 비밀번호를 입력하고, 다른 필드도 사용자에 맞게 설정합니다(설정 구성 참조).
샘플 데이터가 사용자 데이터와 섞이지 않도록 기존 데이터베이스를 삭제합니다: 구성한 데이터 폴더(또는 기본값인 내 문서 폴더)를 열고 그 안의
PodQuery하위 폴더를 삭제하세요.질문하세요. 확장 프로그램은 첫 번째 질문 시 사용자의 기록을 새 아카이브로 다운로드합니다.
🛠️ 문제 해결
[!NOTE] 이 섹션은 시간이 지나면서 계속 추가될 예정입니다. 여기에 없는 문제가 발생하면 이슈를 열어 주세요. 도와드리겠습니다.
확장 프로그램의 도구가 채팅에 표시되지 않습니다. Claude Desktop의 도구/커넥터 선택기에서 현재 대화에 PodQuery 확장 프로그램이 활성화되어 있는지, 그리고 설정 → 확장 프로그램에서 여전히 활성화되어 있는지 확인하세요.
특정 날짜에 대해 물어봤는데 결과가 없습니다.
샘플 데이터(Glooko 필드를 비워 둔 상태)로 실행 중이라면 해당 데이터의 날짜 범위만 사용할 수 있습니다. 먼저 Claude에게 데이터가 보유한 날짜 범위를 물어보거나, 매우 넓은 기간으로 get_diabetes_summary를 요청하고 reportRange를 읽어보세요.
확장 프로그램을 업데이트한 후 Claude가 이전 동작을 하는 것 같습니다.
최신 .mcpb를 다시 설치하세요(Claude Desktop이 제자리 업데이트를 제안합니다). 오래된 답변이 계속되면 새 대화를 시작하여 도구 설명을 다시 읽어들이게 하세요.
확장 프로그램이 시작되지 않거나 오류가 표시됩니다. 설정 → 확장 프로그램 → PodQuery를 열고 구성된 Glooko 자격 증명이 올바른지(또는 오프라인 모드에서는 둘 다 비어 있는지), 그리고 구성된 데이터 폴더가 Claude Desktop이 쓸 수 있는 위치인지 확인하세요.
자신의 계정을 연결한 후 혈당 수치가 이상해 보입니다. "Glooko 계정의 혈당 단위"가 실제 Glooko 계정에 설정된 값과 일치하는지 다시 확인하세요. 보고 싶은 값(그것은 별도의 "표시 단위" 필드입니다)이 아니라요. 여기서 불일치가 발생하면 들어오는 수치가 잘못 해석됩니다. 이미 잘못된 설정으로 데이터를 가져온 경우 데이터베이스를 지우고(샘플 데이터에서 자신의 데이터로 전환) 올바르게 다시 다운로드하세요.
mg/dL로 전환한 후 저/고 경계가 잘못 보입니다. 저/고 경계 필드는 표시 단위를 변경해도 자동 변환되지 않습니다 — 설정 구성의 경고를 참조하세요. 단위에 맞게 직접 업데이트하세요.
브라우저에서 차트가 열리지 않습니다. PodQuery는 OS 기본 브라우저에서 차트 파일을 자동으로 열려고 시도합니다. 실패하면(사용자 컴퓨터에 인식된 기본 브라우저 명령이 없는 경우) Claude가 파일 경로를 대신 알려줍니다 — 수동으로 여세요. 이는 드물며 일반적으로 특이한 시스템 구성에서만 발생합니다.
📬 연락하기
설치에 어려움을 겪고 있든, 감사(audit)를 통해 Time in Range가 어떻게 개선되었는지 공유하고 싶든, 기꺼이 도와드리겠습니다.
기술 지원
문제가 해결되지 않으면 **이슈 열기**를 눌러 주세요. 다른 사람들도 해결 방법의 혜택을 받을 수 있습니다.
개인 및 전문적인 연락
[!NOTE] 개인정보 보호 알림: 지원을 위해 스크린샷을 보내실 경우, 개인 의료 정보나 Glooko 자격 증명을 먼저 블러 처리해 주세요.
🔌 도구 참조
이것은 이 확장 프로그램이 Claude에 등록하는 MCP 도구들입니다. 사용자가 직접 호출하지 않습니다 — 채팅하는 동안 Claude가 대신 호출합니다 — 하지만 Claude가 정확히 무엇을 볼 수 있는지(또는 볼 수 없는지), 또는 특정 후속 질문을 한 이유를 이해하려면 유용합니다.
타임스탬프에 관한 참고 사항
이 도구들이 사용하는 모든 타임스탬프는 ISO 8601 형식의 일반 벽시계 시간입니다. 예: 2026-01-01T00:00:00.000Z — 끝의 "Z"에도 불구하고 실제 UTC가 아닙니다. Glooko는 각 측정 시점에 기기에 표시된 문자 그대로의 날짜/시간만 기록하며 시간대나 오프셋이 첨부되지 않습니다. 따라서 측정값은 그 순간 사용자가 물리적으로 있던 장소의 시간으로 기록됩니다. 즉, 어느 방향으로도 시간대 변환이 발생하지 않습니다. Claude는 "어제", "지난 3주" 같은 상대적 표현을 일치하는 벽시계 숫자로 바로 변환하고, 결과의 시간도 변환 없이 그대로 표시합니다. 한 가지 단점은: 시간대를 넘나들며 여행하는 경우, 특정 측정값이 어느 시간대에 속하는지 기록이 없으므로 시간대 변경을 가로질러 "몇 시간 전" 같은 것을 안정적으로 계산할 수 없습니다 — 데이터는 여전히 기기에 표시된 그대로이지만, 시간대가 첨부되지 않았을 뿐입니다.
혈당 단위에 관한 참고 사항
대부분의 도구는 선택적 units, lower, upper 매개변수를 허용합니다. Claude가 이를 생략하면 확장 프로그램 설정에서 구성한 값(표시 단위 및 목표 범위)이 사용됩니다. Claude는 단일 질문에 대한 기본값을 재정의할 때만 이를 전달합니다 — 예를 들어, 평소 목표를 변경하지 않고 다른 임계값 아래의 시간을 확인하려는 경우입니다.
도구
도구 | 용도 |
| 모든 개요 질문에 가장 좋은 시작점입니다. 어떤 기간이든 고정 크기 집계를 제공하므로 몇 달 또는 몇 년에 걸쳐도 비용이 저렴합니다. 의도적으로 넓게 호출하는 것은 Claude가 아카이브에 보관된 전체 날짜 범위( |
| 기간을 시간 버킷(일/주/월/분기 또는 고정 길이)으로 나누고 원시 측정값에서 각각을 독립적으로 계산하여 "월별로 어떻게 변경되었는지" 스타일의 질문을 한 번의 호출로 처리합니다. |
| 기간에 대한 개별 타임스탬프 CGM 측정값으로, 최대 21일로 제한되며 선택적으로 |
| 차트를 보는 기본 방법입니다. 전체 임상 보고서 스타일의 포도당 차트(범위 내/저/고 추적선의 색상 구분, 음영 처리된 목표 밴드, 최소/최대 범위, 그 자체로 호버 가능한 볼루스 마커, 헤더 통계, 범례, 툴팁)를 만들고 파일로 저장한 다음 브라우저에서 직접 엽니다. |
| 플로팅을 위해 포도당을 목표 포인트 수로 다운샘플링하고, 스파이크가 손실되지 않도록 포인트당 최소/최대 밴드를 제공하며, 볼루스 이벤트 마커도 포함합니다. 렌더링된 페이지 대신 원시 차트 데이터를 반환합니다 — Claude가 |
| 기간 내의 모든 볼루스(최대 92일로 제한)를 전달 시 보간된 CGM 값, 그 순간 활성화된 ISF/탄수화물 비율/목표/DIA, 전달량과 프로그래밍된 양의 차이, 그리고 계산기 오버라이드로 보강합니다. 볼루스 클래스로 필터링할 수 있습니다. |
| 기간 전체에 걸쳐 시계 시간별로 합산된 범위 내 시간 및 평균 포도당 — 새벽 현상, 일관된 저녁 고혈당 및 기타 시간대 패턴을 분석하는 데 유용합니다. |
| Omnipod 5 알고리즘이 시간에 따라 기저 인슐린 전달을 어떻게 처리했는지를 단위가 아닌 행동 상태( |
| Glooko 자체의 일별 기저/볼루스/총 인슐린 합계를 있는 그대로 표시하여 일별 표 또는 총 1일 용량 수치에 사용합니다. |
| 기간 동안 적용된 모든 Omnipod 5 설정 변경: DIA, 최대 기저율, 시간대별 목표/ISF/탄수화물 비율 프로필. |
| 팟 교체 및 CGM 센서 교체 타임스탬프 — 컨텍스트만 제공하며 주변 포도당 교란의 원인으로 단정하지 않습니다. |
| 하나의 식사 또는 볼루스 이벤트에 대한 집중 분석: 30분 전부터 3시간 후까지, 해당 기간의 포도당 추적선과 모든 볼루스를 포함합니다. |
또한 MCP 프롬프트인 clinical_auditor(Claude UI의 "임상 감사자 페르소나")가 하나 있습니다 — The "Tough Love" AI 페르소나를 참조하세요.
코드 구성 방식
(소스 코드를 읽는 개발자를 위한 내용입니다. 도구를 사용하기만 하려면 이 부분은 무시해도 됩니다.)
데이터 흐름: Glooko → sync → store → range → analytics → tools → Claude.
manifest.json— MCPB 매니페스트: Claude Desktop이 확장 프로그램을 설치하기 위해 읽는 파일로, 사용자에게 요청하는 설정과src/server.js실행 방식을 담고 있습니다.src/env.js— 다른 코드가 읽기 전에 Claude Desktop이 주입하는user_config기반 환경 변수를 정리합니다.server.js에서 첫 번째 import여야 하며, 이 파일이 우회하는 특정 Claude Desktop 특이 사항에 대한 자세한 내용은 파일 자체의 헤더 주석을 참조하세요.src/server.js— MCP 서버와 도구 정의(Claude Desktop이 stdio로 실행하는 부분)입니다. analytics를 감싸는 얇은 래퍼입니다.src/analytics.js— 핵심: 모든 임상 수학 계산과 데이터 가공이 순수 함수로 작성되어 있습니다.src/chartHtml.js—get_chart_html이 디스크에 저장하는 독립형 HTML 페이지를 렌더링합니다. 차트 지오메트리, 색상 코딩, 일별 구분, 툴팁, 시간순/오버레이 토글이 모두 여기에 있습니다.src/store.js— SQLite 아카이브(원시 Glooko blob이 아닌 정규화된 행)로, sql.js — SQLite의 순수 WebAssembly 빌드 — 를 기반으로 합니다. Node 내장node:sqlite나better-sqlite3같은 네이티브 애드온 대신 이것을 의도적으로 선택했습니다. MCPB로서 이 서버는 빌드 단계 없이, 정확한 버전을 미리 알 수 없는 상태에서 Claude Desktop이 번들하는 어떤 Node 런타임으로도 macOS나 Windows에서 실행될 수 있습니다. 순수 WASM 엔진은 Node가 실행되는 모든 곳에서 동일하게 동작합니다. 유일한 단점은 sql.js가 메모리 전용이라는 점이라서,store.js는 SQLite 자체의 파일 기반 저널에 의존하는 대신 각 쓰기 배치 후 아카이브를 직접 디스크에 다시 직렬화합니다.src/paths.js— 아카이브 위치(사용자가 설정한 "데이터 폴더", 기본값은 Documents 폴더)를 확인하고, 새로운 오프라인 설치 시 번들된 샘플 데이터베이스를 해당 위치에 배치합니다.src/range.js— 도구가 호출하는 계층입니다. 로컬 아카이브에서 응답하고 필요한 경우에만 Glooko에서 보충합니다. 오프라인 모드는 여기에서 제어됩니다.src/sync.js— Glooko 데이터를 아카이브로 가져오는 엔진입니다(콜드 스타트, 보충, 시작 시 워밍업).src/glooko.js— Glooko API 클라이언트(인증 및 가져오기)입니다. 원래 프로젝트에서 변경되지 않았으며, 모든 Glooko 다운로드 및 저장 기능이 이전과 동일하게 유지됩니다.src/prompt.js— 임상 감사자 페르소나입니다.
몇 가지 불변 규칙이 전체에 적용됩니다: 포도당은 내부적으로 단일 표준 단위(mmol/L)로 저장되고 출력 시에만 변환됩니다. 볼루스는 개별 이벤트에서 합산되는 반면 기저 인슐린은 Glooko의 일일 합계에서 가져옵니다. 모든 시간은 UTC가 아닌 일반 벽시계 시간입니다(위의 "타임스탬프에 관한 참고 사항" 참조). 일별 비율은 실제 관찰된 데이터 범위를 사용합니다.
🏗️ .mcpb 직접 빌드하기
확장 프로그램을 사용하기 위해 이 작업을 할 필요는 없습니다. 대신 배포된 .mcpb를 다운로드하세요. 이 내용은 소스에서 빌드하거나, 설치 전에 코드를 검토하거나, 변경을 원하는 사람을 위한 것입니다.
git clone https://github.com/rilhia/podquery-mcp.git
cd podquery-mcp
npm install --omit=dev # installs runtime dependencies, including sql.js, into node_modules
npm install -g @anthropic-ai/mcpb
mcpb pack # produces podquery-mcp.mcpb in this folder저장소에는 또한 패킹된 번들에서 저장소 전용 콘텐츠(문서, GitHub README 배너, 사용하지 않는 sql.js 빌드 변형 등)를 제거하는 .mcpbignore 파일이 포함되어 있습니다. 건드릴 필요는 없지만, mcpb pack이 무엇을 포함하는지와 그 이유가 궁금하다면 한 번 살펴볼 가치가 있습니다.
그런 다음 확장 프로그램 설치에 설명된 대로 결과 .mcpb 파일을 설치하세요. 번들 형식의 작동 방식은 MCPB 사양을 참조하세요.
📄 라이선스
이 프로젝트는 MIT 라이선스로 배포됩니다. 저작권 고지와 라이선스 텍스트를 유지하는 한 상업적 목적을 포함하여 자유롭게 사용, 수정, 배포할 수 있습니다. 전체 텍스트는 LICENSE 파일을 참조하세요.
MIT 라이선스는 코드에 적용됩니다. 번들된 샘플 데이터베이스는 저자의 개인 데이터로, 탐색을 위해 공유된 것입니다. 사용 시 주의를 기울여 주세요.
면책 조항
이 도구는 정보 제공 및 교육 목적으로만 사용됩니다. 의료 기기가 아니며 전문적인 의학적 조언, 진단 또는 치료를 대체하지 않습니다. 의학적 상태에 관한 질문이 있을 때는 항상 의사 또는 기타 자격을 갖춘 의료 제공자의 조언을 구하십시오. 이 도구의 도움으로 생성된 모든 분석 결과(AI 생성 제안 포함)는 인슐린 요법이나 치료 요법을 변경하기 전에 자격을 갖춘 임상 전문가의 검토를 받아야 합니다.
Available Tools
12 toolsget_basal_deliveryBasal delivery state timelineA
What the Omnipod 5 was doing with basal over time: delivering normally, pausing it (suspend), running at its ceiling (max), or running blind on a fixed preset because it lost CGM signal (limited).
IMPORTANT: these are STATES describing the algorithm's behaviour, NOT insulin amounts. "suspend" means paused, "max" means at the ceiling; neither is a number of units. (For basal units, use get_daily_insulin.)
Use it to investigate lows (was basal already suspended beforehand?), rebound patterns (max, then suspend, then a low), how hard the system is working, and whether excursions coincided with limited mode (algorithm not adjusting at all).
Times are plain wall clock time (device-local), not UTC. Capped to a generous span since it returns collapsed intervals, not raw points.
Returns: a summary of minutes and percentage per state (normal/suspend/max/limited) and, unless includeIntervals is false, an intervals array (state, start, end, minutes).
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | Required. Window end as an ISO 8601 timestamp, e.g. 2026-06-20T00:00:00.000Z — plain wall clock time, same caveat as start (the "Z" is a format artifact, not a UTC claim). Treated as inclusive and must be after start. All timestamps returned by this API are likewise plain wall clock time, unconverted. | |
| start | Yes | Required. Window start as an ISO 8601 timestamp, e.g. 2026-06-19T00:00:00.000Z. IMPORTANT: despite the trailing "Z", this is plain WALL CLOCK time, not true UTC — Glooko records only the literal date/time the patient's device showed, with no timezone attached. Use the patient's own wall-clock digits directly (no conversion): resolve "yesterday" or "last 3 weeks" straight into the matching wall-clock date and time. Treated as inclusive. | |
| includeIntervals | No | Optional (default: true). Whether to include the full interval timeline. Set false to get only the per-state summary totals, which is much smaller over a long span. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does an excellent job: it explains the meaning of each state, that output is collapsed intervals rather than raw points, that times are device-local wall clock (not UTC), and that results are capped. It even details the conditional intervals array and the summary metrics returned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is fairly long but every clause earns its place: state definitions, use cases, the critical units distinction, time semantics, cap rationale, and return shape. The most important semantic warning — states not insulin amounts — is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, but the description compensates by stating exactly what the agent will receive: per-state minute/percentage summaries and an optional intervals array with start, end, and minutes. Combined with thorough parameter schema text and timezone clarification, an agent has enough to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description adds a little extra by reiterating the wall-clock caveat and explaining why the time span is capped ('returns collapsed intervals, not raw points'). Most parameter-level detail already lives in the schema, so the added marginal value is moderate, not maximal.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states exactly what the tool returns: a timeline of basal algorithm states (normal/suspend/max/limited), not insulin amounts. It explicitly differentiates from get_daily_insulin, making it easy for an agent to distinguish this from sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete scenarios for using the tool — investigating lows, rebound patterns, system workload, and limited mode coinciding with excursions. It also tells agents when NOT to use it: when they need basal units, use get_daily_insulin instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_chart_htmlOpen a clinical glucose chart in the browserA
Generates a clinical-report-style glucose chart for a window (or several separate windows via ranges) — line trace colour-coded in-range/low/high, a shaded target-range band, a min/max spread band, bolus markers (hoverable in their own right for that bolus's units/ carbs/type, in addition to the aligned CGM reading's own tooltip), a header stat row (time in range, average glucose, time low, time high), a legend, and hover tooltips — saves it to a file, and opens it directly in the patient's default web browser. USE THIS instead of get_chart_series whenever the patient wants to SEE a chart.
Multi-day charts open with a Chronological/Overlay toggle: chronological is the usual continuous timeline; overlay re-plots every calendar day on a shared 0-24h axis (colour-coded per day, with a day legend) so days can be compared directly. Use ranges instead of start/end when the patient wants to compare specific, possibly non-contiguous dates together (e.g. "the 20th, 23rd and 30th") — every requested day gets equal width on the axis regardless of the calendar gap between them. The page also has a day-filter chip per day (in both views) so the patient can hide/show individual days themselves, with the header stats recalculating for whichever days are still visible — you never need a new call just to compare a subset of the days already shown.
The page also includes a "Day details" panel per calendar day (open by default for a single day, collapsed for multiple), with that day's full glucose control (average, GMI, TIR/low/high, std dev, CV), extremes (highest/lowest with times), best/worst hour, insulin (bolus units/count/ avg, basal units, bolus-basal split), bolus type counts, carbs, and the settings in force — the SAME figures get_diabetes_summary would return for that single day, computed by the identical aggregator so the two never disagree. Hiding a day's filter chip hides its detail panel too.
DATA RESOLUTION: a routine call (no resolution/maxPoints given) already plots every single CGM reading with NO smoothing for a typical window (a day, a week, a full month) — the point budget only kicks in on wider windows, where it keeps each bucket's true min/max so no low or high excursion is ever smoothed away, only the moment-to-moment trace between them is thinned. When a call DOES get thinned this way, the result includes a downsample object naming the raw vs plotted reading counts — treat that as an invitation to offer the patient a choice, not as data that has become unavailable: mention it in plain terms ("I plotted a lightly smoothed version of this wide a window — want the full-detail version instead? It may take a little longer to load") and, if they want more detail, re-call with resolution set to how much of the real data to use — 1 for every single reading, 2 for every other one, 3 for every third, and so on. Never decide this smoothing tradeoff silently on the patient's behalf beyond the routine default.
CRITICAL — how to respond after calling this, this is what keeps it fast: this tool does the displaying itself. Do NOT copy, re-type, rebuild, or paste the chart as an artifact/code block/canvas yourself — reproducing a large HTML page as your own output is exactly the slow path this tool exists to avoid, and it is unnecessary work since the browser window is already open by the time you respond. If the JSON result has openAttempted: true, just tell the patient in one short sentence that the chart has opened in their browser — do not describe or restate its contents in detail, do not emit any HTML/code, and treat the tool call as already complete. If openAttempted: false, the auto-open could not be launched from this machine (e.g. no recognised default-browser command) — tell the patient to open the file at the returned filePath themselves; only in that fallback case, or if embedHtml was explicitly requested, does the response also include a full html field. Do NOT reach for a quick/built-in "auto-visualize this data" shortcut either — this tool already produces the real chart.
Times are plain wall clock time (device-local), not UTC.
Returns: ranges (the resolved windows actually used), dayCount, unit, pointCount, bolusCount, filePath (where the page was saved), openAttempted (whether the browser launch was attempted without an immediate error), downsample (only present when the plotted points were thinned from the raw CGM readings — see DATA RESOLUTION above), and — only as a fallback — html.
| Name | Required | Description | Default |
|---|---|---|---|
| end | No | Required. Window end as an ISO 8601 timestamp, e.g. 2026-06-20T00:00:00.000Z — plain wall clock time, same caveat as start (the "Z" is a format artifact, not a UTC claim). Treated as inclusive and must be after start. All timestamps returned by this API are likewise plain wall clock time, unconverted. Omit this (and start) when passing `ranges` instead for several separate windows. | |
| lower | No | Optional. Low (hypo) boundary in the chosen unit; readings below it count as time-low. Omit to use the server default (OMNI_LOWER). Pass only to override for this one call, e.g. to ask about time under a different threshold. | |
| start | No | Required. Window start as an ISO 8601 timestamp, e.g. 2026-06-19T00:00:00.000Z. IMPORTANT: despite the trailing "Z", this is plain WALL CLOCK time, not true UTC — Glooko records only the literal date/time the patient's device showed, with no timezone attached. Use the patient's own wall-clock digits directly (no conversion): resolve "yesterday" or "last 3 weeks" straight into the matching wall-clock date and time. Treated as inclusive. Omit this (and end) when passing `ranges` instead for several separate windows. | |
| units | No | Optional. Glucose unit for this call. Omit to use the unit configured on the server (OMNI_UNITS). One of: "mmol" (mmol/L) or "mgdl" (mg/dL). Pass only to override the configured unit for this one call. | |
| upper | No | Optional. High (hyper) boundary in the chosen unit; readings above it count as time-high. Omit to use the server default (OMNI_UPPER). Pass only to override for this one call. | |
| ranges | No | Optional. Use this INSTEAD OF start/end to show several separate, possibly non-contiguous windows on ONE chart -- e.g. "the 20th, 23rd and 30th of June" is ranges: [{start:"2026-06-20T00:00:00.000Z", end:"2026-06-21T00:00:00.000Z"}, {start:"2026-06-23T00:00:00.000Z", end:"2026-06-24T00:00:00.000Z"}, {start:"2026-06-30T00:00:00.000Z", end:"2026-07-01T00:00:00.000Z"}] (each entry is that day's own midnight to the next day's midnight). Ranges can be single days or multi-day spans, do not need to be contiguous, and do not need to be given in order -- the chart always lays them out chronologically and gives every calendar day equal width on the axis, so a 10-day gap between two selected dates does not waste space. The combined span across all ranges is still capped like a normal window. The chart itself also lets the viewer hide/show individual days afterward without a new call. | |
| embedHtml | No | Optional (default: false). Force the full HTML page to also be included in the response even when the browser auto-open succeeded. Leave this false in normal use — including it costs exactly the slow, large-response-body path this tool is designed to avoid. Only set true if the patient explicitly asks to see the raw page/markup. | |
| maxPoints | No | Optional, advanced. A precise total-point-budget alternative to `resolution` (20-50000), shared across all ranges when `ranges` is used; ignored if `resolution` is also given. Omit both in normal use: the routine default is up to 12000 points, which covers a full month at native cadence with no downsampling -- see DATA RESOLUTION above. | |
| resolution | No | Optional. The simple, patient-facing way to control chart detail: a plain divisor for how much of the real CGM data to plot, applied to each range independently. 1 = ALL readings (full native ~5-minute resolution, no downsampling at all, however wide the window -- use this whenever the patient wants full detail and is fine with a larger/slower-to-load file). 2 = every 2nd reading (roughly half), 3 = every 3rd (roughly a third), and so on. Omit this in normal use -- see DATA RESOLUTION above for when to offer it as a choice. Overrides `maxPoints` when both are given. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it goes far beyond a basic summary: it discloses that the tool opens the browser itself, what openAttempted true/false means, that `html` is only a fallback, that wall-clock time is used rather than UTC, that downsampling preserves true min/max, and that the chart's day-details panel uses the same aggregator as get_diabetes_summary. This is exemplary behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but the length is largely earned: it is organized into labelled sections (DATA RESOLUTION, CRITICAL, Returns) and front-loads the most operationally important rule ('do not rebuild the chart yourself'). There is minor redundancy around the 'do not reproduce the HTML' instruction, so it is not perfectly tight, but every major paragraph serves a real decision an agent must make.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 9 parameters, no annotations, and no output schema, this description is remarkably complete. It covers return fields, success/failure fallback behavior, time-zone semantics, downsampling policy, response etiquette, and how to compare against sibling tools. An agent has everything it needs to call the tool and behave correctly afterward.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds substantial value by explaining the `ranges` alternative in depth (non-contiguous windows, equal day width, ordering), the `resolution` divisor semantics, the interaction between `resolution` and `maxPoints`, and the cost of `embedHtml`. Parameters like lower/upper rely on the schema, but overall the description clearly exceeds the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: it 'Generates a clinical-report-style glucose chart', saves it to a file, and opens it in the browser. It also explicitly distinguishes itself from the sibling get_chart_series ('USE THIS instead of get_chart_series whenever the patient wants to SEE a chart'), so an agent can select it correctly without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description is explicit about when to use this tool over get_chart_series, when to use `ranges` instead of start/end, when to offer `resolution`, and when `embedHtml` should be set. It even gives a patient-facing script for the downsampling tradeoff. This is the strongest possible usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_chart_seriesDownsampled series for plottingA
Glucose downsampled to a target number of points for drawing a chart, with a min/max band per point so spikes are not lost, plus bolus events as overlay markers.
Use this whenever the patient wants a GRAPH or CHART of glucose over a window, or when illustrating "what a good/bad day looked like" — a picture of the trace is far more useful here than a table of numbers. It returns a few hundred points instead of every 5-minute reading, so it is far cheaper than get_glucose and a chart cannot show more points than its pixel width anyway. Reserve get_glucose for close-up numeric inspection of a short window, not for wide charts.
IMPORTANT — this tool returns DATA, not a picture: after calling it, actually render the points as a visual line/area chart with time on the x-axis and glucose on the y-axis, shading the target range and marking boluses, rather than only describing the numbers in prose. Producing that chart is the point of calling this tool at all.
HOW TO RENDER IT — DO NOT use a quick/built-in auto-chart shortcut for this: any lightweight "visualize this data" feature that infers its own axis from a plain array almost always falls back to plotting by point POSITION (1, 2, 3, ...) because it never looks at the t field or the xAxis data below — this has been confirmed to happen and produces a meaningless, unlabelled time axis. Instead, BUILD A CUSTOM CHART YOURSELF (e.g. an HTML/SVG or JS-charting-library artifact you write) where you explicitly control the x-axis scale and can use the xAxis data below directly. If your environment offers both a quick chart shortcut and the ability to write custom HTML/code, always choose the custom option for this tool's output.
X-AXIS — READ THIS CAREFULLY, this is commonly gotten wrong: the x-axis MUST be a genuine TIME SCALE, NEVER a plain category/index axis showing point position (1, 2, 3, ... maxPoints, or "286"). Points are NOT evenly spaced in time (a sensor gap or the short-fidelity path below means the interval between consecutive points can vary), so an index axis silently distorts time and every tick is meaningless to the reader.
To make this hard to get wrong, the response includes a ready-made xAxis object — USE IT DIRECTLY instead of inventing your own tick scheme:
xAxis.ticks: an array of {t, label} already spaced sensibly for the window's span (every 3-4 hours for anything up to ~10 days, daily beyond that). Plot these as the x-axis tick marks, usinglabelas the tick text VERBATIM — do not recompute your own tick positions or labels.xAxis.days: one {startT, endT, label} entry per calendar day the window touches (e.g. "Wed 17 Jun"), present whenever the window spans more than a single day. For a multi-day chart, this is what makes it read correctly: divide the plot into these segments with a vertical divider at each boundary, and print each segment'slabelcentred underneath — e.g. three equal sections labelled "Wed 17 Jun", "Thu 18 Jun", "Fri 19 Jun" for a 3-day window, each showing that day's own hour ticks above it. This is exactly the "N equally spaced, dated sections" layout a multi-day glucose chart needs.daysis empty for a single-day window (nothing to divide) and for very long windows (too many days to label individually —ticksswitches to one date label per tick there instead).A gap in the data (missing points) must still show as a visual gap or interrupted line against this time scale — never compressed away.
Glucose values are in the configured unit; times are plain wall clock time (device-local), not UTC.
Returns: unit, a points array (t, avg, min, max, n per point), an events array of bolus markers for overlay, and xAxis (spanHours, ticks, days) as described above.
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | Required. Window end as an ISO 8601 timestamp, e.g. 2026-06-20T00:00:00.000Z — plain wall clock time, same caveat as start (the "Z" is a format artifact, not a UTC claim). Treated as inclusive and must be after start. All timestamps returned by this API are likewise plain wall clock time, unconverted. | |
| start | Yes | Required. Window start as an ISO 8601 timestamp, e.g. 2026-06-19T00:00:00.000Z. IMPORTANT: despite the trailing "Z", this is plain WALL CLOCK time, not true UTC — Glooko records only the literal date/time the patient's device showed, with no timezone attached. Use the patient's own wall-clock digits directly (no conversion): resolve "yesterday" or "last 3 weeks" straight into the matching wall-clock date and time. Treated as inclusive. | |
| maxPoints | No | Optional (default: 250). Target number of plotted points (20-1000). 200-400 is plenty for a smooth chart at typical screen widths; higher values cost more for little visual gain. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It clearly states the tool returns data, not a rendered picture; explains the downsampling and min/max banding; warns that points are not evenly spaced in time; explains the xAxis object is ready to use; and documents wall-clock vs UTC behavior. This is unusually thorough.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but it is well-structured with bolded section headers, bullet lists, and clear warnings. It front-loads the core purpose and then organizes rendering and x-axis guidance so an agent can act on it. Some points are restated for emphasis, but the extra length is largely justified by the tool's easy-to-misuse output.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must explain the return shape, and it does: unit, points array with t/avg/min/max/n, events array for bolus markers, and xAxis with spanHours, ticks, and days. It also covers rendering requirements, timezone conventions, gap behavior, and multi-day chart layout. This is complete enough for an agent to call and use the result correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already covers all three parameters with high coverage, so the baseline is 3. The description adds useful extra context beyond the schema, such as the target-point guidance that 200-400 is plenty for a smooth chart and that a chart cannot show more points than its pixel width, which helps an agent choose maxPoints sensibly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific statement of what the tool does: it returns glucose downsampled for chart drawing, with min/max bands per point and bolus overlay events. It further distinguishes itself by explicitly saying it returns data and not a picture, and by naming get_glucose as the alternative for numeric close-up inspection.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says to use this tool whenever a graph or chart of glucose over a window is needed, and tells the agent to render the returned data as a visual line/area chart. It also gives a when-not-to-use direction by reserving get_glucose for close-up numeric inspection rather than wide charts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_daily_insulinDaily insulin totals (Glooko per-day figures)A
Glooko's own per-day insulin totals shown verbatim: basal units, bolus units and the combined total for each day, plus a window aggregate.
Use this when you specifically want the device-reported daily totals (for example a day-by-day basal/bolus table, or "what was my total daily dose each day"). Note: the bolus here is Glooko's pre-aggregated daily figure. For bolus aggregated from individual events (the project-wide method used everywhere else), use get_diabetes_summary or get_trend. Basal is only available from Glooko, so this and those tools share the same basal source.
The most recent day may be flagged provisional if it is still today and not yet finalised.
Returns: source ("glooko-daily"), a days array (date, basalUnits, bolusUnits, totalUnits, provisional), and an aggregate (daysWithData, basalUnits, bolusUnits, totalUnits, basalUnitsPerDay, bolusUnitsPerDay, totalUnitsPerDay, basalPercent). All dates are wall-clock (device-local) days.
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | Required. Window end as an ISO 8601 timestamp, e.g. 2026-06-20T00:00:00.000Z — plain wall clock time, same caveat as start (the "Z" is a format artifact, not a UTC claim). Treated as inclusive and must be after start. All timestamps returned by this API are likewise plain wall clock time, unconverted. | |
| start | Yes | Required. Window start as an ISO 8601 timestamp, e.g. 2026-06-19T00:00:00.000Z. IMPORTANT: despite the trailing "Z", this is plain WALL CLOCK time, not true UTC — Glooko records only the literal date/time the patient's device showed, with no timezone attached. Use the patient's own wall-clock digits directly (no conversion): resolve "yesterday" or "last 3 weeks" straight into the matching wall-clock date and time. Treated as inclusive. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations available, the description carries the full burden. It discloses the data source (Glooko verbatim), the provisional flag on the current day before finalisation, and the wall-clock date semantics. It does not explicitly address read-only/no side-effect status or potential auth/rate-limit constraints, but its behavioral claims are clear and consistent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, then usage guidance, then important caveats, then a necessary return-shape listing because there is no output schema. Every sentence earns its place; no filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given two clearly documented parameters, no output schema, and no annotations, the description supplies all essential context: return fields, date interpretation, provisional-day caveat, and sibling-tool routing. Nothing an agent needs to correctly call this tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents start and end meaningfully, including wall-clock caveats. The description reinforces the wall-clock convention but adds no parameter-specific semantics beyond the schema, which matches the baseline for full schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states exactly what the tool returns — Glooko's verbatim per-day totals with basal units, bolus units, combined total, and a window aggregate — using a specific verb and resource. It also distinguishes itself from get_diabetes_summary and get_trend by positioning this as the device-reported daily method versus the event-aggregated method.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use context ('Use this when you specifically want the device-reported daily totals') and explicit alternatives with the condition for choosing them ('For bolus aggregated from individual events... use get_diabetes_summary or get_trend'). This leaves no ambiguity about tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_device_eventsPod and CGM sensor changesA
Pod changes (the Omnipod is replaced roughly every 3 days) and CGM sensor changes, as timestamped events, kept as two separate lists.
These are point-in-time markers, not amounts. They are most useful as CONTEXT for nearby glucose disruption: a fresh pod can run high for the first hours while the cannula settles, and a new sensor can read erratically while it warms up. Use them to check whether an unexplained high or a run of odd readings lines up with a recent change. Treat any such link as a possible contributing factor, never assert it as the cause.
Times are plain wall clock time (device-local), not UTC.
Returns: podChanges and sensorChanges arrays of wall-clock timestamps, plus a count for each.
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | Required. Window end as an ISO 8601 timestamp, e.g. 2026-06-20T00:00:00.000Z — plain wall clock time, same caveat as start (the "Z" is a format artifact, not a UTC claim). Treated as inclusive and must be after start. All timestamps returned by this API are likewise plain wall clock time, unconverted. | |
| start | Yes | Required. Window start as an ISO 8601 timestamp, e.g. 2026-06-19T00:00:00.000Z. IMPORTANT: despite the trailing "Z", this is plain WALL CLOCK time, not true UTC — Glooko records only the literal date/time the patient's device showed, with no timezone attached. Use the patient's own wall-clock digits directly (no conversion): resolve "yesterday" or "last 3 weeks" straight into the matching wall-clock date and time. Treated as inclusive. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description shoulders the transparency burden and does well: it discloses that events are point-in-time markers, that times are 'plain wall clock time (device-local), not UTC,' and that the result contains podChanges/sensorChanges arrays plus a count. It also explains the intended interpretation to prevent misuse. It does not mention pagination or ordering, but for a simple read-only list tool that is not a major gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is organized into short paragraphs: what is returned, when to use it, timezone caveat, and return shape. It is front-loaded and avoids fluff, though the middle paragraph on clinical context is somewhat extended. Overall it is efficient and readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and no annotations, the description compensates by specifying the return structure (two arrays and counts), the timestamp semantics, and the practical use case. It also warns against over-interpretation. The tool is simple enough (two required params, no nested objects) that nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents start and end in detail, including ISO 8601 format, inclusive bounds, ordering, and the wall-clock caveat. The description reaffirms the wall-clock caveat but adds no new parameter-specific semantics beyond the schema's 100% coverage, so a baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states exactly what the tool provides: 'Pod changes ... and CGM sensor changes, as timestamped events, kept as two separate lists.' It also clarifies these are point-in-time markers, not amounts, and names the returned fields (podChanges and sensorChanges), so the agent understands the resource without ambiguity. This clearly distinguishes it from sibling glucose/insulin tools by subject matter.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a concrete use case: use the events as 'CONTEXT for nearby glucose disruption' to check whether an unexplained high or odd readings 'lines up with a recent change.' It also tells the agent how to interpret results ('possible contributing factor, never assert it as the cause'). It does not name explicit exclusions or sibling alternatives, but among the visible siblings none overlap directly with device-change events, so the omission is minor.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_diabetes_summaryDiabetes summary for a windowA
The single best starting point for any overview question ("how was my control yesterday / over the last 3 weeks / last 6 months"). Returns fixed-size aggregates no matter how long the span, so it is cheap to call over months and tolerates very long windows.
TIP: because this tool is uncapped, a deliberately wide call (e.g. start 2000-01-01T00:00:00.000Z, end tomorrow) is the quickest way to discover how much data the system actually holds: the returned reportRange.start and reportRange.end are the first and last readings present in the archive. Use it as an orientation call before drilling into a specific period.
Insulin uses the project-wide rule: bolus is summed from individual events; basal comes from Glooko's per-day totals. The basal/bolus split is reported as percentages on a per-day-rate basis (a useful balance metric for a closed-loop system). GMI and CV are computed from the CGM readings.
Best/worst day and hour are ranked decisively: Time In Range first, then closeness to the glucose target in force at each reading (median absolute deviation), then variability, and each carries those figures so the ranking is explainable.
Returns: reportRange (start, end, days, reflecting the actual data present), glucoseControl (averageBG, gmiEstimatedA1c, stdDev, coefficientOfVariation, variability flag, timeInRange/timeLow/timeHigh, cgmReadingCount); glucoseExtremes (highest and lowest readings, each with every timestamped instance); bestWorst (bestDay, worstDay, bestHour, worstHour, each with tir, medianAbsTargetDev, cv); insulin (observedDays, bolusUnits, bolusUnitsPerDay, bolusEventCount, avgUnitsPerBolus, and when Glooko daily data exists basalUnits, basalDayCount, averageBasalUnitsPerDay, basalPercent, bolusPercent); bolusArchitecture (counts by bolus type); carbs (carbsGrams, carbsPerDay, carbEntryCount); and settings (the time-segmented profiles in force). All timestamps are plain wall clock time (see start/end parameter notes), not UTC.
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | Required. Window end as an ISO 8601 timestamp, e.g. 2026-06-20T00:00:00.000Z — plain wall clock time, same caveat as start (the "Z" is a format artifact, not a UTC claim). Treated as inclusive and must be after start. All timestamps returned by this API are likewise plain wall clock time, unconverted. | |
| lower | No | Optional. Low (hypo) boundary in the chosen unit; readings below it count as time-low. Omit to use the server default (OMNI_LOWER). Pass only to override for this one call, e.g. to ask about time under a different threshold. | |
| start | Yes | Required. Window start as an ISO 8601 timestamp, e.g. 2026-06-19T00:00:00.000Z. IMPORTANT: despite the trailing "Z", this is plain WALL CLOCK time, not true UTC — Glooko records only the literal date/time the patient's device showed, with no timezone attached. Use the patient's own wall-clock digits directly (no conversion): resolve "yesterday" or "last 3 weeks" straight into the matching wall-clock date and time. Treated as inclusive. | |
| units | No | Optional. Glucose unit for this call. Omit to use the unit configured on the server (OMNI_UNITS). One of: "mmol" (mmol/L) or "mgdl" (mg/dL). Pass only to override the configured unit for this one call. | |
| upper | No | Optional. High (hyper) boundary in the chosen unit; readings above it count as time-high. Omit to use the server default (OMNI_UPPER). Pass only to override for this one call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so exceptionally well. It discloses fixed-size output, cheap long-window calls, uncapped orientation behavior, insulin aggregation rules, tie-breaking logic for ranking, and the plain-wall-clock timezone convention. This gives an agent a reliable model of how the tool behaves.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but its length is largely earned: it front-loads purpose, adds a practical discovery tip, then explains computational caveats and the return contract, which is necessary because there is no output schema. A few parenthetical asides are slightly expendable, but overall it is well-ordered and information-dense.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex aggregation tool with no annotations and no output schema, this description is remarkably complete. It explains the full set of returned fields, how aggregates are computed, how rankings are resolved, and the timezone convention. An agent has everything it needs to invoke the tool correctly and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description reinforces the wall-clock timestamp caveat and refers to the parameter notes, but the schema already documents defaults, overrides, and formats for all five parameters. No additional parameter meaning is needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names the tool as 'the single best starting point for any overview question' and specifies that it returns fixed-size aggregates over a window. It clearly positions itself as distinct from the sibling period-specific tools by framing itself as an orientation call before drilling into a specific period.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly recommends using this tool for overview questions and as an orientation call to discover how much data the system holds before drilling into a specific period. It does not explicitly name alternatives or give when-not-to-use conditions, but the usage context is strongly established.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_enriched_bolus_logEnriched bolus logA
Every bolus in the window, each enriched with the context needed to judge whether it was the right dose: the interpolated CGM value at the moment of delivery, and the ISF, carb ratio, target and DIA in force at that time.
Each record also carries delivered vs programmed units (delivered < programmed means the bolus was interrupted, flagged interrupted=true); the calculator recommendation broken into recCorrection, recCarbs and recTotal; whether the user overrode it (override: "above" or "below"); the bloodGlucoseInput and its source the calculator used; the bolus class; and isManual.
Use it to investigate insulin stacking, bolus-calculator accuracy, interrupted deliveries and user overrides. Filter with "classes" to pull only the bolus types you care about and keep the response small.
Capped to 92 days per call. All glucose values are in the configured unit; times are plain wall clock time (device-local), not UTC.
Returns: count, the classes filter applied, and a boluses array of enriched records (each with time, units, delivered, programmed, interrupted, recCorrection, recCarbs, recTotal, override, bgInput, bgSource, cgm_val, class, isManual, and a context object of the settings in force).
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | Required. Window end as an ISO 8601 timestamp, e.g. 2026-06-20T00:00:00.000Z — plain wall clock time, same caveat as start (the "Z" is a format artifact, not a UTC claim). Treated as inclusive and must be after start. All timestamps returned by this API are likewise plain wall clock time, unconverted. | |
| start | Yes | Required. Window start as an ISO 8601 timestamp, e.g. 2026-06-19T00:00:00.000Z. IMPORTANT: despite the trailing "Z", this is plain WALL CLOCK time, not true UTC — Glooko records only the literal date/time the patient's device showed, with no timezone attached. Use the patient's own wall-clock digits directly (no conversion): resolve "yesterday" or "last 3 weeks" straight into the matching wall-clock date and time. Treated as inclusive. | |
| classes | No | Optional filter. Array of bolus classes to include. Valid values (use these exact strings): "Meal Bolus" (carb-only dose), "Manual Correction Bolus" (user-initiated correction for a high), "System Correction Bolus" (algorithm-initiated correction), "Meal With Correction Bolus" (combined carb + correction dose). Provide one or more to combine, e.g. ["Manual Correction Bolus", "System Correction Bolus"]. Omit or leave empty to return all classes. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden, and it is unusually thorough: it discloses the 92-day cap, wall-clock versus UTC handling, the configured glucose unit, the interrupted flag semantics, override values, and the complete return record shape. It also explains the 'Z' caveat in the schema, going beyond what structured data conveys.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but tightly organized into purpose, field explanation, use cases, constraints, and return contract. The final return-list paragraph is somewhat redundant with the field names already mentioned, but given the record complexity it is justified and every other sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fully defines the return contract by listing every field in the boluses array and the top-level count and filter echo. It covers time handling, unit handling, result caps, and filtering behavior, making it complete enough to call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description adds substantial meaning: it clarifies that start/end times are plain wall-clock device-local times despite the trailing 'Z', that end is inclusive and must be after start, and it expands each 'classes' enum value with practical meaning and combination examples. This materially improves correct invocation beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: it retrieves every bolus in the window and explains exactly what 'enriched' means (interpolated CGM, ISF, carb ratio, target, DIA). This clearly differentiates it from the sibling tools, which address trends, glucose, basals, settings, or chart data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says 'Use it to investigate insulin stacking, bolus-calculator accuracy, interrupted deliveries and user overrides,' giving clear use cases. It also advises using the 'classes' filter to keep responses small. It doesn't explicitly contrast with sibling tools or state when not to use it, but the context is strong enough for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_glucoseGlucose readings for a window (filterable by band)A
Individual timestamped CGM readings for a window, optionally filtered to just the part of the range you care about.
The "band" option decides which readings come back: "low" (below the low boundary, i.e. hypos), "high" (above the high boundary), "target" (in range), or "all" (every reading, each tagged with its band). Use "low"/"high" to pull only excursions for a close look without dragging in thousands of normal readings; "all" gives the full trace.
This returns raw points, so it is capped to 21 days. For a wide chart use get_chart_series (downsampled); for aggregate stats use get_diabetes_summary or get_trend rather than computing over a raw array yourself.
Glucose values are in the configured unit; times are plain wall clock time (device-local), not UTC.
Returns: window, thresholdsUsed (lower, upper, unit), the band requested, count, and a readings array (time, value, velocity, plus band when band="all").
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | Required. Window end as an ISO 8601 timestamp, e.g. 2026-06-20T00:00:00.000Z — plain wall clock time, same caveat as start (the "Z" is a format artifact, not a UTC claim). Treated as inclusive and must be after start. All timestamps returned by this API are likewise plain wall clock time, unconverted. | |
| band | No | Optional (default: "all"). Which readings to return. "low" = below the low boundary (hypo); "high" = above the high boundary (hyper); "target" = in range, between the boundaries inclusive; "all" = every reading, each tagged with its band. | all |
| lower | No | Optional. Low (hypo) boundary in the chosen unit; readings below it count as time-low. Omit to use the server default (OMNI_LOWER). Pass only to override for this one call, e.g. to ask about time under a different threshold. | |
| start | Yes | Required. Window start as an ISO 8601 timestamp, e.g. 2026-06-19T00:00:00.000Z. IMPORTANT: despite the trailing "Z", this is plain WALL CLOCK time, not true UTC — Glooko records only the literal date/time the patient's device showed, with no timezone attached. Use the patient's own wall-clock digits directly (no conversion): resolve "yesterday" or "last 3 weeks" straight into the matching wall-clock date and time. Treated as inclusive. | |
| units | No | Optional. Glucose unit for this call. Omit to use the unit configured on the server (OMNI_UNITS). One of: "mmol" (mmol/L) or "mgdl" (mg/dL). Pass only to override the configured unit for this one call. | |
| upper | No | Optional. High (hyper) boundary in the chosen unit; readings above it count as time-high. Omit to use the server default (OMNI_UPPER). Pass only to override for this one call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden, and it is unusually thorough: it discloses the 21-day cap, that times are device-local wall-clock rather than UTC, that glucose values use the configured unit, that thresholds can be overridden, and what the returned object contains. This goes well beyond a minimal read-only statement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Although the description is longer than average, every sentence earns its place: purpose, filtering semantics, use-case guidance, caveats, and return shape are each covered once and in logical order. It is front-loaded with the core purpose and avoids redundant restatements of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description correctly compensates by enumerating the return fields: window, thresholdsUsed, band, count, and the readings array with its per-point fields. Combined with the time-zone warning, the 21-day cap, and explicit sibling-tool routing, an agent has everything needed to invoke and interpret this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema already documents all six parameters in detail, including enums, defaults, requirements, and the wall-clock caveat. The description usefully reinforces the band semantics and the meaning of the optional boundaries, but it does not add significant new per-parameter meaning beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise statement: 'Individual timestamped CGM readings for a window', which names the resource, the verb, and the scope. It also distinguishes itself from siblings by clarifying that this returns raw points, while get_chart_series is downsampled and get_diabetes_summary/get_trend are aggregate tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells the agent when to use band='low'/'high' vs 'all', and names concrete alternatives for other use cases: get_chart_series for wide charts, get_diabetes_summary or get_trend for aggregate stats. It also warns about the 21-day cap, leaving no ambiguity about when this tool is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_hourly_trendsHourly (circadian) trendsA
Time In Range and average glucose pooled by clock-hour across the whole window, so every reading that fell in the 07:00 hour on any day is combined into one 07:00 row, and so on for all 24 hours.
Use it for "why am I always high/low at a certain time" questions, recurring circadian patterns, the dawn phenomenon and evening highs.
Hours are the device's own wall-clock hour (not UTC) — this already IS the patient's local hour at the time each reading was taken, so present it as-is with no conversion.
Returns: a byHour array of up to 24 rows, each with hour (wall clock, "HH:00"), averageBG, timeInRange, timeLow, timeHigh and the reading count for that hour. Glucose values are in the configured unit.
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | Required. Window end as an ISO 8601 timestamp, e.g. 2026-06-20T00:00:00.000Z — plain wall clock time, same caveat as start (the "Z" is a format artifact, not a UTC claim). Treated as inclusive and must be after start. All timestamps returned by this API are likewise plain wall clock time, unconverted. | |
| lower | No | Optional. Low (hypo) boundary in the chosen unit; readings below it count as time-low. Omit to use the server default (OMNI_LOWER). Pass only to override for this one call, e.g. to ask about time under a different threshold. | |
| start | Yes | Required. Window start as an ISO 8601 timestamp, e.g. 2026-06-19T00:00:00.000Z. IMPORTANT: despite the trailing "Z", this is plain WALL CLOCK time, not true UTC — Glooko records only the literal date/time the patient's device showed, with no timezone attached. Use the patient's own wall-clock digits directly (no conversion): resolve "yesterday" or "last 3 weeks" straight into the matching wall-clock date and time. Treated as inclusive. | |
| units | No | Optional. Glucose unit for this call. Omit to use the unit configured on the server (OMNI_UNITS). One of: "mmol" (mmol/L) or "mgdl" (mg/dL). Pass only to override the configured unit for this one call. | |
| upper | No | Optional. High (hyper) boundary in the chosen unit; readings above it count as time-high. Omit to use the server default (OMNI_UPPER). Pass only to override for this one call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it delivers: it explains the pooling semantics, the critical wall-clock vs UTC nuance, that hours are presented as-is without conversion, and the exact return fields. This is unusually transparent about a subtle timezone behavior that could easily cause misuse.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured: core behavior first, then use cases, then the timezone warning, then return format. Every sentence earns its place and no information is redundant with the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and no annotations, the description is remarkably complete. It covers what the tool computes, when to use it, the timezone interpretation, the unit convention, and the structure of the byHour result. An agent has enough to invoke it correctly without resorting to guesses.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The input schema fully documents start, end, lower, upper, and units. The description reinforces the window concept and timezone caveat already present in the schema but does not add new parameter-level information.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise definition: 'Time In Range and average glucose pooled by clock-hour across the whole window', naming both the resource and the aggregation behavior. It clearly distinguishes itself from ordinary time-series tools by emphasizing that all readings from the same wall-clock hour across days are combined into a single row.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly lists concrete use cases: 'why am I always high/low at a certain time' questions, recurring circadian patterns, dawn phenomenon, and evening highs. It does not name sibling tools or say when not to use this tool, but the context is clear enough for an agent to select it appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_meal_window_analysisPost-meal target window analysisA
A focused look around a single event (typically a meal bolus): exactly 30 minutes before and 3 hours after the timestamp you pass.
Use it to judge a post-meal excursion and how well a dose worked, without pulling whole days. Find the event time first (e.g. from get_enriched_bolus_log), then pass it here.
Glucose values are in the configured unit; times are plain wall clock time (device-local), not UTC.
Returns: targetEvent (the timestamp you passed), unit, a glucoseTimeline array (time, value) across the window, and an associatedBoluses array of enriched bolus records that fall in the window.
| Name | Required | Description | Default |
|---|---|---|---|
| units | No | Optional. Glucose unit for this call. Omit to use the unit configured on the server (OMNI_UNITS). One of: "mmol" (mmol/L) or "mgdl" (mg/dL). Pass only to override the configured unit for this one call. | |
| eventTimestamp | Yes | The concrete ISO 8601 timestamp of the meal/bolus event, in plain wall clock time (device-local) — use the exact wall-clock digits, no UTC conversion. Returned times are likewise wall clock, not UTC. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden and mostly succeeds. It discloses the exact time window, states that times are wall-clock device-local and not UTC, and clarifies that glucose values follow the configured/overridden unit. It also outlines the returned fields. Minor caveat: the phrase 'configured unit' does not explicitly restate the effect of the units override, but the schema compensates.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is tight and front-loaded: first the exact window, then the use case, then time/unit caveats, then the return shape. Every sentence earns its place without fluff or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has no output schema, but the description compensates by enumerating returned fields and their semantics. It also covers the key operational details: wall-clock times, unit conventions, and how to obtain the required timestamp. Nothing essential is missing for a caller to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already explains both parameters thoroughly. The description adds context about the event source and the analysis window, but it does not materially enhance the meaning of eventTimestamp or units beyond what the input schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool as a focused single-event analysis: 'exactly 30 minutes before and 3 hours after the timestamp you pass.' It distinguishes itself from broader sibling tools by saying 'without pulling whole days' and even points to a specific sibling for the prerequisite event time.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use the tool: 'Use it to judge a post-meal excursion and how well a dose worked.' It also gives a concrete workflow by directing the user to find the event time from get_enriched_bolus_log first. It does not enumerate every alternative or exclusion, but the guidance is clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_settings_historyPump settings historyA
Every Omnipod 5 setting change that was in effect during the window, in chronological order: DIA, max basal rate, and the time-segmented target, ISF and carb-ratio profiles.
Use it to establish which settings were active at a given time (essential before judging a bolus or an excursion), or to see how settings have been adjusted over a long span.
Glucose-based values (target, ISF) are in the configured unit. Effective timestamps are plain wall clock time (device-local), not UTC; the per-segment "from" times are pump-schedule clock-hours.
Returns: a settings array, each entry with its effective timestamp, DIA_hours, maxBasalRate, and the targetBg, isf and carbRatio profiles (each a list of {from, value} time segments).
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | Required. Window end as an ISO 8601 timestamp, e.g. 2026-06-20T00:00:00.000Z — plain wall clock time, same caveat as start (the "Z" is a format artifact, not a UTC claim). Treated as inclusive and must be after start. All timestamps returned by this API are likewise plain wall clock time, unconverted. | |
| start | Yes | Required. Window start as an ISO 8601 timestamp, e.g. 2026-06-19T00:00:00.000Z. IMPORTANT: despite the trailing "Z", this is plain WALL CLOCK time, not true UTC — Glooko records only the literal date/time the patient's device showed, with no timezone attached. Use the patient's own wall-clock digits directly (no conversion): resolve "yesterday" or "last 3 weeks" straight into the matching wall-clock date and time. Treated as inclusive. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure and does substantial work. It flags the wall-clock-not-UTC convention, warns that the trailing 'Z' is a format artifact, clarifies per-segment times as pump-schedule clock-hours, and states glucose units. It omits auth or rate-limit details, but covers the behaviors most likely to cause misinterpretation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the first sentence states exactly what is returned, the second gives usage context, and the remaining sentences add only high-value details about time handling and output shape. Every sentence earns its place without filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, but the description compensates by explicitly describing the returned settings array, its per-entry fields, and the time-segment shape ({from, value}). Combined with the 100%-covered input schema, an agent has enough information to invoke the tool and interpret its results correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline applies. The schema already documents start and end as required ISO 8601 wall-clock timestamps, inclusive behavior, and the timezone caveat. The description reinforces the window concept but adds little parameter-specific meaning beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: it retrieves every Omnipod 5 setting change in effect during a window, in chronological order, and enumerates exactly what is included (DIA, max basal rate, target/ISF/carb-ratio profiles). This scope is distinct from the sibling tools, which focus on glucose, trends, boluses, and device events.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives concrete use cases: establishing which settings were active before judging a bolus or excursion, and reviewing how settings changed over a long span. It does not explicitly name sibling alternatives or state when not to use this tool, but the usage context is clear enough for an agent to select it appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_trendBucketed trend over any timeframeA
Glucose, insulin and carb aggregates split into time buckets across a span, for "how have things changed month by month over the last year" style questions.
Each bucket is computed independently from the raw readings (not by averaging averages), so a year split by month returns 12 correct rows in a single call without pulling raw data back to you. Prefer this over making many separate summary calls for a multi-period comparison.
Insulin per bucket follows the same rule as elsewhere: bolus is summed from individual events; basal comes from Glooko's per-day totals. Each bucket also reports observedDays (the real decimal span of data in it) and a coverage percentage, so you can judge which rows to trust.
Returns: bucketCount and a buckets array. Each row has: bucket (period key), start, end, observedDays; glucose (avg, timeInRange, timeLow, timeHigh, stdDev, coefficientOfVariation, gmiEstimatedA1c, cgmReadingCount); insulin (bolusUnits, bolusUnitsPerDay, bolusEventCount, avgUnitsPerBolus, and when Glooko daily data exists basalUnits, basalDayCount, averageBasalUnitsPerDay, basalPercent, bolusPercent); carbs (carbsGrams, carbsPerDay, carbEntryCount); and coverage (cgmReadingCount, expectedReadingCount, coveragePercent, trustworthy).
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | Required. Window end as an ISO 8601 timestamp, e.g. 2026-06-20T00:00:00.000Z — plain wall clock time, same caveat as start (the "Z" is a format artifact, not a UTC claim). Treated as inclusive and must be after start. All timestamps returned by this API are likewise plain wall clock time, unconverted. | |
| mode | No | Optional (default: "calendar"). How the span is divided into buckets. "calendar" uses real calendar units (days/weeks/months/quarters) with ragged edges at the ends; "fixed" uses equal-length buckets of fixedSizeDays counting from the start date. Choose the bucket size with "granularity" (calendar) or "fixedSizeDays" (fixed). | calendar |
| lower | No | Optional. Low (hypo) boundary in the chosen unit; readings below it count as time-low. Omit to use the server default (OMNI_LOWER). Pass only to override for this one call, e.g. to ask about time under a different threshold. | |
| start | Yes | Required. Window start as an ISO 8601 timestamp, e.g. 2026-06-19T00:00:00.000Z. IMPORTANT: despite the trailing "Z", this is plain WALL CLOCK time, not true UTC — Glooko records only the literal date/time the patient's device showed, with no timezone attached. Use the patient's own wall-clock digits directly (no conversion): resolve "yesterday" or "last 3 weeks" straight into the matching wall-clock date and time. Treated as inclusive. | |
| units | No | Optional. Glucose unit for this call. Omit to use the unit configured on the server (OMNI_UNITS). One of: "mmol" (mmol/L) or "mgdl" (mg/dL). Pass only to override the configured unit for this one call. | |
| upper | No | Optional. High (hyper) boundary in the chosen unit; readings above it count as time-high. Omit to use the server default (OMNI_UPPER). Pass only to override for this one call. | |
| granularity | No | Optional (default: "month"). Calendar bucket size. Only used when mode is "calendar". One of: "day", "week", "month", "quarter". | month |
| fixedSizeDays | No | Optional (default: 7). Length of each bucket in days. Only used when mode is "fixed". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden, and it delivers: it explains that buckets are computed independently rather than by averaging averages, details insulin aggregation rules for bolus versus basal, and discloses observedDays/coverage percentages so the agent can judge trustworthiness. It also describes the exact return shape, which is critical given no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every section earns its place: use-case framing, computation semantics, insulin rules, trust metrics, and a complete return-field listing. It is front-loaded with the primary purpose and avoids filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, 8 parameters, and no output schema, the description is unusually complete. It documents the full return structure, covers edge semantics like independence of buckets and observedDays trust metrics, and complements the schema's timezone caveats and parameter documentation. Nothing essential for correct invocation appears missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, with all parameters, defaults, enums, and units already documented in the input schema. The description adds useful context about bucket independence and returned fields, but it does not materially expand parameter-level meaning beyond what the schema already provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: it returns glucose, insulin, and carb aggregates split into time buckets across a span. It clearly distinguishes this from other tools by framing it as a multi-period trend comparison, and the title reinforces the bucketed trend concept.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says to prefer this tool over making many separate summary calls for multi-period comparison. It explains the benefit — 12 correct rows in a single call without pulling raw data — which gives an agent a concrete decision rule for when this tool is appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Every tool targets a clearly distinct analytical purpose: overview aggregates, time-bucketed trends, circadian patterns, raw glucose, bolus-level detail, basal states, settings history, device-change markers, and chart data vs. rendered charts. Descriptions explicitly cross-reference alternatives (e.g., get_chart_series vs. get_chart_html), so an agent can reliably choose the right tool.
All 12 tools follow the same `get_<domain_specific_noun>` pattern, making the surface predictable and easy to scan. Names like get_diabetes_summary, get_daily_insulin, and get_settings_history clearly indicate both the action and the data being retrieved.
Twelve tools is a well-scoped size for a diabetes data analytics server: each tool covers a meaningful slice of the domain without redundancy or bloat. The count is comfortably within the ideal range and every tool appears justified by a distinct use case.
The set covers the core read-only query workflows end to end: high-level summaries, trends, raw CGM readings, chart rendering, bolus and basal insulin analysis, settings history, device events, and meal-window investigation. Cross-references between tools (e.g., meal analysis pointing to bolus log, chart rendering to raw glucose) leave no obvious dead ends for an agent.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
WHOOP recovery, strain, sleep and workouts in Claude via official WHOOP OAuth. Free, open source.
Garmin data in Claude & ChatGPT via the Garmin Health API. OAuth sign-in, no password sharing.
Connect Claude to Fathom meeting recordings, transcripts, and summaries
63 tools for Apple Health, Fitbit, Oura & Health Connect data in Claude, ChatGPT, Grok & Mistral.
Related MCP Servers
- AlicenseAqualityAmaintenanceEnables access to FreeStyle Libre glucose data through Claude Desktop, providing current readings, historical data, statistics, and trend analysis from LibreLinkUp accounts with secure credential storage.101MIT
- AlicenseAqualityAmaintenanceIntegrates Diabetes:M data with Claude Desktop to access glucose readings, insulin data, food diary, and health metrics through natural language conversations.11MIT
- FlicenseNot gradedqualityDmaintenanceEnables reading real-time continuous glucose monitor data from Dexcom sensors via the Share API, allowing Claude to access glucose levels, trends, and statistics.
- AlicenseAqualityBmaintenanceEnables Claude to access Abbott Freestyle Libre CGM data from multiple providers (LibreView, Terra, Thryve) to retrieve current glucose, history, and summaries via natural language.42MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/rilhia/podquery-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server