Micro.blog Books MCP Server
This MCP server provides comprehensive management of your Micro.blog books collection through 11 tools:
Bookshelf Management: Retrieve all bookshelves, view books in specific shelves, create new bookshelves, and rename existing ones.
Book Management: Add new books with title, author, and optional ISBN and cover URL; move books between shelves; remove books from shelves; and update book cover images.
Reading Goals: View all reading goals, check progress toward specific goals (including book lists), and update goal targets or current progress.
All operations are authenticated automatically using your Micro.blog bearer token and return JSON responses from the Micro.blog Books API. The server works with Claude Desktop and other MCP clients, and is designed for easy deployment on fastmcp.cloud with simple environment variable setup.
Provides tools for managing Micro.blog book collections, including bookshelf management (creating, renaming, organizing), book operations (adding, moving, removing books), and reading goal tracking and updates through the Micro.blog Books API.
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., "@Micro.blog Books MCP Servershow me all my bookshelves"
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.
Micro.blog Books MCP Server
An MCP (Model Context Protocol) server built with FastMCP that provides access to the Micro.blog Books API. Deployed on Modal and fronted by Cloudflare at https://books.mcp.7robots.org/mcp (a Worker reverse-proxy that rewrites the Host header to the Modal origin robots--micro-mcp-server-web.modal.run). The Cloudflare FQDN is the canonical address; the Modal URL still works directly.
This is a single-user personal server. Because it has write access to your books database, the MCP endpoint is gated by Okta OAuth — the same pattern as the other servers in this fleet. OAuth (rather than a static bearer header) is what lets the server be added as a custom connector on claude.ai, which then syncs to every signed-in Claude client (web, desktop, mobile). Your Micro.blog API token (MICRO_BLOG_BEARER_TOKEN) is separate and stays server-side — it authenticates the server to micro.blog and never reaches MCP clients.
Features
This MCP server provides the following tools for managing your Micro.blog books:
Bookshelf Management
get_bookshelves: Get all your bookshelves
get_bookshelf_books: Get books in a specific bookshelf
add_bookshelf: Create a new bookshelf
rename_bookshelf: Rename an existing bookshelf
Book Management
add_book: Add a new book to a bookshelf
move_book: Move a book between bookshelves
remove_book: Remove a book from a bookshelf
change_book_cover: Update a book's cover image
Reading Goals
get_reading_goals: Get your reading goals
get_goal_progress: Get progress toward a specific reading goal
update_reading_goal: Update a reading goal's target or progress
Related MCP server: apple-books-mcp
Deployment
This server is deployed on Modal.
Prerequisites
A Micro.blog account with API access
A bearer token from your Micro.blog account settings
Environment Variables
Two Modal secrets, kept separate so the micro.blog credential and the OAuth/storage config rotate independently: micro-blog-bearer-token (the API token) and micro-mcp-server-secrets (everything else below).
Variable | Description | Required |
| Your Micro.blog API bearer token (server → micro.blog; stays server-side) | Yes |
| Okta OAuth2 client ID | Yes (for auth) |
| Okta OAuth2 client secret | Yes (for auth) |
| Okta instance domain (e.g. | Yes (for auth) |
| Public Modal URL (no | Yes (for auth) |
| OAuth2 issuer (defaults to | No |
| Fixed key for signing MCP JWTs (auto-generated key is ephemeral across cold starts). Generate with | Production |
| Fernet key encrypting OAuth state in modal.Dict. Generate with | Production |
Auth is opt-in — when OKTA_CLIENT_SECRET is unset, the server runs without authentication (local dev only).
Deploy to Modal
uv sync
# Secret 1 — your micro.blog API token (server -> micro.blog):
uv run modal secret create micro-blog-bearer-token MICRO_BLOG_BEARER_TOKEN=your_microblog_token
# Secret 2 — Okta + storage config (clients -> this server via OAuth):
uv run modal secret create micro-mcp-server-secrets \
OKTA_CLIENT_ID=... OKTA_CLIENT_SECRET=... OKTA_DOMAIN=https://your.okta.com \
MCP_BASE_URL=https://books.mcp.7robots.org \
JWT_SIGNING_KEY="$(python -c 'import secrets; print(secrets.token_urlsafe(32))')" \
STORAGE_ENCRYPTION_KEY="$(python -c 'from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())')"
# Deploy (clean stale bytecode first — Modal's lazy mounts can serve stale .pyc):
find . -type d -name __pycache__ -exec rm -rf {} +
uv run modal deploy modal_app.pyMCP_BASE_URL is the Cloudflare FQDN https://books.mcp.7robots.org (no /mcp suffix) — the public hostname clients use. The Cloudflare Worker reverse-proxies it to the Modal origin.
Operator checklist (manual steps, outside the agent/code)
These must be done by a human in the Modal/Okta consoles — they are not part of the repo and cannot be scripted from here:
Okta app — in the OAuth application used for this server (this fleet reuses one dev-integrator app):
Add the Sign-in redirect URI
https://books.mcp.7robots.org/auth/callback(the Cloudflare FQDN;/auth/callbackis OIDCProxy's default).On the access policy, confirm Refresh Token is an allowed grant type (required for
offline_access; without it users re-auth ~hourly).Note the client ID, client secret, and domain for the secret.
Generate keys —
JWT_SIGNING_KEYandSTORAGE_ENCRYPTION_KEY(commands above); store in a password manager.Create both Modal secrets (see commands above).
MICRO_BLOG_BEARER_TOKENis your micro.blog token.First deploy, set
MCP_BASE_URLto the Cloudflare FQDNhttps://books.mcp.7robots.org, and redeploy.Verify — connect from Claude (OAuth login), then idle ~5–8 min for scale-to-zero and call a tool again to confirm no re-auth prompt (validates the
modal.Dictpersistence).
Local Development
# Install dependencies
uv sync
# Run the server locally
export MICRO_BLOG_BEARER_TOKEN="your_token_here"
uv run fastmcp run server.py --transport http --port 8000
# Or run directly
uv run python server.pyConnecting a client
The server is OAuth-gated, so add it as a custom connector rather than via a config file:
In claude.ai (or Claude Desktop) → Settings → Connectors → Add custom connector.
Enter the URL:
https://books.mcp.7robots.org/mcpComplete the Okta login when prompted.
Added on claude.ai, the connector is account-level and syncs to every signed-in Claude client (web, desktop, mobile). On first connection you'll be redirected to Okta to authenticate.
Usage
Once connected, you can use the server from Claude Desktop, claude.ai, or any OAuth-capable MCP client.
Example prompts:
"Show me all my bookshelves"
"Add 'Project Hail Mary' by Andy Weir to my Currently Reading bookshelf"
"What are my reading goals for this year?"
"Move book ID 79 to bookshelf ID 23"
API Reference
All tools return JSON responses from the Micro.blog API. The server handles authentication automatically using your bearer token.
For more details about the underlying API, see the Micro.blog Books API documentation.
License
This project is licensed under the MIT License - see the LICENSE file for details.
Available Tools
11 toolsadd_bookB
Add a new book.
Args: title: The title of the book author: The author of the book bookshelf_id: The ID of the bookshelf to add the book to isbn: The ISBN of the book (optional) cover_url: URL to the book cover image (optional)
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | ||
| author | Yes | ||
| bookshelf_id | Yes | ||
| isbn | No | ||
| cover_url | No |
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 full burden for behavioral disclosure. It states the action ('Add a new book') which implies a write operation, but doesn't mention permissions needed, whether duplicates are allowed, what happens on success/failure, or any rate limits. The description is minimal and lacks critical behavioral context for a mutation tool.
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 appropriately concise with a clear purpose statement followed by parameter documentation. The Args section is well-structured and easy to parse. While efficient, it could be slightly more front-loaded with critical behavioral information before parameter details.
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 this is a mutation tool with no annotations and 5 parameters, the description is incomplete. While it documents parameters adequately and an output schema exists (reducing need to describe return values), it lacks crucial behavioral context about permissions, error handling, and relationships to sibling tools. The presence of an output schema helps but doesn't compensate for missing mutation-specific guidance.
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?
With 0% schema description coverage, the description compensates well by listing all 5 parameters with brief explanations. It clearly identifies which are required vs optional, and provides basic semantic meaning for each parameter. However, it doesn't explain format constraints (e.g., ISBN format, URL validation) or relationships between parameters.
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 action ('Add a new book') and resource ('book'), making the purpose immediately understandable. However, it doesn't differentiate this tool from sibling tools like 'move_book' or 'remove_book' beyond the basic verb, missing explicit distinction about when to use 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?
The description provides no guidance on when to use this tool versus alternatives like 'move_book' or 'change_book_cover'. There's no mention of prerequisites (e.g., bookshelf must exist), error conditions, or typical use cases, leaving the agent with insufficient context for tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_bookshelfB
Add a new bookshelf.
Args: name: The name of the new bookshelf
| Name | Required | Description | Default |
|---|---|---|---|
| name | 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 full burden of behavioral disclosure. It states 'Add a new bookshelf,' which implies a write/mutation operation, but doesn't disclose any behavioral traits such as whether this requires authentication, what happens on success/failure, if there are rate limits, or if the bookshelf is immediately available for use. For a mutation tool with zero annotation coverage, this is a significant gap in 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 appropriately sized and front-loaded, with the core purpose stated in the first sentence ('Add a new bookshelf.') and parameter details following in a clear 'Args:' section. Every sentence earns its place by directly contributing to understanding the tool's function and inputs, with no redundant or verbose language.
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 low complexity (one parameter) and the presence of an output schema (which handles return values), the description is minimally complete. It covers the basic purpose and parameter meaning but lacks behavioral context (e.g., side effects, error handling) and usage guidelines. For a simple creation tool, this is adequate but leaves clear gaps that could hinder optimal agent use.
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 meaningful semantics beyond the input schema, which has 0% description coverage. It explains that the 'name' parameter is 'The name of the new bookshelf,' providing context that the schema's title ('Name') alone lacks. Since there's only one parameter and the schema coverage is low, the description effectively compensates by clarifying the parameter's purpose, though it doesn't detail constraints like length or allowed characters.
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 verb ('Add') and resource ('a new bookshelf'), making the purpose immediately understandable. It distinguishes this tool from siblings like 'rename_bookshelf' or 'get_bookshelves' by specifying creation rather than modification or retrieval. However, it doesn't explicitly mention what system or context this bookshelf belongs to (e.g., a personal library vs. a shared system), which prevents a perfect score.
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. It doesn't mention prerequisites (e.g., whether you need permissions or an existing library), when not to use it (e.g., for updating existing bookshelves), or direct alternatives among siblings like 'rename_bookshelf' for modification. This lack of contextual guidance leaves the agent to infer usage from the tool name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
change_book_coverC
Change the cover for a book.
Args: bookshelf_id: The ID of the bookshelf book_id: The ID of the book cover_url: URL to the new cover image
| Name | Required | Description | Default |
|---|---|---|---|
| bookshelf_id | Yes | ||
| book_id | Yes | ||
| cover_url | 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 states the action ('Change the cover') but doesn't mention permissions needed, whether the change is reversible, rate limits, or what the output schema returns. This leaves significant gaps for a mutation tool.
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 front-loaded with the main purpose, followed by a structured 'Args' section. It's efficient with minimal waste, though the 'Args' formatting could be integrated more seamlessly into the narrative flow.
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 (mutation with 3 parameters), no annotations, and an output schema present, the description is moderately complete. It covers the basic action and parameters but lacks behavioral context and usage guidance, which the output schema doesn't compensate for fully.
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%, so the description must compensate. It lists all three parameters with brief explanations, adding meaning beyond the schema's titles. However, it doesn't detail constraints like valid URL formats or ID ranges, leaving some ambiguity.
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 action ('Change the cover') and resource ('for a book'), making the purpose immediately understandable. However, it doesn't differentiate from sibling tools like 'move_book' or 'remove_book' in terms of scope or specific use cases, which prevents a perfect score.
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, such as 'add_book' for initial book setup or 'move_book' for relocation. It lacks context about prerequisites, like needing an existing book and bookshelf, or exclusions, such as not being for creating new books.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_bookshelf_booksB
Get books in a specific bookshelf.
Args: bookshelf_id: The ID of the bookshelf to get books from
| Name | Required | Description | Default |
|---|---|---|---|
| bookshelf_id | 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 full burden of behavioral disclosure. It states the tool 'Get books,' implying a read-only operation, but does not clarify aspects like whether it returns all books or is paginated, what format the output takes, or any error conditions. For a tool with no annotations, this leaves significant gaps in understanding its behavior.
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 appropriately sized and front-loaded, with the main purpose stated first ('Get books in a specific bookshelf.') followed by parameter details. It avoids unnecessary words, though the structure could be slightly improved by integrating the parameter explanation more seamlessly rather than as a separate 'Args:' section.
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 low complexity (1 parameter) and the presence of an output schema, the description is minimally adequate. It covers the basic purpose and parameter semantics but lacks behavioral details (e.g., output format, pagination) that the output schema might address. Without annotations, it should do more to explain the tool's operation, but the output schema reduces the burden slightly.
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 meaningful context for the single parameter: 'bookshelf_id: The ID of the bookshelf to get books from.' This clarifies the parameter's role beyond the schema, which only provides a title and type. Since schema description coverage is 0%, the description compensates well by explaining the parameter's purpose, though it could add more detail (e.g., format or source of the ID).
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 purpose: 'Get books in a specific bookshelf.' It specifies the verb ('Get') and resource ('books in a specific bookshelf'), making it easy to understand. However, it does not explicitly differentiate from sibling tools like 'get_bookshelves' (which likely lists bookshelves rather than books within one), leaving room for slight ambiguity.
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. It does not mention sibling tools like 'get_bookshelves' (for listing bookshelves) or 'add_book' (for adding books), nor does it specify prerequisites or exclusions. Usage is implied only by the tool name and description, lacking explicit context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_bookshelvesB
Get all bookshelves from Micro.blog.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
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 full burden. It states a read operation ('Get') but doesn't disclose behavioral traits such as authentication needs, rate limits, pagination, or what the output contains. This leaves gaps for an agent to understand how to use it 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 single, clear sentence with no wasted words. It's front-loaded with the core action and resource, making it efficient and easy to parse.
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 has 0 parameters, 100% schema coverage, and an output schema exists, the description is minimally adequate. However, it lacks context on usage versus siblings and behavioral details, which are needed for full completeness in a server with multiple related tools.
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 tool has 0 parameters, and schema description coverage is 100%, so no parameter information is needed. The description implies no inputs are required, which aligns with the schema, earning a baseline score of 4 for adequately handling the lack of parameters.
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 action ('Get') and resource ('all bookshelves from Micro.blog'), making the purpose evident. However, it doesn't differentiate from sibling tools like 'get_bookshelf_books' or 'get_reading_goals', which also retrieve related data, so it lacks sibling distinction.
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 guidance is provided on when to use this tool versus alternatives. For example, it doesn't specify if this is for listing all bookshelves versus filtered ones or when to prefer 'get_bookshelf_books' for books within a specific bookshelf.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_goal_progressC
Get books list progress toward a goal.
Args: goal_id: The ID of the reading goal
| Name | Required | Description | Default |
|---|---|---|---|
| goal_id | 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 full burden of behavioral disclosure. It states the tool is for 'Get' operations, implying it's read-only, but doesn't cover critical aspects like authentication requirements, rate limits, error handling, or what the output contains (though an output schema exists). For a tool with no annotations, this is insufficient to ensure safe and effective use.
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: a clear purpose statement followed by an 'Args' section. It avoids unnecessary words, though the formatting could be slightly improved (e.g., using bullet points). Every sentence adds value, making it efficient for quick understanding.
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 low complexity (1 parameter) and the presence of an output schema, the description is somewhat complete but has gaps. It covers the basic purpose and parameter meaning, but lacks usage guidelines and behavioral details. With no annotations, it should provide more context on how the tool behaves in practice to be fully adequate.
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 minimal semantics beyond the input schema: it explains that 'goal_id' is 'The ID of the reading goal'. With 0% schema description coverage, this provides some value, but it doesn't detail format constraints (e.g., integer range) or examples. Since there's only one parameter, the baseline is higher, but the description doesn't fully compensate for the low 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 the tool's purpose: 'Get books list progress toward a goal.' It specifies the verb ('Get') and resource ('books list progress toward a goal'), making it understandable. However, it doesn't explicitly differentiate from sibling tools like 'get_reading_goals', which might retrieve goal metadata rather than progress details, leaving room for slight ambiguity.
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. It doesn't mention prerequisites (e.g., needing an existing goal), exclusions, or comparisons to siblings like 'get_reading_goals' or 'update_reading_goal'. This lack of context could lead to misuse by an AI agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_reading_goalsC
Get reading goals.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
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 full burden for behavioral disclosure. 'Get reading goals' implies a read operation but doesn't specify whether this requires authentication, what permissions are needed, whether it returns all goals or filtered results, or any rate limits. The description fails to provide essential behavioral context beyond the basic read implication.
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 extremely concise ('Get reading goals.') but this brevity comes at the cost of under-specification. While there's no wasted text, the single phrase fails to provide necessary context that would help the agent understand and use the tool effectively. This isn't effective conciseness but rather insufficient 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?
Given that this is a simple read operation with 0 parameters and an output schema exists, the description doesn't need to explain return values. However, for a tool that presumably retrieves user reading goals in a system with multiple goal-related tools, the description should provide more context about what exactly is retrieved and how it differs from sibling tools like 'get_goal_progress'.
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 tool has 0 parameters with 100% schema description coverage, so the schema fully documents the absence of parameters. The description doesn't need to compensate for any parameter gaps. While it doesn't add parameter-specific information (which isn't needed), it correctly reflects that this is a parameterless operation by not mentioning any inputs.
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 'Get reading goals' is a tautology that essentially restates the tool name without adding meaningful specificity. It doesn't distinguish what kind of reading goals (e.g., user goals, system goals, all goals) or provide any context about scope or format. While it does include a verb ('Get'), it lacks the specificity needed to understand what this tool actually retrieves compared to sibling tools like 'get_goal_progress'.
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. There's no mention of prerequisites, context, or comparison to sibling tools like 'get_goal_progress' or 'update_reading_goal'. Without any usage instructions, the agent has no basis for selecting this tool appropriately in different scenarios.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
move_bookB
Move a book to a different bookshelf.
Args: book_id: The ID of the book to move bookshelf_id: The ID of the target bookshelf
| Name | Required | Description | Default |
|---|---|---|---|
| book_id | Yes | ||
| bookshelf_id | 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 implies a mutation ('Move'), but doesn't specify permissions needed, whether the operation is reversible, error conditions, or effects on related data. This is a significant gap for a mutation tool with zero annotation coverage.
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 front-loaded with the core purpose in the first sentence, followed by a structured 'Args' section. Every sentence earns its place by providing essential information without redundancy, making it highly efficient and easy to parse.
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 has an output schema (which handles return values), 2 parameters with full coverage in the description, and no annotations, the description is minimally adequate. However, as a mutation tool, it lacks details on behavioral aspects like side effects or error handling, leaving gaps in 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 description includes an 'Args' section that explains the meaning of both parameters ('book_id' and 'bookshelf_id'), adding value beyond the schema which has 0% description coverage. This compensates well for the lack of schema descriptions, though it doesn't detail format constraints beyond IDs being integers.
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 action ('Move') and resource ('a book to a different bookshelf'), making the purpose immediately understandable. However, it doesn't differentiate from sibling tools like 'remove_book' or 'add_book' beyond the basic verb, which prevents a perfect score.
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 guidance is provided on when to use this tool versus alternatives. For example, it doesn't clarify if this is for reorganizing books versus deleting them (vs. 'remove_book') or if there are prerequisites like existing bookshelves. The description only states what it does, not when or why to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_bookB
Remove a book from a bookshelf.
Args: bookshelf_id: The ID of the bookshelf book_id: The ID of the book to remove
| Name | Required | Description | Default |
|---|---|---|---|
| bookshelf_id | Yes | ||
| book_id | 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 full burden but offers minimal behavioral insight. It states the action is 'Remove' but doesn't clarify if this is destructive (permanent deletion), reversible, requires specific permissions, or has side effects. For a mutation tool with zero annotation coverage, this is inadequate disclosure.
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 front-loaded with the core purpose in the first sentence, followed by parameter details in a clear 'Args:' section. It's appropriately sized with no redundant information, though the parameter explanations are brief but sufficient given the simple schema.
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 (simple mutation with 2 parameters), the description covers the basic action and parameters. However, with no annotations and an output schema present (which isn't detailed here), it lacks behavioral context like side effects or permissions. It's minimally viable but leaves gaps for safe agent operation.
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 meaningful context for both parameters beyond the schema (which has 0% coverage). It specifies that 'bookshelf_id' identifies the bookshelf and 'book_id' identifies the book to remove, clarifying their roles. Since there are only 2 parameters and the description covers both adequately, it compensates well for the schema gap.
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 action ('Remove') and target resource ('a book from a bookshelf'), making the purpose immediately understandable. It distinguishes from siblings like 'move_book' (which relocates) and 'add_book' (which adds). However, it doesn't specify whether this is a permanent deletion or just removal from the shelf, leaving some ambiguity.
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 guidance is provided on when to use this tool versus alternatives like 'move_book' (which might relocate instead of remove) or prerequisites (e.g., whether the book must exist on the shelf). The description only states what it does, not when it's appropriate, leaving the agent to infer usage from context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rename_bookshelfC
Rename a bookshelf.
Args: bookshelf_id: The ID of the bookshelf to rename name: The new name for the bookshelf
| Name | Required | Description | Default |
|---|---|---|---|
| bookshelf_id | Yes | ||
| name | 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 states the action ('rename') but doesn't cover critical aspects like required permissions, whether the change is reversible, rate limits, or error conditions (e.g., invalid ID or duplicate names). This is a significant gap for a mutation tool.
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 appropriately sized and front-loaded, starting with the core purpose followed by parameter details. It avoids unnecessary fluff, though the 'Args:' section could be integrated more seamlessly into the flow.
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 (a simple mutation with 2 parameters) and the presence of an output schema, the description is somewhat complete but lacks depth. It covers the basic action and parameters but misses behavioral context and usage guidelines, which are crucial since no annotations are provided.
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 minimal semantics beyond the input schema, which has 0% coverage. It names the parameters ('bookshelf_id' and 'name') and gives basic explanations, but doesn't provide format details (e.g., ID constraints or name length limits). With low schema coverage, this partially compensates but leaves gaps.
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 purpose with a specific verb ('rename') and resource ('bookshelf'), making it immediately understandable. However, it doesn't differentiate this tool from potential alternatives among its siblings, such as whether 'update_reading_goal' might also involve renaming or if 'add_bookshelf' handles similar operations.
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. It doesn't mention prerequisites (e.g., needing an existing bookshelf), exclusions, or how it relates to sibling tools like 'add_bookshelf' or 'update_reading_goal', leaving usage context unclear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_reading_goalB
Update reading goal.
Args: goal_id: The ID of the reading goal value: The target number of books for the goal progress: The current progress (number of books read, optional)
| Name | Required | Description | Default |
|---|---|---|---|
| goal_id | Yes | ||
| value | Yes | ||
| progress | No |
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 full burden for behavioral disclosure. It states 'Update' which implies mutation, but doesn't mention permissions needed, whether changes are reversible, error conditions, or what the response contains. The description lacks critical behavioral context for a mutation tool.
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 appropriately brief but could be more front-loaded. The first line 'Update reading goal.' is clear but sparse, and the parameter documentation is well-structured but could be integrated more seamlessly. No wasted words, but room for improvement in flow.
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 has an output schema (which handles return values), 3 parameters with good semantic coverage in the description, and moderate complexity, the description is reasonably complete. The main gap is lack of behavioral context for this mutation operation, but the parameter documentation is strong.
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 provides clear semantic meaning for all three parameters beyond what the schema offers (0% coverage). It explains that 'goal_id' identifies the goal, 'value' is the target number of books, and 'progress' is current books read (with optional status). This compensates well for the schema's lack of 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 the verb ('Update') and resource ('reading goal'), making the purpose immediately understandable. However, it doesn't differentiate this tool from potential sibling tools like 'get_reading_goals' or 'get_goal_progress' beyond the update action.
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 guidance is provided about when to use this tool versus alternatives. There's no mention of prerequisites (e.g., needing an existing goal), exclusions, or how this relates to sibling tools like 'get_reading_goals' or 'get_goal_progress'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
11 tool updates
- First observed
add_book - First observed
add_bookshelf - First observed
change_book_cover - First observed
get_bookshelf_books - First observed
get_bookshelves - First observed
get_goal_progress - First observed
get_reading_goals - First observed
move_book - First observed
remove_book - First observed
rename_bookshelf - First observed
update_reading_goal
TDQS
Each tool has a clearly distinct purpose with no ambiguity. Tools like add_book, move_book, remove_book, and change_book_cover target specific book operations, while get_bookshelves, rename_bookshelf, and add_bookshelf handle bookshelf management, and get_reading_goals and update_reading_goal focus on goals. The descriptions reinforce these distinct roles, making misselection unlikely.
All tools follow a consistent verb_noun naming pattern throughout, such as add_book, get_bookshelves, rename_bookshelf, and update_reading_goal. There are no deviations in style or convention, making the tool names predictable and easy to understand at a glance.
With 11 tools, the count is well-scoped for managing books, bookshelves, and reading goals. Each tool earns its place by covering essential CRUD operations (e.g., add, get, move, remove, rename, update) without redundancy, fitting neatly within the typical 3-15 tool range for a focused domain.
The tool surface provides complete coverage for the domain of book and bookshelf management. It includes full CRUD for books (add, get, move, remove, change cover) and bookshelves (add, get, rename), plus reading goal operations (get, update). There are no obvious gaps, enabling agents to handle all core workflows without dead ends.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Books MCP — wraps Open Library API (free, no auth)
Manage Superlist tasks and lists in plain language from any MCP-compatible AI agent.
- mcpOAuthai.butlerbrain
Persistent memory for AI assistants. Save once; recall from Claude, ChatGPT, or any MCP client.
BookBrainz MCP — open book metadata (MetaBrainz / sister of MusicBrainz)
Related MCP Servers
- AlicenseBqualityAmaintenanceConnects BookStack knowledge bases to Claude through 47+ tools covering complete CRUD operations for books, pages, chapters, shelves, users, search, attachments, and permissions. Enables full management of BookStack content and configuration through natural language.5641384MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI clients to read and write local Apple Books library, collections, and annotations. Supports searching, exporting, and modifying books and highlights via MCP tools.MIT
- AlicenseAqualityAmaintenanceConnects AI assistants to the Hardcover book library, enabling natural language book searches, reading status updates, list management, and library exploration.315MIT
- AlicenseAqualityDmaintenanceEnables Claude Code and other MCP clients to manage bookmarks, collections, and tags in Raindrop.io accounts via natural language.152MIT
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/7robots/micro-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server