AI visibility audits, llms.txt and schema generators, instant quotes, missed-call and ROI tools.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
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.
Audits a live public website and scores (0–100, grade A–F) how well AI assistants (ChatGPT, Claude, Perplexity) and search engines can find, read and cite it. Checks robots.txt rules for AI and search crawlers, server-rendered text, business and FAQ structured data, Open Graph, llms.txt, sitemap, HTTPS, mobile viewport and response time. Returns each check with a plain-English fix, the top 3 fixes, and a shareable report link. Takes up to ~20 seconds.
Website to audit, e.g. example.com or https://www.example.com/
Audits a live public website and scores (0–100, grade A–F) how well AI assistants (ChatGPT, Claude, Perplexity) and search engines can find, read and cite it. Checks robots.txt rules for AI and search crawlers, server-rendered text, business and FAQ structured data, Open Graph, llms.txt, sitemap, HTTPS, mobile viewport and response time. Returns each check with a plain-English fix, the top 3 fixes, and a shareable report link. Takes up to ~20 seconds.
| Argument | Type | Description |
|---|---|---|
| url* | string | Website to audit, e.g. example.com or https://www.example.com/ |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"maxLength": 300,
"minLength": 3,
"description": "Website to audit, e.g. example.com or https://www.example.com/"
}
}
}Builds an itemized Holston AI quote from fixed prices: one-time builds, monthly plans, first-year total (monthly plans have a 12-month minimum), timeline, terms, fitting add-ons, and a shareable link to the quote on holstonai.com. Ask what the customer needs first; do not add plans they did not ask for.
| Argument | Type | Description |
|---|---|---|
| care | string | Monthly service contract: care-site (websites) | care-app (apps and agents). |
| builds | array | One-time builds. website-starter (one page, 3 days) | website-launch (up to 5 pages, 5 days) | website-growth (up to 10 pages, CMS, 10 days) | website-commerce (online store, 15–20 days) | small-app (custom web app, 2 weeks) | ai-agent-mvp (AI agent or SaaS MVP, 2–4 weeks). |
| hosting | string | Monthly hosting: hosting-site (websites) | hosting-app (apps and agents). |
| seo_plan | string | Monthly SEO + AEO plan: seo-essentials (local) | seo-growth (adds AI search / AEO) | seo-authority (adds links, PR, competitor tracking). |
| assessment | string | Systems & Data Health Check, a one-time fixed-price assessment by company size: assessment-small (up to 50 employees) | assessment-medium (51–200) | assessment-large (201–500). The fee is credited toward a project started within 60 days. |
| business_name | string | Customer or business name to show on the quote. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"care": {
"enum": [
"care-site",
"care-app"
],
"type": "string",
"description": "Monthly service contract: care-site (websites) | care-app (apps and agents)."
},
"builds": {
"type": "array",
"items": {
"enum": [
"website-starter",
"website-launch",
"website-growth",
"website-commerce",
"small-app",
"ai-agent-mvp"
],
"type": "string"
},
"default": [],
"maxItems": 6,
"description": "One-time builds. website-starter (one page, 3 days) | website-launch (up to 5 pages, 5 days) | website-growth (up to 10 pages, CMS, 10 days) | website-commerce (online store, 15–20 days) | small-app (custom web app, 2 weeks) | ai-agent-mvp (AI agent or SaaS MVP, 2–4 weeks)."
},
"hosting": {
"enum": [
"hosting-site",
"hosting-app"
],
"type": "string",
"description": "Monthly hosting: hosting-site (websites) | hosting-app (apps and agents)."
},
"seo_plan": {
"enum": [
"seo-essentials",
"seo-growth",
"seo-authority"
],
"type": "string",
"description": "Monthly SEO + AEO plan: seo-essentials (local) | seo-growth (adds AI search / AEO) | seo-authority (adds links, PR, competitor tracking)."
},
"assessment": {
"enum": [
"assessment-small",
"assessment-medium",
"assessment-large"
],
"type": "string",
"description": "Systems & Data Health Check, a one-time fixed-price assessment by company size: assessment-small (up to 50 employees) | assessment-medium (51–200) | assessment-large (201–500). The fee is credited toward a project started within 60 days."
},
"business_name": {
"type": "string",
"maxLength": 80,
"description": "Customer or business name to show on the quote."
}
}
}Draws a map of a company's software systems and how data moves between them (automatic, manual, export/import), as a Mermaid diagram with a shareable link. Flags manual handoffs, the same data kept in several unsynced systems, hub systems many processes depend on, and systems with no connections. Use after interviewing the user about their systems; nothing is stored.
| Argument | Type | Description |
|---|---|---|
| flows | array | How data moves between systems. |
| company | string | Company name, shown on the map. |
| systems* | array | Every software system, database or important spreadsheet the business uses. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"systems"
],
"properties": {
"flows": {
"type": "array",
"items": {
"type": "object",
"required": [
"from",
"to",
"data",
"method"
],
"properties": {
"to": {
"type": "string",
"maxLength": 60,
"minLength": 1,
"description": "Destination system name (must match a system name)."
},
"data": {
"type": "string",
"maxLength": 60,
"minLength": 1,
"description": "What moves, e.g. 'new orders', 'customer details'."
},
"from": {
"type": "string",
"maxLength": 60,
"minLength": 1,
"description": "Source system name (must match a system name)."
},
"method": {
"enum": [
"automatic",
"manual",
"export_import",
"unknown"
],
"type": "string",
"description": "automatic = integration or sync | manual = someone re-types it | export_import = files exported and uploaded by hand | unknown"
},
"hours_per_week": {
"type": "number",
"maximum": 1000,
"minimum": 0,
"description": "Staff hours per week spent on this flow, if manual."
}
}
},
"default": [],
"maxItems": 60,
"description": "How data moves between systems."
},
"company": {
"type": "string",
"maxLength": 80,
"description": "Company name, shown on the map."
},
"systems": {
"type": "array",
"items": {
"type": "object",
"required": [
"name"
],
"properties": {
"data": {
"type": "array",
"items": {
"type": "string",
"maxLength": 40,
"minLength": 1
},
"maxItems": 12,
"description": "Kinds of data stored in it, e.g. customers, orders, invoices, products, employees. Use the same words across systems."
},
"name": {
"type": "string",
"maxLength": 60,
"minLength": 1,
"description": "System name, e.g. 'Salesforce', 'QuickBooks', 'Inventory spreadsheet'."
},
"category": {
"type": "string",
"maxLength": 40,
"description": "What it is used for, e.g. CRM, accounting, inventory, ERP, e-commerce, support, HR, spreadsheet, custom database."
}
}
},
"maxItems": 30,
"minItems": 1,
"description": "Every software system, database or important spreadsheet the business uses."
}
}
}Calculates what manual, repetitive work caused by disconnected systems costs per year: staff hours, full-time equivalents, labor and error costs, five-year cost, and the savings from automating it. Input a list of tasks with hours per week; hourly cost is optional.
| Argument | Type | Description |
|---|---|---|
| tasks* | array | Each manual or repetitive task caused by disconnected systems. |
| company | string | Company name for the report. |
| automation_rate | number | Share of these hours that connecting the systems would remove, 0–1 (default 0.7). |
| working_weeks_per_year | number | Working weeks per year (default 48). |
| default_hourly_cost_usd | number | Hourly cost used when a task has none (default $40). |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"tasks"
],
"properties": {
"tasks": {
"type": "array",
"items": {
"type": "object",
"required": [
"task",
"hours_per_week"
],
"properties": {
"task": {
"type": "string",
"maxLength": 80,
"minLength": 1,
"description": "The manual task, e.g. 'Re-typing web orders into QuickBooks', 'Building the monthly sales report'."
},
"hours_per_week": {
"type": "number",
"maximum": 2000,
"minimum": 0,
"description": "Total staff hours per week spent on this task, across everyone who does it."
},
"hourly_cost_usd": {
"type": "number",
"maximum": 1000,
"minimum": 0,
"description": "Fully loaded hourly cost of the people doing it (wage plus benefits and taxes). Defaults to default_hourly_cost_usd."
},
"error_cost_per_month_usd": {
"type": "number",
"maximum": 10000000,
"minimum": 0,
"description": "Optional: estimated monthly cost of mistakes this task causes (wrong orders, billing errors, rework)."
}
}
},
"maxItems": 25,
"minItems": 1,
"description": "Each manual or repetitive task caused by disconnected systems."
},
"company": {
"type": "string",
"maxLength": 80,
"description": "Company name for the report."
},
"automation_rate": {
"type": "number",
"default": 0.7,
"maximum": 1,
"minimum": 0,
"description": "Share of these hours that connecting the systems would remove, 0–1 (default 0.7)."
},
"working_weeks_per_year": {
"type": "number",
"default": 48,
"maximum": 52,
"minimum": 1,
"description": "Working weeks per year (default 48)."
},
"default_hourly_cost_usd": {
"type": "number",
"default": 40,
"maximum": 1000,
"minimum": 0,
"description": "Hourly cost used when a task has none (default $40)."
}
}
}Estimates the revenue a business loses each year to unanswered phone calls (missed calls, lost callers, lost customers, monthly and five-year loss) and how much an AI receptionist that answers every call could recover. Give calls per week (or missed calls per week) and the average job value; every other assumption has a sensible default.
| Argument | Type | Description |
|---|---|---|
| company | string | Company name for the report. |
| close_rate | number | Share of new callers who become customers when answered, 0–1 (default 0.4). |
| missed_rate | number | Share of calls that go unanswered, 0–1 (default 0.25). |
| recovery_rate | number | Share of lost calls an AI receptionist would handle, 0–1 (default 0.9). |
| calls_per_week | number | Inbound phone calls per week. |
| missed_per_week | number | Missed calls per week, if known. Overrides calls_per_week × missed_rate. |
| new_caller_share | number | Share of missed callers who are new potential customers, 0–1 (default 0.5). |
| no_callback_rate |
Compares a Holston AI fixed-price 2–4 week build against a traditional ~6-month build. Returns build costs, labor savings captured, cost of delay, developer-weeks freed, payback week, and a month-by-month cumulative net position over the analysis window.
| Argument | Type | Description |
|---|---|---|
| dev_headcount* | integer | Number of in-house developers who would be assigned to a traditional build. |
| project_scope* | string | Target project scope. Websites: website_launch (up to 5 pages, 5 days) | website_growth (up to 10 pages, 10 days) | website_commerce (online store, 15–20 days). Small app: small_app (2 wks). Apps & AI agents: lean (2 wks) | standard (3 wks) | complex (4 wks). |
| automation_rate | number | Fraction of the manual hours eliminated once the software is live, 0–1 (default 0.7). |
| dev_annual_cost_usd | number | Fully loaded annual cost per in-house developer (default $150,000). |
| manual_hourly_cost_usd | number | Fully loaded hourly cost of the staff doing the manual work (default $45). |
| analysis_horizon_months | integer | Length of the comparison window in months (default 6). |
Designs an AI receptionist for a business from Holston AI's templates: the step-by-step call flow, what it does at any point (pricing questions, emergencies, transfers), and a link to holstonai.com where the owner can edit it and talk to the agent out loud in their browser for free. Only the industry and business name are required. Holston AI builds the real version on the business's phone line at a fixed price confirmed after a short call.
| Argument | Type | Description |
|---|---|---|
| city | string | Main service area, if it is one of these East Tennessee and Southwest Virginia cities. |
| hours | string | Business hours option. |
| pricing | string | How the agent answers pricing questions. |
| industry* | string | Industry id (see get_agent_templates). |
| services | array | Service ids from the template. Defaults to the template's main services. |
| add_steps | array | Optional step ids to switch on, e.g. photos, returning, message. |
| business_name* | string | The business name the agent answers with. |
Generates a production-ready Next.js App Router repository layout, Prisma schema, and PostgreSQL DDL for a business domain (b2b_saas, marketplace, healthcare_admin, logistics, restaurant_retail, professional_services, manufacturing). Multi-tenant by default with org membership and audit logging; optional agent-run tables.
| Argument | Type | Description |
|---|---|---|
| domain* | string | Business domain: b2b_saas | marketplace | healthcare_admin | logistics | restaurant_retail | professional_services | manufacturing. |
| output | string | What to generate: repo_layout | prisma | sql | all (default all). |
| project_name | string | Repository / package name (kebab-case). |
| include_ai_agents | boolean | Add AgentRun/ToolCall tables plus agent runtime and MCP directories (default true). |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"domain"
],
"properties": {
"domain": {
"enum": [
"b2b_saas",
"marketplace",
"healthcare_admin",
"logistics",
"restaurant_retail",
"professional_services",
"manufacturing"
],
"type": "string",
"description": "Business domain: b2b_saas | marketplace | healthcare_admin | logistics | restaurant_retail | professional_services | manufacturing."
},
"output": {
"enum": [
"repo_layout",
"prisma",
"sql",
"all"
],
"type": "string",
"default": "all",
"description": "What to generate: repo_layout | prisma | sql | all (default all)."
},
"project_name": {
"type": "string",
"default": "app",
"pattern": "^[a-z0-9][a-z0-9-]{0,63}$",
"description": "Repository / package name (kebab-case)."
},
"include_ai_agents": {
"type": "boolean",
"default": true,
"description": "Add AgentRun/ToolCall tables plus agent runtime and MCP directories (default true)."
}
}
}Builds ready-to-paste Organization or LocalBusiness structured data (JSON-LD) with address, phone, hours, service area, services, social profiles and optional FAQs. If a website is given, details are pre-filled from it. Returns the <script> tag plus checks to fix before publishing. Use it when an audit shows missing business schema.
| Argument | Type | Description |
|---|---|---|
| url | string | Business website. If given, details are pre-filled from the site. |
| city | string | |
| faqs | array | Optional FAQs that appear visibly on the page; adds FAQPage markup. |
| string | ||
| hours | array | |
| phone | string | |
| region | string | State or region, e.g. TN. |
| street | string | |
| country | string | Two-letter country code, default US. |
Reads a public website (homepage, sitemap and main pages) and writes a ready-to-upload llms.txt file that tells AI assistants who the business is, what it offers, where it works and which pages matter. Optional details (services, service area, hours, key facts) make it stronger. Use it when an audit shows no llms.txt.
| Argument | Type | Description |
|---|---|---|
| url* | string | The business website, e.g. example.com |
| string | ||
| hours | string | Opening hours, e.g. 'Mon–Fri 8am–5pm, Sat 9am–1pm'. |
| phone | string | |
| address | string | Street address, city, state and ZIP. |
| summary | string | Two or three sentences: what the business does, for whom, and where. Overrides the site's description. |
| services | array | Main services or products, one per item. |
| key_facts | array | Short facts AI assistants should know: years in business, licenses, starting prices, guarantees, awards. |
Lists Holston AI's ready-built AI receptionist templates by industry (HVAC, plumbing, roofing, dental, law and more): the services, the questions the agent asks, the default call flow, optional steps, and emergency handling. Give an industry id for one template, or omit it for the list. Use it before design_ai_agent.
| Argument | Type | Description |
|---|---|---|
| industry | string | Industry id. Omit to list all industries. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"industry": {
"enum": [
"hvac",
"plumbing",
"electrical",
"roofing",
"painting",
"landscaping",
"remodeling",
"cleaning",
"pest-control",
"auto-repair",
"dental",
"medical",
"law",
"salon"
],
"type": "string",
"description": "Industry id. Omit to list all industries."
}
}
}Sends the user's contact details and project summary to Holston AI so the team can follow up. Before calling: collect name, email or phone, and a summary of what they need (include any quote or report links from this conversation), show the user exactly what will be sent, and get their explicit agreement. Never call it without that agreement or with made-up details.
| Argument | Type | Description |
|---|---|---|
| name* | string | The person's full name. |
| string | Email address. Provide email, phone, or both. | |
| phone | string | Phone number. |
| company | string | Company or business name. |
| summary* | string | What they need, in a few sentences: their situation, goals, timeline and anything already discussed (audit score, systems, budget). |
| interest* | string | Main service they are interested in. |
| location | string | City and state, or country. |
| best_time | string | Best days or times to reach them. |
| quote_url |
| number |
| Share of those new callers who call a competitor instead of calling back, 0–1 (default 0.6). |
| average_job_value_usd* | number | Average revenue from a new customer's first job or purchase. |
| customer_lifetime_value_usd | number | Optional: total revenue from a typical customer over time. Used instead of the average job value. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"average_job_value_usd"
],
"properties": {
"company": {
"type": "string",
"maxLength": 80,
"description": "Company name for the report."
},
"close_rate": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "Share of new callers who become customers when answered, 0–1 (default 0.4)."
},
"missed_rate": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "Share of calls that go unanswered, 0–1 (default 0.25)."
},
"recovery_rate": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "Share of lost calls an AI receptionist would handle, 0–1 (default 0.9)."
},
"calls_per_week": {
"type": "number",
"maximum": 100000,
"minimum": 0,
"description": "Inbound phone calls per week."
},
"missed_per_week": {
"type": "number",
"maximum": 100000,
"minimum": 0,
"description": "Missed calls per week, if known. Overrides calls_per_week × missed_rate."
},
"new_caller_share": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "Share of missed callers who are new potential customers, 0–1 (default 0.5)."
},
"no_callback_rate": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "Share of those new callers who call a competitor instead of calling back, 0–1 (default 0.6)."
},
"average_job_value_usd": {
"type": "number",
"maximum": 10000000,
"minimum": 0,
"description": "Average revenue from a new customer's first job or purchase."
},
"customer_lifetime_value_usd": {
"type": "number",
"maximum": 100000000,
"minimum": 0,
"description": "Optional: total revenue from a typical customer over time. Used instead of the average job value."
}
}
}| holston_fixed_price_usd |
| number |
| A specific fixed-price quote from Holston AI. If omitted, the scope's standard starting price is used. |
| traditional_timeline_weeks | integer | Delivery timeline of the traditional path in weeks (default: 6–12 for websites, 26 ≈ 6 months for apps/agents). |
| traditional_vendor_cost_usd | number | External agency/vendor spend on the traditional path, on top of in-house dev time (default 0). |
| holston_internal_involvement | number | Share of the in-house dev team's time needed during a Holston build, 0–1 (default 0.1). |
| manual_process_hours_per_week* | number | Hours per week your team currently spends on the manual process the software will replace. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"manual_process_hours_per_week",
"dev_headcount",
"project_scope"
],
"properties": {
"dev_headcount": {
"type": "integer",
"maximum": 500,
"minimum": 0,
"description": "Number of in-house developers who would be assigned to a traditional build."
},
"project_scope": {
"enum": [
"website_launch",
"website_growth",
"website_commerce",
"small_app",
"lean",
"standard",
"complex"
],
"type": "string",
"description": "Target project scope. Websites: website_launch (up to 5 pages, 5 days) | website_growth (up to 10 pages, 10 days) | website_commerce (online store, 15–20 days). Small app: small_app (2 wks). Apps & AI agents: lean (2 wks) | standard (3 wks) | complex (4 wks)."
},
"automation_rate": {
"type": "number",
"default": 0.7,
"maximum": 1,
"minimum": 0,
"description": "Fraction of the manual hours eliminated once the software is live, 0–1 (default 0.7)."
},
"dev_annual_cost_usd": {
"type": "number",
"default": 150000,
"minimum": 0,
"description": "Fully loaded annual cost per in-house developer (default $150,000)."
},
"manual_hourly_cost_usd": {
"type": "number",
"default": 45,
"minimum": 0,
"description": "Fully loaded hourly cost of the staff doing the manual work (default $45)."
},
"analysis_horizon_months": {
"type": "integer",
"default": 6,
"maximum": 36,
"minimum": 1,
"description": "Length of the comparison window in months (default 6)."
},
"holston_fixed_price_usd": {
"type": "number",
"minimum": 0,
"description": "A specific fixed-price quote from Holston AI. If omitted, the scope's standard starting price is used."
},
"traditional_timeline_weeks": {
"type": "integer",
"maximum": 156,
"minimum": 1,
"description": "Delivery timeline of the traditional path in weeks (default: 6–12 for websites, 26 ≈ 6 months for apps/agents)."
},
"traditional_vendor_cost_usd": {
"type": "number",
"default": 0,
"minimum": 0,
"description": "External agency/vendor spend on the traditional path, on top of in-house dev time (default 0)."
},
"holston_internal_involvement": {
"type": "number",
"default": 0.1,
"maximum": 1,
"minimum": 0,
"description": "Share of the in-house dev team's time needed during a Holston build, 0–1 (default 0.1)."
},
"manual_process_hours_per_week": {
"type": "number",
"maximum": 100000,
"minimum": 0,
"description": "Hours per week your team currently spends on the manual process the software will replace."
}
}
}| emergency_transfer |
| boolean |
| Transfer emergencies to an on-call number (default true where emergencies apply). |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"industry",
"business_name"
],
"properties": {
"city": {
"enum": [
"Kingsport, TN",
"Johnson City, TN",
"Bristol, TN",
"Bristol, VA",
"Abingdon, VA",
"Elizabethton, TN",
"Greeneville, TN",
"Morristown, TN",
"Knoxville, TN",
"Maryville, TN",
"Oak Ridge, TN",
"Sevierville, TN",
"Chattanooga, TN",
"Cleveland, TN"
],
"type": "string",
"description": "Main service area, if it is one of these East Tennessee and Southwest Virginia cities."
},
"hours": {
"enum": [
"weekdays",
"extended",
"always"
],
"type": "string",
"description": "Business hours option."
},
"pricing": {
"enum": [
"free-estimate",
"service-fee",
"callback"
],
"type": "string",
"description": "How the agent answers pricing questions."
},
"industry": {
"enum": [
"hvac",
"plumbing",
"electrical",
"roofing",
"painting",
"landscaping",
"remodeling",
"cleaning",
"pest-control",
"auto-repair",
"dental",
"medical",
"law",
"salon"
],
"type": "string",
"description": "Industry id (see get_agent_templates)."
},
"services": {
"type": "array",
"items": {
"type": "string",
"maxLength": 40
},
"maxItems": 12,
"description": "Service ids from the template. Defaults to the template's main services."
},
"add_steps": {
"type": "array",
"items": {
"type": "string",
"maxLength": 20
},
"maxItems": 6,
"description": "Optional step ids to switch on, e.g. photos, returning, message."
},
"business_name": {
"type": "string",
"maxLength": 60,
"minLength": 2,
"description": "The business name the agent answers with."
},
"emergency_transfer": {
"type": "boolean",
"description": "Transfer emergencies to an on-call number (default true where emergencies apply)."
}
}
}| latitude |
| number |
| logo_url | string |
| services | array | Main services offered. |
| image_url | string |
| longitude | number |
| description | string |
| postal_code | string |
| price_range | string | Optional, e.g. '$$' or '$100–$500'. |
| service_area | array | Cities or regions served. |
| business_name | string | Legal or trading name. |
| business_type | string | The most specific schema.org type that fits, e.g. Plumber, Dentist, Restaurant, ProfessionalService. Default LocalBusiness. |
| founding_year | integer |
| social_profiles | array | Facebook, LinkedIn, Instagram, Google Business Profile, Yelp and similar URLs. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"url": {
"type": "string",
"maxLength": 300,
"description": "Business website. If given, details are pre-filled from the site."
},
"city": {
"type": "string",
"maxLength": 80
},
"faqs": {
"type": "array",
"items": {
"type": "object",
"required": [
"question",
"answer"
],
"properties": {
"answer": {
"type": "string",
"maxLength": 1000,
"minLength": 5
},
"question": {
"type": "string",
"maxLength": 200,
"minLength": 5
}
}
},
"maxItems": 10,
"description": "Optional FAQs that appear visibly on the page; adds FAQPage markup."
},
"email": {
"type": "string",
"maxLength": 200
},
"hours": {
"type": "array",
"items": {
"type": "object",
"required": [
"days",
"opens",
"closes"
],
"properties": {
"days": {
"type": "array",
"items": {
"enum": [
"mon",
"tue",
"wed",
"thu",
"fri",
"sat",
"sun"
],
"type": "string"
},
"minItems": 1,
"description": "Days with these hours: mon, tue, wed, thu, fri, sat, sun."
},
"opens": {
"type": "string",
"pattern": "^\\d{2}:\\d{2}$",
"description": "24-hour time, e.g. 08:00"
},
"closes": {
"type": "string",
"pattern": "^\\d{2}:\\d{2}$",
"description": "24-hour time, e.g. 17:00"
}
}
},
"maxItems": 7
},
"phone": {
"type": "string",
"maxLength": 40
},
"region": {
"type": "string",
"maxLength": 40,
"description": "State or region, e.g. TN."
},
"street": {
"type": "string",
"maxLength": 150
},
"country": {
"type": "string",
"maxLength": 2,
"description": "Two-letter country code, default US."
},
"latitude": {
"type": "number",
"maximum": 90,
"minimum": -90
},
"logo_url": {
"type": "string",
"format": "uri",
"maxLength": 500
},
"services": {
"type": "array",
"items": {
"type": "string",
"maxLength": 120,
"minLength": 2
},
"maxItems": 30,
"description": "Main services offered."
},
"image_url": {
"type": "string",
"format": "uri",
"maxLength": 500
},
"longitude": {
"type": "number",
"maximum": 180,
"minimum": -180
},
"description": {
"type": "string",
"maxLength": 500
},
"postal_code": {
"type": "string",
"maxLength": 20
},
"price_range": {
"type": "string",
"maxLength": 20,
"description": "Optional, e.g. '$$' or '$100–$500'."
},
"service_area": {
"type": "array",
"items": {
"type": "string",
"maxLength": 80,
"minLength": 2
},
"maxItems": 30,
"description": "Cities or regions served."
},
"business_name": {
"type": "string",
"maxLength": 120,
"description": "Legal or trading name."
},
"business_type": {
"enum": [
"LocalBusiness",
"Organization",
"ProfessionalService",
"HomeAndConstructionBusiness",
"Plumber",
"Electrician",
"HVACBusiness",
"RoofingContractor",
"GeneralContractor",
"HousePainter",
"Locksmith",
"MovingCompany",
"AutoRepair",
"AutoDealer",
"Dentist",
"Physician",
"MedicalClinic",
"Optician",
"Pharmacy",
"VeterinaryCare",
"Attorney",
"LegalService",
"AccountingService",
"FinancialService",
"InsuranceAgency",
"RealEstateAgent",
"Restaurant",
"CafeOrCoffeeShop",
"Bakery",
"BarOrPub",
"Store",
"ClothingStore",
"HardwareStore",
"FurnitureStore",
"BeautySalon",
"HairSalon",
"DaySpa",
"HealthClub",
"ChildCare",
"School",
"LodgingBusiness",
"Hotel",
"TravelAgency",
"EmploymentAgency",
"Church",
"NGO",
"Corporation"
],
"type": "string",
"description": "The most specific schema.org type that fits, e.g. Plumber, Dentist, Restaurant, ProfessionalService. Default LocalBusiness."
},
"founding_year": {
"type": "integer",
"maximum": 2100,
"minimum": 1700
},
"social_profiles": {
"type": "array",
"items": {
"type": "string",
"format": "uri",
"maxLength": 300
},
"maxItems": 15,
"description": "Facebook, LinkedIn, Instagram, Google Business Profile, Yelp and similar URLs."
}
}
}| service_area |
| string |
| Where the business works, e.g. 'Kingsport, Johnson City and Bristol, TN'. |
| business_name | string | Override the business name found on the site. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"maxLength": 300,
"minLength": 3,
"description": "The business website, e.g. example.com"
},
"email": {
"type": "string",
"maxLength": 200
},
"hours": {
"type": "string",
"maxLength": 200,
"description": "Opening hours, e.g. 'Mon–Fri 8am–5pm, Sat 9am–1pm'."
},
"phone": {
"type": "string",
"maxLength": 40
},
"address": {
"type": "string",
"maxLength": 200,
"description": "Street address, city, state and ZIP."
},
"summary": {
"type": "string",
"maxLength": 600,
"description": "Two or three sentences: what the business does, for whom, and where. Overrides the site's description."
},
"services": {
"type": "array",
"items": {
"type": "string",
"maxLength": 120,
"minLength": 2
},
"maxItems": 20,
"description": "Main services or products, one per item."
},
"key_facts": {
"type": "array",
"items": {
"type": "string",
"maxLength": 200,
"minLength": 2
},
"maxItems": 15,
"description": "Short facts AI assistants should know: years in business, licenses, starting prices, guarantees, awards."
},
"service_area": {
"type": "string",
"maxLength": 200,
"description": "Where the business works, e.g. 'Kingsport, Johnson City and Bristol, TN'."
},
"business_name": {
"type": "string",
"maxLength": 100,
"description": "Override the business name found on the site."
}
}
}| string |
| Instant quote link from build_quote, if one was created. |
| report_url | string | AI visibility report or systems map link, if one was created. |
| company_size | string | Approximate number of employees, e.g. '25' or '51–200'. |
| user_confirmed* | boolean | Must be true. Only set it after showing the user exactly what will be sent and the user agreed to share it with Holston AI. |
| preferred_contact | string | How they prefer to be contacted. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"name",
"interest",
"summary",
"user_confirmed"
],
"properties": {
"name": {
"type": "string",
"maxLength": 100,
"description": "The person's full name."
},
"email": {
"type": "string",
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
"maxLength": 200,
"description": "Email address. Provide email, phone, or both."
},
"phone": {
"type": "string",
"maxLength": 40,
"description": "Phone number."
},
"company": {
"type": "string",
"maxLength": 120,
"description": "Company or business name."
},
"summary": {
"type": "string",
"maxLength": 3000,
"minLength": 20,
"description": "What they need, in a few sentences: their situation, goals, timeline and anything already discussed (audit score, systems, budget)."
},
"interest": {
"enum": [
"website",
"seo_aeo",
"custom_app",
"ai_agent_or_automation",
"ai_receptionist",
"private_llm",
"data_integration_health_check",
"hosting_or_support",
"other"
],
"type": "string",
"description": "Main service they are interested in."
},
"location": {
"type": "string",
"maxLength": 100,
"description": "City and state, or country."
},
"best_time": {
"type": "string",
"maxLength": 120,
"description": "Best days or times to reach them."
},
"quote_url": {
"type": "string",
"format": "uri",
"maxLength": 1000,
"description": "Instant quote link from build_quote, if one was created."
},
"report_url": {
"type": "string",
"format": "uri",
"maxLength": 1000,
"description": "AI visibility report or systems map link, if one was created."
},
"company_size": {
"type": "string",
"maxLength": 40,
"description": "Approximate number of employees, e.g. '25' or '51–200'."
},
"user_confirmed": {
"type": "boolean",
"const": true,
"description": "Must be true. Only set it after showing the user exactly what will be sent and the user agreed to share it with Holston AI."
},
"preferred_contact": {
"enum": [
"email",
"phone",
"either"
],
"type": "string",
"default": "either",
"description": "How they prefer to be contacted."
}
}
}