paperboy
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| PORT | No | Port for HTTP server (set by Cloud Run) | |
| SMTP_HOST | No | SMTP server host | smtp.gmail.com |
| SMTP_PORT | No | SMTP server port | 587 |
| KINDLE_EMAIL | No | Your Kindle's send-to-kindle email address | |
| PAPERBOY_ENV | No | Path to .env file | |
| DROPBOX_EMAIL | No | Contact email for Dropbox receipts | |
| SMTP_PASSWORD | No | SMTP app password for sending emails | |
| DROPBOX_FOLDER | No | Dropbox folder for ebooks | /Apps/Rakuten Kobo |
| MCP_AUTH_TOKEN | No | Bearer token for remote MCP connections | |
| ZOTERO_API_KEY | No | Zotero API key | |
| DROPBOX_APP_KEY | No | Dropbox app key | |
| DROPBOX_APP_SECRET | No | Dropbox app secret | |
| DROPBOX_REFRESH_TOKEN | No | Dropbox OAuth refresh token |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| logging | {} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| extensions | {
"io.modelcontextprotocol/ui": {}
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| search_papersA | Search for papers across the scholarly literature.
|
| recommend_papersA | Discover papers the user may want to read — old or new. Blends two signals: citation-graph recommendations (Semantic
Scholar) seeded from Returns {"picks": [...], "problems": [...]}: picks carry refs for
send_papers / queue_papers, and each pick has a |
| send_papersA | Send papers to the e-reader by arXiv id, DOI, or title.
Refs are deduplicated, and papers already tagged as sent in Zotero are skipped unless force=True. Large batches are split automatically to fit the 25-attachment / 50 MB per-email limits. dry_run=True previews what would be sent, with estimated sizes, without downloading or delivering — use it before big sends. Papers without an open-access PDF are not sent; if Zotero is configured they are still queued (tagged no-oa-pdf) so they can be delivered manually later. Without Zotero there is NO cross-call duplicate protection — re-sending the same ref ships another copy. Relay the full receipt — sizes, skips, and failures — to the user. |
| queue_papersA | Add papers to the Zotero Reading Queue without sending them. Accepts arXiv ids, DOIs, URLs, or paper titles. Papers already in
the queue are reported as such, not re-added. |
| list_collectionsA | List the user's Zotero collections (name, item count, parent). Check this before queueing or sending new papers: if a topical collection clearly fits the paper, pass it via collections=[...]; if several could fit or none do, ask the user where to file — never guess silently. Naming a new collection in other tools creates it on demand. |
| file_papersA | File already-queued papers into a Zotero collection. Only papers ALREADY in the Reading Queue can be filed — to file a fresh paper, queue_papers it first, or pass collections=[...] to queue_papers to queue and file in one step. The collection is created on demand, but only if at least one paper matches (a call that files nothing leaves no empty collection behind). Items stay in the queue — Zotero items can live in many collections — so delivery state is unaffected. Refs match like remove_from_queue: exact arXiv id, DOI, URL, or title. |
| unfile_papersA | Remove papers from one Zotero collection, and nothing else. The inverse of file_papers, for misfiled items: membership in the named collection is dropped, while the item, its other collections (including the Reading Queue), and its sent-state are untouched. The Reading Queue itself is refused as a target — leaving the queue is remove_from_queue's job, with its keep-or-trash safeguards. To move a paper between collections, file it into the new one and unfile it from the old. Refs match like remove_from_queue: exact arXiv id, DOI, URL, or title, against the collection's items; an ambiguous ref (matching several items) removes nothing. |
| list_queueA | List the Zotero Reading Queue with delivery status per item. Status is 'unsent', 'sent', or 'no-open-access-pdf'. Use this to
show the user their queue, before send_queue (which flushes every
unsent item), or to find refs for remove_from_queue. Each entry
also carries |
| remove_from_queueA | Remove papers from the Zotero Reading Queue by ref or title. Matches each ref (arXiv id, DOI, URL, or exact title) against queue items. Items filed into other collections keep their library record (and sent-state) and only leave the queue; items that live nowhere else are moved to Zotero's Trash (restorable in the Zotero app for ~30 days). Trashed items no longer count for duplicate protection — sending those again later will deliver them again. Nothing is ever deleted from the e-reader, and nothing is ever permanently deleted from Zotero. A ref that matches more than one queue item (duplicate titles or a duplicated record) removes nothing; the receipt lists each candidate's Zotero item key, which is accepted as a ref and is unique even for exact duplicates. Relay the choice to the user — never pick for them. |
| send_queueA | Send EVERY unsent paper in the Zotero Reading Queue. This flushes the whole queue — for specific papers use send_papers. Items tagged sent or no-oa-pdf are skipped; items whose PDF turns out to be unavailable are tagged no-oa-pdf so they are not retried forever. Batches are split under the email limits automatically. Check list_queue first when unsure what will go. |
| setup_statusA | Report which paperboy features are configured and what's missing. Returns configuration state only — never secret values. Use this to guide the user through finishing setup. Credentials themselves must be entered by running 'paperboy setup' in a terminal, never pasted into the chat. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/michaelellis003/paperboy'
If you have feedback or need assistance with the MCP directory API, please join our Discord server