{"apiVersion":"v1","directorySlug":"hahanet-mcp-b7946d97b0","title":"Hahanet: get AI-discoverable in minutes","description":"Hahanet gives your business a free booking page that people and AI assistants like ChatGPT and Claude can read and book. Set it up from your phone in 10 minutes.","pageUrl":"https://www.mcpbundles.com/skills/hahanet-mcp-b7946d97b0","connectPath":"importable","connectAction":"import_server","catalogListing":false,"bundleSlug":null,"listingKind":"remote_mcp","kind":"provider","transportUrl":"https://mcp.hahanet.ai/mcp","hostedMcpUrl":null,"toolCount":9,"toolInventoryStatus":"observed","refreshedAt":"2026-11-03T13:26:00.516172+00:00","registryName":"ai.hahanet/hahanet-mcp-b7946d97b0","registryVersion":"2026.11.3","registryEligible":true,"tools":[{"name":"search_businesses","description":"Find independent appointment-based businesses (barbers, hair and nail salons, brows/lashes, estheticians, massage, tattoo, pet grooming, house cleaning, handyman) in a Hahanet city, with prices and their next open times. Use this first when the user wants a service and has not named a specific business. Results include business_id and service_id for get_business, get_availability and create_booking. Times are ISO 8601 with the business's UTC offset; prices are USD. Services of type \"request\" are","inputSchema":{"type":"object","$schema":"https://json-schema.org/draft/2020-12/schema","required":["city"],"properties":{"city":{"enum":["pittsburgh"],"type":"string"},"date":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"near":{"anyOf":[{"type":"object","required":["zip"],"properties":{"zip":{"type":"string"}}},{"type":"object","required":["lat","lng"],"properties":{"lat":{"type":"number"},"lng":{"type":"number"}}}]},"limit":{"type":"integer","maximum":25,"minimum":1},"query":{"type":"string","maxLength":200},"category":{"enum":["barber","hair-salon","nails","brows-lashes","esthetician","massage","tattoo","pet-grooming","mobile-pet-grooming","house-cleaning","handyman"],"type":"string"},"max_price":{"type":"number","exclusiveMinimum":0},"time_window":{"anyOf":[{"enum":["morning","afternoon","evening"],"type":"string"},{"type":"object","required":["start","end"],"properties":{"end":{"type":"string"},"start":{"type":"string"}}}]},"radius_miles":{"type":"number","maximum":100,"exclusiveMinimum":0}}},"title":"Search businesses","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"search_businesses","displayName":"Search businesses"},{"name":"get_business","description":"Get one business's profile: services (service_id, type, duration, price, next open time), weekly hours, staff, location and policies (booking mode, cancellation policy, notice needed). Look it up by business_id, or by city and slug from a Hahanet link (hahanet.ai/{city}/{slug}). Use before booking to choose the right service and to tell the user the cancellation policy.","inputSchema":{"type":"object","$schema":"https://json-schema.org/draft/2020-12/schema","properties":{"city":{"type":"string"},"slug":{"type":"string"},"business_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"title":"Get business","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_business","displayName":"Get business"},{"name":"get_availability","description":"List open start times for one service of type \"slot\" between date_from and date_to (business-local dates, at most 31 days; defaults to the next 7 days). Pass a returned start_at unchanged to create_booking. If nothing is open in the range, next_open_slot gives the next opening. Businesses with named staff list who is free for each time; pass staff_id to see one person's times. For services of type \"request\", use request_quote instead.","inputSchema":{"type":"object","$schema":"https://json-schema.org/draft/2020-12/schema","required":["business_id","service_id"],"properties":{"date_to":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"staff_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"date_from":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"service_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"business_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"title":"Get open times","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_availability","displayName":"Get open times"},{"name":"create_booking","description":"Book a time for the user. Before calling, confirm the business, service, exact time, and the customer's name and email with the user; never make up contact details. start_at must be an open time from get_availability (ISO 8601; a time without an offset is read in the business's time zone). If you retry, reuse the same idempotency_key so it is only booked once.","inputSchema":{"type":"object","$schema":"https://json-schema.org/draft/2020-12/schema","required":["business_id","service_id","start_at","customer","idempotency_key"],"properties":{"notes":{"type":"string","maxLength":500},"customer":{"type":"object","required":["name","email"],"properties":{"name":{"type":"string","maxLength":100,"minLength":1},"email":{"type":"string","maxLength":254},"phone":{"type":"string","maxLength":30}}},"staff_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"start_at":{"type":"string"},"service_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"business_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"idempotency_key":{"type":"string","maxLength":100,"minLength":8}}},"title":"Book an appointment","logicalName":"create_booking","displayName":"Book an appointment","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"get_booking","description":"Check a booking you made with create_booking or request_quote: status (pending_customer, confirmed, pending_owner, declined, expired, cancelled, completed, no_show, requested, quoted), time and links. Use it to follow up on \"pending_customer\" and \"pending_owner\" bookings and on quote requests (\"quoted\" means the business sent a quote: request.quote has the price, start_at the proposed time, expires_at the deadline to accept). For declined or expired slot bookings it suggests nearby open times.","inputSchema":{"type":"object","$schema":"https://json-schema.org/draft/2020-12/schema","required":["booking_id"],"properties":{"booking_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"title":"Check a booking","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_booking","displayName":"Check a booking"},{"name":"cancel_booking","description":"Cancel a booking you made, when the user asks you to. The business and the customer are emailed. Appointments that have already started can't be cancelled here. Cancelling an already-cancelled booking just returns it.","inputSchema":{"type":"object","$schema":"https://json-schema.org/draft/2020-12/schema","required":["booking_id"],"properties":{"reason":{"type":"string","maxLength":500},"booking_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"title":"Cancel a booking","logicalName":"cancel_booking","displayName":"Cancel a booking","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"reschedule_booking","description":"Move a booking you made (confirmed or pending_owner) to another open time from get_availability. Confirm the new time with the user first. The business and the customer are emailed. If the time is taken, the error lists the nearest open times.","inputSchema":{"type":"object","$schema":"https://json-schema.org/draft/2020-12/schema","required":["booking_id","new_start_at"],"properties":{"booking_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"new_start_at":{"type":"string"}}},"title":"Move a booking","logicalName":"reschedule_booking","displayName":"Move a booking","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"accept_quote","description":"Accept the quote a business sent for a request you made (status \"quoted\"; see request.quote, start_at and expires_at in get_booking), which books the job at that time. Only call this after the user has explicitly agreed to the price and time. Available to partners with an API key; for everyone else the customer accepts from the email we sent them, and this returns an error saying so. Accepting an already-accepted quote just returns the booking.","inputSchema":{"type":"object","$schema":"https://json-schema.org/draft/2020-12/schema","required":["booking_id"],"properties":{"booking_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}}},"title":"Accept a quote","logicalName":"accept_quote","displayName":"Accept a quote","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"request_quote","description":"For services of type \"request\" (house cleaning, handyman jobs and other work priced per job): send the business a description of the job, the customer's ZIP code, and 1–3 preferred days with a time of day. Confirm the details and the customer's name and email with the user first. Nothing is scheduled yet: the business answers with a quote (a price and one proposed time), emailed to the customer; the status becomes \"quoted\" and get_booking shows request.quote, start_at and expires_at. The custome","inputSchema":{"type":"object","$schema":"https://json-schema.org/draft/2020-12/schema","required":["business_id","service_id","description","preferred_windows","zip","customer","idempotency_key"],"properties":{"zip":{"type":"string"},"customer":{"type":"object","required":["name","email"],"properties":{"name":{"type":"string","maxLength":100,"minLength":1},"email":{"type":"string","maxLength":254},"phone":{"type":"string","maxLength":30}}},"service_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"business_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"idempotency_key":{"type":"string","maxLength":100,"minLength":8},"preferred_windows":{"type":"array","items":{"type":"object","required":["date","period"],"properties":{"date":{"type":"string","format":"date","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))$"},"period":{"enum":["morning","afternoon","evening","any"],"type":"string"}}},"maxItems":3,"minItems":1}}},"title":"Request a quote","logicalName":"request_quote","displayName":"Request a quote","annotations":{"untrustedContentHint":true,"readOnlyHint":true}}],"toolSource":"directory_preview","agentAction":"both","installLinks":[{"id":"cursor","label":"Cursor","href":"cursor://anysphere.cursor-deeplink/mcp/install?name=Hahanet-get-AI-discoverable-in-minutes&config=eyJ1cmwiOiAiaHR0cHM6Ly9tY3AuaGFoYW5ldC5haS9tY3AifQ%3D%3D"},{"id":"vscode","label":"VS Code","href":"vscode:mcp/install?%7B%22name%22%3A%22Hahanet-get-AI-discoverable-in-minutes%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fmcp.hahanet.ai%2Fmcp%22%7D"},{"id":"vscode-insiders","label":"VS Code Insiders","href":"vscode-insiders:mcp/install?%7B%22name%22%3A%22Hahanet-get-AI-discoverable-in-minutes%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fmcp.hahanet.ai%2Fmcp%22%7D"},{"id":"claude-web","label":"Claude.ai","href":"https://claude.ai/customize/connectors?modal=add-custom-connector&connectorName=Hahanet%3A+get+AI-discoverable+in+minutes&connectorUrl=https%3A%2F%2Fmcp.hahanet.ai%2Fmcp"},{"id":"codex","label":"Codex","copyText":"codex mcp add \"Hahanet-get-AI-discoverable-in-minutes\" --url \"https://mcp.hahanet.ai/mcp\""},{"id":"chatgpt","label":"ChatGPT","href":"https://www.mcpbundles.com/docs/integrations/chatgpt"}],"catalogUrl":"https://www.mcpbundles.com/api/directory/v1/servers/hahanet-mcp-b7946d97b0","callUrl":"https://www.mcpbundles.com/api/directory/v1/servers/hahanet-mcp-b7946d97b0/tools/{tool}","mcpServerUrl":"https://mcp.hahanet.ai/mcp","liveCatalogUrl":"https://www.mcpbundles.com/api/directory/v1/servers/hahanet-mcp-b7946d97b0?live=1"}