io.github.lacausecrypto/poetrydb
# PoetryDB MCP Server
[](https://www.npmjs.com/package/mcp-poetry)
[](https://github.com/lacausecrypto/mcp-poetrydb/actions/workflows/ci.yml)
[](https://www.npmjs.com/package/mcp-poetry)
[](https://nodejs.org/)
[](./LICENSE)
Unofficial MCP server for exploring classic poetry through [PoetryDB](https://poetrydb.org).
## At a glance
| Metric | Value |
| --- | --- |
| Tools | 12 |
| Categories | 3 |
| Transport | stdio |
| Auth | none |
| MCP Registry name | `io.github.lacausecrypto/poetrydb` |
| npm package | `mcp-poetry` |
| Source API | `https://poetrydb.org` |
| Content | classic poetry by author, title, line text, and form |
## Install
```bash
npm install -g mcp-poetry
```
Or from source:
```bash
npm install
npm run build
```
## MCP Registry
This server is published to the MCP Registry under:
```text
io.github.lacausecrypto/poetrydb
```
## Claude Desktop
```json
{
"mcpServers": {
"poetrydb": {
"command": "npx",
"args": ["-y", "mcp-poetry"]
}
}
}
```
For a local checkout, replace the command with:
```json
{
"mcpServers": {
"poetrydb": {
"command": "node",
"args": ["/absolute/path/to/mcp-poetrydb/dist/index.js"]
}
}
}
```
## Tools
### Catalog
- `catalog_overview`: list categories and available tools
- `catalog_category`: show tools for a specific category
### Search
- `search_by_author`: find poems by author name
- `search_by_title`: find a poem by title
- `search_by_lines`: search text inside poem lines
- `search_by_linecount`: find poems by exact line count
- `search_combined`: query multiple PoetryDB fields in one request
- `list_authors`: list all available authors
### Discovery
- `random_poem`: fetch one or more random poems
- `get_sonnets`: fetch 14-line poems
- `get_haikus`: fetch 3-line poems
- `list_titles`: list poem titles
## Example requests
### Simple
```text
Random poem please.
```
Expected tool:
```text
random_poem({ "count": 1 })
```
### Browse
```text
Show me the available poets.
```
Expected tool:
```text
list_authors({})
```
### Targeted search
```text
Find Ozymandias.
```
Expected tool:
```text
search_by_title({ "title": "Ozymandias" })
```
### Text search
```text
Show me poems containing the word "love".
```
Expected tool:
```text
search_by_lines({ "text": "love" })
```
### Form-based discovery
```text
Give me 14-line poems by Shakespeare.
```
Expected tool:
```text
search_combined({ "fields": "author,linecount", "values": "Shakespeare;14" })
```
### More advanced
```text
List Shakespeare results, but only return title and linecount.
```
Expected tool:
```text
search_by_author({ "author": "Shakespeare", "fields": "title,linecount" })
```
### Multi-step exploration
```text
Start with the catalog, then show me the discovery tools, then give me a sonnet.
```
Typical tool sequence:
```text
catalog_overview({})
catalog_category({ "category_id": "discovery" })
get_sonnets({})
```
## Development
```bash
npm run build
npm run test:ci
npm test
npm pack --dry-run
```
Environment variables:
- `POETRYDB_BASE_URL`
- `POETRYDB_REQUEST_TIMEOUT_MS`
- `POETRYDB_REQUEST_RETRIES`
## Notes
- No API key is required.
- This package is not affiliated with PoetryDB.
- Built for MCP clients that prefer a compact stdio server over a custom PoetryDB integration.
- MCP Registry identity: `io.github.lacausecrypto/poetrydb`
## Attribution
- PoetryDB: [poetrydb.org](https://poetrydb.org)
- Upstream project: [thundercomb/poetrydb](https://github.com/thundercomb/poetrydb)
Additional implementation notes are in [documentation.md](./documentation.md).
TDQS
Scored across 12 tools
Most tools have clearly distinct purposes, but get_sonnets and get_haikus overlap with search_by_linecount since 14-line and 3-line poems are special cases. An agent might be unsure whether to use the specialized get_* tools or the more general search_by_linecount.
Tool naming mixes several patterns: catalog_* (catalog_overview, catalog_category), search_by_* (search_by_author, search_by_title, etc.), list_* (list_authors, list_titles), get_* (get_sonnets, get_haikus), and random_poem (no prefix). This inconsistency can make tool selection less predictable.
With 12 tools, the count is well within the expected range for a domain-specific server. Each tool serves a distinct function and none feels superfluous or excessive for a poetry database.
The toolset covers searching, listing, and random access, along with helpful meta-tools for discovery. Minor gaps include the lack of a direct 'get poem by ID' or 'get full poem content' endpoint, which forces reliance on search results. Overall, the surface is reasonably complete for common poetry browsing workflows.