Skip to content

Agent Salon SF

com.agentsalonsf/salon-decisionsagentsalonsf.comstreamable-httpv1.0.0Scanned

SF salon prices, add-ons and source-backed comparisons. No live slots or in-tool booking.

10 tools: 2 change things and 8 only read.

Tools: 0 delete, 0 irreversible, 2 write, 8 read.
  • Reads private data · 0
  • Reads text others write · 2
  • Can send data out · 0
  • 1 finding

Anlyon alternative

2 of these tools change something. Run those as governed actions.

Declare what an action changes, and Anlyon puts it under a shared limit, binds every approval to the exact request, and grades the outcome. It works on any HTTPS API you can describe as an action.

Anlyon does not run, proxy or govern this MCP server. A tool your own code calls directly is not routed through Anlyon and is not governed by it.

Import an OpenAPI spec →

Tools

Grouped by what each tool does, most consequential first. Open one for its reasons and full description; descriptions are the publisher's own words.

10 tools

Changes things 2Claude Code: ask
  • check_availabilityPublished facts for one salon, NOT live availability and NOT an extras-inclusive quote.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
    Published facts for one salon, NOT live availability and NOT an extras-inclusive quote. For a service/budget/extras/date decision use compare_options with salon=ref. For one salon (ref from search_merchants) and a date: published opening hours on that date (open/closed — NOT live appointment slots), offerings matching the service with published prices and durations, the booking link and step-by-step booking instructions. Profiled salons add candidate start times (candidate start times from the salon's published staff schedule; existing bookings are not subtracted, so some may already be taken — confirm on the booking page). Same contract as GET /api/v1/availability?ref=.

    Annotations the server declares

    • readOnlyHint: true
    • openWorldHint: false
    • idempotentHint: true
  • compare_optionsSTART HERE for choosing a service under a budget, with extras, or on a date.1 finding

    Why it is in this group

    • The name "compare_options" says "compare": a word for reading.
    • The description's first verb is "start": 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 "compare_options" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true,"idempotentHint":true,"openWorldHint":false}; The name "compare_options" says "compare": a word for reading.

      What this check looks for
    Description, as the server wrote it
    START HERE for choosing a service under a budget, with extras, or on a date. Use search_merchants for name/address lookup; use this tool for the service decision. Compare a supported service intent, optional budget/date/neighborhood, strict or nearby geography, and selected add-ons (blow_dry, haircut, toner, shampoo, deep_conditioning, iron_finish, extensions). Returns options, uncertain and excluded service decisions with per-fact sources/dates, known subtotal including requested/mandatory extras, unresolved charges, explicit conditions, hours conflicts and exact next actions. Starting prices and required consultations never become guaranteed final quotes. Deposit is advance payment, not an added charge. There is no provider-confirmed availability; date-specific results are conditional. Time-of-day, stylist and hair-length requirements are unsupported filters here; retain them for merchant confirmation. Ordering is geographic/alphabetic, not a quality rating. No booking or hold is created. Paginated: limit <= 50, offset; use next_offset across all three result groups.

    Annotations the server declares

    • readOnlyHint: true
    • openWorldHint: false
    • idempotentHint: true
Only reads 8Show 8 read-only tools
  • get_availabilityNOT live availability.No findings

    Why it is in this group

    • The name "get_availability" says "get": a word for reading.
    Description, as the server wrote it
    NOT live availability. Use compare_options for budget/extras/date decisions. Candidate start times for one offering at one salon, optionally one stylist and a date/time window: candidate start times from the salon's published staff schedule; existing bookings are not subtracted, so some may already be taken — confirm on the booking page. Results carry slotBasis "schedule_candidates" and bookingsSubtracted false; freshness tells you how old the capture is.
  • get_merchantAll published facts for one salon by ref "<city>/<vertical>/<slug>" (from search results), with crawl_log (every source fetched or checked, with time, result and the facts it gave)…Reads text others writeNo findings

    Why it is in this group

    • The name "get_merchant" says "get": a word for reading.

    What it can reach

    • untrusted-inputThe description's first sentence says "crawl": it reads web pages, which anyone can write.
    Description, as the server wrote it
    All published facts for one salon by ref "<city>/<vertical>/<slug>" (from search results), with crawl_log (every source fetched or checked, with time, result and the facts it gave) and last_verified_at: address, phone, hours, licence, registry, services with published prices, booking link, per-field sources (verification), what we verified and what we did not.

    Annotations the server declares

    • readOnlyHint: true
    • openWorldHint: false
    • idempotentHint: true
  • get_salonFull record for one salon as markdown: facts, hours, every haircut service with price/duration/inclusions, stylists, policies, attributes, evidence, booking rules, candidate start …No findings

    Why it is in this group

    • The name "get_salon" says "get": a word for reading.
    Description, as the server wrote it
    Full record for one salon as markdown: facts, hours, every haircut service with price/duration/inclusions, stylists, policies, attributes, evidence, booking rules, candidate start times from the published schedule. Every fact carries a status tag and date.
  • get_stylistOne stylist, under the name the salon's booking system shows: salon, bookable status, specialty evidence with sources, services and prices, candidate start times from the published…No findings

    Why it is in this group

    • The name "get_stylist" says "get": a word for reading.
    Description, as the server wrote it
    One stylist, under the name the salon's booking system shows: salon, bookable status, specialty evidence with sources, services and prices, candidate start times from the published schedule, and booking link.
  • list_salonsSalons covered (San Francisco), ordered profiled, detailed, then listed, with depth, neighborhood, price floor and range, stylist count, availability basis and freshness, last_veri…No findings

    Why it is in this group

    • The name "list_salons" says "list": a word for reading.
    Description, as the server wrote it
    Salons covered (San Francisco), ordered profiled, detailed, then listed, with depth, neighborhood, price floor and range, stylist count, availability basis and freshness, last_verified_at and verification date. Paginated: limit (default 50, max 200), offset, depth=profiled|detailed|listed.
  • search_haircutsBase offering lookup by haircut type, length or stylist.No findings

    Why it is in this group

    • The name "search_haircuts" says "search": a word for reading.
    Description, as the server wrote it
    Base offering lookup by haircut type, length or stylist. Use compare_options for a supported service with budget, extras or date; preserve any unsupported stylist/length/time requirements for merchant confirmation. Find haircut offerings (and optionally stylists and candidate start times) that satisfy ALL given constraints, across profiled salons (hand-normalized menus) and listed salons (type and inclusions inferred from the service name; offering.comparable says whether it can be compared apples-to-apples). Start times are candidate start times from the salon's published staff schedule; existing bookings are not subtracted, so some may already be taken — confirm on the booking page (slotBasis "schedule_candidates", bookingsSubtracted false, availability_basis "schedule_candidates" = UNCONFIRMED). require_availability=true is satisfied only by provider-confirmed availability (the booking provider’s own open times, existing bookings subtracted). No salon on this site has provider-confirmed availability today: profiled salons have candidate start times from the published staff schedule (existing bookings not subtracted, so they may already be taken) and listed salons have published opening hours only. Offerings with matching candidate start times are listed under `unconfirmed`; confirm on the booking page. Hard constraints are never relaxed silently; when nothing matches, noMatch.reason explains which constraint blocked and nearest suggests the smallest change. Prices are published menu or online-booking prices in USD; this search does not add requested or mandatory extras. Times are salon-local (America/Los_Angeles).
  • search_merchantsDiscovery and name/address lookup, not an extras-inclusive price decision.No findings

    Why it is in this group

    • The name "search_merchants" says "search": a word for reading.
    Description, as the server wrote it
    Discovery and name/address lookup, not an extras-inclusive price decision. For a supported service with budget, extras or date, start with compare_options. Find San Francisco hair salons and barbers by name/street (q), neighborhood (with nearby), service, date/time and online booking. Returns compact task summaries by default: depth (profiled = researched in depth; listed = public records + the business’s own site, see depth_note), booking_cta, hours_for_day (published hours for `date`, not live slots), up to 3 matched_offerings with prices, license_status, freshness, availability_basis (published_hours / schedule_candidates = unconfirmed / none); profiled salons add candidate_start_times. Unknown values are null. For published hours/detail only, call check_availability. Before selecting a budget option, call compare_options; follow next_action to confirm unresolved charges and actual appointment availability with the merchant.

    Annotations the server declares

    • readOnlyHint: true
    • openWorldHint: false
    • idempotentHint: 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.

Exfil surface

Which tools read private data, which read text someone else can write, and which can send data out. One of each is a path a prompt injection can use.

No private-data, untrusted-input, outbound path in this server alone: no tool is tagged private-data or outbound.

Reads private data0
Reads files, mail, messages, databases, secrets, calendars or repositories.
Reads text others write2
Brings in text someone else can write: web pages, inbound email, messages, issues and comments.
Can send data out0
Can carry data to people or systems: it sends, posts or publishes, or takes a recipient, channel or URL.

Other servers in the same agent add their own tools to these paths. Audit your whole setup to see them together.

Findings

Matches of fixed checks, with the text they matched.

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

    Matched text

    annotations: {"readOnlyHint":true,"idempotentHint":true,"openWorldHint":false}; The name "compare_options" says "compare": a word for reading.

    What this check looks for

History

Changes to its tool definitions and to its remote endpoint, newest first.

No change seen yet. Its tools are rescanned every day, and a remote endpoint is looked at once a week.

Install

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

claude mcp add --transport http salon-decisions https://agentsalonsf.com/mcp
claude mcp add --transport http salon-decisions https://agentsalonsf.com/mcp

Run in a terminal.

Claude Code permissions

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

.claude/settings.json
{
  "permissions": {
    "allow": [
      "mcp__salon-decisions__search_merchants",
      "mcp__salon-decisions__get_merchant",
      "mcp__salon-decisions__list_salons",
      "mcp__salon-decisions__search_haircuts",
      "mcp__salon-decisions__get_salon",
      "mcp__salon-decisions__get_stylist",
      "mcp__salon-decisions__get_availability",
      "mcp__salon-decisions__get_booking_link"
    ],
    "ask": [
      "mcp__salon-decisions__compare_options",
      "mcp__salon-decisions__check_availability"
    ],
    "deny": []
  }
}

Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. A read that can send data out (it takes a URL, say) asks first too. It assumes the server is installed as salon-decisions. Review it before you use it.

Capability tags behind 2 rules
  • mcp__salon-decisions__get_merchant untrusted-input
  • mcp__salon-decisions__get_booking_link untrusted-input

Pin

Keep the decision: fail CI when the tools change, follow every change, or show a badge.

Pin in CI

Fail a build when the tools you reviewed are not the tools the server serves today.

curl -s "https://anlyon.dev/api/v1/servers/com.agentsalonsf/salon-decisions/verify?hash=6e8f660d67fe04d9c3f8b4b55180d4d4b9c8db4a62b0fb6e9365d815f906582a" | jq -e '.changed == false'

Pinned hash 6e8f660d67fe, from Oct 23, 2026, 18:18 UTC.

Watch

Get told when its tools change: a new tool, a new description, a new class.

https://anlyon.dev/servers/com.agentsalonsf/salon-decisions/changes.xml

An Atom feed. Works in any feed reader or Slack's RSS app.

Badge

anlyon.dev badge for com.agentsalonsf/salon-decisions
[![anlyon.dev](https://anlyon.dev/badge/com.agentsalonsf/salon-decisions.svg)](https://anlyon.dev/servers/com.agentsalonsf/salon-decisions)

Source: MCP Registry. Synced Oct 23, 2026, 18:18 UTC.