autoria-mcp
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., "@autoria-mcp Find me used BMW 5 Series in Kyiv with mileage under 100k km."
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.
autoria-mcp
An MCP server that exposes the
AUTO.RIA used-cars REST API (auto.ria.com, via developers.ria.com) to AI
agents — programmatic, agent-friendly access to the Ukrainian used-car market
through the sanctioned API, no scraping.
The full tool surface is live — 30 tools, 7 dictionary resources, and 1 templated resource: curated search/lookup tools (single and batch listing details), paid statistics tools, thin endpoint mirrors, and browsable dictionary resources, all backed by tiered caching and a typed async client.
Features
Curated, high-level tools that take human-friendly inputs (brand, model, region, year/price ranges) and resolve them to AUTO.RIA's numeric IDs for you.
Paid statistics tools (AI average price, price-over-time, VIN decode) that fail fast with a clear error when
AUTORIA_USER_IDis unset — no wasted quota.Thin endpoint mirrors for the long-tail dictionary/lookup endpoints.
Dictionary resources — browse categories, colours, regions, etc. as addressable
autoria://dict/...documents.Aggressive, tiered caching: large slow-changing dictionaries are cached on disk for 7 days (name→ID resolution costs no quota after the first fetch), while volatile search/statistics responses are cached briefly, in memory only.
stdio and streamable-HTTP transports.
Related MCP server: Smartcar MCP Server
Install
Requires Python 3.11+. The package is distributed on PyPI; run it without a
manual install using uvx:
uvx autoria-mcpOr install into a tool environment with pipx / uv tool:
uv tool install autoria-mcp # or: pipx install autoria-mcpQuickstart: Claude Desktop (no coding required)
Want to use AUTO.RIA from the Claude desktop app? Follow these steps — no programming needed, just some copy-and-paste. Pick your platform: macOS · Windows.
macOS
1. Install uv (the small tool that runs autoria-mcp for you). Open the
Terminal app and paste this, then press Enter:
curl -LsSf https://astral.sh/uv/install.sh | sh(Full instructions: https://docs.astral.sh/uv/getting-started/installation/.)
2. Get a free AUTO.RIA API key at https://developers.ria.com. Keep it handy.
A user_id is optional — you only need it for the paid price-statistics tools.
3. Find the full path to uvx. The desktop app can't see your Terminal's
settings, so it needs the full path. In Terminal, run:
which uvxCopy what it prints — usually /opt/homebrew/bin/uvx (Apple-Silicon Mac) or
/usr/local/bin/uvx (Intel Mac).
This is the #1 reason setup fails. If you use just
uvxinstead of the full path, the app says it can't find it. Always paste the full path fromwhich uvx.
4. Open Claude Desktop's config file. In the Claude app: Settings →
Developer → Edit Config. This opens a file called claude_desktop_config.json
(on macOS it lives at
~/Library/Application Support/Claude/claude_desktop_config.json).
5. Add the autoria server. Paste the block below. If the file already has a
"mcpServers" section, add "autoria" inside it next to your other servers;
otherwise paste the whole thing. Replace the two placeholder values:
{
"mcpServers": {
"autoria": {
"command": "/opt/homebrew/bin/uvx",
"args": ["autoria-mcp"],
"env": { "AUTORIA_API_KEY": "paste-your-api-key-here" }
}
}
}command→ the full path from step 3.AUTORIA_API_KEY→ your key from step 2.For the paid tools (average price, VIN lookup), add
"AUTORIA_USER_ID": "..."toenv— put a comma after the API-key line when you do, e.g."env": { "AUTORIA_API_KEY": "...", "AUTORIA_USER_ID": "..." }.
Save the file.
6. Fully quit and reopen Claude. Press Cmd + Q (just closing the window
isn't enough), then open Claude again. The first start takes a few seconds
while it downloads the tool; after that it's instant.
7. Try it. Ask Claude something like: "Use autoria to find used BMW 3 Series cars in Kyiv and show me a few with prices."
Heads-up on limits: the free AUTO.RIA key allows roughly 30 requests/hour and 1000/month — so ask focused questions rather than broad ones.
If autoria doesn't show up after restarting, the log file usually says why:
tail -50 ~/Library/Logs/Claude/mcp-server-autoria.logMost common fixes: use the full uvx path (step 3), and make sure you
fully quit Claude with Cmd + Q.
Windows
The same flow on Windows — the commands and a couple of Windows-only gotchas differ from macOS.
1. Install uv (it ships the uvx command that runs autoria-mcp). Open
PowerShell and run either:
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"or, if you use winget:
winget install --id=astral-sh.uv -eThen open a new terminal window so the updated PATH takes effect.
(Full instructions: https://docs.astral.sh/uv/getting-started/installation/.)
2. Get a free AUTO.RIA API key at https://developers.ria.com. Keep it
handy. A user_id is optional — you only need it for the paid price-statistics
tools.
3. Find the full path to uvx.exe. The desktop app can't see your terminal's
PATH, so it needs the full path. In PowerShell, run:
Get-Command uvx | Select-Object -ExpandProperty Sourceor in Command Prompt (cmd):
where.exe uvxCopy what it prints — usually C:\Users\<you>\.local\bin\uvx.exe.
In PowerShell, use
where.exe, notwhere. Plainwhereis an alias forWhere-Objectand won't find the executable.
This is the #1 reason setup fails. If you use just
uvxinstead of the full path, the app says it can't find it. Always paste the full path from step 3.
4. Open Claude Desktop's config file — use the in-app button. In the Claude
app: Settings → Developer → Edit Config. This opens the correct
claude_desktop_config.json for your install.
Don't hand-edit the
%APPDATA%file. The documented location is%APPDATA%\Claude\claude_desktop_config.json(=C:\Users\<you>\AppData\Roaming\Claude\claude_desktop_config.json), but the Microsoft Store / MSIX build of Claude virtualizes that folder — it actually reads from%LOCALAPPDATA%\Packages\Claude_pzs8sxrjxfjjc\LocalCache\Roaming\Claude\claude_desktop_config.json. Editing the plain%APPDATA%copy then makes your MCP servers silently fail to load. The Edit Config button always opens the right file — use it.
5. Add the autoria server. Paste the block below. If the file already has a
"mcpServers" section, add "autoria" inside it next to your other servers;
otherwise paste the whole thing. On Windows, backslashes in JSON must be
doubled (\\) — or use forward slashes (C:/Users/you/.local/bin/uvx.exe):
{
"mcpServers": {
"autoria": {
"command": "C:\\Users\\you\\.local\\bin\\uvx.exe",
"args": ["autoria-mcp"],
"env": { "AUTORIA_API_KEY": "paste-your-api-key-here" }
}
}
}command→ the full path from step 3, with doubled backslashes.AUTORIA_API_KEY→ your key from step 2.For the paid tools (average price, VIN lookup), add
"AUTORIA_USER_ID": "..."toenv— put a comma after the API-key line when you do, e.g."env": { "AUTORIA_API_KEY": "...", "AUTORIA_USER_ID": "..." }.
Save the file. A ready-to-edit copy is at
examples/claude_desktop_config_windows.json.
Prefer not to keep your key in the config? Omit the
envblock and instead putAUTORIA_API_KEYin a.envfile in the working directory, or set it as a Windows user/system environment variable.
6. Fully restart Claude. Right-click the Claude icon in the system tray (near the clock) and choose Quit — just closing the window isn't enough — then open Claude again. The first start takes a few seconds while it downloads the tool; after that it's instant.
7. Try it. Ask Claude something like: "Use autoria to find used BMW 3 Series cars in Kyiv and show me a few with prices."
The same limits and most-common
fixes apply: use the full uvx.exe path (step 3), edit the config via the
in-app button (step 4), and fully quit from the tray (step 6). Logs are at
%APPDATA%\Claude\logs\mcp-server-autoria.log.
Configuration
All settings are read from environment variables (prefix AUTORIA_) or a local
.env file. Copy .env.example to .env and fill in your key.
Variable | Default | Description |
| — (required for API calls) | Personal API key from https://developers.ria.com. Never logged. |
| — | User id, required only by the paid POST endpoints. |
|
|
|
|
| Bind host for the HTTP transport. |
|
| Bind port for the HTTP transport. |
|
| API host (only the production host is documented). |
|
| On-disk dictionary cache location. |
|
| Default dictionary cache TTL, in seconds. |
|
| Memory-only TTL for volatile search/statistics responses. |
|
| Max entries per in-memory cache tier (bounded LRU). |
|
| Retry attempts on |
|
| Base backoff delay, in seconds. |
|
| Max delay for a single backoff sleep, in seconds. |
|
| Assumed hourly quota; usage warns near it (never blocks). |
|
| Assumed monthly quota; usage warns near it (never blocks). |
|
| Warn once usage crosses this fraction of a window limit. |
|
| Package log level. |
The API key is held in a SecretStr and never written to logs.
Running
# stdio (default) — how MCP clients launch it
autoria-mcp
# streamable-HTTP
autoria-mcp --transport http --host 127.0.0.1 --port 8000
# or
AUTORIA_TRANSPORT=http autoria-mcpSee examples/ for ready-to-paste MCP client configs (Claude
Desktop and a generic stdio client).
Quota guidance
The AUTO.RIA free package is metered per API key across all RIA web services and the limits are tight:
~1000 requests / month
30 requests / hour (rolling); exceeding either returns
429 OVER_RATE_LIMITand temporarily blocks the key.
There are no X-RateLimit-* response headers, so the client tracks usage
locally (Phase 3). Treat every live call as spending scarce quota: the dictionary
endpoints are cached aggressively, and search/statistics responses should not be
re-fetched needlessly.
Tool catalog
Curated tools — natural inputs (names, ranges), resolved to IDs for you:
Tool | Description |
| Search by brand/model/region/year/price/engine-volume/power/generation/etc.; returns the match |
| Compact details for one advert id: price, year, mileage, structured engine volume/power, labelled body/fuel/gearbox, plus |
| Details for up to 50 advert ids in one call (deduped; a dead id returns a sparse entry). |
| List passenger-car brands, or resolve one brand name to its id. |
| List a brand's models, or resolve one model name to its id. |
| List regions (oblasts), or resolve one region name to its id. |
| List a region's cities, or resolve one city name to its id. |
Paid tools (require AUTORIA_USER_ID; fail fast with a clear error otherwise):
Tool | Description |
| AI average price + comparable listings (by params or |
| Monthly average-price time series. |
| Decode a VIN / plate / advert id into car-parameter chips. |
Thin mirrors (raw passthrough, 7-day cached): list_categories,
list_all_models, list_models_grouped, list_generations, list_modifications,
list_modifications_by_body, list_equipment, list_options, list_options_v2,
list_colors, list_countries, list_drive_types, list_fuel_types,
list_gearboxes, list_body_styles, list_body_styles_grouped,
list_all_body_styles, list_bodies_by_generation, and raw_search (raw V1
search; compact {count, ids} by default, verbose=True for the full payload).
Resources: autoria://dict/{categories,colors,countries,fuel-types,gearboxes, body-styles,states} and the templated autoria://dict/models/{categoryId}/{markId}.
Health: ping — zero-quota liveness/diagnostic check.
Attribution
AUTO.RIA's API terms require a visible link back to auto.ria.com wherever you
display data sourced from the API. get_car_details and the paid endpoints include
a canonical per-listing deep link (url); keep it visible in whatever surface
presents a listing to an end user. (search_used_cars returns only ids + a count —
the Public API specifies no set-level search link, so none is invented.)
Known limitations
These are deliberate scope/behaviour choices worth knowing before you rely on them:
Single brand/model per search. Multi-brand or multi-model search is not yet modelled by
search_used_cars. For OR-style queries across several brands, drop toraw_searchand pass the raw V1 params yourself.Search returns ids, not full listings.
search_used_carsgives you advert ids and acount. Fetch per-listing detail withget_car_details(orget_car_details_batchfor a whole page of ids) — each lookup spends quota, so resolve only what you need.Search is V1-only and silently ignores unknown params — a genuine footgun. The underlying
/auto/searchendpoint does not validate filter keys: a misspelt or unsupported param is dropped, and the search quietly widens to the whole site instead of erroring. The curated tool resolves names to the correct V1 ids to avoid this, butraw_searchpasses your params through verbatim.Paid POST errors arrive as HTTP 200. The paid endpoints return errors in the body (
noticeType: "error") with a 200 status; the paid tools detect and surface these as tool errors.get_average_price_over_periodsaccepts onlyperiod ∈ {30, 90, 180, 365}.
Development
uv sync # create venv + install deps (incl. dev group)
uv run ruff check . # lint
uv run ruff format --check . # format check
uv run mypy # strict type check (src + tests)
uv run pytest # tests (no network)
pre-commit install # enable git hooksThe OpenAPI 3.1 description lives in
openapi/autoria-used-cars.yaml.
Roadmap
✅ Phase 1 — OpenAPI spec, live-verified API facts.
✅ Phase 2 — repo scaffold, tooling, CI, packaging, runnable server.
✅ Phase 3 — typed async client, TTL dictionary cache, name→ID resolution, recorded-fixture tests (zero live quota).
✅ Phase 4 — curated + paid + thin tools, dictionary MCP resources.
✅ Phase 5 — docs, examples, first PyPI release (
0.1.0).
Post-1.0 backlog (not scheduled): native multi-brand / multi-model search;
per-endpoint cache TTLs; a cross-process quota lock (current accounting is
per-process, warn-only); an npx shim for Node-based MCP clients.
License
MIT. This is an unofficial project and is not affiliated with or endorsed by RIA.com / AUTO.RIA.
Available Tools
30 toolsget_average_priceA
Paid. AI average price + comparable listings (point-in-time).
Two modes: pass omni_id (VIN/plate/advert id), OR car parameters by
name (brand+model required, plus at least one more filter such as
year_from/mileage_to/fuel/engine_volume_from). Names are resolved
to ids for you; generation_id/modification_id are optional raw ids.
Requires AUTORIA_USER_ID. period ∈ {30, 90, 180, 365}.
The headline avg_price_usd/avg_price_uah is AUTO.RIA's own model-level
AI estimate — it is only weakly sensitive to engine_volume/modification,
so do NOT read it as an engine-precise fair value. For that, prefer
cohort_estimate_usd (the median of the comparable listings), keeping in mind
the sample is small. To judge reliability, the response also returns
sample_count and the sample's own sample_min_usd/sample_median_usd/
sample_max_usd, plus a price_consistency flag that is avg_below_sample/
avg_above_sample when the headline falls outside its own comparables.
status is no_data / insufficient_sample / ok — it is
insufficient_sample when fewer than 5 comps are in-cohort or when a tight
cohort was requested yet the headline ignored it. Comps are flagged in_cohort
and cohort_estimate_usd uses only those (in_cohort_count reports how many).
cohort echoes the resolved filters. quota is a LOCAL, advisory, warn-only
counter (it can exceed its limit and never blocks) — not AUTO.RIA's enforced
budget, so don't hard-gate on it.
Note: facelifts are distinct generation_ids and this endpoint takes a
single one — call once per generation to price a whole family.
Example: get_average_price(brand="Peugeot", model="308", fuel="Дизель", engine_volume_from=1.9, engine_volume_to=2.1, year_from=2014, period=365).
Inputs: body, fuel, brand, color, +15 more. Returns: Point-in-time average price plus the comparable listings it derives from. The h…
get_average_price_over_periodsA
Paid. Average-price time series (monthly) for a car or omni_id.
Same inputs and modes as get_average_price; returns graph_data
(monthly average price, date as "MM.YY") plus the available period
presets. Requires AUTORIA_USER_ID. period ∈ {30, 90, 180, 365}.
Inputs: body, fuel, brand, color, +14 more. Returns: Average price over time (``get_average_price_over_periods``).
get_car_detailsA
Get compact details for a single AUTO.RIA advert by its id.
Returns price (USD/UAH/EUR), year, mileage (km), fuel + engine_volume_l
power_hp, gearbox, drive,body_name, generation, modification, colour, location, the VIN (only if the seller revealed it), the masked phone, and the canonical listingurl.
For due diligence it also returns SELLER-DECLARED, UNVERIFIED provenance:
condition (1 undamaged … 4 for-parts), the risk block
(damaged/for_parts/under_credit/confiscated/imported/needs_customs),
VIN/inspection verification, seller trust, photo links, plus
is_sold/is_leasing/price_negotiable/exchange_possible and the
seller description. Check risk and condition before trusting a
listing — mileage_km and prices are claims, not facts. The phone is
always masked. To look up many ids at once use get_car_details_batch.
Inputs: auto_id (required). Returns: Compact detail for a single advert (``get_car_details``). Dictionary attributes…
get_car_details_batchA
Get compact details for several adverts in one call (up to 50 ids).
The agent-efficiency counterpart to get_car_details: instead of one
round-trip per id when ranking a result page, pass the whole id list and
get an array back, in the same order, deduplicated. A listing that fails
to load comes back as a sparse entry (its url is null) rather than
failing the batch. Same fields and caveats as get_car_details
(mileage/price are seller-declared and unverified).
Inputs: auto_ids (required). Returns: result
get_params_by_vinA
Paid. Decode a VIN / plate / advert id into car-parameter chips.
Returns the decoded attributes (category, brand, model, body, fuel,
gearbox, drive, colour, year, ...) plus a link to equivalent listings.
Only works if the vehicle was ever listed on AUTO.RIA. Requires
AUTORIA_USER_ID. An unresolvable id surfaces as a tool error.
Inputs: omni_id (required). Returns: Decoded car parameters for ``get_params_by_vin`` (omniId in → chips out).
list_all_body_stylesA
List all body styles across categories (raw). Cached 7 days.
Inputs: no named parameters.
list_all_modelsB
List all models across every brand/category (raw). Cached 7 days.
Inputs: no named parameters.
list_bodies_by_generationA
List body types available for a generation. Cached 7 days.
Inputs: generation_id (required).
list_body_stylesA
List body styles for a category (parentId groups them). Cached 7d.
Inputs: category_id.
list_body_styles_groupedA
List body styles for a category as groups (array of arrays). Cached 7d.
Inputs: category_id.
list_categoriesA
List all transport categories (ids + names). Cached 7 days.
Inputs: no named parameters.
list_colorsA
List paint colours (ids + names). Cached 7 days.
Inputs: no named parameters.
list_countriesB
List manufacturer/origin countries (note the custom 900+ block). Cached 7d.
Inputs: no named parameters.
list_drive_typesA
List drive types for a category (ids are category-specific). Cached 7d.
Inputs: category_id.
list_equipmentA
List equipment trims for a modification. Cached 7 days.
Inputs: modification_id (required).
list_fuel_typesA
List fuel types (ids + names; includes MHEV 11 / REEV 12). Cached 7d.
Inputs: no named parameters.
list_gearboxesB
List gearboxes for a category. Cached 7 days.
Inputs: category_id.
list_generationsA
List generations for a model. Cached 7 days.
Raw upstream shape (camelCase: generationId, yearFrom, yearTo). Note
yearTo: 0 is a sentinel for "current / still produced", not a literal year.
Inputs: model_id (required).
list_models_groupedA
List a brand's models grouped into families (heterogeneous). Cached 7d.
Inputs: mark_id (required), category_id.
list_modificationsA
List modifications (engine/trim variants) for a generation. Cached 7d.
Inputs: generation_id (required).
list_modifications_by_bodyA
List modifications for a generation restricted to a body type. Cached 7d.
Inputs: body_id (required), generation_id (required).
list_optionsB
List the flat option/equipment vocabulary for a category. Cached 7d.
Inputs: category_id.
list_options_v2A
List the grouped (publishing) options V2 structure for a category. Cached 7d.
Inputs: category_id.
lookup_brandsA
List passenger-car brands, or resolve one brand name to its id.
With no name, returns every brand as {id, name}. With a name,
returns the single matching brand (or an error listing close matches).
Inputs: name. Returns: result
lookup_citiesA
List a region's cities, or resolve one city name to its id.
region is required (cities are scoped to a region).
Inputs: region (required), name. Returns: result
lookup_modelsA
List a brand's models, or resolve one model name to its id.
brand is required (models are scoped to a brand). With no name,
returns every model of that brand; with a name, the single match.
Inputs: brand (required), name. Returns: result
lookup_regionsA
List regions (oblasts), or resolve one region name to its id.
Note: there is no separate "Київ" (Kyiv city) region — only Київська
(oblast, id 10). Kyiv city is a city within it: target it with
region="Київська", city="Київ" (via lookup_cities / search_used_cars).
Inputs: name. Returns: result
pingA
Liveness check for the autoria MCP server.
Returns server name, package version, the active transport, and whether an API key is configured. Costs zero API quota and makes no network call. Use it to verify wiring before invoking real tools.
Inputs: echo. Returns: server, status, version, transport, +1 more
raw_searchA
Run a raw /auto/search with V1 params (power users).
Bypasses the curated name-resolution of search_used_cars; you supply V1
wire params directly (e.g. marka_id[0], category_id, s_yers[0]).
Cached briefly (volatile). By default returns the same compact shape as
search_used_cars (ids + count); pass verbose=True for the full raw
payload (~150 lines of echoed params/metadata).
Inputs: params (required), verbose.
search_used_carsA
Search AUTO.RIA used-car listings (passenger cars) by friendly inputs.
Resolves brand/model/region/city/fuel/gearbox/body names to AUTO.RIA
ids for you, then makes a single search call. Returns the total match
count, the current page/page_size, and the matching advert ids
(used cars only — the OfferOfTheDay promo is filtered out). To get a
specific listing's details and its own auto.ria.com URL, pass an id to
get_car_details, or set include_details=true to get them inline.
Notes:
Mileage is in km (e.g.
mileage_to=150000); engine volume is in litres (engine_volume_from=1.9), power in hp (power_hp_from).Engine volume is stored imprecisely upstream (a 2.0 may appear as 1.97), so use a band (e.g. 1.9–2.1) rather than an exact value.
modelrequiresbrand;cityrequiresregion. To target Kyiv city, useregion="Київська", city="Київ"(there is no separate Kyiv region). Filter bygeneration_id/modification_id(fromlist_generations/list_modifications) to isolate a specific generation or engine/trim.v1 supports a single brand+model block. For multi-brand queries use the
raw_searchtool.
Example: search_used_cars(brand="Audi", model="A6", body="Універсал", engine_volume_from=1.9, engine_volume_to=2.1, fuel="Дизель", order_by="price_asc").
Inputs: body, city, fuel, page, +20 more. Returns: Result of ``search_used_cars``: the total match ``count`` plus the ids. Per the…
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 30 tools
Most tools have clearly distinct purposes, but there is some overlap among the many list_ tools (e.g., list_body_styles vs list_all_body_styles) and between list_options variants. Descriptions help clarify the differences, so an agent can generally select the correct tool.
The naming pattern is mostly consistent with underscore-separated verbs (list_, lookup_, get_, search_). Minor exceptions like 'raw_search' (prefix instead of verb) and 'list_bodies_by_generation' (plural vs singular) are deviations, but they do not cause confusion.
30 tools is on the high side, but the domain (used car search and reference data) is broad. Some consolidation of the many list_ tools could be considered, but each tool serves a specific API endpoint and the count is justified for full coverage.
The tool surface covers all major workflows: browsing reference data (brands, models, regions, etc.), searching listings, getting details, batch operations, average price analysis, and VIN decoding. There are no obvious gaps for a read-only car search assistant.
Maintenance
Related MCP Connectors
Hosted MCP server for live public-data APIs and Skills for AI agents.
Web search API and MCP server for developers building AI agents.
Hosted MCP server connecting AI assistants to 9,000+ apps and 40,000+ actions via Zapier.
MCP server for OpenAI API (chat completions, image generation, embeddings) via AceDataCloud
Related MCP Servers
- AlicenseAqualityDmaintenanceAn MCP server that integrates with the Carvana marketplace to enable vehicle searching, financing estimation, and trade-in value assessments. It allows AI assistants to retrieve detailed vehicle information, history reports, and market insights directly from Carvana's inventory.1010 npm1MIT
- FlicenseNot gradedqualityDmaintenanceAn MCP server that exposes Smartcar's vehicle API as tools, enabling AI agents to query vehicle telemetry and send commands using natural language.-
- AlicenseAqualityBmaintenanceUniversal MCP server for the Avito API (Russia's largest classifieds marketplace), built for autonomous AI agents to operate an account hands-free — 145 tools across 18 domains (listings, messenger, orders, delivery, promotion, autoload, reviews, analytics). Safe-by-default: dry-run, idempotency, structured errors, confirmation flow.144156 npm25MIT
- AlicenseNot gradedqualityDmaintenanceA lightweight MCP server that exposes Crawl4AI web scraping and crawling capabilities as tools for AI agents, enabling single-page scraping and multi-page crawling with adaptive stopping.118MIT