# Alexandria MCP Server [![Available on CodeGuilds](https://img.shields.io/badge/Available_on-CodeGuilds-6366f1)](https://codeguilds.dev/packages/alexandria-mcp) Semantic search over **4.6 million text chunks** from 20,000+ classical philosophy and humanities works. Built for AI agents using [FastMCP](https://github.com/jlowin/fastmcp) over HTTP. ## What's in the collection All texts are public domain (pre-1928), sourced from [Internet Archive](https://archive.org) (americana, europeanlibraries, gutenberg collections). - **Philosophy:** Aristotle, Plato, Kant, Hegel, Nietzsche, Schopenhauer, Descartes, Spinoza, Locke, Hume, Mill, Wittgenstein, Aquinas, Augustine, Leibniz, Rousseau, Voltaire, Marx, and hundreds more - **Topics:** Ethics, metaphysics, epistemology, logic, political philosophy, theology, stoicism, neoplatonism, existentialism, history of ideas - **Languages:** English, German, Latin, French, Italian, Greek, Russian ## Connecting to the server **Remote (hosted):** ```bash claude mcp add --transport http alexandria https://alexandria.aidatanorge.no/mcp ``` **Via MCP config:** ```json { "mcpServers": { "alexandria": { "type": "http", "url": "https://alexandria.aidatanorge.no/mcp" } } } ``` ## Tools ### `search_texts` Search the collection using natural language. Uses hybrid dense+sparse retrieval with cross-encoder reranking. | Parameter | Type | Description | |---|---|---| | `query` | string | What you are looking for | | `author` | string | Optional filter by author/creator, e.g. `Kant`, `Nietzsche`, `Plato` | | `language` | string | Optional language filter: `eng`, `ger`, `lat`, `fre`, `ita`, `gre`, `rus` | | `limit` | int | Number of results (default 5, max 20) | **Example queries:** - `"Nietzsche will to power eternal recurrence"` - `"Kantian categorical imperative duty"` - `"Platonic theory of forms and the Good"` - `"Stoic virtue and the sage"` - `"Hegel dialectics spirit history"` Each result includes: `title`, `creator`, `date`, `language`, `subject`, `text` (chunk), `rerank_score`, `vector_score`. **curl example:** ```bash curl -X POST https://alexandria.aidatanorge.no/mcp \ -H "Content-Type: application/json" \ -H "Accept: application/json, text/event-stream" \ -d '{ "jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": { "name": "search_texts", "arguments": { "query": "Kantian categorical imperative duty ethics", "author": "Kant", "limit": 3 } } }' ``` ### `get_book_list` List books in the collection filtered by author, subject or language. | Parameter | Type | Description | |---|---|---| | `author` | string | Filter by author/creator, e.g. `Kant`, `Plato` | | `subject` | string | Filter by subject keyword, e.g. `ethics`, `logic` | | `language` | string | Filter by language code: `eng`, `ger`, `lat`, `fre`, `ita`, `gre`, `rus` | | `limit` | int | Max books to return (default 20, max 100) | **curl example:** ```bash curl -X POST https://alexandria.aidatanorge.no/mcp \ -H "Content-Type: application/json" \ -H "Accept: application/json, text/event-stream" \ -d '{ "jsonrpc": "2.0", "id": 2, "method": "tools/call", "params": { "name": "get_book_list", "arguments": {"author": "Plato", "language": "eng"} } }' ``` ### `ping` Connectivity test. ## Prompts - `philosopher_analysis(philosopher)` — deep dive into a philosopher's key ideas - `topic_exploration(topic)` — explore a topic across multiple thinkers - `compare_philosophers(philosopher_a, philosopher_b, topic)` — compare two philosophers on a specific topic ## Architecture ``` Archive.org (13,000+ books) ↓ Text extraction + chunking ↓ Qdrant (4.6M vectors) ↓ Hybrid search: intfloat/multilingual-e5-large (dense) + Qdrant/bm25 (sparse) ↓ Cross-encoder reranking: mmarco-mMiniLMv2-L12-H384-v1 ↓ FastMCP 3.2 over HTTP ``` ## Self-hosting Requires a running Qdrant instance with the `alexandria` collection populated. ```bash pip install -r requirements.txt python alexandria_mcp_server.py # Server starts at http://localhost:8005/mcp ``` Environment variables (optional): ``` QDRANT_HOST=localhost QDRANT_PORT=6333 MCP_PORT=8005 ``` ## License MIT