From dbb6566e2d7c02dafb997490ae9a11faeec369d6 Mon Sep 17 00:00:00 2001 From: Edern Deneuville Date: Sun, 2 Aug 2026 17:10:00 +0200 Subject: [PATCH] docs: add project README --- README.md | 226 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 226 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..30fad68 --- /dev/null +++ b/README.md @@ -0,0 +1,226 @@ +# 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 /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