Ferret
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
Ferret is this household's home inventory: what they own, where it is kept, receipts, manuals and warranties.
To find things, use search_inventory (words and meaning). For questions answered from receipts/manuals, use ask_inventory.
Places are properties (a home, a cabin) containing nested locations (rooms, closets, shelves). list_locations shows the tree with ids.
Boxes, bins and cases are items with isContainer: true; other items go inside them (containerItemId) and are wherever the box is. list_items with containerItemId shows what's in a box. Boxes and shelves can carry QR labels with 6-character codes (e.g. K7QM2X); search_inventory finds a box by its code.
Money is in integer cents (e.g. 12999 = $129.99). Dates are yyyy-mm-dd.
Maintenance (filters, servicing, gutters…) is tracked as tasks that repeat; list_maintenance shows what's due. When someone says they did one, use complete_maintenance.
Before creating an item, search first so you don't add a duplicate. Before deleting, confirm with the person.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| search_inventoryA | Finds items by words (names, brands, serial numbers, text read from receipts and manuals) and by meaning ("something to make holes" finds a drill), best matches first, each with where it's kept; a box's 6-character QR label code finds the box. Start here whenever the person mentions a thing — to answer "where is…", and before create_item so you don't add a duplicate. For questions answered from documents ("what filter does the furnace take?") use ask_inventory; to browse a room, category or tag use list_items. Leaves out things that are gone or only wanted. Returns items, each with its id, fields, location path and what matched. |
| ask_inventoryA | Answers a question in words from the household's own items and documents (receipts, manuals, warranty cards), citing the items it used — for "when does the dishwasher warranty end?" or "what filter does the furnace take?". Use search_inventory instead when the person wants to find a thing rather than learn a fact. Needs the server's AI to be switched on, counts as one AI action, and can take several seconds. |
| get_itemA | Everything about one item: all its fields, where it's kept (and which box), warranties and claims, its photos and documents with what the vision model read in them, and any suggested fields waiting for the person to confirm. Use it after search_inventory or list_items has found the item, when you need the details; for what happened to it over time use item_history, and for a quick look at many items list_items is enough. |
| list_itemsA | Lists items, most recently changed first, 50 at a time (offset for more), with where each is kept. Use it to browse rather than search: with locationId, everything in that place and the places inside it ("what's in the garage?"); containerItemId, what's directly in a box; categoryId, a category and its subcategories; tag, a tag's items (a tag can be a collection, e.g. "Christmas decorations"); origin, how they were added ("claude": what you added, to check your own work); collectionId (list_collections), a collection's things — wanted "include" adds its want list, "only" just that. To find a particular thing by name, use search_inventory. |
| list_locationsA | Every property (home, cabin, storage unit…) with its locations as a tree (rooms › closets › shelves), their ids and how many items each holds. Call it to get a locationId or propertyId before create_item, move_item, list_items or create_location, and to check a place exists before adding it again. Read-only; the whole tree in one call. |
| what_needs_attentionA | What to act on now, urgent first: maintenance overdue or due within a week, warranties ending within 30 days, warranty claims with no news for two weeks, things running low, borrowed things due back, recalls that may affect something owned, insurance limits that fall short, and items or room scans from photos still to finish. Returns entries with kind, severity (urgent or soon), title, detail, the itemId to open (if any) and a date. Use it for "anything I should deal with?" or a daily check-in; for the full maintenance schedule use list_maintenance, for all warranties list_warranties, for what to buy shopping_list. Empty when nothing needs doing. |
| shopping_listA | What to buy, run-out first: tracked consumables that have run out or are at or below their minimum (minQuantity, "keep at least"), with how many are left and a suggested amount to buy. Use it for "what do we need?" or before a shop; after buying, adjust_stock with a positive delta takes things off the list. Read-only. |
| item_historyA | What happened to one item, newest first: when it was added, each edit in words (moved from where to where, value, name…), photos and documents added, warranties and claims, maintenance done, stock used or restocked, loans. Use it for "when did we move the ladder?" or "when was the furnace last serviced?"; for the item as it is now use get_item. Get the id from search_inventory first. Returns entries with when (at), what happened in words, who, and how (the app, Claude, a script); more is true when there are older ones. |
| coverage_checkA | Checks the household's insurance limits against the inventory: each limit set in the app (contents cover, or a special limit on one category or tag such as jewelry or firearms) next to what those things are worth, how much short it is, and how many have no value recorded. Use it for "are we insured enough?"; for what everything is worth by room or property, use inventory_report. Limits are set in the app; amounts are in cents. Empty when no limits are set. |
| list_loansA | Things lent out (who has them, since when, when they're due back) and things borrowed from others, still out, overdue ones marked, each with its loanId. Use it for "who has the ladder?" or "what have I lent out?", and to get the loanId for loan_returned. Only open loans; returned ones are in each item's item_history. |
| list_categoriesA | The household's categories as a tree (ids, paths, item counts and any extra fields their items have — e.g. a TV's screen size), its tags with how many items carry each, and its item templates (kinds of thing with their own fields: a coin's year, mint mark and grade). Call it before create_item or update_item to pick a categoryId, existing tag names (to avoid near-duplicates) or a templateId — then put the template's or category's field values in customFields by their keys. |
| list_collectionsA | The household's collections (coins, dolls, cards…): for each, how many things are owned (pieces counts duplicates), how many are on its want list, what the owned ones are worth and cost (cents), and its templateId (the fields its things have: list_categories). Use it for "how's the coin collection?" and to get a collectionId; the things themselves are list_items with collectionId. |
| list_warrantiesA | Warranties on file across all items, soonest to end first. Returns each with its id, item, provider, start and end dates and status. Use it for "what's still under warranty?" or "what's about to run out?" (status expiring); for one item's warranties and claims use get_item, and for the urgent ones alongside everything else what_needs_attention. |
| inventory_reportA | What everything is worth, for insurance: totals by property and by room, the most valuable items, and how many have no value recorded. An item counts at its value, else its purchase price, times its quantity; amounts in cents; gone and wanted things are left out. Use it for "what's all our stuff worth?"; to compare against insurance limits use coverage_check. |
| list_maintenanceA | Maintenance tasks (replace filters, service the boiler, clean gutters…), soonest due first, each with its id, the item or place and who usually does it. Use it to see the schedule, to get a task's id for complete_maintenance, and before add_maintenance so you don't add one twice; for just what's urgent across everything, what_needs_attention. |
| lookup_barcodeA | Says what product a UPC/EAN barcode is, and whether the household already has it. Use it when the person reads out or scans a barcode, before create_item; to find a thing by name use search_inventory. Looks in Ferret's own barcode book (learned from items saved on this server) first, then the online product database if it's switched on. Returns match (name, brand, model, source, photos — null when nobody knows the code) and youHave (the household's items with this code: id, name, quantity, place). When youHave isn't empty, offer adjust_stock on one of those rather than a duplicate, unless the person wants a separate item. |
| list_providersA | The household's service providers (plumber, HVAC company, electrician…) with contact details, how many maintenance tasks they do, how often they've come, when they last did and what's been spent with them. Use it for "who did we use for the furnace?", to get a providerId for add_maintenance or complete_maintenance, and before add_provider so you don't add one twice. |
| recently_deletedA | Items deleted in the last 30 days, newest first, with who deleted them and the day each goes for good. Use it when the person wants something back or asks what was removed; restore_item brings one back by its id. Only items — deleted maintenance tasks, places and the rest aren't listed. |
| room_scan_resultsA | Checks on a room scan from scan_room (or one taken in the app): status pending (still looking — ask again in a little while), ready (what it found: name, category, how many — tell the person and ask which to keep), failed, or done (with the items it made). Without scanId, every scan still waiting to be finished. Once the person has chosen, add_from_room_scan adds them. |
| lend_itemA | Records that one of the household's items was lent to someone (direction "lent") or that something was borrowed from them ("borrowed"), optionally with a due-back date. Use it when the person says "I lent the drill to Sam"; get the item's id from search_inventory first. An item can have one open loan at a time; loan_returned closes it. Reminder emails to borrowers are set up in the app. Returns the loan with its id (for loan_returned) and due date. |
| loan_returnedA | Closes a loan: a lent thing is back, or a borrowed one was given back. Use it when the person says so ("Sam returned the ladder"); the loanId comes from list_loans. The loan stays in the item's history and the borrower's reminder emails stop; nothing else about the item changes. Calling it again for the same loan is refused (it's already back). |
| add_photoA | Attaches a photo — or a receipt, manual or warranty card as kind "document" — to an item that already exists. The vision model reads it in the background; about 20 seconds later get_item shows what it saw and any suggested fields: confirm them with the person before applying them with update_item. To add a new thing from its photo use add_item_from_photo instead. Counts as AI actions when the AI is on. |
| scan_roomA | Finds the things worth inventorying in 1–5 photos of a room or an open box: the vision model lists each with a name, a category and how many. Use it when the person wants to add a lot at once; for one thing use add_item_from_photo. Say where with locationId (a room) or containerItemId (a box). It looks in the background: about 20–60 seconds later room_scan_results has the list. Nothing is added until add_from_room_scan, after the person has said which to keep. One AI action per photo. |
| add_from_room_scanA | Adds the things the person chose from a ready room scan (room_scan_results), as items in the scan's room or box — names can be corrected and a categoryId given. Only after the person has confirmed the list; the scan is then done, and each new item records that it came from a room scan. Returns the items made. |
| add_item_from_photoA | Creates a new item from a photo: it's saved straight away (as "New item" unless you give a name) with the photo attached, and the vision model reads it in the background. About 20 seconds later get_item shows its suggested name, brand, model and serial — confirm with the person, then apply with update_item. Use it when the person sends a picture of something to add; for a photo of something already in the inventory use add_photo. Put it somewhere with locationId or containerItemId. |
| file_warranty_claimA | Records a claim made under one of an item's warranties: what went wrong, the provider's claim number (reference) and its status (filed by default, today by default). Use it when the person says they've contacted the maker or seller about a fault; get the warrantyId from get_item. Follow it up later with update_warranty_claim. Claims with no news for two weeks show in what_needs_attention. |
| update_warranty_claimA | Changes a warranty claim: its status (filed, in_progress, approved, denied, resolved), the resolution, what it cost (cents), the claim number. Use it when the person hears back about a claim; the claim's id is in get_item. Closing it (denied or resolved) dates it today unless resolvedOn is given. Fields left out stay as they are. |
| add_providerA | Adds a service provider — a plumber, the HVAC company, an electrician — with their trade and contact details, so maintenance can name who does it. Check list_providers first so you don't add one twice; then use its id as providerId on add_maintenance or complete_maintenance. Returns the new provider with its id. |
| create_itemA | Adds a new item. Search first (search_inventory) so you don't add a duplicate; if it's already there, update_item or adjust_stock instead. Put it somewhere with locationId (list_locations) or in a box with containerItemId, and give it a categoryId and tags (list_categories; new tag names are created). Prices in cents. For a collection, collectionId (list_collections) starts it from the collection's template; wanted: true puts it on the want list (looked for, not owned yet), and update_item with wanted: false once it's got. From a photo, use add_item_from_photo. Returns the new item with its id. |
| update_itemA | Changes some of an item's fields — name, brand, value, category, notes, the box it's in… — after the person has said what to change (or confirmed suggestions from get_item). Fields left out stay as they are; send null to clear one. |
| adjust_stockA | Counts consumables up or down — filters, batteries, bulbs: negative delta for used up ("we used the last AA pack" → -1), positive for bought more. Use it whenever the person uses up or buys something tracked; it never goes below 0, logs the change in the item's stock history, and moves the item on or off the shopping list. To set an exact count (after a recount), use update_item's quantity. Returns the new count. |
| record_readingA | Records what an item's counter says now — a car's odometer, a mower's or generator's engine hours, a furnace's run hours — in the item's usageUnit (set it with update_item first: miles, km, hours or cycles). Maintenance by use on that item ("every 5,000 miles") is rescheduled from it. Use it when the person mentions a reading; when they've just done the maintenance, give the reading to complete_maintenance instead. |
| move_itemA | Records that an item now lives somewhere else: a location from list_locations, or null for nowhere in particular. Use it for "I put the drill in the basement"; moving a box takes what's inside it along, and moving something that was in a box takes it out of the box. To put something into a box, use update_item with containerItemId. The move shows in item_history. |
| delete_itemA | Removes an item from the inventory — only when it was added by mistake or the person wants it gone from the records. For something sold, given away, thrown out, lost or stolen, prefer update_item with disposition, which keeps it for insurance and history. It stays in Recently deleted for 30 days (restore_item brings it back), then goes for good with its photos and documents. Confirm with the person first. |
| restore_itemA | Brings back an item from Recently deleted (ids from recently_deleted), with its photos, documents, warranties and maintenance. Use it when the person wants a deleted thing back within 30 days. If its place or box was removed meanwhile, it comes back without one — move_item can put it somewhere. Returns the restored item's id and name. |
| create_propertyA | Adds a property — a home, vacation home, rental, storage unit or vehicle — the top level of where things are kept. Only name is required (type defaults to home); the address is optional and only used for its map picture. Check list_locations first so you don't add one twice. Rooms, closets and shelves are locations inside it: add them next with create_location. Returns the new property with its id. |
| create_locationA | Adds a location — a room, closet or shelf — to a property, optionally inside another location (parentId), and optionally with locations inside it in one go: "a garage with three shelves" is name "Garage", children ["Shelf 1", "Shelf 2", "Shelf 3"]. Check list_locations first so you don't add one twice. propertyId can be left out when there's only one property; a new property itself is create_property. Returns the new locations with their ids. |
| add_maintenanceA | Adds upkeep to track: on an item (itemId), a place (locationId) or the whole household. Give intervalCount + intervalUnit for something that repeats ("every 3 months"), or neither for a one-off. dueOn defaults to one interval from today (today for a one-off). By use ("every 5,000 miles"): usageEvery, on an item that counts something — set the item's usageUnit (update_item) and log a reading (record_reading) first; it can have a time interval too (whichever comes first). Check list_maintenance first so you don't add it twice. Due tasks show in what_needs_attention and the household's reminders. |
| complete_maintenanceA | Records that a task was done (today, or doneOn), with an optional note and cost in cents — use it whenever the person says they did one ("changed the furnace filter"); the id comes from list_maintenance. Credited to the task's usual provider unless providerId says otherwise (null: the household did it), and its part, if it has one, comes out of stock. A repeating task is then due again one interval after that day; a one-off is finished. For maintenance by use, give reading (what the odometer or hour meter says now): the next is due usageEvery after it. Returns the task with its new due date. |
| delete_maintenanceA | Deletes a maintenance task the household no longer needs (the item is gone, or it was added by mistake), so it stops coming due and leaves reminders. This is not for a task that was just done — use complete_maintenance, which schedules the next one. The past times it was done stay in the item's history; the task itself can't be brought back with these tools. Confirm with the person first. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 40 tools
Most tools have distinct resource/action scopes, and descriptions explicitly cross-reference alternatives such as search_inventory vs ask_inventory vs list_items, and add_photo vs add_item_from_photo. The main residual ambiguity is among the several item-creation and reporting paths, but the detailed guidance keeps misselection limited.
All names use snake_case, and most follow recognizable verb_noun or noun_resource patterns. There is minor inconsistency in creation verbs (add_* vs create_*) and several read-only tools are noun phrases such as shopping_list, item_history, and coverage_check.
With 40 tools, the surface is well beyond the typical 3-15 well-scoped range and into heavy territory. The domain is broad, but many narrowly scoped tools could likely be consolidated without losing capability.
Core item lifecycle, maintenance, loans, warranty claims, stock, readings, photos/scans, and reporting are well covered. There are minor gaps around secondary resources: locations/properties/providers/collections have create/list but no update/delete, and there is no add_warranty tool.