FineRx MCP server
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@FineRx MCP serverWhat's the US equivalent of Nurofen?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
FineRx MCP server
Give an AI assistant live access to FineRx drug-price data — the same catalog, package, price-comparison, and nearest-pharmacy data shown on the FineRx website — the free FineRx discount card, and the reviewed map of foreign medicine brands to their US equivalent (pages and card text in 12 languages), through the Model Context Protocol.
Source: github.com/andrewfinerx/finerx-mcp (public mirror of this package, MIT; issues welcome).
finerx-mcp is a thin client over the FineRx public REST API
(/api/public/v1). It has no direct database access and inherits the public
API's authentication and rate limits, so it adds zero extra attack surface.
Tools
Tool | What it does |
| Find drugs by name/alias → candidates with slugs + from-prices, plus any matching foreign brands |
| A drug's stats + strength/form variants + |
| Offer matrix (chain × savings program × price × observation date) + |
| Nearest store locations per chain around a ZIP |
| Dataset coverage, freshness, and attribution/disclaimer terms |
| The free discount card: codes, how to use it, ways to save it — plus an image of the card, and an interactive card in hosts that render MCP Apps |
| Email the card to an address the person gave, after they said yes |
| What to do when there is no prescription yet, or the brand costs too much |
| A medicine from another country → what it is in the US, the vetted sentence to say, the price, the card |
| What a US drug is called abroad (the reverse lookup) |
Every result embeds a one-line disclaimer and, wherever a price appears, an
observedAt date. No tool ever returns hidden vendors or an operator reference
price.
The server also ships instructions (served to the client as system-level
guidance: quote the observation date, call find_us_equivalent first for a
medicine from another country, offer the card whenever you quote a price, never
say guaranteed/best/cheapest, never give medical advice), three
resources — finerx://card (the card as markdown), finerx://how-it-works,
and ui://widget/savings-card.html (the card as a UI component, below) — and
three prompts, price_and_card(drug), prescription_help(drug?) and
us_equivalent(brand, country?).
Related MCP server: MCP Healthcare Server
US equivalents (the thing nobody else does)
An immigrant does not search "atorvastatin" — they search Но-шпа, Nurofen,
Dolo-Neurobion, 999 Ganmaoling. FineRx holds a reviewed corpus mapping those
brands to their US status, and find_us_equivalent is how an assistant reaches
it instead of answering from memory.
find_us_equivalent(brand="Но-шпа")
# → usClass "rx_alternative", inn "drotaverine hydrochloride",
# guidance "No-Spa (drotaverine hydrochloride) is not sold in the US as the same
# product; the closest US options need a prescription. Ask a doctor or
# pharmacist which one fits."
# otherMatches [{"brand": "No-Spa", "countries": ["Poland"], ...}]
find_us_equivalent(brand="Nurofen", country="Turkey")
# → usClass "same_inn", usGeneric "ibuprofen", usBrands ["Advil", "Motrin"],
# usDrug {slug, fromPrice, observedAt}, savingsCard, and the guidance sentence
# that names ibuprofen as the thing to ask the pharmacist for.Three classes, and the difference between them is the whole honesty of the
feature: same_inn means the same active ingredient is sold here (not the
same product — strength, form and excipients differ, which is what
guidanceDisclaimer says); rx_alternative means it is not sold here and
the closest US options need a prescription, so the answer is "ask a clinician",
never a named swap; no_equivalent means nothing here matches, and the
components breakdown states each ingredient's own US status rather than
inventing a substitute.
guidance is written and reviewed server-side. Quote it; do not paraphrase,
translate or extend it — a sentence composed by the model is a medical claim
nobody reviewed. foreign_brands_for_drug(slug) is the reverse ("what is
lisinopril called in Mexico?"), and search_drugs carries a foreignBrands
list so a client that only calls search still finds the corpus.
Handing over the card
The card is the free LowerMyRx discount card FineRx distributes. It is not insurance, needs no signup, and is credited at the pharmacy counter by the group code — so an assistant can hand it over completely, with no click-through:
get_savings_cardreturns the three counter codes, what the card is and is not, the steps to use it, the sentence to say to the pharmacist, an optional observed price with its date, an FAQ and the legal lines — and a PNG of the card as an image content block, so a chat client can show something the person saves to their phone. The PNG is fetched once per process and cached in memory; if that fetch fails the tool still returns the card text, andimageUrlis in the JSON either way for clients that cannot render images.email_savings_cardsends one card-only message. It refuses withoutconsent=trueand never calls the API in that case — the assistant has to ask for the address and an explicit yes first. The result masks the address (j***@example.com); FineRx does not store it.503means email delivery is off (offer the image or the link instead),429means the abuse cap was hit.compare_prices/get_drugcarry the same card object assavingsCard, so the card is present in the same turn as the price. Say "lowest" only whensavingsCard.price.isLowestis true; otherwise repeat the providednote.Every URL the tools return carries
src=<channel>(defaultmcp), so the assistant that sent someone is visible in FineRx's own analytics — nothing about the person is.
Renders as an app
On a host that supports UI components — ChatGPT (Apps SDK) and any host that
implements the standard MCP Apps extension, which is how Claude renders one —
get_savings_card does not just return JSON: the host draws the card in the
conversation.
The component is the resource
ui://widget/savings-card.html, served with mime typetext/html;profile=mcp-app.get_savings_cardpoints at it from its tool_meta, under both the standard key (ui.resourceUri) and OpenAI's alias (openai/outputTemplate), so it renders in either kind of host.It shows the teal card with the three counter codes (large and selectable), the card price for the drug when one is known (with the date it was observed and the vetted note — never a "lowest" badge unless
price.isLowestis true), the sentence to say to the pharmacist with a Copy button, the steps, buttons to open / print / save / email the card, the FAQ, and the legal lines. Every string comes from the tool result'slabels, so it speaks the same language and uses the same words as finerxfinder.com.The Email button calls
email_savings_cardfrom inside the component (which is why that tool is declaredui.visibility: ["model", "app"]/openai/widgetAccessible). Consent is a checkbox the person ticks; the address is sent once and never written back into the page.The document is entirely self-contained — inline CSS and vanilla JS, no external script, stylesheet, font or image — because hosts serve it under a
default-src 'none'CSP. Links are opened through the host bridge (window.openai.openExternalorui/open-link), neverwindow.open.It renders with no data at all (a host that sends nothing still shows the three codes), with no
priceblock, and with nolabels(English fallbacks).
Testing it without a host. The tool result is the whole input, so a mocked bridge is enough:
uv run --project packages/finerx-mcp python -c \
"from finerx_mcp.widget import load_widget_html; open('/tmp/w.html','w').write(load_widget_html())"Prepend a <script> that defines window.openai = {toolOutput: <a /card response>, theme: "light", locale: "en", callTool: …, openExternal: …} to that
file and open it in a browser for the ChatGPT bridge; or put the widget in an
<iframe srcdoc> and have the parent answer ui/initialize and then post a
ui/notifications/tool-result notification to exercise the standard bridge.
get_savings_card's structuredContent is exactly what the component reads, so
GET /api/public/v1/card is a ready-made fixture.
Prerequisites
A FineRx developer API key (format
frx_live_...). Request one by emailing partners@finerxfinder.com — see https://finerxfinder.com/developers.uvinstalled (providesuvx).
Configuration
The server reads two environment variables:
Variable | Required | Default | Notes |
| yes | — | Your |
| no |
| Point at another host for local testing |
| no |
| PNG |
| no |
|
|
| no |
| Bind address for the HTTP transport |
| no |
|
|
Install & run
Run directly with uvx (no manual install needed):
FINERX_API_KEY=frx_live_xxxxxxxx uvx finerx-mcpThe server speaks MCP over stdio by default.
Remote (HTTP) mode
The same tools can be served over Streamable HTTP — the transport that connector catalogs (ChatGPT Apps, Claude connectors, Gemini, Grok) consume, so a user adds FineRx by URL with no local install. Set the transport (and, for a hosted deployment, the bind host/port):
FINERX_API_KEY=frx_live_xxxx \
FINERX_MCP_TRANSPORT=streamable-http \
FINERX_MCP_HOST=0.0.0.0 FINERX_MCP_PORT=9000 \
uvx finerx-mcp
# → endpoint at http://<host>:9000/mcpDefaults stay stdio, so existing Claude Desktop/Code/Cursor configs are
unaffected. The HTTP endpoint calls the same public REST API with the server's
FINERX_API_KEY, so hosting it exposes no data beyond the already-public API.
HTTP mode is stateless by default. Keyless one-shot connector calls — a
catalog probe, a single tool call from a chat — open a Streamable-HTTP session
and never DELETE it, so in session mode the transport map only grows (measured
on the hosted endpoint: 3568 sessions over 7 days, ~25 MB of swap a day, until
the container restarts). Stateless mode builds a transport per request and drops
it. It is safe here because no tool keeps per-session state: every call is a
fresh request against the public API, and the card-image cache is process-level,
not per-session. Set FINERX_MCP_STATELESS=0 if you need SSE resumability;
stdio ignores the setting entirely.
Claude Desktop
Add to your claude_desktop_config.json
(macOS: ~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"finerx": {
"command": "uvx",
"args": ["finerx-mcp"],
"env": {
"FINERX_API_KEY": "frx_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}
}
}
}Restart Claude Desktop; the FineRx tools appear in the tools menu.
Claude Code
claude mcp add finerx --env FINERX_API_KEY=frx_live_xxxx -- uvx finerx-mcpOr add it to .mcp.json in your project:
{
"mcpServers": {
"finerx": {
"command": "uvx",
"args": ["finerx-mcp"],
"env": { "FINERX_API_KEY": "frx_live_xxxxxxxx" }
}
}
}Local development
Run against a local FineRx stack (e.g. the dev proxy on :8080):
export FINERX_API_KEY=frx_live_... # a key you created via the CLI
export FINERX_API_BASE=http://localhost:8080/api/public/v1
uv run --project packages/finerx-mcp finerx-mcpA smoke test that drives one tool call end-to-end lives at
scripts/smoke_mcp.py in the FineRx repo.
Run the unit tests (HTTP is stubbed — no key, no network):
uv run --project packages/finerx-mcp --with pytest --with pytest-asyncio \
pytest packages/finerx-mcp/tests -qTerms
Data is provided under the FineRx public API terms: attribution required ("Prices via FineRx"), prices are observed estimates (not guaranteed or insured prices) and may be out of date, and nothing here is medical advice. Pharmacy location coordinates are © OpenStreetMap contributors (ODbL).
Available Tools
10 toolscompare_pricesARead-onlyIdempotent
Compare FineRx prices for one package (an 11-digit NDC + quantity).
Use when you know the exact package. Returns the offer matrix — for each
pharmacy chain x savings program, the observed price and the date it was
observed (observedAt) — plus savingsCard (the free discount card, its
image, and the card price for this package when known). The cheapest offer is
flagged isLowest. Get an ndc from get_drug's packages or the search flow.
Do not call a price the lowest unless the offer says isLowest, and always give
the observation date. Offer the card whenever you quote a price here.
| Name | Required | Description | Default |
|---|---|---|---|
| ndc | Yes | ||
| locale | No | en | |
| channel | No | mcp | |
| quantity | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description reveals useful runtime behavior: return fields like observedAt and isLowest, the fact that the savings card may be relevant, and a caveat not to label a price as cheapest unless the offer says so. It does not discuss potential limitations like price recency or data availability, but the main behavior is well disclosed.
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 focused and front-loaded with the core purpose, then gives output shape and usage cautions. A little dense, but every sentence adds operational value without repetition or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description tells the agent how to invoke the tool, what the output contains, and how to present results responsibly. It does not explain the optional locale and channel parameters, but the critical workflow context and output semantics are covered.
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?
Because schema descriptions are essentially absent, the tool description adds important meaning for ndc and quantity, including the 11-digit NDC format. However, it leaves the locale and channel parameters unexplained, and it only partially compensates for the missing schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool compares FineRx prices for a single package identified by an 11-digit NDC and quantity. It also distinguishes the appropriate precondition ('when you know the exact package') from other lookup flows, so the agent can decide between this and sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says 'Use when you know the exact package' and tells the agent where to obtain an NDC if it does not already have one (get_drug's packages or the search flow). It also gives practical instructions about the savings card and how to report cheapest price, which helps correct invocation and response behavior.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
email_savings_cardA
Email the free FineRx discount card to an address the person gave you.
Use ONLY after the person has given an email address AND confirmed they want the
card sent there — ask for both first, then set consent to true. The message
contains the card and nothing else; FineRx does not store the address.
Returns {"sent": true, "to": } or {"sent": false, "error": ...}. On an error, say what happened and offer the image or the link instead.
Do not call this without an explicit yes, do not guess or reuse an address, do not retry a refusal, and do not read the full address back to the person.
| Name | Required | Description | Default |
|---|---|---|---|
| Yes | |||
| locale | No | en | |
| consent | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses meaningful behavior: the consent requirement, that the message contains only the card, that FineRx does not store the address, the masked return format, and the proper error-handling response. This gives the agent a clear mental model of side effects and privacy implications.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact, front-loaded with the core purpose, and organized into clear short directives covering prerequisites, behavior, return values, and prohibited actions. Every sentence adds operational value without unnecessary elaboration.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The combination of the detailed description, annotations, and output schema fully equips an agent to invoke the tool safely and correctly. It covers consent, address handling, error response, and fallback behavior, leaving little unstated. The locale parameter is the only minor gap, but it has a default and is not essential for the core call path.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 0% description coverage, but the tool description compensates well for email and consent by explaining that consent must be explicitly obtained and set to true. It does not explain the 'locale' parameter, which remains ambiguous, so it is not a perfect compensation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific action ('Email the free FineRx discount card') and the exact target ('to an address the person gave you'). This clearly distinguishes it from sibling tools like get_savings_card, which retrieves rather than sends.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use the tool ('ONLY after the person has given an email address AND confirmed they want the card sent there') and includes explicit prohibitions ('Do not call without an explicit yes', 'do not retry a refusal'). It also offers fallback alternatives on error: offer the image or link instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_nearby_pharmaciesARead-onlyIdempotent
Find the nearest pharmacy locations to a US ZIP code, per chain.
zip is a 5-digit US ZIP. Optional chains is a comma-separated list of
chain codes (e.g. "walgreens,publix"); default is all chains. limit caps
locations per chain. Coordinates are OpenStreetMap-sourced (ODbL).
| Name | Required | Description | Default |
|---|---|---|---|
| zip | Yes | ||
| limit | No | ||
| chains | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the behavioral safety profile (readOnlyHint, idempotentHint, destructiveHint=false). The description adds the OpenStreetMap/ODbL data source, which is a useful data provenance note, but does not disclose edge-case behaviors such as data freshness or response limitations. With annotations present, this is acceptable but not particularly rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and effective: one high-level sentence, then a short parameter guide, and a brief data-source note. It avoids excess phrasing and is front-loaded with the action. Divergence from schema or annotation is minimal, keeping the overall text easy to parse.
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 an output schema present and annotations covering safety/spatial openness, the description covers the main calling context: what the tool does, required parameters, and defaults. Missing details are minor like accepted chain values or error handling for invalid ZIP codes, but not essential for an agent to make a correct call in typical cases.
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 0%, so the description must carry the meaning for all three parameters. It does this thoroughly: zip is defined as a 5-digit US ZIP, chains is explained as a comma-separated list (with the example 'walgreens,publix') and that 'null' defaults to all chains, and limit is said to cap locations per chain. This far exceeds the schema's basic titles and types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear action and resource: 'Find the nearest pharmacy locations to a US ZIP code, per chain.' It is specific about scope (US ZIP, per chain) and easily distinguished from sibling tools like search_drugs or compare_prices, which are about drugs/pricing rather than location lookup.
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 its use case by describing the action, but it does not explicitly say when to use this tool versus alternatives or list exclusions. No siblings are referenced, and no 'use this when...' guidance is provided. The intended context is inferred from the purpose, not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_us_equivalentARead-onlyIdempotent
Find out what a medicine from another country is in the US, and what it costs.
Use when the person names a medicine that is not a US product — a brand from
home (No-Spa, Nurofen, Dolo-Neurobion, 999 Ganmaoling), a name in another
script (Но-шпа, 泰诺), or an ingredient the US calls something else
(paracetamol) — or asks "what is this called in the US?". Optional country
picks between brands of the same name sold in different places; locale is
a language code (leave it out and the host's own locale is used).
Returns the reviewed entry: usClass (same_inn = the same active
ingredient is sold here, rx_alternative = it is not and the closest US
options need a prescription, no_equivalent = nothing here matches),
guidance (ONE vetted sentence, written to be quoted word for word),
inn, usGeneric, usBrands, rxStatus, notes, components,
usDrug (slug, lowest observed price and the date it was observed),
savingsCard when there is a US drug to fill, pageUrl, and
otherMatches when the same brand name exists in more than one country.
found is false when nothing matched.
Next: quote guidance as written, then say guidanceDisclaimer. With a
usDrug, call compare_prices (or get_drug) for its slug, give the price
WITH its observation date, and offer the free card.
Do not call the US drug the same product, do not suggest swapping one for the
other, and for rx_alternative or no_equivalent do not name a
substitute at all — send the person to a pharmacist or a doctor. Do not
translate or reword guidance; it is reviewed text.
| Name | Required | Description | Default |
|---|---|---|---|
| brand | Yes | ||
| locale | No | ||
| channel | No | mcp | |
| country | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and destructiveHint=false, but the description goes beyond by detailing the output structure (usClass meanings, found flag, guidance being 'ONE vetted sentence' to quote verbatim) and explicit behavioral rules (do not translate/reword guidance, do not call the US drug the same product). This discloses important response-format expectations that annotations do not cover, 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is detailed but highly structured. It opens with the purpose, then usage, output fields, next steps, and finally safety warnings. Every sentence carries information that an agent needs; there is no fluff. The length matches the complexity of the tool, and it is front-loaded with the most critical usage context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, the description covers everything necessary: when to use, what parameters mean, what the response contains, how to chain subsequent tool calls (compare_prices, get_drug), and how to present results to the user. The existence of an output schema further reduces the burden on the description for return types. It is complete 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate. It explains brand indirectly via examples, and explicitly defines country ('picks between brands of the same name sold in different places') and locale ('a language code... host's own locale'). However, the `channel` parameter is not mentioned at all, and its purpose is left to the schema's default. Despite this minor gap, the description adds significant semantic value for the three primary parameters, so a 4 is warranted.
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 explicitly states the core function: 'Find out what a medicine from another country is in the US, and what it costs.' It provides concrete examples of inputs (No-Spa, paracetamol) and differentiates from sibling tools like search_drugs and get_drug by focusing on the US-equivalent lookup. It is clear, specific, and instantly distinguishable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives precise trigger conditions: 'Use when the person names a medicine that is not a US product...' and also covers the question phrasing ('what is this called in the US?'). It explains optional parameter usage (country, locale) and provides explicit next steps: quote guidance, call compare_prices or get_drug, offer the card. It also states what not to do (e.g., don't suggest substitutions). This is exemplary usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
foreign_brands_for_drugARead-onlyIdempotent
Find what a US drug is called abroad — the reverse of find_us_equivalent.
Use when the person has the US name and wants the home-country one ("what is
lisinopril called in Mexico?"), or when naming a foreign brand would let them
recognise the medicine you are describing. slug comes from search_drugs.
Returns the reviewed brands that resolve to this drug: brand,
brandScript (the home-country spelling), countries, inn and
usClass.
Next: name the brands from the person's own country first. An rx_alternative
entry is a DIFFERENT medicine US clinicians use for the same complaint — say
so if you mention it. Brands with no US equivalent never appear here.
Do not present any of these as interchangeable with the US drug, and do not tell anyone to buy or import one.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only, idempotent, and non-destructive. The description adds substantial useful behavior beyond that: returned fields, the special meaning of rx_alternative as a different medicine, the guarantee that brands with no US equivalent never appear, and explicit cautions against presenting interchangeability or advising purchases/imports.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence carries distinct information: purpose, usage, output fields, ordering guidance, and safety guardrails. The key purpose and usage are front-loaded, and the cautions are placed after the functional details where they are most relevant.
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-only tool with an output schema and rich annotations, the description covers everything an agent needs: source of the input, expected output, result interpretation, ordering preference, and limitations. No critical gap remains.
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 0%, so the description must compensate for the bare string parameter. It does this well by explaining that slug comes from search_drugs and illustrating with a user-phrased question, which tells the agent where to source the value. It stops short of defining the exact slug format, so a 4 is appropriate rather than a 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence declares a specific verb and resource: 'Find what a US drug is called abroad,' and explicitly contrasts it with the sibling find_us_equivalent. This makes the tool's scope immediately distinguishable from related tools without needing to inspect schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives concrete when-to-use guidance with a realistic user example ('what is lisinopril called in Mexico?') and states that slug comes from search_drugs. It also names the reverse sibling, allowing an agent to route between them correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_dataset_infoARead-onlyIdempotent
Get FineRx dataset coverage, freshness, and the attribution/disclaimer terms.
Returns dataset counts (drugs, products, prices, chains, savings programs, pharmacy locations), the latest observation date, and the terms every consumer must honor (attribution + disclaimer).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds useful context by mentioning the attribution/disclaimer terms that consumers must honor, which goes beyond the structured annotations and clarifies the tool's non-obvious output aspect.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the first sentence summarizes the resource, and the second enumerates the returned elements without redundancy. Every sentence adds value and the structure is easy to parse.
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?
This is a simple, zero-parameter metadata endpoint with a rich output schema and comprehensive annotations. The description covers the dataset-level purpose, key return categories, and the important legal attribution context, leaving no critical gap for an agent deciding to call it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the baseline for this dimension is 4. The description correctly avoids inventing parameter details and focuses on what the tool returns, which is appropriate for a no-input endpoint.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Get') with a clear resource ('FineRx dataset coverage, freshness, and attribution/disclaimer terms'). It clearly differentiates this metadata tool from the sibling search/price/savings tools by focusing on dataset-level information rather than individual drug or pharmacy data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly scopes the tool's role as dataset metadata retrieval, listing exactly what it returns (counts, latest observation date, legal terms). It doesn't explicitly name alternatives or exclusions, but given that it accepts no parameters and siblings are clearly operational tools, the context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_drugARead-onlyIdempotent
Get a FineRx drug's details: coverage stats, variants, and the savings card.
Use when you have a slug from search_drugs. Returns overall stats (product/
package/chain/vendor counts, fromPrice, latest observation date), the list of
variants (strength x form) each with a fromPrice, and savingsCard — the
free discount card with its codes, image, and (when known) the card price with
its observedAt date. locale is "en" or "es"; channel tags the links so
we can see which assistant sent someone. Do not quote a price without its
observation date, and offer the card whenever you quote one.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | ||
| locale | No | en | |
| channel | No | mcp |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the call as read-only, idempotent, and non-destructive, and the description is consistent with those. It adds value by disclosing that the response includes a savings card, that locale values are 'en'/'es', and that channel tags links for attribution. The price-date guardrail is additional behavioral context beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition front-loads the verb and resource, then proceeds from precondition to return payload to parameter semantics to usage guardrails in a logical order. At roughly 100 words, every sentence adds distinct information and none is redundant with the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a retrieval tool with an output schema, rich annotations, and only three parameters, the description gives an agent everything needed to invoke it correctly: input source, param meaning, return structure, and two concrete invariants about price display. There are no obvious gaps in selection or invocation context.
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?
With 0% schema description coverage, the description carries the full burden and succeeds: slug is tied to a search_drugs result, locale is constrained to 'en' or 'es', and channel's attribution purpose is explained. Each parameter receives meaningful real-world semantics rather than just a name/default.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Get a FineRx drug's details: coverage stats, variants, and the savings card,' naming the exact resource and the three payload components. It also anchors the tool to search_drugs via slug, which sets it apart from siblings like compare_prices and get_savings_card even though savings card data appears here.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says 'Use when you have a slug from search_drugs,' giving a concrete precondition for invocation. It adds operational guardrails ('Do not quote a price without its observation date, and offer the card whenever you quote one') that govern when this tool's output should be used. It does not explicitly contrast itself with get_savings_card or compare_prices, so it lacks explicit when-not/alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_prescription_optionsARead-onlyIdempotent
Explain the routes to filling a prescription, including having none yet.
Use when the person says they have no prescription, asks how to get one, or says
the brand costs too much. Optional drug is a slug from search_drugs.
Returns three sections — havePrescription (steps), noPrescription (named telehealth / clinic options, each with the disclosure to read out when FineRx earns anything), brandCostly (options) — plus a Medicaid note.
Read each option WITH its disclosure. Do not recommend a particular clinician, do not say what to take or at what dose, and do not frame any of this as medical advice.
| Name | Required | Description | Default |
|---|---|---|---|
| drug | No | ||
| locale | No | en |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, the description reveals that every option has a disclosure that must be read aloud, that a Medicaid note is included, and that the tool must not be framed as medical advice. These are non-obvious, invocation-relevant behaviors.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose and triggers, then return shape, then safety caveats. It is detailed enough for a medical-context tool but every sentence carries a distinct job, with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema covers return values, so the description's job is to provide usage context, which it does thoroughly, including disclosure handling and safety exclusions. It only falls short of fully complete by not documenting what locale affects or how it should be set.
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?
With 0% schema coverage, the description must define parameters itself; it does clarify that drug is an optional slug from search_drugs. However, locale is left with only its default and title, so the description only partially compensates for the missing schema documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names a specific operation and resource: 'Explain the routes to filling a prescription, including having none yet.' The description then enumerates the three output sections, which disambiguates it from price, pharmacy, and drug-info 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?
It states exact trigger conditions ('person says they have no prescription, asks how to get one, or says the brand costs too much') and routes the drug parameter to search_drugs. It also sets firm boundaries about what must not be done, effectively covering when-not behavior.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_savings_cardARead-onlyIdempotent
Get the free FineRx discount card: its codes, how to use it, how to save it.
Use when you have just quoted a FineRx price, when someone asks how to pay less
for a prescription, or when they ask for the card by name. Optional drug is
a slug from search_drugs and adds that drug's card price when we have one;
locale is a language code (leave it out and the host's own locale is used,
else English); channel tags the links with who sent the person.
Returns the card as JSON (the three codes to read at the pharmacy counter, what the card is and is not, the steps to use it, the sentence to say to the pharmacist, the ways to save it — image, print, link, email — an optional observed price with its date, an FAQ, the legal lines, and the UI labels) plus an image of the card. On a host that supports MCP Apps the same data is drawn as an interactive card in the conversation; that is a convenience, not a substitute, so STILL write the three codes in your own answer for the hosts and the people who cannot see it.
Offer ONE way to save it: show the image, send the link, or email it. Do not present the card as insurance, do not promise a price, and do not call a price the lowest unless price.isLowest is true — otherwise repeat price.note as written. The card is free and needs no signup.
| Name | Required | Description | Default |
|---|---|---|---|
| drug | No | ||
| locale | No | ||
| channel | No | mcp |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, openWorld, idempotent, and non-destructive hints, and the description adds substantial behavior beyond that: it clarifies the output shape, warns that the MCP Apps interactive card is not a substitute, instructs the agent to still write the codes, limits saving options to one, and imposes accuracy constraints about insurance, pricing, and lowest-price claims.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every section earns its place: usage triggers, parameter meanings, return contents, and agent rules. It is front-loaded with the primary purpose and structured into readable paragraphs. Slight redundancy exists in the output enumeration, but it compensates for the absence of an output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema and only minimal parameter schemas, the description is exceptionally complete. It covers return values, side-channel presentation behavior, usage constraints, pricing caveats, and all three parameters. An agent has enough context to invoke it correctly and handle its results appropriately.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description carries the full burden. It explains drug as a slug from search_drugs that may add a price, locale as a language code with a defined fallback, and channel as a link-tagging value. Each parameter is meaningfully described, though channel could be more precise about expected values.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Get'), a specific resource ('the free FineRx discount card'), and enumerates the concrete outputs: codes, usage steps, and saving methods. It is clearly distinguishable from siblings like search_drugs or compare_prices.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly names three trigger conditions: after quoting a FineRx price, when asked about paying less, or when the card is requested by name. It does not explicitly contrast with email_savings_card or other siblings, but the conditions are concrete enough for an agent to select this tool correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_drugsARead-onlyIdempotent
Search FineRx for drugs by name or localized alias.
Returns candidate drugs with their slug (use it with get_drug), kind (generic/brand), and lowest observed public price (fromPrice). Use this first to resolve a drug name to a slug.
foreignBrands carries any home-country medicine brand that matched the
same text (Нурофен, No-Spa, Dolo-Neurobion) with its active ingredient and
the US generic it maps to. When results is empty and foreignBrands is
not, the person named a medicine from another country: call
find_us_equivalent for the reviewed answer rather than guessing at one.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false, so safety is covered. The description adds meaningful behavioral context: the response includes slug, kind, and fromPrice; foreignBrands carries matched home-country brands with active ingredients and US generic mappings; and the empty-results-plus-foreignBrands case signals a non-US medicine. This goes well beyond what annotations 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?
The description is tightly structured and front-loaded with the core purpose. Every sentence earns its place: primary behavior, return fields, slug usage, foreign-brand behavior, and the routing condition. No filler or redundant restatement of the tool name or schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only search tool with a rich output schema and strong annotations, the description covers the essential contextual decisions: how to use the returned slug, how to interpret foreignBrands, and when to escalate to find_us_equivalent. Nothing critical is missing for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It enriches the required query parameter by defining it as 'name or localized alias,' which is valuable. The optional limit parameter is not described, but its meaning and default are already provided in the input schema, so the gap is minor.
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 FineRx for drugs by name or localized alias.' It explicitly frames the tool as the first step to resolve a drug name to a slug, and its reference to find_us_equivalent differentiates it from the sibling that handles foreign-brand mapping. The purpose is unambiguous and clearly distinct from get_drug and other 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?
Provides explicit usage guidance: 'Use this first to resolve a drug name to a slug.' It also gives a concrete conditional rule for when to instead call find_us_equivalent: when results is empty and foreignBrands is not. This tells the agent not only when to use the tool but also when to route to an alternative.
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. Dates show when Glama detected each change.
10 tool updates
v1.5.0- First observed
compare_prices - First observed
email_savings_card - First observed
find_nearby_pharmacies - First observed
find_us_equivalent - First observed
foreign_brands_for_drug - First observed
get_dataset_info - First observed
get_drug - First observed
get_prescription_options - First observed
get_savings_card - First observed
search_drugs
TDQS
Scored across 10 tools
Most tools have clearly distinct purposes: search/get/compare for drugs, find_us_equivalent vs foreign_brands_for_drug are cleanly separated by direction, and get_savings_card vs email_savings_card are distinct (retrieve vs send). The only mild overlap is get_drug vs compare_prices (both return prices), but their inputs and outputs differ enough (slug vs NDC) that an agent can choose correctly.
The set mostly follows a verb_noun pattern: search_drugs, get_drug, compare_prices, find_nearby_pharmacies, get_dataset_info, get_savings_card, email_savings_card, get_prescription_options, find_us_equivalent, foreign_brands_for_drug. Minor deviations: find_us_equivalent and foreign_brands_for_drug use a different verb style (find/foreign_brands_for) than the get_/search_/compare_/email_ pattern, but they are still readable and predictable.
10 tools is well within the ideal 3-15 range and each tool covers a distinct aspect of the domain: search, details, price comparison, pharmacy locations, dataset info, savings card, email, prescription options, and international equivalence (both directions). No tool feels redundant or extraneous.
The domain is consumer prescription savings, and the surface covers the full journey: resolving a drug name (search_drugs), getting details (get_drug), comparing prices (compare_prices), finding pharmacies (find_nearby_pharmacies), getting/sending the savings card (get_savings_card, email_savings_card), handling no-prescription or brand-costly situations (get_prescription_options), and international drug mapping in both directions (find_us_equivalent, foreign_brands_for_drug). Dataset info and attribution are also covered. No obvious dead ends.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Live US drug acquisition costs (CMS NADAC) for AI assistants. Free, no auth, weekly data.
US Rx prices by pharmacy + free discount card; also US equivalents of foreign brands, 12 languages
Pay-per-use tool marketplace for AI agents. Search, price-check, and call APIs via MCP.
Physician-reviewed medical opinions and prescriptions for AI agents.
Related MCP Servers
- AlicenseAqualityBmaintenanceEmpowers AI agents with direct access to the official ClinicalTrials.gov database, enabling programmatic searching, retrieval, and analysis of clinical study data through a Model Context Protocol interface.73,12391Apache 2.0
- AlicenseNot gradedqualityDmaintenanceProvides real-time access to medical data including drug interactions, ICD-10 codes, FDA adverse event reports, and clinical guidelines. It enables LLMs to query databases like openFDA, PubMed, and CMS for pharmaceutical and clinical information.1MIT
- FlicenseBqualityDmaintenanceEnables AI agents to query free biomedical and pharmaceutical APIs for clinical trials, drug data, molecular structures, adverse events, and research literature.14-
- AlicenseNot gradedqualityCmaintenanceUnifies five public US-government drug datasets into a single sourced page per GLP-1/cardiometabolic drug, providing cost, shortage, label, and alternatives. The MCP server exposes the same Drug contract as the UI for agent-native access.49,451,473Apache 2.0
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/andrewfinerx/finerx-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server