| Endpoint | URL |
|---|---|
| REST | https://evidence.medisearch.io/v1/evidence/search |
| MCP | https://evidence.medisearch.io/mcp |
| OpenAPI 3.1 | https://evidence.medisearch.io/openapi.json |
| Vocabularies | https://evidence.medisearch.io/v1/filters |
Quickstart
curl https://evidence.medisearch.io/v1/evidence/search \
-H "Authorization: Bearer $MEDISEARCH_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"question": "At what age should colorectal cancer screening start?",
"max_results": 5,
"filters": {
"source_types": ["guideline"],
"guideline": {"countries": ["US"]}
}
}'
Authentication
Send your API key with every request to /v1/evidence/search and /mcp, in either header:
Authorization: Bearer <API_KEY>
X-API-Key: <API_KEY>Missing or invalid keys return 401. Keys are issued by MediSearch; request one at founders@medisearch.io. /, /reference, /openapi.json, /v1/filters* and /healthz are public.
Rate limits
Limits are set per key; the default is 60 requests per minute. Authenticated responses include X-RateLimit-Limit and X-RateLimit-Remaining. Excess requests return 429 with Retry-After. For a higher limit, contact founders@medisearch.io. The service scales to zero; the first request after a period of inactivity takes longer while it starts.
Search
POST /v1/evidence/search · JSON body:
| Field | Type | Required | Description |
|---|---|---|---|
question | string, 3–2000 chars | yes | Self-contained question, any language. |
max_results | integer, 1–30 | no (10) | Sources to return, each a different publication, ordered by relevance. Fewer only when fewer publications match the filters. |
passage_chars | integer, 0–6000 | no (1200) | Maximum passage length, cut at a sentence boundary; 0 omits passages. |
filters | object | no | See Filters. |
Results are ordered by relevance. Each publication appears at most once.
Optional search hints
Most requests need only question. These fields can improve results for follow-ups, multi-part questions and exact names:
| Field | Type | Description |
|---|---|---|
rerank_query | string | Self-contained version of the question, used instead of question when question holds a literal follow-up. |
topic_query | string | The topic phrased like a guideline or review title (condition and decision, no patient specifics), e.g. pulmonary embolism anticoagulation guideline recommendations. Helps surface guidelines and reviews on the topic. |
dense_queries | string[], ≤3 | Alternative phrasings or sub-questions, e.g. one per drug in a comparison. |
keyword_queries | string[], ≤3 | Exact terms to match: drug and brand names, gene symbols, trial acronyms. |
Filters
All optional. Filters combine with AND; values within one filter combine with OR. Unknown values return 422 with suggestions. Nested fields live under filters, e.g. filters.guideline.countries.
| Field | Values | Notes |
|---|---|---|
year_start, year_end | integer | Publication year, inclusive. |
source_types | guideline, research_article, drug_information | Omit for all. |
study_types | 5 values | Applies to research_article only; guidelines and drug information still match unless excluded by source_types. |
specialties | 63 values | Untagged documents are excluded. |
languages | 65 ISO 639-1 codes | Document language. |
organizations | 1093 codes | Case-insensitive; exact full names accepted. Matches guidelines and drug information only. |
guideline.countries | 162 country codes | See country matching. GB is an alias of UK. |
guideline.include_reference_bodies | boolean | See country matching. |
drug_information.countries | 162 country codes | Country of approval, e.g. US for FDA labels. |
Study types
| Value | Includes |
|---|---|
systematic_review | Systematic reviews and meta-analyses, including network meta-analyses, umbrella and living reviews, and overviews of reviews. |
randomized_trial | Randomized clinical trials, including secondary, subgroup and follow-up analyses of completed trials. |
primary_research | Other original research: observational studies (cohort, case-control, cross-sectional, registry, survey, qualitative), non-randomized intervention studies, laboratory, animal and preclinical studies, methods, models and datasets. |
case_report | Case reports and small case series. |
other | Narrative, scoping and rapid reviews, clinical overviews, editorials, commentaries, letters, errata, policy statements, book chapters and conference abstracts. |
Country matching
guideline.countries: ["DE"] matches guidelines issued in Germany, guidance issued for Europe as a whole, and international bodies (region global, e.g. WHO, Cochrane, KDIGO). With include_reference_bodies: true it also matches:
US CDC, FDA, NIH, USPSTF, NCI, AHRQ, VA/DoD, AHA, ACC, HRS, ASCO, NCCN, ACS-Onc, ASTRO, IDSA, ADA, ES, AACE, ACP, AAFP, AAP, ACOG, AGA, ACG, AASLD, ASGE, ATS, CHEST/ACCP, SCCM, AAN, ACR, APA, ASH, AUA
EU/UK EMA, ECDC, ESC, EACTS, ESVS, ESMO, ESTRO, ERS, EASL, ESGE, ECCO, UEG, EULAR, EAU, ESCMID, EACS, EAN, ESO, ESICM, EHA, ESE, ESHRE, EAACI, NICE, SIGN, BTS, RCOG
Looking up values
The reference page lists every value. As JSON (public):
GET https://evidence.medisearch.io/v1/filters
GET https://evidence.medisearch.io/v1/filters/organizations?q=kardio&country=DE
Response
Top level: request_id, question, rerank_query, result_count, latency_ms, filters_applied, results[]. Each result:
| Field | Description |
|---|---|
rank | 1-based position. |
relevance_score | Relevance in [0, 1]; higher is more relevant. |
source_type | guideline | research_article | drug_information |
document_types | Corpus labels, e.g. systematic_review. |
title, year, authors, journal | Bibliographic metadata. authors is truncated to 12 plus et al. |
url | Canonical link to the publication. |
deep_link | url with a text fragment highlighting the passage, when available. |
organization | {code, name} of the issuing body (guidelines, drug labels). |
passage, passage_kind, section | Matching text; passage | table | figure | list; section path. |
citation | Plain-text citation: authors (year). title. journal. url |
{
"question": "At what age should colorectal cancer screening start?",
"result_count": 1,
"filters_applied": {
"source_types": [
"guideline"
],
"guideline": {
"countries": [
"US"
]
},
"...": "..."
},
"results": [
{
"rank": 1,
"relevance_score": 0.9442,
"source_type": "guideline",
"document_types": [
"guideline"
],
"title": "Colorectal cancer screening: An update to the American Cancer Society guideline, 2026.",
"url": "https://pubmed.ncbi.nlm.nih.gov/42200680/",
"deep_link": "https://pubmed.ncbi.nlm.nih.gov/42200680/#:~:text=…",
"year": 2026,
"authors": [
"Andrew M D Wolf",
"Richard M Hoffman",
"…"
],
"journal": "CA: a cancer journal for clinicians",
"organization": {
"code": "ACS-Onc",
"name": "American Cancer Society"
},
"passage": "… In 2018, the American Cancer Society (ACS) lowered the recommended age to initiate screening for average-risk adults to age 45 years. …",
"passage_kind": "passage",
"section": null,
"citation": "Andrew M D Wolf et al. (2026). Colorectal cancer screening: An update to the American Cancer Society guideline, 2026. CA: a cancer journal for clinicians. https://pubmed.ncbi.nlm.nih.gov/42200680/"
}
]
}
MCP
Streamable HTTP transport, stateless: POST JSON-RPC 2.0 messages to https://evidence.medisearch.io/mcp and read a JSON response. No session or SSE stream; GET returns 405. Protocol versions 2025-06-18, 2025-03-26, 2024-11-05. Authentication as above.
| Tool | Classification | Description |
|---|---|---|
search_medical_evidence | Read | Search. Returns content[0].text (numbered source list) and structuredContent (the REST response). |
list_evidence_filter_options | Read | Filter values. Optional organization_search, country, region, limit return matching organizations. |
Both tools are reads with no side effects: they do not create, change or delete data, act on a user's behalf, or require user permissions. Neither is a sensitive action. Calls are stateless and safe to retry. MCP annotations: readOnlyHint: true, destructiveHint: false, idempotentHint: true.
Search arguments are the REST fields, flattened:
| MCP argument | REST field |
|---|---|
question, max_results, passage_chars, rerank_query, topic_query, dense_queries, keyword_queries | Same name, top level |
year_start, year_end, source_types, study_types, specialties, languages, organizations | Same name under filters |
guideline_countries | filters.guideline.countries |
guideline_include_reference_bodies | filters.guideline.include_reference_bodies |
drug_label_countries | filters.drug_information.countries |
Claude
In claude.ai, Claude Desktop, Claude mobile or Cowork: Settings → Connectors → Add custom connector, name MediSearch, URL https://evidence.medisearch.io/mcp, no authentication. Both tools then appear in the conversation's tool menu. In Claude Code: claude mcp add --transport http medisearch https://evidence.medisearch.io/mcp --header "Authorization: Bearer <API_KEY>".
Client configuration
{
"mcpServers": {
"medisearch": {
"type": "http",
"url": "https://evidence.medisearch.io/mcp",
"headers": {
"Authorization": "Bearer <API_KEY>"
}
}
}
}
Examples
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "search_medical_evidence",
"arguments": {
"question": "At what age should colorectal cancer screening start?",
"source_types": [
"guideline"
],
"guideline_countries": [
"US"
],
"max_results": 5
}
}
}
{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "list_evidence_filter_options",
"arguments": {
"organization_search": "cardio",
"country": "DE"
}
}
}
Invalid tool arguments and search failures return a result with isError: true and a readable message naming each invalid argument, so the model can correct the call. Unknown tools and malformed requests return JSON-RPC errors (e.g. -32602).
Errors
REST errors have the body {"error": string, "detail": any}.
| Status | <code>error</code> | Cause |
|---|---|---|
| 401 | missing_api_key, invalid_api_key | No key, or unknown key. |
| 422 | invalid_request | Validation failed; detail lists {field, message}. |
| 429 | rate_limited | Per-key limit exceeded; retry after Retry-After seconds. |
| 503 | search_failed | Retrieval backend unavailable; retry with backoff. |
| 504 | search_timeout | Search exceeded 45 s. |