MCP Server#
The Model Context Protocol (MCP) lets AI tools like Codex, ChatGPT, Claude, and Cursor query Old Cars Data directly. Ask questions in plain English and get completed sales, live auctions, bid history, pricing stats, and market trends back — no code required.
Endpoint#
https://api.oldcarsdata.com/mcpUse OAuth when your client supports it. Add the endpoint, sign in to Old Cars Data in your browser, and approve access. There is no API key to copy, paste, or store. API keys are only a fallback for clients without remote MCP OAuth support.
What Connecting Looks Like#
- Your client discovers the Old Cars Data OAuth configuration from the MCP endpoint.
- A browser opens the branded Old Cars Data sign-in page. Continue with Google or your email and password.
- Review the client name and requested access, then select Allow.
- The browser returns you to the client. The client securely stores refreshable credentials for future sessions.
- Ask the client to list Old Cars Data tools or try: “Find recent Porsche 911 auction sales.”
You may be asked to sign in again if you revoke the connection, sign out, or the client discards its saved credentials.
Codex#
Codex CLI#
Add the remote server, then start the browser sign-in:
codex mcp add oldcarsdata --url https://api.oldcarsdata.com/mcpcodex mcp login oldcarsdataRun codex mcp get oldcarsdata to inspect the saved connection. In the Codex terminal UI, use /mcp to see its status and available tools.
Codex App and IDE Extension#
- Open Settings > MCP servers.
- Select Add server, then choose Streamable HTTP.
- Enter
https://api.oldcarsdata.com/mcpand save. - Restart Codex if prompted, then select Authenticate.
- Sign in to Old Cars Data in the browser and select Allow.
Codex apps, the IDE extension, and the CLI use the same local MCP configuration. ChatGPT web does not read that local configuration.
Claude#
Claude Code#
Add the server for your user account, then authenticate in the browser:
claude mcp add --transport http --scope user oldcarsdata https://api.oldcarsdata.com/mcpclaude mcp login oldcarsdataRun claude mcp get oldcarsdata or use /mcp inside Claude Code to check the connection. Use --scope project instead of --scope user when you want to share the server definition with a project; each teammate still signs in with their own Old Cars Data account.
Claude Web and Desktop#
For an individual account:
- Open Customize > Connectors.
- Select +, then Add custom connector.
- Enter
https://api.oldcarsdata.com/mcpand select Add. - Select Connect, sign in to Old Cars Data, and approve access.
Free accounts can add one custom connector. Pro and Max accounts can add more. On Team and Enterprise plans, an owner first adds the URL under Organization settings > Connectors > Add > Custom > Web. Members can then open Customize > Connectors, find Old Cars Data, and select Connect.
ChatGPT Web#
ChatGPT web uses workspace apps rather than the MCP configuration stored by Codex. In a workspace that allows custom MCP apps, add https://api.oldcarsdata.com/mcp as a remote app, then follow the browser sign-in and consent flow. Workspace plan and admin controls determine who can create, publish, and use the app.
Cursor, Windsurf, and Other Clients#
Add Old Cars Data as a remote or Streamable HTTP server in the client’s MCP settings. Start with only the URL—do not add an authorization header when the client offers Connect, Authenticate, or OAuth sign-in.
{ "mcpServers": { "oldcarsdata": { "url": "https://api.oldcarsdata.com/mcp" } }}Exact configuration keys vary by client. After saving, select the client’s connect or authenticate action and complete the Old Cars Data browser sign-in.
Team Sharing#
Share only the server URL in project configuration. Each teammate completes OAuth with their own account, so there are no shared secrets to commit:
{ "mcpServers": { "oldcarsdata": { "type": "http", "url": "https://api.oldcarsdata.com/mcp" } }}API Key Fallback#
If a client supports Streamable HTTP but cannot complete remote MCP OAuth, generate an API key from your profile and pass it as a bearer token:
Authorization: Bearer YOUR_API_KEYKeep API keys out of version control. Prefer an environment-variable reference supported by your client, and use OAuth whenever the client adds support.
Available Tools#
Use list_makes → list_models → search_auctions when you want make and model filters to match normalized names in our database (same as GET /makes and GET /models on the REST API). Guessing names from a listing title often returns no results.
| Tool# | Description |
|---|---|
list_makes# | List all vehicle makes in the database (unmetered when the only tool call in the MCP request) |
list_models# | List all models for a given make (unmetered when the only tool call in the request; batched with metered tools, the request counts) |
search_auctions# | Search auction results; optional make / model filters should come from the list tools above |
search_live_auctions# | Search active supported auction listings with ending windows, source filters, current prices, bid counts, featured image URLs, and polling filters |
get_auction_bids# | Retrieve paginated bid history for supported live or completed Bring a Trailer, Cars & Bids, Hemmings, Hagerty, PCAR Market, All Collector Cars, and Sotheby's Motorsport auctions where bid data is available |
get_price_stats# | Get pricing statistics and 12-month market trends; make is required and model is optional |
Deprecated aliases remain available for compatibility: list_live_auctions maps to search_live_auctions, and list_auction_bids maps to get_auction_bids. New integrations should use the canonical names above.
Tool Reference#
list_makes#
List all vehicle makes available in the database. No parameters required. Does not count toward your plan query limit when this is the only tool invocation in that HTTP request. Use these strings for search_auctions and get_price_stats.
list_models#
List all models for a given vehicle make. Pass a make value exactly as returned by list_makes.
search_auctions#
Search auction results for vehicles. Counts toward your plan query limit. Returns listings with prices, status, specs, and details. Use cursor pagination when an agent needs to traverse multiple result pages without exact-count or deep-offset work.
| Parameter# | Type | Required | Description |
|---|---|---|---|
make# | string | No | Exact make from list_makes |
model# | string | No | Exact model from list_models |
vin# | string | No | Exact VIN match |
seller_username# | string | No | Exact seller username |
year_min# | integer | No | Minimum model year |
year_max# | integer | No | Maximum model year |
price_min# | integer | No | Minimum sale price in USD |
price_max# | integer | No | Maximum sale price in USD |
status# | enum | No | Auction outcome: "sold", "result unavailable", "reserve not met", "canceled" |
source# | string | No | Auction source/platform |
keyword# | string | No | Search in title and description |
sort# | enum | No | Sort field: "date" (default, ordered by auction_end_at), "price", "year", "bids" |
direction# | enum | No | Sort direction: "asc", "desc" (default) |
pagination# | enum | No | Deprecated page (default) or recommended cursor; cursor mode supports sort=date |
cursor# | string | No | Opaque next_cursor returned by the previous cursor result; repeat the same filters |
page# | integer | No | Deprecated. Page number in page mode (default: 1); cursor mode accepts only 1 |
limit# | integer | No | Results per page, max 50 (default: 20) |
Cursor results return pagination, limit, has_more, and next_cursor in meta instead of total, page, and total_pages. A traversal expires 24 hours after its first cursor is issued. Cursor traversal reads the live completed-auction dataset rather than a materialized snapshot, so changed records can repeat or be omitted. Consumers should de-duplicate by auction id and must not treat a live traversal as a complete point-in-time export.
Auction results include auction_end_at and auction_end_precision. exact precision means the ending time is known; date means only the date is known and the 00:00:00 time is a normalization placeholder. Null means no ending value is known. The legacy auction_end_date field is deprecated.
get_price_stats#
Get pricing statistics and market trends for a vehicle make or make/model. Includes average, median, low/high prices, sell-through rate, and 12-month price trends.
| Parameter# | Type | Required | Description |
|---|---|---|---|
make# | string | Yes | Exact make from list_makes |
model# | string | No | Exact model from list_models |
year_min# | integer | No | Minimum model year |
year_max# | integer | No | Maximum model year |
Paid Plan Required:
get_price_statsis not available on the Starter plan. Upgrade to access pricing statistics.
Plan Limits#
The same plan limits that apply to the REST API apply to MCP tools:
| Plan# | Auction Results | Stats Access |
|---|---|---|
| Starter# | Limited to 20 results | Not available |
| 1k# | Full access | Full access |
| 10k# | Full access | Full access |
Metered usage is shared across REST and MCP. list_makes and list_models do not count toward your query limit when they are the only tool calls in that MCP HTTP request (if a single request batches a metered tool such as search_auctions, that request counts). See API overview — Rate Limits.
Example Queries#
Once connected, ask questions in natural language. Here are some examples:
"What Porsche 911s have sold recently?"
Calls search_auctions with make: "Porsche", model: "911", status: "sold" and returns recent sold listings with prices.
"What's the average price of a Toyota Land Cruiser?"
Calls get_price_stats with make: "Toyota", model: "Land Cruiser" and returns average, median, and price range.
"Show me BMW M3s under $50,000 from the last few years"
Calls search_auctions with make: "BMW", model: "M3", price_max: 50000, year_min: 2020 and returns matching listings.
"What car brands do you have data for?"
Calls list_makes and returns the full list of available makes.