---
version: v2.1.0
title: MCP tool servers, pluggable marketing themes, model picker with failover, operator dashboards
released_at: 2026-08-13
---

## New: MCP (Model Context Protocol) tool servers

Agents can now call tools hosted on external MCP servers. Register a
server once per workspace, discover its tools, and grant them per agent —
the assistant then calls them mid-conversation like any built-in tool.

**Server registry.** Add an MCP server with its endpoint and credentials;
Pitchbar performs the JSON-RPC handshake, reads the server info, and
stores the connection. Credentials are encrypted at rest and resolved per
request, never rendered back into the UI.

**Tool discovery + per-agent grants.** Discovered tools are listed with
their JSON schemas. Each agent gets an explicit allow-list, so a server
shared across a workspace never exposes every tool to every agent.

**Safety rails, because a remote tool is untrusted input.** Arguments are
sanitised before dispatch, tool output is truncated before it reaches the
prompt, and every server sits behind a circuit breaker that trips on
repeated failures instead of stalling the visitor's turn. Timeouts,
protocol errors, unauthorised responses, and transport faults are
separate exception types, so the operator sees what actually broke.

**Activity log.** Every MCP call is recorded with its arguments, result
size, duration, and outcome, viewable per agent. A scheduled prune keeps
the log bounded.

## New: pluggable marketing themes — Aurora and Prism

The public marketing site is now theme-driven. Two complete themes ship
in the box, each with its own home, pricing, how-it-works, integrations,
changelog, privacy, and terms pages plus a matching authentication shell.
Switch themes from the admin without touching code.

**Try Now.** The marketing hero can fetch a visitor-supplied URL, extract
its content, and run a live demo conversation against that page — a
prospect sees the assistant answer questions about their own site before
signing up.

## New: model picker with a real latency probe

Choosing a model no longer means guessing. The picker lists roughly 95
models across Cloudflare Workers AI, OpenAI, and OpenRouter, with the
Cloudflare catalogue fetched live from the provider so it can't go stale.
Each entry can be probed for real round-trip latency from your own server
before you commit to it, and embedding models carry an explicit dimension
warning so a switch that would invalidate your vector index is visible up
front rather than after a rebuild.

## New: automatic LLM provider failover

When the primary provider errors or times out, the request now falls
through a configured chain to the next provider instead of failing the
visitor's turn. Cloudflare deployments additionally self-heal
model-to-model: a model that has been retired upstream is swapped for a
working one automatically, which previously required a manual config
change to notice and fix.

## New: three operator dashboards

**Widget Monitor** records widget-side events — including the failures
that never reach the server, like a stream that closes without completing
— so a broken embed on a customer site is visible in the admin instead of
only in a visitor's browser.

**Hot-path latency** breaks each visitor turn into its stages (embed,
vector search, rerank, tool loop, first token, total) and shows the prompt
size per turn, so a slow deployment can be traced to the stage responsible
rather than guessed at. The `perf:hotpath` artisan command runs the same
measurement repeatably from the CLI.

**Turn debugger** stores a behind-the-scenes trace per conversation turn —
which path answered (curated, LLM, refusal), what was retrieved and with
what scores, and how long each stage took. A scheduled prune keeps trace
storage bounded.

## New: Translation Manager

Any user-facing string in any of the 133 shipped locales can now be
overridden from the admin, with the override layered over the shipped
translation file at runtime. Marketing copy and SEO metadata are covered,
so an operator can retitle and re-describe the public site per language
without editing files or redeploying.

## New: time-limited trial plans without a card

A plan can be granted for a fixed period with no payment method. When the
window closes the workspace hits an upgrade wall instead of silently
continuing, and the customer keeps their data.

## Improvements

**Retrieval accuracy.** A follow-up message that drops its subject ("and
the year?") now keeps that subject for retrieval instead of embedding as a
generic query. Optional LLM query rewriting condenses a conversational
message into a standalone search query, and is guarded so a rewrite can
never come out worse than the deterministic version it replaces. Sources
marked global — contact details, company facts — can answer from any page
rather than only where they were crawled.

**Faster turns.** Knowledge-only questions skip the tool-check completion
entirely, and the reranker is skipped adaptively when the vector search
already returned a confident ordering.

**Crawling reach.** Two new extraction tiers: Cloudflare's own
page-to-markdown renderer, and a vision OCR fallback for pages whose
content is locked inside images. The bot-challenge detector no longer
misreads ordinary pages as challenge pages.

**Indexing that repairs itself.** Every indexing job retries on transient
failure, and a scheduled sweep re-runs sources that failed anyway, so a
provider blip no longer leaves a source permanently unindexed. Reindex now
works correctly for pasted text, uploaded files, and auto-indexed pages
instead of dead-ending on them, and pasted-text sources can be edited in
place.

**Workflow builder.** The visual builder gained validation, a test-run
mode that simulates a workflow without touching a live conversation, and a
canvas-first creation flow.

**Right-to-left support.** The widget renders correctly in Arabic,
Hebrew, Persian, and Urdu, mirroring layout and input direction.

**Billing.** Stripe automatic tax, pay-by-invoice subscriptions with bank
transfer, operator-selectable default currency, yearly pricing, the
Stripe-hosted invoice PDF in billing history, and an in-app Stripe health
panel that verifies the webhook and tax configuration and can repair them.

## Fixes

**Serving without FrankenPHP.** The application now runs correctly on any
PHP host, not only an Octane/FrankenPHP deployment: the cron queue tick
resolves the PHP binary rather than assuming the serving one, and
streaming responses lift the execution-time limit that PHP-FPM would
otherwise apply mid-stream.

**Octane worker memory.** FrankenPHP's static binary ships no `php.ini`,
so the compiled-in 128MB memory limit applied to every worker. A `php.ini`
now ships with the application and is read at worker start.

**Empty 500 responses.** A PHP deprecation raised while rendering an error
could replace the response with an empty 500 and destroy the original
exception — the actual failure became invisible in the logs. Deprecations
are now handled without displacing the response, and a dedicated log
channel means a misconfigured logging environment can't break logging
itself.

**Google Sheets broke Google Docs.** The sheet sync kept its own copy of
the OAuth token logic, reading the expiry with an integer cast and writing
it back in a different format than the shared token store reads. Adding
your first Google Sheet source could therefore break every Google Doc
source in the same workspace. There is now a single owner for Google
tokens, and a row already written in the wrong format repairs itself.

**Chat broke after an hour.** The widget's session token expires after 60
minutes. A tab left open past that received an authentication error on
every message, and the retry button replayed the same expired token — so
the conversation stayed broken until the visitor reloaded. The widget now
re-authenticates once, silently, and replays the message; the existing
conversation is resumed, so nothing is lost.

**Slow reranker no longer times out the turn.** The reranker's HTTP
timeout was eight seconds, long enough to push a turn past the widget's
own connection timeout and show the visitor a generic error. It now fails
fast (configurable, three seconds by default) to the vector ordering.

**Certificate-mismatched www hosts.** A site whose TLS certificate covers
only the apex domain failed every crawler tier for its www URLs and was
classed a permanent failure, so those pages never indexed. The crawler now
retries the apex host once, for exactly that certificate signature.

**Message identity.** The message id handed to the widget during streaming
is now the id that persists, so per-message actions taken by a visitor
resolve to a real record.

**Analytics queue.** Telemetry and turn persistence jobs are consumed
rather than accumulating unprocessed.

**Other fixes.** Duplicate-content detection is scoped to the source
rather than the whole agent; a Google Docs link pasted into the URL form
becomes a Google Doc source instead of a failed crawl; dead OAuth tokens
flag the connection and tell the owner to reconnect; provider timeouts are
no longer reported as firewall or DNS faults; only one verification email
is sent at signup; soft-deleted workspaces no longer appear in the
platform list; encrypted secret columns were widened for longer values;
the operator-joined notice in chat auto-dismisses; links in chat messages
are clickable; and the marketing site gained a mobile navigation menu.
