med-lit-mcp
Run evidence-linked medical literature reviews end to end—project setup, database search, screening, full-text fetch, wiki extraction/synthesis/export—and keep reviews current with scheduled bot runs.
Create, open, list, and configure review projects.
Validate PICO/PCC questions; search PubMed, PMC, OpenAlex, Europe PMC, Semantic Scholar, and Scopus; resume searches and retry failed sources.
Triage and screen titles/abstracts against inclusion/exclusion criteria, requiring verbatim evidence; record researcher overrides.
Fetch full text (PMC/open access) or abstracts for included articles.
Build an Obsidian-ready wiki: read article pages, extract entities/relationships with evidence, find/merge/deduplicate entities, synthesize entity pages, and export Markdown.
Inspect runs, articles, and stage status; get stage-specific rules through
guide.Run scheduled bot workflows to find new articles and update the wiki.
Exports the review as a knowledge-graph wiki (index, log, entity notes, source notes) in a folder that can be opened directly in Obsidian.
Searches PubMed/PMC for candidate articles and fetches full text (via NCBI and Europe PMC), storing records per project so they can be screened and turned into an evidence-linked wiki.
Optional literature search source, enabled by providing an API key; without a key it shares a public rate limit and is skipped unless explicitly requested.
Click on "Deploy 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., "@med-lit-mcp Start a new review on how LLMs are used in shared decision making"
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.
med-lit-mcp
med-lit-mcp is an MCP server for medical literature reviews. It takes a review through four deliberate stages, search → screening → fetch → wiki, and ends with an evidence-linked wiki you can open in Obsidian.
Your MCP client's model does the reading and writing (screening decisions, entity extraction, syntheses). med-lit-mcp searches the databases (PubMed, PMC, OpenAlex, Europe PMC, Semantic Scholar, Scopus), stores everything, checks the model's work against the source text, and exports the wiki. Every screening decision, extracted mention and synthesis citation must be a verbatim quote or a reference to the stored text.
Clients: Hermes (terminal and Desktop), Claude Code, Claude Desktop, Codex, pi and ChatGPT desktop Work/Codex.
Platforms: Linux, macOS and Windows.
Requirements: a contact email (
NCBI_EMAIL). No embedding endpoint, model API key or build step.Bots: with Hermes, a scheduled bot can keep a review up to date by screening new articles and adding them to the wiki.
Install
Client | How |
Hermes, Claude Code, Codex, pi | Run the install script: |
ChatGPT desktop Work/Codex (macOS, Windows) | The same install script with |
Claude Desktop | Install |
The same script installs and updates. Setup asks for your email, a folder for your reviews (default ~/med-lit) and optional database API keys. Keys are stored in private local files, never in the chat. See Setup for every client, manual registration and updating.
Related MCP server: biolit
Use
Ask your agent a research question. med-lit leads it through the review one step at a time, and stops for every decision that is yours:
How are large language models used in shared decision making in healthcare? Do a basic review.
(the agent shows the mode and search settings, then the drafted search question) Looks good, run it.
(it reports the results and proposes inclusion and exclusion criteria, each with its reason) Approved.
(it screens, asks about the articles it could not decide, and replies with the answer and the full report)
There are three modes:
basic screens titles and abstracts, then writes the report from the abstracts.
full also fetches the included articles' full text and builds the evidence-linked wiki, then writes a report that can quote the full text.
deep runs full mode in rounds, like a bot's runs in one session. After each round the agent judges whether the included studies answer the question; if not, a revised search aimed at the gaps adds the best new articles, which are screened, fetched and added to the wiki, until the evidence is enough or the round limit is reached.
The report is written for a reader who did not see the review: a short answer first, then the evidence by theme, how much to trust it, and how the review was done, with numbered references. Each cited study and quoted finding is checked against the stored articles, and the description of the search and screening comes from the review's own record. See Running a review.
You can also run each stage yourself ("Screen it. Include … exclude …", "Fetch the included articles and build the wiki"). Each review is a self-contained project folder. Open it in Obsidian with Open folder as vault.
What's new in 0.3.0
Research modes: from a question to a report. Ask a research question and
research_nextleads the review step by step, stopping at every decision that is yours: the mode and search settings, the question, the criteria, whether to screen on, and the articles it could not decide.basic: titles and abstracts; full: also full text and the evidence wiki; deep: full mode in rounds. After each round the agent judges whether the evidence answers the question (
record_evaluation) and, if not, a revised search adds the best new articles, until it is enough orresearch.deep_roundsis reached.Inclusion and exclusion criteria come with reasons, each with a code (I1 … E1 …), and every exclusion names the criterion it rests on, so the report counts the reasons for exclusion.
A report that answers the question (
next_report,record_report), written for a reader who did not see the review: a short answer, the evidence by theme, how much to trust it, how the review was done, numbered references and an appendix with the quotations and criteria. Citations and quotations are checked against the stored articles; the description of the search and screening comes from the review's record. Each report gets its own file inreports/.Fits Hermes as it works. Tool schemas are published without
$ref, so every argument states its type: Hermes passes$refto OpenAI-compatible models unresolved, and the model then sent the search question as a broken string (6 of 20 replayed calls before, 0 of 20 after). The call that ends a screening session returns the next step itself, for an agent that asks the researcher at once.Fixed: an article stayed in
wiki_taskswhen a worker lowered its page allowance after recording its last page; deep-mode report portions now fit pi's 20 KiB tool results.
Tested on Hermes and pi, interactive and one-shot, in every mode: research modes test.
What's new in 0.2.1
Install scripts replace the desktop installers.
scripts/install.sh(macOS, Linux) andscripts/install-windows.ps1(Windows) install and update med-lit for every terminal client, and with--chatgptfor ChatGPT desktop. They need uv. The signed macOS.dmgand the WindowsInstall med-lit.batare no longer built. The Claude Desktop.mcpbstays.setup --devstops with a clear message when uv is not onPATH, instead of registering a command that cannot start.
Documentation
Topic | |
Installing for each client, manual registration, updating | |
Email, keys and environment variables; per-review settings and defaults | |
Projects, how search, screening, fetch and wiki work, tools, the viewer | |
Registration, the optional pi package (research policy, scoped workers), recommended settings | |
Keeping a review up to date with Hermes scheduled jobs | |
Obsidian, entity types, roles and relationships, Simple Graph Builder | |
The full knowledge-graph contract and graph export format | |
Running from a checkout, tests, compatibility | |
The install scripts, the Claude Desktop extension, releasing | |
Platform test records, including the earlier desktop installers |
License
med-lit-mcp is licensed under the PolyForm Noncommercial License 1.0.0. You may use, modify and share it for any noncommercial purpose, including research, teaching, and use by educational institutions, public research organizations and public health organizations. Commercial use needs a separate license; open an issue to ask. NOTICE records the MIT-licensed origin of the search engine.
Available Tools
37 toolsadd_skipped_articlesAIdempotent
Add articles that were skipped for having no DOI, PMID or PMCID. Use only when the researcher asks for them by name; they then need screening.
Inputs: uids (required), run_id (required). Returns: object
bot_finishADestructiveIdempotent
End a bot run: refresh the wiki, write the update report, and return the message to reply with.
Inputs: project (required). Returns: object
bot_nextADestructive
Advance a bot run after bot_start: returns the next step (wait, triage, screen, fetch, wiki or
finish) with a do naming the tools to call. Repeat until finish.
Inputs: project (required). Returns: object
bot_startADestructive
Begin a scheduled bot run: lock the project and search its look-back window for new articles.
Inputs: project (required). Returns: object
create_projectBDestructive
Create a project: one folder per review, holding its wiki and (hidden) its data.
Inputs: name (required), path. Returns: object
export_wikiBDestructiveIdempotent
Rewrite every Markdown page of a project's wiki (entities, sources, index, log) from its database.
Inputs: project. Returns: object
fetch_articlesBDestructive
Fetch full text of included articles (PMC, Unpaywall open access, else abstract); repeat while remaining > 0. Rules: guide("fetch").
Inputs: run_id (required), uids, max_items, retry_failed, +1 more. Returns: object
find_entitiesAIdempotent
Search a project's wiki entities by name, alias, acronym, or spelling variant, e.g. to reuse an entity's id while extracting. Reads only (may create the project database).
Inputs: query (required), limit, project, entity_type. Returns: result
get_article_pageAIdempotent
Re-read one page of a fetched article within its extraction allowance (the project's wiki.max_pages), e.g. to check a quote; next_wiki_article serves the pages still to extract. Reads only (may create the project database).
Inputs: uid (required), page (required), run_id (required).
get_run_statusAIdempotent
Show a run's progress in every stage and the available next steps; check it rather than chat history. Reads only (may create the project database).
Inputs: run_id (required). Returns: object
guideBRead-onlyIdempotent
Rules and how-to for a stage: workflow, question, screening, fetch, wiki, extraction, duplicates, synthesis or ontology.
Inputs: topic (required). Returns: result
list_articlesBRead-onlyIdempotent
List a run's articles with their screening, fetch, and wiki status.
Inputs: run_id (required), limit, offset, decision, +2 more. Returns: object
list_duplicate_candidatesAIdempotent
List pending entity pairs that may be the same thing, with an example mention of each; decide them with resolve_duplicates. Reads only (may create the project database).
Inputs: limit, run_id, project. Returns: object
list_projectsARead-onlyIdempotent
List known projects with their folders. available=false means the folder moved or is missing.
Inputs: no named parameters. Returns: result
list_runsARead-onlyIdempotent
List a project's searches (runs), newest first.
Inputs: limit, project. Returns: result
merge_entitiesADestructive
Merge entities into one (irreversible), and/or rename or retype an entity, by id. For pairs from list_duplicate_candidates use resolve_duplicates.
Inputs: reason (required), keep_id (required), merge_ids (required), project, +2 more. Returns: object
next_reportCIdempotent
Get what the report is written from: the question, the search and screening facts, and the included articles' evidence, in portions (repeat while remaining > 0). Reads only (may create the project database). Rules: guide("report").
Inputs: run_id (required), offset. Returns: object
next_screening_batchCDestructiveIdempotent
Get the next titles/abstracts of this session (20 best-triaged articles) with the criteria.
Inputs: run_id (required), new_round, batch_size. Returns: object
next_synthesisBDestructiveIdempotent
Get the next entity whose wiki page needs writing or updating, with its evidence; it repeats until record_synthesis saves it. Rules: guide("synthesis").
Inputs: run_id, project, min_sources. Returns: object
next_triage_batchARead-onlyIdempotent
Get untriaged titles with the question and criteria, to score 0-3 before screening.
Inputs: run_id (required). Returns: object
next_wiki_articleADestructiveIdempotent
Get the next unextracted page of article text (a JSON header plus the page); it repeats until record_extraction records it. An article whose text changed loses its old extraction first.
Inputs: run_id (required), uid, max_pages.
open_projectADestructiveIdempotent
Register an existing project folder, for example after it was moved or copied from elsewhere.
Inputs: path (required). Returns: object
project_settingsADestructiveIdempotent
Show or change a project's settings (med-lit.settings.json): research mode (basic, full or deep) and max_screened, search years, records per source, preprints, fetch limit and mode, pages per article, and more. Change them only as the researcher asks.
Inputs: changes, project. Returns: object
record_evaluationBDestructive
Deep mode: record whether this round's evidence is enough; if not, the revised question is searched into the same review and the next round begins. Rules: guide("evaluation").
Inputs: gaps (required), run_id (required), adequate (required), assessment (required), +2 more. Returns: object
record_extractionBDestructive
Record the entities and relationships extracted from one page (re-recording replaces it). Rules: guide("extraction").
Inputs: uid (required), page (required), run_id (required), entities (required), +2 more. Returns: object
record_reportBDestructiveIdempotent
Save the report answering the question: citations and quotes are checked against the stored articles, and the methods and study list are added from the run's record. Reply with its message. Rules: guide("report").
Inputs: answer (required), run_id (required), findings (required), body, +1 more. Returns: object
record_screening_decisionsBDestructive
Record screening decisions; include/exclude need a verbatim quote as evidence.
Inputs: run_id (required), revision (required), decisions (required). Returns: object
record_synthesisADestructive
Save an entity page from next_synthesis, replacing the stored one: a new page, or only the changed sections of an update. Rules: guide("synthesis").
Inputs: entity_id (required), input_digest (required), project, summary, +4 more. Returns: object
record_triage_scoresADestructive
Record the 0-3 title scores that decide which articles each session screens.
Inputs: run_id (required), scores (required), revision (required). Returns: object
research_nextCDestructiveIdempotent
Start or continue a review: the next step from the question to the report, with do naming the
tools to call. ask_researcher=true means show the researcher what it lists and wait for their answer.
Rules: guide("research").
Inputs: run_id, confirm, project. Returns: object
resolve_duplicatesADestructive
Decide pairs from list_duplicate_candidates: merge (irreversible; keep picks the survivor) or distinct (not suggested again). Rules: guide("duplicates").
Inputs: decisions (required), project. Returns: object
resume_searchADestructive
Check a running search, retry a failed one, or retry just the failed sources of a completed run.
Inputs: run_id (required), wait_seconds, retry_failed_sources. Returns: object
review_articleBDestructive
Record the researcher's own include/exclude decision and reason for one article.
Inputs: uid (required), reason (required), run_id (required), decision (required), +1 more. Returns: object
set_screening_criteriaBDestructiveIdempotent
Save the researcher's inclusion and exclusion criteria (and the reason for each) for screening. Rules: guide("screening").
Inputs: run_id (required), exclude (required), include (required), reasons, +1 more. Returns: object
start_searchA
Search the literature databases with an approved question; creates a run in the project. If search_status is 'running', call resume_search(run_id).
Inputs: question_id (required), project, wait_seconds, limit_per_source. Returns: object
validate_questionA
Check a drafted PICO/PCC search question against the project's settings and return a question_id for start_search. Show the result, including settings, to the researcher and wait for approval. Rules: guide("question").
Inputs: question (required), project, sources. Returns: object
wiki_tasksADestructiveIdempotent
Start here to build or update the wiki: the current step as self-contained tasks (each with its full rules and the tools it may use), sized for one fresh subagent; a long step comes in portions. Rules: guide("wiki").
Inputs: run_id (required). Returns: object
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 37 tools
Most tools target a distinct workflow stage or resource, and descriptions clarify next/record pairings (e.g., next_triage_batch vs. record_triage_scores, next_report vs. record_report). Some boundaries are still fuzzy: review_article vs. record_screening_decisions both record include/exclude judgments, and merge_entities vs. resolve_duplicates overlap in entity-merging intent. These are manageable because the descriptions point to the intended tool.
Names are consistently snake_case and mostly follow verb_noun or stage_resource patterns (start_search, record_extraction, next_synthesis, bot_finish). Minor deviations exist: project_settings and wiki_tasks are noun phrases, guide is a bare verb, and next_* tools use an adjective_noun form rather than a verb. The convention is still predictable overall.
With 37 tools, the surface is very heavy, and many operations are split into granular next_* and record_* pairs that could be consolidated. The multi-stage systematic-review domain justifies breadth, but the current count exceeds what an agent can comfortably navigate and likely includes several low-frequency tools. This is over-scoped for practical tool selection.
The surface covers a full review lifecycle: project management, question validation, search/resume, triage and screening, fetch, extraction, entity resolution, synthesis, wiki export, reporting, and evaluation. Minor gaps remain, such as no explicit project update/delete or dedicated criteria-viewing operation, but agents can work around them through existing record/settings tools.
Maintenance
Related MCP Connectors
Search arXiv/Semantic Scholar/OpenAlex + medical evidence (PubMed/Europe PMC) + LaTeX/PDF tools.
Academic literature search, retrieval, and private library management on top of OpenAlex.
Checks AI-written references against Crossref, PubMed and OpenAlex. Formats citations, PRISMA.
Search PubMed/Europe PMC, fetch articles and full text (PMC/EPMC/Unpaywall), citations, MeSH terms.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables traceable scholarly literature reviews using free APIs, generating reports where every claim links to evidence IDs.MIT
- AlicenseNot gradedqualityCmaintenanceEnables LLM-assisted biomedical literature screening and structured extraction from PubMed alerts, PMIDs, DOIs, and GEO accessions, with full-text retrieval and multi-provider LLM support.25 PyPI2MIT
- AlicenseBqualityCmaintenanceEnables locally-first literature research through an MCP host by collecting sources, parsing documents, retrieving evidence, validating citations, and exporting research records in multiple formats.38MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to run reproducible, high-recall literature search across seven source families with RRF fusion, fetch open-access full texts (falling back to abstracts), expand citations, export BibTeX/RIS, and audit reference coverage — all without any LLM API key, leaving query planning and writing to the agent. Multiple agent clients share one accumulating literature pool and background search jobs that keep running after sessions close.3MIT