Skip to main content
Glama

MedBridge

An MCP server that gives an LLM live access to clinical trials, FDA drug recalls, adverse-event reports, drug labels, and drug-name normalization.

MCP (Model Context Protocol) is an open protocol that lets an AI application discover and call external tools over a standard interface. A client — Claude Desktop, an MCP-compatible IDE, or a custom agent — connects to a server, asks what tools it offers, and invokes them with typed arguments; MedBridge is one such server, wrapping three public healthcare APIs behind six validated tools.

Demo: asking Claude Desktop about recruiting diabetes trials near Dallas and metformin recalls, tools firing live

Claude Desktop answering from live data: search_trials returns recruiting Dallas trials by NCT number, then search_drug_recalls pulls FDA enforcement records for metformin.

This is informational public data only. Nothing MedBridge returns is medical advice, and it is not a clinical decision tool.

Tools

Tool

Purpose

Key parameters

search_trials

Find clinical trials for a condition

condition, status, location, max_results

get_trial

Full record for one trial, including eligibility criteria

nct_id

search_drug_recalls

FDA recall/enforcement reports for a drug

drug_name, max_results

get_adverse_events

Most frequently reported side effects for a drug

drug_name, top_n

get_drug_label

FDA-approved label: indications, warnings, dosage forms

drug_name

normalize_drug_name

Resolve a (possibly misspelled) drug name to its RxNorm concept

name

Every response carries source and retrieved_at. Long text fields are truncated at stated limits with a <field>_truncated: true flag when cut. Failures come back as a structured {error: true, error_type, message} rather than a stack trace or a silently empty result — see Design decisions.

Related MCP server: PubMed Advanced MCP Server

Install

Requires Python 3.11+.

git clone https://github.com/MYASHWANTHREDDY/medbridge-mcp.git
cd medbridge-mcp
python3 -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"

OPENFDA_API_KEY is optional — it raises openFDA's rate limit but every tool works without it. To set it:

cp .env.example .env
# then edit .env and set OPENFDA_API_KEY=your-key-here

Confirm the install:

pytest -q

Connect to Claude Desktop

Claude Desktop launches MCP servers as a local subprocess, configured in its claude_desktop_config.json:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

  • Windows: %APPDATA%\Claude\claude_desktop_config.json

Add a medbridge entry pointing at the venv's Python interpreter, running the server as a module. examples/claude_desktop_config.json has the template:

{
  "mcpServers": {
    "medbridge": {
      "command": "/ABSOLUTE/PATH/TO/medbridge-mcp/.venv/bin/python",
      "args": ["-m", "medbridge.server"]
    }
  }
}

Replace the path with the absolute path to your clone's .venv/bin/python, then restart Claude Desktop fully.

Running under WSL: Claude Desktop only ships for macOS and Windows, so on WSL the Windows-side Desktop app has to reach into the Linux filesystem to launch the server. Point command at wsl.exe instead and pass the real command as arguments — see examples/claude_desktop_config.wsl.json:

{
  "mcpServers": {
    "medbridge": {
      "command": "wsl.exe",
      "args": ["-d", "Ubuntu-24.04", "--", "/ABSOLUTE/PATH/TO/medbridge-mcp/.venv/bin/python", "-m", "medbridge.server"]
    }
  }
}

Replace Ubuntu-24.04 with your distro name from wsl.exe -l -v if it differs.

Once connected, Claude Desktop lists the six tools under its tools/search indicator and prompts for approval on first use of each.

Any MCP client

Nothing here is Claude-specific beyond the config file format. Any client that speaks the MCP stdio transport — an MCP-compatible IDE, a custom agent script, another chat client — can launch the same command (/path/to/.venv/bin/python -m medbridge.server) and connect. The server has no knowledge of which client is on the other end.

For interactive debugging outside any client, the official inspector works too (requires Node):

npx @modelcontextprotocol/inspector /ABSOLUTE/PATH/TO/medbridge-mcp/.venv/bin/python -m medbridge.server

Design decisions

Outputs are shaped, not proxied. Raw upstream JSON is deeply nested and full of fields no one asking a question needs — a tool response for LLM consumption is an interface design problem, not a pass-through. get_adverse_events, for instance, returns ranked reaction counts instead of raw case records, and long free-text fields are cut to stated limits with a truncation flag so the model reading the output knows it's seeing a summary rather than the whole field.

Errors are structured and honest. Every failure maps to exactly one of four types — not_found, upstream_unavailable, rate_limited, invalid_input — carried in a small dict a model can act on, instead of a stack trace. Zero legitimate matches is a success carrying an empty list and a note; only an actual failure sets error: true. That distinction is what lets a tool answer "no recalls found" correctly instead of a model guessing from a bare empty list whether the search worked.

Every response carries provenance: source (which upstream API answered) and retrieved_at (when). Public health data changes; a model — and the person reading its answer — should know how fresh it is and where it came from.

Caching is a single-process, in-memory TTL dict keyed on URL and sorted query parameters, not an external cache. The server is one process speaking stdio to one client at a time, so there's no second process to share cache state with, and no concurrent writer to guard against — an external cache would be deployment theater at this scale. It exists because public APIs are shared infrastructure and the same question tends to come up more than once in a conversation; repeated identical requests inside the TTL window are served from memory rather than hitting the network again. Retries on 429 and 5xx use exponential backoff for the same reason: a demo that hammers a public API on transient errors fails unpredictably and disrespects rate limits.

normalize_drug_name's candidates carry a match_source field (spelling_suggestion or approximate_term) beyond the minimal {name, rxcui, score} shape. This came from testing RxNorm's approximateTerm endpoint directly: for a misspelling like "metfromin" it ranks lexically similar but wrong concepts (e.g. "merbromin") above the intended drug and never surfaces it in a usable number of results. spellingsuggestions does return "metformin" for that input. Both endpoints answer genuinely different questions — one corrects a typo, the other finds lexically similar concepts — so both are consulted and merged, and each candidate names which one produced it.

Testing

pytest -q

60 tests, entirely offline — every upstream call is intercepted with respx against real response payloads captured live from all three APIs and trimmed to the fields the code actually reads (tests/fixtures/). Coverage spans the HTTP layer (success paths, openFDA's 404-means-empty convention, retry-then-succeed on 5xx, exhausted retries on 429 mapping to rate_limited, timeout mapping to upstream_unavailable), the pure shaping functions (exact output shapes, truncation flags, adverse-event aggregation), input validation (malformed identifiers, out-of-range counts, blank strings), and tool-level contracts (every success path carries source and retrieved_at; every failure path returns a structured error instead of raising).

Data sources and their terms

Source

Base URL

Notes

ClinicalTrials.gov

clinicaltrials.gov/api/v2

U.S. government public data; no key required. See terms and conditions.

openFDA

api.fda.gov

No key required; optional key raises the rate limit. openFDA explicitly disclaims the data as not for real-time clinical or production decision-making without independent verification — see openFDA terms.

RxNorm (NLM RxNav)

rxnav.nlm.nih.gov/REST

No key required for API access. RxNorm draws on source vocabularies that fall under the UMLS Metathesaurus; broader use beyond simple normalization lookups may require a free UMLS Metathesaurus License.

Limitations and future work

  • No drug-drug interaction tool. NLM's interaction API was retired; interaction data would need a different, licensed source, so this scope was cut rather than faked with a weaker substitute.

  • No pagination. Search tools return up to max_results (max 25) in one call; there's no cursor or next-page token for walking a full result set.

  • stdio transport only. No HTTP/SSE server mode, so MedBridge currently only runs as a locally spawned subprocess, not as a remote service multiple clients could share.

  • Tool layer, not yet an agent. MedBridge exposes these six tools to any MCP client today; wiring the same server into an autonomous agent loop that chains calls (search a trial, then check the drug's recalls, then normalize a name it wasn't sure about) is the natural next step.

License

MIT — see LICENSE.

Available Tools

6 tools
get_adverse_eventsA

Summarize which side effects are most often reported for a drug.

Returns the total number of FDA adverse event reports mentioning the drug and the most frequently reported reactions with their counts, rather than individual case records.

These are voluntary reports. A report does not establish that the drug caused the event, common drugs accumulate more reports simply by being common, and counts cannot be compared between drugs without knowing how many people take each. Present these as reported associations, never as side effects the drug is known to cause.

Args: drug_name: Generic or brand name, e.g. "metformin". top_n: How many of the most-reported reactions to return, 1 to 25. Defaults to 10.

Returns: Report total and ranked reactions, or zero reports with a note.

ParametersJSON Schema
NameRequiredDescriptionDefault
top_nNo
drug_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

With no annotations, the description carries the full burden and does so well: it discloses that results are aggregate counts, not individual records, that reports are voluntary and non-causal, that common drugs accumulate more reports, and that cross-drug comparisons are unreliable. It also mentions the zero-report fallback.

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

Conciseness5/5

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

The description is front-loaded with the core purpose, followed by return behavior, caveats, and parameters. Each sentence adds distinct value, and the structure is easy for an agent to scan.

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

Completeness5/5

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

Given the tool's complexity, the description is complete: it explains the output format, parameter constraints, interpretation caveats, and edge-case behavior. The presence of an output schema reduces the need to describe return values in detail, and the description still covers them.

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

Parameters5/5

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

Schema description coverage is 0%, so the description must explain the parameters, and it does: drug_name is defined as generic or brand name with an example, and top_n is given a numeric range, default, and semantic meaning. This fully compensates for the bare schema.

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

Purpose5/5

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

The description uses a specific verb ('Summarize') and a clear resource (FDA adverse event reports for a drug), and explicitly distinguishes itself from returning individual case records. This makes it easy to differentiate from siblings like get_trial, search_drug_recalls, and get_drug_label.

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

Usage Guidelines4/5

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

The description clearly conveys when to use the tool: to get aggregate reported side-effect information for a drug. It also provides important interpretational guidance about not treating reports as causal, though it does not explicitly name sibling alternatives or state when not to use this tool.

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

get_drug_labelA

Read the FDA-approved product label for a drug.

Use this for what a drug is approved to treat and what its labeled warnings say. Returns brand and generic name, manufacturer, approved indications, and warnings; the long text fields are truncated and flagged when cut.

Labels are per product, so a search can match a combination product or one manufacturer's version of a generic. Check the returned brand and generic names before relying on the text.

Args: drug_name: Generic or brand name, e.g. "metformin" or "Glucophage".

Returns: The label extract, or an empty result with a note when no label matched.

ParametersJSON Schema
NameRequiredDescriptionDefault
drug_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations, the description carries the full behavioral burden. It reveals key behaviors: labels are per product, matches may be combination products or a specific manufacturer's generic, long fields are truncated and flagged, and an empty result is returned with a note when there is no match. This is meaningful transparency beyond a simple read statement.

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

Conciseness5/5

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

Every sentence adds value: the purpose, the scoping use case, the per-product caveat, the truncation warning, and the Args/Returns sections. It is appropriately sized for a single-parameter tool with no annotations, and the main use is front-loaded.

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

Completeness4/5

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

The description covers the purpose, parameter semantics, return contents, truncation behavior, and no-match handling. It does not discuss potential errors or authentication, but for a read-only label lookup with one parameter, the provided context is nearly complete and sufficient for an agent to call it correctly.

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

Parameters5/5

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

Schema description coverage is 0%, but the description fully compensates by explaining the only parameter: 'drug_name: Generic or brand name, e.g. "metformin" or "Glucophage"'. It specifies accepted forms and provides concrete examples, so an agent knows exactly what to pass.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Read the FDA-approved product label for a drug.' It then clarifies the purpose by stating what to use it for (approved indications and labeled warnings), which distinguishes it from sibling tools like get_adverse_events and search_drug_recalls.

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

Usage Guidelines4/5

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

The phrase 'Use this for what a drug is approved to treat and what its labeled warnings say' gives clear contextual guidance for selecting the tool. It does not explicitly name alternatives or state when not to use it, but the sibling tool names and the FDA-label framing make the distinction reasonably clear.

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

get_trialA

Read one clinical trial in full, including who is eligible to join.

Use this after search_trials when a specific trial matters, or whenever a conversation names an NCT number. Returns title, status, phase, conditions, the eligibility criteria text with structured age range and sex, every study location, and the study description.

Args: nct_id: The trial's registry identifier: the letters NCT followed by exactly 8 digits, e.g. "NCT04280705".

Returns: The full trial record, or a not_found error if no trial has that number.

ParametersJSON Schema
NameRequiredDescriptionDefault
nct_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior4/5

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

With no annotations, the description must carry the behavioral disclosure burden. It explicitly states the tool reads a record, returns a full set of fields, and returns a not_found error for unknown IDs. It doesn't mention auth or rate limits, but for a read operation, the error behavior and return shape are the main transparency needs. The word 'Read' signals non-mutating behavior.

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

Conciseness5/5

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

The description is front-loaded with a one-sentence purpose, then usage guidelines, then an Args section, then a Returns section. It is cleanly sectioned and every sentence conveys needed information without filler. It's slightly longer than two sentences, but the structured layout keeps it scannable.

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

Completeness5/5

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

For a single-parameter tool with an output schema, the description covers all needed context: when to use it, what the parameter is, what is returned, and the error condition. It leaves no ambiguity about how to select or invoke the tool. The output schema handles detailed return values, so the description's summary list is sufficient.

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

Parameters5/5

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

The input schema provides only a type and title for nct_id, with zero description coverage. The tool description compensates fully by specifying the exact format ('NCT followed by exactly 8 digits') and providing an example ('NCT04280705'). This is indispensable for correct invocation.

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

Purpose5/5

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

The description begins with 'Read one clinical trial in full', a specific verb and resource, and immediately states the scope (eligibility). It explicitly contrasts with search_trials by saying 'Use this after search_trials when a specific trial matters', which differentiates it from the sibling tool. The return-value enumeration further clarifies its role.

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

Usage Guidelines5/5

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

It provides explicit when-to-use guidance: after search_trials for a specific trial, or whenever an NCT number is mentioned. This is a clear condition that routes the agent to the correct tool. It doesn't list exclusions, but naming the alternative and the trigger condition is sufficient.

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

normalize_drug_nameA

Resolve a drug name to its RxNorm concept, correcting spelling if needed.

Use this first when a drug name is misspelled, is a brand name, or comes from user text you are unsure about, then pass the canonical name to the other drug tools.

On an exact match, returns matched: true with the RxCUI, canonical name, and term type (IN is an ingredient, BN a brand name). Otherwise returns matched: false with ranked candidates. Candidates are suggestions, not confirmed answers -- each names the endpoint it came from, and a spelling_suggestion is stronger evidence of intent than a merely similar approximate_term. Confirm with the user before treating one as the drug they meant.

Args: name: The drug name as written, e.g. "metfromin", "Glucophage", or "metformin".

Returns: The resolved concept, or candidates when there was no exact match.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A5/5.0
Behavior5/5

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

With no annotations, the description carries full burden and delivers richly. It discloses exact-match vs. candidate outcomes, explains the meaning of term types (IN, BN), and warns that candidates are not confirmed, advising user confirmation. This goes beyond simple operation statements to provide trustworthy behavior cues.

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

Conciseness5/5

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

The description is concise and well-structured. It opens with the core purpose, provides usage context, then details return behavior, and ends with parameter and return descriptions. Every sentence adds necessary information; nothing is redundant or irrelevant.

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

Completeness5/5

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

For a single-parameter tool with an output schema, the description is complete. It explains the full decision-space (exact match vs. candidates), the interpretation of result fields, and the reliability of different match types. An agent can invoke and handle the response correctly without missing information.

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

Parameters5/5

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

Schema coverage is 0% and the description compensates fully. It explains `name` with concrete examples: 'e.g. "metfromin", "Glucophage", or "metformin"'. This gives the agent exactly the format and variety expected, adding value the schema lacks entirely.

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

Purpose5/5

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

The description uses a specific verb-resource pairing: 'Resolve a drug name to its RxNorm concept, correcting spelling if needed.' It clearly differentiates this tool from siblings like search_trials and search_drug_recalls by positioning it as the entry point for drug-name resolution, not a search tool.

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

Usage Guidelines5/5

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

Explicit guidance states when to use this tool: 'Use this first when a drug name is misspelled, is a brand name, or comes from user text you are unsure about.' It also directs the agent to 'pass the canonical name to the other drug tools,' establishing a workflow. This clearly separates it from alternatives.

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

search_drug_recallsA

Look up FDA recall and enforcement reports for a drug.

Use this to answer whether a drug has been recalled and why. Returns one entry per recall with its date, the affected product, the reason, the FDA hazard classification (Class I is most serious), the recall's current status, and the recalling firm.

An empty result means no recall records matched, which is meaningfully different from a failure -- it is safe to report as "no recalls found".

Args: drug_name: Generic or brand name, e.g. "metformin" or "Tylenol". Both are matched. Use normalize_drug_name first if the spelling is uncertain. max_results: How many recalls to return, 1 to 25. Defaults to 10.

Returns: Matching recalls, most recent first, or an empty list with a note.

ParametersJSON Schema
NameRequiredDescriptionDefault
drug_nameYes
max_resultsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

With no annotations, the description carries the full burden. It discloses the output structure (one entry per recall with date, product, reason, classification, status, firm), the ordering (most recent first), and the meaning of an empty result (no recalls found, not a failure). However, it does not mention potential limitations like partial matching or case sensitivity, which prevents a perfect score.

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

Conciseness4/5

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

The description is well-structured with a clear purpose statement, usage guidance, and a return description, using headings for Args and Returns. Every sentence adds value, though it is somewhat longer than strictly necessary; it remains efficient and front-loaded.

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

Completeness4/5

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

Given the tool has an output schema, the description needn't detail return types, but it still describes the fields. It covers purpose, usage, parameters, and the empty-result case. It is complete enough for an agent to call correctly, though it could mention any error conditions or edge cases.

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

Parameters4/5

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

Schema description coverage is 0%, so the description must compensate. It explains drug_name with examples and notes that both generic and brand names are matched, and it specifies max_results range and default. This adds significant value beyond the schema, though it could be slightly more explicit about optionality.

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

Purpose5/5

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

The description clearly states the action ('Look up') and the resource ('FDA recall and enforcement reports for a drug'), and it explicitly differentiates from siblings by focusing on recalls. It also lists the specific return fields, making the tool's purpose unambiguous.

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

Usage Guidelines5/5

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

It explicitly states when to use the tool ('Use this to answer whether a drug has been recalled and why') and provides an alternative ('Use normalize_drug_name first if the spelling is uncertain'). This gives clear guidance and names a sibling tool, leaving no ambiguity about selection.

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

search_trialsA

Find clinical trials studying a condition, newest registrations first.

Use this to answer questions like "are there trials for X" or "what studies near Y are enrolling". Returns one entry per trial with its NCT number, title, recruitment status, conditions, a summary of where it runs, a short truncated description, and a link to the full record. Call get_trial with an NCT number from these results for eligibility criteria and full details.

Args: condition: Disease or condition to search, e.g. "type 2 diabetes" or "non-small cell lung cancer". Prefer the medical name over a brand or colloquial term. status: RECRUITING for trials currently enrolling, COMPLETED for finished trials, ANY for both. Defaults to RECRUITING, which is what someone asking about joining a trial wants. location: Optional city, state, or country to narrow results, e.g. "Dallas" or "Germany". Omit to search worldwide. max_results: How many trials to return, 1 to 25. Defaults to 10.

Returns: Matching trials, or an empty list with a note when nothing matched.

ParametersJSON Schema
NameRequiredDescriptionDefault
statusNoRECRUITING
locationNo
conditionYes
max_resultsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A5/5.0
Behavior5/5

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

With no annotations provided, the description carries the full burden and does so well. It discloses ordering ('newest registrations first'), the exact shape of each returned entry, default behavior for status, and the empty-result behavior ('empty list with a note when nothing matched'). Nothing surprising is left hidden.

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

Conciseness5/5

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

The description is detailed but every sentence earns its place. The purpose is front-loaded, the Args section is a clean labeled list, and the Returns section clarifies edge behavior without redundancy.

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

Completeness5/5

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

For a search tool with one required parameter and no annotations, the description is complete: it covers all parameters, return fields, default behavior, empty-case behavior, and how to proceed to get_trial for more detail. An agent can invoke it correctly without external context.

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

Parameters5/5

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

Schema description coverage is 0%, so the description compensates fully. Every parameter is explained with meaning, examples, allowed values, defaults, and constraints: condition format, status choices, optional location with examples, and max_results range with default.

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

Purpose5/5

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

The description opens with a specific verb and resource: 'Find clinical trials studying a condition, newest registrations first.' It clearly distinguishes search_trials from its siblings like get_trial, and the use-case phrasing ('are there trials for X') reinforces that this is a lookup/search tool rather than a fetch-single-record tool.

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

Usage Guidelines5/5

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

It explicitly says when to use this tool ('Use this to answer questions like...') and names the follow-up alternative: 'Call get_trial with an NCT number from these results for eligibility criteria and full details.' It also gives practical guidance such as preferring medical names and the meaning of status values.

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

Tool Schema Changelog

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

  1. 6 tool updatesv0.1.0
    • First observedget_adverse_events
    • First observedget_drug_label
    • First observedget_trial
    • First observednormalize_drug_name
    • First observedsearch_drug_recalls
    • First observedsearch_trials

TDQS

A4.8/5.0

Scored across 6 tools

Disambiguation5/5

Each tool targets a distinct data type and action: trials are split between search (list) and get (detail), while drug tools cleanly separate recalls, adverse-event reports, labels, and name normalization. The descriptions reinforce the boundaries and cross-reference each other, so an agent should rarely misselect.

Naming Consistency5/5

All tools use an imperative verb + object pattern in snake_case: get_trial, search_trials, search_drug_recalls, get_adverse_events, get_drug_label, normalize_drug_name. The only variation is singular versus plural object forms, which aligns with whether a tool returns one record or many.

Tool Count5/5

Six tools is a focused, appropriate size for a medical-information server that spans clinical trials and FDA drug data. No tool feels redundant, and the set is small enough to avoid agent decision overhead.

Completeness5/5

The trial workflow is complete: search results point to a full-record getter with eligibility criteria and locations. The drug side covers name resolution, recalls, adverse-event summaries, and labels, with no obvious dead ends for a read-only informational server.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    An MCP server with 60 tools connecting AI assistants to Czech healthcare databases (SUKL, MKN-10, NRPZS) and global biomedical sources (PubMed, ClinicalTrials.gov, OpenFDA).
    1
    MIT
  • A
    license
    B
    quality
    D
    maintenance
    This MCP server provides 16 intelligent tools for searching, retrieving, and linking biomedical literature from PubMed and PMC. It enables LLM applications to perform complex queries, batch processing, and cross-database linking.
    16
    8
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    A high-performance MCP server that gives LLMs access to 25 biomedical tools federated across 50+ upstream APIs for genes, variants, drugs, diseases, literature, clinical trials, and structural biology.
    41
    692 npm
    12
    Apache 2.0
  • A
    license
    A
    quality
    D
    maintenance
    An MCP server that lets an LLM answer a pharmacist's question about drug shortages by normalizing drug names, finding pharmacologic alternatives, and checking their shortage status using public FDA and NLM data.
    5
    MIT