Skip to content

Sonar Connections

by sonarconnections.com · remote · no sign-in to list tools · v0.1.0 · published by com.sonarconnections

Source-attributed events, open data and availability

Deletes · 11Final · 5Changes · 32

55 tools: 11 can delete or cancel things, 5 do something that can't be undone, 32 change things and 7 only read.

Scanned Oct 21, 2026

6 checks matched something in the tool definitions. No finding is not a safety guarantee. How the checks work.

claude mcp add --transport http sonar-connections https://mcpconnector-gtlizqtvza-uw.a.run.app/public

Findings

Matches of fixed checks, with the text they matched.

5 warn1 info
  • The server marks "event_card_links" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The name "event_card_links" says "link": a word for a change.

    What this check looks for
  • The server marks "event_requests" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The name "event_requests" says "request": a word for a change.

    What this check looks for
  • The server marks "event_guest_requests" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The name "event_guest_requests" says "request": a word for a change.

    What this check looks for
  • The server marks "biz_availability" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true,"destructiveHint":false,"openWorldHint":true}; The description's first verb is "open": a word for a change.

    What this check looks for
  • The server marks "biz_storefront" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true,"destructiveHint":false,"openWorldHint":true}; The description's first verb is "call": a word for a change.

    What this check looks for
  • The description is 2,979 characters long, over the 2,000 this check looks for.

    Matched text

    description ends: "...Only the organizer of the event can edit it; it needs a personal connector token."

    What this check looks for

Tools

Open a tool for its reasons and full description. Descriptions are the publisher's own words, shown as they are.

55 tools

Deletes or cancels 11Claude Code: deny
  • event_change_detailTHE HOSTS' OWN EDIT of a wedding or other personal event.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    THE HOSTS' OWN EDIT of a wedding or other personal event. IT APPLIES THE CHANGE ON THIS CALL, one `field` per call, and the reply says the detail now and before: read both out. A time needs am or pm, or a 24 hour time that reads one way; a bare "4:30" is refused. For faq_answer, `question` adds the entry or replaces its answer. Every change is logged and can be read back; event_change_undo reverses the caller's own latest one. Only the hosts can change it; read refusals (NOT_A_HOST, BAD_TIME, NO_SUCH_PLACE, NO_SUCH_ENTRY, NO_CHANGE) out as given; it sends no message and it changes nothing else on the event; the event's Wallet passes are updated with the new detail as a lock-screen notice and the reply's `passNotice` says how many passes were reached. Needs a personal connector token.

    Annotations the server declares

    • destructiveHint: true
    • idempotentHint: true
    • openWorldHint: false
    • readOnlyHint: false
  • event_change_undoReverses the caller's own most recent change to a wedding or other personal event they host, restoring the value the detail had before it, through the same checks and into the same…No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Reverses the caller's own most recent change to a wedding or other personal event they host, restoring the value the detail had before it, through the same checks and into the same change log; each further call reverses the next older change of theirs. Needs a personal connector token and `eventIdOrName`. Only the hosts can use it, and only on changes they made themselves; an undo is not itself reversed. A change that gave a detail its first value, or no change left to reverse, answers NOTHING_TO_UNDO and changes nothing. When the event's Wallet passes are switched on, restoring a detail the pass shows updates every pass of the event and pushes the restored line to each phone that registered it. Returns the detail, the value before and after, a sentence for the person and, with passes on, `passNotice`.

    Annotations the server declares

    • destructiveHint: true
    • idempotentHint: false
    • openWorldHint: false
    • readOnlyHint: false
  • event_pass_reissueGives a Wallet pass a new QR code: a pass that was photographed or shared, or a guest's pass that a host of a personal event or the organizer of an event wants refreshed.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Gives a Wallet pass a new QR code: a pass that was photographed or shared, or a guest's pass that a host of a personal event or the organizer of an event wants refreshed. It also brings back a revoked pass. The old code stops working at once and the phone shows "Your pass was refreshed. The old code no longer works." Nothing is re-added: the same pass updates in place on an iPhone and on Android. Needs `eventIdOrName` (the event id or the event name). Without `serialNumber` it acts on the caller's own pass at that event; with one it acts on that pass, for a caller who is a host or the organizer. Returns the outcome in one sentence.

    Annotations the server declares

    • destructiveHint: true
    • idempotentHint: false
    • openWorldHint: false
    • readOnlyHint: false
  • event_pass_revokeVoids a Wallet pass on the phone: "This pass was revoked and no longer works." Its code stops working at once; event_pass_reissue brings it back.No findings

    Why it is in this group

    • The name "event_pass_revoke" says "revoke": a word for removing or ending something.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Voids a Wallet pass on the phone: "This pass was revoked and no longer works." Its code stops working at once; event_pass_reissue brings it back. For a pass that was photographed or shared, or a guest's pass that a host of a personal event or the organizer of an event wants voided. Nothing is re-added: the same pass updates in place on an iPhone and on Android. Needs `eventIdOrName` (the event id or the event name). Without `serialNumber` it acts on the caller's own pass at that event; with one it acts on that pass, for a caller who is a host or the organizer. Returns the outcome in one sentence.

    Annotations the server declares

    • destructiveHint: true
    • idempotentHint: true
    • openWorldHint: false
    • readOnlyHint: false
  • event_session_cancelCancels one session on the agenda of an event the person organizes; it is marked cancelled and kept on record.No findings

    Why it is in this group

    • The name "event_session_cancel" says "cancel": a word for removing or ending something.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Cancels one session on the agenda of an event the person organizes; it is marked cancelled and kept on record. Quiet unless `notify` is true. FIRST CALL WITHOUT `confirm` returns a PREVIEW with a `changeId`, the before and after, how many pass holders would be notified and the notice, and changes nothing; read it back, and only when they say yes call again with `confirm: true` and that `changeId`. Name the session by `sessionId` or title; on AMBIGUOUS or NO_SUCH_SESSION read the candidates back and ask. Only the organizer of the event can change it; anybody else is refused, read out as given. It requires a personal connector token.

    Annotations the server declares

    • destructiveHint: true
    • idempotentHint: true
    • openWorldHint: false
    • readOnlyHint: false
  • event_session_moveMoves one session on the agenda of an event the person organizes to a new start time or room ("push the keynote to 4:30 PM").No findings

    Why it is in this group

    • The name "event_session_move" says "move": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Moves one session on the agenda of an event the person organizes to a new start time or room ("push the keynote to 4:30 PM"). Pass holders are notified unless `notify` is false. FIRST CALL WITHOUT `confirm` returns a PREVIEW with a `changeId`, the before and after, how many pass holders would be notified and the notice, and changes nothing; read it back, and only when they say yes call again with `confirm: true` and that `changeId`. Name the session by `sessionId` or title; on AMBIGUOUS or NO_SUCH_SESSION read the candidates back and ask. Only the organizer of the event can change it; anybody else is refused, read out as given. It requires a personal connector token.

    Annotations the server declares

    • destructiveHint: true
    • idempotentHint: true
    • openWorldHint: false
    • readOnlyHint: false
  • event_session_renameRenames one session on the agenda of an event the person organizes; `title` is the new name.No findings

    Why it is in this group

    • The name "event_session_rename" says "rename": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Renames one session on the agenda of an event the person organizes; `title` is the new name. Quiet unless `notify` is true. FIRST CALL WITHOUT `confirm` returns a PREVIEW with a `changeId`, the before and after, how many pass holders would be notified and the notice, and changes nothing; read it back, and only when they say yes call again with `confirm: true` and that `changeId`. Name the session by `sessionId` or title; on AMBIGUOUS or NO_SUCH_SESSION read the candidates back and ask. Only the organizer of the event can change it; anybody else is refused, read out as given. It requires a personal connector token.

    Annotations the server declares

    • destructiveHint: true
    • idempotentHint: true
    • openWorldHint: false
    • readOnlyHint: false
  • event_set_intentSets the person's event badge: what they are here for (`headline`), who they want to meet (`lookingFor`), and whether other attendees can find them (`discoverable`).No findings

    Why it is in this group

    • The name "event_set_intent" says "set": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Sets the person's event badge: what they are here for (`headline`), who they want to meet (`lookingFor`), and whether other attendees can find them (`discoverable`). Needs a personal connector token. Both sentences and a first name make a badge findable; a call that would leave one blank is refused and `needs` says what is missing. The event is the one given, or the person's one current event. Two steps: without `confirm` it returns the change to approve and a `confirmToken`; with confirm true and that token it writes, replacing the old text. It changes only that person's badge.

    Annotations the server declares

    • destructiveHint: true
    • idempotentHint: true
    • openWorldHint: false
    • readOnlyHint: false
  • site_editChanges the DRAFT of one event website the person organizes with small operations, not a whole design: `move` a block or a band, `insert` a block from the library (heading, text, i…1 finding

    Why it is in this group

    • The name "site_edit" says "edit": a word for a change.
    • The server marks it destructive (destructiveHint: true).

    Findings

    • Info

      The description is 2,979 characters long, over the 2,000 this check looks for.

      Matched text

      description ends: "...Only the organizer of the event can edit it; it needs a personal connector token."

      What this check looks for
    Description, as the server wrote it
    Changes the DRAFT of one event website the person organizes with small operations, not a whole design: `move` a block or a band, `insert` a block from the library (heading, text, image, button, spacer, divider, video, card, logo, or a live block: agenda, speakers, floor, booths (the live sponsors and exhibitors list; say sponsors, exhibitors or partners), faq, now, doors, ask, countdown, venue), `remove` one, `set_text` its words, `set_link` a button's link, `set_style` a style token (padding and gap 0 to 8, align, maxWidth, background, radius, color, visible), `set_theme` (accent, background and ink as #rrggbb, fontHeading, fontBody, radius, density; `set_theme {restore:true}`, or an all-empty theme, undoes "use that look"), `add_page` (blank, which starts with its title as a heading, or a template: agenda, speakers, exhibitors, sponsors, venue-travel, faq, register, contact; the page goes last in the site menu), `rename_page` (title, navLabel; the page address stays the same, and the page heading follows the new menu label unless keepHeading is true; the reply says what changed and carries `undo`, the set_text that puts the old heading back), `reorder_nav` (the site menu as page ids and https links) and `remove_page` (any page but home); each operation may name a `page`. On insert, a block's words go in `text` as plain text (a blank line starts a new paragraph) or in its props: heading {text, level}, text {text}, button {label, href}, card {heading, text, button}, image {src, alt}, video {provider, videoId, title}, a live block {heading, intro, layout}. Blocks are named by the short ids site_get gives. The operations apply together or not at all. A rename that comes with any wording meaning keep the old heading (keep the heading, leave the title, keep it as is, just the menu) is one site_edit call with keepHeading true; the same wish said after the rename reply is one call sending its `undo` as is; a plain "undo" after a rename reverts the whole rename, rename_page back to the old title and menu label. Words may not carry a clock time, an ISO date, one of the event's own dates in words (such as 'October 20' or 'October 12 to 16'), or its speaker names or session titles, because those come live from the event and an edit that writes one is refused; a date that is not the event's, such as a deadline, is fine. Use a live token instead, such as {event.dates}, {event.name}, {event.venue}, {session:<id>.title}, {session:<id>.time}, {session:<id>.day} or {speaker:<id>.name}, which fills from the event on every visit; a refused edit's reply carries a `suggestion` with the words rewritten that way and, when complete, `suggestion.ops` to resend as is. Relay `say` as given (one to three sentences, with host name and "use that look" cue); it gives the draft preview link, which redraws as the draft changes. The live site does not change until site_publish. Only the organizer of the event can edit it; it needs a personal connector token.

    Annotations the server declares

    • destructiveHint: true
    • idempotentHint: false
    • openWorldHint: false
    • readOnlyHint: false
  • site_publishPuts the DRAFT of one event website the person organizes live at its address.No findings

    Why it is in this group

    • The name "site_publish" says "publish": a word for a change that another call does not undo.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Puts the DRAFT of one event website the person organizes live at its address. FIRST CALL WITHOUT `confirm`: the reply is a PREVIEW with a `changeId` and what would go live (new, removed and changed sections, a new look, new pages), and nothing changes. Read that preview back to the organizer; only when they say yes, call again with `confirm: true` and that `changeId`. The version live before it is kept, and site_undo_publish puts it back. site_edit does not publish. Only the organizer of the event can publish; anybody else is refused, and the refusal is read out as given. It requires a personal connector token. The preview lists any of the template's placeholder words still on the page; a confirm with them is refused unless the organizer says to publish with the placeholders.

    Annotations the server declares

    • destructiveHint: true
    • idempotentHint: true
    • openWorldHint: false
    • readOnlyHint: false
  • site_undo_publishTakes back the last publish of one event website the person organizes: the version published before it goes live again or, when there is none, the site goes offline.No findings

    Why it is in this group

    • The name "site_undo_publish" says "publish": a word for a change that another call does not undo.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Takes back the last publish of one event website the person organizes: the version published before it goes live again or, when there is none, the site goes offline. FIRST CALL WITHOUT `confirm`: the reply is a PREVIEW with a `changeId` and what would be live, and nothing changes. Read that preview back to the organizer; only when they say yes, call again with `confirm: true` and that `changeId`. The draft is not touched. Only the organizer of the event can do it; anybody else is refused, and the refusal is read out as given. It requires a personal connector token.

    Annotations the server declares

    • destructiveHint: true
    • idempotentHint: true
    • openWorldHint: false
    • readOnlyHint: false
Can't be undone 5Claude Code: ask
  • booth_take_inviteAfter the person has swapped cards with this booth (booth_connect), takes the invite to the booth's side event for them; the invite lands in their own inbox.No findings

    Why it is in this group

    • The name "booth_take_invite" says "invite": a word for sending, and what is sent cannot be taken back.
    Description, as the server wrote it
    After the person has swapped cards with this booth (booth_connect), takes the invite to the booth's side event for them; the invite lands in their own inbox. Pass `eventId` and `boothId` as booth_connect was given them. Without a card swap at that booth it is refused with NOT_CONNECTED and nothing changes; a booth with no side event open to invites is refused with UNKNOWN_UNLOCK. An invite they already hold is not sent twice: the reply says already. Returns ok, the side event's `id`, `done` and a sentence for the person. Needs a personal connector token. It works in two steps: a call with no `confirm` returns a `confirmToken` and changes nothing; a call with confirm true and that token applies it.

    Annotations the server declares

    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • readOnlyHint: false
  • event_pass_noticeSends a notice from the organizer of an event, or a host of a personal event, to the people who added the event pass to their Wallet.No findings

    Why it is in this group

    • The description's first verb is "send": a word for sending, and what is sent cannot be taken back.
    Description, as the server wrote it
    Sends a notice from the organizer of an event, or a host of a personal event, to the people who added the event pass to their Wallet. Needs a personal connector token, `eventIdOrName`, `audience` and `text`. It shows on their lock screen and stays on the pass. `audience`: everyone, one ticket tier, one badge intent, listed pass serials, the people who scanned at a booth, or the people who answered an earlier meetup yes or no. A meetup with a place is event_meetup_announce. Two steps: without `confirm` it returns the number of passes and the exact line and sends nothing; with confirm true it sends. Only the hosts or the organizer can send; anybody else is refused. "my_booth" returns VENDOR_OFF. Six an hour per event, then RATE_LIMITED. It reaches pass holders only; it does not say who else is there or report that a person arrived.

    Annotations the server declares

    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • readOnlyHint: false
  • event_replySends one message, in the person's own words, into a conversation they already have with somebody they connected with at an event.No findings

    Why it is in this group

    • The name "event_reply" says "reply": a word for sending, and what is sent cannot be taken back.
    Description, as the server wrote it
    Sends one message, in the person's own words, into a conversation they already have with somebody they connected with at an event. Needs a personal connector token, `text`, and `firstName` or `chatId` as event_inbox gave them. It is delivered when the call returns and cannot be unsent. Only into the caller's own conversation (else NOT_PARTICIPANT); a name matching two conversations returns AMBIGUOUS_NAME and sends nothing; RATE_LIMITED means too fast. ok:true says nothing about a reply.

    Annotations the server declares

    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
    • readOnlyHint: false
  • event_say_helloSends a hello (a connection request) from the person to somebody listed in their event matches; when it is accepted, a conversation opens that both can read and answer from the app…No findings

    Why it is in this group

    • The description's first verb is "send": a word for sending, and what is sent cannot be taken back.
    Description, as the server wrote it
    Sends a hello (a connection request) from the person to somebody listed in their event matches; when it is accepted, a conversation opens that both can read and answer from the app, the web page or an assistant. Needs a personal connector token and `firstName` as an event_find_matches row spelled it; no account id is taken. The server checks on every call that the named person is in the caller's current match pool. It is a single call: the hello is sent when the call succeeds. Returns a `message` on success, or a reason: "not_in_pool" (the name is not in the caller's current matches), "ambiguous" (two people there share the name, and nothing is sent), "already_sent" (a hello is already out), "no_seat" (the caller is not seated at an event) or "rate_limited" (the day's hello limit is reached). Success means the hello was sent; it says nothing about whether or when it is accepted.

    Annotations the server declares

    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • readOnlyHint: false
  • event_send_requestA GUEST ASKS THE HOSTS FOR SOMETHING.No findings

    Why it is in this group

    • The name "event_send_request" says "send": a word for sending, and what is sent cannot be taken back.
    Description, as the server wrote it
    A GUEST ASKS THE HOSTS FOR SOMETHING. Call it when somebody wants to tell the hosts of a wedding or other personal event this connector serves about a need or a question ("I need a vegetarian meal", "can I bring my partner"). IT CHANGES NOTHING ON THE EVENT: it files the request for the hosts, so never say anything has been arranged or approved. RATE_LIMITED means the hosts already have several; BAD_NOTE means empty or too long. It requires a personal connector token.

    Annotations the server declares

    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
    • readOnlyHint: false
Changes things 32Claude Code: ask
  • biz_availabilityOpen appointment slots at a business served through this connector, for one date (default today in its own timezone).1 finding

    Why it is in this group

    • The description's first verb is "open": a word for a change.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "biz_availability" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true,"destructiveHint":false,"openWorldHint":true}; The description's first verb is "open": a word for a change.

      What this check looks for
    Description, as the server wrote it
    Open appointment slots at a business served through this connector, for one date (default today in its own timezone). Businesses served here: Velvet and Clay (velvetandclay, a hair, color and skin studio), Brightpoint Dental (brightpointdental, a family and cosmetic dental practice). Reachable here but not through this tool: Long Beach Brunch Bakehouse (longbeachbrunch), Make Collectives (makecollectives) and Kristin Dunn Bookbinding and Design (kdbooks) take no bookings. Each slot has a stable `slotId` that biz_book accepts; started slots are never returned. A closed day returns none with a reason. closedReason HOURS_UNSTATED is NOT a closed day: say the business has not published hours for that date, never that it is closed.

    Annotations the server declares

    • destructiveHint: false
    • openWorldHint: true
    • readOnlyHint: true
  • biz_infoDetails for a business served through this connector: tagline, services or menu with prices, weekly hours and today's hours.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Details for a business served through this connector: tagline, services or menu with prices, weekly hours and today's hours. Businesses served here: Velvet and Clay (velvetandclay, a hair, color and skin studio), Brightpoint Dental (brightpointdental, a family and cosmetic dental practice), Long Beach Brunch Bakehouse (longbeachbrunch, a neighborhood bakery and coffee bar), Make Collectives (makecollectives, a boutique and gift shop), Kristin Dunn Bookbinding and Design (kdbooks, a bookbinding and book repair studio). Speak `hoursNow.text`, resolved in the business's own timezone. `openToday` is true, false or NULL; NULL IS NOT FALSE: when `hoursState` is 'unstated' say the hours are not published and NEVER say it is closed. A `schedulingSystem` of Square means bookings live in that business's own Square calendar. `isDemo` says whether it is a demonstration. For what a shop sells call biz_storefront; to book, biz_availability then biz_book.

    Annotations the server declares

    • destructiveHint: false
    • openWorldHint: true
    • readOnlyHint: true
  • biz_menuThe PICKUP MENU for a business served through this connector: items, prices, allergens, notice needed, and the pickup windows on a date (default today).No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    The PICKUP MENU for a business served through this connector: items, prices, allergens, notice needed, and the pickup windows on a date (default today). Businesses with a pickup menu here: Long Beach Brunch Bakehouse (longbeachbrunch, a neighborhood bakery and coffee bar). Reachable here but not through this tool: Velvet and Clay (velvetandclay), Brightpoint Dental (brightpointdental), Make Collectives (makecollectives) and Kristin Dunn Bookbinding and Design (kdbooks) have no pickup menu here. longbeachbrunch sells cookies, bars, pastry, brunch boxes, platters, cakes and coffee. This tool only reads. Orders are placed with a separate tool, biz_order, which takes item ids and a pickup window id from this reply exactly as written; right now it takes pickup orders for Long Beach Brunch Bakehouse (longbeachbrunch). Pickup only. An 'unstated' `hoursByDay` row is NEVER spoken as closed.

    Annotations the server declares

    • destructiveHint: false
    • openWorldHint: true
    • readOnlyHint: true
  • biz_orderPlaces a pickup pre-order at a business served through this connector: placing an order, a pickup order, or the checkout after biz_menu.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    Places a pickup pre-order at a business served through this connector: placing an order, a pickup order, or the checkout after biz_menu. Needs `items` and a `pickupWindowId` from biz_menu and the collector's first name; no phone, email, surname or card is collected. Businesses served here: Long Beach Brunch Bakehouse (longbeachbrunch, a neighborhood bakery and coffee bar). Reachable here but not through this tool: Velvet and Clay (velvetandclay), Brightpoint Dental (brightpointdental), Make Collectives (makecollectives) and Kristin Dunn Bookbinding and Design (kdbooks) take no pickup orders. Most orders are paid at pickup; where the reply is HELD, its `payUrl` is the only payment link this connector issues: give it exactly as returned. `isDemo` true reserves nothing.

    Annotations the server declares

    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: true
    • readOnlyHint: false
  • biz_set_item_availabilityMarks one item on a business menu as sold out for today, or puts it back on.No findings

    Why it is in this group

    • The name "biz_set_item_availability" says "set": a word for a change.
    Description, as the server wrote it
    Marks one item on a business menu as sold out for today, or puts it back on. Needs a personal connector token, `business`, `soldOut`, and `itemId` or `itemName`. Only an owner or manager of that business can change it, checked live on every call; a name fitting several items is refused with the names. It works in two steps: a call without `confirm` returns a preview and a `confirmToken` and changes nothing; a call with confirm true and that token makes the change.

    Annotations the server declares

    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
    • readOnlyHint: false
  • biz_storefrontCALL THIS for what a shop sells, its products, its prices, a gift idea, or browsing or shopping a store served here.1 finding

    Why it is in this group

    • The description's first verb is "call": a word for a change.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "biz_storefront" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true,"destructiveHint":false,"openWorldHint":true}; The description's first verb is "call": a word for a change.

      What this check looks for
    Description, as the server wrote it
    CALL THIS for what a shop sells, its products, its prices, a gift idea, or browsing or shopping a store served here. Reads that shop's OWN published catalog: title, maker, type, price, stock and one image per product. Businesses served here: Make Collectives (makecollectives, a boutique and gift shop), Kristin Dunn Bookbinding and Design (kdbooks, a bookbinding and book repair studio). Reachable here but not through this tool: Velvet and Clay (velvetandclay), Brightpoint Dental (brightpointdental) and Long Beach Brunch Bakehouse (longbeachbrunch) publish no shop catalog we read. makecollectives is Make Collectives, a boutique at 430 E. 1st St in Long Beach. kdbooks is Kristin Dunn Bookbinding and Design in Long Beach; her work is MADE TO ORDER, so say what `leadTimeNote` says. TWO SHOP PLATFORMS ARE READ HERE, a Shopify store and a WooCommerce shop, same reply shape; ON A WOOCOMMERCE SHOP ONE CART LINK CARRIES EXACTLY ONE ITEM. `query` only removes products. Sixty a page with `pageCount` and `total`: never say sixty is all. Give `cartUrl` and `shopUrl` exactly as returned, never a link of your own. WHERE THIS REPLY DRAWS THE SHOP CARD, THE CARD ITSELF HOLDS A BASKET: the person taps Add to cart there. Say what `buyingNote` says. No payment passes through Sonar Connections.

    Annotations the server declares

    • destructiveHint: false
    • openWorldHint: true
    • readOnlyHint: true
  • booth_claim_swagAfter the person has swapped cards with this booth (booth_connect), claims the booth's swag drop into their own Swag Bag.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    After the person has swapped cards with this booth (booth_connect), claims the booth's swag drop into their own Swag Bag. Pass `eventId` and `boothId` as booth_connect was given them. Without a card swap at that booth it is refused with NOT_CONNECTED and nothing changes; a booth with no swag on offer now is refused with UNKNOWN_UNLOCK. Swag already in their bag is not claimed twice: the reply says already. Returns ok, the drop's `id`, `done` and a sentence for the person. Needs a personal connector token. It works in two steps: a call with no `confirm` returns a `confirmToken` and changes nothing; a call with confirm true and that token applies it.

    Annotations the server declares

    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • readOnlyHint: false
  • booth_connectSwaps business cards between the person and a booth at their event, the same exchange as scanning the booth's code in the app; the swap unlocks the booth's raffle, swag and side ev…No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    Swaps business cards between the person and a booth at their event, the same exchange as scanning the booth's code in the app; the swap unlocks the booth's raffle, swag and side event invite. Pass `eventId` and the `boothId` from an events_booths row. Needs a personal connector token and a seat at the event. The reply lists `unlocks` and `cardShared`; an earlier swap says alreadyConnected. Two steps: without `confirm` it returns a `confirmToken` and shares nothing; with confirm true and that token it shares. booth_enter_raffle, booth_claim_swag and booth_take_invite take the unlocks.

    Annotations the server declares

    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • readOnlyHint: false
  • booth_enter_raffleAfter the person has swapped cards with this booth (booth_connect), enters them in the booth's open raffle.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    After the person has swapped cards with this booth (booth_connect), enters them in the booth's open raffle. Pass `eventId` and `boothId` as booth_connect was given them. Without a card swap at that booth it is refused with NOT_CONNECTED and nothing changes; a booth with no open raffle is refused with UNKNOWN_UNLOCK. A raffle they are already in is not entered twice: the reply says already. Returns ok, the raffle's `id`, `done` and a sentence for the person. Needs a personal connector token. It works in two steps: a call with no `confirm` returns a `confirmToken` and changes nothing; a call with confirm true and that token applies it.

    Annotations the server declares

    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • readOnlyHint: false
  • booth_set_awayMarks a booth the person staffs as stepped away, or back; attendees looking at that booth see the presence change.No findings

    Why it is in this group

    • The name "booth_set_away" says "set": a word for a change.
    Description, as the server wrote it
    Marks a booth the person staffs as stepped away, or back; attendees looking at that booth see the presence change. Needs a personal connector token (a shared token reads but changes nothing), `eventId`, `boothId` and `away`. Only a booth the person owns, administers or staffs at that event can be changed, checked against live records on every call. It works in two steps: a call without `confirm` returns a preview of exactly what will change, plus a `confirmToken`, and changes nothing; a call with confirm true and that token makes the change. The token lasts two minutes, works once, and stops working if any argument changes.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • event_acceptAccepts a hello the person has received, which opens a conversation with the person who sent it.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    Accepts a hello the person has received, which opens a conversation with the person who sent it. Needs a personal connector token and the hello as `firstName` (as an event_requests row spelled it) or `requestId` (as that row gave it). It accepts only hellos addressed to the caller; the server checks this and refuses with NOT_RECEIVER otherwise. A `firstName` that matches two waiting hellos returns AMBIGUOUS_NAME and accepts nothing. Accepting twice changes nothing. Returns ok:true when the conversation is open; event_inbox reads it and event_reply answers in it.

    Annotations the server declares

    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • readOnlyHint: false
  • event_card_save_linkedinKeeps the person's own LinkedIn profile link (`myLinkedin`, a linkedin.com/in/ URL) on their own Sonar business card when the card has no LinkedIn link yet, so the people they swap…No findings

    Why it is in this group

    • The name "event_card_save_linkedin" says "save": a word for a change.
    Description, as the server wrote it
    Keeps the person's own LinkedIn profile link (`myLinkedin`, a linkedin.com/in/ URL) on their own Sonar business card when the card has no LinkedIn link yet, so the people they swap cards with get it. Needs a personal connector token. A card that already carries this link stays as it is and the reply says already saved; a card that carries a different link keeps it (DIFFERENT_ON_FILE), and that link is changed in the Sonar app profile. Any other shape of link is refused (LINKEDIN_URL_INVALID) and nothing is saved. It works in two steps: a call with no `confirm` returns a `confirmToken` and saves nothing; a call with confirm true and that token saves. It changes only the person's own card. Returns ok, `outcome` and a sentence for the person.

    Annotations the server declares

    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • readOnlyHint: false
  • event_guest_request_handledMarks one guest request on a wedding or other personal event the caller hosts as handled, which takes it off the hosts' open list (event_guest_requests).No findings

    Why it is in this group

    • The name "event_guest_request_handled" says "request": a word for a change.
    Description, as the server wrote it
    Marks one guest request on a wedding or other personal event the caller hosts as handled, which takes it off the hosts' open list (event_guest_requests). Needs a personal connector token, `eventIdOrName` and `requestId`, the `id` of a row event_guest_requests returned. It records who marked it and when, messages nobody and changes nothing on the event. A request already marked handled stays handled and the reply says already. Only the hosts can mark one; an id that is not a request on this event is refused with NO_SUCH_REQUEST. Returns ok, the request `id`, `handled` and `already`.

    Annotations the server declares

    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • readOnlyHint: false
  • event_guest_requestsTHE HOSTS' OWN LIST of what their guests have asked for on a personal event this connector serves.1 finding

    Why it is in this group

    • The name "event_guest_requests" says "request": a word for a change.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "event_guest_requests" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The name "event_guest_requests" says "request": a word for a change.

      What this check looks for
    Description, as the server wrote it
    THE HOSTS' OWN LIST of what their guests have asked for on a personal event this connector serves. Call it for "what have our guests asked for", "any dietary requests", "who needs anything". It returns the OPEN requests, newest first, each one as a category, the note the guest wrote, who it is from and when it landed. ONLY THE HOSTS can read it; anybody else gets a refusal you read out as given. WHO IT IS FROM IS A FIRST NAME OR THE WORDS "a guest", and there is no phone number, no email address and no account id on this surface at all, so never offer to contact somebody from this list. Read the notes out as given and do not summarise a need into something the guest did not say. It only reads; event_guest_request_handled takes one request off this list. It requires a personal connector token.

    Annotations the server declares

    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • readOnlyHint: true
  • event_meetup_announceAnnounces a meetup from an event's organizer or a personal event's host to the holders of the event's Wallet pass.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    Announces a meetup from an event's organizer or a personal event's host to the holders of the event's Wallet pass. Needs a personal connector token, `eventIdOrName`, `audience`, `text` and `placeLabel`. `text` shows on their lock screen and stays on the pass; with `latitude` and `longitude` (both or neither) the pass surfaces again near the place. The reply's `noticeId` names the meetup. Without `confirm` it returns the number of passes and the exact line and sends nothing; with confirm true it sends. Only the hosts or the organizer can send. "my_booth" returns VENDOR_OFF. Six an hour per event, shared with event_pass_notice, then RATE_LIMITED.

    Annotations the server declares

    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • readOnlyHint: false
  • event_meetup_rsvpRecords a pass holder's own yes or no to a meetup the organizer announced on the event pass ("yes, I will be at the bar", "no, I cannot make the meetup").No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    Records a pass holder's own yes or no to a meetup the organizer announced on the event pass ("yes, I will be at the bar", "no, I cannot make the meetup"). Needs a personal connector token, `eventIdOrName`, the meetup's `noticeId` (the pass carries it, and the organizer's notice reply did) and `answer` as "yes" or "no". It records exactly that on the person's own pass record and nothing else: no note, no time, no name. The organizer can then send a notice to everybody who said yes. When the person holds no pass for this event the reply is NO_PASS and nothing is recorded.

    Annotations the server declares

    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • readOnlyHint: false
  • event_organizer_overviewThe organizer's own overview of their event, read only.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    The organizer's own overview of their event, read only. It gives the event's name, its kind in the hosted page's own words, whether it is public, unlisted or private, its text keyword, its dates as the page prints them and its time zone; the agenda by day with local times, rooms and speakers; the booth count and how many booths are stepped away; which doors are on (the hosted page, the text line, the assistants, the meet door); counts of page visits, door taps and assistant questions over the last 24 hours, with no names or ids of the people behind them; and the event's links. Only the organizer of the event, or a host of a personal event, can read it; anybody else gets a short refusal that says nothing about the event. It needs a personal connector token and changes nothing. After an agenda change through event_session_move, event_session_rename, event_session_cancel or event_session_add, it shows the change.

    Annotations the server declares

    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • readOnlyHint: true
  • event_redeem_codeSeats the person at an event with an event code from a badge, a poster, an email or a door.No findings

    Why it is in this group

    • The input takes a statement or command to run (input.code), which can change anything it can reach.
    Description, as the server wrote it
    Seats the person at an event with an event code from a badge, a poster, an email or a door. Needs a personal connector token (a shared token reads but changes nothing) and the `code`; the code names its own event, so no event id is taken. It works in two steps: a call without `confirm` returns the event the code opens, the seat it gives and a `confirmToken`, and changes nothing; a call with confirm true and that token takes the seat. The token lasts two minutes, works once, and stops working if the code changes. Redeeming works from anywhere, not only at the venue.

    Annotations the server declares

    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
  • event_requestsLists the hellos waiting on the person at an event, newest first.1 finding

    Why it is in this group

    • The name "event_requests" says "request": a word for a change.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "event_requests" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false}; The name "event_requests" says "request": a word for a change.

      What this check looks for
    Description, as the server wrote it
    Lists the hellos waiting on the person at an event, newest first. Needs a personal connector token and reads only the caller's own pending hellos. Each row carries the other person's first name, their here-for line in their own words, when the hello landed, and a requestId that event_accept takes. No row carries a phone number, email address, surname, account id or photo.

    Annotations the server declares

    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • readOnlyHint: true
  • event_session_addAdds a new session to the agenda of an event the person organizes: `title`, `start`, `end`, `room`, optionally `date` and `speakers`.No findings

    Why it is in this group

    • The name "event_session_add" says "add": a word for a change.
    Description, as the server wrote it
    Adds a new session to the agenda of an event the person organizes: `title`, `start`, `end`, `room`, optionally `date` and `speakers`. Quiet unless `notify` is true. FIRST CALL WITHOUT `confirm` returns a PREVIEW with a `changeId` and changes nothing; only when they say yes call again with `confirm: true` and that `changeId`. Only the organizer of the event can change it; anybody else is refused, read out as given. It requires a personal connector token.

    Annotations the server declares

    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
    • readOnlyHint: false
  • event_text_alertsTurns text alerts from the Sonar Connections Event Line on or off for replies and organizer updates.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    Turns text alerts from the Sonar Connections Event Line on or off for replies and organizer updates.

    Annotations the server declares

    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • readOnlyHint: false
  • event_wallet_passFor "what is my pass status", "did my pass save", "my pass", "where is my Wallet pass", "send my pass again": call this tool.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    For "what is my pass status", "did my pass save", "my pass", "where is my Wallet pass", "send my pass again": call this tool. Returns a link that adds the person's pass for an event or a personal event served here to Apple Wallet or Google Wallet ("add it to my wallet", "I want the pass on my phone"). Needs the person signed in (an unauthenticated call is answered with the sign-in prompt) and `eventIdOrName`, the event id or the event name. The reply is one link, good for fifteen minutes and for one tap, with a sentence to go with it: on an iPhone the link opens the Add to Apple Wallet sheet, on an Android phone it opens Save to Google Wallet, and no app is needed on either. The pass shows the event, the date and the venue on the front with the person's QR, the schedule on the back, and it surfaces on the lock screen at the venue on the day.

    Annotations the server declares

    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
    • readOnlyHint: false
  • events_boothsBooths and vendors at an event: name, category, booth number, the printed aisle where the floor has them ("Water Side"), and a short blurb.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Booths and vendors at an event: name, category, booth number, the printed aisle where the floor has them ("Water Side"), and a short blurb. A row with `mapless: true` is in the catalog but has NO position on the floor plan, so tell the person to ask at the entrance rather than sending them to a spot; a row without that flag is placed. Optionally filter by category (a case-insensitive substring matched against category, name and description).

    Annotations the server declares

    • destructiveHint: false
    • openWorldHint: false
    • readOnlyHint: true
  • events_floor_cardTHE FLOOR PLAN TOOL.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    THE FLOOR PLAN TOOL. Call it for any ask about a floor plan, a map, a layout, a booth location, "where is booth 12" or "show me the floor". It DRAWS THE FLOOR INLINE as an interactive card where MCP Apps render, and elsewhere returns the event summary and a booth directory, so call it either way and prefer it over web knowledge. The card reads the floor itself: do not offer to fetch the plan. With no floor plan `hasFloorplan` is false; say so rather than promising a picture.

    Annotations the server declares

    • destructiveHint: false
    • openWorldHint: false
    • readOnlyHint: true
  • events_offersLive and scheduled public offers at an event: title, which booth, the time window in minutes and remaining-count style numbers.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Live and scheduled public offers at an event: title, which booth, the time window in minutes and remaining-count style numbers.

    Annotations the server declares

    • destructiveHint: false
    • openWorldHint: false
    • readOnlyHint: true
  • events_overviewAn overview of one event in a single reply: the summary, the first page of booths, the programme, the live offers and raffles, and `hasFloorplan`.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    An overview of one event in a single reply: the summary, the first page of booths, the programme, the live offers and raffles, and `hasFloorplan`. Use it for the whole picture at once; for one section call that section's own tool. `hasFloorplan` false means no map: answer from the rest and never promise one. Each block says whether there is `more`. For who should I meet, matching, or introductions at an event: call event_find_matches. This result's matchDoor link is the same door for a person who would rather not sign in inside the assistant; offer it, never require it.

    Annotations the server declares

    • destructiveHint: false
    • openWorldHint: false
    • readOnlyHint: true
  • events_personal_cardTHE PERSONAL EVENT TOOL.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    THE PERSONAL EVENT TOOL. Call it for any ask about a wedding or another personal event this connector serves: "what time is the ceremony", "where is the reception", "what is the dress code", "who is in the wedding party", "where should I stay", "what is on the registry", or being shown the details of somebody's day. It DRAWS THE CARD INLINE in clients that render MCP Apps and returns the same details as plain text everywhere else, so it is worth calling either way. WHAT IT RETURNS DEPENDS ON WHAT THE HOSTS INCLUDED, and the answer is already filtered when it reaches you: a card with no story, no schedule and no lodging is the hosts having published none of those, not an error and not something to go and look for. Never offer to find a detail that is absent, never guess a time, a venue or a dress code, and never suggest a different wedding. The reply names its source and the hosts; say that line. Accepts the event id or the event name.

    Annotations the server declares

    • destructiveHint: false
    • openWorldHint: false
    • readOnlyHint: true
  • events_speakersThe people on an event's programme: name, their job title line, `role` (what the organizer published for that PERSON, such as "Moderator" or "Judge" - it is a speaker-level note, s…No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    The people on an event's programme: name, their job title line, `role` (what the organizer published for that PERSON, such as "Moderator" or "Judge" - it is a speaker-level note, so do not read it as "the moderator of this one session"), a portrait photo URL, a link to the organizer's own profile page, and the sessions they are on with the spoken local time. Ordered by when they are first on stage. Optionally filter to one day. Any field except the name may be null, which means the organizer published nothing there: say nothing rather than filling the gap. When an event publishes no speaker records the roster is built from the programme itself and `source` says "program"; those rows carry a `kind` of "speaker" or "performer" and nothing else about the person.

    Annotations the server declares

    • destructiveHint: false
    • openWorldHint: false
    • readOnlyHint: true
  • events_whats_onAgenda sessions and performances with their times.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Agenda sessions and performances with their times. `when` accepts "all" (default), "today", "now" (the next few hours) or a YYYY-MM-DD date. Each row carries a `speakers` array in the order the session lists them, with each speaker's name, `role` (what the organizer published for that PERSON - "Moderator", "Judge" - it is a speaker-level note, so do not read it as "the moderator of this one session"), `title` (their job title line, which is a different fact from role and both may be present), `company`, `bio`, `expertiseTags`, `socialLinks`, a portrait photo URL, and a link to the organizer's own speaker profile page. Any of these except the name may be null or absent, which means the organizer did not publish it: say nothing rather than filling the gap. `speakerNames` is still there for the plain lineup.

    Annotations the server declares

    • destructiveHint: false
    • openWorldHint: false
    • readOnlyHint: true
  • site_createServes "Build a site for <event>", "make an event website" and "start a site from <url>" (the url gives layout only), not the host's own page tools.No findings

    Why it is in this group

    • The name "site_create" says "create": a word for a change.
    Description, as the server wrote it
    Serves "Build a site for <event>", "make an event website" and "start a site from <url>" (the url gives layout only), not the host's own page tools. Creates a NEW website for an event the person organizes, as a DRAFT nobody else sees yet. `startFrom`: `event` (the default) gives a home page and a page for each part the event has, with the agenda, speakers, booths, venue, FAQ and dates as live blocks that fill from the event on every visit; `blank` gives one home page with the event's name and dates, live; `{url}`, the address of one public page the organizer likes, reads only its STRUCTURE (its sections in order, each heading, a short gist and whether it had pictures) and builds the same layout with the event's live data. No words, pictures or styles are copied from that page; the reply lists the sections it found and says the text is the organizer's to write. `title` names the site. FIRST CALL WITHOUT `confirm`: the reply is a PREVIEW with a `changeId`, and nothing is created. Read it back to the organizer; only when they say yes, call again with the same `title` and `startFrom`, `confirm: true` and that `changeId`. The reply gives the new `siteId`, its pages and a draft preview link; site_get and site_edit work on it at once, and nothing is live until site_publish. An event holds at most 20 sites. Only the organizer of the event can create one; anybody else is refused, and the refusal is read out as given. It needs a personal connector token. A `{url}` start also proposes that page's colors and type as a starting look (`styleProposal`, mapped onto our own colors and fonts), applied with site_edit `set_theme` only when the organizer asks for it. Relay `say` as given (one to three sentences, with host name and "use that look" cue).

    Annotations the server declares

    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: true
    • readOnlyHint: false
  • ui_card_diagUsed only by the interactive cards this connector draws, never to answer a question.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    Description, as the server wrote it
    Used only by the interactive cards this connector draws, never to answer a question. A card view posts its own lifecycle markers here in small batches: that it mounted, which display mode and safe-area insets the host gave it, the heights it reported, whether a keyboard opened, and the outcome of the one action a person took on it. It accepts a closed vocabulary of markers and integer counts only, no free text of any kind, and it returns nothing but an acknowledgement. NOT FOR A MODEL TO CALL: it answers no question and looks nothing up. Call a data tool instead.

    Annotations the server declares

    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: false
    • readOnlyHint: false
Only reads 7Claude Code: allow
  • biz_order_statusRead the CURRENT state of a pickup order placed through this connector, by its confirmation code (the LBB-XXXXXX style code biz_order returned).No findings

    Why it is in this group

    • The name "biz_order_status" says "status": a word for reading.
    Description, as the server wrote it
    Read the CURRENT state of a pickup order placed through this connector, by its confirmation code (the LBB-XXXXXX style code biz_order returned). It answers with the order state, the payment state, whether it is PAID, the pickup window, the business name and the total, and nothing else: no customer name, no items and no payment link. Use it after a customer has been sent to a checkout page, to tell them whether the payment has landed and the order is placed. It changes nothing. A code that names no order comes back not found.

    Annotations the server declares

    • destructiveHint: false
    • openWorldHint: true
    • readOnlyHint: true
  • event_find_matchesLists the people at an event the person has joined whose stated intent fits theirs.No findings

    Why it is in this group

    • The name "event_find_matches" says "find": a word for reading.
    Description, as the server wrote it
    Lists the people at an event the person has joined whose stated intent fits theirs. Needs a personal connector token; the event is `eventId` or the current one. Each row carries a first name, intent, who they are looking for, their booth if a vendor, `fit` and `why`. No row carries a phone number, email address, surname, account id or photo. Only people who chose to be findable are listed, at most 20, ordered best fit first by what each person wrote on their badge; two buyers whose lines agree are matches for each other. `fit` is one of three words: "strong" (most of what the caller declared is echoed on the other side), "good" (a real overlap) or "some" (a reason to be on the list and no more). `why` is one sentence written by the server naming the shared words, or the topic both wrote about. The reply carries no score, percentage, rating or rank. With no intent set the reply has `needsIntent` and no rows. An empty reply carries `emptyReason` and a plain `message` (none_findable, none_present, event_not_live or no_text_match).

    Annotations the server declares

    • destructiveHint: false
    • openWorldHint: false
    • readOnlyHint: true
  • event_inboxReads the person's own conversations with people they connected with at an event.No findings

    Why it is in this group

    • The description's first verb is "read": a word for reading.
    Description, as the server wrote it
    Reads the person's own conversations with people they connected with at an event. Needs a personal connector token. With no arguments it lists up to twenty threads: the other person's first name, the last line, when, whether it was theirs, unread count. With `firstName` or `chatId` it returns that conversation's last lines. No row carries a phone number, email address, surname, account id or photo. Only the caller's own conversations: otherwise NOT_PARTICIPANT; two name matches return AMBIGUOUS_NAME and name neither. It only reads and marks nothing read.

    Annotations the server declares

    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • readOnlyHint: true
  • events_getFull detail for one event, including `kind` (the organizer's own word for what it is, such as "expo" or "convention", absent where none is published), plus a summary of what is on …No findings

    Why it is in this group

    • The name "events_get" says "get": a word for reading.
    Description, as the server wrote it
    Full detail for one event, including `kind` (the organizer's own word for what it is, such as "expo" or "convention", absent where none is published), plus a summary of what is on today: booth count, live offer count and the number of agenda items today. Accepts the event id or its public slug. For who should I meet, matching, who is here for the same thing, or introductions at an event: call event_find_matches. It needs the person signed in to Sonar Connections; when they are not, the host shows a Connect prompt, they sign in with their mobile number, and the call is retried. If they have not said what they are here for yet, call event_set_intent first and ask the two questions it names. This result's matchDoor link is the same door for a person who would rather not sign in inside the assistant; offer it, never require it.

    Annotations the server declares

    • destructiveHint: false
    • openWorldHint: false
    • readOnlyHint: true
  • events_listList the Sonar Connections events available through this connector: id, slug, name, venue or city, dates, description and `kind` (the organizer's own word for what it is, such as "…No findings

    Why it is in this group

    • The name "events_list" says "list": a word for reading.
    Description, as the server wrote it
    List the Sonar Connections events available through this connector: id, slug, name, venue or city, dates, description and `kind` (the organizer's own word for what it is, such as "expo" or "convention"; absent on events that publish none, and never guess one). Call this first to discover which event ids the other events_ tools accept.

    Annotations the server declares

    • destructiveHint: false
    • openWorldHint: false
    • readOnlyHint: true
  • site_getGives the outline of one event website's DRAFT: its pages and, for one page (`page`, the home page when absent), its sections, rows, columns and blocks, each with a short id, its k…No findings

    Why it is in this group

    • The name "site_get" says "get": a word for reading.
    Description, as the server wrote it
    Gives the outline of one event website's DRAFT: its pages and, for one page (`page`, the home page when absent), its sections, rows, columns and blocks, each with a short id, its kind and a few words of its own text, plus the theme. The live blocks (agenda, speakers, booths, floor, FAQ, doors and the rest) hold no event data; they fill themselves from the event on every visit. `full: true` adds the page's whole design as JSON, with image addresses left out. site_edit names blocks by these short ids. Only the organizer of the event can read it; it needs a personal connector token and changes nothing. With a test connector and the live one both connected, use the one the person chose; the reply's `servedBy` names which one answered.

    Annotations the server declares

    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • readOnlyHint: true
  • site_listLists the websites of an event the person organizes, built in the Sonar Connections site builder: each site's `siteId`, its name, whether it is published, how many earlier versions…No findings

    Why it is in this group

    • The name "site_list" says "list": a word for reading.
    Description, as the server wrote it
    Lists the websites of an event the person organizes, built in the Sonar Connections site builder: each site's `siteId`, its name, whether it is published, how many earlier versions are kept, when it was last saved and published, its live address and, once it has been edited from here, its draft preview link. Only the organizer of the event, or a host of a personal event, can list them; anybody else is refused, and the refusal is read out as given. It needs a personal connector token and changes nothing.

    Annotations the server declares

    • destructiveHint: false
    • idempotentHint: true
    • openWorldHint: false
    • readOnlyHint: true

This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.

Install

Pinned to version 0.1.0. Values in angle brackets are yours to fill in.

claude mcp add --transport http sonar-connections https://mcpconnector-gtlizqtvza-uw.a.run.app/public

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change, deny the deletes. Paste into .claude/settings.json.

.claude/settings.json
{
  "permissions": {
    "allow": [
      "mcp__sonar-connections__event_find_matches",
      "mcp__sonar-connections__event_inbox",
      "mcp__sonar-connections__events_list",
      "mcp__sonar-connections__events_get",
      "mcp__sonar-connections__site_list",
      "mcp__sonar-connections__site_get",
      "mcp__sonar-connections__biz_order_status"
    ],
    "ask": [
      "mcp__sonar-connections__booth_set_away",
      "mcp__sonar-connections__biz_set_item_availability",
      "mcp__sonar-connections__event_redeem_code",
      "mcp__sonar-connections__event_card_links",
      "mcp__sonar-connections__event_card_save_linkedin",
      "mcp__sonar-connections__booth_connect",
      "mcp__sonar-connections__booth_enter_raffle",
      "mcp__sonar-connections__booth_claim_swag",
      "mcp__sonar-connections__booth_take_invite",
      "mcp__sonar-connections__event_reply",
      "mcp__sonar-connections__event_say_hello",
      "mcp__sonar-connections__event_requests",
      "mcp__sonar-connections__event_accept",
      "mcp__sonar-connections__event_text_alerts",
      "mcp__sonar-connections__events_overview",
      "mcp__sonar-connections__events_floor_card",
      "mcp__sonar-connections__event_wallet_pass",
      "mcp__sonar-connections__events_personal_card",
      "mcp__sonar-connections__event_pass_notice",
      "mcp__sonar-connections__event_meetup_announce",
      "mcp__sonar-connections__event_meetup_rsvp",
      "mcp__sonar-connections__event_session_add",
      "mcp__sonar-connections__event_organizer_overview",
      "mcp__sonar-connections__site_create",
      "mcp__sonar-connections__event_send_request",
      "mcp__sonar-connections__event_guest_requests",
      "mcp__sonar-connections__event_guest_request_handled",
      "mcp__sonar-connections__ui_card_diag",
      "mcp__sonar-connections__events_booths",
      "mcp__sonar-connections__events_offers",
      "mcp__sonar-connections__events_whats_on",
      "mcp__sonar-connections__events_speakers",
      "mcp__sonar-connections__biz_info",
      "mcp__sonar-connections__biz_availability",
      "mcp__sonar-connections__biz_menu",
      "mcp__sonar-connections__biz_order",
      "mcp__sonar-connections__biz_storefront"
    ],
    "deny": [
      "mcp__sonar-connections__event_set_intent",
      "mcp__sonar-connections__event_pass_reissue",
      "mcp__sonar-connections__event_pass_revoke",
      "mcp__sonar-connections__event_session_move",
      "mcp__sonar-connections__event_session_rename",
      "mcp__sonar-connections__event_session_cancel",
      "mcp__sonar-connections__site_edit",
      "mcp__sonar-connections__site_publish",
      "mcp__sonar-connections__site_undo_publish",
      "mcp__sonar-connections__event_change_detail",
      "mcp__sonar-connections__event_change_undo"
    ]
  }
}

Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. It assumes the server is installed as sonar-connections. Review it before you use it.