ImportOS · Docs

MCP: Claude Desktop, ChatGPT, Cursor

The ImportOS Data remote MCP server: tools, connecting Claude Desktop, Cursor, Claude Code and ChatGPT, a curl check.

ImportOS Data has a remote Model Context Protocol server for AI agents. It calculates the turnkey cost of cars from US auctions cleared in Ukraine, Poland, Lithuania, Germany and Georgia, estimates market price, decodes VINs, searches listings and returns customs rules.

  • Address: https://api.importos.app/mcp (streamable HTTP, stateless: one JSON-RPC message per POST). Waiting on the owner A placeholder domain until the owner confirms it.
  • Authentication: Authorization: Bearer rv_live_..., the same API key as for REST. OAuth is not implemented yet (see below).
  • Tool results match the REST responses.

Tools

ToolExtra scopes (besides mcp)What it does
calculate_landed_costread:pricingTurnkey cost of a car: auction fees, US inland, ocean freight, port, duty, VAT, excise, certification, registration, services. Every item has an explanation, a formula and a source
estimate_market_priceread:pricingp25 / median / p75 of listing prices on the UA or PL market over 90 days
decode_vinread:listingsVIN decoding (NHTSA vPIC + WMI) plus every known lot and listing with this VIN, including sold ones
search_listingsread:listingsNormalized search across dozens of sources: natural language (q) or structured filters
get_customs_rulesread:pricingCustoms duty, VAT, excise and registration parameters in force, with sources, effective date and a verified flag

Tools the key has no permission for are not listed. All five are read-only (readOnlyHint: true).

Planned but unavailable: create_lead (for seller agents) and get_deal_status (for client assistants). They need the deal service and the write:deals scope In development.

Each tool description is written for the model: when to call, an example input and the limits. The main limits the tools repeat to the model:

  • Parameters with verified: false are indicative only; the response has warnings (for example rule_unverified, tariffs_typical) and a confidence below 1. Pass them on to the user.
  • Market price is built from listing prices, not transactions. sample_size: 0 means "no data" (null, not zero).
  • Search results are prices at the time of retrieval. Failing or blocked sources end up in errors and the call does not fail.

calculate_landed_cost input fields

Note: the field names here differ from REST (POST /v1/landed-cost).

FieldDescription
lot_price_usdbid on the lot in USD, before auction fees
auctioncopart, iaai, manheim, other (default copart)
vehicle.year, vehicle.fuelrequired; fuel: petrol, diesel, hybrid, phev, ev, lpg, cng, hydrogen, other
vehicle.engine_ccengine displacement in cm³; required for everything except ev
vehicle.kwhbattery in kWh; required for ev
vehicle.vin, vehicle.make, vehicle.model, vehicle.damage, vehicle.mileage_kmoptional; the VIN is needed to detect US origin (0 % EU duty), damage adds a repair estimate
us_state, auction_yard, zipwhere the car is (state, yard name such as NJ - TRENTON, or ZIP)
destination_countryUA, PL, LT, GE, DE
destination_citydelivery city (for UA)
our_fee_usdyour fee in USD (fixed)
insurancenone, basic, full
target_currencyresult currency (ISO-4217), default USD
dateyyyy-mm-dd for FX rates and rule version, default today
localeuk, pl, en: the language of item explanations

Connecting

First create an API key in Desk with mcp, read:pricing, read:listings (quick start).

Claude Desktop

Claude Desktop connects remote servers with a static key through mcp-remote. Open Settings → Developer → Edit Config (Windows: %APPDATA%\Claude\claude_desktop_config.json):

{
  "mcpServers": {
    "importos": {
      "command": "npx",
      "args": [
        "-y",
        "mcp-remote",
        "https://api.importos.app/mcp",
        "--header",
        "Authorization:${IMPORTOS_AUTH}"
      ],
      "env": { "IMPORTOS_AUTH": "Bearer rv_live_YOUR_KEY" }
    }
  }
}

The Authorization:${...} form with no space after the colon and the value in env avoids a known Windows quoting bug. Fully quit and restart Claude Desktop, then ask, for example: "What will a 2018 Toyota Camry 2.5 from Copart NJ cost in Ukraine, a bid of $8000?"

Claude Desktop calls calculate_landed_cost
Claude Desktop calls calculate_landed_cost · Placeholder screenshot: to be replaced with a real capture

Cursor

The file ~/.cursor/mcp.json (or .cursor/mcp.json in a project):

{
  "mcpServers": {
    "importos": {
      "url": "https://api.importos.app/mcp",
      "headers": { "Authorization": "Bearer rv_live_YOUR_KEY" }
    }
  }
}

Claude Code

claude mcp add --transport http importos https://api.importos.app/mcp --header "Authorization: Bearer rv_live_YOUR_KEY"

ChatGPT

OAuth is not implemented yet

ChatGPT custom connectors (developer mode, remote servers only) are built around OAuth: the token comes from an OAuth flow and the connector dialog has no field for arbitrary headers. Whether a static-key or bearer option is offered depends on the plan and the current ChatGPT release.

  • If your dialog has a bearer/API-key field, enter https://api.importos.app/mcp and your rv_live_... key.
  • If not, ChatGPT cannot connect until we add OAuth 2.1 with dynamic client registration Waiting on the owner. It is planned, not done, and we will not claim otherwise.

Any other client

Use the Streamable HTTP transport, the URL and the Authorization header. A quick check with curl:

curl -s https://api.importos.app/mcp \
  -H "Authorization: Bearer rv_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

or the official TypeScript client:

import { Client } from '@modelcontextprotocol/sdk/client/index.js';
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';

const client = new Client({ name: 'my-agent', version: '1.0.0' });
await client.connect(
  new StreamableHTTPClientTransport(new URL('https://api.importos.app/mcp'), {
    requestInit: { headers: { Authorization: `Bearer ${process.env.IMPORTOS_API_KEY}` } },
  }),
);
const result = await client.callTool({
  name: 'calculate_landed_cost',
  arguments: {
    lot_price_usd: 8000,
    auction: 'copart',
    vehicle: { year: 2018, fuel: 'petrol', engine_cc: 2487 },
    us_state: 'NJ',
    destination_country: 'UA',
    our_fee_usd: 700,
  },
});
console.log(result.structuredContent);

The result is JSON (structuredContent, duplicated in the text content): items[], total, total_range, warnings[], assumptions[], rulesVersion, fx[], confidence.

Limitations

  • No sessions: no server stream; GET /mcp and DELETE /mcp return 405. All Streamable HTTP clients work.
  • No OAuth: access by a static key. OAuth 2.1 (needed by ChatGPT connectors) is Waiting on the owner.
  • Estimates, not offers: unverified rates are flagged, not hidden.
  • MCP Registry: the mcp/server.json manifest (MCP Registry format) is ready, but publishing needs domain verification Waiting on the owner.
  • Windows and Norton: a network filter may corrupt loopback responses on /mcp, see the quick start.

On this page