Caboo
Remote MCP for booking

Add real-world booking to your agent.

Caboo exposes one public Streamable HTTP MCP endpoint. Your agent can search published local businesses, read services and live availability, then create a short-lived hold that the buyer confirms on Caboo.

Contract

Booking is a hold-and-handoff flow. The agent never collects buyer contact details, messaging consent, or intake answers in chat.

Hold TTLHolds last about 10 minutes and self-expire if the buyer does not confirm.
PII boundaryThe confirm page collects name, email, phone, consent, notes, and intake outside the conversation.
Capability gateCheck each provider's capabilities array before offering booking actions.

Quickstarts

Start against caboo-demo-live. The demo tenant is intentionally fake; customer and pilot slugs are not disposable test targets.

Claude custom connector

Add the remote MCP URL in Claude's connector settings, then enable it in a conversation.

Name: Caboo
Remote MCP server URL: https://getcaboo.com/mcp
Auth: None

Try:
"Find caboo-demo-live and hold the first open consultation slot."

Claude-compatible MCP config

For MCP clients that accept a JSON config, use the remote URL directly.

{
  "mcpServers": {
    "caboo": {
      "url": "https://getcaboo.com/mcp"
    }
  }
}

OpenAI Agents SDK

Use the Streamable HTTP MCP server when your Python process should manage the connection.

import asyncio
from agents import Agent, Runner
from agents.mcp import MCPServerStreamableHttp

async def main():
    async with MCPServerStreamableHttp(
        name="Caboo",
        params={"url": "https://getcaboo.com/mcp"},
        cache_tools_list=True,
    ) as caboo:
        agent = Agent(
            name="Booking assistant",
            instructions=(
                "Use Caboo to find providers and hold slots. "
                "Never collect contact details in chat; give the confirmUrl."
            ),
            mcp_servers=[caboo],
        )
        result = await Runner.run(
            agent,
            "Find caboo-demo-live and hold the first open slot.",
        )
        print(result.final_output)

asyncio.run(main())

OpenAI hosted MCP tool

Use the hosted MCP tool when the Responses API should call the public server directly.

from agents import Agent, HostedMCPTool, Runner

agent = Agent(
    name="Booking assistant",
    instructions="Use Caboo for local-service booking holds.",
    tools=[
        HostedMCPTool(
            tool_config={
                "type": "mcp",
                "server_label": "caboo",
                "server_url": "https://getcaboo.com/mcp",
                "require_approval": "never",
            }
        )
    ],
)

result = await Runner.run(
    agent,
    "Find caboo-demo-live and show me open appointment times.",
)

LangChain / LangGraph

Load Caboo's remote MCP tools with the HTTP transport, then pass them into your agent.

from langchain_mcp_adapters.client import MultiServerMCPClient
from langchain.agents import create_agent

client = MultiServerMCPClient({
    "caboo": {
        "transport": "http",
        "url": "https://getcaboo.com/mcp",
    },
})

tools = await client.get_tools()
agent = create_agent("openai:gpt-5.4", tools)

result = await agent.ainvoke({
    "messages": "Find caboo-demo-live and hold an open slot."
})

Vercel AI SDK

Use @ai-sdk/mcp to convert remote MCP tools into AI SDK tools.

import { createMCPClient } from "@ai-sdk/mcp";
import { generateText, stepCountIs } from "ai";

const caboo = await createMCPClient({
  transport: {
    type: "http",
    url: "https://getcaboo.com/mcp",
    redirect: "error",
  },
  name: "caboo-demo",
  version: "1.0.0",
});

try {
  const tools = await caboo.tools();
  const result = await generateText({
    model: "openai/gpt-5.4",
    tools,
    stopWhen: stepCountIs(8),
    prompt: "Find caboo-demo-live and hold the first open slot.",
  });
  console.log(result.text);
} finally {
  await caboo.close();
}

Tools

This table mirrors the public connector contract in apps/api/src/agent-gateway/connector/contracts.ts.

Tool Use Write?
search_providersFind published businesses by need, category, or locality.No
get_providerRead a provider profile, policies, capabilities, and public links.No
book_list_servicesList services, durations, prices, and booking context for one provider.No
book_get_availabilityRead open slots grouped by day in the provider's timezone.No
book_get_booking_statusCheck whether a returned hold token or confirm URL is still active.No
book_hold_slotCreate an anonymous, expiring hold and return the buyer confirmation URL.Hold only