HomeStock
HomeStock is an MCP server for tracking home inventory from purchases via an append-only event log, with tools to record, query, correct, and audit stock data.
Record purchases from email or manual sources idempotently with
add_items.Query current stock estimates and list known item names with
get_stock.Get a shopping list of items past their typical repurchase interval with
what_should_i_order.Void or correct receipt lines with
void_event, then re-insert corrected lines.Log ingestion runs and skipped receipts with
record_ingest_run.Read the raw, paged event log for full explainability with
get_events.
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., "@HomeStockwhat should I order?"
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.
Why this one works when pantry apps don't
Every fridge-tracking app dies the same way: it treats your kitchen as facts you have to keep correct, and keeping them correct is endless work.
HomeStock never asks you to inventory anything. It treats your kitchen as a probable estimate derived from what you actually bought — "you buy milk every 5 days, you bought some 6 days ago, you're probably out" — and shows its reasoning on every line, so you can tell at a glance whether to trust it. When it's wrong, one click fixes it, and the correction outranks the guess.
The insight the whole thing rests on: you never tell anyone how much milk you drink, but how often you rebuy it says exactly that.
Related MCP server: Gamito
Install
The Mac app

The same view in a browser. The Mac app puts this in a real window with a sidebar, a chat that can read your kitchen, and drag-and-drop for receipts.
Download the latest HomeStock.dmg from the Releases page, open it and drag HomeStock into Applications. It carries its own Python, so there is nothing else to install.
First launch, once. HomeStock is a free indie app and isn't notarised by Apple, so Gatekeeper blocks the first open. Right-click HomeStock → Open → Open again. A plain double-click won't offer the Open button. Still blocked? System Settings → Privacy & Security → Open Anyway. You only do this once.
The MCP server, from source
For agents, or if you'd rather run the engine yourself.
You need: a Mac or Linux machine, Python 3.11 or newer, and a terminal. Windows isn't supported yet (why).
The easy way is with uv, a fast Python installer. If you don't have it:
curl -LsSf https://astral.sh/uv/install.sh | shThen:
git clone https://github.com/Thomaspeel6/HomeStock && cd HomeStock
uv run pytest -q # 81 tests — confirms it works on your machine
uv run homestock-ui # opens your kitchen at http://127.0.0.1:7777git clone https://github.com/Thomaspeel6/HomeStock && cd HomeStock
python3 -m venv .venv && source .venv/bin/activate
pip install -e .
homestock-ui # the pantry window
homestock # the MCP server (stdio)Your database is ./homestock.db, or wherever you point $HOMESTOCK_DB.
Photographed receipts go in a captures/ folder beside it. Both are yours —
copy them to back up, delete them to erase everything.
See it working before you commit to anything
uv run python scripts/demo.py --serveThat invents a household with six months of shopping and opens the window on it, so you can see what a full kitchen looks like. It touches no email, and throws the demo database away afterwards.
Connect it to your AI
HomeStock is also an MCP server, so an AI client can read and write the same file: "what can I make for dinner with what I've got?" "here's a receipt." "we're out of milk." This is where the ceiling is much higher than any UI.
Claude Code — nothing to do. .mcp.json in this repo registers it when you
run Claude Code from this directory.
Claude Desktop — add this to claude_desktop_config.json
(on macOS: ~/Library/Application Support/Claude/), then restart it:
{
"mcpServers": {
"homestock": {
"command": "uv",
"args": ["run", "--directory", "/absolute/path/to/HomeStock", "homestock"]
}
}
}Anything else that speaks MCP — point it at uv run homestock (or just
homestock if you installed with pip), talking stdio.
Connect it and the server hands over everything needed to run ingestion: the
onboarding and ingestion prompts, and the retailer recipes as resources.
No filesystem access required.
First run
Ask your agent to follow the onboarding prompt. It will:
Tell you exactly what it's about to look at, and wait for a clear yes. Declining is fine — the manual paths all still work.
Read up to six months of receipt emails from retailers you approve, read-only.
Show you your kitchen, plus a few true things about your own shopping you probably didn't know.
If you'd rather not connect email at all, skip to Getting things in — photographing receipts and typing work on their own.
Getting things in
Receipt emails only ever see online and delivery orders. Buy milk in a corner shop and a system watching only your inbox will confidently tell you to buy more — so there are four doors, not one:
How | |
Receipt emails | Read-only, sender-filtered, from shops you approve. |
Photograph a paper receipt | Point your phone at it. Covers shopping in an actual shop. |
Scan a barcode | Phone camera, or type the number. |
Just type it | "2 milk, bread, 6 eggs" — always available, works offline. |
Everything lands in an inbox rather than going straight into your kitchen. Capturing has to work instantly, one-handed, in a shop; reading needs a model. Keeping them apart is what lets a phone contribute to a database it can't reason about — and means an unreadable photo gets honestly skipped instead of guessed at.
Capturing from your phone
uv run homestock-ui --lanYour laptop prints a six-digit code and an address. On your phone, on the same wifi, open the address and enter the code. Photos go straight to your laptop and never touch the internet.
LAN mode is off by default and stays off unless you ask for it — binding to the network on a café wifi would hand a stranger your shopping history. While it's on, nothing is readable until a device has paired, codes expire after ten minutes, and five wrong guesses burn the code. It is plain HTTP, so don't use it on shared or workplace networks; see SECURITY.md for the full threat model, stated plainly.
Cooking
"can I make carbonara?" -> check_recipe([...]) what you have, what's missing
"made it, used the butter" -> consume_items([...]) deducts, and puts butter on the listCooking is the biggest real depletion event in a kitchen, and until now nothing modelled it — stock only ever drained by inference. Your agent turns a recipe (pasted, a link, a photo of a cookbook page) into an ingredient list; HomeStock does the set maths against what you actually have, because that's the part that has to be exactly right.
Privacy
What HomeStock can see: receipt emails from shops you approve — read-only, sender-filtered. Nothing else, ever.
Where your data lives:
homestock.dbandcaptures/on your computer.What leaves your machine: nothing. No telemetry, no accounts, no cloud, no webfonts, no CDN assets. The server and the window make no outbound requests at all.
When something's wrong:
get_health()reports counts and dates only — never item names, never email content — so it's safe to paste into an issue.
This isn't a policy promise. There is no server to send anything to. The one place your data does travel is your AI client: when an agent reads your stock to answer a question, that conversation goes wherever that client sends it, under its own privacy policy. HomeStock can't change that and doesn't pretend to.
What's not built yet
Being straight with you, because the gap between the idea and the code is where open-source projects usually mislead people:
No double-click app. A macOS
.appis specified in PRD-HomeStock-v3.md but not built. Today this needs a terminal.Email ingestion is agent-driven, not built-in. There's no OAuth flow yet; an agent reads your mail by following the
ingestionprompt. Built-in fetching is the next big piece.Not on PyPI yet, so installation means cloning.
The Amazon recipe is unverified. Amazon appears to have stripped itemised details from most confirmation emails around 2023. If that holds, Amazon coverage is close to zero and this is a Tesco-only tool for now. If you have Amazon GB receipts, telling us what's in them is genuinely the most useful thing you could do.
Windows, multi-home sync, and a recipe suggester are all deliberately out of scope for now. See TODOS.md for what's deferred and why.
Status: alpha, macOS-first, built for the author's own household first. If it isn't useful to one person for a month, nothing else matters.
Tools, prompts and resources
For agents, and for anyone reading the code. Nineteen tools over an append-only
event log — every estimate is recomputable from get_events().
Four input paths mean four names for the same milk: a barcode says
Tesco British Semi Skimmed Milk 2.27L, a receipt line says TESCO SEMI SKMD MILK, you say milk. Aliases are where the model's answer to that gets
remembered, so the same string never has to be resolved twice — and so those
don't become three items with three wrong repurchase cycles.
Tool | Purpose |
| Record a purchase from any door: |
| No arg: known items. With arg: estimate, confidence, and raw provenance. |
| The shopping list: items past their usual cycle, plus anything you said you were out of. |
| Perishables at or near their use-by. |
| Ground truth. |
| Record waste — and the signal that a shelf-life estimate was too generous. |
| How long something keeps, so it can be flagged before it rots. |
| Can I cook this? Sorts ingredients into have / low / missing. |
| Record cooking. |
| Put a photo, barcode or note in the inbox to be read later. |
| Work the inbox. Never guess at a blurry receipt — skip it with a reason. |
| Teach it that "TESCO SEMI SKMD MILK" is the milk it already knows. |
| Fix name drift without losing history — and learns the alias, so it can't recur. |
| Fix a receipt: void, then re-insert the corrected line. |
| Raw event log, paged — every estimate is explainable. |
| Ingestion heartbeat + backfill cursor. |
| Diagnostics. Is ingestion actually running? |
Prompts: onboarding (consent, backfill, the reveal) and ingestion (the
scheduled procedure, and the rules that stop it guessing).
Resources: homestock://recipes lists the retailers it can read;
homestock://recipes/{retailer} returns one.
Contributing
The most useful contribution is a retailer recipe — coverage for a shop we can't read yet. A recipe is a small YAML file describing which email carries the real line items. Data, never code. No parsers.
Start at CONTRIBUTING.md, or just open an issue with a redacted sample and someone else can write the recipe.
This corpus — a map of which email from which retailer tells the truth — is the part that compounds, and no one else is building it.
Project docs
What it is and where it's going | |
The engine's design rationale | |
Deferred work, with the reasoning | |
What changed, and when | |
Threat model and how to report a problem | |
Dev setup and house rules |
Source-available under the Functional Source License (FSL-1.1-MIT).
Read it, run it, change it, self-host it, contribute to it — all fine. The one thing you may not do is ship a commercial product that competes with it. Two years after each release, that release becomes plain MIT automatically, so nothing here is locked away forever.
Available Tools
6 toolsadd_itemsA
Record a purchase (one receipt). Idempotent per (source_ref, line_no).
Each item: {name, quantity, unit, price?, category?, line_no}. source: 'email' (purchased_at required — the receipt has a date) or 'manual' (purchased_at defaults to today). source_ref: retailer ORDER ID where extractable, else email Message-ID; manual fallback 'manual:::' (+':2' suffix on collision — a nonzero 'ignored' count on a fresh receipt signals one). Call get_stock() first and reuse existing item names exactly. Returns {inserted, ignored, rejected: [{line_no, reason}]}.
| Name | Required | Description | Default |
|---|---|---|---|
| items | Yes | ||
| source | Yes | ||
| location | No | ||
| source_ref | Yes | ||
| purchased_at | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full responsibility for behavioral disclosure. It discloses idempotency per (source_ref, line_no), source-specific defaults, collision handling with '+':2' suffix, and the exact return shape {inserted, ignored, rejected: [{line_no, reason}]}.
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 dense and front-loaded with the primary purpose. It uses compact structured examples and line breaks to convey a lot of information efficiently. It is somewhat long, but every sentence contributes meaningful constraints or behavior.
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?
Given no annotations and no output schema, the description is exceptionally complete: it covers input parameters, defaults, idempotency, return values, edge cases, and even instructs to consult get_stock() first. Only the 'location' parameter is omitted, but the overall tool behavior is well specified.
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 largely does. It explains items structure, source values, source_ref patterns, and purchased_at defaults. However, the 'location' parameter is not mentioned at all, leaving one of five parameters unexplained.
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 opens with 'Record a purchase (one receipt)', which is a specific verb and resource. It clearly distinguishes the tool from siblings by covering source types, idempotency, and interaction with get_stock().
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 description provides explicit guidance on when to use the tool ('Record a purchase'), and even instructs to 'Call get_stock() first and reuse existing item names exactly.' It does not explicitly state when not to use it, but the context around source/ref handling makes usage clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_eventsA
Read-only raw event access (explainability: every estimate is recomputable from these rows). Includes voided rows, flagged.
| Name | Required | Description | Default |
|---|---|---|---|
| item | No | ||
| since | 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 provided, the description explicitly states 'Read-only' (key safety trait) and adds a behavioral quirk: 'Includes voided rows, flagged.' This goes beyond the name and gives useful transparency, though it does not detail result format or edge cases.
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 sentence with a parenthetical, front-loaded with the key phrase 'Read-only raw event access'. No wasted words; every clause adds information about purpose or behavior.
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 description gives purpose and some behavior but omits any explanation of the item and since parameters, which are critical for effective invocation. An output schema exists for return values, so this is the main gap. The tool is simple enough that with parameter docs it would be complete.
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 input schema has 2 parameters (item, since) with 0% description coverage. The description does not mention either parameter, leaving their meaning and usage entirely unspecified. The agent cannot correctly filter events without additional guessing.
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 'Read-only raw event access', which clearly identifies the tool as providing raw event data for explainability. It also distinguishes from siblings like void_event (write) and get_stock (stock data) by its read-only and event-specific nature.
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 description gives clear context: use this tool for raw events when explainability (recomputing estimates) is needed. It implies read-only use cases but does not explicitly name alternatives or exclusions, so it does not reach a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_stockA
Current stock estimate. No argument: list all known items as {name, category} — call this before add_items to reuse exact names. With an item name: naive-baseline estimate with raw provenance (estimated_state is 'unknown' below 2 distinct purchase dates).
| Name | Required | Description | Default |
|---|---|---|---|
| item | 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 provided, the description carries full burden. It discloses that the estimate is a 'naive-baseline' with 'raw provenance' and that estimated_state is 'unknown' below 2 distinct purchase dates. This adds meaningful behavioral context beyond a simple 'get stock' description, though it doesn't explicitly state read-only safety or other caveats.
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?
Three sentences, front-loaded with the core purpose, and each sentence adds distinct value: purpose, no-arg behavior, and item-specific behavior. No redundancy or 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?
The tool is simple (one optional parameter, output schema present). The description covers both invocation modes, provides usage context (before add_items), and includes a behavioral nuance about provenance. There is no obvious missing information for an agent to select and invoke this tool 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?
The schema has zero description coverage and only lists a nullable item parameter. The description fully compensates by explaining the two modes: omitting item returns all items, providing item returns a baseline estimate. It also hints at the required name format ('reuse exact names'), adding value beyond the bare 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 clearly states what the tool does: provides a current stock estimate, with explicit behavior for both no-argument (list all items) and with-item (get estimate) modes. It distinguishes itself from siblings like add_items by including a cross-reference to call it before adding items.
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?
Explicit guidance is given: call before add_items to reuse exact names, and the two invocation modes (no arg vs. item name) are clearly described. This tells the agent exactly when and how to use the tool, including a relationship to a sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
record_ingest_runA
Ingestion agent plumbing: record a run (heartbeat + audit) after every ingestion pass, even one that wrote nothing. skipped: [{source_ref, reason}] for receipts/lines the agent could not parse (never guess — skip and log). Returns the backfill cursor: earliest_window_start already covered.
| Name | Required | Description | Default |
|---|---|---|---|
| skipped | No | ||
| window_end | Yes | ||
| emails_seen | Yes | ||
| window_start | Yes | ||
| events_written | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description discloses key behavioral traits: it's a heartbeat/audit, must be called even if nothing written, returns the backfill cursor, and skipped is for unparseable items. This is thorough and goes beyond a simple operation description.
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 concise and front-loaded, with the core purpose stated first, followed by the key guidance on skipped and the return value. Every sentence earns its place and there is no 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?
The description covers purpose, usage, skipping rules, and return value, which is sufficient for an ingestion audit tool. It could mention idempotence or failure behavior, but given the tool's simplicity and no output schema, it is reasonably complete.
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 compensate. It does explain the 'skipped' parameter's structure and purpose, but provides no additional meaning for window_start, window_end, emails_seen, or events_written. The names are self-explanatory, but not fully elaborated.
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 clearly states the tool records an ingestion run (heartbeat and audit) after every pass, with a specific verb and resource. It distinguishes itself from siblings like get_stock or void_event by focusing on ingestion plumbing.
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 description gives explicit timing ('after every ingestion pass, even one that wrote nothing') and guidance for the skipped parameter ('never guess — skip and log'). It doesn't explicitly name alternatives, but the sibling set makes its unique role clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
void_eventA
Correction path: void matching event lines (all lines of the receipt if line_no omitted). Voided rows are excluded from every estimate; re-inserting a corrected line for the same (source_ref, line_no) then works. Returns {voided: n}; zero matches is a no-op, not an error.
| Name | Required | Description | Default |
|---|---|---|---|
| line_no | No | ||
| source_ref | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full responsibility and covers key behavioral traits: voided rows are excluded from estimates, re-insertion works for the same (source_ref, line_no), return shape is {voided: n}, and zero matches is a no-op not an error. This is excellent transparency 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 three sentences long, front-loaded with the action 'void', and every sentence adds value: scope, behavioral consequence, return format, and edge case. There is no redundance or 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?
Given only 2 parameters, no annotations, and no output schema, the description fully compensates by covering the purpose, parameter behavior, return value, and an important edge case. It is self-sufficient for an agent to decide when to use this tool and what to expect.
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 parameters, and it does. It states that line_no omitted means all lines are voided, and that source_ref and line_no together form the key for re-insertion. This adds substantial meaning beyond the raw 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 uses the specific verb 'void' with resource 'matching event lines', and clarifies scope (all lines if line_no omitted). It clearly distinguishes this from sibling tools like add_items or get_events by framing it as a 'Correction path'.
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 description provides clear context by labeling this a correction path, implying it is for fixing previously recorded events. However, it does not explicitly mention when not to use this tool or name an alternative, so it stops short of full exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
what_should_i_orderA
Items past their typical repurchase interval: >= 3 distinct purchase dates, days_since >= median interval, excluding items past 3x median (presumed discontinued). Sorted by overshoot ratio, highest 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?
With no annotations, the description carries the full burden, and it delivers: it discloses the exact filtering conditions (>=3 distinct purchase dates, days_since >= median), the exclusion rule (past 3x median, presumed discontinued), and the sort order (overshoot ratio descending). This goes beyond a simple 'returns items that need reordering' and provides actionable logic.
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 dense sentence contains all essential information: criteria, exclusions, and ordering. No filler or redundancy. Every clause earns its place, making it an excellent example of concise, information-dense writing.
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 has no parameters, the description explains the core behavior comprehensively, and an output schema exists to define the return value. The description is complete for an agent to decide when and how to invoke this 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?
The tool has zero parameters, so the input schema is fully covered (100%) and there is nothing for the description to add. The description does not attempt to explain parameters, which is appropriate. Baseline of 4 is warranted for a no-parameter tool.
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 clearly identifies the resource (items past repurchase interval) and provides precise criteria, but it lacks an explicit verb like 'list' or 'recommend'. The tool name implies the purpose, and the description's specificity distinguishes it from siblings like get_stock or get_events.
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?
No explicit guidance is given on when to use this tool versus alternatives. It describes the algorithm but not the business context or prerequisites (e.g., needing purchase history). A sentence about using this for replenishment decisions would have helped.
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.
6 tool updates
v0.1.0- First observed
add_items - First observed
get_events - First observed
get_stock - First observed
record_ingest_run - First observed
void_event - First observed
what_should_i_order
TDQS
Scored across 6 tools
Each tool has a distinct purpose: querying stock estimates, voiding events, logging ingestion runs, accessing raw events, recording purchases, and generating reorder suggestions. There is no overlap or ambiguity between them.
Most tools follow a clear verb_noun convention (get_stock, void_event, record_ingest_run, get_events, add_items), but what_should_i_order breaks the pattern as a sentence-style question, creating a minor inconsistency.
With 6 tools, the set is well-scoped for a home stock management server—enough to cover core operations without being bloated or too thin.
The tool set provides full lifecycle coverage for event-based stock estimation: adding purchases, voiding corrections, reading raw events, querying estimates, and receiving reorder recommendations. No obvious gaps or dead ends exist for the stated domain.
Maintenance
Related MCP Connectors
Scraps Kitchen gives any AI agent a persistent, household-aware kitchen memory. Unlike generic chatbot recall, Scraps maintains structured cooking data: what's in your fridge (with freshness tracking), who you cook for (with allergens, dietary restrictions, and preferences), your recipe collection (with cook notes and per-diner ratings), your shopping list, and your kitchen equipment. 27 tools across 6 domains let agents read kitchen context, suggest meals that respect dietary safety, update the pantry after cooking, and build a history of what works for your household. Every interaction makes the data richer. Cooking history, preference signals, kitchen awareness = better suggestions next time. All tools work via oAuth and a free scraps.kitchen account.
AI-powered kitchen management — pantry, recipes, meal plans, shopping lists
Email inboxes and calendars for AI agents: send, receive, search, draft and schedule.
Email inboxes and calendars for AI agents: send, receive, search, draft and schedule.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceHousehold-aware kitchen brain for AI agents: manage pantry inventory with freshness tracking, shopping lists, recipe collections with cook notes and per-diner ratings, dietary profiles with allergen safety, and kitchen equipment — all through 27 tools with OAuth 2.1 authentication. Includes a free tool for ingredient-based recipe generation without an account (accounts are free!).MIT
- FlicenseBqualityDmaintenanceEnables AI agents to generate budget-disciplined, allergy-safe weekly meal plans, shopping lists, and meal swaps using a fully local deterministic engine.20-
- AlicenseNot gradedqualityDmaintenanceEnables AI-powered household management including inventory tracking, restock predictions, meal planning from available ingredients, and baby supply monitoring through natural language commands.Apache 2.0
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to query and recall your entire Gmail inbox locally, providing fast summarization and semantic search without relying on Gmail's search API.59 npm4MIT