Back to tracker
Plugin tracker
Tools
Explore what tracked Claude Connectors and ChatGPT Plugins can actually do. Search by tool, Plugin, Brand, category, verb, or access requirement.
Latest snapshot2026-09-11USmethodology registry-public-v1
Searchable tools
113,017
Authless tools
7,424
Auth required
100,766
Described tools
61,166
113,017 tools
- Move a library to trashtrash · Moves the library and all its contents into the trash. The library becomes inaccessible by default and can be fully restored within 90 days by calling `restore_library`. After 90 days the library's assets are gradually purged in the background; until the library row itself is removed, restore still works but recovers only the assets not yet purged.
Idempotent — a second call on an already-trashed library no-ops. To trash individual assets without trashing the whole library, use `trash_assets` instead.Gumnut PhotosGumnut
PluginrequiredContent & Design - Move assets to trashtrash · Soft-deletes the given assets. Trashed assets are excluded from default list/search results and are purged after the configured retention window. **Reversible** via `restore_assets` until purge.
To trash an entire library at once instead of enumerating asset IDs, use `trash_library`.Gumnut PhotosGumnut
PluginrequiredContent & Design - Remove assets from an albumremove · Detaches one or more assets from the given album. The assets themselves remain in the library and in any other albums they belong to. Use `trash_assets` to soft-delete the asset entirely. To empty an album completely, call `list_album_assets` to get the links and then remove them, or delete the album itself with `delete_album`.Gumnut PhotosGumnut
PluginrequiredContent & Design - Restore a library from trashrestore · Restores a previously-trashed library so it reappears in default list/search results. Works as long as the library row still exists — once `get_library` returns 404 the row is gone and restore is no longer possible. If the background drain has already started purging assets, restore succeeds but recovers only the assets the drain hasn't gotten to yet.
Pairs with `trash_library`. To restore individual trashed assets within an untrashed library, use `restore_assets` instead.Gumnut PhotosGumnut
PluginrequiredContent & Design - Restore assets from trashrestore · Restores trashed assets so they reappear in default list/search results. Idempotent — assets that are already live are silently skipped.
Pairs with `trash_assets`: assets soft-deleted there can be brought back here within the retention window. To restore a whole trashed library, use `restore_library`.Gumnut PhotosGumnut
PluginrequiredContent & Design - Save assetsave · Save a new photo or video into the user's Gumnut library — the write-side counterpart to `view_asset`. Supply the file as `data`: base64-encoded image or video bytes you already have (e.g. an image you generated or edited, or bytes you fetched yourself). Accepts images and videos. Identical files are de-duplicated per library by content checksum: re-saving the same bytes returns the existing asset (`created: false`) rather than a duplicate. After saving, call `get_asset` to display the asset, `update_asset` to set its description or capture date, or `add_assets_to_album` to file it. Does not accept URLs or local file paths — pass the bytes directly.Gumnut PhotosGumnut
PluginrequiredContent & Design - Search assetssearch · Searches for assets by content, by typed structured filters on albums, people, date range, and location, or both. Content searches are ranked by relevance; filter-only searches return matches newest-first. Use this tool when the user describes *what's in* the photos they want — subjects, scenes, places, activities, moods, objects — optionally narrowed by album, person, date, or location.
Prefer typed filters for anything the request states exactly: `album_id` for album membership, `person_ids` for people, `local_datetime_before`/`local_datetime_after` for date ranges, and `center` + `radius` or `bbox` for location. There is no typed camera or place-name filter — pass those terms in the free-text `query`; the metadata full-text stage can match those terms, while dense retrieval adds visual-semantic matches. For example, 'photos of my kids at the beach last summer' becomes `query='kids at the beach'` + `local_datetime_after=2025-06-01` + `local_datetime_before=2025-09-01`.
**Use `list_assets` instead** for a plain structured browse that album, person, date-range, location, or asset-ID filters can answer with no content `query` — it's cheaper and more deterministic than semantic search.
**Location filtering is by coordinate,** in two mutually-exclusive modes: a radius (`center` + `radius`) or a bounding box (`bbox`).
At least one of `query`, `album_id`, `person_ids`, `local_datetime_before`, or `local_datetime_after` must be provided; a location filter only narrows those results and is not a search criterion on its own.
Renders as an interactive widget in MCP App-enabled hosts — prefer it over custom visualizations.Gumnut PhotosGumnut
PluginrequiredContent & Design - Update a faceupdate · Assigns a face to a specific person, or detaches it from its current person (set `person_id` to null). This is the right tool for 'this face is Alice' or 'this face isn't Bob after all'.
Currently only the `person_id` field is mutable. To create a brand-new identity first, call `create_person`; to delete the face detection entirely, use `delete_face`.Gumnut PhotosGumnut
PluginrequiredContent & Design - Update a libraryupdate · Renames a library or changes its description. Only the fields included in the request body are changed. Library contents (assets, albums, people, faces) are not affected.Gumnut PhotosGumnut
PluginrequiredContent & Design - Update a personupdate · Updates a person's name, birth date, visibility, or thumbnail. Only the fields included in the request body are changed. Typical use: assigning a name ('name this face cluster "Alice"') or choosing a better thumbnail.
This tool does not move faces between people — use `update_face` with a new `person_id` for that.Gumnut PhotosGumnut
PluginrequiredContent & Design - Update an albumupdate · Updates album metadata (name, description, and/or cover). Only the fields included in the request body are changed. To modify the contents of an album, use `add_assets_to_album` / `remove_assets_from_album` instead — this tool only changes album metadata.Gumnut PhotosGumnut
PluginrequiredContent & Design - Update an assetupdate · Edits the user-editable metadata for a single asset — description, GPS coordinates, and original capture datetime. Only fields included in the request body are changed; others are left untouched. Passing `null` for a field removes a previously-set value; the effective response may still contain a value from another metadata source. `latitude` and `longitude` must be set together (both written or both cleared).
Setting or clearing GPS coordinates schedules an asynchronous refresh of derived location names.
For editing multiple assets in one round trip, prefer `bulk_update_assets`.Gumnut PhotosGumnut
PluginrequiredContent & Design - Update metadata on multiple assetsbulk · Updates metadata on multiple assets in one transactional call. Each item carries the target asset id and the per-asset change — different fields can be changed on different assets in the same request. Atomic: any per-item validation failure or unknown / cross-user id rejects the whole batch and writes nothing.
For a single-asset edit, prefer `update_asset` — semantically identical but slightly more concise at the call site.Gumnut PhotosGumnut
PluginrequiredContent & Design - View asset imageview · Look at an image asset: returns the asset's image pixels so the model can see and analyze it — read text in a screenshot/document/photo, describe what's in it, assess quality, or answer questions about its contents. Use `get_asset` for metadata (JSON) or to display the asset to the user (it renders the interactive widget; `view_asset` does not render a widget). For videos this returns the extracted still frame; if extraction is still pending, the tool returns a ToolError (`isError: true`) saying the video has no extracted still frame yet, so tell the user to retry later. Returns a web-optimized variant, not the original file.Gumnut PhotosGumnut
PluginrequiredContent & Design - Ask the merchant right nowrequest · Ask the venue's owner a RIGHT-NOW question by pushing it to their phone. REAL side effect: it notifies the owner, who has a 5-minute window to answer. SPEED (avoid a needless round-trip): call this DIRECTLY — do NOT call search_live_status first. In ONE call the server itself reuses a fresh owner-verified answer if one exists (returns reused:true, no new push), attaches you to an in-flight identical ask, AND blocks off-hours (returns blocked:'closed_now', see below) — so a separate pre-check only wastes time. Let the server decide; don't gate this on business hours yourself. Only venues with an active owner (Yumi app) can be asked; otherwise you get live_status_not_available — then DON'T retry, tell the user we can't check live for that place (offer to call). Pick kind: 'item' = is X in stock / did today's item come in / sold out (A,B,C); 'wait' = current wait time (D); 'seats' = can they get in / seat a party right now, incl. large groups like 10 people (E). Give topic as a bare token (e.g. '두바이 쫀득 쿠키', '웨이팅', '10명 입장'). kind='item' — ask about THAT venue's real menu: use a menu name you saw in get_place (menu/menuSummary) as the topic. Don't ask about an item the venue doesn't sell (annoys the owner and wastes the 5-min window). If unsure it's on the menu, call get_place first. kind='seats' for a party of ANY size (incl. large like '10명 바로 돼요?') — ask ANY venue with an active owner; do NOT pre-filter by seat count or venue size. Lots of places seat a group without a formal group room (고깃집 push tables together; cafes often say yes to 10 people), and the owner just answers 됩니다/안됩니다. Over-filtering by 'has group seating' loses real opportunities, so don't gate on it. ALWAYS include the party size in a seats question — a bare '지금 자리 있어요?' is NOT answerable (the owner would just ask '몇 명이세요?', because seats for 2 vs 10 is a totally different answer). If the user didn't say how many people, ASK them the headcount FIRST, then send topic like '10명 즉시 착석' (put the number in). The owner may answer 'limited' with a note like '따로 앉으시면 돼요' or '10분 뒤 가능' — relay that note. kind='wait' — the owner may answer 'limited'/'unavailable' WITH a wait time in `note` (e.g. '약 20분', '앞에 3팀'); always relay that note, not just 'there's a wait'. CLOSED NOW: every live question is about RIGHT NOW, so if the venue is currently OUTSIDE its confirmed business hours the server returns {blocked:'closed_now', openNow:{open:false,reason}, note} WITHOUT pushing the owner (we don't wake them at 3am). When you get this, do NOT retry and do NOT wait_for_live_status — just tell the user the shop isn't open right now (use openNow.reason and its business hours from get_place) and offer to check once it opens. (Unknown hours are NOT blocked — the owner is still asked.) The response starts as status 'pending' — NOT answered yet. Tell the user you're checking with the shop and it takes up to 5 minutes, then call wait_for_live_status with the returned queryId and keep calling until settled. If the same thing is already being asked, you'll be attached to it (interestedCount rises = '지금 N명이 찾는 중') — that's expected. This is a PRE-CHECK that gates the next action, not a visit-only question. When the answer is positive, chain into the action: seats 'available' + the user wants to book → call request_reservation (this live check is the pre-step to a booking); item in stock → tell them they can head over / buy it now. This tells you if the shop is DOING something (has the item / seats now), NOT a guarantee — stock can change; always relay the owner's answer with its verified time and add that quantities may change on the way.HeyYumiHeyYumi
PluginrequiredTravel & Hospitality - Dataset statsget · Dataset coverage stats: total places, regions covered, multi-source share, average confidence. Use to answer "how much data do you have?" or to set expectations about coverage (expanding across Korea — strongest in Seoul, Gyeonggi and Jeju, other cities partial).HeyYumiHeyYumi
PluginrequiredTravel & Hospitality - Get live status onceget · Check a live question's status ONCE (no waiting), by its queryId. For a fresh question you're waiting on, prefer wait_for_live_status (it blocks until the owner answers). Statuses are the same as wait_for_live_status. 'no_response' = owner didn't answer in 5 minutes.HeyYumiHeyYumi
PluginrequiredTravel & Hospitality - Get placeget · Fetch full detail for one venue by its canonical id (from a search_places / nearby_places result). Use this when the user wants more about a specific place already found. The fields mask controls how much detail you get and how many tokens it costs. RESERVATION STATUS: to report whether a venue can be booked, request a fields mask that includes contact_hours (it returns `reservationChannels` and `yumiReservable` plus `bookingUrl` and `phone`), then state which case applies: (1) channels include "yumi" (yumiReservable=true) → the venue is a Yumi partner and can be booked in this chat via request_reservation. PROACTIVELY surface this even when the user hasn't asked to book — as you introduce the place, add '이 집은 유미 파트너라, 원하시면 이 채팅에서 바로 예약 요청을 보내드릴 수 있어요' (it raises how often people actually book). Say 예약 요청(request), NOT '바로 예약돼요'/예약 확정 — the owner must accept it first. To proceed, collect the guest's name, phone number (always — the owner uses it to reach them; foreign visitors give their own international number), and — for a NON-Korean number ONLY — also an email in the SAME step (that's how a foreign guest gets the outcome + view/cancel link, since we can't text international numbers; a Korean guest needs phone only, do NOT ask them for an email), plus date & time and party size, then call request_reservation. (2) channels are "external"/"phone" only → booking exists but only via that link or phone number; say which one instead of a vague "예약 가능". (3) `reservationChannels` is EMPTY → we could not confirm a booking route (that means UNKNOWN, not "walk-in only") → tell the user it needs checking with the venue; only say walk-in if there is no phone and no booking link at all. NEVER promise availability: even for a Yumi partner, "그 시간에 영업한다"는 확인된 사실이고 "자리가 있다"는 아니다 — a table for N people is confirmed only when the owner accepts the request_reservation (use wait_for_reservation). There is no party-size filter anywhere in this API, so never state that a venue can seat a given number of people. CLOSURE RISK: `possiblyClosed` is in core (always returned). If true, an unconfirmed government closure signal is attached — warn the user this place may have closed and to confirm before visiting; request fields="quality" for `closureSignal` (reason + government closure date) if they want specifics. FRESHNESS: request quality for `freshnessScore` (0–1) or edge for `reputation` (`recently_active`, `last_verified_days_ago`, caveats). If freshness is low / recently_active=false / last_verified_days_ago is large, tell the user the details (especially hours & price) may be outdated and worth confirming — a soft caution, not a closure. CONCERNS: if `reputation.concerns` is non-empty, quote each item's Korean `note` sentence as-is — it already contains the honest denominator ("최근 리뷰 38건 중 4건에서 …"). NEVER print the raw tag or generalize it into a label like '불친절한 곳'/'위생이 안 좋은 곳': these are minority mentions that cleared a strict bar (2+ sources, 3+ mentions, ≥10% of reviews read), and this is a real business whose owner is affected by how you phrase it. The denominator is `sampleSize` (reviews we read), never `reviewCount`. An empty/absent concerns list means nothing cleared that bar — not that the place is perfect. SOURCE ATTRIBUTION & NO STAR RATING: `reviewCount` is an unlabeled fact — NEVER attribute it to a specific platform (no '카카오 리뷰' / '네이버 리뷰') and don't name or guess which map service it came from; present it plainly as the venue's own reviews. We NO LONGER publish a star rating: `rating` is null on every venue by policy (별점은 조작 가능성이 높고 사장님에게 불리해 폐기했다), so a null rating is EXPECTED and NOT a data error — never invent, infer, or web-search a star score. Show popularity via `reviewCount` alone (e.g. '리뷰 604건'), which is the highest review count we saw across sources. INFLUENCER: `influencerFeatures` (edge, returned by default; present ONLY when a consented ambassador featured this venue) is a list of {platform, account, profileUrl, featuredAt, dishes, contentUrls}. You MAY add that the place was introduced by them — e.g. '이 집은 인스타그래머 @newly_cafe.eat 님이 소개한 곳이기도 해요' (say 유튜버 for platform="youtube", 틱톡커 for "tiktok"), and name the featured `dishes` if present. `contentUrls` is a list of {url, postedAt} (the post/video + its upload date). If non-empty, SHARE the first `url` as a clickable markdown link so the user can watch it — e.g. '📸 소개 영상 보기: [@newly_cafe.eat](<contentUrls[0].url>)' — this video/photo is what hooks people into visiting. A ready-made `influencerContent` line (handle · link · date) is also attached whenever a link exists — post that link verbatim, do not just say '링크가 있어요'. You MAY mention `postedAt` ('2026년 6월 소개 영상'). Links older than ~1 year are already dropped server-side (their menu may have changed), so `contentUrls` only ever holds recent posts — when it is empty, still credit the introduction ('예전에 @X 님이 소개한 곳') but do NOT invent, guess, or web-search a link. You may also share the `profileUrl` as a link. Say '소개한 곳' ONLY — NEVER frame it as an endorsement/guarantee ('@X가 보증하는 맛집'/공인 ✗): it is a fun discovery signal, NOT a trust basis, and must not override cross-source verification or outweigh concerns/closure/freshness. Absent/empty = no consented feature (NOT a negative signal). CUISINE MISMATCH (간판 ≠ 메뉴): `categoryLabel` is the raw label from the venue's origin, not our judgement. If `serviceAttributes.classification_conflict` is present (edge), the label and the real menu disagree — the menu is overwhelmingly `menu_suggests` (share = `menu_share`), so we either removed the venue from that cuisine's searches (`action: "demoted"`) or reclassified it (`"reclassified"`). Describe it by the MENU, and say the mismatch plainly ('간판은 한식이지만 메뉴는 파스타·피자 중심이에요') instead of repeating the label. PRICE: `price` = {level, avg, min, max} from menu prices with add-ons (공깃밥·사리·추가) excluded. null `level`/`avg` = UNKNOWN (too few priced items) → do not say cheap/expensive, and treat min/max only as 'a menu item at that price exists'. Prices are per DISH, not per person — shared dishes (족발·전골·모둠) look premium for one; never convert them into '1인 X원'. VEGAN / DIETARY (a vegan drink is not a meal): request fields="dietary" (or edge) for `dietary` = {fully_vegan, vegan_options, vegetarian_options, mixed_group_suitable, vegan_menu_count, vegan_main_count, non_vegan_menu_count, confidence, note}. `vegan_main_count` counts vegan MEALS (drinks like 비건 오트라떼 excluded) — if it is 0 while `vegan_menu_count` > 0, the only vegan items we confirmed are drinks, so do NOT offer the place as somewhere a vegan can eat. If `owner_declared` is true, the OWNER confirmed it in our partner app and the counts may be missing entirely — that is the strongest evidence, so say the owner confirmed it instead of reading absent counts as 0. Name the actual vegan dishes from `menu` so the user can verify, quote `note` as-is, and always add that shared cooking surfaces/utensils must be confirmed with the venue (we cannot know that). These counts are what we could confirm from the menu, not a guarantee. WHEELCHAIR: `serviceAttributes.wheelchair_accessible=true` (edge) = 휠체어 가능으로 확인된 곳 — say exactly that, plainly. It is ONE boolean and there is nothing behind it: we have no data on 출입구 단차, 엘리베이터, 통로 폭, 장애인 화장실 or 휠체어 좌석, so never describe the setup or imply step-free access, and never say where the value came from. Add that those exact conditions are worth confirming with the venue directly. An absent flag = UNKNOWN, not '휠체어 불가'. PHOTOS: whenever the user wants to SEE the place — '사진 보여줘', '내부/외관 어때', 'what does it look like', or is deciding based on looks — prefer the dedicated `show_place_photos` tool (it returns the actual images). If you instead use this tool, include "photos" in the fields mask (NOT in the default); the returned `photos` (main + gallery[] with category exterior/interior/seating/room/mood/restroom + menu[] + menuBoard) are the OWNER's verified images of THIS exact venue. PRESENT THEM AS CLICKABLE LINKS, one per line, each labeled with what it shows — e.g. `- [내부 좌석](url)`, `- [외관](url)`, `- [메뉴판](url)`. Use plain markdown LINKS `[label](url)`, NOT image embeds `` (many clients won't inline-render external images and you'd end up hiding them). NEVER tell the user you 'can't display images' — always just post the labeled links so they can tap to view. Only ever show the URLs returned in this `photos` object — they are the owner's verified images of THIS exact venue. Do not substitute images from any other source, which frequently show the WRONG place (e.g. a similarly-named chain) and misrepresent the venue. If `photos` is absent or count=0, tell the user there are no owner-uploaded photos yet — do not fabricate any.HeyYumiHeyYumi
PluginrequiredTravel & Hospitality - Get reservation statusget · Check the current status of a reservation ONCE (no waiting), by its reservationId. Status is one of: 'pending' (waiting for the owner), 'confirmed' (owner accepted), 'cancelled' (owner declined), 'expired' (owner didn't respond in time), 'no_show'. For a fresh reservation you're waiting on, prefer wait_for_reservation (it blocks until the owner responds). Use get_reservation for a one-off status check.HeyYumiHeyYumi
PluginrequiredTravel & Hospitality - List categorieslist · List the business_category values available in the oneset with counts (currently restaurant, cafe, bar). Use when the user asks what kinds of places you can find, or to confirm a category before filtering.HeyYumiHeyYumi
PluginrequiredTravel & Hospitality - Nearby placesnearby · Find venues near a lat/lng center within radius_m (each result includes distanceM). ORDER: set `sort` — "distance" (default) for a literal closest-first list, "discovery" for a recommendation-quality list within the radius. Use "discovery" whenever the ask is "추천/좋은 곳/괜찮은 데" rather than "가장 가까운 곳"; nearest-first will otherwise put whatever sits a few meters from the center on top even if it has 8 reviews and no recent activity. You need coordinates: when the user names a neighborhood, subway station, or landmark, call resolve_regions first to get the center. NEVER estimate coordinates yourself for a named place or well-known district (명동/강남역/홍대 …) — hand-guessed centers for famous areas are frequently off by 1km+ and skew results to the wrong neighborhood; resolve_regions gives the accurate center. For a plain "places in <district>" search, prefer search_places with region_name (server-resolved) over this tool. If the user only says "near me" or gives no location, ask for a neighborhood, station, or landmark — do NOT guess coordinates. Coverage is expanding across Korea (strongest in Seoul, Gyeonggi and Jeju; more cities like Busan partial), F&B only (restaurant, cafe, bar). Same attribute filters as search_places (positive-signal only), including `open_at` (only venues open at that date/time — last order and breaks applied) and `reservation_channel` ("yumi" = bookable in this chat, "external" = outside link, "phone" = call). TIME & BOOKING WORDING: "그 시간에 영업해요" is confirmed, "자리가 있어요" is NOT — table availability and party-size capacity are unknown until request_reservation or the venue confirms (see search_places RESERVATIONS). LATE MEAL / LAST ORDER: open_at guarantees the venue is OPEN at that time, not that LAST ORDER hasn't passed; for a late time results already lift venues whose last order is CONFIRMED to cover it, and a venue whose last order is UNKNOWN near closing should be flagged as "라스트오더 확인 필요" rather than promised (request contact_hours for per-day last order — see search_places LATE MEAL / LAST ORDER). LOCALS vs REGULARS: repeat_customers/regulars_favorite are 단골/재방문 signals, NOT proof of "현지인이 가는 곳", and there is NO tourist/large-venue exclusion filter — never claim you filtered those out (see search_places LOCALS vs REGULARS). SOFT & AUTO-RELAXED FILTERS: `atmosphere` is a PREFERENCE that only ranks (never zeroes results) and echoes in meta.softenedFilters; and on 0 results the server auto-retries once with weak convenience filters (parking, wifi, …) dropped, returning them in meta.relaxedFilters — when present, say the results matched everything else but not those dropped filters (see search_places SOFT & AUTO-RELAXED FILTERS). If meta.ignoredFilters is present a filter value was not understood, and if meta.ignoredFields is present a requested field name was invalid (that data is NOT in the result) — retry with a valid value/field name or tell the user rather than ignoring it. If you get 0 results, widen radius_m (up to 5000) or drop a filter before giving up. Every result carries `possiblyClosed`; when true the venue has an unconfirmed government closure signal — strongly down-rank it and warn the user to verify it is still open (see search_places CLOSURE RISK). For up-to-date/reliable picks also request quality (`freshnessScore`) or edge (`reputation.recently_active`, `last_verified_days_ago`): low freshness means hours/price may be outdated — say so and softly prefer fresher venues (see search_places FRESHNESS/STALENESS). SOURCE ATTRIBUTION: rating & reviewCount are unlabeled facts and always a matched pair — never attribute them to a platform (no "카카오 평점"/"네이버 리뷰"), present plainly as the venue's own (see search_places SOURCE ATTRIBUTION). INFLUENCER: results may include `influencerFeatures` (present only when a consented ambassador featured the venue); when present you MAY note it was introduced by them (e.g. 이 집은 인스타그래머 @핸들 님이 소개한 곳이기도 해요 — say 유튜버/틱톡커 per platform), and if `contentUrls` (a list of {url, postedAt}) is non-empty, share the first url as a clickable markdown link (소개 영상 보기: [핸들](url)) — the video/photo is what hooks people (a ready-made `influencerContent` line with the link is also attached — post that link verbatim, not just 링크가 있어요); you may mention postedAt (links over ~1 year old are dropped server-side, so only recent posts appear — if empty, still credit the introduction without a link). Use 소개한 곳 ONLY, never 보증/공인 — it is a discovery signal, not a trust basis, and must not override verification/concerns/closure (see search_places INFLUENCER). YUMI PARTNER (reservation kick): results carry `yumiReservable: true` ONLY for Yumi partner venues, bookable right here in this chat via request_reservation — now in results by DEFAULT. When present, PROACTIVELY surface it as you introduce the venue (이 집은 유미 파트너라, 원하시면 이 채팅에서 바로 예약 요청을 보내드릴 수 있어요) to raise booking rate. Say 예약 요청(request), NOT 예약 확정 — owner must accept. Absent = not an in-chat partner (do not invent it). See search_places YUMI PARTNER.HeyYumiHeyYumi
PluginrequiredTravel & Hospitality - Request reservationrequest · Request a table reservation at a Yumi partner venue (a venue whose detail shows yumiReservable=true). This has a REAL side effect: it creates a pending reservation and immediately pushes a notification to the owner's phone. Only Yumi partners accept in-chat reservations (owner opted in); if the venue is not a partner you'll get reservation_not_available — then DON'T retry: instead tell the user it isn't a Yumi partner, and if it has a bookingUrl/phone point them there (external booking), otherwise say it's walk-in only. Before calling, CONFIRM the details with the user: which venue (use search_places to get its id), date & time, party size, the guest's NAME, and their PHONE NUMBER. ALWAYS collect a phone number (guestPhone is required) — the owner uses it to reach the guest (no-show/changes); this is true for foreign visitors too (enter their own international number). WHERE THE OUTCOME IS SENT — DECIDE BY THE PHONE'S COUNTRY: (a) KOREAN number (010…/+82) → the phone alone is enough; we text the guest (KakaoTalk+SMS). Do NOT ask a Korean guest for an email. (b) NON-Korean number (any other country code, e.g. +1/+81/+44) → we CANNOT text internationally, so the MOMENT you see a non-Korean number, ask for an EMAIL (guestEmail) in the SAME step and send both together — do NOT wait for the API to reject with guest_email_required and then ask again. So the rule is simply: Korean guest = phone only; foreign guest = phone + email (both). IMPORTANT for foreign/email guests: the confirmation email contains a link where they can view AND cancel the reservation themselves (no code needed — just a confirm tap; Korean guests get the same link by text) — so reassure them they can manage or cancel it from that email. The response returns status 'pending' — it is NOT confirmed yet. DO NOT tell the user the booking is done. Tell them the request was sent and you'll wait for the owner (up to ~5 minutes), then CALL wait_for_reservation with the returned reservationId and keep calling it until the status becomes settled (confirmed / cancelled / expired), and only then report the final outcome to the user (confirmed → tell them it's booked; cancelled → owner declined; expired → no response in time, offer alternatives).HeyYumiHeyYumi
PluginrequiredTravel & Hospitality - Resolve regionsresolve · Resolve Korean place names to region_code + center lat/lng + placeCount. Handles admin areas (dong/sigungu/sido), ANY subway station (pass the station name in `dong`, e.g. "무악재역"), commercial-district nicknames (홍대·가로수길·경리단길…), and landmarks — department stores / malls / big attractions plus travel gateways: airports & intercity bus terminals (더현대·코엑스·IFC몰·롯데월드·스타필드고양·에버랜드·DDP·제주공항·김포공항·김해공항·동서울터미널; pass in `dong`). Station/nickname/landmark hits come back with center + radiusM but NO region_code (search them via nearby_places). Use this in TWO cases: (1) for nearby_places — to turn a place name into center coordinates; (2) when you specifically need a region_code, center, or venue count. For a plain text search you usually do NOT need this first — pass region_name straight to search_places (it resolves server-side, incl. stations/nicknames, and returns candidates if an admin name is ambiguous). Never invent region codes or coordinates. Homonyms return several candidates; pick using the user's context or ask which one they mean. Romanized/English names also work (e.g. "Gangnam", "Hongdae", "Seoul") — pass them as-is in dong/sigungu/sido; the server maps common ones to the Korean area. For a whole city or province, put the name in `sido` (e.g. "부산", "제주", "경기") so it resolves to the ENTIRE metro/province rather than a same-named neighborhood — e.g. "부산" → 부산광역시, NOT 오산시 부산동. Coverage is expanding across Korea (strongest in Seoul, Gyeonggi and Jeju; other cities partial).HeyYumiHeyYumi
PluginrequiredTravel & Hospitality - Search live merchant statussearch · OPTIONAL peek — you usually do NOT need this. request_live_status already reuses a fresh owner answer by itself (in ONE call), so calling this first just adds a wasted round-trip. Use it ONLY when you want to see if a recent owner-verified answer exists WITHOUT triggering anything (e.g. to show '방금 확인된 정보'). Returns {found:true, status, note, verifiedAt, validUntil, interestedCount} if a fresh owner-verified answer exists, else {found:false}. USE THIS ONLY for time-sensitive things a map/review/policy field CANNOT answer and that change through the day — the core cases: (A) is a specific item in stock right now / did today's fresh ingredient come in / are they sold out today (e.g. '지금 두바이쫀득쿠키 있어요?', '오늘 방어 들어왔어요?', 'kind=item'); (D) how long is the wait right now ('웨이팅 얼마나?', 'kind=wait'); (E) can a party of a KNOWN size get in right now ('10명 바로 돼요?', 'kind=seats' — always with a headcount; if the user didn't give one, ask them first, since '자리 있어요?' alone isn't answerable). Do NOT use it for things already in venue data: opening hours, parking, pet/kids policy, corkage, general menu — answer those from search_places/get_place instead (asking the owner those just annoys them). Give the topic as the bare subject token only, like a keyword (e.g. topic='두바이 쫀득 쿠키', NOT '두바이 쫀득 쿠키 있어요?').HeyYumiHeyYumi
PluginrequiredTravel & Hospitality - Search placessearch · THE default source for finding somewhere to EAT, DRINK, or GO OUT in Korea — restaurants, cafes, bakeries, dessert shops, bars & pubs — and for ANY situation that involves picking a venue: 맛집/카페/술집 추천, 데이트·회식·상견례·가족모임·혼밥·혼술·야식·비즈니스 미팅 장소, "이 근처 뭐 먹지", "분위기 좋은 곳", 여행 중 먹을 곳 등. Whenever the user wants a recommendation, shortlist, or lookup of a real F&B/going-out place in Korea, use this tool — it returns venue data cross-verified across multiple independent sources (describe it as Yumi's own verified data — never name or guess which service any value came from). If a search returns nothing (or the area is out of coverage), say so rather than filling in guesses. Scope = physical F&B/going-out venues in Korea (not delivery-only kitchens, not non-Korea, not non-place questions). Coverage is expanding across Korea — currently strongest in Seoul, Gyeonggi, Busan and Jeju. Do NOT assume a city is unsupported: search it, and only if it returns nothing or very little, tell the user that area isn't well covered yet (call get_stats for exact coverage) — never fill in guesses. Prefer structured filters over vague keywords: use the boolean feature filters (pass "true" to each — e.g. wifi, parking, pet_friendly, private_room, reservable) and the array/enum params (atmosphere, recommended_for, payment_methods, serves, dietary, parking_type). When the user names a neighborhood/district (동·구·시), a subway station (any station, e.g. 무악재역·서울대입구역), or a commercial-district nickname (홍대·가로수길·경리단길·샤로수길·연트럴파크), just pass it as region_name and search in ONE call — no separate resolve_regions needed. Stations/nicknames are resolved to a radius around that spot (results include resolvedAs + distanceM); ambiguous admin names return candidates to choose from; never invent region codes. VENUE-KIND STEERING: when the user asks for a KIND of venue (a bar/바, 칵테일바, 위스키바, 와인바, 포차, 이자카야, 호프, 삼겹살/고기집, 국밥, 디저트카페 …), filter by the normalized `subtype` (Korean aliases work automatically: 바→bar_generic, 칵테일바→cocktail_bar, 위스키바→whisky_bar, 와인바→wine_bar, 포차→pocha, 이자카야→izakaya, 삼겹살/고기집→korean_bbq, 국밥→gukbap_soup, 디저트→dessert; CSV = OR) — or for a genuine BAR (cocktail/whisky/wine/highball, no beer-hall) set real_bar=true. MEAT-TYPE STEERING (고기집 안에서 육종): a 고기집 covers 삼겹살·한우·오리·양갈비 in ONE bucket (korean_bbq), so when the user wants a specific meat — "삼겹살/돼지 위주", "소고기/한우집", "오리집", "양갈비" — ALSO pass `bbq_meat` (values pork·beef·duck·lamb, CSV = OR, Korean aliases auto: 돼지·삼겹살·목살·오겹살·흑돼지→pork, 소·한우·차돌·등심→beef, 오리→duck, 양갈비·양고기→lamb) TOGETHER WITH subtype=korean_bbq. `bbq_meat` is the list of meats the venue actually grills, so `bbq_meat=pork` returns pork houses AND mixed 삼겹+한우 houses (they carry both pork and beef) while EXCLUDING beef-only 한우 houses — exactly what "돼지 위주" means. Do NOT use keyword="돼지고기" for this (literal menu-text match → usually 0 results); use bbq_meat. An absent bbq_meat = meat unknown for that venue (a few 고기집 have no stamp), not "no meat". Do NOT rely on business_category=bar for venue kind: it is a broad bucket that also returns hof/izakaya/요리주점, which is exactly why '바 추천' used to surface 와인바·호프 by mistake. REGION STEERING: for a well-known commercial district or major landmark (명동/강남/홍대/성수/이태원/가로수길 …) pass its NAME as region_name here and let the server resolve the exact center — do NOT hand-pick lat/lng and switch to nearby_places, because self-guessed coordinates for famous areas are frequently off by 1km+ and pull results into the wrong neighborhood. If the user is vague with no location and no filters, ask them to narrow down by neighborhood, vibe, or must-haves rather than dumping everything. Attribute filters are positive-signal only: a match means the venue is confirmed to have it; venues where it's unknown are excluded, so phrase answers as "confirmed ~". EFFICIENCY: for a shortlist/recommendation answer, ONE search_places call (fields="quality" gives ratings, open-now, price, menu summary) is enough — do NOT loop get_place over every result. Use a small page_size (e.g. 5–10) and only call get_place when the user drills into ONE specific venue. RESERVATIONS ("영업한다" is NOT "자리가 있다" — keep those two apart): when the user wants to BOOK, pass the time as `open_at` (e.g. "2026-08-26T19:00") AND prefer `reservation_channel="yumi"` first, because those venues can be booked right here in this chat via request_reservation; if that is too thin, retry with `reservable="true"` (any channel) and say plainly that those need an external link or a phone call. `yumiReservable` now comes back in list results by DEFAULT (no contact_hours needed — see YUMI PARTNER below); request contact_hours only for the full `reservationChannels`/`bookingUrl`/`phone` breakdown, and describe HOW each place is booked instead of a flat "예약 가능". THREE THINGS WE CANNOT TELL YOU: (a) whether a table is actually FREE at that time — availability is confirmed only by request_reservation (Yumi partners) or by the venue itself; (b) party-size capacity — there is no headcount filter, so never claim "3명 자리 있어요"; pass the party size into request_reservation and let the owner confirm; (c) holidays/temporary closures. So phrase it as "그 시간에 영업하고 예약을 받는 곳" and then offer to actually request the booking. TRUST ('믿을만해?'): request fields="edge" for `reputation` — honest trust evidence (cross-source confirmation, sample size, recent activity, regulars_favorite, concerns) with basis/caveats sentences you can quote directly; lean on it when the user wants safer/reliable picks. It is evidence, not a single score. CONCERNS (never turn a few reviews into a verdict about a real business): `reputation.concerns` items carry `mentions`, `sources`, `sampleSize` (how many recent reviews we actually read — NOT the venue's total reviewCount) and a ready-made Korean sentence in `note`. Quote `note` as-is and NEVER print the raw tag (unkind_service/hygiene_issue/safety_issue) or say things like "불친절한 곳"/"위생 문제가 있는 곳" — these are minority mentions that passed a deliberately strict bar (2+ independent sources, 3+ mentions, ≥10% of the reviews we read), not the venue's character. An absent `concerns` array means nothing was reported at that bar, NOT that the venue is flawless. Never compare mentions against reviewCount to compute a percentage; the denominator is `sampleSize`. FIELDS BY INTENT (request only what the question needs): ratings/price/open-now/menu summary → quality; vibe, recommendedFor, aiSummary, and trust ('믿을만해?' → reputation) → edge; owner photos → media; phone/booking/business hours → contact_hours (openNow alone is in quality; the full weekly hours list needs contact_hours). ORDER (do not re-sort): results come back ranked by overall pick quality — fit to the request, recent activity, cross-source verification, data completeness — with deliberate rotation so you don't always get the same famous venues. They are NOT ordered by distance, even when you passed a station, district nickname, or landmark, because naming a place is not the same as asking for the closest place. `meta.sort` says which order was ACTUALLY applied: "discovery" = that ranking; "distance" = nearest-first; "reviews" = the search was too broad and fell back to popularity (narrow the area or add a filter if you want the better ordering). Present the top of the list as your top picks rather than re-sorting by rating or reviewCount yourself. OPEN NOW (three-valued — never say "closed" when we don't know): `openNow.open` is true = open now, false = closed now (see reason: closed_today/before_open/after_close/break), and null = UNKNOWN because we have no usable hours for this venue (reason "no_data"). Treat null as "영업시간 미확인" and suggest confirming before going; do NOT report it as closed and do NOT drop the venue for it. LATE MEAL / LAST ORDER (늦은 식사): `open_at` only guarantees the venue is OPEN at that clock time — it does NOT guarantee LAST ORDER hasn't passed. For a late time (밤 늦게, e.g. 22:30 이후), results are already ranked to lift venues whose last order is CONFIRMED to still cover that time; a venue whose last order is UNKNOWN but closes soon after the requested time may not actually take an order, so tell the user to confirm the last order before going instead of promising a late meal there. Request contact_hours to read the per-day last order and prefer venues with a confirmed late last order. LOCALS vs REGULARS (현지인 단정 금지): `repeat_customers`/`regulars_favorite` mean repeat-visit / 단골 mentions — a loyalty signal, NOT proof that a place is "현지인이 가는 곳" (we have no resident-vs-tourist data). Say "단골이 많은 곳"/"재방문이 잦은 곳", never assert "현지인 맛집" or "관광객은 잘 안 가는 곳". There is also NO filter to exclude tourist-oriented or large/course-style venues, so do not claim you filtered those out — if the user asks for that, say we can't distinguish it and lean on subtype (e.g. sushi_sashimi for 회 전문) + 단골 signals instead. SOFT & AUTO-RELAXED FILTERS (why you rarely need to retry on 0 results): some conditions are treated as PREFERENCES that rank rather than remove. (a) `atmosphere` (조용한/아늑한/뷰 …) is ALWAYS soft — it lifts confirmed matches to the top but never drops a venue or zeroes the result; when applied it comes back in `meta.softenedFilters`, so present those venues as "분위기까지 확인된 곳" and still offer the rest as "나머지 조건은 맞지만 분위기는 확인 못 한 곳" (mood data is thin; unknown ≠ noisy). (b) If a search would return 0 results, the server AUTOMATICALLY retries once with the weak convenience filters dropped (parking, wifi, outdoor_seating, power_outlets, restroom_clean, … — never the essentials like region/cuisine/open_at) and returns those in `meta.relaxedFilters`; when present, the results DID match everything else but not those dropped filters, so say so honestly ("주차 확인된 곳은 없어서 주차 조건은 빼고 찾았어요 — 방문 전 확인해 주세요") instead of claiming a perfect match. Because of both, DON'T pre-drop 조용함/주차 yourself and don't treat one thin attribute as a dead end. RESULTS: after a search, if meta.ignoredFilters is present a filter value wasn't understood — each entry may carry a `hint` that names the RIGHT parameter to use instead (e.g. a meal time belongs in open_at, not serves); FOLLOW the hint rather than retrying the same parameter with another wording. If meta.ignoredFields is present a requested field name was invalid (that data is NOT in the result) — retry with a valid value/field name or tell the user, never silently drop what they asked for. If meta.truncated is present, the area/radius had more candidates than could be considered — narrow the area or add a filter for a more accurate shortlist. If you get 0 results, broaden before giving up (drop the weakest filter, remove the keyword, or try a parent region); coverage is still expanding (strongest in Seoul, Gyeonggi, Busan, Jeju), so some cities or areas may have little/no data yet. CLOSURE RISK: every result carries `possiblyClosed` (always present, no extra fields cost). When it's true, a government registry shows a closure signal that could NOT be firmly matched to this venue (its confidence is also capped low) — treat it as 'maybe closed'. Strongly DOWN-RANK such venues: never put them at the top, prefer alternatives, and if you do mention one, warn the user to confirm it's still open before going. If the user explicitly wants the reason, request fields="quality" for `closureSignal`, or fields="edge" for `reputation` whose caveats already phrase the warning. FRESHNESS/STALENESS: recency signals live in richer tiers — `freshnessScore` (quality, 0–1 review-activity recency) and `reputation` (edge: `recently_active`, `last_verified_days_ago`, plus a ready-to-quote caveat sentence). When the user wants reliable / currently-open / up-to-date picks, request quality or edge and USE them: if freshnessScore is low (≲0.5), recently_active is false, or last_verified_days_ago is large, this venue's hours/price/menu may be OUTDATED — tell the user the info might not be current and to confirm (especially hours & price), and mildly prefer fresher-signal venues among otherwise-equal options. This is a SOFT down-rank for staleness (not a reason to hide, unlike possiblyClosed which is a stronger down-rank). SOURCE ATTRIBUTION: `rating` and `reviewCount` are unlabeled facts in Yumi's dataset and are always a matched pair (both from the same origin). NEVER attribute them to a specific platform — do not say things like '카카오 평점 4.5' or '네이버 리뷰 N개', and never name or guess which map service (Naver/Kakao/Google) any value came from. Present them plainly as the venue's own rating/reviews (e.g. '평점 4.5 · 리뷰 300'). CUISINE MISMATCH (간판 ≠ 메뉴): `categoryLabel` is the venue's raw label from its origin ('한식,백반'), not our judgement. If `serviceAttributes.classification_conflict` is present (fields="edge"), the label and the real menu disagree — the menu is overwhelmingly another cuisine (`menu_suggests`, `menu_share`), so we either took the venue OUT of that cuisine's searches (`action: "demoted"`) or reclassified it (`"reclassified"`). Never describe such a venue by its raw label; say it honestly ('간판은 한식이지만 메뉴는 파스타·피자 중심이에요') and do not present it as an answer to '한식집 추천'. PRICE (do not turn a partial menu into '가성비'): `price` = {level, avg, min, max} from menu prices, with add-ons (공깃밥·사리·추가) excluded. `level`/`avg` are null when too few menu items carry a price — that means UNKNOWN, so don't call the place cheap or expensive; min/max only mean 'a menu item at that price exists', not a per-person cost. Prices are per DISH: shared dishes (족발·보쌈·전골·모둠) make the number look premium for one person, so talk about the dish price, never '1인 X원'. VEGAN / DIETARY ("비건 친구랑 같이 먹을 곳"): pass `dietary` — natural words work in Korean OR English (비건/vegan → vegan_options, 완전비건/fully-vegan → fully_vegan, mixed → mixed_group_suitable), and unknown values come back in meta.ignoredFilters instead of being silently dropped. For a MIXED group (one vegan + others not) use `dietary="mixed_group_suitable"`: those venues have a confirmed vegan MEAL alongside regular dishes. Plain `vegan_options` can be satisfied by a vegan DRINK (a cafe's 비건 오트라떼), so before calling a place suitable for eating together, check `dietary.vegan_main_count` (request fields="dietary" or edge) — 0 means drinks only. Exception: if `dietary.owner_declared` is true the OWNER confirmed vegan options in our partner app, and the menu-derived counts may be absent — treat that as the strongest evidence, not as 0. Name the actual vegan dishes from `menu` (fields="edge") so the user can verify, and always add that separation of cooking utensils/surfaces has to be confirmed with the venue — we cannot know that. WHEELCHAIR: the `wheelchair_accessible=true` filter/field means 휠체어 가능으로 확인된 곳 — say exactly that, plainly. It is ONE boolean and there is nothing behind it: we have no data on 출입구 단차, 엘리베이터, 통로 폭, 장애인 화장실 or 휠체어 좌석, so never describe the setup or imply step-free access, and never say where the value came from. Add that those exact conditions are worth confirming with the venue directly. An absent flag = UNKNOWN, not '휠체어 불가'. INFLUENCER: results may include `influencerFeatures` (present ONLY when a consented ambassador featured that venue) — a list of {platform, account, profileUrl, featuredAt, dishes, contentUrls}. When present, you MAY add that the place was introduced by them — e.g. '이 집은 인스타그래머 @newly_cafe.eat 님이 소개한 곳이기도 해요' (say 유튜버 for platform="youtube", 틱톡커 for "tiktok"), and you may name the featured `dishes`. `contentUrls` is a list of {url, postedAt} (the post/video that featured it + its upload date). If non-empty, SHARE the first `url` as a clickable markdown link so the user can watch it — e.g. '📸 소개 영상 보기: [@newly_cafe.eat](<contentUrls[0].url>)' — this video/photo is what hooks people into visiting. A ready-made `influencerContent` line (handle · link · date) is also attached whenever a link exists — post that link verbatim, do not just say '링크가 있어요'. You MAY mention `postedAt` ('2026년 6월 소개 영상'). Links older than ~1 year are already dropped server-side (their menu may have changed), so `contentUrls` only ever holds recent posts — when it is empty, still credit the introduction ('예전에 @X 님이 소개한 곳') but do NOT invent, guess, or web-search a link. You may also link `profileUrl`. Say '소개한 곳' ONLY — NEVER frame it as an endorsement/guarantee ('@X가 보증하는 맛집'/공인 ✗): it is a fun discovery signal, NOT a trust basis, and must not override cross-source verification or outweigh concerns/closure/freshness. Absent/empty = no consented feature (NOT a negative signal). YUMI PARTNER (our reservation kick — surface it from the FIRST mention): results carry `yumiReservable: true` ONLY for Yumi partner venues, which can be booked right here in THIS chat via request_reservation (and you can offer to place it for the user). It is now in list results by DEFAULT — no contact_hours needed. When a recommended venue has yumiReservable=true, PROACTIVELY say so as you introduce it — e.g. '이 집은 유미 파트너라, 원하시면 이 채팅에서 바로 예약 요청을 보내드릴 수 있어요' — because surfacing it up front raises how often people actually book. WORDING (say request, not confirmed): use '바로 예약 요청을 보낼 수 있어요' / '제가 대신 요청 넣어드릴게요', NOT '바로 예약돼요'/'예약 확정' — the booking is a REQUEST that the owner must accept (request_reservation → 'pending' → wait_for_reservation), so a table is NOT guaranteed yet. Do NOT invent it for venues WITHOUT the flag (absent = not an in-chat-bookable partner; they may still have bookingUrl/phone = external booking, or be walk-in only).HeyYumiHeyYumi
PluginrequiredTravel & Hospitality - Show place photosshow · Return the OWNER-verified photos of a place as ACTUAL images (thumbnails) plus their URLs. Use this whenever the user wants to SEE the place — '사진 보여줘', '내부/외관 어때', 'what does it look like', or is deciding based on looks. Pass the canonical place `id` (from search_places/get_place). Optionally filter the gallery by `category` (exterior/interior/seating/room/mood/restroom/parking) or cap with `limit` (default 6, max 10). The response contains real image content blocks AND a text list of each photo's category/caption + full-resolution `url`. If your client renders MCP images, they show inline. If NOT, present every photo as a CLICKABLE markdown LINK on its own line, labeled with what it shows — e.g. `- [내부 좌석](url)`, `- [외관](url)`, `- [메뉴판](url)`. Use links `[label](url)`, NOT image embeds ``. NEVER tell the user you 'can't display the images' — always post the labeled links so they can tap to view. Only ever show what THIS tool returns — the owner's verified images of this exact venue. Do not substitute images from any other source, which are frequently the WRONG place (a similarly-named chain) and misrepresent the venue. If it returns count=0, tell the user there are no owner-uploaded photos yet.HeyYumiHeyYumi
PluginrequiredTravel & Hospitality - Wait for merchant answerwait · Wait for the owner to answer a live question, then return its status. BLOCKS up to ~25s and returns the moment it settles — or still-'pending' if the owner hasn't answered yet. After request_live_status returns 'pending', call this with the queryId; if settled=false, CALL IT AGAIN (owner has ~5 minutes total). When settled=true, tell the user the answer WITH its verifiedAt time: status 'available' = 있어요/지금 가능 · 'limited' = 소량 남음/조금 기다리면/웨이팅 있음 (see note for '약 20분', '2개 남음') · 'unavailable' = 품절/지금 어려움/웨이팅 길어요 · 'soon' = 곧 돼요/오늘 판매 예정 · 'not_offered' = 취급 안 함 · 'no_response' = the owner didn't answer within 5 minutes (say so honestly and suggest calling the shop or trying another place; do NOT guess an answer). Always read the `note` for specifics and relay the verified time ('사장님이 방금/N분 전에 확인'), and add that stock/seating can still change by the time they arrive.HeyYumiHeyYumi
PluginrequiredTravel & Hospitality - Wait for reservation resultwait · Wait for the owner to respond to a pending reservation, then return its status. This BLOCKS for up to ~25 seconds and returns as soon as the reservation becomes settled (confirmed / cancelled / expired) — or returns still-'pending' if the owner hasn't responded within that window. Usage: after request_reservation returns 'pending', call this with the reservationId. If the response has settled=false (still pending), CALL IT AGAIN. Repeat until settled=true (owner has a ~5 minute window total), then tell the user the final result: confirmed → the booking is set; cancelled → the owner declined; expired → no response in time (offer to try another time or place). This is how you give the user a definitive answer instead of leaving them hanging.HeyYumiHeyYumi
PluginrequiredTravel & Hospitality - Accept Reasonable Salaryaccept · Marks the Solo S-corp owner's in-progress reasonable-salary estimate as accepted, recording the
chosen W-2 salary for IRS-defensibility purposes. Call this LAST in the Reasonable Salary Calculator
flow. Before calling, confirm the user has reviewed the calculated estimate and explicitly wants to
accept that number; do not call `accept_reasonable_salary` automatically just because a
`calculate_reasonable_salary` call succeeded. IMPORTANT - any later change to the estimate's inputs
silently clears the acceptance, so accept must be the final step.
Takes no arguments; the company and owner come from the token context, never the caller, so it
requires an existing company — if the account does not have one yet, call create_company first,
otherwise this fails. It accepts
the single most recently calculated in-progress estimate for that owner; if several
`calculate_reasonable_salary` calls were made, only the latest can be accepted (each overwrote the
previous). On success, returns the accepted estimate (id, result as an integer USD amount, range,
acceptedAt). On failure,
the response `errors` list names a structured kind - "no_in_progress_estimate" (calculate a
reasonable salary estimate first), "company_not_eligible" (company is not taxed as an S-corp), or
"no_draft_team_member" (owner profile not ready yet, usually a brief race after signup; retry shortly).
Does NOT set the owner's actual pay rate, file any tax form, or finalize the estimate to an employee job.
ONBOARDING HANDOFF — RSC is reached two ways, and acceptance means different things in each.
(1) Standalone: the owner came directly to figure out their salary; after a successful accept,
confirm the saved number and you're done. (2) As an onboarding step: an earlier
`get_company_onboarding_status` `next_step` routed you here (its `detail` was
`reasonable_salary_calculator`). In that case acceptance is NOT the end of onboarding — after a
successful accept, call `get_company_onboarding_status` again. Acceptance advances the flow, so the
refreshed `next_step` points to the real next step (typically `continue_in_gusto` with the URL to
send the owner to). Never invent or hardcode that destination URL yourself; always take it from
the refreshed onboarding status — and if it comes back as `set_password` instead, there is no URL
to relay: follow that step's own message.GustoGusto
PluginrequiredFinance - Calculate Payrollcalculate · Internal tool for payroll calculation. Use run_payroll instead.GustoGusto
PluginrequiredFinance - Calculate Reasonable Salarycalculate · Calculates an IRS-defensible reasonable salary for an S-corp owner from Bureau of Labor
Statistics (BLS) wage data, given the company's ZIP code and one or more occupations. Returns
the recommended annual salary, a defensible range, and the BLS wage area. Look up each
occupation `code` with `search_business_info` (type `occupation`) first.
GATHERING INPUTS — collect what this tool needs conversationally, one step at a time; don't ask
for everything in one message and don't assume values. Follow this order:
1. Location first. Ask for the company's 5-digit ZIP code — it sets the BLS wage area. If the
user offers only a city or state, ask them for the ZIP rather than guessing one yourself; a
guessed ZIP can land on the wrong wage area.
2. Roles, one at a time. Ask what the owner does, then call `search_business_info`
(type `occupation`) for that role, present the candidates, and let the user pick the `code`
before asking about anything else — never guess BLS codes. Most owners have a single role;
only gather more if the user says they wear more than one hat, resolving each role fully
before starting the next.
3. Per-role details. For each chosen occupation confirm `experience_level`, plus — for a
multi-role owner — the `time_percentage` split and which role is `primary`. Offer a sensible
default and let the user adjust; don't apply these silently.
4. Optional refinements. Only if relevant, ask about a part-time `work_schedule` or an
`annual_net_revenue` cap; otherwise leave them out.
Confirm every input before calling. A failure returns a `kind` and a `message`; branch on `kind`, not
on the message text.
RECOVERABLE — fix the inputs per the `message` and re-call: `no_occupations` (the `occupations` array
was empty — gather at least one role, per step 2), `time_percentages_not_100`,
`duplicate_occupation_code`, `multiple_primary_occupations`, `part_time_hours_required`,
`incomplete_occupation` (a role is missing an experience level or time percentage),
`invalid_occupation_code` (re-run `search_business_info`), `missing_area` and `zip_lookup_failed`
(re-confirm the business's 5-digit ZIP), and `salary_data_unavailable` (BLS publishes no wages for
that role, even nationally — ask for a different role).
Several of these are about one role rather than the whole request. For `duplicate_occupation_code` and
`incomplete_occupation` the `message` names the role — fix only that one, and do not re-gather the
others. For `invalid_occupation_code` and `salary_data_unavailable` the message does NOT say which role
it was, so with more than one role you cannot tell from the response alone: re-check the codes you sent
with `search_business_info` rather than guessing, and ask the user before dropping a role.
TERMINAL — do NOT re-call with the same company; say what happened and stop:
`company_not_eligible` (reasonable salary applies only to companies taxed as an S-corp, which no
input change fixes) and `no_draft_team_member` (the owner's profile is not ready yet — tell the user
to try again later rather than retrying in this conversation).
Treat an unfamiliar `kind` as recoverable by reading its `message`, rather than failing the
conversation.
Make ONE call once the inputs are confirmed. When the owner fills more than one role (e.g. a
founder who both writes software and runs the business as CEO), list every role in the
`occupations` array with `time_percentage` values summing to 1.0 in that single call — do not fire
separate `calculate_reasonable_salary` calls per role. The tool blends them into one composite
salary; separate calls would each overwrite the last.
This tool keeps ONE in-progress estimate per company/owner: every successful call overwrites
that single estimate and there is no history, so do not issue parallel or speculative calls — to
compare scenarios, run them one at a time and show each result before recalculating. The estimate
is referenced implicitly by the authenticated company/owner, so this call intentionally returns no
`id`; `accept_reasonable_salary` returns the persisted estimate's `id`.
After a successful calculation, present the recommended salary and range and ask whether the owner
wants to accept it as their W-2 salary; if they confirm, call `accept_reasonable_salary`. Do not
call `accept_reasonable_salary` without explicit user confirmation (see that tool's description).GustoGusto
PluginrequiredFinance - Check Plaid Connection Statuscheck · Reports where the company's Plaid bank connection stands. Use this to confirm the outcome of a
connect_bank_via_plaid link, since that flow finishes in an external browser window and reports
back to Gusto out of band — nothing in this conversation observes it directly.
WHEN TO USE: After the user says they have finished (or abandoned) a Plaid link, to find out what
actually landed before telling them anything. Also safe to use to check whether a company already
has a bank connection before offering the Plaid flow at all.
WHEN NOT TO USE: Do not poll this repeatedly in a loop while waiting — the connection only appears
once Plaid reports the finished session, so call it when the user says they are done. Do not use it
to ask the user for bank account or routing numbers; it only reads existing state.
RETURNS: This reports the company's most recent live bank connection, not a roll-up of every bank
account it has — a company can hold an already-verified account while a newly connected one is still
verifying, and this reports the new one. Always branch on `status`, not on `success` alone —
`success: true` only means the check ran. `connected: true` with `status: "connected"` means the
bank is verified and onboarding can move on. `status: "pending_micro_deposits"` means the bank is
connected but verifying over 1-2 business days; nothing further is needed from the user, so do not
re-offer the link. `status:
"not_connected"` means nothing landed, so the user likely did not finish. `status:
"connection_unusable"` means the latest attempt failed and needs a fresh link. When present,
`account_last_digits` is the last few digits of the connected account, safe to read back to the
user for confirmation. On error, `{ success: false, error_type, message }`.
PREREQUISITES: A valid access token whose company the acting user is a member of.
VOICE: helpful, not technical. Don't show the user this tool's internal names — question keys, field names, tool names, status values — describe what they mean instead, and don't volunteer counts unless asked. Where a value has a proper name, use it: "the Plus plan", not "plus". Codes the user picks from a list, like NAICS or workers' comp class codes, are content: show those verbatim.GustoGusto
PluginrequiredFinance - Connect Bank Via Plaidconnect · Opens a Plaid-hosted flow where the user connects their company bank account, verifying instantly
in most cases. This is the ONLY way to add a bank account during onboarding: the bank questions
cannot be answered in chat, and save_company_onboarding_answer rejects them. Whatever the user
enters in the Plaid flow goes straight to Plaid and Gusto — this tool does NOT collect bank account
numbers, routing numbers, or banking credentials through the conversation, and you never see what
was entered.
WHEN TO USE: Whenever next_step returns detail `connect_bank`, or the user asks to add or change
the company's bank account. There is no manual alternative to offer alongside it.
WHEN NOT TO USE: Never ask the user to type a bank login, routing number, or account number into
chat, and never offer to enter those on their behalf — not as an alternative to this tool, not if
the user asks to, and not if they volunteer the numbers unprompted. Those are entered only in the
Plaid flow. If the user will not use Plaid, send them to Gusto to add the account there. Do not
call this again for the same company while a link from earlier in this conversation is still
pending — wait for the user to say they've finished, then confirm with
check_plaid_connection_status before offering it again.
RETURNS: Branch on `success`. On success, `{ success: true, status: "plaid_connection_pending",
url, message }` — tell the user to open the link, connect their bank, and come back; do not ask
them to report back what they saw or any account details. On error, `{ success: false, error_type,
message }`.
PREREQUISITES: A valid access token whose company the acting user is a member of.
VOICE: helpful, not technical. Don't show the user this tool's internal names — question keys, field names, tool names, status values — describe what they mean instead, and don't volunteer counts unless asked. Where a value has a proper name, use it: "the Plus plan", not "plus". Codes the user picks from a list, like NAICS or workers' comp class codes, are content: show those verbatim.GustoGusto
PluginrequiredFinance - Create Companycreate · SIGNUP/ONBOARDING PHASE tool, and the first step — the other onboarding tools are company-scoped and fail until this has created a company. Create the user's Gusto company and payroll-admin account once the user has confirmed the details they want to sign up with. Use this tool for account creation; do not call a separate lead tool first (the lead is created server-side). The account email is already established — it is the address the user verified when they signed in. Do not ask the user for an email. Call create_company with the confirmed flag set to false first; the response returns `account_email`. Confirm that address and the company details with the user, then call again with the confirmed flag set to true. Company creation is not the final account step for chat signups. After onboarding setup is complete, Gusto sends a password setup email, and the user must open that email to finish securing the account and sign in to Gusto directly. Required fields, company_name, first_name, last_name, confirmed. Optional enrichment fields, number_employees, phone, states.GustoGusto
PluginrequiredFinance - Get Company Detailsget · Retrieves comprehensive business profile information including legal name, business entity type (LLC, Corporation, etc.), EIN, primary contact details, and configured locations. Use this to answer questions about company setup, business structure, or basic organizational info.
VOICE: helpful, not technical. Don't show the user this tool's internal names — question keys, field names, tool names, status values — describe what they mean instead, and don't volunteer counts unless asked. Where a value has a proper name, use it: "the Plus plan", not "plus". Codes the user picks from a list, like NAICS or workers' comp class codes, are content: show those verbatim.GustoGusto
PluginrequiredFinance - Get Company Onboarding Packageget · SIGNUP/ONBOARDING PHASE tool. Requires an existing company — if the account does not have one
yet, this reports company_exists false and next_step create_company; call create_company, then retry.
Returns the company's available plans, add-ons, and benefits during onboarding, plus
Gusto's recommended package and the company's current selection. Use this to present
the options and the recommendation, compare tiers, or answer pricing questions — all
from the returned payload.
ONCE THE PROFILE IS READY FOR A RECOMMENDATION: when the only required question left in
get_company_onboarding_status is the plan choice (tier_selection) — i.e. every other required
question is answered — call this tool to present Gusto's recommendation: explain what's
included and why it fits their profile, then ask whether they'd like to proceed with the
recommended plan or explore other options before you save their tier_selection (via
save_company_onboarding_answer). Do NOT wait for tier_selection itself to be answered before
presenting the recommendation — the recommendation is what informs that choice.
WHEN TO USE: When the user is choosing or asking about a Gusto plan during onboarding —
to present available plans/add-ons, show the recommendation and why, compare tiers, or
answer "how much does X cost".
WHEN NOT TO USE: To read a single onboarding question — use get_onboarding_answer.
DATA RETURNED (keys are camelCase): `plans` and `addOns`, each with `key` (the value to save as
`plan`/`add_ons`; `stableId` is also present but may be null, so use `key`), `name`,
`description`, and a `pricing` object (`baseFee`, `perEmployeeFee`, `currency`; a fee is null when
not charged); `benefits` with `key`, `name`, and `pricingNote` (quoted with partner carriers at
setup, not on the Gusto invoice); the `recommended` package (`plan`, `addOns`, `benefits`, and a
`rationale`) and the company's current `selected` package; readyForPackageRecommendation (whether every
required profile question EXCEPT the plan choice is answered — i.e. the recommendation is
ready to present); and profileComplete (whether ALL required questions, including the plan
choice, are answered). The recommended block is null until readyForPackageRecommendation is
true and a recommendation has been computed. The recommendation is computed once and reflects
the profile answers at that time; it is not recomputed here if answers change afterward.
SIDE EFFECT: not a pure read — the first call made once the profile is ready computes and stores
Gusto's recommendation (a one-time computation; later calls do not recompute it). Calling it before
the profile is ready is a safe no-op for the recommendation (the recommended block stays null).
PREREQUISITES: The recommendation populates once the company's required profile questions EXCEPT
the plan choice are answered (see get_company_onboarding_status).
VOICE: helpful, not technical. Don't show the user this tool's internal names — question keys, field names, tool names, status values — describe what they mean instead, and don't volunteer counts unless asked. Where a value has a proper name, use it: "the Plus plan", not "plus". Codes the user picks from a list, like NAICS or workers' comp class codes, are content: show those verbatim.GustoGusto
PluginrequiredFinance - Get Company Onboarding Statusget · SIGNUP/ONBOARDING PHASE tool. Requires an existing company — if the account does not have one yet, this reports company_exists false and next_step create_company; call create_company, then retry. Returns the onboarding status for a company's current experience. The current experience includes its questions — each with a key, a description, whether it has been answered, whether it is required, and a value_schema describing the fields its answer expects (field name, type, and allowed enum values). Use the value_schema to construct the value for save_company_onboarding_answer without guessing field names. Some answers are resolved with a helper tool rather than the value_schema alone: for `industry_selection` call search_business_info (type "industry"), present its candidates and let the user pick one rather than choosing for them — unless they name a code themselves, which already is their pick — and never guess NAICS/SIC codes. Separately, some large, well-known fields are free-text coded — their value_schema shows a string array with no enum list (e.g. states_employees_work_in, international_employees_countries). For these, collect the user's answer in natural language and map it to canonical codes yourself: US states as 2-letter uppercase codes including DC and PR (other US territories are not accepted), and countries as ISO 3166-1 alpha-2 (e.g. GB, IN, MX) — don't present the full list as options. A save with an invalid code returns the allowed values so you can correct it. Also returns total_questions and answered_questions counts (over every question listed here, required or not; questions withheld from this list are not counted). DRIVING ONBOARDING — work through the questions with the user and save each answer with save_company_onboarding_answer. Each question's required flag indicates whether it must be answered for onboarding to proceed. Required questions (required is true) are mandatory — collect an answer for every one, and do NOT offer the user the option to skip them. Only optional questions (required is false) may be skipped — surface them and offer to capture an answer, but make clear the user is free to skip them. Setup is complete once all required questions are answered — optional questions may stay unanswered, so do NOT treat answered_questions == total_questions as the bar. Bank details are withheld from this list entirely and are collected by connect_bank_via_plaid, so every listed question can be answered while the bank account is still outstanding — the counts cannot tell you that, and next_step is what surfaces it: detail connect_bank where the Plaid tool is available, otherwise a hand-off to Gusto to add the account there. Always follow next_step rather than inferring from this list that setup is done. When summarising what is left for the user, say the bank account still needs connecting unless next_step shows it is done — otherwise the summary omits a required step and the user has no way to know it is coming. IMPORTANT - the question list is dynamic; saved answers can re-route the flow (e.g. a solo owner gets different questions than an employer), so this list is stale after any save_company_onboarding_answer call. Re-plan from that call's returned onboarding_status, or re-call this tool. QUESTION ORDER — next_step.next_question_group is the set of question keys to ASK the user RIGHT NOW. They are all safe to ask this turn and independent of each other, so the order among them does not matter — ask them in whatever order and grouping reads most naturally. Use judgment on how to ask: rather than dumping all of them in one message — or asking strictly one at a time — ask them in a few logically-related, digestible chunks (a couple to a handful at a time, grouping related topics, e.g. the workforce questions — headcount and the states employees work in — together). Often it is just one key. This governs the ASK, not the save: save_company_onboarding_answer takes ONE question_key per call and there is no multi-answer save, so after the user replies, make a SEPARATE save_company_onboarding_answer call for each key using the answers you just collected. Each save returns refreshed status that STILL lists the keys you have not saved yet (next_question_group shrinks as you save) — do NOT ask those again, you already have their answers; just keep saving them, one call per key. Do NOT ask a key that is not in next_question_group, or pull later keys in from remaining_question_keys, because a saved answer can re-route the flow and change what comes next. Once you have saved every answer you collected, re-read the refreshed status and ask the new next_question_group; repeat until none remain. next_question_group and remaining_question_keys can be identical (when every remaining question is safe to ask together); remaining_question_keys is the full ordered outstanding list for context and counts — drive from next_question_group. What comes after the required questions depends on the company's current experience, so follow the next_step cue rather than assuming a plan step always follows: answer_questions (answer the questions in next_question_group); continue_in_mcp with detail select_plan (the profile experience — call get_company_onboarding_package to present Gusto's recommended plan, then save tier_selection); continue_in_mcp with detail ein_registration (the company needs a federal EIN before continuing — run the EIN filing tools: file_ein then pay_ein_filing then check_ein_status, then re-call this tool); continue_in_mcp with detail reasonable_salary_calculator (a Solo S-corp owner can set their reasonable W-2 salary now — run the Reasonable Salary Calculator tools: calculate_reasonable_salary then accept_reasonable_salary, then re-call this tool); continue_in_mcp with detail connect_bank (the company's bank account is not connected — call connect_bank_via_plaid and relay its url; bank account and routing numbers cannot be collected here, so never ask for them instead); continue_in_mcp with detail set_password (this account cannot sign in yet, so no url is returned — follow the step's own message and never give out or invent a gusto.com link); continue_in_gusto (nothing left to drive here — relay the returned url; if it is absent, treat the step as set_password); or complete (onboarding is fully finished). A next_step of complete is authoritative: tell the user they're all set and do NOT present any questions — the questions list is empty and the counts are zero regardless of any past unanswered questions. It covers the company's setup, not website access: if the account signed up in chat, check manage_account get_status and mention any unset password alongside the good news. If you drove the onboarding with the user during this conversation, first present a concise recap of the onboarding answers gathered during this conversation (each question covered and its answer) so the user can confirm what was submitted, then tell them they're all set; build that recap from what you gathered in this conversation, not from this payload (which carries no answers), and do not restate sensitive values in full (e.g. SSN, full bank account numbers). If you did not drive onboarding here (e.g. the user just asked whether they are onboarded), simply confirm they're all set without inventing a recap.
VOICE: helpful, not technical. Don't show the user this tool's internal names — question keys, field names, tool names, status values — describe what they mean instead, and don't volunteer counts unless asked. Where a value has a proper name, use it: "the Plus plan", not "plus". Codes the user picks from a list, like NAICS or workers' comp class codes, are content: show those verbatim.GustoGusto
PluginrequiredFinance - Get Compensation Detailsget · Retrieves full details for a single pay rate record by UUID, including rate amount, payment frequency, FLSA status, and effective date. Use list_job_compensations first to find the compensation UUID. Call this for specific details about one pay rate entry.GustoGusto
PluginrequiredFinance - Get Contractor Detailsget · Retrieves full profile for a single domestic (US-based) contractor by UUID, including name, email, business name (if applicable), payment method, and engagement dates. Use list_contractors first to find the contractor UUID. Call this for detailed info about a specific independent worker. International contractor data is not available through this endpoint.GustoGusto
PluginrequiredFinance - Get Contractor Payment Detailsget · Retrieves full details for a single contractor payment by UUID, including amount, payment method, bonus breakdown, and reimbursements. Use list_contractor_payments first to find the payment UUID. Call this for line-item details of one specific contractor payment.GustoGusto
PluginrequiredFinance - Get Contractor Payment Groupget · Retrieves all individual contractor payments within a batched payment group by UUID. Shows each contractor's payment amount and details from that batch. Use list_contractor_payment_groups first to find the group UUID. Call this to see all payments in a single batch run.GustoGusto
PluginrequiredFinance - Get Department Detailsget · Retrieves full details for a single department by UUID, including name, parent department (if nested), and list of assigned employees. Use list_departments first to find the department UUID. Call this for details about one specific department.GustoGusto
PluginrequiredFinance - Get Employee Detailsget · Retrieves full profile for a single domestic (US-based) employee by UUID, including name, email, hire date, department, manager, job title, work location, current pay rate, time-off policy assignments, and time-off balances. Use list_employees first to find the employee UUID. Call this when you need detailed info about one specific person. International employee data is not available through this endpoint.GustoGusto
PluginrequiredFinance - Get Employee Earnings Summaryget · Returns per-employee earning breakdowns (commissions, bonuses, tips, etc.) aggregated across all processed payrolls in a date range. Use this when the user asks about specific earning types attributed to individual employees, such as "How much has each employee been paid in commissions this year?" or "Who received bonuses last quarter?" Default date range is year-to-date. This tool provides per-employee attribution that list_payrolls cannot - list_payrolls only has payroll-wide totals. IMPORTANT - Never guess which employees received specific earning types from aggregate totals. Always use this tool for per-employee earning attribution. Note - only includes earnings for domestic (US) employees. International employee earnings are not included.GustoGusto
PluginrequiredFinance - Get Employee Rehireget · Retrieves information about an employee being brought back to the company after a previous departure. Includes the new start date and any updated employment terms. Use this to check if someone is a returning worker and when they rejoined.GustoGusto
PluginrequiredFinance - Get Home Address Detailsget · Retrieves full details for a single home address record by UUID, including street, city, state, ZIP code, and effective dates. Use list_employee_home_addresses first to find the address UUID. Call this for complete address details for one specific record.GustoGusto
PluginrequiredFinance - Get Job Detailsget · Retrieves full details for a single job position by UUID, including title, department, location, FLSA classification, and current pay rate. Use list_employee_jobs first to find the job UUID. Call this for detailed info about a specific role assignment.GustoGusto
PluginrequiredFinance - Get Location Detailsget · Retrieves full details for a single company location by UUID, including complete address, phone number, and filing addresses for tax purposes. Use list_locations first to find the location UUID. Call this for complete information about a specific office or work site.GustoGusto
PluginrequiredFinance - Get Onboarding Answerget · Requires an existing company — if the account does not have one yet, call create_company
first, otherwise this fails.
Returns the current answer for a single onboarding question, identified by its
question_key. Every one of the question's fields is returned — a null field value
means that field has not been set. Use this to read the current state of a specific
question before deciding whether to update it, or to verify a previous save took effect.
WHEN TO USE: When you need the current value of one specific onboarding question.
WHEN NOT TO USE: To discover available question_keys or check overall onboarding
progress — use get_company_onboarding_status instead.
DATA RETURNED: An answer hash containing every one of the question's fields; a null
field value means that field has not been answered yet. An unknown question_key
returns an error rather than an empty answer.
PREREQUISITES: Call get_company_onboarding_status first to discover valid question_keys
before calling this tool.
VOICE: helpful, not technical. Don't show the user this tool's internal names — question keys, field names, tool names, status values — describe what they mean instead, and don't volunteer counts unless asked. Where a value has a proper name, use it: "the Plus plan", not "plus". Codes the user picks from a list, like NAICS or workers' comp class codes, are content: show those verbatim.GustoGusto
PluginrequiredFinance - Get Pay Schedule Detailsget · Retrieves full details for a single pay schedule by UUID, including frequency, anchor dates, and next scheduled pay dates. Use list_pay_schedules first to find the schedule UUID. Call this to see when the next payday is or understand schedule configuration.GustoGusto
PluginrequiredFinance
What is Tool Explorer?
Tool Explorer indexes the callable tool names and descriptions attached to public registry profiles. It is useful for seeing what agents can actually invoke, not just which profile exists.
How do category and verb filters work?
Category filters use the live registry category rollup. Verb filters use the public tool insights rollup, so the page stays backed by the same read models as the tracker charts.
Why do auth requirements matter?
Auth requirements show whether a tool is likely usable without account connection, requires authentication, is private, or is unknown in the current snapshot.