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

A
Description quality
100%
Schema completeness
85%
Naming quality
100%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~1,246Tokens (tool definitions)
~1.1 KBTypical response size
Moderate attention impact (0.97% of 128k context)

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-http
https://www.shootempire.com/kadro-mcp-relay/mcpstreamable-http

What it can do

Tool inventory

Tools (6)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢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

Rate this Server

Evidence

Recent observations

verifiedversion not recorded6 tools
verifiedversion not recorded6 tools