Photon Health MCP by usefulapi
Server Details
Read Photon Health patients, prescriptions, orders, pharmacies and medications; screen interactions.
- Status
- Healthy
- Uptime
- 96.6% over 24 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-06-18
- URL
- Repository
- m190/usefulapi-mcp
- GitHub Stars
- 0
TDQS
Scored across 21 tools
Each tool targets a distinct resource and action (get/list/search/screen) with clear boundaries. Overlapping concepts like search_medications and get_medication_by_ndc are differentiated by exact vs fuzzy lookup, and no two tools appear to do the same thing.
All tools use the consistent photonhealth_<verb>_<noun> snake_case pattern with a small, predictable verb set (get, list, search, screen). No mixing of conventions or styles.
21 tools is slightly above the typical 3-15 sweet spot, but the server covers many distinct healthcare entities (patients, prescriptions, orders, pharmacies, medications, catalogs, etc.), so each tool remains purposeful. Still, it is on the heavier side.
Read/query coverage is thorough across the main entities with drill-down paths from search to list to get. However, no mutation tools (create/update/delete) exist for orders, prescriptions, patients, etc., and a few detail endpoints (e.g., get_user, get_allergen) are missing; if the server is intentionally read-only, this is a minor gap.
Available Tools
21 toolsphotonhealth_get_catalogGet a catalogARead-onlyIdempotentInspect
Get one treatment catalog by id with its treatments and prescription templates (quantity, refills, days supply, directions). Photon GraphQL: catalog.
| Name | Required | Description | Default |
|---|---|---|---|
| catalog_id | Yes | Catalog id (from list_catalogs). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and non-destructive, so safety is covered. The description adds value by disclosing what the call returns (treatments plus prescription templates with quantity, refills, days supply, directions), which matters given there is no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the core action and scope; nothing is wasted. The trailing 'Photon GraphQL: catalog' fragment is minor metadata that adds little for an agent but is brief.
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 single-parameter get-by-id tool, the description covers the resource, its return contents, and the id source (via schema). With no output schema present, the return-shape hint is a meaningful completion, though permissions or empty-result behavior are not noted.
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 schema already documents catalog_id with the '(from list_catalogs)' provenance note. The description adds no syntax or format detail beyond the schema, 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?
States a specific verb ('Get'), resource ('one treatment catalog'), and scope ('by id'), and explicitly distinguishes itself from list_catalogs by being singular/get-by-id. It also names the returned contents (treatments, prescription templates).
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?
'Get one ... by id' implies the retrieval use case, and the schema ties catalog_id to list_catalogs, but the description itself states no explicit when/when-not or alternative routing. Usage is inferred rather than declared.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
photonhealth_get_fillGet a fillARead-onlyIdempotentInspect
Get one fill (a single dispensing of a prescription within an order) by id: state (SCHEDULED, NEW, SENT, CANCELED), requested/filled times, medication, prescription and order. Photon GraphQL: fill.
| Name | Required | Description | Default |
|---|---|---|---|
| fill_id | Yes | Photon fill id (fil_…). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds real value beyond that by naming the returned state values (SCHEDULED, NEW, SENT, CANCELED) and the fields returned, which is useful since no output schema exists. It does not mention not-found/error behavior, keeping it from a 5.
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?
One sentence, front-loaded with the operation and the resource, followed by the identifier requirement and the returned fields. No filler and no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully enumerates the returned fields (state, requested/filled times, medication, prescription, order), covering the return shape. The gaps are minor: no mention of lookup-failure behavior or how states relate to downstream workflows.
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% for the single fill_id parameter, including the 'fil_…' format hint, so the schema carries this dimension. The description adds no syntax or validation detail beyond what the schema already provides; 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?
Specific verb (Get) plus resource (one fill) with an inline definition of the domain term — 'a single dispensing of a prescription within an order' — which distinguishes it from the sibling get_prescription and get_order resources. An agent can tell exactly what entity this returns without opening the schema.
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?
'by id' implies the tool is a lookup keyed on a known fill id, so usage is inferable. However, it never states when to prefer this over list_prescriptions/get_order or where a fill id comes from, and gives no exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
photonhealth_get_medication_by_ndcLook up a medication by NDCARead-onlyIdempotentInspect
Find the medication matching a package NDC (11-digit National Drug Code). Photon GraphQL (clinical API): medicationFromNdc.
| Name | Required | Description | Default |
|---|---|---|---|
| package_ndc | Yes | Package NDC. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds useful context that this maps to the Photon GraphQL field 'medicationFromNdc', but does not disclose behavior on no-match or the shape of the result.
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, zero filler, with the core lookup purpose and the API mapping 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?
For a one-parameter idempotent lookup with no output schema, the definition is largely sufficient and the GraphQL reference helps an agent map it. It stops short of describing the returned medication data or the not-found case.
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 required parameter, so the schema carries the burden; baseline is 3. The description adds only that the NDC is 11-digit, a marginal clarification over the schema's own pattern.
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 ('Find') and resource ('the medication') with a clear lookup key (package NDC). It is distinguishable from search_medications and list_medication_packages because it performs an exact single-item lookup, though it does not explicitly name those siblings.
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 word 'matching' implies exact-match retrieval by NDC, which is implied usage guidance. However, it never states when to prefer this over search_medications or list_medication_packages, nor what to do when the NDC is unknown.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
photonhealth_get_orderGet an orderARead-onlyIdempotentInspect
Get one order by id: state, patient, pharmacy, address, fulfillment status/tracking and its fills. Photon GraphQL: order.
| Name | Required | Description | Default |
|---|---|---|---|
| order_id | Yes | Photon order id (ord_…). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description adds useful content about what the response contains (useful given there is no output schema), but omits auth/scope requirements and the 'Photon GraphQL: order.' backend pointer adds little for an agent.
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 with the operation front-loaded and no padding; the returned-field list is dense but informative. The trailing 'Photon GraphQL: order.' fragment is cryptic and borderline waste, which keeps it from a 5.
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 single-resource getter with one fully documented required parameter and no output schema, the description compensates reasonably by enumerating the returned fields. What remains missing (auth requirements, error behavior for an invalid id) is minor for this complexity level.
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% – the single order_id parameter is fully documented with its 'ord_…' prefix convention. The description only restates 'by id' and adds no format or validation detail beyond the schema, so 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 verb and resource ('Get one order by id') and enumerates the payload it returns (state, patient, pharmacy, address, fulfillment/tracking, fills). The singular 'one order by id' scope naturally differentiates it from the sibling photonhealth_list_orders without the agent needing to open either schema.
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?
Fetching a single order by id implies its use case, and the 'by id' phrasing contrasts implicitly with the list sibling. However, there is no explicit statement of when to prefer this over photonhealth_list_orders, nor any stated prerequisites (e.g., needing a valid ord_ id from a prior search).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
photonhealth_get_organizationGet the organizationARead-onlyIdempotentInspect
Get the Photon organization these API keys belong to: id, name, type, NPI, address and contact details. Photon GraphQL (clinical API): organization.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds a genuine behavioral fact beyond the annotations: the result is scoped to the organization that owns the API key, and it lists the fields returned (important since no output schema exists).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence front-loads the action and the returned fields, with a short trailing reference mapping ('Photon GraphQL (clinical API): organization'). Efficient, though the trailing API reference is more for doc-consistency than for the agent's decision.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters and no output schema, the description carries the return-value burden and does so by naming the fields returned. For a single-object, read-only lookup this is nearly complete; it is only slightly thin on auth/permission expectations.
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 no parameters, so there are no per-parameter semantics to document; per the rubric, zero parameters establishes a baseline of 4. Nothing is misleading or missing in this dimension.
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 and resource ('Get the Photon organization') and enumerates what is returned (id, name, type, NPI, address, contact details). It is the only organization-scoped tool among the siblings, so an agent can distinguish it without opening a schema.
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 phrase 'these API keys belong to' implies the tool is scoped to the caller's own organization, which is useful context, but there is no explicit when-to-use guidance or mention of alternatives (none exist among siblings, so the risk is low). Usage is 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.
photonhealth_get_patientGet a patientARead-onlyIdempotentInspect
Get one patient by Photon id, with allergies, medication history, preferred pharmacies, and their prescriptions and orders (ids + states). Photon GraphQL: patient.
| Name | Required | Description | Default |
|---|---|---|---|
| patient_id | Yes | Photon patient id (pat_…). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered. The description earns credit for disclosing what the call actually returns — allergies, medication history, preferred pharmacies, and nested prescriptions/orders as ids plus states — and for naming the underlying GraphQL field. It omits any note on authorization or on how large those nested collections can get.
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?
One densely packed sentence with the resource constraint first and the returned data second, plus a terse source mapping. Nothing is padded and nothing needed is buried.
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 correctly shouldered the burden of describing the return shape and did so concretely. Remaining gap is behavioral rather than structural: no mention of pagination or size limits on the bundled prescriptions and orders, which an agent calling this for a heavy patient would want to know.
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 parameter is fully documented as a "Photon patient id (pat_…)". The description's "by Photon id" adds no meaning beyond the schema, 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?
States a specific verb and resource plus the identifier type ("Get one patient by Photon id") and enumerates the payload contents, so the agent knows this is a single-record fetch rather than a list. It implicitly separates itself from photonhealth_list_patients, but never names a sibling explicitly.
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: the phrase "by Photon id" tells the agent it needs a `pat_…` identifier, which rules out the search-oriented tools. There is no explicit when-to-use, when-not-to-use, or named alternative for the many nearby record-fetch tools (get_order, get_prescription, get_pharmacy).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
photonhealth_get_pharmacyGet a pharmacyARead-onlyIdempotentInspect
Get one pharmacy by Photon id: name, NPI, NCPDP, address, phone, fax and fulfillment types. Photon GraphQL: pharmacy.
| Name | Required | Description | Default |
|---|---|---|---|
| pharmacy_id | Yes | Photon pharmacy id (phr_…). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered without description help. The description contributes the return field inventory but says nothing about authentication scope, rate limits, or not-found behavior for an unknown id.
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?
One tight sentence front-loads purpose and return fields, followed by a short GraphQL mapping note. Nothing is padded, though the trailing 'Photon GraphQL: pharmacy.' is marginal for an agent merely selecting the tool.
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 usefully enumerates the fields an agent can expect (name, NPI, NCPDP, address, phone, fax, fulfillment types), and the annotations carry the read-safety picture. Minor omissions are failure handling and confirmation of id source.
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 parameter already documents the Photon id format (phr_…). The description merely restates 'by Photon id' without adding lookup semantics such as error behavior on a malformed id, 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?
States a specific verb and resource ('Get one pharmacy') scoped by identifier, and enumerates the returned fields (name, NPI, NCPDP, address, phone, fax, fulfillment types). This implicitly separates it from sibling search_pharmacies, but never names that sibling explicitly, so differentiation remains inferential.
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 phrase 'by Photon id' implies this is the lookup path once a pharmacy id (phr_…) is already known, which is adequate implied guidance. It never states when to prefer search_pharmacies instead, nor what to do if only a name or NPI is available.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
photonhealth_get_prescriptionGet a prescriptionARead-onlyIdempotentInspect
Get one prescription by id: state, prescriber, patient, medication (with RxCUI/NDC codes), quantity, refills and fills remaining, days supply, directions, notes, diagnoses, dates and fills. Photon GraphQL: prescription.
| Name | Required | Description | Default |
|---|---|---|---|
| prescription_id | Yes | Photon prescription id (rx_…). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so safety is covered. The description adds the return-payload inventory (including RxCUI/NDC codes, refills/fills remaining, diagnoses), which is genuinely useful since there is no output schema. It stops short of describing not-found/error behavior.
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 carries the purpose and the returned fields efficiently. The trailing 'Photon GraphQL: prescription.' fragment is a low-value backend mapping note that slightly dilutes the otherwise tight structure.
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 single-parameter read tool with no output schema, the field enumeration substitutes well for missing return documentation, and annotations carry the safety profile. Only error/not-found semantics for an invalid id are absent.
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 parameter already documents 'Photon prescription id (rx_…)' with a minLength constraint. The description's 'by id' adds nothing beyond the schema, 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?
States a specific verb and resource with explicit cardinality and selector ('Get one prescription by id'), which cleanly distinguishes it from the sibling photonhealth_list_prescriptions. It even enumerates the payload surface (state, prescriber, medication, fills), so the agent knows exactly what it gets.
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 'by id' phrasing implicitly tells the agent it needs a prescription identifier, and the singular form implicitly contrasts with the list tool. However, it never explicitly states when to use this versus photonhealth_list_prescriptions or photonhealth_get_fill, nor any prerequisite for obtaining the id.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
photonhealth_list_catalogsList catalogsARead-onlyIdempotentInspect
List the organization's treatment catalogs (the medications it prescribes) with their treatments and prescription templates. Photon GraphQL: catalogs.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is fully covered by structured data. The description's added value is limited to naming the nested payload (treatments, prescription templates) and the 'Photon GraphQL: catalogs' backend mapping; it does not discuss result size, pagination, or per-organization scoping.
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 sentences, front-loaded with the operation and its scope, followed by a terse backend mapping note. Nothing is padded, though the trailing 'Photon GraphQL: catalogs' line is developer-facing metadata of marginal value to an agent deciding whether to call it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly compensates by stating the returned shape (catalogs with treatments and prescription templates), which is what an agent needs to decide whether this tool answers a question. Remaining gaps, such as pagination or whether results span a single organization, are minor for a read-only enumerator.
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 there is no parameter syntax for the description to carry; the baseline for a parameterless tool is 4. The description appropriately spends its words on what the call returns instead of inventing argument semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb+resource ('List the organization's treatment catalogs') and clarifies the domain meaning of 'catalog' as the medications the organization prescribes. It also enumerates the nested content (treatments, prescription templates), which distinguishes it from the singular get_catalog sibling, though the list-vs-get distinction is only implicit.
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 rather than stated: an agent can infer this is the bulk-enumeration counterpart to photonhealth_get_catalog, but the description never says when to use this tool versus the singular getter or the list_medication_* siblings. No exclusions or prerequisites are given, though for a zero-parameter enumerator that is a modest gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
photonhealth_list_dispense_unitsList dispense unitsARead-onlyIdempotentInspect
List the dispense units Photon accepts on a prescription (e.g. Each, Milliliter, Tablet). Photon GraphQL: dispenseUnits.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds that it's a fixed enumeration of accepted values, but doesn't note whether this is a static reference list or fetch behavior.
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 purpose, plus an examples list. The GraphQL field reference is a minor overhead but useful for tracing.
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 zero-param reference-list tool with no output schema and strong annotations, the description is nearly complete; naming the examples conveys return semantics. Lacking only explicit return shape, which is minor.
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?
Zero parameters, so baseline is 4. The description appropriately doesn't invent parameter discussion and instead spends its words on what the returned values are.
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 (dispense units), clarifies the domain ('Photon accepts on a prescription'), and gives concrete examples (Each, Milliliter, Tablet) that distinguish it from sibling list tools like list_catalogs or list_users.
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?
Implies usage context by tying units to prescriptions, suggesting it's for populating prescription fields, but gives no explicit when-to-use/when-not or reference to alternatives. Adequate rather than instructive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
photonhealth_list_medication_packagesList medication packagesARead-onlyIdempotentInspect
List the packages (package NDCs) of a PRODUCT-level medication from list_medication_products. Photon GraphQL: medicationPackages.
| Name | Required | Description | Default |
|---|---|---|---|
| medication_id | Yes | Medication id of a PRODUCT (from list_medication_products). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is fully covered elsewhere. The description adds only that the result set is package NDCs at the package level of the product hierarchy, and says nothing about pagination, ordering, or result size.
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 compact clauses, front-loaded with the action and resource, with no filler. Every element 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?
For a one-parameter read-only list tool with no output schema, the description conveys the hierarchy position and the return unit (package NDCs), which is enough to call it correctly. Minor gaps remain around result shape and volume.
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 parameter is already documented as a PRODUCT-level medication id from list_medication_products. The description restates the same constraint rather than adding format, example, or edge-case detail, 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?
States a specific verb (List) and resource (packages / package NDCs) and explicitly scopes it to PRODUCT-level medications, which distinguishes it from the sibling list_medication_products that returns the parent level. The GraphQL field name adds a concrete anchor.
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 phrase 'from list_medication_products' tells the agent the prerequisite step and where the required id comes from, which is clear routing context. It stops short of explicitly stating when not to use this tool (e.g. NDC- or package-level entry points).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
photonhealth_list_medication_productsList medication productsARead-onlyIdempotentInspect
List the prescribable products (strength + form) of a DRUG-level medication from search_medications. Photon GraphQL: medicationProducts.
| Name | Required | Description | Default |
|---|---|---|---|
| medication_id | Yes | Medication id of a DRUG concept (from search_medications). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly/idempotent/non-destructive/openWorld, so safety is declared. The description adds real behavioral context by disclosing what is returned (strength + form products) and the constraint that the input must be a DRUG-level concept, which the annotations 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the verb and resource, followed by the data-source dependency. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully names the returned fields (strength + form) and the required id domain, satisfying most of an agent's needs for this one-parameter list tool. It stops short of covering error or empty-result behavior, which is minor here.
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 parameter is fully documented in the schema, including the 'DRUG concept' qualifier. The description restates that same qualifier without adding new syntax, format, or validation detail, 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?
States a specific verb (List) and resource (prescribable products of a DRUG-level medication), and disambiguates the output shape as strength + form, which separates it from sibling list tools like list_medication_packages. An agent can identify exactly what this returns without opening a schema.
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 ties the input to search_medications, implying the workflow context. However, it never states when to prefer this over list_medication_packages or what to do if the id is not DRUG-level, so the guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
photonhealth_list_ordersList ordersARead-onlyIdempotentInspect
List pharmacy orders, filterable by patient and state (ROUTING, PENDING, PLACED, COMPLETED, CANCELED, ERROR). Each has the pharmacy, delivery address, fulfillment (type, state, carrier, tracking number) and fills. Photon GraphQL: orders.
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | Cursor: the id of the last item of the previous page. | |
| first | No | Page size (forward pagination). | |
| state | No | Order state. | |
| patient_id | No | Only this patient's orders (pat_…). | |
| patient_name | No | Filter by patient name. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is fully covered structurally. What the description adds beyond them is the composition of each result (pharmacy, delivery address, fulfillment with carrier/tracking number, and fills), which is genuinely useful given there is no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three front-loaded sentences of roughly forty words with no filler: purpose first, result shape second. The trailing 'Photon GraphQL: orders.' fragment is a slightly dangling backend hint rather than a fully earned sentence, which keeps it below a perfect score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description largely compensates by describing the nested result composition, and annotations handle the read-safe profile. Missing only secondary operational detail such as default page size, ordering of results, and when to reach for the singular get_order sibling.
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 all five parameters are already documented with types, enum values, pagination semantics and the pat_… id format. The description only echoes the state enum and the patient filter, adding no syntax or format detail beyond the schema; 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?
States a specific verb and resource ('List pharmacy orders') and enumerates the filter dimensions, so the agent knows exactly what this returns. It never names the sibling get_order for single-order retrieval, so differentiation from the singular sibling is left to inference rather than stated.
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 phrase 'filterable by patient and state' implies when the tool is useful, and the enumerated states give the agent a concrete filter vocabulary. There is no explicit guidance on when to prefer this over get_order, no pagination expectations, and no mention of default ordering or result limits.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
photonhealth_list_patientsList patientsBRead-onlyIdempotentInspect
List the organization's patients (id, external id, name, date of birth, sex, contact, address), optionally filtered by name. Photon GraphQL: patients.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Filter by patient name (partial match). | |
| after | No | Cursor: the id of the last item of the previous page. | |
| first | No | Page size (forward pagination). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=true, so the safety profile is covered. The description adds useful scope context ('the organization's patients') and the returned field set, but says nothing about pagination defaults, result limits, or ordering. With annotations carrying the safety burden, this is an adequate but not rich contribution.
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?
One front-loaded sentence with the resource and return fields stated first. The trailing 'Photon GraphQL: patients.' backend-mapping note is extra but harmless and cheap.
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 list tool with no output schema, the description helpfully enumerates returned fields plus the filterable dimension, and annotations cover the read-only/idempotent profile. Pagination is fully specified in the schema, so the only real gap is the absence of routing guidance versus get_patient.
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 every parameter (name, after, first) is already documented in the schema, including the partial-match semantics of name and the cursor/pagination meaning of after and first. The description only restates the name filter and adds no syntax, matching, or limits detail beyond the schema; baseline 3 is correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (the organization's patients) and enumerates the fields returned (id, external id, name, DOB, sex, contact, address), so an agent knows exactly what it gets. It does not explicitly differentiate itself from the sibling photonhealth_get_patient, though the plural + 'List' verb makes the distinction inferable.
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?
Only notes that results are 'optionally filtered by name,' which is a parameter capability rather than usage guidance. There is no statement of when to use this instead of photonhealth_get_patient, no prerequisites, and no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
photonhealth_list_prescriptionsList prescriptionsARead-onlyIdempotentInspect
List the organization's prescriptions, filterable by patient, prescriber and state (ACTIVE, EXPIRED, DEPLETED, CANCELED). Each has the medication, quantity, refills/fills remaining, directions, diagnoses and fills. Photon GraphQL: prescriptions.
| Name | Required | Description | Default |
|---|---|---|---|
| after | No | Cursor: the id of the last item of the previous page. | |
| first | No | Page size (forward pagination). | |
| state | No | Prescription state. | |
| patient_id | No | Only this patient's prescriptions (pat_…). | |
| patient_name | No | Filter by patient name. | |
| prescriber_id | No | Only prescriptions written by this prescriber (Photon user id). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld, and non-destructive, so the safety profile is covered. The description adds useful detail about what each returned prescription contains, but says nothing about auth, rate limits, or pagination behavior on top of 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the resource and filters front-loaded. The trailing 'Photon GraphQL: prescriptions' mapping is slightly redundant but arguably useful as an API anchor.
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 helpfully enumerates returned fields (medication, quantity, refills, directions, diagnoses, fills), filling the main gap. Pagination is only implicitly conveyed via the schema's cursor params, which is a minor omission.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents all six parameters including pagination cursors and enum values. The description only restates the filter categories and enum states, adding no syntax or format meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (organization's prescriptions) with the supported filters, cleanly separating it from the singular sibling photonhealth_get_prescription.
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 filters (patient, prescriber, state) imply the usage context but the description never says when to prefer this over get_prescription or search tools, nor any exclusions. Usage is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
photonhealth_list_usersList usersARead-onlyIdempotentInspect
List the organization's users (prescribers and staff): id, name, email, NPI, credentials and roles — use an id as prescriber_id in list_prescriptions. Photon GraphQL (clinical API): users.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Filter by user name. | |
| page_num | No | Page number (1-based). | |
| page_size | No | Page size (default 50, max 100). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so safety is covered. The description adds value beyond that by listing the returned field set (id, name, email, NPI, credentials, roles) and the underlying API source, which matters because no output schema exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One dense sentence that front-loads the resource and return fields, with the cross-tool usage hint last. The trailing 'Photon GraphQL (clinical API): users' tag is a minor source annotation that borders on noise but costs little.
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 usefully compensates by naming the returned fields, and pagination/filter params are fully covered by the schema. It is nearly complete; only deeper filtering behavior (e.g., substring vs exact name match) is left unstated.
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 all three params (name filter, page_num, page_size) are documented in the schema, so the baseline is 3. The description's mention of 'id' refers to an output field, not an input parameter, and adds no syntax or semantics for the inputs.
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 and resource ('List the organization's users') and disambiguates from siblings by scoping to 'prescribers and staff', which separates it from list_patients. It also enumerates the returned fields, so an agent knows exactly what this tool yields.
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?
Gives a concrete downstream use case: 'use an id as prescriber_id in list_prescriptions', which explains why an agent would call this before writing a prescription. It lacks explicit when-not guidance or a named alternative, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
photonhealth_screen_interactionsScreen for drug interactionsARead-onlyIdempotentInspect
Screen proposed medications for a patient against drug-drug and drug-allergy (and diagnosis) interactions, using the patient's allergies, medication history and existing prescriptions. READ-ONLY: nothing is written or prescribed. Returns alerts with type (DRUG, ALLERGEN, CONDITION), severity (MINOR, MODERATE, MAJOR), a description and the involved medications/allergens. Photon GraphQL (clinical API): prescriptionScreen.
| Name | Required | Description | Default |
|---|---|---|---|
| patient_id | Yes | Photon patient id (pat_…). | |
| treatment_ids | Yes | Medication/treatment ids to screen (med_…, from search_medications or a catalog). | |
| diagnosis_codes | No | Optional ICD-10 codes to screen against, e.g. ['I10']. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered; the description reinforces it with 'READ-ONLY: nothing is written or prescribed.' More valuably, it discloses the return shape (alert types DRUG/ALLERGEN/CONDITION, severities MINOR/MODERATE/MAJOR, description, involved medications), which no output schema provides.
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?
Front-loads the core action and scope, then the read-only guarantee, then the return shape, then the API reference. Slightly redundant to restate the read-only hint that annotations already carry, but no sentence is wasted.
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 usefully enumerates alert types and severities, and the API field name (prescriptionScreen) aids callers. Minor gaps remain: no note of the 20-item screening limit or guidance on what to do when no patient history exists.
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 patient_id, treatment_ids and diagnosis_codes are already fully documented in the schema. The description's mention of allergies/history/existing prescriptions is conceptual context rather than parameter-level detail, 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?
States a precise verb (screen) and resource (proposed medications) and names the three interaction classes it checks: drug-drug, drug-allergy, and diagnosis. This is clearly distinguishable from the read/list/search siblings, which all operate on stored entities rather than evaluating a proposed regimen.
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?
Explains the inputs it draws on (patient allergies, medication history, existing prescriptions) and that it evaluates 'proposed' treatments, which tells the agent this is a pre-prescription check. It stops short of explicitly naming conditions for preferring this over siblings or stating when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
photonhealth_search_allergensSearch allergensARead-onlyIdempotentInspect
Search Photon's allergen list by name (fuzzy), e.g. to map a patient's reported allergy to an allergen id/RxCUI. Photon GraphQL: allergens.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Allergen name, e.g. 'penicillin'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered. The description adds the meaningful behavioral detail that matching is fuzzy, but it says nothing about result limits, ordering, or return shape.
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 tight sentences with the core purpose front-loaded, and no wasted prose. The trailing 'Photon GraphQL: allergens' is minor implementation trivia rather than necessary agent guidance, keeping it just below a 5.
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 single-parameter lookup with no output schema, the description covers purpose, input semantics, and the intended downstream use (id/RxCUI mapping). It leaves the exact response fields unstated, but annotations and the hinted identifiers make it adequate.
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 baseline is 3, and the description adds real value by specifying that name matching is fuzzy — semantics the schema ('Allergen name, e.g. penicillin') does not convey. The id/RxCUI mention also hints at the accepted input domain.
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 (search) and resource (Photon's allergen list) and adds the matching mode (fuzzy by name). The example maps it clearly away from siblings like search_medications, so an agent can select it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a concrete usage context — mapping a patient's reported allergy to an allergen id/RxCUI — which tells the agent when this tool is appropriate. It does not name explicit exclusions or point to alternative siblings, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
photonhealth_search_medical_equipmentSearch medical equipmentARead-onlyIdempotentInspect
Search prescribable medical equipment/supplies (e.g. glucose test strips) by name. Photon GraphQL: medicalEquipment.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Equipment name (partial). | |
| after | No | Cursor: the id of the last item of the previous page. | |
| first | No | Page size (forward pagination). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds domain scope ('prescribable') and an example, but does not disclose pagination behavior, auth needs, or result format.
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 very short and front-loads the core purpose. The second sentence mapping to 'Photon GraphQL: medicalEquipment' is an implementation detail that adds little for an agent selecting or invoking the tool.
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 low-complexity search tool with a fully documented 3-parameter schema and rich annotations, the description is sufficient to invoke it correctly. It omits usage alternatives and pagination narrative, but those are not essential here and pagination is covered by the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already fully documents name, after, and first. The description only echoes the name-search behavior and adds no syntax or filtering details 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?
States a specific verb (Search) and resource (prescribable medical equipment/supplies) with a clarifying example. The resource category clearly distinguishes it from sibling search tools like search_medications and search_pharmacies.
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 says how to search by name but gives no explicit when-to-use guidance, prerequisites, or alternatives to this tool. Usage is only implied by the tool name and resource category.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
photonhealth_search_medicationsSearch medicationsARead-onlyIdempotentInspect
Search Photon's medication database by drug name (partial) or code (RxCUI, NDC or SKU). Returns DRUG-level concepts with RxCUI/NDC codes, schedule, controlled flag, strength and form; drill down with list_medication_products / list_medication_packages. Photon GraphQL: medications.
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | RxCUI, NDC or SKU. | |
| name | No | Drug name (partial), e.g. 'amoxicillin'. | |
| after | No | Cursor: the id of the last item of the previous page. | |
| first | No | Page size (forward pagination). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description adds useful behavioral context: partial-name matching and the specific DRUG-level fields returned (RxCUI/NDC, schedule, controlled flag, strength, form).
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?
Three tight sentences, front-loaded with the core action and search modes, with return shape and drill-down guidance following. No wasted text.
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 carries the return-value burden and does name the key returned fields and concept granularity. Coverage is good for a 4-param search tool, though return-value completeness (e.g. pagination behavior) is only partially addressed.
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 all four parameters including the code formats and pagination cursor/size. The description restates the name and code formats but adds no syntax or format detail beyond the schema, 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?
States a specific verb and resource ("Search Photon's medication database") and explicitly lists the two lookup modes (partial drug name, or code via RxCUI/NDC/SKU). It further distinguishes itself from siblings by noting it returns DRUG-level concepts and pointing to list_medication_products / list_medication_packages for drill-down.
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 routes the agent clearly: use this for drug-level concepts and drill down with the named sibling tools. The alternatives are named and the selecting condition (DRUG-level vs product/package level) is stated, though it doesn't spell out explicit when-not scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
photonhealth_search_pharmaciesSearch pharmaciesARead-onlyIdempotentInspect
Search pharmacies by name and/or near a location (latitude/longitude + radius in miles), by fulfillment type (PICK_UP = retail, MAIL_ORDER). Returns NPI, NCPDP, address, phone, fax. Photon GraphQL: pharmacies.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Pharmacy name (partial). | |
| type | No | Fulfillment type (Photon's default is PICK_UP). | |
| first | No | Page size (forward pagination). | |
| offset | No | Number of results to skip (offset pagination). | |
| latitude | No | Search center latitude. | |
| longitude | No | Search center longitude. | |
| radius_miles | No | Search radius in miles (with latitude/longitude). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds genuinely useful behavior: the exact payload fields returned (NPI, NCPDP, address, phone, fax) and the GraphQL source ('pharmacies'), which matters because there is no output schema. It omits pagination/result-cap behavior.
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 dense sentence that front-loads the resource, then the filter facets, then the return payload. No filler or redundant restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully enumerates return fields, and with zero required params it correctly conveys that all filters are optional ('and/or'). It leaves pagination parameters (first, offset) to the schema, which is a minor gap.
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 baseline is 3, but the description adds meaning beyond the schema by interpreting the enum ('PICK_UP = retail, MAIL_ORDER'), specifying that radius is in miles and paired with latitude/longitude, and framing name as partial matching. It does not explain first/offset pagination semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Search) and resource (pharmacies) plus the three search axes: name, geo-radius, and fulfillment type. It also names the returned identifiers (NPI, NCPDP). It does not explicitly distinguish itself from the sibling photonhealth_get_pharmacy (single-record fetch), so it falls short of a 5.
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 implies when to use the tool by enumerating searchable facets ('by name and/or near a location', 'by fulfillment type'), which tells an agent it is for filtered discovery. However, there is no explicit when-not guidance, no mention of combining filters, and no routing to/away from photonhealth_get_pharmacy.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Related MCP Connectors
Read Elation Health patients, appointments, problems, allergies, medications, notes and vitals.
Read patient-authorized EHR records: medications, labs, conditions, allergies. Consent-bounded.
Query Health Gorilla FHIR patients, conditions, medications and lab results.
Read and write patients, facilities, medical documents, and consolidated FHIR records in Metriport.
Related MCP Servers
- AlicenseAqualityAmaintenanceEnables read-only FHIR access to Practice Fusion EHR to search patients, appointments, conditions, medications, and lab results.138 npm4MIT
- AlicenseNot gradedqualityBmaintenanceEnables read-only access to Chinese FHIR electronic health records, including patient summaries, medication review context, record queries, and attachment reading, along with controlled CSV import and status tools.MIT
- AlicenseNot gradedqualityDmaintenanceEnables interaction with FHIR servers to access, search, and manage FHIR resources, including appointment scheduling and cancellation.1MIT
- AlicenseNot gradedqualityBmaintenanceConnects frontier AI agents to HL7 FHIR R4 electronic health record repositories, enabling patient, observation, condition, medication, allergy, and diagnostic report queries plus draft-only clinical writes. Enforces mathematical safety gates, HIPAA-compliant tamper-evident audit logging, and token distillation of bulky FHIR payloads.Apache 2.0
Glama MCP Gateway
Add one secure layer between your agents and this server.