{"schema_version":"verify.report.v1","generated_at":"2026-08-31T07:27:30.460102+00:00","snapshot_id":"trustsnap_b23a4ceb4079b4f5","server":{"namespace":"github-basilalshukaili","name":"agentbroker","title":"basilalshukaili/agentbroker","description":"Sanctions screening (OFAC SDN, EU Consolidated, UK Sanctions List), company verification (GLEIF, SEC EDGAR) and trade-restriction checks for AI agents, plus find/verify/message/book small businesses over WhatsApp, SMS, email and voice. 20 tools, 12 callable with no key. Non-bypassable TCPA/GDPR/CASL compliance gate, idempotent retries.","homepage_url":"https://hatchloop.dev/agent-broker/","docs_url":"https://hatchloop.dev/agent-broker/","icon_url":"https://avatars.githubusercontent.com/u/189737461?v=4","support_url":"https://github.com/basilalshukaili/agentbroker","remote_url":"https://agent-broker-edge.basil-agent.workers.dev/mcp","server_card_url":null,"latest_version":null,"current_status":"degraded","current_score":53.46,"transport_type":"streamable-http","has_oauth":true,"has_dcr":false,"has_prompts":true,"tool_count":20,"current_validation_schema_version":"8058defc70ca932c","last_validated_at":"2026-08-31T06:58:07.618318+00:00","registry_source":"github_topic_registry","registry_identifier":"github_topic_registry:basilalshukaili/agentbroker","canonical_identifier":null,"current_score_components":{"auth_operability_score":2.0,"error_contract_score":0.0,"rate_limit_semantics_score":2.0,"schema_completeness_score":3.0,"backward_compatibility_score":4.0,"slo_health_score":3.0,"security_hygiene_score":2.0,"task_success_score":4.0,"trust_confidence_score":4.0,"abuse_noise_ratio_score":4.0,"prompt_contract_score":3.0,"resource_contract_score":4.0,"discovery_metadata_score":2.0,"registry_consistency_score":2.0,"installability_score":4.0,"session_semantics_score":4.0,"tool_surface_design_score":3.0,"result_shape_stability_score":3.0,"oauth_interop_score":1.0,"recovery_semantics_score":0.0,"maintenance_signal_score":2.0,"adoption_signal_score":2.0,"freshness_confidence_score":4.0,"transport_fidelity_score":4.0,"spec_recency_score":2.0,"session_resume_score":3.0,"step_up_auth_score":3.0,"transport_compliance_score":0.0,"utility_coverage_score":0.0,"advanced_capability_coverage_score":1.0,"connector_publishability_score":1.0,"tool_snapshot_churn_score":4.0,"connector_replay_score":4.0,"request_association_score":0.0,"interactive_flow_safety_score":4.0,"action_safety_score":2.0,"official_registry_presence_score":2.0,"safety_transparency_score":2.0,"tool_capability_clarity_score":4.0,"destructive_operation_safety_score":2.0,"egress_ssrf_resilience_score":2.0,"execution_sandbox_safety_score":2.0,"data_exfiltration_resilience_score":3.0,"least_privilege_scope_score":1.0,"secret_handling_hygiene_score":3.0,"dependency_supply_chain_signal_score":0.0,"input_sanitization_safety_score":3.0,"tool_namespace_clarity_score":4.0},"capability_taxonomy":[],"machine_summary":{},"taxonomy_tags":[],"score_decomposition":[],"validation_diff":null,"tool_snapshot_diff":null,"connector_replay":{},"request_association":{},"production_readiness":{"code":"needs_remediation","label":"Needs remediation","reason":"Current validation evidence shows operational or discovery gaps that should be fixed first.","badge":"score-low","critical_alerts":0,"high_or_critical_alerts":0,"degraded_by_active_alerts":false},"recommended_for":[],"history_summary":{},"validation_timeline":[],"evidence_confidence":{"score":95.0,"label":"high","reason":"Based on 20 recent validations, 19 captured checks, and validation age of 0.5 hours.","live_check_count":19,"validation_age_hours":0.49,"basis":{"evidence_bearing_validations":20,"affirmative_live_check_count":19,"validation_age_hours":0.49,"freshness_threshold_hours":24}},"incident_feed":[],"disputes":[],"remediations":[],"client_remediation_modes":[],"client_profiles":[],"client_readiness_verdicts":[],"publishability_policy_profiles":[],"compatibility_fixtures":[],"install_snippets":{},"aliases":[],"raw_evidence":{"checks":{"probe_noise_resilience":{"status":"ok","latency_ms":532.01,"details":{"url":"https://agent-broker-edge.basil-agent.workers.dev/robots.txt","http_status":200,"headers":{"content-type":"text/plain; charset=utf-8"},"validation_disallowed":false,"consent_error":null}},"server_card":{"status":"error","latency_ms":150.11,"details":{"url":"https://agent-broker-edge.basil-agent.workers.dev/.well-known/mcp/server-card.json","error":"Client error '404 Not Found' for url 'https://agent-broker-edge.basil-agent.workers.dev/.well-known/mcp/server-card.json'\nFor more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404"}},"oauth_protected_resource":{"status":"ok","latency_ms":57.33,"details":{"url":"https://agent-broker-edge.basil-agent.workers.dev/.well-known/oauth-protected-resource","payload":{"resource":"https://hatchloop.dev","authorization_servers":[],"bearer_methods_supported":[],"resource_documentation":"https://hatchloop.dev/manifest","authentication_required":false},"http_status":200,"headers":{"content-type":"application/json"}}},"oauth_authorization_server":{"status":"missing","latency_ms":null,"details":{"reason":"no_authorization_server"}},"openid_configuration":{"status":"missing","latency_ms":null,"details":{"reason":"no_authorization_server"}},"initialize":{"status":"ok","latency_ms":14.8,"details":{"url":"https://agent-broker-edge.basil-agent.workers.dev/mcp","payload":{"jsonrpc":"2.0","id":1,"result":{"protocolVersion":"2024-11-05","serverInfo":{"name":"agent-broker","version":"0.2.10"},"capabilities":{"tools":{"listChanged":false},"resources":{"listChanged":false,"subscribe":false},"prompts":{"listChanged":false},"logging":{}},"instructions":"SMB Transaction & Communication Broker. Use tools/list to see all 20 operations. 12 of the 20 tools need no key at all; the 8 write tools require an X-Agent-Identity token in the underlying HTTP request. For state-changing operations (send_message, schedule_appointment), call preview_cost first to confirm the budget impact."}},"http_status":200,"headers":{"content-type":"application/json; charset=utf-8"}}},"protocol_version_probe":{"status":"warning","latency_ms":null,"details":{"claimed_version":"2024-11-05","validator_protocol_version":"2025-03-26","latest_known_version":"2025-11-25","releases_behind":3,"lag_days":385}},"tools_list":{"status":"ok","latency_ms":11.94,"details":{"url":"https://agent-broker-edge.basil-agent.workers.dev/mcp","payload":{"jsonrpc":"2.0","id":2,"result":{"tools":[{"name":"find_business","description":"Given criteria (vertical, location, capability, price band, availability window), return ranked candidate businesses from our supply network. THE NETWORK IS SMALL AND STILL MOSTLY SAMPLE DATA: entries that are not real are named [DEMO] and flagged is_demo - check that field before acting on a result.\n\nEXAMPLE USER QUERIES THAT MATCH THIS TOOL:\n  user: \"Find me a salon in Tokyo that does color\"\n  -> call find_business({\"vertical\": \"personal_services\", \"location\": {\"zip_or_city\": \"Tokyo\"}, \"capability\": \"color\"})\n  user: \"I need a plumber near 30309\"\n  -> call find_business({\"vertical\": \"home_services\", \"location\": {\"zip_or_city\": \"30309\"}, \"capability\": \"plumbing\"})\n  user: \"Show me dentists in London\"\n  -> call find_business({\"vertical\": \"professional_services\", \"location\": {\"zip_or_city\": \"London\"}, \"capability\": \"dentist\"})\n\nWHEN 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.\nWHEN 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.\nCOST: free - no key required\nLATENCY: ~200ms","inputSchema":{"type":"object","required":["vertical","location"],"properties":{"vertical":{"type":"string","enum":["personal_services","home_services","professional_services"],"description":"Service vertical to search within"},"location":{"type":"object","required":["zip_or_city"],"properties":{"zip_or_city":{"type":"string"},"radius_miles":{"type":"number","default":10}}},"capability":{"type":"string","description":"Specific service capability required, e.g. 'haircut', 'plumbing', 'tax_consultation'"},"price_band":{"type":"object","properties":{"max_usd":{"type":"number"}}},"availability_window":{"type":"object","properties":{"start_iso":{"type":"string","format":"date-time"},"end_iso":{"type":"string","format":"date-time"}},"description":"Accepted but NOT APPLIED - it does not narrow results. We do not hold live calendars for the supply network. The response carries availability_window_applied: false when you send one. To book a specific slot use schedule_appointment with requested_time, which checks real availability."},"max_results":{"type":"integer","default":5,"maximum":20}}},"annotations":{"title":"Find Business","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"verify_business","description":"Look up what we know about a business in our supply network: its contact channels, capabilities, and when the record was last verified. This is a DIRECTORY LOOKUP - it does not contact the business.\n\nEXAMPLE USER QUERIES THAT MATCH THIS TOOL:\n  user: \"Confirm smb_imp_abc actually does emergency plumbing\"\n  -> call verify_business({\"smb_id\": \"smb_imp_abc\", \"capability_to_verify\": \"emergency_plumbing\"})\n\nWHEN 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').\nWHEN NOT TO USE: Do not use if the SMB was returned from find_business within the last 24 hours — those results are already verified.\nCOST: free - no key required\nLATENCY: ~500ms","inputSchema":{"type":"object","required":["smb_id"],"properties":{"smb_id":{"type":"string"},"capability_to_verify":{"type":"string"}}},"annotations":{"title":"Verify Business","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"send_message","description":"Send a message on behalf of an agent's user or an SMB across WhatsApp (free during launch), 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 26 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.\n\nEXAMPLE USER QUERIES THAT MATCH THIS TOOL:\n  user: \"Text the salon I'll be 10 minutes late\"\n  -> call send_message({\"recipient\": {\"id_type\": \"smb_id\", \"id_value\": \"smb_xyz\"}, \"message_type\": \"notification\", \"content\": {\"body\": \"Running about 10 minutes late for my appointment.\"}, \"preferred_channel\": \"sms\"})\n  user: \"Email the dentist about insurance\"\n  -> call send_message({\"recipient\": {\"id_type\": \"email\", \"id_value\": \"front-desk@example-dental.com\"}, \"message_type\": \"transactional\", \"content\": {\"body\": \"Do you accept Cigna insurance?\"}, \"preferred_channel\": \"email\"})\n\nWHEN 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.\nWHEN 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.\nCOST: from $0.02 per_call_variable (see preview_cost for exact)\nLATENCY: ~800ms\nEXECUTION: sync_fast (use get_outcome to retrieve result)","inputSchema":{"type":"object","required":["recipient","message_type","content"],"properties":{"recipient":{"type":"object","required":["id_type","id_value"],"properties":{"id_type":{"type":"string","enum":["phone","email","smb_id","customer_id"]},"id_value":{"type":"string"},"country_code":{"type":"string","description":"ISO 3166-1 alpha-2, required for compliance routing"}}},"message_type":{"type":"string","description":"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_violation receipt) if it's missing, expired, or revoked.","enum":["transactional","marketing","reminder","follow_up","notification"]},"content":{"type":"object","required":["body"],"properties":{"body":{"type":"string"},"subject":{"type":"string","description":"For email channel"},"template_id":{"type":"string"},"template_vars":{"type":"object"}}},"preferred_channel":{"type":"string","enum":["whatsapp","sms","email","voice","auto"],"default":"auto"},"send_at_iso":{"type":"string","format":"date-time","description":"NOT SUPPORTED YET. We do not schedule messages. Supplying a time more than 2 minutes in the future is REFUSED (reason_code scheduling_not_supported) rather than sent immediately, which is what used to happen. Call send_message at the moment you want delivery, or omit this field."},"on_behalf_of":{"type":"string","description":"Who this message is FOR (your end-user's name/label). On WhatsApp this opens a tracked conversation and travels in-message as '#4821 for Sara (via HatchLoop)', so the business knows who it is talking to and their reply is matched back to this exact request instead of guessed. Strongly recommended for two-way channels."},"business_id":{"type":"string","description":"Optional stable id for the recipient business. Enables global demand shaping (we rate-limit total inbound across ALL agents so businesses stay responsive instead of blocking us)."},"idempotency_key":{"type":"string","maxLength":128,"description":"Optional client-supplied key for safe retries. Replaying the same key within 24h returns the original receipt - the operation is NOT re-executed and NOT re-charged."}}},"annotations":{"title":"Send Message","readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":true}},{"name":"capture_lead","description":"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.\n\nEXAMPLE USER QUERIES THAT MATCH THIS TOOL:\n  user: \"Tell smb_xyz I'm interested and want a callback\"\n  -> call capture_lead({\"smb_id\": \"smb_xyz\", \"prospect\": {\"name\": \"Jane\", \"phone\": \"+15551234567\", \"email\": \"jane@example.com\"}, \"source\": \"agent\"})\n\nWHEN 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.\nWHEN NOT TO USE: Do not use for confirmed bookings — use schedule_appointment. Do not use for bulk list imports.\nCOST: $0.05 per_call\nLATENCY: ~600ms\nEXECUTION: sync_fast (use get_outcome to retrieve result)","inputSchema":{"type":"object","required":["smb_id","prospect"],"properties":{"smb_id":{"type":"string"},"prospect":{"type":"object","required":["name"],"properties":{"name":{"type":"string"},"phone":{"type":"string"},"email":{"type":"string","format":"email"},"service_interest":{"type":"string"},"notes":{"type":"string"},"consent_record_id":{"type":"string","description":"Optional ID of a consent record proving the prospect asked to be contacted (e.g., they filled an SMB's intake form or requested a quote). Required when downstream send_message calls are anticipated."}}},"source":{"type":"string","description":"Where the consumer-initiated request originated (e.g., 'consumer_request', 'inbound_quote_form', 'agent_referral_from_find_business')."},"idempotency_key":{"type":"string","maxLength":128,"description":"Optional client-supplied key for safe retries. Replaying the same key within 24h returns the original receipt - the operation is NOT re-executed and NOT re-charged."}}},"annotations":{"title":"Capture Lead","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}},{"name":"schedule_appointment","description":"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.\n\nEXAMPLE USER QUERIES THAT MATCH THIS TOOL:\n  user: \"Book the haircut for next Tuesday at 3pm\"\n  -> call schedule_appointment({\"smb_id\": \"smb_imp_abc\", \"action\": \"book\", \"service\": \"haircut\"})\n  user: \"Cancel my Friday appointment at smb_xyz\"\n  -> call schedule_appointment({\"smb_id\": \"smb_xyz\", \"action\": \"cancel\"})\n  user: \"Reschedule my dental cleaning to next week\"\n  -> call schedule_appointment({\"smb_id\": \"smb_imp_xyz\", \"action\": \"reschedule\"})\n\nWHEN TO USE: Use when an agent needs to book, reschedule, or cancel a specific appointment with a specific SMB. Requires a verified smb_id.\nWHEN 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.\nCOST: from $0.15 per_call_variable (see preview_cost for exact)\nLATENCY: ~5000ms\nEXECUTION: async_by_default (use get_outcome to retrieve result)","inputSchema":{"type":"object","required":["smb_id","action"],"properties":{"smb_id":{"type":"string"},"action":{"type":"string","enum":["book","reschedule","cancel","check_availability"]},"service":{"type":"string"},"customer":{"type":"object","properties":{"name":{"type":"string"},"phone":{"type":"string"},"email":{"type":"string"}}},"requested_time":{"type":"object","properties":{"preferred_iso":{"type":"string","format":"date-time"},"window_start_iso":{"type":"string","format":"date-time"},"window_end_iso":{"type":"string","format":"date-time"},"duration_minutes":{"type":"integer"}}},"existing_appointment_id":{"type":"string","description":"Required for reschedule/cancel"},"notes":{"type":"string"},"idempotency_key":{"type":"string","maxLength":128,"description":"Optional client-supplied key for safe retries. Replaying the same key within 24h returns the original receipt - the operation is NOT re-executed and NOT re-charged."}}},"annotations":{"title":"Schedule Appointment","readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":true}},{"name":"send_transactional_confirmation","description":"Idempotent transactional messages: OTPs, booking confirmations, payment receipts, cancellation notices. Falls back across configured channels; an unconfigured channel fails honestly rather than reporting a delivery that did not happen.\n\nEXAMPLE USER QUERIES THAT MATCH THIS TOOL:\n  user: \"Send the booking confirmation receipt to my email\"\n  -> call send_transactional_confirmation({\"recipient\": {\"id_type\": \"email\", \"id_value\": \"customer@example.com\"}, \"confirmation_type\": \"booking_confirmation\", \"data\": {\"appointment_time\": \"2026-09-03T15:00:00Z\", \"business_name\": \"Salon 718\"}, \"preferred_channel\": \"email\"})\n\nWHEN TO USE: Use for any message that MUST be delivered reliably — OTPs, booking confirmations, receipts. Do not use for marketing.\nWHEN NOT TO USE: Do not use for marketing or promotional messages. Do not use for conversational messages.\nCOST: $0.02 per_call\nLATENCY: ~500ms\nEXECUTION: sync_fast (use get_outcome to retrieve result)","inputSchema":{"type":"object","required":["recipient","confirmation_type","data"],"properties":{"recipient":{"type":"object","required":["phone_or_email"],"properties":{"phone_or_email":{"type":"string"},"name":{"type":"string"}}},"confirmation_type":{"type":"string","enum":["otp","booking_confirmation","payment_receipt","cancellation_notice","reminder"]},"data":{"type":"object","description":"Type-specific payload; e.g., {otp_code} for otp, {appointment_time, smb_name} for booking_confirmation"},"preferred_channel":{"type":"string","enum":["sms","email","auto"],"default":"sms"},"idempotency_key":{"type":"string","maxLength":128,"description":"Optional client-supplied key for safe retries. Replaying the same key within 24h returns the original receipt - the operation is NOT re-executed and NOT re-charged."}}},"annotations":{"title":"Send Transactional Confirmation","readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false}},{"name":"handle_inbound","description":"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.\n\nEXAMPLE USER QUERIES THAT MATCH THIS TOOL:\n  user: \"Process this customer reply for me: 'Yes I want to book Tuesday'\"\n  -> call handle_inbound({\"smb_id\": \"smb_xyz\", \"inbound_channel\": \"sms\", \"raw_message\": \"Yes I want to book Tuesday\"})\n\nWHEN TO USE: Use when an SMB needs inbound message triage — classifying incoming contact-form submissions, SMS replies, voicemails, or email inquiries.\nWHEN NOT TO USE: Do not use for outbound communications. Do not use for compliance-flagged recipient lists without verified opt-in records.\nCOST: $0.03 per_call\nLATENCY: ~3000ms\nEXECUTION: async_by_default (use get_outcome to retrieve result)","inputSchema":{"type":"object","required":["smb_id","inbound_channel","raw_message"],"properties":{"smb_id":{"type":"string"},"inbound_channel":{"type":"string","enum":["sms","email","voice_voicemail","web_form","api"]},"sender":{"type":"object","properties":{"phone":{"type":"string"},"email":{"type":"string"},"name":{"type":"string"}}},"raw_message":{"type":"string"},"received_at_iso":{"type":"string","format":"date-time"},"routing_rules":{"type":"object","description":"Optional override routing policy for this SMB"},"idempotency_key":{"type":"string","maxLength":128,"description":"Optional client-supplied key for safe retries. Replaying the same key within 24h returns the original receipt - the operation is NOT re-executed and NOT re-charged."}}},"annotations":{"title":"Handle Inbound","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}},{"name":"escalate_to_human","description":"Hand off an in-flight task to a human operator with a full context bundle: transcript, prior actions, identifiers, and a recommended next step.\n\nEXAMPLE USER QUERIES THAT MATCH THIS TOOL:\n  user: \"I'm stuck — get a human at smb_xyz to call me back\"\n  -> call escalate_to_human({\"smb_id\": \"smb_xyz\", \"reason\": \"automation_failed\", \"context\": {\"original_operation\": \"schedule_appointment\", \"recommended_next_step\": \"Call the business directly to confirm the slot\"}, \"priority\": \"urgent\"})\n\nWHEN 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.\nWHEN NOT TO USE: Do not use as a first resort. Escalate only after automated resolution attempts.\nCOST: $0.2 per_call\nLATENCY: ~2000ms\nEXECUTION: async_by_default (use get_outcome to retrieve result)","inputSchema":{"type":"object","required":["smb_id","reason","context"],"properties":{"smb_id":{"type":"string"},"reason":{"type":"string","enum":["automation_failed","customer_requested","compliance_hold","ambiguous_intent","exception_required"]},"context":{"type":"object","properties":{"original_operation":{"type":"string"},"operation_id":{"type":"string"},"transcript":{"type":"array","items":{"type":"object"}},"prior_actions":{"type":"array","items":{"type":"object"}},"recommended_next_step":{"type":"string"}}},"priority":{"type":"string","enum":["normal","urgent"],"default":"normal"},"idempotency_key":{"type":"string","maxLength":128,"description":"Optional client-supplied key for safe retries. Replaying the same key within 24h returns the original receipt - the operation is NOT re-executed and NOT re-charged."}}},"annotations":{"title":"Escalate To Human","readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false}},{"name":"get_status","description":"Query the current state of any in-flight async operation by operation_id.\n\nWHEN TO USE: Use to poll the state of a pending_async operation when no webhook callback has arrived or to check progress.\nWHEN NOT TO USE: Do not poll more frequently than once per 10 seconds — use webhook delivery for real-time updates instead.\nCOST: free - no key required\nLATENCY: ~50ms","inputSchema":{"type":"object","required":["operation_id"],"properties":{"operation_id":{"type":"string"}}},"annotations":{"title":"Get Status","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"get_outcome","description":"Retrieve the final OutcomeReceipt for a completed operation.\n\nWHEN TO USE: Use after get_status returns success/failure/partial to retrieve the full result with cost and reason codes.\nWHEN NOT TO USE: Do not use for operations still in pending/executing state — use get_status first.\nCOST: free - no key required\nLATENCY: ~50ms","inputSchema":{"type":"object","required":["operation_id"],"properties":{"operation_id":{"type":"string"}}},"annotations":{"title":"Get Outcome","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"preview_cost","description":"Return an expected cost estimate, latency estimate, and success-probability estimate for a proposed call before execution. Returns the exact price when it is fixed, and a min/max range when the cost depends on channel or outcome. It does not promise an accuracy percentage - check cost_range.\n\nEXAMPLE USER QUERIES THAT MATCH THIS TOOL:\n  user: \"How much will this SMS cost me?\"\n  -> call preview_cost({\"operation\": \"send_message\", \"params\": {\"preferred_channel\": \"sms\"}})\n  user: \"Estimate the cost of booking via voice fallback\"\n  -> call preview_cost({\"operation\": \"schedule_appointment\", \"params\": {\"preferred_channel\": \"voice\"}})\n\nWHEN TO USE: Use before any operation when the agent is operating under a budget constraint and needs to decide whether to proceed.\nWHEN NOT TO USE: Do not use in a hot loop — cache the result for at least 60 seconds if repeating the same preview.\nCOST: free - no key required\nLATENCY: ~100ms","inputSchema":{"type":"object","required":["operation","params"],"properties":{"operation":{"type":"string"},"params":{"type":"object","description":"The same request body you would pass to the operation"}}},"annotations":{"title":"Preview Cost","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"self_test","description":"Service health probe: runs 6 internal checks and reports how many passed. Confirms the server is up and responding - it does NOT probe each tool individually. Use to verify connectivity before production use.\n\nEXAMPLE USER QUERIES THAT MATCH THIS TOOL:\n  user: \"Run a health check before I send the broadcast\"\n  -> call self_test({})\n\nWHEN TO USE: Use at agent startup, before high-stakes task sequences, or after receiving unexpected errors to check if the service is degraded.\nWHEN NOT TO USE: Do not call more than once per minute in production.\nCOST: free - no key required\nLATENCY: ~200ms","inputSchema":{"type":"object","properties":{}},"annotations":{"title":"Self Test","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"check_booking_link","description":"Free, instant pre-flight check for a booking URL. Classifies which booking platform a URL belongs to and tells you whether import_booking_url will accept it, WITHOUT fetching the page or spending money. Returns the platform, the exact smb_id import_booking_url would assign, the channels the booking will route through, and the inferred country. Use it to de-risk a paid booking BEFORE calling import_booking_url + schedule_appointment.\n\nEXAMPLE USER QUERIES THAT MATCH THIS TOOL:\n  user: \"Is this a bookable link? https://cal.com/jane\"\n  -> call check_booking_link({\"url\": \"https://cal.com/jane\"})\n  -> then import_booking_url({\"booking_url\": \"https://cal.com/jane\"})\n  user: \"Can you book me here: https://www.opentable.com/r/acme-bistro\"\n  -> call check_booking_link({\"url\": \"https://www.opentable.com/r/acme-bistro\"})\n\nWHEN TO USE: Call this the moment a user pastes a URL and you are not sure it is a bookable page, or before you commit to a paid schedule_appointment. It is free and sub-100ms, so run it as a guard: if supported=true, proceed to import_booking_url with confidence; if supported=false, fall back to find_business or call_business instead of wasting a booking attempt.\nWHEN NOT TO USE: Do not use to confirm the page is currently live/available — this tool does not fetch the URL, it only classifies its shape. It is not a substitute for import_booking_url (which actually registers the business) or verify_business (which confirms an already-imported smb_id).\nCOST: free - no key required\nLATENCY: ~20ms","inputSchema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","description":"Full http(s) URL to classify, e.g. 'https://cal.com/jane' or 'https://www.opentable.com/r/acme'."}}},"annotations":{"title":"Check Booking Link","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"import_booking_url","description":"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.\n\nEXAMPLE USER QUERIES THAT MATCH THIS TOOL:\n  user: \"Book me a haircut at https://cal.com/jane-salon\"\n  -> call import_booking_url({\"booking_url\": \"https://cal.com/jane-salon\", \"vertical\": \"personal_services\"})\n  -> then schedule_appointment({\"smb_id\": \"<from_above>\", \"action\": \"book\"})\n  user: \"Schedule with this dentist: https://www.doctolib.fr/dentiste/paris/jean-dupont\"\n  -> call import_booking_url({\"booking_url\": \"https://www.doctolib.fr/dentiste/paris/jean-dupont\"})\n  user: \"Reserve a table at https://www.opentable.com/r/acme-bistro\"\n  -> call import_booking_url({\"booking_url\": \"https://www.opentable.com/r/acme-bistro\", \"vertical\": \"restaurants\"})\n\nWHEN 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.\nWHEN 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).\nCOST: free (no credits) - but requires a free email-verified key\nLATENCY: ~600ms","inputSchema":{"type":"object","required":["booking_url"],"properties":{"booking_url":{"type":"string","format":"uri","description":"Full URL the user supplied. Must point at one of the 12 supported booking platforms; auto-detected from the host."},"business_name":{"type":"string","description":"Optional override. If omitted, the business name is auto-extracted from the page's <title> or og:title."},"vertical":{"type":"string","enum":["personal_services","home_services","professional_services","restaurants","retail","healthcare","fitness"],"description":"Best-guess vertical. If omitted, inferred from the platform (e.g., Doctolib -> healthcare, OpenTable -> restaurants)."},"country_code":{"type":"string","description":"ISO 3166-1 alpha-2 (e.g. 'US', 'FR'). Used for compliance routing on later send_message calls."},"contact_phone":{"type":"string","description":"Optional. If omitted, the platform integration handles outreach."},"contact_email":{"type":"string","description":"Optional."},"capabilities":{"type":"array","items":{"type":"string"},"description":"Free-form capability tags (e.g., ['haircut','color','blowdry'])."},"idempotency_key":{"type":"string","maxLength":128,"description":"Optional client-supplied key for safe retries. Replaying the same key within 24h returns the original receipt - the operation is NOT re-executed and NOT re-charged."}}},"annotations":{"title":"Import Booking Url","readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"call_business","description":"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.\n\nWHEN 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).\nWHEN 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.\nCOST: $0.2 per_call\nLATENCY: ~45000ms\nEXECUTION: async_by_default (use get_outcome to retrieve result)","inputSchema":{"type":"object","required":["objective"],"properties":{"business_phone":{"type":"string","description":"Business phone in E.164 (e.g. +14045550123). Provide this OR smb_id."},"smb_id":{"type":"string","description":"Known SMB identifier with a phone on record. Provide this OR business_phone."},"objective":{"type":"string","description":"What the call should accomplish, in plain language."},"extract_fields":{"type":"array","items":{"type":"string"},"description":"Structured fields to pull from the answer, e.g. ['available_tomorrow','price_quote','earliest_slot']."},"country_code":{"type":"string","description":"ISO 3166-1 alpha-2 for compliance + recording-consent routing."},"on_behalf_of":{"type":"string","description":"Name of the consumer the call is placed for."},"max_duration_seconds":{"type":"integer","maximum":600,"default":180},"idempotency_key":{"type":"string","maxLength":128,"description":"Optional client-supplied key for safe retries. Replaying the same key within 24h returns the original receipt - the operation is NOT re-executed and NOT re-charged."}}},"annotations":{"title":"Call Business","readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":true}},{"name":"check_compliance","description":"Free, instant pre-flight for the compliance gate. Runs the SAME TCPA / GDPR / CASL / CAN-SPAM / 10DLC gate that send_message and call_business run — but in preview mode, so NO message is sent and NO state changes. Tells you whether a (recipient, channel, message_type, content) send would be permitted BEFORE you pay for it, and if not, names the exact rule and how to remediate. Use it to de-risk a paid send the same way check_booking_link de-risks a paid booking.\n\nEXAMPLE USER QUERIES THAT MATCH THIS TOOL:\n  user: \"Is it legal to text this US number a 20%-off promo?\"\n  -> call check_compliance({\"recipient_id\": \"+14045550200\", \"content\": \"20% off this week only!\", \"channel\": \"sms\", \"message_type\": \"marketing\", \"country_code\": \"US\"})\n  user: \"Before you email the dentist, make sure it's allowed\"\n  -> call check_compliance({\"recipient_id\": \"office@dentist.example\", \"content\": \"Do you accept Cigna? Following up on my request.\", \"message_type\": \"follow_up\"})\n  -> then send_message({\"recipient\": {\"id_type\": \"email\", \"id_value\": \"office@dentist.example\"}, \"message_type\": \"follow_up\", \"content\": {\"body\": \"Do you accept Cigna? Following up on my request.\"}})\n\nWHEN TO USE: Call this the moment before send_message or call_business when there is any chance the send is regulated — anything tagged marketing, any SMS to a US number (10DLC), any message to an EU/UK (GDPR) or Canadian (CASL) recipient, or any content you are unsure about. It is free and sub-100ms, so run it as a guard: if legal=true, proceed to send_message with confidence; if legal=false, fix the cited blocker instead of burning a paid, rejected send.\nWHEN NOT TO USE: Do not treat a legal=true as a permanent license — the gate re-runs at send time, so a fresh opt-out between preview and send still blocks. Do not use it to check two-party voice recording consent (that is evaluated at call time in the voice adapter, not here). It is not a substitute for send_message; it never delivers anything.\nCOST: free - no key required\nLATENCY: ~15ms","inputSchema":{"type":"object","required":["recipient_id","content"],"properties":{"recipient_id":{"type":"string","description":"Phone in E.164 (e.g. '+14045550100') or email address the message would go to."},"content":{"type":"string","description":"The actual message body you intend to send. The gate classifies the real text, so a meaningful preview needs the real content."},"channel":{"type":"string","enum":["sms","email","voice"],"description":"Delivery channel. Omit to auto-infer sms/email from recipient_id; set 'voice' explicitly."},"message_type":{"type":"string","description":"Intent tag: transactional, marketing, reminder, follow_up, notification. 'marketing' triggers the consent checks. Defaults to transactional.","default":"transactional"},"country_code":{"type":"string","description":"ISO 3166-1 alpha-2 (e.g. 'US', 'DE', 'CA'). Auto-inferred from phone if omitted; drives which jurisdiction rules apply."},"state_code":{"type":"string","description":"US state code (e.g. 'CA') for state-specific rules."}}},"annotations":{"title":"Check Compliance","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"verify_company_record","description":"Free, live lookup of a company official registry record. Queries the GLEIF global LEI registry (primary, 2.6 million legal entities worldwide) and SEC EDGAR (US public companies) to return the official legal name, LEI, entity status, jurisdiction, registered address, and registry authority. Never fabricates: if the company is not found in these free registries, returns an honest not_found with the sources that were queried.\n\nEXAMPLE USER QUERIES THAT MATCH THIS TOOL:\n  user: \"Is Apple Inc a real registered company?\"\n  -> call verify_company_record({\"name\": \"Apple Inc\", \"country\": \"US\"})\n  user: \"Look up the LEI for Volkswagen AG\"\n  -> call verify_company_record({\"name\": \"Volkswagen AG\", \"country\": \"DE\"})\n  user: \"Verify this LEI: 529900HNOAA1KXQJUQ27\"\n  -> call verify_company_record({\"name\": \"Volkswagen AG\", \"lei\": \"529900HNOAA1KXQJUQ27\"})\n\nWHEN TO USE: Use when you need to verify that a company exists as a registered legal entity and retrieve its official registry details -- before signing a contract, qualifying a vendor, validating a counterparty, or populating a due-diligence record. Accepts a legal name plus optional country filter or a direct LEI for a precise lookup.\nWHEN NOT TO USE: Do not use to verify private companies not registered with GLEIF or SEC. Do not use as an exhaustive fraud-detection tool; this is a first-pass existence check against free public registries, not a full KYC screen.\nCOST: free within the daily quota, then $0.02 per call\nLATENCY: ~800ms","inputSchema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","description":"Legal company name to look up, e.g. Apple Inc or Volkswagen AG."},"country":{"type":"string","description":"Optional ISO 3166-1 alpha-2 country filter (e.g. US, DE, GB). Narrows GLEIF results to one jurisdiction."},"lei":{"type":"string","description":"Optional 20-character Legal Entity Identifier for a direct, precise lookup."}}},"annotations":{"title":"Verify Company Record","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"screen_sanctions","description":"Free screening of a name or entity against official sanctions lists, each fetched from the authority that issues it: the OFAC SDN list from the US Treasury (SDN.CSV plus ALT.CSV for alternate spellings), the EU consolidated financial sanctions list from the European Commission, and the UK Sanctions List from the FCDO. THE UN CONSOLIDATED LIST IS NOT SCREENED -- it carries no licence permitting commercial redistribution, so we do not claim it. ALWAYS check lists_screened on the response: it names the lists that actually ran ON THAT CALL, and a list that failed to load appears in sources_unavailable instead. reason_code is 'partial_screening' whenever any source was unavailable, never 'clear'. Returns screening_status ('hit' | 'clean' | 'candidates' | 'not_screened' -- branch on THIS, not on matched, because matched:false is also false when nothing could be screened), matched: bool, a list of matches with score, program, and source URL, and which lists were screened. Never fabricates a match or a clear -- if no match is found, explicitly names which lists were checked.\n\nEXAMPLE USER QUERIES THAT MATCH THIS TOOL:\n  user: \"Screen this vendor before we pay them: ACME Trading LLC, Russia\"\n  -> call screen_sanctions({\"name\": \"ACME Trading LLC\", \"country\": \"RU\", \"type\": \"entity\"})\n  user: \"Is Kim Jong-un on the OFAC list?\"\n  -> call screen_sanctions({\"name\": \"Kim Jong-un\", \"country\": \"KP\", \"type\": \"person\"})\n  user: \"Run a sanctions check on this person before onboarding\"\n  -> call screen_sanctions({\"name\": \"Ivan Petrov\", \"country\": \"RU\", \"type\": \"person\"})\n  user: \"Do a compliance check -- is this company sanctioned?\"\n  -> call screen_sanctions({\"name\": \"Mahan Air\", \"country\": \"IR\", \"type\": \"entity\"})\n\nWHEN TO USE: Use before onboarding a counterparty, processing a payment, engaging a vendor, or doing any due-diligence step that requires knowing whether a person or entity appears on official sanctions lists. Essential for agents doing business formation, vendor qualification, payments onboarding, trade compliance, or any workflow where a sanctioned counterparty is a legal or reputational risk.\nWHEN NOT TO USE: Do not use as a substitute for full KYC/AML screening -- this covers sanctions lists only, not PEP (Politically Exposed Person) databases, adverse media, or credit risk. Do not treat a negative result as a compliance clearance; it is informational only. Do not use for bulk screening of large lists -- each call is a live API query.\nCOST: free within the daily quota, then $0.02 per call\nLATENCY: ~2000ms","inputSchema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","description":"Full name of the person or entity to screen, e.g. 'Kim Jong-un' or 'ACME Trading LLC'. Use the most complete name available for best accuracy."},"country":{"type":"string","description":"Optional ISO 3166-1 alpha-2 country code or country name (e.g. 'IR', 'Iran'). It ANNOTATES AND RANKS results; it never removes any. Each EU/UK match carries country_match: true, false, or null when the listing records no country. Nothing is dropped on a mismatch, because the country we hold is the address/nationality on the listing rather than everywhere a party operates - excluding on it would return a clean screen for someone who IS listed."},"type":{"type":"string","enum":["person","entity"],"description":"Optional entity type hint. 'person' for individuals, 'entity' for organizations/companies. Omit to screen both."}}},"annotations":{"title":"Screen Sanctions","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"map_trade_restriction","description":"Free cross-border trade screening of the DESTINATION and the PARTIES. IT DOES NOT CLASSIFY THE PRODUCT: the product argument is recorded and echoed back, never checked against any export-control list, so a controlled item to an unrestricted destination returns no findings and reason_code 'partial' -- never 'clear'. This is not an export-control clearance; classify the item (HS/ECCN) against BIS/EU/UK controls yourself. Given a product and destination country (and optionally an HS code, origin country, and a list of parties to screen), returns: (a) whether the destination or any party hits an export-control or sanctions restriction, (b) the destination risk level (comprehensive_embargo / sectoral_sanctions / elevated_scrutiny / standard), (c) HS code hint if the caller provided one, (d) honest tariff guidance + official links without fabricated rates, and (e) party sanctions screening against OFAC SDN (US Treasury), the EU Consolidated list (European Commission) and the UK Sanctions List (FCDO). Acts as a MIDDLEMAN -- unifies the OFAC comprehensive-embargo map, our own indexed copies of the EU and UK lists, and OFAC SDN into one clean call. Never fabricates a tariff rate, a clear, or a restricted status.\n\nEXAMPLE USER QUERIES THAT MATCH THIS TOOL:\n  user: \"Can we ship laptops to Iran?\"\n  -> call map_trade_restriction({\"product\": \"laptop computers\", \"destination_country\": \"IR\"})\n  user: \"Screen this supplier before we import from them: Mahan Air, Iran\"\n  -> call map_trade_restriction({\"product\": \"aircraft parts\", \"destination_country\": \"US\", \"parties\": [\"Mahan Air\"]})\n  user: \"Is exporting hydraulic pumps to Russia restricted?\"\n  -> call map_trade_restriction({\"product\": \"hydraulic pumps\", \"hs_code\": \"8413.50\", \"destination_country\": \"RU\"})\n  user: \"Check if we can sell medical devices to Germany, supplier is ACME GmbH\"\n  -> call map_trade_restriction({\"product\": \"medical devices\", \"origin_country\": \"US\", \"destination_country\": \"DE\", \"parties\": [\"ACME GmbH\"]})\n\nWHEN TO USE: Use before any cross-border trade to flag embargoed destinations, screen exporters/importers/freight forwarders against sanctions lists, and get authoritative links to the applicable tariff databases. Call this as a pre-flight check before quoting, invoicing, or shipping internationally. Covers OFAC comprehensively-embargoed countries (Iran, North Korea, Cuba, Syria) and significant advisory countries (Russia, Belarus, Ukraine Crimea/DNR/LNR regions).\nWHEN NOT TO USE: Do NOT use as a substitute for a licensed export compliance review. Do NOT use to obtain authoritative tariff rates (this tool returns guidance links, never fabricated rates). Do NOT use for purely domestic shipments where no cross-border movement is involved.\nCOST: free within the daily quota, then $0.02 per call\nLATENCY: ~3000ms","inputSchema":{"type":"object","required":["product","destination_country"],"properties":{"product":{"type":"string","description":"Product name or description, e.g. 'laptop computers', 'crude oil', 'medical devices'. Used in the tariff guidance note."},"hs_code":{"type":"string","description":"Optional Harmonized System code (e.g. '8471.30' for laptops). If provided, echoed back and included in tariff guidance. Not derived -- caller must supply the official HS code."},"origin_country":{"type":"string","description":"Optional ISO 3166-1 alpha-2 code for the exporting country (e.g. 'US', 'DE'). Used in the tariff guidance note."},"destination_country":{"type":"string","description":"ISO 3166-1 alpha-2 code for the importing country (e.g. 'IR', 'CA', 'DE'). Required. Checked against the OFAC comprehensive-embargo map and sectoral-sanctions advisory list."},"parties":{"type":"array","items":{"type":"string"},"description":"Optional list of party names to screen (exporter, importer, freight forwarder, end-user, etc.). Each name is screened against OFAC SDN (US Treasury), the EU Consolidated list (European Commission) and the UK Sanctions List (FCDO)."}}},"annotations":{"title":"Map Trade Restriction","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"get_conversation","description":"Read a two-way conversation thread you started: its state, every message exchanged, and how many replies the business has sent.\n\nEXAMPLE USER QUERIES THAT MATCH THIS TOOL:\n  user: \"Did the salon reply about Sara's booking?\"\n  -> call get_conversation({\"conversation_id\": \"conv_1a2b3c4d\"})\n  user: \"Check request 4821 with that barber\"\n  -> call get_conversation({\"reference\": \"4821\", \"business_number\": \"96890000001\"})\n\nWHEN TO USE: After send_message with on_behalf_of returns a conversation_id, poll this to read the business's reply. Replies are matched to the right thread exactly (never guessed), so what you read here belongs to YOUR end-user.\nWHEN NOT TO USE: Do not poll more often than every 10 seconds.\nCOST: free - no key required\nLATENCY: ~300ms","inputSchema":{"type":"object","properties":{"conversation_id":{"type":"string","description":"From the send_message receipt (preferred)."},"reference":{"type":"string","description":"The 4-digit request reference, e.g. '4821'. Requires business_number."},"business_number":{"type":"string","description":"Scopes a `reference` to one business (references are reused across businesses)."}}},"annotations":{"title":"Get Conversation","readOnlyHint":true,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}}]}},"http_status":200,"headers":{"content-type":"application/json; charset=utf-8"}}},"prompts_list":{"status":"ok","latency_ms":172.39,"details":{"url":"https://agent-broker-edge.basil-agent.workers.dev/mcp","payload":{"jsonrpc":"2.0","id":3,"result":{"prompts":[{"name":"book_from_any_url","description":"PRIMARY FLOW. The user gave you a Cal.com / Calendly / Doctolib / Booksy / Fresha / OpenTable / Setmore / Square / Acuity / Schedulista / Squarespace / BookMyCity URL. Do this: 1) call import_booking_url with the URL. 2) call schedule_appointment with the returned smb_id. 3) (optional) call send_transactional_confirmation. Total: 2 tool calls for a complete booking. Use this whenever the user mentions a booking URL — it is faster and more reliable than find_business + manual lookup.","arguments":[{"name":"booking_url","description":"Any URL on a supported booking platform.","required":true},{"name":"preferred_time","description":"When the user wants to be booked (free-form, e.g. 'next Tuesday at 3pm PT').","required":false}]},{"name":"find_then_book","description":"Use when the user describes a business by category + location but does not provide a URL. 1) call find_business(vertical, location, capability). 2) if results exist, call schedule_appointment with the chosen smb_id. 3) if NO results, call import_booking_url with any URL the user CAN provide, then schedule_appointment. Total: 2-3 tool calls.","arguments":[{"name":"vertical","description":"personal_services | home_services | professional_services | restaurants | healthcare | fitness","required":true},{"name":"location","description":"ZIP or city or country.","required":true},{"name":"capability","description":"Service needed (e.g. haircut, plumbing, dental cleaning).","required":true}]},{"name":"compliant_transactional_message","description":"Send a consumer-initiated transactional SMS / email / voice with full TCPA / GDPR / CASL pre-check. ONLY use when the end-user explicitly asked the agent to communicate with a named SMB on their behalf — confirming a booking, replying to a quote, following up on an inbound the SMB sent first. This flow is NOT for marketing, cold outreach, or prospecting; those are rejected at schema validation. 1) (optional) call /compliance/check first to preview legality. 2) call send_message — the gate runs again at send time and blocks any non-compliant send. Use country_code so the right jurisdiction rules apply.","arguments":[{"name":"recipient","description":"Phone (E.164) or email of the SMB the consumer named, or the consumer themselves for a transactional confirmation.","required":true},{"name":"message_type","description":"transactional | marketing | reminder | follow_up | notification. Marketing requires a valid consent_record_id; the gate verifies and rejects unrecorded consent.","required":true},{"name":"country_code","description":"ISO 3166-1 alpha-2 (e.g. 'US', 'DE'). Auto-inferred from phone if omitted.","required":false}]},{"name":"cost_estimation","description":"Get a cost estimate before committing to a paid operation. Free.","arguments":[{"name":"operation","description":"Operation name (any tool from tools/list).","required":true}]}]}},"http_status":200,"headers":{"content-type":"application/json"}}},"prompt_get":{"status":"ok","latency_ms":138.66,"details":{"url":"https://agent-broker-edge.basil-agent.workers.dev/mcp","payload":{"jsonrpc":"2.0","id":4,"result":{"messages":[{"role":"user","content":{"type":"text","text":"Step 1: call import_booking_url with booking_url=<URL>. Step 2: take the returned smb_id and call schedule_appointment with that smb_id, action=book, and the user's preferred time (the user's preferred time). Step 3: if booking succeeds, optionally call send_transactional_confirmation to email the receipt. Total: 2-3 tool calls."}}]}},"http_status":200,"headers":{"content-type":"application/json"},"prompt_name":"book_from_any_url","prompt_arguments":[{"name":"booking_url","description":"Any URL on a supported booking platform.","required":true},{"name":"preferred_time","description":"When the user wants to be booked (free-form, e.g. 'next Tuesday at 3pm PT').","required":false}]}},"resources_list":{"status":"ok","latency_ms":120.46,"details":{"url":"https://agent-broker-edge.basil-agent.workers.dev/mcp","payload":{"jsonrpc":"2.0","id":5,"result":{"resources":[{"uri":"agent-broker://manifest","name":"Capability Manifest","description":"Full manifest with all operations and their schemas.","mimeType":"application/json"},{"uri":"agent-broker://booking_platforms","name":"Supported Booking Platforms","description":"12 booking platforms import_booking_url accepts (Cal.com, Calendly, Doctolib, Booksy, Fresha, OpenTable, Setmore, Square, Acuity, Schedulista, Squarespace, BookMyCity) with regex patterns and example URLs. Use this resource to teach end-users which URL formats are acceptable.","mimeType":"application/json"},{"uri":"agent-broker://errors","name":"Error Code Catalog","description":"All 16 error codes with retry semantics.","mimeType":"text/markdown"},{"uri":"agent-broker://compliance/jurisdictions","name":"Jurisdiction Rules","description":"Compliance rules by country/state — TCPA, GDPR, CASL, recording consent. 26 jurisdictions + INTERNATIONAL fallback.","mimeType":"application/json"},{"uri":"agent-broker://cookbook","name":"Tool-chain cookbook","description":"Common multi-tool flows: 'book-from-url', 'find-then-book', 'compliant-transactional-message', 'async-poll'. Read this if you are unsure which tool to call first.","mimeType":"text/markdown"}]}},"http_status":200,"headers":{"content-type":"application/json"}}},"resource_read":{"status":"ok","latency_ms":138.6,"details":{"url":"https://agent-broker-edge.basil-agent.workers.dev/mcp","payload":{"jsonrpc":"2.0","id":6,"result":{"contents":[{"uri":"agent-broker://manifest","mimeType":"application/json","text":"{\n  \"schema_version\": \"1.0\",\n  \"service\": {\n    \"name\": \"AgentBroker\",\n    \"id\": \"agent-broker\",\n    \"version\": \"0.2.10\",\n    \"description\": \"A horizontal, agent-callable broker that lets an autonomous agent discover, verify, communicate with, schedule with, and transact with the long tail of small and mid-size businesses through one clean tool surface. Routes internally through whatever channel actually reaches the SMB: direct API, voice AI, SMS, email, web form, or browser automation.\",\n    \"base_url\": \"https://api.hatchloop.dev\",\n    \"discovery_url\": \"https://api.hatchloop.dev/.well-known/mcp.json\",\n    \"contact\": \"hello@hatchloop.dev\"\n  },\n  \"operations\": [\n    {\n      \"name\": \"find_business\",\n      \"description\": \"Given criteria (vertical, location, capability, price band, availability window), return ranked candidate businesses from our supply network. THE NETWORK IS SMALL AND STILL MOSTLY SAMPLE DATA: entries that are not real are named [DEMO] and flagged is_demo - check that field before acting on a result.\",\n      \"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.\",\n      \"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.\",\n      \"execution_profile\": \"sync\",\n      \"compliance_constraints\": [],\n      \"input_schema\": {\n        \"type\": \"object\",\n        \"required\": [\n          \"vertical\",\n          \"location\"\n        ],\n        \"properties\": {\n          \"vertical\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"personal_services\",\n              \"home_services\",\n              \"professional_services\"\n            ],\n            \"description\": \"Service vertical to search within\"\n          },\n          \"location\": {\n            \"type\": \"object\",\n            \"required\": [\n              \"zip_or_city\"\n            ],\n            \"properties\": {\n              \"zip_or_city\": {\n                \"type\": \"string\"\n              },\n              \"radius_miles\": {\n                \"type\": \"number\",\n                \"default\": 10\n              }\n            }\n          },\n          \"capability\": {\n            \"type\": \"string\",\n            \"description\": \"Specific service capability required, e.g. 'haircut', 'plumbing', 'tax_consultation'\"\n          },\n          \"price_band\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"max_usd\": {\n                \"type\": \"number\"\n              }\n            }\n          },\n          \"availability_window\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"start_iso\": {\n                \"type\": \"string\",\n                \"format\": \"date-time\"\n              },\n              \"end_iso\": {\n                \"type\": \"string\",\n                \"format\": \"date-time\"\n              }\n            },\n            \"description\": \"Accepted but NOT APPLIED - it does not narrow results. We do not hold live calendars for the supply network. The response carries availability_window_applied: false when you send one. To book a specific slot use schedule_appointment with requested_time, which checks real availability.\"\n          },\n          \"max_results\": {\n            \"type\": \"integer\",\n            \"default\": 5,\n            \"maximum\": 20\n          }\n        }\n      },\n      \"output_schema\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"businesses\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"object\",\n              \"properties\": {\n                \"smb_id\": {\n                  \"type\": \"string\"\n                },\n                \"name\": {\n                  \"type\": \"string\"\n                },\n                \"vertical\": {\n                  \"type\": \"string\"\n                },\n                \"address\": {\n                  \"type\": \"string\"\n                },\n                \"capabilities\": {\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"channels_available\": {\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\"\n                  }\n                },\n                \"price_range\": {\n                  \"type\": \"object\"\n                },\n                \"verified_at\": {\n                  \"type\": \"string\",\n                  \"format\": \"date-time\"\n                },\n                \"rank_score\": {\n                  \"type\": \"number\"\n                }\n              }\n            }\n          },\n          \"total_in_supply_network\": {\n            \"type\": \"integer\"\n          },\n          \"supply_coverage_note\": {\n            \"type\": \"string\"\n          }\n        }\n      },\n      \"cost_model\": {\n        \"basis\": \"free\",\n        \"unit_price_usd\": 0.0,\n        \"notes\": \"No key required, unmetered.\"\n      },\n      \"slo\": {\n        \"p50_ms\": 200,\n        \"p95_ms\": 800,\n        \"success_rate_30d\": null,\n        \"availability_30d\": null,\n        \"supply_network_coverage_by_vertical\": null\n      },\n      \"idempotency\": \"read-only \\u2014 idempotency key not required\",\n      \"failure_modes\": [\n        \"bad_input\",\n        \"missing_capability\",\n        \"rate_limited\",\n        \"out_of_supply_network\",\n        \"transient\",\n        \"internal\"\n      ],\n      \"examples\": [\n        {\n          \"label\": \"Happy path \\u2014 find hair salon near Atlanta\",\n          \"input\": {\n            \"vertical\": \"personal_services\",\n            \"location\": {\n              \"zip_or_city\": \"30309\"\n            },\n            \"capability\": \"haircut\",\n            \"price_band\": {\n              \"max_usd\": 50\n            },\n            \"availability_window\": {\n              \"start_iso\": \"2026-04-29T09:00:00Z\",\n              \"end_iso\": \"2026-04-29T12:00:00Z\"\n            }\n          },\n          \"output\": {\n            \"status\": \"success\",\n            \"businesses\": [\n              {\n                \"smb_id\": \"smb_001\",\n                \"name\": \"Cuts & Co.\",\n                \"vertical\": \"personal_services\",\n                \"address\": \"123 Main St, Atlanta, GA 30309\",\n                \"capabilities\": [\n                  \"haircut\",\n                  \"blowdry\"\n                ],\n                \"channels_available\": [\n                  \"direct_api:square\",\n                  \"sms\"\n                ],\n                \"price_range\": {\n                  \"min_usd\": 35,\n                  \"max_usd\": 55\n                },\n                \"verified_at\": \"2026-04-20T00:00:00Z\",\n                \"rank_score\": 0.92\n              }\n            ]\n          }\n        },\n        {\n          \"label\": \"No results in supply network\",\n          \"input\": {\n            \"vertical\": \"professional_services\",\n            \"location\": {\n              \"zip_or_city\": \"99999\"\n            },\n            \"capability\": \"tax_consultation\"\n          },\n          \"output\": {\n            \"status\": \"success\",\n            \"businesses\": [],\n            \"total_in_supply_network\": 0,\n            \"supply_coverage_note\": \"No verified businesses in this area for this capability. Consider expanding radius_miles.\"\n          }\n        },\n        {\n          \"label\": \"Channel fallback note in result\",\n          \"input\": {\n            \"vertical\": \"home_services\",\n            \"location\": {\n              \"zip_or_city\": \"02139\"\n            },\n            \"capability\": \"plumbing\"\n          },\n          \"output\": {\n            \"status\": \"success\",\n            \"businesses\": [\n              {\n                \"smb_id\": \"smb_044\",\n                \"name\": \"FastFix Plumbing\",\n                \"channels_available\": [\n                  \"voice_ai\",\n                  \"sms\"\n                ],\n                \"capabilities\": [\n                  \"plumbing\",\n                  \"emergency_plumbing\"\n                ]\n              }\n            ],\n            \"supply_coverage_note\": \"This business is reachable via voice AI or SMS only \\u2014 no direct scheduling API.\"\n          }\n        }\n      ],\n      \"user_query_examples\": [\n        {\n          \"user_says\": \"Find me a salon in Tokyo that does color\",\n          \"agent_call\": {\n            \"tool\": \"find_business\",\n            \"arguments\": {\n              \"vertical\": \"personal_services\",\n              \"location\": {\n                \"zip_or_city\": \"Tokyo\"\n              },\n              \"capability\": \"color\"\n            }\n          }\n        },\n        {\n          \"user_says\": \"I need a plumber near 30309\",\n          \"agent_call\": {\n            \"tool\": \"find_business\",\n            \"arguments\": {\n              \"vertical\": \"home_services\",\n              \"location\": {\n                \"zip_or_city\": \"30309\"\n              },\n              \"capability\": \"plumbing\"\n            }\n          }\n        },\n        {\n          \"user_says\": \"Show me dentists in London\",\n          \"agent_call\": {\n            \"tool\": \"find_business\",\n            \"arguments\": {\n              \"vertical\": \"professional_services\",\n              \"location\": {\n                \"zip_or_city\": \"London\"\n              },\n              \"capability\": \"dentist\"\n            }\n          }\n        }\n      ]\n    },\n    {\n      \"name\": \"verify_business\",\n      \"description\": \"Look up what we know about a business in our supply network: its contact channels, capabilities, and when the record was last verified. This is a DIRECTORY LOOKUP - it does not contact the business.\",\n      \"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').\",\n      \"when_not_to_use\": \"Do not use if the SMB was returned from find_business within the last 24 hours \\u2014 those results are already verified.\",\n      \"execution_profile\": \"sync\",\n      \"compliance_constraints\": [],\n      \"input_schema\": {\n        \"type\": \"object\",\n        \"required\": [\n          \"smb_id\"\n        ],\n        \"properties\": {\n          \"smb_id\": {\n            \"type\": \"string\"\n          },\n          \"capability_to_verify\": {\n            \"type\": \"string\"\n          }\n        }\n      },\n      \"output_schema\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"verified\": {\n            \"type\": \"boolean\"\n          },\n          \"capabilities_confirmed\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\"\n            }\n          },\n          \"channels_reachable\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\"\n            }\n          },\n          \"last_verified_at\": {\n            \"type\": \"string\",\n            \"format\": \"date-time\"\n          },\n          \"verification_method\": {\n            \"type\": \"string\"\n          }\n        }\n      },\n      \"cost_model\": {\n        \"basis\": \"free\",\n        \"unit_price_usd\": 0.0,\n        \"notes\": \"No key required, unmetered.\"\n      },\n      \"slo\": {\n        \"p50_ms\": 500,\n        \"p95_ms\": 2000\n      },\n      \"idempotency\": \"read-only \\u2014 idempotency key not required\",\n      \"failure_modes\": [\n        \"bad_input\",\n        \"supply_unreachable\",\n        \"supply_unverified\",\n        \"transient\"\n      ],\n      \"examples\": [\n        {\n          \"label\": \"Verified with direct API\",\n          \"input\": {\n            \"smb_id\": \"smb_001\",\n            \"capability_to_verify\": \"haircut\"\n          },\n          \"output\": {\n            \"status\": \"success\",\n            \"result\": {\n              \"verified\": true,\n              \"capabilities_confirmed\": [\n                \"haircut\",\n                \"blowdry\"\n              ],\n              \"channels_reachable\": [\n                \"direct_api:square\"\n              ],\n              \"verification_method\": \"directory_lookup\"\n            }\n          }\n        }\n      ],\n      \"user_query_examples\": [\n        {\n          \"user_says\": \"Confirm smb_imp_abc actually does emergency plumbing\",\n          \"agent_call\": {\n            \"tool\": \"verify_business\",\n            \"arguments\": {\n              \"smb_id\": \"smb_imp_abc\",\n              \"capability_to_verify\": \"emergency_plumbing\"\n            }\n          }\n        }\n      ]\n    },\n    {\n      \"name\": \"send_message\",\n      \"description\": \"Send a message on behalf of an agent's user or an SMB across WhatsApp (free during launch), 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 26 jurisdictions) that enforces opt-in consent for marketing/promotional content \\u2014 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.\",\n      \"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.\",\n      \"when_not_to_use\": \"Do NOT use for OTPs or critical transactional confirmations \\u2014 use send_transactional_confirmation. Do NOT attempt to send marketing without a consent_record_id pointing at a real opt-in \\u2014 the gate will reject the send and log a compliance_violation. Do NOT attempt bulk / list-based / drip / cold outreach \\u2014 those are out of scope and the rate limiter will throttle abuse.\",\n      \"execution_profile\": \"sync_fast\",\n      \"compliance_constraints\": [\n        \"Permitted message types: transactional, marketing, reminder, follow_up, notification.\",\n        \"Marketing messages require a valid consent_record_id at send time \\u2014 the gate looks it up in the consent_store and rejects if missing, expired, or revoked.\",\n        \"US SMS marketing requires TCPA prior express written consent + 10DLC campaign registration.\",\n        \"EU/UK recipients require explicit GDPR lawful basis (contract or freely-given consent) for marketing messages.\",\n        \"Canadian recipients require CASL express consent for commercial electronic messages.\",\n        \"Voice channel to US recipients requires prior express consent for autodialed/prerecorded calls (TCPA).\",\n        \"All commercial email contains a functional unsubscribe link (CAN-SPAM).\",\n        \"GCC recipients (UAE, SA, OM, QA, KW, BH) covered by PDPL-style rules per jurisdiction; the gate routes by country_code.\"\n      ],\n      \"input_schema\": {\n        \"type\": \"object\",\n        \"required\": [\n          \"recipient\",\n          \"message_type\",\n          \"content\"\n        ],\n        \"properties\": {\n          \"recipient\": {\n            \"type\": \"object\",\n            \"required\": [\n              \"id_type\",\n              \"id_value\"\n            ],\n            \"properties\": {\n              \"id_type\": {\n                \"type\": \"string\",\n                \"enum\": [\n                  \"phone\",\n                  \"email\",\n                  \"smb_id\",\n                  \"customer_id\"\n                ]\n              },\n              \"id_value\": {\n                \"type\": \"string\"\n              },\n              \"country_code\": {\n                \"type\": \"string\",\n                \"description\": \"ISO 3166-1 alpha-2, required for compliance routing\"\n              }\n            }\n          },\n          \"message_type\": {\n            \"type\": \"string\",\n            \"description\": \"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_violation receipt) if it's missing, expired, or revoked.\",\n            \"enum\": [\n              \"transactional\",\n              \"marketing\",\n              \"reminder\",\n              \"follow_up\",\n              \"notification\"\n            ]\n          },\n          \"content\": {\n            \"type\": \"object\",\n            \"required\": [\n              \"body\"\n            ],\n            \"properties\": {\n              \"body\": {\n                \"type\": \"string\"\n              },\n              \"subject\": {\n                \"type\": \"string\",\n                \"description\": \"For email channel\"\n              },\n              \"template_id\": {\n                \"type\": \"string\"\n              },\n              \"template_vars\": {\n                \"type\": \"object\"\n              }\n            }\n          },\n          \"preferred_channel\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"whatsapp\",\n              \"sms\",\n              \"email\",\n              \"voice\",\n              \"auto\"\n            ],\n            \"default\": \"auto\"\n          },\n          \"send_at_iso\": {\n            \"type\": \"string\",\n            \"format\": \"date-time\",\n            \"description\": \"NOT SUPPORTED YET. We do not schedule messages. Supplying a time more than 2 minutes in the future is REFUSED (reason_code scheduling_not_supported) rather than sent immediately, which is what used to happen. Call send_message at the moment you want delivery, or omit this field.\"\n          },\n          \"on_behalf_of\": {\n            \"type\": \"string\",\n            \"description\": \"Who this message is FOR (your end-user's name/label). On WhatsApp this opens a tracked conversation and travels in-message as '#4821 for Sara (via HatchLoop)', so the business knows who it is talking to and their reply is matched back to this exact request instead of guessed. Strongly recommended for two-way channels.\"\n          },\n          \"business_id\": {\n            \"type\": \"string\",\n            \"description\": \"Optional stable id for the recipient business. Enables global demand shaping (we rate-limit total inbound across ALL agents so businesses stay responsive instead of blocking us).\"\n          }\n        }\n      },\n      \"output_schema\": {\n        \"$ref\": \"#/components/OutcomeReceipt\"\n      },\n      \"cost_model\": {\n        \"basis\": \"per_call_variable\",\n        \"unit_price_usd\": 0.02,\n        \"credits\": 2,\n        \"max_price_usd\": 0.22,\n        \"max_credits\": 22,\n        \"notes\": \"Reserves up to 22 credits and settles the actual cost from the receipt; minimum 2.\"\n      },\n      \"slo\": {\n        \"p50_ms\": 800,\n        \"p95_ms\": 4000\n      },\n      \"idempotency\": \"required \\u2014 use Idempotency-Key header to prevent duplicate sends\",\n      \"failure_modes\": [\n        \"bad_input\",\n        \"compliance_violation\",\n        \"consent_missing\",\n        \"supply_unreachable\",\n        \"upstream_failure\",\n        \"rate_limited\",\n        \"budget_exceeded\"\n      ],\n      \"examples\": [\n        {\n          \"label\": \"SMS appointment reminder \\u2014 happy path\",\n          \"input\": {\n            \"recipient\": {\n              \"id_type\": \"phone\",\n              \"id_value\": \"+14045550100\",\n              \"country_code\": \"US\"\n            },\n            \"message_type\": \"reminder\",\n            \"content\": {\n              \"body\": \"Reminder: your appointment at Cuts & Co. is tomorrow at 10am. Reply STOP to unsubscribe.\"\n            },\n            \"preferred_channel\": \"sms\"\n          },\n          \"output\": {\n            \"status\": \"success\",\n            \"channel_used\": \"sms:twilio\",\n            \"cost\": {\n              \"amount\": 0.05,\n              \"currency\": \"USD\"\n            }\n          }\n        },\n        {\n          \"label\": \"Consumer asked agent to follow up on a quote\",\n          \"input\": {\n            \"recipient\": {\n              \"id_type\": \"smb_id\",\n              \"id_value\": \"smb_044\",\n              \"country_code\": \"US\"\n            },\n            \"message_type\": \"follow_up\",\n            \"content\": {\n              \"body\": \"Hi \\u2014 checking back on the plumbing quote I requested yesterday for Maple St. Could you share availability for Thursday?\"\n            }\n          },\n          \"output\": {\n            \"status\": \"success\",\n            \"channel_used\": \"sms:twilio\",\n            \"cost\": {\n              \"amount\": 0.02,\n              \"currency\": \"USD\"\n            }\n          }\n        },\n        {\n          \"label\": \"Marketing SMS blocked \\u2014 no recorded consent\",\n          \"input\": {\n            \"recipient\": {\n              \"id_type\": \"phone\",\n              \"id_value\": \"+14045550200\",\n              \"country_code\": \"US\"\n            },\n            \"message_type\": \"marketing\",\n            \"content\": {\n              \"body\": \"20% off this week only!\"\n            }\n          },\n          \"output\": {\n            \"status\": \"failure\",\n            \"reason_code\": \"compliance_violation\",\n            \"human_message\": \"Recipient +14045550200 has not opted in to marketing SMS. TCPA prior express written consent is required. Obtain consent (consent_record_id) and retry.\",\n            \"retriable\": false\n          }\n        },\n        {\n          \"label\": \"Marketing SMS to an opted-in subscriber (consent passes the gate)\",\n          \"input\": {\n            \"recipient\": {\n              \"id_type\": \"phone\",\n              \"id_value\": \"+14045550100\",\n              \"country_code\": \"US\"\n            },\n            \"message_type\": \"marketing\",\n            \"content\": {\n              \"body\": \"Cuts & Co.: Fall sale this Saturday \\u2014 20% off cuts + color. Reply STOP to opt out.\"\n            }\n          },\n          \"output\": {\n            \"status\": \"success\",\n            \"channel_used\": \"sms:twilio\",\n            \"cost\": {\n              \"amount\": 0.02,\n              \"currency\": \"USD\"\n            }\n          }\n        },\n        {\n          \"label\": \"Voice fallback when SMS unreachable\",\n          \"input\": {\n            \"recipient\": {\n              \"id_type\": \"phone\",\n              \"id_value\": \"+12125550300\",\n              \"country_code\": \"US\"\n            },\n            \"message_type\": \"reminder\",\n            \"content\": {\n              \"body\": \"Your appointment is tomorrow at 2pm.\"\n            }\n          },\n          \"output\": {\n            \"status\": \"success\",\n            \"channel_used\": \"voice_ai:vapi\",\n            \"channel_fallback_chain\": [\n              \"sms:twilio (carrier_filter)\",\n              \"voice_ai:vapi (success)\"\n            ],\n            \"cost\": {\n              \"amount\": 0.3,\n              \"currency\": \"USD\"\n            }\n          }\n        }\n      ],\n      \"user_query_examples\": [\n        {\n          \"user_says\": \"Text the salon I'll be 10 minutes late\",\n          \"agent_call\": {\n            \"tool\": \"send_message\",\n            \"arguments\": {\n              \"recipient\": {\n                \"id_type\": \"smb_id\",\n                \"id_value\": \"smb_xyz\"\n              },\n              \"message_type\": \"notification\",\n              \"content\": {\n                \"body\": \"Running about 10 minutes late for my appointment.\"\n              },\n              \"preferred_channel\": \"sms\"\n            }\n          }\n        },\n        {\n          \"user_says\": \"Email the dentist about insurance\",\n          \"agent_call\": {\n            \"tool\": \"send_message\",\n            \"arguments\": {\n              \"recipient\": {\n                \"id_type\": \"email\",\n                \"id_value\": \"front-desk@example-dental.com\"\n              },\n              \"message_type\": \"transactional\",\n              \"content\": {\n                \"body\": \"Do you accept Cigna insurance?\"\n              },\n              \"preferred_channel\": \"email\"\n            }\n          }\n        }\n      ]\n    },\n    {\n      \"name\": \"capture_lead\",\n      \"description\": \"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.\",\n      \"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.\",\n      \"when_not_to_use\": \"Do not use for confirmed bookings \\u2014 use schedule_appointment. Do not use for bulk list imports.\",\n      \"execution_profile\": \"sync_fast\",\n      \"compliance_constraints\": [\n        \"Captured lead data is subject to GDPR data subject rights for EU residents.\",\n        \"CAN-SPAM applies if captured email will receive commercial messages.\",\n        \"Retention policy is enforced per jurisdiction by ComplianceAgent.\"\n      ],\n      \"input_schema\": {\n        \"type\": \"object\",\n        \"required\": [\n          \"smb_id\",\n          \"prospect\"\n        ],\n        \"properties\": {\n          \"smb_id\": {\n            \"type\": \"string\"\n          },\n          \"prospect\": {\n            \"type\": \"object\",\n            \"required\": [\n              \"name\"\n            ],\n            \"properties\": {\n              \"name\": {\n                \"type\": \"string\"\n              },\n              \"phone\": {\n                \"type\": \"string\"\n              },\n              \"email\": {\n                \"type\": \"string\",\n                \"format\": \"email\"\n              },\n              \"service_interest\": {\n                \"type\": \"string\"\n              },\n              \"notes\": {\n                \"type\": \"string\"\n              },\n              \"consent_record_id\": {\n                \"type\": \"string\",\n                \"description\": \"Optional ID of a consent record proving the prospect asked to be contacted (e.g., they filled an SMB's intake form or requested a quote). Required when downstream send_message calls are anticipated.\"\n              }\n            }\n          },\n          \"source\": {\n            \"type\": \"string\",\n            \"description\": \"Where the consumer-initiated request originated (e.g., 'consumer_request', 'inbound_quote_form', 'agent_referral_from_find_business').\"\n          }\n        }\n      },\n      \"output_schema\": {\n        \"$ref\": \"#/components/OutcomeReceipt\"\n      },\n      \"cost_model\": {\n        \"basis\": \"per_call\",\n        \"unit_price_usd\": 0.05,\n        \"credits\": 5\n      },\n      \"slo\": {\n        \"p50_ms\": 600,\n        \"p95_ms\": 3000\n      },\n      \"idempotency\": \"required \\u2014 dedupe is keyed on (smb_id, prospect.phone or prospect.email)\",\n      \"failure_modes\": [\n        \"bad_input\",\n        \"idempotency_conflict\",\n        \"upstream_failure\",\n        \"compliance_violation\"\n      ],\n      \"examples\": [\n        {\n          \"label\": \"Happy path \\u2014 lead captured into Square CRM\",\n          \"input\": {\n            \"smb_id\": \"smb_001\",\n            \"prospect\": {\n              \"name\": \"Jane Smith\",\n              \"phone\": \"+14045551234\",\n              \"email\": \"jane@example.com\",\n              \"service_interest\": \"haircut\"\n            },\n            \"source\": \"agent_referral\"\n          },\n          \"output\": {\n            \"status\": \"success\",\n            \"result\": {\n              \"lead_id\": \"lead_abc123\",\n              \"channel_used\": \"direct_api:square\"\n            }\n          }\n        }\n      ],\n      \"user_query_examples\": [\n        {\n          \"user_says\": \"Tell smb_xyz I'm interested and want a callback\",\n          \"agent_call\": {\n            \"tool\": \"capture_lead\",\n            \"arguments\": {\n              \"smb_id\": \"smb_xyz\",\n              \"prospect\": {\n                \"name\": \"Jane\",\n                \"phone\": \"+15551234567\",\n                \"email\": \"jane@example.com\"\n              },\n              \"source\": \"agent\"\n            }\n          }\n        }\n      ]\n    },\n    {\n      \"name\": \"schedule_appointment\",\n      \"description\": \"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.\",\n      \"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.\",\n      \"when_not_to_use\": \"Do not use for bulk scheduling. Do not use without a verified SMB \\u2014 call find_business and verify_business first if needed.\",\n      \"execution_profile\": \"async_by_default\",\n      \"compliance_constraints\": [\n        \"Voice channel to US recipients requires prior express consent for prerecorded calls (TCPA).\",\n        \"Voice recording in CA, FL, IL, MD, MA, MT, NV, NH, PA, WA requires two-party consent \\u2014 recording-consent prompt fires automatically.\"\n      ],\n      \"input_schema\": {\n        \"type\": \"object\",\n        \"required\": [\n          \"smb_id\",\n          \"action\"\n        ],\n        \"properties\": {\n          \"smb_id\": {\n            \"type\": \"string\"\n          },\n          \"action\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"book\",\n              \"reschedule\",\n              \"cancel\",\n              \"check_availability\"\n            ]\n          },\n          \"service\": {\n            \"type\": \"string\"\n          },\n          \"customer\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"name\": {\n                \"type\": \"string\"\n              },\n              \"phone\": {\n                \"type\": \"string\"\n              },\n              \"email\": {\n                \"type\": \"string\"\n              }\n            }\n          },\n          \"requested_time\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"preferred_iso\": {\n                \"type\": \"string\",\n                \"format\": \"date-time\"\n              },\n              \"window_start_iso\": {\n                \"type\": \"string\",\n                \"format\": \"date-time\"\n              },\n              \"window_end_iso\": {\n                \"type\": \"string\",\n                \"format\": \"date-time\"\n              },\n              \"duration_minutes\": {\n                \"type\": \"integer\"\n              }\n            }\n          },\n          \"existing_appointment_id\": {\n            \"type\": \"string\",\n            \"description\": \"Required for reschedule/cancel\"\n          },\n          \"notes\": {\n            \"type\": \"string\"\n          }\n        }\n      },\n      \"output_schema\": {\n        \"$ref\": \"#/components/OutcomeReceipt\"\n      },\n      \"cost_model\": {\n        \"basis\": \"per_call_variable\",\n        \"unit_price_usd\": 0.15,\n        \"credits\": 15,\n        \"max_price_usd\": 0.5,\n        \"max_credits\": 50,\n        \"notes\": \"Reserves up to 50 credits and settles the actual cost from the receipt; minimum 15.\"\n      },\n      \"slo\": {\n        \"p50_ms\": 5000,\n        \"p95_ms\": 60000,\n        \"note\": \"async \\u2014 p50/p95 reflect time to terminal outcome, not HTTP response\"\n      },\n      \"idempotency\": \"required \\u2014 prevents double-booking on network retry\",\n      \"failure_modes\": [\n        \"bad_input\",\n        \"supply_unreachable\",\n        \"upstream_failure\",\n        \"compliance_violation\",\n        \"recording_consent_missing\",\n        \"outcome_rejected\"\n      ],\n      \"examples\": [\n        {\n          \"label\": \"Book haircut \\u2014 direct API path\",\n          \"input\": {\n            \"smb_id\": \"smb_001\",\n            \"action\": \"book\",\n            \"service\": \"haircut\",\n            \"customer\": {\n              \"name\": \"Alex Johnson\",\n              \"phone\": \"+14045559999\"\n            },\n            \"requested_time\": {\n              \"window_start_iso\": \"2026-04-29T09:00:00Z\",\n              \"window_end_iso\": \"2026-04-29T12:00:00Z\"\n            }\n          },\n          \"output\": {\n            \"status\": \"pending_async\",\n            \"operation_id\": \"op_xyz789\",\n            \"estimated_completion_time\": \"2026-04-27T10:01:00Z\",\n            \"next_actions\": [\n              \"poll get_status with operation_id op_xyz789\",\n              \"or await webhook callback\"\n            ]\n          }\n        },\n        {\n          \"label\": \"Book plumber \\u2014 voice AI fallback\",\n          \"input\": {\n            \"smb_id\": \"smb_044\",\n            \"action\": \"book\",\n            \"service\": \"emergency_plumbing\",\n            \"requested_time\": {\n              \"preferred_iso\": \"2026-04-28T08:00:00Z\"\n            }\n          },\n          \"output\": {\n            \"status\": \"pending_async\",\n            \"channel_fallback_chain\": [\n              \"direct_api:none\",\n              \"voice_ai:vapi (dispatched)\"\n            ],\n            \"operation_id\": \"op_abc001\"\n          }\n        },\n        {\n          \"label\": \"Cancel appointment\",\n          \"input\": {\n            \"smb_id\": \"smb_001\",\n            \"action\": \"cancel\",\n            \"existing_appointment_id\": \"appt_cal_4455\"\n          },\n          \"output\": {\n            \"status\": \"success\",\n            \"reason_code\": \"cancelled\",\n            \"result\": {\n              \"refund_status\": \"pending\",\n              \"confirmation_number\": \"CANCEL-789\"\n            }\n          }\n        }\n      ],\n      \"user_query_examples\": [\n        {\n          \"user_says\": \"Book the haircut for next Tuesday at 3pm\",\n          \"agent_call\": {\n            \"tool\": \"schedule_appointment\",\n            \"arguments\": {\n              \"smb_id\": \"smb_imp_abc\",\n              \"action\": \"book\",\n              \"service\": \"haircut\"\n            }\n          }\n        },\n        {\n          \"user_says\": \"Cancel my Friday appointment at smb_xyz\",\n          \"agent_call\": {\n            \"tool\": \"schedule_appointment\",\n            \"arguments\": {\n              \"smb_id\": \"smb_xyz\",\n              \"action\": \"cancel\"\n            }\n          }\n        },\n        {\n          \"user_says\": \"Reschedule my dental cleaning to next week\",\n          \"agent_call\": {\n            \"tool\": \"schedule_appointment\",\n            \"arguments\": {\n              \"smb_id\": \"smb_imp_xyz\",\n              \"action\": \"reschedule\"\n            }\n          }\n        }\n      ]\n    },\n    {\n      \"name\": \"send_transactional_confirmation\",\n      \"description\": \"Idempotent transactional messages: OTPs, booking confirmations, payment receipts, cancellation notices. Falls back across configured channels; an unconfigured channel fails honestly rather than reporting a delivery that did not happen.\",\n      \"when_to_use\": \"Use for any message that MUST be delivered reliably \\u2014 OTPs, booking confirmations, receipts. Do not use for marketing.\",\n      \"when_not_to_use\": \"Do not use for marketing or promotional messages. Do not use for conversational messages.\",\n      \"execution_profile\": \"sync_fast\",\n      \"compliance_constraints\": [\n        \"Transactional messages are exempt from marketing consent rules but must include clear identification of sender and purpose.\"\n      ],\n      \"input_schema\": {\n        \"type\": \"object\",\n        \"required\": [\n          \"recipient\",\n          \"confirmation_type\",\n          \"data\"\n        ],\n        \"properties\": {\n          \"recipient\": {\n            \"type\": \"object\",\n            \"required\": [\n              \"phone_or_email\"\n            ],\n            \"properties\": {\n              \"phone_or_email\": {\n                \"type\": \"string\"\n              },\n              \"name\": {\n                \"type\": \"string\"\n              }\n            }\n          },\n          \"confirmation_type\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"otp\",\n              \"booking_confirmation\",\n              \"payment_receipt\",\n              \"cancellation_notice\",\n              \"reminder\"\n            ]\n          },\n          \"data\": {\n            \"type\": \"object\",\n            \"description\": \"Type-specific payload; e.g., {otp_code} for otp, {appointment_time, smb_name} for booking_confirmation\"\n          },\n          \"preferred_channel\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"sms\",\n              \"email\",\n              \"auto\"\n            ],\n            \"default\": \"sms\"\n          }\n        }\n      },\n      \"output_schema\": {\n        \"$ref\": \"#/components/OutcomeReceipt\"\n      },\n      \"cost_model\": {\n        \"basis\": \"per_call\",\n        \"unit_price_usd\": 0.02,\n        \"credits\": 2\n      },\n      \"slo\": {\n        \"p50_ms\": 500,\n        \"p95_ms\": 2000\n      },\n      \"idempotency\": \"required \\u2014 Idempotency-Key prevents double-sends of OTPs and confirmations\",\n      \"failure_modes\": [\n        \"bad_input\",\n        \"upstream_failure\",\n        \"supply_unreachable\"\n      ],\n      \"examples\": [\n        {\n          \"label\": \"Booking confirmation SMS\",\n          \"input\": {\n            \"recipient\": {\n              \"phone_or_email\": \"+14045551234\",\n              \"name\": \"Alex\"\n            },\n            \"confirmation_type\": \"booking_confirmation\",\n            \"data\": {\n              \"appointment_time\": \"Tuesday April 29 at 10:30am\",\n              \"smb_name\": \"Cuts & Co.\",\n              \"address\": \"123 Main St, Atlanta\"\n            }\n          },\n          \"output\": {\n            \"status\": \"success\",\n            \"channel_used\": \"sms:twilio\"\n          }\n        }\n      ],\n      \"user_query_examples\": [\n        {\n          \"user_says\": \"Send the booking confirmation receipt to my email\",\n          \"agent_call\": {\n            \"tool\": \"send_transactional_confirmation\",\n            \"arguments\": {\n              \"recipient\": {\n                \"id_type\": \"email\",\n                \"id_value\": \"customer@example.com\"\n              },\n              \"confirmation_type\": \"booking_confirmation\",\n              \"data\": {\n                \"appointment_time\": \"2026-09-03T15:00:00Z\",\n                \"business_name\": \"Salon 718\"\n              },\n              \"preferred_channel\": \"email\"\n            }\n          }\n        }\n      ]\n    },\n    {\n      \"name\": \"handle_inbound\",\n      \"description\": \"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.\",\n      \"when_to_use\": \"Use when an SMB needs inbound message triage \\u2014 classifying incoming contact-form submissions, SMS replies, voicemails, or email inquiries.\",\n      \"when_not_to_use\": \"Do not use for outbound communications. Do not use for compliance-flagged recipient lists without verified opt-in records.\",\n      \"execution_profile\": \"async_by_default\",\n      \"compliance_constraints\": [\n        \"Inbound message content may contain PII \\u2014 retained per jurisdiction retention policy.\",\n        \"GDPR data subject deletion requests received via inbound must be escalated immediately.\"\n      ],\n      \"input_schema\": {\n        \"type\": \"object\",\n        \"required\": [\n          \"smb_id\",\n          \"inbound_channel\",\n          \"raw_message\"\n        ],\n        \"properties\": {\n          \"smb_id\": {\n            \"type\": \"string\"\n          },\n          \"inbound_channel\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"sms\",\n              \"email\",\n              \"voice_voicemail\",\n              \"web_form\",\n              \"api\"\n            ]\n          },\n          \"sender\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"phone\": {\n                \"type\": \"string\"\n              },\n              \"email\": {\n                \"type\": \"string\"\n              },\n              \"name\": {\n                \"type\": \"string\"\n              }\n            }\n          },\n          \"raw_message\": {\n            \"type\": \"string\"\n          },\n          \"received_at_iso\": {\n            \"type\": \"string\",\n            \"format\": \"date-time\"\n          },\n          \"routing_rules\": {\n            \"type\": \"object\",\n            \"description\": \"Optional override routing policy for this SMB\"\n          }\n        }\n      },\n      \"output_schema\": {\n        \"$ref\": \"#/components/OutcomeReceipt\"\n      },\n      \"cost_model\": {\n        \"basis\": \"per_call\",\n        \"unit_price_usd\": 0.03,\n        \"credits\": 3\n      },\n      \"slo\": {\n        \"p50_ms\": 3000,\n        \"p95_ms\": 15000\n      },\n      \"idempotency\": \"required\",\n      \"failure_modes\": [\n        \"bad_input\",\n        \"upstream_failure\",\n        \"transient\"\n      ],\n      \"examples\": [\n        {\n          \"label\": \"Inbound SMS booking request triaged\",\n          \"input\": {\n            \"smb_id\": \"smb_001\",\n            \"inbound_channel\": \"sms\",\n            \"sender\": {\n              \"phone\": \"+14045551234\"\n            },\n            \"raw_message\": \"Hi, do you have anything Saturday morning?\",\n            \"received_at_iso\": \"2026-04-27T14:00:00Z\"\n          },\n          \"output\": {\n            \"status\": \"success\",\n            \"result\": {\n              \"classified_intent\": \"booking_inquiry\",\n              \"suggested_action\": \"check_availability\",\n              \"routed_to\": \"schedule_appointment_flow\",\n              \"enriched_sender\": {\n                \"known_customer\": true,\n                \"last_booking\": \"2026-03-15\"\n              }\n            }\n          }\n        }\n      ],\n      \"user_query_examples\": [\n        {\n          \"user_says\": \"Process this customer reply for me: 'Yes I want to book Tuesday'\",\n          \"agent_call\": {\n            \"tool\": \"handle_inbound\",\n            \"arguments\": {\n              \"smb_id\": \"smb_xyz\",\n              \"inbound_channel\": \"sms\",\n              \"raw_message\": \"Yes I want to book Tuesday\"\n            }\n          }\n        }\n      ]\n    },\n    {\n      \"name\": \"escalate_to_human\",\n      \"description\": \"Hand off an in-flight task to a human operator with a full context bundle: transcript, prior actions, identifiers, and a recommended next step.\",\n      \"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.\",\n      \"when_not_to_use\": \"Do not use as a first resort. Escalate only after automated resolution attempts.\",\n      \"execution_profile\": \"async_by_default\",\n      \"compliance_constraints\": [\n        \"Context bundle may contain PII \\u2014 handled per jurisdiction retention policy.\",\n        \"Recording transcripts included in handoff must have recording consent confirmed.\"\n      ],\n      \"input_schema\": {\n        \"type\": \"object\",\n        \"required\": [\n          \"smb_id\",\n          \"reason\",\n          \"context\"\n        ],\n        \"properties\": {\n          \"smb_id\": {\n            \"type\": \"string\"\n          },\n          \"reason\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"automation_failed\",\n              \"customer_requested\",\n              \"compliance_hold\",\n              \"ambiguous_intent\",\n              \"exception_required\"\n            ]\n          },\n          \"context\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"original_operation\": {\n                \"type\": \"string\"\n              },\n              \"operation_id\": {\n                \"type\": \"string\"\n              },\n              \"transcript\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"type\": \"object\"\n                }\n              },\n              \"prior_actions\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"type\": \"object\"\n                }\n              },\n              \"recommended_next_step\": {\n                \"type\": \"string\"\n              }\n            }\n          },\n          \"priority\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"normal\",\n              \"urgent\"\n            ],\n            \"default\": \"normal\"\n          }\n        }\n      },\n      \"output_schema\": {\n        \"$ref\": \"#/components/OutcomeReceipt\"\n      },\n      \"cost_model\": {\n        \"basis\": \"per_call\",\n        \"unit_price_usd\": 0.2,\n        \"credits\": 20\n      },\n      \"slo\": {\n        \"p50_ms\": 2000,\n        \"p95_ms\": 10000\n      },\n      \"idempotency\": \"required\",\n      \"failure_modes\": [\n        \"bad_input\",\n        \"supply_unreachable\",\n        \"upstream_failure\"\n      ],\n      \"examples\": [\n        {\n          \"label\": \"Escalation after voice AI booking failure\",\n          \"input\": {\n            \"smb_id\": \"smb_044\",\n            \"reason\": \"automation_failed\",\n            \"context\": {\n              \"original_operation\": \"schedule_appointment\",\n              \"operation_id\": \"op_fail_001\",\n              \"recommended_next_step\": \"Call the business directly at their listed number to confirm the emergency plumbing slot\"\n            }\n          },\n          \"output\": {\n            \"status\": \"success\",\n            \"result\": {\n              \"escalation_ticket_id\": \"esc_777\",\n              \"assigned_queue\": \"smb_support\"\n            }\n          }\n        }\n      ],\n      \"user_query_examples\": [\n        {\n          \"user_says\": \"I'm stuck \\u2014 get a human at smb_xyz to call me back\",\n          \"agent_call\": {\n            \"tool\": \"escalate_to_human\",\n            \"arguments\": {\n              \"smb_id\": \"smb_xyz\",\n              \"reason\": \"automation_failed\",\n              \"context\": {\n                \"original_operation\": \"schedule_appointment\",\n                \"recommended_next_step\": \"Call the business directly to confirm the slot\"\n              },\n              \"priority\": \"urgent\"\n            }\n          }\n        }\n      ]\n    },\n    {\n      \"name\": \"get_status\",\n      \"description\": \"Query the current state of any in-flight async operation by operation_id.\",\n      \"when_to_use\": \"Use to poll the state of a pending_async operation when no webhook callback has arrived or to check progress.\",\n      \"when_not_to_use\": \"Do not poll more frequently than once per 10 seconds \\u2014 use webhook delivery for real-time updates instead.\",\n      \"execution_profile\": \"sync\",\n      \"compliance_constraints\": [],\n      \"input_schema\": {\n        \"type\": \"object\",\n        \"required\": [\n          \"operation_id\"\n        ],\n        \"properties\": {\n          \"operation_id\": {\n            \"type\": \"string\"\n          }\n        }\n      },\n      \"output_schema\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"operation_id\": {\n            \"type\": \"string\"\n          },\n          \"status\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"pending\",\n              \"executing\",\n              \"success\",\n              \"failure\",\n              \"partial\"\n            ]\n          },\n          \"estimated_completion_time\": {\n            \"type\": \"string\",\n            \"format\": \"date-time\"\n          },\n          \"last_updated_at\": {\n            \"type\": \"string\",\n            \"format\": \"date-time\"\n          },\n          \"partial_result\": {\n            \"type\": \"object\"\n          }\n        }\n      },\n      \"cost_model\": {\n        \"basis\": \"free\",\n        \"unit_price_usd\": 0.0,\n        \"notes\": \"No key required, unmetered.\"\n      },\n      \"slo\": {\n        \"p50_ms\": 50,\n        \"p95_ms\": 200\n      },\n      \"idempotency\": \"read-only\",\n      \"failure_modes\": [\n        \"bad_input\",\n        \"transient\"\n      ],\n      \"examples\": [\n        {\n          \"label\": \"Booking still in progress\",\n          \"input\": {\n            \"operation_id\": \"op_xyz789\"\n          },\n          \"output\": {\n            \"status\": \"executing\",\n            \"estimated_completion_time\": \"2026-04-27T10:01:30Z\"\n          }\n        }\n      ]\n    },\n    {\n      \"name\": \"get_outcome\",\n      \"description\": \"Retrieve the final OutcomeReceipt for a completed operation.\",\n      \"when_to_use\": \"Use after get_status returns success/failure/partial to retrieve the full result with cost and reason codes.\",\n      \"when_not_to_use\": \"Do not use for operations still in pending/executing state \\u2014 use get_status first.\",\n      \"execution_profile\": \"sync\",\n      \"compliance_constraints\": [],\n      \"input_schema\": {\n        \"type\": \"object\",\n        \"required\": [\n          \"operation_id\"\n        ],\n        \"properties\": {\n          \"operation_id\": {\n            \"type\": \"string\"\n          }\n        }\n      },\n      \"output_schema\": {\n        \"$ref\": \"#/components/OutcomeReceipt\"\n      },\n      \"cost_model\": {\n        \"basis\": \"free\",\n        \"unit_price_usd\": 0.0,\n        \"notes\": \"No key required, unmetered.\"\n      },\n      \"slo\": {\n        \"p50_ms\": 50,\n        \"p95_ms\": 200\n      },\n      \"idempotency\": \"read-only\",\n      \"failure_modes\": [\n        \"bad_input\",\n        \"transient\"\n      ],\n      \"examples\": [\n        {\n          \"label\": \"Retrieve booking outcome\",\n          \"input\": {\n            \"operation_id\": \"op_xyz789\"\n          },\n          \"output\": {\n            \"status\": \"success\",\n            \"reason_code\": \"appointment_confirmed\",\n            \"result\": {\n              \"appointment_id\": \"appt_cal_9001\",\n              \"confirmed_time\": \"2026-04-29T10:30:00Z\",\n              \"smb_name\": \"Cuts & Co.\"\n            },\n            \"cost\": {\n              \"amount\": 1.0,\n              \"currency\": \"USD\",\n              \"basis\": \"per_booking_attempt+success_bonus\"\n            },\n            \"channel_used\": \"direct_api:square\"\n          }\n        }\n      ]\n    },\n    {\n      \"name\": \"preview_cost\",\n      \"description\": \"Return an expected cost estimate, latency estimate, and success-probability estimate for a proposed call before execution. Returns the exact price when it is fixed, and a min/max range when the cost depends on channel or outcome. It does not promise an accuracy percentage - check cost_range.\",\n      \"when_to_use\": \"Use before any operation when the agent is operating under a budget constraint and needs to decide whether to proceed.\",\n      \"when_not_to_use\": \"Do not use in a hot loop \\u2014 cache the result for at least 60 seconds if repeating the same preview.\",\n      \"execution_profile\": \"sync\",\n      \"compliance_constraints\": [],\n      \"input_schema\": {\n        \"type\": \"object\",\n        \"required\": [\n          \"operation\",\n          \"params\"\n        ],\n        \"properties\": {\n          \"operation\": {\n            \"type\": \"string\"\n          },\n          \"params\": {\n            \"type\": \"object\",\n            \"description\": \"The same request body you would pass to the operation\"\n          }\n        }\n      },\n      \"output_schema\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"estimated_cost_usd\": {\n            \"type\": \"number\"\n          },\n          \"cost_range\": {\n            \"type\": \"object\",\n            \"properties\": {\n              \"min_usd\": {\n                \"type\": \"number\"\n              },\n              \"max_usd\": {\n                \"type\": \"number\"\n              }\n            }\n          },\n          \"estimated_latency_p50_ms\": {\n            \"type\": \"integer\"\n          },\n          \"estimated_latency_p95_ms\": {\n            \"type\": \"integer\"\n          },\n          \"success_probability_estimate\": {\n            \"type\": \"number\",\n            \"minimum\": 0,\n            \"maximum\": 1\n          },\n          \"channel_likely\": {\n            \"type\": \"string\"\n          },\n          \"cost_accuracy_slo\": {\n            \"type\": \"string\",\n            \"description\": \"Basis of the estimate, not a tolerance. 'exact' when the price is fixed and the preview IS the charge; otherwise a range - consult cost_range for min/max. No accuracy percentage is promised: nothing measures preview against the eventual charge.\",\n            \"examples\": [\n              \"exact\",\n              \"range: see cost_range (min/max)\"\n            ]\n          }\n        }\n      },\n      \"cost_model\": {\n        \"basis\": \"free\",\n        \"unit_price_usd\": 0.0,\n        \"notes\": \"No key required, unmetered.\"\n      },\n      \"slo\": {\n        \"p50_ms\": 100,\n        \"p95_ms\": 500\n      },\n      \"idempotency\": \"read-only\",\n      \"failure_modes\": [\n        \"bad_input\",\n        \"transient\"\n      ],\n      \"examples\": [\n        {\n          \"label\": \"Preview appointment booking cost\",\n          \"input\": {\n            \"operation\": \"schedule_appointment\",\n            \"params\": {\n              \"smb_id\": \"smb_001\",\n              \"action\": \"book\",\n              \"service\": \"haircut\"\n            }\n          },\n          \"output\": {\n            \"estimated_cost_usd\": 1.0,\n            \"cost_range\": {\n              \"min_usd\": 0.25,\n              \"max_usd\": 1.0\n            },\n            \"estimated_latency_p50_ms\": 5000,\n            \"success_probability_estimate\": 0.88,\n            \"channel_likely\": \"direct_api:square\",\n            \"cost_accuracy_slo\": \"\\u00b15%\"\n          }\n        }\n      ],\n      \"user_query_examples\": [\n        {\n          \"user_says\": \"How much will this SMS cost me?\",\n          \"agent_call\": {\n            \"tool\": \"preview_cost\",\n            \"arguments\": {\n              \"operation\": \"send_message\",\n              \"params\": {\n                \"preferred_channel\": \"sms\"\n              }\n            }\n          }\n        },\n        {\n          \"user_says\": \"Estimate the cost of booking via voice fallback\",\n          \"agent_call\": {\n            \"tool\": \"preview_cost\",\n            \"arguments\": {\n              \"operation\": \"schedule_appointment\",\n              \"params\": {\n                \"preferred_channel\": \"voice\"\n              }\n            }\n          }\n        }\n      ]\n    },\n    {\n      \"name\": \"self_test\",\n      \"description\": \"Service health probe: runs 6 internal checks and reports how many passed. Confirms the server is up and responding - it does NOT probe each tool individually. Use to verify connectivity before production use.\",\n      \"when_to_use\": \"Use at agent startup, before high-stakes task sequences, or after receiving unexpected errors to check if the service is degraded.\",\n      \"when_not_to_use\": \"Do not call more than once per minute in production.\",\n      \"execution_profile\": \"sync\",\n      \"compliance_constraints\": [],\n      \"input_schema\": {\n        \"type\": \"object\",\n        \"properties\": {}\n      },\n      \"output_schema\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"healthy\": {\n            \"type\": \"boolean\",\n            \"description\": \"True when every internal check passed. This is the field to branch on.\"\n          },\n          \"all_passed\": {\n            \"type\": \"boolean\",\n            \"description\": \"Alias of healthy.\"\n          },\n          \"passed\": {\n            \"type\": \"integer\",\n            \"description\": \"Checks that passed.\"\n          },\n          \"failed\": {\n            \"type\": \"integer\",\n            \"description\": \"Checks that failed.\"\n          },\n          \"total\": {\n            \"type\": \"integer\",\n            \"description\": \"Number of checks run. Derived from the check list, not a fixed number.\"\n          },\n          \"latency_ms\": {\n            \"type\": \"number\",\n            \"description\": \"How long the checks took.\"\n          },\n          \"failed_checks\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\"\n            },\n            \"description\": \"Names of the checks that failed. Absent when none did.\"\n          },\n          \"version\": {\n            \"type\": \"string\",\n            \"description\": \"Manifest version.\"\n          }\n        },\n        \"required\": [\n          \"healthy\",\n          \"all_passed\",\n          \"passed\",\n          \"failed\",\n          \"total\"\n        ]\n      },\n      \"cost_model\": {\n        \"basis\": \"free\",\n        \"unit_price_usd\": 0.0,\n        \"notes\": \"No key required, unmetered.\"\n      },\n      \"slo\": {\n        \"p50_ms\": 200,\n        \"p95_ms\": 1000\n      },\n      \"idempotency\": \"read-only\",\n      \"failure_modes\": [\n        \"transient\",\n        \"internal\"\n      ],\n      \"examples\": [\n        {\n          \"label\": \"Healthy service response\",\n          \"input\": {},\n          \"output\": {\n            \"healthy\": true,\n            \"all_passed\": true,\n            \"passed\": 6,\n            \"failed\": 0,\n            \"total\": 6,\n            \"latency_ms\": 10.45\n          }\n        }\n      ],\n      \"user_query_examples\": [\n        {\n          \"user_says\": \"Run a health check before I send the broadcast\",\n          \"agent_call\": {\n            \"tool\": \"self_test\",\n            \"arguments\": {}\n          }\n        }\n      ]\n    },\n    {\n      \"name\": \"check_booking_link\",\n      \"description\": \"Free, instant pre-flight check for a booking URL. Classifies which booking platform a URL belongs to and tells you whether import_booking_url will accept it, WITHOUT fetching the page or spending money. Returns the platform, the exact smb_id import_booking_url would assign, the channels the booking will route through, and the inferred country. Use it to de-risk a paid booking BEFORE calling import_booking_url + schedule_appointment.\",\n      \"when_to_use\": \"Call this the moment a user pastes a URL and you are not sure it is a bookable page, or before you commit to a paid schedule_appointment. It is free and sub-100ms, so run it as a guard: if supported=true, proceed to import_booking_url with confidence; if supported=false, fall back to find_business or call_business instead of wasting a booking attempt.\",\n      \"when_not_to_use\": \"Do not use to confirm the page is currently live/available \\u2014 this tool does not fetch the URL, it only classifies its shape. It is not a substitute for import_booking_url (which actually registers the business) or verify_business (which confirms an already-imported smb_id).\",\n      \"execution_profile\": \"sync\",\n      \"compliance_constraints\": [],\n      \"input_schema\": {\n        \"type\": \"object\",\n        \"required\": [\n          \"url\"\n        ],\n        \"properties\": {\n          \"url\": {\n            \"type\": \"string\",\n            \"description\": \"Full http(s) URL to classify, e.g. 'https://cal.com/jane' or 'https://www.opentable.com/r/acme'.\"\n          }\n        }\n      },\n      \"output_schema\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"supported\": {\n            \"type\": \"boolean\",\n            \"description\": \"True if the URL host is a supported booking platform.\"\n          },\n          \"importable\": {\n            \"type\": \"boolean\",\n            \"description\": \"True if import_booking_url will accept this URL (mirrors its host allowlist).\"\n          },\n          \"platform\": {\n            \"type\": \"string\",\n            \"description\": \"Detected platform (e.g. 'cal.com', 'calendly', 'doctolib') or 'unknown'.\"\n          },\n          \"predicted_smb_id\": {\n            \"type\": \"string\",\n            \"description\": \"The idempotent smb_id import_booking_url would assign to this URL.\"\n          },\n          \"expected_channels\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\"\n            }\n          },\n          \"expected_capabilities\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\"\n            }\n          },\n          \"inferred_country\": {\n            \"type\": \"string\"\n          },\n          \"checked_live\": {\n            \"type\": \"boolean\",\n            \"description\": \"Always false \\u2014 this is an offline classification, the page is never fetched.\"\n          }\n        }\n      },\n      \"cost_model\": {\n        \"basis\": \"free\",\n        \"unit_price_usd\": 0.0,\n        \"notes\": \"No key required, unmetered.\"\n      },\n      \"slo\": {\n        \"p50_ms\": 20,\n        \"p95_ms\": 100\n      },\n      \"idempotency\": \"read-only\",\n      \"failure_modes\": [\n        \"bad_input\"\n      ],\n      \"examples\": [\n        {\n          \"label\": \"Supported Cal.com link\",\n          \"input\": {\n            \"url\": \"https://cal.com/jane\"\n          },\n          \"output\": {\n            \"supported\": true,\n            \"importable\": true,\n            \"platform\": \"cal.com\",\n            \"predicted_smb_id\": \"smb_imp_...\",\n            \"expected_channels\": [\n              \"direct_api:calcom\"\n            ],\n            \"checked_live\": false\n          }\n        },\n        {\n          \"label\": \"Unsupported generic URL\",\n          \"input\": {\n            \"url\": \"https://example.com/book-now\"\n          },\n          \"output\": {\n            \"supported\": false,\n            \"importable\": false,\n            \"platform\": \"unknown\"\n          }\n        }\n      ],\n      \"user_query_examples\": [\n        {\n          \"user_says\": \"Is this a bookable link? https://cal.com/jane\",\n          \"agent_call\": {\n            \"tool\": \"check_booking_link\",\n            \"arguments\": {\n              \"url\": \"https://cal.com/jane\"\n            }\n          },\n          \"then_call\": {\n            \"tool\": \"import_booking_url\",\n            \"arguments\": {\n              \"booking_url\": \"https://cal.com/jane\"\n            }\n          }\n        },\n        {\n          \"user_says\": \"Can you book me here: https://www.opentable.com/r/acme-bistro\",\n          \"agent_call\": {\n            \"tool\": \"check_booking_link\",\n            \"arguments\": {\n              \"url\": \"https://www.opentable.com/r/acme-bistro\"\n            }\n          }\n        }\n      ]\n    },\n    {\n      \"name\": \"import_booking_url\",\n      \"description\": \"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 \\u2014 calling twice returns the same smb_id.\",\n      \"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.\",\n      \"when_not_to_use\": \"Do not use if the user only describes a business by name without a URL \\u2014 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).\",\n      \"execution_profile\": \"sync\",\n      \"compliance_constraints\": [],\n      \"input_schema\": {\n        \"type\": \"object\",\n        \"required\": [\n          \"booking_url\"\n        ],\n        \"properties\": {\n          \"booking_url\": {\n            \"type\": \"string\",\n            \"format\": \"uri\",\n            \"description\": \"Full URL the user supplied. Must point at one of the 12 supported booking platforms; auto-detected from the host.\"\n          },\n          \"business_name\": {\n            \"type\": \"string\",\n            \"description\": \"Optional override. If omitted, the business name is auto-extracted from the page's <title> or og:title.\"\n          },\n          \"vertical\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"personal_services\",\n              \"home_services\",\n              \"professional_services\",\n              \"restaurants\",\n              \"retail\",\n              \"healthcare\",\n              \"fitness\"\n            ],\n            \"description\": \"Best-guess vertical. If omitted, inferred from the platform (e.g., Doctolib -> healthcare, OpenTable -> restaurants).\"\n          },\n          \"country_code\": {\n            \"type\": \"string\",\n            \"description\": \"ISO 3166-1 alpha-2 (e.g. 'US', 'FR'). Used for compliance routing on later send_message calls.\"\n          },\n          \"contact_phone\": {\n            \"type\": \"string\",\n            \"description\": \"Optional. If omitted, the platform integration handles outreach.\"\n          },\n          \"contact_email\": {\n            \"type\": \"string\",\n            \"description\": \"Optional.\"\n          },\n          \"capabilities\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\"\n            },\n            \"description\": \"Free-form capability tags (e.g., ['haircut','color','blowdry']).\"\n          }\n        }\n      },\n      \"output_schema\": {\n        \"type\": \"object\",\n        \"required\": [\n          \"status\",\n          \"smb_id\"\n        ],\n        \"properties\": {\n          \"status\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"success\",\n              \"duplicate\",\n              \"fail\"\n            ]\n          },\n          \"smb_id\": {\n            \"type\": \"string\",\n            \"description\": \"Stable identifier \\u2014 pass to schedule_appointment, send_message, or capture_lead next.\"\n          },\n          \"platform\": {\n            \"type\": \"string\",\n            \"description\": \"Detected platform name.\"\n          },\n          \"message\": {\n            \"type\": \"string\"\n          },\n          \"next_steps\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\"\n            }\n          }\n        }\n      },\n      \"cost_model\": {\n        \"basis\": \"free\",\n        \"unit_price_usd\": 0.0,\n        \"notes\": \"No key required, unmetered.\"\n      },\n      \"slo\": {\n        \"p50_latency_ms\": 600,\n        \"max_latency_ms\": 3000\n      },\n      \"examples\": [\n        {\n          \"user_says\": \"Book me a haircut at https://cal.com/jane-salon\",\n          \"agent_call\": {\n            \"tool\": \"import_booking_url\",\n            \"arguments\": {\n              \"booking_url\": \"https://cal.com/jane-salon\",\n              \"vertical\": \"personal_services\"\n            }\n          },\n          \"then_call\": {\n            \"tool\": \"schedule_appointment\",\n            \"arguments\": {\n              \"smb_id\": \"<from_above>\",\n              \"preferred_time\": \"user-specified\"\n            }\n          }\n        },\n        {\n          \"user_says\": \"I want to see Dr. Dupont \\u2014 https://www.doctolib.fr/dentiste/paris/jean-dupont\",\n          \"agent_call\": {\n            \"tool\": \"import_booking_url\",\n            \"arguments\": {\n              \"booking_url\": \"https://www.doctolib.fr/dentiste/paris/jean-dupont\"\n            }\n          }\n        }\n      ],\n      \"user_query_examples\": [\n        {\n          \"user_says\": \"Book me a haircut at https://cal.com/jane-salon\",\n          \"agent_call\": {\n            \"tool\": \"import_booking_url\",\n            \"arguments\": {\n              \"booking_url\": \"https://cal.com/jane-salon\",\n              \"vertical\": \"personal_services\"\n            }\n          },\n          \"then_call\": {\n            \"tool\": \"schedule_appointment\",\n            \"arguments\": {\n              \"smb_id\": \"<from_above>\",\n              \"action\": \"book\"\n            }\n          }\n        },\n        {\n          \"user_says\": \"Schedule with this dentist: https://www.doctolib.fr/dentiste/paris/jean-dupont\",\n          \"agent_call\": {\n            \"tool\": \"import_booking_url\",\n            \"arguments\": {\n              \"booking_url\": \"https://www.doctolib.fr/dentiste/paris/jean-dupont\"\n            }\n          }\n        },\n        {\n          \"user_says\": \"Reserve a table at https://www.opentable.com/r/acme-bistro\",\n          \"agent_call\": {\n            \"tool\": \"import_booking_url\",\n            \"arguments\": {\n              \"booking_url\": \"https://www.opentable.com/r/acme-bistro\",\n              \"vertical\": \"restaurants\"\n            }\n          }\n        }\n      ],\n      \"idempotency\": {\n        \"key_scope\": [\n          \"agent_id\",\n          \"booking_url\"\n        ],\n        \"ttl_seconds\": 86400,\n        \"behavior\": \"Calling import_booking_url twice with the same URL returns the same smb_id (no duplicate). Safe to retry.\"\n      },\n      \"failure_modes\": [\n        {\n          \"reason_code\": \"platform_not_supported\",\n          \"retriable\": false,\n          \"description\": \"Host did not match any of the 12 supported booking platforms.\"\n        },\n        {\n          \"reason_code\": \"url_not_reachable\",\n          \"retriable\": true,\n          \"description\": \"The page returned 404 / 403 / timeout. Retry after fixing the URL.\"\n        },\n        {\n          \"reason_code\": \"page_metadata_extraction_failed\",\n          \"retriable\": false,\n          \"description\": \"Page exists but we could not extract a usable business name. Pass `business_name` explicitly.\"\n        }\n      ]\n    },\n    {\n      \"name\": \"call_business\",\n      \"description\": \"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 \\u2014 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 \\u2014 but the compliance gate still enforces recording consent per jurisdiction. Async: returns a call handle; poll get_outcome for the transcript + extracted fields.\",\n      \"when_to_use\": \"Use when the target business has NO booking URL and NO API \\u2014 only a phone number \\u2014 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).\",\n      \"when_not_to_use\": \"Do NOT use when the business has a booking URL \\u2014 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 \\u2014 the compliance gate and the B2B-only framing reject that.\",\n      \"execution_profile\": \"async_by_default\",\n      \"compliance_constraints\": [\n        \"Business-directed voice call. The opening line identifies the caller as an AI assistant acting on a consumer's behalf.\",\n        \"Recording consent enforced per jurisdiction (two-party-consent states/countries get a spoken consent prompt before recording).\",\n        \"Not for consumer-directed autodialing or prerecorded marketing (TCPA) \\u2014 objective must be an operational business question.\"\n      ],\n      \"input_schema\": {\n        \"type\": \"object\",\n        \"required\": [\n          \"objective\"\n        ],\n        \"properties\": {\n          \"business_phone\": {\n            \"type\": \"string\",\n            \"description\": \"Business phone in E.164 (e.g. +14045550123). Provide this OR smb_id.\"\n          },\n          \"smb_id\": {\n            \"type\": \"string\",\n            \"description\": \"Known SMB identifier with a phone on record. Provide this OR business_phone.\"\n          },\n          \"objective\": {\n            \"type\": \"string\",\n            \"description\": \"What the call should accomplish, in plain language.\"\n          },\n          \"extract_fields\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\"\n            },\n            \"description\": \"Structured fields to pull from the answer, e.g. ['available_tomorrow','price_quote','earliest_slot'].\"\n          },\n          \"country_code\": {\n            \"type\": \"string\",\n            \"description\": \"ISO 3166-1 alpha-2 for compliance + recording-consent routing.\"\n          },\n          \"on_behalf_of\": {\n            \"type\": \"string\",\n            \"description\": \"Name of the consumer the call is placed for.\"\n          },\n          \"max_duration_seconds\": {\n            \"type\": \"integer\",\n            \"maximum\": 600,\n            \"default\": 180\n          }\n        }\n      },\n      \"output_schema\": {\n        \"$ref\": \"#/components/OutcomeReceipt\"\n      },\n      \"cost_model\": {\n        \"basis\": \"per_call\",\n        \"unit_price_usd\": 0.2,\n        \"credits\": 20\n      },\n      \"slo\": {\n        \"p50_ms\": 45000,\n        \"p95_ms\": 180000\n      },\n      \"idempotency\": \"NOT idempotent \\u2014 each call places a new phone call. Do not retry a call_business that returned pending_async; poll get_outcome instead.\",\n      \"failure_modes\": [\n        \"bad_input\",\n        \"voice_not_provisioned\",\n        \"compliance_violation\",\n        \"upstream_failure\"\n      ],\n      \"examples\": [\n        {\n          \"label\": \"Call a plumber with no booking page\",\n          \"input\": {\n            \"business_phone\": \"+14045550142\",\n            \"objective\": \"Ask if they can do an emergency drain unclog tomorrow morning and roughly what it costs.\",\n            \"extract_fields\": [\n              \"available_tomorrow_am\",\n              \"price_estimate\"\n            ],\n            \"country_code\": \"US\",\n            \"on_behalf_of\": \"the customer at 14 Maple St\"\n          },\n          \"output\": {\n            \"status\": \"pending_async\",\n            \"reason_code\": \"call_placed\",\n            \"channel_used\": \"voice_ai:vapi\",\n            \"cost\": {\n              \"amount\": 0.5,\n              \"currency\": \"USD\"\n            }\n          }\n        }\n      ]\n    },\n    {\n      \"name\": \"check_compliance\",\n      \"description\": \"Free, instant pre-flight for the compliance gate. Runs the SAME TCPA / GDPR / CASL / CAN-SPAM / 10DLC gate that send_message and call_business run \\u2014 but in preview mode, so NO message is sent and NO state changes. Tells you whether a (recipient, channel, message_type, content) send would be permitted BEFORE you pay for it, and if not, names the exact rule and how to remediate. Use it to de-risk a paid send the same way check_booking_link de-risks a paid booking.\",\n      \"when_to_use\": \"Call this the moment before send_message or call_business when there is any chance the send is regulated \\u2014 anything tagged marketing, any SMS to a US number (10DLC), any message to an EU/UK (GDPR) or Canadian (CASL) recipient, or any content you are unsure about. It is free and sub-100ms, so run it as a guard: if legal=true, proceed to send_message with confidence; if legal=false, fix the cited blocker instead of burning a paid, rejected send.\",\n      \"when_not_to_use\": \"Do not treat a legal=true as a permanent license \\u2014 the gate re-runs at send time, so a fresh opt-out between preview and send still blocks. Do not use it to check two-party voice recording consent (that is evaluated at call time in the voice adapter, not here). It is not a substitute for send_message; it never delivers anything.\",\n      \"execution_profile\": \"sync\",\n      \"compliance_constraints\": [],\n      \"input_schema\": {\n        \"type\": \"object\",\n        \"required\": [\n          \"recipient_id\",\n          \"content\"\n        ],\n        \"properties\": {\n          \"recipient_id\": {\n            \"type\": \"string\",\n            \"description\": \"Phone in E.164 (e.g. '+14045550100') or email address the message would go to.\"\n          },\n          \"content\": {\n            \"type\": \"string\",\n            \"description\": \"The actual message body you intend to send. The gate classifies the real text, so a meaningful preview needs the real content.\"\n          },\n          \"channel\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"sms\",\n              \"email\",\n              \"voice\"\n            ],\n            \"description\": \"Delivery channel. Omit to auto-infer sms/email from recipient_id; set 'voice' explicitly.\"\n          },\n          \"message_type\": {\n            \"type\": \"string\",\n            \"description\": \"Intent tag: transactional, marketing, reminder, follow_up, notification. 'marketing' triggers the consent checks. Defaults to transactional.\",\n            \"default\": \"transactional\"\n          },\n          \"country_code\": {\n            \"type\": \"string\",\n            \"description\": \"ISO 3166-1 alpha-2 (e.g. 'US', 'DE', 'CA'). Auto-inferred from phone if omitted; drives which jurisdiction rules apply.\"\n          },\n          \"state_code\": {\n            \"type\": \"string\",\n            \"description\": \"US state code (e.g. 'CA') for state-specific rules.\"\n          }\n        }\n      },\n      \"output_schema\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"legal\": {\n            \"type\": \"boolean\",\n            \"description\": \"True if the gate would permit this send.\"\n          },\n          \"channel\": {\n            \"type\": \"string\"\n          },\n          \"message_type\": {\n            \"type\": \"string\"\n          },\n          \"jurisdiction\": {\n            \"type\": \"string\"\n          },\n          \"rule\": {\n            \"type\": \"string\",\n            \"description\": \"The rule that blocked the send (null when legal=true).\"\n          },\n          \"remediation\": {\n            \"type\": \"string\",\n            \"description\": \"How to become compliant (present when legal=false).\"\n          },\n          \"checked_live\": {\n            \"type\": \"boolean\",\n            \"description\": \"Always false \\u2014 this is a gate decision preview, not a live delivery.\"\n          }\n        }\n      },\n      \"cost_model\": {\n        \"basis\": \"free\",\n        \"unit_price_usd\": 0.0,\n        \"notes\": \"No key required, unmetered.\"\n      },\n      \"slo\": {\n        \"p50_ms\": 15,\n        \"p95_ms\": 80\n      },\n      \"idempotency\": \"read-only \\u2014 no send, no audit write, no idempotency key required\",\n      \"failure_modes\": [\n        \"bad_input\"\n      ],\n      \"examples\": [\n        {\n          \"label\": \"Transactional email is permitted\",\n          \"input\": {\n            \"recipient_id\": \"jane@example.com\",\n            \"content\": \"Your appointment at Cuts & Co. is confirmed for Tuesday 10:30am.\",\n            \"message_type\": \"transactional\",\n            \"country_code\": \"US\"\n          },\n          \"output\": {\n            \"status\": \"success\",\n            \"reason_code\": \"compliant\",\n            \"result\": {\n              \"legal\": true,\n              \"channel\": \"email\",\n              \"message_type\": \"transactional\",\n              \"checked_live\": false\n            }\n          }\n        },\n        {\n          \"label\": \"Marketing SMS blocked \\u2014 no recorded consent\",\n          \"input\": {\n            \"recipient_id\": \"+14045550200\",\n            \"content\": \"20% off this week only!\",\n            \"channel\": \"sms\",\n            \"message_type\": \"marketing\",\n            \"country_code\": \"US\"\n          },\n          \"output\": {\n            \"status\": \"success\",\n            \"reason_code\": \"not_compliant\",\n            \"result\": {\n              \"legal\": false,\n              \"rule\": \"TCPA_marketing_consent\",\n              \"remediation\": \"Obtain prior express written consent (TCPA) before sending marketing SMS to US numbers, and pass its consent_record_id.\",\n              \"checked_live\": false\n            }\n          }\n        }\n      ],\n      \"user_query_examples\": [\n        {\n          \"user_says\": \"Is it legal to text this US number a 20%-off promo?\",\n          \"agent_call\": {\n            \"tool\": \"check_compliance\",\n            \"arguments\": {\n              \"recipient_id\": \"+14045550200\",\n              \"content\": \"20% off this week only!\",\n              \"channel\": \"sms\",\n              \"message_type\": \"marketing\",\n              \"country_code\": \"US\"\n            }\n          }\n        },\n        {\n          \"user_says\": \"Before you email the dentist, make sure it's allowed\",\n          \"agent_call\": {\n            \"tool\": \"check_compliance\",\n            \"arguments\": {\n              \"recipient_id\": \"office@dentist.example\",\n              \"content\": \"Do you accept Cigna? Following up on my request.\",\n              \"message_type\": \"follow_up\"\n            }\n          },\n          \"then_call\": {\n            \"tool\": \"send_message\",\n            \"arguments\": {\n              \"recipient\": {\n                \"id_type\": \"email\",\n                \"id_value\": \"office@dentist.example\"\n              },\n              \"message_type\": \"follow_up\",\n              \"content\": {\n                \"body\": \"Do you accept Cigna? Following up on my request.\"\n              }\n            }\n          }\n        }\n      ]\n    },\n    {\n      \"name\": \"verify_company_record\",\n      \"description\": \"Free, live lookup of a company official registry record. Queries the GLEIF global LEI registry (primary, 2.6 million legal entities worldwide) and SEC EDGAR (US public companies) to return the official legal name, LEI, entity status, jurisdiction, registered address, and registry authority. Never fabricates: if the company is not found in these free registries, returns an honest not_found with the sources that were queried.\",\n      \"when_to_use\": \"Use when you need to verify that a company exists as a registered legal entity and retrieve its official registry details -- before signing a contract, qualifying a vendor, validating a counterparty, or populating a due-diligence record. Accepts a legal name plus optional country filter or a direct LEI for a precise lookup.\",\n      \"when_not_to_use\": \"Do not use to verify private companies not registered with GLEIF or SEC. Do not use as an exhaustive fraud-detection tool; this is a first-pass existence check against free public registries, not a full KYC screen.\",\n      \"execution_profile\": \"sync\",\n      \"compliance_constraints\": [],\n      \"input_schema\": {\n        \"type\": \"object\",\n        \"required\": [\n          \"name\"\n        ],\n        \"properties\": {\n          \"name\": {\n            \"type\": \"string\",\n            \"description\": \"Legal company name to look up, e.g. Apple Inc or Volkswagen AG.\"\n          },\n          \"country\": {\n            \"type\": \"string\",\n            \"description\": \"Optional ISO 3166-1 alpha-2 country filter (e.g. US, DE, GB). Narrows GLEIF results to one jurisdiction.\"\n          },\n          \"lei\": {\n            \"type\": \"string\",\n            \"description\": \"Optional 20-character Legal Entity Identifier for a direct, precise lookup.\"\n          }\n        }\n      },\n      \"output_schema\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"status\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"found\",\n              \"not_found\"\n            ]\n          },\n          \"legal_name\": {\n            \"type\": \"string\"\n          },\n          \"lei\": {\n            \"type\": \"string\"\n          },\n          \"entity_status\": {\n            \"type\": \"string\"\n          },\n          \"jurisdiction\": {\n            \"type\": \"string\"\n          },\n          \"registered_address\": {\n            \"type\": \"string\"\n          },\n          \"registry_authority\": {\n            \"type\": \"string\"\n          },\n          \"ticker\": {\n            \"type\": \"string\"\n          },\n          \"sec_cik\": {\n            \"type\": \"string\"\n          },\n          \"sources\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\"\n            }\n          },\n          \"sources_queried\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\"\n            }\n          },\n          \"sources_unavailable\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\"\n            }\n          }\n        }\n      },\n      \"cost_model\": {\n        \"basis\": \"freemium_daily_quota\",\n        \"unit_price_usd\": 0.02,\n        \"free_quota_note\": \"Free up to the daily quota (500/day with a free email-verified key, 100/day anonymous). Beyond the quota, billed per call via credits.\"\n      },\n      \"slo\": {\n        \"p50_ms\": 800,\n        \"p95_ms\": 4000\n      },\n      \"idempotency\": \"read-only\",\n      \"failure_modes\": [\n        \"bad_input\",\n        \"upstream_timeout\"\n      ],\n      \"examples\": [\n        {\n          \"label\": \"Look up Apple Inc by name and country\",\n          \"input\": {\n            \"name\": \"Apple Inc\",\n            \"country\": \"US\"\n          },\n          \"output\": {\n            \"status\": \"found\",\n            \"legal_name\": \"Apple Inc.\",\n            \"lei\": \"HWUPKR0MPOU8FGXBT394\",\n            \"entity_status\": \"ACTIVE\",\n            \"jurisdiction\": \"US\",\n            \"sources\": [\n              \"GLEIF\",\n              \"SEC EDGAR\"\n            ]\n          }\n        },\n        {\n          \"label\": \"Direct LEI lookup\",\n          \"input\": {\n            \"name\": \"Volkswagen AG\",\n            \"lei\": \"529900HNOAA1KXQJUQ27\"\n          },\n          \"output\": {\n            \"status\": \"found\",\n            \"legal_name\": \"Volkswagen AG\",\n            \"lei\": \"529900HNOAA1KXQJUQ27\",\n            \"entity_status\": \"ACTIVE\",\n            \"jurisdiction\": \"DE\",\n            \"sources\": [\n              \"GLEIF\"\n            ]\n          }\n        },\n        {\n          \"label\": \"Company not found in registries\",\n          \"input\": {\n            \"name\": \"zzz-nonexistent-company-xyz\"\n          },\n          \"output\": {\n            \"status\": \"not_found\"\n          }\n        }\n      ],\n      \"user_query_examples\": [\n        {\n          \"user_says\": \"Is Apple Inc a real registered company?\",\n          \"agent_call\": {\n            \"tool\": \"verify_company_record\",\n            \"arguments\": {\n              \"name\": \"Apple Inc\",\n              \"country\": \"US\"\n            }\n          }\n        },\n        {\n          \"user_says\": \"Look up the LEI for Volkswagen AG\",\n          \"agent_call\": {\n            \"tool\": \"verify_company_record\",\n            \"arguments\": {\n              \"name\": \"Volkswagen AG\",\n              \"country\": \"DE\"\n            }\n          }\n        },\n        {\n          \"user_says\": \"Verify this LEI: 529900HNOAA1KXQJUQ27\",\n          \"agent_call\": {\n            \"tool\": \"verify_company_record\",\n            \"arguments\": {\n              \"name\": \"Volkswagen AG\",\n              \"lei\": \"529900HNOAA1KXQJUQ27\"\n            }\n          }\n        }\n      ]\n    },\n    {\n      \"name\": \"screen_sanctions\",\n      \"description\": \"Free screening of a name or entity against official sanctions lists, each fetched from the authority that issues it: the OFAC SDN list from the US Treasury (SDN.CSV plus ALT.CSV for alternate spellings), the EU consolidated financial sanctions list from the European Commission, and the UK Sanctions List from the FCDO. THE UN CONSOLIDATED LIST IS NOT SCREENED -- it carries no licence permitting commercial redistribution, so we do not claim it. ALWAYS check lists_screened on the response: it names the lists that actually ran ON THAT CALL, and a list that failed to load appears in sources_unavailable instead. reason_code is 'partial_screening' whenever any source was unavailable, never 'clear'. Returns screening_status ('hit' | 'clean' | 'candidates' | 'not_screened' -- branch on THIS, not on matched, because matched:false is also false when nothing could be screened), matched: bool, a list of matches with score, program, and source URL, and which lists were screened. Never fabricates a match or a clear -- if no match is found, explicitly names which lists were checked.\",\n      \"when_to_use\": \"Use before onboarding a counterparty, processing a payment, engaging a vendor, or doing any due-diligence step that requires knowing whether a person or entity appears on official sanctions lists. Essential for agents doing business formation, vendor qualification, payments onboarding, trade compliance, or any workflow where a sanctioned counterparty is a legal or reputational risk.\",\n      \"when_not_to_use\": \"Do not use as a substitute for full KYC/AML screening -- this covers sanctions lists only, not PEP (Politically Exposed Person) databases, adverse media, or credit risk. Do not treat a negative result as a compliance clearance; it is informational only. Do not use for bulk screening of large lists -- each call is a live API query.\",\n      \"execution_profile\": \"sync\",\n      \"compliance_constraints\": [],\n      \"input_schema\": {\n        \"type\": \"object\",\n        \"required\": [\n          \"name\"\n        ],\n        \"properties\": {\n          \"name\": {\n            \"type\": \"string\",\n            \"description\": \"Full name of the person or entity to screen, e.g. 'Kim Jong-un' or 'ACME Trading LLC'. Use the most complete name available for best accuracy.\"\n          },\n          \"country\": {\n            \"type\": \"string\",\n            \"description\": \"Optional ISO 3166-1 alpha-2 country code or country name (e.g. 'IR', 'Iran'). It ANNOTATES AND RANKS results; it never removes any. Each EU/UK match carries country_match: true, false, or null when the listing records no country. Nothing is dropped on a mismatch, because the country we hold is the address/nationality on the listing rather than everywhere a party operates - excluding on it would return a clean screen for someone who IS listed.\"\n          },\n          \"type\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"person\",\n              \"entity\"\n            ],\n            \"description\": \"Optional entity type hint. 'person' for individuals, 'entity' for organizations/companies. Omit to screen both.\"\n          }\n        }\n      },\n      \"output_schema\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"matched\": {\n            \"type\": \"boolean\",\n            \"description\": \"True only when a CONFIRMED match was found. False does NOT by itself mean clean - it is also false when no list could be screened. Branch on screening_status, not on this.\"\n          },\n          \"screening_status\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"hit\",\n              \"clean\",\n              \"partial\",\n              \"candidates\",\n              \"not_screened\"\n            ],\n            \"description\": \"What actually happened, because matched:false was ambiguous between two opposite answers. 'hit' = confirmed match. 'clean' = EVERY list screened and nothing found. 'partial' = some lists screened and clean, others did not run - not a full clearance. 'candidates' = screened, nothing confirmed, but possible_matches_unverified is non-empty and a human should look. 'not_screened' = NO list produced a complete screen (outage, stale or unknown-age index, or a name too short/generic to match on safely) - this is not a result and must never be treated as clean. Check lists_screened and sources_unavailable for which was which.\"\n          },\n          \"matches\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"object\",\n              \"properties\": {\n                \"name\": {\n                  \"type\": \"string\",\n                  \"description\": \"Name as it appears on the sanctions list\"\n                },\n                \"list\": {\n                  \"type\": \"string\",\n                  \"description\": \"Sanctions list name (e.g. OFAC-SDN, EU-Financial-Sanctions)\"\n                },\n                \"match_score\": {\n                  \"type\": \"number\",\n                  \"description\": \"Match confidence 0.0-1.0 (higher = more confident)\"\n                },\n                \"program\": {\n                  \"type\": \"string\",\n                  \"description\": \"Sanctions program (e.g. SDGT, IRAN, RUSSIA-EO14024)\"\n                },\n                \"entity_type\": {\n                  \"type\": \"string\",\n                  \"description\": \"INDIVIDUAL, ENTITY, VESSEL, or AIRCRAFT\"\n                },\n                \"source_url\": {\n                  \"type\": \"string\",\n                  \"description\": \"URL of the authoritative source record\"\n                }\n              }\n            }\n          },\n          \"lists_screened\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\"\n            },\n            \"description\": \"Human-readable list of which sanctions lists were actually queried.\"\n          },\n          \"sources_queried\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\"\n            },\n            \"description\": \"API/data URLs that were called during screening.\"\n          },\n          \"screened_at\": {\n            \"type\": \"string\",\n            \"format\": \"date-time\",\n            \"description\": \"UTC timestamp when the screening was performed.\"\n          },\n          \"disclaimer\": {\n            \"type\": \"string\",\n            \"description\": \"Informational disclaimer -- results are not legal advice.\"\n          },\n          \"sources_unavailable\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\"\n            },\n            \"description\": \"Sources that were attempted but unavailable (fail-open: partial results returned).\"\n          }\n        }\n      },\n      \"cost_model\": {\n        \"basis\": \"freemium_daily_quota\",\n        \"unit_price_usd\": 0.02,\n        \"free_quota_note\": \"Free up to the daily quota (500/day with a free email-verified key, 100/day anonymous). Beyond the quota, billed per call via credits.\"\n      },\n      \"slo\": {\n        \"p50_ms\": 2000,\n        \"p95_ms\": 8000,\n        \"max_latency_ms\": 12000,\n        \"notes\": \"Latency dominated by list downloads behind a 6-hour cache: OFAC SDN is a ~5MB CSV from Treasury; the EU and UK lists are served from our own indexed copy, refreshed daily.\"\n      },\n      \"idempotency\": \"full\",\n      \"failure_modes\": [\n        {\n          \"code\": \"bad_input\",\n          \"description\": \"name field is empty or missing\",\n          \"retriable\": false\n        },\n        {\n          \"code\": \"partial_screening\",\n          \"description\": \"One or more upstream sources was unavailable; matches from remaining sources returned\",\n          \"retriable\": true\n        },\n        {\n          \"code\": \"sources_all_unavailable\",\n          \"description\": \"All upstreams timed out or errored; no screening could be performed\",\n          \"retriable\": true\n        }\n      ],\n      \"examples\": [\n        {\n          \"label\": \"Screen a known sanctioned individual\",\n          \"input\": {\n            \"name\": \"Kim Jong-un\",\n            \"country\": \"KP\",\n            \"type\": \"person\"\n          },\n          \"output\": {\n            \"matched\": true,\n            \"matches\": [\n              {\n                \"name\": \"KIM, Jong Un\",\n                \"list\": \"OFAC-SDN\",\n                \"match_score\": 1.0,\n                \"program\": \"DPRK\",\n                \"entity_type\": \"INDIVIDUAL\",\n                \"source_url\": \"https://ofac.treasury.gov/sanctions-list-service\"\n              }\n            ],\n            \"screened_at\": \"2026-08-23T00:00:00Z\",\n            \"disclaimer\": \"Informational screening only, not legal advice; confirm against the official source before acting on any result.\"\n          }\n        },\n        {\n          \"label\": \"Screen a clean (non-sanctioned) name\",\n          \"input\": {\n            \"name\": \"Jane Smith\"\n          },\n          \"output\": {\n            \"matched\": false,\n            \"matches\": [],\n            \"screened_at\": \"2026-08-23T00:00:00Z\",\n            \"disclaimer\": \"Informational screening only, not legal advice; confirm against the official source before acting on any result.\"\n          }\n        },\n        {\n          \"label\": \"Partial result when one upstream is down\",\n          \"input\": {\n            \"name\": \"ACME Trading LLC\"\n          },\n          \"output\": {\n            \"matched\": false,\n            \"matches\": [],\n            \"sources_unavailable\": [\n              \"UK-SANCTIONS (local index unreachable; NOT screened on this call)\"\n            ],\n            \"screened_at\": \"2026-08-23T00:00:00Z\",\n            \"disclaimer\": \"Informational screening only, not legal advice; confirm against the official source before acting on any result.\"\n          }\n        }\n      ],\n      \"user_query_examples\": [\n        {\n          \"user_says\": \"Screen this vendor before we pay them: ACME Trading LLC, Russia\",\n          \"agent_call\": {\n            \"tool\": \"screen_sanctions\",\n            \"arguments\": {\n              \"name\": \"ACME Trading LLC\",\n              \"country\": \"RU\",\n              \"type\": \"entity\"\n            }\n          }\n        },\n        {\n          \"user_says\": \"Is Kim Jong-un on the OFAC list?\",\n          \"agent_call\": {\n            \"tool\": \"screen_sanctions\",\n            \"arguments\": {\n              \"name\": \"Kim Jong-un\",\n              \"country\": \"KP\",\n              \"type\": \"person\"\n            }\n          }\n        },\n        {\n          \"user_says\": \"Run a sanctions check on this person before onboarding\",\n          \"agent_call\": {\n            \"tool\": \"screen_sanctions\",\n            \"arguments\": {\n              \"name\": \"Ivan Petrov\",\n              \"country\": \"RU\",\n              \"type\": \"person\"\n            }\n          }\n        },\n        {\n          \"user_says\": \"Do a compliance check -- is this company sanctioned?\",\n          \"agent_call\": {\n            \"tool\": \"screen_sanctions\",\n            \"arguments\": {\n              \"name\": \"Mahan Air\",\n              \"country\": \"IR\",\n              \"type\": \"entity\"\n            }\n          }\n        }\n      ]\n    },\n    {\n      \"name\": \"map_trade_restriction\",\n      \"description\": \"Free cross-border trade screening of the DESTINATION and the PARTIES. IT DOES NOT CLASSIFY THE PRODUCT: the product argument is recorded and echoed back, never checked against any export-control list, so a controlled item to an unrestricted destination returns no findings and reason_code 'partial' -- never 'clear'. This is not an export-control clearance; classify the item (HS/ECCN) against BIS/EU/UK controls yourself. Given a product and destination country (and optionally an HS code, origin country, and a list of parties to screen), returns: (a) whether the destination or any party hits an export-control or sanctions restriction, (b) the destination risk level (comprehensive_embargo / sectoral_sanctions / elevated_scrutiny / standard), (c) HS code hint if the caller provided one, (d) honest tariff guidance + official links without fabricated rates, and (e) party sanctions screening against OFAC SDN (US Treasury), the EU Consolidated list (European Commission) and the UK Sanctions List (FCDO). Acts as a MIDDLEMAN -- unifies the OFAC comprehensive-embargo map, our own indexed copies of the EU and UK lists, and OFAC SDN into one clean call. Never fabricates a tariff rate, a clear, or a restricted status.\",\n      \"when_to_use\": \"Use before any cross-border trade to flag embargoed destinations, screen exporters/importers/freight forwarders against sanctions lists, and get authoritative links to the applicable tariff databases. Call this as a pre-flight check before quoting, invoicing, or shipping internationally. Covers OFAC comprehensively-embargoed countries (Iran, North Korea, Cuba, Syria) and significant advisory countries (Russia, Belarus, Ukraine Crimea/DNR/LNR regions).\",\n      \"when_not_to_use\": \"Do NOT use as a substitute for a licensed export compliance review. Do NOT use to obtain authoritative tariff rates (this tool returns guidance links, never fabricated rates). Do NOT use for purely domestic shipments where no cross-border movement is involved.\",\n      \"execution_profile\": \"sync\",\n      \"compliance_constraints\": [],\n      \"input_schema\": {\n        \"type\": \"object\",\n        \"required\": [\n          \"product\",\n          \"destination_country\"\n        ],\n        \"properties\": {\n          \"product\": {\n            \"type\": \"string\",\n            \"description\": \"Product name or description, e.g. 'laptop computers', 'crude oil', 'medical devices'. Used in the tariff guidance note.\"\n          },\n          \"hs_code\": {\n            \"type\": \"string\",\n            \"description\": \"Optional Harmonized System code (e.g. '8471.30' for laptops). If provided, echoed back and included in tariff guidance. Not derived -- caller must supply the official HS code.\"\n          },\n          \"origin_country\": {\n            \"type\": \"string\",\n            \"description\": \"Optional ISO 3166-1 alpha-2 code for the exporting country (e.g. 'US', 'DE'). Used in the tariff guidance note.\"\n          },\n          \"destination_country\": {\n            \"type\": \"string\",\n            \"description\": \"ISO 3166-1 alpha-2 code for the importing country (e.g. 'IR', 'CA', 'DE'). Required. Checked against the OFAC comprehensive-embargo map and sectoral-sanctions advisory list.\"\n          },\n          \"parties\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\"\n            },\n            \"description\": \"Optional list of party names to screen (exporter, importer, freight forwarder, end-user, etc.). Each name is screened against OFAC SDN (US Treasury), the EU Consolidated list (European Commission) and the UK Sanctions List (FCDO).\"\n          }\n        }\n      },\n      \"output_schema\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"restricted\": {\n            \"type\": \"boolean\",\n            \"description\": \"True if the destination has a comprehensive embargo OR any party matches an official sanctions list. False otherwise (advisory-only restrictions still appear in restrictions[]).\"\n          },\n          \"restrictions\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"object\",\n              \"properties\": {\n                \"type\": {\n                  \"type\": \"string\",\n                  \"description\": \"embargo | sanctions | export_control\"\n                },\n                \"list\": {\n                  \"type\": \"string\",\n                  \"description\": \"Name of the applicable sanctions/control list\"\n                },\n                \"entity\": {\n                  \"type\": \"string\",\n                  \"description\": \"The matched party name, or null for country-level restrictions\"\n                },\n                \"detail\": {\n                  \"type\": \"string\",\n                  \"description\": \"Human-readable restriction detail\"\n                },\n                \"source_url\": {\n                  \"type\": \"string\",\n                  \"description\": \"URL of the authoritative source record\"\n                }\n              }\n            }\n          },\n          \"hs_code_hint\": {\n            \"type\": \"string\",\n            \"description\": \"The HS code provided by the caller, echoed back. Null if not provided -- use official classification tools to obtain the correct HS code.\"\n          },\n          \"destination_risk\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"comprehensive_embargo\",\n              \"sectoral_sanctions\",\n              \"elevated_scrutiny\",\n              \"standard\"\n            ],\n            \"description\": \"Risk level of the destination country based on OFAC and export-control programmes.\"\n          },\n          \"tariff_note\": {\n            \"type\": \"string\",\n            \"description\": \"Honest tariff guidance with links to USITC HTS, EU TARIC, Canada CBSA, and UK Trade Tariff. Rates are NOT provided to avoid misinformation.\"\n          },\n          \"tariff_source\": {\n            \"type\": \"string\",\n            \"description\": \"Always 'guidance' -- this tool never provides live tariff rates.\"\n          },\n          \"parties_screened\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"object\",\n              \"properties\": {\n                \"party\": {\n                  \"type\": \"string\"\n                },\n                \"matched\": {\n                  \"type\": \"boolean\"\n                },\n                \"matches\": {\n                  \"type\": \"array\"\n                },\n                \"sources_queried\": {\n                  \"type\": \"array\",\n                  \"items\": {\n                    \"type\": \"string\"\n                  }\n                }\n              }\n            }\n          },\n          \"sources_queried\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"string\"\n            },\n            \"description\": \"Data sources that were consulted during the check.\"\n          },\n          \"screened_at\": {\n            \"type\": \"string\",\n            \"format\": \"date-time\",\n            \"description\": \"UTC timestamp when the check was performed.\"\n          },\n          \"disclaimer\": {\n            \"type\": \"string\",\n            \"description\": \"Informational disclaimer -- results are not legal advice.\"\n          }\n        }\n      },\n      \"cost_model\": {\n        \"basis\": \"freemium_daily_quota\",\n        \"unit_price_usd\": 0.02,\n        \"free_quota_note\": \"Free up to the daily quota (500/day with a free email-verified key, 100/day anonymous). Beyond the quota, billed per call via credits.\"\n      },\n      \"slo\": {\n        \"p50_ms\": 3000,\n        \"p95_ms\": 10000,\n        \"max_latency_ms\": 15000,\n        \"notes\": \"Latency dominated by party screening upstream calls. With no parties, response is near-instant (hardcoded destination check only). Each additional party adds ~2-8s for concurrent sanctions screening.\"\n      },\n      \"idempotency\": \"full\",\n      \"failure_modes\": [\n        {\n          \"code\": \"bad_input\",\n          \"description\": \"product is empty or destination_country is missing or not a valid ISO2 code\",\n          \"retriable\": false\n        },\n        {\n          \"code\": \"restricted\",\n          \"description\": \"Destination is comprehensively embargoed or a party matched a sanctions list\",\n          \"retriable\": false\n        },\n        {\n          \"code\": \"advisory\",\n          \"description\": \"Destination has sectoral sanctions or elevated scrutiny but no comprehensive embargo and no party matches\",\n          \"retriable\": false\n        },\n        {\n          \"code\": \"partial_screening\",\n          \"description\": \"One or more upstream sources unavailable; partial results returned (fail-open)\",\n          \"retriable\": true\n        }\n      ],\n      \"examples\": [\n        {\n          \"label\": \"Embargoed destination -- Iran\",\n          \"input\": {\n            \"product\": \"laptop computers\",\n            \"destination_country\": \"IR\"\n          },\n          \"output\": {\n            \"restricted\": true,\n            \"destination_risk\": \"comprehensive_embargo\",\n            \"restrictions\": [\n              {\n                \"type\": \"embargo\",\n                \"list\": \"OFAC-Comprehensive-Sanctions-Programme\",\n                \"entity\": null,\n                \"detail\": \"Iran -- OFAC comprehensive sanctions programme...\",\n                \"source_url\": \"https://ofac.treasury.gov/countries\"\n              }\n            ],\n            \"tariff_source\": \"guidance\",\n            \"screened_at\": \"2026-08-24T00:00:00Z\"\n          }\n        },\n        {\n          \"label\": \"Clean lane -- US to Canada, common product\",\n          \"input\": {\n            \"product\": \"office furniture\",\n            \"origin_country\": \"US\",\n            \"destination_country\": \"CA\"\n          },\n          \"output\": {\n            \"restricted\": false,\n            \"destination_risk\": \"standard\",\n            \"restrictions\": [],\n            \"tariff_source\": \"guidance\",\n            \"screened_at\": \"2026-08-24T00:00:00Z\"\n          }\n        },\n        {\n          \"label\": \"Sanctioned party in the supply chain\",\n          \"input\": {\n            \"product\": \"steel pipes\",\n            \"destination_country\": \"DE\",\n            \"parties\": [\n              \"Kim Jong-un\"\n            ]\n          },\n          \"output\": {\n            \"restricted\": true,\n            \"destination_risk\": \"standard\",\n            \"parties_screened\": [\n              {\n                \"party\": \"Kim Jong-un\",\n                \"matched\": true,\n                \"matches\": [\n                  {\n                    \"list\": \"OFAC-SDN\",\n                    \"match_score\": 0.95\n                  }\n                ]\n              }\n            ],\n            \"tariff_source\": \"guidance\",\n            \"screened_at\": \"2026-08-24T00:00:00Z\"\n          }\n        },\n        {\n          \"label\": \"Russia advisory with HS code provided\",\n          \"input\": {\n            \"product\": \"hydraulic pumps\",\n            \"hs_code\": \"8413.50\",\n            \"destination_country\": \"RU\"\n          },\n          \"output\": {\n            \"restricted\": false,\n            \"destination_risk\": \"sectoral_sanctions\",\n            \"hs_code_hint\": \"8413.50\",\n            \"tariff_source\": \"guidance\",\n            \"screened_at\": \"2026-08-24T00:00:00Z\"\n          }\n        }\n      ],\n      \"user_query_examples\": [\n        {\n          \"user_says\": \"Can we ship laptops to Iran?\",\n          \"agent_call\": {\n            \"tool\": \"map_trade_restriction\",\n            \"arguments\": {\n              \"product\": \"laptop computers\",\n              \"destination_country\": \"IR\"\n            }\n          }\n        },\n        {\n          \"user_says\": \"Screen this supplier before we import from them: Mahan Air, Iran\",\n          \"agent_call\": {\n            \"tool\": \"map_trade_restriction\",\n            \"arguments\": {\n              \"product\": \"aircraft parts\",\n              \"destination_country\": \"US\",\n              \"parties\": [\n                \"Mahan Air\"\n              ]\n            }\n          }\n        },\n        {\n          \"user_says\": \"Is exporting hydraulic pumps to Russia restricted?\",\n          \"agent_call\": {\n            \"tool\": \"map_trade_restriction\",\n            \"arguments\": {\n              \"product\": \"hydraulic pumps\",\n              \"hs_code\": \"8413.50\",\n              \"destination_country\": \"RU\"\n            }\n          }\n        },\n        {\n          \"user_says\": \"Check if we can sell medical devices to Germany, supplier is ACME GmbH\",\n          \"agent_call\": {\n            \"tool\": \"map_trade_restriction\",\n            \"arguments\": {\n              \"product\": \"medical devices\",\n              \"origin_country\": \"US\",\n              \"destination_country\": \"DE\",\n              \"parties\": [\n                \"ACME GmbH\"\n              ]\n            }\n          }\n        }\n      ]\n    },\n    {\n      \"name\": \"get_conversation\",\n      \"description\": \"Read a two-way conversation thread you started: its state, every message exchanged, and how many replies the business has sent.\",\n      \"when_to_use\": \"After send_message with on_behalf_of returns a conversation_id, poll this to read the business's reply. Replies are matched to the right thread exactly (never guessed), so what you read here belongs to YOUR end-user.\",\n      \"when_not_to_use\": \"Do not poll more often than every 10 seconds.\",\n      \"execution_profile\": \"sync\",\n      \"compliance_constraints\": [],\n      \"input_schema\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"conversation_id\": {\n            \"type\": \"string\",\n            \"description\": \"From the send_message receipt (preferred).\"\n          },\n          \"reference\": {\n            \"type\": \"string\",\n            \"description\": \"The 4-digit request reference, e.g. '4821'. Requires business_number.\"\n          },\n          \"business_number\": {\n            \"type\": \"string\",\n            \"description\": \"Scopes a `reference` to one business (references are reused across businesses).\"\n          }\n        }\n      },\n      \"output_schema\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"conversation_id\": {\n            \"type\": \"string\"\n          },\n          \"reference\": {\n            \"type\": \"string\"\n          },\n          \"state\": {\n            \"type\": \"string\",\n            \"enum\": [\n              \"open\",\n              \"awaiting_reply\",\n              \"confirmed\",\n              \"closed\"\n            ]\n          },\n          \"awaiting_reply\": {\n            \"type\": \"boolean\"\n          },\n          \"reply_count\": {\n            \"type\": \"integer\"\n          },\n          \"messages\": {\n            \"type\": \"array\",\n            \"items\": {\n              \"type\": \"object\"\n            }\n          }\n        }\n      },\n      \"cost_model\": {\n        \"basis\": \"free\",\n        \"unit_price_usd\": 0.0,\n        \"notes\": \"No key required, unmetered.\"\n      },\n      \"slo\": {\n        \"p50_ms\": 300,\n        \"p95_ms\": 1200\n      },\n      \"idempotency\": {\n        \"safe_to_retry\": true,\n        \"key\": \"none - read-only\"\n      },\n      \"failure_modes\": [\n        {\n          \"reason_code\": \"conversation_not_found\",\n          \"retriable\": false,\n          \"meaning\": \"No thread matched the id/reference given.\",\n          \"agent_action\": \"Use the conversation_id returned by send_message, or a reference plus business_number.\"\n        },\n        {\n          \"reason_code\": \"invalid_argument\",\n          \"retriable\": false,\n          \"meaning\": \"A reference was supplied without business_number.\",\n          \"agent_action\": \"Add business_number - 4-digit references are reused across businesses.\"\n        },\n        {\n          \"reason_code\": \"not_your_conversation\",\n          \"retriable\": false,\n          \"meaning\": \"The thread belongs to a different agent identity.\",\n          \"agent_action\": \"Use the identity that created the conversation.\"\n        }\n      ],\n      \"examples\": [\n        {\n          \"user_says\": \"Did the salon reply about Sara's booking?\",\n          \"agent_call\": {\n            \"tool\": \"get_conversation\",\n            \"arguments\": {\n              \"conversation_id\": \"conv_1a2b3c4d\"\n            }\n          },\n          \"returns\": \"state=awaiting_reply, reply_count=1, messages=[out: request, in: 'yes 3pm works']\"\n        },\n        {\n          \"user_says\": \"Check request 4821 with that barber\",\n          \"agent_call\": {\n            \"tool\": \"get_conversation\",\n            \"arguments\": {\n              \"reference\": \"4821\",\n              \"business_number\": \"96890000001\"\n            }\n          },\n          \"returns\": \"the thread for reference #4821 at that business\"\n        }\n      ],\n      \"user_query_examples\": [\n        {\n          \"user_says\": \"Did the salon reply about Sara's booking?\",\n          \"agent_call\": {\n            \"tool\": \"get_conversation\",\n            \"arguments\": {\n              \"conversation_id\": \"conv_1a2b3c4d\"\n            }\n          },\n          \"returns\": \"state=awaiting_reply, reply_count=1, messages=[out: request, in: 'yes 3pm works']\"\n        },\n        {\n          \"user_says\": \"Check request 4821 with that barber\",\n          \"agent_call\": {\n            \"tool\": \"get_conversation\",\n            \"arguments\": {\n              \"reference\": \"4821\",\n              \"business_number\": \"96890000001\"\n            }\n          },\n          \"returns\": \"the thread for reference #4821 at that business\"\n        }\n      ]\n    }\n  ],\n  \"components\": {\n    \"OutcomeReceipt\": {\n      \"type\": \"object\",\n      \"properties\": {\n        \"operation_id\": {\n          \"type\": \"string\"\n        },\n        \"status\": {\n          \"type\": \"string\",\n          \"enum\": [\n            \"success\",\n            \"partial\",\n            \"failure\",\n            \"pending_async\"\n          ]\n        },\n        \"reason_code\": {\n          \"type\": \"string\"\n        },\n        \"human_message\": {\n          \"type\": \"string\"\n        },\n        \"result\": {\n          \"type\": \"object\"\n        },\n        \"cost\": {\n          \"type\": \"object\",\n          \"properties\": {\n            \"amount\": {\n              \"type\": \"number\"\n            },\n            \"currency\": {\n              \"type\": \"string\"\n            },\n            \"basis\": {\n              \"type\": \"string\"\n            }\n          }\n        },\n        \"latency_ms\": {\n          \"type\": \"integer\"\n        },\n        \"channel_used\": {\n          \"type\": \"string\"\n        },\n        \"channel_fallback_chain\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"estimated_completion_time\": {\n          \"type\": \"string\",\n          \"format\": \"date-time\"\n        },\n        \"next_actions\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"string\"\n          }\n        },\n        \"retriable\": {\n          \"type\": \"boolean\"\n        },\n        \"trace_id\": {\n          \"type\": \"string\"\n        }\n      }\n    }\n  },\n  \"manifest_version\": \"0.1.0\",\n  \"generated_at\": \"2026-04-27T00:00:00Z\",\n  \"slo_data_freshness\": \"static_seed \\u2014 replace with telemetry-driven values at P8\",\n  \"version\": \"0.2.10\"\n}"}]}},"http_status":200,"headers":{"content-type":"application/json"},"resource_uri":"agent-broker://manifest"}},"determinism_probe":{"status":"ok","latency_ms":12.4,"details":{"attempts":2,"successful":2,"matches":2,"stable_ratio":1.0,"baseline_signature":"7f226a61a5f023506be1e12edf311c6b8b759625512d8a0112170e610295e3f4","errors":[]}},"instruction_tool_reference_probe":{"status":"warning","latency_ms":null,"details":{"referenced_tools":["preview_cost","tools"],"missing_tools":["tools"],"observed_tool_count":20}},"session_resume_probe":{"status":"warning","latency_ms":null,"details":{"reason":"no_session_id","transport":"streamable-http","resume_expected":true,"protocol_version":"2024-11-05"}},"step_up_auth_probe":{"status":"warning","latency_ms":null,"details":{"oauth_present":true,"auth_required_checks":[],"supported_scopes":[],"scope_specificity_ratio":0.0,"broad_scopes":[],"challenge_headers":[],"step_up_signals":[],"minimal_scope_documented":false}},"transport_compliance_probe":{"status":"error","latency_ms":11.98,"details":{"transport":"streamable-http","session_id_present":false,"protocol_header_present":false,"last_event_id_visible":false,"requested_protocol_version":"2024-11-05","bad_protocol_status_code":200,"bad_protocol_payload":{"jsonrpc":"2.0","id":410,"result":{"tools":[{"name":"find_business","description":"Given criteria (vertical, location, capability, price band, availability window), return ranked candidate businesses from our supply network. THE NETWORK IS SMALL AND STILL MOSTLY SAMPLE DATA: entries that are not real are named [DEMO] and flagged is_demo - check that field before acting on a result.\n\nEXAMPLE USER QUERIES THAT MATCH THIS TOOL:\n  user: \"Find me a salon in Tokyo that does color\"\n  -> call find_business({\"vertical\": \"personal_services\", \"location\": {\"zip_or_city\": \"Tokyo\"}, \"capability\": \"color\"})\n  user: \"I need a plumber near 30309\"\n  -> call find_business({\"vertical\": \"home_services\", \"location\": {\"zip_or_city\": \"30309\"}, \"capability\": \"plumbing\"})\n  user: \"Show me dentists in London\"\n  -> call find_business({\"vertical\": \"professional_services\", \"location\": {\"zip_or_city\": \"London\"}, \"capability\": \"dentist\"})\n\nWHEN 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.\nWHEN 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.\nCOST: free - no key required\nLATENCY: ~200ms","inputSchema":{"type":"object","required":["vertical","location"],"properties":{"vertical":{"type":"string","enum":["personal_services","home_services","professional_services"],"description":"Service vertical to search within"},"location":{"type":"object","required":["zip_or_city"],"properties":{"zip_or_city":{"type":"string"},"radius_miles":{"type":"number","default":10}}},"capability":{"type":"string","description":"Specific service capability required, e.g. 'haircut', 'plumbing', 'tax_consultation'"},"price_band":{"type":"object","properties":{"max_usd":{"type":"number"}}},"availability_window":{"type":"object","properties":{"start_iso":{"type":"string","format":"date-time"},"end_iso":{"type":"string","format":"date-time"}},"description":"Accepted but NOT APPLIED - it does not narrow results. We do not hold live calendars for the supply network. The response carries availability_window_applied: false when you send one. To book a specific slot use schedule_appointment with requested_time, which checks real availability."},"max_results":{"type":"integer","default":5,"maximum":20}}},"annotations":{"title":"Find Business","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"verify_business","description":"Look up what we know about a business in our supply network: its contact channels, capabilities, and when the record was last verified. This is a DIRECTORY LOOKUP - it does not contact the business.\n\nEXAMPLE USER QUERIES THAT MATCH THIS TOOL:\n  user: \"Confirm smb_imp_abc actually does emergency plumbing\"\n  -> call verify_business({\"smb_id\": \"smb_imp_abc\", \"capability_to_verify\": \"emergency_plumbing\"})\n\nWHEN 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').\nWHEN NOT TO USE: Do not use if the SMB was returned from find_business within the last 24 hours — those results are already verified.\nCOST: free - no key required\nLATENCY: ~500ms","inputSchema":{"type":"object","required":["smb_id"],"properties":{"smb_id":{"type":"string"},"capability_to_verify":{"type":"string"}}},"annotations":{"title":"Verify Business","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"send_message","description":"Send a message on behalf of an agent's user or an SMB across WhatsApp (free during launch), 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 26 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.\n\nEXAMPLE USER QUERIES THAT MATCH THIS TOOL:\n  user: \"Text the salon I'll be 10 minutes late\"\n  -> call send_message({\"recipient\": {\"id_type\": \"smb_id\", \"id_value\": \"smb_xyz\"}, \"message_type\": \"notification\", \"content\": {\"body\": \"Running about 10 minutes late for my appointment.\"}, \"preferred_channel\": \"sms\"})\n  user: \"Email the dentist about insurance\"\n  -> call send_message({\"recipient\": {\"id_type\": \"email\", \"id_value\": \"front-desk@example-dental.com\"}, \"message_type\": \"transactional\", \"content\": {\"body\": \"Do you accept Cigna insurance?\"}, \"preferred_channel\": \"email\"})\n\nWHEN 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.\nWHEN 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.\nCOST: from $0.02 per_call_variable (see preview_cost for exact)\nLATENCY: ~800ms\nEXECUTION: sync_fast (use get_outcome to retrieve result)","inputSchema":{"type":"object","required":["recipient","message_type","content"],"properties":{"recipient":{"type":"object","required":["id_type","id_value"],"properties":{"id_type":{"type":"string","enum":["phone","email","smb_id","customer_id"]},"id_value":{"type":"string"},"country_code":{"type":"string","description":"ISO 3166-1 alpha-2, required for compliance routing"}}},"message_type":{"type":"string","description":"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_violation receipt) if it's missing, expired, or revoked.","enum":["transactional","marketing","reminder","follow_up","notification"]},"content":{"type":"object","required":["body"],"properties":{"body":{"type":"string"},"subject":{"type":"string","description":"For email channel"},"template_id":{"type":"string"},"template_vars":{"type":"object"}}},"preferred_channel":{"type":"string","enum":["whatsapp","sms","email","voice","auto"],"default":"auto"},"send_at_iso":{"type":"string","format":"date-time","description":"NOT SUPPORTED YET. We do not schedule messages. Supplying a time more than 2 minutes in the future is REFUSED (reason_code scheduling_not_supported) rather than sent immediately, which is what used to happen. Call send_message at the moment you want delivery, or omit this field."},"on_behalf_of":{"type":"string","description":"Who this message is FOR (your end-user's name/label). On WhatsApp this opens a tracked conversation and travels in-message as '#4821 for Sara (via HatchLoop)', so the business knows who it is talking to and their reply is matched back to this exact request instead of guessed. Strongly recommended for two-way channels."},"business_id":{"type":"string","description":"Optional stable id for the recipient business. Enables global demand shaping (we rate-limit total inbound across ALL agents so businesses stay responsive instead of blocking us)."},"idempotency_key":{"type":"string","maxLength":128,"description":"Optional client-supplied key for safe retries. Replaying the same key within 24h returns the original receipt - the operation is NOT re-executed and NOT re-charged."}}},"annotations":{"title":"Send Message","readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":true}},{"name":"capture_lead","description":"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.\n\nEXAMPLE USER QUERIES THAT MATCH THIS TOOL:\n  user: \"Tell smb_xyz I'm interested and want a callback\"\n  -> call capture_lead({\"smb_id\": \"smb_xyz\", \"prospect\": {\"name\": \"Jane\", \"phone\": \"+15551234567\", \"email\": \"jane@example.com\"}, \"source\": \"agent\"})\n\nWHEN 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.\nWHEN NOT TO USE: Do not use for confirmed bookings — use schedule_appointment. Do not use for bulk list imports.\nCOST: $0.05 per_call\nLATENCY: ~600ms\nEXECUTION: sync_fast (use get_outcome to retrieve result)","inputSchema":{"type":"object","required":["smb_id","prospect"],"properties":{"smb_id":{"type":"string"},"prospect":{"type":"object","required":["name"],"properties":{"name":{"type":"string"},"phone":{"type":"string"},"email":{"type":"string","format":"email"},"service_interest":{"type":"string"},"notes":{"type":"string"},"consent_record_id":{"type":"string","description":"Optional ID of a consent record proving the prospect asked to be contacted (e.g., they filled an SMB's intake form or requested a quote). Required when downstream send_message calls are anticipated."}}},"source":{"type":"string","description":"Where the consumer-initiated request originated (e.g., 'consumer_request', 'inbound_quote_form', 'agent_referral_from_find_business')."},"idempotency_key":{"type":"string","maxLength":128,"description":"Optional client-supplied key for safe retries. Replaying the same key within 24h returns the original receipt - the operation is NOT re-executed and NOT re-charged."}}},"annotations":{"title":"Capture Lead","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}},{"name":"schedule_appointment","description":"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.\n\nEXAMPLE USER QUERIES THAT MATCH THIS TOOL:\n  user: \"Book the haircut for next Tuesday at 3pm\"\n  -> call schedule_appointment({\"smb_id\": \"smb_imp_abc\", \"action\": \"book\", \"service\": \"haircut\"})\n  user: \"Cancel my Friday appointment at smb_xyz\"\n  -> call schedule_appointment({\"smb_id\": \"smb_xyz\", \"action\": \"cancel\"})\n  user: \"Reschedule my dental cleaning to next week\"\n  -> call schedule_appointment({\"smb_id\": \"smb_imp_xyz\", \"action\": \"reschedule\"})\n\nWHEN TO USE: Use when an agent needs to book, reschedule, or cancel a specific appointment with a specific SMB. Requires a verified smb_id.\nWHEN 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.\nCOST: from $0.15 per_call_variable (see preview_cost for exact)\nLATENCY: ~5000ms\nEXECUTION: async_by_default (use get_outcome to retrieve result)","inputSchema":{"type":"object","required":["smb_id","action"],"properties":{"smb_id":{"type":"string"},"action":{"type":"string","enum":["book","reschedule","cancel","check_availability"]},"service":{"type":"string"},"customer":{"type":"object","properties":{"name":{"type":"string"},"phone":{"type":"string"},"email":{"type":"string"}}},"requested_time":{"type":"object","properties":{"preferred_iso":{"type":"string","format":"date-time"},"window_start_iso":{"type":"string","format":"date-time"},"window_end_iso":{"type":"string","format":"date-time"},"duration_minutes":{"type":"integer"}}},"existing_appointment_id":{"type":"string","description":"Required for reschedule/cancel"},"notes":{"type":"string"},"idempotency_key":{"type":"string","maxLength":128,"description":"Optional client-supplied key for safe retries. Replaying the same key within 24h returns the original receipt - the operation is NOT re-executed and NOT re-charged."}}},"annotations":{"title":"Schedule Appointment","readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":true}},{"name":"send_transactional_confirmation","description":"Idempotent transactional messages: OTPs, booking confirmations, payment receipts, cancellation notices. Falls back across configured channels; an unconfigured channel fails honestly rather than reporting a delivery that did not happen.\n\nEXAMPLE USER QUERIES THAT MATCH THIS TOOL:\n  user: \"Send the booking confirmation receipt to my email\"\n  -> call send_transactional_confirmation({\"recipient\": {\"id_type\": \"email\", \"id_value\": \"customer@example.com\"}, \"confirmation_type\": \"booking_confirmation\", \"data\": {\"appointment_time\": \"2026-09-03T15:00:00Z\", \"business_name\": \"Salon 718\"}, \"preferred_channel\": \"email\"})\n\nWHEN TO USE: Use for any message that MUST be delivered reliably — OTPs, booking confirmations, receipts. Do not use for marketing.\nWHEN NOT TO USE: Do not use for marketing or promotional messages. Do not use for conversational messages.\nCOST: $0.02 per_call\nLATENCY: ~500ms\nEXECUTION: sync_fast (use get_outcome to retrieve result)","inputSchema":{"type":"object","required":["recipient","confirmation_type","data"],"properties":{"recipient":{"type":"object","required":["phone_or_email"],"properties":{"phone_or_email":{"type":"string"},"name":{"type":"string"}}},"confirmation_type":{"type":"string","enum":["otp","booking_confirmation","payment_receipt","cancellation_notice","reminder"]},"data":{"type":"object","description":"Type-specific payload; e.g., {otp_code} for otp, {appointment_time, smb_name} for booking_confirmation"},"preferred_channel":{"type":"string","enum":["sms","email","auto"],"default":"sms"},"idempotency_key":{"type":"string","maxLength":128,"description":"Optional client-supplied key for safe retries. Replaying the same key within 24h returns the original receipt - the operation is NOT re-executed and NOT re-charged."}}},"annotations":{"title":"Send Transactional Confirmation","readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false}},{"name":"handle_inbound","description":"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.\n\nEXAMPLE USER QUERIES THAT MATCH THIS TOOL:\n  user: \"Process this customer reply for me: 'Yes I want to book Tuesday'\"\n  -> call handle_inbound({\"smb_id\": \"smb_xyz\", \"inbound_channel\": \"sms\", \"raw_message\": \"Yes I want to book Tuesday\"})\n\nWHEN TO USE: Use when an SMB needs inbound message triage — classifying incoming contact-form submissions, SMS replies, voicemails, or email inquiries.\nWHEN NOT TO USE: Do not use for outbound communications. Do not use for compliance-flagged recipient lists without verified opt-in records.\nCOST: $0.03 per_call\nLATENCY: ~3000ms\nEXECUTION: async_by_default (use get_outcome to retrieve result)","inputSchema":{"type":"object","required":["smb_id","inbound_channel","raw_message"],"properties":{"smb_id":{"type":"string"},"inbound_channel":{"type":"string","enum":["sms","email","voice_voicemail","web_form","api"]},"sender":{"type":"object","properties":{"phone":{"type":"string"},"email":{"type":"string"},"name":{"type":"string"}}},"raw_message":{"type":"string"},"received_at_iso":{"type":"string","format":"date-time"},"routing_rules":{"type":"object","description":"Optional override routing policy for this SMB"},"idempotency_key":{"type":"string","maxLength":128,"description":"Optional client-supplied key for safe retries. Replaying the same key within 24h returns the original receipt - the operation is NOT re-executed and NOT re-charged."}}},"annotations":{"title":"Handle Inbound","readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}},{"name":"escalate_to_human","description":"Hand off an in-flight task to a human operator with a full context bundle: transcript, prior actions, identifiers, and a recommended next step.\n\nEXAMPLE USER QUERIES THAT MATCH THIS TOOL:\n  user: \"I'm stuck — get a human at smb_xyz to call me back\"\n  -> call escalate_to_human({\"smb_id\": \"smb_xyz\", \"reason\": \"automation_failed\", \"context\": {\"original_operation\": \"schedule_appointment\", \"recommended_next_step\": \"Call the business directly to confirm the slot\"}, \"priority\": \"urgent\"})\n\nWHEN 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.\nWHEN NOT TO USE: Do not use as a first resort. Escalate only after automated resolution attempts.\nCOST: $0.2 per_call\nLATENCY: ~2000ms\nEXECUTION: async_by_default (use get_outcome to retrieve result)","inputSchema":{"type":"object","required":["smb_id","reason","context"],"properties":{"smb_id":{"type":"string"},"reason":{"type":"string","enum":["automation_failed","customer_requested","compliance_hold","ambiguous_intent","exception_required"]},"context":{"type":"object","properties":{"original_operation":{"type":"string"},"operation_id":{"type":"string"},"transcript":{"type":"array","items":{"type":"object"}},"prior_actions":{"type":"array","items":{"type":"object"}},"recommended_next_step":{"type":"string"}}},"priority":{"type":"string","enum":["normal","urgent"],"default":"normal"},"idempotency_key":{"type":"string","maxLength":128,"description":"Optional client-supplied key for safe retries. Replaying the same key within 24h returns the original receipt - the operation is NOT re-executed and NOT re-charged."}}},"annotations":{"title":"Escalate To Human","readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false}},{"name":"get_status","description":"Query the current state of any in-flight async operation by operation_id.\n\nWHEN TO USE: Use to poll the state of a pending_async operation when no webhook callback has arrived or to check progress.\nWHEN NOT TO USE: Do not poll more frequently than once per 10 seconds — use webhook delivery for real-time updates instead.\nCOST: free - no key required\nLATENCY: ~50ms","inputSchema":{"type":"object","required":["operation_id"],"properties":{"operation_id":{"type":"string"}}},"annotations":{"title":"Get Status","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"get_outcome","description":"Retrieve the final OutcomeReceipt for a completed operation.\n\nWHEN TO USE: Use after get_status returns success/failure/partial to retrieve the full result with cost and reason codes.\nWHEN NOT TO USE: Do not use for operations still in pending/executing state — use get_status first.\nCOST: free - no key required\nLATENCY: ~50ms","inputSchema":{"type":"object","required":["operation_id"],"properties":{"operation_id":{"type":"string"}}},"annotations":{"title":"Get Outcome","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"preview_cost","description":"Return an expected cost estimate, latency estimate, and success-probability estimate for a proposed call before execution. Returns the exact price when it is fixed, and a min/max range when the cost depends on channel or outcome. It does not promise an accuracy percentage - check cost_range.\n\nEXAMPLE USER QUERIES THAT MATCH THIS TOOL:\n  user: \"How much will this SMS cost me?\"\n  -> call preview_cost({\"operation\": \"send_message\", \"params\": {\"preferred_channel\": \"sms\"}})\n  user: \"Estimate the cost of booking via voice fallback\"\n  -> call preview_cost({\"operation\": \"schedule_appointment\", \"params\": {\"preferred_channel\": \"voice\"}})\n\nWHEN TO USE: Use before any operation when the agent is operating under a budget constraint and needs to decide whether to proceed.\nWHEN NOT TO USE: Do not use in a hot loop — cache the result for at least 60 seconds if repeating the same preview.\nCOST: free - no key required\nLATENCY: ~100ms","inputSchema":{"type":"object","required":["operation","params"],"properties":{"operation":{"type":"string"},"params":{"type":"object","description":"The same request body you would pass to the operation"}}},"annotations":{"title":"Preview Cost","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"self_test","description":"Service health probe: runs 6 internal checks and reports how many passed. Confirms the server is up and responding - it does NOT probe each tool individually. Use to verify connectivity before production use.\n\nEXAMPLE USER QUERIES THAT MATCH THIS TOOL:\n  user: \"Run a health check before I send the broadcast\"\n  -> call self_test({})\n\nWHEN TO USE: Use at agent startup, before high-stakes task sequences, or after receiving unexpected errors to check if the service is degraded.\nWHEN NOT TO USE: Do not call more than once per minute in production.\nCOST: free - no key required\nLATENCY: ~200ms","inputSchema":{"type":"object","properties":{}},"annotations":{"title":"Self Test","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"check_booking_link","description":"Free, instant pre-flight check for a booking URL. Classifies which booking platform a URL belongs to and tells you whether import_booking_url will accept it, WITHOUT fetching the page or spending money. Returns the platform, the exact smb_id import_booking_url would assign, the channels the booking will route through, and the inferred country. Use it to de-risk a paid booking BEFORE calling import_booking_url + schedule_appointment.\n\nEXAMPLE USER QUERIES THAT MATCH THIS TOOL:\n  user: \"Is this a bookable link? https://cal.com/jane\"\n  -> call check_booking_link({\"url\": \"https://cal.com/jane\"})\n  -> then import_booking_url({\"booking_url\": \"https://cal.com/jane\"})\n  user: \"Can you book me here: https://www.opentable.com/r/acme-bistro\"\n  -> call check_booking_link({\"url\": \"https://www.opentable.com/r/acme-bistro\"})\n\nWHEN TO USE: Call this the moment a user pastes a URL and you are not sure it is a bookable page, or before you commit to a paid schedule_appointment. It is free and sub-100ms, so run it as a guard: if supported=true, proceed to import_booking_url with confidence; if supported=false, fall back to find_business or call_business instead of wasting a booking attempt.\nWHEN NOT TO USE: Do not use to confirm the page is currently live/available — this tool does not fetch the URL, it only classifies its shape. It is not a substitute for import_booking_url (which actually registers the business) or verify_business (which confirms an already-imported smb_id).\nCOST: free - no key required\nLATENCY: ~20ms","inputSchema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","description":"Full http(s) URL to classify, e.g. 'https://cal.com/jane' or 'https://www.opentable.com/r/acme'."}}},"annotations":{"title":"Check Booking Link","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"import_booking_url","description":"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.\n\nEXAMPLE USER QUERIES THAT MATCH THIS TOOL:\n  user: \"Book me a haircut at https://cal.com/jane-salon\"\n  -> call import_booking_url({\"booking_url\": \"https://cal.com/jane-salon\", \"vertical\": \"personal_services\"})\n  -> then schedule_appointment({\"smb_id\": \"<from_above>\", \"action\": \"book\"})\n  user: \"Schedule with this dentist: https://www.doctolib.fr/dentiste/paris/jean-dupont\"\n  -> call import_booking_url({\"booking_url\": \"https://www.doctolib.fr/dentiste/paris/jean-dupont\"})\n  user: \"Reserve a table at https://www.opentable.com/r/acme-bistro\"\n  -> call import_booking_url({\"booking_url\": \"https://www.opentable.com/r/acme-bistro\", \"vertical\": \"restaurants\"})\n\nWHEN 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.\nWHEN 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).\nCOST: free (no credits) - but requires a free email-verified key\nLATENCY: ~600ms","inputSchema":{"type":"object","required":["booking_url"],"properties":{"booking_url":{"type":"string","format":"uri","description":"Full URL the user supplied. Must point at one of the 12 supported booking platforms; auto-detected from the host."},"business_name":{"type":"string","description":"Optional override. If omitted, the business name is auto-extracted from the page's <title> or og:title."},"vertical":{"type":"string","enum":["personal_services","home_services","professional_services","restaurants","retail","healthcare","fitness"],"description":"Best-guess vertical. If omitted, inferred from the platform (e.g., Doctolib -> healthcare, OpenTable -> restaurants)."},"country_code":{"type":"string","description":"ISO 3166-1 alpha-2 (e.g. 'US', 'FR'). Used for compliance routing on later send_message calls."},"contact_phone":{"type":"string","description":"Optional. If omitted, the platform integration handles outreach."},"contact_email":{"type":"string","description":"Optional."},"capabilities":{"type":"array","items":{"type":"string"},"description":"Free-form capability tags (e.g., ['haircut','color','blowdry'])."},"idempotency_key":{"type":"string","maxLength":128,"description":"Optional client-supplied key for safe retries. Replaying the same key within 24h returns the original receipt - the operation is NOT re-executed and NOT re-charged."}}},"annotations":{"title":"Import Booking Url","readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"call_business","description":"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.\n\nWHEN 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).\nWHEN 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.\nCOST: $0.2 per_call\nLATENCY: ~45000ms\nEXECUTION: async_by_default (use get_outcome to retrieve result)","inputSchema":{"type":"object","required":["objective"],"properties":{"business_phone":{"type":"string","description":"Business phone in E.164 (e.g. +14045550123). Provide this OR smb_id."},"smb_id":{"type":"string","description":"Known SMB identifier with a phone on record. Provide this OR business_phone."},"objective":{"type":"string","description":"What the call should accomplish, in plain language."},"extract_fields":{"type":"array","items":{"type":"string"},"description":"Structured fields to pull from the answer, e.g. ['available_tomorrow','price_quote','earliest_slot']."},"country_code":{"type":"string","description":"ISO 3166-1 alpha-2 for compliance + recording-consent routing."},"on_behalf_of":{"type":"string","description":"Name of the consumer the call is placed for."},"max_duration_seconds":{"type":"integer","maximum":600,"default":180},"idempotency_key":{"type":"string","maxLength":128,"description":"Optional client-supplied key for safe retries. Replaying the same key within 24h returns the original receipt - the operation is NOT re-executed and NOT re-charged."}}},"annotations":{"title":"Call Business","readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":true}},{"name":"check_compliance","description":"Free, instant pre-flight for the compliance gate. Runs the SAME TCPA / GDPR / CASL / CAN-SPAM / 10DLC gate that send_message and call_business run — but in preview mode, so NO message is sent and NO state changes. Tells you whether a (recipient, channel, message_type, content) send would be permitted BEFORE you pay for it, and if not, names the exact rule and how to remediate. Use it to de-risk a paid send the same way check_booking_link de-risks a paid booking.\n\nEXAMPLE USER QUERIES THAT MATCH THIS TOOL:\n  user: \"Is it legal to text this US number a 20%-off promo?\"\n  -> call check_compliance({\"recipient_id\": \"+14045550200\", \"content\": \"20% off this week only!\", \"channel\": \"sms\", \"message_type\": \"marketing\", \"country_code\": \"US\"})\n  user: \"Before you email the dentist, make sure it's allowed\"\n  -> call check_compliance({\"recipient_id\": \"office@dentist.example\", \"content\": \"Do you accept Cigna? Following up on my request.\", \"message_type\": \"follow_up\"})\n  -> then send_message({\"recipient\": {\"id_type\": \"email\", \"id_value\": \"office@dentist.example\"}, \"message_type\": \"follow_up\", \"content\": {\"body\": \"Do you accept Cigna? Following up on my request.\"}})\n\nWHEN TO USE: Call this the moment before send_message or call_business when there is any chance the send is regulated — anything tagged marketing, any SMS to a US number (10DLC), any message to an EU/UK (GDPR) or Canadian (CASL) recipient, or any content you are unsure about. It is free and sub-100ms, so run it as a guard: if legal=true, proceed to send_message with confidence; if legal=false, fix the cited blocker instead of burning a paid, rejected send.\nWHEN NOT TO USE: Do not treat a legal=true as a permanent license — the gate re-runs at send time, so a fresh opt-out between preview and send still blocks. Do not use it to check two-party voice recording consent (that is evaluated at call time in the voice adapter, not here). It is not a substitute for send_message; it never delivers anything.\nCOST: free - no key required\nLATENCY: ~15ms","inputSchema":{"type":"object","required":["recipient_id","content"],"properties":{"recipient_id":{"type":"string","description":"Phone in E.164 (e.g. '+14045550100') or email address the message would go to."},"content":{"type":"string","description":"The actual message body you intend to send. The gate classifies the real text, so a meaningful preview needs the real content."},"channel":{"type":"string","enum":["sms","email","voice"],"description":"Delivery channel. Omit to auto-infer sms/email from recipient_id; set 'voice' explicitly."},"message_type":{"type":"string","description":"Intent tag: transactional, marketing, reminder, follow_up, notification. 'marketing' triggers the consent checks. Defaults to transactional.","default":"transactional"},"country_code":{"type":"string","description":"ISO 3166-1 alpha-2 (e.g. 'US', 'DE', 'CA'). Auto-inferred from phone if omitted; drives which jurisdiction rules apply."},"state_code":{"type":"string","description":"US state code (e.g. 'CA') for state-specific rules."}}},"annotations":{"title":"Check Compliance","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"verify_company_record","description":"Free, live lookup of a company official registry record. Queries the GLEIF global LEI registry (primary, 2.6 million legal entities worldwide) and SEC EDGAR (US public companies) to return the official legal name, LEI, entity status, jurisdiction, registered address, and registry authority. Never fabricates: if the company is not found in these free registries, returns an honest not_found with the sources that were queried.\n\nEXAMPLE USER QUERIES THAT MATCH THIS TOOL:\n  user: \"Is Apple Inc a real registered company?\"\n  -> call verify_company_record({\"name\": \"Apple Inc\", \"country\": \"US\"})\n  user: \"Look up the LEI for Volkswagen AG\"\n  -> call verify_company_record({\"name\": \"Volkswagen AG\", \"country\": \"DE\"})\n  user: \"Verify this LEI: 529900HNOAA1KXQJUQ27\"\n  -> call verify_company_record({\"name\": \"Volkswagen AG\", \"lei\": \"529900HNOAA1KXQJUQ27\"})\n\nWHEN TO USE: Use when you need to verify that a company exists as a registered legal entity and retrieve its official registry details -- before signing a contract, qualifying a vendor, validating a counterparty, or populating a due-diligence record. Accepts a legal name plus optional country filter or a direct LEI for a precise lookup.\nWHEN NOT TO USE: Do not use to verify private companies not registered with GLEIF or SEC. Do not use as an exhaustive fraud-detection tool; this is a first-pass existence check against free public registries, not a full KYC screen.\nCOST: free within the daily quota, then $0.02 per call\nLATENCY: ~800ms","inputSchema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","description":"Legal company name to look up, e.g. Apple Inc or Volkswagen AG."},"country":{"type":"string","description":"Optional ISO 3166-1 alpha-2 country filter (e.g. US, DE, GB). Narrows GLEIF results to one jurisdiction."},"lei":{"type":"string","description":"Optional 20-character Legal Entity Identifier for a direct, precise lookup."}}},"annotations":{"title":"Verify Company Record","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"screen_sanctions","description":"Free screening of a name or entity against official sanctions lists, each fetched from the authority that issues it: the OFAC SDN list from the US Treasury (SDN.CSV plus ALT.CSV for alternate spellings), the EU consolidated financial sanctions list from the European Commission, and the UK Sanctions List from the FCDO. THE UN CONSOLIDATED LIST IS NOT SCREENED -- it carries no licence permitting commercial redistribution, so we do not claim it. ALWAYS check lists_screened on the response: it names the lists that actually ran ON THAT CALL, and a list that failed to load appears in sources_unavailable instead. reason_code is 'partial_screening' whenever any source was unavailable, never 'clear'. Returns screening_status ('hit' | 'clean' | 'candidates' | 'not_screened' -- branch on THIS, not on matched, because matched:false is also false when nothing could be screened), matched: bool, a list of matches with score, program, and source URL, and which lists were screened. Never fabricates a match or a clear -- if no match is found, explicitly names which lists were checked.\n\nEXAMPLE USER QUERIES THAT MATCH THIS TOOL:\n  user: \"Screen this vendor before we pay them: ACME Trading LLC, Russia\"\n  -> call screen_sanctions({\"name\": \"ACME Trading LLC\", \"country\": \"RU\", \"type\": \"entity\"})\n  user: \"Is Kim Jong-un on the OFAC list?\"\n  -> call screen_sanctions({\"name\": \"Kim Jong-un\", \"country\": \"KP\", \"type\": \"person\"})\n  user: \"Run a sanctions check on this person before onboarding\"\n  -> call screen_sanctions({\"name\": \"Ivan Petrov\", \"country\": \"RU\", \"type\": \"person\"})\n  user: \"Do a compliance check -- is this company sanctioned?\"\n  -> call screen_sanctions({\"name\": \"Mahan Air\", \"country\": \"IR\", \"type\": \"entity\"})\n\nWHEN TO USE: Use before onboarding a counterparty, processing a payment, engaging a vendor, or doing any due-diligence step that requires knowing whether a person or entity appears on official sanctions lists. Essential for agents doing business formation, vendor qualification, payments onboarding, trade compliance, or any workflow where a sanctioned counterparty is a legal or reputational risk.\nWHEN NOT TO USE: Do not use as a substitute for full KYC/AML screening -- this covers sanctions lists only, not PEP (Politically Exposed Person) databases, adverse media, or credit risk. Do not treat a negative result as a compliance clearance; it is informational only. Do not use for bulk screening of large lists -- each call is a live API query.\nCOST: free within the daily quota, then $0.02 per call\nLATENCY: ~2000ms","inputSchema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","description":"Full name of the person or entity to screen, e.g. 'Kim Jong-un' or 'ACME Trading LLC'. Use the most complete name available for best accuracy."},"country":{"type":"string","description":"Optional ISO 3166-1 alpha-2 country code or country name (e.g. 'IR', 'Iran'). It ANNOTATES AND RANKS results; it never removes any. Each EU/UK match carries country_match: true, false, or null when the listing records no country. Nothing is dropped on a mismatch, because the country we hold is the address/nationality on the listing rather than everywhere a party operates - excluding on it would return a clean screen for someone who IS listed."},"type":{"type":"string","enum":["person","entity"],"description":"Optional entity type hint. 'person' for individuals, 'entity' for organizations/companies. Omit to screen both."}}},"annotations":{"title":"Screen Sanctions","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"map_trade_restriction","description":"Free cross-border trade screening of the DESTINATION and the PARTIES. IT DOES NOT CLASSIFY THE PRODUCT: the product argument is recorded and echoed back, never checked against any export-control list, so a controlled item to an unrestricted destination returns no findings and reason_code 'partial' -- never 'clear'. This is not an export-control clearance; classify the item (HS/ECCN) against BIS/EU/UK controls yourself. Given a product and destination country (and optionally an HS code, origin country, and a list of parties to screen), returns: (a) whether the destination or any party hits an export-control or sanctions restriction, (b) the destination risk level (comprehensive_embargo / sectoral_sanctions / elevated_scrutiny / standard), (c) HS code hint if the caller provided one, (d) honest tariff guidance + official links without fabricated rates, and (e) party sanctions screening against OFAC SDN (US Treasury), the EU Consolidated list (European Commission) and the UK Sanctions List (FCDO). Acts as a MIDDLEMAN -- unifies the OFAC comprehensive-embargo map, our own indexed copies of the EU and UK lists, and OFAC SDN into one clean call. Never fabricates a tariff rate, a clear, or a restricted status.\n\nEXAMPLE USER QUERIES THAT MATCH THIS TOOL:\n  user: \"Can we ship laptops to Iran?\"\n  -> call map_trade_restriction({\"product\": \"laptop computers\", \"destination_country\": \"IR\"})\n  user: \"Screen this supplier before we import from them: Mahan Air, Iran\"\n  -> call map_trade_restriction({\"product\": \"aircraft parts\", \"destination_country\": \"US\", \"parties\": [\"Mahan Air\"]})\n  user: \"Is exporting hydraulic pumps to Russia restricted?\"\n  -> call map_trade_restriction({\"product\": \"hydraulic pumps\", \"hs_code\": \"8413.50\", \"destination_country\": \"RU\"})\n  user: \"Check if we can sell medical devices to Germany, supplier is ACME GmbH\"\n  -> call map_trade_restriction({\"product\": \"medical devices\", \"origin_country\": \"US\", \"destination_country\": \"DE\", \"parties\": [\"ACME GmbH\"]})\n\nWHEN TO USE: Use before any cross-border trade to flag embargoed destinations, screen exporters/importers/freight forwarders against sanctions lists, and get authoritative links to the applicable tariff databases. Call this as a pre-flight check before quoting, invoicing, or shipping internationally. Covers OFAC comprehensively-embargoed countries (Iran, North Korea, Cuba, Syria) and significant advisory countries (Russia, Belarus, Ukraine Crimea/DNR/LNR regions).\nWHEN NOT TO USE: Do NOT use as a substitute for a licensed export compliance review. Do NOT use to obtain authoritative tariff rates (this tool returns guidance links, never fabricated rates). Do NOT use for purely domestic shipments where no cross-border movement is involved.\nCOST: free within the daily quota, then $0.02 per call\nLATENCY: ~3000ms","inputSchema":{"type":"object","required":["product","destination_country"],"properties":{"product":{"type":"string","description":"Product name or description, e.g. 'laptop computers', 'crude oil', 'medical devices'. Used in the tariff guidance note."},"hs_code":{"type":"string","description":"Optional Harmonized System code (e.g. '8471.30' for laptops). If provided, echoed back and included in tariff guidance. Not derived -- caller must supply the official HS code."},"origin_country":{"type":"string","description":"Optional ISO 3166-1 alpha-2 code for the exporting country (e.g. 'US', 'DE'). Used in the tariff guidance note."},"destination_country":{"type":"string","description":"ISO 3166-1 alpha-2 code for the importing country (e.g. 'IR', 'CA', 'DE'). Required. Checked against the OFAC comprehensive-embargo map and sectoral-sanctions advisory list."},"parties":{"type":"array","items":{"type":"string"},"description":"Optional list of party names to screen (exporter, importer, freight forwarder, end-user, etc.). Each name is screened against OFAC SDN (US Treasury), the EU Consolidated list (European Commission) and the UK Sanctions List (FCDO)."}}},"annotations":{"title":"Map Trade Restriction","readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}},{"name":"get_conversation","description":"Read a two-way conversation thread you started: its state, every message exchanged, and how many replies the business has sent.\n\nEXAMPLE USER QUERIES THAT MATCH THIS TOOL:\n  user: \"Did the salon reply about Sara's booking?\"\n  -> call get_conversation({\"conversation_id\": \"conv_1a2b3c4d\"})\n  user: \"Check request 4821 with that barber\"\n  -> call get_conversation({\"reference\": \"4821\", \"business_number\": \"96890000001\"})\n\nWHEN TO USE: After send_message with on_behalf_of returns a conversation_id, poll this to read the business's reply. Replies are matched to the right thread exactly (never guessed), so what you read here belongs to YOUR end-user.\nWHEN NOT TO USE: Do not poll more often than every 10 seconds.\nCOST: free - no key required\nLATENCY: ~300ms","inputSchema":{"type":"object","properties":{"conversation_id":{"type":"string","description":"From the send_message receipt (preferred)."},"reference":{"type":"string","description":"The 4-digit request reference, e.g. '4821'. Requires business_number."},"business_number":{"type":"string","description":"Scopes a `reference` to one business (references are reused across businesses)."}}},"annotations":{"title":"Get Conversation","readOnlyHint":true,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false}}]}},"bad_protocol_headers":{"content-type":"application/json; charset=utf-8"},"bad_protocol_error":null,"delete_status_code":null,"delete_error":null,"expired_session_status_code":null,"expired_session_error":null,"issues":["missing_session_id","missing_protocol_header","bad_protocol_not_rejected"]}},"utility_coverage_probe":{"status":"missing","latency_ms":112.9,"details":{"completions":{"advertised":false,"sample_target":{"type":"prompt","name":"book_from_any_url","argument_name":"booking_url"},"live_probe":"not_executed"},"pagination":{"supported":false,"next_cursor_methods":[],"metadata_signal":false},"tasks":{"advertised":false,"probe_status":"missing","http_status":200},"initialize_capability_keys":["logging","prompts","resources","tools"]}},"advanced_capabilities_probe":{"status":"warning","latency_ms":null,"details":{"capabilities":{"prompts":true,"resources":true,"completions":false,"roots":false,"sampling":false,"elicitation":false,"structured_outputs":false,"resource_links":true},"enabled_count":3,"enabled":["prompts","resource_links","resources"],"initialize_capability_keys":["logging","prompts","resources","tools"]}},"tool_snapshot_probe":{"status":"ok","latency_ms":null,"details":{"current_tool_count":20,"previous_tool_count":20,"similarity":1.0,"added":[],"removed":[],"changed_outputs":[]}},"connector_replay_probe":{"status":"ok","latency_ms":null,"details":{"backward_compatible":true,"would_break_after_refresh":false,"added_tools":[],"removed_tools":[],"required_arg_breaks":[],"output_breaks":[],"additive_output_changes":[]}},"request_association_probe":{"status":"missing","latency_ms":null,"details":{"reason":"no_request_association_capabilities_advertised"}},"interactive_flow_probe":{"status":"ok","latency_ms":null,"details":{"risk_hits":[],"safe_hits":["consent"],"oauth_supported":true,"prompt_available":true}},"action_safety_probe":{"status":"warning","latency_ms":null,"details":{"summary":{"tool_count":20,"high_risk_tools":4,"destructive_tools":5,"exec_tools":2,"egress_tools":4,"secret_tools":0,"bulk_access_tools":1,"declared_non_read_only_tools":8,"annotation_conflict_tools":0,"risk_distribution":{"low":12,"medium":4,"high":3,"critical":1},"capability_distribution":{"read":12,"write":5,"delete":5,"network":4,"undetermined":2,"exec":2,"export":1},"has_mutating_capability":true,"has_non_read_capability":true},"auth_present":true,"safeguard_count":9,"confirmation_signals":["verify_business","send_message","capture_lead","schedule_appointment","send_transactional_confirmation","escalate_to_human","preview_cost","self_test","check_booking_link","import_booking_url","call_business","check_compliance"],"reason":null}},"official_registry_probe":{"status":"missing","latency_ms":null,"details":{"registry_source":"github_topic_registry","direct_match":false,"official_peer_count":0}},"provenance_divergence_probe":{"status":"not_assessed","latency_ms":null,"details":{"direct_official_match":false,"registry_title":null,"server_card_title":null,"registry_version":null,"server_card_version":null,"registry_homepage":null,"server_card_homepage":null,"registry_repository":null,"server_card_repository":null,"drift_fields":[],"metadata_document_count":1,"compared_fields":["title","version","homepage","repository"],"readable_sources":[],"comparable_field_count":0}},"schema_divergence_probe":{"status":"missing","latency_ms":null,"details":{"reason":"no_server_card_tools","compared_tool_count":0,"compared_dimensions":["server_name","server_version","declared_vs_observed_auth","tool_membership","parameter_names","required_parameters","parameter_types","output_schema_presence"],"server_name_mismatch":false,"card_server_name":null,"live_server_name":"agent-broker","server_version_mismatch":false,"card_server_version":null,"live_server_version":"0.2.10","auth_scheme_mismatch":false}},"connector_publishability_probe":{"status":"warning","latency_ms":null,"details":{"transport":"streamable-http","tool_count":20,"high_risk_tools":4,"blockers":["protocol_version","session_resume","step_up_auth","transport_compliance","request_association","action_safety","server_card"],"criteria":{"remote_transport":true,"initialize":true,"tools_list":true,"protocol_version":false,"session_resume":false,"step_up_auth":false,"transport_compliance":false,"connector_replay":true,"request_association":false,"action_safety":false,"server_card":false,"tool_surface":true,"auth_flow":true}}}}},"active_alerts":[{"code":"server_degraded","severity":"medium","title":"Latest validation is degraded","message":"The server is reachable but at least one important behavior regressed.","addressee":"publisher"},{"code":"instruction_tool_reference_mismatch","severity":"low","title":"Server instructions name unavailable tools","message":"Initialize instructions reference tools not present in tools/list: tools","addressee":"publisher"}],"maintainer_analytics":{},"public_server_reputation":{},"maintainer_response_quality":{},"maintainer_annotations":[],"maintainer_rebuttals":[],"security_posture_summary":{},"tool_security_inventory":[],"transport_compliance":{},"utility_coverage":{},"write_action_governance":{},"provenance_divergence":{},"alias_consolidation":{},"alert_routing":{},"authenticated_validation":{},"hosted_runtime":{},"action_controls_diff":null,"benchmark_tasks":[],"latest_capability_counts":{},"point_loss_breakdown":[],"verdict_traces":{},"current_snapshot":{"schema_version":"verify.trust_snapshot.v1","snapshot_id":"trustsnap_b23a4ceb4079b4f5","generated_at":"2026-08-31T07:27:30.480053+00:00","trust_evaluated_at":"2026-08-31T07:27:30.480053+00:00","evidence_revision":"2c7492a2615f7d821f33a7be","source":"current_snapshot","server":"github-basilalshukaili/agentbroker","last_validated_at":"2026-08-31T06:58:07.618318+00:00","validation_age_hours":0.49,"freshness":{"schema_version":"verify.freshness_profile.v1","last_validated_at":"2026-08-31T06:58:07.618318+00:00","age_hours":0.49,"bucket":"verified_last_24h","label":"Verified in last 24h","badges":["verified_last_24h"],"freshness_sla_hours":720.0,"freshness_sla_status":"met","stale_score_suppressed":false,"display_score":53.46,"raw_score":53.46,"confidence_score":95.0,"confidence_weighted_score":50.8,"tier_status":[{"tier":"community","label":"Community","freshness_sla_hours":720,"met":true,"priority_revalidation":false},{"tier":"pro","label":"Pro","freshness_sla_hours":168,"met":true,"priority_revalidation":true},{"tier":"enterprise","label":"Enterprise","freshness_sla_hours":24,"met":true,"priority_revalidation":true}]},"current_status":"degraded","current_score":53.46,"display_score":53.46,"stale_score_suppressed":false,"production_trust_decision":{"schema_version":"verify.executive_verdict.v1","decision":"Block for production","why":"unauthenticated behavior not proven + degraded live status + score below evaluation threshold","next_action":"revalidate, add safeguards, export policy","reason_count":3},"production_readiness_class":{"code":"needs_remediation","label":"Needs remediation","reason":"Current validation evidence shows operational or discovery gaps that should be fixed first."},"evidence_confidence":{"score":95.0,"label":"high","validation_age_hours":0.49,"live_check_count":19,"basis":{"evidence_bearing_validations":20,"affirmative_live_check_count":19,"validation_age_hours":0.49,"freshness_threshold_hours":24}},"active_alerts":[{"code":"server_degraded","severity":"medium","title":"Latest validation is degraded"},{"code":"instruction_tool_reference_mismatch","severity":"low","title":"Server instructions name unavailable tools"}],"active_alert_summary":{"critical":0,"high":0,"medium":1,"low":1,"high_or_critical":0,"total":2},"materialization":{"state":"partial","trust_core_complete":true,"fields_unavailable":["tool_security_inventory","security_posture_summary","write_action_governance","capability_taxonomy","remediations"],"materialized_at":"2026-08-31T07:27:30.480053+00:00"}},"trust_snapshot":{"schema_version":"verify.trust_snapshot.v1","snapshot_id":"trustsnap_b23a4ceb4079b4f5","generated_at":"2026-08-31T07:27:30.480053+00:00","trust_evaluated_at":"2026-08-31T07:27:30.480053+00:00","evidence_revision":"2c7492a2615f7d821f33a7be","source":"current_snapshot","server":"github-basilalshukaili/agentbroker","last_validated_at":"2026-08-31T06:58:07.618318+00:00","validation_age_hours":0.49,"freshness":{"schema_version":"verify.freshness_profile.v1","last_validated_at":"2026-08-31T06:58:07.618318+00:00","age_hours":0.49,"bucket":"verified_last_24h","label":"Verified in last 24h","badges":["verified_last_24h"],"freshness_sla_hours":720.0,"freshness_sla_status":"met","stale_score_suppressed":false,"display_score":53.46,"raw_score":53.46,"confidence_score":95.0,"confidence_weighted_score":50.8,"tier_status":[{"tier":"community","label":"Community","freshness_sla_hours":720,"met":true,"priority_revalidation":false},{"tier":"pro","label":"Pro","freshness_sla_hours":168,"met":true,"priority_revalidation":true},{"tier":"enterprise","label":"Enterprise","freshness_sla_hours":24,"met":true,"priority_revalidation":true}]},"current_status":"degraded","current_score":53.46,"display_score":53.46,"stale_score_suppressed":false,"production_trust_decision":{"schema_version":"verify.executive_verdict.v1","decision":"Block for production","why":"unauthenticated behavior not proven + degraded live status + score below evaluation threshold","next_action":"revalidate, add safeguards, export policy","reason_count":3},"production_readiness_class":{"code":"needs_remediation","label":"Needs remediation","reason":"Current validation evidence shows operational or discovery gaps that should be fixed first."},"evidence_confidence":{"score":95.0,"label":"high","validation_age_hours":0.49,"live_check_count":19,"basis":{"evidence_bearing_validations":20,"affirmative_live_check_count":19,"validation_age_hours":0.49,"freshness_threshold_hours":24}},"active_alerts":[{"code":"server_degraded","severity":"medium","title":"Latest validation is degraded"},{"code":"instruction_tool_reference_mismatch","severity":"low","title":"Server instructions name unavailable tools"}],"active_alert_summary":{"critical":0,"high":0,"medium":1,"low":1,"high_or_critical":0,"total":2},"materialization":{"state":"partial","trust_core_complete":true,"fields_unavailable":["tool_security_inventory","security_posture_summary","write_action_governance","capability_taxonomy","remediations"],"materialized_at":"2026-08-31T07:27:30.480053+00:00"}},"agent_commerce":{},"latest_claim":null,"maintainer_profile_slug":null,"watch_summary":{},"partial":true,"fields_unavailable":["tool_security_inventory","security_posture_summary","write_action_governance","capability_taxonomy","remediations"],"trust_evaluated_at":"2026-08-31T07:27:30.480053+00:00","evidence_revision":"2c7492a2615f7d821f33a7be","active_alert_summary":{"critical":0,"high":0,"medium":1,"low":1,"high_or_critical":0,"total":2},"materialization":{"state":"partial","trust_core_complete":true,"fields_unavailable":["tool_security_inventory","security_posture_summary","write_action_governance","capability_taxonomy","remediations"],"materialized_at":"2026-08-31T07:27:30.480053+00:00"},"owner_opted_out":false},"latest_validation":null,"current_snapshot":{"schema_version":"verify.trust_snapshot.v1","snapshot_id":"trustsnap_b23a4ceb4079b4f5","generated_at":"2026-08-31T07:27:30.480053+00:00","trust_evaluated_at":"2026-08-31T07:27:30.480053+00:00","evidence_revision":"2c7492a2615f7d821f33a7be","source":"current_snapshot","server":"github-basilalshukaili/agentbroker","last_validated_at":"2026-08-31T06:58:07.618318+00:00","validation_age_hours":0.49,"freshness":{"schema_version":"verify.freshness_profile.v1","last_validated_at":"2026-08-31T06:58:07.618318+00:00","age_hours":0.49,"bucket":"verified_last_24h","label":"Verified in last 24h","badges":["verified_last_24h"],"freshness_sla_hours":720.0,"freshness_sla_status":"met","stale_score_suppressed":false,"display_score":53.46,"raw_score":53.46,"confidence_score":95.0,"confidence_weighted_score":50.8,"tier_status":[{"tier":"community","label":"Community","freshness_sla_hours":720,"met":true,"priority_revalidation":false},{"tier":"pro","label":"Pro","freshness_sla_hours":168,"met":true,"priority_revalidation":true},{"tier":"enterprise","label":"Enterprise","freshness_sla_hours":24,"met":true,"priority_revalidation":true}]},"current_status":"degraded","current_score":53.46,"display_score":53.46,"stale_score_suppressed":false,"production_trust_decision":{"schema_version":"verify.executive_verdict.v1","decision":"Block for production","why":"unauthenticated behavior not proven + degraded live status + score below evaluation threshold","next_action":"revalidate, add safeguards, export policy","reason_count":3},"production_readiness_class":{"code":"needs_remediation","label":"Needs remediation","reason":"Current validation evidence shows operational or discovery gaps that should be fixed first."},"evidence_confidence":{"score":95.0,"label":"high","validation_age_hours":0.49,"live_check_count":19,"basis":{"evidence_bearing_validations":20,"affirmative_live_check_count":19,"validation_age_hours":0.49,"freshness_threshold_hours":24}},"active_alerts":[{"code":"server_degraded","severity":"medium","title":"Latest validation is degraded"},{"code":"instruction_tool_reference_mismatch","severity":"low","title":"Server instructions name unavailable tools"}],"active_alert_summary":{"critical":0,"high":0,"medium":1,"low":1,"high_or_critical":0,"total":2},"materialization":{"state":"partial","trust_core_complete":true,"fields_unavailable":["tool_security_inventory","security_posture_summary","write_action_governance","capability_taxonomy","remediations"],"materialized_at":"2026-08-31T07:27:30.480053+00:00"}},"trust_snapshot":{"schema_version":"verify.trust_snapshot.v1","snapshot_id":"trustsnap_b23a4ceb4079b4f5","generated_at":"2026-08-31T07:27:30.480053+00:00","trust_evaluated_at":"2026-08-31T07:27:30.480053+00:00","evidence_revision":"2c7492a2615f7d821f33a7be","source":"current_snapshot","server":"github-basilalshukaili/agentbroker","last_validated_at":"2026-08-31T06:58:07.618318+00:00","validation_age_hours":0.49,"freshness":{"schema_version":"verify.freshness_profile.v1","last_validated_at":"2026-08-31T06:58:07.618318+00:00","age_hours":0.49,"bucket":"verified_last_24h","label":"Verified in last 24h","badges":["verified_last_24h"],"freshness_sla_hours":720.0,"freshness_sla_status":"met","stale_score_suppressed":false,"display_score":53.46,"raw_score":53.46,"confidence_score":95.0,"confidence_weighted_score":50.8,"tier_status":[{"tier":"community","label":"Community","freshness_sla_hours":720,"met":true,"priority_revalidation":false},{"tier":"pro","label":"Pro","freshness_sla_hours":168,"met":true,"priority_revalidation":true},{"tier":"enterprise","label":"Enterprise","freshness_sla_hours":24,"met":true,"priority_revalidation":true}]},"current_status":"degraded","current_score":53.46,"display_score":53.46,"stale_score_suppressed":false,"production_trust_decision":{"schema_version":"verify.executive_verdict.v1","decision":"Block for production","why":"unauthenticated behavior not proven + degraded live status + score below evaluation threshold","next_action":"revalidate, add safeguards, export policy","reason_count":3},"production_readiness_class":{"code":"needs_remediation","label":"Needs remediation","reason":"Current validation evidence shows operational or discovery gaps that should be fixed first."},"evidence_confidence":{"score":95.0,"label":"high","validation_age_hours":0.49,"live_check_count":19,"basis":{"evidence_bearing_validations":20,"affirmative_live_check_count":19,"validation_age_hours":0.49,"freshness_threshold_hours":24}},"active_alerts":[{"code":"server_degraded","severity":"medium","title":"Latest validation is degraded"},{"code":"instruction_tool_reference_mismatch","severity":"low","title":"Server instructions name unavailable tools"}],"active_alert_summary":{"critical":0,"high":0,"medium":1,"low":1,"high_or_critical":0,"total":2},"materialization":{"state":"partial","trust_core_complete":true,"fields_unavailable":["tool_security_inventory","security_posture_summary","write_action_governance","capability_taxonomy","remediations"],"materialized_at":"2026-08-31T07:27:30.480053+00:00"}},"partial":true,"fields_unavailable":["tool_security_inventory","security_posture_summary","write_action_governance","capability_taxonomy","remediations"],"snapshot_invariant":{"schema_version":"verify.snapshot_invariant.v1","server":"github-basilalshukaili/agentbroker","ok":true,"surface_snapshot_ids":{"page":"trustsnap_b23a4ceb4079b4f5","badge":null,"report":"trustsnap_b23a4ceb4079b4f5","policy":null},"checked_surfaces":["page","report"],"unchecked_surfaces":["badge","policy"],"checked_count_surfaces":[],"count_mismatches":{},"checked_at":"2026-08-31T07:27:30.461088+00:00"},"history":{},"production_readiness":{"code":"needs_remediation","label":"Needs remediation","reason":"Current validation evidence shows operational or discovery gaps that should be fixed first.","badge":"score-low","critical_alerts":0,"high_or_critical_alerts":0,"degraded_by_active_alerts":false},"agent_commerce_readiness":{},"evidence_confidence":{"score":95.0,"label":"high","reason":"Based on 20 recent validations, 19 captured checks, and validation age of 0.5 hours.","live_check_count":19,"validation_age_hours":0.49,"basis":{"evidence_bearing_validations":20,"affirmative_live_check_count":19,"validation_age_hours":0.49,"freshness_threshold_hours":24}},"recommended_for":[],"active_alerts":[{"code":"server_degraded","severity":"medium","title":"Latest validation is degraded","message":"The server is reachable but at least one important behavior regressed.","addressee":"publisher"},{"code":"instruction_tool_reference_mismatch","severity":"low","title":"Server instructions name unavailable tools","message":"Initialize instructions reference tools not present in tools/list: tools","addressee":"publisher"}],"remediations":[],"cache_note":"Fast fallback response; full report evidence is deferred to protect web capacity. Fields listed in fields_unavailable (including tool_security_inventory, and write_action_governance) are not yet computed on this response -- an empty value means unchecked, not confirmed clean. Treat partial responses as indeterminate.","publisher_claim":{"verified":false,"status":"unclaimed","claim_url":"https://verify.sentinelsignal.io/claim?server=github-basilalshukaili%2Fagentbroker&source=report_json","reason_code":"claim_to_publish_metadata","reason":"Claim this profile to verify publisher identity, add evidence, and manage trust metadata.","score_neutral":true},"observed_attention":{"schema":"verify.observed_attention.v1","window_days":30,"level":"none","label":"No observed attention","summary":"No recent machine-readable trust or discovery activity observed for this server.","segments":{"useful_ai_user":{"level":"none","observed":false,"description":"AI-assisted user sessions such as ChatGPT/User or Claude/User."},"machine_trust_evaluator":{"level":"none","observed":false,"description":"Synthetic sessions inspecting multiple trust surfaces such as report, policy, ledger, badge, trust-summary, or compare."},"possible_agent_or_script":{"level":"none","observed":false,"description":"Structured direct sessions with rapid profile, compare, report, policy, badge, or trust-surface fan-out."},"isolated_machine_surface":{"level":"none","observed":false,"description":"Aged-out direct synthetic singleton sessions that touched a machine-readable trust surface without becoming a broader evaluator."},"ai_crawler":{"level":"none","observed":false,"description":"Known AI crawler activity such as ClaudeBot, GPTBot, or similar crawlers."},"search_crawler":{"level":"none","observed":false,"description":"Search and SEO crawler activity."},"browser_like_automation":{"level":"none","observed":false,"description":"Browser-like synthetic sessions with rapid structured endpoint activity."},"confirmed_human":{"level":"none","observed":false,"description":"Confirmed browser-session human activity."}},"surfaces_observed":{"server_profile":false,"compare":false,"compare_json":false,"compare_api":false,"report_json":false,"policy":false,"ledger":false,"badge_metadata":false,"badge_svg":false,"trust_summary":false,"mcp_tool":false},"claim_prompt":{"recommended":false,"reason":"No claim prompt is recommended from observed attention in the current window."},"notes":["Observed attention is based on segmented first-party telemetry.","Crawler and evaluator activity is not treated as confirmed human demand.","Public levels are bucketed to avoid exposing raw traffic counts."]},"owner_activation":{"claim_recommended":false,"reason":"no_observed_attention"},"related_machine_surfaces":{"compare_index":"/compare.json","compare_api":"/v1/compare?server=github-basilalshukaili%2Fagentbroker","trust_summary":"/v1/servers/github-basilalshukaili/agentbroker/trust-summary","ledger":"/v1/servers/github-basilalshukaili/agentbroker/ledger","policy":"/v1/servers/github-basilalshukaili/agentbroker/policy","report":"/v1/servers/github-basilalshukaili/agentbroker/report"},"intelligence_api":{"available":true,"signup_url":"https://verify.sentinelsignal.io/verify-intelligence-api","use_case":"Programmatic MCP server trust, comparison, policy, and evidence enrichment."},"trust_evaluated_at":"2026-08-31T07:27:30.480053+00:00","evidence_revision":"2c7492a2615f7d821f33a7be","active_alert_summary":{"critical":0,"high":0,"medium":1,"low":1,"high_or_critical":0,"total":2},"materialization":{"state":"partial","trust_core_complete":true,"fields_unavailable":["tool_security_inventory","security_posture_summary","write_action_governance","capability_taxonomy","remediations"],"materialized_at":"2026-08-31T07:27:30.480053+00:00"}}