ReturnRadar MCP Server
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., "@ReturnRadar MCP Servershow me purchases with return deadlines coming up this week"
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.
ReturnRadar
Never miss a return, refund, or warranty deadline again.
A private, open-source home for your purchases. Upload a receipt, review the details, record the applicable terms, and see what needs your attention.
Use the hosted beta: Open ReturnRadar
Sign in with ChatGPT, add a purchase or PDF receipt, and verify the actual terms. Your account works across devices and does not need your computer to stay on. Read the user guide. The owner can see aggregate usage in the private dashboard.
Version 0.2 adds managed hosting, private accounts, cloud receipt storage, remote authenticated MCP tools and owner analytics. See hosted operations and hosted source. The hosting platform provisions a personal plugin; a public ChatGPT directory listing still requires separate approval. No paid resources or automatic billing were enabled.
The original local application remains available below. Its SQLite data stays on your computer and is separate from hosted accounts. Neither version uses a paid model/API. A date is confirmed only when its inputs are user verified; merchant eligibility and approval are separate.



Screenshots are captured from the running application by browser tests. Every record pictured is fictional and the demo banner is visible. A new database starts empty.
What you can do
Upload text-based PDF receipts (10 MB, 50 pages maximum), review extraction evidence and confidence, correct suggestions, and attach the original receipt.
Create, edit, delete, search, filter and paginate purchases. Record returned, refunded, kept, warranty claimed, or archived status.
Track return and warranty windows from the stated purchase date, delivery date, specific start date, or explicit cutoff. Unknown inputs stay unknown.
See confirmed dates in a timeline, and uncertain policies in an attention list.
Receive local in-app reminders at configurable offsets, with catch-up and duplicate prevention. The backend must be running to process them.
Prepare editable return, refund follow-up, warranty and replacement drafts. Copy or download them; the app never sends mail.
Export CSV/JSON, download a receipt-inclusive backup, and delete local data.
Use eight MCP tools through the official Python MCP SDK, with shared business logic and structured results. Switch between light and dark themes.
Related MCP server: week7-mcp-server
Local application quick start
Requirements: Python 3.11+, Node.js 22.12+ (or a current supported Node release), npm, and Git. Dependency downloads need internet access; everyday local use does not. Windows users can use PowerShell or WSL.
git clone https://github.com/TSS99/returnradar.git
cd returnradar
python3 -m venv .venv
source .venv/bin/activate
python -m pip install -r requirements-dev.lock
python -m pip install --no-deps -e .
cd frontend
npm ci
cd ..On Windows, use python instead of python3 and activate with
.venv\Scripts\Activate.ps1. The runtime-only lock is requirements.lock;
requirements-dev.lock additionally installs test and security tools.
Start the backend from the repository root:
source .venv/bin/activate
python -m uvicorn backend.app.main:app --host 127.0.0.1 --port 8000In a second terminal, start the frontend:
cd returnradar/frontend
npm run devOpen http://127.0.0.1:5173. The frontend proxies
/api to the loopback backend. Interactive API documentation is at
http://127.0.0.1:8000/docs.
Alembic automatically migrates the SQLite database on backend/MCP startup.
Data defaults to private_data/ in the repository root, independent of your
working directory. To choose another private folder, set
RETURNRADAR_DATA_DIR=/absolute/path for both the backend and MCP client.
The app does not automatically read .env files.
Try it with fictional data
On the empty overview, choose Explore fictional demo. This explicitly inserts five fictional purchases and synthetic policy cutoffs.
Browse the library, details and deadline calendar. No demo is loaded by default.
Delete the demo in Settings before using your own data.
Choose Add purchase → Upload receipt, select
sample_data/synthetic-receipt.pdf, and correct any suggestions. This PDF is permanently dated fictional test data; its return deadline may already be past when you try it.Check the receipt details and the applicable policy separately. Save, open the purchase, then choose Prepare a request. Review the draft yourself.
To test a reminder immediately without changing your clock, manually enter a fictional purchase with a verified explicit cutoff today. In Settings choose Check due reminders. Reminders run at 9 am in the purchase timezone; before that time, yesterday's offsets can still be due. See the automated reminder tests for deterministic examples.
MCP connection
MCP runs over local stdio, using the same SQLite data and application services as the web app. It does not need the HTTP backend running for CRUD. The reminder worker still needs the backend or a scheduled one-shot run.
source .venv/bin/activate
python -m scripts.mcp_smoke
python -m scripts.local_mcp_configThe first command launches the real server and tests a read-only call. The second prints a local client configuration with your installation's absolute Python executable and data directory. Add that configuration to a stdio-capable MCP client, then ask it to list purchases or confirmed deadlines within seven days.
The portable plugin is in plugin/; install the Python package
first so returnradar-mcp is available on the client's PATH. Build the ZIP with
python -m scripts.package_plugin. Desktop launchers often need the generated
absolute-path configuration rather than relying on shell activation.
ChatGPT web cannot directly launch this local stdio process. Public distribution needs a separately hosted, authenticated HTTPS MCP service and platform review. No public endpoint or registration is claimed. See MCP setup.
Testing and quality checks
From the repository root, with the virtual environment active:
python -m pytest -q
ruff check .
ruff format --check .
bandit -r backend/app mcp_server -q
pip-audit
python -m scripts.mcp_smoke
cd frontend
npm run build
npm run format:check
npm audit --audit-level=low
npx playwright install chromium
npm run test:e2eBrowser tests start their own backend and frontend on ports 8000 and 5173:
stop your regular servers first. Their database and uploaded test receipts
are isolated under ignored frontend/.cache/e2e-private_data/. Screenshots
are written to docs/screenshots/. Test data is always synthetic.
GitHub Actions runs backend tests, Ruff, Bandit, dependency audits, TypeScript, the frontend production build, and the real browser journey. The suite includes PDF content/type/size validation, missing and ambiguous dates, purchase CRUD, deadline bases, leap years, timezone/DST boundaries, reminder catch-up, idempotency, structured MCP input validation and a real stdio connection, export, cascade deletion, and local browser-origin protection.
Architecture
flowchart TD
Web[React dashboard] --> API[FastAPI routes]
Client[MCP client] --> MCP[Official Python MCP server]
API --> Services[Purchase / deadline / request services]
MCP --> Services
API --> PDF[Isolated local PDF extraction]
Worker[Local reminder worker] --> Services
Services --> DB[(SQLite + Alembic)]
PDF --> Files[Private document storage]Python: FastAPI, Pydantic, SQLAlchemy, Alembic, pypdf, python-dateutil, MCP SDK, pytest and Ruff. Web: React, TypeScript, Vite, Tailwind CSS and Lucide. Monetary amounts are exact decimal strings in storage and API responses.
backend/app/ API, core, database, models, schemas, services, PDF worker
backend/migrations/ Versioned Alembic migrations
backend/tests/ Synthetic unit and integration tests
frontend/src/ Components, pages, hooks, API client, types and theme
frontend/tests/ Browser user journeys
mcp_server/ Eight tools reusing backend services
plugin/ Portable manifest, Codex fallback, MCP config and skill
scripts/ MCP smoke/config, reminder worker, plugin packaging
sample_data/ Clearly fictional receipt PDF and text
docs/ Architecture, API, setup, MCP, deployment, roadmap, screenshots
.github/ CI and issue formsPrivacy, accuracy and limitations
Invoices stay local by default. There is no telemetry, paid API, model inference, merchant scraping, or automatic email. An MCP client receives the records its tools request; its own privacy terms apply to that information.
Documents are parsed as untrusted data in a bounded subprocess. Generated filenames, content validation, restricted origins, loopback defaults, protected document downloads, and CSV formula escaping reduce local risks. These controls are not multi-user authentication. Keep the app off public interfaces.
Known v0.1 limits:
Extraction recognizes explicit English labels; complex invoice tables often need manual entry. Image-only/scanned PDFs, PNG and JPEG OCR are unsupported.
Ambiguous numeric dates remain unknown. Receipt fields are suggestions until reviewed; no merchant policy is inferred from its name.
Only one return and one warranty policy per purchase. Use separate records for items with different policies. Calendar months clamp to the last valid day.
A known warranty end without a verified start is labelled "end date confirmed", rather than assumed to be active coverage.
Date-only cutoffs have no merchant-specific hour, holiday extension, inclusive-counting convention, or automatic eligibility assessment. Choose an explicit cutoff when exact merchant counting differs from start + duration.
Local in-app reminders only; the computer/backend must be on. Catch-up reminders can report a deadline that has already passed. No desktop, push or email delivery.
No account system, hosted endpoint, merchant return submission, refund confirmation, bank connection, or public plugin registration.
Purchase and attachment data are not encrypted at rest. Use OS disk encryption. Downloaded backups need private storage. Automated backup restore is not included.
Abandoned extraction previews are stored until discarded or all data is deleted. Deletion cannot guarantee forensic erasure or erase previously exported copies.
Read PRIVACY.md, SECURITY.md, and deployment limitations before exposing anything remotely.
Troubleshooting
Symptom | What to check |
Dashboard connection error | Backend on port 8000; frontend on 5173; use 127.0.0.1. |
Port already in use | Stop the process on that port; browser tests require both ports free. |
PDF rejected | Genuine unencrypted text PDF under 10 MB / 50 pages; try manual entry for scans. |
Deadline stays unknown | Supply the applicable policy and required starting date. |
Deadline says needs verification | Review both policy terms and extracted starting date. |
No reminder | Enable reminders, check timezone, confirmed inputs, purchase status and 9 am schedule. |
MCP shows an empty library | Use the same absolute |
Client cannot find server | Use |
SQLite locked | Avoid migrations/backup restore while other processes write; close them before maintenance. |
Contribute
Small, well-tested accuracy and usability improvements are welcome. Start with CONTRIBUTING.md and AGENTS.md. Report bugs or suggestions through the repository's issue forms; never attach private receipts. Follow the Code of Conduct.
The roadmap covers optional OCR/email, merchant integrations, secure multi-user sync and eventual hosted MCP/public distribution. These are future work, not current features.
MIT licensed. Development expenditure for this release: INR 0.
Available Tools
8 toolsadd_purchaseC
Save a reviewed purchase. Do not invent terms. Extracted fields need confirmation.
| Name | Required | Description | Default |
|---|---|---|---|
| purchase | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate this is a non-read-only, non-destructive write. The description adds data-quality expectations ('Do not invent terms', 'Extracted fields need confirmation'), which is useful behavioral context beyond the annotations. But it doesn't clarify what happens if fields are unconfirmed or what 'reviewed' entails.
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 very short and front-loads the purpose before the cautions. It contains no filler, though the fragmentary style leaves some ambiguity that a slightly fuller sentence could resolve.
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?
For a complex write tool with a nested purchase object and zero schema description coverage, the description is far too sparse. It omits required-field guidance, how confirmation should be represented, and how it differs from update_purchase. Output schema and annotations cover some ground, but not enough to compensate.
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% and the description provides no parameter-level semantics. It mentions 'terms' and 'fields' only generically, so an agent receives no help understanding the nested purchase object or its many fields.
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 says 'Save a reviewed purchase', which states a verb and resource. However, 'save' is ambiguous between create and update, and the sibling update_purchase exists, so it does not clearly distinguish the operation. The qualifier 'reviewed' is also unexplained.
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 implies usage by saying 'Do not invent terms' and 'Extracted fields need confirmation', which suggests the tool should only be called with confirmed data. It does not name alternatives like update_purchase or explain when-not-to-use, leaving the guidance implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
generate_return_requestBRead-only
Draft a return, refund, warranty or replacement request from confirmed fields. Never sends it.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | return | |
| reason | No | ||
| purchase_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=false and destructiveHint=false, so safety is partly covered. The description adds genuinely useful context against a name that sounds like a write operation: "Never sends it" tells the agent this only produces a draft and no request is transmitted. It still doesn't say whether the draft is persisted or only returned, so it falls short of 5.
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?
Two short sentences with zero filler; the action is front-loaded and the critical non-sending constraint is stated up front rather than buried.
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?
An output schema exists, so return values need not be described, and the annotations plus the "never sends" note cover the safety profile. Still missing for a drafting tool: whether the draft is saved, what "confirmed fields" means, and any per-parameter meaning, leaving the definition minimally adequate rather than 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 description coverage is 0%, so the description must carry the burden for three parameters. It names the four kinds, which loosely maps to the `kind` enum, but says nothing about `reason` or `purchase_id` beyond the ambiguous phrase "confirmed fields" — that gap is what the purchase_id refers to is never made explicit.
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?
Specific verb ("Draft") plus a concrete resource set (return, refund, warranty, replacement request), which no sibling tool covers. However it does not explicitly differentiate itself from siblings like get_warranty_status or update_purchase_status, and "from confirmed fields" is left undefined.
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 no when-to-use guidance, no prerequisites (e.g. a purchase_id must already exist, likely from get_purchase_details), and names no alternatives. The only usage-adjacent statement is "from confirmed fields," which implies but never states that input data must already be validated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_my_purchasesCRead-only
Search actual local purchases with filters and pagination.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| search | No | ||
| status | No | ||
| date_to | No | ||
| category | No | ||
| merchant | No | ||
| date_from | No | ||
| page_size | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds only that results are paginated, which is modest but useful context beyond the annotations.
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?
A single short sentence that is front-loaded with the verb and resource. Nothing is wasted, though 'actual local' is slightly puzzling phrasing.
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?
An output schema exists so return values need not be described, but for an 8-parameter filtered search with zero schema documentation, the description omits which filters exist and how paging behaves. That is a significant gap for an agent trying to invoke it 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?
Schema description coverage is 0% across 8 parameters, so the description must carry the load, yet it only says 'filters and pagination' generically. It never mentions the status enum values, date_from/date_to, category, merchant, or search, leaving the agent to guess what can actually be filtered.
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 a clear verb (Search) and resource (local purchases), and 'with filters and pagination' signals it is a list/browse operation, which implicitly distinguishes it from get_purchase_details. However, it does not name any sibling or explain the odd 'actual local' qualifier.
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 guidance on when to use this versus get_purchase_details, get_warranty_status, or get_upcoming_deadlines. The agent must infer that this is the general listing tool from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_purchase_detailsBRead-only
Get purchase, document metadata, policy evidence, and confirmed/tentative/unknown deadlines.
| Name | Required | Description | Default |
|---|---|---|---|
| purchase_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=false and destructiveHint=false, so the safety profile is covered. The description adds that deadlines are classified as confirmed/tentative/unknown, a useful data-confidence trait, but says nothing about permissions or behavior on a missing/invalid ID.
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 front-loaded sentence with no filler; the enumerated outputs are dense but each item earns its place. Slightly list-heavy for a single sentence, but efficient.
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?
With an output schema present, return values need not be explained, and annotations carry the safety profile. The description covers purpose and content well; the only real gap is the undocumented purchase_id semantics.
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 single purchase_id parameter has 0% schema description coverage, and the description does not explain its format, source, or expected values. Beyond implying that the ID selects the purchase to fetch, it adds nothing to the 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?
States a specific verb (Get) plus resource (purchase) and enumerates the returned facets (document metadata, policy evidence, deadlines). It reads clearly against the list-style sibling get_my_purchases, though it never names a sibling to differentiate explicitly.
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 when-to-use guidance and no mention of alternatives such as get_my_purchases or get_warranty_status. The intended usage (fetch details for one known purchase) is only implied by the required purchase_id.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_upcoming_deadlinesBRead-only
Get actionable confirmed deadlines within N days, in each purchase's timezone.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds genuinely useful behavior beyond that: results are filtered to 'confirmed' and 'actionable' deadlines and evaluated per purchase's timezone. It stops short of explaining how 'actionable' is determined or any rate/limit context.
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 tight sentence with no filler, and the core action is front-loaded. The trailing timezone clause is slightly compressed and could read ambiguously, but nothing is wasted.
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?
An output schema exists, so return values need not be described, and annotations cover safety. Still, for a tool whose central term is 'actionable confirmed', the description leaves that qualifier undefined and gives no routing guidance against the seven sibling tools.
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% — the single 'days' parameter has only default/min/max and no prose. The description partially compensates by tying the window to 'within N days', but it never clarifies whether the window is calendar days from now, how the upper bound (3650) behaves, or what happens at days=0.
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 names a specific verb+resource ('Get ... deadlines') and adds scoping qualifiers ('actionable confirmed', 'within N days', 'in each purchase's timezone') that separate it from warranty or return-request siblings. It is clear what is retrieved, though it never explicitly contrasts itself with the other deadline-adjacent tools.
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?
Usage is only implied by the phrase 'actionable confirmed deadlines'; there is no explicit statement of when to call this versus get_warranty_status or generate_return_request, and no prerequisites or exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_warranty_statusBRead-only
Get warranty provider, terms, evidence and status. Unknown starting dates or terms remain unknown.
| Name | Required | Description | Default |
|---|---|---|---|
| purchase_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds one genuinely useful behavioral note — that unknown starting dates or terms remain unknown rather than being inferred — which is more than the annotations provide, but it still says nothing about auth, rate limits, or how missing data is surfaced.
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?
Two tight sentences with no filler, and the primary purpose is front-loaded before the caveat about unknown data.
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?
An output schema exists, so return values needn't be documented, and read-only annotations cover the safety profile. For a single-param read tool the description is nearly sufficient, with only the purchase_id semantics left unaddressed.
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 single purchase_id parameter is undocumented in both schema and description. The description compensates only indirectly: it implies a purchase-scoped lookup but never explains the identifier's format or source, leaving a gap given the zero coverage.
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?
States a specific verb (Get) and resource (warranty provider, terms, evidence, status), which is clear and distinguishable from generic siblings like get_purchase_details by naming warranty-specific fields. It does not, however, explicitly contrast itself with the nearby get_purchase_details or get_my_purchases tools, so it stops short of full sibling differentiation.
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?
There is no when-to-use guidance, no prerequisites, and no mention of alternative tools such as get_purchase_details. The agent must infer from the name alone that this retrieves warranty data for a specific purchase.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_purchaseA
Replace fields and policies with reviewed values. Retrieve details first to preserve fields.
| Name | Required | Description | Default |
|---|---|---|---|
| purchase | Yes | ||
| purchase_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already state readOnlyHint=false and destructiveHint=false, so the agent knows this is a non-destructive write. The description adds a crucial behavioral warning: it replaces fields, so data can be lost if not preserved, which is valuable context beyond the annotations. No auth or rate-limit details are provided, but the core risk is communicated.
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?
Two concise imperative sentences, front-loaded with the action and immediately followed by the prerequisite. No wasted words.
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?
For a tool with a complex nested input schema and 0% parameter coverage, the description is insufficient. It omits any explanation of the purchase object structure, the purchase_id, or the meaning of the nested policies and field statuses. While it covers the high-level replacement behavior, it leaves too much unsaid for an agent to invoke correctly without inspecting the schema in detail.
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?
With schema description coverage at 0%, the description must compensate, but it doesn't describe the 2 parameters (purchase_id and the nested purchase object). The baseline for 0 params is 4, but here we have 2 parameters (one nested) with no semantic explanation beyond the schema's own title. The schema's structure (additionalProperties=false, required product_name) is complex, and the description doesn't add meaning. However, the 'preserve fields' hint implies full replacement semantics for the purchase object.
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 verb 'Replace' and resource (fields/policies) make the update operation clear. However, it doesn't differentiate from update_purchase_status, which likely updates only the purchase status, leaving the boundary between the two update operations somewhat ambiguous.
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 second sentence 'Retrieve details first to preserve fields' gives a clear prerequisite and implies that fields not included will be lost. It doesn't explicitly mention when to prefer update_purchase_status over this tool, but the overall context is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_purchase_statusC
Record a user-reported status. This does not confirm any merchant approval.
| Name | Required | Description | Default |
|---|---|---|---|
| status | Yes | ||
| purchase_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a non-readonly, non-destructive, closed-world mutation, so safety is covered. The description does add meaningful nuance that the recorded status is user-asserted rather than merchant-verified, but it omits side effects, idempotency, and whether recording e.g. 'returned' or 'refunded' triggers downstream activity.
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?
Two short, front-loaded sentences with no filler; the caveat follows the action statement. It is efficient, though the brevity edges toward under-specification rather than true conciseness.
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?
An output schema exists so return values need not be described, and annotations cover the safety profile. Still, for a mutation exposed alongside update_purchase and warranty/return siblings, the description omits state-transition rules and cross-tool relationships an agent needs to call it 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?
Schema description coverage is 0%, so the description must compensate for parameter meaning, and it says nothing about either purchase_id or status. The enum values in the schema are somewhat self-documenting, but no transitions or valid-status semantics are explained anywhere.
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 verb+resource pair is inferable from the name and the description's 'Record a user-reported status', and the 'user-reported' qualifier hints at trust level. However, the description never states it modifies a purchase record nor distinguishes itself from the sibling 'update_purchase', leaving an agent to infer scope from the tool name alone.
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?
There is no when-to-use guidance, no prerequisites, and no mention of the closely related siblings (update_purchase, generate_return_request, get_warranty_status). The caveat 'This does not confirm any merchant approval' is a scoping remark, not routing guidance.
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.
8 tool updates
v0.1.0- First observed
add_purchase - First observed
generate_return_request - First observed
get_my_purchases - First observed
get_purchase_details - First observed
get_upcoming_deadlines - First observed
get_warranty_status - First observed
update_purchase - First observed
update_purchase_status
TDQS
Scored across 8 tools
Most tools have clearly distinct purposes: create, list/search, detail, update fields, update status, generate draft, and warranty status. Two mild overlaps exist: update_purchase vs update_purchase_status both modify a purchase, and get_purchase_details vs get_upcoming_deadlines both surface deadlines, but descriptions clarify the boundaries.
All tools use snake_case with a consistent verb_noun pattern (add_, get_, update_, generate_). The only slight variation is 'get_my_purchases' using a possessive, but it still follows the same convention.
Eight tools fit the focused purchase-return tracking domain well. Each tool earns its place by covering a distinct operation without redundancy.
Core lifecycle is present: create, list/search, detail, update fields/status, deadline retrieval, return drafting, and warranty status. Minor gaps include no delete operation and no direct way to update or manage warranty terms, but agents can likely work around them.
Maintenance
Related MCP Connectors
Local-first task manager: create, edit, and complete tasks, projects, and checklists via MCP.
MCP tools: timestamps, UUID v4, gas prices, domain WHOIS, text extraction, and persistent memory.
Read-only XRP Ledger MCP tools with proof-annotation envelopes and signed daily snapshots.
Hosted MCP for website health monitoring. Tools: check_site, list_sites, get_site.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceA database-first personal knowledge management system powered by a local MCP server, providing 29 tools to manage and search structured knowledge (meetings, emails, people, accounts, projects, todos, etc.) via a single SQLite file.-
- FlicenseNot gradedqualityCmaintenanceEnables MCP-compatible clients to retrieve invoice and purchase order data live over stdio through tools for listing invoices, getting invoice details, and fetching purchase orders.-
- AlicenseAqualityCmaintenanceEnables local-first expense logging, editing, and analysis through natural language conversation, backed by a SQLite database and accessible via MCP over stdio.8MIT
- FlicenseAqualityCmaintenanceEnables local, deterministic management and search of point-of-sale support data—branches, terminals, incidents, and incident history—with read-only queries and mutating tools over stdio using simulated SQLite data.11-