Skip to main content
Glama

med-lit-mcp

M8ven Score med-lit-mcp MCP server – quality and maintenance score on Glama PyPI Python License Publish

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: scripts/install.sh on macOS and Linux, scripts/install-windows.ps1 on Windows. Or run uvx med-lit-mcp setup. Both need uv. For pi see med-lit in pi

ChatGPT desktop Work/Codex (macOS, Windows)

The same install script with --chatgpt (Windows: -ChatGPT), then fill in the browser form

Claude Desktop

Install med-lit-<version>.mcpb from the latest release under Settings → Extensions, then switch it on

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_next leads 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 or research.deep_rounds is 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 in reports/.

  • Fits Hermes as it works. Tool schemas are published without $ref, so every argument states its type: Hermes passes $ref to 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_tasks when 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) and scripts/install-windows.ps1 (Windows) install and update med-lit for every terminal client, and with --chatgpt for ChatGPT desktop. They need uv. The signed macOS .dmg and the Windows Install med-lit.bat are no longer built. The Claude Desktop .mcpb stays.

  • setup --dev stops with a clear message when uv is not on PATH, instead of registering a command that cannot start.

Documentation

Topic

Setup

Installing for each client, manual registration, updating

Configuration

Email, keys and environment variables; per-review settings and defaults

Running a review

Projects, how search, screening, fetch and wiki work, tools, the viewer

med-lit in pi

Registration, the optional pi package (research policy, scoped workers), recommended settings

Bots

Keeping a review up to date with Hermes scheduled jobs

The wiki

Obsidian, entity types, roles and relationships, Simple Graph Builder

Ontology

The full knowledge-graph contract and graph export format

Development

Running from a checkout, tests, compatibility

Installation and release

The install scripts, the Claude Desktop extension, releasing

Validation

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 tools
add_skipped_articlesA
Idempotent

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_finishA
DestructiveIdempotent

End a bot run: refresh the wiki, write the update report, and return the message to reply with.

Inputs: project (required). Returns: object

bot_nextA
Destructive

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_startA
Destructive

Begin a scheduled bot run: lock the project and search its look-back window for new articles.

Inputs: project (required). Returns: object

create_projectB
Destructive

Create a project: one folder per review, holding its wiki and (hidden) its data.

Inputs: name (required), path. Returns: object

export_wikiB
DestructiveIdempotent

Rewrite every Markdown page of a project's wiki (entities, sources, index, log) from its database.

Inputs: project. Returns: object

fetch_articlesB
Destructive

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_entitiesA
Idempotent

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_pageA
Idempotent

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_statusA
Idempotent

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

guideB
Read-onlyIdempotent

Rules and how-to for a stage: workflow, question, screening, fetch, wiki, extraction, duplicates, synthesis or ontology.

Inputs: topic (required). Returns: result

list_articlesB
Read-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_candidatesA
Idempotent

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_projectsA
Read-onlyIdempotent

List known projects with their folders. available=false means the folder moved or is missing.

Inputs: no named parameters. Returns: result

list_runsA
Read-onlyIdempotent

List a project's searches (runs), newest first.

Inputs: limit, project. Returns: result

merge_entitiesA
Destructive

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_reportC
Idempotent

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_batchC
DestructiveIdempotent

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_synthesisB
DestructiveIdempotent

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_batchA
Read-onlyIdempotent

Get untriaged titles with the question and criteria, to score 0-3 before screening.

Inputs: run_id (required). Returns: object

next_wiki_articleA
DestructiveIdempotent

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_projectA
DestructiveIdempotent

Register an existing project folder, for example after it was moved or copied from elsewhere.

Inputs: path (required). Returns: object

project_settingsA
DestructiveIdempotent

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_evaluationB
Destructive

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_extractionB
Destructive

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_reportB
DestructiveIdempotent

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_decisionsB
Destructive

Record screening decisions; include/exclude need a verbatim quote as evidence.

Inputs: run_id (required), revision (required), decisions (required). Returns: object

record_synthesisA
Destructive

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_scoresA
Destructive

Record the 0-3 title scores that decide which articles each session screens.

Inputs: run_id (required), scores (required), revision (required). Returns: object

research_nextC
DestructiveIdempotent

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_duplicatesA
Destructive

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

review_articleB
Destructive

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_criteriaB
DestructiveIdempotent

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

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_tasksA
DestructiveIdempotent

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

    B3.2/5.0

    Scored across 37 tools

    Disambiguation4/5

    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.

    Naming Consistency4/5

    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.

    Tool Count2/5

    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.

    Completeness4/5

    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

    ActivityMaintained
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      C
      maintenance
      Enables traceable scholarly literature reviews using free APIs, generating reports where every claim links to evidence IDs.
      MIT
    • A
      license
      Not graded
      quality
      C
      maintenance
      Enables 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 PyPI
      2
      MIT
    • A
      license
      B
      quality
      C
      maintenance
      Enables locally-first literature research through an MCP host by collecting sources, parsing documents, retrieving evidence, validating citations, and exporting research records in multiple formats.
      38
      MIT
    • A
      license
      Not graded
      quality
      B
      maintenance
      Enables 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.
      3
      MIT