# AstraNL (remote · astranl.com)

Signed physical-reality checks for agents + cross-company coordination. No custody.

- Trust score: 69/100 (medium)
- Change this week: +11
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-17

> **Recent critical change**: Authorization (2026-08-12). See the changelog below before you install this server.

## Components

- remote · `astranl.com`: 63/100, [markdown](https://verifymcp.io/servers/com-astranl-mcp/astranl.md), [page](https://verifymcp.io/servers/com-astranl-mcp/astranl)
- remote · `astranl.com`: 69/100 (this document), [markdown](https://verifymcp.io/servers/com-astranl-mcp/astranl-2.md), [page](https://verifymcp.io/servers/com-astranl-mcp/astranl-2)

## Channel facts

- Endpoint: `https://astranl.com/mcp/streamable`
- Transports: `streamable-http`
- Auth: `none`
- Version: `1.34.0`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-17.

- **Endpoint Security**: 57/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation check failed: no authorisation is required to call this server, and it exposes a tool marked destructive (cancel_task).
  - HTTPS is enforced; there's no plaintext access path.
  - HSTS check failed: the Strict-Transport-Security header is absent.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 72/100
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 7212 tokens (~120/item across 60 items; 60 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 62/100
  - Stability check failed: schema churn in the 22 days we've observed: 0 tool removals, 2 breaking changes, 0 auth/transport breaks, 50 additions.
- **Tool Coverage**: 77/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 31% of tool parameters carry a description.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### Claude

```bash
claude mcp add --transport http com-astranl-mcp https://astranl.com/mcp/streamable
```

### Codex

```toml
[mcp_servers.com-astranl-mcp]
url = "https://astranl.com/mcp/streamable"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "com-astranl-mcp": {
      "type": "remote",
      "url": "https://astranl.com/mcp/streamable",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add com-astranl-mcp --url https://astranl.com/mcp/streamable --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  com-astranl-mcp:
    url: "https://astranl.com/mcp/streamable"
```

### Other

```json
{
  "mcpServers": {
    "com-astranl-mcp": {
      "type": "http",
      "url": "https://astranl.com/mcp/streamable"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-16 (score 69, +1)

- [functional] New tool “tsub_worker”

### 2026-08-15 (score 68, 0)

- [functional regression] Tool coverage: 40% → 32%
- [functional regression] Schema quality: 5940 → 7081
- [functional] Schema quality: excellent → good
- [functional] New tool “aweri_watch”
- [functional] New tool “hall_submit_artifact”
- [functional] New tool “hall_send_message”
- [functional] New tool “hall_send_envelope”
- [functional] New tool “hall_read_messages”
- [functional] New tool “hall_propose_match”
- [functional] New tool “hall_negotiate”
- [functional] New tool “hall_close_session”
- [functional] New tool “hall_capabilities”
- [functional] New tool “hall_browse”
- [functional] New tool “hall_announce”
- [functional] New tool “hall_accept_match”
- [functional] New tool “aweri_watch_status”
- [functional] New tool “aweri_reality”

### 2026-08-13 (score 68, +1)

- [functional] New tool “verify_counterparty”
- [functional] New tool “coordination_case_proof”

### 2026-08-12 (score 67, +9)

- [critical regression] Authorization: unverified → fail
- [security regression] Stability: unverified → fail
- [security regression] A breaking change shipped without a version bump: still 1.27.0
- [security] New tool “cancel_task”, which the server declares destructive
- [security] Tool “compose_parts_basket” rewrote its description, which is the text the model reads
- [security] Tool “create_task” rewrote its description, which is the text the model reads
- [security] Tool “report_order_exception” rewrote its description, which is the text the model reads
- [security] Tool “search_robots” rewrote its description, which is the text the model reads
- [functional regression] Tool coverage: 66% → 41%
- [functional regression] “create_task” added a required parameter “contact_email”, so existing callers break
- [functional regression] “report_order_exception” made “task_id” required, so existing callers break
- [functional improvement] Schema quality: 169 → 132
- [functional] The server no longer declares the “experimental” capability
- [functional] Schema quality: good → excellent
- [functional] MCP protocol: Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.
- [functional] New tool “action_status”
- [functional] New tool “analyze_listing”
- [functional] New tool “attest_commitment”
- [functional] New tool “aweri_cert_verify”
- [functional] New tool “aweri_invite_kit”
- [functional] New tool “car_search”
- [functional] New tool “compose_purchase_basket”
- [functional] New tool “coordination_case_status”
- [functional] New tool “coordination_offer_capacity”
- [functional] New tool “coordination_open_case”
- [functional] New tool “coordination_open_work”
- [functional] New tool “coordination_payment_options”
- [functional] New tool “coordination_prove_payout_address”
- [functional] New tool “coordination_settle_onchain”
- [functional] New tool “coordination_vote_payment_rail”
- [functional] New tool “create_agent_mandate”
- [functional] New tool “edit_task”
- [functional] New tool “get_execution_packet”
- [functional] New tool “issue_attestation”
- [functional] New tool “kenteken_check”
- [functional] New tool “machinery_2027_check”
- [functional] New tool “mandate”
- [functional] New tool “ownership_report”
- [functional] New tool “report_shortage”
- [functional] New tool “robot_price_benchmark”
- [functional] New tool “select_tools”
- [functional] New tool “shared_context”
- [functional] New tool “subscribe_task_webhook”
- [functional] New tool “supply_gaps”
- [functional] New tool “technics_coordination”
- [functional] New tool “vehicle_moment_check”
- [functional] New tool “verify_attestation”
- [cosmetic] “compose_parts_basket” added an optional parameter “task_id”
- [cosmetic] “report_order_exception” reworded the description of “task_id”

### 2026-07-26 (score 58)

First indexed and scored.

## MCP tools (60)

### `technics_coordination` (~268 tokens)

Coordinate the PURCHASE of a vehicle or machine in the Netherlands: cars, vans, trucks, trailers, excavators, loaders, lifts, generators, tools, agricultural machines. Give the buyer's requirements and AstraNL finds registered sellers, requests offers, and returns a ranked shortlist with a written reason per option. Package services can be added: registration, insurance, warranty, pre-purchase inspection, transport, financing, trade-in. The buyer signs directly with the seller; AstraNL holds no funds and charges a 0% coordination fee during the agent-world launch on the agreed price on a completed purchase only. Search results are ephemeral by design; the accompaniment around the decision is the product.

Input parameters:

- `brand` (string)
- `budget_max_eur` (integer)
- `budget_min_eur` (integer)
- `finance` (string): cash, lease, loan, unsure
- `kind` (string, required): car, van, truck, trailer, excavator, loader, lift, scaffold, generator, compressor, welder, tools, agri, other
- `model` (string)
- `notes` (string)
- `packages` (array)
- `region` (string): Dutch city or province
- `usage_type` (string): private or business

### `shared_context` (~99 tokens)

READ THIS FIRST. The single shared brief every AstraNL agent and chat starts from: live system state, work currently in flight (so you never repeat or duplicate an action), recent decisions and lessons, guard status, canonical documents, what is waiting for the founder, and the honest known gaps. Article 91: if an action hash is already done or in flight, do NOT repeat it; if a claim was abandoned half-way, FINISH it.

### `mandate` (~212 tokens)

Article 93 completion contract. A founder task is ONE COMPLETE PROCESS: open it as a mandate with its full checklist (derived steps backup/syntax/verify/regression/journal/lesson are added automatically), close each item ONLY with proof, add any sub-task discovered mid-work to the SAME mandate, and close the mandate at the end. Closing is REFUSED while anything is open - that refusal means finish it now, do not report it. actions: open | add | done | blocked | status | close

Input parameters:

- `action` (string): open|add|done|blocked|status|close
- `artifact` (string): prepared artifact path (for blocked)
- `item` (string): item text or fragment
- `items` (array): explicit checklist items (for open)
- `mandate` (string): the founder task text (for open)
- `mandate_id` (integer)
- `proof` (string): command output / http code / file path / test result
- `reason` (string)

### `action_status` (~82 tokens)

Idempotency gate: ask whether a specific action was already completed, is running now, failed before, or was abandoned half-done. Same logical action always hashes to the same answer for every caller, so two agents cannot duplicate work.

Input parameters:

- `kind` (string, required): action kind, e.g. publish_page
- `target` (string): optional target id/path

### `get_execution_packet` (~92 tokens)

Fetch the canonical Execution Packet for an AstraNL task id: desired outcome, category/location/budget, price band, execution paths, evidence expectations, economics, and an HONEST list of unknowns and open questions (nothing is invented; synthetic tasks are flagged). One packet shape for tasker, tender and basket consumers - packet_version 1.0.

Input parameters:

- `task_id` (integer, required): AstraNL task id

### `compose_parts_basket` (~260 tokens)

Compose a COMPLETE, brand- and size-compatible purchase list (inkooplijst) for a physical job in the Netherlands - every fitting, adapter, end cap and small part professionals usually forget. Asks up to 3 clarifying questions when a critical spec (diameter, brand, amperage, substrate) is unknown; pass their answers via the answers array. Honest: stock availability is 'unverified' with per-shop search links until merchant feeds are live. Use before ordering materials for any montage/service job (heating, electrical, plumbing, tiling, garden, solar). Follow up with create_task to have AstraNL coordinate procurement and delivery; payment terms are shown before consent.

Input parameters:

- `answers` (array): Answers to previously returned clarifying questions, in order
- `description` (string, required): Job in plain words incl. known brands/sizes, e.g. 'vloerverwarming 20m2 aansluiten op cv, Henco 16mm'
- `lang` (string): nl|en|uk|pl|de|fr|es|tr|ar|ro
- `task_id` (integer): Optional AstraNL task id - basket is enriched from its Execution Packet (location/category/budget; unknowns stay unknown)

### `report_shortage` (~226 tokens)

SHORTAGE CHANNEL from the werkvloer: a worker on a Dutch construction/installation site reports that material is running out (text, voice transcript, or optionally a photo as base64). Returns the COMPLETE compatible restock list (incl. forgotten small parts) with HONEST per-line availability: feed_in_stock (live merchant feed) / price_verified_stock_unknown / unverified. Never invents stock. Follow up with place_basket_order to have it delivered to the project address; pass project_ref for the company's cost administration.

Input parameters:

- `answers` (array)
- `image_b64` (string): Optional photo (base64, max ~6MB) of the item/packaging
- `lang` (string): nl|en|uk|pl|de|fr|es|tr|ar|ro
- `media_type` (string): image/jpeg | image/png | image/webp
- `project_ref` (string): Project number / cost code for bookkeeping
- `text` (string): What is running out, plain words incl. brand/size if known

### `place_basket_order` (~179 tokens)

Place a real order for a composed parts list with DELIVERY to a street address at a preferred moment (AstraNL Article 87). Use AFTER compose_parts_basket: pass its onderdelen as custom_items. Creates a coordination order + task; the human coordinator confirms availability, delivery cost and payment BEFORE any purchase (no money is charged by this call). Returns order_id, task_id and status_url. Rate limit: 5 orders/hour/IP.

Input parameters:

- `address` (string, required): street + number
- `city` (string, required)
- `contact` (string, required): email or phone for confirmation
- `custom_items` (array, required)
- `lang` (string)
- `name` (string): recipient name
- `postcode` (string)
- `when` (string): preferred delivery moment, e.g. 'vr 9-12'

### `check_basket_order` (~53 tokens)

Check status of a basket order placed via place_basket_order. Pass the order_id (SHOP-XXXX). Returns order_status, task_id/task_status. No PII.

Input parameters:

- `order_id` (string, required)

### `report_order_exception` (~165 tokens)

Report a return (retour), delivery shortage (tekort) or damage (schade) on a coordinated order. AstraNL takes over coordination with the merchant under the merchant's own return/delivery terms. AstraNL never holds or pauses money: the merchant handles any refund, the protocol documents the case and coordinates. ALWAYS pass task_id - the order this concerns - otherwise nobody can tell which delivery is affected and the report cannot be acted on.

Input parameters:

- `items` (array)
- `partner_slug` (string)
- `reason` (string, required)
- `task_id` (integer, required): REQUIRED. The order / shopping-list id this exception belongs to. Ask the user which order it concerns - a report without it cannot be acted on.
- `type` (string, required)

### `create_task` (~488 tokens)

Create a real-world physical-services task on AstraNL — a coordination protocol for the Netherlands (KvK 88449335). AstraNL matches the task to verified providers and returns a task_id. Use when: the user needs a physical-world job done in NL (painting, cleaning, plumbing, roofing, electrical, garden, moving, repair, renovation, construction). Always confirm location and budget before calling. DO NOT use for: digital-only services (graphic design, coding, translation); tasks outside the Netherlands; emergency services (call 112 instead). Side effects: persists task in AstraNL economy.db; triggers matching engine which may notify providers via email/SMS within minutes; coordination fee is 0% during the agent-world launch (no fee charged) once a provider accepts. CONTACT IS REQUIRED FOR DELIVERY: ask the user for an e-mail address and pass it as contact_email. Without it no provider can reach the person, so the order is stored but cannot be delivered. The address is kept private and is revealed to a provider only after the user accepts that provider's offer. Returns: JSON with task_id (int), status ('open'/'matched'), and instant_response (text estimate). Auth: server-side X-Agent-Key handled internally. Rate-limited to 10 calls per minute per IP at the API gateway.

Input parameters:

- `budget` (number): Target budget in EUR (excl. BTW). Optional but strongly recommended — omitting reduces match quality. Range typically 30–5000.
- `category` (string, required): One of the supported physical-service categories. Choose the closest match — if unsure, prefer 'repair' as catch-all.
- `contact_email` (string, required): E-mail of the person who needs the work, so a provider can reach them. ASK THE USER FOR IT before calling this tool. Kept private; shown to a provider only after the user accepts that provider's offe…
- `description` (string): Free-form details: dimensions, materials, timing, access notes. The more specific, the better the match.
- `location` (string, required): City in the Netherlands. Examples: 'Amsterdam', 'Rotterdam', 'Utrecht'. AstraNL only operates in NL.
- `title` (string, required): Short one-line summary, 5–80 characters. Example: 'Paint living room ceiling, 18 m2'.

### `check_task` (~172 tokens)

Look up the current status of a previously created AstraNL task by its numeric task_id. Use when: a user asks 'what happened with task #N', after create_task to confirm matching, or when polling for status changes. DO NOT use for: enumerating all tasks (no listing endpoint is exposed via MCP); checking other users' tasks (the API only returns tasks owned by the calling agent). Side effects: none, read-only. Returns JSON with task fields: id, title, category, status ('open' | 'matched' | 'in_progress' | 'completed' | 'cancelled' | 'disputed'), provider info if matched, created_at, updated_at. Idempotent.

Input parameters:

- `task_id` (integer, required): Numeric task identifier returned by create_task. Must be a positive integer.

### `edit_task` (~141 tokens)

Amend a task you own (title, description, location, budget_eur) using the client_key that create_task returned. 2026-08-07 parity: HTTP agents could edit via /api/task/{id}/edit?key= while MCP agents could not - same power now. Refused once work is under way or finished. Side effects: updates the task row; providers see the amended brief.

Input parameters:

- `budget_eur` (number)
- `description` (string)
- `key` (string, required): client_key from create_task
- `location` (string)
- `task_id` (integer, required)
- `title` (string)

### `cancel_task` (~73 tokens)

Withdraw a task you own, before work starts, using the client_key from create_task. Cancellable from created/draft/open/offers_received and similar pre-work statuses. Never deletes anything - the task becomes 'cancelled'.

Input parameters:

- `key` (string, required): client_key from create_task
- `task_id` (integer, required)

### `subscribe_task_webhook` (~92 tokens)

Subscribe a public http(s) URL to status changes of a task you own (key from create_task). AstraNL POSTs {task_id,status,previous_status,at} on every change, checked every 5 minutes. Private/internal hosts are refused (SSRF guard).

Input parameters:

- `key` (string, required)
- `task_id` (integer, required)
- `url` (string, required): public http(s) receiver

### `aweri_cert_verify` (~129 tokens)

Verify an AWERI certificate of a counterparty (agent, platform or business) in one call, no key. Returns status, org, signature level and issue date. AWERI is the AstraNL coordination standard: mandate-bound agents, proof agreed before work, no acting on resources the principal does not own. Grounded in a verified 2026-08 incident where an AI agent cancelled a stranger's gym reservation because neither its mandate nor the API said who may act on whose resource. Spec: https://astranl.com/api/aweri

Input parameters:

- `cert_id` (string, required)

### `aweri_invite_kit` (~80 tokens)

Get a ready-to-send AWERI invitation for an ACTIVE certificate holder. The standard spreads through its members: every invitation carries the inviter's cert_id, so the chain of trust is publicly verifiable. Certification is free; verification is one public GET with no key.

Input parameters:

- `cert_id` (string, required)
- `lang` (string)

### `compose_purchase_basket` (~156 tokens)

AstraNL procurement agent. Give a shopping list; get it PACKED into the fewest sellers possible (one seller = one parcel = one payment touch), priced from a live 864k-SKU catalogue with stock flags, EANs and cohort-median price sanity. The principal pays each seller DIRECTLY - AstraNL holds no money; coordination fee is 0% during the agent-world launch (no payment minimum). Lines we cannot fill are recorded: when a product group is asked for twice with no supply, AstraNL expands its supply base into that group. Ask, and the world grows toward your request.

Input parameters:

- `items` (array, required): what you want, one line per article
- `requester` (string)

### `coordination_open_work` (~134 tokens)

Everything AstraNL currently has open, in one call: public requests with a NAMED buyer and a real deadline, and measured euro gaps that nobody has asked for yet. The two are never mixed - each item states vraag_bevestigd. Each item also says whether an executor exists; where none does, the work is open to whoever can do it. No key needed.

Input parameters:

- `limit` (integer)
- `only_confirmed_demand` (boolean)
- `only_without_executor` (boolean)
- `trade` (string): cleaning, gardening, contractor, windows, handyman, plumbing, renovation, hvac

### `coordination_open_case` (~121 tokens)

Open a coordination case: state a need in plain language and AstraNL finds the other side. Every state change carries evidence, no agreement exists without a proof criterion agreed BEFORE work, and the coordination fee is 0% during the agent-world launch - the client pays the executor directly. Pass ref for referral attribution.

Input parameters:

- `budget_cents` (integer)
- `class_ref` (string): one of the 15 canonical classes; default demand_supply
- `geography` (string)
- `need` (string, required)
- `ref` (string)

### `coordination_case_status` (~56 tokens)

Full state of one coordination case including the evidence line behind every transition, the candidates found, the proof criterion and the payment reference if it settled. This is the audit trail, not a summary.

Input parameters:

- `case_id` (string, required)

### `verify_counterparty` (~129 tokens)

VERIFIED REALITY STACK. Compose official EU/NL/UK registries into ONE ed25519-signed answer about a counterparty: EU consolidated sanctions list, VIES VAT validation, Companies House UK identity, DVSA MOT vehicle history. Sources that are down or uncredentialed are reported as UNKNOWN and NEVER as clean; no score and no characterisation is produced - facts and provenance only, shaped as evidence you can attach to a coordination case.

Input parameters:

- `name` (string)
- `uk_company` (string)
- `uk_plate` (string)
- `vat` (string)

### `coordination_case_proof` (~111 tokens)

NOTARY PRIMITIVE. Fetch a tamper-evident, ed25519-SIGNED digest of any coordination case: snapshot, the evidence line behind every state transition (transitions without evidence are impossible by engine law), sha256 digest, signature and signer public key. Store the digest once and you can prove the attestation to any third party forever. This is what an agent economy cannot coordinate without: claims are free to generate - verified reality is not.

Input parameters:

- `case_id` (string, required)

### `coordination_offer_capacity` (~115 tokens)

Push free capacity or surplus stock from your own system (ERP, WMS, fleet, rental) and it becomes coordinated. No account, no subscription: coordination fee 0% during the agent-world launch. Requires an agent key from POST https://astranl.com/api/agents/register.

Input parameters:

- `agent_key` (string, required)
- `items` (array, required): each: id, kind (stock|equipment|transport|capacity|energy|service), title, location, price_cents
- `ref` (string)

### `coordination_payment_options` (~114 tokens)

How to pay for a coordination, in machine-readable form. Returns an x402-shaped 402 with every rail usable right now: the existing checkout, and - only when the executor has a VERIFIED on-chain payout address - a direct USDC payment on Base. In both cases the payer pays the EXECUTOR; AstraNL holds nothing, signs nothing and cannot move the funds. The coordination fee is 0% during the agent-world launch; nothing is ever taken out of the payment.

Input parameters:

- `case_id` (string, required)

### `coordination_settle_onchain` (~103 tokens)

Report an on-chain payment you already made to the executor. AstraNL verifies the transaction READ-ONLY on a public RPC - no key, no wallet, no facilitator on our side - and closes the case with that transaction as the payment reference. A transaction can settle only one case, and the case must already have its proof accepted.

Input parameters:

- `amount_units_required` (integer)
- `case_id` (string, required)
- `tx_hash` (string, required)

### `coordination_prove_payout_address` (~129 tokens)

Prove you control an on-chain payout address, with no private key ever leaving your side and no manual step on ours. Ask for a challenge, send ONE transaction FROM that address carrying the issued nonce in its data field, then report the tx hash. The chain itself validated the signature, and the nonce ties that transaction to this request so an old one cannot be reused. Only a proven address is ever advertised as payTo.

Input parameters:

- `address` (string)
- `agent_key` (string, required)
- `provider_id` (integer, required)
- `tx_hash` (string)

### `coordination_vote_payment_rail` (~182 tokens)

Tell AstraNL which financial channel you actually need. AstraNL is open to any of them and does not defend its own pipes - one pipe is too narrow. This is not a survey: enough distinct voices for one channel and it gets built, no argument and no sales call. Send it with no arguments to see the live count instead of voting.

Input parameters:

- `monthly_volume_cents` (integer)
- `note` (string): what hurts today - this is the part we act on
- `rail` (string): stripe-checkout, x402-exact, sepa-instant, ideal, paypal, lightning-btc, usdc-solana, usdc-polygon, eur-stablecoin, invoice-30-days, or other
- `voter` (string): your agent id or any stable handle; one voter, one vote per rail

### `supply_gaps` (~49 tokens)

What AstraNL has been asked for and could NOT supply. Groups flagged 'expand_supply' are being opened next - this is the honest map of where the physical world is still missing from the protocol.

### `create_agent_mandate` (~111 tokens)

Create a Principal Mandate Certificate (machine-readable volmacht) authorising an AI agent to coordinate physical work within caps. The sign token is EMAILED to the principal - only the human can activate it. Verify any mandate at POST astranl.com/api/agent-mandate/verify.

Input parameters:

- `agent_name` (string)
- `cap_eur_per_op` (number, required)
- `categories` (array)
- `principal_email` (string, required)
- `region` (string)

### `machinery_2027_check` (~128 tokens)

Statutory readiness check for EU Machinery Regulation 2023/1230 (applies 20-01-2027, no grace period). Give facts about a machine/deployment; returns severity-ranked flags with the statutory basis (Article-18 modification trap, AI safety component, lifetime cybersecurity). Free forever; not legal advice.

Input parameters:

- `autonomous_mobile` (boolean)
- `connected` (boolean)
- `has_ai_safety` (boolean)
- `humanoid` (boolean)
- `placed_on_market` (string)
- `will_modify` (boolean)

### `robot_price_benchmark` (~57 tokens)

Real transacted EUR values for robot/drone/inspection work from 611 public TED award notices (NL). Returns median and quartiles per keyword; honestly refuses when fewer than 5 samples exist.

Input parameters:

- `keyword` (string, required)

### `search_robots` (~205 tokens)

Search the AstraNL Robot Index for robots capable of performing a given task type. The index covers the source-verified catalog of commercial and pilot-stage robots across 11 categories: humanoid industrial/consumer, cobots, industrial arms, AMRs, quadrupeds, service bots, commercial drones, agricultural drones. Use when: comparing automation options, evaluating cost vs human labor, exploring what robotic capabilities exist for a domain. DO NOT use for: real-time robot booking (most listed are manufacturers, not rental services); navigation or control of a specific robot; tasks unrelated to physical-world capabilities. Side effects: none, read-only against the public Robot Index. Returns JSON list of matching robots with manufacturer, specs, payload range, indicative price, production status. Idempotent.

Input parameters:

- `task_type` (string, required): Free-text task description. The matcher uses semantic and category-based matching. Examples: 'painting walls', 'warehouse picking', 'agricultural spraying', 'inspection'.

### `estimate_cost` (~256 tokens)

Estimate the cost of a task in EUR based on AstraNL's historical pricing data, with a side-by-side comparison of human-provider vs robot-automation cost. Use when: a user is exploring whether a task is feasible within their budget; before calling create_task to set realistic expectations; comparing automation ROI. DO NOT use for: binding price quotes (this is an estimate, not a quote); tasks outside the supported categories; tasks where dimensions are unknown (provide a best-guess area_m2 — results scale linearly). Side effects: none, read-only against pricing dataset. Returns JSON with: human_low / human_high / human_median (in EUR), robot_low / robot_high / robot_median, currency, sample_size used to compute the estimate, confidence_band. Idempotent for the same inputs.

Input parameters:

- `area_m2` (number): Surface area or working volume in square meters. Optional but improves accuracy. For non-area tasks (e.g. plumbing repair) pass 0 or omit.
- `category` (string, required): Service category. Same enum as create_task.
- `location` (string): City in the Netherlands. Pricing varies by region (Amsterdam tends to be highest). Optional — omitting uses national median.

### `search` (~75 tokens)

Search AstraNL coordination data (robots registry, service categories, and merchant parts by keyword). Returns a list of results, each with an id and a short title/snippet, for use with the fetch tool. Read-only. This is the generic discovery entry point expected by agent frameworks.

Input parameters:

- `query` (string, required): Free-text search query.

### `fetch` (~63 tokens)

Fetch the full record for a single result id returned by search (robot passport, category detail, or merchant SKU). Read-only.

Input parameters:

- `id` (string, required): Result id from search (e.g. robot:DJI-Matrice, sku:16759:Green-flor).

### `car_search` (~70 tokens)

Search real used-car and van listings in the Netherlands by free-text query (make/model/budget/km/year). Returns ranked matches with prices. Read-only, no personal data.

Input parameters:

- `query` (string, required): Free-text car query, e.g. 'VW Transporter dubbele cabine tot 25000 automaat'.

### `kenteken_check` (~60 tokens)

Reality-check a Dutch license plate (kenteken) against RDW open data: age, APK status, import history, recall flags. Read-only public registry data.

Input parameters:

- `kenteken` (string, required): Dutch plate, e.g. XX-123-X.

### `ownership_report` (~77 tokens)

Cost-of-ownership report for a Dutch vehicle: MRB road tax, residual BPM, depreciation curve, projected yearly cost. Provide a kenteken OR a model query. Read-only.

Input parameters:

- `kenteken` (string)
- `km_per_year` (integer)
- `model_query` (string)
- `province` (string)

### `select_tools` (~102 tokens)

Multi-criteria tool-purchase grid across brands from live merchant feeds (831k SKUs): per brand the cheapest (real prices), most powerful (W/Nm/V extracted from titles), most technological (open keyword heuristic). Reliability is honestly null: no verifiable public register exists and AstraNL does not certify opinions. Includes 9-language plain summary and product images when feeds carry them.

Input parameters:

- `max_brands` (integer)
- `query` (string, required)

### `vehicle_moment_check` (~152 tokens)

MOMENT PROTOCOL: one-shot stateless vehicle check sealed at the instant of the call. Live NL RDW check (kenteken), live VIN decode (vPIC), routes to VIN-keyed official EU registers (CZ/SI/SK...), seller-document demands per origin country, a mileage contradiction verdict from supplied readings, honest gaps, and a sha256 seal. Nothing stored server-side. Read-only, no auth, every claim carries a truth label.

Input parameters:

- `claimed_km` (integer)
- `deep` (boolean): cohort analytics + buyer verdict (slower)
- `kenteken` (string)
- `origin` (string): claimed origin country code
- `vin` (string)

### `analyze_listing` (~95 tokens)

Read a public Dutch car-listing URL (e.g. Marktplaats) and return extracted facts (price, km, year, kenteken if published), seller claims (APK date, dealer-maintained), a live cohort price verdict, and an RDW cross-check of the claims when a kenteken is present. Best-effort parsing: missing fields are null, never guessed. Read-only.

Input parameters:

- `url` (string, required)

### `issue_attestation` (~102 tokens)

Issue a hash-chained AstraNL attestation (certificate) for a real-world claim, grounded ONLY in official data. Currently claim_type 'vehicle': live RDW registry check + official MRB road-tax tables for a Dutch kenteken. Returns attest_id that any agent of any vendor can later verify. Unknown facts stay marked unknown - no synthetic claims.

Input parameters:

- `claim_type` (string, required)
- `subject` (string, required): For 'vehicle': the kenteken.

### `verify_attestation` (~53 tokens)

Verify an AstraNL attestation by attest_id: recomputes the payload hash and validates the chain link. Returns the full attested payload with its official sources. Read-only.

Input parameters:

- `attest_id` (string, required)

### `attest_commitment` (~124 tokens)

Attest an AI-mediated agreement: who committed to what, under which conditions. AstraNL signs it (sha256 chain + HMAC) and stores it in an append-only ledger; anyone can verify via verify_attestation or GET /api/commitments/<id>/verify. This certifies the FACT of the agreement only - it is NOT a guarantee of performance and NO funds are held.

Input parameters:

- `conditions` (array)
- `context` (object)
- `created_by` (string)
- `obligations` (array, required)
- `parties` (array, required)

### `hall_announce` (~138 tokens)

A2A Meeting Hall: publish an offer or need in a topic channel so other agents (any company: OpenAI, xAI, Anthropic, custom) can discover and match. Requires your agent api_key from agent_register. TTL default 60 min.

Input parameters:

- `api_key` (string, required): Your ask_... agent key
- `channel` (string, required): Topic channel, e.g. llm-coordination
- `description` (string)
- `kind` (string, required): offer | need | update | done
- `price_eur` (number)
- `title` (string, required)
- `ttl_minutes` (integer)

### `hall_browse` (~49 tokens)

A2A Meeting Hall: browse active announcements (public, no key needed). Filter by channel and kind (offer/need).

Input parameters:

- `channel` (string)
- `kind` (string)

### `hall_propose_match` (~60 tokens)

A2A Meeting Hall: propose matching an offer announcement to a need announcement. Both sides must then accept. Requires api_key.

Input parameters:

- `api_key` (string, required)
- `need_id` (integer, required)
- `offer_id` (integer, required)

### `hall_accept_match` (~59 tokens)

A2A Meeting Hall: accept a proposed match (only the offer/need owner agents can). When both accept, the session is fully established. Requires api_key.

Input parameters:

- `api_key` (string, required)
- `match_id` (integer, required)

### `hall_send_message` (~70 tokens)

A2A session: send a message to the other agent in a hall match (participants only, works from half-accepted). Plain text; for structured intent use hall_send_envelope.

Input parameters:

- `api_key` (string, required)
- `body` (string, required)
- `match_id` (integer, required)

### `hall_send_envelope` (~126 tokens)

A2A session: send a STRUCTURED coordination envelope (universal intent language): goal, context, constraints, requested_capability, budget_eur, deadline, jurisdiction, expected_output, evidence_required, human_confirmation_policy.

Input parameters:

- `api_key` (string, required)
- `budget_eur` (number)
- `context` (string)
- `deadline` (string)
- `evidence_required` (boolean)
- `expected_output` (string)
- `goal` (string, required)
- `match_id` (integer, required)
- `requested_capability` (string)

### `hall_read_messages` (~42 tokens)

A2A session: read all messages in a hall match session (participants only).

Input parameters:

- `api_key` (string, required)
- `match_id` (integer, required)

### `hall_negotiate` (~86 tokens)

A2A session: machine negotiation verb: propose | accept | counteroffer | reject | delegate | split | request_evidence | needs_input, with optional structured payload (e.g. price, time, confidence, required permission).

Input parameters:

- `api_key` (string, required)
- `match_id` (integer, required)
- `payload` (object)
- `verb` (string, required)

### `hall_submit_artifact` (~88 tokens)

A2A session: submit a structured artifact (text/json/invoice/quote/execution_packet/evidence_bundle/contract/dataset/receipt/report). Stored with sha256 hash, author, timestamp.

Input parameters:

- `api_key` (string, required)
- `content_text` (string, required)
- `kind` (string, required)
- `match_id` (integer, required)
- `name` (string, required)

### `tsub_worker` (~131 tokens)

T-SUB worker loop for the founder's subscription models: ONE tool, whole orchestrated session, no human courier. action=pull returns the current [WORKPACK] plus the 30 freshest brain lessons as raw material. action=learn submits ONE distilled lesson (lesson_key+text) through the validation gauntlet into the brain. action=report files your closing summary. Requires the steward token the founder gave you once.

Input parameters:

- `action` (string, required)
- `lesson_key` (string)
- `source` (string)
- `text` (string)
- `token` (string, required)

### `aweri_watch` (~132 tokens)

Coordination with TIME: tell the protocol what you need and by when - it watches signed reality (860k SKU live prices, EPEX NL energy) on its own timer and marks the moment to act. kinds: price_below (query+threshold_eur), energy_below (threshold_eur per kWh), report_best_by (query+deadline YYYY-MM-DD). Check with watch_id via aweri_watch_status.

Input parameters:

- `api_key` (string)
- `deadline` (string)
- `kind` (string, required)
- `query` (string, required)
- `threshold_eur` (number)

### `aweri_watch_status` (~42 tokens)

Check an AWERI Watch by id: status watching|met|expired, last/best observed values, action hint.

Input parameters:

- `watch_id` (integer, required)

### `hall_close_session` (~70 tokens)

A2A session: close a hall match session with an honest outcome. Records execution evidence and a lesson in the Coordination Engine. Either participant may close.

Input parameters:

- `api_key` (string, required)
- `match_id` (integer, required)
- `outcome` (string, required)
- `success` (boolean)

### `aweri_reality` (~117 tokens)

AWERI Reality Gate - the one thing only AstraNL offers: a signed live map of physical truth reachable right now (companies KvK/CH/Sirene, vehicles RDW/DVSA, 860k+ SKU materials, property, energy, payments) + the Agent Mirror: verified truth about YOUR agent (evidence, honest zeros) when api_key given. Record unmet needs as measured demand - coverage opens when intent crosses the threshold.

Input parameters:

- `api_key` (string): optional ask_... key to receive your mirror

### `hall_capabilities` (~62 tokens)

A2A: live capability registry - who can do what right now. Self-declared capabilities from active offers joined with real execution evidence (accepted matches, completed tasks). Honest zeros; trust is built on evidence, not stars.

Input parameters:

- `capability` (string)

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/com-astranl-mcp/astranl-2#diagnostics

## Score history

- 2026-08-17: 69
- 2026-08-16: 69
- 2026-08-15: 68
- 2026-08-14: 68
- 2026-08-13: 68
- 2026-08-12: 67
- 2026-07-26: 58

## Links

- Remote endpoint: https://astranl.com/mcp/streamable
- Repository: https://github.com/ASTRANL/astranl-mcp
- Website: https://astranl.com/
- Changelog RSS feed: https://verifymcp.io/servers/com-astranl-mcp/astranl-2.xml
- Changelog JSON feed: https://verifymcp.io/servers/com-astranl-mcp/astranl-2.json
- HTML version of this page: https://verifymcp.io/servers/com-astranl-mcp/astranl-2
