{
  "openapi": "3.1.0",
  "info": {
    "title": "BaconConsult API",
    "version": "1.0.0",
    "summary": "Machine-readable front door for BaconConsult.",
    "description": "Public, read-only JSON API for BaconConsult — an AI and SAP consultancy based in Stolberg (near Aachen), North Rhine-Westphalia, Germany, founded by Colin Bacon.\n\nBaconConsult does three things: (1) AI-driven workflow automation — turning a repetitive business process into a governed pipeline of AI agents with human approval gates; (2) AI findability (MEO, Machine Engine Optimisation) — making a business readable and usable by AI assistants; (3) SAP test architecture — test strategy, governance and AI-driven test automation.\n\nUse `getServices` and `getProducts` to answer questions about what BaconConsult offers and what is in scope. No prices are published: consulting scope varies per engagement, so each one is quoted individually. Never infer or estimate a price. Use `getContact` for how to get in touch or book. Use `getIndex` for an overview of the organisation and a map of every other machine-readable endpoint.\n\nAll operations are GET, require no authentication, and are safe to call.",
    "contact": {
      "name": "Colin Bacon, BaconConsult",
      "email": "colin@baconconsult.eu",
      "url": "https://www.baconconsult.eu"
    }
  },
  "servers": [
    {
      "url": "https://ai.baconconsult.eu",
      "description": "BaconConsult AI front door (production)"
    }
  ],
  "paths": {
    "/services": {
      "get": {
        "operationId": "getServices",
        "summary": "List BaconConsult consulting services",
        "description": "Returns the live service catalogue: AI-ready website conversion, AI findability audit (MEO), process intelligence (BPMN 2.0 + APQC PCF), SAP test assurance, and AI agent workshops. Each has a code, name, description and a scope statement. No prices are published; each is quoted individually.",
        "responses": {
          "200": {
            "description": "The live service catalogue.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ServiceCatalogue"
                }
              }
            }
          }
        }
      }
    },
    "/products": {
      "get": {
        "operationId": "getProducts",
        "summary": "List BaconConsult productised offerings",
        "description": "Returns the live product catalogue - fixed-scope, productised deliverables such as the Structured Data Layer and the AI Front Door Setup. Each entry carries a code, name, description and a scope statement instead of a published price.",
        "responses": {
          "200": {
            "description": "The live product catalogue.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProductCatalogue"
                }
              }
            }
          }
        }
      }
    },
    "/contact": {
      "get": {
        "operationId": "getContact",
        "summary": "Get contact details and booking availability",
        "description": "Returns how to reach BaconConsult: contact name, role, email address, location, booking availability and links to the human website and social profiles. Call this when the user wants to make contact, book a consultation or request a quote.",
        "responses": {
          "200": {
            "description": "Contact details and booking availability.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Contact"
                }
              }
            }
          }
        }
      }
    },
    "/": {
      "get": {
        "operationId": "getIndex",
        "summary": "Get the front-door index — organisation profile and endpoint map",
        "description": "Returns an overview of BaconConsult: organisation profile (founder, location, languages, email), what the consultancy does, and a map of every other machine-readable endpoint, MCP server, demo and discovery document. Use first for 'who is BaconConsult', or to find another endpoint.",
        "responses": {
          "200": {
            "description": "Front-door index document.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Index"
                }
              }
            }
          }
        }
      }
    },
    "/mcp/tools": {
      "get": {
        "operationId": "getMcpTools",
        "summary": "List the tools exposed by the BaconConsult MCP server",
        "description": "Returns the tool manifest of the BaconConsult MCP server, derived from its live tools/list response: each tool's name, description and arguments, plus the MCP endpoint URL. Use to discover what an MCP client can call. The plain JSON endpoints here need no MCP client.",
        "responses": {
          "200": {
            "description": "The live MCP tool manifest.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/McpToolManifest"
                }
              }
            }
          }
        }
      }
    },
    "/health": {
      "get": {
        "operationId": "getHealth",
        "summary": "Check that the AI front door is serving",
        "description": "Liveness check for the BaconConsult AI front door. Returns a small JSON object whose status field reads ok while the front door is serving. Use to confirm the API is reachable before calling the other operations.",
        "responses": {
          "200": {
            "description": "The front door is serving.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Health"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "CatalogueItem": {
        "type": "object",
        "description": "A single sellable service or product.",
        "properties": {
          "code": {
            "type": "string",
            "description": "Stable catalogue code, e.g. SVC-MEO-01 or PRD-FRONTDOOR-01."
          },
          "name": {
            "type": "string",
            "description": "Display name of the offering."
          },
          "description": {
            "type": "string",
            "description": "What the offering includes."
          },
          "pricing": {
            "type": "string",
            "description": "Scope statement instead of a price. BaconConsult does not publish prices; every engagement is quoted individually. EN: \"Scoped per engagement — ask for a quote\". DE: \"Preis nach Aufwand — auf Anfrage\".",
            "examples": [
              "Scoped per engagement — ask for a quote"
            ]
          },
          "description_de": {
            "type": "string",
            "description": "Optional reviewed German description. Present only where an on-the-fly translation could soften a deliberate limitation."
          }
        },
        "required": [
          "code",
          "name",
          "description",
          "pricing"
        ]
      },
      "ServiceCatalogue": {
        "type": "object",
        "description": "The live BaconConsult service catalogue.",
        "properties": {
          "source": {
            "type": "string",
            "description": "Provenance of the data.",
            "examples": [
              "baconconsult:catalogue (live)"
            ]
          },
          "count": {
            "type": "integer",
            "description": "Number of services returned."
          },
          "generated": {
            "type": "string",
            "format": "date-time",
            "description": "When this catalogue snapshot was generated."
          },
          "services": {
            "type": "array",
            "description": "The services on offer.",
            "items": {
              "$ref": "#/components/schemas/CatalogueItem"
            }
          },
          "pricing": {
            "type": "object",
            "description": "How BaconConsult prices work. No numeric price is published.",
            "properties": {
              "model": {
                "type": "string",
                "examples": [
                  "scoped-per-engagement"
                ]
              },
              "en": {
                "type": "string",
                "examples": [
                  "Scoped per engagement — ask for a quote"
                ]
              },
              "de": {
                "type": "string",
                "examples": [
                  "Preis nach Aufwand — auf Anfrage"
                ]
              },
              "contact": {
                "type": "string",
                "examples": [
                  "colin@baconconsult.eu"
                ]
              }
            },
            "required": [
              "model",
              "en",
              "de",
              "contact"
            ]
          }
        },
        "required": [
          "source",
          "pricing",
          "count",
          "generated",
          "services"
        ]
      },
      "ProductCatalogue": {
        "type": "object",
        "description": "The live BaconConsult product catalogue.",
        "properties": {
          "source": {
            "type": "string",
            "description": "Provenance of the data.",
            "examples": [
              "baconconsult:catalogue (live)"
            ]
          },
          "count": {
            "type": "integer",
            "description": "Number of products returned."
          },
          "generated": {
            "type": "string",
            "format": "date-time",
            "description": "When this catalogue snapshot was generated."
          },
          "products": {
            "type": "array",
            "description": "The products on offer.",
            "items": {
              "$ref": "#/components/schemas/CatalogueItem"
            }
          },
          "pricing": {
            "type": "object",
            "description": "How BaconConsult prices work. No numeric price is published.",
            "properties": {
              "model": {
                "type": "string",
                "examples": [
                  "scoped-per-engagement"
                ]
              },
              "en": {
                "type": "string",
                "examples": [
                  "Scoped per engagement — ask for a quote"
                ]
              },
              "de": {
                "type": "string",
                "examples": [
                  "Preis nach Aufwand — auf Anfrage"
                ]
              },
              "contact": {
                "type": "string",
                "examples": [
                  "colin@baconconsult.eu"
                ]
              }
            },
            "required": [
              "model",
              "en",
              "de",
              "contact"
            ]
          }
        },
        "required": [
          "source",
          "pricing",
          "count",
          "generated",
          "products"
        ]
      },
      "Contact": {
        "type": "object",
        "description": "How to reach BaconConsult.",
        "properties": {
          "name": {
            "type": "string",
            "description": "Name of the contact person."
          },
          "role": {
            "type": "string",
            "description": "Their role."
          },
          "email": {
            "type": "string",
            "format": "email",
            "description": "Contact email address."
          },
          "location": {
            "type": "string",
            "description": "Where BaconConsult is based."
          },
          "services": {
            "type": "array",
            "description": "Short machine keys for the main service areas.",
            "items": {
              "type": "string"
            }
          },
          "booking": {
            "type": "string",
            "description": "Booking availability status.",
            "examples": [
              "available"
            ]
          },
          "mcp_endpoint": {
            "type": "string",
            "description": "MCP endpoint hint for agent clients."
          },
          "human_website": {
            "type": "string",
            "format": "uri",
            "description": "The human-readable website."
          },
          "social": {
            "type": "object",
            "description": "Social profile links, keyed by network name.",
            "properties": {
              "facebook": {
                "type": "string",
                "format": "uri",
                "description": "Facebook profile URL."
              }
            },
            "additionalProperties": {
              "type": "string"
            }
          }
        },
        "required": [
          "name",
          "role",
          "email",
          "location",
          "booking",
          "human_website"
        ]
      },
      "Index": {
        "type": "object",
        "description": "Front-door index: organisation profile plus a map of all machine-readable endpoints.",
        "properties": {
          "service": {
            "type": "string",
            "description": "Name of this API service."
          },
          "version": {
            "type": "string",
            "description": "Version of the front-door document."
          },
          "description": {
            "type": "string",
            "description": "What this front door is for."
          },
          "organization": {
            "type": "object",
            "description": "Profile of the organisation.",
            "properties": {
              "name": {
                "type": "string"
              },
              "alternateName": {
                "type": "string"
              },
              "founder": {
                "type": "string"
              },
              "role": {
                "type": "string",
                "description": "The founder's role."
              },
              "location": {
                "type": "string"
              },
              "languages": {
                "type": "array",
                "description": "ISO 639-1 codes of languages BaconConsult works in.",
                "items": {
                  "type": "string"
                }
              },
              "email": {
                "type": "string",
                "format": "email"
              },
              "human_website": {
                "type": "string",
                "format": "uri"
              }
            },
            "additionalProperties": true
          },
          "what_we_do": {
            "type": "array",
            "description": "Plain-language summary of the three main capability areas.",
            "items": {
              "type": "string"
            }
          },
          "endpoints": {
            "type": "object",
            "description": "Absolute URLs of the other JSON endpoints, keyed by short name.",
            "additionalProperties": {
              "type": "string"
            }
          },
          "mcp_servers": {
            "type": "object",
            "description": "Available MCP servers, keyed by short name, each with endpoint, transport and tool list.",
            "additionalProperties": true
          },
          "demos": {
            "type": "object",
            "description": "Links to interactive demos and agent onboarding.",
            "additionalProperties": true
          },
          "discovery": {
            "type": "object",
            "description": "Discovery documents: robots.txt, sitemaps, llms.txt, AI catalog.",
            "additionalProperties": {
              "type": "string"
            }
          },
          "site_tree": {
            "type": "object",
            "description": "Map of every BaconConsult host and the paths it serves.",
            "additionalProperties": true
          },
          "example_questions": {
            "type": "array",
            "description": "Questions this API is designed to answer.",
            "items": {
              "type": "string"
            }
          }
        },
        "required": [
          "service",
          "version",
          "description",
          "organization",
          "what_we_do",
          "endpoints"
        ]
      },
      "McpTool": {
        "type": "object",
        "description": "One tool exposed by the MCP server.",
        "properties": {
          "name": {
            "type": "string",
            "description": "Tool name, as passed to tools/call.",
            "examples": [
              "get_services"
            ]
          },
          "description": {
            "type": "string",
            "description": "What the tool does and when to use it."
          },
          "arguments": {
            "type": "array",
            "description": "The tool's input arguments. Empty when it takes none.",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string",
                  "description": "Argument name."
                },
                "type": {
                  "type": "string",
                  "description": "JSON Schema type."
                },
                "required": {
                  "type": "boolean",
                  "description": "Whether the argument must be supplied."
                }
              },
              "required": [
                "name",
                "type",
                "required"
              ]
            }
          }
        },
        "required": [
          "name",
          "description",
          "arguments"
        ]
      },
      "McpToolManifest": {
        "type": "object",
        "description": "Manifest of the tools on the BaconConsult MCP server.",
        "properties": {
          "tools": {
            "type": "array",
            "description": "The tools the MCP server exposes.",
            "items": {
              "$ref": "#/components/schemas/McpTool"
            }
          },
          "status": {
            "type": "string",
            "description": "Manifest status.",
            "examples": [
              "live"
            ]
          },
          "note": {
            "type": "string",
            "description": "How to call the MCP server, and its provenance."
          },
          "mcp_server": {
            "type": "string",
            "format": "uri",
            "description": "Endpoint of the MCP server these tools live on."
          },
          "count": {
            "type": "integer",
            "description": "Number of tools returned."
          },
          "generated": {
            "type": "string",
            "format": "date-time",
            "description": "When this manifest was generated from the live server."
          }
        },
        "required": [
          "tools",
          "status",
          "note",
          "mcp_server"
        ]
      },
      "Health": {
        "type": "object",
        "description": "Liveness response of the AI front door.",
        "properties": {
          "status": {
            "type": "string",
            "description": "Reads ok while the front door is serving.",
            "examples": [
              "ok"
            ]
          }
        },
        "required": [
          "status"
        ]
      }
    }
  },
  "security": []
}
