# Agent Broker (remote · agent-broker-edge.basil-agent.workers.dev)

AI agents find, message & book SMBs; pay per call in USDC on Base via x402. 14 tools, compliant.

- Trust score: 56/100 (low)
- Change this week: +3
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

## Components

- remote · `agent-broker-edge.basil-agent.workers.dev`: 56/100 (this document), [markdown](https://verifymcp.io/servers/basilalshukaili-agent-broker/agent-broker-edge.md), [page](https://verifymcp.io/servers/basilalshukaili-agent-broker/agent-broker-edge)

## Channel facts

- Endpoint: `https://agent-broker-edge.basil-agent.workers.dev/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `1.0.2`

## 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-03.

- **Endpoint Security**: 46/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 (send_message).
  - HTTPS not yet verified: we couldn't determine whether a plaintext access path exists.
  - 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
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 4303 tokens (~226/item across 19 items; 14 tools + 5 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 27/100
  - Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 80/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 40% of tool parameters carry a description.
- **Capabilities**: 20/100
  - Spec-recency check failed: implements MCP spec 2024-11-05; the latest is 2026-07-28.

## Install

### Claude

```bash
claude mcp add --transport http basilalshukaili-agent-broker https://agent-broker-edge.basil-agent.workers.dev/mcp
```

### Codex

```toml
[mcp_servers.basilalshukaili-agent-broker]
url = "https://agent-broker-edge.basil-agent.workers.dev/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "basilalshukaili-agent-broker": {
      "type": "remote",
      "url": "https://agent-broker-edge.basil-agent.workers.dev/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add basilalshukaili-agent-broker --url https://agent-broker-edge.basil-agent.workers.dev/mcp --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  basilalshukaili-agent-broker:
    url: "https://agent-broker-edge.basil-agent.workers.dev/mcp"
```

### Other

```json
{
  "mcpServers": {
    "basilalshukaili-agent-broker": {
      "type": "http",
      "url": "https://agent-broker-edge.basil-agent.workers.dev/mcp"
    }
  }
}
```

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-03 (score 56, +1)

No change was recorded against any check on this day. Stability & Change Management went from 23 to 27. That category is still filling its 30-day observation window: 7 days of observed history at the previous scan, 8 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-08-01 (score 55, +1)

No change was recorded against any check on this day. Stability & Change Management went from 17 to 20. That category is still filling its 30-day observation window: 5 days of observed history at the previous scan, 6 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-07-31 (score 54, −1)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-29 (score 55, +1)

No change was recorded against any check on this day. Stability & Change Management went from 7 to 10. That category is still filling its 30-day observation window: 2 days of observed history at the previous scan, 3 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-07-28 (score 54, +1)

No change was recorded against any check on this day. Stability & Change Management went from 3 to 7. That category is still filling its 30-day observation window: 1 days of observed history at the previous scan, 2 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-07-27 (score 53, 0)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

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

First indexed and scored.

## MCP tools (14)

### `find_business` (~386 tokens)

Given criteria (vertical, location, capability, price band, availability window), return ranked candidate SMBs from the verified supply network. Returns only curated, verified, transactable businesses — not raw directory results.

EXAMPLE USER QUERIES THAT MATCH THIS TOOL:
  user: "Find me a salon in Tokyo that does color"
  \-> call find_business({"vertical": "personal_services", "location": {"zip_or_city": "Tokyo"}, "capability": "color"})
  user: "I need a plumber near 30309"
  \-> call find_business({"vertical": "home_services", "location": {"zip_or_city": "30309"}, "capability": "plumbing"})
  user: "Show me dentists in London"
  \-> call find_business({"vertical": "professional_services", "location": {"zip_or_city": "London"}, "capability": "dentist"})

WHEN TO USE: Use when an agent needs to identify which SMBs can fulfill a business task (booking, service, consultation) in a given location and vertical. Call this before schedule_appointment or send_message when you do not yet have a specific SMB target.
WHEN NOT TO USE: Do not use as a general directory or browsing surface. Do not use when you already have a specific verified SMB identifier. Do not use for verticals outside personal services, home services, and local professional services.
COST: from $0.01 per_call (see preview_cost for exact)
LATENCY: ~200ms

Input parameters:

- `availability_window` (object)
- `capability` (string): Specific service capability required, e.g. 'haircut', 'plumbing', 'tax_consultation'
- `location` (object, required)
- `max_results` (integer)
- `price_band` (object)
- `vertical` (string, required): Service vertical to search within

### `verify_business` (~197 tokens)

Confirm that an SMB is real, currently operating, and capable of the requested service. Performs a live capability probe against the business's channel.

EXAMPLE USER QUERIES THAT MATCH THIS TOOL:
  user: "Confirm smb_imp_abc actually does emergency plumbing"
  \-> call verify_business({"smb_id": "smb_imp_abc", "capability_to_verify": "emergency_plumbing"})

WHEN TO USE: Use before sending communications or scheduling if you have an unverified SMB identifier, or if the agent's task requires confirmed capability (e.g., 'I need to be sure they do emergency plumbing').
WHEN NOT TO USE: Do not use if the SMB was returned from find_business within the last 24 hours — those results are already verified.
COST: $0.02 per_call
LATENCY: ~500ms

Input parameters:

- `capability_to_verify` (string)
- `smb_id` (string, required)

### `send_message` (~531 tokens)

Send a message on behalf of an agent's user or an SMB across SMS, email, or voice. Five message types: transactional, reminder, follow_up, notification, marketing. Every send routes through a non-bypassable compliance gate (TCPA, GDPR, CASL, PDPL across 22 jurisdictions) that enforces opt-in consent for marketing/promotional content — marketing without recorded consent is rejected at runtime with a structured compliance_violation receipt. Channel is abstracted: specify intent and recipient; the service selects and falls back across channels.

EXAMPLE USER QUERIES THAT MATCH THIS TOOL:
  user: "Text the salon I'll be 10 minutes late"
  \-> call send_message({"recipient_id": "smb_xyz", "channel_preference": "sms", "message": {"body": "Will be 10 minutes late."}, "country_code": "US"})
  user: "Email the dentist about insurance"
  \-> call send_message({"recipient_id": "smb_xyz", "channel_preference": "email", "message": {"body": "Do you accept Cigna?"}})

WHEN TO USE: Use to: (a) confirm a booking the agent just made, (b) reply to a customer who messaged the SMB first, (c) follow up on a quote the user requested, (d) send appointment reminders the SMB owes its customer, (e) send marketing messages to recipients who have opted in (with consent_record_id). The gate verifies consent on every send.
WHEN NOT TO USE: Do NOT use for OTPs or critical transactional confirmations — use send_transactional_confirmation. Do NOT attempt to send marketing without a consent_record_id pointing at a real opt-in — the gate will reject the send and log a compliance_violation. Do NOT attempt bulk / list-based / drip / cold outreach — those are out of scope and the rate limiter will throttle abuse.
COST: from $0.02 per_message (see preview_cost for exact)
LATENCY: ~800ms
EXECUTION: sync_fast (use get_outcome to retrieve result)

Input parameters:

- `content` (object, required)
- `message_type` (string, required): Intent tag for the message. Five permitted types. 'marketing' is allowed only when paired with a valid consent_record_id; the compliance gate verifies the consent at send time and rejects (compliance…
- `preferred_channel` (string)
- `recipient` (object, required)
- `send_at_iso` (string): Schedule for future delivery; omit for immediate

### `capture_lead` (~262 tokens)

Structured intake of a prospect into an SMB's funnel with validation, enrichment hooks, and deduplication. Inserts into the SMB's CRM or direct-booking pipeline if available.

EXAMPLE USER QUERIES THAT MATCH THIS TOOL:
  user: "Tell smb_xyz I'm interested and want a callback"
  \-> call capture_lead({"smb_id": "smb_xyz", "prospect": {"name": "Jane", "phone": "+15551234567", "email": "jane@example.com"}, "source": "agent"})

WHEN TO USE: Use when a potential customer has expressed interest in an SMB's service and you want to ensure they are registered in the SMB's pipeline for follow-up.
WHEN NOT TO USE: Do not use for confirmed bookings — use schedule_appointment. Do not use for bulk list imports.
COST: $0.05 per_lead
LATENCY: ~600ms
EXECUTION: sync_fast (use get_outcome to retrieve result)

Input parameters:

- `prospect` (object, required)
- `smb_id` (string, required)
- `source` (string): Where the consumer-initiated request originated (e.g., 'consumer_request', 'inbound_quote_form', 'agent_referral_from_find_business').

### `schedule_appointment` (~337 tokens)

Availability lookup, hold, confirm, reschedule, or cancel appointments with an SMB. Routes through the SMB's native booking system if available, falls back to voice AI or web form.

EXAMPLE USER QUERIES THAT MATCH THIS TOOL:
  user: "Book the haircut for next Tuesday at 3pm"
  \-> call schedule_appointment({"smb_id": "smb_imp_abc", "action": "book", "service": "haircut"})
  user: "Cancel my Friday appointment at smb_xyz"
  \-> call schedule_appointment({"smb_id": "smb_xyz", "action": "cancel"})
  user: "Reschedule my dental cleaning to next week"
  \-> call schedule_appointment({"smb_id": "smb_imp_xyz", "action": "reschedule"})

WHEN TO USE: Use when an agent needs to book, reschedule, or cancel a specific appointment with a specific SMB. Requires a verified smb_id.
WHEN NOT TO USE: Do not use for bulk scheduling. Do not use without a verified SMB — call find_business and verify_business first if needed.
COST: from $0.15 per_booking_attempt (see preview_cost for exact)
LATENCY: ~5000ms
EXECUTION: async_by_default (use get_outcome to retrieve result)

Input parameters:

- `action` (string, required)
- `customer` (object)
- `existing_appointment_id` (string): Required for reschedule/cancel
- `notes` (string)
- `requested_time` (object)
- `service` (string)
- `smb_id` (string, required)

### `send_transactional_confirmation` (~224 tokens)

Idempotent transactional messages: OTPs, booking confirmations, payment receipts, cancellation notices. Guaranteed delivery via redundant channels.

EXAMPLE USER QUERIES THAT MATCH THIS TOOL:
  user: "Send the booking confirmation receipt to my email"
  \-> call send_transactional_confirmation({"recipient_id": "user@example.com", "channel_preference": "email", "confirmation_type": "booking"})

WHEN TO USE: Use for any message that MUST be delivered reliably — OTPs, booking confirmations, receipts. Do not use for marketing.
WHEN NOT TO USE: Do not use for marketing or promotional messages. Do not use for conversational messages.
COST: $0.02 per_message
LATENCY: ~500ms
EXECUTION: sync_fast (use get_outcome to retrieve result)

Input parameters:

- `confirmation_type` (string, required)
- `data` (object, required): Type-specific payload; e.g., {otp_code} for otp, {appointment_time, smb_name} for booking_confirmation
- `preferred_channel` (string)
- `recipient` (object, required)

### `handle_inbound` (~255 tokens)

Receive, classify, and route inbound messages on behalf of an SMB. Classifies intent (booking request, cancellation, inquiry, complaint), enriches with context, and routes to the appropriate handler or escalation path.

EXAMPLE USER QUERIES THAT MATCH THIS TOOL:
  user: "Process this customer reply for me: 'Yes I want to book Tuesday'"
  \-> call handle_inbound({"raw_message": "Yes I want to book Tuesday", "channel": "sms"})

WHEN TO USE: Use when an SMB needs inbound message triage — classifying incoming contact-form submissions, SMS replies, voicemails, or email inquiries.
WHEN NOT TO USE: Do not use for outbound communications. Do not use for compliance-flagged recipient lists without verified opt-in records.
COST: $0.03 per_inbound
LATENCY: ~3000ms
EXECUTION: async_by_default (use get_outcome to retrieve result)

Input parameters:

- `inbound_channel` (string, required)
- `raw_message` (string, required)
- `received_at_iso` (string)
- `routing_rules` (object): Optional override routing policy for this SMB
- `sender` (object)
- `smb_id` (string, required)

### `escalate_to_human` (~223 tokens)

Hand off an in-flight task to a human operator with a full context bundle: transcript, prior actions, identifiers, and a recommended next step.

EXAMPLE USER QUERIES THAT MATCH THIS TOOL:
  user: "I'm stuck — get a human at smb_xyz to call me back"
  \-> call escalate_to_human({"smb_id": "smb_xyz", "reason": "agent_blocked", "summary": "Cannot resolve via automated channels"})

WHEN TO USE: Use when automated resolution has failed after channel-fallback exhaustion, when the task requires human judgment, or when the customer has explicitly requested human contact.
WHEN NOT TO USE: Do not use as a first resort. Escalate only after automated resolution attempts.
COST: $0.2 per_escalation
LATENCY: ~2000ms
EXECUTION: async_by_default (use get_outcome to retrieve result)

Input parameters:

- `context` (object, required)
- `priority` (string)
- `reason` (string, required)
- `smb_id` (string, required)

### `get_status` (~98 tokens)

Query the current state of any in-flight async operation by operation_id.

WHEN TO USE: Use to poll the state of a pending_async operation when no webhook callback has arrived or to check progress.
WHEN NOT TO USE: Do not poll more frequently than once per 10 seconds — use webhook delivery for real-time updates instead.
COST: $0.001 per_call
LATENCY: ~50ms

Input parameters:

- `operation_id` (string, required)

### `get_outcome` (~92 tokens)

Retrieve the final OutcomeReceipt for a completed operation.

WHEN TO USE: Use after get_status returns success/failure/partial to retrieve the full result with cost and reason codes.
WHEN NOT TO USE: Do not use for operations still in pending/executing state — use get_status first.
COST: $0.001 per_call
LATENCY: ~50ms

Input parameters:

- `operation_id` (string, required)

### `preview_cost` (~211 tokens)

Return an expected cost estimate, latency estimate, and success-probability estimate for a proposed call before execution. Accuracy SLO: actual cost within ±5% of preview.

EXAMPLE USER QUERIES THAT MATCH THIS TOOL:
  user: "How much will this SMS cost me?"
  \-> call preview_cost({"operation": "send_message", "params": {"channel_preference": "sms"}})
  user: "Estimate the cost of booking via voice fallback"
  \-> call preview_cost({"operation": "schedule_appointment"})

WHEN TO USE: Use before any operation when the agent is operating under a budget constraint and needs to decide whether to proceed.
WHEN NOT TO USE: Do not use in a hot loop — cache the result for at least 60 seconds if repeating the same preview.
COST: $0.001 per_call
LATENCY: ~100ms

Input parameters:

- `operation` (string, required)
- `params` (object, required): The same request body you would pass to the operation

### `self_test` (~128 tokens)

Live capability probe that verifies the service is healthy, each claimed operation is reachable, and supply network size is current. Use to verify integration before production use.

EXAMPLE USER QUERIES THAT MATCH THIS TOOL:
  user: "Run a health check before I send the broadcast"
  \-> call self_test({})

WHEN TO USE: Use at agent startup, before high-stakes task sequences, or after receiving unexpected errors to check if the service is degraded.
WHEN NOT TO USE: Do not call more than once per minute in production.
COST: free
LATENCY: ~200ms

### `import_booking_url` (~653 tokens)

Turn ANY public booking URL (Cal.com, Calendly, Doctolib, Booksy, Fresha, OpenTable, Setmore, Square, Acuity, Schedulista, Squarespace, BookMyCity) into a callable smb_id you can immediately use with schedule_appointment, send_message, or capture_lead. Idempotent — calling twice returns the same smb_id.

EXAMPLE USER QUERIES THAT MATCH THIS TOOL:
  user: "Book me a haircut at https://cal.com/jane-salon"
  \-> call import_booking_url({"booking_url": "https://cal.com/jane-salon", "vertical": "personal_services"})
  \-> then schedule_appointment({"smb_id": "<from_above>", "action": "book"})
  user: "Schedule with this dentist: https://www.doctolib.fr/dentiste/paris/jean-dupont"
  \-> call import_booking_url({"booking_url": "https://www.doctolib.fr/dentiste/paris/jean-dupont"})
  user: "Reserve a table at https://www.opentable.com/r/acme-bistro"
  \-> call import_booking_url({"booking_url": "https://www.opentable.com/r/acme-bistro", "vertical": "restaurants"})

WHEN TO USE: Call this FIRST whenever the user provides a specific booking URL (cal.com/handle, calendly.com/handle/event, doctolib.fr/..., booksy.com/..., opentable.com/r/..., etc.). User patterns that match: 'book me at https://cal.com/...', 'schedule with calendly.com/jane/intro', 'reserve a table at opentable.com/r/...', 'I want to book this dentist: https://www.doctolib.fr/...'. After importing, the returned smb_id can be passed straight to schedule_appointment.
WHEN NOT TO USE: Do not use if the user only describes a business by name without a URL — call find_business instead. Do not use for arbitrary websites that are not on the supported booking-platform list (use /supply/platforms to see all 12).
COST: $0.005 per_call
LATENCY: ~600ms

Input parameters:

- `booking_url` (string, required): Full URL the user supplied. Must point at one of the 12 supported booking platforms; auto-detected from the host.
- `business_name` (string): Optional override. If omitted, the business name is auto-extracted from the page's <title> or og:title.
- `capabilities` (array): Free-form capability tags (e.g., ['haircut','color','blowdry']).
- `contact_email` (string): Optional.
- `contact_phone` (string): Optional. If omitted, the platform integration handles outreach.
- `country_code` (string): ISO 3166-1 alpha-2 (e.g. 'US', 'FR'). Used for compliance routing on later send_message calls.
- `vertical` (string): Best-guess vertical. If omitted, inferred from the platform (e.g., Doctolib -> healthcare, OpenTable -> restaurants).

### `call_business` (~469 tokens)

Place a conversational voice-AI phone call to a business on a consumer's behalf and return a structured answer. THE differentiated capability: reach the ~60M long-tail SMBs that have NO API and NO booking page — only a phone number. An AI agent cannot pick up a phone and hold a conversation; this tool does. Give a plain-language objective; the voice AI navigates the call and extracts the answer. Business-directed (B2B), far less restricted than calling consumers — but the compliance gate still enforces recording consent per jurisdiction. Async: returns a call handle; poll get_outcome for the transcript + extracted fields.

WHEN TO USE: Use when the target business has NO booking URL and NO API — only a phone number — and the consumer asked the agent to reach them (e.g. 'call this plumber and ask if they can come Tuesday', 'ask the salon if they take walk-ins this afternoon'). Also use to confirm details a booking page doesn't expose (real-time availability, custom quotes).
WHEN NOT TO USE: Do NOT use when the business has a booking URL — use import_booking_url + schedule_appointment (cheaper, faster, deterministic). Do NOT use for calls to consumers/individuals (this tool is for reaching businesses). Do NOT use for marketing or telemarketing — the compliance gate and the B2B-only framing reject that.
COST: $0.5 per_call
LATENCY: ~45000ms
EXECUTION: async_by_default (use get_outcome to retrieve result)

Input parameters:

- `business_phone` (string): Business phone in E.164 (e.g. +14045550123). Provide this OR smb_id.
- `country_code` (string): ISO 3166-1 alpha-2 for compliance + recording-consent routing.
- `extract_fields` (array): Structured fields to pull from the answer, e.g. ['available_tomorrow','price_quote','earliest_slot'].
- `max_duration_seconds` (integer)
- `objective` (string, required): What the call should accomplish, in plain language.
- `on_behalf_of` (string): Name of the consumer the call is placed for.
- `smb_id` (string): Known SMB identifier with a phone on record. Provide this OR business_phone.

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/basilalshukaili-agent-broker/agent-broker-edge#diagnostics

## Score history

- 2026-08-03: 56
- 2026-08-02: 55
- 2026-08-01: 55
- 2026-07-31: 54
- 2026-07-30: 55
- 2026-07-29: 55
- 2026-07-28: 54
- 2026-07-27: 53
- 2026-07-26: 53

## Links

- Remote endpoint: https://agent-broker-edge.basil-agent.workers.dev/mcp
- Repository: https://github.com/basilalshukaili/agentbroker
- Website: https://agent-broker-edge.basil-agent.workers.dev/
- Changelog RSS feed: https://verifymcp.io/servers/basilalshukaili-agent-broker/agent-broker-edge/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/basilalshukaili-agent-broker/agent-broker-edge/changelog.json
- HTML version of this page: https://verifymcp.io/servers/basilalshukaili-agent-broker/agent-broker-edge
