Edition identifiers differ between Perseus CTS and Scaife search results, and the live inventory changes, so the discovery tools are not decoration — resolve the author and work first, then build the passage URN from what came back. Heavy request loops draw a 429 from Perseus, which the server surfaces rather than silently retrying.
A local server over the Perseus Digital Library and the Scaife API. It fetches passages by CTS URN as raw CTS XML or plain readable text, walks a work's citation references, and searches Greek and Latin texts in Unicode or Beta Code.
- Passages — get_passage, get_passage_plus for surrounding metadata, get_passage_plaintext for readable text
- Navigation — get_valid_references, get_valid_references_json, count_valid_references, get_first_urn, get_prev_next_urn, get_label
- Discovery — get_capabilities, list_text_groups, find_author_names, get_author_resources, get_work_resources
- Search — search_perseus across the corpus, search_within_text inside one edition, get_passage_highlights for token positions in a passage
- Scaife JSON — get_scaife_library_metadata, get_scaife_passage_json, get_scaife_passage_text
- Cache control — get_cache_status, refresh_metadata_cache, clear_metadata_cache
- Greek queries accept Unicode or Beta Code, and search by inflected form or by dictionary lemma
Python. Install perseus-mcp from PyPI (or pip install -e . from the repo) and run the perseus-mcp command over stdio. No account, no key. Discovery and navigation results cache to disk under .cache/perseus-mcp in the working directory — PERSEUS_MCP_CACHE_DIR points that at an absolute path so notebooks and MCP clients share one cache, PERSEUS_MCP_CACHE_TTL_SECONDS changes the default of 86400 seconds, and PERSEUS_MCP_DISABLE_CACHE=1 turns it off.
One command — pip install perseus-mcp
