Skip to main content
Glama

Put a business in the directory

register_business

For a business's own AI: put the business in the directory with its doors (MCP, A2A, OpenAPI, an API, UCP, ACP, a platform's door) and its facts (name, category, where, languages), and agree to the listing terms (/bot#terms). When its proof is not in place yet, the answer gives a challenge (a file or DNS record on its domain, its inbox manifest, a key's signature, or a code mailed to its domain) and the next call proves it. Mail, phone, forms and web pages are never doors. Free, and the order cannot be bought. Not listed: adult services, gambling, weapons, tobacco, cannabis and vaping, payday loans, bail bonds.

Input Schema

NameRequiredDescriptionDefault
payNoPayment tokens of list_attributes.
nameYesAs the business writes it.
agreeYesThe business agrees to be listed by the network's published rules (GET /v1/ranking) and listing terms.
doorsNoIts doors for AI agents; each counts only after this network's crawler has checked it.
hoursNoAs a profile's hours: {"timezone": "Europe/Paris", "weekly": {"tue": [["09:00", "19:00"]]}}.
proofNoProof the domain is its own, answering the challenge a call without proof gets.
whereYesA storefront needs an address or geo, a service area its radius or countries, online its ships_to.
domainYesThe business's own website domain. A business without a website is not supported yet.
localeNoThe language to answer in.
categoryYesWhat the business is: one category, and at most two more.
languagesYesLanguage tags, like pt or fr-CA.
attributesNoKeys of list_attributes.
currenciesNoISO 4217.
price_bandNo1 (cheapest) to 4.
want_inboxNotrue: once the domain is proved, the answer says how its owner sets up an agent inbox.
claim_tokenNoGiven by a successful register_business: proof again for 90 days, for this listing only.
descriptionYesOne line on what it does; the first line is at most 160.
alternate_namesNoOther names the business goes by; a name longer than the network keeps is dropped (the reference network keeps 60 characters and 4 words at most).

Output Schema

NameRequiredDescriptionDefault
cardNoThe listing as it stands now, as search_businesses gives each business.
levelNo
notesNo
proofNo
detailNo
domainYes
listedNo
statusYes
claimedNo
droppedNo
challengeNo
next_levelNo
want_inboxNo
claim_tokenNo
claim_token_expires_atNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed24 schema fields changed
    • addedInput schema / properties / category / properties / alternates / description
      Added value: +"Up to two more categories, as primary takes them."
    • addedInput schema / properties / doors / description
      Added value: +"Its doors for AI agents; each counts only after this network's crawler has checked it."
    • addedInput schema / properties / doors / items / properties / terms_url / description
      Added value: +"The door's terms of use, https."
    • addedInput schema / properties / hours / properties / closures / description
      Added value: +"Closed dates, each from and to, both included."
    • addedInput schema / properties / hours / properties / closures / items / properties / from / description
      Added value: +"First closed day, YYYY-MM-DD."
    • addedInput schema / properties / hours / properties / closures / items / properties / to / description
      Added value: +"Last closed day, YYYY-MM-DD."
    • addedInput schema / properties / hours / properties / timezone / description
      Added value: +"A tz database zone, like Europe/Paris."
    • addedInput schema / properties / hours / properties / weekly / description
      Added value: +"Days mon to sun, each with [open, close] pairs in HH:MM; a day left out is closed."
    • addedInput schema / properties / proof / description
      Added value: +"Proof the domain is its own, answering the challenge a call without proof gets."
    • addedInput schema / properties / proof / properties / challenge_id / description
      Added value: +"The challenge's id, as the answer gave it; none for code."
    • addedInput schema / properties / proof / properties / method / description
      Added value: +"Which of the challenge's ways was used."
    • addedInput schema / properties / want_inbox / description
      Added value: +"true: once the domain is proved, the answer says how its owner sets up an agent inbox."
    • addedInput schema / properties / where / properties / address / description
      Added value: +"The storefront's address."
    • addedInput schema / properties / where / properties / address / properties / country / description
      Added value: +"Two-letter ISO 3166 code, like PT."
    • addedInput schema / properties / where / properties / address / properties / locality / description
      Added value: +"Town or city."
    • addedInput schema / properties / where / properties / address / properties / postal_code / description
      Added value: +"Postal code."
    • addedInput schema / properties / where / properties / address / properties / region / description
      Added value: +"Region, state or province."
    • addedInput schema / properties / where / properties / address / properties / street / description
      Added value: +"Street and number."
    • addedInput schema / properties / where / properties / geo / description
      Added value: +"The storefront's point on a map."
    • addedInput schema / properties / where / properties / geo / properties / lat / description
      Added value: +"The point's latitude."
    • addedInput schema / properties / where / properties / geo / properties / lng / description
      Added value: +"The point's longitude."
    • addedInput schema / properties / where / properties / kind / description
      Added value: +"Each way it serves customers: storefront, service_area, online."
    • addedInput schema / properties / where / properties / service_area / description
      Added value: +"Where it goes to its customers: a radius in km, or countries."
    • addedInput schema / properties / where / properties / ships_to / description
      Added value: +"Countries it delivers to, as two-letter ISO 3166 codes, or * for all."
  2. Changed21 schema fields changed
    • removedInput schema / $schema
      Removed value: -"https://json-schema.org/draft/2020-12/schema"
    • removedInput schema / properties / doors / items / properties / rate_limit / maximum
      Removed value: -9007199254740991
    • removedInput schema / properties / doors / items / properties / rate_limit / minimum
      Removed value: --9007199254740991
    • removedInput schema / properties / price_band / maximum
      Removed value: -9007199254740991
    • removedInput schema / properties / price_band / minimum
      Removed value: --9007199254740991
    • removedInput schema / title
      Removed value: -"MCP register_business: arguments"
    • removedOutput schema / $schema
      Removed value: -"https://json-schema.org/draft/2020-12/schema"
    • addedOutput schema / description
      Added value: +"Every field is described in this tool's outputSchema at https://network.surfingdog.ai/.well-known/mcp/server-card.json."
    • changedOutput schema / properties / card / description
      Previous value: -"The card search_businesses gives, as it stands now."New value: +"The listing as it stands now, as search_businesses gives each business."
    • removedOutput schema / properties / card / properties
      Removed value: -{
      -  "accepts": {
      -    "properties": {
      -      "kinds": {
      -        "items": {
      -          "enum": [
      -            "ask",
      -            "quote",
      -            "book",
      -            "order",
      -            "pay"
      -          ],
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "pay": {
      -        "description": "Payment tokens of GET /v1/attributes' payments.",
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "pay_with": {
      -        "description": "Each of pay with its evidence, in the vocabulary's order. Absent from a listing built before it.",
      -        "items": {
      -          "properties": {
      -            "label": {
      -              "description": "Its English name: Apple Pay for apple_pay.",
      -              "type": "string"
      -            },
      -            "src": {
      -              "enum": [
      -                "declared",
      -                "seen"
      -              ],
      -              "type": "string"
      -            },
      -            "token": {
      -              "description": "A payment token of GET /v1/attributes.",
      -              "type": "string"
      -            },
      -            "url": {
      -              "description": "The page, file, profile, manifest or door the evidence is at.",
      -              "format": "uri",
      -              "type": "string"
      -            },
      -            "via": {
      -              "description": "Where the evidence is: registration, manifest, schema_org, ucp, acp, door, file or page today. A later network may add one: read a via you do not know as evidence of its src.",
      -              "pattern": "^[a-z][a-z0-9_]{0,31}$",
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "token",
      -            "label",
      -            "src",
      -            "via"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      }
      -    },
      -    "required": [
      -      "kinds"
      -    ],
      -    "type": "object"
      -  },
      -  "answering": {
      -    "description": "Its inbox answered this network within the last day.",
      -    "type": "boolean"
      -  },
      -  "attributes": {
      -    "additionalProperties": {
      -      "properties": {
      -        "src": {
      -          "enum": [
      -            "declared",
      -            "seen",
      -            "probably"
      -          ],
      -          "type": "string"
      -        },
      -        "v": {
      -          "type": [
      -            "boolean",
      -            "string",
      -            "number"
      -          ]
      -        }
      -      },
      -      "required": [
      -        "v",
      -        "src"
      -      ],
      -      "type": "object"
      -    },
      -    "description": "Keys of GET /v1/attributes.",
      -    "propertyNames": {
      -      "type": "string"
      -    },
      -    "type": "object"
      -  },
      -  "categories": {
      -    "description": "Slugs of the categories list.",
      -    "items": {
      -      "type": "string"
      -    },
      -    "type": "array"
      -  },
      -  "category": {
      -    "properties": {
      -      "alternates": {
      -        "items": {
      -          "properties": {
      -            "id": {
      -              "type": "string"
      -            },
      -            "label": {
      -              "type": "string"
      -            },
      -            "src": {
      -              "enum": [
      -                "declared",
      -                "seen",
      -                "probably"
      -              ],
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "id",
      -            "label",
      -            "src"
      -          ],
      -          "type": "object"
      -        },
      -        "maxItems": 2,
      -        "type": "array"
      -      },
      -      "group": {
      -        "description": "Its group: a slug of GET /v1/categories.",
      -        "type": "string"
      -      },
      -      "path": {
      -        "description": "Ancestor ids of the primary, root first, the primary last.",
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "primary": {
      -        "properties": {
      -          "id": {
      -            "type": "string"
      -          },
      -          "label": {
      -            "type": "string"
      -          },
      -          "src": {
      -            "enum": [
      -              "declared",
      -              "seen",
      -              "probably"
      -            ],
      -            "type": "string"
      -          }
      -        },
      -        "required": [
      -          "id",
      -          "label",
      -          "src"
      -        ],
      -        "type": "object"
      -      }
      -    },
      -    "required": [
      -      "primary",
      -      "alternates",
      -      "path"
      -    ],
      -    "type": "object"
      -  },
      -  "city": {
      -    "type": "string"
      -  },
      -  "claimed": {
      -    "type": "boolean"
      -  },
      -  "country": {
      -    "description": "ISO 3166-1 alpha-2.",
      -    "maxLength": 2,
      -    "minLength": 2,
      -    "type": "string"
      -  },
      -  "description": {
      -    "description": "As the business wrote it.",
      -    "type": "string"
      -  },
      -  "distance_km": {
      -    "description": "Searches near a point only.",
      -    "minimum": 0,
      -    "type": "number"
      -  },
      -  "domain": {
      -    "description": "The business's own domain, where its inbox is.",
      -    "type": "string"
      -  },
      -  "doors": {
      -    "items": {
      -      "properties": {
      -        "checked": {
      -          "description": "A member's inbox door, on its detail: what the network's own reads last found in the past 24 hours (§4.8). answered; failing; could_not_check, the door refused the read (403, 429, a challenge page), so the business's signed ping alone says it answers. Absent when the network made no read.",
      -          "properties": {
      -            "at": {
      -              "format": "date-time",
      -              "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$",
      -              "type": "string"
      -            },
      -            "by": {
      -              "const": "network",
      -              "type": "string"
      -            },
      -            "status": {
      -              "enum": [
      -                "answered",
      -                "failing",
      -                "could_not_check"
      -              ],
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "status",
      -            "at",
      -            "by"
      -          ],
      -          "type": "object"
      -        },
      -        "checked_at": {
      -          "format": "date-time",
      -          "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$",
      -          "type": "string"
      -        },
      -        "kinds": {
      -          "items": {
      -            "enum": [
      -              "ask",
      -              "quote",
      -              "book",
      -              "order",
      -              "pay"
      -            ],
      -            "type": "string"
      -          },
      -          "type": "array"
      -        },
      -        "level": {
      -          "description": "What this door alone reaches, from the network's own probe.",
      -          "enum": [
      -            "listed",
      -            "readable",
      -            "askable",
      -            "bookable",
      -            "orderable",
      -            "payable"
      -          ],
      -          "type": "string"
      -        },
      -        "protocol": {
      -          "description": "The protocol it speaks, for type \"other\" only.",
      -          "maxLength": 40,
      -          "type": "string"
      -        },
      -        "src": {
      -          "description": "declared: the business said so; seen: read from the door's own tools.",
      -          "enum": [
      -            "declared",
      -            "seen"
      -          ],
      -          "type": "string"
      -        },
      -        "status": {
      -          "description": "failing: 3 failures in 7 days; it counts for nothing until it works.",
      -          "enum": [
      -            "live",
      -            "failing"
      -          ],
      -          "type": "string"
      -        },
      -        "type": {
      -          "pattern": "^(inbox|mcp|a2a|openapi|api|ucp|acp|nlweb|webhook|other|platform:[a-z0-9-]{1,40})$",
      -          "type": "string"
      -        },
      -        "url": {
      -          "format": "uri",
      -          "type": "string"
      -        }
      -      },
      -      "required": [
      -        "type",
      -        "url",
      -        "level",
      -        "status",
      -        "kinds",
      -        "src"
      -      ],
      -      "type": "object"
      -    },
      -    "type": "array"
      -  },
      -  "found": {
      -    "properties": {
      -      "about_url": {
      -        "description": "The network's page for businesses: why it is here, and how to correct it or opt out.",
      -        "format": "uri",
      -        "type": "string"
      -      },
      -      "checked_at": {
      -        "format": "date-time",
      -        "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$",
      -        "type": "string"
      -      },
      -      "note": {
      -        "description": "\"found on its own website · not a member · checked <YYYY-MM-DD>\"",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "note",
      -      "checked_at",
      -      "about_url"
      -    ],
      -    "type": "object"
      -  },
      -  "has_inbox": {
      -    "description": "It has an inbox door: ours or any compatible inbox.",
      -    "type": "boolean"
      -  },
      -  "hours_today": {
      -    "description": "Today's hours in its own time zone, like \"09:00–13:00, 14:00–19:00\", or \"closed today\"; null when it published none.",
      -    "type": [
      -      "string",
      -      "null"
      -    ]
      -  },
      -  "human_contact_only": {
      -    "description": "It publishes only human channels; never served while nothing below askable is listed.",
      -    "type": "boolean"
      -  },
      -  "inbox": {
      -    "description": "The business's own inbox, where it takes bookings, orders and questions; this server takes no orders or payments and books nothing itself. Present whenever has_inbox is true or absent.",
      -    "properties": {
      -      "mcp": {
      -        "description": "Where an assistant books, orders or asks.",
      -        "format": "uri",
      -        "type": "string"
      -      },
      -      "openapi": {
      -        "format": "uri",
      -        "type": "string"
      -      },
      -      "rest": {
      -        "format": "uri",
      -        "type": "string"
      -      },
      -      "url": {
      -        "format": "uri",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "url"
      -    ],
      -    "type": "object"
      -  },
      -  "languages": {
      -    "items": {
      -      "type": "string"
      -    },
      -    "type": "array"
      -  },
      -  "level": {
      -    "description": "The highest level of its live doors (§4.9).",
      -    "enum": [
      -      "listed",
      -      "readable",
      -      "askable",
      -      "bookable",
      -      "orderable",
      -      "payable"
      -    ],
      -    "type": "string"
      -  },
      -  "listing_url": {
      -    "description": "Its full listing on this network (GET /v1/businesses/{domain}).",
      -    "format": "uri",
      -    "type": "string"
      -  },
      -  "location_precision": {
      -    "description": "town: distance_km is from the centre of the town its own site names (GeoNames), not its own place, in whole kilometres.",
      -    "enum": [
      -      "town"
      -    ],
      -    "type": "string"
      -  },
      -  "name": {
      -    "description": "As the business wrote it.",
      -    "type": "string"
      -  },
      -  "open_now": {
      -    "description": "Open at the moment of the answer by the hours it published, in its own time zone; null when it published none.",
      -    "type": [
      -      "boolean",
      -      "null"
      -    ]
      -  },
      -  "place": {
      -    "description": "For entries that are not members; a member keeps city, country and address.",
      -    "properties": {
      -      "country": {
      -        "description": "ISO 3166-1 alpha-2.",
      -        "maxLength": 2,
      -        "minLength": 2,
      -        "type": "string"
      -      },
      -      "kind": {
      -        "items": {
      -          "enum": [
      -            "storefront",
      -            "service_area",
      -            "online"
      -          ],
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "locality": {
      -        "type": "string"
      -      },
      -      "region": {
      -        "type": "string"
      -      },
      -      "service_area": {
      -        "properties": {
      -          "countries": {
      -            "items": {
      -              "maxLength": 2,
      -              "minLength": 2,
      -              "type": "string"
      -            },
      -            "maxItems": 50,
      -            "type": "array"
      -          },
      -          "radius_km": {
      -            "exclusiveMinimum": 0,
      -            "maximum": 300,
      -            "type": "number"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "ships_to": {
      -        "description": "ISO 3166-1 alpha-2 codes, or [\"*\"] for anywhere.",
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      }
      -    },
      -    "required": [
      -      "kind"
      -    ],
      -    "type": "object"
      -  },
      -  "proof": {
      -    "enum": [
      -      "domain",
      -      "key",
      -      "platform",
      -      "code"
      -    ],
      -    "type": "string"
      -  },
      -  "requestable": {
      -    "description": "The kinds a live door declared it answers; never from what the crawler saw alone.",
      -    "items": {
      -      "enum": [
      -        "ask",
      -        "quote"
      -      ],
      -      "type": "string"
      -    },
      -    "type": "array"
      -  },
      -  "services": {
      -    "description": "Names and how each is taken; prices, durations and free times are at its inbox.",
      -    "items": {
      -      "properties": {
      -        "name": {
      -          "maxLength": 80,
      -          "minLength": 1,
      -          "type": "string"
      -        },
      -        "type": {
      -          "enum": [
      -            "booking",
      -            "order",
      -            "quote_request"
      -          ],
      -          "type": "string"
      -        }
      -      },
      -      "required": [
      -        "name",
      -        "type"
      -      ],
      -      "type": "object"
      -    },
      -    "type": "array"
      -  },
      -  "source": {
      -    "description": "member: through its inbox; registered: by the business, with a proof; found: by the network's crawler.",
      -    "enum": [
      -      "member",
      -      "registered",
      -      "found"
      -    ],
      -    "type": "string"
      -  },
      -  "standing": {
      -    "description": "From the last nightly count of the promises it kept; absent while the directory's order is neutral.",
      -    "properties": {
      -      "broken": {
      -        "description": "From rules version 8: the broken outcomes the night scored.",
      -        "maximum": 9007199254740991,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "in_words": {
      -        "description": "The tier in one plain sentence, or a self-reported record's counts; never a mark against the business.",
      -        "type": "string"
      -      },
      -      "kept": {
      -        "description": "From rules version 8: the kept outcomes the night scored.",
      -        "maximum": 9007199254740991,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "open": {
      -        "description": "From rules version 8: its v2 promises still open.",
      -        "maximum": 9007199254740991,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "ranked": {
      -        "description": "Its record puts it before the daily shuffle.",
      -        "type": "boolean"
      -      },
      -      "self_reported": {
      -        "description": "From rules version 8: its record rests on its own word (less than a fifth of it kept outcomes a verified acknowledgement backs), so it is not ranked and has no score; in_words says its counts.",
      -        "type": "boolean"
      -      },
      -      "tier": {
      -        "enum": [
      -          "new",
      -          "building",
      -          "trusted"
      -        ],
      -        "type": "string"
      -      },
      -      "verified_kept_share": {
      -        "description": "From rules version 8, when not self_reported: the share of its record that is kept outcomes a verified acknowledgement backs (0.2 or more).",
      -        "maximum": 1,
      -        "minimum": 0,
      -        "type": "number"
      -      },
      -      "verified_share": {
      -        "description": "From rules version 8, when not self_reported: the share of its record that is verified evidence.",
      -        "maximum": 1,
      -        "minimum": 0,
      -        "type": "number"
      -      }
      -    },
      -    "required": [
      -      "tier",
      -      "ranked",
      -      "in_words"
      -    ],
      -    "type": "object"
      -  },
      -  "tags": {
      -    "description": "Other words the business gave for what it does.",
      -    "items": {
      -      "type": "string"
      -    },
      -    "type": "array"
      -  },
      -  "takes": {
      -    "description": "What its inbox takes: booking, order, quote_request, message, refund.",
      -    "items": {
      -      "type": "string"
      -    },
      -    "type": "array"
      -  },
      -  "track_record": {
      -    "description": "A member's track record, from the same nightly count as its standing and shown under the same rules: the promises it kept and broke, and when. From rules version 8, one that rests on the business's own word is self_reported: its counts, with no score and no count of customers. Only what its state can say is present; a business that is not a member has none.",
      -    "properties": {
      -      "as_of": {
      -        "description": "The nightly count it is from (00:00 UTC).",
      -        "format": "date-time",
      -        "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$",
      -        "type": "string"
      -      },
      -      "broken": {
      -        "description": "shown: closed as not kept by the business or by a customer's report that stands, left open 9 days past due, or a refund paid late.",
      -        "maximum": 9007199254740991,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "closed": {
      -        "description": "gathering and shown: kept plus broken.",
      -        "maximum": 9007199254740991,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "confirmable": {
      -        "description": "shown: whether this network can verify any acknowledgement yet (a recognised platform's agent key, or an established person's).",
      -        "type": "boolean"
      -      },
      -      "confirmed": {
      -        "description": "shown: how many of the closed are kept outcomes a verified acknowledgement backs, confirmed by the customer's side (a customer's report is not a confirmation); the rest are the business's own word.",
      -        "maximum": 9007199254740991,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "customers": {
      -        "description": "gathering and shown, unless self_reported: the distinct customers the closed promises came from, as its receipts name them (the customer's mailbox when known, else, before rules version 8, the receipt's sub; from rules version 8 a sub that names no person is never a customer, and every receipt at a business that names nobody is one anonymous customer). Not reputation.customers, which counts only customers this network can tell apart.",
      -        "maximum": 9007199254740991,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "from": {
      -        "description": "shown: the earliest day of the evidence counted, at 00:00 UTC (a day, never the moment of a promise).",
      -        "format": "date-time",
      -        "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$",
      -        "type": "string"
      -      },
      -      "held_until": {
      -        "description": "held: the night its record is counted from.",
      -        "format": "date-time",
      -        "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$",
      -        "type": "string"
      -      },
      -      "in_words": {
      -        "description": "The record in one or two plain sentences, with how many of its closed promises the customer's side confirmed; the rest are the business's own word.",
      -        "type": "string"
      -      },
      -      "kept": {
      -        "description": "shown.",
      -        "maximum": 9007199254740991,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "open": {
      -        "description": "shown, from rules version 8: its v2 promises still open (reputation.open).",
      -        "maximum": 9007199254740991,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "refunds_late": {
      -        "description": "shown, of broken: refunds paid late (refund.late).",
      -        "maximum": 9007199254740991,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "rules_url": {
      -        "format": "uri",
      -        "type": "string"
      -      },
      -      "self_reported": {
      -        "description": "gathering and shown, from rules version 8: the record rests on the business's own word (less than a fifth of it is kept outcomes a verified acknowledgement backs, as its reputation's self_reported), so it has no customers, and its threshold none.",
      -        "type": "boolean"
      -      },
      -      "state": {
      -        "description": "held: a new member's 30 days after it joins, when nothing is counted; none: no receipts yet; pending: receipts the next nightly count reaches; gathering: fewer closed promises, or customers, than threshold; shown: the record.",
      -        "enum": [
      -          "held",
      -          "none",
      -          "pending",
      -          "gathering",
      -          "shown"
      -        ],
      -        "type": "string"
      -      },
      -      "threshold": {
      -        "description": "What a record shows from: closed promises, from customers distinct customers; a self_reported record is not asked for customers, and has none here.",
      -        "properties": {
      -          "closed": {
      -            "maximum": 9007199254740991,
      -            "minimum": 1,
      -            "type": "integer"
      -          },
      -          "customers": {
      -            "maximum": 9007199254740991,
      -            "minimum": 1,
      -            "type": "integer"
      -          }
      -        },
      -        "required": [
      -          "closed"
      -        ],
      -        "type": "object"
      -      },
      -      "to": {
      -        "description": "shown: the latest day of the evidence counted, at 00:00 UTC (a day, never the moment of a promise).",
      -        "format": "date-time",
      -        "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$",
      -        "type": "string"
      -      },
      -      "unclosed": {
      -        "description": "shown, of broken: left open 9 days past due (promise.unclosed).",
      -        "maximum": 9007199254740991,
      -        "minimum": 0,
      -        "type": "integer"
      -      }
      -    },
      -    "required": [
      -      "state",
      -      "in_words"
      -    ],
      -    "type": "object"
      -  },
      -  "website": {
      -    "type": "string"
      -  },
      -  "why": {
      -    "description": "Why it is in this place of the list, in plain words.",
      -    "type": "string"
      -  }
      -}
    • removedOutput schema / properties / card / required
      Removed value: -[
      -  "domain",
      -  "name",
      -  "categories",
      -  "tags",
      -  "languages",
      -  "takes",
      -  "services",
      -  "open_now",
      -  "hours_today",
      -  "answering",
      -  "listing_url"
      -]
    • removedOutput schema / properties / challenge / description
      Removed value: -"Put the token in place one of these ways, then call again with proof.method and challenge_id."
    • removedOutput schema / properties / challenge / properties / expires_at / pattern
      Removed value: -"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
    • removedOutput schema / properties / claim_token / description
      Removed value: -"Given by a successful register_business: proof again for 90 days, for this listing only."
    • removedOutput schema / properties / claim_token_expires_at / pattern
      Removed value: -"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$"
    • removedOutput schema / properties / detail / description
      Removed value: -"The answer in one plain sentence."
    • removedOutput schema / properties / dropped / description
      Removed value: -"Each part not taken and why: refused_kind, category_not_listed, contact_detail, not_in_vocabulary, and the like."
    • removedOutput schema / properties / listed / description
      Removed value: -"Whether search shows it now."
    • removedOutput schema / properties / next_level / description
      Removed value: -"What it takes to reach the next level, in plain words."
    • removedOutput schema / properties / status / description
      Removed value: -"listed: in search now; not_agent_ready: claimed, below askable; probe_pending: doors declared, not yet probed; proof_needed: see challenge; code_sent: call again with the code; member: it is listed through its inbox; refused: see detail."
    • removedOutput schema / title
      Removed value: -"MCP register_business: structuredContent"
  3. Changed1 schema field changed
    • addedOutput schema / properties / card / properties / location_precision
      Added value: +{
      +  "description": "town: distance_km is from the centre of the town its own site names (GeoNames), not its own place, in whole kilometres.",
      +  "enum": [
      +    "town"
      +  ],
      +  "type": "string"
      +}
  4. Changed2 schema fields changed
    • addedOutput schema / properties / card / properties / accepts / properties / pay_with
      Added value: +{
      +  "description": "Each of pay with its evidence, in the vocabulary's order. Absent from a listing built before it.",
      +  "items": {
      +    "properties": {
      +      "label": {
      +        "description": "Its English name: Apple Pay for apple_pay.",
      +        "type": "string"
      +      },
      +      "src": {
      +        "enum": [
      +          "declared",
      +          "seen"
      +        ],
      +        "type": "string"
      +      },
      +      "token": {
      +        "description": "A payment token of GET /v1/attributes.",
      +        "type": "string"
      +      },
      +      "url": {
      +        "description": "The page, file, profile, manifest or door the evidence is at.",
      +        "format": "uri",
      +        "type": "string"
      +      },
      +      "via": {
      +        "description": "Where the evidence is: registration, manifest, schema_org, ucp, acp, door, file or page today. A later network may add one: read a via you do not know as evidence of its src.",
      +        "pattern": "^[a-z][a-z0-9_]{0,31}$",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "token",
      +      "label",
      +      "src",
      +      "via"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • changedOutput schema / properties / card / properties / inbox / description
      Previous value: -"The business's own inbox, where it takes bookings, orders and questions; this server takes no bookings or orders. Present whenever has_inbox is true or absent."New value: +"The business's own inbox, where it takes bookings, orders and questions; this server takes no orders or payments and books nothing itself. Present whenever has_inbox is true or absent."
  5. Changed4 schema fields changed
    • changedOutput schema / properties / card / properties / doors / items / properties / level / enum
      Previous value: -[
      -  "listed",
      -  "readable",
      -  "askable",
      -  "bookable",
      -  "payable"
      -]New value: +[
      +  "listed",
      +  "readable",
      +  "askable",
      +  "bookable",
      +  "orderable",
      +  "payable"
      +]
    • changedOutput schema / properties / card / properties / level / enum
      Previous value: -[
      -  "listed",
      -  "readable",
      -  "askable",
      -  "bookable",
      -  "payable"
      -]New value: +[
      +  "listed",
      +  "readable",
      +  "askable",
      +  "bookable",
      +  "orderable",
      +  "payable"
      +]
    • changedOutput schema / properties / level / enum
      Previous value: -[
      -  "listed",
      -  "readable",
      -  "askable",
      -  "bookable",
      -  "payable"
      -]New value: +[
      +  "listed",
      +  "readable",
      +  "askable",
      +  "bookable",
      +  "orderable",
      +  "payable"
      +]
    • changedOutput schema / properties / next_level / properties / level / enum
      Previous value: -[
      -  "listed",
      -  "readable",
      -  "askable",
      -  "bookable",
      -  "payable"
      -]New value: +[
      +  "listed",
      +  "readable",
      +  "askable",
      +  "bookable",
      +  "orderable",
      +  "payable"
      +]
  6. Changed1 schema field changed
    • addedOutput schema / properties / card / properties / doors / items / properties / checked
      Added value: +{
      +  "description": "A member's inbox door, on its detail: what the network's own reads last found in the past 24 hours (§4.8). answered; failing; could_not_check, the door refused the read (403, 429, a challenge page), so the business's signed ping alone says it answers. Absent when the network made no read.",
      +  "properties": {
      +    "at": {
      +      "format": "date-time",
      +      "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z))$",
      +      "type": "string"
      +    },
      +    "by": {
      +      "const": "network",
      +      "type": "string"
      +    },
      +    "status": {
      +      "enum": [
      +        "answered",
      +        "failing",
      +        "could_not_check"
      +      ],
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "status",
      +    "at",
      +    "by"
      +  ],
      +  "type": "object"
      +}
  7. First observed

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag this as a non-read-only, non-idempotent, open-world write, and the description adds real context beyond them: the challenge/response verification path (file, DNS record, inbox manifest, key signature, or mailed code), the requirement to agree to listing terms at /bot#terms, the guarantee it is free and unranked by payment, and the exclusion list. It does not explain what happens to an existing listing on re-registration or what the response contains, which keeps it from a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is a single dense sentence chain front-loaded with the core action and the doors/facts payload, followed by the proof flow and then the exclusions. Nearly every clause carries information an agent needs, though the parenthetical enumeration of door types is somewhat heavy given the schema already lists them. No filler or restatement of the tool name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 18-parameter, deeply nested write with an output schema and annotations, the description covers the two things structured fields cannot: the challenge-then-prove workflow and the eligibility/agreement constraints. Completeness is strong; the only gap is that it says nothing about re-registration, idempotency, or how claim_token extends proof, leaving an agent to discover that from the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3, and the description pushes past it by explaining the semantics of "doors" (machine-callable agent endpoints, explicitly excluding human channels) and the proof challenge that gives the proof object meaning. It still leaves the many optional fields (hours, attributes, price_band, currencies, claim_token) entirely to the schema, so the added meaning is real but partial.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a concrete verb and resource ("put the business in the directory") and enumerates what gets registered — doors (MCP, A2A, OpenAPI, etc.) and facts (name, category, where, languages). That is far more specific than the title alone. It stops short of naming the obvious sibling it is not, such as update_business or check_business, so the boundary between create and amend is left to inference.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It scopes the caller ("For a business's own AI") and describes the two-step flow: a call without proof returns a challenge, and "the next call proves it." It also rules things out by listing prohibited categories and stating that mail, phone, forms and web pages are never doors. What is missing is explicit routing to alternatives like update_business for an already-listed business.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources