← WebMCP Directory

Tool tree

project-tbr.vercel.app

Media & PersonalTools verified
Website
Track what you want to read, what you finished and what you gave up on — and let an AI agent search your shelves, learn your taste and add books, through WebMCP.
Explore capabilities

    page: Every page

    search_catalogAnswer

    Search the global book catalogue (Open Library) by title, author, series or year. Returns candidates with a catalog_id to pass to add_book. Whenever you have identified a book from a photo, a description or your own knowledge, resolve it here FIRST, then add it with the catalog_id — that is what gives the book its cover art and publication year. Shows the matching catalogue search on screen, which is useful when discussing several books. Does not read or change the reader's own list.

    View tool JSON
    {
      "name": "search_catalog",
      "kind": "answer",
      "impl": "imperative",
      "description": "Search the global book catalogue (Open Library) by title, author, series or year. Returns candidates with a catalog_id to pass to add_book. Whenever you have identified a book from a photo, a description or your own knowledge, resolve it here FIRST, then add it with the catalog_id — that is what gives the book its cover art and publication year. Shows the matching catalogue search on screen, which is useful when discussing several books. Does not read or change the reader's own list.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "description": "Free text: title, author, series or year. e.g. \"le guin dispossessed\""
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "description": "Maximum results to return. Defaults to 10."
          }
        },
        "required": [
          "query"
        ],
        "additionalProperties": false
      },
      "page": "/"
    }
    search_my_booksAnswer

    Search the reader's own shelves. Filter by shelf (tbr, read, dnf), by title or author text, or by minimum star rating. Every filter is optional; with none, it returns the whole library newest first. Returns the book_id values that update_book and remove_book need. When the reader asks what to read next, call get_taste_profile first, then list the tbr shelf with this. When a named-book search identifies what the reader is discussing, follow it with navigate_to so that book is on screen.

    View tool JSON
    {
      "name": "search_my_books",
      "kind": "answer",
      "impl": "imperative",
      "description": "Search the reader's own shelves. Filter by shelf (tbr, read, dnf), by title or author text, or by minimum star rating. Every filter is optional; with none, it returns the whole library newest first. Returns the book_id values that update_book and remove_book need. When the reader asks what to read next, call get_taste_profile first, then list the tbr shelf with this. When a named-book search identifies what the reader is discussing, follow it with navigate_to so that book is on screen.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "status": {
            "type": "string",
            "enum": [
              "tbr",
              "read",
              "dnf"
            ],
            "description": "Shelf to search: tbr, read or dnf. Omit to search all shelves."
          },
          "query": {
            "type": "string",
            "description": "Optional title or author substring to filter by."
          },
          "min_rating": {
            "type": "integer",
            "minimum": 1,
            "maximum": 5,
            "description": "Only books rated at least this many stars."
          },
          "limit": {
            "type": "integer",
            "minimum": 1,
            "maximum": 20,
            "description": "Maximum results to return. Defaults to 10."
          }
        },
        "required": [],
        "additionalProperties": false
      },
      "page": "/"
    }
    get_taste_profileAnswer

    Get a compact summary of the reader's taste, computed from their whole rating and reading history: favourite authors, authors they abandon, rating patterns, era preferences and finishing rate. Call this FIRST whenever the reader asks what to read next, what they would like, or anything about their reading habits — before searching their shelves — so the answer reflects what they actually enjoy rather than what merely happens to be on the list.

    View tool JSON
    {
      "name": "get_taste_profile",
      "kind": "answer",
      "impl": "imperative",
      "description": "Get a compact summary of the reader's taste, computed from their whole rating and reading history: favourite authors, authors they abandon, rating patterns, era preferences and finishing rate. Call this FIRST whenever the reader asks what to read next, what they would like, or anything about their reading habits — before searching their shelves — so the answer reflects what they actually enjoy rather than what merely happens to be on the list.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": [],
        "additionalProperties": false
      },
      "page": "/"
    }
    add_bookSensitive Action

    Add a book to the reader's list. Pass catalog_id from search_catalog for a full record with cover art, or pass title and author directly when the catalogue has no good match. Defaults to the tbr shelf. Safe to call repeatedly: adding several books in a row — from one photo of a shelf, say — is a normal flow, and a book already on a shelf is skipped rather than duplicated.

    View tool JSON
    {
      "name": "add_book",
      "kind": "transact",
      "impl": "imperative",
      "description": "Add a book to the reader's list. Pass catalog_id from search_catalog for a full record with cover art, or pass title and author directly when the catalogue has no good match. Defaults to the tbr shelf. Safe to call repeatedly: adding several books in a row — from one photo of a shelf, say — is a normal flow, and a book already on a shelf is skipped rather than duplicated.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "catalog_id": {
            "type": "string",
            "description": "Open Library id from search_catalog, e.g. \"OL59863W\". Preferred."
          },
          "title": {
            "type": "string",
            "description": "Book title. Use when there is no catalog_id."
          },
          "author": {
            "type": "string",
            "description": "Author name. Use when there is no catalog_id."
          },
          "status": {
            "type": "string",
            "enum": [
              "tbr",
              "read",
              "dnf"
            ],
            "description": "Shelf to add to: tbr, read or dnf. Defaults to tbr."
          },
          "note": {
            "type": "string",
            "description": "Optional short note on why it was added."
          }
        },
        "required": [],
        "additionalProperties": false
      },
      "page": "/"
    }
    update_bookSensitive Action

    Change a book already on the list: move it between shelves, set a star rating, or replace its note. Any field left out is unchanged. When the reader says they finished a book or gave up on one, call search_my_books to find its book_id, then set the shelf and the rating here in a single call. Rating a book that is still on tbr moves it to read on its own, so there is no need to pass status as well — pass status only when the shelf differs from that, such as rating a book the reader abandoned. Moving to read or dnf records today as the date it ended; pass finished_on when the reader names a different day. A successful update automatically shows that book to the reader.

    View tool JSON
    {
      "name": "update_book",
      "kind": "transact",
      "impl": "imperative",
      "description": "Change a book already on the list: move it between shelves, set a star rating, or replace its note. Any field left out is unchanged. When the reader says they finished a book or gave up on one, call search_my_books to find its book_id, then set the shelf and the rating here in a single call. Rating a book that is still on tbr moves it to read on its own, so there is no need to pass status as well — pass status only when the shelf differs from that, such as rating a book the reader abandoned. Moving to read or dnf records today as the date it ended; pass finished_on when the reader names a different day. A successful update automatically shows that book to the reader.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "book_id": {
            "type": "string",
            "description": "Book id from search_my_books. Required."
          },
          "status": {
            "type": "string",
            "enum": [
              "tbr",
              "read",
              "dnf"
            ],
            "description": "New shelf: tbr, read or dnf. Omit to leave the shelf unchanged."
          },
          "rating": {
            "type": "integer",
            "minimum": 1,
            "maximum": 5,
            "description": "Star rating from 1 to 5. Omit to leave the rating unchanged. Rating a book that is on tbr also moves it to the read shelf."
          },
          "note": {
            "type": "string",
            "description": "Replacement note. Omit to leave the note unchanged."
          },
          "finished_on": {
            "type": "string",
            "format": "date",
            "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
            "description": "Day it was finished or abandoned, as YYYY-MM-DD (e.g. 2026-03-12). Defaults to today. Not valid on tbr; cannot be in the future."
          }
        },
        "required": [
          "book_id"
        ],
        "additionalProperties": false
      },
      "page": "/"
    }
    remove_bookSensitive Action

    Permanently remove a book from the reader's list. This cannot be undone by the agent, and the reader is asked to confirm before it happens. Use update_book instead if they merely want it on a different shelf.

    View tool JSON
    {
      "name": "remove_book",
      "kind": "transact",
      "impl": "imperative",
      "description": "Permanently remove a book from the reader's list. This cannot be undone by the agent, and the reader is asked to confirm before it happens. Use update_book instead if they merely want it on a different shelf.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "book_id": {
            "type": "string",
            "description": "Book id from search_my_books. Required."
          }
        },
        "required": [
          "book_id"
        ],
        "additionalProperties": false
      },
      "page": "/"
    }
    navigate_toAction

    Change what the reader is looking at — this never changes their data. When a specific book is recommended or discussed, call this as your FINAL tool call before replying, using view=book and that book_id, so the reader sees it rather than only hearing about it. view="book" opens one book (book_id or catalog_id); "shelf" shows the library, optionally filtered and highlighting a book_id; "taste" opens the reading profile; "search" opens catalogue search, optionally pre-filled with query.

    View tool JSON
    {
      "name": "navigate_to",
      "kind": "act",
      "impl": "imperative",
      "description": "Change what the reader is looking at — this never changes their data. When a specific book is recommended or discussed, call this as your FINAL tool call before replying, using view=book and that book_id, so the reader sees it rather than only hearing about it. view=\"book\" opens one book (book_id or catalog_id); \"shelf\" shows the library, optionally filtered and highlighting a book_id; \"taste\" opens the reading profile; \"search\" opens catalogue search, optionally pre-filled with query.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "view": {
            "type": "string",
            "enum": [
              "shelf",
              "book",
              "taste",
              "search"
            ],
            "description": "Screen to show: \"shelf\", \"book\", \"taste\" or \"search\"."
          },
          "book_id": {
            "type": "string",
            "description": "A book_id from search_my_books, or a catalog_id from search_catalog. Required when view is \"book\". On \"shelf\", highlights this book if it is on a shelf."
          },
          "shelf": {
            "type": "string",
            "enum": [
              "tbr",
              "read",
              "dnf"
            ],
            "description": "Filter the shelf to one shelf. Only used when view is \"shelf\"."
          },
          "query": {
            "type": "string",
            "description": "Pre-fill the search box. Only used when view is \"search\"."
          }
        },
        "required": [
          "view"
        ],
        "additionalProperties": false
      },
      "page": "/"
    }