Skip to main content
Glama

SundhedMCP

Your AI now reads your health record. A small, local, read-only MCP server that lets Claude (or any MCP client) read your own record on sundhed.dk: medicine card, prescriptions, lab results, vaccinations and referrals.

Not affiliated with sundhed.dk, Sundhedsdatastyrelsen or MitID. For one person reading their own record on their own machine.

How it works

Your AI ──stdio──▶ SundhedMCP ──fetch() inside a real browser──▶ sundhed.dk
                        │
                        └─ you log in with MitID in that browser's window

sundhed.dk has no public API for citizens. SundhedMCP opens a browser window on sundhed.dk, you log in with MitID, and every tool then calls the same JSON endpoints the site's own pages use, from inside that logged-in browser.

  • Local only. No server, no account, no telemetry.

  • In memory. The session lives in the browser this process owns. Stop the server or close the window and it is gone. Nothing is written to disk.

  • Read-only. Only GET requests to the citizen pages.

  • CPR masked. CPR numbers are replaced with [CPR] in every result.

Related MCP server: Vista API MCP Server

Setup

Needs Node 24+ and Google Chrome, Microsoft Edge or Chrome Canary (or run npx playwright-core install chromium).

npm install
claude mcp add sundhedmcp -- node /path/to/sundhedmcp/src/stdio.ts

Then ask your assistant to "connect sundhed.dk", click Log på in the window that opens and approve in the MitID app. The window minimizes itself; leave it running.

Tools

Tool

What it returns

connect_sundhed

Opens the login window and waits up to 3 minutes for MitID

session_status

Whether the session is live, and how long the last one lasted

disconnect_sundhed

Closes the browser and forgets the session

get_summary

Counts: medicine, prescriptions, vaccinations

get_medication_card

Current medicine on Fælles Medicinkort

get_medication_details

One medicine: ATC code, prescriber, substitution, reimbursement

get_prescriptions

Open prescriptions with validity and remaining units

get_prescription

One prescription: dispensings left, pharmacy, package

get_lab_results

Regional lab results for a date range (default 12 months)

get_vaccinations

Every registered vaccination

get_vaccination

One vaccination: diseases covered, programme, coverage

get_referrals

Active and earlier referrals

Settings

Variable

Default

SUNDHEDMCP_BROWSER

tries chrome, msedge, chrome-beta, chrome-canary, chromium

Playwright channel to use

SUNDHEDMCP_KEEPALIVE_MS

240000

How often to touch the session; 0 turns it off

Development

npm test          # unit tests (synthetic data only)
npm run typecheck

Never commit captured responses: they are real health data. fixtures/private/ is ignored for that reason.

License

MIT. The landing page uses transitions from transitions.dev by Jakub Antalík.

Available Tools

12 tools
connect_sundhedConnect sundhed.dkA
Read-only

Starts a sundhed.dk login with MitID. Locally it opens a browser window and waits up to 3 minutes; tell the person to enter their MitID user ID there and approve in the MitID app. On a hosted server it returns a link the person opens to log in; relay the link and ask them to say when they are done. Call this when another tool says the person is not logged in.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior1/5

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

The description is transparent about opening a browser, waiting up to 3 minutes, and returning a link on hosted servers, which goes beyond the sparse annotations. However, it contradicts the readOnlyHint: true annotation by describing an action that starts a login and solicits user credentials, which is a state-changing interaction rather than a read-only operation. Per the scoring rule, this is an annotation contradiction and receives 1.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: the first sentence states the purpose, and the following sentences supply necessary procedural details for both deployment modes. No sentence is filler; the closing usage rule earns its place.

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

Completeness4/5

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

For a no-parameter, no-output-schema tool, this description covers the key operational details: what the tool starts, how it behaves locally vs hosted, how long it waits, and what the agent should tell the user. It doesn't specify the return value or failure behavior, but those are less critical because the next step is presumably to check session_status.

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

Parameters4/5

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

The tool has zero parameters and the schema already fully covers this (100% coverage), so the description has no parameter semantics to add. The baseline for zero-parameter tools is 4, and the description does not introduce any confusion about inputs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource: it starts a sundhed.dk login via MitID. This is clearly distinct from the sibling get_* tools and from session_status/disconnect_sundhed, so an agent can identify its role immediately.

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

Usage Guidelines4/5

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

It gives an explicit trigger: 'Call this when another tool says the person is not logged in.' It also adapts guidance for local and hosted environments, so the agent knows what to relay. It does not state a when-not condition or name alternative tools, but the usage context is clear.

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

disconnect_sundhedLog out of sundhed.dkA

Closes the browser and forgets the session. Nothing is stored, so the next use needs a new MitID login.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior5/5

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

The description adds meaningful behavioral context beyond annotations: it states that the browser is closed, the session is forgotten, nothing is stored, and a new MitID login is required next time. This fully clarifies the side effects and future session behavior, which annotations alone do not convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short, direct sentences with no filler. The most important behavioral fact (session termination) is front-loaded, and the consequence (new MitID login) follows immediately. Every sentence earns its place.

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

Completeness5/5

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

Given zero parameters, no output schema, and clear side-effect disclosure, the description is complete for an agent to invoke this tool correctly. The only needed context—what happens and what follows—is explicitly stated.

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

Parameters4/5

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

The input schema has zero parameters, so the baseline is 4. The description appropriately explains the operation without needing to document parameter semantics. Nothing is missing here.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the action as ending the session: 'Closes the browser and forgets the session.' This unambiguously differentiates it from siblings like connect_sundhed, session_status, and the various read-only get_* tools. Specific verb and resource are both explicit.

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

Usage Guidelines4/5

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

The description implies the correct context—use when the agent is done with the session or needs to log out—and distinguishes it from session_status and connect_sundhed. It does not explicitly state exclusions or alternative conditions, but the purpose is self-evident from the logout semantics.

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

get_lab_resultsTest resultsA
Read-only

Regional lab results (prøvesvar) for a date range, default the last 12 months: requisitions, analyses, values and reference intervals. An empty result means no regional results in that range, not that none exist anywhere; try a wider range.

ParametersJSON Schema
NameRequiredDescriptionDefault
toNoLast day, YYYY-MM-DD. Default today.
fromNoFirst day, YYYY-MM-DD. Default 12 months ago.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already provide readOnlyHint and openWorldHint, and the description builds on them by explaining that an empty result means no regional results in that range, not global absence. This adds meaningful behavioral context beyond the annotations, with no contradictions.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences convey purpose, scope, default behavior, included content, and the open-world caveat. Every sentence earns its place and the most important information is front-loaded.

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

Completeness4/5

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

For an optional-parameter read tool with full schema coverage and annotations, the description covers result contents, defaults, and the open-world caveat. Without an output schema, a little more detail about the result grouping would help, but the description is sufficient for correct invocation.

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

Parameters3/5

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

Schema coverage is 100%, so the baseline is 3. The description adds the concept of a date range and empty-result semantics, but the from/to defaults are already in the schema descriptions, so the added parameter-level value is modest.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource: retrieving regional lab results (prøvesvar) with requisitions, analyses, values, and reference intervals for a date range. This clearly distinguishes it from sibling medication, vaccination, prescription, and referral tools.

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

Usage Guidelines4/5

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

The description gives clear usage context: a read-only regional lab result lookup over a date range, defaulting to the last 12 months. It also provides actionable guidance on interpreting an empty result and widening the range, though it does not explicitly name alternative tools or exclusion criteria.

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

get_medication_cardMedicine cardA
Read-only

Current medicine on Fælles Medicinkort, newest first: drug, form, strength, dosage text, reason (Cause), active substance, start date and status. Use OrdinationId with get_medication_details.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint and openWorldHint, so the description only adds ordering and field enumeration. It discloses that the output is sorted newest first and contains the listed clinical attributes, including the OrdinationId for downstream calls. No contradiction with annotations; adds useful behavioral detail beyond the structured hints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences present the core information without fluff, front-loading the resource and ordering. The field list is dense but necessary given the lack of an output schema. No redundant phrases; every clause serves a purpose.

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

Completeness4/5

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

For a no-parameter, read-only list tool, the description covers the returned fields, ordering, and a pointer to the follow-up tool. It does not define the result shape (e.g., array) or error behavior, but those are not critical for an agent selecting the tool. Given the absence of an output schema, the field enumeration is essential and provided.

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

Parameters4/5

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

The input schema is empty (no parameters), so the rubric baseline is 4. The description adds no parameter-level meaning because none exist; the mention of OrdinationId refers to another tool's parameter. Schema coverage is effectively 100% and nothing is missing.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the tool returns the current medication list from Fælles Medicinkort with a defined field set and ordering. It names the specific sibling get_medication_details for per-ordination lookups, distinguishing the list from detail tools. This is a specific verb-resource statement that resolves ambiguity among siblings.

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

Usage Guidelines4/5

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

The description implies the tool is the entry point for viewing a patient's active medications, with no parameters required. It explicitly routes users to get_medication_details using the OrdinationId, but doesn't enumerate exclusions like prescriptions or vaccinations. Clear context, but no explicit when-not guidance.

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

get_medication_detailsMedicine detailsA
Read-only

One medicine on the card in full: ATC code, administration, substitution and reimbursement, dosage period, and who created, changed or stopped it.

ParametersJSON Schema
NameRequiredDescriptionDefault
ordination_idYesOrdinationId from get_medication_card

TDQS

A3.8/5.0
Behavior3/5

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 behavioral context by enumerating the returned fields, which is useful but does not disclose anything beyond that (e.g., pagination, performance, or error behavior). With annotations covering the core traits, this is a typical case where the description provides some value but not deep transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence with zero waste. The core purpose ('One medicine on the card in full') is front-loaded, followed by a precise list of the returned data. Every word earns its place; no fluff or repetition.

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

Completeness4/5

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

For a simple one-parameter tool with no output schema, this description covers the essential information: what it returns and its scope. It doesn't mention error cases or response format, but those are less critical here. Given the low complexity and the presence of readOnly/openWorld annotations, the description is nearly complete, leaving only minor gaps like explicit usage guidance (covered in dimension 2).

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

Parameters3/5

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

Schema description coverage is 100% – the schema already explains that ordination_id is the ID from get_medication_card. The description adds no additional meaning about the parameter itself; it focuses on the output. Since the schema already does the heavy lifting, a baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('get') and a clear resource ('medicine details'), and explicitly lists the fields returned (ATC code, administration, substitution, reimbursement, dosage period, and audit trail). This distinguishes it from sibling tools like get_medication_card (which likely returns a summary list) and get_prescription (which may be a different resource). No ambiguity.

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

Usage Guidelines3/5

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

Usage context is implied: 'One medicine on the card in full' suggests this is the detailed view for a single ordination, as opposed to the card overview. The parameter description ('OrdinationId from get_medication_card') hints at the prerequisite workflow, but the description never explicitly states when to use this tool versus alternatives, nor does it give negative guidance. It's not misleading, but it leaves the routing to inference.

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

get_prescriptionPrescription detailsA
Read-only

One prescription in full: dispensings given and remaining, remaining units, validity, issuing doctor and clinic, receiving pharmacy, package size, reimbursement and substitution.

ParametersJSON Schema
NameRequiredDescriptionDefault
prescription_idYesPrescriptionId from get_prescriptions

TDQS

A4.1/5.0
Behavior4/5

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 useful behavioral context beyond those hints by specifying exactly which facets of a prescription are returned and confirming it is the full single-prescription view, not a summary or list.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is one compact sentence with a clear leading phrase, 'One prescription in full', followed by a well-organized list of the included fields. Every item adds information and there is no filler or repetition.

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

Completeness5/5

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

For a simple get-by-id tool with one fully documented parameter, read-only annotations, and no output schema, the description is complete: it tells the agent what the call returns and the schema tells it how to supply the ID. No critical invocation detail is missing.

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

Parameters3/5

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

Schema description coverage is 100%: prescription_id is documented as 'PrescriptionId from get_prescriptions'. The description text does not add further meaning to the parameter itself, so the baseline 3 applies rather than a higher score.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies a singular, specific resource ('One prescription in full') and enumerates the exact data included: dispensings, remaining units, validity, issuing doctor/clinic, receiving pharmacy, package size, reimbursement, and substitution. This distinguishes it from siblings like get_prescriptions (plural list) and get_medication_details.

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

Usage Guidelines3/5

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

The singular phrasing and the schema note 'PrescriptionId from get_prescriptions' imply this is the drill-down detail tool after listing prescriptions. However, the description itself never explicitly states when to prefer it over siblings or which alternatives cover list-level or medication-card needs, so usage guidance remains implied 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_prescriptionsOpen prescriptionsA
Read-only

Open prescriptions (recepter): drug, strength, dosage, valid from and to, remaining units and status. Use PrescriptionId with get_prescription for dispensings left and the pharmacy.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior3/5

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

The readOnlyHint and openWorldHint annotations already establish this as a safe, potentially changing read operation. The description adds field enumeration but does not describe behavior such as pagination, ordering, or how 'open' is determined. It does not contradict the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two dense sentences deliver the return field list and an explicit routing instruction with no filler. The key scoping information is front-loaded and every word earns its place.

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

Completeness5/5

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

With no output schema and no parameters, the description sufficiently explains what is returned and where to go for richer details. For a simple read-only list tool, this is complete enough for an agent to invoke correctly.

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

Parameters4/5

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

This tool has zero parameters, so the description has little to explain. It helpfully mentions that PrescriptionId belongs with get_prescription rather than this tool, reducing the chance of misuse, though it does not explicitly say 'no parameters required.'

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description identifies the resource as open prescriptions and enumerates the returned fields (drug, strength, dosage, validity dates, remaining units, status). It also distinguishes itself from the sibling get_prescription by pointing out that the singular tool is needed for dispense-level detail.

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

Usage Guidelines5/5

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

The second sentence explicitly routes the agent: use PrescriptionId with get_prescription when dispense-level data or pharmacy info is needed, implying this tool is for the summary-level open prescription list. This directly clarifies when not to use this tool.

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

get_referralsReferralsA
Read-only

Active and earlier referrals (henvisninger) to specialists and hospitals.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint and openWorldHint, covering the safety profile. The description adds useful data-scope context (active plus earlier referrals to specialists/hospitals), but it does not disclosure response format, ordering, or any further behavioral details.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence with topic-first structure and no filler. The parenthetical 'henvisninger' is optional but harmless, and every word contributes to the meaning.

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

Completeness4/5

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

For a parameterless read-only lookup with no output schema, the description provides enough to understand what the tool returns. It could mention the response shape or referral statuses in more detail, but the simplicity of the tool does not require it.

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

Parameters4/5

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

The tool has zero parameters, so there is no parameter semantics for the description to add. With 100% schema description coverage and no parameters, the baseline of 4 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names the resource (referrals/henvisninger), scopes it to 'Active and earlier', and specifies target types (specialists and hospitals). This clearly distinguishes it from the health-data sibling tools, none of which target referrals.

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

Usage Guidelines3/5

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

There is no explicit when-to-use or alternative guidance; the intended usage is only implied by the resource name and content. Since no sibling tool targets referrals, the lack of routing instructions is a minor gap rather than a serious one.

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

get_summaryHealth record summaryA
Read-only

Counts across the record: active, paused and stopped medicine; open, closed and future prescriptions; given, planned and overdue vaccinations. A cheap first call.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4/5.0
Behavior3/5

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

Annotations already state readOnlyHint=true and openWorldHint=true, indicating a safe read operation. The description adds that it's a 'cheap' call, implying low cost/overhead, which is useful context beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, with the core purpose front-loaded and an efficient hint about its lightweight nature. No wasted words.

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

Completeness5/5

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

For a parameterless tool, the description fully conveys what it returns (counts across key health items) and when to use it. With annotations covering safety and openness, nothing essential is missing.

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

Parameters4/5

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

There are no parameters, so the description's job is not to explain parameters. The baseline for 0 params is 4, and the description correctly focuses on what the tool does, which is sufficient.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Clearly states the tool counts items across medicine, prescriptions, and vaccinations, and labels itself as a 'cheap first call'. However, it doesn't explicitly differentiate from sibling tools like get_medication_card or get_vaccinations, though the summary nature is implied.

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

Usage Guidelines4/5

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

The phrase 'a cheap first call' strongly implies when to use: as an initial overview before diving into specifics. It doesn't explicitly say when not to use it, but the context is clear enough for an agent to recognize it as a triage tool.

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

get_vaccinationVaccination detailsA
Read-only

One vaccination in full: diseases covered, vaccination programme, coverage, organisation, and whether a pharmacy or health record confirmed it.

ParametersJSON Schema
NameRequiredDescriptionDefault
vaccination_idYesVaccinationIdentifier from get_vaccinations

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, and the description adds context about the returned fields, including confirmation source (pharmacy or health record). It does not disclose potential incomplete data despite openWorldHint, but the annotation covers that. No contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that front-loads the core purpose ('One vaccination in full') and then lists the returned aspects. It is concise and well-structured with no wasted words.

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

Completeness4/5

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

For a simple detail-fetch tool with one parameter and no output schema, the description sufficiently conveys the return content. It doesn't explicitly state that the ID must come from get_vaccinations, but that is covered in the schema. The openWorldHint annotation adds context about potential incompleteness, which is not in the description but is already present as an annotation.

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

Parameters3/5

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

Schema coverage is 100% with a clear description for vaccination_id referencing get_vaccinations. The tool description adds no additional parameter semantics, so it stays at baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool returns a single vaccination's full details, enumerating specific aspects (diseases, programme, coverage, organisation, confirmation source). It distinguishes from the plural sibling get_vaccinations by specifying 'One vaccination'.

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

Usage Guidelines4/5

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

The description implies usage for retrieving details of a specific vaccination, contrasting with get_vaccinations which lists vaccinations. However, it does not explicitly state when to use this tool versus alternatives, nor does it mention prerequisites beyond the parameter reference in the schema. The schema's parameter description 'from get_vaccinations' provides the prerequisite, but that's in the schema, not the description.

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

get_vaccinationsVaccinationsA
Read-only

Every registered vaccination, newest first: vaccine, date, who gave it and how long it covers. Use VaccinationIdentifier with get_vaccination for the diseases it protects against.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and openWorldHint=true, which cover safety and non-exhaustiveness. The description effectively goes beyond annotations by disclosing the ordering (newest first) and the specific fields returned (vaccine, date, who gave it, coverage duration). It also hints at the openWorld nature by saying 'Every registered vaccination' and mentioning 'how long it covers', which adds behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise: two sentences that pack in the purpose, key output fields, ordering, and a pointer to the sibling tool. Every sentence earns its place, and the most important information (what it returns) is front-loaded. It avoids any fluff.

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

Completeness4/5

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

Given the tool's simplicity (no parameters, no output schema, annotations cover safety), the description is nearly complete. It tells the agent what will be in the result and how it's ordered, and explains how to get more detail (via get_vaccination). It doesn't specify the return format (e.g., is it an array?), but with no output schema, that might be acceptable.

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

Parameters4/5

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

The tool has zero parameters, so there is no parameter information to add beyond the schema. According to the rubric, a 0-parameter tool deserves a baseline of 4. The description does not attempt to describe parameters, which is appropriate; it focuses on output semantics, which is useful.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: listing all registered vaccinations, ordered newest first, with details on vaccine, date, administrator, and coverage. It distinguishes itself from the sibling 'get_vaccination' by explicitly naming it and noting the difference (get_vaccination uses a VaccinationIdentifier for disease-specific info). It doesn't fully specify that it's a read-only list operation, but the verb and resource are clear.

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

Usage Guidelines4/5

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

The description implies when to use this tool: to get an overview of all vaccinations, vs. get_vaccination for specific disease protection details. It mentions using VaccinationIdentifier with get_vaccination, but doesn't explicitly state when not to use this tool or provide exclusions such as 'use this only when you need the complete list'.

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

session_statusSession statusA
Read-only

Whether the sundhed.dk session is live, for how long, and how long the previous one lasted before sundhed.dk ended it.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior4/5

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

The readOnlyHint and openWorldHint annotations already establish that this is a safe, read-only operation. The description adds useful behavioral context beyond annotations by disclosing that the tool reports both the current session's liveness/duration and the previous session's duration, and that the previous session was ended by sundhed.dk.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that packs in the three key facts an agent needs: live status, current duration, and previous session duration. There is no filler or repetition of schema/annotation information.

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

Completeness4/5

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

Given the tool has no parameters and is read-only, the description is largely complete for selection and invocation. It conveys what the status report contains, though it omits unit/format details for the durations; since there is no output schema, slightly more format specificity would have been ideal.

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

Parameters4/5

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

The tool has zero parameters, so there are no parameter semantics for the description to clarify. Per the rubric, a zero-parameter tool receives a baseline of 4; the description appropriately focuses on output semantics instead.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the resource (the sundhed.dk session) and what the tool reports: whether it is live, its current duration, and the previous session's duration. It is distinct from the connect/disconnect and data-retrieval siblings, though it does not explicitly name an alternative.

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

Usage Guidelines2/5

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

No guidance is given on when to check session status versus using connect_sundhed, disconnect_sundhed, or the other getters. The intended context is implied by the title and sibling set, but the description itself offers no explicit when-to-use or when-not-to-use guidance.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 12 tool updatesv0.1.0
    • First observedconnect_sundhed
    • First observeddisconnect_sundhed
    • First observedget_lab_results
    • First observedget_medication_card
    • First observedget_medication_details
    • First observedget_prescription
    • First observedget_prescriptions
    • First observedget_referrals
    • First observedget_summary
    • First observedget_vaccination
    • First observedget_vaccinations
    • First observedsession_status

TDQS

A3.9/5.0

Scored across 12 tools

Disambiguation4/5

Most tools have distinct purposes: session management vs. specific data retrievals. However, get_medication_card and get_medication_details could be confused, as could get_prescriptions and get_prescription, though the descriptions clarify the granularity difference.

Naming Consistency4/5

Names follow a consistent verb_noun pattern: connect_, session_, disconnect_, get_medication_card, get_medication_details, get_lab_results, etc. The only minor inconsistency is 'session_status' (noun_verb instead of verb_noun), but it's a small deviation.

Tool Count5/5

With 12 tools, the server is well-scoped for its purpose: managing a healthcare session and retrieving key record data. Each tool serves a distinct need, and the count is within the optimal 3-15 range.

Completeness3/5

The server covers session management and core read operations (summary, medication, lab results, vaccinations, referrals), but missing common operations like updating or stopping medications for chronic conditions. There is no tool to get full patient demographics or to handle pharmacy interactions beyond prescriptions, leaving some gaps.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • -
    license
    Not graded
    quality
    Not graded
    maintenance
    Enables AI assistants to securely access Epic Healthcare Systems patient data through FHIR R4 API integration. Provides tools for searching patients, retrieving clinical summaries, vital signs, medications, and generating healthcare reports with HIPAA-compliant OAuth 2.0 authentication.
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI agents to access REMA 1000 data for personal accounts, including product searches with prices, personal offers, campaigns, receipts, and shopping list management.
    MIT