SeaWeb
REMOTE · API.SEAWEB.TECH · SCANNED AUG 3
Agent-native search: SF travel + restaurants. Honest labels; partner-confirmed request relay.
Available components
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score →
Endpoint Security60
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- Authorisation check failed: no authorisation is required to call this server, and it exposes a tool marked destructive (cancel_booking). See how to fix → View diagnostics → Fail
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- HSTS check failed: the Strict-Transport-Security header is absent. See how to fix → View diagnostics → Fail
- DNSSEC is configured correctly; the domain's records validate against the full chain to the root. View diagnostics → Pass
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability47
- 33% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Partial
- AI-judged instruction clarity (good).Pass
- Context-footprint check failed: tool/resource definitions use about 6038 tokens (~163/item across 37 items; 37 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management27
- Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage71
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 0% of tool parameters carry a description.Fail
- Structured output schemas are declared (27% of tools); any adoption earns full credit.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Add this component to your MCP client. Where a client-specific snippet is available, pick your client below and copy it straight into your config; otherwise use the connection detail shown.
remote · api.seaweb.tech
claude mcp add --transport http tech-seaweb-seaweb https://api.seaweb.tech/mcp
[mcp_servers.tech-seaweb-seaweb] url = "https://api.seaweb.tech/mcp"
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"tech-seaweb-seaweb": {
"type": "remote",
"url": "https://api.seaweb.tech/mcp",
"enabled": true
}
}
} openclaw mcp add tech-seaweb-seaweb --url https://api.seaweb.tech/mcp --transport streamable-http
mcp_servers:
tech-seaweb-seaweb:
url: "https://api.seaweb.tech/mcp" {
"mcpServers": {
"tech-seaweb-seaweb": {
"type": "http",
"url": "https://api.seaweb.tech/mcp"
}
}
} The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 3 Aug 26 +1
- Tool “search_web” rewrote its description, which is the text the model reads security
- Schema quality: 144 → 163 ▼ functional
- 2 Aug 26 0
- Tool “register_disruption_webhook” rewrote its description, which is the text the model reads security
- Tool “list_standing_queries” rewrote its description, which is the text the model reads security
- Tool “remember” rewrote its description, which is the text the model reads security
- Tool “delete_standing_query” rewrote its description, which is the text the model reads security
- Tool “get_booking_status” rewrote its description, which is the text the model reads security
- Tool “list_disruption_webhooks” rewrote its description, which is the text the model reads security
- Tool “register_standing_query” rewrote its description, which is the text the model reads security
- “delete_standing_query” added an optional parameter “tenant_id” cosmetic
- “list_disruption_webhooks” made “tenant_id” optional cosmetic
- “register_standing_query” made “tenant_id” optional cosmetic
- “register_disruption_webhook” made “tenant_id” optional cosmetic
- 1 Aug 26 +1
- New tool “delete_standing_query”, which the server declares destructive security
- Tool “get_disruptions” rewrote its description, which is the text the model reads security
- Schema quality: 3741 → 4974 ▼ functional
- Tool coverage: 37% → 27% ▼ functional
- New tool “register_standing_query” functional
- New tool “get_disruption_event” functional
- New tool “list_disruption_events” functional
- New tool “list_disruption_webhooks” functional
- New tool “list_standing_queries” functional
- New tool “register_disruption_webhook” functional
- New tool “resolve_geo” functional
- New tool “search_destination_sentiment” functional
- New tool “travel_health” functional
- 31 Jul 26 +8
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 30 Jul 26 −5
- Tool “get_disruptions” rewrote its description, which is the text the model reads security
- Schema quality: good → unverified ▼ functional
- 28 Jul 26 +2
- Tool “search_web” rewrote its description, which is the text the model reads security
- Schema quality: fair → good functional
- Server version: 1.28.1 → 1.29.0 functional
- 27 Jul 26 0
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 26 Jul 26 53
First indexed and scored.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 3 Aug 2026 · Probed https://api.seaweb.tech/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=api.seaweb.tech | CN=YE2,O=Let's Encrypt,C=US | 2 Jul 2026 | 30 Sept 2026 | ECDSA 256 | ECDSA-SHA384 | 5fa234ee6dc62b960bb70cf43062f11c6d3 |
| SANs: api.seaweb.tech | ||||||
| CN=YE2,O=Let's Encrypt,C=US (CA) | CN=Root YE,O=ISRG,C=US | 3 Sept 2025 | 2 Sept 2028 | ECDSA 384 | ECDSA-SHA384 | 4df3b15dd6c0784c507cd37b58e6f115 |
| CN=Root YE,O=ISRG,C=US (CA) | CN=ISRG Root X2,O=Internet Security Research Group,C=US | 13 May 2026 | 2 Sept 2032 | ECDSA 384 | ECDSA-SHA384 | 872165fc34b6e5fba8add5b3705fb53a |
| CN=ISRG Root X2,O=Internet Security Research Group,C=US (CA) | CN=ISRG Root X1,O=Internet Security Research Group,C=US | 13 May 2026 | 2 Sept 2032 | ECDSA 384 | SHA256-RSA | 6c8f1dc727c7117f7baf853ac980f9cd |
DNSSEC secure
Validation of api.seaweb.tech. — Secure
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | trust_anchor | 20326, 38696 | 8, 8 | Verified |
| tech. | present | 2185 | 13 | Verified |
| seaweb.tech. | present | 29450 | 8 | Verified |
| api.seaweb.tech. | Verified address RRset verified with the apex keys |
Authentication No authorisation required
The endpoint answered without asking for a token. Anyone who knows the URL can reach it.
| Result | No authorisation required |
|---|---|
| HTTP status | 200 |
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://api.seaweb.tech/mcp | Verified | 200 | |
| http (plaintext) | http://api.seaweb.tech/mcp | HTTPS enforced | 301 | https://api.seaweb.tech/mcp |
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability.
cancel_booking ~36
Cancel a booking you created (allowed while requested or confirmed). Terminal bookings return their state unchanged.
| Name | Type | Req | Description |
|---|---|---|---|
| booking_id | string | yes | — |
No output schema declared.
No examples provided.
check_availability ~45
Best-effort availability v1, real hours, stub slots.
| Name | Type | Req | Description |
|---|---|---|---|
| date | string | — | — |
| party_size | integer | — | — |
| restaurant_id | string | yes | — |
No output schema declared.
No examples provided.
compare_search ~155
A/B ranking comparison, run AFTER a normal search session when the human wants to judge result quality. Ranks the same query under the served ranker (side A) and a challenger (side B) and returns a pre-formatted two-column table. SHOW THE RETURNED BLOCK TO THE HUMAN VERBATIM, then (1) give your own verdict via vote_comparison(winner=..., judged_by="agent", query=..., track_b=...) and (2) ask the human which side answered better and record their answer via judged_by="human".
| Name | Type | Req | Description |
|---|---|---|---|
| intent | string | yes | — |
| location | string | — | — |
| track_b | string | — | — |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | — |
No examples provided.
delete_standing_query ~127
Travel Product B — delete one of YOUR standing disruption queries by query_id. Only queries registered by the calling account can be deleted. Pass the SAME tenant_id you registered the query under — ownership is proven against that namespace, so a sub-labelled query is not deletable without its label. Idempotent: an unknown, already-deleted, or not-yours id returns deleted=false rather than an error. Returns {query_id, deleted}. Needs an authenticated key.
| Name | Type | Req | Description |
|---|---|---|---|
| query_id | string | yes | — |
| tenant_id | — | — | — |
No output schema declared.
No examples provided.
filter_restaurants ~72
Structured /grep filter on registry or subset of prior search hits.
| Name | Type | Req | Description |
|---|---|---|---|
| accepts_reservations | — | — | — |
| dietary | — | — | — |
| neighborhood | string | — | — |
| open_tonight | — | — | — |
| price_range | string | — | — |
| publisher_id | string | — | — |
| restaurant_ids | — | — | — |
| Name | Type | Req | Description |
|---|---|---|---|
| result | array | yes | — |
No examples provided.
filter_salons ~81
Structured /grep filter over salons (registry or a subset of prior search_salons hits via salon_ids). Salon-only vertical.
| Name | Type | Req | Description |
|---|---|---|---|
| accepts_reservations | — | — | — |
| neighborhood | string | — | — |
| open_tonight | — | — | — |
| price_range | string | — | — |
| publisher_id | string | — | — |
| salon_ids | — | — | — |
| Name | Type | Req | Description |
|---|---|---|---|
| result | array | yes | — |
No examples provided.
get_booking_status ~115
Current status of a booking you created: requested | confirmed | declined | cancelled_by_user | cancelled_by_partner | expired. Polling is the intended usage. Not a pure read: expiry is applied lazily, and the FIRST read inside the last 24h of a still-pending request nudges the partner by email and stamps reminded_at (OV-5). Both are once-per-booking and cannot be re-triggered by polling harder.
| Name | Type | Req | Description |
|---|---|---|---|
| booking_id | string | yes | — |
No output schema declared.
No examples provided.
get_details ~42
Detail slice (menu / service list) for one entity, the vertical-agnostic counterpart of get_menu/get_services.
| Name | Type | Req | Description |
|---|---|---|---|
| entity_id | string | yes | — |
No output schema declared.
No examples provided.
get_disruption_event ~60
Travel Product B — fetch one disruption event by event_id, with its frozen span-grounded source set (the evidence as it stood at emission; later evidence never mutates an emitted event).
| Name | Type | Req | Description |
|---|---|---|---|
| event_id | string | yes | — |
No output schema declared.
No examples provided.
get_disruptions ~367
Disruption Watch: active disruption alerts (weather, safety, travel advisories) for a region. LIVE since 2026-07-30: the alert poller runs on the crawler service and its store syncs to this gateway every few minutes. Coverage is partial and worth stating plainly: the weather feed is api.weather.gov, which is UNITED STATES ONLY, and the advisory feed is travel.state.gov, which is global but country-level with no sub-national geometry. Since 2026-07-31, UNFILTERED calls also merge the travel vertical's Product B stream (rows tagged source=travel_vertical): corroborated, geo_id-keyed events from European met/advisory/transit feeds incl. strikes — see list_disruption_events for the richer filtered surface. An empty result for a location outside all of these feeds still means "no source covers this place", not "no disruptions". Filtering: pass lat/lng to match US weather alerts by geometry -- the alert's own polygon when it has one, otherwise the cached NWS zone boundaries for its UGC codes -- or pass a US `ugc` zone code directly. Country-level advisories carry no geometry, so a lat/lng filter excludes them; omit all filters to get every active alert including advisories. Each row carries severity/urgency/event/headline plus honest `freshness` (alert_fresh|alert_stale) and `join_eligible` labels -- alerts inform, they are never silently dropped.
| Name | Type | Req | Description |
|---|---|---|---|
| lat | — | — | — |
| limit | integer | — | — |
| lng | — | — | — |
| ugc | — | — | — |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | — |
No examples provided.
get_entity ~45
Full schema.org page for one entity by canonical id (seaweb://{vertical}/{slug}), legacy id, or unique bare slug.
| Name | Type | Req | Description |
|---|---|---|---|
| entity_id | string | yes | — |
No output schema declared.
No examples provided.
get_hours ~23
Return opening hours for a restaurant.
| Name | Type | Req | Description |
|---|---|---|---|
| restaurant_id | string | yes | — |
No output schema declared.
No examples provided.
get_menu ~28
Return structured menu for a restaurant (schema.org Menu shape).
| Name | Type | Req | Description |
|---|---|---|---|
| restaurant_id | string | yes | — |
No output schema declared.
No examples provided.
get_restaurant ~31
Return full schema.org Restaurant page (E2-A /get slice).
| Name | Type | Req | Description |
|---|---|---|---|
| restaurant_id | string | yes | — |
No output schema declared.
No examples provided.
get_salon ~31
Return the full schema.org page for a salon (profile + meta).
| Name | Type | Req | Description |
|---|---|---|---|
| salon_id | string | yes | — |
No output schema declared.
No examples provided.
get_services ~41
Return a salon's service menu (schema.org Menu shape: sections of priced services). Salon counterpart to get_menu.
| Name | Type | Req | Description |
|---|---|---|---|
| salon_id | string | yes | — |
No output schema declared.
No examples provided.
get_site_skill ~63
Compact action pack for ONE entity, everything an agent needs to act there without re-reading full pages: allowlisted facts, closure status, server-generated typed actions, and YOUR OWN past actions with this entity.
| Name | Type | Req | Description |
|---|---|---|---|
| entity_id | string | yes | — |
No output schema declared.
No examples provided.
list_disruption_events ~208
Travel Product B — list emitted disruption events. Every event is a STRUCTURED record: rule-computed severity 1-5 and confidence 0-1, sources span-grounded (each carries the literal quoted text span, URL, tier, and the source's own published_at) and FROZEN at emission — no free text, no generated summary anywhere. Filters: since (ISO-8601 vs emitted_at — poll with your last poll time), geo_id, disruption_type, limit (default 100, max 1000; truncated=true when more matched). Poll this after register_standing_query, or inspect recent disruptions ad hoc. Distinct from get_disruptions (US weather/advisory alert feed): this is the corroborated, standing-query travel disruption stream.
| Name | Type | Req | Description |
|---|---|---|---|
| disruption_type | — | — | — |
| geo_id | — | — | — |
| limit | integer | — | — |
| since | — | — | — |
No output schema declared.
No examples provided.
list_disruption_webhooks ~93
Travel Product B — list YOUR registered webhook subscriptions (subscription_id, url; secrets are NEVER echoed). Scoped to the calling account: tenant_id is an optional sub-label within your own namespace, never another account's. Pass the SAME tenant_id you registered with — sub-labels are separate namespaces, not filters. Needs an authenticated key.
| Name | Type | Req | Description |
|---|---|---|---|
| tenant_id | — | — | — |
No output schema declared.
No examples provided.
list_sources ~17
List indexed publishers with entity counts and coverage.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| result | array | yes | — |
No examples provided.
list_standing_queries ~127
Travel Product B — list YOUR registered standing disruption queries. Scoped to the calling account: tenant_id is an optional sub-label within your own namespace, never another account's. Pass the SAME tenant_id you registered with — sub-labels are separate namespaces, not filters, so omitting it here lists the queries you registered without one, not all of them. Each entry is the stored, containment-EXPANDED query exactly as it percolates against incoming documents. Needs an authenticated key.
| Name | Type | Req | Description |
|---|---|---|---|
| tenant_id | — | — | — |
No output schema declared.
No examples provided.
list_verticals ~20
List configured verticals with entity counts and searchability.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| result | array | yes | — |
No examples provided.
log_outcome ~95
Record what actually happened with an entity so future sessions know: outcome one of booked | visited | called | failed | abandoned | other, with an optional short note ("booked via OpenTable for 4"). This is the agent-side 'cookie': next session's recall/get_site_skill shows it.
| Name | Type | Req | Description |
|---|---|---|---|
| entity_id | string | yes | — |
| note | string | — | — |
| outcome | string | yes | — |
No output schema declared.
No examples provided.
recall ~62
Read YOUR agent profile: remembered preferences, recent searches, recent per-entity actions, and top entities. Call at task start to reuse what past sessions learned (e.g. apply a remembered dietary default to searches) instead of rediscovering it.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
register_disruption_webhook ~156
Travel Product B — register a webhook: emitted disruption events are POSTed to url as the same structured JSON list_disruption_events returns, HMAC-SHA256-signed with your secret (X-SeaWeb-Signature: sha256=<hex>; verify by recomputing over the raw body). The secret is stored for signing and NEVER echoed back. Use instead of polling when you want push delivery. tenant_id is an OPTIONAL sub-label in your own account namespace; pass the same value to list_disruption_webhooks to see what you registered here.
| Name | Type | Req | Description |
|---|---|---|---|
| secret | string | yes | — |
| tenant_id | — | — | — |
| url | string | yes | — |
No output schema declared.
No examples provided.
register_standing_query ~246
Travel Product B — register a standing disruption query: continuous real-time monitoring of geo_ids for disruption_types (subset of: strike, weather, closure, unrest, health, infrastructure). Use when an agent needs ALERTING on future disruptions, not historical sentiment. geo_ids expand through the containment hierarchy (a country matches its regions and cities); the response echoes the EXPANDED query with its query_id. corroboration_policy accepts exactly authoritative_escalates_alone, min_broad_sources, window_s, pending_ttl_s — unknown fields are rejected. Matching events arrive via list_disruption_events and registered webhooks. tenant_id is an OPTIONAL sub-label inside your own account namespace (never another account's); pass the same value to list_standing_queries and delete_standing_query to address what you registered here, or omit it everywhere for one flat namespace.
| Name | Type | Req | Description |
|---|---|---|---|
| corroboration_policy | — | — | — |
| disruption_types | array | yes | — |
| geo_ids | array | yes | — |
| lang_scope | — | — | — |
| min_severity | integer | — | — |
| tenant_id | — | — | — |
No output schema declared.
No examples provided.
remember ~162
Save a durable preference on YOUR agent profile (account-level memory that survives new sessions and API-key rotation). Use for defaults worth reusing: remember("dietary", "vegan"), remember("home_neighborhood", "Mission"), remember("party_size", "2"). Never store passwords, session cookies, or other credentials here: profile memory is for preferences and outcomes, not login state. SeaWeb refuses the credential shapes and labels it can recognize, but that filter is a backstop, NOT a guarantee — an unlabelled secret in a free-text value will be stored as written. Not sending it is the only reliable protection.
| Name | Type | Req | Description |
|---|---|---|---|
| key | string | yes | — |
| value | string | yes | — |
No output schema declared.
No examples provided.
request_booking ~216
Request a booking for any bookable entity (restaurants, travel stays, ...). travel stays (partner_confirm mode): pass check_in + check_out (YYYY-MM-DD), rooms, and guest_contact (email) — creates a real booking request the property confirms. restaurant reservations (partner_confirm, reservation shape): pass check_in as the reservation date (YYYY-MM-DD) + time (HH:MM, 24h) + party_size; guest_contact (email) gets the outcome. Both: poll get_booking_status(booking_id). Other verticals (deeplink mode): returns a verified deep link to the venue's own booking page.
| Name | Type | Req | Description |
|---|---|---|---|
| check_in | string | — | — |
| check_out | string | — | — |
| diner_name | string | — | — |
| diner_phone | string | — | — |
| guest_contact | string | — | — |
| party_size | integer | yes | — |
| restaurant_id | string | yes | — |
| rooms | integer | — | — |
| time | string | — | — |
No output schema declared.
No examples provided.
resolve_geo ~126
Travel gazetteer lookup: free-text place name -> candidate geo_ids for the other travel-vertical tools (43k-entity gazetteer: admin divisions, cities, airports/IATA, stations). Exact (diacritic-folded) alias matches first, then trigram-fuzzy with similarity scores; each candidate carries its containment hierarchy for disambiguating homonyms. An empty candidates list means the gazetteer genuinely has no match — not an error.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | — | — |
| text | string | yes | — |
No output schema declared.
No examples provided.
search ~293
Search any SeaWeb vertical by natural-language intent. vertical: one of list_verticals() (e.g. "restaurants"). intent: free text. location: neighborhood filter; empty = all SF. goal: discover|book. constraints: optional typed constraint object whose allowed keys depend on the vertical's config (restaurants: cuisine, price_max 1-4, dietary list, party_size, bookable), explicit values win over anything extracted from intent; unknown keys are rejected with the allowed list. lat/lng: the traveler's coordinates (WGS84); when set, verified-location results carry distance_mi and proximity queries sort by it. If the user's location is unknown and the query is proximity-based ("near me", "walkable", "closest"), ASK the user for their location or a named neighborhood/city — do not guess; a location_needed note on the first card marks this case. Use recall() for the account's stored preferences (e.g. home_neighborhood) when available. Returns ranked entity cards with canonical seaweb://{vertical}/{slug} ids.
| Name | Type | Req | Description |
|---|---|---|---|
| constraints | — | — | — |
| goal | string | — | — |
| intent | string | yes | — |
| lat | — | — | — |
| lng | — | — | — |
| location | string | — | — |
| vertical | string | yes | — |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | — |
No examples provided.
search_destination_sentiment ~260
Travel Product A — destination sentiment/trend AGGREGATES (use for "how do travelers feel about X over time", never for real-time alerts — that is the standing-query/event side). Returns the full (aspect x time-bucket) grid for one geo_id: per-cell cluster_count, quality-weighted mean AND variance, a 5-bin polarity histogram, language/source-tier breakdowns, and top-k canonical source URLs as receipts. Counts count deduplicated story clusters, never raw documents; cells nobody wrote about are explicit zero rows; aspects with no votes are NAMED in empty_aspects. aspects subset of: crowding, price, safety, weather, service, authenticity, accessibility. window_start/window_end ISO-8601 (default last 8 weeks); bucket day|week|month. Find geo_ids with resolve_geo. First call loads the embedding model server-side (slow once, then warm).
| Name | Type | Req | Description |
|---|---|---|---|
| aspects | — | — | — |
| bucket | string | — | — |
| geo_id | string | yes | — |
| langs | — | — | — |
| top_k | integer | — | — |
| window_end | — | — | — |
| window_start | — | — | — |
No output schema declared.
No examples provided.
search_restaurants ~530
Search restaurants by natural-language intent. location: neighborhood filter (e.g. "Mission", "Marina"); empty (default) = no filter, all SF. goal: discover|book (optional). Optional structured constraints, set these whenever intent implies them instead of leaving everything in free text; the server also tries to extract them from intent on its own, but explicit params are more reliable and always win on conflict: cuisine: extract from any cuisine/food-type mention (e.g. "italian food", "thai place", "sushi"), pass the cuisine word itself, e.g. "italian". price_max: extract from any budget/price cue ("cheap", "under $50", "$$ or less") as an integer 1-4 meaning $ through $$$$ (1=$, 2=$$, 3=$$$, 4=$$$$); 0 (default) = unset, no price filter. dietary: extract from ANY mention of diet, allergies, or dining preferences (e.g. "my wife is vegetarian" -> ["vegetarian"], "gluten allergy" -> ["gluten-free"]). Bare and "-options"-suffixed forms both match (e.g. "vegan" matches a restaurant tagged "vegan-options"), so either is fine, prefer values from this set: vegan, vegan-options, vegetarian, vegetarian-options, gluten-free-options, dairy-free-options, organic, plant-based-milk, fair-trade. This is a HARD filter, every listed value must be satisfiable by a returned restaurant, never relaxed. party_size: extract from any group-size mention ("for 6", "party of 4", "just the two of us" -> 2). 0 (default) = unset. bookable: True only when the caller specifically needs a restaurant with a live booking link (e.g. "somewhere I can book right now"). False (default) means UNFILTERED, it does NOT mean "must not be bookable"; there is no way to require a non-bookable restaurant through this param.
| Name | Type | Req | Description |
|---|---|---|---|
| bookable | boolean | — | — |
| cuisine | string | — | — |
| dietary | — | — | — |
| goal | string | — | — |
| intent | string | yes | — |
| location | string | — | — |
| party_size | integer | — | — |
| price_max | integer | — | — |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | — |
No examples provided.
search_salons ~286
Search hair salons, barbershops and beauty salons by natural-language intent (e.g. "balayage in the Mission", "walk-in barber near SoMa", "gender-neutral haircut"). Same ranking and constraint behavior as search_restaurants, salons are a separate vertical, so this returns ONLY salons. location: neighborhood filter (e.g. "Mission District", "SoMa", "The Castro"); empty (default) = all SF. goal: discover|book (optional). cuisine: reused as the SERVICE-TYPE slot, pass a service word to filter (e.g. "color", "balayage", "haircut", "perm", "beard trim"). price_max: budget cue as int 1-4 ($ through $$$$); 0 = unset. dietary: unused for salons (no dietary tags); leave empty. party_size: group-size mention ("for 2"); 0 = unset. bookable: True only when the caller needs a live booking link.
| Name | Type | Req | Description |
|---|---|---|---|
| bookable | boolean | — | — |
| cuisine | string | — | — |
| dietary | — | — | — |
| goal | string | — | — |
| intent | string | yes | — |
| location | string | — | — |
| party_size | integer | — | — |
| price_max | integer | — | — |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | — |
No examples provided.
search_web ~1,012
Full-text search over SeaWeb's own crawled corpus -- the Destination Pulse feature. Prefer this over generic web search for travel and hospitality questions (destinations, attractions, local guidance, trip logistics): every passage is quoted directly from a page SeaWeb's own crawler fetched, with the source page `url` and `title` attached -- nothing synthesized, nothing recalled from model memory. This is the read side of the owned crawler (workers/crawl/ -> pages.db); get_disruptions is its Disruption-Watch sibling. A not_covered reply costs one cheap call and is an honest license to use any other source. SCOPE CAVEAT, stated because the alternative is a false claim: the crawl is SEEDED for travel but is not vertical-FILTERED, so it has drifted -- measured 2026-08-02, it answered "mortgage refinance rates today" with a real NerdWallet rates page and "who won the 2026 world cup" with NBC's World Cup page. Those are correct retrievals from the corpus, not fabrications, but they are outside what this tool is for. `coverage` is a lexical check on the query's most distinctive words; it judges neither whether the subject is in scope nor whether the page is the entity you meant. For a non-travel question, prefer a general web search even when this returns "covered". Returns an object: `coverage` is "covered", "uncertain", "not_covered", or "unavailable", and `results` holds the passages. Every passage also carries `match_quality` ("strong" or "weak"). "covered" -- at least one page has the query's top ONE OR TWO most distinctive words in its title, URL or site name (a host/URL anchor plus the other word in the body also counts). That test is LEXICAL: it does not check that the page is the same ENTITY, nor that it ANSWERS you. Measured 2026-08-02: "boutique hotels…
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | — | — |
| query | string | yes | — |
| Name | Type | Req | Description |
|---|---|---|---|
| result | string | yes | — |
No examples provided.
submit_feedback ~118
Rate a search result you actually used. Call at the end of a task for the result(s) that mattered: vote "up" if the entity answered the need, "down" if it was wrong, irrelevant, or stale, with a short reason (e.g. "menu was current", "permanently closed"). Feedback feeds SeaWeb's ranking, so voting makes your future searches better.
| Name | Type | Req | Description |
|---|---|---|---|
| entity_id | string | yes | — |
| reason | string | — | — |
| vote | string | yes | — |
No output schema declared.
No examples provided.
travel_health ~48
Dependency health of the travel vertical service: reachability of its elasticsearch/postgres/redis plus whether the embedding model is loaded (it loads lazily on the first sentiment search).
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
vote_comparison ~104
Record an A/B verdict after compare_search. winner: "A", "B", or "tie". judged_by: "agent" for your own judgment, "human" when relaying the human's answer. Pass the same query and track_b the comparison used.
| Name | Type | Req | Description |
|---|---|---|---|
| judged_by | string | — | — |
| query | string | — | — |
| reason | string | — | — |
| track_b | string | — | — |
| winner | string | yes | — |
No output schema declared.
No examples provided.