{"$schema":"https://wellknown.network/schemas/agent-record-v1.json","schemaVersion":"1","id":"ag_wzhq47sruhfb","handle":"leafle","url":"https://wellknown.network/agents/leafle","links":{"self":"https://wellknown.network/agents/leafle/record.json","html":"https://wellknown.network/agents/leafle","markdown":"https://wellknown.network/agents/leafle/record.md","api":"https://wellknown.network/api/v1/agents/leafle","status":"https://wellknown.network/api/v1/agents/leafle/status","claim":"https://wellknown.network/agents/leafle/claim","claimApi":"https://wellknown.network/api/v1/claims","claimDescriptor":"https://wellknown.network/agents/leafle/claim.json","badge":"https://wellknown.network/agents/leafle/badge.svg","openapi":"https://wellknown.network/openapi.json"},"ard":{"identifier":"urn:air:leafle.nanosheep.net:agent:leafle","type":"application/a2a-agent-card+json"},"kind":"agent","declared":{"name":"Leafle","summary":"Personalised book recommendations, filtered to what's on your public library's shelf right now.","description":"Personalised book recommendations, filtered to what's on your public library's shelf right now.","publisher":{"name":"nanosheep","url":"https://leafle.nanosheep.net/"},"homepage":"https://leafle.nanosheep.net/","repository":null,"version":"1.0.0","license":null,"protocols":["a2a","mcp"],"tags":["library","availability","books","read-only","catalogue","search","coverage","directory","reader","profile","taste","portrait","history","recommendations","my-books","notes"],"pricing":null,"endpoints":[{"url":"https://leafle.nanosheep.net/mcp","type":"mcp_streamable_http","auth":null,"probeable":true}],"skills":[{"id":"check_library_availability","name":"Check library availability","tags":["library","availability","books","read-only"],"description":"Check whether a specific book is available to borrow right now at a public library service — UK-wide, the big US/Canadian systems, Australia/NZ, Japan, and more (use list_covered_libraries to see everything covered)."},{"id":"search_books","name":"Search book catalogue","tags":["books","catalogue","search","read-only"],"description":"Search real book catalogue records (Open Library) to ground a title/author."},{"id":"list_covered_libraries","name":"List covered library services","tags":["library","coverage","directory","read-only"],"description":"Which library services leafle covers — the whole directory, or filtered."},{"id":"get_reading_profile","name":"Get reading profile","tags":["reader","profile","taste","read-only"],"description":"The signed-in reader's structured reading profile (tastes, favourite authors, what they want from a read, library service). Empty if they haven't completed the discovery interview in the app yet."},{"id":"get_reading_portrait","name":"Get Reading Portrait","tags":["reader","portrait","taste","read-only"],"description":"The signed-in reader's Reading Portrait: a synthesised prose portrait, a one-line thesis, weighted themes/moods, and keystone books/writers. This is the reader's own taste model made legible."},{"id":"list_reading_history","name":"List reading history","tags":["reader","history","books","read-only"],"description":"The signed-in reader's library (the app's 'My Books') — each book with its status (`reading` / `read` / `owned` on their shelf / `to_read` on their to-read list / `dnf` did-not-finish), any loved/liked rating, and their own note. A `dnf` book with a rating, or whose note gives a reason that is not about the book (a library return, a lost copy), was set down, not rejected; the rating and note say how they took to what they read. A `to_read` book also carries `queue_position` — its place in the r…"},{"id":"list_recommendations","name":"List past recommendations","tags":["reader","recommendations","books","read-only"],"description":"The signed-in reader's past recommendation sets (most recent first) — the books the librarian has already suggested, so a client can avoid repeating them."},{"id":"mark_book_read","name":"Mark a book read","tags":["reader","history","books"],"description":"Record that the signed-in reader has FINISHED a book, optionally with their reaction. This updates their taste ledger (and triggers a background refresh of their taste model), improving future recommendations."},{"id":"set_book_status","name":"Set a book's status","tags":["reader","my-books","books"],"description":"Set a book's status in the reader's library: `reading` (currently reading), `read` (finished), `owned` (on their shelf, NOT read yet), `to_read` (on their to-read list — they intend to read it), or `dnf` (did not finish). If the book isn't in their library yet, it's added at that status."},{"id":"rate_book","name":"Rate a book","tags":["reader","my-books","taste"],"description":"Set or clear a book's rating in the reader's library: `loved`, `liked`, or `none` (clears it). A rating means they've opened it: it lifts an `owned` or `to_read` book to `read`, while a `dnf` book stays `dnf` with the rating as their verdict on what they read (and `none` on a `dnf` book turns \"gave up on it\" into a plain unfinished read). Adds the book (as read) if it isn't in their library yet."},{"id":"set_book_note","name":"Set a note on a book","tags":["reader","my-books","notes"],"description":"Set (or clear, with an empty string) the reader's own note on a book — what they thought of it. Adds the book (as read) if it isn't in their library yet."},{"id":"remove_from_library","name":"Remove a book from the library","tags":["reader","my-books","books"],"description":"Remove a book from the reader's library entirely."},{"id":"recommend_books","name":"Recommend books","tags":["recommendations","books","library"],"description":"Get personalised book recommendations for the signed-in reader, tuned to their profile, reading history, and saved acquisition preference."}],"tools":["Check library availability","Search book catalogue","List covered library services","Get reading profile","Get Reading Portrait","List reading history","List past recommendations","Mark a book read","Set a book's status","Rate a book","Set a note on a book","Remove a book from the library","Recommend books"],"extra":{"updatedAt":"2026-08-11T13:29:26.285406Z","inputModes":["application/json"],"outputModes":["application/json"],"publishedAt":"2026-08-11T13:29:26.285406Z","capabilities":{"streaming":false,"pushNotifications":false,"stateTransitionHistory":false},"registryName":"net.nanosheep/leafle","protocolVersion":"0.3.0"},"attribution":{"kind":"a2a_card","name":"a2a_card","summary":"a2a_card","version":"a2a_card","description":"a2a_card","homepageUrl":"a2a_card","publisherUrl":"a2a_card","publisherName":"a2a_card"}},"derived":{"capabilities":[{"slug":"dev.filesystem","name":"Filesystem","confidence":1,"provenance":"declared"},{"slug":"productivity.notes","name":"Notes & Docs","confidence":1,"provenance":"declared"},{"slug":"ai.agent-discovery","name":"Agent Discovery","confidence":0.694,"provenance":"derived"}],"categories":["ai","dev","productivity"]},"observed":{"status":"unknown","statusReason":"Not checked yet.","lastOkAt":null,"lastProbedAt":null,"statusComputedAt":null,"reliability30d":null,"latestObservations":[{"at":"2026-09-07T09:29:28.313Z","kind":"mcp_initialize","ok":true,"httpStatus":401,"latencyMs":123,"error":null,"detail":{"authRequired":true,"wwwAuthenticate":"Bearer error=\"invalid_token\", error_description=\"Authentication required\", resource_metadata=\"https://leafle.nanosheep.net/.well-known/oauth-protected-resource/mcp\""}}],"tools":null,"package":null},"verification":{"claimed":false,"claimedAt":null,"proofs":[]},"provenance":{"sources":[{"source":"mcp_registry","key":"net.nanosheep/leafle","url":"https://registry.modelcontextprotocol.io/v0/servers/net.nanosheep%2Fleafle","firstSeenAt":"2026-09-07T08:19:34.702Z","fetchedAt":"2026-09-07T08:19:34.702Z","normalizedAt":"2026-09-07T08:19:34.702Z"},{"source":"a2a_card","key":"https://leafle.nanosheep.net/.well-known/agent-card.json","url":"https://leafle.nanosheep.net/.well-known/agent-card.json","firstSeenAt":"2026-09-07T08:25:31.373Z","fetchedAt":"2026-09-07T08:25:31.373Z","normalizedAt":"2026-09-07T08:25:31.373Z"}]},"firstSeenAt":"2026-09-07T08:19:34.702Z","updatedAt":"2026-09-07T08:26:36.137Z"}