> ## Documentation Index
> Fetch the complete documentation index at: https://developers.autoplay.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# 🚀 Quickstart

> Stream real-time user events into your support AI agents in a couple lines of code.

## ⚡ Add this skill

<CardGroup cols={2}>
  <Card title="One command" icon="terminal">
    Add the shared Autoplay SDK foundation skill for credentials and live-activity reads.

    <CodeGroup>
      ```bash CLI theme={null}
      uvx --from autoplay-sdk autoplay-install-skills
      ```
    </CodeGroup>

    <a className="skill-card-link" href="/quickstart">View the docs →</a>
  </Card>

  <Card title="Agent onboarding" icon="robot">
    Fetch this skill directly so your coding agent gets the same Autoplay SDK setup instructions.

    <CodeGroup>
      ```bash cURL theme={null}
      curl -s https://developers.autoplay.ai/autoplay-core/SKILL.md
      ```
    </CodeGroup>

    <a className="skill-card-link" href="https://developers.autoplay.ai/autoplay-core/SKILL.md" target="_blank">View the skill →</a>
  </Card>
</CardGroup>

## Install the SDK

**Prerequisites — Python 3.10 or later required.**

<Tabs>
  <Tab title="Mac / Linux">
    Check your Python version:

    ```bash theme={null}
    python3 --version
    ```

    If Python is not installed, download it from [python.org](https://www.python.org/downloads/) or install via Homebrew:

    ```bash theme={null}
    brew install python3
    ```

    Then create and activate a virtual environment before installing:

    ```bash theme={null}
    python3 -m venv .venv
    source .venv/bin/activate
    ```
  </Tab>

  <Tab title="Windows (PowerShell)">
    Check your Python version:

    ```powershell theme={null}
    python --version
    ```

    If Python is not installed, download it from [python.org](https://www.python.org/downloads/) and run the installer — check **"Add Python to PATH"** during setup.

    Then create and activate a virtual environment before installing:

    ```powershell theme={null}
    python -m venv .venv
    .venv\Scripts\Activate.ps1
    ```

    <Note>
      If you see a permissions error, run this once first:
      `Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser`
    </Note>
  </Tab>
</Tabs>

Run this command once from your project root (with your venv active):

```bash theme={null}
pip install autoplay-sdk
# OR
uv add autoplay-sdk
```

Install [Agent skills](/get-started/agent-skills) for Cursor/Claude so your assistant follows the correct integration pattern for your stack. See [Pricing](/who-we-are/pricing) for plans.

## 🎯 Step 1 — Connect your session replay provider

Autoplay needs a live stream of what each user is doing before anything downstream can use it as context. Pick whichever tool you already have — already wired up? The tool's page tells you how to confirm it in seconds instead of redoing setup.

<CardGroup cols={3}>
  <Card href="/recipes/posthog/how-to-setup">
    <div className="tool-card-header">
      <img src="https://mintcdn.com/autoplayai/lzNTbrNZ8NuMh-AW/images/recipes/posthog/logo.png?fit=max&auto=format&n=lzNTbrNZ8NuMh-AW&q=85&s=ab56ad6a4f8f04115a22acc4c3968209" alt="" className="tool-card-logo" width="924" height="512" data-path="images/recipes/posthog/logo.png" />

      <span className="tool-card-title">PostHog</span>
      <span className="tool-card-arrow">→</span>
    </div>

    Connect an existing PostHog project
  </Card>

  <Card href="/recipes/amplitude/how-to-setup">
    <div className="tool-card-header">
      <img src="https://mintcdn.com/autoplayai/qstpFt_lebOYZSOK/images/recipes/amplitude/logo.svg?fit=max&auto=format&n=qstpFt_lebOYZSOK&q=85&s=1afbdaaf0bbc525c722872bc6151a118" alt="" className="tool-card-logo" width="64" height="64" data-path="images/recipes/amplitude/logo.svg" />

      <span className="tool-card-title">Amplitude</span>
      <span className="tool-card-arrow">→</span>
    </div>

    Connect an existing Amplitude project
  </Card>

  <Card href="/recipes/fullstory/how-to-setup">
    <div className="tool-card-header">
      <img src="https://mintcdn.com/autoplayai/EOPlL86k5Zml7IdT/images/recipes/fullstory/logo.png?fit=max&auto=format&n=EOPlL86k5Zml7IdT&q=85&s=cbf22f7a1b0ee7bb73d5bebea3e27ba9" alt="" className="tool-card-logo" width="214" height="214" data-path="images/recipes/fullstory/logo.png" />

      <span className="tool-card-title">FullStory</span>
      <span className="tool-card-badge">Coming Soon</span>
    </div>

    Full setup guide coming soon
  </Card>

  <Card href="/recipes/datadog/how-to-setup">
    <div className="tool-card-header">
      <img src="https://mintcdn.com/autoplayai/lzNTbrNZ8NuMh-AW/images/recipes/datadog/logo.png?fit=max&auto=format&n=lzNTbrNZ8NuMh-AW&q=85&s=06fd27f239a3a81f49dd01241bcaaebb" alt="" className="tool-card-logo" width="1024" height="576" data-path="images/recipes/datadog/logo.png" />

      <span className="tool-card-title">Datadog</span>
      <span className="tool-card-badge">Coming Soon</span>
    </div>

    Full setup guide coming soon
  </Card>

  <Card href="/recipes/pendo/how-to-setup">
    <div className="tool-card-header">
      <img src="https://mintcdn.com/autoplayai/EOPlL86k5Zml7IdT/images/recipes/pendo/logo.png?fit=max&auto=format&n=EOPlL86k5Zml7IdT&q=85&s=eff712522f36569d3ca10a141031c057" alt="" className="tool-card-logo" width="337" height="337" data-path="images/recipes/pendo/logo.png" />

      <span className="tool-card-title">Pendo</span>
      <span className="tool-card-badge">Coming Soon</span>
    </div>

    Full setup guide coming soon
  </Card>
</CardGroup>

## 🤖 Step 2 — Connect your AI support agent

This is where Autoplay actually does its job — giving your existing chatbot live context on what the user's been doing, pulled over MCP the moment it needs it.

<CardGroup cols={3}>
  <Card href="/recipes/intercom-tutorial/step-1-connect-real-time-events">
    <div className="tool-card-header">
      <img src="https://mintcdn.com/autoplayai/2qdszPph8ETvQ2n_/images/recipes/intercom/logo.png?fit=max&auto=format&n=2qdszPph8ETvQ2n_&q=85&s=d988e2202e32a1f177df5ecf88e5b80a" alt="" className="tool-card-logo" width="500" height="500" data-path="images/recipes/intercom/logo.png" />

      <span className="tool-card-title">Intercom</span>
      <span className="tool-card-arrow">→</span>
    </div>

    Connect Fin via MCP
  </Card>

  <Card href="/recipes/maven/step-1-connect-real-time-events">
    <div className="tool-card-header">
      <img src="https://mintcdn.com/autoplayai/PRbnKTZCqJLbkGlb/images/recipes/maven/logo.png?fit=max&auto=format&n=PRbnKTZCqJLbkGlb&q=85&s=c5da1f766a872604f9799fcdeb7d108f" alt="" className="tool-card-logo" width="200" height="200" data-path="images/recipes/maven/logo.png" />

      <span className="tool-card-title">Maven</span>
      <span className="tool-card-arrow">→</span>
    </div>

    Connect via MCP
  </Card>

  <Card href="/recipes/ada/step-1-connect-real-time-events">
    <div className="tool-card-header">
      <img src="https://mintcdn.com/autoplayai/G4GR7HXGv2qkqJrB/images/recipes/ada/logo.png?fit=max&auto=format&n=G4GR7HXGv2qkqJrB&q=85&s=fc07673697600cc5e1f5fd68bbf73e19" alt="" className="tool-card-logo" width="256" height="256" data-path="images/recipes/ada/logo.png" />

      <span className="tool-card-title">Ada</span>
      <span className="tool-card-badge">Coming Soon</span>
    </div>

    Connect via API
  </Card>

  <Card href="/recipes/botpress/step-1-connect-real-time-events">
    <div className="tool-card-header">
      <img src="https://mintcdn.com/autoplayai/2qdszPph8ETvQ2n_/images/recipes/botpress/logo.png?fit=max&auto=format&n=2qdszPph8ETvQ2n_&q=85&s=f8d309c1a948e46f9fce5ed818f9cb5d" alt="" className="tool-card-logo" width="280" height="280" data-path="images/recipes/botpress/logo.png" />

      <span className="tool-card-title">Botpress</span>
      <span className="tool-card-badge">Coming Soon</span>
    </div>

    Connect via API
  </Card>

  <Card href="/recipes/dify-tutorial/step-1-connect-real-time-events">
    <div className="tool-card-header">
      <img src="https://mintcdn.com/autoplayai/2qdszPph8ETvQ2n_/images/recipes/dify/logo.png?fit=max&auto=format&n=2qdszPph8ETvQ2n_&q=85&s=4041a7537f9c8a1dd93f21bbde03f1d8" alt="" className="tool-card-logo" width="500" height="500" data-path="images/recipes/dify/logo.png" />

      <span className="tool-card-title">Dify</span>
      <span className="tool-card-arrow">→</span>
    </div>

    Connect via MCP
  </Card>

  <Card href="/recipes/crisp-ai/step-1-connect-real-time-events">
    <div className="tool-card-header">
      <img src="https://mintcdn.com/autoplayai/292bZ8YoZe3L6wuB/images/recipes/crisp/logo.png?fit=max&auto=format&n=292bZ8YoZe3L6wuB&q=85&s=e004089fa756706691ca073c70a3c6d3" alt="" className="tool-card-logo" width="256" height="256" data-path="images/recipes/crisp/logo.png" />

      <span className="tool-card-title">Crisp AI</span>
      <span className="tool-card-arrow">→</span>
    </div>

    Connect via MCP
  </Card>

  <Card href="/recipes/landbot/step-1-connect-real-time-events">
    <div className="tool-card-header">
      <img src="https://mintcdn.com/autoplayai/1eO9uobasAmQK6ML/images/recipes/landbot/logo.png?fit=max&auto=format&n=1eO9uobasAmQK6ML&q=85&s=0f3ecb9ac5c06d0b969219037256dc5c" alt="" className="tool-card-logo" width="352" height="351" data-path="images/recipes/landbot/logo.png" />

      <span className="tool-card-title">Landbot</span>
      <span className="tool-card-badge">Coming Soon</span>
    </div>

    Connect via API
  </Card>

  <Card href="/recipes/rasa/step-1-connect-real-time-events">
    <div className="tool-card-header">
      <img src="https://mintcdn.com/autoplayai/nywCI02jGEWh84vX/images/recipes/rasa/logo.png?fit=max&auto=format&n=nywCI02jGEWh84vX&q=85&s=41afea4e06d786f4e621cac0623bcb16" alt="" className="tool-card-logo" width="234" height="234" data-path="images/recipes/rasa/logo.png" />

      <span className="tool-card-title">Rasa</span>
      <span className="tool-card-arrow">→</span>
    </div>

    Connect via API
  </Card>

  <Card href="/recipes/inkeep/step-1-connect-real-time-events">
    <div className="tool-card-header">
      <img src="https://mintcdn.com/autoplayai/dJWIjUuJsW8Ne6Y3/images/recipes/inkeep/logo.png?fit=max&auto=format&n=dJWIjUuJsW8Ne6Y3&q=85&s=9e412f7fc884a95a53657d2d540c3622" alt="" className="tool-card-logo" width="128" height="128" data-path="images/recipes/inkeep/logo.png" />

      <span className="tool-card-title">Inkeep</span>
      <span className="tool-card-arrow">→</span>
    </div>

    Connect via API
  </Card>

  <Card href="/recipes/tidio/step-1-connect-real-time-events">
    <div className="tool-card-header">
      <img src="https://mintcdn.com/autoplayai/1mSeFG0ELCSlhxam/images/recipes/tidio/logo.png?fit=max&auto=format&n=1mSeFG0ELCSlhxam&q=85&s=76bd81b74938eedb15a85e945d76c78b" alt="" className="tool-card-logo" width="225" height="225" data-path="images/recipes/tidio/logo.png" />

      <span className="tool-card-title">Tidio</span>
      <span className="tool-card-arrow">→</span>
    </div>

    Connect via API
  </Card>

  <Card href="/recipes/plain-tutorial/step-1-connect-real-time-events">
    <div className="tool-card-header">
      <img src="https://mintcdn.com/autoplayai/lDu4s5Oo3AUuQi--/images/recipes/plain/logo.png?fit=max&auto=format&n=lDu4s5Oo3AUuQi--&q=85&s=04d948ea5bb127d275fb830b147548a5" alt="" className="tool-card-logo" width="360" height="360" data-path="images/recipes/plain/logo.png" />

      <span className="tool-card-title">Plain</span>
      <span className="tool-card-arrow">→</span>
    </div>

    Connect via API
  </Card>

  <Card>
    <div className="tool-card-header">
      <img src="https://mintcdn.com/autoplayai/dJWIjUuJsW8Ne6Y3/images/recipes/zendesk/logo.png?fit=max&auto=format&n=dJWIjUuJsW8Ne6Y3&q=85&s=b7bb9f99047f9d5afae649e80123edaa" alt="" className="tool-card-logo" width="370" height="225" data-path="images/recipes/zendesk/logo.png" />

      <span className="tool-card-title">Zendesk</span>
      <span className="tool-card-badge">Coming Soon</span>
    </div>

    Full setup guide coming soon
  </Card>
</CardGroup>

## 🔔 Step 3 — Add the proactive layer

Steps 1 and 2 make your AI support agent **reactive** — it can answer with live context, but only when a user asks. This step makes it **proactive**: Autoplay.js watches the same activity stream in the browser and surfaces the next best action — a message or a tour — the moment a milestone happens, without the user asking "what's next?".

<Tabs>
  <Tab title="Connect Autoplay.js">
    Autoplay.js is the piece that actually listens for nudges and dispatches them — through your configured tour provider, or as Autoplay's own nudge card when no provider is set up. Every proactive path (your chatbot's prompt, a plain nudge card, a tour) flows through this one connection.

    <Accordion title="Configure Autoplay.js — about 5 minutes" icon="bolt" id="configure-autoplayjs">
      Before you start, add the credentials created when you registered your product in Step 1 to your server environment:

      ```bash theme={null}
      AUTOPLAY_PRODUCT_ID=your-product-id
      AUTOPLAY_MCP_KEY=your-mcp-key
      AUTOPLAY_MCP_BASE_URL=https://mcp.autoplay.ai
      ```

      * `AUTOPLAY_PRODUCT_ID` is the issued `product_id` returned by Autoplay registration, not your PostHog or Amplitude project id.
      * `AUTOPLAY_MCP_KEY` is the `mcp_key` returned by `onboard_product` during that same setup. Retrieve it from the saved terminal output or the secure 1Password link. If you no longer have it, contact Autoplay rather than registering a second product.

      Keep `AUTOPLAY_MCP_KEY` server-side. Never expose it in frontend code or a public environment variable.

      ### Configure your onboarding

      Autoplay uses one onboarding config, keyed by your `product_id`, to decide which milestones to detect and which experience to deliver:

      ```json theme={null}
      {
        "product_id": "your-product-id",
        "workflows": [
          {
            "key": "connect_account",
            "title": "Connect a social account",
            "sort_order": 10,
            "required": true,
            "detect": "The user connected a social account — e.g. picked a platform and confirmed connecting a handle."
          }
        ],
        "tours": [
          {
            "workflow_key": "connect_account",
            "name": "Connect your account",
            "flow_id": "your-provider-flow-id"
          }
        ],
        "tour_provider": "appcues",
        "exploration_gate": {
          "min_seconds_on_app": 60,
          "min_distinct_features": 3,
          "welcome_cooldown_s": 600,
          "max_proactive_support": 3
        },
        "nudge_delivery": {
          "default": { "provider": "autoplay" }
        }
      }
      ```

      `workflows` define the milestones Autoplay detects from live activity. `tours` map each workflow to a flow in your configured `tour_provider`; omit them if you only want Autoplay nudge cards.

      <Note>
        Onboarding configuration is not self-serve yet—share this JSON with the Autoplay team in [Discord](https://discord.gg/jCbR2tQA5).
      </Note>

      ### 1. Create a nudge-token endpoint

      Add a server route that exchanges your MCP key for a short-lived token scoped to the current user:

      ```jsx theme={null}
      export async function POST(request) {
        const { userId } = await request.json();

        const response = await fetch(
          `${process.env.AUTOPLAY_MCP_BASE_URL}/nudges/${process.env.AUTOPLAY_PRODUCT_ID}/token`,
          {
            method: "POST",
            headers: {
              "Content-Type": "application/json",
              Authorization: `Bearer ${process.env.AUTOPLAY_MCP_KEY}`,
            },
            body: JSON.stringify({ user_id: userId }),
          }
        );

        return Response.json(await response.json());
      }
      ```

      ### 2. Connect the nudge stream

      In your frontend, load Autoplay.js and connect it for the signed-in user. `AUTOPLAY_MCP_BASE_URL` is the production MCP origin, without the `/mcp` transport path:

      ```javascript theme={null}
      const AUTOPLAY_MCP_BASE_URL = "https://mcp.autoplay.ai";
      const { Autoplay } = await import(`${AUTOPLAY_MCP_BASE_URL}/autoplay.js`);

      const nudgeHandle = Autoplay.connectNudges({
        baseUrl: AUTOPLAY_MCP_BASE_URL,
        productId: "your-product-id",
        userId: "your-signed-in-user-id",
        getToken: async () => {
          const response = await fetch("/api/nudge-token", {
            method: "POST",
            headers: { "Content-Type": "application/json" },
            body: JSON.stringify({ userId: "your-signed-in-user-id" }),
          });
          const { token } = await response.json();
          return token;
        },
        onNudge: handleNudge,
        onError: (error) => console.warn("[autoplay] nudge stream error:", error),
      });
      ```

      Use the same stable user ID your app sends to the session replay provider. `getToken` should fetch a fresh token whenever it is called.

      If you use a third-party tour provider, load and identify its SDK before calling `connectNudges` so it is ready when a tour arrives.

      ### 3. Dispatch nudges

      Every nudge includes a `nudge_type`. Tour nudges hand off to the provider and flow configured above; other nudges render an Autoplay card:

      ```javascript theme={null}
      function handleNudge(nudge) {
        if (nudge.nudge_type === "tour") {
          Autoplay.dispatchNudge(nudge);
          nudgeHandle.report("chat_closed");
          return;
        }

        Autoplay.dispatchNudge(nudge, {
          onOpen: () => nudgeHandle.report("proactive_accepted_chat"),
          onDismiss: () => nudgeHandle.report("proactive_dismissed"),
        });
      }
      ```

      `Autoplay.dispatchNudge` returns a boolean indicating whether an experience rendered, which is useful to log during setup. A nudge card is the provider-agnostic fallback: Autoplay can offer help without requiring you to build a tour flow.

      ### 4. Own your tour or chat surface (optional)

      By default Autoplay drives the built-in tour providers (Usertour, Appcues) and renders its own nudge card. If you own your tour system or chat UI, register callbacks with `Autoplay.configure` **before** `connectNudges`, and Autoplay routes nudges to them instead:

      ```javascript theme={null}
      Autoplay.configure({
        providers: {
          // Your own tour system (Joyride, a custom highlighter, …).
          tour: {
            // Each callback also receives the full `nudge` payload as a second arg
            // (nudge_type, next_workflow, delivery.ask, …) if you want to branch on it.
            launch(delivery, nudge) { yourTours.start(delivery.flow_id); },
          },
          // A chat surface you built on your agent's API.
          chat: {
            deliver(content, nudge) { chat.injectAssistantMessage(content); }, // show authored copy — NO LLM call
            dispatch(text, nudge)   { chat.openAndSend(text); },               // send a real user turn to your agent
            close(opts)             { chat.hide(); },                          // dismiss for a tour handoff
          },
        },
      });
      ```

      Resolution order per nudge: your `tour.launch` / `chat.deliver` first, then the built-in providers, then the Autoplay card as a fallback. A callback that returns `false` (or throws) falls through to the next option; returning nothing counts as handled. `chat.deliver` must **not** trigger an LLM turn — it only displays the pre-authored copy; use `chat.dispatch` for a real turn (e.g. when the user accepts a nudge). Register `chat.close` so a tour can dismiss your chat during handoff.

      <Note>
        Registering a chat surface **takes over chat nudges from the card in Step 3**: when `chat.deliver` handles a nudge, the Autoplay card is suppressed, so the card's `onOpen` / `onDismiss` reporting (`proactive_accepted_chat` / `proactive_dismissed`) no longer fires for chat nudges. Emit those from your own callbacks instead, using the `report()` handle returned by `connectNudges` — e.g. `nudgeHandle.report("proactive_accepted_chat")` inside `chat.dispatch` (the user accepted), and `nudgeHandle.report("proactive_dismissed")` when the user dismisses your surface. Tour nudges still report as before.
      </Note>

      ### 5. Verify the connection

      Sign in to your app, open the browser console, and confirm the nudge stream connects without calling `onError`. Autoplay can now dispatch provider-backed experiences and its own nudge cards. If you add visual guidance in Step 4, initialize that provider before calling `connectNudges`.
    </Accordion>
  </Tab>

  <Tab title="Make your chatbot proactive">
    Autoplay.js only delivers the nudge at the right moment — something still has to decide *what to say* and *what shows up on screen*. Most AI support agents (Maven, Intercom's Fin, and others) don't do this on their own: they answer when asked, but they don't watch live activity or open a message by themselves.

    To make your chatbot proactive:

    1. **Add the proactive prompt for your chatbot platform.** This teaches the agent to offer the next step instead of only answering questions — follow the recipe for your platform from Step 2 above (e.g. Maven's **Add proactive layer** step).
    2. **Add a way to show the offer.** Most chatbot platforms don't render their own proactive UI, so use a **user tour provider** (e.g. Appcues) to display the box the user actually sees and can accept or dismiss — or skip the tour provider and let Autoplay's own nudge card handle it (see the **Connect Autoplay.js** tab).

    <Card title="Maven example" icon="wand-magic-sparkles" href="/recipes/maven/step-2-define-proactive-triggers">
      Full walkthrough — the proactive prompt plus the Appcues tour hand-off — in Maven → Add proactive layer.
    </Card>

    Once connected, a dispatched nudge card looks like this — Autoplay offering the next step right after the AI agent confirms a milestone, with the user free to accept or dismiss:

    <Frame>
      <img src="https://mintcdn.com/autoplayai/cpZuvxxAy3XJEOPp/images/recipes/maven/proactive-offer.png?fit=max&auto=format&n=cpZuvxxAy3XJEOPp&q=85&s=fdaaac59ca3ab96dd6b5b6b025041589" alt="Autoplay nudge card proactively offering to walk the user through setting their posting schedule right after they connect a social account" width="1782" height="1480" data-path="images/recipes/maven/proactive-offer.png" />
    </Frame>

    If you're using Autoplay's built-in nudge card instead of a tour provider, its copy is customizable with a couple of options:

    ```javascript theme={null}
    Autoplay.dispatchNudge(nudge, {
      brandName: "Acme",   // replaces the "Autoplay" label on the card — default "Autoplay"
      ctaLabel: "Show me",  // replaces the accept-button text — default "Show me how"
      onOpen: () => nudgeHandle.report("proactive_accepted_chat"),
      onDismiss: () => nudgeHandle.report("proactive_dismissed"),
    });
    ```

    The card's body text comes from `nudge.message` if your onboarding config sets one; otherwise Autoplay generates it from the milestone (e.g. "Nice progress! 🎉 Want me to walk you through **Setting your posting schedule**?"). Position, color, and layout are fixed today — `brandName` and `ctaLabel` are the only visual customization available.
  </Tab>
</Tabs>

## 🗺️ Step 4 — Connect visual guidance

Optional. If you want to give your users the ultimate level of guidance, add visual guidance on top — pop-up tours today, and browser agents soon. Wire up a tour provider — Appcues, Usertour, Pendo, and more — so that once a user asks for more help from Step 3's proactive message, the right tour launches from the same event stream.

<Card title="Connect visual guidance" icon="map" href="/recipes/user-tour/overview">
  Trigger Appcues, Pendo, Usertour, and more once a user asks for more guidance — optional
</Card>

## 🗺️ What's next

Go deeper on the SDK:

<CardGroup cols={2}>
  <Card title="Typed payloads" icon="code" href="/sdk/typed-payloads">
    Explore all fields on ActionsPayload and SummaryPayload
  </Card>

  <Card title="RAG pipeline" icon="database" href="/sdk/rag-example">
    Embed events into a vector store in real time
  </Card>

  <Card title="MCP server" icon="plug" href="/mcp/server">
    Connect any agent to pull live activity via the MCP tool
  </Card>

  <Card title="Proactive onboarding agent" icon="robot" href="/sdk/proactive-onboarding-agent">
    Combine real-time events, memory, and golden paths
  </Card>
</CardGroup>

For structured logging and `extra` field conventions used across the SDK, see [Logging](/sdk/logging). Release history is on the [Changelog](/changelog).
