freestyle-libre-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@freestyle-libre-mcpWhat's my current glucose reading?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
freestyle-libre-mcp
An MCP server that gives Claude (or any MCP client) read-only access to FreeStyle Libre
CGM glucose readings shared through LibreLinkUp. It talks to the LibreLinkUp API with its
own small async client (librelinkup_mcp.core); the API behaviour it relies on follows
pylibrelinkup.
Tools
Tool | Returns |
| People the LibreLinkUp account follows |
| Latest reading with trend arrow |
| Readings from about the last 12 hours, oldest first |
| Logged events from about the last 2 weeks, oldest first |
Every reading tool takes an optional patient: a name ("Ann Lee", "ann") or a
patient_id from list_patients. It can be omitted when the account follows one person.
Readings include value in the account's unit, value_mg_dl, unit, timestamp (the
sensor's local time), timestamp_utc, and is_high/is_low flags. The current reading
also has age_minutes, since LibreLinkUp returns the last known value when the sensor or
phone is out of range.
Related MCP server: Dexcom G7 MCP Server
Setup
For a step-by-step guide, including account setup and troubleshooting, see the installation guide. Full documentation is at https://freestyle-libre-mcp.readthedocs.io.
You need a LibreLinkUp follower account: invite it from the LibreLink app, accept the invite in the LibreLinkUp app, and accept any terms there before using this server.
git clone https://github.com/osjayaprakash/freestyle-libre-mcp.git && cd freestyle-libre-mcp
uv syncVariable | Required | Default | Meaning |
| yes | Follower account email | |
| yes | Follower account password | |
| no |
| One of |
If the region is wrong, the first tool call tells you which one to set.
Run from PyPI
No clone needed; uv fetches and runs the published package:
uvx freestyle-libre-mcpIn a client config, use "command": "uvx", "args": ["freestyle-libre-mcp"].
Run with Docker
The server speaks MCP over stdio, so keep -i:
docker run -i --rm \
-e LIBRELINKUP_EMAIL -e LIBRELINKUP_PASSWORD -e LIBRELINKUP_REGION \
ghcr.io/osjayaprakash/freestyle-libre-mcp:latestIn a client config, use "command": "docker" with those arguments, and pass the
variables through the client's env block.
Claude Desktop
Add to claude_desktop_config.json:
{
"mcpServers": {
"librelinkup": {
"command": "uv",
"args": ["--directory", "/absolute/path/to/freestyle-libre-mcp", "run", "freestyle-libre-mcp"],
"env": {
"LIBRELINKUP_EMAIL": "you@example.com",
"LIBRELINKUP_PASSWORD": "your-password",
"LIBRELINKUP_REGION": "US"
}
}
}
}Claude Code
claude mcp add librelinkup \
-e LIBRELINKUP_EMAIL=you@example.com \
-e LIBRELINKUP_PASSWORD=your-password \
-e LIBRELINKUP_REGION=US \
-- uv --directory /absolute/path/to/freestyle-libre-mcp run freestyle-libre-mcpLangfuse tracing (optional)
Each tool call becomes a Langfuse trace, with a child span for the LibreLinkUp API call. Install the extra and set the keys:
uv sync --extra langfuseIn the server command, use run --extra langfuse freestyle-libre-mcp instead of
run freestyle-libre-mcp.
Variable | Meaning |
| Tracing is on only when both are set |
| Langfuse URL for self-hosted or regional instances (default: Langfuse Cloud) |
|
|
Privacy: glucose readings and patient names are health data. By default, traces hold
only tool names, timings, patient UUIDs, and error class names. Setting
LANGFUSE_CAPTURE_DATA=true sends readings and names to your Langfuse instance; only do
that with an instance you trust, such as a self-hosted one.
Development
uv sync
uv run pytest # offline suite
uv run pytest -m live # hits the real API; needs LIBRELINKUP_EMAIL/PASSWORD
uv run ruff check src tests && uv run ruff format --check src testsLicense
Available Tools
4 toolsget_current_glucoseARead-only
Most recent glucose reading with its trend arrow.
Check age_minutes: if the sensor or phone is out of range, this can be an old reading.
| Name | Required | Description | Default |
|---|---|---|---|
| patient | No | Name (e.g. 'Ann Lee' or 'Ann') or patient_id from list_patients. Omit when the account follows exactly one person. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint=true, openWorldHint=true), so the bar is lower. The description adds genuine context beyond them: that the value can be stale when the sensor or phone is out of range, and that age_minutes is the field to check. It omits auth requirements or rate-limit behavior, but the staleness disclosure is real added value.
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?
Two short sentences, front-loaded with the core purpose followed by the single most important caveat. Nothing is redundant and every 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?
An output schema exists, so return values need not be explained, and the lone optional parameter is fully covered by the schema. The staleness warning fills the main interpretive gap. Minor omission: no indication of refresh behavior or how old is 'old'.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single 'patient' parameter is fully documented in the schema (name or patient_id, when to omit), so the schema does the heavy lifting. The description adds nothing about the parameter; the age_minutes reference pertains to output, not input. Baseline 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?
States a specific resource with scope ('most recent glucose reading') plus an output detail ('trend arrow'), so the agent knows exactly what it fetches. It is implicitly distinct from get_glucose_graph and get_glucose_logbook, but never names or contrasts them, so sibling differentiation is left to inference.
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 staleness caveat ('Check age_minutes...') tells the agent something about interpreting results, but there is no explicit guidance on when to prefer this over get_glucose_graph or get_glucose_logbook. Usage is implied by the word 'current' rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_glucose_graphARead-only
Glucose readings from roughly the last 12 hours (about every 15 minutes), oldest first.
| Name | Required | Description | Default |
|---|---|---|---|
| patient | No | Name (e.g. 'Ann Lee' or 'Ann') or patient_id from list_patients. Omit when the account follows exactly one person. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered. The description adds genuinely behavioral context beyond that: the time window, the sampling cadence, and the sort order of results. It omits pagination/truncation behavior, but the added data-shape detail is real value.
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?
A single sentence, front-loaded with the resource and immediately followed by the scope, granularity, and ordering. No wasted words.
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?
An output schema exists, so return-format explanation is unnecessary, and annotations cover the safety profile. Combined with a fully documented parameter, the description supplies the remaining needed context (window, cadence, order). Only minor gaps like pagination/truncation remain.
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 a single optional 'patient' parameter that the schema fully documents (name or patient_id, omit for single-person accounts). The description adds no parameter-level detail, so the baseline 3 applies — the schema does the heavy lifting.
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 names the resource (glucose readings) and pins down scope precisely: roughly 12 hours, ~15-minute intervals, oldest first. That window and granularity clearly separate it from get_current_glucose, though it never explicitly names the sibling. It is a clear, well-scoped retrieval, just short of explicit sibling differentiation.
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?
Usage is only implied by the 12-hour window — an agent can infer this is for trend/history views rather than a single current value, but there is no explicit 'use this when...' or 'not for...' statement. No alternative is named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_glucose_logbookARead-only
Logged glucose events (scans, alarms) from roughly the last 2 weeks, oldest first.
| Name | Required | Description | Default |
|---|---|---|---|
| patient | No | Name (e.g. 'Ann Lee' or 'Ann') or patient_id from list_patients. Omit when the account follows exactly one person. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint=true, openWorldHint=true), and the description adds genuinely useful behavior: the approximate two-week coverage window and the oldest-first ordering. It stops short of noting pagination or result-count limits, so it is strong but not exhaustive.
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?
A single front-loaded sentence with the resource, event types, time window, and ordering — no filler, nothing 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?
An output schema exists, so return formatting needn't be explained, and the description supplies the time window and ordering that the schema does not. The only gap is that it never mentions the patient-scoping behavior, which the schema carries instead.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single optional patient parameter is fully documented in the schema, including the omit-when-single-patient guidance. The description adds nothing about the parameter, so the baseline 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 names a specific resource (logged glucose events: scans and alarms) and scopes it (roughly the last 2 weeks, oldest first), which implicitly separates it from get_current_glucose and get_glucose_graph. It lacks an explicit action verb, so the agent infers 'get/list', but the returned content is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the historical window and 'logged events' wording, which contrasts with the current-reading and graph siblings, but no sentence states when to prefer this tool or when not to use it. No alternatives are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_patientsARead-only
List the people this LibreLinkUp account follows.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds only the semantic scope ('this account follows') and nothing about ordering, pagination, or result shape. With annotations carrying the safety burden, this is adequate but thin.
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?
A single front-loaded sentence with no filler; it is exactly as long as the tool warrants.
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?
An output schema exists, so return values need not be described, and with no parameters there is little else required. The only missing piece is any hint of when to reach for this tool versus the glucose siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. There is nothing further about arguments for the description to clarify.
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?
States a specific verb (List) and resource (the people/patients this account follows), so the agent knows it enumerates the followed accounts. It doesn't explicitly contrast itself with the glucose-reading siblings, but the resource noun is distinct enough to disambiguate.
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?
There is no explicit when-to-use guidance or mention of alternatives. Usage is only implied by the resource (enumerate patients, presumably before calling the glucose tools), but the description never says so.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
4 tool updates
v0.1.1- First observed
get_current_glucose - First observed
get_glucose_graph - First observed
get_glucose_logbook - First observed
list_patients
TDQS
Scored across 4 tools
The four tools target distinct data types: patient list, current reading, 12-hour graph, and 2-week logbook events. Descriptions make boundaries clear, so misselection is unlikely.
All names use consistent snake_case with a clear verb_noun pattern (list_patients, get_*). The convention is predictable throughout.
Four tools is well within the ideal 3–15 range and each tool covers a distinct, necessary part of the LibreLinkUp data surface without bloat.
Core read workflows are covered (patients, current, recent graph, recent logbook). Minor gaps exist for custom time ranges or deeper historical queries beyond the fixed 12-hour/2-week windows, but agents can work around them.
Maintenance
Related MCP Connectors
Glucose readings from your LibreLink Up sensor: graph, logbook, stats and summaries (read-only). Sec
Read-only glucose, meal and spike data the user chooses to share from Journey for Health.
Read wearables and lab health data — sleep, activity, workouts, timeseries, lab tests and orders.
Household health records with source attribution. Read and add records with OAuth approval.
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
- FlicenseNot gradedqualityDmaintenanceProvides access to Dexcom G7 continuous glucose monitor data, enabling AI assistants to retrieve current glucose readings and historical data.14-
- AlicenseNot gradedqualityDmaintenanceRead-only MCP server for accessing glucose readings, charts, logbook, and statistics from LibreLink Up sensors, supporting any MCP client.MIT
- AlicenseNot gradedqualityDmaintenanceEnables clinical teams to list patients with active sharing and read glucose, graph, logbook, and statistics from LibreLink Up, with secure magic-link login and encrypted credentials.MIT