io.github.amvaleh/kadro-mcp-server
Measured conclusion: Deep-tested. L2 outcome: tools_ok.
Search and book real photographers on Kadro (Iran) on a user's behalf, ending with a payment link.
| Author | io.github.amvaleh |
|---|---|
| Access | remote |
| Publisher key required | No |
| Measured state | Deep-tested |
| L1 liveness | alive |
| L1 latency | 633 ms |
| Last measured | 2026-10-26 |
Add to your agent
Copy this into your MCP client config:
{
"mcpServers": {
"kadro-mcp-server": {
"url": "https://www.shootempire.com/kadro-mcp-relay/mcp",
"transport": "streamable-http"
}
}
}
Measured tools (6)
search_shoot_typesread-onlyList the photography/videography service types Kadro offers (e.g. wedding, industrial, portrait), each with a numeric shoot_type_id. Call this first if you don't already know the id for the kind of shoot the user wants.
Hints: read-only yes · destructive no · idempotent yes · open-world yes
search_photographersread-onlyFind real, bookable photographers for a given shoot_type_id (from search_shoot_types), optionally narrowed to a city_id. Returns each photographer's uid (needed for every later call), display name, rating, review count, and city.
Parameters:
shoot_type_id(required) — integer — A shoot_type_id from search_shoot_types.city_id— integer — Optional Kadro city id to narrow the search.
Hints: read-only yes · destructive no · idempotent yes · open-world yes
get_photographer_packagesread-onlyList the real, currently bookable packages (with prices, in Toman) a specific photographer offers for a given shoot_type_id. Rejects the shoot_type_id if that photographer doesn't actually offer it. Use the returned package id with create_reservation.
Parameters:
photographer_uid(required) — string — A photographer uid from search_photographers.shoot_type_id(required) — integer
Hints: read-only yes · destructive no · idempotent yes · open-world yes
create_reservationBook a specific photographer for a specific package, date/time, and address on the user's behalf — no login required. This only places a 15-minute hold; it does NOT charge any money and does NOT require or accept any payment information. Immediately follow this with get_payment_link and give that URL to the human — they open it themselves to verify their phone number and pay. start_time must be an ISO 8601 timestamp at least 6 hours in the future. Pass a stable idempotency_key if you might retry this call, so a retry can't create a second reservation.
Parameters:
shoot_type_id(required) — integerpackage_id(required) — integercity_id(required) — integerphotographer_uid(required) — stringstart_time(required) — string — ISO 8601 timestamp, at least 6 hours from now.address_latitude(required) — numberaddress_longitude(required) — numberaddress_detail(required) — string — Human-readable address text for the shoot location.shoot_detail— string — Free-text notes about the shoot for the photographer.idempotency_key— string — A key you generate to make retries safe. Reuse it only when retrying the exact same request.guest_display_name— string — The customer's name, if known.
Hints: read-only no · destructive no · idempotent no · open-world yes
get_payment_linkread-onlyGet a URL for the human to open in their own browser to finish this reservation: verify their phone number by SMS code and pay. This is the last step this server ever takes — never ask the user for a card number, OTP code, or password, and never try to open, submit, or complete this URL yourself. Just hand the URL to the user.
Parameters:
slug(required) — string — The slug returned by create_reservation.
Hints: read-only yes · destructive no · idempotent no · open-world yes
get_reservation_statusread-onlyCheck whether a reservation has been paid and confirmed. IMPORTANT: status values are 'awaiting_payment', 'expired', 'paid_awaiting_photographer_confirmation', 'confirmed', and 'rejected'. 'paid_awaiting_photographer_confirmation' means the customer paid but the photographer has not yet accepted the booking and could still decline or ask to reschedule — do not tell the user their booking is final until status is exactly 'confirmed'.
Parameters:
slug(required) — string — The slug returned by create_reservation.
Hints: read-only yes · destructive no · idempotent yes · open-world yes
Measured by MCPYP probing. Untested fields are omitted, never estimated. Listing is always free; MCPYP never proxies calls or stores user tokens.