{
  "name": "Sturlason agent booking",
  "version": "1.2.0",
  "deploymentStatus": "published",
  "requiresBrowser": false,
  "requiresCustomerApiKey": false,
  "contactVerification": "email_code",
  "mcp": "https://www.sturlason.no/agent-booking/public/mcp.php",
  "jsonTools": "https://www.sturlason.no/agent-booking/public/tools.php",
  "tools": {
    "list_services": {
      "description": "Les offentlige tjenester og krav før bestilling.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": [],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    "find_slots": {
      "description": "Finn ledige tider. Ingen reservasjon opprettes.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "selection": {
            "type": "object",
            "properties": {
              "service": {
                "type": "string",
                "enum": [
                  "cv_private",
                  "cv_extended",
                  "portrait",
                  "baby",
                  "children",
                  "family",
                  "wedding_standard",
                  "wedding_express",
                  "pass",
                  "student_casting_express",
                  "student_casting_standard"
                ]
              },
              "studio": {
                "type": "string",
                "enum": [
                  "oslo",
                  "asker"
                ]
              },
              "slotId": {
                "type": "string"
              },
              "passPeople": {
                "type": "array",
                "minItems": 1,
                "maxItems": 4,
                "items": {
                  "type": "object",
                  "properties": {
                    "nationality": {
                      "type": "string"
                    },
                    "documentType": {
                      "type": "string",
                      "enum": [
                        "pass",
                        "visa",
                        "other"
                      ]
                    },
                    "package": {
                      "type": "string",
                      "enum": [
                        "print",
                        "digital",
                        "print_digital"
                      ]
                    },
                    "extraSets": {
                      "type": "array",
                      "maxItems": 10,
                      "items": {
                        "type": "object",
                        "properties": {
                          "nationality": {
                            "type": "string"
                          },
                          "documentType": {
                            "type": "string",
                            "enum": [
                              "pass",
                              "visa",
                              "other"
                            ]
                          }
                        },
                        "required": [
                          "nationality",
                          "documentType"
                        ],
                        "additionalProperties": false
                      }
                    }
                  },
                  "required": [
                    "nationality",
                    "documentType",
                    "package",
                    "extraSets"
                  ],
                  "additionalProperties": false
                }
              },
              "familyAdults": {
                "type": "integer",
                "minimum": 0,
                "maximum": 8
              },
              "familyChildAges": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "maxItems": 8
              },
              "discountCode": {
                "type": "string"
              },
              "notes": {
                "type": "string",
                "maxLength": 1600
              },
              "referenceUrl": {
                "type": "string"
              }
            },
            "required": [
              "service",
              "studio"
            ],
            "additionalProperties": false
          },
          "from": {
            "type": "string"
          },
          "to": {
            "type": "string"
          }
        },
        "required": [
          "selection"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    "quote_booking": {
      "description": "Beregn bindende valg og pris for en valgt slotId. Returnerer tilbud, ikke bestilling.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "selection": {
            "type": "object",
            "properties": {
              "service": {
                "type": "string",
                "enum": [
                  "cv_private",
                  "cv_extended",
                  "portrait",
                  "baby",
                  "children",
                  "family",
                  "wedding_standard",
                  "wedding_express",
                  "pass",
                  "student_casting_express",
                  "student_casting_standard"
                ]
              },
              "studio": {
                "type": "string",
                "enum": [
                  "oslo",
                  "asker"
                ]
              },
              "slotId": {
                "type": "string"
              },
              "passPeople": {
                "type": "array",
                "minItems": 1,
                "maxItems": 4,
                "items": {
                  "type": "object",
                  "properties": {
                    "nationality": {
                      "type": "string"
                    },
                    "documentType": {
                      "type": "string",
                      "enum": [
                        "pass",
                        "visa",
                        "other"
                      ]
                    },
                    "package": {
                      "type": "string",
                      "enum": [
                        "print",
                        "digital",
                        "print_digital"
                      ]
                    },
                    "extraSets": {
                      "type": "array",
                      "maxItems": 10,
                      "items": {
                        "type": "object",
                        "properties": {
                          "nationality": {
                            "type": "string"
                          },
                          "documentType": {
                            "type": "string",
                            "enum": [
                              "pass",
                              "visa",
                              "other"
                            ]
                          }
                        },
                        "required": [
                          "nationality",
                          "documentType"
                        ],
                        "additionalProperties": false
                      }
                    }
                  },
                  "required": [
                    "nationality",
                    "documentType",
                    "package",
                    "extraSets"
                  ],
                  "additionalProperties": false
                }
              },
              "familyAdults": {
                "type": "integer",
                "minimum": 0,
                "maximum": 8
              },
              "familyChildAges": {
                "type": "array",
                "items": {
                  "type": "string"
                },
                "maxItems": 8
              },
              "discountCode": {
                "type": "string"
              },
              "notes": {
                "type": "string",
                "maxLength": 1600
              },
              "referenceUrl": {
                "type": "string"
              }
            },
            "required": [
              "service",
              "studio"
            ],
            "additionalProperties": false
          },
          "agent": {
            "type": "string",
            "enum": [
              "claude",
              "chatgpt",
              "codex",
              "other"
            ]
          }
        },
        "required": [
          "selection"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": true
      }
    },
    "hold_slot": {
      "description": "Hold av en tid midlertidig. Krever bookingToken fra tilbudet.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "bookingToken": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$",
            "description": "Privat tilgangsreferanse. Oppbevar sikkert; aldri legg i URL eller offentlige logger."
          }
        },
        "required": [
          "bookingToken"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    "request_contact_code": {
      "description": "Send engangskode til kundens e-post etter at kunden har oppgitt kontaktdata.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "bookingToken": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$",
            "description": "Privat tilgangsreferanse. Oppbevar sikkert; aldri legg i URL eller offentlige logger."
          },
          "contact": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string"
              },
              "email": {
                "type": "string"
              },
              "phone": {
                "type": "string"
              }
            },
            "required": [
              "name",
              "email",
              "phone"
            ],
            "additionalProperties": false
          }
        },
        "required": [
          "bookingToken",
          "contact"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": true
      }
    },
    "submit_booking": {
      "description": "Oppretter reell bookingforespørsel og sender meldinger. Kunden må godkjenne tid, pris og opplysninger. Gjenta med samme bookingToken ved nettverksfeil; aldri nytt tilbud.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "bookingToken": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$",
            "description": "Privat tilgangsreferanse. Oppbevar sikkert; aldri legg i URL eller offentlige logger."
          },
          "code": {
            "type": "string"
          },
          "customerApproved": {
            "type": "boolean",
            "description": "True only after the customer has authorized this specific action."
          },
          "acceptedPriceMinor": {
            "type": "integer",
            "minimum": 0,
            "description": "Exact quoted price in øre (minor NOK units), approved by customer."
          }
        },
        "required": [
          "bookingToken",
          "code",
          "customerApproved",
          "acceptedPriceMinor"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    "get_booking": {
      "description": "Hent status på egen forespørsel. requested betyr mottatt, ikke separat studiobekreftelse.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "bookingToken": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$",
            "description": "Privat tilgangsreferanse. Oppbevar sikkert; aldri legg i URL eller offentlige logger."
          }
        },
        "required": [
          "bookingToken"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    "release_hold": {
      "description": "Frigi en midlertidig reservasjon. Avbestiller ikke en sendt forespørsel.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "bookingToken": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$",
            "description": "Privat tilgangsreferanse. Oppbevar sikkert; aldri legg i URL eller offentlige logger."
          }
        },
        "required": [
          "bookingToken"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    "cancel_booking": {
      "description": "Avbestill en reell agentbooking etter kundens uttrykkelige instruks.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "bookingToken": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$",
            "description": "Privat tilgangsreferanse. Oppbevar sikkert; aldri legg i URL eller offentlige logger."
          },
          "customerApproved": {
            "type": "boolean",
            "description": "True only after the customer has authorized this specific action."
          }
        },
        "required": [
          "bookingToken",
          "customerApproved"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    "move_booking": {
      "description": "Flytt egen agentbooking til et nytt reservert tilbud med samme tjeneste, studio, valg og pris, etter kundens godkjenning.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "bookingToken": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$",
            "description": "Privat tilgangsreferanse. Oppbevar sikkert; aldri legg i URL eller offentlige logger."
          },
          "newQuoteToken": {
            "type": "string",
            "pattern": "^[a-f0-9]{64}$",
            "description": "Privat tilgangsreferanse. Oppbevar sikkert; aldri legg i URL eller offentlige logger."
          },
          "customerApproved": {
            "type": "boolean",
            "description": "True only after the customer has authorized this specific action."
          },
          "acceptedPriceMinor": {
            "type": "integer",
            "minimum": 0,
            "description": "Exact quoted price in øre (minor NOK units), approved by customer."
          }
        },
        "required": [
          "bookingToken",
          "newQuoteToken",
          "customerApproved",
          "acceptedPriceMinor"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": true,
        "idempotentHint": true,
        "openWorldHint": true
      }
    }
  },
  "verifiedOn": "2026-10-20",
  "liveVerified": [
    "service_catalog",
    "cv_and_pass_prices",
    "availability",
    "email_contact_code",
    "mcp_booking_submission",
    "calendar_agent_attribution",
    "idempotent_submission",
    "mcp_cancellation",
    "ordinary_booking_slot_restored"
  ],
  "notLiveVerified": [
    "appointment_move",
    "delivery_of_all_notification_messages"
  ],
  "httpGuide": "https://www.sturlason.no/agent-booking/public/http-guide.txt",
  "openapi": "https://www.sturlason.no/agent-booking/public/openapi.json",
  "discovery": "https://www.sturlason.no/llms.txt",
  "requiresCustomerAccount": false,
  "requiresMcpConnection": false,
  "requiresCookies": false,
  "httpGetReadTools": [
    "list_services",
    "find_slots"
  ],
  "httpPostEnvelope": {
    "tool": "list_services",
    "arguments": {}
  },
  "liveServices": "https://www.sturlason.no/agent-booking/public/tools.php?tool=list_services",
  "liveSlotsExample": "https://www.sturlason.no/agent-booking/public/tools.php?tool=find_slots&studio=oslo&service=cv_private",
  "writesRequirePost": true,
  "documentationPage": "https://www.sturlason.no/agent-booking/public/guide.html"
}
