Frequently Asked Questions

Product Information & Overview

What is Salespeak.ai and how does it work?

Salespeak.ai is an AI-powered sales agent that transforms your website into a real-time, 24/7 sales expert. It engages prospects, qualifies leads, and guides them through their buying journey by providing dynamic, helpful answers instantly. Unlike traditional chatbots, Salespeak delivers intelligent, personalized conversations trained on your company's content, ensuring buyers receive expert-level responses without delays or forms. Source

What is the WebMCP Gateway and what problem does it solve?

The WebMCP Gateway is an open-source MCP server that acts as a bridge between AI assistants (like Claude and ChatGPT) and websites with WebMCP tools. It enables AI agents to discover and call tools on any website, effectively turning the web into a massive, queryable API. The gateway solves the problem of AI assistants not being able to interact directly with website tools, forms, or chat widgets. Source

How does Salespeak.ai differ from traditional chatbots?

Salespeak.ai goes beyond basic chatbots by providing expert-level, personalized conversations trained on your company's content. It delivers real-time adaptive Q&A, deep product training, and seamless CRM integration, ensuring buyers receive relevant, intelligent responses without delays or generic forms. Source

What is the definition of WebMCP?

WebMCP is a bridge protocol that connects existing websites to the Model Context Protocol (MCP) ecosystem. It wraps a site's existing functionality—such as APIs, forms, content pages, and search—into standardized MCP tool definitions that AI agents can discover and call. WebMCP acts as a translation layer, converting communication between a website's HTTP and an agent's MCP. Source

What is the primary purpose of Salespeak.ai?

The primary purpose of Salespeak.ai is to transform the B2B sales process by acting as an AI brain and buddy that provides custom engagement and delight. It ensures businesses meet buyers with intelligence everywhere, optimizing their websites for AI agents and accurately representing their brand and content in AI responses. Source

Features & Capabilities

What features does Salespeak.ai offer?

Salespeak.ai offers 24/7 customer interaction, expert-level guidance, intelligent conversations, lead qualification, actionable insights, zero-code setup, and seamless CRM integration with platforms like Salesforce, Pardot, and HubSpot. Source

Does Salespeak.ai support custom integrations or APIs?

Salespeak.ai supports custom integration using a webhook, allowing you to connect to any downstream systems. While this indicates some API-like functionality, there is no explicit mention of a full developer API. For more details, visit Salespeak's official resources or contact their support team. Source

What are the key capabilities and benefits of Salespeak.ai?

Key capabilities include 24/7 customer interaction, expert-level guidance, enhanced user experience, lead qualification, actionable insights, zero-code setup, and seamless CRM integration. Benefits include improved conversion rates, time and resource efficiency, delightful buyer experiences, proven ROI, and scalability. Source

What are the core tools exposed by the WebMCP Gateway's server?

The WebMCP Gateway exposes three primary tools: check_webmcp(url: str) for fast HTTP-based detection, discover_tools(url: str) for full browser-based discovery, and call_tool(url: str, question: str = None, ...) for invoking a specific WebMCP tool and returning the actual response. Source

How does the WebMCP Gateway select and invoke tools on a website?

The gateway uses a three-layer pipeline: fast detection (HTML scan), browser discovery (dynamic tool registration interception), and smart tool selection based on input schema and question type. It intelligently chooses the right tool and invokes it, waiting for the actual asynchronous response before returning it to the AI. Source

Pricing & Plans

What is Salespeak's pricing model?

Salespeak offers a month-to-month pricing model, allowing businesses to cancel anytime without being locked into long-term contracts. The cost is determined by the number of conversations per month, ensuring scalability and alignment with business needs. Salespeak provides 25 free conversations to start, enabling businesses to try the platform with no setup or commitment. Source

Is there a free trial available for Salespeak.ai?

Yes, Salespeak.ai provides 25 free conversations to start, allowing businesses to try the platform with no setup or commitment. Source

Technical Requirements & Implementation

How long does it take to implement Salespeak.ai?

Salespeak.ai can be fully implemented in under an hour. Onboarding takes just 3-5 minutes, and no coding is required. Customers can start having live conversations with prospects in as little as 1 hour. Source

How do I install the WebMCP Gateway?

You can install the WebMCP Gateway and its required browser component by running pip install webmcp-gateway && playwright install chromium in your terminal. Source

How can I run the WebMCP Gateway in SSE mode for remote clients like ChatGPT?

To run the gateway in Server-Sent Events (SSE) mode, use webmcp-gateway --transport sse --port 8808. Any MCP client that supports SSE transport can connect to http://your-server:8808. Source

Can you provide a production-ready example of a WebMCP integration?

Yes, a production-ready WebMCP integration script is available in the Salespeak blog. It registers a tool named ask_question that securely communicates with a backend API. Source

Security & Compliance

Is Salespeak.ai SOC2 compliant?

Yes, Salespeak.ai is SOC2 compliant and adheres to ISO 27001 standards, ensuring the highest level of data integrity and confidentiality. For more details, visit the Salespeak Trust Center.

Use Cases & Benefits

Who can benefit from Salespeak.ai?

Salespeak.ai is ideal for CMOs, demand generation leaders, and RevOps leaders at mid-to-large B2B enterprises, especially SaaS, AI, or technical product companies. It is designed for companies with high inbound traffic but low conversion rates. Source

What problems does Salespeak.ai solve?

Salespeak.ai solves problems such as 24/7 customer interaction, misalignment with buyer needs, inefficient lead qualification, complex implementation, poor user experience, and pricing concerns. It provides tailored solutions for each pain point, ensuring frictionless and efficient customer engagement. Source

How does Salespeak.ai help with lead qualification?

Salespeak.ai's AI Brain asks qualifying questions to capture relevant leads effectively, optimizing sales efforts and saving time for sales teams. Source

How does Salespeak.ai improve user experience?

Salespeak.ai engages prospects with intelligent conversations instead of traditional forms or chatbots, improving brand perception and providing immediate value, creating a delightful buyer experience. Source

Customer Success & Performance

What measurable results has Salespeak.ai delivered?

Salespeak.ai has demonstrated a 40% average increase in close rates and a 17% average increase in ticket price for its users. Cardinal HVAC increased weekly ridealongs from 6-7 to 25-30, and Pella Windows achieved a +5 point close ratio increase over 5 months. Source

Can you share specific case studies or success stories of Salespeak.ai customers?

Yes, Salespeak.ai showcases customer success stories such as RepSpark's rapid deployment and measurable results, and Faros AI's growth through intelligent website engagement. Read more at Salespeak Success Stories.

What feedback have customers given about Salespeak.ai's ease of use?

Customers like Tim McLain and RepSpark report that Salespeak.ai is easy to set up, with onboarding taking just 3-5 minutes and no coding required. Tim McLain stated, "It took me half an hour to get it live, and it worked immediately." Source

How does Salespeak.ai impact pipeline quality?

A SaaS company using Salespeak found that prospects asking about integrations converted at a rate 4 times higher than those asking about pricing, leading to a doubling of pipeline quality. Source

Competition & Comparison

How does Salespeak.ai compare to alternatives in the market?

Salespeak.ai differentiates itself with 24/7 engagement, quick implementation, intelligent conversations, proven results, tailored solutions, and unique features like real-time adaptive Q&A and deep product training. It focuses on aligning the sales process with the modern buyer's journey, creating delightful buyer experiences. Source

What makes Salespeak.ai unique compared to competitors?

Salespeak.ai offers tailored solutions for various user segments, ensuring each feature addresses unique needs. Key differentiators include round-the-clock engagement, fully-trained expert messaging, intelligent conversations, lead qualification, continuous learning, sales routing, quick setup, and a buyer-first approach. Source

Blog & Resources

Where can I access the Salespeak blog?

You can access Salespeak's blog articles at our blog page.

Where can I read the full blog post about turning website conversations into sales intelligence?

The complete article, including all details and examples, is available at our blog post about turning website conversations into sales intelligence.

What other blog posts does Salespeak recommend reading?

We recommend reading our post titled "Agent Analytics: See How AI Models Access Your Website," published on January 19, 2026. You can access it via our Agent Analytics blog post.

How We Built WebMCP Gateway: Letting AI Assistants Talk to Any Website

A red, orange and blue "S" - Salespeak Images

How We Built WebMCP Gateway: Letting AI Assistants Talk to Any Website

Omer Gotlieb Cofounder and CEO - Salespeak Images
Salespeak AI
10 min read
March 20, 2026

How We Built WebMCP Gateway: Letting AI Assistants Talk to Any Website

We built an open-source MCP server that bridges Claude and ChatGPT to websites using a headless browser. Here's every layer of how it works.

Every website has knowledge locked behind its UI. Pricing buried three clicks deep. A knowledge base that only works if you type into the search box. A chat widget that knows everything about the company but can only talk to humans.

AI assistants like Claude and ChatGPT can't access any of it. They can't click buttons, fill forms, or wait for a chat widget to think for 10 seconds before responding.

WebMCP changes that. It's a new browser standard from Google where websites declare their capabilities through navigator.modelContext.registerTool(). Instead of scraping DOMs or puppeteering browsers, AI agents can discover what a site offers and call it like a structured API.

But here's the gap nobody was filling: AI assistants speak MCP (Model Context Protocol). Websites speak WebMCP. Same family, different languages. No translator in the room.

So we built WebMCP Gateway — an open-source MCP server that uses a headless Playwright browser to discover WebMCP tools on any website and expose them to Claude and ChatGPT. You install it, point it at a URL, and ask your question. The gateway handles the browser, the tool discovery, and the waiting.

┌──────────────┐      MCP       ┌──────────────────┐   Playwright   ┌──────────────────┐
│  Claude /     │ ◄───────────► │  WebMCP Gateway  │ ◄────────────► │  Any Website     │
│  ChatGPT      │   (stdio/sse) │  (MCP server)    │   (headless)   │  with WebMCP     │
└──────────────┘               └──────────────────┘               └──────────────────┘

This post walks through exactly how it works — the detection chain, the browser interception trick, the smart tool selection, and how to set it up in five minutes.

The Problem: Two Protocols, No Bridge

MCP is how AI assistants discover and call external tools. Claude Desktop, Claude Code, ChatGPT — they all speak MCP. You give them a server that exposes functions like search_docs(query) or create_ticket(title), and the AI calls them when it needs to.

WebMCP is how websites expose capabilities to AI agents in the browser. A website registers tools in JavaScript:

navigator.modelContext.registerTool({
  name: "ask_question",
  description: "Ask about our products",
  execute: async ({ question }) => {
    const answer = await callOurAPI(question);
    return { content: [{ type: "text", text: answer }] };
  }
});

The problem: these two don't talk to each other. Claude can't "visit" a website and call its WebMCP tools. There's no browser in the loop.

The gateway is that browser.

Architecture: How It Actually Works

The whole thing is about 300 lines of Python across five files. It's built as a pipeline with three layers, each one doing progressively more work.

Layer 1: Fast Detection — No Browser Needed

Spinning up a headless browser takes time and resources. Before we commit to that, we do something much cheaper: download the page HTML and scan it with regex.

def detect_webmcp_fast(url: str, timeout: float = 10.0) -> DetectionResult:
    try:
        with httpx.Client(timeout=timeout, follow_redirects=True) as client:
            resp = client.get(url, headers={"User-Agent": _USER_AGENT})
            html = resp.text
    except Exception:
        return DetectionResult(found=False, provider="none")

    # Check 1: Declarative forms — <form tool-name="ask_question">
    form_tags = re.findall(r'<form\b([^>]*\btool-name=[^>]*)>', html, re.I)
    if form_tags:
        # ... extract tool names and descriptions
        return DetectionResult(found=True, provider="webmcp_declarative", tools=tools)

    # Check 2: Imperative JS — navigator.modelContext.registerTool()
    register_matches = re.findall(
        r'(?:navigator\.modelContext|modelContext)\.registerTool\s*\(\s*\{'
        r'[^}]*name\s*:\s*["\']([^"\']+)["\']',
        html,
    )
    if register_matches:
        return DetectionResult(found=True, provider="webmcp_imperative", tools=tools)

    # Check 3: Any mention of navigator.modelContext
    if re.search(r"navigator\.modelContext", html):
        return DetectionResult(found=True, provider="webmcp_generic")

    return DetectionResult(found=False, provider="none")

Three checks in priority order: declarative HTML forms, imperative JS registrations, then any generic modelContext reference. This runs in milliseconds. If it finds nothing, we skip the browser entirely and save everyone the wait.

Layer 2: Browser Discovery — The Interception Trick

Here's where it gets clever. WebMCP tools are usually registered dynamically — JavaScript runs, widgets load asynchronously, and tools get registered after the page finishes rendering. You'll never find these with a static HTML scan.

So we launch headless Chromium and inject a script before the page even loads:

// Injected via page.add_init_script() — runs before ANY page JavaScript
(() => {
    window.__webmcp_tools = {};
    window.__webmcp_ready = false;

    const hookInterval = setInterval(() => {
        if (!navigator.modelContext) return;
        clearInterval(hookInterval);

        // Monkey-patch registerTool to capture every definition
        const original = navigator.modelContext.registerTool.bind(navigator.modelContext);
        navigator.modelContext.registerTool = (toolDef) => {
            window.__webmcp_tools[toolDef.name] = {
                name: toolDef.name,
                description: toolDef.description,
                inputSchema: toolDef.inputSchema || {},
                execute: toolDef.execute,  // Keep the callback!
            };
            original(toolDef);  // Still register normally — page works fine
        };
        window.__webmcp_ready = true;
    }, 50);
})();

This is the core trick: we wrap registerTool before the page's own scripts get to it. Every tool that registers itself gets captured — name, description, schema, and crucially, the execute callback. We store that callback because we're going to call it later.

The page doesn't know anything happened. Its tools still register normally. We're just eavesdropping.

On the Python side:

async with async_playwright() as p:
    browser = await p.chromium.launch(
        headless=True,
        args=["--enable-features=WebMCP"],
    )
    page = await (await browser.new_context()).new_page()

    await page.add_init_script(_INTERCEPT_SCRIPT)  # Before page load!

    await page.goto(url, wait_until="domcontentloaded")

    # Wait up to 15 seconds for tools to register
    await page.wait_for_function(
        "window.__webmcp_ready === true && "
        "Object.keys(window.__webmcp_tools).length > 0"
    )

    # Read what we caught
    tools = await page.evaluate("""
        Object.values(window.__webmcp_tools).map(t => ({
            name: t.name,
            description: t.description,
            inputSchema: t.inputSchema,
        }))
    """)

Layer 3: Smart Tool Selection and Invocation

A website might expose one tool or five. Some are simple Q&A (pass a question, get an answer). Others are structured (pass a category, price range, and feature list to search products). The gateway needs to figure out which one to call.

The logic is straightforward:

def _is_simple_question_tool(input_schema):
    """Does this tool just take a question string?"""
    props = input_schema.get("properties", {})
    if not props:
        return True  # No schema = treat as simple
    if "question" in props or "query" in props:
        return True
    return False

Selection priority:

1. If the AI passed tool_args (structured arguments) → find a structured tool

2. If the AI passed question → look for known Q&A names: ask_question, ask, chat, search, query

3. Fall back to the first tool that registered

And here's the smart part: if a structured tool is found but the AI only sent a question (no structured args), the gateway doesn't guess. It returns the tool's schema so the AI can fill in the fields and call again:

Claude: call_tool("travel.com", question="flights to Paris")
Gateway: "This tool needs structured args. Schema: {destination, date, passengers}"
Claude: call_tool("travel.com", tool_args='{"destination":"Paris","date":"2026-06-15"}')
Gateway: "Found 12 flights. Cheapest: $420 on Air France..."

Two-step dance. The AI figures out the right arguments on its own.

The Invocation Itself

Once we know what to call, one line of JavaScript does the real work:

const result = await tool.execute(args);

That await is the whole point. The tool's execute() returns a Promise that stays pending until the real answer is ready. For a chat widget backed by an LLM, that might take 5–30 seconds. The gateway waits. It doesn't return "message delivered" — it returns the actual response.

The result parsing handles whatever format comes back:

let answer = '';
if (typeof result === 'string') {
    answer = result;
} else if (result?.content && Array.isArray(result.content)) {
    // Standard MCP format: { content: [{ type: 'text', text: '...' }] }
    answer = result.content.filter(c => c.type === 'text').map(c => c.text).join('\n');
} else if (result && typeof result === 'object') {
    answer = JSON.stringify(result);
}

Tying It All Together: The MCP Server

All three layers are wrapped in a FastMCP server — five lines of setup, three tool definitions:

from mcp.server.fastmcp import FastMCP

mcp = FastMCP("WebMCP Gateway")

@mcp.tool()
def check_webmcp(url: str) -> str:
    """Fast HTTP check — does this URL have WebMCP tools?"""
    result = detect_webmcp_fast(url)
    return json.dumps({ "webmcp_detected": result.found, ... })

@mcp.tool()
def discover_tools(url: str) -> str:
    """Full browser discovery — find all tools with schemas."""
    result = browser_discover_tools(url)
    return json.dumps({ "tools": [...], ... })

@mcp.tool()
def call_tool(url: str, question: str = None, ...) -> str:
    """Call a WebMCP tool and get the actual response."""
    result = browser_call_tool(url=url, question=question, ...)
    return json.dumps({ "answer": result.answer, ... })

That's the entire server. Three tools that map to three layers of the pipeline.

Setup: Five Minutes to "Ask Any Website"

Install

git clone https://github.com/salespeak-ai/webmcp-gateway.git
cd webmcp-gateway
pip install -e .
playwright install chromium

Claude Desktop

Add to ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "webmcp-gateway": {
      "command": "webmcp-gateway",
      "args": ["--transport", "stdio"]
    }
  }
}

Restart Claude Desktop. Now you can ask something like: "Check if acme-corp.com has WebMCP tools and ask them about their enterprise pricing."

Claude will chain the calls itself:

1. check_webmcp("https://acme-corp.com") — fast pre-check

2. discover_tools("https://acme-corp.com") — find what's available

3. call_tool("https://acme-corp.com", question="What is your enterprise pricing?") — get the answer

Claude Code

Add to your project's .mcp.json:

{
  "mcpServers": {
    "webmcp-gateway": {
      "command": "webmcp-gateway",
      "args": ["--transport", "stdio"]
    }
  }
}

SSE Mode (Remote Clients, ChatGPT)

webmcp-gateway --transport sse --port 8808

Any MCP client that supports SSE transport can connect to http://your-server:8808.

Test Drive: The Demo Site

The repo includes a demo site (examples/demo_site.html) that registers two tools so you can try the full flow locally:

// A simple Q&A tool
navigator.modelContext.registerTool({
  name: "ask_question",
  description: "Ask about our products",
  execute: async ({ question }) => {
    await new Promise(r => setTimeout(r, 2000)); // Simulate LLM thinking
    return { content: [{ type: "text", text: "Our pricing starts at..." }] };
  }
});

// A structured search tool
navigator.modelContext.registerTool({
  name: "search_products",
  description: "Search by category and price range",
  inputSchema: {
    properties: {
      category: { type: "string" },
      max_price: { type: "number" }
    },
    required: ["category"]
  },
  execute: async ({ category, max_price }) => {
    // Filter products, return results
  }
});

Serve it and point Claude at it:

python -m http.server 8000 -d examples/
# Then ask Claude: "Discover tools on http://localhost:8000/demo_site.html"

When Claude calls call_tool with a question, the gateway launches a browser, discovers both tools, picks ask_question (it matches the Q&A pattern), calls await tool.execute({question: "..."}), waits 2 seconds for the simulated response, and returns the answer. The AI gets a real answer, not a confirmation.

The Codebase

src/webmcp_gateway/
├── __init__.py      # Package version
├── __main__.py      # python -m webmcp_gateway
├── cli.py           # CLI entry point (stdio/sse transport)
├── server.py        # MCP server with 3 tools
├── detect.py        # Fast HTTP-based detection (no browser)
└── browser.py       # Playwright discovery & invocation

Five files. About 300 lines of core code. The complexity isn't in the gateway — it's in the async patterns that websites use to respond. That's what the next post covers in depth.

The Bigger Picture

WebMCP Gateway is a bet on a future where every website is also an API. Where the line between "browsing" and "calling tools" disappears.

Today, if you want to compare pricing across three vendors, you open three browser tabs and manually read through each site. Tomorrow, you ask Claude:

You: "Compare pricing on store-a.com, store-b.com, and store-c.com"

Claude: [calls check_webmcp on all three]
Claude: [calls call_tool on each one that has WebMCP]
Claude: "Here's a comparison:
  - Store A: 30-day returns, free shipping. Pro plan $99/mo.
  - Store B: 14-day returns, $8 return shipping. Starts at $79/mo.
  - Store C: 60-day returns, free for members. Enterprise only, custom pricing."

The website decides what to expose. The AI decides what to ask. The gateway handles the plumbing.

Try it: pip install webmcp-gateway && playwright install chromium.

WebMCP Gateway is open source under the MIT license. Built by [Salespeak AI](https://salespeak.ai).

No items found.