ByteChef Embedded, Part 6: The MCP Chat ByteChef published part six of its Embedded series, detailing an MCP Chat sample that connects a chat backend to ByteChef's embedded MCP server over streamable HTTP. The route at /api/chat-mcp opens an MCP client, calls mcpClient.tools() to discover the connected user's tools, and passes them directly to the model, replacing the hand-written tool fetching, schema parsing and execution POSTs used in the earlier ComponentKit Chat. Vendors configure which component actions and workflows an embedded MCP server exposes, with a single sensitive server URL shared across users while each user's JWT scopes their own tools and connections. TL;DR: In part three https://blog.bytechef.io/blogs/embedded-component-kit-chat , your own route fetched the user's tools from ByteChef and adapted each one to the AI SDK. The MCP Chat lets a standard do that work: its backend route /api/chat-mcp opens an MCP client to ByteChef's embedded MCP server over streamable HTTP, calls mcpClient.tools to discover the connected user's tools , and hands them straight to the model. It's the same Model Context Protocol that Claude and Cursor speak, consumed inside your own chat. This is part six of the series. The ComponentKit Chat https://blog.bytechef.io/blogs/embedded-component-kit-chat gave an assistant real tools, but your route had to know ByteChef's tools API: fetch the list, parse each schema, wrap it with tool , and POST every call back for execution. The MCP Chat gets the same kind of toolbox through a protocol instead, so discovery and execution are standardized rather than hand-written per app. Before the chat can discover anything, ByteChef needs an MCP server that says which tools to expose. You build it once, as the vendor, and every connected user gets their own scoped view of it. An embedded MCP server only offers components that one of your published integrations uses. If you followed part one https://blog.bytechef.io/blogs/embedded-connect-dialog , you already have one. Here it's a Gmail integration, and that's what makes Gmail show up in the steps below. Open Embedded → MCP Servers and click New MCP Server . The only thing it asks for is a name. Pick one that describes what the assistant is for, since you can run several servers with different toolboxes side by side. Expand the new server and, on its Component Tools tab, click Add Component . The picker lists the components behind your published integrations, with a count of the tools each one offers. Choose one and you get its full list of actions. Tick only the ones you want a model to have. Gmail has eleven, including Delete Email , so this is where you decide that the assistant can search and read mail without being able to delete it. Save, and the component appears on the server with the tools you picked. The gear icon Configure next to each tool lets you rename it, rewrite the description the model reads, and pin any input to a fixed value. Inputs you leave alone stay Automatically defined by the model . Pinning Max Results on Search Email, for example, keeps the model from pulling a whole mailbox in one call. A single action isn't always enough. On the Workflow Tools tab, Add Workflows lets you expose a whole integration workflow as one tool. Pick an integration instance configuration and tick its workflows. Only workflows that start with the Workflow › New Workflow Call trigger qualify, because that trigger defines the input schema the model fills in. Here a Send Email workflow from the Gmail integration becomes a tool next to the raw Gmail actions. A workflow tool can enforce your rules a fixed sender, a template, a log step that a bare action can't. Switch the server's toggle on, then open the Connect tab. The Server URL has the form https://