# FotoRent: agent guide

Camera, lens and DJI equipment rental in Diemen, near Amsterdam. Pickup is in Diemen; final availability, fees and booking are on Gearbooker.

- Catalog: https://fotorent.nl/catalog.json
- Tool definitions: https://fotorent.nl/agents/capabilities.json
- Rental planner: https://fotorent.nl/rental-planner/ (Dutch: /nl/rental-planner/)
- Browser tools: document.modelContext on https://fotorent.nl/ when the browser supports WebMCP.
- Remote MCP: https://api.fotorent.nl/mcp (Streamable HTTP; read-only; no API key).
- HTTP JSON API: POST https://api.fotorent.nl/api/v1/{tool_name} with the same documented arguments; GET https://api.fotorent.nl/api/v1/tools for schemas.
- MCP Apps: quote_kit includes an optional estimate card in supporting hosts. Text and structured results remain available to other clients.

## Remote example

POST https://api.fotorent.nl/api/v1/recommend_kit
Content-Type: application/json

{"use_case":"portrait","from_date":"YYYY-MM-DD","to_date":"YYYY-MM-DD","budget_total":60,"locale":"nl"}

Use actual future dates. A successful result includes quoteUrl and availability evidence. HTTP400 means invalid tool input; HTTP503 is a temporary catalog failure. Edge403 can indicate client policy; do not impersonate another User-Agent or treat it as inventory data.

## Workflow

Use recommend_kit for a use case, pickup and return dates, and a total EUR budget. Use check_compatibility for an owned camera's lens mount. Use quote_kit for a selection. Follow quoteUrl to a shareable estimate, then the Gearbooker listing to confirm and book. A returned URL never creates a booking.

## Dates and evidence

Dates are YYYY-MM-DD. Pickup is inclusive and return is exclusive. Same-day rental is invalid. Availability is available_in_snapshot, blocked or unknown. Old snapshots, past dates, missing dates and dates outside coverage never mean available. Even a fresh snapshot does not reserve equipment. Read checkedAt, coverageStart, coverageEnd, validUntil and sourceUrl.

## Estimates and compatibility

Rates and minimum rental periods are per listing. A multi-item estimate sums separate listing charges; Gearbooker may charge a combined order differently. Joint availability and shared physical inventory require confirmation. Included equipment must not be charged twice. Unknown lens mounts stay unknown. The Viltrox 85mm lens has no verified mount in this catalog.

## Privacy

Tools are read-only. Do not send personal details. Analytics requires cookie consent. Shared links contain equipment slugs and dates, not customer details. EN and NL are supported.

## Tools

### list_equipment

List FotoRent camera gear for pickup in Diemen, Amsterdam area. Optional category filter.

```json
{
  "type": "object",
  "properties": {
    "category": {
      "type": "string",
      "enum": [
        "cameras",
        "lenses",
        "drones"
      ]
    }
  },
  "required": [],
  "additionalProperties": false
}
```

### get_equipment_details

Get prices, verified mount and kit contents, specs, availability snapshot and booking links.

```json
{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string",
      "description": "Exact slug from list_equipment"
    }
  },
  "required": [
    "slug"
  ],
  "additionalProperties": false
}
```

### get_rental_quote

Estimate a listing's rental, Gearbooker fee and total. Return day is free; applies minimum, Friday-to-Monday and weekly pricing. Returns a shareable quote URL; final checkout is on Gearbooker.

```json
{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string",
      "description": "Exact slug from list_equipment"
    },
    "from_date": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "description": "YYYY-MM-DD"
    },
    "to_date": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "description": "YYYY-MM-DD"
    },
    "locale": {
      "type": "string",
      "enum": [
        "en",
        "nl"
      ],
      "description": "Language for customer-facing planner links and estimate cards; agent text remains English"
    }
  },
  "required": [
    "slug",
    "from_date",
    "to_date"
  ],
  "additionalProperties": false
}
```

### check_availability

Check both pickup and return dates against a fresh calendar snapshot. Returns available_in_snapshot, blocked or unknown. Without dates, lists known blocked dates; never reserves gear.

```json
{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string",
      "description": "Exact slug from list_equipment"
    },
    "from_date": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "description": "YYYY-MM-DD"
    },
    "to_date": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "description": "YYYY-MM-DD"
    }
  },
  "required": [
    "slug"
  ],
  "additionalProperties": false
}
```

### how_to_rent

Pickup address, hours, booking process, insurance, rental limits and contact for questions.

```json
{
  "type": "object",
  "properties": {},
  "required": [],
  "additionalProperties": false
}
```

### start_booking

Get the Gearbooker booking link and a FotoRent quote page. This only returns links: no booking, account or payment is created. Optional paired dates preserve the estimate on FotoRent.

```json
{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string",
      "description": "Exact slug from list_equipment"
    },
    "from_date": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "description": "YYYY-MM-DD"
    },
    "to_date": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "description": "YYYY-MM-DD"
    },
    "locale": {
      "type": "string",
      "enum": [
        "en",
        "nl"
      ],
      "description": "Language for customer-facing planner links and estimate cards; agent text remains English"
    }
  },
  "required": [
    "slug"
  ],
  "additionalProperties": false
}
```

### check_compatibility

Check a rental lens against the client's camera mount. Unknown or unverified mounts require confirmation; fixed-lens cameras cannot take interchangeable lenses.

```json
{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string",
      "description": "Exact slug from list_equipment"
    },
    "camera_mount": {
      "type": "string",
      "enum": [
        "canon_rf",
        "canon_ef",
        "sony_e",
        "nikon_z",
        "fujifilm_x",
        "micro_four_thirds",
        "unknown"
      ],
      "description": "Your camera's lens mount, e.g. canon_rf for Canon R8/R6; model names are not mount identifiers"
    }
  },
  "required": [
    "slug",
    "camera_mount"
  ],
  "additionalProperties": false
}
```

### quote_kit

Estimate selected listings together. Rejects duplicate or already-included gear. Multi-listing fees are the sum of separate estimates; shared inventory and combined checkout require confirmation.

```json
{
  "type": "object",
  "properties": {
    "slugs": {
      "type": "array",
      "items": {
        "type": "string",
        "description": "Exact slug from list_equipment"
      },
      "minItems": 1,
      "maxItems": 10,
      "uniqueItems": true
    },
    "from_date": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "description": "YYYY-MM-DD"
    },
    "to_date": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "description": "YYYY-MM-DD"
    },
    "locale": {
      "type": "string",
      "enum": [
        "en",
        "nl"
      ],
      "description": "Language for customer-facing planner links and estimate cards; agent text remains English"
    }
  },
  "required": [
    "slugs",
    "from_date",
    "to_date"
  ],
  "additionalProperties": false
}
```

### recommend_kit

Suggest up to three real kits for portrait, events, interview, travel, instant or FPV, respecting dates, minimum rental and total budget. Optional owned_camera_mount returns compatible lenses for a client's own camera. Over-budget alternatives are labelled explicitly; availability is a snapshot, not a reservation.

```json
{
  "type": "object",
  "properties": {
    "use_case": {
      "type": "string",
      "enum": [
        "portrait",
        "events",
        "interview",
        "travel",
        "instant",
        "fpv"
      ]
    },
    "from_date": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "description": "YYYY-MM-DD"
    },
    "to_date": {
      "type": "string",
      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      "description": "YYYY-MM-DD"
    },
    "budget_total": {
      "type": "number",
      "exclusiveMinimum": 0,
      "maximum": 100000
    },
    "owned_camera_mount": {
      "type": "string",
      "enum": [
        "canon_rf",
        "canon_ef",
        "sony_e",
        "nikon_z",
        "fujifilm_x",
        "micro_four_thirds",
        "unknown"
      ],
      "description": "Your camera's lens mount, e.g. canon_rf for Canon R8/R6; model names are not mount identifiers"
    },
    "locale": {
      "type": "string",
      "enum": [
        "en",
        "nl"
      ],
      "description": "Language for customer-facing planner links and estimate cards; agent text remains English"
    }
  },
  "required": [
    "use_case",
    "from_date",
    "to_date",
    "budget_total"
  ],
  "additionalProperties": false
}
```

