foto foto MCP
An official MCP server provided by foto foto that allows AI agents to create printed hardcover photo books from user photos or iCloud Shared Albums. It supports catalog retrieval, book creation, price comparison, and checkout integration without requiring API keys or authentication for basic usage.
Endpoint and access
No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.
https://fotofoto.app/mcpWhat you can do with it
- Create a printed hardcover photo book from user photos
- Compare photo book prices across different services
- Retrieve the product catalog and pricing details
- Initiate checkout for a saved photo book
Source and maintenance
Protocol and capabilities
- Server
- foto-foto 2.0.0
- MCP protocol
- 2025-06-18
- Tools
- 8 advertised
- Resources
- 3 advertised
- Resource templates
- 0 advertised
- Prompts
- Not advertised
{
"tools": {
"listChanged": true
},
"resources": {
"listChanged": true
}
}Server-provided instructions
Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.
Tools
8 advertised
get_catalog — Get book types and shipping countries
List book types, shipping countries and photo requirements. Free.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"limits": {
"type": "object",
"required": [
"photosPerBook",
"booksPerDay",
"photoBytes"
],
"properties": {
"photoBytes": {
"type": "number"
},
"booksPerDay": {
"type": "number"
},
"photosPerBook": {
"type": "number"
}
},
"additionalProperties": {}
},
"products": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"name",
"widthPx",
"heightPx",
"isDefault"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string"
},
"widthPx": {
"type": "number"
},
"heightPx": {
"type": "number"
},
"isDefault": {
"type": "boolean"
}
},
"additionalProperties": {}
}
},
"priceList": {
"type": "object",
"required": [
"currency",
"formula",
"includedPages",
"pageStep",
"startPrice",
"coverSurcharge",
"pricePerExtraPage",
"maxPages"
],
"properties": {
"formula": {
"type": "string"
},
"currency": {
"type": "string"
},
"maxPages": {
"type": "object",
"description": "Per binding.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "number"
}
},
"pageStep": {
"type": "number"
},
"startPrice": {
"type": "object",
"description": "Per binding.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "number"
}
},
"includedPages": {
"type": "number"
},
"coverSurcharge": {
"type": "object",
"description": "Per cover, added once.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "number"
}
},
"pricePerExtraPage": {
"type": "object",
"description": "Per binding, then per paper.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "number"
}
}
}
},
"description": "foto foto's price for every material it offers, in euros with VAT, without shipping.",
"additionalProperties": {}
},
"instructions": {
"type": "string"
},
"shippingCountries": {
"type": "array",
"items": {
"type": "object",
"required": [
"code",
"name"
],
"properties": {
"code": {
"type": "string"
},
"name": {
"type": "string"
}
},
"additionalProperties": {}
}
}
},
"additionalProperties": {}
}{
"title": "Get book types and shipping countries",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}compare_photo_book_prices — Compare photo book prices
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",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"cover": {
"enum": [
"smooth",
"linen"
],
"type": "string",
"description": "smooth: the standard hardcover. linen: a linen hardcover."
},
"pages": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"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."
},
"paper": {
"enum": [
"glossy",
"matte",
"fine-art"
],
"type": "string",
"description": "glossy (the standard), matte or fine-art."
},
"binding": {
"enum": [
"perfect",
"layflat"
],
"type": "string",
"description": "perfect: the standard binding, where the pages curve towards the spine. layflat: opens completely flat, up to 120 pages."
}
}
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"of": {
"type": "number"
},
"ours": {
"type": "object",
"required": [
"name",
"price",
"startPrice",
"includedPages",
"pricePerExtraPage",
"pageStep",
"maxPages"
],
"properties": {
"name": {
"type": "string"
},
"price": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"maxPages": {
"type": "number"
},
"pageStep": {
"type": "number"
},
"startPrice": {
"type": "number"
},
"includedPages": {
"type": "number"
},
"pricePerExtraPage": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"additionalProperties": {}
},
"rank": {
"type": "number",
"description": "foto foto's place among all prices, 1 is cheapest."
},
"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."
},
"others": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"book",
"pages",
"price",
"maxPages",
"source",
"layflatInstead"
],
"properties": {
"book": {
"type": "string",
"description": "The service's own name for the book, in English."
},
"name": {
"type": "string"
},
"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."
},
"source": {
"type": "string",
"description": "The service's own page the price was read from."
},
"maxPages": {
"type": "number"
},
"layflatInstead": {
"type": "boolean",
"description": "The service only makes layflat books, so its layflat book is priced."
}
},
"additionalProperties": {}
},
"description": "Services that sell this book at this length, cheapest first."
},
"checked": {
"type": "string",
"description": "The date the prices were read, YYYY-MM-DD."
},
"message": {
"type": "string"
},
"notSold": {
"type": "array",
"items": {
"type": "string"
},
"description": "Services that do not sell this book."
},
"ranking": {
"type": "array",
"items": {
"type": "object",
"required": [
"place",
"name",
"book",
"pages",
"price",
"shippingNl",
"shippingNote",
"totalNl",
"source"
],
"properties": {
"book": {
"type": "string"
},
"name": {
"type": "string"
},
"pages": {
"type": "number"
},
"place": {
"type": "number"
},
"price": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"source": {
"type": "string"
},
"totalNl": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "price + shippingNl."
},
"shippingNl": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
],
"description": "Shipping to the Netherlands in euros."
},
"shippingNote": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"additionalProperties": {}
},
"description": "Everyone who sells this book at this length, foto foto included, cheapest first."
},
"tooLong": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"book",
"pages",
"price",
"maxPages",
"source",
"layflatInstead"
],
"properties": {
"book": {
"type": "string",
"description": "The service's own name for the book, in English."
},
"name": {
"type": "string"
},
"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."
},
"source": {
"type": "string",
"description": "The service's own page the price was read from."
},
"maxPages": {
"type": "number"
},
"layflatInstead": {
"type": "boolean",
"description": "The service only makes layflat books, so its layflat book is priced."
}
},
"additionalProperties": {}
},
"description": "Services that sell it, but not with this many pages."
},
"currency": {
"type": "string"
},
"priceList": {
"type": "object",
"required": [
"currency",
"formula",
"includedPages",
"pageStep",
"startPrice",
"coverSurcharge",
"pricePerExtraPage",
"maxPages"
],
"properties": {
"formula": {
"type": "string"
},
"currency": {
"type": "string"
},
"maxPages": {
"type": "object",
"description": "Per binding.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "number"
}
},
"pageStep": {
"type": "number"
},
"startPrice": {
"type": "object",
"description": "Per binding.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "number"
}
},
"includedPages": {
"type": "number"
},
"coverSurcharge": {
"type": "object",
"description": "Per cover, added once.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "number"
}
},
"pricePerExtraPage": {
"type": "object",
"description": "Per binding, then per paper.",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "number"
}
}
}
},
"description": "foto foto's price for every material it offers, in euros with VAT, without shipping.",
"additionalProperties": {}
},
"unpublished": {
"type": "array",
"items": {
"type": "string"
},
"description": "Services that sell it but show the price only inside their editor."
},
"vatIncluded": {
"type": "boolean"
},
"calculatorUrl": {
"type": "string"
},
"configuration": {
"type": "object",
"required": [
"id",
"binding",
"cover",
"paper"
],
"properties": {
"id": {
"type": "string"
},
"cover": {
"type": "string"
},
"paper": {
"type": "string"
},
"binding": {
"type": "string"
}
},
"additionalProperties": {}
},
"shippingIncluded": {
"type": "boolean"
}
},
"additionalProperties": {}
}{
"title": "Compare photo book prices",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}start_photo_book — Pick photos for a photo book
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",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"title": {
"type": "string",
"maxLength": 120,
"minLength": 1
},
"language": {
"type": "string",
"maxLength": 35,
"description": "Two-letter code of the language the person writes in, such as nl or en."
}
}
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"step": {
"type": "string",
"const": "pick"
},
"title": {
"type": "string"
},
"language": {
"type": "string"
}
},
"additionalProperties": {}
}{
"title": "Pick photos for a photo book",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}create_book — Make a photo book
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",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"idempotencyKey",
"title"
],
"properties": {
"title": {
"type": "string",
"maxLength": 120,
"minLength": 1
},
"photos": {
"type": "array",
"items": {
"type": "object",
"properties": {
"url": {
"type": "string",
"format": "uri",
"maxLength": 4096
},
"filename": {
"type": "string",
"default": "photo.jpg",
"maxLength": 200,
"minLength": 1
},
"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)$"
}
}
},
"maxItems": 100,
"minItems": 1,
"description": "Public https image URLs on a known CDN, or uploadIds. Not for chat attachments or local paths."
},
"language": {
"type": "string",
"maxLength": 35,
"description": "Two-letter code of the language the person writes in, such as nl or en."
},
"productId": {
"type": "string",
"maxLength": 100
},
"attachments": {
"type": "array",
"items": {
"type": "object",
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string"
},
"file_name": {
"type": "string"
},
"mime_type": {
"type": "string"
},
"download_url": {
"type": "string"
}
},
"additionalProperties": false
},
"maxItems": 100,
"minItems": 1,
"description": "Photos the person attached in this chat. ChatGPT supplies the file objects; never invent them."
},
"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)$"
},
"sharedAlbumUrl": {
"type": "string",
"format": "uri",
"maxLength": 2048,
"description": "Public iCloud Shared Album link, used instead of photos."
}
}
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"album": {
"type": "object",
"required": [
"name",
"photos",
"imported"
],
"properties": {
"name": {
"type": "string"
},
"photos": {
"type": "number"
},
"imported": {
"type": "number"
}
},
"additionalProperties": {}
},
"title": {
"type": "string"
},
"bookId": {
"type": "string"
},
"status": {
"type": "string",
"description": "\"ready\", or \"processing_or_interrupted\" while the same request is still running."
},
"editUrl": {
"type": "string"
},
"message": {
"type": "string"
},
"claimUrl": {
"type": "string",
"description": "Private link where the person saves the book with their email, then edits and orders it."
},
"language": {
"type": "string",
"description": "The chat's language, as passed in."
},
"bookToken": {
"type": "string",
"description": "Private token for get_book. Keep it private."
},
"orderable": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Whether the book can be printed as it is."
},
"photoCount": {
"type": "number"
},
"previewUrl": {
"type": "string"
},
"operationId": {
"type": "string"
},
"unavailableReason": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Why it cannot be printed yet, such as too few pages."
}
},
"additionalProperties": {}
}{
"title": "Make a photo book",
"readOnlyHint": false,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}get_book — Show a photo book and its price
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",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"bookId",
"bookToken"
],
"properties": {
"bookId": {
"type": "string",
"pattern": "^[a-zA-Z0-9_-]+$",
"maxLength": 100,
"minLength": 1
},
"country": {
"type": "string",
"maxLength": 2,
"minLength": 2
},
"language": {
"type": "string",
"maxLength": 35,
"description": "Two-letter code of the language the person writes in, such as nl or en."
},
"bookToken": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
}
}
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"price": {
"anyOf": [
{
"type": "object",
"required": [
"currency",
"country",
"bookCents",
"shippingCents",
"totalCents"
],
"properties": {
"country": {
"type": "string"
},
"currency": {
"type": "string"
},
"bookCents": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"totalCents": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
},
"shippingCents": {
"anyOf": [
{
"type": "number"
},
{
"type": "null"
}
]
}
},
"additionalProperties": {}
},
{
"type": "null"
}
],
"description": "One copy including shipping, when country was given and the book can be ordered."
},
"title": {
"type": "string"
},
"bookId": {
"type": "string"
},
"claimed": {
"type": "boolean"
},
"editUrl": {
"type": "string"
},
"message": {
"type": "string"
},
"claimUrl": {
"type": "string",
"description": "Private link where the person saves the book with their email, then edits and orders it."
},
"language": {
"type": "string",
"description": "The chat's language, as passed in."
},
"materials": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Binding, cover and paper the book is priced with, e.g. \"Layflat binding · Linen cover · Fine art paper\"; null without a country."
},
"orderable": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Whether the book can be printed as it is."
},
"productId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"photoCount": {
"type": "number"
},
"unavailableReason": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Why it cannot be printed yet, such as too few pages."
}
},
"additionalProperties": {}
}{
"title": "Show a photo book and its price",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}create_checkout — Prepare checkout
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",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"bookId",
"bookToken",
"country",
"idempotencyKey"
],
"properties": {
"bookId": {
"type": "string",
"pattern": "^[a-zA-Z0-9_-]+$",
"maxLength": 100,
"minLength": 1
},
"country": {
"type": "string",
"maxLength": 2,
"minLength": 2
},
"quantity": {
"type": "integer",
"default": 1,
"maximum": 10,
"minimum": 1
},
"bookToken": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
},
"idempotencyKey": {
"type": "string",
"pattern": "^[a-zA-Z0-9_-]+$",
"maxLength": 100,
"minLength": 8
}
}
}{
"title": "Prepare checkout",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}create_payment_quote — Prepare a payment quote
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",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"bookId",
"bookToken",
"country",
"idempotencyKey",
"shippingAddress"
],
"properties": {
"bookId": {
"type": "string",
"pattern": "^[a-zA-Z0-9_-]+$",
"maxLength": 100,
"minLength": 1
},
"country": {
"type": "string",
"maxLength": 2,
"minLength": 2
},
"quantity": {
"type": "integer",
"default": 1,
"maximum": 10,
"minimum": 1
},
"bookToken": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
},
"idempotencyKey": {
"type": "string",
"pattern": "^[a-zA-Z0-9_-]+$",
"maxLength": 100,
"minLength": 8
},
"shippingAddress": {
"type": "object",
"required": [
"firstName",
"lastName",
"addressLine1",
"city",
"postalCode",
"phone"
],
"properties": {
"city": {
"type": "string",
"maxLength": 100,
"minLength": 1
},
"phone": {
"type": "string",
"maxLength": 40,
"minLength": 5
},
"state": {
"type": "string",
"maxLength": 100
},
"lastName": {
"type": "string",
"maxLength": 80,
"minLength": 1
},
"firstName": {
"type": "string",
"maxLength": 80,
"minLength": 1
},
"postalCode": {
"type": "string",
"maxLength": 20,
"minLength": 1
},
"addressLine1": {
"type": "string",
"maxLength": 160,
"minLength": 1
},
"addressLine2": {
"type": "string",
"maxLength": 160
}
}
}
}
}{
"title": "Prepare a payment quote",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}pay_book — Pay for a photo book
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",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"quoteId",
"bookToken"
],
"properties": {
"quoteId": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
},
"bookToken": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
}
}
}{
"title": "Pay for a photo book",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": true
}Prompts
Not advertised
Resources
3 advertised
book-card
ui://fotofoto/book.htmlconnector-documentation — foto foto connector documentation
Tools, photo inputs, private book tokens, rate limits, errors and payments.
https://fotofoto.app/connectors.mdllms-txt — foto foto llms.txt
When to use foto foto and where everything is.
https://fotofoto.app/llms.txt30-day availability
Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.
- Successful checks
- 1 of 1 (100%)
- Average latency
- 1425 ms
- 95th percentile latency
- 1425 ms
Maintenance history
Public check and source-refresh events. Editorial and ownership records remain private.
- · probe · passed · 1425 ms · metadata changed · 8 tool(s), 3 resource(s), 0 resource template(s)
Connect from your client
Each snippet registers the same endpoint; pick the client you use.
Claude Code
claude mcp add --transport http foto-foto-mcp https://fotofoto.app/mcpCodex
codex mcp add foto-foto-mcp --url https://fotofoto.app/mcpCursor
{
"mcpServers": {
"foto-foto-mcp": {
"url": "https://fotofoto.app/mcp"
}
}
}Cline
{
"mcpServers": {
"foto-foto-mcp": {
"type": "streamableHttp",
"url": "https://fotofoto.app/mcp",
"disabled": false
}
}
}VS Code
{
"servers": {
"foto-foto-mcp": {
"type": "http",
"url": "https://fotofoto.app/mcp"
}
}
}Gemini CLI
gemini mcp add --transport http foto-foto-mcp https://fotofoto.app/mcpClaude Desktop
{
"mcpServers": {
"foto-foto-mcp": {
"url": "https://fotofoto.app/mcp"
}
}
}Windsurf
{
"mcpServers": {
"foto-foto-mcp": {
"serverUrl": "https://fotofoto.app/mcp"
}
}
}Let your agent find its tools
Find servers like foto foto MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.
Other design servers
Do you run foto foto MCP?
Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.