Skip to main content
Glama
ncbo

bioportal-mcp

by ncbo
README.md
# bioportal-mcp

A Model Context Protocol (MCP) server for interacting with the BioPortal API to search and retrieve ontology terms.

## Features

- **Search ontology terms**: Search across BioPortal's extensive collection of biomedical ontologies
- **Search ontology properties**: Find object properties, annotation properties, and datatype properties
- **Get ontology analytics**: Access visitor statistics and usage analytics for ontologies
- **Flexible filtering**: Filter by specific ontologies (e.g., NCIT, GO, HP, MONDO)
- **Exact matching**: Option to require exact matches or allow fuzzy matching
- **Rich results**: Returns term IDs, preferred labels, ontology information, and ontology page URLs

## Installation

You can install the package from source:

```bash
pip install -e .
```

Or using uv:

```bash
uv pip install -e .
```

## Setup

Before using this MCP server, you need to obtain a BioPortal API key:

1. Visit [BioPortal](https://bioportal.bioontology.org/)
2. Create an account or sign in
3. Go to your account settings to get your API key
4. Set the API key as an environment variable:

```bash
export BIOPORTAL_API_KEY="your_api_key_here"
```

## Usage

### As an MCP Server

Run the MCP server:

```bash
bioportal-mcp
```

### Available Tools

#### `search_ontology_terms`

Search for ontology terms in BioPortal.

**Parameters:**
- `query` (str): The search term (e.g., "melanoma", "breast cancer", "neuron")
- `ontologies` (str, optional): Comma-separated list of ontology acronyms (e.g., "NCIT,GO,HP")
- `max_results` (int, default=10): Maximum number of results to return
- `require_exact_match` (bool, default=False): Whether to require exact matches
- `api_key` (str, optional): BioPortal API key (uses environment variable if not provided)

**Returns:**
List of tuples containing:
- Term ID (e.g., "http://purl.obolibrary.org/obo/NCIT_C4872")
- Preferred label (e.g., "Breast Cancer") 
- Ontology acronym (e.g., "NCIT")
- Ontology URL (e.g., "https://bioportal.bioontology.org/ontologies/NCIT")

**Examples:**
```python
# Search for cancer terms
results = search_ontology_terms("cancer")

# Search for cell types in Cell Ontology  
results = search_ontology_terms("neuron", ontologies="CL")

# Search for exact matches only
results = search_ontology_terms("melanoma", require_exact_match=True)

# Limit results
results = search_ontology_terms("disease", max_results=5)
```

#### `search_ontology_properties`

Search for ontology properties (object properties, annotation properties, datatype properties) by their labels and IDs.

**Parameters:**
- `query` (str): The search term (e.g., "has part", "related to", "has dimension")
- `ontologies` (str, optional): Comma-separated list of ontology acronyms (e.g., "NCIT,GO,HP")
- `max_results` (int, default=10): Maximum number of results to return
- `require_exact_match` (bool, default=False): Whether to require exact matches by property id, label, or generated label
- `require_definitions` (bool, default=False): If True, only return properties that have definitions
- `property_types` (str, optional): Comma-separated list of property types to filter by: "object", "annotation", "datatype"
- `api_key` (str, optional): BioPortal API key (uses environment variable if not provided)

**Returns:**
List of tuples containing:
- Property ID (e.g., "http://www.w3.org/2000/01/rdf-schema#label")
- Property label (e.g., "label")
- Ontology acronym (e.g., "NCIT")
- Ontology URL (e.g., "https://bioportal.bioontology.org/ontologies/NCIT")

**Examples:**
```python
# Search for properties containing "part"
results = search_ontology_properties("part")

# Search for object properties only
results = search_ontology_properties("related", property_types="object")

# Search for properties with definitions in specific ontologies
results = search_ontology_properties("has", ontologies="GO,CHEBI", require_definitions=True)
```

#### `get_ontology_analytics`

Get visitor analytics for BioPortal ontologies using Google Analytics data.

**Parameters:**
- `ontology_acronym` (str, optional): Ontology acronym to get analytics for (e.g., "NCIT", "GO"). If None, returns analytics for all ontologies
- `month` (int, optional): Month number (1-12) to filter analytics. Only valid when ontology_acronym is None
- `year` (int, optional): Year to filter analytics (e.g., 2024). Only valid when ontology_acronym is None
- `api_key` (str, optional): BioPortal API key (uses environment variable if not provided)

**Returns:**
Dictionary containing visitor statistics:
- For all ontologies: dict with ontology acronyms as keys and visit counts
- For single ontology: detailed analytics with monthly/yearly breakdowns

**Examples:**
```python
# Get analytics for all ontologies
analytics = get_ontology_analytics()

# Get analytics for a specific ontology
analytics = get_ontology_analytics(ontology_acronym="NCIT")

# Get analytics for all ontologies in April 2024
analytics = get_ontology_analytics(month=4, year=2024)

# Get analytics for all ontologies in 2024
analytics = get_ontology_analytics(year=2024)
```

### Integration with AI Assistants

This MCP server can be integrated with AI assistants like Claude Desktop. Add the following to your MCP configuration:

```json
{
  "mcpServers": {
    "bioportal": {
      "command": "bioportal-mcp",
      "env": {
        "BIOPORTAL_API_KEY": "your_api_key_here"
      }
    }
  }
}
```

A streamable version of this MCP is also available from the following URL:

```
https://bioportal.fastmcp.app/mcp
```

This means it may be used through any agentic framework supporting HTTP streaming of MCPs.

## API Endpoints Supported

This MCP server provides access to the following BioPortal API endpoints:

- **Search** (`/search`): Search for ontology terms/classes across all ontologies
- **Property Search** (`/property_search`): Search for ontology properties (object, annotation, datatype)
- **Analytics** (`/analytics`): Retrieve visitor statistics and usage analytics for ontologies

### Supported Ontologies

BioPortal hosts hundreds of ontologies. Some popular ones include:

- **NCIT**: NCI Thesaurus - comprehensive cancer terminology
- **GO**: Gene Ontology - gene and protein functions
- **HP**: Human Phenotype Ontology - phenotypes and clinical features
- **MONDO**: Disease ontology
- **CHEBI**: Chemical entities
- **UBERON**: Anatomy ontology
- **CL**: Cell Ontology
- **SO**: Sequence Ontology

## Development

### Local Setup

```bash
# Clone the repository
git clone https://github.com/ncbo/bioportal-mcp.git
cd bioportal-mcp

# Install development dependencies
uv pip install -e ".[dev]"
```


## License

BSD-3-Clause

TDQS

A3.6/5.0

Scored across 3 tools

Disambiguation5/5

Each tool targets a different aspect of BioPortal: analytics for usage data, properties search for ontology properties, and term search for ontology terms. There is no overlap in functionality.

Naming Consistency5/5

All tool names follow a consistent verb_noun (snake_case) pattern: get_ontology_analytics, search_ontology_properties, search_ontology_terms.

Tool Count4/5

Three tools is on the lower end but reasonable for a focused search and analytics server. The number is appropriate given the scope, though additional tools could be justified.

Completeness2/5

The server lacks essential operations for ontology management: no tool to list or retrieve ontologies, no term details beyond search, no mappings or annotations. This leaves significant gaps for typical BioPortal use cases.

Maintenance

ActivityInactive
ResponsivenessUnresponsive