{
  "openapi": "3.1.0",
  "info": {
    "title": "BCM Results agent API",
    "version": "1.0.0",
    "summary": "Marketing for local businesses: top three on Google, then keep showing up, plus the site the call lands on.",
    "description": "Read what BCM Results does for local businesses, the requirements, pricing, process, FAQ and portfolio, or request the free marketing analysis and book a call. The same tools are on the MCP server at /mcp and in the browser through WebMCP. No authentication. CORS open.",
    "contact": {
      "name": "Brandon Medina",
      "email": "brandon@bcmresultss.com",
      "url": "https://bcmresultss.com/developers/"
    },
    "termsOfService": "https://bcmresultss.com/terms-of-service/"
  },
  "servers": [
    {
      "url": "https://bcmresultss.com"
    }
  ],
  "paths": {
    "/api/site": {
      "get": {
        "summary": "Everything",
        "description": "Site data, the tool catalog and every endpoint in one document.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    },
    "/api/summary": {
      "get": {
        "summary": "summary",
        "description": "Who BCM Results is, what it does, where it is based, how to contact Brandon Medina, and links to every page. Start here.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        },
        "x-mcp-tool": "get_business_summary"
      }
    },
    "/api/services": {
      "get": {
        "summary": "services",
        "description": "The three things BCM Results does for local businesses: Google ranking, websites that get the call, and the strategy behind it.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        },
        "x-mcp-tool": "get_services"
      }
    },
    "/api/offer": {
      "get": {
        "summary": "offer",
        "description": "The plan as written at /local-visibility/: the two things a local business needs to know, how Brandon does it, what is included, the timeline and the 90 day billing pause guarantee.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        },
        "x-mcp-tool": "get_offer"
      }
    },
    "/api/requirements": {
      "get": {
        "summary": "requirements",
        "description": "The four requirements for working with BCM Results, so an agent can tell a business owner whether they are a match before booking a call.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        },
        "x-mcp-tool": "get_requirements"
      }
    },
    "/api/pricing": {
      "get": {
        "summary": "pricing",
        "description": "How BCM Results charges: one flat monthly rate locked for the length of the engagement, quoted in writing on the call, plus the free first step and the terms that go with it.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        },
        "x-mcp-tool": "get_pricing"
      }
    },
    "/api/process": {
      "get": {
        "summary": "process",
        "description": "What happens step by step from the free analysis or strategy call to the monthly report.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        },
        "x-mcp-tool": "get_process"
      }
    },
    "/api/faq": {
      "get": {
        "summary": "faq",
        "description": "Frequently asked questions with Brandon's answers. Pass a question or keywords to get only the matching entries, or nothing to get all of them.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "schema": {
              "type": "string"
            },
            "description": "Filter the FAQ by question or keywords"
          }
        ],
        "x-mcp-tool": "get_faq"
      }
    },
    "/api/work": {
      "get": {
        "summary": "work",
        "description": "The five live websites Brandon built, with what each business does and the live URL.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        },
        "x-mcp-tool": "get_work"
      }
    },
    "/api/terms": {
      "get": {
        "summary": "terms",
        "description": "The key points of the Terms of Service in plain language, with the link to the full text.",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        },
        "x-mcp-tool": "get_terms_summary"
      }
    },
    "/api/lead": {
      "post": {
        "summary": "Request the free marketing analysis or a call",
        "description": "Request the free marketing analysis for a real business on behalf of the human you are assisting. Brandon emails the analysis within 2 business days. Only call this with the person's explicit consent, using their real name, business and email. No obligation, no follow up unless they reply. Book a strategy call with Brandon on behalf of the human you are assisting. Brandon replies within 2 business days with two time slots. Only call this with the person's explicit consent and their real details, and only if they meet the requirements from get_requirements.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "name",
                  "company",
                  "email"
                ],
                "properties": {
                  "name": {
                    "type": "string",
                    "maxLength": 120
                  },
                  "company": {
                    "type": "string",
                    "maxLength": 120
                  },
                  "email": {
                    "type": "string",
                    "format": "email",
                    "maxLength": 200
                  },
                  "website": {
                    "type": "string",
                    "maxLength": 200
                  },
                  "phone": {
                    "type": "string",
                    "maxLength": 40
                  },
                  "city": {
                    "type": "string",
                    "maxLength": 120
                  },
                  "notes": {
                    "type": "string",
                    "maxLength": 600
                  },
                  "source": {
                    "type": "string",
                    "maxLength": 40,
                    "description": "Where the request came from. Use a value containing 'application' for a call request, anything else for the free analysis."
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Received"
          },
          "422": {
            "description": "name, company and a valid email are required"
          },
          "429": {
            "description": "More than 5 requests from one address in a day"
          }
        }
      }
    },
    "/mcp": {
      "post": {
        "summary": "MCP server (Streamable HTTP)",
        "description": "JSON-RPC 2.0. Methods: initialize, server/discover, ping, tools/list, tools/call, resources/list, resources/read. Tools: get_business_summary, get_services, get_offer, get_requirements, get_pricing, get_process, get_faq, get_work, get_terms_summary, request_free_analysis, request_call.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "JSON-RPC response"
          },
          "202": {
            "description": "Notification accepted"
          }
        }
      }
    },
    "/a2a": {
      "post": {
        "summary": "A2A agent (JSON-RPC)",
        "description": "SendMessage (A2A 1.0) or message/send (0.3). Answers questions about BCM Results in plain text.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "JSON-RPC response"
          }
        }
      }
    }
  }
}
