kadro-mcp-server
Search and book real photographers on Kadro (Iran) on a user's behalf, ending with a payment link.
Should I use this
Quality & Safety
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"kadro-mcp-server": {
"url": "https://www.kadro.co/mcp"
}
}
}Remote endpoints
https://www.kadro.co/mcpstreamable-httphttps://www.shootempire.com/kadro-mcp-relay/mcpstreamable-httpWhat it can do
Tool inventory
Tools (6)
🟢search_shoot_types
List 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.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢search_photographers(shoot_type_id, city_id)
Find 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.
Input Schema
{
"type": "object",
"properties": {
"shoot_type_id": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991,
"description": "A shoot_type_id from search_shoot_types."
},
"city_id": {
"description": "Optional Kadro city id to narrow the search.",
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
}
},
"required": [
"shoot_type_id"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢get_photographer_packages(photographer_uid, shoot_type_id)
List 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.
Input Schema
{
"type": "object",
"properties": {
"photographer_uid": {
"type": "string",
"description": "A photographer uid from search_photographers."
},
"shoot_type_id": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
}
},
"required": [
"photographer_uid",
"shoot_type_id"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}🟡create_reservation(shoot_type_id, package_id, city_id, photographer_uid, start_time, ...)
Book 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.
Input Schema
{
"type": "object",
"properties": {
"shoot_type_id": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"package_id": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"city_id": {
"type": "integer",
"minimum": -9007199254740991,
"maximum": 9007199254740991
},
"photographer_uid": {
"type": "string"
},
"start_time": {
"type": "string",
"description": "ISO 8601 timestamp, at least 6 hours from now."
},
"address_latitude": {
"type": "number"
},
"address_longitude": {
"type": "number"
},
"address_detail": {
"type": "string",
"description": "Human-readable address text for the shoot location."
},
"shoot_detail": {
"description": "Free-text notes about the shoot for the photographer.",
"type": "string"
},
"guest_display_name": {
"description": "The customer's name, if known.",
"type": "string"
},
"idempotency_key": {
"description": "A key you generate to make retries safe. Reuse it only when retrying the exact same request.",
"type": "string"
}
},
"required": [
"shoot_type_id",
"package_id",
"city_id",
"photographer_uid",
"start_time",
"address_latitude",
"address_longitude",
"address_detail"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢get_payment_link(slug)
Get 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.
Input Schema
{
"type": "object",
"properties": {
"slug": {
"type": "string",
"description": "The slug returned by create_reservation."
}
},
"required": [
"slug"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}🟢get_reservation_status(slug)
Check 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'.
Input Schema
{
"type": "object",
"properties": {
"slug": {
"type": "string",
"description": "The slug returned by create_reservation."
}
},
"required": [
"slug"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}Community
Evidence