Ask what a thrift find sells for. Real eBay sold comps, price range and net after fees.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
For a signed-in user: the finished result for a scan on their account, in the same shape as price_item, once the sold comps have landed in the background. Call it with the account.scanId a photo price returned when that result said comps were still loading (about 20 seconds later), or to re-read any saved scan.
The account.scanId from a signed-in price_item, or the saved-scan link.
What the user would pay, in the scan's currency (price.currency), for a worth-it verdict.
For a signed-in user: the finished result for a scan on their account, in the same shape as price_item, once the sold comps have landed in the background. Call it with the account.scanId a photo price returned when that result said comps were still loading (about 20 seconds later), or to re-read any saved scan.
| Argument | Type | Description |
|---|---|---|
| cost | number | What the user would pay, in the scan's currency (price.currency), for a worth-it verdict. |
| scan_id* | string | The account.scanId from a signed-in price_item, or the saved-scan link. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"scan_id"
],
"properties": {
"cost": {
"type": "number",
"maximum": 100000,
"minimum": 0,
"description": "What the user would pay, in the scan's currency (price.currency), for a worth-it verdict."
},
"scan_id": {
"type": "string",
"maxLength": 200,
"minLength": 8,
"description": "The account.scanId from a signed-in price_item, or the saved-scan link."
}
}
}The most recent real eBay sales (sold comps) for a search query (brand, model or pattern, a few specific words), with the count, median and quartiles. Use when the user wants to see what actually sold and for how much. It searches the signed-in user's own eBay marketplace (eBay UK in GBP for a UK seller), eBay US in USD when nobody is signed in, or the site given in marketplace; the result names the site (marketplace) and the currency (currency). One search runs: the query as typed (a retail price with "$" in it is left out), with model or part_number appended only when the query does not already name it; with no query, brand plus model, or brand plus part_number. Sales whose title shows a different item are left out of the count, median and quartiles: comps.matched is how many were kept, comps.dropped how many were left out, and comps.relevanceChecked is false when that check could not run (every sale is then kept). comps.countIsLowerBound true means eBay returned a full page, so the count is that many or more. include words must all appear in a sale's title (and are added to the search when missing); a title with any exclude word is left out; both match whole words in any case and are named in the answer. prefer words leave nothing out: sales whose title has every one are listed first (preferred true) and summarized in comps.preferred, while count and summary still cover every matching sale. Each listed sale has condition, saleType, bids, shipping and location, each null when not known (a sale stored before 22 October 2026 gives condition only as new or used). exclude_items leaves out sales by eBay item number (each listed sale's itemId), before every other filter; comps.removedByItems counts them. limit sets how many recent sales are listed (default 8, up to 50).
| Argument | Type | Description |
|---|---|---|
| brand | string | The brand or maker exactly as printed on the item, its tag or its label (for example "Simrad", "Pyrex", "Levi's"). Fill it from what you read on the item or the user's photo; leave it empty rather than guess. |
| limit | integer | How many recent sales to list in comps.recent, 1 to 50. Leave it empty for 8. The count and summary always cover every matching sale, not just the ones listed. |
| model | string | The model or product-line name as printed on the item or its box (for example "iPhone 12", "QuietComfort 35", "Odyssey G5", "501"). It is passed to the identification as a hint and added to the search when no word of it is already there; it never replaces the search. Put a manufacturer part number in part_number. Leave it empty rather than guess. |
| query | string | 3 to 6 specific words, brand and model first, like an eBay search. |
| prefer | array | Up to 5 soft words (each up to 40 characters), for example ["rattan"]. No sale is left out and the search is not changed: sales whose title contains every one as a whole word, any case, are listed first in comps.recent (marked preferred) and summarized apart in comps.preferred. Use prefer when sellers may word the same item differently; use include to keep only titles with the word. |
| exclude | array | Up to 5 words (each up to 40 characters); a sale whose title contains any of them as a whole word, any case, is left out, for example ["jade", "cabinet"]. |
| include | array | Up to 5 words (each up to 40 characters) every sale title must contain as a whole word, any case, for example ["oak", "carved"]. They are also added to the search when the query does not already hold them. |
For a signed-in user: turns a photo scan from price_item (account.scanId) into an inventory item with a draft eBay listing on their Underpriced AI account (title, list price defaulting to the market price, condition, description) and returns the link where they review and publish it in the app, plus whether eBay is connected and the connect link if not (connecting brings them back to the same item). If the item already has an unpublished eBay draft, it returns that draft unchanged and never overwrites it (draftKept); changes are made in the app. It never publishes anything and only prepares eBay; publishing happens in the app after the user checks the listing, and until then the draft shows on the Sell tab under Not live yet.
| Argument | Type | Description |
|---|---|---|
| price | number | List price in the scan's currency (price.currency from price_item). Leave empty for the scan's market list price. Not applied when the item already has an eBay draft. |
| title | string | Overrides the generated listing title (80 characters, eBay's limit). Not applied when the item already has an eBay draft. |
| scan_id* | string | The account.scanId that price_item returned for a photo scan on this account (the saved-scan link works too). |
| condition | string | Replaces the condition read from the photo when the seller has not changed it in the app. Not applied when the item already has an eBay draft. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"scan_id"
],
"properties": {
"price": {
"type": "number",
"maximum": 100000,
"description": "List price in the scan's currency (price.currency from price_item). Leave empty for the scan's market list price. Not applied when the item already has an eBay draft.",
"exclusiveMinimum": 0
},
"title": {
"type": "string",
"maxLength": 80,
"minLength": 3,
"description": "Overrides the generated listing title (80 characters, eBay's limit). Not applied when the item already has an eBay draft."
},
"scan_id": {
"type": "string",
"maxLength": 200,
"minLength": 8,
"description": "The account.scanId that price_item returned for a photo scan on this account (the saved-scan link works too)."
},
"condition": {
"enum": [
"New",
"Like New",
"Good",
"Fair",
"Poor"
],
"type": "string",
"description": "Replaces the condition read from the photo when the seller has not changed it in the app. Not applied when the item already has an eBay draft."
}
}
}What a secondhand item sells for on eBay: a calibrated estimate with a range, the recent real eBay sales behind it (sold comps, linked where the source gives a link), three list prices (fast, market, patient) with the 14-day sell chance, what the seller keeps after eBay fees, and a worth-it verdict when you pass what the user would pay. A description price searches the signed-in user's own eBay marketplace (eBay UK in GBP for a UK seller), eBay US in USD when nobody is signed in, or the site given in marketplace; price.currency names the currency. A photo price (photo, a file the user uploaded in the chat, or image_url, a public https link) needs the user signed in through the connector: it runs a real scan on their account, priced in their own eBay marketplace and currency (price.currency). Without sign-in, describe the item; a description works but reads less than a photo.
| Argument | Type | Description |
|---|---|---|
| cost | number | What the user paid or would pay for it, for a worth-it verdict, in the currency the price comes back in (price.currency): the seller's own currency when signed in, USD otherwise, or the currency of the marketplace you pass. |
| size | string | Size as printed on the tag or measured (for example "M", "10.5", "36 x 36 in", "2.5 quart"). Fill it from the item or label when you can read it. |
| brand | string | The brand or maker exactly as printed on the item, its tag or its label (for example "Simrad", "Pyrex", "Levi's"). Fill it from what you read on the item or the user's photo; leave it empty rather than guess. |
| model | string | The model or product-line name as printed on the item or its box (for example "iPhone 12", "QuietComfort 35", "Odyssey G5", "501"). It is passed to the identification as a hint and added to the search when no word of it is already there; it never replaces the search. Put a manufacturer part number in part_number. Leave it empty rather than guess. |
What the seller keeps after eBay fees and a verdict (worth it / thin / pass) for an expected sale price and what the user would pay. Pure arithmetic in the currency you give it, with eBay US fees: pass the sale price and the cost in the same currency (the one price_item named in price.currency). For a seller on eBay UK, the worthIt block price_item returns already uses their own fees. Use price_item first when the sale price is unknown.
| Argument | Type | Description |
|---|---|---|
| cost* | number | What the user would pay for the item, in the same currency as expected_sale_price. |
| expected_sale_price* | number | Expected eBay sale price, in the same currency as cost. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"expected_sale_price",
"cost"
],
"properties": {
"cost": {
"type": "number",
"maximum": 1000000,
"minimum": 0,
"description": "What the user would pay for the item, in the same currency as expected_sale_price."
},
"expected_sale_price": {
"type": "number",
"maximum": 1000000,
"description": "Expected eBay sale price, in the same currency as cost.",
"exclusiveMinimum": 0
}
}
}| marketplace |
| string |
| The eBay site to search: EBAY_US (eBay US, prices in USD) or EBAY_GB (eBay UK, prices in GBP). Leave it empty to use the signed-in user's own marketplace, or eBay US when nobody is signed in. Set it only when the user asks about a market other than their own. A photo scan always uses the account's own marketplace. |
| part_number | string | The manufacturer part number printed on the label or rating plate (for example "000-16294-001", "DCD771C2", "CUH-ZCT2U"), copied character for character. Not a size, voltage, year, SKU, ASIN, LPN or barcode. In price_item it is a hint to the identification only and is not added to the search (a part number required in every listing title leaves too few sales); in get_sold_comps it is appended to the query when the query lacks it. Leave it empty rather than guess. |
| exclude_items | array | Up to 20 eBay item numbers (9 to 15 digits) to leave out of the count, summary and list, for example the user's own earlier sale of the same item, which is not independent evidence. Each listed sale's itemId is its eBay item number. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"brand": {
"type": "string",
"maxLength": 80,
"minLength": 1,
"description": "The brand or maker exactly as printed on the item, its tag or its label (for example \"Simrad\", \"Pyrex\", \"Levi's\"). Fill it from what you read on the item or the user's photo; leave it empty rather than guess."
},
"limit": {
"type": "integer",
"maximum": 50,
"minimum": 1,
"description": "How many recent sales to list in comps.recent, 1 to 50. Leave it empty for 8. The count and summary always cover every matching sale, not just the ones listed."
},
"model": {
"type": "string",
"maxLength": 80,
"minLength": 1,
"description": "The model or product-line name as printed on the item or its box (for example \"iPhone 12\", \"QuietComfort 35\", \"Odyssey G5\", \"501\"). It is passed to the identification as a hint and added to the search when no word of it is already there; it never replaces the search. Put a manufacturer part number in part_number. Leave it empty rather than guess."
},
"query": {
"type": "string",
"maxLength": 120,
"minLength": 2,
"description": "3 to 6 specific words, brand and model first, like an eBay search."
},
"prefer": {
"type": "array",
"items": {
"type": "string",
"maxLength": 40,
"minLength": 1
},
"maxItems": 5,
"description": "Up to 5 soft words (each up to 40 characters), for example [\"rattan\"]. No sale is left out and the search is not changed: sales whose title contains every one as a whole word, any case, are listed first in comps.recent (marked preferred) and summarized apart in comps.preferred. Use prefer when sellers may word the same item differently; use include to keep only titles with the word."
},
"exclude": {
"type": "array",
"items": {
"type": "string",
"maxLength": 40,
"minLength": 1
},
"maxItems": 5,
"description": "Up to 5 words (each up to 40 characters); a sale whose title contains any of them as a whole word, any case, is left out, for example [\"jade\", \"cabinet\"]."
},
"include": {
"type": "array",
"items": {
"type": "string",
"maxLength": 40,
"minLength": 1
},
"maxItems": 5,
"description": "Up to 5 words (each up to 40 characters) every sale title must contain as a whole word, any case, for example [\"oak\", \"carved\"]. They are also added to the search when the query does not already hold them."
},
"marketplace": {
"enum": [
"EBAY_US",
"EBAY_GB"
],
"type": "string",
"description": "The eBay site to search: EBAY_US (eBay US, prices in USD) or EBAY_GB (eBay UK, prices in GBP). Leave it empty to use the signed-in user's own marketplace, or eBay US when nobody is signed in. Set it only when the user asks about a market other than their own. A photo scan always uses the account's own marketplace."
},
"part_number": {
"type": "string",
"maxLength": 40,
"minLength": 3,
"description": "The manufacturer part number printed on the label or rating plate (for example \"000-16294-001\", \"DCD771C2\", \"CUH-ZCT2U\"), copied character for character. Not a size, voltage, year, SKU, ASIN, LPN or barcode. In price_item it is a hint to the identification only and is not added to the search (a part number required in every listing title leaves too few sales); in get_sold_comps it is appended to the query when the query lacks it. Leave it empty rather than guess."
},
"exclude_items": {
"type": "array",
"items": {
"type": "string",
"pattern": "^\\d{9,15}$"
},
"maxItems": 40,
"description": "Up to 20 eBay item numbers (9 to 15 digits) to leave out of the count, summary and list, for example the user's own earlier sale of the same item, which is not independent evidence. Each listed sale's itemId is its eBay item number."
}
}
}| photo | any | A photo the user uploaded in this conversation (ChatGPT passes it as a file). Preferred over a description. |
| condition | string | Condition as the user states it or as you see it on the item. Open box counts as Like New. "For parts or not working" is for an item that does not work, is broken, or is sold for repair or parts; it is priced against parts sales. When the description says for parts or not working, that wins over this field. Leave empty when unknown. |
| image_url | string | Public https URL of a photo of the item. Preferred over description alone. |
| description | string | What the item is: brand, model or pattern, size, any marks, completeness. |
| marketplace | string | The eBay site to search: EBAY_US (eBay US, prices in USD) or EBAY_GB (eBay UK, prices in GBP). Leave it empty to use the signed-in user's own marketplace, or eBay US when nobody is signed in. Set it only when the user asks about a market other than their own. A photo scan always uses the account's own marketplace. |
| part_number | string | The manufacturer part number printed on the label or rating plate (for example "000-16294-001", "DCD771C2", "CUH-ZCT2U"), copied character for character. Not a size, voltage, year, SKU, ASIN, LPN or barcode. In price_item it is a hint to the identification only and is not added to the search (a part number required in every listing title leaves too few sales); in get_sold_comps it is appended to the query when the query lacks it. Leave it empty rather than guess. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"cost": {
"type": "number",
"maximum": 100000,
"minimum": 0,
"description": "What the user paid or would pay for it, for a worth-it verdict, in the currency the price comes back in (price.currency): the seller's own currency when signed in, USD otherwise, or the currency of the marketplace you pass."
},
"size": {
"type": "string",
"maxLength": 60,
"minLength": 1,
"description": "Size as printed on the tag or measured (for example \"M\", \"10.5\", \"36 x 36 in\", \"2.5 quart\"). Fill it from the item or label when you can read it."
},
"brand": {
"type": "string",
"maxLength": 80,
"minLength": 1,
"description": "The brand or maker exactly as printed on the item, its tag or its label (for example \"Simrad\", \"Pyrex\", \"Levi's\"). Fill it from what you read on the item or the user's photo; leave it empty rather than guess."
},
"model": {
"type": "string",
"maxLength": 80,
"minLength": 1,
"description": "The model or product-line name as printed on the item or its box (for example \"iPhone 12\", \"QuietComfort 35\", \"Odyssey G5\", \"501\"). It is passed to the identification as a hint and added to the search when no word of it is already there; it never replaces the search. Put a manufacturer part number in part_number. Leave it empty rather than guess."
},
"photo": {
"anyOf": [
{
"type": "object",
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string",
"maxLength": 200
},
"file_name": {
"anyOf": [
{
"type": "string",
"maxLength": 300
},
{
"type": "null"
}
]
},
"mime_type": {
"anyOf": [
{
"type": "string",
"maxLength": 100
},
{
"type": "null"
}
]
},
"download_url": {
"type": "string",
"format": "uri",
"maxLength": 4000
}
}
},
{
"type": "null"
}
],
"description": "A photo the user uploaded in this conversation (ChatGPT passes it as a file). Preferred over a description."
},
"condition": {
"enum": [
"New",
"Like New",
"Good",
"Fair",
"Poor",
"For parts or not working"
],
"type": "string",
"description": "Condition as the user states it or as you see it on the item. Open box counts as Like New. \"For parts or not working\" is for an item that does not work, is broken, or is sold for repair or parts; it is priced against parts sales. When the description says for parts or not working, that wins over this field. Leave empty when unknown."
},
"image_url": {
"type": "string",
"format": "uri",
"maxLength": 2000,
"description": "Public https URL of a photo of the item. Preferred over description alone."
},
"description": {
"type": "string",
"maxLength": 1200,
"minLength": 3,
"description": "What the item is: brand, model or pattern, size, any marks, completeness."
},
"marketplace": {
"enum": [
"EBAY_US",
"EBAY_GB"
],
"type": "string",
"description": "The eBay site to search: EBAY_US (eBay US, prices in USD) or EBAY_GB (eBay UK, prices in GBP). Leave it empty to use the signed-in user's own marketplace, or eBay US when nobody is signed in. Set it only when the user asks about a market other than their own. A photo scan always uses the account's own marketplace."
},
"part_number": {
"type": "string",
"maxLength": 40,
"minLength": 3,
"description": "The manufacturer part number printed on the label or rating plate (for example \"000-16294-001\", \"DCD771C2\", \"CUH-ZCT2U\"), copied character for character. Not a size, voltage, year, SKU, ASIN, LPN or barcode. In price_item it is a hint to the identification only and is not added to the search (a part number required in every listing title leaves too few sales); in get_sold_comps it is appended to the query when the query lacks it. Leave it empty rather than guess."
}
}
}