Files
openherbarium-mcp/README.md
T

227 lines
5.4 KiB
Markdown

# OpenHerbarium MCP
**Botanical Knowledge MCP Server** — a Model Context Protocol server that gives AI agents structured, sourced botanical data from free/open sources.
OpenHerbarium MCP is designed for a downstream agent such as **Hermes Agent Botaniste**. It is deliberately a knowledge-access layer only: it fetches, normalizes and cites botanical evidence, then lets the client agent reason, write, format and publish.
## What this MCP does
It exposes MCP tools for:
- plant lookup by common or scientific name;
- taxonomic information;
- species information such as distribution, habitat and botanical descriptions;
- horticultural care-source discovery;
- image-source discovery with licence and author metadata;
- targeted botanical source search through a local Firecrawl instance when configured.
Every returned data point is wrapped with provenance:
```json
{
"value": "Marantaceae",
"source": "GBIF Backbone Taxonomy",
"url": "https://www.gbif.org/species/8184122",
"retrieved_at": "2026-08-02T12:00:00+00:00",
"confidence": "high"
}
```
## What this MCP does **not** do
OpenHerbarium MCP never:
- creates final Markdown plant sheets;
- writes to Outline;
- manages Outline collections;
- creates care calendars;
- decides final horticultural recommendations;
- replaces the reasoning/presentation layer of Hermes Agent.
## MCP tools
### `search_plant(name: str)`
Returns:
- accepted scientific name;
- canonical name;
- common/vernacular names when available;
- synonyms;
- family, genus, species and rank;
- external identifiers such as GBIF keys and GBIF species URL;
- best-effort Kew/POWO results when accessible.
### `get_taxonomy(name: str)`
Returns sourced taxonomy:
- kingdom;
- phylum/class/order when available;
- family;
- genus;
- species;
- scientific name;
- botanical authorship;
- taxonomic status;
- synonyms.
Priority sources:
- GBIF Backbone Taxonomy;
- Plants of the World Online, Kew, best-effort.
### `get_species_information(name: str)`
Returns raw evidence for:
- botanical descriptions;
- known distribution;
- natural habitat where available;
- additional source-search records when Firecrawl is configured.
### `get_care_sources(name: str)`
Returns raw source candidates for:
- light;
- temperature;
- humidity;
- watering;
- substrate;
- fertilisation;
- repotting.
It does **not** transform those sources into final care advice.
### `get_image_sources(name: str, limit: int = 10)`
Uses Wikimedia Commons to return:
- image URL;
- licence;
- author;
- source page.
### `search_botanical_sources(query: str, limit: int = 5)`
Uses a local Firecrawl instance if `FIRECRAWL_API_URL` is configured. If not configured, the tool returns source-constrained suggested queries rather than pretending to have scraped content.
## Sources
Implemented/targeted sources:
- [GBIF](https://www.gbif.org/)
- [Plants of the World Online, Kew](https://powo.science.kew.org/) best-effort connector
- [Wikimedia Commons](https://commons.wikimedia.org/)
- [Royal Horticultural Society](https://www.rhs.org.uk/) source candidates / Firecrawl search
- [Tela Botanica](https://www.tela-botanica.org/) source candidates / Firecrawl search
- public university horticultural resources via targeted Firecrawl search
No paid API is required.
## Installation
### Requirements
- Python 3.11+
- `uv` recommended, or any Python package installer capable of creating a virtual environment
### Local install with `uv`
```bash
git clone https://git.home-deneuville.fr/Edern/openherbarium-mcp.git
cd openherbarium-mcp
uv sync --extra dev
```
Run tests:
```bash
uv run pytest
```
Run the MCP server over stdio:
```bash
uv run openherbarium-mcp
```
## Hermes Agent configuration
Add the server to `~/.hermes/config.yaml`:
```yaml
mcp_servers:
openherbarium:
command: "uv"
args:
- "--directory"
- "/absolute/path/to/openherbarium-mcp"
- "run"
- "openherbarium-mcp"
timeout: 120
connect_timeout: 60
```
Restart Hermes Agent. Tools will be exposed with names similar to:
- `mcp_openherbarium_search_plant`
- `mcp_openherbarium_get_taxonomy`
- `mcp_openherbarium_get_species_information`
- `mcp_openherbarium_get_care_sources`
- `mcp_openherbarium_get_image_sources`
- `mcp_openherbarium_search_botanical_sources`
## Firecrawl configuration
Copy `.env.example` to `.env` and set:
```bash
FIRECRAWL_API_URL=http://localhost:3002
FIRECRAWL_API_KEY=
```
If Firecrawl is not configured, source-search tools return explicit suggested queries and a `not_configured` status.
## Development
```bash
uv sync --extra dev
uv run pytest
```
Project layout:
```text
openherbarium-mcp/
├── src/
│ └── openherbarium_mcp/
│ ├── server.py
│ ├── gbif.py
│ ├── kew.py
│ ├── rhs.py
│ ├── tela_botanica.py
│ ├── wikimedia.py
│ └── firecrawl.py
├── tests/
├── README.md
├── pyproject.toml
├── LICENSE
└── .env.example
```
## Reliability model
The server distinguishes between:
- **high confidence**: exact/high-confidence API matches, mostly GBIF taxonomic matches;
- **medium confidence**: sourced API records that still require interpretation;
- **low confidence**: source candidates or search results that must be manually/agent verified.
OpenHerbarium MCP prefers returning `status: unavailable`, `status: not_configured` or empty records over inventing missing data.
## License
MIT