A Model Context Protocol (MCP) server for accessing GEO (Gene Expression Omnibus) data through NCBI E-Utils API
Project description
Gene Expression Omnibus (GEO) MCP
Gene Expression Omnibus (GEO) - A public functional genomics data repository
Status: Beta. The MCP stdio and HTTP servers are both functional and in day-to-day use. The public tool surface is stable for the 0.1.x line; internal APIs and config defaults may still evolve. Please open an issue if you hit a regression.
A Model Context Protocol (MCP) server for accessing GEO (Gene Expression Omnibus) data through NCBI E-Utils API. The tool will enable you to search for GEO datasets, series, samples, platforms, and profiles for your LLM. Tested with Claude Desktop, chatGPT has no out of the box support for this tool yet. Claude will automatically use the tools if it fits the context.
Quick Install (pip)
install from pip
pip install geo-mcp
install from source
git clone https://github.com/MCPmed/GEOmcp
cd GEOmcp
pip install -e .
Configuration
Run init to create a config file
geo-mcp --init
By default this writes to $XDG_CONFIG_HOME/geomcp/config.json
(typically ~/.config/geomcp/config.json). If you already have a legacy
~/.geo-mcp/config.json from an older install, that location is still
honored and --init will update it in place so nothing gets orphaned.
The file contains:
{
"base_url": "https://eutils.ncbi.nlm.nih.gov/entrez/eutils",
"email": "your_email@example.com",
"api_key": "YOUR_API_KEY",
"download_dir": "~/.local/share/geomcp/downloads"
}
emailis required by NCBI.api_keyis optional but recommended for higher rate limits (get one here).
You can also skip the config file entirely and pass values via env vars
(GEOMCP_EMAIL, GEOMCP_API_KEY, GEOMCP_BASE_URL, GEOMCP_DOWNLOAD_DIR)
or CLI flags (--email, --api-key, --download-dir, ...). Precedence,
highest wins: CLI flags → env vars → config.json → built-in defaults.
Running the Server
- MCP stdio mode:
geo-mcp
- HTTP mode:
geo-mcp --http --port 8001
Claude Desktop Integration
Common Issue: spawn geo-mcp ENOENT
This error means Claude Desktop cannot find the geo-mcp command. This is usually a PATH issue.
Solution
-
Find the full path to the executable:
which geo-mcpExample output:
/Users/youruser/miniforge3/bin/geo-mcp -
Update your Claude config: Instead of just
"geo-bio-mcp", use the full path:{ "mcpServers": { "geo-mcp": { "command": "/Users/youruser/miniforge3/bin/geo-mcp", "env": { "CONFIG_PATH": "/Users/youruser/.geo-mcp/config.json" } } } }
-
(Optional) Use a Conda Environment:
- Activate your conda env and run
which geo-mcpto get the correct path. - Use that path in your Claude config as above.
- Activate your conda env and run
-
Restart Claude Desktop after updating the config.
Troubleshooting
- If you see
command not found: geo-mcp, make sure you installed into the Python environment whosebindirectory is on yourPATH, or invoke the server with its full path. - If the config file is missing,
geo-mcp --initwill create one. You can also run without a config by settingGEOMCP_EMAILin the environment.
HTTP API
With the server running via geo-mcp --http (default port 8001), the
following endpoints are exposed:
GET /— server statusGET /health— health checkGET /tools— list all registered MCP toolsPOST /tools/call— execute a tool with argumentsGET /events— server-sent events stream of tool callsGET /docs— interactive Swagger UI
Examples
# List available tools
curl http://localhost:8001/tools
# Search GEO Series
curl -X POST http://localhost:8001/tools/call \
-H "Content-Type: application/json" \
-d '{
"name": "search_geo_series",
"arguments": {"term": "breast cancer", "retmax": 5}
}'
Available Tools
This MCP server provides access to all major GEO databases through the following tools:
Search Tools
-
search_geo- Universal GEO search across GSE/GSM/GPL/GDS records, with results bucketed by accession type. Passrecord_typesto filter.- Example searches: "breast cancer", "GSE12345", "RNA-seq time course"
-
search_geo_profiles- Search gene expression profiles across different biological contexts- Example searches: "cancer", "breast cancer", "p53", "apoptosis"
-
search_geo_datasets- Search curated gene expression datasets- Example searches: "diabetes", "Alzheimer's disease", "drug response", "tissue specific"
-
search_geo_series- Search original submitter-supplied gene expression series- Example searches: "GSE12345", "microarray", "RNA-seq", "time course"
-
search_geo_samples- Search individual gene expression samples- Example searches: "GSM123456", "human", "mouse", "tumor", "normal"
-
search_geo_platforms- Search microarray platform definitions- Example searches: "Affymetrix", "Illumina", "Agilent", "GPL96"
Search Parameters
Each tool accepts:
term(required): Search term or query stringretmax(optional, default: 20): Maximum number of results to return
Example usage
For now just chat with claude desktop and it will use the tools automatically if it fits the context.
User: find a small brain dataset
Assistant: I'll help you find a small brain dataset from the GEO database. Let me search for brain-related datasets with a maximum of one result.
Assistant (system): search_geo_datasets
Assistant: I found a brain-related dataset for you:
- Dataset: GSE290848
- Title: Maternal Stress Triggers Early-Life Eczema via Fetal Mast Cell Reprogramming [10x Genomics Multiome ATAC + Gene Expression]
- Species: Mouse (Mus musculus)
- Samples: 8
- Data type: ATAC-seq & gene expression (10x Genomics Multiome)
- Publication date: 21 Jun 2025
This small dataset explores how prenatal stress affects neuro-immune circuits and mast-cell development.
Would you like me to download this dataset or search for others?
User: download GSE290848
Assistant: I'll download the GSE290848 dataset for you.
Assistant (system): download_geo_data
Assistant: Download complete.
Downloaded files
GSE290848_family.soft.gz— series, platform & sample infoGSE290848_metadata.xml— detailed study metadata
Location: ~/.local/share/geomcp/downloads/gse/GSE290848
Total size: 0.01 MB
The dataset is ready for analysis. Let me know if you’d like to explore it further.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file geo_mcp-0.1.2.tar.gz.
File metadata
- Download URL: geo_mcp-0.1.2.tar.gz
- Upload date:
- Size: 25.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
62010ff7bc38af5ccfbb8f713bfe589945691d6192b1908ceb5d0505b47e7c39
|
|
| MD5 |
20ca792c4d8f08fa6d65a5565fc58c0b
|
|
| BLAKE2b-256 |
fc71142837c89f2b4abf4df41d84f2e5cdff8f7ba9e32463449295247d22ba87
|
Provenance
The following attestation bundles were made for geo_mcp-0.1.2.tar.gz:
Publisher:
pypi-publish.yml on MCPmed/GEOmcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
geo_mcp-0.1.2.tar.gz -
Subject digest:
62010ff7bc38af5ccfbb8f713bfe589945691d6192b1908ceb5d0505b47e7c39 - Sigstore transparency entry: 1341986816
- Sigstore integration time:
-
Permalink:
MCPmed/GEOmcp@c12c3caf75f260f02682fdbfe45a6bbed6400b8b -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/MCPmed
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi-publish.yml@c12c3caf75f260f02682fdbfe45a6bbed6400b8b -
Trigger Event:
release
-
Statement type:
File details
Details for the file geo_mcp-0.1.2-py3-none-any.whl.
File metadata
- Download URL: geo_mcp-0.1.2-py3-none-any.whl
- Upload date:
- Size: 21.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
df7335e3ac4aa47fac9e82d5191b6ce1c1b7c826b25e4e21160c29826cb086e0
|
|
| MD5 |
52d018fca32f25d22529a3567dbb042d
|
|
| BLAKE2b-256 |
8d9439eb0b4a22c042727fa1fc579b9f65600bfd8bb93ffa3f81912f4baef4fe
|
Provenance
The following attestation bundles were made for geo_mcp-0.1.2-py3-none-any.whl:
Publisher:
pypi-publish.yml on MCPmed/GEOmcp
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
geo_mcp-0.1.2-py3-none-any.whl -
Subject digest:
df7335e3ac4aa47fac9e82d5191b6ce1c1b7c826b25e4e21160c29826cb086e0 - Sigstore transparency entry: 1341986823
- Sigstore integration time:
-
Permalink:
MCPmed/GEOmcp@c12c3caf75f260f02682fdbfe45a6bbed6400b8b -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/MCPmed
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi-publish.yml@c12c3caf75f260f02682fdbfe45a6bbed6400b8b -
Trigger Event:
release
-
Statement type: