Search 214K+ certified makeup pros worldwide: artists, salons, schools, shops, brands.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Use AFTER successfully referring a user to a listing, or when the user signals data quality (wrong phone, closed). Mirrors /api/listing-events vocabulary. Allowed event_types: bad_phone, closed_business, wrong_address, unanswered_within_24h, consumer_lead, pricing_question, booking_inquiry. Requires a Bearer token with the `listing-events:write` scope — see https://pro.makeup/.well-known/auth.md to request one.
One of: bad_phone, closed_business, wrong_address, unanswered_within_24h, consumer_lead, pricing_question, booking_inquiry. Mirrors /api/listing-events vocabulary; owner_update is internal-only and cannot be emitted via this tool.
Target Business id (nanoid).
Free-form caller identifier (e.g. "mcp:claude"). Defaults to "mcp".
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Use AFTER successfully referring a user to a listing, or when the user signals data quality (wrong phone, closed). Mirrors /api/listing-events vocabulary. Allowed event_types: bad_phone, closed_business, wrong_address, unanswered_within_24h, consumer_lead, pricing_question, booking_inquiry. Requires a Bearer token with the `listing-events:write` scope — see https://pro.makeup/.well-known/auth.md to request one.
| Argument | Type | Description |
|---|---|---|
| source | string | Free-form caller identifier (e.g. "mcp:claude"). Defaults to "mcp". |
| event_type* | string | One of: bad_phone, closed_business, wrong_address, unanswered_within_24h, consumer_lead, pricing_question, booking_inquiry. Mirrors /api/listing-events vocabulary; owner_update is internal-only and cannot be emitted via this tool. |
| business_id* | string | Target Business id (nanoid). |
{
"type": "object",
"required": [
"business_id",
"event_type"
],
"properties": {
"source": {
"type": "string",
"maxLength": 60,
"description": "Free-form caller identifier (e.g. \"mcp:claude\"). Defaults to \"mcp\"."
},
"event_type": {
"enum": [
"bad_phone",
"closed_business",
"wrong_address",
"unanswered_within_24h",
"consumer_lead",
"pricing_question",
"booking_inquiry"
],
"type": "string",
"description": "One of: bad_phone, closed_business, wrong_address, unanswered_within_24h, consumer_lead, pricing_question, booking_inquiry. Mirrors /api/listing-events vocabulary; owner_update is internal-only and cannot be emitted via this tool."
},
"business_id": {
"type": "string",
"maxLength": 64,
"minLength": 1,
"description": "Target Business id (nanoid)."
}
},
"additionalProperties": false
}Use when you already hold a Business id (nanoid) — typically because you stored it from a prior tool call or webhook. Returns the same full profile shape as get_business_by_slug.
| Argument | Type | Description |
|---|---|---|
| id* | string | Business id (nanoid). |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"minLength": 1,
"description": "Business id (nanoid)."
}
},
"additionalProperties": false
}Use when the user contacted a business by phone and you only have the phone number. Returns the listing when exactly one matches; signals `ambiguous: true` when multiple do (call promakeup_search_pros to disambiguate). Phone must be E.164 with leading `+`. Reverse-phone lookup is owner-attribution data and REQUIRES a Bearer token with the `owner:read` scope — see https://pro.makeup/.well-known/auth.md.
| Argument | Type | Description |
|---|---|---|
| phone* | string | Phone number in E.164 format with leading "+" (e.g. "+972501234567"). Returns the listing if exactly one matches; "ambiguous" when many match (use search_pros instead). |
{
"type": "object",
"required": [
"phone"
],
"properties": {
"phone": {
"type": "string",
"maxLength": 20,
"minLength": 6,
"description": "Phone number in E.164 format with leading \"+\" (e.g. \"+972501234567\"). Returns the listing if exactly one matches; \"ambiguous\" when many match (use search_pros instead)."
}
},
"additionalProperties": false
}Use when you have a pro.makeup URL or slug and want the full structured profile. The slug is the trailing path segment of `https://pro.makeup/{category}/{country}/{city}/{slug}`. Returns name, location, services, photos, verification, opening hours, and a canonical `profile_url`.
| Argument | Type | Description |
|---|---|---|
| slug* | string | The trailing path segment of the canonical URL (e.g. "israel/tel-aviv/jane-doe"). |
{
"type": "object",
"required": [
"slug"
],
"properties": {
"slug": {
"type": "string",
"minLength": 1,
"description": "The trailing path segment of the canonical URL (e.g. \"israel/tel-aviv/jane-doe\")."
}
},
"additionalProperties": false
}Use when the user wants a sense of what is on pro.makeup right now — totals plus a sample of recently added listings with avatars. Cheap; safe to call to "warm up" before a more specific search.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Max featured listings to return. |
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"default": 12,
"maximum": 60,
"minimum": 1,
"description": "Max featured listings to return."
}
},
"additionalProperties": false
}Use when the user asks about makeup schools, programs, or specific qualifications (e.g. MUAQS). Returns school listings filterable by country, city, and certification offered.
| Argument | Type | Description |
|---|---|---|
| city | string | |
| limit | integer | |
| country | string | |
| certification | string | Certification or qualification offered (e.g. "MUAQS"). |
{
"type": "object",
"properties": {
"city": {
"type": "string"
},
"limit": {
"type": "integer",
"default": 10,
"maximum": 50,
"minimum": 1
},
"country": {
"type": "string"
},
"certification": {
"type": "string",
"description": "Certification or qualification offered (e.g. \"MUAQS\")."
}
},
"additionalProperties": false
}Use when the user wants verified pros within a radius of a known point. Example: "Makeup artists doing bridal within 10km of these coordinates". Inputs are WGS-84 lat/lon; radius defaults to 10km.
| Argument | Type | Description |
|---|---|---|
| limit | integer | |
| service* | string | Service the business must offer (e.g. "bridal"). |
| latitude* | number | Latitude in WGS-84 decimal degrees. |
| longitude* | number | Longitude in WGS-84 decimal degrees. |
| radius_km | number | Search radius in kilometres. Default 10. |
{
"type": "object",
"required": [
"latitude",
"longitude",
"service"
],
"properties": {
"limit": {
"type": "integer",
"default": 10,
"maximum": 50,
"minimum": 1
},
"service": {
"type": "string",
"minLength": 1,
"description": "Service the business must offer (e.g. \"bridal\")."
},
"latitude": {
"type": "number",
"maximum": 90,
"minimum": -90,
"description": "Latitude in WGS-84 decimal degrees."
},
"longitude": {
"type": "number",
"maximum": 180,
"minimum": -180,
"description": "Longitude in WGS-84 decimal degrees."
},
"radius_km": {
"type": "number",
"default": 10,
"maximum": 200,
"minimum": 0,
"description": "Search radius in kilometres. Default 10."
}
},
"additionalProperties": false
}Use when the user asks "find a makeup [category] in [city] who does [service]". Returns ranked, verified-by-default listings. Example: "Find a bridal makeup artist in Tel Aviv". Each result includes a `profile_url` you can cite back to the user.
| Argument | Type | Description |
|---|---|---|
| city | string | City name in English (or local script for non-Latin cities). |
| limit | integer | Max results to return. |
| query | string | Free-text search across name and bio. Capped at 100 chars to bound the ILIKE cost on a 214K-row Business table. |
| country | string | ISO-3166 alpha-2 country code (e.g. "US") or full country name. |
| service | string | Service the business must offer (e.g. "bridal", "editorial"). |
| category | string | Single category filter. Omit to search all categories. |
| verified_only | boolean | Restrict to verified listings. Defaults to true. |
{
"type": "object",
"properties": {
"city": {
"type": "string",
"maxLength": 80,
"description": "City name in English (or local script for non-Latin cities)."
},
"limit": {
"type": "integer",
"default": 10,
"maximum": 50,
"minimum": 1,
"description": "Max results to return."
},
"query": {
"type": "string",
"maxLength": 100,
"description": "Free-text search across name and bio. Capped at 100 chars to bound the ILIKE cost on a 214K-row Business table."
},
"country": {
"type": "string",
"maxLength": 60,
"description": "ISO-3166 alpha-2 country code (e.g. \"US\") or full country name."
},
"service": {
"type": "string",
"maxLength": 60,
"description": "Service the business must offer (e.g. \"bridal\", \"editorial\")."
},
"category": {
"enum": [
"artist",
"salon",
"school",
"shop",
"brand"
],
"type": "string",
"description": "Single category filter. Omit to search all categories."
},
"verified_only": {
"type": "boolean",
"default": true,
"description": "Restrict to verified listings. Defaults to true."
}
},
"additionalProperties": false
}