bookshelf-mcp
This server provides MCP tools to manage a Bookshelf (Readarr fork) instance via its full REST API, covering both read and write operations with destructive actions flagged. Key capabilities include:
Authors: list, get by ID, create/update/delete, bulk operations, search via metadata provider.
Books: list with filters, get overview/full details, create/update/delete, bulk operations, set monitored, lookup, add to shelves.
Book Files: list/update/delete/bulk, get single, filter by author/book/unmapped.
Editions & Calendar: list editions by book; list/get calendar entries.
Commands: run, list, get, delete/cancel.
Download Queue, History & Blocklist: manage queue; history with filters, mark failed; blocklist list/delete/bulk.
Download Clients & Import Lists: full CRUD, bulk, schema, test, actions; manage import list exclusions.
Indexers, Release Search & Profiles: manage indexers, search releases, custom formats, delay profiles, quality profiles, release profiles, language profiles.
Configuration: update host, download client, and development configs; naming and UI config.
System & Storage: backups (list/delete/restore/upload), disk space, health, filesystem browsing, logs, update checks/install, system status, tasks.
Other: tags, custom filters, root folders, remote path mappings, metadata providers, notifications, manual import, rename files, authentication, users, and more.
All destructive operations are flagged with destructiveHint: true, and write operations are clearly labeled.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@bookshelf-mcpSearch for books by Brandon Sanderson"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
bookshelf-mcp
Part of the arr-mcps collection. MCP server exposing Bookshelf's v1 REST API (a Readarr fork, OpenAPI 3.0.1) as tools, so an LLM can read and manage a Bookshelf instance: authors, books, book files, editions, series, the download queue, history, indexers, import lists, custom formats, tags, commands, system status, and more. Full surface — reads and writes, with destructive tools flagged.
Built with FastMCP.
Getting an API key
Generate one in Bookshelf Settings > General > Security. Auth is the
X-Api-Key header.
Related MCP server: mylar3-mcp
Install
Download a wheel from the latest release
and install it as a uv tool (no repo checkout needed):
uv tool install bookshelf_mcp-*.whlThis puts a bookshelf-mcp command on your PATH. Register it with Claude Code:
claude mcp add bookshelf \
--env BOOKSHELF_URL=http://your-bookshelf-host:8787 \
--env BOOKSHELF_API_KEY=<key> \
-- bookshelf-mcpFrom source
uv sync
cp .env.example .env # fill in BOOKSHELF_URL and BOOKSHELF_API_KEYclaude mcp add bookshelf \
--env BOOKSHELF_URL=http://your-bookshelf-host:8787 \
--env BOOKSHELF_API_KEY=<key> \
-- uv run --directory /path/to/bookshelf-mcp bookshelf-mcpConfig
Env var | Required | Default |
| yes | - |
| yes* | none (no |
* Every API endpoint requires auth; practically you must set it, but the server still starts without one so errors surface from the API rather than at startup.
Tools
15 resource-scoped tools, each covering multiple Bookshelf v1 endpoints
(221 total) via an operation parameter. Call a tool with operation set
to one of its listed operations and an arguments dict matching that
operation's parameters — the tool's own description (visible to your MCP
client) lists every operation, its signature, and a one-line doc. This keeps
the full REST surface available while costing a fraction of the context
budget of registering all 221 endpoints as separate tools.
Tool | Operations | Kind |
| 40 | reads + writes |
| 33 | reads + writes |
| 27 | reads + writes |
| 20 | reads + writes |
| 18 | reads + writes |
| 16 | reads + writes |
| 16 | reads + writes |
| 11 | reads + writes |
| 9 | reads + writes |
| 7 | reads + writes |
| 7 | reads + writes |
| 7 | reads + writes |
| 4 | read-only |
| 4 | reads + writes |
| 2 | read-only |
Example: bookshelf_queue(operation="bookshelf_delete_queue", arguments={"id": 42}).
Endpoint-level naming (bookshelf_<verb>_<resource>) is preserved as the
operation value, so the full endpoint list is still discoverable from each
group tool's description at runtime.
Development
make help # list all commandsCommand | Does |
|
|
| Offline tests - one per endpoint, mocked HTTP |
| Tests against the live instance (needs |
| Build wheel + sdist into |
| Bump the version in |
| Remove build artifacts |
The release workflow (.github/workflows/release.yml) builds and publishes to
Releases whenever a v*
tag is pushed - so the usual flow is make bump-patch, commit, then tag and
push.
The integration suite is read-only by default (GET endpoints only). Set
BOOKSHELF_WRITE_TESTS=1 to also exercise POST/PUT/DELETE against a scratch tag
(created, updated, then deleted). Never run write tests against a production
library.
Available Tools
15 toolsbookshelf_calendarBRead-only
bookshelf calendar operations on Bookshelf. Pass operation and an arguments dict matching that operation's parameters.
bookshelf_get_calendar(id) — Fetch a single calendar by id.
bookshelf_list_calendar(start=None, end=None, unmonitored=False, include_author=False) — List calendar. Query params: start, end, unmonitored, includeAuthor.
| Name | Required | Description | Default |
|---|---|---|---|
| arguments | No | ||
| operation | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true, so the agent knows this is a read-only operation. The description adds the operation names and parameter lists, but it does not disclose any additional behavioral traits such as pagination, error handling, or response format. Since annotations cover the safety profile, the description adds some value but not rich behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and structured as a bulleted list of operations with their parameters. It is front-loaded with the general instruction to pass an operation and arguments dict. There is no wasted text, and the format is easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that the tool has an output schema and readOnlyHint annotation, the description is reasonably complete for a simple get/list tool. However, it does not explain the return values or any specific behavior like filtering or pagination. The parameter list is present but lacks semantic detail, so it is adequate but not comprehensive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% description coverage, so the description must compensate. It lists the parameters for each operation (e.g., start, end, unmonitored, include_author) but does not explain their meaning or format. The description adds some value by mapping parameters to operations, but it does not fully compensate for the lack of schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly lists two operations: bookshelf_get_calendar(id) to fetch a single calendar and bookshelf_list_calendar(start, end, unmonitored, include_author) to list calendars. It specifies the resource (calendar) and the actions (get/list), which distinguishes it from sibling tools that handle other bookshelf domains like media library or config.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage by listing the operations and their parameters, but it does not explicitly state when to use one over the other or when to use this tool instead of a sibling. It provides no context on typical use cases or exclusions, so it's adequate but lacks explicit guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bookshelf_configD
bookshelf config operations on Bookshelf. Pass operation and an arguments dict matching that operation's parameters.
bookshelf_get_config_development() — List config development.
bookshelf_get_config_development_by_id(id) — Fetch a single config development by id.
bookshelf_get_config_downloadclient() — List config downloadclient.
bookshelf_get_config_downloadclient_by_id(id) — Fetch a single config downloadclient by id.
bookshelf_get_config_host() — List config host.
bookshelf_get_config_host_by_id(id) — Fetch a single config host by id.
bookshelf_get_config_indexer() — List config indexer.
bookshelf_get_config_indexer_by_id(id) — Fetch a single config indexer by id.
bookshelf_get_config_mediamanagement() — List config mediamanagement.
bookshelf_get_config_mediamanagement_by_id(id) — Fetch a single config mediamanagement by id.
bookshelf_get_config_metadataprovider() — List config metadataprovider.
bookshelf_get_config_metadataprovider_by_id(id) — Fetch a single config metadataprovider by id.
bookshelf_get_config_naming() — List config naming.
bookshelf_get_config_naming_by_id(id) — Fetch a single config naming by id.
bookshelf_get_config_naming_examples(rename_books=None, replace_illegal_characters=None, colon_replacement_format=None, standard_book_format=None, author_folder_format=None, include_author_name=None, include_book_title=None, include_quality=None, replace_spaces=None, separator=None, number_style=None, id=None, resource_name=None) — List config naming examples. Query params: renameBooks, replaceIllegalCharacters, colonReplacementFormat, standardBookFormat, authorFolderFormat, includeAuthorName, includeBookTitle, includeQuality, replaceSpaces, separator, numberStyle, id, resourceName.
bookshelf_get_config_ui() — List config ui.
bookshelf_get_config_ui_by_id(id) — Fetch a single config ui by id.
bookshelf_get_localization() — List localization.
bookshelf_list_update() — List update.
bookshelf_update_config_development(id, body={}) — Update config development. WRITE: this modifies your Bookshelf instance.
bookshelf_update_config_downloadclient(id, body={}) — Update config downloadclient. WRITE: this modifies your Bookshelf instance.
bookshelf_update_config_host(id, body={}) — Update config host. WRITE: this modifies your Bookshelf instance.
bookshelf_update_config_indexer(id, body={}) — Update config indexer. WRITE: this modifies your Bookshelf instance.
bookshelf_update_config_mediamanagement(id, body={}) — Update config mediamanagement. WRITE: this modifies your Bookshelf instance.
bookshelf_update_config_metadataprovider(id, body={}) — Update config metadataprovider. WRITE: this modifies your Bookshelf instance.
bookshelf_update_config_naming(id, body={}) — Update config naming. WRITE: this modifies your Bookshelf instance.
bookshelf_update_config_ui(id, body={}) — Update config ui. WRITE: this modifies your Bookshelf instance.
| Name | Required | Description | Default |
|---|---|---|---|
| arguments | No | ||
| operation | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
For update operations, the description explicitly notes 'WRITE: this modifies your Bookshelf instance,' which is useful. However, it does not disclose any other behavioral traits such as read-only guarantees, side effects, error handling, or potential performance implications. Without annotations, this is insufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a long, repetitive list of operations without an introductory summary or clear structure. It front-loads no context and each line follows the same pattern, making it verbose and harder to scan. A more concise summary with grouped operations would be more effective.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the large number of operations (27), the description lacks essential context: no examples, no explanation of what each config resource represents, no mention of common use cases, and no information about return structures. The output schema is not referenced, and the description does not compensate for the complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema defines only 'operation' and 'arguments' (a generic object), and the description adds minimal parameter meaning. Operation names reveal some expected arguments (e.g., 'id' for *_by_id and 'body' for update), but the structure and content of the 'arguments' object are not explained, leaving parameter semantics largely ambiguous.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description labels the tool as 'bookshelf config operations' but provides no high-level purpose or explanation of what this configuration manages. Each operation's one-liner (e.g., 'List config development') gives a narrow sense of individual actions, but the overall tool's role remains vague and does not clearly differentiate it from sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description offers no guidance on when to use this tool versus alternatives like bookshelf_media_library or bookshelf_indexers. It lacks any indication of typical scenarios, prerequisites, or context where these config operations would be preferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bookshelf_download_clientsB
bookshelf download clients operations on Bookshelf. Pass operation and an arguments dict matching that operation's parameters.
bookshelf_action_downloadclient(name, body={}) — Create downloadclient action. WRITE: this modifies your Bookshelf instance.
bookshelf_bulk_delete_downloadclient(body={}) — Bulk delete downloadclient bulk. DESTRUCTIVE: this deletes data.
bookshelf_bulk_update_downloadclient(body={}) — Bulk update downloadclient bulk. WRITE: this modifies your Bookshelf instance.
bookshelf_create_downloadclient(force_save=False, body={}) — Create downloadclient. Query params: forceSave. WRITE: this modifies your Bookshelf instance.
bookshelf_create_remotepathmapping(body={}) — Create remotepathmapping. WRITE: this modifies your Bookshelf instance.
bookshelf_delete_downloadclient(id) — Delete downloadclient. DESTRUCTIVE: this deletes data.
bookshelf_delete_remotepathmapping(id) — Delete remotepathmapping. DESTRUCTIVE: this deletes data.
bookshelf_get_downloadclient(id) — Fetch a single downloadclient by id.
bookshelf_get_downloadclient_schema() — List downloadclient schema.
bookshelf_get_remotepathmapping(id) — Fetch a single remotepathmapping by id.
bookshelf_list_downloadclient() — List downloadclient.
bookshelf_list_remotepathmapping() — List remotepathmapping.
bookshelf_test_all_downloadclient() — Create downloadclient testall. WRITE: this modifies your Bookshelf instance.
bookshelf_test_downloadclient(force_test=False, body={}) — Create downloadclient test. Query params: forceTest. WRITE: this modifies your Bookshelf instance.
bookshelf_update_downloadclient(id, force_save=False, body={}) — Update downloadclient. Query params: forceSave. WRITE: this modifies your Bookshelf instance.
bookshelf_update_remotepathmapping(id, body={}) — Update remotepathmapping. WRITE: this modifies your Bookshelf instance.
| Name | Required | Description | Default |
|---|---|---|---|
| arguments | No | ||
| operation | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explicitly labels operations with 'WRITE: this modifies your Bookshelf instance' or 'DESTRUCTIVE: this deletes data', which provides important behavioral cues. Since no annotations are provided, the description carries the burden of disclosing mutating vs read-only behavior, and it does so effectively. It also notes query parameters like `forceSave` and `forceTest`, which adds transparency about optional behaviors.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured as a bulleted list of operations, which improves scannability. However, it is quite long (16 operations) and redundant, repeating 'WRITE: this modifies your Bookshelf instance' for every write operation. Each operation line is terse, but the overall length could be trimmed by grouping similar operations or noting the write/destructive flag once. It earns a middle score for being organized but not optimally concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (16 operations, two main resource types), the description provides a comprehensive enumeration of all operations with signatures and safety flags. It also names the query parameters for each operation. However, it lacks details about return values (though an output schema exists) and does not explain the `arguments` dict structure for each operation, which is a notable gap. Overall, it is fairly complete for a facade tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides an `operation` enum and an `arguments` object, but the description does not explain the structure or required keys for `arguments`. With 0% schema description coverage, the description fails to compensate by detailing parameter meanings. It lists operation signatures like `bookshelf_create_downloadclient(force_save=False, body={})`, which hints at parameters, but it does not explain what `body` should contain or what `forceSave` does beyond a name. This is a significant gap for a tool with 2 parameters and nested objects.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly lists all operations with a specific verb and resource (e.g., 'Create downloadclient action', 'Bulk delete downloadclient bulk', 'Fetch a single downloadclient by id'). It distinguishes between downloadclient and remotepathmapping operations, which helps differentiate from siblings like bookshelf_indexers or bookshelf_storage. However, it is not a single-purpose tool but a facade for many operations, which slightly reduces clarity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says to pass `operation` and an `arguments` dict, which is a clear usage instruction. However, it does not provide guidance on when to choose one operation over another or when to use this tool versus sibling tools like bookshelf_indexers or bookshelf_storage. It also does not state any prerequisites or exclusions, so the usage guidance is minimal beyond the basic mechanics.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bookshelf_history_blocklistA
bookshelf history blocklist operations on Bookshelf. Pass operation and an arguments dict matching that operation's parameters.
bookshelf_bulk_delete_blocklist(body={}) — Bulk delete blocklist bulk. DESTRUCTIVE: this deletes data.
bookshelf_delete_blocklist(id) — Delete blocklist. DESTRUCTIVE: this deletes data.
bookshelf_list_blocklist(page=1, page_size=10, sort_key=None, sort_direction=None) — List blocklist. Query params: page, pageSize, sortKey, sortDirection.
bookshelf_list_history(page=1, page_size=10, sort_key=None, sort_direction=None, include_author=None, include_book=None, event_type=None, book_id=None, download_id=None) — List history. Query params: page, pageSize, sortKey, sortDirection, includeAuthor, includeBook, eventType, bookId, downloadId.
bookshelf_list_history_author(author_id=None, book_id=None, event_type=None, include_author=False, include_book=False) — List history author. Query params: authorId, bookId, eventType, includeAuthor, includeBook.
bookshelf_list_history_since(date=None, event_type=None, include_author=False, include_book=False) — List history since. Query params: date, eventType, includeAuthor, includeBook.
bookshelf_mark_history_failed(id) — Mark a history event as failed and trigger a re-search. WRITE: this modifies your Bookshelf instance.
| Name | Required | Description | Default |
|---|---|---|---|
| arguments | No | ||
| operation | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explicitly flags delete operations as DESTRUCTIVE and the mark-failed operation as WRITE, informing about side effects. It does not detail all read-only operations, but the annotations are absent, so the description carries the burden effectively.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a structured bullet list of operations, concise and easy to scan. It avoids unnecessary verbosity, though some repetition exists in the operation summaries.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a multi-operation tool, it provides the essential mapping of operations to parameters and flags side effects. However, it lacks information about return values or expected output formats, which may be needed for full completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema is generic with only 'operation' and 'arguments', but the description enumerates each operation's parameters (e.g., page, page_size, include_author). This adds semantic detail, though individual parameter meanings are not explained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool handles history and blocklist operations, and lists specific operations like bulk delete, delete, list, and mark failed. It distinguishes from sibling tools by domain, though the operation descriptions are terse.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for history and blocklist management but does not explicitly contrast with alternative tools. There is no guidance on selecting this over others, aside from the tool's name and operation list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bookshelf_import_listsA
bookshelf import lists operations on Bookshelf. Pass operation and an arguments dict matching that operation's parameters.
bookshelf_action_importlist(name, body={}) — Create importlist action. WRITE: this modifies your Bookshelf instance.
bookshelf_bulk_delete_importlist(body={}) — Bulk delete importlist bulk. DESTRUCTIVE: this deletes data.
bookshelf_bulk_update_importlist(body={}) — Bulk update importlist bulk. WRITE: this modifies your Bookshelf instance.
bookshelf_create_importlist(force_save=False, body={}) — Create importlist. Query params: forceSave. WRITE: this modifies your Bookshelf instance.
bookshelf_create_importlistexclusion(body={}) — Create importlistexclusion. WRITE: this modifies your Bookshelf instance.
bookshelf_delete_importlist(id) — Delete importlist. DESTRUCTIVE: this deletes data.
bookshelf_delete_importlistexclusion(id) — Delete importlistexclusion. DESTRUCTIVE: this deletes data.
bookshelf_get_importlist(id) — Fetch a single importlist by id.
bookshelf_get_importlist_schema() — List importlist schema.
bookshelf_get_importlistexclusion(id) — Fetch a single importlistexclusion by id.
bookshelf_list_importlist() — List importlist.
bookshelf_list_importlistexclusion() — List importlistexclusion.
bookshelf_test_all_importlist() — Create importlist testall. WRITE: this modifies your Bookshelf instance.
bookshelf_test_importlist(force_test=False, body={}) — Create importlist test. Query params: forceTest. WRITE: this modifies your Bookshelf instance.
bookshelf_update_importlist(id, force_save=False, body={}) — Update importlist. Query params: forceSave. WRITE: this modifies your Bookshelf instance.
bookshelf_update_importlistexclusion(id, body={}) — Update importlistexclusion. WRITE: this modifies your Bookshelf instance.
| Name | Required | Description | Default |
|---|---|---|---|
| arguments | No | ||
| operation | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It explicitly labels WRITE and DESTRUCTIVE operations, which is valuable. However, it does not disclose other behaviors like rate limits, idempotency, or failure modes, so credit is given for the safety notes but not for full transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is lengthy due to 16 operation listings, but it is well-structured as a bulleted list with the core instruction front-loaded. Every line conveys specific operation details without redundancy. The formatting is efficient and scannable, though it could arguably be trimmed by grouping similar operations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity as a dispatcher, the description covers the operation/arguments pattern, enumerates all supported operations with signatures, and notes safety for write/delete operations. With an output schema present, explaining return values is unnecessary. The description is thorough enough for an agent to understand how to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has 0% description coverage, so the description must compensate. It lists each operation's signature, including parameter names and defaults (e.g., force_save=False, body={}), which provides some semantics. However, it does not explain the structure or expected keys within the `arguments` dict beyond 'matching that operation's parameters'. This is partial but not comprehensive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies this as a dispatcher for Bookshelf import list operations, listing all sub-operations. It distinguishes itself from sibling tools by domain scope (import lists vs. media library, profiles, etc.). The verb is implicit but understandable; it's not a tautology, though it could be more specific about what 'import lists' represent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the general usage pattern (pass an `operation` and an `arguments` dict), but it does not explicitly state when to use this tool over alternatives. Since siblings cover other Bookshelf domains, the intended context is implied but not stated. No exclusions or prerequisites are mentioned, so it's adequate but not fully explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bookshelf_indexersB
bookshelf indexers operations on Bookshelf. Pass operation and an arguments dict matching that operation's parameters.
bookshelf_action_indexer(name, body={}) — Create indexer action. WRITE: this modifies your Bookshelf instance.
bookshelf_bulk_delete_indexer(body={}) — Bulk delete indexer bulk. DESTRUCTIVE: this deletes data.
bookshelf_bulk_update_indexer(body={}) — Bulk update indexer bulk. WRITE: this modifies your Bookshelf instance.
bookshelf_create_indexer(force_save=False, body={}) — Create indexer. Query params: forceSave. WRITE: this modifies your Bookshelf instance.
bookshelf_delete_indexer(id) — Delete indexer. DESTRUCTIVE: this deletes data.
bookshelf_get_indexer(id) — Fetch a single indexer by id.
bookshelf_get_indexer_schema() — List indexer schema.
bookshelf_list_indexer() — List indexer.
bookshelf_test_all_indexer() — Create indexer testall. WRITE: this modifies your Bookshelf instance.
bookshelf_test_indexer(force_test=False, body={}) — Create indexer test. Query params: forceTest. WRITE: this modifies your Bookshelf instance.
bookshelf_update_indexer(id, force_save=False, body={}) — Update indexer. Query params: forceSave. WRITE: this modifies your Bookshelf instance.
| Name | Required | Description | Default |
|---|---|---|---|
| arguments | No | ||
| operation | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It does label each operation with WRITE or DESTRUCTIVE flags, which is valuable behavioral transparency. However, it does not mention whether operations require special permissions, are irreversible, or have side effects beyond the obvious modification/deletion. Given the explicit write/destructive flags, it provides a baseline disclosure but not comprehensive behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the usage pattern, followed by a bullet list of operations. Each operation is described in a single line with a brief purpose and flags. There is minimal redundancy, and the structure is scannable. It loses a point because the list format repeats the tool name prefix (bookshelf_) in every entry, which adds noise, but overall it is appropriately sized for the number of operations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 11 operations, which is complex. The description provides an overview and per-operation purpose, but lacks detailed parameter semantics (especially the body format) and does not describe the output schema or return values, despite having an output schema. Given the absence of annotations and the 0% schema coverage, the description is incomplete for operations like update, bulk_delete, and schema fetch, where an agent needs more context to construct correct arguments.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description coverage is 0%, meaning the description does not explain the parameters in detail. The description lists function signatures (e.g., 'bookshelf_create_indexer(force_save=False, body={})') and mentions query params (forceSave) in some cases, which adds some value. However, it does not explain the structure of the `body` parameter or the `arguments` dict for each operation. Since the schema only has `operation` and `arguments` (an open dict), and the description provides only surface-level parameter names, it fails to compensate for the low schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it operates on Bookshelf indexers with a dispatch pattern, listing each operation with a brief purpose ('Create indexer action', 'Delete indexer', etc.). While it doesn't deeply differentiate each operation beyond the one-liner, the list is sufficient for an agent to map operation names to actions and distinguish them from sibling tools focused on other domains (media library, queue, etc.).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the general usage pattern: 'Pass operation and an arguments dict matching that operation's parameters.' This is clear. However, it does not explicitly state when to use this tool versus sibling tools like bookshelf_media_library or bookshelf_queue, nor does it provide guidance on selecting among the operations within the tool (e.g., when to use create vs update vs bulk operations). The usage guidance is implicit: use this for indexer-related operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bookshelf_media_libraryA
bookshelf media library operations on Bookshelf. Pass operation and an arguments dict matching that operation's parameters.
bookshelf_add_books_to_shelf(body={}) — Add the given books to a Goodreads/Hardcover shelf. Body is a BookshelfResource with bookshelfId and bookIds.
bookshelf_bulk_delete_author(body={}) — Bulk delete author editor. DESTRUCTIVE: this deletes data.
bookshelf_bulk_delete_book(body={}) — Bulk delete book editor. DESTRUCTIVE: this deletes data.
bookshelf_bulk_delete_bookfile(body={}) — Bulk delete bookfile bulk. DESTRUCTIVE: this deletes data.
bookshelf_bulk_update_author(body={}) — Bulk update author editor. WRITE: this modifies your Bookshelf instance.
bookshelf_bulk_update_book(body={}) — Bulk update book editor. WRITE: this modifies your Bookshelf instance.
bookshelf_bulk_update_bookfile(body={}) — Bulk update bookfile editor. WRITE: this modifies your Bookshelf instance.
bookshelf_commit_manual_import(body=[]) — Commit manual imports for the given files. Body is a list of ManualImportUpdateResource. WRITE: this modifies your Bookshelf instance.
bookshelf_create_author(body={}) — Create author. WRITE: this modifies your Bookshelf instance.
bookshelf_create_book(body={}) — Create book. WRITE: this modifies your Bookshelf instance.
bookshelf_delete_author(id, delete_files=False, add_import_list_exclusion=False) — Delete author. Query params: deleteFiles, addImportListExclusion. DESTRUCTIVE: this deletes data.
bookshelf_delete_book(id, delete_files=False, add_import_list_exclusion=False) — Delete book. Query params: deleteFiles, addImportListExclusion. DESTRUCTIVE: this deletes data.
bookshelf_delete_bookfile(id) — Delete bookfile. DESTRUCTIVE: this deletes data.
bookshelf_get_author(id) — Fetch a single author by id.
bookshelf_get_book(id) — Fetch a single book by id.
bookshelf_get_book_overview(id) — Fetch a single book overview by id.
bookshelf_get_bookfile(id) — Fetch a single bookfile by id.
bookshelf_get_parse(title=None) — Parse a file or release title and show how Bookshelf interprets it.
bookshelf_get_rename(author_id=None, book_id=None) — List proposed renames for an author or book (files that would be renamed on the next rename task).
bookshelf_get_retag(author_id=None, book_id=None) — List proposed file retags for an author or book.
bookshelf_list_author() — List author.
bookshelf_list_book(author_id=None, book_ids=None, title_slug=None, include_all_author_books=False) — List book. Query params: authorId, bookIds, titleSlug, includeAllAuthorBooks.
bookshelf_list_bookfile(author_id=None, book_file_ids=None, book_id=None, unmapped=None) — List bookfile. Query params: authorId, bookFileIds, bookId, unmapped.
bookshelf_list_edition(book_id=None) — List edition. Query params: bookId.
bookshelf_list_manualimport(folder=None, download_id=None, author_id=None, filter_existing_files=True, replace_existing_files=True) — List manualimport. Query params: folder, downloadId, authorId, filterExistingFiles, replaceExistingFiles.
bookshelf_list_series(author_id=None) — List series. Query params: authorId.
bookshelf_lookup_author(term=None) — Search the metadata provider for authors by term.
bookshelf_lookup_book(term=None) — Search the metadata provider for books by term.
bookshelf_search(term=None) — Search for new books/authors on the metadata provider by term and return the matches to add.
bookshelf_update_author(id, move_files=False, body={}) — Update author. Query params: moveFiles. WRITE: this modifies your Bookshelf instance.
bookshelf_update_book(id, body={}) — Update book. WRITE: this modifies your Bookshelf instance.
bookshelf_update_bookfile(id, body={}) — Update bookfile. WRITE: this modifies your Bookshelf instance.
bookshelf_update_books_monitored(body={}) — Set the monitored state of books in bulk. Body is a BooksMonitoredResource with bookIds and monitored.
| Name | Required | Description | Default |
|---|---|---|---|
| arguments | No | ||
| operation | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the transparency burden. It explicitly labels destructive operations with 'DESTRUCTIVE: this deletes data' and write operations with 'WRITE: this modifies your Bookshelf instance.' It also clarifies read operations with 'Fetch'/'List' and provides parameter hints, though it does not cover auth, rate limits, or return details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is lengthy due to 33 sub-operations, but it is well-structured as a bulleted list with each line containing essential info. The purpose is front-loaded, and every entry earns its place. It could be slightly more concise, but the complexity justifies the length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers all operations, flags side effects, and provides parameter hints, making it quite complete. An output schema exists for return values, so the description does not need to explain them. However, some operation descriptions are terse (e.g., 'List author.'), and body parameters are not fully specified for all operations, leaving minor gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema only defines `operation` and a generic `arguments` object, so parameter details are entirely absent. The description compensates by listing each operation's parameters (e.g., `bookshelf_delete_author(id, delete_files=False, add_import_list_exclusion=False)`), noting query params, and describing body structures for some operations. This adds critical meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'bookshelf media library operations on Bookshelf' and enumerates all sub-operations, making it easy to understand the tool's scope. It distinguishes itself from sibling tools by focusing on media library actions, and the list of operations provides a specific verb+resource for each.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the list of operations, but there is no explicit statement about when to use this tool vs alternatives or when not to use it. The description provides context (media library operations) but lacks guidance on exclusions or preferred tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bookshelf_notifications_metadataB
bookshelf notifications metadata operations on Bookshelf. Pass operation and an arguments dict matching that operation's parameters.
bookshelf_action_metadata(name, body={}) — Create metadata action. WRITE: this modifies your Bookshelf instance.
bookshelf_action_notification(name, body={}) — Create notification action. WRITE: this modifies your Bookshelf instance.
bookshelf_create_metadata(force_save=False, body={}) — Create metadata. Query params: forceSave. WRITE: this modifies your Bookshelf instance.
bookshelf_create_notification(force_save=False, body={}) — Create notification. Query params: forceSave. WRITE: this modifies your Bookshelf instance.
bookshelf_delete_metadata(id) — Delete metadata. DESTRUCTIVE: this deletes data.
bookshelf_delete_notification(id) — Delete notification. DESTRUCTIVE: this deletes data.
bookshelf_get_metadata(id) — Fetch a single metadata by id.
bookshelf_get_metadata_schema() — List metadata schema.
bookshelf_get_notification(id) — Fetch a single notification by id.
bookshelf_get_notification_schema() — List notification schema.
bookshelf_list_metadata() — List metadata.
bookshelf_list_notification() — List notification.
bookshelf_test_all_metadata() — Create metadata testall. WRITE: this modifies your Bookshelf instance.
bookshelf_test_all_notification() — Create notification testall. WRITE: this modifies your Bookshelf instance.
bookshelf_test_metadata(force_test=False, body={}) — Create metadata test. Query params: forceTest. WRITE: this modifies your Bookshelf instance.
bookshelf_test_notification(force_test=False, body={}) — Create notification test. Query params: forceTest. WRITE: this modifies your Bookshelf instance.
bookshelf_update_metadata(id, force_save=False, body={}) — Update metadata. Query params: forceSave. WRITE: this modifies your Bookshelf instance.
bookshelf_update_notification(id, force_save=False, body={}) — Update notification. Query params: forceSave. WRITE: this modifies your Bookshelf instance.
| Name | Required | Description | Default |
|---|---|---|---|
| arguments | No | ||
| operation | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Each operation is annotated with WRITE or DESTRUCTIVE flags in the description, which is essential given the lack of annotations. However, it omits other behavioral details such as error handling, auth requirements, or rate limits, leaving the agent with only partial transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long due to listing 18 operations, but each line is concise and follows a uniform pattern. The opening sentence effectively front-loads the dispatcher usage, though the overall length reduces conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists, the description need not explain returns. It provides a complete list of operations with side effects, but lacks examples or detailed argument requirements for each operation, making it adequate but not exhaustive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description lists parameter names and defaults for each operation (e.g., force_save, body), adding value beyond the schema's free-form arguments. However, it doesn't explain the body structure or types, so it only partially compensates for the 0% schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it handles 'bookshelf notifications metadata operations' and enumerates all sub-operations, distinguishing from siblings that manage other resource domains. The purpose is specific to CRUD operations on metadata and notifications, though it is not a single verb-resource pair.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives, nor does it mention exclusions or context that would help select it over sibling tools. It simply lists operations without explaining the dispatch pattern's place in the broader toolset.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bookshelf_profiles_formatsA
bookshelf profiles formats operations on Bookshelf. Pass operation and an arguments dict matching that operation's parameters.
bookshelf_create_customfilter(body={}) — Create customfilter. WRITE: this modifies your Bookshelf instance.
bookshelf_create_customformat(body={}) — Create customformat. WRITE: this modifies your Bookshelf instance.
bookshelf_create_delayprofile(body={}) — Create delayprofile. WRITE: this modifies your Bookshelf instance.
bookshelf_create_metadataprofile(body={}) — Create metadataprofile. WRITE: this modifies your Bookshelf instance.
bookshelf_create_qualityprofile(body={}) — Create qualityprofile. WRITE: this modifies your Bookshelf instance.
bookshelf_create_releaseprofile(body={}) — Create releaseprofile. WRITE: this modifies your Bookshelf instance.
bookshelf_delete_customfilter(id) — Delete customfilter. DESTRUCTIVE: this deletes data.
bookshelf_delete_customformat(id) — Delete customformat. DESTRUCTIVE: this deletes data.
bookshelf_delete_delayprofile(id) — Delete delayprofile. DESTRUCTIVE: this deletes data.
bookshelf_delete_metadataprofile(id) — Delete metadataprofile. DESTRUCTIVE: this deletes data.
bookshelf_delete_qualityprofile(id) — Delete qualityprofile. DESTRUCTIVE: this deletes data.
bookshelf_delete_releaseprofile(id) — Delete releaseprofile. DESTRUCTIVE: this deletes data.
bookshelf_get_customfilter(id) — Fetch a single customfilter by id.
bookshelf_get_customformat(id) — Fetch a single customformat by id.
bookshelf_get_customformat_schema() — List customformat schema.
bookshelf_get_delayprofile(id) — Fetch a single delayprofile by id.
bookshelf_get_language(id) — Fetch a single language by id.
bookshelf_get_metadataprofile(id) — Fetch a single metadataprofile by id.
bookshelf_get_metadataprofile_schema() — List metadataprofile schema.
bookshelf_get_qualitydefinition(id) — Fetch a single qualitydefinition by id.
bookshelf_get_qualityprofile(id) — Fetch a single qualityprofile by id.
bookshelf_get_qualityprofile_schema() — List qualityprofile schema.
bookshelf_get_releaseprofile(id) — Fetch a single releaseprofile by id.
bookshelf_list_customfilter() — List customfilter.
bookshelf_list_customformat() — List customformat.
bookshelf_list_delayprofile() — List delayprofile.
bookshelf_list_language() — List language.
bookshelf_list_metadataprofile() — List metadataprofile.
bookshelf_list_qualitydefinition() — List qualitydefinition.
bookshelf_list_qualityprofile() — List qualityprofile.
bookshelf_list_releaseprofile() — List releaseprofile.
bookshelf_reorder_delayprofile(id, after_id=None) — Update delayprofile reorder. Query params: afterId. WRITE: this modifies your Bookshelf instance.
bookshelf_update_customfilter(id, body={}) — Update customfilter. WRITE: this modifies your Bookshelf instance.
bookshelf_update_customformat(id, body={}) — Update customformat. WRITE: this modifies your Bookshelf instance.
bookshelf_update_delayprofile(id, body={}) — Update delayprofile. WRITE: this modifies your Bookshelf instance.
bookshelf_update_metadataprofile(id, body={}) — Update metadataprofile. WRITE: this modifies your Bookshelf instance.
bookshelf_update_quality_definitions(body=[]) — Update qualitydefinition update. WRITE: this modifies your Bookshelf instance.
bookshelf_update_qualitydefinition(id, body={}) — Update qualitydefinition. WRITE: this modifies your Bookshelf instance.
bookshelf_update_qualityprofile(id, body={}) — Update qualityprofile. WRITE: this modifies your Bookshelf instance.
bookshelf_update_releaseprofile(id, body={}) — Update releaseprofile. WRITE: this modifies your Bookshelf instance.
| Name | Required | Description | Default |
|---|---|---|---|
| arguments | No | ||
| operation | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explicitly labels every write operation with 'WRITE: this modifies your Bookshelf instance' and delete operations with 'DESTRUCTIVE: this deletes data.' This provides clear side-effect transparency, especially important for a tool with many mutating operations, and fully compensates for the absence of annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured as a bulleted list with each operation on a single line, making it easy to scan. The opening sentence provides a concise overview, and the repetitive format is appropriate for a multi-operation tool, avoiding unnecessary verbosity while maintaining clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers all operations, their parameters, and side effects, which is adequate for the tool's scope. Since an output schema exists (as indicated by context signals), it does not need to describe return values. However, it could benefit from a brief note on common use cases or examples to enhance completeness, but this is not critical.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
While the input schema only defines generic `operation` and `arguments`, the description adds per-operation parameter signatures (e.g., `body={}`, `id`, `after_id`) that clarify expected arguments. It does not describe the detailed fields within `body`, but for the generic nature of the tool, this level of annotation is sufficient to guide invocation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's domain ('bookshelf profiles formats operations') and lists all available operations with explicit names and brief summaries. It distinguishes itself from sibling tools by focusing on profile/format management, and each operation's purpose is self-evident from its name (e.g., 'create_customfilter', 'get_qualityprofile').
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description enumerates operations but does not explicitly guide when to use this tool versus alternatives or when to choose specific operations (e.g., create vs. update). The operation names imply usage scenarios, but there is no contextual advice or decision criteria provided, leaving some ambiguity for complex cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bookshelf_queueA
bookshelf queue operations on Bookshelf. Pass operation and an arguments dict matching that operation's parameters.
bookshelf_bulk_delete_queue(remove_from_client=True, blocklist=False, skip_redownload=False, change_category=False, body={}) — Bulk delete queue bulk. Query params: removeFromClient, blocklist, skipRedownload, changeCategory. DESTRUCTIVE: this deletes data.
bookshelf_delete_queue(id, remove_from_client=True, blocklist=False, skip_redownload=False, change_category=False) — Delete queue. Query params: removeFromClient, blocklist, skipRedownload, changeCategory. DESTRUCTIVE: this deletes data.
bookshelf_get_queue_details(author_id=None, book_ids=None, include_author=False, include_book=True) — List detailed queue items for an author or books.
bookshelf_get_queue_status() — Get queue statistics: total/full count and warnings.
bookshelf_grab_queue_bulk(body={}) — Grab multiple queue items now. Body is a QueueBulkResource with ids.
bookshelf_grab_queue_item(id) — Grab a single queue item now.
bookshelf_list_queue(page=1, page_size=10, sort_key=None, sort_direction=None, include_unknown_author_items=False, include_author=False, include_book=False) — List queue. Query params: page, pageSize, sortKey, sortDirection, includeUnknownAuthorItems, includeAuthor, includeBook.
| Name | Required | Description | Default |
|---|---|---|---|
| arguments | No | ||
| operation | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explicitly warns 'DESTRUCTIVE: this deletes data' for the delete operations, which is valuable since no annotations are present. However, other operations such as grab_queue_bulk and grab_queue_item are likely to mutate queue state but are not flagged, and no permissions, side effects, or rate-limit behavior are disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a front-loaded, well-structured bullet list with a clear usage line followed by seven compact operation entries. Each line is purposeful, contains no filler, and the format makes it easy for an agent to scan and match operations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the high complexity of seven distinct sub-operations and the absence of annotations, the description provides a comprehensive map of operations, parameters, and destructive warnings. An output schema exists, so return-value explanations are not required; the main remaining gap is behavioral depth for non-destructive mutations, but overall the description is sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the schema only exposes operation and a generic arguments dict, so the description carries the parameter documentation burden. It compensates well by listing each operation's function signature, parameter names, defaults, and query parameters (e.g., removeFromClient, pageSize, includeUnknownAuthorItems), which is essential for invocation. It still lacks detailed explanations for ambiguous parameters like blocklist or change_category.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'bookshelf queue operations on Bookshelf' and then enumerates seven specific operations with action verbs ('Bulk delete queue', 'Grab multiple queue items', 'List queue'), making the domain and scope clear. It distinguishes itself from sibling tools by focusing specifically on the queue resource, though the opening sentence is somewhat generic.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use guidance or alternatives are provided; the only usage instruction is to pass an operation and a matching arguments dict. The description lists operations but does not tell an agent when queue operations should be chosen over other Bookshelf tools or when one sub-operation is preferable to another.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bookshelf_release_searchC
bookshelf release search operations on Bookshelf. Pass operation and an arguments dict matching that operation's parameters.
bookshelf_get_indexerflag() — List indexerflag.
bookshelf_list_release(book_id=None, author_id=None) — List release. Query params: bookId, authorId.
bookshelf_push_release(body={}) — Push a release to Bookshelf (e.g. from an external downloader); body is a ReleaseResource with title and downloadUrl.
bookshelf_search_releases(body={}) — Trigger a release search for a book and grab the given release. WRITE: this modifies your Bookshelf instance.
| Name | Required | Description | Default |
|---|---|---|---|
| arguments | No | ||
| operation | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explicitly flags only 'bookshelf_search_releases' as a WRITE operation that modifies the instance. It does not state whether 'push_release' is also a write, nor does it clarify read-only nature of 'get' and 'list'. Lacks information on permissions, side effects, or idempotency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured with bullet points for each sub-operation. It avoids unnecessary verbosity while conveying the essential function. The dispatcher usage is explained in a single sentence. Minor redundancy exists, but overall it is efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the lack of annotations and minimal input schema, the description carries the full burden but falls short. It does not describe output schemas, error handling, or the exact format for arguments for each operation. It also misses clarifying which operations are read-only versus write (only one is flagged). For a multi-operation tool, this is incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description adds some semantics to parameters: it lists sub-operation signatures, e.g., 'book_id' and 'author_id' as query params, and indicates that 'push_release' expects a body with 'title' and 'downloadUrl'. However, it does not explain how the top-level 'arguments' dict maps to these per-operation parameters, and several operations lack detailed parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it handles 'release search operations' and lists the sub-operations, making it evident that this tool dispatches to specific functions. However, the inclusion of 'push' and 'list' operations slightly muddies the 'search' focus, so it's not a perfect 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides minimal guidance on when to use this tool versus alternatives. It simply lists operations without explaining selection criteria, prerequisites, or contexts where a sibling tool would be more appropriate. No mention of when to choose this dispatcher over other Bookshelf tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bookshelf_storageC
bookshelf storage operations on Bookshelf. Pass operation and an arguments dict matching that operation's parameters.
bookshelf_create_rootfolder(body={}) — Create rootfolder. WRITE: this modifies your Bookshelf instance.
bookshelf_delete_rootfolder(id) — Delete rootfolder. DESTRUCTIVE: this deletes data.
bookshelf_get_diskspace() — List diskspace.
bookshelf_get_rootfolder(id) — Fetch a single rootfolder by id.
bookshelf_list_filesystem(path=None, include_files=False, allow_folders_without_trailing_slashes=False) — List filesystem. Query params: path, includeFiles, allowFoldersWithoutTrailingSlashes.
bookshelf_list_filesystem_mediafiles(path=None) — List filesystem mediafiles. Query params: path.
bookshelf_list_filesystem_type(path=None) — List filesystem type. Query params: path.
bookshelf_list_rootfolder() — List rootfolder.
bookshelf_update_rootfolder(id, body={}) — Update rootfolder. WRITE: this modifies your Bookshelf instance.
| Name | Required | Description | Default |
|---|---|---|---|
| arguments | No | ||
| operation | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of disclosing behavioral traits. It does flag some operations as WRITE (bookshelf_create_rootfolder, bookshelf_update_rootfolder) and DESTRUCTIVE (bookshelf_delete_rootfolder), which is helpful. However, it does not explicitly state that the list/get operations are read-only, nor mention any side effects, permissions, or rate limits. The description adds some transparency but leaves gaps, especially for a tool that modifies data without annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is structured as a bulleted list of sub-operations, each with a concise one-liner and occasional notes (WRITE, DESTRUCTIVE, query params). It is front-loaded with the general instruction to pass operation and arguments, then delivers the list. There is minimal fluff and each line serves a purpose. It is not overly verbose, though it could be tightened by grouping, but overall it is readable and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is complex (dispatcher for 9 sub-operations) and has an output schema, so the description need not explain returns, but it must be complete enough for operation selection and parameter construction. While it lists all operations and some parameters, it omits detailed parameter schemas (e.g., what body should contain for create/update, what the path format is). This is a significant gap for an AI agent, as it would need to infer these details. The description is adequate for identifying the operation names but not for actually invoking them with proper arguments.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It lists parameter names for each sub-operation (e.g., body, id, path, include_files), but does not explain their meaning, types, or formats beyond what is in the enum. For instance, body={} and id are mentioned without describing required fields or constraints. The description only gives a brief hint like 'Query params: path, includeFiles, allowFoldersWithoutTrailingSlashes' but does not define these parameters. This is insufficient for an agent to construct correct arguments without additional knowledge.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool performs bookshelf storage operations and lists specific sub-operations like create/delete/update rootfolders and listing operations. It uses specific verbs (create, delete, update, list, fetch) and resources (rootfolder, filesystem, diskspace), which distinguishes it from the sibling tools that focus on other domains (e.g., media library, indexers). However, it is a dispatcher tool rather than a single action, so the purpose is clear but not as focused as a single-purpose tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no explicit guidance on when to choose this tool over its siblings such as bookshelf_media_library or bookshelf_config. It implies that it is for storage operations, but there is no mention of alternatives or exclusions. The only contextual hint is the list of sub-operations, which suggests a storage-related use case, but without explicit 'use this when' or 'don't use for' instructions, the agent must infer the scope.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bookshelf_system_commandsC
bookshelf system commands operations on Bookshelf. Pass operation and an arguments dict matching that operation's parameters.
bookshelf_delete_command(id) — Delete command. DESTRUCTIVE: this deletes data.
bookshelf_delete_system_backup(id) — Delete system backup. DESTRUCTIVE: this deletes data.
bookshelf_get_command(id) — Fetch a single command by id.
bookshelf_get_health() — List health.
bookshelf_get_system_routes() — List system routes.
bookshelf_get_system_routes_duplicate() — List system routes duplicate.
bookshelf_get_system_status() — Get system status: app name, version, OS, build, and runtime.
bookshelf_get_system_task() — List system task.
bookshelf_get_system_task_by_id(id) — Fetch a single system task by id.
bookshelf_list_command() — List command.
bookshelf_list_log(page=1, page_size=10, sort_key=None, sort_direction=None, level=None) — List log. Query params: page, pageSize, sortKey, sortDirection, level.
bookshelf_list_log_file() — List log file.
bookshelf_list_log_file_update() — List log file update.
bookshelf_list_system_backup() — List system backup.
bookshelf_ping() — List ping.
bookshelf_restart() — Restart the Bookshelf service.
bookshelf_restore_backup(id) — Create system backup restore. WRITE: this modifies your Bookshelf instance.
bookshelf_restore_backup_upload() — Create system backup restore upload. WRITE: this modifies your Bookshelf instance.
bookshelf_run_command(body={}) — Run a Bookshelf command (body is a CommandResource with a
name, e.g. RefreshAuthor, AuthorSearch, BookSearch, DownloadedBooksScan, RenamedBookFiles, RescanFolders, MetadataRefresh). WRITE: this modifies your Bookshelf instance.bookshelf_shutdown() — Shut down the Bookshelf service.
| Name | Required | Description | Default |
|---|---|---|---|
| arguments | No | ||
| operation | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Some behavioral hints are embedded in the text, such as 'DESTRUCTIVE' for delete commands and 'WRITE' for modifications, which warn about side effects. However, many operations (e.g., get, list, ping) lack explicit notes on permissions, idempotency, or potential errors, and no annotations are provided to supplement.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is structured as a clear bullet list of operations with brief, one-line descriptions, making it scannable. The repetition of the 'bookshelf_' prefix is slightly redundant but does not hinder readability. It is concise in phrasing, though the overall length is substantial due to the number of operations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with many subcommands, the description is sparse. It lacks details on the arguments parameter, return formats, error scenarios, and relationship between operations. The output schema is not addressed in the description, and the brief descriptions only cover basic actions without sufficient context for correct usage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The 'operation' parameter is partially explained through the enum list, but the 'arguments' parameter is not described at all. The schema provides no descriptions for arguments, and the description does not clarify its structure or how it varies per operation, leaving the parameter semantics ambiguous.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool as handling 'bookshelf system commands' and enumerates specific operations (delete, get, list, etc.), making its general purpose evident. However, it does not explicitly state the overall scope or when the parent tool is the appropriate entry point compared to categories like media or config.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus sibling tools (e.g., media library, config). It lists operations but gives no context on selection criteria, prerequisites, or typical use cases, leaving the agent to infer from operation names alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bookshelf_tagsB
bookshelf tags operations on Bookshelf. Pass operation and an arguments dict matching that operation's parameters.
bookshelf_create_tag(body={}) — Create tag. WRITE: this modifies your Bookshelf instance.
bookshelf_delete_tag(id) — Delete tag. DESTRUCTIVE: this deletes data.
bookshelf_get_tag(id) — Fetch a single tag by id.
bookshelf_get_tag_detail(id) — Fetch a single tag detail by id.
bookshelf_list_tag() — List tag.
bookshelf_list_tag_detail() — List tag detail.
bookshelf_update_tag(id, body={}) — Update tag. WRITE: this modifies your Bookshelf instance.
| Name | Required | Description | Default |
|---|---|---|---|
| arguments | No | ||
| operation | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description is the sole source of behavioral info. It explicitly marks write operations with 'WRITE: this modifies your Bookshelf instance' and destructive operations with 'DESTRUCTIVE: this deletes data', which is valuable. However, it lacks detail about side effects beyond mutation/deletion, e.g., confirmation, idempotency, or cascading effects on related data. Thus it partially covers transparency but could be more thorough.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is relatively concise and uses a bulleted list to present each operation, which is easy to scan. It includes usage warnings inline for write/destructive operations. However, the first sentence could be more explicit about the general purpose, and the list does not add much beyond the enum values in the schema. Still, it is well-structured and not verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool delegates to multiple sub-operations via a dynamic 'operation' and 'arguments' pattern, which is complex. The description covers the operation list and flags write/destructive behaviors, which is helpful. The output schema exists, so return format is not needed in the description. However, it does not explain how 'arguments' should be structured for each operation, which is a significant gap given the generic schema. The overall guidance is decent but incomplete for executing operations with required bodies or parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 2 parameters: 'operation' (an enum listing all operations) and 'arguments' (a generic object that is not described). Schema description coverage is 0%, meaning the description must compensate. However, the description only lists the function signatures (e.g., bookshelf_create_tag(body={})) and doesn't explain the structure or required fields of the 'body' argument or the 'arguments' dict. It does not clarify what each operation's parameters are beyond the signature, which is likely insufficient for an agent to correctly construct arguments for operations that require data.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description lists a clear set of operations (create, delete, get, get_detail, list, update) with brief action verbs and resource 'tag'. It distinguishes these operations from each other, but doesn't explicitly differentiate from sibling tools that manage other bookshelf resources (e.g., bookshelf_media_library). While the grouped operation list adds some clarity, the description does not provide a high-level purpose statement for this function.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description indicates when to use each operation (by listing them), but does not provide guidance on when to prefer this tool over sibling tools or circumstances that warrant one operation type over another. It does not mention exclusions or alternatives; it merely lists the sub-operations. Since each operation is self-explanatory given its name, but there is no context about typical workflows or conditions, this is average guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bookshelf_wantedARead-only
bookshelf wanted operations on Bookshelf. Pass operation and an arguments dict matching that operation's parameters.
bookshelf_get_wanted_cutoff(id) — Fetch a single wanted cutoff by id.
bookshelf_get_wanted_missing(id) — Fetch a single wanted missing by id.
bookshelf_list_wanted_cutoff(page=1, page_size=10, sort_key=None, sort_direction=None, include_author=False, monitored=True) — List wanted cutoff. Query params: page, pageSize, sortKey, sortDirection, includeAuthor, monitored.
bookshelf_list_wanted_missing(page=1, page_size=10, sort_key=None, sort_direction=None, include_author=False, monitored=True) — List wanted missing. Query params: page, pageSize, sortKey, sortDirection, includeAuthor, monitored.
| Name | Required | Description | Default |
|---|---|---|---|
| arguments | No | ||
| operation | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already covers safety, and the description lists only read operations (get/list), so no additional behavioral disclosure is strictly needed. However, the description adds little beyond the operation list; it does not explain response behavior or edge cases, but given the annotation, a 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and mostly concise, with a short introductory sentence followed by a scannable list of operations. The opening phrase 'bookshelf wanted operations on Bookshelf' is slightly redundant, but otherwise every line contributes useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a multi-operation dispatcher with no parameter descriptions in the schema and a confirmed output schema, the description covers all operations and their parameters adequately. It does not include examples or detailed argument formatting, but the output schema and readOnly annotation reduce the need for further behavioral details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry the burden, and it does. It lists each operation signature and the query parameters for list operations (page, pageSize, sortKey, sortDirection, includeAuthor, monitored), adding meaning beyond the bare schema. It could be stronger by defining the exact `arguments` key names for the get operations, but it still provides substantial guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies this as a dispatcher for Bookshelf 'wanted' operations, listing four specific operations with verbs like fetch/list and resources like wanted cutoff/missing. It is clear enough for selecting the function, though it does not explicitly differentiate it from the broader bookshelf_* sibling tool group.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It instructs the caller to pass an `operation` and an `arguments` dict, and enumerates the available operations with their signatures. This implies usage context but does not explicitly state when to choose this tool over sibling bookshelf modules or provide exclusions/alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Each tool covers a distinct functional domain (media, profiles, config, system, etc.), making primary purposes clear. However, some domains overlap conceptually—e.g., media_library handles bookfiles while storage handles filesystem paths—so an agent might occasionally hesitate between tools.
All tools follow the consistent pattern `bookshelf_<domain>` using snake_case. This makes the naming predictable and easy to navigate, with no mixed conventions or irregular verb forms.
With 15 tools, the server sits at the upper boundary of the typical well-scoped range. The count is reasonable for a full-featured media server API, though the number is on the higher side and might feel slightly heavy.
The tools cover a broad spectrum of Bookshelf operations including CRUD for books, authors, profiles, config, notifications, indexers, queue, and more. Minor gaps exist—e.g., no explicit 'remove from shelf' operation—but core workflows are well represented.
Maintenance
Related MCP Connectors
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
MCP server exposing the Backtest360 engine API as tools for AI agents.
MCP server for Pentest-Tools.com: run scans, manage findings and reports via your preffered LLM.
Read-only MCP server for verified book recommendations and reading lists.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceHTTP MCP server enabling LLMs to search, create, read, update, and delete BookStack entities (books, chapters, pages, shelves) using API tokens.241MIT
- AlicenseAqualityAmaintenanceMCP server that exposes Mylar3's HTTP API as tools, letting an LLM read and manage a comic library including watchlist, wanted issues, upcoming, history, logs, story arcs, and providers.5MIT
- AlicenseCqualityAmaintenanceMCP server exposing Radarr's v3 REST API as tools, enabling LLMs to read and manage movies, downloads, history, indexers, and more.100MIT
- AlicenseBqualityAmaintenanceExposes the Sonarr v3 REST API as MCP tools, enabling LLMs to read and manage a Sonarr instance including series, episodes, downloads, history, and more. Supports both read and write operations, with destructive tools flagged.15MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- 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/arr-mcps/bookshelf-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server