foto foto

Turn your photos or a public iCloud Shared Album into a printed hardcover photo book.

我該用這個嗎

品質與安全性

A
說明品質
98%
結構描述完整度
77%
命名品質
95%
汙染風險
100%
權限相符程度
100%
協定合規性
100%

根據工具定義與協定合規性的自動化分析。

上下文成本

~4,695Token(工具定義)
~5.5 KB典型回應大小
顯著的注意力影響(128k 上下文的 3.67%)

這是每次將伺服器的工具載入模型上下文時所消耗的約略 token 數量。數量越高,可用於其他工作的注意力就越少。

安裝

一鍵安裝

將以下內容加入你的 `claude_desktop_config.json` 檔案:

{
  "mcpServers": {
    "photo-book": {
      "url": "https://fotofoto.app/mcp"
    }
  }
}

遠端端點

https://fotofoto.app/mcpstreamable-http

它能做什麼

工具清單

工具(8)

🟢 唯讀🟡 寫入🔴 刪除⚪ 未知
🟢get_catalog

List book types, shipping countries and photo requirements. Free.

輸入結構描述

{
  "type": "object",
  "properties": {},
  "$schema": "http://json-schema.org/draft-07/schema#"
}

輸出結構描述

{
  "type": "object",
  "properties": {
    "products": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "widthPx": {
            "type": "number"
          },
          "heightPx": {
            "type": "number"
          },
          "isDefault": {
            "type": "boolean"
          }
        },
        "required": [
          "id",
          "name",
          "widthPx",
          "heightPx",
          "isDefault"
        ],
        "additionalProperties": {}
      }
    },
    "shippingCountries": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "code": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        },
        "required": [
          "code",
          "name"
        ],
        "additionalProperties": {}
      }
    },
    "limits": {
      "type": "object",
      "properties": {
        "photosPerBook": {
          "type": "number"
        },
        "booksPerDay": {
          "type": "number"
        },
        "photoBytes": {
          "type": "number"
        }
      },
      "required": [
        "photosPerBook",
        "booksPerDay",
        "photoBytes"
      ],
      "additionalProperties": {}
    },
    "priceList": {
      "type": "object",
      "properties": {
        "currency": {
          "type": "string"
        },
        "formula": {
          "type": "string"
        },
        "includedPages": {
          "type": "number"
        },
        "pageStep": {
          "type": "number"
        },
        "startPrice": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "number"
          },
          "description": "Per binding."
        },
        "coverSurcharge": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "number"
          },
          "description": "Per cover, added once."
        },
        "pricePerExtraPage": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "object",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {
              "type": "number"
            }
          },
          "description": "Per binding, then per paper."
        },
        "maxPages": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "number"
          },
          "description": "Per binding."
        }
      },
      "required": [
        "currency",
        "formula",
        "includedPages",
        "pageStep",
        "startPrice",
        "coverSurcharge",
        "pricePerExtraPage",
        "maxPages"
      ],
      "additionalProperties": {},
      "description": "foto foto's price for every material it offers, in euros with VAT, without shipping."
    },
    "instructions": {
      "type": "string"
    }
  },
  "$schema": "http://json-schema.org/draft-07/schema#",
  "additionalProperties": {}
}
🟢compare_photo_book_prices(binding, cover, paper, pages)

Use this when someone asks what a photo book (Dutch: fotoboek) costs, how foto foto's price compares with other services, or which services sell a layflat book, a linen cover or fine-art paper. Prices one book (binding, cover, paper, pages) at foto foto and at albelli, CEWE, Fotofabriek, Pixum, smartphoto, Kruidvat, Profotonet and Saal Digital, cheapest first, with the page each price was read from. List prices in euros with VAT, without shipping or discounts. For a book that was already made, get_book gives its price with shipping. Free, changes nothing.

輸入結構描述

{
  "type": "object",
  "properties": {
    "binding": {
      "description": "perfect: the standard binding, where the pages curve towards the spine. layflat: opens completely flat, up to 120 pages.",
      "type": "string",
      "enum": [
        "perfect",
        "layflat"
      ]
    },
    "cover": {
      "description": "smooth: the standard hardcover. linen: a linen hardcover.",
      "type": "string",
      "enum": [
        "smooth",
        "linen"
      ]
    },
    "paper": {
      "description": "glossy (the standard), matte or fine-art.",
      "type": "string",
      "enum": [
        "glossy",
        "matte",
        "fine-art"
      ]
    },
    "pages": {
      "description": "Printed pages, an even number from 24 to 300, layflat up to 120. An odd count is rounded up and a count outside the range is moved inside it. Default 78.",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    }
  },
  "$schema": "http://json-schema.org/draft-07/schema#"
}

輸出結構描述

{
  "type": "object",
  "properties": {
    "currency": {
      "type": "string"
    },
    "vatIncluded": {
      "type": "boolean"
    },
    "shippingIncluded": {
      "type": "boolean"
    },
    "checked": {
      "type": "string",
      "description": "The date the prices were read, YYYY-MM-DD."
    },
    "configuration": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string"
        },
        "binding": {
          "type": "string"
        },
        "cover": {
          "type": "string"
        },
        "paper": {
          "type": "string"
        }
      },
      "required": [
        "id",
        "binding",
        "cover",
        "paper"
      ],
      "additionalProperties": {}
    },
    "pages": {
      "type": "number",
      "description": "The page count everything is priced at."
    },
    "answer": {
      "type": "string",
      "description": "Where this book is cheapest at this page count, in one or two sentences."
    },
    "ranking": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "place": {
            "type": "number"
          },
          "name": {
            "type": "string"
          },
          "book": {
            "type": "string"
          },
          "pages": {
            "type": "number"
          },
          "price": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ]
          },
          "shippingNl": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "Shipping to the Netherlands in euros."
          },
          "shippingNote": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "totalNl": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "price + shippingNl."
          },
          "source": {
            "type": "string"
          }
        },
        "required": [
          "place",
          "name",
          "book",
          "pages",
          "price",
          "shippingNl",
          "shippingNote",
          "totalNl",
          "source"
        ],
        "additionalProperties": {}
      },
      "description": "Everyone who sells this book at this length, foto foto included, cheapest first."
    },
    "ours": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string"
        },
        "price": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ]
        },
        "startPrice": {
          "type": "number"
        },
        "includedPages": {
          "type": "number"
        },
        "pricePerExtraPage": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ]
        },
        "pageStep": {
          "type": "number"
        },
        "maxPages": {
          "type": "number"
        }
      },
      "required": [
        "name",
        "price",
        "startPrice",
        "includedPages",
        "pricePerExtraPage",
        "pageStep",
        "maxPages"
      ],
      "additionalProperties": {}
    },
    "others": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "book": {
            "type": "string",
            "description": "The service's own name for the book, in English."
          },
          "pages": {
            "type": "number",
            "description": "The page count it is priced at: the first count the service sells at or above the asked count."
          },
          "price": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "List price in euros with VAT; null when the service cannot make the book this long."
          },
          "maxPages": {
            "type": "number"
          },
          "source": {
            "type": "string",
            "description": "The service's own page the price was read from."
          },
          "layflatInstead": {
            "type": "boolean",
            "description": "The service only makes layflat books, so its layflat book is priced."
          }
        },
        "required": [
          "name",
          "book",
          "pages",
          "price",
          "maxPages",
          "source",
          "layflatInstead"
        ],
        "additionalProperties": {}
      },
      "description": "Services that sell this book at this length, cheapest first."
    },
    "tooLong": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "book": {
            "type": "string",
            "description": "The service's own name for the book, in English."
          },
          "pages": {
            "type": "number",
            "description": "The page count it is priced at: the first count the service sells at or above the asked count."
          },
          "price": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ],
            "description": "List price in euros with VAT; null when the service cannot make the book this long."
          },
          "maxPages": {
            "type": "number"
          },
          "source": {
            "type": "string",
            "description": "The service's own page the price was read from."
          },
          "layflatInstead": {
            "type": "boolean",
            "description": "The service only makes layflat books, so its layflat book is priced."
          }
        },
        "required": [
          "name",
          "book",
          "pages",
          "price",
          "maxPages",
          "source",
          "layflatInstead"
        ],
        "additionalProperties": {}
      },
      "description": "Services that sell it, but not with this many pages."
    },
    "notSold": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Services that do not sell this book."
    },
    "unpublished": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Services that sell it but show the price only inside their editor."
    },
    "rank": {
      "type": "number",
      "description": "foto foto's place among all prices, 1 is cheapest."
    },
    "of": {
      "type": "number"
    },
    "calculatorUrl": {
      "type": "string"
    },
    "priceList": {
      "type": "object",
      "properties": {
        "currency": {
          "type": "string"
        },
        "formula": {
          "type": "string"
        },
        "includedPages": {
          "type": "number"
        },
        "pageStep": {
          "type": "number"
        },
        "startPrice": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "number"
          },
          "description": "Per binding."
        },
        "coverSurcharge": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "number"
          },
          "description": "Per cover, added once."
        },
        "pricePerExtraPage": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "object",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {
              "type": "number"
            }
          },
          "description": "Per binding, then per paper."
        },
        "maxPages": {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {
            "type": "number"
          },
          "description": "Per binding."
        }
      },
      "required": [
        "currency",
        "formula",
        "includedPages",
        "pageStep",
        "startPrice",
        "coverSurcharge",
        "pricePerExtraPage",
        "maxPages"
      ],
      "additionalProperties": {},
      "description": "foto foto's price for every material it offers, in euros with VAT, without shipping."
    },
    "message": {
      "type": "string"
    }
  },
  "$schema": "http://json-schema.org/draft-07/schema#",
  "additionalProperties": {}
}
🟢start_photo_book(title, language)

Use this when someone wants to make a printed photo book (Dutch: fotoboek) or photo album but has not shared any photos yet. Shows a card where they pick the photos, in order, right here. Nothing is ordered or charged.

輸入結構描述

{
  "type": "object",
  "properties": {
    "title": {
      "type": "string",
      "minLength": 1,
      "maxLength": 120
    },
    "language": {
      "description": "Two-letter code of the language the person writes in, such as nl or en.",
      "type": "string",
      "maxLength": 35
    }
  },
  "$schema": "http://json-schema.org/draft-07/schema#"
}

輸出結構描述

{
  "type": "object",
  "properties": {
    "step": {
      "type": "string",
      "const": "pick"
    },
    "title": {
      "type": "string"
    },
    "language": {
      "type": "string"
    }
  },
  "$schema": "http://json-schema.org/draft-07/schema#",
  "additionalProperties": {}
}
🟡create_book(idempotencyKey, title, productId, attachments, photos, ...)

Use this when the person wants a photo book (Dutch: fotoboek) made from photos they attached, direct image links, or a public iCloud Shared Album link. Designs a draft book from the photos in the supplied order; nothing is ordered or charged. Photos the person attached in this chat go in attachments, which ChatGPT fills in; never pass local file paths. Otherwise provide direct CDN image URLs or uploadIds from POST /api/connector/photos in photos, or a public iCloud Shared Album link as sharedAlbumUrl (https://www.icloud.com/sharedalbum/#TOKEN). A book needs at least 24 pages to be printed, so a handful of photos gives a book that can be viewed but not yet ordered. Returns a preview and a private link to save the book by email. No account setup. Allow up to 180 seconds for imports.

輸入結構描述

{
  "type": "object",
  "properties": {
    "idempotencyKey": {
      "type": "string",
      "format": "uuid",
      "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
    },
    "title": {
      "type": "string",
      "minLength": 1,
      "maxLength": 120
    },
    "productId": {
      "type": "string",
      "maxLength": 100
    },
    "attachments": {
      "description": "Photos the person attached in this chat. ChatGPT supplies the file objects; never invent them.",
      "minItems": 1,
      "maxItems": 100,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "download_url": {
            "type": "string"
          },
          "file_id": {
            "type": "string"
          },
          "mime_type": {
            "type": "string"
          },
          "file_name": {
            "type": "string"
          }
        },
        "required": [
          "download_url",
          "file_id"
        ],
        "additionalProperties": false
      }
    },
    "photos": {
      "description": "Public https image URLs on a known CDN, or uploadIds. Not for chat attachments or local paths.",
      "minItems": 1,
      "maxItems": 100,
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string",
            "maxLength": 4096,
            "format": "uri"
          },
          "uploadId": {
            "type": "string",
            "format": "uuid",
            "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
          },
          "filename": {
            "default": "photo.jpg",
            "type": "string",
            "minLength": 1,
            "maxLength": 200
          }
        }
      }
    },
    "sharedAlbumUrl": {
      "description": "Public iCloud Shared Album link, used instead of photos.",
      "type": "string",
      "maxLength": 2048,
      "format": "uri"
    },
    "language": {
      "description": "Two-letter code of the language the person writes in, such as nl or en.",
      "type": "string",
      "maxLength": 35
    }
  },
  "required": [
    "idempotencyKey",
    "title"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}

輸出結構描述

{
  "type": "object",
  "properties": {
    "status": {
      "type": "string",
      "description": "\"ready\", or \"processing_or_interrupted\" while the same request is still running."
    },
    "bookId": {
      "type": "string"
    },
    "title": {
      "type": "string"
    },
    "language": {
      "description": "The chat's language, as passed in.",
      "type": "string"
    },
    "claimUrl": {
      "type": "string",
      "description": "Private link where the person saves the book with their email, then edits and orders it."
    },
    "editUrl": {
      "type": "string"
    },
    "orderable": {
      "description": "Whether the book can be printed as it is.",
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ]
    },
    "unavailableReason": {
      "description": "Why it cannot be printed yet, such as too few pages.",
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "bookToken": {
      "type": "string",
      "description": "Private token for get_book. Keep it private."
    },
    "previewUrl": {
      "type": "string"
    },
    "photoCount": {
      "type": "number"
    },
    "album": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string"
        },
        "photos": {
          "type": "number"
        },
        "imported": {
          "type": "number"
        }
      },
      "required": [
        "name",
        "photos",
        "imported"
      ],
      "additionalProperties": {}
    },
    "operationId": {
      "type": "string"
    },
    "message": {
      "type": "string"
    }
  },
  "$schema": "http://json-schema.org/draft-07/schema#",
  "additionalProperties": {}
}
🟢get_book(bookId, bookToken, country, language)

Use this to show a book that was already made, or to get its price for one copy including shipping when country is supplied. Needs the book's private bookToken. Photos, cover, title, layout and materials are changed in the foto foto editor.

輸入結構描述

{
  "type": "object",
  "properties": {
    "bookId": {
      "type": "string",
      "minLength": 1,
      "maxLength": 100,
      "pattern": "^[a-zA-Z0-9_-]+$"
    },
    "bookToken": {
      "type": "string",
      "pattern": "^[a-f0-9]{64}$"
    },
    "country": {
      "type": "string",
      "minLength": 2,
      "maxLength": 2
    },
    "language": {
      "description": "Two-letter code of the language the person writes in, such as nl or en.",
      "type": "string",
      "maxLength": 35
    }
  },
  "required": [
    "bookId",
    "bookToken"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}

輸出結構描述

{
  "type": "object",
  "properties": {
    "materials": {
      "description": "Binding, cover and paper the book is priced with, e.g. \"Layflat binding · Linen cover · Fine art paper\"; null without a country.",
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "bookId": {
      "type": "string"
    },
    "title": {
      "type": "string"
    },
    "language": {
      "description": "The chat's language, as passed in.",
      "type": "string"
    },
    "claimUrl": {
      "type": "string",
      "description": "Private link where the person saves the book with their email, then edits and orders it."
    },
    "editUrl": {
      "type": "string"
    },
    "orderable": {
      "description": "Whether the book can be printed as it is.",
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ]
    },
    "unavailableReason": {
      "description": "Why it cannot be printed yet, such as too few pages.",
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "productId": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "photoCount": {
      "type": "number"
    },
    "claimed": {
      "type": "boolean"
    },
    "price": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "currency": {
              "type": "string"
            },
            "country": {
              "type": "string"
            },
            "bookCents": {
              "anyOf": [
                {
                  "type": "number"
                },
                {
                  "type": "null"
                }
              ]
            },
            "shippingCents": {
              "anyOf": [
                {
                  "type": "number"
                },
                {
                  "type": "null"
                }
              ]
            },
            "totalCents": {
              "anyOf": [
                {
                  "type": "number"
                },
                {
                  "type": "null"
                }
              ]
            }
          },
          "required": [
            "currency",
            "country",
            "bookCents",
            "shippingCents",
            "totalCents"
          ],
          "additionalProperties": {}
        },
        {
          "type": "null"
        }
      ],
      "description": "One copy including shipping, when country was given and the book can be ordered."
    },
    "message": {
      "type": "string"
    }
  },
  "$schema": "http://json-schema.org/draft-07/schema#",
  "additionalProperties": {}
}
🟡create_checkout(bookId, bookToken, country, quantity, idempotencyKey)

Prepare an optional Stripe checkout link after email claim, using the bookToken. No charge occurs until the user confirms payment at Stripe. Collect the destination country first. Reuse idempotencyKey on retry.

輸入結構描述

{
  "type": "object",
  "properties": {
    "bookId": {
      "type": "string",
      "minLength": 1,
      "maxLength": 100,
      "pattern": "^[a-zA-Z0-9_-]+$"
    },
    "bookToken": {
      "type": "string",
      "pattern": "^[a-f0-9]{64}$"
    },
    "country": {
      "type": "string",
      "minLength": 2,
      "maxLength": 2
    },
    "quantity": {
      "default": 1,
      "type": "integer",
      "minimum": 1,
      "maximum": 10
    },
    "idempotencyKey": {
      "type": "string",
      "minLength": 8,
      "maxLength": 100,
      "pattern": "^[a-zA-Z0-9_-]+$"
    }
  },
  "required": [
    "bookId",
    "bookToken",
    "country",
    "idempotencyKey"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🟡create_payment_quote(bookId, bookToken, country, quantity, idempotencyKey, ...)

Prepare a fixed payment quote for a printed book, including shipping, for MPP and, when listed, x402 (USDC on Base). Requires a complete delivery address. No charge yet. Ask the user to confirm before paying: pay_book for MPP, or POST paymentUrl with an x402 client for USDC. Quote expires after 15 minutes.

輸入結構描述

{
  "type": "object",
  "properties": {
    "bookId": {
      "type": "string",
      "minLength": 1,
      "maxLength": 100,
      "pattern": "^[a-zA-Z0-9_-]+$"
    },
    "bookToken": {
      "type": "string",
      "pattern": "^[a-f0-9]{64}$"
    },
    "country": {
      "type": "string",
      "minLength": 2,
      "maxLength": 2
    },
    "quantity": {
      "default": 1,
      "type": "integer",
      "minimum": 1,
      "maximum": 10
    },
    "idempotencyKey": {
      "type": "string",
      "minLength": 8,
      "maxLength": 100,
      "pattern": "^[a-zA-Z0-9_-]+$"
    },
    "shippingAddress": {
      "type": "object",
      "properties": {
        "firstName": {
          "type": "string",
          "minLength": 1,
          "maxLength": 80
        },
        "lastName": {
          "type": "string",
          "minLength": 1,
          "maxLength": 80
        },
        "addressLine1": {
          "type": "string",
          "minLength": 1,
          "maxLength": 160
        },
        "addressLine2": {
          "type": "string",
          "maxLength": 160
        },
        "city": {
          "type": "string",
          "minLength": 1,
          "maxLength": 100
        },
        "state": {
          "type": "string",
          "maxLength": 100
        },
        "postalCode": {
          "type": "string",
          "minLength": 1,
          "maxLength": 20
        },
        "phone": {
          "type": "string",
          "minLength": 5,
          "maxLength": 40
        }
      },
      "required": [
        "firstName",
        "lastName",
        "addressLine1",
        "city",
        "postalCode",
        "phone"
      ]
    }
  },
  "required": [
    "bookId",
    "bookToken",
    "country",
    "idempotencyKey",
    "shippingAddress"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}
🔴pay_book(quoteId, bookToken)

Buy the exact quoted book using native MPP. Only after the buyer approves its total and delivery address. Supply quoteId and bookToken. A payment challenge is returned through JSON-RPC; retry the same call with the authorized payment credential in _meta. This charges the buyer.

輸入結構描述

{
  "type": "object",
  "properties": {
    "quoteId": {
      "type": "string",
      "pattern": "^[a-f0-9]{64}$"
    },
    "bookToken": {
      "type": "string",
      "pattern": "^[a-f0-9]{64}$"
    }
  },
  "required": [
    "quoteId",
    "bookToken"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}

社群

為此伺服器評分

證據

近期觀測

已驗證未記錄版本8 個工具