{"id":"36ce7225-54de-4e3c-b802-fd695950b08b","slug":"saleroom","kind":"mcp","name":"saleroom","summary":"Luxury auction results by API key: table queries, market stats, price trends and price checks.","owner":"CloudCorpRecords","repoUrl":"https://github.com/CloudCorpRecords/saleroom","license":"MIT","licenseTier":"permissive","trust":"community","stars":0,"match":null,"fewStars":true,"format":"mcp","createdAt":"2026-11-03T16:44:23.000Z","addedAt":"2026-11-05T20:06:06.614Z","logoUrl":"https://avatars.githubusercontent.com/u/95189389?u=8e277e1a24ff84ae7b49c89e6897fa44178a5c34&v=4","linkOnly":false,"collection":null,"skillPath":null,"categories":["data-analytics"],"tags":[],"runtime":"node","local":true,"cloudCapable":false,"cloudCapability":"unknown","cloudReadyOnPlatform":false,"needsApiKey":false,"reviewed":false,"syncedAt":"2026-11-05T22:05:03.835Z","sample":false,"url":"https://conduits.dev/tools/saleroom","language":"TypeScript","transports":["stdio"],"install":{"npm":"@reneturcios/saleroom"},"requirements":{"env":[],"upstreamMayCharge":false},"tools":null,"readme":"# saleroom\n\nWhat did that watch actually sell for — and what is one worth\ntoday? saleroom is a read-only client for the altfinance\nauction-results service, which tracks realized prices across\ntwenty luxury categories: watches, handbags, jewelry, gems,\ncars and motorcycles, aircraft, wine and whisky, art, design,\nfashion, coins and more. You can list the tables, inspect a\ntable's columns, run filtered and sorted queries over the\nsales history, read summary statistics and price trends, ask\nfor a fair-value range on a single item, search the whole\nmarket at once, consult a precomputed brand/model price\nindex, and view price alerts.\n\nNothing here trades, bids or changes anything: all nine\ntools only read. Responses come back exactly as the service\nreturned them — nothing is trimmed, renamed or summarised on\nthe way through.\n\n## Configuration\n\nTwo environment variables control the client:\n\n- `ALTFINANCE_API_KEY` (required) — sent on every request\n  as `Authorization: Bearer <key>`. When it is not set,\n  every tool fails with `ALTFINANCE_API_KEY is not set`\n  before any request is made.\n- `ALTFINANCE_API_URL` (optional) — API base URL. Defaults\n  to `https://api.altfndata.com`.\n\n## Tools\n\n- `list_tables` — the available auction tables, with live\n  descriptions and column counts. No arguments.\n- `get_table_schema` — column names and types for one\n  table. Takes `table` (required).\n- `query_table` — query a table with `filters`, `sort`,\n  `fields` selection and pagination (`limit` 1–500,\n  `offset` ≥ 0). Takes `table` (required) plus the optional\n  arguments.\n- `market_stats` — a realized-price summary for a table or\n  a filtered segment: count, median, percentiles, average,\n  min/max, sale-date span and top vendors. Takes `table`\n  (required) and optional `filters`.\n- `price_trend` — how realized prices moved over time,\n  bucketed by `year`, `quarter` or `month`. Takes `table`\n  (required), optional `bucket` and optional `filters`.\n- `price_check` — a fair-value range for a single item from\n  comparable sales, with source links. Takes `item`\n  (required) and optional `category`. Live categories are\n  handbags, watches and cars.\n- `search` — whole-market keyword search across every\n  category at once, merged by realized price. Takes\n  `query` (required) and optional `category`.\n- `market_index` — a precomputed model-level price index\n  for a brand or model (handbags, watches, cars). Takes\n  `query` (required) and optional `category`.\n- `list_alerts` — a read-only view of price alerts, or\n  guidance on enabling them. No arguments.\n\nThe twenty tables are: `watches`, `handbags`, `jewelry`,\n`gems`, `automobile`, `motorcycle`, `aircraft`,\n`wine_whisky`, `works_of_art`, `fine_art`, `design`,\n`fashion`, `shoes`, `automobilia`, `books`, `coins`,\n`other_automobile`, `perfume`, `accessories` and\n`musical_instruments`.\n\nA filter is `{column, operator, value}`. The operators are\n`eq`, `neq`, `gt`, `gte`, `lt`, `lte`, `like`, `in`,\n`not_in`, `is_null` and `is_not_null`. Omit `value` for\n`is_null` / `is_not_null`; pass an array for `in` /\n`not_in`. A sort is `{field, direction}` with direction\n`asc` or `desc`.\n\nValidation happens before any request. An unknown operator\nfails with `unknown filter operator: <op>`; a missing value\nwhere one is required fails with `filter value is required\nfor operator <op>`; a `limit` outside 1–500 fails with\n`limit must be an integer between 1 and 500`. An upstream\nnon-2xx reply fails with `altfinance error: HTTP <status>`\nand an unreachable API with `altfinance unreachable`.\n\n### Endpoint provenance\n\nThe original service's project record pins the nine tools,\nthe twenty table names, the filter operators, the sorting,\nfield-selection and pagination rules, the trend buckets and\nthe two environment variables — and that all nine endpoints\nare read-only. It does not pin the per-tool argument names\nbeyond its prose, the filter/sort JSON shapes, the auth\nheader or the request paths. Those pieces are\nreconstructions, labelled as such:\n\n- `Authorization: Bearer <key>` header — reconstruction\n  (the record pins API-key authentication only).\n- `GET <base>/v1/tables` — `list_tables`.\n- `GET <base>/v1/tables/{table}/schema` —\n  `get_table_schema`.\n- `POST <base>/v1/tables/{table}/query` with body\n  `{filters?, sort?, fields?, limit?, offset?}` (unset\n  fields omitted) — `query_table`.\n- `POST <base>/v1/tables/{table}/stats` with body\n  `{filters?}` — `market_stats`.\n- `GET <base>/v1/tables/{table}/trend` with `bucket` and a\n  JSON-encoded `filters` query parameter when set —\n  `price_trend`.\n- `POST <base>/v1/price-check` with body\n  `{item, category?}` — `price_check`.\n- `GET <base>/v1/search?q=&category=` — `search`.\n- `GET <base>/v1/market-index?query=&category=` —\n  `market_index`.\n- `GET <base>/v1/alerts` — `list_alerts`.\n\n## CLI\n\nEach tool is a subcommand taking one JSON argument string:\n\n```bash\nnpx @reneturcios/saleroom list_tables '{}'\nnpx @reneturcios/saleroom query_table '{\"table\":\"watches\",\"filters\":[{\"column\":\"brand\",\"operator\":\"eq\",\"value\":\"Rolex\"}],\"limit\":10}'\nnpx @reneturcios/saleroom price_check '{\"item\":\"Rolex Submariner 1968\",\"category\":\"watches\"}'\nnpx @reneturcios/saleroom --version\n```\n\nOutput is the tool's result text (the upstream JSON on\nsuccess). Exit codes: `0` on success, `1` on a runtime\nerror (including a validation or upstream failure), `2` on\na usage error.\n\n## MCP server\n\n```bash\nnpx -y @reneturcios/saleroom mcp\n```\n\nMCP client config:\n\n```json\n{\n  \"mcpServers\": {\n    \"saleroom\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"@reneturcios/saleroom\", \"mcp\"],\n      \"env\": {\n        \"ALTFINANCE_API_KEY\": \"<your key>\"\n      }\n    }\n  }\n}\n```\n\n## Docker\n\n```bash\ndocker run -i ghcr.io/cloudcorprecords/saleroom\ndocker run --rm ghcr.io/cloudcorprecords/saleroom list_tables '{}'\n```\n\n## Development\n\n```bash\nnpm install\nnpm run build   # tsc -> dist/\nnpm test        # tsx --test test/*.test.ts (fake fetch only, no network)\nnpm run dev     # run the CLI from source\n```\n\n## License\n\nMIT — Copyright (c) 2026 Rene Turcios\n"}