Skip to main content
Glama

NIAID Data MCP Server

An MCP (Model Context Protocol) server for the NIAID Data Ecosystem API, enabling LLMs to search biomedical research resources — datasets, clinical studies, publications, repositories, and more — funded or supported by NIAID.

Tools

niaid_data_query

Search the NIAID Data Ecosystem using Elasticsearch query string syntax.

Parameters:

Parameter

Type

Default

Description

q

string

*

Elasticsearch query string. Supports field-specific queries, boolean operators, and wildcards.

size

int

10

Number of results to return (1–1000).

offset

int

0

Number of results to skip (for pagination).

sort

string

—

Sort field; prefix with - for descending (e.g., -date).

fields

string

—

Comma-separated fields to return (e.g., name,description,@type).

aggs

list[string]

—

Fields to aggregate/facet by (e.g., ["@type", "conditionsOfAccess"]).

facet_size

int

10

Max aggregation buckets per field (1–1000).

explain

bool

—

Include relevance score explanation.

response_format

string

markdown

markdown for readable output, json for structured data.

Example queries:

  • q="COVID-19 AND @type:Dataset" — find COVID-19 datasets

  • q="*", aggs=["@type"] — summarize resource types across the whole catalog

  • q="malaria", sort="-date", size=20 — most recent malaria resources

Related MCP server: Asset Library MCP Server

Setup

Requires Python 3.11+ and uv.

uv sync

Running as a stdio MCP server (for Claude Desktop / MCP clients)

uv run python main.py

Claude Desktop config (claude_desktop_config.json):

{
  "mcpServers": {
    "niaid-data": {
      "command": "uv",
      "args": ["run", "python", "main.py"],
      "cwd": "/path/to/niaid-data-mcp-server"
    }
  }
}

Running as an HTTP server

PORT=8000 uv run python main.py

A /health endpoint is available at http://localhost:8000/health.

Available Tools

3 tools
niaid_data_getGet NIAID Data Record by IDA
Read-onlyIdempotent

Fetch the complete record for a single NIAID Data Ecosystem resource by its ID.

Retrieves all available fields for a specific resource using its unique identifier. Use this after niaid_data_query to get the full details of a record of interest.

Args: params (GetInput): Validated input parameters containing: - id (str): Unique record identifier from the '_id' field of query results (e.g., 'dde_373d5e89c734f65e'). - response_format (ResponseFormat): 'json' (default) for the complete raw record, or 'markdown' for a human-readable summary.

Returns: str: The complete record data.

JSON response: Full record object as returned by the API, including all
available fields (name, description, author, date, url, conditionsOfAccess,
measurementTechnique, species, funding, citation, etc.).

Markdown response: Formatted summary with key fields highlighted.

Error responses:
- "Error: Record not found for ID '...'" if the ID does not exist
- "Error: <message>" for API or network failures

Examples: - Use when: "Get full details for dataset dde_373d5e89c734f65e" -> params with id='dde_373d5e89c734f65e' - Use when: After a query returns results and you need all fields for one record -> params with id=<_id from query hit>, response_format='json'

Inputs: params (required). Returns: result

niaid_data_queryQuery NIAID Data EcosystemA
Read-onlyIdempotent

Search the NIAID Data Ecosystem for biomedical research resources.

Queries the NIAID Data Ecosystem API (https://data.niaid.nih.gov), which indexes datasets, clinical studies, publications, and other research resources related to infectious and immune-mediated diseases funded or supported by NIAID.

Supports Elasticsearch query string syntax for powerful full-text and field-specific searches. Results include datasets, clinical trials, repositories, computational tools, and more.

Args: params (QueryInput): Validated input parameters containing: - q (str): Elasticsearch query string. Use '' for all records. Supports field-specific syntax: 'name:COVID', 'author.name:Smith', '@type:Dataset', 'conditionsOfAccess:Open'. Default: ''. - size (Optional[int]): Number of results per page (1-1000). Default: 10. - offset (Optional[int]): Results to skip for pagination. Default: 0. - sort (Optional[str]): Sort field; prefix with '-' for descending (e.g., '-date'). Default: relevance score. - fields (Optional[str]): Comma-separated fields to return (e.g., 'name,description,@type,date'). Returns all fields if omitted. - aggs (Optional[List[str]]): Fields to aggregate/facet by (e.g., ['@type', 'conditionsOfAccess']). Useful for summarizing result distributions without reading each record. - facet_size (Optional[int]): Max aggregation buckets per field. Default: 10. - explain (Optional[bool]): Include relevance score explanation. - response_format (ResponseFormat): 'markdown' (default) for readable summaries or 'json' for complete structured data.

Returns: str: Formatted search results.

Markdown response includes:
- Total result count and pagination info
- For each hit: name, type, ID, score, description (truncated), URL, date
- Aggregation summaries (if aggs requested)

JSON response schema:
{
    "total": int,           # Total matching records
    "count": int,           # Records in this response
    "offset": int,          # Current pagination offset
    "has_more": bool,       # Whether more results are available
    "next_offset": int | null,  # Offset for next page
    "took_ms": int,         # Query time in milliseconds
    "hits": [...],          # Full record objects from the API
    "aggregations": {...}   # Aggregation buckets (if requested)
}

Error response: "Error: <message with suggested fix>"

Examples: - Use when: "Find open-access COVID-19 datasets" -> params with q='COVID-19 AND @type:Dataset AND conditionsOfAccess:Open' - Use when: "What types of resources are available?" -> params with q='*', aggs=['@type'], size=0 - Use when: "Find datasets with access conditions distribution" -> params with q='@type:Dataset', aggs=['conditionsOfAccess'], size=5 - Use when: "Search for malaria resources sorted by date" -> params with q='malaria', sort='-date', size=20 - Use when: "Page through results" (after first call with offset=0, size=10) -> params with same q, offset=10, size=10

Error Handling: - Returns "Error: Invalid query (HTTP 400)..." if query syntax is invalid - Returns "Error: Rate limit exceeded (HTTP 429)..." if too many requests - Returns "Error: Request timed out..." if query is too broad/slow

Inputs: params (required). Returns: result

niaid_data_summarizeSummarize NIAID Data Search ResultsA
Read-onlyIdempotent

Summarize a NIAID Data search without returning all records to the context.

Use this tool BEFORE niaid_data_query when a search may return many results, or when you need to understand what's available before fetching full records. Returns a compact overview: total count, distribution breakdowns across key fields, a small sample of top hits, and specific suggestions for narrowing the search.

This is the right tool when:

  • You don't know how many results a query will return

  • The user asks "what's available about X" or "give me an overview of X"

  • A previous niaid_data_query returned 1000+ hits

  • You need to help the user decide how to filter or focus their search

Args: params (SummarizeInput): Validated input parameters containing: - q (str): Elasticsearch query string (same syntax as niaid_data_query). Use '' to summarize the entire catalog. Default: ''. - sample_size (Optional[int]): Top-scoring records to show as examples (1–20). Does NOT return all results. Default: 5.

Returns: str: Markdown summary containing:

**Overview**
- Total matching records and query time

**Distribution** (fields with data only)
- Resource type breakdown (Dataset, ComputationalTool, ResourceCatalog, …)
- Access conditions (Open, Restricted, Closed)
- Health conditions, infectious agents, species, measurement techniques,
  topic categories, funders — wherever data exists for this query

**Sample records** (top `sample_size` hits by relevance)
- Name, type, ID, and description snippet for each

**Refinement suggestions**
Generated from the actual distribution data:
- Concrete filter additions (e.g., `AND @type:Dataset`)
- Field-specific search tips
- Pagination guidance if proceeding with niaid_data_query

Examples: - Use when: "What COVID-19 resources are available?" -> params with q='COVID-19' - Use when: A query just returned 48,000 results -> params with q= to understand how to narrow it - Use when: "Give me an overview of malaria datasets" -> params with q='malaria' - Don't use when: You need specific records (use niaid_data_query instead) - Don't use when: You have a specific ID (use niaid_data_get instead)

Inputs: params (required). Returns: result

Tool Schema Changelog

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

Loading tool schema changelog…

    TDQS

    A4.8/5.0

    Scored across 3 tools

    Disambiguation5/5

    Each tool has a clearly distinct purpose: query for searching with pagination, get for retrieving a single record by ID, and summarize for overview and refinement suggestions. No overlapping functionality.

    Naming Consistency5/5

    All tools follow the consistent pattern 'niaid_data_<verb>' with lowercase snake_case verbs (query, get, summarize). The naming convention is uniform and predictable.

    Tool Count5/5

    Three tools is well-scoped for a read-only data search server. Each tool serves a necessary, non-redundant function, and the count is within the ideal range for a single API integration.

    Completeness5/5

    The tool set covers the complete user workflow: summarize to explore and narrow a search, query to retrieve paginated hits, and get to fetch full details for a specific record. No obvious gaps in the search-and-retrieve lifecycle.

    Maintenance

    ActivityInactive
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      B
      maintenance
      Enables natural language search and discovery of open-access scientific datasets through the EOSC Data Commons OpenSearch service. Provides tools to search datasets and retrieve file metadata using LLM-assisted queries.
      15
      MIT
    • F
      license
      Not graded
      quality
      D
      maintenance
      Enables users to search and retrieve research datasets via natural language queries, with tools for proposing and committing tag changes. Includes robust authorization, idempotent mutations, and an audit trail.
      -
    • A
      license
      A
      quality
      C
      maintenance
      Enables users to search multiple public life-science data repositories (GEO, ENA, CELLxGENE, PRIDE, DataCite) with a single query, returning a unified ranked list of datasets with ontology-expanded terms and per-source error reporting.
      3
      MIT