Skip to main content
Glama
7robots

Micro.blog Books MCP Server

by 7robots

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

MICRO_BLOG_BEARER_TOKEN

Your Micro.blog API bearer token (server → micro.blog; stays server-side)

Yes

OKTA_CLIENT_ID

Okta OAuth2 client ID

Yes (for auth)

OKTA_CLIENT_SECRET

Okta OAuth2 client secret

Yes (for auth)

OKTA_DOMAIN

Okta instance domain (e.g. https://integrator-9607059.okta.com)

Yes (for auth)

MCP_BASE_URL

Public Modal URL (no /mcp suffix)

Yes (for auth)

OKTA_ISSUER

OAuth2 issuer (defaults to {OKTA_DOMAIN}/oauth2/default)

No

JWT_SIGNING_KEY

Fixed key for signing MCP JWTs (auto-generated key is ephemeral across cold starts). Generate with python -c "import secrets; print(secrets.token_urlsafe(32))"

Production

STORAGE_ENCRYPTION_KEY

Fernet key encrypting OAuth state in modal.Dict. Generate with python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"

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.py

MCP_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:

  1. 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/callback is 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.

  2. Generate keysJWT_SIGNING_KEY and STORAGE_ENCRYPTION_KEY (commands above); store in a password manager.

  3. Create both Modal secrets (see commands above). MICRO_BLOG_BEARER_TOKEN is your micro.blog token.

  4. First deploy, set MCP_BASE_URL to the Cloudflare FQDN https://books.mcp.7robots.org, and redeploy.

  5. 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.Dict persistence).

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.py

Connecting a client

The server is OAuth-gated, so add it as a custom connector rather than via a config file:

  1. In claude.ai (or Claude Desktop) → Settings → Connectors → Add custom connector.

  2. Enter the URL: https://books.mcp.7robots.org/mcp

  3. Complete 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 tools
add_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)

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYes
authorYes
bookshelf_idYes
isbnNo
cover_urlNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.1/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
bookshelf_idYes
book_idYes
cover_urlYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
bookshelf_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.1/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
goal_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.3/5.0
Behavior2/5

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.

Conciseness3/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose2/5

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.

Usage Guidelines1/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
book_idYes
bookshelf_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
bookshelf_idYes
book_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.1/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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

ParametersJSON Schema
NameRequiredDescriptionDefault
bookshelf_idYes
nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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)

ParametersJSON Schema
NameRequiredDescriptionDefault
goal_idYes
valueYes
progressNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.1/5.0
Behavior2/5

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.

Conciseness3/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

  1. 11 tool updates
    • First observedadd_book
    • First observedadd_bookshelf
    • First observedchange_book_cover
    • First observedget_bookshelf_books
    • First observedget_bookshelves
    • First observedget_goal_progress
    • First observedget_reading_goals
    • First observedmove_book
    • First observedremove_book
    • First observedrename_bookshelf
    • First observedupdate_reading_goal

TDQS

B3.4/5.0
Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness5/5

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

ActivitySlowing
ResponsivenessSyncing

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

Related MCP Servers

  • A
    license
    B
    quality
    A
    maintenance
    Connects 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.
    56
    413
    84
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables 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
  • A
    license
    A
    quality
    A
    maintenance
    Connects AI assistants to the Hardcover book library, enabling natural language book searches, reading status updates, list management, and library exploration.
    31
    5
    MIT

Latest Blog Posts

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