Generate and validate LocalBusiness JSON-LD for local SEO. Free tools, no key needed.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Optional. Bearer <LocalSchema Pro API key> unlocks account tools (clients, locations, publishing, health checks).
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Generate LocalBusiness JSON-LD (schema.org) from business details and validate it against Google's rich result rules. Returns the JSON-LD, a ready-to-paste <script> tag and issues to fix. No API key needed.
Public business name
Website URL (https://…)
LocalSchema Pro — omitted from free output
Google Business Profile, Yelp, Facebook, LinkedIn… profile URLs
LocalSchema Pro — omitted from free output
International format, e.g. +31 50 123 4567
e.g. €€ or €20-€80
schema.org type, e.g. Dentist, Plumber, Restaurant. See /business-types.
Regular hours. Days not listed are closed. Use two entries for split hours.
Holiday exceptions (LocalSchema Pro — omitted from free output)
True for service-area businesses without a storefront (address is hidden)
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
claude mcp add --transport http localschema https://local-schema-beacon.lovable.app/mcp
Headers
Authorization (optional, not in the config above): Optional. Bearer <LocalSchema Pro API key> unlocks account tools (clients, locations, publishing, health checks).Generate LocalBusiness JSON-LD (schema.org) from business details and validate it against Google's rich result rules. Returns the JSON-LD, a ready-to-paste <script> tag and issues to fix. No API key needed.
| Argument | Type | Description |
|---|---|---|
| geo | object | |
| url | string | Website URL (https://…) |
| logo | any | |
| menu | any | |
| name* | string | Public business name |
| string | ||
| hasMap | any | |
| images | array | |
| rating | object | LocalSchema Pro — omitted from free output |
| sameAs | array | Google Business Profile, Yelp, Facebook, LinkedIn… profile URLs |
| slogan | string | |
| address | object | |
| reviews | array | LocalSchema Pro — omitted from free output |
| services | array | |
| legalName | string | |
| telephone | string | International format, e.g. +31 50 123 4567 |
| areaServed | array | |
| priceRange | string | e.g. €€ or €20-€80 |
| description | string | |
| businessType | string | schema.org type, e.g. Dentist, Plumber, Restaurant. See /business-types. |
| foundingDate | string | |
| openingHours | array | Regular hours. Days not listed are closed. Use two entries for split hours. |
| specialHours | array | Holiday exceptions (LocalSchema Pro — omitted from free output) |
| alternateName | string | |
| knowsLanguage | array | |
| servesCuisine | array | |
| paymentAccepted | array | |
| serviceAreaOnly | boolean | True for service-area businesses without a storefront (address is hidden) |
| medicalSpecialty | string | |
| currenciesAccepted | array | |
| acceptsReservations | boolean | |
| isAcceptingNewPatients | boolean |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"name"
],
"properties": {
"geo": {
"type": "object",
"required": [
"latitude",
"longitude"
],
"properties": {
"latitude": {
"type": "number",
"maximum": 90,
"minimum": -90
},
"longitude": {
"type": "number",
"maximum": 180,
"minimum": -180
}
},
"additionalProperties": false
},
"url": {
"type": "string",
"maxLength": 2000,
"description": "Website URL (https://…)"
},
"logo": {
"$ref": "#/properties/url"
},
"menu": {
"$ref": "#/properties/url"
},
"name": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Public business name"
},
"email": {
"type": "string",
"maxLength": 200
},
"hasMap": {
"$ref": "#/properties/url"
},
"images": {
"type": "array",
"items": {
"$ref": "#/properties/url"
},
"maxItems": 20
},
"rating": {
"type": "object",
"required": [
"ratingValue",
"reviewCount"
],
"properties": {
"bestRating": {
"type": "number",
"exclusiveMinimum": 0
},
"ratingValue": {
"type": "number",
"maximum": 100,
"minimum": 0
},
"reviewCount": {
"type": "integer",
"minimum": 0
}
},
"description": "LocalSchema Pro — omitted from free output",
"additionalProperties": false
},
"sameAs": {
"type": "array",
"items": {
"$ref": "#/properties/url"
},
"maxItems": 30,
"description": "Google Business Profile, Yelp, Facebook, LinkedIn… profile URLs"
},
"slogan": {
"type": "string",
"maxLength": 200
},
"address": {
"type": "object",
"properties": {
"postalCode": {
"type": "string",
"maxLength": 20
},
"addressRegion": {
"type": "string",
"maxLength": 120
},
"streetAddress": {
"type": "string",
"maxLength": 200
},
"addressCountry": {
"type": "string",
"maxLength": 60,
"description": "ISO 3166-1 alpha-2, e.g. NL or US"
},
"addressLocality": {
"type": "string",
"maxLength": 120
}
},
"additionalProperties": false
},
"reviews": {
"type": "array",
"items": {
"type": "object",
"required": [
"author",
"rating"
],
"properties": {
"body": {
"type": "string",
"maxLength": 2000
},
"author": {
"type": "string",
"maxLength": 120,
"minLength": 1
},
"rating": {
"type": "number",
"maximum": 100,
"minimum": 0
},
"datePublished": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
}
},
"additionalProperties": false
},
"maxItems": 20,
"description": "LocalSchema Pro — omitted from free output"
},
"services": {
"type": "array",
"items": {
"type": "object",
"required": [
"name"
],
"properties": {
"url": {
"$ref": "#/properties/url"
},
"name": {
"type": "string",
"maxLength": 120,
"minLength": 1
},
"price": {
"type": "number",
"minimum": 0
},
"priceMax": {
"type": "number",
"minimum": 0
},
"unitText": {
"type": "string",
"maxLength": 40
},
"priceType": {
"enum": [
"fixed",
"from",
"range"
],
"type": "string"
},
"description": {
"type": "string",
"maxLength": 500
}
},
"additionalProperties": false
},
"maxItems": 50
},
"legalName": {
"type": "string",
"maxLength": 200
},
"telephone": {
"type": "string",
"maxLength": 40,
"description": "International format, e.g. +31 50 123 4567"
},
"areaServed": {
"type": "array",
"items": {
"type": "string",
"maxLength": 120
},
"maxItems": 50
},
"priceRange": {
"type": "string",
"maxLength": 30,
"description": "e.g. €€ or €20-€80"
},
"description": {
"type": "string",
"maxLength": 2000
},
"businessType": {
"type": "string",
"default": "LocalBusiness",
"maxLength": 60,
"description": "schema.org type, e.g. Dentist, Plumber, Restaurant. See /business-types."
},
"foundingDate": {
"type": "string",
"pattern": "^\\d{4}(-\\d{2}-\\d{2})?$"
},
"openingHours": {
"type": "array",
"items": {
"type": "object",
"required": [
"days"
],
"properties": {
"days": {
"anyOf": [
{
"type": "string"
},
{
"type": "array",
"items": {
"type": "string"
}
}
],
"description": "Day names or ranges: \"Mo-Fr\", [\"Saturday\"]"
},
"opens": {
"type": "string",
"pattern": "^([01]\\d|2[0-3]):[0-5]\\d$"
},
"allDay": {
"type": "boolean",
"description": "Open 24 hours on these days"
},
"closes": {
"$ref": "#/properties/openingHours/items/properties/opens"
}
},
"additionalProperties": false
},
"maxItems": 21,
"description": "Regular hours. Days not listed are closed. Use two entries for split hours."
},
"specialHours": {
"type": "array",
"items": {
"type": "object",
"required": [
"validFrom"
],
"properties": {
"label": {
"type": "string",
"maxLength": 80
},
"opens": {
"$ref": "#/properties/openingHours/items/properties/opens"
},
"closed": {
"type": "boolean"
},
"closes": {
"$ref": "#/properties/openingHours/items/properties/opens"
},
"validFrom": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
},
"validThrough": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$"
}
},
"additionalProperties": false
},
"maxItems": 30,
"description": "Holiday exceptions (LocalSchema Pro — omitted from free output)"
},
"alternateName": {
"type": "string",
"maxLength": 200
},
"knowsLanguage": {
"type": "array",
"items": {
"type": "string",
"maxLength": 40
},
"maxItems": 20
},
"servesCuisine": {
"type": "array",
"items": {
"type": "string",
"maxLength": 60
},
"maxItems": 20
},
"paymentAccepted": {
"type": "array",
"items": {
"type": "string",
"maxLength": 60
},
"maxItems": 20
},
"serviceAreaOnly": {
"type": "boolean",
"description": "True for service-area businesses without a storefront (address is hidden)"
},
"medicalSpecialty": {
"type": "string",
"maxLength": 80
},
"currenciesAccepted": {
"type": "array",
"items": {
"type": "string",
"maxLength": 3,
"minLength": 3
},
"maxItems": 10
},
"acceptsReservations": {
"type": "boolean"
},
"isAcceptingNewPatients": {
"type": "boolean"
}
},
"additionalProperties": false
}Get the install snippet and live status for a LocalSchema hosted embed key (loc_… for one location, org_… for a client with several). Paste the script tag once; published updates reach the site automatically.
| Argument | Type | Description |
|---|---|---|
| key* | string | Hosted embed key |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"key"
],
"properties": {
"key": {
"type": "string",
"pattern": "^(?:loc|org)_[a-z0-9]{6,32}$",
"description": "Hosted embed key"
}
},
"additionalProperties": false
}Get one saved location: its business fields (in the same shape save_location accepts), the current JSON-LD, the published JSON-LD, validation issues and embed details. Needs a LocalSchema Pro API key in the request headers.
| Argument | Type | Description |
|---|---|---|
| location_id* | string | Location id from list_locations |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"location_id"
],
"properties": {
"location_id": {
"type": "string",
"format": "uuid",
"description": "Location id from list_locations"
}
},
"additionalProperties": false
}List the schema.org LocalBusiness subtypes LocalSchema supports (Dentist, Plumber, Restaurant, …). Use the most specific one as businessType.
No arguments.
{
"type": "object",
"properties": {}
}List the agency's clients (brands) with their location counts, client-wide embed script and white-label report link. Needs a LocalSchema Pro API key in the request headers.
No arguments.
{
"type": "object",
"properties": {}
}List the business locations saved in the LocalSchema account: publish state, hosted embed script, website and latest health check score. Needs a LocalSchema Pro API key in the request headers.
| Argument | Type | Description |
|---|---|---|
| client_id | string | Only this client's locations |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"client_id": {
"type": "string",
"format": "uuid",
"description": "Only this client's locations"
}
},
"additionalProperties": false
}Run a schema health check for a saved location: validates its markup, scans its website for the embed and conflicting hard-coded schema, detects unpublished changes and records the result in the dashboard and client reports. Needs a LocalSchema Pro API key in the request headers.
| Argument | Type | Description |
|---|---|---|
| location_id* | string | Location id from list_locations |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"location_id"
],
"properties": {
"location_id": {
"type": "string",
"format": "uuid",
"description": "Location id from list_locations"
}
},
"additionalProperties": false
}Create a client (brand) or update one by client_id, and optionally turn its white-label health report link on or off. Needs a LocalSchema Pro API key in the request headers.
| Argument | Type | Description |
|---|---|---|
| name | string | Client (brand) name. Required when creating; omit to keep it when updating. |
| report | boolean | true turns the client's white-label health report link on, false turns it off. Omit to leave it. |
| website | string | Brand website; links every branch to one Organization in the client embed. When updating, omit to keep it or send "" to clear it. |
| client_id | string | Update this client. Omit to create one. |
| contact_name | string | Contact person. When updating, omit to keep it or send "" to clear it. |
| contact_email | string | Contact email. When updating, omit to keep it or send "" to clear it. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"name": {
"type": "string",
"maxLength": 160,
"minLength": 1,
"description": "Client (brand) name. Required when creating; omit to keep it when updating."
},
"report": {
"type": "boolean",
"description": "true turns the client's white-label health report link on, false turns it off. Omit to leave it."
},
"website": {
"type": "string",
"maxLength": 500,
"description": "Brand website; links every branch to one Organization in the client embed. When updating, omit to keep it or send \"\" to clear it."
},
"client_id": {
"type": "string",
"format": "uuid",
"description": "Update this client. Omit to create one."
},
"contact_name": {
"type": "string",
"maxLength": 160,
"description": "Contact person. When updating, omit to keep it or send \"\" to clear it."
},
"contact_email": {
"type": "string",
"maxLength": 255,
"description": "Contact email. When updating, omit to keep it or send \"\" to clear it."
}
},
"additionalProperties": false
}Save a business location to the LocalSchema account — create one, or update one by location_id (only the business fields you send change) — and optionally publish it to its hosted embed so the client's site updates without code changes. Needs a LocalSchema Pro API key in the request headers.
| Argument | Type | Description |
|---|---|---|
| publish | boolean | Publish to the hosted embed now. Default false (saved as a draft). |
| business* | object | Business fields in the same shape as generate_schema (name, businessType, address, openingHours, services, …). When updating, only the fields you send change; address merges field by field, lists are replaced. |
| client_id | any | Assign to a client (see list_clients); null removes the assignment. Omit to keep the current client. |
| location_id | string | Update this location. Omit to create a new one (counts toward the plan's location limit). |
| website_url | any | Page where the hosted embed is installed; health checks scan it. Defaults to business.url. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"business"
],
"properties": {
"publish": {
"type": "boolean",
"description": "Publish to the hosted embed now. Default false (saved as a draft)."
},
"business": {
"type": "object",
"description": "Business fields in the same shape as generate_schema (name, businessType, address, openingHours, services, …). When updating, only the fields you send change; address merges field by field, lists are replaced.",
"additionalProperties": {}
},
"client_id": {
"anyOf": [
{
"$ref": "#/properties/location_id"
},
{
"type": "null"
}
],
"description": "Assign to a client (see list_clients); null removes the assignment. Omit to keep the current client."
},
"location_id": {
"type": "string",
"format": "uuid",
"description": "Update this location. Omit to create a new one (counts toward the plan's location limit)."
},
"website_url": {
"anyOf": [
{
"type": "string",
"maxLength": 500
},
{
"type": "null"
}
],
"description": "Page where the hosted embed is installed; health checks scan it. Defaults to business.url."
}
},
"additionalProperties": false
}Fetch a public web page and audit its structured data: every JSON-LD block and type, the LocalBusiness markup's errors and warnings, LocalSchema embeds on the page and concrete recommendations. No API key needed.
| Argument | Type | Description |
|---|---|---|
| url* | string | Public http(s) address, e.g. https://example.com/contact |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"maxLength": 2000,
"minLength": 4,
"description": "Public http(s) address, e.g. https://example.com/contact"
}
},
"additionalProperties": false
}Validate existing LocalBusiness structured data: paste JSON-LD, a <script type="application/ld+json"> tag or a whole HTML page. Reports errors, missing recommended fields and best-practice warnings. No API key needed.
| Argument | Type | Description |
|---|---|---|
| code* | string | JSON-LD text, a script tag, or full page HTML |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"code"
],
"properties": {
"code": {
"type": "string",
"maxLength": 600000,
"minLength": 1,
"description": "JSON-LD text, a script tag, or full page HTML"
}
},
"additionalProperties": false
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Oct 30, 2026.