HomeStock
Click on "Install 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.
HomeStock
A database for AIs to use for people's houses. Local-first household inventory: one SQLite file, one small MCP server, zero cloud. Your AI agent reads your shopping receipt emails and keeps a live estimate of what's in your home — what you have, what's running low, what to order — with no manual entry, ever.
The design bet: every pantry app dies because it treats inventory as facts that must be kept correct. HomeStock treats inventory as a probabilistic estimate derived from an append-only purchase log — "probably 2–4 portions of chicken, bought Tuesday" — and expects drift instead of denying it. Repurchase interval is consumption rate.
Quickstart
git clone https://github.com/Thomaspeel6/HomeStock && cd HomeStock
uv run pytest -q # 13 tests
uv run python -m homestock # stdio MCP server (DB at ./homestock.db, or $HOMESTOCK_DB).mcp.json registers the server for Claude Code in this directory. For other
MCP clients, point them at uv run python -m homestock.
Then, in your agent: follow prompts/onboarding.md —
consent, backfill your receipt history, get your pantry reveal. Scheduled
ingestion uses prompts/ingestion.md.
Related MCP server: Mailing Manager MCP
Tools
Tool | Purpose |
| Record a receipt. Idempotent per |
| No arg: known items. With arg: estimate + raw provenance ( |
| Items past their median repurchase interval (≥3 purchases, ≤3× median). |
| Corrections: void, then re-insert the fixed line. |
| Ingestion heartbeat + backfill cursor. |
| Raw event log — every estimate is explainable. |
Privacy
Plain English, because this matters:
What HomeStock can see: receipt emails from shops you approve — read-only, sender-filtered. Your agent never reads anything else for HomeStock.
Where your data lives: one file,
homestock.db, on your computer. Copy it to back it up. Delete it to erase everything. That's the whole model.What leaves your machine: nothing. The server makes no network calls — no telemetry, no accounts, no cloud. (Your AI client processes your conversations under its own privacy policy, exactly as it already does.)
When you need help: run diagnostics locally and share them only if you choose. Diagnostic output contains version numbers and ingestion statistics, never email content.
Retailer recipes (community)
The ingestion agent learns retailers from recipes/ — small YAML
files describing which email carries the real line items and how to read them.
Data, never code. No parsers. If your shop isn't covered, copy
recipes/TEMPLATE.md and open a PR — see
CONTRIBUTING.md. Launch recipes: Tesco (GB), Amazon (GB).
Project docs
Product spec:
PRD-HomeStock-v2.mdDeferred work:
TODOS.mdRoadmap: milestone A (this repo) → B (onboarding + eval harness) → B′ (one-click bundle, background digest — gated on a 30-day unattended validation run)
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.
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.
TDQS
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
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
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
Stateful email for AI agents — read inboxes, reply in-thread, draft with approval.
Household-aware cooking brain: pantry, meal suggestions, dietary safety, recipes, shopping lists.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceLocal-first AI agent for approval-gated automation and verifiable LLM workflows.1MIT
- AlicenseNot gradedqualityDmaintenanceEnables AI assistants to manage multiple email accounts with secure credentials, local full-text search, thread-aware replies, and automation.11MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to maintain persistent, local memory with retrieval-augmented search, knowledge graphs, and context surfacing, without any cloud dependencies.135MIT
- 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.1054MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Thomaspeel6/HomeStock'
If you have feedback or need assistance with the MCP directory API, please join our Discord server