Library Loans MCP Server
Click on "Deploy 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., "@Library Loans MCP ServerRecord that I checked out The Hidden Life of Trees at Northgate today."
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.
Library Loans MCP Server
A small, local-first MCP server that keeps track of the books you borrow from your public library branches. Record loans when you check books out, track holds while you wait your turn, renew when you get to, and ask simple questions any time: what's due soon? what's overdue? how do things look per branch? The answers come back as plain, readable text that you (or an AI agent) can act on directly.
Everything lives in one JSON file on your own disk. There is no cloud, no
account, and nothing to install beyond Python and the official mcp package.
What it is not
This project is about borrowed physical books and their logistics. It is distinct from:
reading-room-mcp-server - reading notes and content you already own (highlights, annotations, what the book said).
dates-to-remember-mcp-server - general-purpose date reminders (birthdays, appointments, deadlines of every kind).
Library-loans is purely for the borrowed-copy lifecycle: checked out, due, renewed, returned, hold placed, hold ready, picked up.
Related MCP server: booklore-mcp
Tools
Tool | What it does |
| Save a checkout: title, author, branch, checkout date, due date (defaults: today, +21 days) |
| Push the due date out (renews from the current due date; blocked when overdue, out of renewals, or a hold waits on the title) |
| Mark a loan returned so it stops showing up in queries |
| All loans, or just active ones, with status marks |
| Loans due within the next N days (default 7) |
| Loans past their due date, most urgent first |
| Per-branch counts: active loans, due soon, overdue, open holds |
| Add a hold (waiting) for a title at a branch; one active hold per title per branch |
| Move a hold along: |
| Cancel a hold (final state) |
| All holds, optionally filtered by status |
House rules an agent can rely on:
Renewals extend from the current due date, never from today.
A loan can be renewed at most 2 times, and never while it is overdue.
An active hold (waiting or ready) on the same title blocks renewal - someone is waiting for that copy.
Hold statuses only move forward;
picked_upandcancelledare final.
Getting started
Requires Python 3.10+.
pip install -e .
# or: pip install mcp and run the module directly from the repoData lives in one JSON file. Set its location before starting the server:
export LIBRARY_LOANS_PATH="$HOME/library-loans/loans.json"Then add the server to your MCP client (opencode, Claude Desktop, anything that speaks MCP):
{
"mcpServers": {
"library-loans": {
"command": "python",
"args": ["-m", "library_loans.server"],
"env": { "LIBRARY_LOANS_PATH": "/home/you/library-loans/loans.json" }
}
}
}A typical conversation:
"Record that I checked out The Hidden Life of Trees at Northgate today." "What's due in the next week?" "Where do things stand across my branches?"
The tool results are plain text with status marks like [OVERDUE] and
[due soon], plus per-branch tallies, so an agent can summarize and suggest
next steps without parsing anything exotic.
Privacy
All data stays in the local JSON file you point it at. Nothing is uploaded, no metrics are collected, and there is nothing to sign into. Delete the file and your data is gone. Don't put names of family members into the title or author fields you don't want sitting in plaintext on disk - this is a plain JSON file, treat it like any other local document.
Development
python -m pytest tests/ -vTests use a frozen "today" date and a throwaway JSON file, so they are deterministic and never touch real data.
Changelog summary
0.1.0 - First version: loans, holds, renewals, due-soon/overdue queries, and per-branch tallies.
About the maker
Library Loans MCP Server is brought to you by Asdale Dynamics, LLC - the publishing/company hub behind Dylan Asdale's plain-English AI books and beginner-friendly tools. Like everything at Asdale Dynamics, it's local-first, respects your privacy, and is designed for people who want AI explained like a friend would: step by step, never condescending.
License
MIT - see LICENSE. Copyright (c) 2026 Asdale Dynamics, LLC.
Available Tools
11 toolsbranch_talliesA
Per-branch counts: active loans, overdue, due soon, and open holds.
| 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 supplied, so the description carries the full burden; 'counts' implies a read-only aggregation, which is the main behavioral signal an agent needs. However, it does not say whether results cover all branches or the caller's scope, nor how fresh the numbers are — relevant for a reporting 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?
One short sentence that front-loads the key fact (per-branch counts) and then enumerates the metrics. Nothing is wasted and the important content comes first.
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?
With no parameters and an output schema present, the description only needs to say what the tool aggregates, which it does. It falls slightly short on scope and on defining fuzzy windows such as 'due soon' and 'overdue', which affect interpretation of the returned counts.
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 takes zero parameters, so the baseline is 4; the schema is trivially complete and there is nothing for the description to compensate for. The description adds no parameter meaning because none is needed.
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 names a specific resource (branches) and enumerates the exact metrics returned: active loans, overdue, due soon, open holds. It is clearly the only aggregate/counting tool among action-oriented siblings like list_loans and due_soon, though it does not explicitly say so.
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?
There is no when-to-use guidance at all — nothing distinguishes this per-branch summary from due_soon or list_overdue, which an agent might otherwise reach for to answer similar questions. The agent must infer that this is the dashboard-style aggregate view.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_holdB
Cancel a hold that is waiting or ready (final state).
| Name | Required | Description | Default |
|---|---|---|---|
| hold_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, the description carries the full burden. '(final state)' usefully signals that cancellation is terminal and the hold cannot be resumed, which is real behavioral value. It still omits permission requirements, idempotency, and the error behavior when the hold is not in a cancellable state.
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?
A single front-loaded sentence with no filler; the key constraint appears immediately. The parenthetical '(final state)' is slightly ambiguous — it could read as describing the hold's state rather than the effect of the call.
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?
An output schema exists, so return values need no explanation, and the tool is a simple one-parameter mutation. Still missing is what hold_id refers to and what happens on invalid states, which matters for a state-constrained cancellation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for hold_id, so the description should compensate but does not — it adds no format, source, or validation meaning for the single parameter. The parameter is only inferable from the tool's subject matter, not explained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb and resource (cancel a hold) and adds a scope qualifier: the hold must be 'waiting or ready'. That qualifier distinguishes it from update_hold (which modifies an active hold) and place_hold/list_holds, though it never names a sibling explicitly.
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 phrase 'that is waiting or ready' implies a precondition for use, which is more than most definitions offer. However, it does not say what to do with holds in other states, whether update_hold is the alternative for non-terminal changes, or where a hold_id comes from (e.g., list_holds).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
due_soonB
Active loans due within days of today (default 7).
| Name | Required | Description | Default |
|---|---|---|---|
| days | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description carries the full behavioral burden. Beyond implying a read of 'Active loans', it says nothing about whether overdue items are included, result ordering, caps, or scope (branch/patron), all of which matter for an unannotated query 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?
A single front-loaded sentence with the scope condition and the default up front; nothing wasted. It is arguably too tight, since the same brevity creates the boundary ambiguity with list_overdue.
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?
An output schema exists, so return values need not be described, and a single optional parameter keeps the surface small. Still, for a tool in a family with list_loans and list_overdue, the definition lacks the one or two boundary facts an agent needs to choose correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the only parameter has just a type and default. The description does add real meaning by defining the window as 'within days of today' plus the default of 7, but it leaves ambiguous whether the direction is forward-only and whether 0 includes today's due items.
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?
Names a specific resource ('Active loans') and a precise scope condition ('due within days of today, default 7'), which reads as a filtered listing. It is distinguishable from list_loans and list_overdue by implication, but it never names those siblings or states the boundary explicitly.
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 window phrasing implies the use case (upcoming due dates), so an agent can guess when to pick this over list_loans. There is no explicit when-to-use/when-not or pointer to list_overdue for already-overdue items, leaving the main routing decision to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_holdsA
List holds (all, or filtered: waiting, ready, picked_up, cancelled).
| Name | Required | Description | Default |
|---|---|---|---|
| status | 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, the description must carry the behavioral burden on its own. "List" signals a non-mutating read, but the definition never states that it is read-only, says nothing about result volume, ordering, or pagination limits, and only implies that the unfiltered form returns all statuses.
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?
One sentence, front-loaded with the action and resource, with the filter vocabulary folded into a parenthetical. Nothing is wasted and nothing needed for a call is buried.
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?
An output schema exists, so return values need not be described, and a one-parameter list tool with a clear default is close to fully specified. The remaining gap is behavioral: nothing about ordering, result size, or whether the status match is exact, which matters for a listing endpoint.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the schema itself only offers an untyped anyOf string/null with no enum, so the description is the sole source of meaning for the single parameter. It supplies the four valid values (waiting, ready, picked_up, cancelled) and, by contrast with "all", communicates that the filter is optional and defaults to unfiltered — real added meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource ("List holds") plus the vocabulary for narrowing the result. It is clearly distinguishable from the mutating siblings place_hold, update_hold, and cancel_hold by the verb alone, though it never names a sibling or an alternative listing tool such as list_loans.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: an agent can infer this is the read path for holds and that the default returns everything. There is no explicit when-to-use, no exclusion, and no pointer to place_hold/update_hold/cancel_hold when the agent's intent is actually a mutation rather than a query.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_loansA
List loans, newest last. Default shows only active (not returned).
| Name | Required | Description | Default |
|---|---|---|---|
| active_only | No |
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 disclosure burden. It does useful work by stating the sort order and the default filter (active, i.e. not returned), but it says nothing about pagination, result limits, or whether historical/returned loans remain retrievable. An output schema exists, so not describing return fields is acceptable.
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?
Two short sentences with zero filler, and the ordering constraint is stated up front before the filtering default. Every clause carries information the agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read tool with an output schema, the description covers purpose, sort order, and default filtering, which is most of what an agent needs. The remaining gap is pagination/result-size behavior and the explicit relationship to sibling listing 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?
Schema description coverage is 0%, so the description must define active_only itself, and it does: the default is 'only active (not returned)', which explains both the parameter's meaning and its default value. The negative case (what setting it to false yields) is only implied, keeping it short of a 5.
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 names a specific verb and resource ('List loans') and states the ordering ('newest last'), so an agent immediately knows this is the general loan-listing read. It does not explicitly distinguish itself from the sibling list_overdue, leaving the agent to infer that this returns all loans while that one returns a subset.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an implied usage rule by stating the default scope ('Default shows only active (not returned)'), which tells the agent what happens if no parameter is passed. However, it never says when to prefer this over list_overdue or the mutation siblings like renew_loan, and it gives no guidance on when to flip active_only to false.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_overdueA
Loans past their due date, most-urgent first.
| 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 behavioral burden. It usefully discloses the ordering ('most-urgent first'), but does not state that this is a read-only listing, whether pagination applies, or any permission requirements.
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 single sentence is front-loaded with the resource and filter, and adds the ordering detail without any waste. Nothing is redundant or buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter listing tool with an output schema and a clear ordering rule, the description is nearly complete. Minor omissions such as pagination behavior or read-only status are mitigated by the output schema and the simplicity of the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
This tool has zero parameters, which establishes a baseline of 4. There are no parameter meanings to clarify beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific resource ('Loans') and a precise filter ('past their due date'), making it distinguishable from list_loans and due_soon. It does not explicitly name those siblings, so it falls short of a perfect clarity 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 intended use is implied by 'past their due date', but there is no explicit guidance on when to use this tool instead of list_loans or due_soon. No exclusions or prerequisites are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
place_holdB
Place a hold (waiting status) on a title at a branch. One active hold per title per branch.
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | ||
| branch | 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, the description carries the full burden and does disclose the key constraint (one active hold per title per branch), which is likely an error condition. However, it doesn't say what happens when a hold already exists, whether a queue position is assigned, or what permissions are required.
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?
Two tight sentences with the core action front-loaded and the constraint following immediately; no filler or redundancy.
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?
An output schema exists, so return values need not be explained, and the duplicate-hold rule is covered. Still missing for a mutation tool with zero annotations are failure behavior, required permissions, and any guidance on parameter formats.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the schema provides no meaning for 'title' or 'branch'. The description merely repeats the parameter names without specifying expected formats (title string vs. ID, branch name vs. code), so it fails to compensate for the coverage 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?
States a specific verb and resource ('Place a hold') and clarifies that a hold means 'waiting status' at a branch, which distinguishes it adequately from update_hold and cancel_hold by implication. It stops short of explicitly naming those siblings as alternatives, so a 4 rather than a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The business rule 'one active hold per title per branch' implies this is for creating a new hold rather than modifying an existing one, but the description never says when to use this versus update_hold or cancel_hold, nor whether the caller should check list_holds first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
record_loanA
Record a checked-out book. Dates use YYYY-MM-DD; checked_out defaults to today and due defaults to checked_out + loan_days (21).
| Name | Required | Description | Default |
|---|---|---|---|
| due | No | ||
| title | Yes | ||
| author | No | ||
| branch | Yes | ||
| loan_days | No | ||
| checked_out | 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, the description carries the burden of behavioral disclosure. It helpfully states the date format and effective defaults for checked_out and due, but omits write side effects, validation/error behavior, and duplicate or availability handling.
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?
Two compact sentences, front-loaded with the core action and then the date/default rules. No filler.
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?
An output schema covers return values, and the description gives the key date-default behavior for a loan-recording mutation. However, for a no-annotation write tool with required branch/title, it does not say enough about validation, failure modes, or how branch/title are resolved.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must explain the six parameters. It adds valuable meaning for checked_out, due, and loan_days (format and default derivation), but leaves required title and branch (and optional author) without any format or source guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Record a checked-out book'), so the agent can tell this creates a loan record rather than renewing or returning one. It does not explicitly name the sibling tools, so it falls short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by 'Record a checked-out book'; the agent can infer this is for new checkouts rather than renew_loan or return_loan. No explicit when-to-use/when-not guidance or named alternatives are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
renew_loanA
Extend a loan by days from its current due date. Blocked if the
loan is overdue, out of renewals (2), or an active hold has that title.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | ||
| loan_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, the description carries the full burden and does disclose the key mutation semantics and preconditions that an agent must anticipate (overdue block, renewal cap of 2, hold conflict). It stops short of stating permission/auth requirements, whether the renewal is atomic or idempotent, or how a blocked attempt surfaces.
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?
Two short sentences, front-loaded with the action, followed by the failure conditions. Nothing is redundant and no sentence could be cut without losing 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?
An output schema exists, so return values need no explanation, and the blocking conditions are fully covered for a two-parameter mutation. The only real omission is what happens to the remaining renewal count after a successful call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate, and it clarifies the non-obvious point that `days` counts from the current due date rather than today. `loan_id` is left to its self-explanatory name, which is a minor gap but not a blocking one.
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 states a specific verb and resource ('Extend a loan') plus the exact scope of the extension ('by `days` from its current due date'). This is clearly distinguishable from siblings like record_loan, return_loan, and update_hold without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-not conditions: the renewal is blocked if the loan is overdue, has exhausted its 2 renewals, or an active hold exists on the title. What it lacks is routing guidance to alternatives (e.g., which sibling to use instead when the loan is overdue).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
return_loanB
Mark a loan returned (default today, or YYYY-MM-DD).
| Name | Required | Description | Default |
|---|---|---|---|
| loan_id | Yes | ||
| returned_on | 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, the description carries the full behavioral burden. It discloses that a return date defaults to today and can be overridden, but it does not mention permissions, idempotency, side effects such as fines or availability changes, or error behavior 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 a single front-loaded sentence with no wasted words. The default-date and format information is attached directly to the relevant action.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple and has an output schema, so return values need not be described. However, as an unannotated mutation tool, it should say more about side effects, errors, or permissions to be fully complete for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It usefully explains returned_on as defaulting to today and accepting YYYY-MM-DD, but it says nothing about loan_id beyond its obvious identifier role, leaving one parameter undocumented.
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 states a specific verb and resource: 'Mark a loan returned.' This clearly distinguishes the tool from siblings such as renew_loan and record_loan, though it does not explicitly differentiate itself from them in wording.
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 action implies when it would be used, but there is no explicit guidance on when to choose this over renew_loan or other loan-management tools, nor are prerequisites or exclusions mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_holdB
Move a hold along: waiting -> ready -> picked_up. Cancel from waiting or ready. Use YYYY-MM-DD-worthy caution; statuses cannot undo.
| Name | Required | Description | Default |
|---|---|---|---|
| status | Yes | ||
| hold_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, the description carries the full behavioral burden, and it does disclose two important traits: the ordered transition model and the irreversibility of status changes ('statuses cannot undo'). It omits other essentials for a mutation tool such as required permissions, what happens on an invalid transition, and whether a rejected update errors or is silently ignored. The 'YYYY-MM-DD-worthy caution' phrasing is evocative but imprecise as a behavioral signal.
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?
It is short and front-loads the transition sequence, which is the right priority. But the closing sentence 'Use YYYY-MM-DD-worthy caution' is an odd, opaque metaphor that costs a sentence without conveying a checkable rule, and the cancel clause would read better structured alongside the transitions.
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?
An output schema exists, so return values need not be explained, and the state machine is adequately conveyed for a two-parameter mutation. Still missing is the interaction with the cancel_hold sibling, the exact status value used for cancellation, and error behavior for illegal transitions — meaningful gaps for a tool that mutates state irreversibly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the status parameter has no enum, so the schema alone leaves the agent guessing at accepted values. The description compensates substantially by enumerating the valid states (waiting, ready, picked_up) and implying a cancellation outcome. It does not clarify hold_id's format or whether 'cancel' is a literal status string or a separate operation.
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 names a concrete verb and resource and spells out the state machine it drives: 'waiting -> ready -> picked_up', which lets an agent understand the tool's effect without opening the schema. It does not differentiate itself from sibling tools, and its 'Cancel from waiting or ready' clause overlaps with the existing cancel_hold sibling, leaving some ambiguity about which tool owns cancellation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives real usage constraints by defining which transitions are legal and from which states cancellation is permitted, which is more than most descriptions offer. However, with a sibling named cancel_hold present, the agent gets no guidance on when to use this tool's cancel path versus that dedicated tool, so the routing decision is left to inference.
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.
11 tool updates
v0.1.0- First observed
branch_tallies - First observed
cancel_hold - First observed
due_soon - First observed
list_holds - First observed
list_loans - First observed
list_overdue - First observed
place_hold - First observed
record_loan - First observed
renew_loan - First observed
return_loan - First observed
update_hold
TDQS
Scored across 11 tools
Loan actions (record/renew/return) and hold actions (place/update/cancel) are clearly distinct, and the query tools have focused filters. However, cancel_hold largely duplicates a subset of update_hold (cancelling from waiting/ready), and due_soon/list_overdue are filtered views that overlap with list_loans, creating minor selection ambiguity.
Most names follow a predictable verb_noun snake_case pattern (renew_loan, record_loan, return_loan, place_hold, update_hold, cancel_hold, list_holds). A few deviations break the pattern: due_soon and list_overdue use adjective/adverb forms, and branch_tallies is noun_noun.
Eleven tools is well within the ideal range and each maps to a meaningful loan or hold operation. The set is neither bloated nor thin for a library circulation domain.
Loan lifecycle (record, renew, return, list, overdue, due soon) and hold lifecycle (place, advance/cancel, list) are well covered, with branch reporting. Minor gaps exist: no single-loan or single-hold lookup, no way to filter loans by patron/title, and no correction/update path for a mis-recorded loan.
Maintenance
Related MCP Connectors
AI assistant integration for Leaf — track books, log reading sessions, and manage your library.
Manage your Readlink book library: add books, track reading, rate, notes, highlights, shelves.
The media memory layer for AI agents and their humans. Your AI client can search your collection, add and log what you've finished, update ratings and lists, and find patterns across everything you've read, watched, played, and listened to.
Track subscriptions and renewals from your AI chat: schedules, due dates, reminders, local data.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables AI assistants to read, write, query, and manage JSON data files with automatic ID and timestamp generation.616 npm1MIT
- FlicenseAqualityCmaintenanceEnables AI assistants to interact with BookLore self-hosted libraries, allowing natural language queries to search books, manage reading status, ratings, series, authors, and highlights.71-
- AlicenseNot gradedqualityBmaintenanceEnables managing a personal bookshelf (CRUD, reading status, tags) and searching/importing Douban book metadata through MCP tools for AI clients like Claude and Cursor.54,355 npmMIT
- AlicenseBqualityCmaintenanceEnables Claude to record job applications in a local JSON file and then list them, change their status (applied, replied, interview, rejected, offer), and surface stale applications that need a follow-up. Requires no database or account, and validates every input so saves stay clean.41MIT