From 7c3b70810ade2baa6460bf6ccadd65f33e509298 Mon Sep 17 00:00:00 2001 From: Teal Larson Date: Thu, 3 Sep 2026 12:13:59 -0400 Subject: [PATCH 01/42] docs(agent-plugin): add install guides for the Arcade agent plugin Adds a Get Started section for installing Arcade through the agent plugin: an overview with the one-command install and per-agent verification in tabs, a Claude Desktop connector guide, a tools-only guide for any MCP client, and a page on what changes when a trial becomes a team rollout. The existing MCP Clients guides all assume you want your own gateway and an API key, so each one now points trial users at the plugin, and the plugin pages point back for anyone who needs their own tool list and identities. Every install surface resolves from two constants in lib/agent-plugin.ts. Pages reference them as {{TOKEN}} placeholders and a remark plugin resolves those in prose, code blocks, and link targets, so the staging gateway URL becomes a one-line change at launch. The Cursor and VS Code one-click links are derived from the same URL rather than pasted, and the plugin rewrites the raw source Nextra exports so the copy-page button and the markdown the site serves to agents get resolved values too. Co-Authored-By: Claude Opus 5 (1M context) --- app/en/get-started/_meta.tsx | 1 + app/en/get-started/agent-plugin/_meta.tsx | 18 ++ .../agent-plugin/any-mcp-client/page.mdx | 31 ++++ .../agent-plugin/claude-desktop/page.mdx | 59 +++++++ app/en/get-started/agent-plugin/page.mdx | 154 ++++++++++++++++++ .../agent-plugin/team-rollout/page.mdx | 47 ++++++ .../mcp-clients/claude-code/page.mdx | 7 + .../mcp-clients/claude-desktop/page.mdx | 8 + .../get-started/mcp-clients/cursor/page.mdx | 7 + .../mcp-clients/github-copilot/page.mdx | 7 + app/en/get-started/mcp-clients/page.mdx | 6 +- .../mcp-clients/visual-studio-code/page.mdx | 9 +- lib/agent-plugin.ts | 36 ++++ lib/remark-substitute.ts | 69 ++++++++ next.config.ts | 2 + tests/broken-link-check.test.ts | 11 +- tests/remark-substitute.test.ts | 100 ++++++++++++ 17 files changed, 569 insertions(+), 3 deletions(-) create mode 100644 app/en/get-started/agent-plugin/_meta.tsx create mode 100644 app/en/get-started/agent-plugin/any-mcp-client/page.mdx create mode 100644 app/en/get-started/agent-plugin/claude-desktop/page.mdx create mode 100644 app/en/get-started/agent-plugin/page.mdx create mode 100644 app/en/get-started/agent-plugin/team-rollout/page.mdx create mode 100644 lib/agent-plugin.ts create mode 100644 lib/remark-substitute.ts create mode 100644 tests/remark-substitute.test.ts diff --git a/app/en/get-started/_meta.tsx b/app/en/get-started/_meta.tsx index 93c4fc3af..589f4674e 100644 --- a/app/en/get-started/_meta.tsx +++ b/app/en/get-started/_meta.tsx @@ -2,6 +2,7 @@ import type { MetaRecord } from "nextra"; export const meta: MetaRecord = { "about-arcade": "About Arcade", + "agent-plugin": "Agent Plugin", setup: "Setup", quickstarts: "Quickstarts", "agent-frameworks": "Agent Frameworks", diff --git a/app/en/get-started/agent-plugin/_meta.tsx b/app/en/get-started/agent-plugin/_meta.tsx new file mode 100644 index 000000000..2184cc123 --- /dev/null +++ b/app/en/get-started/agent-plugin/_meta.tsx @@ -0,0 +1,18 @@ +import type { MetaRecord } from "nextra"; + +export const meta: MetaRecord = { + index: { + title: "Overview", + }, + "claude-desktop": { + title: "Claude Desktop", + }, + "any-mcp-client": { + title: "Any MCP client", + }, + "team-rollout": { + title: "From trial to team rollout", + }, +}; + +export default meta; diff --git a/app/en/get-started/agent-plugin/any-mcp-client/page.mdx b/app/en/get-started/agent-plugin/any-mcp-client/page.mdx new file mode 100644 index 000000000..f2e115a1a --- /dev/null +++ b/app/en/get-started/agent-plugin/any-mcp-client/page.mdx @@ -0,0 +1,31 @@ +--- +title: "Install Arcade in any MCP client" +description: "Point any Streamable HTTP MCP client at the Arcade gateway to get tools for every app you connect, with no API key." +--- + +import { Callout } from "nextra/components"; + +# Install Arcade in any MCP client + +Any client that can talk to a Streamable HTTP MCP server can use Arcade tools, including OpenCode and clients that do not support agent plugins at all. Add this URL as an MCP server: + +```text +{{ARCADE_PLUGIN_GATEWAY_URL}} +``` + +That gives you tools only. The plugin's skills, commands, and `arcade-operator` subagent need a client that loads [agent plugins](https://agent-plugins.org). See the [install guide](/get-started/agent-plugin) for the list. + +## Sign in to your apps + +No API keys. The first task that touches an app returns a browser sign-in link. Approve it once and Arcade holds the token from then on. + +## Try it + +- "What's on my calendar tomorrow?" +- "What apps can Arcade use?" + +## Next steps + +- [Install the agent plugin](/get-started/agent-plugin): one command for Cursor, Claude Code, VS Code, Copilot CLI, and Codex +- [Connect to MCP clients](/get-started/mcp-clients): point a client at a gateway you control, with your own tool list +- [From trial to team rollout](/get-started/agent-plugin/team-rollout): what changes when a team depends on the workflow diff --git a/app/en/get-started/agent-plugin/claude-desktop/page.mdx b/app/en/get-started/agent-plugin/claude-desktop/page.mdx new file mode 100644 index 000000000..ac577875a --- /dev/null +++ b/app/en/get-started/agent-plugin/claude-desktop/page.mdx @@ -0,0 +1,59 @@ +--- +title: "Install Arcade in Claude Desktop" +description: "Add Arcade tools to Claude Desktop as a custom connector, so Claude can act across the apps you connect." +--- + +import { Callout } from "nextra/components"; + +# Install Arcade in Claude Desktop + +Claude Desktop Chat does not install agent plugins, so it gets Arcade tools through a connector instead. You still sign in to each app in the browser, and you still need no API key. You just do not get the plugin's skills, commands, or `arcade-operator` subagent. + + + + +Connect Claude Desktop to Arcade and run a task against one of your apps. + + + + + +1. Claude Desktop, updated to a version that supports custom connectors + + + + + + + Using Cowork or Claude Code inside the Claude desktop app? Those do load agent + plugins. Install the full plugin with [one + command](/get-started/agent-plugin) instead. + + +## Add Arcade as a custom connector + +1. Open **Settings → Connectors** +2. Click **Add custom connector** +3. Paste the Arcade gateway URL: + +```text +{{ARCADE_PLUGIN_GATEWAY_URL}} +``` + +4. Save, then start a new conversation + +## Sign in to your apps + +The first time Claude reaches for an app, it returns a browser sign-in link. Approve it and Arcade holds the token from then on, so you only do this once per app. + +## Try it + +- "What's on my calendar tomorrow?" +- "What apps can Arcade use?" +- "Summarize the unread email from this week." + +## Next steps + +- [Install the agent plugin](/get-started/agent-plugin): the full experience in Cursor, Claude Code, VS Code, Copilot CLI, or Codex +- [From trial to team rollout](/get-started/agent-plugin/team-rollout): move a workflow onto a gateway you control +- [Use Arcade in Claude Desktop with your own gateway](/get-started/mcp-clients/claude-desktop): pick exactly which tools Claude can call diff --git a/app/en/get-started/agent-plugin/page.mdx b/app/en/get-started/agent-plugin/page.mdx new file mode 100644 index 000000000..0a475a261 --- /dev/null +++ b/app/en/get-started/agent-plugin/page.mdx @@ -0,0 +1,154 @@ +--- +title: "Install the Arcade agent plugin" +description: "Install Arcade in Cursor, Claude Code, VS Code, GitHub Copilot CLI, or Codex with one command. Your agent gets tools for every app you connect, with browser sign-in and no API keys." +--- + +import { Callout, Tabs } from "nextra/components"; + +# Install the Arcade agent plugin + +The Arcade agent plugin puts Arcade inside your coding agent with one command. Your agent gains tools for email, calendar, chat, issues, docs, and dozens of other apps, and you sign in to each app in the browser the first time it comes up. No API keys to create, no gateway to configure. + + + + +Install the Arcade agent plugin in your coding agent and run your first task against a connected app. + + + + + +1. [Node.js](https://nodejs.org) so you can run `npx` +2. A supported agent: Cursor, Claude Code, VS Code, GitHub Copilot CLI, or Codex + + + + + + + The plugin is built for personal use and evaluation. When you are ready to put + a workflow in front of a team, read [from trial to team + rollout](/get-started/agent-plugin/team-rollout). You will want your own [MCP + Gateway](/operate/governance/mcp-gateways) with a curated tool list and your + own identity provider. + + +## Install + +```bash +{{ARCADE_PLUGIN_INSTALL_COMMAND}} +``` + +The CLI detects the supported agents on your machine and installs to each one. To install to a single agent, pass `--target`: + +```bash +{{ARCADE_PLUGIN_INSTALL_COMMAND}} --target cursor +{{ARCADE_PLUGIN_INSTALL_COMMAND}} --target claude-code +{{ARCADE_PLUGIN_INSTALL_COMMAND}} --target vscode +{{ARCADE_PLUGIN_INSTALL_COMMAND}} --target copilot +{{ARCADE_PLUGIN_INSTALL_COMMAND}} --target codex +``` + +To see what an install would write without changing anything: + +```bash +npx plugins discover {{ARCADE_PLUGIN_REPO}} +``` + +Reload your agent afterwards if it does not pick up the plugin on its own. + +Using Claude Desktop or an agent that is not listed here? See [Claude Desktop](/get-started/agent-plugin/claude-desktop) or [any MCP client](/get-started/agent-plugin/any-mcp-client). + +## Verify the install per agent + + + + +Reload the window, open **Customize**, and confirm you see two skills, the `arcade-operator` agent, and the `arcade` MCP server. + +Cursor reads the plugin's Cursor manifest, so it loads the skills, the operator subagent, the slash commands, an always-on rule, and a session hook. + +**Tools only:** if you want Arcade tools without the skills and subagent, use the [one-click MCP install link]({{ARCADE_PLUGIN_CURSOR_INSTALL_LINK}}). + + + + +Run `claude plugin` and enable the plugin if Claude Code prompts you. Then run `/mcp` and confirm that the server named `arcade` is connected. + +The same install works in Claude Cowork and the Claude Code desktop app once you enable the plugin there. + + + The plugin registers one MCP server, named `arcade`. If your agent already has + other Arcade MCP connectors configured, the tool names collide and your agent + may call the wrong gateway. Disable the other Arcade connectors while you try + the plugin. + + + + + +Set `chat.plugins.enabled` to `true` if agent plugins are not enabled yet, then confirm the two skills and the `arcade` MCP server appear. + +VS Code loads the portable part of the plugin: the skills and the gateway. It does not register the `arcade-operator` subagent. + +If you already installed the plugin through GitHub Copilot CLI, VS Code may discover that copy too. Install in one place only. + +**Tools only:** use the [one-click MCP install link]({{ARCADE_PLUGIN_VSCODE_INSTALL_LINK}}) to add the gateway without the skills. + + + + +Confirm the two skills, the `arcade` MCP server, and the `arcade-operator` subagent are available. + +Copilot CLI reads the portable plugin manifest and also discovers the operator subagent. It does not load the plugin's session hooks, which use Claude Code's hook format. The skills carry the same guidance on this agent. + + + + +Confirm the two skills appear and the `arcade` MCP server is connected. Codex does not load the `arcade-operator` subagent. + +Codex and ChatGPT share one plugin directory, so a single install shows up on both surfaces. + + + + +## Sign in to your apps + +You never give your agent an API key or a password. The first task that touches an app returns a sign-in link, you approve it in the browser, and Arcade holds the token from then on. Ask your agent to run `/arcade-status` to list your connected apps, or `/arcade-connect google` to connect one ahead of time. + +## What you get in each agent + +Every install connects to the same Arcade gateway and gets the same tools. What differs is how much of the rest of the plugin each agent can load. + +| Agent | Tools | Skills | Subagent | Commands | Rule | Hooks | +| --- | :--: | :--: | :--: | :--: | :--: | :--: | +| Cursor | ✅ | 2 | ✅ | 3 | ✅ | ✅ | +| Claude Code | ✅ | 2 | ✅ | 3 | — | ✅ | +| Claude Cowork | ✅ | 2 | ✅ | 3 | — | ✅ | +| GitHub Copilot CLI | ✅ | 2 | ✅ | — | — | — | +| VS Code | ✅ | 2 | — | — | — | — | +| Codex and ChatGPT | ✅ | 2 | — | — | — | — | +| Claude Desktop | ✅ | — | — | — | — | — | +| Any other MCP client | ✅ | — | — | — | — | — | + +The two skills are `try-arcade`, which runs real work across your connected apps, and `scale-arcade`, which walks you through a team rollout. The subagent is `arcade-operator`, which keeps tool discovery out of your main conversation. The commands are `/arcade-apps`, `/arcade-connect`, and `/arcade-status`. + +The columns thin out because the [Agent Plugins](https://agent-plugins.org) 1.0 specification only makes skills and MCP servers portable. Commands, subagents, hooks, and editor rules are specific to each agent, so the plugin ships them where the agents that support them will find them. + +## Try it + +Ask your agent for an outcome rather than naming a tool: + +- "What's on my calendar tomorrow?" +- "Summarize the unread email from this week." +- "Draft a reply to that thread, then wait for me before sending it." +- "What can Arcade do?" + +Your agent asks you to confirm before it sends, creates, or deletes anything. + +## Next steps + +- [From trial to team rollout](/get-started/agent-plugin/team-rollout): move a workflow onto your own gateway +- [Connect to MCP clients](/get-started/mcp-clients): configure a client against a gateway you control +- [Integrations catalog](/resources/integrations): every app and toolkit Arcade supports +- [Agentic development](/get-started/setup/connect-arcade-docs): point your agent at these docs with `llms.txt` diff --git a/app/en/get-started/agent-plugin/team-rollout/page.mdx b/app/en/get-started/agent-plugin/team-rollout/page.mdx new file mode 100644 index 000000000..237e5f613 --- /dev/null +++ b/app/en/get-started/agent-plugin/team-rollout/page.mdx @@ -0,0 +1,47 @@ +--- +title: "From trial to team rollout" +description: "What changes when an Arcade workflow you proved with the agent plugin becomes something a team depends on: your own MCP Gateway, a curated tool list, and your own identity provider." +--- + +import { Callout } from "nextra/components"; + +# From trial to team rollout + +The [agent plugin](/get-started/agent-plugin) serves one person evaluating Arcade. It points every install at a shared Arcade gateway, offers a broad tool selection, and identifies you by the apps you signed in to yourself. That is exactly what you want while you are finding out whether a workflow is worth having. + +Once a team depends on that workflow, three things change. This page names them and points at the setup for each. + + + If your agent loaded the plugin's skills, ask it to run `/scale-arcade`. The + skill walks through the same decisions interactively against your own + workspace. + + +## You want your own gateway + +An [MCP Gateway](/operate/governance/mcp-gateways) is the endpoint your team's clients connect to, and it is where you decide what those clients can do. Create one per project in the [Arcade dashboard](https://app.arcade.dev) so each project gets a URL you control, its own tool list, and its own audit trail. + +Clients connect to it exactly the way they connected to the plugin's gateway. See the [MCP client guides](/get-started/mcp-clients) for Cursor, Claude Code, Claude Desktop, VS Code, and Copilot. + +## You want a curated tool list + +The gateway is the filter that decides which tools reach your agent. Open the **Allowed Tools** picker on your gateway and select across everything in scope: Arcade-hosted toolkits from the [integrations catalog](/resources/integrations), [remote MCP servers](/operate/governance/remote-mcp-servers) you register, and your own [custom MCP servers](/build/create-tools/tool-basics/build-mcp-server) deployed with [Arcade Deploy](/build/arcade-deploy). + +A smaller, deliberate tool list makes agents more accurate, not less capable. Save the gateway and connected clients see the new list on their next request, with no restart. + +Beyond the allowlist, [contextual access](/operate/governance/contextual-access) lets you allow or deny each individual tool call as it arrives, and [audit logs](/operate/governance/audit-logs) and [tool executions](/operate/governance/tool-executions) show you what actually ran. + +## You want your own user identities + +During a trial, you are the only user, and browser sign-in is enough. In production, each of your end users needs their own authorization, so an agent acting for one person can never reach another person's data. + +Configure a [User Source](/operate/identity/user-sources) on your gateway and Arcade redirects each end user to your existing identity provider, whether that is Entra ID, Okta, Auth0, Clerk, or another OIDC provider, then identifies them by an OIDC subject claim. + +## Going beyond MCP + +Connecting a client to a gateway takes the least work, and for many teams it is the whole rollout. When you are building your own product rather than configuring an agent, call Arcade directly instead: + +- [Arcade API reference](/references/api): the REST surface for tool calling and authorization +- [Agent frameworks](/get-started/agent-frameworks) for LangChain, CrewAI, OpenAI Agents, Google ADK, Mastra, Vercel AI SDK, and more +- [Get an API key](/get-started/setup/api-keys): required once you are calling Arcade from your own code +- [Build user-facing agents](/build/user-facing-agents): patterns for handling authorization on behalf of your users diff --git a/app/en/get-started/mcp-clients/claude-code/page.mdx b/app/en/get-started/mcp-clients/claude-code/page.mdx index fcfe7080b..67dcea789 100644 --- a/app/en/get-started/mcp-clients/claude-code/page.mdx +++ b/app/en/get-started/mcp-clients/claude-code/page.mdx @@ -3,6 +3,13 @@ import { SignupLink } from "@/app/_components/analytics"; # Use Arcade in Claude Code + + **Just trying Arcade?** The [Arcade agent plugin](/get-started/agent-plugin) + installs in one command, needs no API key, and signs you in to each app in the + browser. This guide is for pointing Claude Code at a gateway you control, with + your own tool list and your own end-user identities. + + diff --git a/app/en/get-started/mcp-clients/claude-desktop/page.mdx b/app/en/get-started/mcp-clients/claude-desktop/page.mdx index 827c84356..f7dd3c3af 100644 --- a/app/en/get-started/mcp-clients/claude-desktop/page.mdx +++ b/app/en/get-started/mcp-clients/claude-desktop/page.mdx @@ -34,6 +34,14 @@ export const STEP_7_LIGHT_HEIGHT = 2450; # Use Arcade in Claude Desktop + + **Just trying Arcade?** Add Arcade to Claude Desktop [as a + connector](/get-started/agent-plugin/claude-desktop), which needs no API key + and signs you in to each app in the browser. This guide is for pointing Claude + Desktop at a gateway you control, with your own tool list and your own + end-user identities. + + diff --git a/app/en/get-started/mcp-clients/cursor/page.mdx b/app/en/get-started/mcp-clients/cursor/page.mdx index 9e852f132..630922c7a 100644 --- a/app/en/get-started/mcp-clients/cursor/page.mdx +++ b/app/en/get-started/mcp-clients/cursor/page.mdx @@ -8,6 +8,13 @@ import { SignupLink } from "@/app/_components/analytics"; # Use Arcade in Cursor + + **Just trying Arcade?** The [Arcade agent plugin](/get-started/agent-plugin) + installs in one command, needs no API key, and signs you in to each app in the + browser. This guide is for pointing Cursor at a gateway you control, with your + own tool list and your own end-user identities. + + Cursor is an MCP client. Point it at an Arcade [MCP Gateway](/operate/governance/mcp-gateways) URL over the Streamable HTTP transport and Cursor's agent can call any tool you selected on that gateway — GitHub, Linear, Gmail, Slack, or any other toolkit from the [Arcade integrations catalog](/resources/integrations), plus tools from your own [custom MCP servers](/build/create-tools/tool-basics/build-mcp-server). diff --git a/app/en/get-started/mcp-clients/github-copilot/page.mdx b/app/en/get-started/mcp-clients/github-copilot/page.mdx index 7d73779ee..67f02aff5 100644 --- a/app/en/get-started/mcp-clients/github-copilot/page.mdx +++ b/app/en/get-started/mcp-clients/github-copilot/page.mdx @@ -20,6 +20,13 @@ export const VISUAL_STUDIO_STEP_6_HEIGHT = 360; # Use Arcade in GitHub Copilot + + **Just trying Arcade?** The [Arcade agent plugin](/get-started/agent-plugin) + installs into Copilot CLI in one command, needs no API key, and signs you in + to each app in the browser. This guide is for pointing Copilot at a gateway + you control, with your own tool list and your own end-user identities. + + diff --git a/app/en/get-started/mcp-clients/page.mdx b/app/en/get-started/mcp-clients/page.mdx index f9e3177b8..ac1f8af85 100644 --- a/app/en/get-started/mcp-clients/page.mdx +++ b/app/en/get-started/mcp-clients/page.mdx @@ -9,6 +9,10 @@ import { MCPClientGrid } from "./mcp-client-grid"; You can connect [Arcade MCP servers](/resources/integrations) to MCP-compatible clients and development environments to unlock powerful flows for your agents. -Every supported MCP client — Cursor, Claude Desktop, Claude Code, VS Code, GitHub Copilot, and Copilot Studio — connects to an Arcade [MCP Gateway](/operate/governance/mcp-gateways) over the Streamable HTTP transport. The gateway decides which tools the client can call: pick from Arcade-hosted toolkits (GitHub, Linear, Gmail, Slack, Google Calendar, Notion, Jira, Confluence, and dozens more in the [integrations catalog](/resources/integrations)), from [remote MCP servers](/operate/governance/remote-mcp-servers) you registered, and from your own [custom MCP servers](/build/create-tools/tool-basics/build-mcp-server) hosted with [Arcade Deploy](/build/arcade-deploy). +Every supported MCP client, including Cursor, Claude Desktop, Claude Code, VS Code, GitHub Copilot, and Copilot Studio, connects to an Arcade [MCP Gateway](/operate/governance/mcp-gateways) over the Streamable HTTP transport. The gateway decides which tools the client can call: pick from Arcade-hosted toolkits (GitHub, Linear, Gmail, Slack, Google Calendar, Notion, Jira, Confluence, and dozens more in the [integrations catalog](/resources/integrations)), from [remote MCP servers](/operate/governance/remote-mcp-servers) you registered, and from your own [custom MCP servers](/build/create-tools/tool-basics/build-mcp-server) hosted with [Arcade Deploy](/build/arcade-deploy). + +## Just trying Arcade out? + +These guides assume you want your own gateway, with a tool list and end-user identities you control. If you are evaluating Arcade for yourself, the [Arcade agent plugin](/get-started/agent-plugin) is faster: one command installs it into Cursor, Claude Code, VS Code, GitHub Copilot CLI, or Codex, there is no API key to create, and you sign in to each app in the browser. diff --git a/app/en/get-started/mcp-clients/visual-studio-code/page.mdx b/app/en/get-started/mcp-clients/visual-studio-code/page.mdx index 1957a3d50..96d15ca8e 100644 --- a/app/en/get-started/mcp-clients/visual-studio-code/page.mdx +++ b/app/en/get-started/mcp-clients/visual-studio-code/page.mdx @@ -5,6 +5,13 @@ import { SignupLink } from "@/app/_components/analytics"; In this guide, you'll learn how to connect Visual Studio Code to an Arcade MCP Gateway. + + **Just trying Arcade?** The [Arcade agent plugin](/get-started/agent-plugin) + installs in one command, needs no API key, and signs you in to each app in the + browser. This guide is for pointing VS Code at a gateway you control, with + your own tool list and your own end-user identities. + + **Production end users with their own identities?** If your end users already sign in to Entra ID, Okta, Auth0, Clerk, or another OIDC provider, configure a [User Source](/operate/identity/user-sources) on your gateway. Arcade redirects each end user to your identity provider on sign-in and identifies them by an OIDC subject claim. @@ -62,4 +69,4 @@ Note: if you are using the Arcade Header auth mode for your MCP Gateway, you wil } ``` -You will not see the authentication prompts when you start the MCP Server in Visual Studio Code because the API Key is passed directly. +You will not see the authentication prompts when you start the MCP Server in Visual Studio Code because the config passes the API key directly. diff --git a/lib/agent-plugin.ts b/lib/agent-plugin.ts new file mode 100644 index 000000000..8f5aefc31 --- /dev/null +++ b/lib/agent-plugin.ts @@ -0,0 +1,36 @@ +/** + * Every install surface for the Arcade agent plugin resolves from the values + * here. The gateway still points at staging, so swapping these two constants + * at public launch updates the prose, the copyable commands, and the one-click + * install links together. + * + * MDX pages reach these through `{{TOKEN}}` placeholders — see + * `lib/remark-substitute.ts` for the token list. + */ +export const AGENT_PLUGIN_GATEWAY_URL = + "https://api.bosslevel.dev/mcp/all-optimized"; + +export const AGENT_PLUGIN_REPO = "ArcadeAI/arcade-plugin"; + +export const AGENT_PLUGIN_INSTALL_COMMAND = `npx plugins add ${AGENT_PLUGIN_REPO}`; + +/** + * Cursor takes its MCP config as base64-encoded JSON in a query parameter. + */ +export const AGENT_PLUGIN_CURSOR_INSTALL_LINK = (() => { + const config = JSON.stringify({ url: AGENT_PLUGIN_GATEWAY_URL }); + const encoded = Buffer.from(config, "utf-8").toString("base64"); + return `https://cursor.com/install-mcp?name=arcade&config=${encoded}`; +})(); + +/** + * VS Code takes the same JSON percent-encoded instead, and wants the transport + * named explicitly. + */ +export const AGENT_PLUGIN_VSCODE_INSTALL_LINK = (() => { + const config = JSON.stringify({ + type: "http", + url: AGENT_PLUGIN_GATEWAY_URL, + }); + return `https://vscode.dev/redirect/mcp/install?name=arcade&config=${encodeURIComponent(config)}`; +})(); diff --git a/lib/remark-substitute.ts b/lib/remark-substitute.ts new file mode 100644 index 000000000..fb90af329 --- /dev/null +++ b/lib/remark-substitute.ts @@ -0,0 +1,69 @@ +import type { Root } from "mdast"; +import { visit } from "unist-util-visit"; +import { + AGENT_PLUGIN_CURSOR_INSTALL_LINK, + AGENT_PLUGIN_GATEWAY_URL, + AGENT_PLUGIN_INSTALL_COMMAND, + AGENT_PLUGIN_REPO, + AGENT_PLUGIN_VSCODE_INSTALL_LINK, +} from "./agent-plugin"; + +/** + * Tokens an MDX page can write as `{{NAME}}`. Prose, inline code, fenced code + * blocks, and link targets all resolve them, which is why pages use these + * instead of importing the constants directly — a fenced code block cannot + * interpolate JavaScript. + */ +export const substitutions: Record = { + ARCADE_PLUGIN_GATEWAY_URL: AGENT_PLUGIN_GATEWAY_URL, + ARCADE_PLUGIN_REPO: AGENT_PLUGIN_REPO, + ARCADE_PLUGIN_INSTALL_COMMAND: AGENT_PLUGIN_INSTALL_COMMAND, + ARCADE_PLUGIN_CURSOR_INSTALL_LINK: AGENT_PLUGIN_CURSOR_INSTALL_LINK, + ARCADE_PLUGIN_VSCODE_INSTALL_LINK: AGENT_PLUGIN_VSCODE_INSTALL_LINK, +}; + +/** + * Unknown tokens are left alone. Auth provider reference pages already write + * OAuth placeholders such as `{{client_id}}`, and those have to survive to the + * rendered page. + */ +export function applySubstitutions(value: string): string { + let result = value; + for (const [token, replacement] of Object.entries(substitutions)) { + result = result.split(`{{${token}}}`).join(replacement); + } + return result; +} + +/** + * The shape of a VFile that this plugin touches. Declared here so the plugin + * does not depend on `vfile` directly. + */ +type SourceFile = { value?: unknown }; + +export function remarkSubstitute() { + return (tree: Root, file: SourceFile) => { + // Nextra exports the untouched source string alongside the AST, and that + // copy is what feeds the "copy page" button and the markdown the site + // serves to agents. Substitute there too, or those readers get the raw + // token. + if (typeof file.value === "string") { + file.value = applySubstitutions(file.value); + } + + visit(tree, (node) => { + if ( + node.type === "text" || + node.type === "inlineCode" || + node.type === "code" + ) { + node.value = applySubstitutions(node.value); + return; + } + + if (node.type === "link" || node.type === "definition") { + node.url = applySubstitutions(node.url); + } + }); + }; +} diff --git a/next.config.ts b/next.config.ts index c6a53a2a5..e9da6d70c 100644 --- a/next.config.ts +++ b/next.config.ts @@ -2,6 +2,7 @@ import type { NextConfig } from "next"; import nextra from "nextra"; import { withLlmsTxt } from "./lib/next-plugin-llmstxt"; import { remarkGlossary } from "./lib/remark-glossary"; +import { remarkSubstitute } from "./lib/remark-substitute"; import { stripMarkdownFromSwcPageExtensions } from "./lib/swc-page-extensions"; import { redirects } from "./redirects"; @@ -16,6 +17,7 @@ const withNextra = nextra({ remarkGlossary, { glossaryPath: "./app/en/resources/glossary/page.mdx" }, ], + remarkSubstitute, ], }, }); diff --git a/tests/broken-link-check.test.ts b/tests/broken-link-check.test.ts index 593a89eac..d505e97da 100644 --- a/tests/broken-link-check.test.ts +++ b/tests/broken-link-check.test.ts @@ -3,6 +3,7 @@ import { join } from "node:path"; import fg from "fast-glob"; import { scanURLs, validateFiles } from "next-validate-link"; import { expect, test } from "vitest"; +import { applySubstitutions } from "@/lib/remark-substitute"; import { INTEGRATION_CATEGORIES, normalizeToolkitId, @@ -256,7 +257,15 @@ test( return false; }; - const found = await validateFiles(await fg("app/**/*.{md,mdx}"), { + // Pages write `{{TOKEN}}` placeholders for values that live in one place in + // the codebase, so resolve them before validating or the checker sees the + // literal token as a relative path. + const files = (await fg("app/**/*.{md,mdx}")).map((path) => ({ + path, + content: applySubstitutions(readFileSync(path, "utf-8")), + })); + + const found = await validateFiles(files, { scanned, whitelist, }); diff --git a/tests/remark-substitute.test.ts b/tests/remark-substitute.test.ts new file mode 100644 index 000000000..cf8f1ed5f --- /dev/null +++ b/tests/remark-substitute.test.ts @@ -0,0 +1,100 @@ +import type { Code, Link, Paragraph, Root, Text } from "mdast"; +import { describe, expect, it } from "vitest"; +import { AGENT_PLUGIN_GATEWAY_URL } from "@/lib/agent-plugin"; +import { applySubstitutions, remarkSubstitute } from "@/lib/remark-substitute"; + +const substitute = remarkSubstitute(); + +describe("applySubstitutions", () => { + it("replaces a known token", () => { + expect(applySubstitutions("Paste {{ARCADE_PLUGIN_GATEWAY_URL}}")).toBe( + `Paste ${AGENT_PLUGIN_GATEWAY_URL}` + ); + }); + + it("replaces every occurrence of a token", () => { + const result = applySubstitutions( + "{{ARCADE_PLUGIN_REPO}} and {{ARCADE_PLUGIN_REPO}}" + ); + expect(result).toBe("ArcadeAI/arcade-plugin and ArcadeAI/arcade-plugin"); + }); + + it("leaves unknown tokens alone so OAuth placeholders survive", () => { + expect(applySubstitutions('client_id: "{{client_id}}"')).toBe( + 'client_id: "{{client_id}}"' + ); + }); + + it("derives the one-click install links from the gateway URL", () => { + const cursor = applySubstitutions("{{ARCADE_PLUGIN_CURSOR_INSTALL_LINK}}"); + const encoded = new URL(cursor).searchParams.get("config") ?? ""; + const config = JSON.parse(Buffer.from(encoded, "base64").toString("utf-8")); + expect(config.url).toBe(AGENT_PLUGIN_GATEWAY_URL); + + const vscode = applySubstitutions("{{ARCADE_PLUGIN_VSCODE_INSTALL_LINK}}"); + const vscodeConfig = JSON.parse( + new URL(vscode).searchParams.get("config") ?? "" + ); + expect(vscodeConfig).toEqual({ + type: "http", + url: AGENT_PLUGIN_GATEWAY_URL, + }); + }); +}); + +describe("remarkSubstitute", () => { + it("substitutes in the raw source Nextra exports for copy-page and agents", () => { + const file = { + value: "Paste {{ARCADE_PLUGIN_GATEWAY_URL}} as an MCP server.", + }; + const tree: Root = { type: "root", children: [] }; + + substitute(tree, file); + + expect(file.value).toBe( + `Paste ${AGENT_PLUGIN_GATEWAY_URL} as an MCP server.` + ); + }); + + it("substitutes inside fenced code blocks", () => { + const code: Code = { + type: "code", + lang: "text", + value: "{{ARCADE_PLUGIN_GATEWAY_URL}}", + }; + const tree: Root = { type: "root", children: [code] }; + + substitute(tree, {}); + + expect(code.value).toBe(AGENT_PLUGIN_GATEWAY_URL); + }); + + it("substitutes inside link targets", () => { + const link: Link = { + type: "link", + url: "{{ARCADE_PLUGIN_GATEWAY_URL}}", + children: [], + }; + const paragraph: Paragraph = { type: "paragraph", children: [link] }; + const tree: Root = { type: "root", children: [paragraph] }; + + substitute(tree, {}); + + expect(link.url).toBe(AGENT_PLUGIN_GATEWAY_URL); + }); + + it("substitutes inside prose", () => { + const text: Text = { + type: "text", + value: "Run {{ARCADE_PLUGIN_INSTALL_COMMAND}} to start.", + }; + const paragraph: Paragraph = { type: "paragraph", children: [text] }; + const tree: Root = { type: "root", children: [paragraph] }; + + substitute(tree, {}); + + expect(text.value).toBe( + "Run npx plugins add ArcadeAI/arcade-plugin to start." + ); + }); +}); From b7ecaabeeea8ceae3eb9f28558864e81d0d4ebab Mon Sep 17 00:00:00 2001 From: "arcade-docs-bot[bot]" <321924871+arcade-docs-bot[bot]@users.noreply.github.com> Date: Thu, 3 Sep 2026 16:15:28 +0000 Subject: [PATCH 02/42] =?UTF-8?q?=F0=9F=A4=96=20Regenerate=20LLMs.txt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/llms.txt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/public/llms.txt b/public/llms.txt index ce30ec34c..c88332e2b 100644 --- a/public/llms.txt +++ b/public/llms.txt @@ -1,4 +1,4 @@ - + # Arcade @@ -129,6 +129,7 @@ Arcade docs serve two audiences. Start with the path that matches your goal: - [Evaluate Tools](https://docs.arcade.dev/en/build/create-tools/evaluate-tools): Documentation page - [Examples](https://docs.arcade.dev/en/resources/examples): This documentation page provides a collection of example applications that utilize Arcade's tools and MCP servers, showcasing various real-world scenarios and integration patterns. Users can explore complete source code and setup instructions for each example, enabling them to quickly understand and implement similar projects. - [Frequently Asked Questions](https://docs.arcade.dev/en/resources/faq): This documentation page provides answers to common questions about the Arcade platform, including how to create and contribute tools, the differences between various API keys, and authentication methods. Users can learn how to build custom tools, manage API keys for team collaboration, and understand +- [From trial to team rollout](https://docs.arcade.dev/en/get-started/agent-plugin/team-rollout): Documentation page - [Get Formatted Tool Definitions](https://docs.arcade.dev/en/build/tool-calling/custom-apps/get-tool-definitions): Documentation page - [Getting Your API Key](https://docs.arcade.dev/en/get-started/setup/api-keys): This documentation page guides users on how to obtain and manage their Arcade API key, detailing the steps for generating keys through both the Arcade dashboard and CLI. It emphasizes the importance of securely storing API keys, as they serve as administrator credentials that grant access to - [Governance](https://docs.arcade.dev/en/operate/governance): Documentation page @@ -138,6 +139,9 @@ Arcade docs serve two audiences. Start with the path that matches your goal: - [Hybrid MCP servers](https://docs.arcade.dev/en/operate/deploy/on-prem): Documentation page - [Identity](https://docs.arcade.dev/en/operate/identity): Documentation page - [In Custom Applications](https://docs.arcade.dev/en/build/tool-calling/custom-apps): Documentation page +- [Install Arcade in any MCP client](https://docs.arcade.dev/en/get-started/agent-plugin/any-mcp-client): Documentation page +- [Install Arcade in Claude Desktop](https://docs.arcade.dev/en/get-started/agent-plugin/claude-desktop): Documentation page +- [Install the Arcade agent plugin](https://docs.arcade.dev/en/get-started/agent-plugin): Documentation page - [Mastra](https://docs.arcade.dev/en/get-started/agent-frameworks/mastra): This documentation page guides users in building a TypeScript AI agent using the Mastra framework, enabling interaction with Gmail and Slack through Arcade tools. Users will learn to create an agent capable of reading emails, sending messages, and summarizing emails for Slack, - [MCP Gateways](https://docs.arcade.dev/en/operate/governance/mcp-gateways): Documentation page - [Microsoft Entra ID](https://docs.arcade.dev/en/operate/identity/user-sources/microsoft-entra-id): Documentation page From 4bdf47f2f2dc11272f9e2718b67f20e6d7abdee9 Mon Sep 17 00:00:00 2001 From: Teal Larson Date: Thu, 3 Sep 2026 12:22:02 -0400 Subject: [PATCH 03/42] docs(agent-plugin): say plainly that Arcade needs an account The pages implied the plugin needs no account at all, conflating "no API key" with "no signup". An Arcade account is required; what is different about this path is the timing. You install first, and the link your agent hands you on its first app task both creates the account and authorizes the app. Adds "Claude Desktop" to the Vale vocabulary so the new page title stops reading as stray capitalization. Co-Authored-By: Claude Opus 5 (1M context) --- app/en/get-started/agent-plugin/any-mcp-client/page.mdx | 4 ++-- app/en/get-started/agent-plugin/claude-desktop/page.mdx | 6 ++++-- app/en/get-started/agent-plugin/page.mdx | 8 +++++++- styles/config/vocabularies/Arcade/accept.txt | 1 + 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/app/en/get-started/agent-plugin/any-mcp-client/page.mdx b/app/en/get-started/agent-plugin/any-mcp-client/page.mdx index f2e115a1a..5c0792c2d 100644 --- a/app/en/get-started/agent-plugin/any-mcp-client/page.mdx +++ b/app/en/get-started/agent-plugin/any-mcp-client/page.mdx @@ -3,7 +3,7 @@ title: "Install Arcade in any MCP client" description: "Point any Streamable HTTP MCP client at the Arcade gateway to get tools for every app you connect, with no API key." --- -import { Callout } from "nextra/components"; +import { SignupLink } from "@/app/_components/analytics"; # Install Arcade in any MCP client @@ -17,7 +17,7 @@ That gives you tools only. The plugin's skills, commands, and `arcade-operator` ## Sign in to your apps -No API keys. The first task that touches an app returns a browser sign-in link. Approve it once and Arcade holds the token from then on. +No API keys. The first task that touches an app returns a browser link. Following it signs you in to Arcade, creating your account if you do not have one yet, and asks you to authorize the app. Approve it once and Arcade holds the token from then on. ## Try it diff --git a/app/en/get-started/agent-plugin/claude-desktop/page.mdx b/app/en/get-started/agent-plugin/claude-desktop/page.mdx index ac577875a..a9ff771f0 100644 --- a/app/en/get-started/agent-plugin/claude-desktop/page.mdx +++ b/app/en/get-started/agent-plugin/claude-desktop/page.mdx @@ -4,10 +4,11 @@ description: "Add Arcade tools to Claude Desktop as a custom connector, so Claud --- import { Callout } from "nextra/components"; +import { SignupLink } from "@/app/_components/analytics"; # Install Arcade in Claude Desktop -Claude Desktop Chat does not install agent plugins, so it gets Arcade tools through a connector instead. You still sign in to each app in the browser, and you still need no API key. You just do not get the plugin's skills, commands, or `arcade-operator` subagent. +Claude Desktop Chat does not install agent plugins, so it gets Arcade tools through a connector instead. You still authorize each app in the browser, and you still need no API key. You just do not get the plugin's skills, commands, or `arcade-operator` subagent. @@ -19,6 +20,7 @@ Connect Claude Desktop to Arcade and run a task against one of your apps. 1. Claude Desktop, updated to a version that supports custom connectors +2. An Arcade account, which you can create when Claude first asks you to authenticate @@ -44,7 +46,7 @@ Connect Claude Desktop to Arcade and run a task against one of your apps. ## Sign in to your apps -The first time Claude reaches for an app, it returns a browser sign-in link. Approve it and Arcade holds the token from then on, so you only do this once per app. +The first time Claude reaches for an app, it returns a browser link. Following it signs you in to Arcade, creating your account if you do not have one yet, and asks you to authorize the app Claude wants to use. Approve it and Arcade holds the token from then on, so you only do this once per app. ## Try it diff --git a/app/en/get-started/agent-plugin/page.mdx b/app/en/get-started/agent-plugin/page.mdx index 0a475a261..cd61e0389 100644 --- a/app/en/get-started/agent-plugin/page.mdx +++ b/app/en/get-started/agent-plugin/page.mdx @@ -4,11 +4,14 @@ description: "Install Arcade in Cursor, Claude Code, VS Code, GitHub Copilot CLI --- import { Callout, Tabs } from "nextra/components"; +import { SignupLink } from "@/app/_components/analytics"; # Install the Arcade agent plugin The Arcade agent plugin puts Arcade inside your coding agent with one command. Your agent gains tools for email, calendar, chat, issues, docs, and dozens of other apps, and you sign in to each app in the browser the first time it comes up. No API keys to create, no gateway to configure. +You do need an Arcade account, but not before you install. The first time your agent reaches for an app, it hands you a link, and you can create your account right there. + @@ -20,6 +23,7 @@ Install the Arcade agent plugin in your coding agent and run your first task aga 1. [Node.js](https://nodejs.org) so you can run `npx` 2. A supported agent: Cursor, Claude Code, VS Code, GitHub Copilot CLI, or Codex +3. An Arcade account, which you can create when your agent first asks you to authenticate @@ -114,7 +118,9 @@ Codex and ChatGPT share one plugin directory, so a single install shows up on bo ## Sign in to your apps -You never give your agent an API key or a password. The first task that touches an app returns a sign-in link, you approve it in the browser, and Arcade holds the token from then on. Ask your agent to run `/arcade-status` to list your connected apps, or `/arcade-connect google` to connect one ahead of time. +You never give your agent an API key or a password. The first task that touches an app returns a link, and that link does two things the first time you follow it: it signs you in to Arcade, creating your account if you do not have one yet, and it asks you to authorize the app your agent wants to use. Every app after that only needs the authorization step. + +Once you approve, Arcade holds the token, so you do this once per app. Ask your agent to run `/arcade-status` to list your connected apps, or `/arcade-connect google` to connect one ahead of time. ## What you get in each agent diff --git a/styles/config/vocabularies/Arcade/accept.txt b/styles/config/vocabularies/Arcade/accept.txt index 568ddd3f8..2863175ca 100644 --- a/styles/config/vocabularies/Arcade/accept.txt +++ b/styles/config/vocabularies/Arcade/accept.txt @@ -13,6 +13,7 @@ Entra ID Stytch Connected App Connected Apps +Claude Desktop LLM SDK API From 6fe150e9a8f9bf859ff09e1b510bffd2afc2e5fb Mon Sep 17 00:00:00 2001 From: Teal Larson Date: Thu, 3 Sep 2026 12:54:37 -0400 Subject: [PATCH 04/42] docs(agent-plugin): fix the auth model, drop the verify step, reframe rollout Corrects the sign-in story. An Arcade gateway authorizes on two layers and the pages described only one, blurred together: signing in to the gateway when your client connects, and authorizing each app when a task needs it. Both are now named, with a link to the existing server-level vs tool-level explainer, and the pages say plainly that tool calls, tokens, and secrets route through your own project, isolated from other users of the same gateway. Removes "Verify the install per agent". Checking that a plugin loaded is not something to do before trying it. The parts of that section that were real install steps (the enable flags, the one-click gateway-only links, the shared Codex/Copilot directories) moved into Install and a new Tools only section. Expands the component list into what each piece does for you, since naming six things in one paragraph explained none of them. Reframes the rollout page around the three questions a team has to answer rather than three things the reader is told they want, with a matching numbered list up front so the page survives skimming. Drops "trial" throughout in favor of personal use; nothing here is time limited. Co-Authored-By: Claude Opus 5 (1M context) --- app/en/get-started/agent-plugin/_meta.tsx | 2 +- .../agent-plugin/any-mcp-client/page.mdx | 8 +- .../agent-plugin/claude-desktop/page.mdx | 10 ++- app/en/get-started/agent-plugin/page.mdx | 89 +++++++------------ .../agent-plugin/team-rollout/page.mdx | 26 ++++-- .../mcp-clients/claude-code/page.mdx | 2 +- .../mcp-clients/claude-desktop/page.mdx | 2 +- .../get-started/mcp-clients/cursor/page.mdx | 2 +- .../mcp-clients/github-copilot/page.mdx | 2 +- app/en/get-started/mcp-clients/page.mdx | 4 +- .../mcp-clients/visual-studio-code/page.mdx | 2 +- 11 files changed, 66 insertions(+), 83 deletions(-) diff --git a/app/en/get-started/agent-plugin/_meta.tsx b/app/en/get-started/agent-plugin/_meta.tsx index 2184cc123..cbb3569d4 100644 --- a/app/en/get-started/agent-plugin/_meta.tsx +++ b/app/en/get-started/agent-plugin/_meta.tsx @@ -11,7 +11,7 @@ export const meta: MetaRecord = { title: "Any MCP client", }, "team-rollout": { - title: "From trial to team rollout", + title: "From personal use to team rollout", }, }; diff --git a/app/en/get-started/agent-plugin/any-mcp-client/page.mdx b/app/en/get-started/agent-plugin/any-mcp-client/page.mdx index 5c0792c2d..30ce5e44e 100644 --- a/app/en/get-started/agent-plugin/any-mcp-client/page.mdx +++ b/app/en/get-started/agent-plugin/any-mcp-client/page.mdx @@ -15,9 +15,11 @@ Any client that can talk to a Streamable HTTP MCP server can use Arcade tools, i That gives you tools only. The plugin's skills, commands, and `arcade-operator` subagent need a client that loads [agent plugins](https://agent-plugins.org). See the [install guide](/get-started/agent-plugin) for the list. -## Sign in to your apps +## Sign in -No API keys. The first task that touches an app returns a browser link. Following it signs you in to Arcade, creating your account if you do not have one yet, and asks you to authorize the app. Approve it once and Arcade holds the token from then on. +No API keys. You authorize twice: your client signs you in to Arcade with your Arcade account when it first connects to the gateway, and then each app gets authorized on its own the first time a task needs it. Approve that once per app and Arcade holds the token. + +Your tool calls, tokens, and secrets route through your own Arcade project, isolated from every other user of the same gateway. [Server-level and tool-level authorization](/learn/server-level-vs-tool-level-auth) covers the split in depth. ## Try it @@ -28,4 +30,4 @@ No API keys. The first task that touches an app returns a browser link. Followin - [Install the agent plugin](/get-started/agent-plugin): one command for Cursor, Claude Code, VS Code, Copilot CLI, and Codex - [Connect to MCP clients](/get-started/mcp-clients): point a client at a gateway you control, with your own tool list -- [From trial to team rollout](/get-started/agent-plugin/team-rollout): what changes when a team depends on the workflow +- [From personal use to team rollout](/get-started/agent-plugin/team-rollout): what changes when a team depends on the workflow diff --git a/app/en/get-started/agent-plugin/claude-desktop/page.mdx b/app/en/get-started/agent-plugin/claude-desktop/page.mdx index a9ff771f0..ec54a3d45 100644 --- a/app/en/get-started/agent-plugin/claude-desktop/page.mdx +++ b/app/en/get-started/agent-plugin/claude-desktop/page.mdx @@ -20,7 +20,7 @@ Connect Claude Desktop to Arcade and run a task against one of your apps. 1. Claude Desktop, updated to a version that supports custom connectors -2. An Arcade account, which you can create when Claude first asks you to authenticate +2. An Arcade account @@ -44,9 +44,11 @@ Connect Claude Desktop to Arcade and run a task against one of your apps. 4. Save, then start a new conversation -## Sign in to your apps +## Sign in -The first time Claude reaches for an app, it returns a browser link. Following it signs you in to Arcade, creating your account if you do not have one yet, and asks you to authorize the app Claude wants to use. Approve it and Arcade holds the token from then on, so you only do this once per app. +You authorize twice. Clicking **Connect** on the connector signs you in to Arcade and links Claude Desktop to the gateway. After that, the first time Claude reaches for an app, it returns a browser link asking you to authorize that app; approve it and Arcade holds the token, so you only do this once per app. + +Your tool calls, tokens, and secrets route through your own Arcade project, isolated from every other user of the same gateway. [Server-level and tool-level authorization](/learn/server-level-vs-tool-level-auth) covers the split in depth. ## Try it @@ -57,5 +59,5 @@ The first time Claude reaches for an app, it returns a browser link. Following i ## Next steps - [Install the agent plugin](/get-started/agent-plugin): the full experience in Cursor, Claude Code, VS Code, Copilot CLI, or Codex -- [From trial to team rollout](/get-started/agent-plugin/team-rollout): move a workflow onto a gateway you control +- [From personal use to team rollout](/get-started/agent-plugin/team-rollout): move a workflow onto a gateway you control - [Use Arcade in Claude Desktop with your own gateway](/get-started/mcp-clients/claude-desktop): pick exactly which tools Claude can call diff --git a/app/en/get-started/agent-plugin/page.mdx b/app/en/get-started/agent-plugin/page.mdx index cd61e0389..38a86f569 100644 --- a/app/en/get-started/agent-plugin/page.mdx +++ b/app/en/get-started/agent-plugin/page.mdx @@ -3,14 +3,12 @@ title: "Install the Arcade agent plugin" description: "Install Arcade in Cursor, Claude Code, VS Code, GitHub Copilot CLI, or Codex with one command. Your agent gets tools for every app you connect, with browser sign-in and no API keys." --- -import { Callout, Tabs } from "nextra/components"; +import { Callout } from "nextra/components"; import { SignupLink } from "@/app/_components/analytics"; # Install the Arcade agent plugin -The Arcade agent plugin puts Arcade inside your coding agent with one command. Your agent gains tools for email, calendar, chat, issues, docs, and dozens of other apps, and you sign in to each app in the browser the first time it comes up. No API keys to create, no gateway to configure. - -You do need an Arcade account, but not before you install. The first time your agent reaches for an app, it hands you a link, and you can create your account right there. +The Arcade agent plugin puts Arcade inside your coding agent with one command. Your agent gains tools for email, calendar, chat, issues, docs, and dozens of other apps, and you authorize each app in the browser the first time it comes up. No API keys to create, no gateway to configure. @@ -23,15 +21,15 @@ Install the Arcade agent plugin in your coding agent and run your first task aga 1. [Node.js](https://nodejs.org) so you can run `npx` 2. A supported agent: Cursor, Claude Code, VS Code, GitHub Copilot CLI, or Codex -3. An Arcade account, which you can create when your agent first asks you to authenticate +3. An Arcade account - The plugin is built for personal use and evaluation. When you are ready to put - a workflow in front of a team, read [from trial to team + The plugin is built for personal use. When you are ready to put + a workflow in front of a team, read [from personal use to team rollout](/get-started/agent-plugin/team-rollout). You will want your own [MCP Gateway](/operate/governance/mcp-gateways) with a curated tool list and your own identity provider. @@ -59,68 +57,33 @@ To see what an install would write without changing anything: npx plugins discover {{ARCADE_PLUGIN_REPO}} ``` -Reload your agent afterwards if it does not pick up the plugin on its own. - -Using Claude Desktop or an agent that is not listed here? See [Claude Desktop](/get-started/agent-plugin/claude-desktop) or [any MCP client](/get-started/agent-plugin/any-mcp-client). - -## Verify the install per agent - - - - -Reload the window, open **Customize**, and confirm you see two skills, the `arcade-operator` agent, and the `arcade` MCP server. +Reload your agent afterwards if it does not pick up the plugin on its own. A couple of agents gate plugins behind a setting. Claude Code may ask you to enable it with `claude plugin`, and VS Code needs `chat.plugins.enabled` set to `true`. -Cursor reads the plugin's Cursor manifest, so it loads the skills, the operator subagent, the slash commands, an always-on rule, and a session hook. +Two things worth knowing if you use more than one agent. Codex and ChatGPT share a plugin directory, so one install covers both. And VS Code can discover a copy installed through GitHub Copilot CLI, so install in one place rather than both. -**Tools only:** if you want Arcade tools without the skills and subagent, use the [one-click MCP install link]({{ARCADE_PLUGIN_CURSOR_INSTALL_LINK}}). - - - - -Run `claude plugin` and enable the plugin if Claude Code prompts you. Then run `/mcp` and confirm that the server named `arcade` is connected. - -The same install works in Claude Cowork and the Claude Code desktop app once you enable the plugin there. - - - The plugin registers one MCP server, named `arcade`. If your agent already has - other Arcade MCP connectors configured, the tool names collide and your agent - may call the wrong gateway. Disable the other Arcade connectors while you try - the plugin. - - - - - -Set `chat.plugins.enabled` to `true` if agent plugins are not enabled yet, then confirm the two skills and the `arcade` MCP server appear. - -VS Code loads the portable part of the plugin: the skills and the gateway. It does not register the `arcade-operator` subagent. - -If you already installed the plugin through GitHub Copilot CLI, VS Code may discover that copy too. Install in one place only. - -**Tools only:** use the [one-click MCP install link]({{ARCADE_PLUGIN_VSCODE_INSTALL_LINK}}) to add the gateway without the skills. +Using Claude Desktop or an agent that is not listed here? See [Claude Desktop](/get-started/agent-plugin/claude-desktop) or [any MCP client](/get-started/agent-plugin/any-mcp-client). - - +## Tools only -Confirm the two skills, the `arcade` MCP server, and the `arcade-operator` subagent are available. +If you want Arcade tools without the skills, commands, and subagent, Cursor and VS Code can add the gateway on its own: -Copilot CLI reads the portable plugin manifest and also discovers the operator subagent. It does not load the plugin's session hooks, which use Claude Code's hook format. The skills carry the same guidance on this agent. +- **Cursor:** use [this link]({{ARCADE_PLUGIN_CURSOR_INSTALL_LINK}}) for a one-click MCP install. +- **VS Code:** use [this link]({{ARCADE_PLUGIN_VSCODE_INSTALL_LINK}}) for a one-click MCP install. - - +For any other client, add the gateway URL by hand. See [any MCP client](/get-started/agent-plugin/any-mcp-client). -Confirm the two skills appear and the `arcade` MCP server is connected. Codex does not load the `arcade-operator` subagent. +## Sign in -Codex and ChatGPT share one plugin directory, so a single install shows up on both surfaces. +You authorize twice, and the two are doing different jobs. - - +1. **Into the gateway.** Your client asks you to authenticate when it first connects. You sign in to Arcade in the browser, and the client can reach the gateway from then on. +2. **Into each app.** When a task needs Gmail, Slack, Linear, or anything else, your agent hands you a link that grants the scopes that task requires. Approve it once and Arcade holds the token for that app. -## Sign in to your apps +You never give your agent an API key or a password for either layer. Ask your agent to run `/arcade-status` to see where you stand, or `/arcade-connect google` to authorize an app before you need it. -You never give your agent an API key or a password. The first task that touches an app returns a link, and that link does two things the first time you follow it: it signs you in to Arcade, creating your account if you do not have one yet, and it asks you to authorize the app your agent wants to use. Every app after that only needs the authorization step. +Every install points at the same gateway URL, but your tool calls, tokens, and secrets route through your own Arcade project, isolated from every other user of that gateway. No one else's agent can reach your apps. -Once you approve, Arcade holds the token, so you do this once per app. Ask your agent to run `/arcade-status` to list your connected apps, or `/arcade-connect google` to connect one ahead of time. +Every Arcade gateway works this way, not just the one in the plugin. [Server-level and tool-level authorization](/learn/server-level-vs-tool-level-auth) goes deeper on the split. ## What you get in each agent @@ -137,7 +100,15 @@ Every install connects to the same Arcade gateway and gets the same tools. What | Claude Desktop | ✅ | — | — | — | — | — | | Any other MCP client | ✅ | — | — | — | — | — | -The two skills are `try-arcade`, which runs real work across your connected apps, and `scale-arcade`, which walks you through a team rollout. The subagent is `arcade-operator`, which keeps tool discovery out of your main conversation. The commands are `/arcade-apps`, `/arcade-connect`, and `/arcade-status`. +Here is what each of those is for. + +**Commands** are the part you type. `/arcade-status` reports whether the gateway is reachable, whether you have signed in, and which apps you have authorized. `/arcade-connect ` authorizes an app on demand, so you are not interrupted mid-task. `/arcade-apps` lists what you have connected and lets you disconnect one. + +**Skills** are instructions your agent reads on its own, so you never have to invoke them. `try-arcade` teaches it to turn a request like "reply to that thread" into the right sequence of tool calls across your apps. `scale-arcade` handles the other kind of question, the one about moving a workflow onto a team gateway, and it walks you through the decisions on [this page](/get-started/agent-plugin/team-rollout) against your own workspace. + +**The subagent**, `arcade-operator`, runs an app task in its own context and reports back just the result. Arcade exposes a lot of tools, and searching them fills a conversation with noise that pushes out your actual work. The operator absorbs that. + +**The rule and hooks** are Cursor and Claude Code specific. They tell your agent that Arcade exists and when reaching for it is the right move, which is the difference between a tool that sits unused and one your agent actually picks up. The columns thin out because the [Agent Plugins](https://agent-plugins.org) 1.0 specification only makes skills and MCP servers portable. Commands, subagents, hooks, and editor rules are specific to each agent, so the plugin ships them where the agents that support them will find them. @@ -154,7 +125,7 @@ Your agent asks you to confirm before it sends, creates, or deletes anything. ## Next steps -- [From trial to team rollout](/get-started/agent-plugin/team-rollout): move a workflow onto your own gateway +- [From personal use to team rollout](/get-started/agent-plugin/team-rollout): move a workflow onto your own gateway - [Connect to MCP clients](/get-started/mcp-clients): configure a client against a gateway you control - [Integrations catalog](/resources/integrations): every app and toolkit Arcade supports - [Agentic development](/get-started/setup/connect-arcade-docs): point your agent at these docs with `llms.txt` diff --git a/app/en/get-started/agent-plugin/team-rollout/page.mdx b/app/en/get-started/agent-plugin/team-rollout/page.mdx index 237e5f613..46788f4ba 100644 --- a/app/en/get-started/agent-plugin/team-rollout/page.mdx +++ b/app/en/get-started/agent-plugin/team-rollout/page.mdx @@ -1,15 +1,23 @@ --- -title: "From trial to team rollout" +title: "From personal use to team rollout" description: "What changes when an Arcade workflow you proved with the agent plugin becomes something a team depends on: your own MCP Gateway, a curated tool list, and your own identity provider." --- import { Callout } from "nextra/components"; -# From trial to team rollout +# From personal use to team rollout -The [agent plugin](/get-started/agent-plugin) serves one person evaluating Arcade. It points every install at a shared Arcade gateway, offers a broad tool selection, and identifies you by the apps you signed in to yourself. That is exactly what you want while you are finding out whether a workflow is worth having. +The [agent plugin](/get-started/agent-plugin) serves one person working on their own. Every install points at the same global gateway URL, and that is where the sharing ends. Your tool calls, tokens, and secrets route through your own Arcade project, isolated from every other user of that gateway. No one else's agent can reach your Gmail, and yours cannot reach theirs. -Once a team depends on that workflow, three things change. This page names them and points at the setup for each. +What the plugin gives you is a broad tool selection and an identity that is yours alone, which is what you want for your own work. + +Once a team depends on that workflow, three questions you never had to answer start to matter: + +1. Where does your team connect? +2. Which tools can they call? +3. Who is each end user? + +Each one has a section below, in that order. If your agent loaded the plugin's skills, ask it to run `/scale-arcade`. The @@ -17,13 +25,13 @@ Once a team depends on that workflow, three things change. This page names them workspace. -## You want your own gateway +## Where does your team connect? An [MCP Gateway](/operate/governance/mcp-gateways) is the endpoint your team's clients connect to, and it is where you decide what those clients can do. Create one per project in the [Arcade dashboard](https://app.arcade.dev) so each project gets a URL you control, its own tool list, and its own audit trail. Clients connect to it exactly the way they connected to the plugin's gateway. See the [MCP client guides](/get-started/mcp-clients) for Cursor, Claude Code, Claude Desktop, VS Code, and Copilot. -## You want a curated tool list +## Which tools can they call? The gateway is the filter that decides which tools reach your agent. Open the **Allowed Tools** picker on your gateway and select across everything in scope: Arcade-hosted toolkits from the [integrations catalog](/resources/integrations), [remote MCP servers](/operate/governance/remote-mcp-servers) you register, and your own [custom MCP servers](/build/create-tools/tool-basics/build-mcp-server) deployed with [Arcade Deploy](/build/arcade-deploy). @@ -31,13 +39,13 @@ A smaller, deliberate tool list makes agents more accurate, not less capable. Sa Beyond the allowlist, [contextual access](/operate/governance/contextual-access) lets you allow or deny each individual tool call as it arrives, and [audit logs](/operate/governance/audit-logs) and [tool executions](/operate/governance/tool-executions) show you what actually ran. -## You want your own user identities +## Who is each end user? -During a trial, you are the only user, and browser sign-in is enough. In production, each of your end users needs their own authorization, so an agent acting for one person can never reach another person's data. +When you are the only user, signing in to each app yourself is enough. In production, each of your end users needs their own authorization, so an agent acting for one person can never reach another person's data. Configure a [User Source](/operate/identity/user-sources) on your gateway and Arcade redirects each end user to your existing identity provider, whether that is Entra ID, Okta, Auth0, Clerk, or another OIDC provider, then identifies them by an OIDC subject claim. -## Going beyond MCP +## Building your own product? Connecting a client to a gateway takes the least work, and for many teams it is the whole rollout. When you are building your own product rather than configuring an agent, call Arcade directly instead: diff --git a/app/en/get-started/mcp-clients/claude-code/page.mdx b/app/en/get-started/mcp-clients/claude-code/page.mdx index 67dcea789..e97bb9f22 100644 --- a/app/en/get-started/mcp-clients/claude-code/page.mdx +++ b/app/en/get-started/mcp-clients/claude-code/page.mdx @@ -4,7 +4,7 @@ import { SignupLink } from "@/app/_components/analytics"; # Use Arcade in Claude Code - **Just trying Arcade?** The [Arcade agent plugin](/get-started/agent-plugin) + **Setting Arcade up for yourself?** The [Arcade agent plugin](/get-started/agent-plugin) installs in one command, needs no API key, and signs you in to each app in the browser. This guide is for pointing Claude Code at a gateway you control, with your own tool list and your own end-user identities. diff --git a/app/en/get-started/mcp-clients/claude-desktop/page.mdx b/app/en/get-started/mcp-clients/claude-desktop/page.mdx index f7dd3c3af..0e016d6e4 100644 --- a/app/en/get-started/mcp-clients/claude-desktop/page.mdx +++ b/app/en/get-started/mcp-clients/claude-desktop/page.mdx @@ -35,7 +35,7 @@ export const STEP_7_LIGHT_HEIGHT = 2450; # Use Arcade in Claude Desktop - **Just trying Arcade?** Add Arcade to Claude Desktop [as a + **Setting Arcade up for yourself?** Add Arcade to Claude Desktop [as a connector](/get-started/agent-plugin/claude-desktop), which needs no API key and signs you in to each app in the browser. This guide is for pointing Claude Desktop at a gateway you control, with your own tool list and your own diff --git a/app/en/get-started/mcp-clients/cursor/page.mdx b/app/en/get-started/mcp-clients/cursor/page.mdx index 630922c7a..c7bc52e01 100644 --- a/app/en/get-started/mcp-clients/cursor/page.mdx +++ b/app/en/get-started/mcp-clients/cursor/page.mdx @@ -9,7 +9,7 @@ import { SignupLink } from "@/app/_components/analytics"; # Use Arcade in Cursor - **Just trying Arcade?** The [Arcade agent plugin](/get-started/agent-plugin) + **Setting Arcade up for yourself?** The [Arcade agent plugin](/get-started/agent-plugin) installs in one command, needs no API key, and signs you in to each app in the browser. This guide is for pointing Cursor at a gateway you control, with your own tool list and your own end-user identities. diff --git a/app/en/get-started/mcp-clients/github-copilot/page.mdx b/app/en/get-started/mcp-clients/github-copilot/page.mdx index 67f02aff5..de4e0d7b8 100644 --- a/app/en/get-started/mcp-clients/github-copilot/page.mdx +++ b/app/en/get-started/mcp-clients/github-copilot/page.mdx @@ -21,7 +21,7 @@ export const VISUAL_STUDIO_STEP_6_HEIGHT = 360; # Use Arcade in GitHub Copilot - **Just trying Arcade?** The [Arcade agent plugin](/get-started/agent-plugin) + **Setting Arcade up for yourself?** The [Arcade agent plugin](/get-started/agent-plugin) installs into Copilot CLI in one command, needs no API key, and signs you in to each app in the browser. This guide is for pointing Copilot at a gateway you control, with your own tool list and your own end-user identities. diff --git a/app/en/get-started/mcp-clients/page.mdx b/app/en/get-started/mcp-clients/page.mdx index ac1f8af85..bfb55baaf 100644 --- a/app/en/get-started/mcp-clients/page.mdx +++ b/app/en/get-started/mcp-clients/page.mdx @@ -13,6 +13,6 @@ Every supported MCP client, including Cursor, Claude Desktop, Claude Code, VS Co -## Just trying Arcade out? +## Setting Arcade up for yourself? -These guides assume you want your own gateway, with a tool list and end-user identities you control. If you are evaluating Arcade for yourself, the [Arcade agent plugin](/get-started/agent-plugin) is faster: one command installs it into Cursor, Claude Code, VS Code, GitHub Copilot CLI, or Codex, there is no API key to create, and you sign in to each app in the browser. +These guides assume you want your own gateway, with a tool list and end-user identities you control. If you are setting Arcade up for your own work, the [Arcade agent plugin](/get-started/agent-plugin) is faster: one command installs it into Cursor, Claude Code, VS Code, GitHub Copilot CLI, or Codex, there is no API key to create, and you sign in to each app in the browser. diff --git a/app/en/get-started/mcp-clients/visual-studio-code/page.mdx b/app/en/get-started/mcp-clients/visual-studio-code/page.mdx index 96d15ca8e..83a0ede30 100644 --- a/app/en/get-started/mcp-clients/visual-studio-code/page.mdx +++ b/app/en/get-started/mcp-clients/visual-studio-code/page.mdx @@ -6,7 +6,7 @@ import { SignupLink } from "@/app/_components/analytics"; In this guide, you'll learn how to connect Visual Studio Code to an Arcade MCP Gateway. - **Just trying Arcade?** The [Arcade agent plugin](/get-started/agent-plugin) + **Setting Arcade up for yourself?** The [Arcade agent plugin](/get-started/agent-plugin) installs in one command, needs no API key, and signs you in to each app in the browser. This guide is for pointing VS Code at a gateway you control, with your own tool list and your own end-user identities. From b3d51d5d8f9278c7908e7f0bd224f03a04e0f6b3 Mon Sep 17 00:00:00 2001 From: Teal Larson Date: Thu, 3 Sep 2026 13:10:36 -0400 Subject: [PATCH 05/42] docs(agent-plugin): install Claude Desktop from the bundle, reframe tools-only Claude Desktop ships as a downloadable .mcpb bundle, so the page now leads with that download and keeps the custom-connector URL as the by-hand alternative at the bottom. The bundle URL points at the latest GitHub release and derives from the repo constant; confirm the asset filename once a release publishes. Renames "any MCP client" to "tools only", which is the actual distinction. The old page sorted clients by whether they support plugins; readers care whether they want the tools alone or the whole plugin. It now says what you give up by skipping the skills, commands, and subagent, so the choice is informed rather than a fallback. Co-Authored-By: Claude Opus 5 (1M context) --- app/en/get-started/agent-plugin/_meta.tsx | 4 +- .../agent-plugin/any-mcp-client/page.mdx | 33 -------------- .../agent-plugin/claude-desktop/page.mdx | 40 +++++++++-------- app/en/get-started/agent-plugin/page.mdx | 4 +- .../agent-plugin/tools-only/page.mdx | 45 +++++++++++++++++++ .../mcp-clients/claude-desktop/page.mdx | 10 ++--- lib/agent-plugin.ts | 7 +++ lib/remark-substitute.ts | 2 + redirects.ts | 5 +++ 9 files changed, 90 insertions(+), 60 deletions(-) delete mode 100644 app/en/get-started/agent-plugin/any-mcp-client/page.mdx create mode 100644 app/en/get-started/agent-plugin/tools-only/page.mdx diff --git a/app/en/get-started/agent-plugin/_meta.tsx b/app/en/get-started/agent-plugin/_meta.tsx index cbb3569d4..b14e6acf0 100644 --- a/app/en/get-started/agent-plugin/_meta.tsx +++ b/app/en/get-started/agent-plugin/_meta.tsx @@ -7,8 +7,8 @@ export const meta: MetaRecord = { "claude-desktop": { title: "Claude Desktop", }, - "any-mcp-client": { - title: "Any MCP client", + "tools-only": { + title: "Tools only", }, "team-rollout": { title: "From personal use to team rollout", diff --git a/app/en/get-started/agent-plugin/any-mcp-client/page.mdx b/app/en/get-started/agent-plugin/any-mcp-client/page.mdx deleted file mode 100644 index 30ce5e44e..000000000 --- a/app/en/get-started/agent-plugin/any-mcp-client/page.mdx +++ /dev/null @@ -1,33 +0,0 @@ ---- -title: "Install Arcade in any MCP client" -description: "Point any Streamable HTTP MCP client at the Arcade gateway to get tools for every app you connect, with no API key." ---- - -import { SignupLink } from "@/app/_components/analytics"; - -# Install Arcade in any MCP client - -Any client that can talk to a Streamable HTTP MCP server can use Arcade tools, including OpenCode and clients that do not support agent plugins at all. Add this URL as an MCP server: - -```text -{{ARCADE_PLUGIN_GATEWAY_URL}} -``` - -That gives you tools only. The plugin's skills, commands, and `arcade-operator` subagent need a client that loads [agent plugins](https://agent-plugins.org). See the [install guide](/get-started/agent-plugin) for the list. - -## Sign in - -No API keys. You authorize twice: your client signs you in to Arcade with your Arcade account when it first connects to the gateway, and then each app gets authorized on its own the first time a task needs it. Approve that once per app and Arcade holds the token. - -Your tool calls, tokens, and secrets route through your own Arcade project, isolated from every other user of the same gateway. [Server-level and tool-level authorization](/learn/server-level-vs-tool-level-auth) covers the split in depth. - -## Try it - -- "What's on my calendar tomorrow?" -- "What apps can Arcade use?" - -## Next steps - -- [Install the agent plugin](/get-started/agent-plugin): one command for Cursor, Claude Code, VS Code, Copilot CLI, and Codex -- [Connect to MCP clients](/get-started/mcp-clients): point a client at a gateway you control, with your own tool list -- [From personal use to team rollout](/get-started/agent-plugin/team-rollout): what changes when a team depends on the workflow diff --git a/app/en/get-started/agent-plugin/claude-desktop/page.mdx b/app/en/get-started/agent-plugin/claude-desktop/page.mdx index ec54a3d45..aab35fa5e 100644 --- a/app/en/get-started/agent-plugin/claude-desktop/page.mdx +++ b/app/en/get-started/agent-plugin/claude-desktop/page.mdx @@ -1,6 +1,6 @@ --- title: "Install Arcade in Claude Desktop" -description: "Add Arcade tools to Claude Desktop as a custom connector, so Claude can act across the apps you connect." +description: "Install the Arcade bundle in Claude Desktop with one download, or add the gateway as a custom connector, so Claude can act across the apps you connect." --- import { Callout } from "nextra/components"; @@ -8,18 +8,18 @@ import { SignupLink } from "@/app/_components/analytics"; # Install Arcade in Claude Desktop -Claude Desktop Chat does not install agent plugins, so it gets Arcade tools through a connector instead. You still authorize each app in the browser, and you still need no API key. You just do not get the plugin's skills, commands, or `arcade-operator` subagent. +Claude Desktop installs Arcade from a bundle rather than the `npx` command the coding agents use. Download it, open it, and Claude Desktop handles the rest. No API keys, and you authorize each app in the browser the first time it comes up. -Connect Claude Desktop to Arcade and run a task against one of your apps. +Install the Arcade bundle in Claude Desktop and run a task against one of your apps. -1. Claude Desktop, updated to a version that supports custom connectors +1. Claude Desktop, updated to a version that supports extensions 2. An Arcade account @@ -27,26 +27,20 @@ Connect Claude Desktop to Arcade and run a task against one of your apps. - Using Cowork or Claude Code inside the Claude desktop app? Those do load agent - plugins. Install the full plugin with [one - command](/get-started/agent-plugin) instead. + Using Cowork or Claude Code inside the Claude desktop app? Those load the full + agent plugin, with skills, commands, and the `arcade-operator` subagent. + Install it with [one command](/get-started/agent-plugin) instead. -## Add Arcade as a custom connector +## Install the bundle -1. Open **Settings → Connectors** -2. Click **Add custom connector** -3. Paste the Arcade gateway URL: - -```text -{{ARCADE_PLUGIN_GATEWAY_URL}} -``` - -4. Save, then start a new conversation +1. Download [the Arcade bundle]({{ARCADE_PLUGIN_MCPB_URL}}) +2. Open the downloaded `.mcpb` file, and Claude Desktop offers to install it +3. Confirm the install, then start a new conversation ## Sign in -You authorize twice. Clicking **Connect** on the connector signs you in to Arcade and links Claude Desktop to the gateway. After that, the first time Claude reaches for an app, it returns a browser link asking you to authorize that app; approve it and Arcade holds the token, so you only do this once per app. +You authorize twice. Connecting Arcade signs you in and links Claude Desktop to the gateway. After that, the first time Claude reaches for an app, it returns a browser link asking you to authorize that app. Approve it and Arcade holds the token, so you only do this once per app. Your tool calls, tokens, and secrets route through your own Arcade project, isolated from every other user of the same gateway. [Server-level and tool-level authorization](/learn/server-level-vs-tool-level-auth) covers the split in depth. @@ -56,6 +50,16 @@ Your tool calls, tokens, and secrets route through your own Arcade project, isol - "What apps can Arcade use?" - "Summarize the unread email from this week." +## Add the gateway by hand instead + +If you would rather not install a bundle, Claude Desktop can reach the same gateway as a custom connector. Open **Settings → Connectors**, click **Add custom connector**, and paste: + +```text +{{ARCADE_PLUGIN_GATEWAY_URL}} +``` + +Save, then start a new conversation. You get the same tools this way; the bundle just saves you the trip through settings. + ## Next steps - [Install the agent plugin](/get-started/agent-plugin): the full experience in Cursor, Claude Code, VS Code, Copilot CLI, or Codex diff --git a/app/en/get-started/agent-plugin/page.mdx b/app/en/get-started/agent-plugin/page.mdx index 38a86f569..e10a95b3d 100644 --- a/app/en/get-started/agent-plugin/page.mdx +++ b/app/en/get-started/agent-plugin/page.mdx @@ -61,7 +61,7 @@ Reload your agent afterwards if it does not pick up the plugin on its own. A cou Two things worth knowing if you use more than one agent. Codex and ChatGPT share a plugin directory, so one install covers both. And VS Code can discover a copy installed through GitHub Copilot CLI, so install in one place rather than both. -Using Claude Desktop or an agent that is not listed here? See [Claude Desktop](/get-started/agent-plugin/claude-desktop) or [any MCP client](/get-started/agent-plugin/any-mcp-client). +Using Claude Desktop? It installs from a downloadable bundle instead. See [Install Arcade in Claude Desktop](/get-started/agent-plugin/claude-desktop). For any other client, see [Arcade tools without the plugin](/get-started/agent-plugin/tools-only). ## Tools only @@ -70,7 +70,7 @@ If you want Arcade tools without the skills, commands, and subagent, Cursor and - **Cursor:** use [this link]({{ARCADE_PLUGIN_CURSOR_INSTALL_LINK}}) for a one-click MCP install. - **VS Code:** use [this link]({{ARCADE_PLUGIN_VSCODE_INSTALL_LINK}}) for a one-click MCP install. -For any other client, add the gateway URL by hand. See [any MCP client](/get-started/agent-plugin/any-mcp-client). +For any other client, add the gateway URL by hand. See [Arcade tools without the plugin](/get-started/agent-plugin/tools-only). ## Sign in diff --git a/app/en/get-started/agent-plugin/tools-only/page.mdx b/app/en/get-started/agent-plugin/tools-only/page.mdx new file mode 100644 index 000000000..f35a4389d --- /dev/null +++ b/app/en/get-started/agent-plugin/tools-only/page.mdx @@ -0,0 +1,45 @@ +--- +title: "Arcade tools without the plugin" +description: "Point any Streamable HTTP MCP client at the Arcade gateway to get tools for every app you connect, with no API key and no plugin install." +--- + +import { SignupLink } from "@/app/_components/analytics"; + +# Arcade tools without the plugin + +The plugin bundles more than tools: two skills, three commands, and the `arcade-operator` subagent, all of which need a client that loads [agent plugins](https://agent-plugins.org). If you only want the tools, or your client does not load plugins at all, point it straight at the gateway: + +```text +{{ARCADE_PLUGIN_GATEWAY_URL}} +``` + +Any client that speaks the Streamable HTTP MCP transport works, OpenCode included. Your agent gets every tool on the gateway and nothing else changes about how you use it. + +Cursor and VS Code can add the gateway this way in one click. [The install guide](/get-started/agent-plugin#tools-only) has those links. + +## What you give up + +Tools alone still do the work. What you lose is the part that helps your agent use them well: + +- **The skills** teach your agent to turn "reply to that thread" into the right sequence of tool calls, and to walk you through a team rollout when you ask about one. +- **The commands** give you `/arcade-status`, `/arcade-connect`, and `/arcade-apps` for checking and managing connections without leaving your agent. +- **The subagent** keeps tool search out of your main conversation, so it does not crowd out your actual work. + +If your client supports plugins, [install the full plugin](/get-started/agent-plugin) instead. + +## Sign in + +No API keys. You authorize twice: your client signs you in to Arcade with your Arcade account when it first connects to the gateway, and then each app gets authorized on its own the first time a task needs it. Approve that once per app and Arcade holds the token. + +Your tool calls, tokens, and secrets route through your own Arcade project, isolated from every other user of the same gateway. [Server-level and tool-level authorization](/learn/server-level-vs-tool-level-auth) covers the split in depth. + +## Try it + +- "What's on my calendar tomorrow?" +- "What apps can Arcade use?" + +## Next steps + +- [Install the agent plugin](/get-started/agent-plugin): one command for Cursor, Claude Code, VS Code, Copilot CLI, and Codex +- [Connect to MCP clients](/get-started/mcp-clients): point a client at a gateway you control, with your own tool list +- [From personal use to team rollout](/get-started/agent-plugin/team-rollout): what changes when a team depends on the workflow diff --git a/app/en/get-started/mcp-clients/claude-desktop/page.mdx b/app/en/get-started/mcp-clients/claude-desktop/page.mdx index 0e016d6e4..3bade526b 100644 --- a/app/en/get-started/mcp-clients/claude-desktop/page.mdx +++ b/app/en/get-started/mcp-clients/claude-desktop/page.mdx @@ -35,11 +35,11 @@ export const STEP_7_LIGHT_HEIGHT = 2450; # Use Arcade in Claude Desktop - **Setting Arcade up for yourself?** Add Arcade to Claude Desktop [as a - connector](/get-started/agent-plugin/claude-desktop), which needs no API key - and signs you in to each app in the browser. This guide is for pointing Claude - Desktop at a gateway you control, with your own tool list and your own - end-user identities. + **Setting Arcade up for yourself?** Install [the Arcade + bundle](/get-started/agent-plugin/claude-desktop), which needs no API key and + authorizes each app in the browser. This guide is for pointing Claude Desktop + at a gateway you control, with your own tool list and your own end-user + identities. diff --git a/lib/agent-plugin.ts b/lib/agent-plugin.ts index 8f5aefc31..6152de29c 100644 --- a/lib/agent-plugin.ts +++ b/lib/agent-plugin.ts @@ -14,6 +14,13 @@ export const AGENT_PLUGIN_REPO = "ArcadeAI/arcade-plugin"; export const AGENT_PLUGIN_INSTALL_COMMAND = `npx plugins add ${AGENT_PLUGIN_REPO}`; +/** + * The Claude Desktop bundle, served off the latest GitHub release so the link + * does not need updating per version. Confirm the asset filename matches what + * the release actually publishes. + */ +export const AGENT_PLUGIN_MCPB_URL = `https://github.com/${AGENT_PLUGIN_REPO}/releases/latest/download/arcade.mcpb`; + /** * Cursor takes its MCP config as base64-encoded JSON in a query parameter. */ diff --git a/lib/remark-substitute.ts b/lib/remark-substitute.ts index fb90af329..15fc09910 100644 --- a/lib/remark-substitute.ts +++ b/lib/remark-substitute.ts @@ -4,6 +4,7 @@ import { AGENT_PLUGIN_CURSOR_INSTALL_LINK, AGENT_PLUGIN_GATEWAY_URL, AGENT_PLUGIN_INSTALL_COMMAND, + AGENT_PLUGIN_MCPB_URL, AGENT_PLUGIN_REPO, AGENT_PLUGIN_VSCODE_INSTALL_LINK, } from "./agent-plugin"; @@ -18,6 +19,7 @@ export const substitutions: Record = { ARCADE_PLUGIN_GATEWAY_URL: AGENT_PLUGIN_GATEWAY_URL, ARCADE_PLUGIN_REPO: AGENT_PLUGIN_REPO, ARCADE_PLUGIN_INSTALL_COMMAND: AGENT_PLUGIN_INSTALL_COMMAND, + ARCADE_PLUGIN_MCPB_URL: AGENT_PLUGIN_MCPB_URL, ARCADE_PLUGIN_CURSOR_INSTALL_LINK: AGENT_PLUGIN_CURSOR_INSTALL_LINK, ARCADE_PLUGIN_VSCODE_INSTALL_LINK: AGENT_PLUGIN_VSCODE_INSTALL_LINK, }; diff --git a/redirects.ts b/redirects.ts index 7432fd24f..fbc1c82bc 100644 --- a/redirects.ts +++ b/redirects.ts @@ -1163,4 +1163,9 @@ export const redirects: Redirect[] = [ destination: "/:locale/build", permanent: true, }, + { + source: "/:locale/get-started/agent-plugin/any-mcp-client", + destination: "/:locale/get-started/agent-plugin/tools-only", + permanent: true, + }, ]; From 4f7d2ce5151530c220426c3323ae6cf9d21f8b77 Mon Sep 17 00:00:00 2001 From: "arcade-docs-bot[bot]" <321924871+arcade-docs-bot[bot]@users.noreply.github.com> Date: Thu, 3 Sep 2026 17:11:24 +0000 Subject: [PATCH 06/42] =?UTF-8?q?=F0=9F=A4=96=20Regenerate=20LLMs.txt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/llms.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/llms.txt b/public/llms.txt index c88332e2b..3800b1c4f 100644 --- a/public/llms.txt +++ b/public/llms.txt @@ -1,4 +1,4 @@ - + # Arcade @@ -80,6 +80,7 @@ Arcade docs serve two audiences. Start with the path that matches your goal: - [Arcade Cloud infrastructure](https://docs.arcade.dev/en/operate/deploy/arcade-cloud): Documentation page - [Arcade Gateway Assistant](https://docs.arcade.dev/en/operate/governance/mcp-gateways/create-via-ai): Documentation page - [Arcade Glossary](https://docs.arcade.dev/en/resources/glossary): The Arcade Glossary provides definitions and explanations of key terms and concepts related to the Arcade platform, including agents, harnesses, MCP servers, and tools. This resource helps users understand the components and functionalities necessary for building, deploying, and managing applications that +- [Arcade tools without the plugin](https://docs.arcade.dev/en/get-started/agent-plugin/tools-only): Documentation page - [Arcade with Agent Frameworks and MCP Clients](https://docs.arcade.dev/en/get-started/agent-frameworks): This documentation page provides developers with guidance on integrating Arcade with agent frameworks and MCP clients to enhance AI applications with tool-calling capabilities. It offers detailed instructions on authentication, tool loading, and execution, along with code examples and configuration steps for popular frameworks and - [Arcade with Google ADK](https://docs.arcade.dev/en/get-started/agent-frameworks/google-adk/overview): The "Arcade with Google ADK" documentation page provides guidance on integrating Arcade tools with the Google ADK framework, enabling users to build AI agents that can interact with various services like Gmail, Slack, and GitHub. It offers setup instructions for - [Arcade with LangChain](https://docs.arcade.dev/en/get-started/agent-frameworks/langchain/overview): This documentation page provides guidance on integrating Arcade tools with LangChain agents, enabling users to build AI agents that can interact with various services like Gmail, GitHub, and Slack. It offers setup instructions for both Python and TypeScript, along with examples of @@ -139,7 +140,6 @@ Arcade docs serve two audiences. Start with the path that matches your goal: - [Hybrid MCP servers](https://docs.arcade.dev/en/operate/deploy/on-prem): Documentation page - [Identity](https://docs.arcade.dev/en/operate/identity): Documentation page - [In Custom Applications](https://docs.arcade.dev/en/build/tool-calling/custom-apps): Documentation page -- [Install Arcade in any MCP client](https://docs.arcade.dev/en/get-started/agent-plugin/any-mcp-client): Documentation page - [Install Arcade in Claude Desktop](https://docs.arcade.dev/en/get-started/agent-plugin/claude-desktop): Documentation page - [Install the Arcade agent plugin](https://docs.arcade.dev/en/get-started/agent-plugin): Documentation page - [Mastra](https://docs.arcade.dev/en/get-started/agent-frameworks/mastra): This documentation page guides users in building a TypeScript AI agent using the Mastra framework, enabling interaction with Gmail and Slack through Arcade tools. Users will learn to create an agent capable of reading emails, sending messages, and summarizing emails for Slack, From 9a3a18c3ac5862ec6d3df89757e6c40519402d5b Mon Sep 17 00:00:00 2001 From: Teal Larson Date: Thu, 3 Sep 2026 13:22:33 -0400 Subject: [PATCH 07/42] docs(agent-plugin): nest Claude Desktop and any-MCP-client under tools-only Both pages describe the same thing, the gateway as a plain MCP server with none of the plugin's skills, commands, or subagent. Sitting them beside Overview implied they were alternative full installs. They are now children of a Tools-only MCP server page that carries the shared concept, the gateway URL, what you give up, and the two-layer sign-in, so each child is just its install steps. Co-Authored-By: Claude Opus 5 (1M context) --- app/en/get-started/agent-plugin/_meta.tsx | 5 +-- app/en/get-started/agent-plugin/page.mdx | 4 +- .../agent-plugin/tools-only/_meta.tsx | 15 ++++++++ .../tools-only/any-mcp-client/page.mdx | 38 +++++++++++++++++++ .../{ => tools-only}/claude-desktop/page.mdx | 6 +-- .../agent-plugin/tools-only/page.mdx | 20 +++++----- .../mcp-clients/claude-desktop/page.mdx | 2 +- redirects.ts | 7 +++- 8 files changed, 74 insertions(+), 23 deletions(-) create mode 100644 app/en/get-started/agent-plugin/tools-only/_meta.tsx create mode 100644 app/en/get-started/agent-plugin/tools-only/any-mcp-client/page.mdx rename app/en/get-started/agent-plugin/{ => tools-only}/claude-desktop/page.mdx (78%) diff --git a/app/en/get-started/agent-plugin/_meta.tsx b/app/en/get-started/agent-plugin/_meta.tsx index b14e6acf0..bce8ae202 100644 --- a/app/en/get-started/agent-plugin/_meta.tsx +++ b/app/en/get-started/agent-plugin/_meta.tsx @@ -4,11 +4,8 @@ export const meta: MetaRecord = { index: { title: "Overview", }, - "claude-desktop": { - title: "Claude Desktop", - }, "tools-only": { - title: "Tools only", + title: "Tools-only MCP server", }, "team-rollout": { title: "From personal use to team rollout", diff --git a/app/en/get-started/agent-plugin/page.mdx b/app/en/get-started/agent-plugin/page.mdx index e10a95b3d..da24c7d2c 100644 --- a/app/en/get-started/agent-plugin/page.mdx +++ b/app/en/get-started/agent-plugin/page.mdx @@ -61,7 +61,7 @@ Reload your agent afterwards if it does not pick up the plugin on its own. A cou Two things worth knowing if you use more than one agent. Codex and ChatGPT share a plugin directory, so one install covers both. And VS Code can discover a copy installed through GitHub Copilot CLI, so install in one place rather than both. -Using Claude Desktop? It installs from a downloadable bundle instead. See [Install Arcade in Claude Desktop](/get-started/agent-plugin/claude-desktop). For any other client, see [Arcade tools without the plugin](/get-started/agent-plugin/tools-only). +Using Claude Desktop, or a client that does not load plugins? Those connect to the same gateway as a [tools-only MCP server](/get-started/agent-plugin/tools-only). ## Tools only @@ -70,7 +70,7 @@ If you want Arcade tools without the skills, commands, and subagent, Cursor and - **Cursor:** use [this link]({{ARCADE_PLUGIN_CURSOR_INSTALL_LINK}}) for a one-click MCP install. - **VS Code:** use [this link]({{ARCADE_PLUGIN_VSCODE_INSTALL_LINK}}) for a one-click MCP install. -For any other client, add the gateway URL by hand. See [Arcade tools without the plugin](/get-started/agent-plugin/tools-only). +For any other client, add the gateway URL by hand. See [Tools-only MCP server](/get-started/agent-plugin/tools-only). ## Sign in diff --git a/app/en/get-started/agent-plugin/tools-only/_meta.tsx b/app/en/get-started/agent-plugin/tools-only/_meta.tsx new file mode 100644 index 000000000..4187c208e --- /dev/null +++ b/app/en/get-started/agent-plugin/tools-only/_meta.tsx @@ -0,0 +1,15 @@ +import type { MetaRecord } from "nextra"; + +export const meta: MetaRecord = { + index: { + title: "Overview", + }, + "claude-desktop": { + title: "Claude Desktop", + }, + "any-mcp-client": { + title: "Any MCP client", + }, +}; + +export default meta; diff --git a/app/en/get-started/agent-plugin/tools-only/any-mcp-client/page.mdx b/app/en/get-started/agent-plugin/tools-only/any-mcp-client/page.mdx new file mode 100644 index 000000000..7a6a5e812 --- /dev/null +++ b/app/en/get-started/agent-plugin/tools-only/any-mcp-client/page.mdx @@ -0,0 +1,38 @@ +--- +title: "Install Arcade in any MCP client" +description: "Point any Streamable HTTP MCP client at the Arcade gateway to get tools for every app you connect, with no API key and no plugin install." +--- + +# Install Arcade in any MCP client + +Any client that speaks the Streamable HTTP MCP transport can use Arcade tools, OpenCode included. Add this as an MCP server: + +```text +{{ARCADE_PLUGIN_GATEWAY_URL}} +``` + +Your agent gets every tool on the gateway. Nothing else about how you use it changes. + +## One-click links + +Cursor and VS Code can add the gateway without editing any config: + +- **Cursor:** use [this link]({{ARCADE_PLUGIN_CURSOR_INSTALL_LINK}}) for a one-click MCP install. +- **VS Code:** use [this link]({{ARCADE_PLUGIN_VSCODE_INSTALL_LINK}}) for a one-click MCP install. + +Both of those clients also load the full plugin, so use these only if you want the tools on their own. [Install the agent plugin](/get-started/agent-plugin) for the rest. + +## Sign in + +Your client signs you in to Arcade when it first connects, and each app gets authorized the first time a task needs it. See [signing in](/get-started/agent-plugin/tools-only#sign-in) for how the two layers fit together. + +## Try it + +- "What's on my calendar tomorrow?" +- "What apps can Arcade use?" + +## Next steps + +- [Tools-only MCP server](/get-started/agent-plugin/tools-only): what you give up by skipping the plugin +- [Install the agent plugin](/get-started/agent-plugin): one command for Cursor, Claude Code, VS Code, Copilot CLI, and Codex +- [Connect to MCP clients](/get-started/mcp-clients): point a client at a gateway you control, with your own tool list diff --git a/app/en/get-started/agent-plugin/claude-desktop/page.mdx b/app/en/get-started/agent-plugin/tools-only/claude-desktop/page.mdx similarity index 78% rename from app/en/get-started/agent-plugin/claude-desktop/page.mdx rename to app/en/get-started/agent-plugin/tools-only/claude-desktop/page.mdx index aab35fa5e..90b26b3f3 100644 --- a/app/en/get-started/agent-plugin/claude-desktop/page.mdx +++ b/app/en/get-started/agent-plugin/tools-only/claude-desktop/page.mdx @@ -40,9 +40,7 @@ Install the Arcade bundle in Claude Desktop and run a task against one of your a ## Sign in -You authorize twice. Connecting Arcade signs you in and links Claude Desktop to the gateway. After that, the first time Claude reaches for an app, it returns a browser link asking you to authorize that app. Approve it and Arcade holds the token, so you only do this once per app. - -Your tool calls, tokens, and secrets route through your own Arcade project, isolated from every other user of the same gateway. [Server-level and tool-level authorization](/learn/server-level-vs-tool-level-auth) covers the split in depth. +Connecting Arcade signs you in and links Claude Desktop to the gateway. After that, the first time Claude reaches for an app, it returns a browser link asking you to authorize that app. Approve it and Arcade holds the token, so you only do this once per app. See [signing in](/get-started/agent-plugin/tools-only#sign-in) for how the two layers fit together. ## Try it @@ -62,6 +60,6 @@ Save, then start a new conversation. You get the same tools this way; the bundle ## Next steps +- [Tools-only MCP server](/get-started/agent-plugin/tools-only): what you give up by skipping the plugin - [Install the agent plugin](/get-started/agent-plugin): the full experience in Cursor, Claude Code, VS Code, Copilot CLI, or Codex -- [From personal use to team rollout](/get-started/agent-plugin/team-rollout): move a workflow onto a gateway you control - [Use Arcade in Claude Desktop with your own gateway](/get-started/mcp-clients/claude-desktop): pick exactly which tools Claude can call diff --git a/app/en/get-started/agent-plugin/tools-only/page.mdx b/app/en/get-started/agent-plugin/tools-only/page.mdx index f35a4389d..a9949433f 100644 --- a/app/en/get-started/agent-plugin/tools-only/page.mdx +++ b/app/en/get-started/agent-plugin/tools-only/page.mdx @@ -1,21 +1,24 @@ --- -title: "Arcade tools without the plugin" -description: "Point any Streamable HTTP MCP client at the Arcade gateway to get tools for every app you connect, with no API key and no plugin install." +title: "Tools-only MCP server" +description: "Connect any MCP client to the Arcade gateway to get tools for every app you connect, without the agent plugin's skills, commands, or subagent." --- import { SignupLink } from "@/app/_components/analytics"; -# Arcade tools without the plugin +# Tools-only MCP server -The plugin bundles more than tools: two skills, three commands, and the `arcade-operator` subagent, all of which need a client that loads [agent plugins](https://agent-plugins.org). If you only want the tools, or your client does not load plugins at all, point it straight at the gateway: +The [agent plugin](/get-started/agent-plugin) ships more than tools: two skills, three commands, and the `arcade-operator` subagent, all of which need a client that loads [agent plugins](https://agent-plugins.org). Clients that do not, Claude Desktop among them, can still connect to the same gateway and get every tool on it. + +That is what this section covers. The gateway URL is: ```text {{ARCADE_PLUGIN_GATEWAY_URL}} ``` -Any client that speaks the Streamable HTTP MCP transport works, OpenCode included. Your agent gets every tool on the gateway and nothing else changes about how you use it. +## Install it -Cursor and VS Code can add the gateway this way in one click. [The install guide](/get-started/agent-plugin#tools-only) has those links. +- **[Claude Desktop](/get-started/agent-plugin/tools-only/claude-desktop)** installs from a downloadable bundle, so you never paste a URL. +- **[Any other MCP client](/get-started/agent-plugin/tools-only/any-mcp-client)** takes the gateway URL directly. Cursor and VS Code also have one-click links. ## What you give up @@ -33,11 +36,6 @@ No API keys. You authorize twice: your client signs you in to Arcade with your < Your tool calls, tokens, and secrets route through your own Arcade project, isolated from every other user of the same gateway. [Server-level and tool-level authorization](/learn/server-level-vs-tool-level-auth) covers the split in depth. -## Try it - -- "What's on my calendar tomorrow?" -- "What apps can Arcade use?" - ## Next steps - [Install the agent plugin](/get-started/agent-plugin): one command for Cursor, Claude Code, VS Code, Copilot CLI, and Codex diff --git a/app/en/get-started/mcp-clients/claude-desktop/page.mdx b/app/en/get-started/mcp-clients/claude-desktop/page.mdx index 3bade526b..34d5b9037 100644 --- a/app/en/get-started/mcp-clients/claude-desktop/page.mdx +++ b/app/en/get-started/mcp-clients/claude-desktop/page.mdx @@ -36,7 +36,7 @@ export const STEP_7_LIGHT_HEIGHT = 2450; **Setting Arcade up for yourself?** Install [the Arcade - bundle](/get-started/agent-plugin/claude-desktop), which needs no API key and + bundle](/get-started/agent-plugin/tools-only/claude-desktop), which needs no API key and authorizes each app in the browser. This guide is for pointing Claude Desktop at a gateway you control, with your own tool list and your own end-user identities. diff --git a/redirects.ts b/redirects.ts index fbc1c82bc..9285e762c 100644 --- a/redirects.ts +++ b/redirects.ts @@ -1165,7 +1165,12 @@ export const redirects: Redirect[] = [ }, { source: "/:locale/get-started/agent-plugin/any-mcp-client", - destination: "/:locale/get-started/agent-plugin/tools-only", + destination: "/:locale/get-started/agent-plugin/tools-only/any-mcp-client", + permanent: true, + }, + { + source: "/:locale/get-started/agent-plugin/claude-desktop", + destination: "/:locale/get-started/agent-plugin/tools-only/claude-desktop", permanent: true, }, ]; From ea2cbc3bdc037e26ba7de24f558ba93ff8d2f29e Mon Sep 17 00:00:00 2001 From: "arcade-docs-bot[bot]" <321924871+arcade-docs-bot[bot]@users.noreply.github.com> Date: Thu, 3 Sep 2026 17:23:24 +0000 Subject: [PATCH 08/42] =?UTF-8?q?=F0=9F=A4=96=20Regenerate=20LLMs.txt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/llms.txt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/public/llms.txt b/public/llms.txt index 3800b1c4f..9fb1aa712 100644 --- a/public/llms.txt +++ b/public/llms.txt @@ -1,4 +1,4 @@ - + # Arcade @@ -140,7 +140,8 @@ Arcade docs serve two audiences. Start with the path that matches your goal: - [Hybrid MCP servers](https://docs.arcade.dev/en/operate/deploy/on-prem): Documentation page - [Identity](https://docs.arcade.dev/en/operate/identity): Documentation page - [In Custom Applications](https://docs.arcade.dev/en/build/tool-calling/custom-apps): Documentation page -- [Install Arcade in Claude Desktop](https://docs.arcade.dev/en/get-started/agent-plugin/claude-desktop): Documentation page +- [Install Arcade in any MCP client](https://docs.arcade.dev/en/get-started/agent-plugin/tools-only/any-mcp-client): Documentation page +- [Install Arcade in Claude Desktop](https://docs.arcade.dev/en/get-started/agent-plugin/tools-only/claude-desktop): Documentation page - [Install the Arcade agent plugin](https://docs.arcade.dev/en/get-started/agent-plugin): Documentation page - [Mastra](https://docs.arcade.dev/en/get-started/agent-frameworks/mastra): This documentation page guides users in building a TypeScript AI agent using the Mastra framework, enabling interaction with Gmail and Slack through Arcade tools. Users will learn to create an agent capable of reading emails, sending messages, and summarizing emails for Slack, - [MCP Gateways](https://docs.arcade.dev/en/operate/governance/mcp-gateways): Documentation page From d6d785dbeb0273cc6393318c757fa573e975a39a Mon Sep 17 00:00:00 2001 From: Teal Larson Date: Thu, 3 Sep 2026 14:56:26 -0400 Subject: [PATCH 09/42] continue to iterate --- app/en/get-started/agent-plugin/page.mdx | 66 +++++++++---------- .../tools-only/any-mcp-client/page.mdx | 8 ++- .../tools-only/claude-desktop/page.mdx | 9 ++- 3 files changed, 45 insertions(+), 38 deletions(-) diff --git a/app/en/get-started/agent-plugin/page.mdx b/app/en/get-started/agent-plugin/page.mdx index da24c7d2c..4f7c292e1 100644 --- a/app/en/get-started/agent-plugin/page.mdx +++ b/app/en/get-started/agent-plugin/page.mdx @@ -8,12 +8,12 @@ import { SignupLink } from "@/app/_components/analytics"; # Install the Arcade agent plugin -The Arcade agent plugin puts Arcade inside your coding agent with one command. Your agent gains tools for email, calendar, chat, issues, docs, and dozens of other apps, and you authorize each app in the browser the first time it comes up. No API keys to create, no gateway to configure. +The Arcade agent plugin puts Arcade inside your agent with one command. Your agent gains access to thousands of tools for email, calendar, chat, issues, docs, and dozens of other apps. You authorize each app in the browser the first time it comes up. No API keys to create, no gateway to configure. -Install the Arcade agent plugin in your coding agent and run your first task against a connected app. +Install the Arcade agent plugin in your agent and run your first task against a connected app. @@ -28,8 +28,8 @@ Install the Arcade agent plugin in your coding agent and run your first task aga - The plugin is built for personal use. When you are ready to put - a workflow in front of a team, read [from personal use to team + The plugin is built for personal use. When you are ready to put a workflow in + front of a team, read [from personal use to team rollout](/get-started/agent-plugin/team-rollout). You will want your own [MCP Gateway](/operate/governance/mcp-gateways) with a curated tool list and your own identity provider. @@ -61,27 +61,20 @@ Reload your agent afterwards if it does not pick up the plugin on its own. A cou Two things worth knowing if you use more than one agent. Codex and ChatGPT share a plugin directory, so one install covers both. And VS Code can discover a copy installed through GitHub Copilot CLI, so install in one place rather than both. -Using Claude Desktop, or a client that does not load plugins? Those connect to the same gateway as a [tools-only MCP server](/get-started/agent-plugin/tools-only). +// todo: claude mcpb instructions -## Tools only - -If you want Arcade tools without the skills, commands, and subagent, Cursor and VS Code can add the gateway on its own: - -- **Cursor:** use [this link]({{ARCADE_PLUGIN_CURSOR_INSTALL_LINK}}) for a one-click MCP install. -- **VS Code:** use [this link]({{ARCADE_PLUGIN_VSCODE_INSTALL_LINK}}) for a one-click MCP install. - -For any other client, add the gateway URL by hand. See [Tools-only MCP server](/get-started/agent-plugin/tools-only). +Using a client that does not load plugins? Those connect to the same gateway as a [tools-only MCP server](/get-started/agent-plugin/tools-only). ## Sign in -You authorize twice, and the two are doing different jobs. +Authentication happens in two layers: -1. **Into the gateway.** Your client asks you to authenticate when it first connects. You sign in to Arcade in the browser, and the client can reach the gateway from then on. -2. **Into each app.** When a task needs Gmail, Slack, Linear, or anything else, your agent hands you a link that grants the scopes that task requires. Approve it once and Arcade holds the token for that app. +1. **Into the gateway.** Your client will ask you to authenticate when it first connects. You sign in to Arcade in the browser, and the client can reach the gateway from then on. +2. **Into each app.** When a task needs Gmail, Slack, Linear, or anything else, your agent hands you a link that grants the scopes that task requires. Approve it once and Arcade holds the token for that app. You won't need to authenticate that service again unless a later task requires greater scopes. -You never give your agent an API key or a password for either layer. Ask your agent to run `/arcade-status` to see where you stand, or `/arcade-connect google` to authorize an app before you need it. +You never give your agent an API key or a password for either layer. Ask your agent to run `/arcade-status` to see what applications are currently enabled , or `/arcade-connect google` to authorize an app with the widest possible scope before you need it. -Every install points at the same gateway URL, but your tool calls, tokens, and secrets route through your own Arcade project, isolated from every other user of that gateway. No one else's agent can reach your apps. +All of your tool calls, tokens, and secrets route through your own Arcade project, isolated from every other user of that gateway. No one else's agent can ever reach your apps, tools, or tokens. Every Arcade gateway works this way, not just the one in the plugin. [Server-level and tool-level authorization](/learn/server-level-vs-tool-level-auth) goes deeper on the split. @@ -89,22 +82,22 @@ Every Arcade gateway works this way, not just the one in the plugin. [Server-lev Every install connects to the same Arcade gateway and gets the same tools. What differs is how much of the rest of the plugin each agent can load. -| Agent | Tools | Skills | Subagent | Commands | Rule | Hooks | -| --- | :--: | :--: | :--: | :--: | :--: | :--: | -| Cursor | ✅ | 2 | ✅ | 3 | ✅ | ✅ | -| Claude Code | ✅ | 2 | ✅ | 3 | — | ✅ | -| Claude Cowork | ✅ | 2 | ✅ | 3 | — | ✅ | -| GitHub Copilot CLI | ✅ | 2 | ✅ | — | — | — | -| VS Code | ✅ | 2 | — | — | — | — | -| Codex and ChatGPT | ✅ | 2 | — | — | — | — | -| Claude Desktop | ✅ | — | — | — | — | — | -| Any other MCP client | ✅ | — | — | — | — | — | +| Agent | Tools | Skills | Subagent | Commands | Rule | Hooks | +| -------------------- | :------------: | :----: | :------: | :------: | :--: | :---: | --- | -------------- | +| Cursor | ✅ | 2 | ✅ | 3 | ✅ | ✅ | +| Claude Code | ✅ | 2 | ✅ | 3 | — | ✅ | +| Claude Cowork | ✅ | 2 | ✅ | 3 | — | ✅ | +| GitHub Copilot CLI | ✅ | 2 | ✅ | — | — | — | +| VS Code | ✅ | 2 | — | — | — | — | +| Codex and ChatGPT | ✅ | 2 | — | — | — | — | +| Any other MCP client | ✅ | — | — | — | — | — | +| // | Claude Desktop | ✅ | — | — | — | — | — | TODO: not true | Here is what each of those is for. **Commands** are the part you type. `/arcade-status` reports whether the gateway is reachable, whether you have signed in, and which apps you have authorized. `/arcade-connect ` authorizes an app on demand, so you are not interrupted mid-task. `/arcade-apps` lists what you have connected and lets you disconnect one. -**Skills** are instructions your agent reads on its own, so you never have to invoke them. `try-arcade` teaches it to turn a request like "reply to that thread" into the right sequence of tool calls across your apps. `scale-arcade` handles the other kind of question, the one about moving a workflow onto a team gateway, and it walks you through the decisions on [this page](/get-started/agent-plugin/team-rollout) against your own workspace. +**Skills** are instructions your agent reads on its own, so you never have to invoke them. `try-arcade` teaches it to turn a request like "reply to that thread" into the right sequence of tool calls across your apps. `scale-arcade` handles the other kind of question, the one about moving a workflow onto a team gateway, and it walks you through the decisions on [this page](/get-started/agent-plugin/team-rollout) against your own project. **The subagent**, `arcade-operator`, runs an app task in its own context and reports back just the result. Arcade exposes a lot of tools, and searching them fills a conversation with noise that pushes out your actual work. The operator absorbs that. @@ -114,14 +107,17 @@ The columns thin out because the [Agent Plugins](https://agent-plugins.org) 1.0 ## Try it -Ask your agent for an outcome rather than naming a tool: +The Arcade Agent Plugin exposes hundreds of tools from our catalog that need zero additional configuration. Try asking your agent: + +- "Send a summary of tomorrow's calendar events to me on Slack." +- "Read my Granola notes from last week, check them against Linear, and file anything I promised that is not a ticket yet. Wait for me before creating anything." +- "Find unread mail that needs a reply. Look the sender up in HubSpot if you can, draft a response, and Slack me the draft before sending." +- "Pull my open GitHub pull requests, my Linear issues, and tomorrow's calendar. Write a standup update and send it to me on Slack." +- "Search my Drive and Notion for the latest product spec, then drop a one-paragraph summary in Slack." -- "What's on my calendar tomorrow?" -- "Summarize the unread email from this week." -- "Draft a reply to that thread, then wait for me before sending it." -- "What can Arcade do?" +Or ask "What can Arcade do?" and pick a workflow from the answer. -Your agent asks you to confirm before it sends, creates, or deletes anything. +\ ## Next steps diff --git a/app/en/get-started/agent-plugin/tools-only/any-mcp-client/page.mdx b/app/en/get-started/agent-plugin/tools-only/any-mcp-client/page.mdx index 7a6a5e812..0aae74c1e 100644 --- a/app/en/get-started/agent-plugin/tools-only/any-mcp-client/page.mdx +++ b/app/en/get-started/agent-plugin/tools-only/any-mcp-client/page.mdx @@ -28,7 +28,13 @@ Your client signs you in to Arcade when it first connects, and each app gets aut ## Try it -- "What's on my calendar tomorrow?" +Ask your agent for an outcome rather than naming a tool. This gateway has every [optimized toolkit](/resources/integrations). The first time a task needs an app you have not authorized, your agent hands you a link. Approve it and the rest of the task continues, including steps that land in a different app. + +Swap the app names for whatever you actually use: + +- "Send a summary of tomorrow's calendar events to me on Slack." +- "Read my Granola notes from last week, check them against Linear, and file anything I promised that is not a ticket yet. Wait for me before creating anything." +- "Find unread mail that needs a reply. Draft a response, Slack me the draft, and wait for me before sending it." - "What apps can Arcade use?" ## Next steps diff --git a/app/en/get-started/agent-plugin/tools-only/claude-desktop/page.mdx b/app/en/get-started/agent-plugin/tools-only/claude-desktop/page.mdx index 90b26b3f3..da23c1867 100644 --- a/app/en/get-started/agent-plugin/tools-only/claude-desktop/page.mdx +++ b/app/en/get-started/agent-plugin/tools-only/claude-desktop/page.mdx @@ -44,9 +44,14 @@ Connecting Arcade signs you in and links Claude Desktop to the gateway. After th ## Try it -- "What's on my calendar tomorrow?" +Ask Claude for an outcome rather than naming a tool. This gateway has every [optimized toolkit](/resources/integrations). The first time a task needs an app you have not authorized, Claude hands you a link. Approve it and the rest of the task continues, including steps that land in a different app. + +Swap the app names for whatever you actually use: + +- "Send a summary of tomorrow's calendar events to me on Slack." +- "Read my Granola notes from last week, check them against Linear, and file anything I promised that is not a ticket yet. Wait for me before creating anything." +- "Find unread mail that needs a reply. Draft a response, Slack me the draft, and wait for me before sending it." - "What apps can Arcade use?" -- "Summarize the unread email from this week." ## Add the gateway by hand instead From 94b8415c17a0b99027c07f304a3df2b8d2d433ba Mon Sep 17 00:00:00 2001 From: Teal Larson Date: Thu, 3 Sep 2026 19:48:47 -0400 Subject: [PATCH 10/42] Update app/en/get-started/agent-plugin/page.mdx Co-authored-by: Mateo Torres --- app/en/get-started/agent-plugin/page.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/en/get-started/agent-plugin/page.mdx b/app/en/get-started/agent-plugin/page.mdx index 4f7c292e1..73526ada5 100644 --- a/app/en/get-started/agent-plugin/page.mdx +++ b/app/en/get-started/agent-plugin/page.mdx @@ -20,7 +20,7 @@ Install the Arcade agent plugin in your agent and run your first task against a 1. [Node.js](https://nodejs.org) so you can run `npx` -2. A supported agent: Cursor, Claude Code, VS Code, GitHub Copilot CLI, or Codex +2. An agent with [plugins](https://agent-plugins.org) support: Cursor, Claude Code, VS Code, GitHub Copilot CLI, or Codex 3. An Arcade account From 9fa0f851c5d5f39845667518d5baf134044e458a Mon Sep 17 00:00:00 2001 From: Teal Larson Date: Thu, 3 Sep 2026 19:49:14 -0400 Subject: [PATCH 11/42] Update app/en/get-started/agent-plugin/tools-only/page.mdx Co-authored-by: Mateo Torres --- app/en/get-started/agent-plugin/tools-only/page.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/en/get-started/agent-plugin/tools-only/page.mdx b/app/en/get-started/agent-plugin/tools-only/page.mdx index a9949433f..933b1812e 100644 --- a/app/en/get-started/agent-plugin/tools-only/page.mdx +++ b/app/en/get-started/agent-plugin/tools-only/page.mdx @@ -28,7 +28,7 @@ Tools alone still do the work. What you lose is the part that helps your agent u - **The commands** give you `/arcade-status`, `/arcade-connect`, and `/arcade-apps` for checking and managing connections without leaving your agent. - **The subagent** keeps tool search out of your main conversation, so it does not crowd out your actual work. -If your client supports plugins, [install the full plugin](/get-started/agent-plugin) instead. +If your client supports [plugins](https://agent-plugins.org), you should [install the full plugin](/get-started/agent-plugin) instead. ## Sign in From b4286c1726dbe4586a469bfa227407c95eef989d Mon Sep 17 00:00:00 2001 From: Teal Larson Date: Tue, 8 Sep 2026 17:07:05 -0400 Subject: [PATCH 12/42] docs(agent-plugin): apply review feedback --- app/en/get-started/agent-plugin/page.mdx | 54 ++++++++----- .../any-mcp-client/mcp-client-installer.tsx | 77 +++++++++++++++++++ .../tools-only/any-mcp-client/page.mdx | 7 +- .../tools-only/claude-desktop/page.mdx | 2 + lib/agent-plugin.ts | 26 +------ lib/remark-substitute.ts | 4 - tests/remark-substitute.test.ts | 16 ---- 7 files changed, 120 insertions(+), 66 deletions(-) create mode 100644 app/en/get-started/agent-plugin/tools-only/any-mcp-client/mcp-client-installer.tsx diff --git a/app/en/get-started/agent-plugin/page.mdx b/app/en/get-started/agent-plugin/page.mdx index 73526ada5..d7c7c31c1 100644 --- a/app/en/get-started/agent-plugin/page.mdx +++ b/app/en/get-started/agent-plugin/page.mdx @@ -8,7 +8,7 @@ import { SignupLink } from "@/app/_components/analytics"; # Install the Arcade agent plugin -The Arcade agent plugin puts Arcade inside your agent with one command. Your agent gains access to thousands of tools for email, calendar, chat, issues, docs, and dozens of other apps. You authorize each app in the browser the first time it comes up. No API keys to create, no gateway to configure. +The Arcade agent plugin bundles a connection to Arcade's hosted MCP gateway with two skills, three commands, and the `arcade-operator` subagent. The gateway gives your agent thousands of tools for email, calendar, chat, issues, docs, and dozens of other apps. The rest of the plugin helps your agent choose and use those tools. You authorize each app in the browser the first time it comes up, with no API keys to create and no gateway to configure. @@ -59,11 +59,7 @@ npx plugins discover {{ARCADE_PLUGIN_REPO}} Reload your agent afterwards if it does not pick up the plugin on its own. A couple of agents gate plugins behind a setting. Claude Code may ask you to enable it with `claude plugin`, and VS Code needs `chat.plugins.enabled` set to `true`. -Two things worth knowing if you use more than one agent. Codex and ChatGPT share a plugin directory, so one install covers both. And VS Code can discover a copy installed through GitHub Copilot CLI, so install in one place rather than both. - -// todo: claude mcpb instructions - -Using a client that does not load plugins? Those connect to the same gateway as a [tools-only MCP server](/get-started/agent-plugin/tools-only). +Using a client that does not load plugins? Those connect to the same gateway with the [tools-only Arcade bundle](/get-started/agent-plugin/tools-only). ## Sign in @@ -82,26 +78,44 @@ Every Arcade gateway works this way, not just the one in the plugin. [Server-lev Every install connects to the same Arcade gateway and gets the same tools. What differs is how much of the rest of the plugin each agent can load. -| Agent | Tools | Skills | Subagent | Commands | Rule | Hooks | -| -------------------- | :------------: | :----: | :------: | :------: | :--: | :---: | --- | -------------- | -| Cursor | ✅ | 2 | ✅ | 3 | ✅ | ✅ | -| Claude Code | ✅ | 2 | ✅ | 3 | — | ✅ | -| Claude Cowork | ✅ | 2 | ✅ | 3 | — | ✅ | -| GitHub Copilot CLI | ✅ | 2 | ✅ | — | — | — | -| VS Code | ✅ | 2 | — | — | — | — | -| Codex and ChatGPT | ✅ | 2 | — | — | — | — | -| Any other MCP client | ✅ | — | — | — | — | — | -| // | Claude Desktop | ✅ | — | — | — | — | — | TODO: not true | +| Agent | Tools | Skills | Subagent | Commands | Rule | Hooks | +| -------------------- | :---: | :----: | :------: | :------: | :--: | :---: | +| Cursor | ✅ | 2 | ✅ | 3 | ✅ | ✅ | +| Claude Code | ✅ | 2 | ✅ | 3 | — | ✅ | +| Claude Cowork | ✅ | 2 | ✅ | 3 | — | ✅ | +| GitHub Copilot CLI | ✅ | 2 | ✅ | — | — | — | +| VS Code | ✅ | 2 | — | — | — | — | +| Codex and ChatGPT | ✅ | 2 | — | — | — | — | +| Claude Desktop | ✅ | — | — | — | — | — | +| Any other MCP client | ✅ | — | — | — | — | — | Here is what each of those is for. -**Commands** are the part you type. `/arcade-status` reports whether the gateway is reachable, whether you have signed in, and which apps you have authorized. `/arcade-connect ` authorizes an app on demand, so you are not interrupted mid-task. `/arcade-apps` lists what you have connected and lets you disconnect one. +### Commands + +#### `/arcade-status` + +Reports whether the gateway is reachable, whether you have signed in, and which apps you have authorized. + +#### `/arcade-connect ` + +Authorizes an app on demand, so you are not interrupted mid-task. + +#### `/arcade-apps` + +Lists the apps you have connected and lets you disconnect one. + +### Skills + +Skills are instructions your agent reads on its own, so you never have to invoke them. `try-arcade` teaches it to turn a request like "reply to that thread" into the right sequence of tool calls across your apps. `scale-arcade` handles the other kind of question, the one about moving a workflow onto a team gateway, and it walks you through the decisions on [this page](/get-started/agent-plugin/team-rollout) against your own project. + +### Subagent -**Skills** are instructions your agent reads on its own, so you never have to invoke them. `try-arcade` teaches it to turn a request like "reply to that thread" into the right sequence of tool calls across your apps. `scale-arcade` handles the other kind of question, the one about moving a workflow onto a team gateway, and it walks you through the decisions on [this page](/get-started/agent-plugin/team-rollout) against your own project. +The `arcade-operator` subagent runs an app task in its own context and reports back just the result. Arcade exposes a lot of tools, and searching them fills a conversation with noise that pushes out your actual work. The operator absorbs that. -**The subagent**, `arcade-operator`, runs an app task in its own context and reports back just the result. Arcade exposes a lot of tools, and searching them fills a conversation with noise that pushes out your actual work. The operator absorbs that. +### Rule and hooks -**The rule and hooks** are Cursor and Claude Code specific. They tell your agent that Arcade exists and when reaching for it is the right move, which is the difference between a tool that sits unused and one your agent actually picks up. +The rule and hooks are Cursor and Claude Code specific. They tell your agent that Arcade exists and when reaching for it is the right move, which is the difference between a tool that sits unused and one your agent actually picks up. The columns thin out because the [Agent Plugins](https://agent-plugins.org) 1.0 specification only makes skills and MCP servers portable. Commands, subagents, hooks, and editor rules are specific to each agent, so the plugin ships them where the agents that support them will find them. diff --git a/app/en/get-started/agent-plugin/tools-only/any-mcp-client/mcp-client-installer.tsx b/app/en/get-started/agent-plugin/tools-only/any-mcp-client/mcp-client-installer.tsx new file mode 100644 index 000000000..fb78b2352 --- /dev/null +++ b/app/en/get-started/agent-plugin/tools-only/any-mcp-client/mcp-client-installer.tsx @@ -0,0 +1,77 @@ +"use client"; + +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, +} from "@arcadeai/design-system"; +import { + getMcpClientMeta, + MCPInstallButton, + type McpClientId, +} from "@arcadeai/ui-kit/mcp-gateway-connect"; +import { useState } from "react"; +import { + AGENT_PLUGIN_ENGINE_PUBLIC_URL, + AGENT_PLUGIN_GATEWAY_SLUG, +} from "@/lib/agent-plugin"; + +const INSTALL_CLIENTS = [ + "cursor", + "vscode", +] as const satisfies readonly McpClientId[]; + +type InstallClient = (typeof INSTALL_CLIENTS)[number]; + +function isInstallClient(value: string | null): value is InstallClient { + return value === "cursor" || value === "vscode"; +} + +function ClientOption({ clientId }: { clientId: InstallClient }) { + const client = getMcpClientMeta(clientId); + + return ( + + + {client.logo} + + {client.name} + + ); +} + +export function MCPClientInstaller() { + const [selectedClient, setSelectedClient] = useState("cursor"); + + return ( +
+ + + +
+ ); +} diff --git a/app/en/get-started/agent-plugin/tools-only/any-mcp-client/page.mdx b/app/en/get-started/agent-plugin/tools-only/any-mcp-client/page.mdx index 0aae74c1e..428ffe5ee 100644 --- a/app/en/get-started/agent-plugin/tools-only/any-mcp-client/page.mdx +++ b/app/en/get-started/agent-plugin/tools-only/any-mcp-client/page.mdx @@ -3,6 +3,8 @@ title: "Install Arcade in any MCP client" description: "Point any Streamable HTTP MCP client at the Arcade gateway to get tools for every app you connect, with no API key and no plugin install." --- +import { MCPClientInstaller } from "./mcp-client-installer"; + # Install Arcade in any MCP client Any client that speaks the Streamable HTTP MCP transport can use Arcade tools, OpenCode included. Add this as an MCP server: @@ -13,12 +15,11 @@ Any client that speaks the Streamable HTTP MCP transport can use Arcade tools, O Your agent gets every tool on the gateway. Nothing else about how you use it changes. -## One-click links +## One-click install Cursor and VS Code can add the gateway without editing any config: -- **Cursor:** use [this link]({{ARCADE_PLUGIN_CURSOR_INSTALL_LINK}}) for a one-click MCP install. -- **VS Code:** use [this link]({{ARCADE_PLUGIN_VSCODE_INSTALL_LINK}}) for a one-click MCP install. + Both of those clients also load the full plugin, so use these only if you want the tools on their own. [Install the agent plugin](/get-started/agent-plugin) for the rest. diff --git a/app/en/get-started/agent-plugin/tools-only/claude-desktop/page.mdx b/app/en/get-started/agent-plugin/tools-only/claude-desktop/page.mdx index da23c1867..d00cbcabd 100644 --- a/app/en/get-started/agent-plugin/tools-only/claude-desktop/page.mdx +++ b/app/en/get-started/agent-plugin/tools-only/claude-desktop/page.mdx @@ -34,6 +34,8 @@ Install the Arcade bundle in Claude Desktop and run a task against one of your a ## Install the bundle +{/* TODO(teal): Update these instructions after testing the .mcpb install. */} + 1. Download [the Arcade bundle]({{ARCADE_PLUGIN_MCPB_URL}}) 2. Open the downloaded `.mcpb` file, and Claude Desktop offers to install it 3. Confirm the install, then start a new conversation diff --git a/lib/agent-plugin.ts b/lib/agent-plugin.ts index 6152de29c..c91aa131c 100644 --- a/lib/agent-plugin.ts +++ b/lib/agent-plugin.ts @@ -7,8 +7,9 @@ * MDX pages reach these through `{{TOKEN}}` placeholders — see * `lib/remark-substitute.ts` for the token list. */ -export const AGENT_PLUGIN_GATEWAY_URL = - "https://api.bosslevel.dev/mcp/all-optimized"; +export const AGENT_PLUGIN_ENGINE_PUBLIC_URL = "https://api.bosslevel.dev"; +export const AGENT_PLUGIN_GATEWAY_SLUG = "all-optimized"; +export const AGENT_PLUGIN_GATEWAY_URL = `${AGENT_PLUGIN_ENGINE_PUBLIC_URL}/mcp/${AGENT_PLUGIN_GATEWAY_SLUG}`; export const AGENT_PLUGIN_REPO = "ArcadeAI/arcade-plugin"; @@ -20,24 +21,3 @@ export const AGENT_PLUGIN_INSTALL_COMMAND = `npx plugins add ${AGENT_PLUGIN_REPO * the release actually publishes. */ export const AGENT_PLUGIN_MCPB_URL = `https://github.com/${AGENT_PLUGIN_REPO}/releases/latest/download/arcade.mcpb`; - -/** - * Cursor takes its MCP config as base64-encoded JSON in a query parameter. - */ -export const AGENT_PLUGIN_CURSOR_INSTALL_LINK = (() => { - const config = JSON.stringify({ url: AGENT_PLUGIN_GATEWAY_URL }); - const encoded = Buffer.from(config, "utf-8").toString("base64"); - return `https://cursor.com/install-mcp?name=arcade&config=${encoded}`; -})(); - -/** - * VS Code takes the same JSON percent-encoded instead, and wants the transport - * named explicitly. - */ -export const AGENT_PLUGIN_VSCODE_INSTALL_LINK = (() => { - const config = JSON.stringify({ - type: "http", - url: AGENT_PLUGIN_GATEWAY_URL, - }); - return `https://vscode.dev/redirect/mcp/install?name=arcade&config=${encodeURIComponent(config)}`; -})(); diff --git a/lib/remark-substitute.ts b/lib/remark-substitute.ts index 15fc09910..73ffe788c 100644 --- a/lib/remark-substitute.ts +++ b/lib/remark-substitute.ts @@ -1,12 +1,10 @@ import type { Root } from "mdast"; import { visit } from "unist-util-visit"; import { - AGENT_PLUGIN_CURSOR_INSTALL_LINK, AGENT_PLUGIN_GATEWAY_URL, AGENT_PLUGIN_INSTALL_COMMAND, AGENT_PLUGIN_MCPB_URL, AGENT_PLUGIN_REPO, - AGENT_PLUGIN_VSCODE_INSTALL_LINK, } from "./agent-plugin"; /** @@ -20,8 +18,6 @@ export const substitutions: Record = { ARCADE_PLUGIN_REPO: AGENT_PLUGIN_REPO, ARCADE_PLUGIN_INSTALL_COMMAND: AGENT_PLUGIN_INSTALL_COMMAND, ARCADE_PLUGIN_MCPB_URL: AGENT_PLUGIN_MCPB_URL, - ARCADE_PLUGIN_CURSOR_INSTALL_LINK: AGENT_PLUGIN_CURSOR_INSTALL_LINK, - ARCADE_PLUGIN_VSCODE_INSTALL_LINK: AGENT_PLUGIN_VSCODE_INSTALL_LINK, }; /** diff --git a/tests/remark-substitute.test.ts b/tests/remark-substitute.test.ts index cf8f1ed5f..f7e0d620b 100644 --- a/tests/remark-substitute.test.ts +++ b/tests/remark-substitute.test.ts @@ -24,22 +24,6 @@ describe("applySubstitutions", () => { 'client_id: "{{client_id}}"' ); }); - - it("derives the one-click install links from the gateway URL", () => { - const cursor = applySubstitutions("{{ARCADE_PLUGIN_CURSOR_INSTALL_LINK}}"); - const encoded = new URL(cursor).searchParams.get("config") ?? ""; - const config = JSON.parse(Buffer.from(encoded, "base64").toString("utf-8")); - expect(config.url).toBe(AGENT_PLUGIN_GATEWAY_URL); - - const vscode = applySubstitutions("{{ARCADE_PLUGIN_VSCODE_INSTALL_LINK}}"); - const vscodeConfig = JSON.parse( - new URL(vscode).searchParams.get("config") ?? "" - ); - expect(vscodeConfig).toEqual({ - type: "http", - url: AGENT_PLUGIN_GATEWAY_URL, - }); - }); }); describe("remarkSubstitute", () => { From f681507c8aee551ff117234cdacbb0a77841cb5e Mon Sep 17 00:00:00 2001 From: Teal Larson Date: Fri, 11 Sep 2026 16:16:34 -0400 Subject: [PATCH 13/42] docs(agent-plugin): align Claude Desktop install with plugin repo and prod gateway Match arcade-plugin's marketplace-first Claude Desktop flow, drop the unreleased .mcpb path, and point all install surfaces at the production gateway URL. Co-authored-by: Cursor --- app/en/get-started/agent-plugin/page.mdx | 10 ++-- .../tools-only/any-mcp-client/page.mdx | 9 +-- .../tools-only/claude-desktop/page.mdx | 57 ++++++++++--------- .../agent-plugin/tools-only/page.mdx | 4 +- lib/agent-plugin.ts | 16 ++---- lib/remark-substitute.ts | 2 - 6 files changed, 43 insertions(+), 55 deletions(-) diff --git a/app/en/get-started/agent-plugin/page.mdx b/app/en/get-started/agent-plugin/page.mdx index d7c7c31c1..55c2cb28c 100644 --- a/app/en/get-started/agent-plugin/page.mdx +++ b/app/en/get-started/agent-plugin/page.mdx @@ -59,7 +59,7 @@ npx plugins discover {{ARCADE_PLUGIN_REPO}} Reload your agent afterwards if it does not pick up the plugin on its own. A couple of agents gate plugins behind a setting. Claude Code may ask you to enable it with `claude plugin`, and VS Code needs `chat.plugins.enabled` set to `true`. -Using a client that does not load plugins? Those connect to the same gateway with the [tools-only Arcade bundle](/get-started/agent-plugin/tools-only). +For [Claude Desktop](/get-started/agent-plugin/tools-only/claude-desktop), add the plugin from a marketplace instead of running `npx`. Using another client that does not load plugins? Connect to the same gateway with the [tools-only Arcade bundle](/get-started/agent-plugin/tools-only). ## Sign in @@ -68,7 +68,7 @@ Authentication happens in two layers: 1. **Into the gateway.** Your client will ask you to authenticate when it first connects. You sign in to Arcade in the browser, and the client can reach the gateway from then on. 2. **Into each app.** When a task needs Gmail, Slack, Linear, or anything else, your agent hands you a link that grants the scopes that task requires. Approve it once and Arcade holds the token for that app. You won't need to authenticate that service again unless a later task requires greater scopes. -You never give your agent an API key or a password for either layer. Ask your agent to run `/arcade-status` to see what applications are currently enabled , or `/arcade-connect google` to authorize an app with the widest possible scope before you need it. +You never give your agent an API key or a password for either layer. Ask your agent to run `/arcade-status` to see what applications are currently enabled, or `/arcade-connect google` to authorize an app with the widest possible scope before you need it. All of your tool calls, tokens, and secrets route through your own Arcade project, isolated from every other user of that gateway. No one else's agent can ever reach your apps, tools, or tokens. @@ -86,7 +86,7 @@ Every install connects to the same Arcade gateway and gets the same tools. What | GitHub Copilot CLI | ✅ | 2 | ✅ | — | — | — | | VS Code | ✅ | 2 | — | — | — | — | | Codex and ChatGPT | ✅ | 2 | — | — | — | — | -| Claude Desktop | ✅ | — | — | — | — | — | +| Claude Desktop | ✅ | 2 | — | — | — | — | | Any other MCP client | ✅ | — | — | — | — | — | Here is what each of those is for. @@ -121,7 +121,7 @@ The columns thin out because the [Agent Plugins](https://agent-plugins.org) 1.0 ## Try it -The Arcade Agent Plugin exposes hundreds of tools from our catalog that need zero additional configuration. Try asking your agent: +This gateway includes every [optimized toolkit](/resources/integrations) in the catalog. Try asking your agent: - "Send a summary of tomorrow's calendar events to me on Slack." - "Read my Granola notes from last week, check them against Linear, and file anything I promised that is not a ticket yet. Wait for me before creating anything." @@ -131,8 +131,6 @@ The Arcade Agent Plugin exposes hundreds of tools from our catalog that need zer Or ask "What can Arcade do?" and pick a workflow from the answer. -\ - ## Next steps - [From personal use to team rollout](/get-started/agent-plugin/team-rollout): move a workflow onto your own gateway diff --git a/app/en/get-started/agent-plugin/tools-only/any-mcp-client/page.mdx b/app/en/get-started/agent-plugin/tools-only/any-mcp-client/page.mdx index 428ffe5ee..e85d45ad5 100644 --- a/app/en/get-started/agent-plugin/tools-only/any-mcp-client/page.mdx +++ b/app/en/get-started/agent-plugin/tools-only/any-mcp-client/page.mdx @@ -29,14 +29,9 @@ Your client signs you in to Arcade when it first connects, and each app gets aut ## Try it -Ask your agent for an outcome rather than naming a tool. This gateway has every [optimized toolkit](/resources/integrations). The first time a task needs an app you have not authorized, your agent hands you a link. Approve it and the rest of the task continues, including steps that land in a different app. +Ask your agent for an outcome rather than naming a tool. The first time a task needs an app you have not authorized, your agent hands you a link. Approve it and the rest of the task continues, including steps that land in a different app. -Swap the app names for whatever you actually use: - -- "Send a summary of tomorrow's calendar events to me on Slack." -- "Read my Granola notes from last week, check them against Linear, and file anything I promised that is not a ticket yet. Wait for me before creating anything." -- "Find unread mail that needs a reply. Draft a response, Slack me the draft, and wait for me before sending it." -- "What apps can Arcade use?" +See [sample prompts](/get-started/agent-plugin#try-it) on the main install page, or ask "What apps can Arcade use?" ## Next steps diff --git a/app/en/get-started/agent-plugin/tools-only/claude-desktop/page.mdx b/app/en/get-started/agent-plugin/tools-only/claude-desktop/page.mdx index d00cbcabd..8c2aff092 100644 --- a/app/en/get-started/agent-plugin/tools-only/claude-desktop/page.mdx +++ b/app/en/get-started/agent-plugin/tools-only/claude-desktop/page.mdx @@ -1,6 +1,6 @@ --- title: "Install Arcade in Claude Desktop" -description: "Install the Arcade bundle in Claude Desktop with one download, or add the gateway as a custom connector, so Claude can act across the apps you connect." +description: "Add the Arcade plugin from a Claude Desktop marketplace for tools and skills, or connect the gateway as a custom connector for tools only." --- import { Callout } from "nextra/components"; @@ -8,18 +8,18 @@ import { SignupLink } from "@/app/_components/analytics"; # Install Arcade in Claude Desktop -Claude Desktop installs Arcade from a bundle rather than the `npx` command the coding agents use. Download it, open it, and Claude Desktop handles the rest. No API keys, and you authorize each app in the browser the first time it comes up. +Claude Desktop loads Arcade from a plugin marketplace, not the `npx` command the coding agents use. Chat gets tools and both skills. Cowork and Code in the desktop app also get the operator, commands, and hooks when you enable the plugin there. -Install the Arcade bundle in Claude Desktop and run a task against one of your apps. +Install Arcade in Claude Desktop and run a task against one of your apps. -1. Claude Desktop, updated to a version that supports extensions +1. Claude Desktop with plugin marketplace support 2. An Arcade account @@ -27,43 +27,48 @@ Install the Arcade bundle in Claude Desktop and run a task against one of your a - Using Cowork or Claude Code inside the Claude desktop app? Those load the full - agent plugin, with skills, commands, and the `arcade-operator` subagent. - Install it with [one command](/get-started/agent-plugin) instead. + Using Cowork or Claude Code inside the Claude desktop app? You can also + install with [one `npx` command](/get-started/agent-plugin) if you prefer. -## Install the bundle +## Install the plugin -{/* TODO(teal): Update these instructions after testing the .mcpb install. */} +**Customize → Plugins → Add marketplace → Add from a repository** → paste: -1. Download [the Arcade bundle]({{ARCADE_PLUGIN_MCPB_URL}}) -2. Open the downloaded `.mcpb` file, and Claude Desktop offers to install it -3. Confirm the install, then start a new conversation - -## Sign in - -Connecting Arcade signs you in and links Claude Desktop to the gateway. After that, the first time Claude reaches for an app, it returns a browser link asking you to authorize that app. Approve it and Arcade holds the token, so you only do this once per app. See [signing in](/get-started/agent-plugin/tools-only#sign-in) for how the two layers fit together. +```text +{{ARCADE_PLUGIN_REPO}} +``` -## Try it +Then install **Arcade** (`arcade@arcade`). -Ask Claude for an outcome rather than naming a tool. This gateway has every [optimized toolkit](/resources/integrations). The first time a task needs an app you have not authorized, Claude hands you a link. Approve it and the rest of the task continues, including steps that land in a different app. +From Claude Code in the desktop app, or a terminal: -Swap the app names for whatever you actually use: +```bash +claude plugin marketplace add {{ARCADE_PLUGIN_REPO}} +claude plugin install arcade@arcade +``` -- "Send a summary of tomorrow's calendar events to me on Slack." -- "Read my Granola notes from last week, check them against Linear, and file anything I promised that is not a ticket yet. Wait for me before creating anything." -- "Find unread mail that needs a reply. Draft a response, Slack me the draft, and wait for me before sending it." -- "What apps can Arcade use?" +There is no documented `claude://` link that adds a marketplace. The steps above are the install. -## Add the gateway by hand instead +## Tools only -If you would rather not install a bundle, Claude Desktop can reach the same gateway as a custom connector. Open **Settings → Connectors**, click **Add custom connector**, and paste: +If you only want the gateway without skills, skip the marketplace. Open **Settings → Connectors**, click **Add custom connector**, and paste: ```text {{ARCADE_PLUGIN_GATEWAY_URL}} ``` -Save, then start a new conversation. You get the same tools this way; the bundle just saves you the trip through settings. +Save, then start a new conversation. You get the same tools this way. You lose the skills that teach Claude how to chain tool calls across your apps. See [what you give up](/get-started/agent-plugin/tools-only#what-you-give-up). + +## Sign in + +Connecting Arcade signs you in and links Claude Desktop to the gateway. After that, the first time Claude reaches for an app, it returns a browser link asking you to authorize that app. Approve it and Arcade holds the token, so you only do this once per app. See [signing in](/get-started/agent-plugin/tools-only#sign-in) for how the two layers fit together. + +## Try it + +Ask Claude for an outcome rather than naming a tool. The first time a task needs an app you have not authorized, Claude hands you a link. Approve it and the rest of the task continues, including steps that land in a different app. + +See [sample prompts](/get-started/agent-plugin#try-it) on the main install page, or ask "What apps can Arcade use?" ## Next steps diff --git a/app/en/get-started/agent-plugin/tools-only/page.mdx b/app/en/get-started/agent-plugin/tools-only/page.mdx index 933b1812e..579b0bd88 100644 --- a/app/en/get-started/agent-plugin/tools-only/page.mdx +++ b/app/en/get-started/agent-plugin/tools-only/page.mdx @@ -7,7 +7,7 @@ import { SignupLink } from "@/app/_components/analytics"; # Tools-only MCP server -The [agent plugin](/get-started/agent-plugin) ships more than tools: two skills, three commands, and the `arcade-operator` subagent, all of which need a client that loads [agent plugins](https://agent-plugins.org). Clients that do not, Claude Desktop among them, can still connect to the same gateway and get every tool on it. +The [agent plugin](/get-started/agent-plugin) ships more than tools: two skills, three commands, and the `arcade-operator` subagent, all of which need a client that loads [agent plugins](https://agent-plugins.org). Any client can still connect to the same gateway and get every tool on it without loading the rest of the plugin. That is what this section covers. The gateway URL is: @@ -17,7 +17,7 @@ That is what this section covers. The gateway URL is: ## Install it -- **[Claude Desktop](/get-started/agent-plugin/tools-only/claude-desktop)** installs from a downloadable bundle, so you never paste a URL. +- **[Claude Desktop](/get-started/agent-plugin/tools-only/claude-desktop)** installs the full plugin from a marketplace, or connects with tools only through a custom connector. - **[Any other MCP client](/get-started/agent-plugin/tools-only/any-mcp-client)** takes the gateway URL directly. Cursor and VS Code also have one-click links. ## What you give up diff --git a/lib/agent-plugin.ts b/lib/agent-plugin.ts index c91aa131c..ceb4c8496 100644 --- a/lib/agent-plugin.ts +++ b/lib/agent-plugin.ts @@ -1,23 +1,15 @@ /** * Every install surface for the Arcade agent plugin resolves from the values - * here. The gateway still points at staging, so swapping these two constants - * at public launch updates the prose, the copyable commands, and the one-click - * install links together. + * here. Swapping these constants updates the prose, the copyable commands, and + * the one-click install links together. * * MDX pages reach these through `{{TOKEN}}` placeholders — see * `lib/remark-substitute.ts` for the token list. */ -export const AGENT_PLUGIN_ENGINE_PUBLIC_URL = "https://api.bosslevel.dev"; -export const AGENT_PLUGIN_GATEWAY_SLUG = "all-optimized"; +export const AGENT_PLUGIN_ENGINE_PUBLIC_URL = "https://api.arcade.dev"; +export const AGENT_PLUGIN_GATEWAY_SLUG = "arcade"; export const AGENT_PLUGIN_GATEWAY_URL = `${AGENT_PLUGIN_ENGINE_PUBLIC_URL}/mcp/${AGENT_PLUGIN_GATEWAY_SLUG}`; export const AGENT_PLUGIN_REPO = "ArcadeAI/arcade-plugin"; export const AGENT_PLUGIN_INSTALL_COMMAND = `npx plugins add ${AGENT_PLUGIN_REPO}`; - -/** - * The Claude Desktop bundle, served off the latest GitHub release so the link - * does not need updating per version. Confirm the asset filename matches what - * the release actually publishes. - */ -export const AGENT_PLUGIN_MCPB_URL = `https://github.com/${AGENT_PLUGIN_REPO}/releases/latest/download/arcade.mcpb`; diff --git a/lib/remark-substitute.ts b/lib/remark-substitute.ts index 73ffe788c..2c4454181 100644 --- a/lib/remark-substitute.ts +++ b/lib/remark-substitute.ts @@ -3,7 +3,6 @@ import { visit } from "unist-util-visit"; import { AGENT_PLUGIN_GATEWAY_URL, AGENT_PLUGIN_INSTALL_COMMAND, - AGENT_PLUGIN_MCPB_URL, AGENT_PLUGIN_REPO, } from "./agent-plugin"; @@ -17,7 +16,6 @@ export const substitutions: Record = { ARCADE_PLUGIN_GATEWAY_URL: AGENT_PLUGIN_GATEWAY_URL, ARCADE_PLUGIN_REPO: AGENT_PLUGIN_REPO, ARCADE_PLUGIN_INSTALL_COMMAND: AGENT_PLUGIN_INSTALL_COMMAND, - ARCADE_PLUGIN_MCPB_URL: AGENT_PLUGIN_MCPB_URL, }; /** From 9c7c8fadf8153875823b97bc8c4b2dfa96ff2b14 Mon Sep 17 00:00:00 2001 From: Teal Larson Date: Fri, 2 Oct 2026 10:06:18 -0400 Subject: [PATCH 14/42] docs(agent-plugin): sync released install paths --- app/en/get-started/agent-plugin/page.mdx | 122 ++++++++++++++---- .../tools-only/any-mcp-client/page.mdx | 2 +- .../agent-plugin/tools-only/page.mdx | 2 +- .../mcp-clients/claude-code/page.mdx | 7 +- .../get-started/mcp-clients/cursor/page.mdx | 6 +- .../mcp-clients/github-copilot/page.mdx | 2 +- app/en/get-started/mcp-clients/page.mdx | 2 +- .../mcp-clients/visual-studio-code/page.mdx | 6 +- lib/agent-plugin.ts | 2 - lib/remark-substitute.ts | 7 +- tests/remark-substitute.test.ts | 6 +- 11 files changed, 110 insertions(+), 54 deletions(-) diff --git a/app/en/get-started/agent-plugin/page.mdx b/app/en/get-started/agent-plugin/page.mdx index 55c2cb28c..4121dcd17 100644 --- a/app/en/get-started/agent-plugin/page.mdx +++ b/app/en/get-started/agent-plugin/page.mdx @@ -1,9 +1,9 @@ --- title: "Install the Arcade agent plugin" -description: "Install Arcade in Cursor, Claude Code, VS Code, GitHub Copilot CLI, or Codex with one command. Your agent gets tools for every app you connect, with browser sign-in and no API keys." +description: "Install Arcade in Cursor, Claude Code, VS Code, GitHub Copilot CLI, Codex, or Claude Desktop. Your agent gets tools for every app you connect, with browser sign-in and no API keys." --- -import { Callout } from "nextra/components"; +import { Callout, Tabs } from "nextra/components"; import { SignupLink } from "@/app/_components/analytics"; # Install the Arcade agent plugin @@ -19,9 +19,8 @@ Install the Arcade agent plugin in your agent and run your first task against a -1. [Node.js](https://nodejs.org) so you can run `npx` -2. An agent with [plugins](https://agent-plugins.org) support: Cursor, Claude Code, VS Code, GitHub Copilot CLI, or Codex -3. An Arcade account +1. A supported client: Cursor, Claude Code, VS Code, GitHub Copilot CLI, Codex, or Claude Desktop +2. An Arcade account @@ -37,29 +36,84 @@ Install the Arcade agent plugin in your agent and run your first task against a ## Install +Each client installs plugins differently. Use the path for yours. + + + The cross-client `npx plugins add` command does not finish every client + install. Use the client-native steps below so the gateway and every supported + plugin component load together. + + + + + +Add the Arcade marketplace, then install the plugin: + ```bash -{{ARCADE_PLUGIN_INSTALL_COMMAND}} +claude plugin marketplace add {{ARCADE_PLUGIN_REPO}} +claude plugin install arcade@arcade ``` -The CLI detects the supported agents on your machine and installs to each one. To install to a single agent, pass `--target`: +Run `/reload-plugins` if Claude Code is already open. Verify the install with `claude plugin list` or `/plugin`. + + + + +Add the Arcade marketplace, then install the plugin: ```bash -{{ARCADE_PLUGIN_INSTALL_COMMAND}} --target cursor -{{ARCADE_PLUGIN_INSTALL_COMMAND}} --target claude-code -{{ARCADE_PLUGIN_INSTALL_COMMAND}} --target vscode -{{ARCADE_PLUGIN_INSTALL_COMMAND}} --target copilot -{{ARCADE_PLUGIN_INSTALL_COMMAND}} --target codex +codex plugin marketplace add {{ARCADE_PLUGIN_REPO}} +codex plugin add arcade@arcade ``` -To see what an install would write without changing anything: +Start a new Codex session or ChatGPT desktop chat. Open `/plugins`, confirm **arcade** is installed and enabled, then confirm the **arcade** MCP server is connected. + + + + +For an individual Cursor plan, clone the plugin into Cursor's local plugin directory: ```bash -npx plugins discover {{ARCADE_PLUGIN_REPO}} +git clone https://github.com/{{ARCADE_PLUGIN_REPO}} ~/.cursor/plugins/local/arcade-plugin ``` -Reload your agent afterwards if it does not pick up the plugin on its own. A couple of agents gate plugins behind a setting. Claude Code may ask you to enable it with `claude plugin`, and VS Code needs `chat.plugins.enabled` set to `true`. +Run **Developer: Reload Window**, then open **Customize** and confirm the Arcade skills, `arcade-operator`, rule, and MCP server are present. + +On Teams and Enterprise plans, an admin must import `https://github.com/{{ARCADE_PLUGIN_REPO}}` under **Dashboard → Plugins & MCPs → Team Marketplaces**. Each person can then install Arcade from **Customize**. -For [Claude Desktop](/get-started/agent-plugin/tools-only/claude-desktop), add the plugin from a marketplace instead of running `npx`. Using another client that does not load plugins? Connect to the same gateway with the [tools-only Arcade bundle](/get-started/agent-plugin/tools-only). + + + +Open the Command Palette, select **Chat: Install Plugin From Source**, and paste: + +```text +https://github.com/{{ARCADE_PLUGIN_REPO}} +``` + +Turn on `chat.plugins.enabled` if needed, then reload VS Code. Run **MCP: List Servers**, select **arcade**, choose **Start Server**, and sign in when prompted. + + + + +Install with Copilot CLI's plugin command: + +```bash +copilot plugin install {{ARCADE_PLUGIN_REPO}} +``` + +Restart the session or run `/restart`. + + + + +Open **Customize → Plugins → Add marketplace → Add from a repository**, paste `{{ARCADE_PLUGIN_REPO}}`, then install **Arcade** (`arcade@arcade`). + +See the [Claude Desktop guide](/get-started/agent-plugin/tools-only/claude-desktop) for the terminal commands and tools-only connector option. + + + + +After installation, reload your agent or start a new session. Using another client that does not load plugins? Connect to the same gateway with the [tools-only Arcade bundle](/get-started/agent-plugin/tools-only). ## Sign in @@ -78,21 +132,33 @@ Every Arcade gateway works this way, not just the one in the plugin. [Server-lev Every install connects to the same Arcade gateway and gets the same tools. What differs is how much of the rest of the plugin each agent can load. -| Agent | Tools | Skills | Subagent | Commands | Rule | Hooks | -| -------------------- | :---: | :----: | :------: | :------: | :--: | :---: | -| Cursor | ✅ | 2 | ✅ | 3 | ✅ | ✅ | -| Claude Code | ✅ | 2 | ✅ | 3 | — | ✅ | -| Claude Cowork | ✅ | 2 | ✅ | 3 | — | ✅ | -| GitHub Copilot CLI | ✅ | 2 | ✅ | — | — | — | -| VS Code | ✅ | 2 | — | — | — | — | -| Codex and ChatGPT | ✅ | 2 | — | — | — | — | -| Claude Desktop | ✅ | 2 | — | — | — | — | -| Any other MCP client | ✅ | — | — | — | — | — | +| Agent | Tools | Skills | Subagent | Commands | Rule | Hooks | +| ----------------------------------- | :---: | :----: | :------: | :------: | :--: | :------: | +| Cursor IDE and Cloud Agents | ✅ | 2 | ✅ | 3¹ | ✅ | —² | +| Cursor CLI | ✅ | 2 | ✅ | 3 | — | ✅³ | +| Claude Code | ✅ | 2 | ✅ | 3 | — | ✅ | +| Claude Cowork | ✅ | 2 | ✅ | 3 | — | partial⁴ | +| GitHub Copilot CLI | ✅ | 2 | ✅ | — | — | ✅⁵ | +| VS Code | ✅ | 2 | ✅ | — | — | —⁶ | +| Codex and ChatGPT local runtime | ✅ | 2 | — | — | — | —⁷ | +| Claude Desktop | ✅ | 2 | — | — | — | — | +| OpenCode | ✅ | — | — | — | — | — | +| Any other Streamable HTTP MCP client | ✅ | — | — | — | — | — | + +- ¹ Cursor IDE lists the commands on the plugin page but does not show them in the `/` menu. +- ² Cursor IDE and Cloud Agents do not run plugin hooks. The always-apply rule carries the routing guidance instead. +- ³ Cursor CLI runs the session hook but does not load the always-apply rule. +- ⁴ Cowork runs the prompt and subagent hooks but does not add the session-start text to the main conversation. +- ⁵ Copilot CLI runs session and subagent hooks, but drops prompt-hook output from configuration files. +- ⁶ VS Code reads the Copilot hook file but cannot run its Agent Plugins hook commands yet. +- ⁷ Codex does not run Agent Plugins lifecycle hooks yet. Here is what each of those is for. ### Commands +Cursor, Claude Code, and Cowork load all three commands. Claude Code and Cowork namespace them as `/arcade:arcade-status`, `/arcade:arcade-connect`, and `/arcade:arcade-apps`. + #### `/arcade-status` Reports whether the gateway is reachable, whether you have signed in, and which apps you have authorized. @@ -111,11 +177,11 @@ Skills are instructions your agent reads on its own, so you never have to invoke ### Subagent -The `arcade-operator` subagent runs an app task in its own context and reports back just the result. Arcade exposes a lot of tools, and searching them fills a conversation with noise that pushes out your actual work. The operator absorbs that. +The `arcade-operator` subagent runs an app task in its own context and reports back just the result. Arcade exposes a lot of tools, and searching them fills a conversation with noise that pushes out your actual work. The operator absorbs that. Cursor, Claude Code, Cowork, Copilot CLI, and VS Code load it. Codex and Claude Desktop Chat do not. ### Rule and hooks -The rule and hooks are Cursor and Claude Code specific. They tell your agent that Arcade exists and when reaching for it is the right move, which is the difference between a tool that sits unused and one your agent actually picks up. +The rule and hooks tell your agent that Arcade exists and when reaching for it is the right move, which is the difference between a tool that sits unused and one your agent actually picks up. Cursor IDE and Cloud Agents use an always-apply rule. Cursor CLI, Claude Code, Cowork, and Copilot CLI run the hooks their hosts support. The columns thin out because the [Agent Plugins](https://agent-plugins.org) 1.0 specification only makes skills and MCP servers portable. Commands, subagents, hooks, and editor rules are specific to each agent, so the plugin ships them where the agents that support them will find them. diff --git a/app/en/get-started/agent-plugin/tools-only/any-mcp-client/page.mdx b/app/en/get-started/agent-plugin/tools-only/any-mcp-client/page.mdx index e85d45ad5..bfedfbae1 100644 --- a/app/en/get-started/agent-plugin/tools-only/any-mcp-client/page.mdx +++ b/app/en/get-started/agent-plugin/tools-only/any-mcp-client/page.mdx @@ -36,5 +36,5 @@ See [sample prompts](/get-started/agent-plugin#try-it) on the main install page, ## Next steps - [Tools-only MCP server](/get-started/agent-plugin/tools-only): what you give up by skipping the plugin -- [Install the agent plugin](/get-started/agent-plugin): one command for Cursor, Claude Code, VS Code, Copilot CLI, and Codex +- [Install the agent plugin](/get-started/agent-plugin): use the client-native install for Cursor, Claude Code, VS Code, Copilot CLI, Codex, or Claude Desktop - [Connect to MCP clients](/get-started/mcp-clients): point a client at a gateway you control, with your own tool list diff --git a/app/en/get-started/agent-plugin/tools-only/page.mdx b/app/en/get-started/agent-plugin/tools-only/page.mdx index 579b0bd88..12ff4d039 100644 --- a/app/en/get-started/agent-plugin/tools-only/page.mdx +++ b/app/en/get-started/agent-plugin/tools-only/page.mdx @@ -38,6 +38,6 @@ Your tool calls, tokens, and secrets route through your own Arcade project, isol ## Next steps -- [Install the agent plugin](/get-started/agent-plugin): one command for Cursor, Claude Code, VS Code, Copilot CLI, and Codex +- [Install the agent plugin](/get-started/agent-plugin): use the client-native install for Cursor, Claude Code, VS Code, Copilot CLI, Codex, or Claude Desktop - [Connect to MCP clients](/get-started/mcp-clients): point a client at a gateway you control, with your own tool list - [From personal use to team rollout](/get-started/agent-plugin/team-rollout): what changes when a team depends on the workflow diff --git a/app/en/get-started/mcp-clients/claude-code/page.mdx b/app/en/get-started/mcp-clients/claude-code/page.mdx index e97bb9f22..73a553cb5 100644 --- a/app/en/get-started/mcp-clients/claude-code/page.mdx +++ b/app/en/get-started/mcp-clients/claude-code/page.mdx @@ -5,9 +5,9 @@ import { SignupLink } from "@/app/_components/analytics"; **Setting Arcade up for yourself?** The [Arcade agent plugin](/get-started/agent-plugin) - installs in one command, needs no API key, and signs you in to each app in the - browser. This guide is for pointing Claude Code at a gateway you control, with - your own tool list and your own end-user identities. + installs through Claude's plugin marketplace, needs no API key, and signs you + in to each app in the browser. This guide is for pointing Claude Code at a + gateway you control, with your own tool list and your own end-user identities. @@ -51,4 +51,3 @@ claude mcp list Open Claude Code in your project and ask it to use one of the tools from your gateway. - diff --git a/app/en/get-started/mcp-clients/cursor/page.mdx b/app/en/get-started/mcp-clients/cursor/page.mdx index c7bc52e01..1fc47e4c3 100644 --- a/app/en/get-started/mcp-clients/cursor/page.mdx +++ b/app/en/get-started/mcp-clients/cursor/page.mdx @@ -10,9 +10,9 @@ import { SignupLink } from "@/app/_components/analytics"; **Setting Arcade up for yourself?** The [Arcade agent plugin](/get-started/agent-plugin) - installs in one command, needs no API key, and signs you in to each app in the - browser. This guide is for pointing Cursor at a gateway you control, with your - own tool list and your own end-user identities. + installs from GitHub through Cursor's plugin flow, needs no API key, and signs + you in to each app in the browser. This guide is for pointing Cursor at a + gateway you control, with your own tool list and your own end-user identities. Cursor is an MCP client. Point it at an Arcade [MCP Gateway](/operate/governance/mcp-gateways) URL over the Streamable HTTP transport and Cursor's agent can call any tool you selected on that gateway — GitHub, Linear, Gmail, Slack, or any other toolkit from the [Arcade integrations catalog](/resources/integrations), plus tools from your own [custom MCP servers](/build/create-tools/tool-basics/build-mcp-server). diff --git a/app/en/get-started/mcp-clients/github-copilot/page.mdx b/app/en/get-started/mcp-clients/github-copilot/page.mdx index de4e0d7b8..85ceaecc2 100644 --- a/app/en/get-started/mcp-clients/github-copilot/page.mdx +++ b/app/en/get-started/mcp-clients/github-copilot/page.mdx @@ -22,7 +22,7 @@ export const VISUAL_STUDIO_STEP_6_HEIGHT = 360; **Setting Arcade up for yourself?** The [Arcade agent plugin](/get-started/agent-plugin) - installs into Copilot CLI in one command, needs no API key, and signs you in + installs with Copilot CLI's plugin command, needs no API key, and signs you in to each app in the browser. This guide is for pointing Copilot at a gateway you control, with your own tool list and your own end-user identities. diff --git a/app/en/get-started/mcp-clients/page.mdx b/app/en/get-started/mcp-clients/page.mdx index bfb55baaf..c5623b5ef 100644 --- a/app/en/get-started/mcp-clients/page.mdx +++ b/app/en/get-started/mcp-clients/page.mdx @@ -15,4 +15,4 @@ Every supported MCP client, including Cursor, Claude Desktop, Claude Code, VS Co ## Setting Arcade up for yourself? -These guides assume you want your own gateway, with a tool list and end-user identities you control. If you are setting Arcade up for your own work, the [Arcade agent plugin](/get-started/agent-plugin) is faster: one command installs it into Cursor, Claude Code, VS Code, GitHub Copilot CLI, or Codex, there is no API key to create, and you sign in to each app in the browser. +These guides assume you want your own gateway, with a tool list and end-user identities you control. If you are setting Arcade up for your own work, the [Arcade agent plugin](/get-started/agent-plugin) is faster: install it through your client's plugin flow, skip the API key, and sign in to each app in the browser. diff --git a/app/en/get-started/mcp-clients/visual-studio-code/page.mdx b/app/en/get-started/mcp-clients/visual-studio-code/page.mdx index 83a0ede30..dff90afb6 100644 --- a/app/en/get-started/mcp-clients/visual-studio-code/page.mdx +++ b/app/en/get-started/mcp-clients/visual-studio-code/page.mdx @@ -7,9 +7,9 @@ In this guide, you'll learn how to connect Visual Studio Code to an Arcade MCP G **Setting Arcade up for yourself?** The [Arcade agent plugin](/get-started/agent-plugin) - installs in one command, needs no API key, and signs you in to each app in the - browser. This guide is for pointing VS Code at a gateway you control, with - your own tool list and your own end-user identities. + installs from source through the Command Palette, needs no API key, and signs + you in to each app in the browser. This guide is for pointing VS Code at a + gateway you control, with your own tool list and your own end-user identities. diff --git a/lib/agent-plugin.ts b/lib/agent-plugin.ts index ceb4c8496..49346c987 100644 --- a/lib/agent-plugin.ts +++ b/lib/agent-plugin.ts @@ -11,5 +11,3 @@ export const AGENT_PLUGIN_GATEWAY_SLUG = "arcade"; export const AGENT_PLUGIN_GATEWAY_URL = `${AGENT_PLUGIN_ENGINE_PUBLIC_URL}/mcp/${AGENT_PLUGIN_GATEWAY_SLUG}`; export const AGENT_PLUGIN_REPO = "ArcadeAI/arcade-plugin"; - -export const AGENT_PLUGIN_INSTALL_COMMAND = `npx plugins add ${AGENT_PLUGIN_REPO}`; diff --git a/lib/remark-substitute.ts b/lib/remark-substitute.ts index 2c4454181..ab71fb90d 100644 --- a/lib/remark-substitute.ts +++ b/lib/remark-substitute.ts @@ -1,10 +1,6 @@ import type { Root } from "mdast"; import { visit } from "unist-util-visit"; -import { - AGENT_PLUGIN_GATEWAY_URL, - AGENT_PLUGIN_INSTALL_COMMAND, - AGENT_PLUGIN_REPO, -} from "./agent-plugin"; +import { AGENT_PLUGIN_GATEWAY_URL, AGENT_PLUGIN_REPO } from "./agent-plugin"; /** * Tokens an MDX page can write as `{{NAME}}`. Prose, inline code, fenced code @@ -15,7 +11,6 @@ import { export const substitutions: Record = { ARCADE_PLUGIN_GATEWAY_URL: AGENT_PLUGIN_GATEWAY_URL, ARCADE_PLUGIN_REPO: AGENT_PLUGIN_REPO, - ARCADE_PLUGIN_INSTALL_COMMAND: AGENT_PLUGIN_INSTALL_COMMAND, }; /** diff --git a/tests/remark-substitute.test.ts b/tests/remark-substitute.test.ts index f7e0d620b..5be6e3dc5 100644 --- a/tests/remark-substitute.test.ts +++ b/tests/remark-substitute.test.ts @@ -70,15 +70,13 @@ describe("remarkSubstitute", () => { it("substitutes inside prose", () => { const text: Text = { type: "text", - value: "Run {{ARCADE_PLUGIN_INSTALL_COMMAND}} to start.", + value: "Install {{ARCADE_PLUGIN_REPO}} to start.", }; const paragraph: Paragraph = { type: "paragraph", children: [text] }; const tree: Root = { type: "root", children: [paragraph] }; substitute(tree, {}); - expect(text.value).toBe( - "Run npx plugins add ArcadeAI/arcade-plugin to start." - ); + expect(text.value).toBe("Install ArcadeAI/arcade-plugin to start."); }); }); From b63c631f298f4dc9ab460f9fe9daa60d5378c7eb Mon Sep 17 00:00:00 2001 From: Teal Larson Date: Fri, 2 Oct 2026 10:12:43 -0400 Subject: [PATCH 15/42] ci(llmstxt): fetch generation base commit --- .github/workflows/llmstxt.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/llmstxt.yml b/.github/workflows/llmstxt.yml index 7564d7424..4d88930be 100644 --- a/.github/workflows/llmstxt.yml +++ b/.github/workflows/llmstxt.yml @@ -37,6 +37,8 @@ jobs: uses: actions/checkout@v4 with: ref: ${{ github.event.pull_request.head.ref || github.ref }} + # The generator diffs against the SHA stored in public/llms.txt. + fetch-depth: 0 - name: Install dependencies run: npm install -g pnpm From 4a5595d408e1d77ed25955f198b7cc0a4988cdd7 Mon Sep 17 00:00:00 2001 From: Teal Larson Date: Fri, 2 Oct 2026 10:13:53 -0400 Subject: [PATCH 16/42] docs(agent-plugin): clear style suggestions --- app/en/get-started/agent-plugin/page.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/en/get-started/agent-plugin/page.mdx b/app/en/get-started/agent-plugin/page.mdx index 4121dcd17..36eb70132 100644 --- a/app/en/get-started/agent-plugin/page.mdx +++ b/app/en/get-started/agent-plugin/page.mdx @@ -122,7 +122,7 @@ Authentication happens in two layers: 1. **Into the gateway.** Your client will ask you to authenticate when it first connects. You sign in to Arcade in the browser, and the client can reach the gateway from then on. 2. **Into each app.** When a task needs Gmail, Slack, Linear, or anything else, your agent hands you a link that grants the scopes that task requires. Approve it once and Arcade holds the token for that app. You won't need to authenticate that service again unless a later task requires greater scopes. -You never give your agent an API key or a password for either layer. Ask your agent to run `/arcade-status` to see what applications are currently enabled, or `/arcade-connect google` to authorize an app with the widest possible scope before you need it. +You never give your agent an API key or a password for either layer. Ask your agent to run `/arcade-status` to list the applications you enabled, or `/arcade-connect google` to authorize an app with the widest possible scope before you need it. All of your tool calls, tokens, and secrets route through your own Arcade project, isolated from every other user of that gateway. No one else's agent can ever reach your apps, tools, or tokens. @@ -193,7 +193,7 @@ This gateway includes every [optimized toolkit](/resources/integrations) in the - "Read my Granola notes from last week, check them against Linear, and file anything I promised that is not a ticket yet. Wait for me before creating anything." - "Find unread mail that needs a reply. Look the sender up in HubSpot if you can, draft a response, and Slack me the draft before sending." - "Pull my open GitHub pull requests, my Linear issues, and tomorrow's calendar. Write a standup update and send it to me on Slack." -- "Search my Drive and Notion for the latest product spec, then drop a one-paragraph summary in Slack." +- "Search my Drive and Notion for the product spec my team uses, then drop a one-paragraph summary in Slack." Or ask "What can Arcade do?" and pick a workflow from the answer. From 33080e53d357dff2b9c293f37e0d7989c6ebc5fe Mon Sep 17 00:00:00 2001 From: Teal Larson Date: Fri, 2 Oct 2026 10:18:20 -0400 Subject: [PATCH 17/42] fix(llmstxt): recover from missing generation base --- scripts/generate-llmstxt.ts | 68 ++++++++++++++++++------------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/scripts/generate-llmstxt.ts b/scripts/generate-llmstxt.ts index 65301a68b..e494850d8 100644 --- a/scripts/generate-llmstxt.ts +++ b/scripts/generate-llmstxt.ts @@ -1,4 +1,4 @@ -import { execSync } from "node:child_process"; +import { execFileSync, execSync } from "node:child_process"; import fs from "node:fs/promises"; import path from "node:path"; import chalk from "chalk"; @@ -94,46 +94,44 @@ async function parseLlmsTxtMetadata(): Promise { /** * Gets changed files since the last git SHA */ -function getChangedFilesSince(lastSha: string): Set { - try { - // Get files that were added, modified, or deleted - const added = execSync( - `git diff --name-only --diff-filter=A ${lastSha} HEAD`, - { - encoding: "utf-8", - } - ) - .trim() - .split("\n") - .filter((line) => line.length > 0); - - const modified = execSync( - `git diff --name-only --diff-filter=M ${lastSha} HEAD`, - { encoding: "utf-8" } - ) - .trim() - .split("\n") - .filter((line) => line.length > 0); - - const deleted = execSync( - `git diff --name-only --diff-filter=D ${lastSha} HEAD`, - { - encoding: "utf-8", - } - ) +function listChangedFilesSince(ref: string): Set { + const output = execFileSync( + "git", + ["diff", "--name-only", "--diff-filter=AMD", ref, "HEAD"], + { encoding: "utf-8" } + ); + return new Set( + output .trim() .split("\n") - .filter((line) => line.length > 0); + .filter((line) => line.length > 0) + ); +} - const allChanged = new Set([...added, ...modified, ...deleted]); - return allChanged; +function getChangedFilesSince(lastSha: string): Set | null { + try { + return listChangedFilesSince(lastSha); } catch (_error) { + const baseRef = process.env.GITHUB_BASE_REF; + if (baseRef) { + const remoteBaseRef = `origin/${baseRef}`; + try { + console.warn( + chalk.yellow( + `⚠ Could not get changed files since ${lastSha}; comparing with ${remoteBaseRef}` + ) + ); + return listChangedFilesSince(remoteBaseRef); + } catch (_fallbackError) { + // Fall through and summarize everything when neither reference exists. + } + } console.warn( chalk.yellow( - `⚠ Could not get changed files since ${lastSha}, processing all files` + `⚠ Could not determine changes since ${lastSha}; processing all files` ) ); - return new Set(); + return null; } } @@ -597,7 +595,9 @@ function determinePagesToSummarize( if (previousMetadata && previousMetadata.gitSha !== "unknown") { // Get changed files since last generation - const changedFiles = getChangedFilesSince(previousMetadata.gitSha); + const changedFiles = + getChangedFilesSince(previousMetadata.gitSha) ?? + new Set(pages.map((page) => page.path)); console.log( chalk.blue( `\n📊 Found ${changedFiles.size} changed files since last generation` From 1903d2de19bd817341ca5e82b68592e296dd39a9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 2 Oct 2026 14:19:11 +0000 Subject: [PATCH 18/42] =?UTF-8?q?=F0=9F=A4=96=20Regenerate=20LLMs.txt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/llms.txt | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/public/llms.txt b/public/llms.txt index 244f4f4fb..20b051e22 100644 --- a/public/llms.txt +++ b/public/llms.txt @@ -1,4 +1,4 @@ - + # Arcade @@ -81,7 +81,6 @@ Arcade docs serve two audiences. Start with the path that matches your goal: - [Arcade Cloud infrastructure](https://docs.arcade.dev/en/operate/deploy/arcade-cloud): Documentation page - [Arcade Gateway Assistant](https://docs.arcade.dev/en/operate/governance/mcp-gateways/create-via-ai): Documentation page - [Arcade Glossary](https://docs.arcade.dev/en/resources/glossary): The Arcade Glossary provides definitions and explanations of key terms and concepts related to the Arcade platform, including agents, harnesses, MCP servers, and tools. This resource helps users understand the components and functionalities necessary for building, deploying, and managing applications that -- [Arcade tools without the plugin](https://docs.arcade.dev/en/get-started/agent-plugin/tools-only): Documentation page - [Arcade with Agent Frameworks and MCP Clients](https://docs.arcade.dev/en/get-started/agent-frameworks): This documentation page provides developers with guidance on integrating Arcade with agent frameworks and MCP clients to enhance AI applications with tool-calling capabilities. It offers detailed instructions on authentication, tool loading, and execution, along with code examples and configuration steps for popular frameworks and - [Arcade with Google ADK](https://docs.arcade.dev/en/get-started/agent-frameworks/google-adk/overview): The "Arcade with Google ADK" documentation page provides guidance on integrating Arcade tools with the Google ADK framework, enabling users to build AI agents that can interact with various services like Gmail, Slack, and GitHub. It offers setup instructions for - [Arcade with LangChain](https://docs.arcade.dev/en/get-started/agent-frameworks/langchain/overview): This documentation page provides guidance on integrating Arcade tools with LangChain agents, enabling users to build AI agents that can interact with various services like Gmail, GitHub, and Slack. It offers setup instructions for both Python and TypeScript, along with examples of @@ -116,7 +115,7 @@ Arcade docs serve two audiences. Start with the path that matches your goal: - [Connect an Atlassian Remote MCP Server](https://docs.arcade.dev/en/operate/governance/remote-mcp-servers/atlassian): Documentation page - [Connect Arcade to your LLM](https://docs.arcade.dev/en/get-started/agent-frameworks/setup-arcade-with-your-llm-python): This documentation page guides users on how to connect Arcade to a Large Language Model (LLM) using Python by creating a "harness" that facilitates interaction between the user, the model, and various tools. Users will learn to set up an agent - [Connect the AWS MCP Server](https://docs.arcade.dev/en/operate/governance/remote-mcp-servers/aws): Documentation page -- [Connect to MCP Clients](https://docs.arcade.dev/en/get-started/mcp-clients): This documentation page provides guidance on connecting Arcade MCP servers to various MCP-compatible clients and development environments, enabling users to enhance their agent workflows. +- [Connect to MCP Clients](https://docs.arcade.dev/en/get-started/mcp-clients): Documentation page - [Contact Us](https://docs.arcade.dev/en/resources/contact-us): This documentation page provides users with information on how to connect with the Arcade team for support through various channels. It aims to facilitate communication and assistance for users and their agents. - [Contextual Access](https://docs.arcade.dev/en/operate/governance/contextual-access): Documentation page - [Create an evaluation suite](https://docs.arcade.dev/en/build/create-tools/evaluate-tools/create-evaluation-suite): Documentation page @@ -132,7 +131,7 @@ Arcade docs serve two audiences. Start with the path that matches your goal: - [Evaluate Tools](https://docs.arcade.dev/en/build/create-tools/evaluate-tools): Documentation page - [Examples](https://docs.arcade.dev/en/resources/examples): This documentation page provides a collection of example applications that utilize Arcade's tools and MCP servers, showcasing various real-world scenarios and integration patterns. Users can explore complete source code and setup instructions for each example, enabling them to quickly understand and implement similar projects. - [Frequently Asked Questions](https://docs.arcade.dev/en/resources/faq): This documentation page provides answers to common questions about the Arcade platform, including how to create and contribute tools, the differences between various API keys, and authentication methods. Users can learn how to build custom tools, manage API keys for team collaboration, and understand -- [From trial to team rollout](https://docs.arcade.dev/en/get-started/agent-plugin/team-rollout): Documentation page +- [From personal use to team rollout](https://docs.arcade.dev/en/get-started/agent-plugin/team-rollout): Documentation page - [Get Formatted Tool Definitions](https://docs.arcade.dev/en/build/tool-calling/custom-apps/get-tool-definitions): Documentation page - [Getting Your API Key](https://docs.arcade.dev/en/get-started/setup/api-keys): This documentation page guides users on how to obtain and manage their Arcade API key, detailing the steps for generating keys through both the Arcade dashboard and CLI. It emphasizes the importance of securely storing API keys, as they serve as administrator credentials that grant access to - [Governance](https://docs.arcade.dev/en/operate/governance): Documentation page @@ -177,14 +176,15 @@ Arcade docs serve two audiences. Start with the path that matches your goal: - [Tool error handling](https://docs.arcade.dev/en/build/tool-calling/error-handling): Documentation page - [Tool executions](https://docs.arcade.dev/en/operate/governance/tool-executions): Documentation page - [Tools](https://docs.arcade.dev/en/resources/tools): This documentation page provides an overview of Arcade's ecosystem for AI tools, enabling users to explore a catalog of pre-built integrations, create custom tools, and contribute their own tools to the community. It outlines the benefits of using Arcade tools, such as built +- [Tools-only MCP server](https://docs.arcade.dev/en/get-started/agent-plugin/tools-only): Documentation page - [Types of Tools](https://docs.arcade.dev/en/build/create-tools/improve/types-of-tools): Documentation page - [Understanding `Context` and tools](https://docs.arcade.dev/en/build/create-tools/tool-basics/runtime-data-access): Documentation page -- [Use Arcade in Claude Code](https://docs.arcade.dev/en/get-started/mcp-clients/claude-code): This documentation page guides users on how to connect Claude Code to an Arcade MCP Gateway using the Arcade Headers authentication mode. It outlines the prerequisites for setup, including creating an Arcade account, obtaining an API key, and creating an Arcade MCP Gateway, and provides step-by-step instructions for adding the gateway as a remote HTTP MCP server in Claude Code. -- [Use Arcade in Claude Desktop](https://docs.arcade.dev/en/get-started/mcp-clients/claude-desktop): This documentation page guides users on how to connect Claude Desktop to an Arcade MCP Gateway, detailing the necessary prerequisites and step-by-step instructions for setting up a custom connector. It emphasizes the importance of configuring the correct authentication settings and provides visual aids to facilitate the -- [Use Arcade in Cursor](https://docs.arcade.dev/en/get-started/mcp-clients/cursor): This documentation page provides a step-by-step guide for connecting Cursor to an Arcade MCP Gateway, enabling users to utilize Arcade tools effectively. It outlines the prerequisites for setup, including creating an Arcade account and obtaining an API key, and offers instructions for configuring Cursor +- [Use Arcade in Claude Code](https://docs.arcade.dev/en/get-started/mcp-clients/claude-code): Documentation page +- [Use Arcade in Claude Desktop](https://docs.arcade.dev/en/get-started/mcp-clients/claude-desktop): Documentation page +- [Use Arcade in Cursor](https://docs.arcade.dev/en/get-started/mcp-clients/cursor): Documentation page - [Use Arcade in GitHub Copilot](https://docs.arcade.dev/en/get-started/mcp-clients/github-copilot): Documentation page - [Use Arcade in Microsoft Copilot Studio](https://docs.arcade.dev/en/get-started/mcp-clients/copilot-studio): This documentation page provides a step-by-step guide for connecting Microsoft Copilot Studio to an Arcade MCP Gateway, enabling users to integrate and utilize Arcade tools within their agents. It outlines the prerequisites, configuration steps, and authorization process necessary for establishing the connection, -- [Use Arcade in Visual Studio Code](https://docs.arcade.dev/en/get-started/mcp-clients/visual-studio-code): This documentation page provides a step-by-step guide for connecting Visual Studio Code to an Arcade MCP Gateway, enabling users to set up and run their MCP server within the IDE. It outlines prerequisites, setup instructions, and authentication processes to ensure a successful integration. +- [Use Arcade in Visual Studio Code](https://docs.arcade.dev/en/get-started/mcp-clients/visual-studio-code): Documentation page - [Use Arcade tools with AG2](https://docs.arcade.dev/en/get-started/agent-frameworks/ag2/use-arcade-tools): Documentation page - [Use Arcade tools with CrewAI](https://docs.arcade.dev/en/get-started/agent-frameworks/crewai/use-arcade-tools): This documentation page provides a comprehensive guide for integrating Arcade tools into CrewAI applications, enabling users to build task-oriented multi-agent systems that assist with platforms like Gmail and Slack. It outlines the prerequisites, learning outcomes, and step-by-step instructions for setting up - [User Sources](https://docs.arcade.dev/en/operate/identity/user-sources): Documentation page From c812b04ee469723cae7d44bf1b2fd602fa930c1c Mon Sep 17 00:00:00 2001 From: Teal Larson Date: Fri, 2 Oct 2026 10:22:54 -0400 Subject: [PATCH 19/42] fix(llmstxt): preserve useful summaries on API failure --- scripts/generate-llmstxt.ts | 39 +++++++++++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/scripts/generate-llmstxt.ts b/scripts/generate-llmstxt.ts index e494850d8..7b4228468 100644 --- a/scripts/generate-llmstxt.ts +++ b/scripts/generate-llmstxt.ts @@ -43,6 +43,10 @@ const DYNAMIC_SEGMENT_REGEX = /\[[^/]+\]/; const TITLE_H1_REGEX = /^#\s+(.+)$/m; const FRONTMATTER_REGEX = /^---\n([\s\S]*?)\n---/; const FRONTMATTER_TITLE_REGEX = /^title:\s*(.+)$/m; +const FRONTMATTER_DESCRIPTION_REGEX = /^description:\s*(.+)$/m; +const GUIDE_OUTCOMES_REGEX = + /\s*([\s\S]*?)\s*<\/GuideOverview\.Outcomes>/; +const FIRST_PROSE_AFTER_H1_REGEX = /^#\s+.+\n+([^#<\n][^\n]*)/m; const EN_LOCALE_PREFIX_REGEX = /^en\//; const METADATA_REGEX = /^/; @@ -376,14 +380,19 @@ async function summarizePage( }); const description = - response.choices[0]?.message?.content?.trim() || "Documentation page"; + response.choices[0]?.message?.content?.trim() || + extractPageDescription(page.content); return { title, description }; - } catch (error) { - console.error(chalk.red(`✗ Error summarizing ${page.path}:`), error); + } catch { + console.warn( + chalk.yellow( + `⚠ Could not summarize ${page.path} with OpenAI; using its frontmatter description` + ) + ); return { title: extractPageTitle(page.content, page.path), - description: "Documentation page", + description: extractPageDescription(page.content), }; } } @@ -500,6 +509,28 @@ function extractPageTitle(content: string, filePath: string): string { return frontmatterTitle ?? deriveTitleFromPath(filePath); } +function extractPageDescription(content: string): string { + const frontmatterDescription = content + .match(FRONTMATTER_REGEX)?.[1] + ?.match(FRONTMATTER_DESCRIPTION_REGEX)?.[1] + ?.trim() + ?.replace(/^['"](.*)['"]$/, "$1"); + if (frontmatterDescription) { + return frontmatterDescription; + } + + const fallbackDescription = + content.match(GUIDE_OUTCOMES_REGEX)?.[1] ?? + content.match(FIRST_PROSE_AFTER_H1_REGEX)?.[1]; + return fallbackDescription + ? fallbackDescription + .replace(MARKDOWN_LINK_REGEX, "$1") + .replace(MARKDOWN_NOISE_REGEX, "") + .replace(WHITESPACE_REGEX, " ") + .trim() + : "Documentation page"; +} + /** * Generates the llms.txt file content */ From f1352c72dc241e2fccf3cdb5e04d9156588a2d2e Mon Sep 17 00:00:00 2001 From: Teal Larson Date: Fri, 2 Oct 2026 10:23:01 -0400 Subject: [PATCH 20/42] =?UTF-8?q?Revert=20"=F0=9F=A4=96=20Regenerate=20LLM?= =?UTF-8?q?s.txt"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 1903d2de19bd817341ca5e82b68592e296dd39a9. --- public/llms.txt | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/public/llms.txt b/public/llms.txt index 20b051e22..244f4f4fb 100644 --- a/public/llms.txt +++ b/public/llms.txt @@ -1,4 +1,4 @@ - + # Arcade @@ -81,6 +81,7 @@ Arcade docs serve two audiences. Start with the path that matches your goal: - [Arcade Cloud infrastructure](https://docs.arcade.dev/en/operate/deploy/arcade-cloud): Documentation page - [Arcade Gateway Assistant](https://docs.arcade.dev/en/operate/governance/mcp-gateways/create-via-ai): Documentation page - [Arcade Glossary](https://docs.arcade.dev/en/resources/glossary): The Arcade Glossary provides definitions and explanations of key terms and concepts related to the Arcade platform, including agents, harnesses, MCP servers, and tools. This resource helps users understand the components and functionalities necessary for building, deploying, and managing applications that +- [Arcade tools without the plugin](https://docs.arcade.dev/en/get-started/agent-plugin/tools-only): Documentation page - [Arcade with Agent Frameworks and MCP Clients](https://docs.arcade.dev/en/get-started/agent-frameworks): This documentation page provides developers with guidance on integrating Arcade with agent frameworks and MCP clients to enhance AI applications with tool-calling capabilities. It offers detailed instructions on authentication, tool loading, and execution, along with code examples and configuration steps for popular frameworks and - [Arcade with Google ADK](https://docs.arcade.dev/en/get-started/agent-frameworks/google-adk/overview): The "Arcade with Google ADK" documentation page provides guidance on integrating Arcade tools with the Google ADK framework, enabling users to build AI agents that can interact with various services like Gmail, Slack, and GitHub. It offers setup instructions for - [Arcade with LangChain](https://docs.arcade.dev/en/get-started/agent-frameworks/langchain/overview): This documentation page provides guidance on integrating Arcade tools with LangChain agents, enabling users to build AI agents that can interact with various services like Gmail, GitHub, and Slack. It offers setup instructions for both Python and TypeScript, along with examples of @@ -115,7 +116,7 @@ Arcade docs serve two audiences. Start with the path that matches your goal: - [Connect an Atlassian Remote MCP Server](https://docs.arcade.dev/en/operate/governance/remote-mcp-servers/atlassian): Documentation page - [Connect Arcade to your LLM](https://docs.arcade.dev/en/get-started/agent-frameworks/setup-arcade-with-your-llm-python): This documentation page guides users on how to connect Arcade to a Large Language Model (LLM) using Python by creating a "harness" that facilitates interaction between the user, the model, and various tools. Users will learn to set up an agent - [Connect the AWS MCP Server](https://docs.arcade.dev/en/operate/governance/remote-mcp-servers/aws): Documentation page -- [Connect to MCP Clients](https://docs.arcade.dev/en/get-started/mcp-clients): Documentation page +- [Connect to MCP Clients](https://docs.arcade.dev/en/get-started/mcp-clients): This documentation page provides guidance on connecting Arcade MCP servers to various MCP-compatible clients and development environments, enabling users to enhance their agent workflows. - [Contact Us](https://docs.arcade.dev/en/resources/contact-us): This documentation page provides users with information on how to connect with the Arcade team for support through various channels. It aims to facilitate communication and assistance for users and their agents. - [Contextual Access](https://docs.arcade.dev/en/operate/governance/contextual-access): Documentation page - [Create an evaluation suite](https://docs.arcade.dev/en/build/create-tools/evaluate-tools/create-evaluation-suite): Documentation page @@ -131,7 +132,7 @@ Arcade docs serve two audiences. Start with the path that matches your goal: - [Evaluate Tools](https://docs.arcade.dev/en/build/create-tools/evaluate-tools): Documentation page - [Examples](https://docs.arcade.dev/en/resources/examples): This documentation page provides a collection of example applications that utilize Arcade's tools and MCP servers, showcasing various real-world scenarios and integration patterns. Users can explore complete source code and setup instructions for each example, enabling them to quickly understand and implement similar projects. - [Frequently Asked Questions](https://docs.arcade.dev/en/resources/faq): This documentation page provides answers to common questions about the Arcade platform, including how to create and contribute tools, the differences between various API keys, and authentication methods. Users can learn how to build custom tools, manage API keys for team collaboration, and understand -- [From personal use to team rollout](https://docs.arcade.dev/en/get-started/agent-plugin/team-rollout): Documentation page +- [From trial to team rollout](https://docs.arcade.dev/en/get-started/agent-plugin/team-rollout): Documentation page - [Get Formatted Tool Definitions](https://docs.arcade.dev/en/build/tool-calling/custom-apps/get-tool-definitions): Documentation page - [Getting Your API Key](https://docs.arcade.dev/en/get-started/setup/api-keys): This documentation page guides users on how to obtain and manage their Arcade API key, detailing the steps for generating keys through both the Arcade dashboard and CLI. It emphasizes the importance of securely storing API keys, as they serve as administrator credentials that grant access to - [Governance](https://docs.arcade.dev/en/operate/governance): Documentation page @@ -176,15 +177,14 @@ Arcade docs serve two audiences. Start with the path that matches your goal: - [Tool error handling](https://docs.arcade.dev/en/build/tool-calling/error-handling): Documentation page - [Tool executions](https://docs.arcade.dev/en/operate/governance/tool-executions): Documentation page - [Tools](https://docs.arcade.dev/en/resources/tools): This documentation page provides an overview of Arcade's ecosystem for AI tools, enabling users to explore a catalog of pre-built integrations, create custom tools, and contribute their own tools to the community. It outlines the benefits of using Arcade tools, such as built -- [Tools-only MCP server](https://docs.arcade.dev/en/get-started/agent-plugin/tools-only): Documentation page - [Types of Tools](https://docs.arcade.dev/en/build/create-tools/improve/types-of-tools): Documentation page - [Understanding `Context` and tools](https://docs.arcade.dev/en/build/create-tools/tool-basics/runtime-data-access): Documentation page -- [Use Arcade in Claude Code](https://docs.arcade.dev/en/get-started/mcp-clients/claude-code): Documentation page -- [Use Arcade in Claude Desktop](https://docs.arcade.dev/en/get-started/mcp-clients/claude-desktop): Documentation page -- [Use Arcade in Cursor](https://docs.arcade.dev/en/get-started/mcp-clients/cursor): Documentation page +- [Use Arcade in Claude Code](https://docs.arcade.dev/en/get-started/mcp-clients/claude-code): This documentation page guides users on how to connect Claude Code to an Arcade MCP Gateway using the Arcade Headers authentication mode. It outlines the prerequisites for setup, including creating an Arcade account, obtaining an API key, and creating an Arcade MCP Gateway, and provides step-by-step instructions for adding the gateway as a remote HTTP MCP server in Claude Code. +- [Use Arcade in Claude Desktop](https://docs.arcade.dev/en/get-started/mcp-clients/claude-desktop): This documentation page guides users on how to connect Claude Desktop to an Arcade MCP Gateway, detailing the necessary prerequisites and step-by-step instructions for setting up a custom connector. It emphasizes the importance of configuring the correct authentication settings and provides visual aids to facilitate the +- [Use Arcade in Cursor](https://docs.arcade.dev/en/get-started/mcp-clients/cursor): This documentation page provides a step-by-step guide for connecting Cursor to an Arcade MCP Gateway, enabling users to utilize Arcade tools effectively. It outlines the prerequisites for setup, including creating an Arcade account and obtaining an API key, and offers instructions for configuring Cursor - [Use Arcade in GitHub Copilot](https://docs.arcade.dev/en/get-started/mcp-clients/github-copilot): Documentation page - [Use Arcade in Microsoft Copilot Studio](https://docs.arcade.dev/en/get-started/mcp-clients/copilot-studio): This documentation page provides a step-by-step guide for connecting Microsoft Copilot Studio to an Arcade MCP Gateway, enabling users to integrate and utilize Arcade tools within their agents. It outlines the prerequisites, configuration steps, and authorization process necessary for establishing the connection, -- [Use Arcade in Visual Studio Code](https://docs.arcade.dev/en/get-started/mcp-clients/visual-studio-code): Documentation page +- [Use Arcade in Visual Studio Code](https://docs.arcade.dev/en/get-started/mcp-clients/visual-studio-code): This documentation page provides a step-by-step guide for connecting Visual Studio Code to an Arcade MCP Gateway, enabling users to set up and run their MCP server within the IDE. It outlines prerequisites, setup instructions, and authentication processes to ensure a successful integration. - [Use Arcade tools with AG2](https://docs.arcade.dev/en/get-started/agent-frameworks/ag2/use-arcade-tools): Documentation page - [Use Arcade tools with CrewAI](https://docs.arcade.dev/en/get-started/agent-frameworks/crewai/use-arcade-tools): This documentation page provides a comprehensive guide for integrating Arcade tools into CrewAI applications, enabling users to build task-oriented multi-agent systems that assist with platforms like Gmail and Slack. It outlines the prerequisites, learning outcomes, and step-by-step instructions for setting up - [User Sources](https://docs.arcade.dev/en/operate/identity/user-sources): Documentation page From 237252470e978e71ac7425eeefd37ed6b6473b35 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 2 Oct 2026 14:23:57 +0000 Subject: [PATCH 21/42] =?UTF-8?q?=F0=9F=A4=96=20Regenerate=20LLMs.txt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/llms.txt | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/public/llms.txt b/public/llms.txt index 244f4f4fb..697a34094 100644 --- a/public/llms.txt +++ b/public/llms.txt @@ -1,4 +1,4 @@ - + # Arcade @@ -81,7 +81,6 @@ Arcade docs serve two audiences. Start with the path that matches your goal: - [Arcade Cloud infrastructure](https://docs.arcade.dev/en/operate/deploy/arcade-cloud): Documentation page - [Arcade Gateway Assistant](https://docs.arcade.dev/en/operate/governance/mcp-gateways/create-via-ai): Documentation page - [Arcade Glossary](https://docs.arcade.dev/en/resources/glossary): The Arcade Glossary provides definitions and explanations of key terms and concepts related to the Arcade platform, including agents, harnesses, MCP servers, and tools. This resource helps users understand the components and functionalities necessary for building, deploying, and managing applications that -- [Arcade tools without the plugin](https://docs.arcade.dev/en/get-started/agent-plugin/tools-only): Documentation page - [Arcade with Agent Frameworks and MCP Clients](https://docs.arcade.dev/en/get-started/agent-frameworks): This documentation page provides developers with guidance on integrating Arcade with agent frameworks and MCP clients to enhance AI applications with tool-calling capabilities. It offers detailed instructions on authentication, tool loading, and execution, along with code examples and configuration steps for popular frameworks and - [Arcade with Google ADK](https://docs.arcade.dev/en/get-started/agent-frameworks/google-adk/overview): The "Arcade with Google ADK" documentation page provides guidance on integrating Arcade tools with the Google ADK framework, enabling users to build AI agents that can interact with various services like Gmail, Slack, and GitHub. It offers setup instructions for - [Arcade with LangChain](https://docs.arcade.dev/en/get-started/agent-frameworks/langchain/overview): This documentation page provides guidance on integrating Arcade tools with LangChain agents, enabling users to build AI agents that can interact with various services like Gmail, GitHub, and Slack. It offers setup instructions for both Python and TypeScript, along with examples of @@ -116,7 +115,7 @@ Arcade docs serve two audiences. Start with the path that matches your goal: - [Connect an Atlassian Remote MCP Server](https://docs.arcade.dev/en/operate/governance/remote-mcp-servers/atlassian): Documentation page - [Connect Arcade to your LLM](https://docs.arcade.dev/en/get-started/agent-frameworks/setup-arcade-with-your-llm-python): This documentation page guides users on how to connect Arcade to a Large Language Model (LLM) using Python by creating a "harness" that facilitates interaction between the user, the model, and various tools. Users will learn to set up an agent - [Connect the AWS MCP Server](https://docs.arcade.dev/en/operate/governance/remote-mcp-servers/aws): Documentation page -- [Connect to MCP Clients](https://docs.arcade.dev/en/get-started/mcp-clients): This documentation page provides guidance on connecting Arcade MCP servers to various MCP-compatible clients and development environments, enabling users to enhance their agent workflows. +- [Connect to MCP Clients](https://docs.arcade.dev/en/get-started/mcp-clients): Learn how to connect Cursor, Claude Desktop, Claude Code, VS Code, GitHub Copilot, and Copilot Studio to Arcade MCP Gateways over Streamable HTTP. - [Contact Us](https://docs.arcade.dev/en/resources/contact-us): This documentation page provides users with information on how to connect with the Arcade team for support through various channels. It aims to facilitate communication and assistance for users and their agents. - [Contextual Access](https://docs.arcade.dev/en/operate/governance/contextual-access): Documentation page - [Create an evaluation suite](https://docs.arcade.dev/en/build/create-tools/evaluate-tools/create-evaluation-suite): Documentation page @@ -132,7 +131,7 @@ Arcade docs serve two audiences. Start with the path that matches your goal: - [Evaluate Tools](https://docs.arcade.dev/en/build/create-tools/evaluate-tools): Documentation page - [Examples](https://docs.arcade.dev/en/resources/examples): This documentation page provides a collection of example applications that utilize Arcade's tools and MCP servers, showcasing various real-world scenarios and integration patterns. Users can explore complete source code and setup instructions for each example, enabling them to quickly understand and implement similar projects. - [Frequently Asked Questions](https://docs.arcade.dev/en/resources/faq): This documentation page provides answers to common questions about the Arcade platform, including how to create and contribute tools, the differences between various API keys, and authentication methods. Users can learn how to build custom tools, manage API keys for team collaboration, and understand -- [From trial to team rollout](https://docs.arcade.dev/en/get-started/agent-plugin/team-rollout): Documentation page +- [From personal use to team rollout](https://docs.arcade.dev/en/get-started/agent-plugin/team-rollout): What changes when an Arcade workflow you proved with the agent plugin becomes something a team depends on: your own MCP Gateway, a curated tool list, and your own identity provider. - [Get Formatted Tool Definitions](https://docs.arcade.dev/en/build/tool-calling/custom-apps/get-tool-definitions): Documentation page - [Getting Your API Key](https://docs.arcade.dev/en/get-started/setup/api-keys): This documentation page guides users on how to obtain and manage their Arcade API key, detailing the steps for generating keys through both the Arcade dashboard and CLI. It emphasizes the importance of securely storing API keys, as they serve as administrator credentials that grant access to - [Governance](https://docs.arcade.dev/en/operate/governance): Documentation page @@ -143,9 +142,9 @@ Arcade docs serve two audiences. Start with the path that matches your goal: - [Hybrid MCP servers](https://docs.arcade.dev/en/operate/deploy/on-prem): Documentation page - [Identity](https://docs.arcade.dev/en/operate/identity): Documentation page - [In Custom Applications](https://docs.arcade.dev/en/build/tool-calling/custom-apps): Documentation page -- [Install Arcade in any MCP client](https://docs.arcade.dev/en/get-started/agent-plugin/tools-only/any-mcp-client): Documentation page -- [Install Arcade in Claude Desktop](https://docs.arcade.dev/en/get-started/agent-plugin/tools-only/claude-desktop): Documentation page -- [Install the Arcade agent plugin](https://docs.arcade.dev/en/get-started/agent-plugin): Documentation page +- [Install Arcade in any MCP client](https://docs.arcade.dev/en/get-started/agent-plugin/tools-only/any-mcp-client): Point any Streamable HTTP MCP client at the Arcade gateway to get tools for every app you connect, with no API key and no plugin install. +- [Install Arcade in Claude Desktop](https://docs.arcade.dev/en/get-started/agent-plugin/tools-only/claude-desktop): Add the Arcade plugin from a Claude Desktop marketplace for tools and skills, or connect the gateway as a custom connector for tools only. +- [Install the Arcade agent plugin](https://docs.arcade.dev/en/get-started/agent-plugin): Install Arcade in Cursor, Claude Code, VS Code, GitHub Copilot CLI, Codex, or Claude Desktop. Your agent gets tools for every app you connect, with browser sign-in and no API keys. - [Mastra](https://docs.arcade.dev/en/get-started/agent-frameworks/mastra): This documentation page guides users in building a TypeScript AI agent using the Mastra framework, enabling interaction with Gmail and Slack through Arcade tools. Users will learn to create an agent capable of reading emails, sending messages, and summarizing emails for Slack, - [MCP Gateways](https://docs.arcade.dev/en/operate/governance/mcp-gateways): Documentation page - [Microsoft Entra ID](https://docs.arcade.dev/en/operate/identity/user-sources/microsoft-entra-id): Documentation page @@ -177,14 +176,15 @@ Arcade docs serve two audiences. Start with the path that matches your goal: - [Tool error handling](https://docs.arcade.dev/en/build/tool-calling/error-handling): Documentation page - [Tool executions](https://docs.arcade.dev/en/operate/governance/tool-executions): Documentation page - [Tools](https://docs.arcade.dev/en/resources/tools): This documentation page provides an overview of Arcade's ecosystem for AI tools, enabling users to explore a catalog of pre-built integrations, create custom tools, and contribute their own tools to the community. It outlines the benefits of using Arcade tools, such as built +- [Tools-only MCP server](https://docs.arcade.dev/en/get-started/agent-plugin/tools-only): Connect any MCP client to the Arcade gateway to get tools for every app you connect, without the agent plugin's skills, commands, or subagent. - [Types of Tools](https://docs.arcade.dev/en/build/create-tools/improve/types-of-tools): Documentation page - [Understanding `Context` and tools](https://docs.arcade.dev/en/build/create-tools/tool-basics/runtime-data-access): Documentation page -- [Use Arcade in Claude Code](https://docs.arcade.dev/en/get-started/mcp-clients/claude-code): This documentation page guides users on how to connect Claude Code to an Arcade MCP Gateway using the Arcade Headers authentication mode. It outlines the prerequisites for setup, including creating an Arcade account, obtaining an API key, and creating an Arcade MCP Gateway, and provides step-by-step instructions for adding the gateway as a remote HTTP MCP server in Claude Code. -- [Use Arcade in Claude Desktop](https://docs.arcade.dev/en/get-started/mcp-clients/claude-desktop): This documentation page guides users on how to connect Claude Desktop to an Arcade MCP Gateway, detailing the necessary prerequisites and step-by-step instructions for setting up a custom connector. It emphasizes the importance of configuring the correct authentication settings and provides visual aids to facilitate the -- [Use Arcade in Cursor](https://docs.arcade.dev/en/get-started/mcp-clients/cursor): This documentation page provides a step-by-step guide for connecting Cursor to an Arcade MCP Gateway, enabling users to utilize Arcade tools effectively. It outlines the prerequisites for setup, including creating an Arcade account and obtaining an API key, and offers instructions for configuring Cursor -- [Use Arcade in GitHub Copilot](https://docs.arcade.dev/en/get-started/mcp-clients/github-copilot): Documentation page +- [Use Arcade in Claude Code](https://docs.arcade.dev/en/get-started/mcp-clients/claude-code): Connect Claude Code to an Arcade MCP Gateway. +- [Use Arcade in Claude Desktop](https://docs.arcade.dev/en/get-started/mcp-clients/claude-desktop): Connect Claude Desktop to an Arcade MCP Gateway. +- [Use Arcade in Cursor](https://docs.arcade.dev/en/get-started/mcp-clients/cursor): Connect Cursor to an Arcade MCP Gateway over Streamable HTTP and pick which tools Cursor can use. +- [Use Arcade in GitHub Copilot](https://docs.arcade.dev/en/get-started/mcp-clients/github-copilot): Connect GitHub Copilot to an Arcade MCP Gateway. - [Use Arcade in Microsoft Copilot Studio](https://docs.arcade.dev/en/get-started/mcp-clients/copilot-studio): This documentation page provides a step-by-step guide for connecting Microsoft Copilot Studio to an Arcade MCP Gateway, enabling users to integrate and utilize Arcade tools within their agents. It outlines the prerequisites, configuration steps, and authorization process necessary for establishing the connection, -- [Use Arcade in Visual Studio Code](https://docs.arcade.dev/en/get-started/mcp-clients/visual-studio-code): This documentation page provides a step-by-step guide for connecting Visual Studio Code to an Arcade MCP Gateway, enabling users to set up and run their MCP server within the IDE. It outlines prerequisites, setup instructions, and authentication processes to ensure a successful integration. +- [Use Arcade in Visual Studio Code](https://docs.arcade.dev/en/get-started/mcp-clients/visual-studio-code): In this guide, you'll learn how to connect Visual Studio Code to an Arcade MCP Gateway. - [Use Arcade tools with AG2](https://docs.arcade.dev/en/get-started/agent-frameworks/ag2/use-arcade-tools): Documentation page - [Use Arcade tools with CrewAI](https://docs.arcade.dev/en/get-started/agent-frameworks/crewai/use-arcade-tools): This documentation page provides a comprehensive guide for integrating Arcade tools into CrewAI applications, enabling users to build task-oriented multi-agent systems that assist with platforms like Gmail and Slack. It outlines the prerequisites, learning outcomes, and step-by-step instructions for setting up - [User Sources](https://docs.arcade.dev/en/operate/identity/user-sources): Documentation page From 3890ffbb44c099be90437472064f9c3e05bb1a87 Mon Sep 17 00:00:00 2001 From: Teal Larson Date: Fri, 2 Oct 2026 10:27:15 -0400 Subject: [PATCH 22/42] chore: verify generated documentation From fd73c195b5e0f0214a24892b28f51656232f9b72 Mon Sep 17 00:00:00 2001 From: Teal Larson Date: Fri, 2 Oct 2026 10:45:50 -0400 Subject: [PATCH 23/42] chore: keep llms generator fixes out of docs PR --- .github/workflows/llmstxt.yml | 2 - scripts/generate-llmstxt.ts | 107 ++++++++++++---------------------- 2 files changed, 38 insertions(+), 71 deletions(-) diff --git a/.github/workflows/llmstxt.yml b/.github/workflows/llmstxt.yml index 4d88930be..7564d7424 100644 --- a/.github/workflows/llmstxt.yml +++ b/.github/workflows/llmstxt.yml @@ -37,8 +37,6 @@ jobs: uses: actions/checkout@v4 with: ref: ${{ github.event.pull_request.head.ref || github.ref }} - # The generator diffs against the SHA stored in public/llms.txt. - fetch-depth: 0 - name: Install dependencies run: npm install -g pnpm diff --git a/scripts/generate-llmstxt.ts b/scripts/generate-llmstxt.ts index 7b4228468..65301a68b 100644 --- a/scripts/generate-llmstxt.ts +++ b/scripts/generate-llmstxt.ts @@ -1,4 +1,4 @@ -import { execFileSync, execSync } from "node:child_process"; +import { execSync } from "node:child_process"; import fs from "node:fs/promises"; import path from "node:path"; import chalk from "chalk"; @@ -43,10 +43,6 @@ const DYNAMIC_SEGMENT_REGEX = /\[[^/]+\]/; const TITLE_H1_REGEX = /^#\s+(.+)$/m; const FRONTMATTER_REGEX = /^---\n([\s\S]*?)\n---/; const FRONTMATTER_TITLE_REGEX = /^title:\s*(.+)$/m; -const FRONTMATTER_DESCRIPTION_REGEX = /^description:\s*(.+)$/m; -const GUIDE_OUTCOMES_REGEX = - /\s*([\s\S]*?)\s*<\/GuideOverview\.Outcomes>/; -const FIRST_PROSE_AFTER_H1_REGEX = /^#\s+.+\n+([^#<\n][^\n]*)/m; const EN_LOCALE_PREFIX_REGEX = /^en\//; const METADATA_REGEX = /^/; @@ -98,44 +94,46 @@ async function parseLlmsTxtMetadata(): Promise { /** * Gets changed files since the last git SHA */ -function listChangedFilesSince(ref: string): Set { - const output = execFileSync( - "git", - ["diff", "--name-only", "--diff-filter=AMD", ref, "HEAD"], - { encoding: "utf-8" } - ); - return new Set( - output +function getChangedFilesSince(lastSha: string): Set { + try { + // Get files that were added, modified, or deleted + const added = execSync( + `git diff --name-only --diff-filter=A ${lastSha} HEAD`, + { + encoding: "utf-8", + } + ) .trim() .split("\n") - .filter((line) => line.length > 0) - ); -} + .filter((line) => line.length > 0); -function getChangedFilesSince(lastSha: string): Set | null { - try { - return listChangedFilesSince(lastSha); - } catch (_error) { - const baseRef = process.env.GITHUB_BASE_REF; - if (baseRef) { - const remoteBaseRef = `origin/${baseRef}`; - try { - console.warn( - chalk.yellow( - `⚠ Could not get changed files since ${lastSha}; comparing with ${remoteBaseRef}` - ) - ); - return listChangedFilesSince(remoteBaseRef); - } catch (_fallbackError) { - // Fall through and summarize everything when neither reference exists. + const modified = execSync( + `git diff --name-only --diff-filter=M ${lastSha} HEAD`, + { encoding: "utf-8" } + ) + .trim() + .split("\n") + .filter((line) => line.length > 0); + + const deleted = execSync( + `git diff --name-only --diff-filter=D ${lastSha} HEAD`, + { + encoding: "utf-8", } - } + ) + .trim() + .split("\n") + .filter((line) => line.length > 0); + + const allChanged = new Set([...added, ...modified, ...deleted]); + return allChanged; + } catch (_error) { console.warn( chalk.yellow( - `⚠ Could not determine changes since ${lastSha}; processing all files` + `⚠ Could not get changed files since ${lastSha}, processing all files` ) ); - return null; + return new Set(); } } @@ -380,19 +378,14 @@ async function summarizePage( }); const description = - response.choices[0]?.message?.content?.trim() || - extractPageDescription(page.content); + response.choices[0]?.message?.content?.trim() || "Documentation page"; return { title, description }; - } catch { - console.warn( - chalk.yellow( - `⚠ Could not summarize ${page.path} with OpenAI; using its frontmatter description` - ) - ); + } catch (error) { + console.error(chalk.red(`✗ Error summarizing ${page.path}:`), error); return { title: extractPageTitle(page.content, page.path), - description: extractPageDescription(page.content), + description: "Documentation page", }; } } @@ -509,28 +502,6 @@ function extractPageTitle(content: string, filePath: string): string { return frontmatterTitle ?? deriveTitleFromPath(filePath); } -function extractPageDescription(content: string): string { - const frontmatterDescription = content - .match(FRONTMATTER_REGEX)?.[1] - ?.match(FRONTMATTER_DESCRIPTION_REGEX)?.[1] - ?.trim() - ?.replace(/^['"](.*)['"]$/, "$1"); - if (frontmatterDescription) { - return frontmatterDescription; - } - - const fallbackDescription = - content.match(GUIDE_OUTCOMES_REGEX)?.[1] ?? - content.match(FIRST_PROSE_AFTER_H1_REGEX)?.[1]; - return fallbackDescription - ? fallbackDescription - .replace(MARKDOWN_LINK_REGEX, "$1") - .replace(MARKDOWN_NOISE_REGEX, "") - .replace(WHITESPACE_REGEX, " ") - .trim() - : "Documentation page"; -} - /** * Generates the llms.txt file content */ @@ -626,9 +597,7 @@ function determinePagesToSummarize( if (previousMetadata && previousMetadata.gitSha !== "unknown") { // Get changed files since last generation - const changedFiles = - getChangedFilesSince(previousMetadata.gitSha) ?? - new Set(pages.map((page) => page.path)); + const changedFiles = getChangedFilesSince(previousMetadata.gitSha); console.log( chalk.blue( `\n📊 Found ${changedFiles.size} changed files since last generation` From 4fee3995deb7c81f7947db536863b038ae4ebb6b Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Mon, 12 Oct 2026 19:00:20 +0000 Subject: [PATCH 24/42] docs(agent-plugin): match released install and auth behavior Describe marketplace installs, Codex skill invocation, conditional organization identity, released fallback, and the telemetry-off build. Limit the shared gateway claim to the signed-in app connections. --- app/en/get-started/agent-plugin/page.mdx | 34 +++++++++++++------ .../agent-plugin/team-rollout/page.mdx | 13 ++++--- .../tools-only/any-mcp-client/page.mdx | 2 +- .../tools-only/claude-desktop/page.mdx | 12 ++++--- .../agent-plugin/tools-only/page.mdx | 4 +-- public/llms.txt | 2 +- 6 files changed, 40 insertions(+), 27 deletions(-) diff --git a/app/en/get-started/agent-plugin/page.mdx b/app/en/get-started/agent-plugin/page.mdx index 36eb70132..857a5ada8 100644 --- a/app/en/get-started/agent-plugin/page.mdx +++ b/app/en/get-started/agent-plugin/page.mdx @@ -27,11 +27,11 @@ Install the Arcade agent plugin in your agent and run your first task against a - The plugin is built for personal use. When you are ready to put a workflow in - front of a team, read [from personal use to team - rollout](/get-started/agent-plugin/team-rollout). You will want your own [MCP - Gateway](/operate/governance/mcp-gateways) with a curated tool list and your - own identity provider. + The plugin is built for personal use. For team use, consider a dedicated [MCP + Gateway](/operate/governance/mcp-gateways) with a curated tool list. Add a + [User Source](/operate/identity/user-sources) when end users should sign in + through your organization's identity provider. See [from personal use to team + rollout](/get-started/agent-plugin/team-rollout). ## Install @@ -68,6 +68,8 @@ codex plugin add arcade@arcade Start a new Codex session or ChatGPT desktop chat. Open `/plugins`, confirm **arcade** is installed and enabled, then confirm the **arcade** MCP server is connected. +To invoke Arcade explicitly, choose `@Arcade` or use `$arcade:try-arcade`. For team-rollout guidance, use `$arcade:scale-arcade`. Codex does not expose these skills as slash commands. + @@ -120,13 +122,17 @@ After installation, reload your agent or start a new session. Using another clie Authentication happens in two layers: 1. **Into the gateway.** Your client will ask you to authenticate when it first connects. You sign in to Arcade in the browser, and the client can reach the gateway from then on. -2. **Into each app.** When a task needs Gmail, Slack, Linear, or anything else, your agent hands you a link that grants the scopes that task requires. Approve it once and Arcade holds the token for that app. You won't need to authenticate that service again unless a later task requires greater scopes. +2. **Into each app.** When a task needs an app, your agent gives you a browser sign-in link for the required permissions. After approval, Arcade stores the authorization. You may need to reconnect if the connection expires or a later task needs additional permissions. + +You never give your agent an API key or a password for either layer. To check or manage connections, ask your agent to "Check my Arcade connection," "Show my connected apps," or "Connect Google." You can connect an app before you need it. Clients that support Arcade commands also provide the shortcuts listed below. + +Arcade uses the app connections authorized for your signed-in identity. Authorize only the accounts you intend the agent to use. -You never give your agent an API key or a password for either layer. Ask your agent to run `/arcade-status` to list the applications you enabled, or `/arcade-connect google` to authorize an app with the widest possible scope before you need it. +### Privacy -All of your tool calls, tokens, and secrets route through your own Arcade project, isolated from every other user of that gateway. No one else's agent can ever reach your apps, tools, or tokens. +The current plugin build sends no client-side usage telemetry. The build turns telemetry off, and no environment setting turns it on. Requests you make through Arcade still go to its hosted gateway and the apps you authorize. See [Arcade's privacy policy](https://www.arcade.dev/privacy-policy). -Every Arcade gateway works this way, not just the one in the plugin. [Server-level and tool-level authorization](/learn/server-level-vs-tool-level-auth) goes deeper on the split. +Gateway sign-in and app authorization stay separate on every Arcade gateway, including the one in the plugin. [Server-level and tool-level authorization](/learn/server-level-vs-tool-level-auth) goes deeper on the split. ## What you get in each agent @@ -141,7 +147,7 @@ Every install connects to the same Arcade gateway and gets the same tools. What | GitHub Copilot CLI | ✅ | 2 | ✅ | — | — | ✅⁵ | | VS Code | ✅ | 2 | ✅ | — | — | —⁶ | | Codex and ChatGPT local runtime | ✅ | 2 | — | — | — | —⁷ | -| Claude Desktop | ✅ | 2 | — | — | — | — | +| Claude Desktop Chat | ✅ | 2 | — | — | — | — | | OpenCode | ✅ | — | — | — | — | — | | Any other Streamable HTTP MCP client | ✅ | — | — | — | — | — | @@ -173,7 +179,7 @@ Lists the apps you have connected and lets you disconnect one. ### Skills -Skills are instructions your agent reads on its own, so you never have to invoke them. `try-arcade` teaches it to turn a request like "reply to that thread" into the right sequence of tool calls across your apps. `scale-arcade` handles the other kind of question, the one about moving a workflow onto a team gateway, and it walks you through the decisions on [this page](/get-started/agent-plugin/team-rollout) against your own project. +Skills are instructions your agent reads on its own, so you do not have to invoke them in most clients. `try-arcade` teaches it to turn a request like "reply to that thread" into the right sequence of tool calls across your apps. `scale-arcade` handles the other kind of question, the one about moving a workflow onto a team gateway, and it walks you through the decisions on [this page](/get-started/agent-plugin/team-rollout) against your own project. Codex does not expose these skills as slash commands. Choose `@Arcade` or `$arcade:try-arcade`, and use `$arcade:scale-arcade` for team-rollout guidance. ### Subagent @@ -185,6 +191,12 @@ The rule and hooks tell your agent that Arcade exists and when reaching for it i The columns thin out because the [Agent Plugins](https://agent-plugins.org) 1.0 specification only makes skills and MCP servers portable. Commands, subagents, hooks, and editor rules are specific to each agent, so the plugin ships them where the agents that support them will find them. +### How Arcade chooses a connection + +Arcade prefers the plugin's gateway. If it cannot complete a task for a reason other than sign-in or permission denial, your agent may use another already-authorized connection within the task you approved. It checks the intended app account before using another Arcade gateway. Sign-in and permission failures require your attention. The agent does not switch connections to get around them. The plugin instructs your agent to confirm the action and destination before changing something in an app. + +`arcade-operator` falls back only to another authorized Arcade gateway. Fallback to any other tool belongs to the parent agent. + ## Try it This gateway includes every [optimized toolkit](/resources/integrations) in the catalog. Try asking your agent: diff --git a/app/en/get-started/agent-plugin/team-rollout/page.mdx b/app/en/get-started/agent-plugin/team-rollout/page.mdx index 46788f4ba..b0006230c 100644 --- a/app/en/get-started/agent-plugin/team-rollout/page.mdx +++ b/app/en/get-started/agent-plugin/team-rollout/page.mdx @@ -1,13 +1,13 @@ --- title: "From personal use to team rollout" -description: "What changes when an Arcade workflow you proved with the agent plugin becomes something a team depends on: your own MCP Gateway, a curated tool list, and your own identity provider." +description: "What changes when an Arcade workflow you proved with the agent plugin becomes something a team depends on: a dedicated MCP Gateway, a curated tool list, and how end users sign in." --- import { Callout } from "nextra/components"; # From personal use to team rollout -The [agent plugin](/get-started/agent-plugin) serves one person working on their own. Every install points at the same global gateway URL, and that is where the sharing ends. Your tool calls, tokens, and secrets route through your own Arcade project, isolated from every other user of that gateway. No one else's agent can reach your Gmail, and yours cannot reach theirs. +The [agent plugin](/get-started/agent-plugin) serves one person working on their own. Every install points at the same global gateway URL. Arcade uses the app connections authorized for your signed-in identity. Authorize only the accounts you intend the agent to use. What the plugin gives you is a broad tool selection and an identity that is yours alone, which is what you want for your own work. @@ -20,14 +20,13 @@ Once a team depends on that workflow, three questions you never had to answer st Each one has a section below, in that order. - If your agent loaded the plugin's skills, ask it to run `/scale-arcade`. The - skill walks through the same decisions interactively against your own - workspace. + If your client loads the plugin's skills, ask Arcade to help move your + workflow onto a team gateway. In Codex, use `$arcade:scale-arcade`. ## Where does your team connect? -An [MCP Gateway](/operate/governance/mcp-gateways) is the endpoint your team's clients connect to, and it is where you decide what those clients can do. Create one per project in the [Arcade dashboard](https://app.arcade.dev) so each project gets a URL you control, its own tool list, and its own audit trail. +An [MCP Gateway](/operate/governance/mcp-gateways) is the endpoint your team's clients connect to, and it is where you decide what those clients can do. Create a gateway in the relevant Arcade project for the workflow and tool boundary you need from the [Arcade dashboard](https://app.arcade.dev). Clients connect to it exactly the way they connected to the plugin's gateway. See the [MCP client guides](/get-started/mcp-clients) for Cursor, Claude Code, Claude Desktop, VS Code, and Copilot. @@ -43,7 +42,7 @@ Beyond the allowlist, [contextual access](/operate/governance/contextual-access) When you are the only user, signing in to each app yourself is enough. In production, each of your end users needs their own authorization, so an agent acting for one person can never reach another person's data. -Configure a [User Source](/operate/identity/user-sources) on your gateway and Arcade redirects each end user to your existing identity provider, whether that is Entra ID, Okta, Auth0, Clerk, or another OIDC provider, then identifies them by an OIDC subject claim. +Choose how your end users sign in. Internal teams whose users are Arcade project members can use [Arcade Auth](/operate/identity/user-sources#when-to-use-a-user-source). If users already have identities in your organization's OIDC provider, configure a [User Source](/operate/identity/user-sources) on the gateway. ## Building your own product? diff --git a/app/en/get-started/agent-plugin/tools-only/any-mcp-client/page.mdx b/app/en/get-started/agent-plugin/tools-only/any-mcp-client/page.mdx index bfedfbae1..4e3ad3847 100644 --- a/app/en/get-started/agent-plugin/tools-only/any-mcp-client/page.mdx +++ b/app/en/get-started/agent-plugin/tools-only/any-mcp-client/page.mdx @@ -25,7 +25,7 @@ Both of those clients also load the full plugin, so use these only if you want t ## Sign in -Your client signs you in to Arcade when it first connects, and each app gets authorized the first time a task needs it. See [signing in](/get-started/agent-plugin/tools-only#sign-in) for how the two layers fit together. +Your client signs you in to Arcade when it first connects. When a task needs an app, your agent gives you a browser sign-in link for the required permissions. You may need to reconnect if the connection expires or a later task needs additional permissions. See [signing in](/get-started/agent-plugin/tools-only#sign-in) for how the two layers fit together. ## Try it diff --git a/app/en/get-started/agent-plugin/tools-only/claude-desktop/page.mdx b/app/en/get-started/agent-plugin/tools-only/claude-desktop/page.mdx index 8c2aff092..654024b8d 100644 --- a/app/en/get-started/agent-plugin/tools-only/claude-desktop/page.mdx +++ b/app/en/get-started/agent-plugin/tools-only/claude-desktop/page.mdx @@ -8,7 +8,7 @@ import { SignupLink } from "@/app/_components/analytics"; # Install Arcade in Claude Desktop -Claude Desktop loads Arcade from a plugin marketplace, not the `npx` command the coding agents use. Chat gets tools and both skills. Cowork and Code in the desktop app also get the operator, commands, and hooks when you enable the plugin there. +Add Arcade through Claude Desktop's plugin marketplace. Chat gets tools and both skills. Cowork and Code also load the operator, commands, and supported routing hooks when you enable the plugin there. @@ -27,8 +27,8 @@ Install Arcade in Claude Desktop and run a task against one of your apps. - Using Cowork or Claude Code inside the Claude desktop app? You can also - install with [one `npx` command](/get-started/agent-plugin) if you prefer. + Using Claude Code inside the desktop app? You can also install Arcade with + the Claude Code marketplace commands below. ## Install the plugin @@ -48,7 +48,9 @@ claude plugin marketplace add {{ARCADE_PLUGIN_REPO}} claude plugin install arcade@arcade ``` -There is no documented `claude://` link that adds a marketplace. The steps above are the install. +If Claude Code is already open, run `/reload-plugins`. + +No documented `claude://` link adds a marketplace. The steps on this page are the install. ## Tools only @@ -62,7 +64,7 @@ Save, then start a new conversation. You get the same tools this way. You lose t ## Sign in -Connecting Arcade signs you in and links Claude Desktop to the gateway. After that, the first time Claude reaches for an app, it returns a browser link asking you to authorize that app. Approve it and Arcade holds the token, so you only do this once per app. See [signing in](/get-started/agent-plugin/tools-only#sign-in) for how the two layers fit together. +Connecting Arcade signs you in and links Claude Desktop to the gateway. When a task needs an app, your agent gives you a browser sign-in link for the required permissions. After approval, Arcade stores the authorization. You may need to reconnect if the connection expires or a later task needs additional permissions. You can connect an app before you need it. See [signing in](/get-started/agent-plugin/tools-only#sign-in) for how the two layers fit together. ## Try it diff --git a/app/en/get-started/agent-plugin/tools-only/page.mdx b/app/en/get-started/agent-plugin/tools-only/page.mdx index 12ff4d039..f07b263a8 100644 --- a/app/en/get-started/agent-plugin/tools-only/page.mdx +++ b/app/en/get-started/agent-plugin/tools-only/page.mdx @@ -32,9 +32,9 @@ If your client supports [plugins](https://agent-plugins.org), you should [instal ## Sign in -No API keys. You authorize twice: your client signs you in to Arcade with your Arcade account when it first connects to the gateway, and then each app gets authorized on its own the first time a task needs it. Approve that once per app and Arcade holds the token. +No API keys. You authorize twice: your client signs you in to Arcade with your Arcade account when it first connects to the gateway. When a task needs an app, your agent gives you a browser sign-in link for the required permissions. After approval, Arcade stores the authorization. You may need to reconnect if the connection expires or a later task needs additional permissions. You can connect an app before you need it. -Your tool calls, tokens, and secrets route through your own Arcade project, isolated from every other user of the same gateway. [Server-level and tool-level authorization](/learn/server-level-vs-tool-level-auth) covers the split in depth. +Arcade uses the app connections authorized for your signed-in identity. Authorize only the accounts you intend the agent to use. [Server-level and tool-level authorization](/learn/server-level-vs-tool-level-auth) covers the split in depth. ## Next steps diff --git a/public/llms.txt b/public/llms.txt index d6ed7b2c2..a6547d560 100644 --- a/public/llms.txt +++ b/public/llms.txt @@ -132,7 +132,7 @@ Arcade docs serve two audiences. Start with the path that matches your goal: - [Evaluate Tools](https://docs.arcade.dev/en/build/create-tools/evaluate-tools): This page teaches you how to systematically test and validate your tools using Arcade's evaluation framework to ensure they perform reliably in production. It provides techniques for measuring tool performance and guiding iterative improvements after initial development. - [Examples](https://docs.arcade.dev/en/resources/examples): This documentation page provides a collection of example applications that utilize Arcade's tools and MCP servers, showcasing various real-world scenarios and integration patterns. Users can explore complete source code and setup instructions for each example, enabling them to quickly understand and implement similar projects. - [Frequently Asked Questions](https://docs.arcade.dev/en/resources/faq): This documentation page provides answers to common questions about the Arcade platform, including how to create and contribute tools, the differences between various API keys, and authentication methods. Users can learn how to build custom tools, manage API keys for team collaboration, and understand -- [From personal use to team rollout](https://docs.arcade.dev/en/get-started/agent-plugin/team-rollout): What changes when an Arcade workflow you proved with the agent plugin becomes something a team depends on: your own MCP Gateway, a curated tool list, and your own identity provider. +- [From personal use to team rollout](https://docs.arcade.dev/en/get-started/agent-plugin/team-rollout): What changes when an Arcade workflow you proved with the agent plugin becomes something a team depends on: a dedicated MCP Gateway, a curated tool list, and how end users sign in. - [Get Formatted Tool Definitions](https://docs.arcade.dev/en/build/tool-calling/custom-apps/get-tool-definitions): This documentation page teaches developers how to retrieve tool definitions in formats compatible with specific AI model providers using the Arcade Client, including methods to get single tools, multiple tools from a server, or all available tools. It also explains how to convert Arcade tool definitions into Zod schemas for TypeScript projects, enabling type safety and integration with popular AI frameworks like LangChain and Vercel AI SDK. - [Getting Your API Key](https://docs.arcade.dev/en/get-started/setup/api-keys): This documentation page guides users on how to obtain and manage their Arcade API key, detailing the steps for generating keys through both the Arcade dashboard and CLI. It emphasizes the importance of securely storing API keys, as they serve as administrator credentials that grant access to - [Governance](https://docs.arcade.dev/en/operate/governance): This documentation page explains how to govern agent tool usage through access control policies, runtime enforcement, and administrative oversight. It provides guidance on managing tool availability, monitoring tool executions, and reviewing audit logs to maintain security and compliance. From 52a035988607439b62393ee1da6999ae424ff143 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Thu, 15 Oct 2026 07:32:36 +0000 Subject: [PATCH 25/42] docs(agent-plugin): match v0.3.0 hook and Cursor install facts Document that routing hooks run node and the launching host must find it on PATH, without a guessed Node minimum or a tools-only requirement. Make Cursor local imports conditional on Allow Local Plugin Imports, and tell readers to return to the agent after browser sign-in. --- app/en/get-started/agent-plugin/page.mdx | 26 ++++++++++++++----- .../tools-only/any-mcp-client/page.mdx | 6 ++--- .../tools-only/claude-desktop/page.mdx | 5 ++-- .../agent-plugin/tools-only/page.mdx | 4 ++- 4 files changed, 28 insertions(+), 13 deletions(-) diff --git a/app/en/get-started/agent-plugin/page.mdx b/app/en/get-started/agent-plugin/page.mdx index 857a5ada8..c7365b425 100644 --- a/app/en/get-started/agent-plugin/page.mdx +++ b/app/en/get-started/agent-plugin/page.mdx @@ -21,6 +21,7 @@ Install the Arcade agent plugin in your agent and run your first task against a 1. A supported client: Cursor, Claude Code, VS Code, GitHub Copilot CLI, Codex, or Claude Desktop 2. An Arcade account +3. For Claude Code, Claude Cowork, Cursor CLI, and GitHub Copilot CLI: [Node.js](https://nodejs.org/) on the PATH of the host that launches their routing hooks. Those hooks run `node`. Cursor IDE, VS Code, Codex, Claude Desktop Chat, and tools-only MCP clients do not need Node.js. @@ -41,7 +42,8 @@ Each client installs plugins differently. Use the path for yours. The cross-client `npx plugins add` command does not finish every client install. Use the client-native steps below so the gateway and every supported - plugin component load together. + plugin component load together. The install commands below use the plugin + repository and are not pinned to a release. @@ -56,6 +58,8 @@ claude plugin install arcade@arcade Run `/reload-plugins` if Claude Code is already open. Verify the install with `claude plugin list` or `/plugin`. +Claude Code runs its routing hooks with `node`. The host that launches Claude Code must be able to find Node.js on its PATH. + @@ -73,15 +77,17 @@ To invoke Arcade explicitly, choose `@Arcade` or use `$arcade:try-arcade`. For t -For an individual Cursor plan, clone the plugin into Cursor's local plugin directory: +For an individual plan, clone the plugin into Cursor's local plugin directory: ```bash git clone https://github.com/{{ARCADE_PLUGIN_REPO}} ~/.cursor/plugins/local/arcade-plugin ``` -Run **Developer: Reload Window**, then open **Customize** and confirm the Arcade skills, `arcade-operator`, rule, and MCP server are present. +Keep the clone inside `~/.cursor/plugins/local/`. Cursor ignores a symlink whose target sits outside that directory. Run **Developer: Reload Window**, then open **Customize** and confirm the Arcade skills, `arcade-operator`, rule, and MCP server are present. To update later, run `git pull` in that folder and reload. + +On Teams and Enterprise, local plugins depend on **Allow Local Plugin Imports**. Enterprise turns this off by default. When it is off, Cursor ignores `~/.cursor/plugins/local`. Use a team marketplace instead. An admin opens **Dashboard → Plugins & MCPs → Team Marketplaces → Add Marketplace → Import from Repo** and pastes `https://github.com/{{ARCADE_PLUGIN_REPO}}`. Each person opens **Customize**, finds **Arcade**, and selects **Install**. When the setting is on, the local clone above works on these plans too. -On Teams and Enterprise plans, an admin must import `https://github.com/{{ARCADE_PLUGIN_REPO}}` under **Dashboard → Plugins & MCPs → Team Marketplaces**. Each person can then install Arcade from **Customize**. +Cursor CLI runs its session hook with `node`. The host that launches the CLI must be able to find Node.js on its PATH. Cursor IDE and Cloud Agents do not run that hook. @@ -92,7 +98,7 @@ Open the Command Palette, select **Chat: Install Plugin From Source**, and paste https://github.com/{{ARCADE_PLUGIN_REPO}} ``` -Turn on `chat.plugins.enabled` if needed, then reload VS Code. Run **MCP: List Servers**, select **arcade**, choose **Start Server**, and sign in when prompted. +Turn on `chat.plugins.enabled` if needed, then reload VS Code. Run **MCP: List Servers**, select **arcade**, choose **Start Server**, and sign in when prompted. After you finish in the browser, return to VS Code and continue the original task. VS Code does not run Arcade's routing hooks, so this install does not need Node.js. @@ -105,11 +111,15 @@ copilot plugin install {{ARCADE_PLUGIN_REPO}} Restart the session or run `/restart`. +Copilot CLI runs its session and subagent hooks with `node`. The host that launches Copilot CLI must be able to find Node.js on its PATH. + Open **Customize → Plugins → Add marketplace → Add from a repository**, paste `{{ARCADE_PLUGIN_REPO}}`, then install **Arcade** (`arcade@arcade`). +Cowork and Code run their supported routing hooks with `node`. The desktop app must be able to find Node.js on its PATH for those hooks. Chat does not run them. + See the [Claude Desktop guide](/get-started/agent-plugin/tools-only/claude-desktop) for the terminal commands and tools-only connector option. @@ -124,13 +134,15 @@ Authentication happens in two layers: 1. **Into the gateway.** Your client will ask you to authenticate when it first connects. You sign in to Arcade in the browser, and the client can reach the gateway from then on. 2. **Into each app.** When a task needs an app, your agent gives you a browser sign-in link for the required permissions. After approval, Arcade stores the authorization. You may need to reconnect if the connection expires or a later task needs additional permissions. +After you finish in the browser, return to your agent and continue the original task. Arcade does not resume it for you. + You never give your agent an API key or a password for either layer. To check or manage connections, ask your agent to "Check my Arcade connection," "Show my connected apps," or "Connect Google." You can connect an app before you need it. Clients that support Arcade commands also provide the shortcuts listed below. Arcade uses the app connections authorized for your signed-in identity. Authorize only the accounts you intend the agent to use. ### Privacy -The current plugin build sends no client-side usage telemetry. The build turns telemetry off, and no environment setting turns it on. Requests you make through Arcade still go to its hosted gateway and the apps you authorize. See [Arcade's privacy policy](https://www.arcade.dev/privacy-policy). +The released plugin turns client-side usage telemetry off in code. No environment setting turns collection on. Requests you make through Arcade still go to its hosted gateway and the apps you authorize. See [Arcade's privacy policy](https://www.arcade.dev/privacy-policy). Gateway sign-in and app authorization stay separate on every Arcade gateway, including the one in the plugin. [Server-level and tool-level authorization](/learn/server-level-vs-tool-level-auth) goes deeper on the split. @@ -187,7 +199,7 @@ The `arcade-operator` subagent runs an app task in its own context and reports b ### Rule and hooks -The rule and hooks tell your agent that Arcade exists and when reaching for it is the right move, which is the difference between a tool that sits unused and one your agent actually picks up. Cursor IDE and Cloud Agents use an always-apply rule. Cursor CLI, Claude Code, Cowork, and Copilot CLI run the hooks their hosts support. +The rule and hooks tell your agent that Arcade exists and when reaching for it is the right move, which is the difference between a tool that sits unused and one your agent actually picks up. Cursor IDE and Cloud Agents use an always-apply rule. Cursor CLI, Claude Code, Cowork, and Copilot CLI run the hooks their hosts support. Those hooks run `node`. The host that launches them must be able to find Node.js on its PATH. The columns thin out because the [Agent Plugins](https://agent-plugins.org) 1.0 specification only makes skills and MCP servers portable. Commands, subagents, hooks, and editor rules are specific to each agent, so the plugin ships them where the agents that support them will find them. diff --git a/app/en/get-started/agent-plugin/tools-only/any-mcp-client/page.mdx b/app/en/get-started/agent-plugin/tools-only/any-mcp-client/page.mdx index 4e3ad3847..d7b421208 100644 --- a/app/en/get-started/agent-plugin/tools-only/any-mcp-client/page.mdx +++ b/app/en/get-started/agent-plugin/tools-only/any-mcp-client/page.mdx @@ -7,7 +7,7 @@ import { MCPClientInstaller } from "./mcp-client-installer"; # Install Arcade in any MCP client -Any client that speaks the Streamable HTTP MCP transport can use Arcade tools, OpenCode included. Add this as an MCP server: +Any client that speaks the Streamable HTTP MCP transport can use Arcade tools, OpenCode included. This connection does not run plugin hooks and does not need Node.js. Add this as an MCP server: ```text {{ARCADE_PLUGIN_GATEWAY_URL}} @@ -25,11 +25,11 @@ Both of those clients also load the full plugin, so use these only if you want t ## Sign in -Your client signs you in to Arcade when it first connects. When a task needs an app, your agent gives you a browser sign-in link for the required permissions. You may need to reconnect if the connection expires or a later task needs additional permissions. See [signing in](/get-started/agent-plugin/tools-only#sign-in) for how the two layers fit together. +Your client signs you in to Arcade when it first connects. When a task needs an app, your agent gives you a browser sign-in link for the required permissions. You may need to reconnect if the connection expires or a later task needs additional permissions. After you finish in the browser, return to your agent and continue the original task. Arcade does not resume it for you. See [signing in](/get-started/agent-plugin/tools-only#sign-in) for how the two layers fit together. ## Try it -Ask your agent for an outcome rather than naming a tool. The first time a task needs an app you have not authorized, your agent hands you a link. Approve it and the rest of the task continues, including steps that land in a different app. +Ask your agent for an outcome rather than naming a tool. The first time a task needs an app you have not authorized, your agent hands you a link. After you approve it, return to your agent and continue the task, including steps that land in a different app. See [sample prompts](/get-started/agent-plugin#try-it) on the main install page, or ask "What apps can Arcade use?" diff --git a/app/en/get-started/agent-plugin/tools-only/claude-desktop/page.mdx b/app/en/get-started/agent-plugin/tools-only/claude-desktop/page.mdx index 654024b8d..372e3b0b2 100644 --- a/app/en/get-started/agent-plugin/tools-only/claude-desktop/page.mdx +++ b/app/en/get-started/agent-plugin/tools-only/claude-desktop/page.mdx @@ -21,6 +21,7 @@ Install Arcade in Claude Desktop and run a task against one of your apps. 1. Claude Desktop with plugin marketplace support 2. An Arcade account +3. [Node.js](https://nodejs.org/) on the PATH when Cowork or Code runs Arcade's routing hooks. Those hooks run `node`. Chat and the tools-only connector do not run them. @@ -64,11 +65,11 @@ Save, then start a new conversation. You get the same tools this way. You lose t ## Sign in -Connecting Arcade signs you in and links Claude Desktop to the gateway. When a task needs an app, your agent gives you a browser sign-in link for the required permissions. After approval, Arcade stores the authorization. You may need to reconnect if the connection expires or a later task needs additional permissions. You can connect an app before you need it. See [signing in](/get-started/agent-plugin/tools-only#sign-in) for how the two layers fit together. +Connecting Arcade signs you in and links Claude Desktop to the gateway. When a task needs an app, your agent gives you a browser sign-in link for the required permissions. After approval, Arcade stores the authorization. You may need to reconnect if the connection expires or a later task needs additional permissions. You can connect an app before you need it. After you finish in the browser, return to Claude and continue the original task. Arcade does not resume it for you. See [signing in](/get-started/agent-plugin/tools-only#sign-in) for how the two layers fit together. ## Try it -Ask Claude for an outcome rather than naming a tool. The first time a task needs an app you have not authorized, Claude hands you a link. Approve it and the rest of the task continues, including steps that land in a different app. +Ask Claude for an outcome rather than naming a tool. The first time a task needs an app you have not authorized, Claude hands you a link. After you approve it, return to Claude and continue the task, including steps that land in a different app. See [sample prompts](/get-started/agent-plugin#try-it) on the main install page, or ask "What apps can Arcade use?" diff --git a/app/en/get-started/agent-plugin/tools-only/page.mdx b/app/en/get-started/agent-plugin/tools-only/page.mdx index f07b263a8..d04717a56 100644 --- a/app/en/get-started/agent-plugin/tools-only/page.mdx +++ b/app/en/get-started/agent-plugin/tools-only/page.mdx @@ -7,7 +7,7 @@ import { SignupLink } from "@/app/_components/analytics"; # Tools-only MCP server -The [agent plugin](/get-started/agent-plugin) ships more than tools: two skills, three commands, and the `arcade-operator` subagent, all of which need a client that loads [agent plugins](https://agent-plugins.org). Any client can still connect to the same gateway and get every tool on it without loading the rest of the plugin. +The [agent plugin](/get-started/agent-plugin) ships more than tools: two skills, three commands, and the `arcade-operator` subagent, all of which need a client that loads [agent plugins](https://agent-plugins.org). Any client can still connect to the same gateway and get every tool on it without loading the rest of the plugin. This connection does not run plugin hooks and does not need Node.js. That is what this section covers. The gateway URL is: @@ -34,6 +34,8 @@ If your client supports [plugins](https://agent-plugins.org), you should [instal No API keys. You authorize twice: your client signs you in to Arcade with your Arcade account when it first connects to the gateway. When a task needs an app, your agent gives you a browser sign-in link for the required permissions. After approval, Arcade stores the authorization. You may need to reconnect if the connection expires or a later task needs additional permissions. You can connect an app before you need it. +After you finish in the browser, return to your agent and continue the original task. Arcade does not resume it for you. + Arcade uses the app connections authorized for your signed-in identity. Authorize only the accounts you intend the agent to use. [Server-level and tool-level authorization](/learn/server-level-vs-tool-level-auth) covers the split in depth. ## Next steps From 3840190cd2c71f7e5773e830d4a8e2e07c3a3fc4 Mon Sep 17 00:00:00 2001 From: Teal Larson Date: Thu, 15 Oct 2026 20:20:09 -0700 Subject: [PATCH 26/42] docs(agent-plugin): focus personal installation and clarify steps --- app/en/get-started/agent-plugin/_meta.tsx | 6 - app/en/get-started/agent-plugin/page.mdx | 118 ++++++++++-------- .../agent-plugin/team-rollout/page.mdx | 54 -------- .../agent-plugin/tools-only/_meta.tsx | 15 --- .../any-mcp-client/mcp-client-installer.tsx | 77 ------------ .../tools-only/any-mcp-client/page.mdx | 40 ------ .../tools-only/claude-desktop/page.mdx | 80 ------------ .../agent-plugin/tools-only/page.mdx | 45 ------- .../mcp-clients/claude-desktop/page.mdx | 4 +- public/llms.txt | 4 - redirects.ts | 25 +++- 11 files changed, 94 insertions(+), 374 deletions(-) delete mode 100644 app/en/get-started/agent-plugin/team-rollout/page.mdx delete mode 100644 app/en/get-started/agent-plugin/tools-only/_meta.tsx delete mode 100644 app/en/get-started/agent-plugin/tools-only/any-mcp-client/mcp-client-installer.tsx delete mode 100644 app/en/get-started/agent-plugin/tools-only/any-mcp-client/page.mdx delete mode 100644 app/en/get-started/agent-plugin/tools-only/claude-desktop/page.mdx delete mode 100644 app/en/get-started/agent-plugin/tools-only/page.mdx diff --git a/app/en/get-started/agent-plugin/_meta.tsx b/app/en/get-started/agent-plugin/_meta.tsx index bce8ae202..596d5a14c 100644 --- a/app/en/get-started/agent-plugin/_meta.tsx +++ b/app/en/get-started/agent-plugin/_meta.tsx @@ -4,12 +4,6 @@ export const meta: MetaRecord = { index: { title: "Overview", }, - "tools-only": { - title: "Tools-only MCP server", - }, - "team-rollout": { - title: "From personal use to team rollout", - }, }; export default meta; diff --git a/app/en/get-started/agent-plugin/page.mdx b/app/en/get-started/agent-plugin/page.mdx index c7365b425..6ebe2148d 100644 --- a/app/en/get-started/agent-plugin/page.mdx +++ b/app/en/get-started/agent-plugin/page.mdx @@ -8,7 +8,9 @@ import { SignupLink } from "@/app/_components/analytics"; # Install the Arcade agent plugin -The Arcade agent plugin bundles a connection to Arcade's hosted MCP gateway with two skills, three commands, and the `arcade-operator` subagent. The gateway gives your agent thousands of tools for email, calendar, chat, issues, docs, and dozens of other apps. The rest of the plugin helps your agent choose and use those tools. You authorize each app in the browser the first time it comes up, with no API keys to create and no gateway to configure. +This guide is for agent developers who want to use Arcade in their own coding agent or desktop client. Install the plugin, sign in, and run a task across your apps without creating API keys or configuring a gateway. + +The plugin bundles a connection to Arcade's hosted MCP gateway with two skills, three commands, and the `arcade-operator` subagent. The gateway provides tools for email, calendar, chat, issues, docs, and other apps. The skills and other components help your agent choose and use those tools. Each client loads the components it supports, as shown in the [support table](#what-you-get-in-each-agent). @@ -21,20 +23,12 @@ Install the Arcade agent plugin in your agent and run your first task against a 1. A supported client: Cursor, Claude Code, VS Code, GitHub Copilot CLI, Codex, or Claude Desktop 2. An Arcade account -3. For Claude Code, Claude Cowork, Cursor CLI, and GitHub Copilot CLI: [Node.js](https://nodejs.org/) on the PATH of the host that launches their routing hooks. Those hooks run `node`. Cursor IDE, VS Code, Codex, Claude Desktop Chat, and tools-only MCP clients do not need Node.js. +3. For Claude Code, Claude Cowork, Cursor CLI, and GitHub Copilot CLI: [Node.js](https://nodejs.org/) on the PATH of the host that launches their routing hooks. Those hooks run `node`. Cursor IDE, VS Code, Codex, and Claude Desktop Chat do not need Node.js. - - The plugin is built for personal use. For team use, consider a dedicated [MCP - Gateway](/operate/governance/mcp-gateways) with a curated tool list. Add a - [User Source](/operate/identity/user-sources) when end users should sign in - through your organization's identity provider. See [from personal use to team - rollout](/get-started/agent-plugin/team-rollout). - - ## Install Each client installs plugins differently. Use the path for yours. @@ -49,83 +43,111 @@ Each client installs plugins differently. Use the path for yours. -Add the Arcade marketplace, then install the plugin: +1. Add the Arcade marketplace and install the plugin: -```bash -claude plugin marketplace add {{ARCADE_PLUGIN_REPO}} -claude plugin install arcade@arcade -``` + ```bash + claude plugin marketplace add {{ARCADE_PLUGIN_REPO}} + claude plugin install arcade@arcade + ``` -Run `/reload-plugins` if Claude Code is already open. Verify the install with `claude plugin list` or `/plugin`. +2. Run `/reload-plugins` if Claude Code is already open. +3. Verify the install with `claude plugin list` or `/plugin`. Claude Code runs its routing hooks with `node`. The host that launches Claude Code must be able to find Node.js on its PATH. -Add the Arcade marketplace, then install the plugin: +1. Add the Arcade marketplace and install the plugin: -```bash -codex plugin marketplace add {{ARCADE_PLUGIN_REPO}} -codex plugin add arcade@arcade -``` + ```bash + codex plugin marketplace add {{ARCADE_PLUGIN_REPO}} + codex plugin add arcade@arcade + ``` -Start a new Codex session or ChatGPT desktop chat. Open `/plugins`, confirm **arcade** is installed and enabled, then confirm the **arcade** MCP server is connected. +2. Start a new Codex session or ChatGPT desktop chat. +3. Open `/plugins` and confirm **arcade** is installed and enabled. +4. Confirm the **arcade** MCP server is connected. To invoke Arcade explicitly, choose `@Arcade` or use `$arcade:try-arcade`. For team-rollout guidance, use `$arcade:scale-arcade`. Codex does not expose these skills as slash commands. -For an individual plan, clone the plugin into Cursor's local plugin directory: +**Local installation** + +For an individual plan, or a Teams or Enterprise plan with **Allow Local Plugin Imports** enabled: + +1. Clone the plugin into Cursor's local plugin directory: + + ```bash + git clone https://github.com/{{ARCADE_PLUGIN_REPO}} ~/.cursor/plugins/local/arcade-plugin + ``` -```bash -git clone https://github.com/{{ARCADE_PLUGIN_REPO}} ~/.cursor/plugins/local/arcade-plugin -``` +2. Run **Developer: Reload Window**. +3. Open **Customize** and confirm the two Arcade skills, `arcade-operator`, rule, and MCP server are present. -Keep the clone inside `~/.cursor/plugins/local/`. Cursor ignores a symlink whose target sits outside that directory. Run **Developer: Reload Window**, then open **Customize** and confirm the Arcade skills, `arcade-operator`, rule, and MCP server are present. To update later, run `git pull` in that folder and reload. +Keep the clone inside `~/.cursor/plugins/local/`. Cursor ignores symlinks to folders outside that directory. -On Teams and Enterprise, local plugins depend on **Allow Local Plugin Imports**. Enterprise turns this off by default. When it is off, Cursor ignores `~/.cursor/plugins/local`. Use a team marketplace instead. An admin opens **Dashboard → Plugins & MCPs → Team Marketplaces → Add Marketplace → Import from Repo** and pastes `https://github.com/{{ARCADE_PLUGIN_REPO}}`. Each person opens **Customize**, finds **Arcade**, and selects **Install**. When the setting is on, the local clone above works on these plans too. +To update the plugin later: + +1. Run `git pull` in `~/.cursor/plugins/local/arcade-plugin`. +2. Run **Developer: Reload Window**. + +**Team marketplace alternative** + +Enterprise turns **Allow Local Plugin Imports** off by default. When it is off, Cursor ignores `~/.cursor/plugins/local`. Use a team marketplace: + +1. An admin opens **Dashboard → Plugins & MCPs → Team Marketplaces → Add Marketplace → Import from Repo** and pastes `https://github.com/{{ARCADE_PLUGIN_REPO}}`. +2. Each person opens **Customize**, finds **Arcade**, and selects **Install**. Cursor CLI runs its session hook with `node`. The host that launches the CLI must be able to find Node.js on its PATH. Cursor IDE and Cloud Agents do not run that hook. -Open the Command Palette, select **Chat: Install Plugin From Source**, and paste: +1. Open the Command Palette and select **Chat: Install Plugin From Source**. +2. Paste the repository URL: -```text -https://github.com/{{ARCADE_PLUGIN_REPO}} -``` + ```text + https://github.com/{{ARCADE_PLUGIN_REPO}} + ``` -Turn on `chat.plugins.enabled` if needed, then reload VS Code. Run **MCP: List Servers**, select **arcade**, choose **Start Server**, and sign in when prompted. After you finish in the browser, return to VS Code and continue the original task. VS Code does not run Arcade's routing hooks, so this install does not need Node.js. +3. Turn on `chat.plugins.enabled` if needed, then reload VS Code. +4. Confirm **Arcade** appears under **Agent Plugins → Installed**. +5. Run **MCP: List Servers**, select **arcade**, and choose **Start Server**. +6. Sign in when prompted, then return to VS Code and continue the original task. + +VS Code does not run Arcade's routing hooks, so this install does not need Node.js. -Install with Copilot CLI's plugin command: +1. Install with Copilot CLI's plugin command: -```bash -copilot plugin install {{ARCADE_PLUGIN_REPO}} -``` + ```bash + copilot plugin install {{ARCADE_PLUGIN_REPO}} + ``` -Restart the session or run `/restart`. +2. Restart the session or run `/restart`. Copilot CLI runs its session and subagent hooks with `node`. The host that launches Copilot CLI must be able to find Node.js on its PATH. -Open **Customize → Plugins → Add marketplace → Add from a repository**, paste `{{ARCADE_PLUGIN_REPO}}`, then install **Arcade** (`arcade@arcade`). +1. Open **Customize → Plugins → Add marketplace → Add from a repository**. +2. Paste `{{ARCADE_PLUGIN_REPO}}`. +3. Install **Arcade** (`arcade@arcade`). Cowork and Code run their supported routing hooks with `node`. The desktop app must be able to find Node.js on its PATH for those hooks. Chat does not run them. -See the [Claude Desktop guide](/get-started/agent-plugin/tools-only/claude-desktop) for the terminal commands and tools-only connector option. +For Claude Code inside the desktop app, you can also use the commands in the **Claude Code** tab. -After installation, reload your agent or start a new session. Using another client that does not load plugins? Connect to the same gateway with the [tools-only Arcade bundle](/get-started/agent-plugin/tools-only). +After installation, reload your agent or start a new session. ## Sign in @@ -160,8 +182,6 @@ Every install connects to the same Arcade gateway and gets the same tools. What | VS Code | ✅ | 2 | ✅ | — | — | —⁶ | | Codex and ChatGPT local runtime | ✅ | 2 | — | — | — | —⁷ | | Claude Desktop Chat | ✅ | 2 | — | — | — | — | -| OpenCode | ✅ | — | — | — | — | — | -| Any other Streamable HTTP MCP client | ✅ | — | — | — | — | — | - ¹ Cursor IDE lists the commands on the plugin page but does not show them in the `/` menu. - ² Cursor IDE and Cloud Agents do not run plugin hooks. The always-apply rule carries the routing guidance instead. @@ -171,8 +191,6 @@ Every install connects to the same Arcade gateway and gets the same tools. What - ⁶ VS Code reads the Copilot hook file but cannot run its Agent Plugins hook commands yet. - ⁷ Codex does not run Agent Plugins lifecycle hooks yet. -Here is what each of those is for. - ### Commands Cursor, Claude Code, and Cowork load all three commands. Claude Code and Cowork namespace them as `/arcade:arcade-status`, `/arcade:arcade-connect`, and `/arcade:arcade-apps`. @@ -191,15 +209,18 @@ Lists the apps you have connected and lets you disconnect one. ### Skills -Skills are instructions your agent reads on its own, so you do not have to invoke them in most clients. `try-arcade` teaches it to turn a request like "reply to that thread" into the right sequence of tool calls across your apps. `scale-arcade` handles the other kind of question, the one about moving a workflow onto a team gateway, and it walks you through the decisions on [this page](/get-started/agent-plugin/team-rollout) against your own project. Codex does not expose these skills as slash commands. Choose `@Arcade` or `$arcade:try-arcade`, and use `$arcade:scale-arcade` for team-rollout guidance. +Skills are instructions your agent reads when relevant to a request: + +- `try-arcade` guides tasks across your connected apps, such as replying to a thread or checking your calendar. +- `scale-arcade` guides decisions about using a workflow with a team, including gateway setup, tool selection, and end-user identity. ### Subagent -The `arcade-operator` subagent runs an app task in its own context and reports back just the result. Arcade exposes a lot of tools, and searching them fills a conversation with noise that pushes out your actual work. The operator absorbs that. Cursor, Claude Code, Cowork, Copilot CLI, and VS Code load it. Codex and Claude Desktop Chat do not. +The `arcade-operator` subagent runs an app task in its own context and reports the result. It keeps tool searches and intermediate results out of your main conversation. Cursor, Claude Code, Cowork, Copilot CLI, and VS Code load it. Codex and Claude Desktop Chat do not. ### Rule and hooks -The rule and hooks tell your agent that Arcade exists and when reaching for it is the right move, which is the difference between a tool that sits unused and one your agent actually picks up. Cursor IDE and Cloud Agents use an always-apply rule. Cursor CLI, Claude Code, Cowork, and Copilot CLI run the hooks their hosts support. Those hooks run `node`. The host that launches them must be able to find Node.js on its PATH. +The rule and hooks tell your agent when to use Arcade for app tasks. Cursor IDE and Cloud Agents use an always-apply rule. Cursor CLI, Claude Code, Cowork, and Copilot CLI run the hooks their hosts support. Those hooks run `node`. The host that launches them must be able to find Node.js on its PATH. The columns thin out because the [Agent Plugins](https://agent-plugins.org) 1.0 specification only makes skills and MCP servers portable. Commands, subagents, hooks, and editor rules are specific to each agent, so the plugin ships them where the agents that support them will find them. @@ -223,7 +244,6 @@ Or ask "What can Arcade do?" and pick a workflow from the answer. ## Next steps -- [From personal use to team rollout](/get-started/agent-plugin/team-rollout): move a workflow onto your own gateway - [Connect to MCP clients](/get-started/mcp-clients): configure a client against a gateway you control - [Integrations catalog](/resources/integrations): every app and toolkit Arcade supports - [Agentic development](/get-started/setup/connect-arcade-docs): point your agent at these docs with `llms.txt` diff --git a/app/en/get-started/agent-plugin/team-rollout/page.mdx b/app/en/get-started/agent-plugin/team-rollout/page.mdx deleted file mode 100644 index b0006230c..000000000 --- a/app/en/get-started/agent-plugin/team-rollout/page.mdx +++ /dev/null @@ -1,54 +0,0 @@ ---- -title: "From personal use to team rollout" -description: "What changes when an Arcade workflow you proved with the agent plugin becomes something a team depends on: a dedicated MCP Gateway, a curated tool list, and how end users sign in." ---- - -import { Callout } from "nextra/components"; - -# From personal use to team rollout - -The [agent plugin](/get-started/agent-plugin) serves one person working on their own. Every install points at the same global gateway URL. Arcade uses the app connections authorized for your signed-in identity. Authorize only the accounts you intend the agent to use. - -What the plugin gives you is a broad tool selection and an identity that is yours alone, which is what you want for your own work. - -Once a team depends on that workflow, three questions you never had to answer start to matter: - -1. Where does your team connect? -2. Which tools can they call? -3. Who is each end user? - -Each one has a section below, in that order. - - - If your client loads the plugin's skills, ask Arcade to help move your - workflow onto a team gateway. In Codex, use `$arcade:scale-arcade`. - - -## Where does your team connect? - -An [MCP Gateway](/operate/governance/mcp-gateways) is the endpoint your team's clients connect to, and it is where you decide what those clients can do. Create a gateway in the relevant Arcade project for the workflow and tool boundary you need from the [Arcade dashboard](https://app.arcade.dev). - -Clients connect to it exactly the way they connected to the plugin's gateway. See the [MCP client guides](/get-started/mcp-clients) for Cursor, Claude Code, Claude Desktop, VS Code, and Copilot. - -## Which tools can they call? - -The gateway is the filter that decides which tools reach your agent. Open the **Allowed Tools** picker on your gateway and select across everything in scope: Arcade-hosted toolkits from the [integrations catalog](/resources/integrations), [remote MCP servers](/operate/governance/remote-mcp-servers) you register, and your own [custom MCP servers](/build/create-tools/tool-basics/build-mcp-server) deployed with [Arcade Deploy](/build/arcade-deploy). - -A smaller, deliberate tool list makes agents more accurate, not less capable. Save the gateway and connected clients see the new list on their next request, with no restart. - -Beyond the allowlist, [contextual access](/operate/governance/contextual-access) lets you allow or deny each individual tool call as it arrives, and [audit logs](/operate/governance/audit-logs) and [tool executions](/operate/governance/tool-executions) show you what actually ran. - -## Who is each end user? - -When you are the only user, signing in to each app yourself is enough. In production, each of your end users needs their own authorization, so an agent acting for one person can never reach another person's data. - -Choose how your end users sign in. Internal teams whose users are Arcade project members can use [Arcade Auth](/operate/identity/user-sources#when-to-use-a-user-source). If users already have identities in your organization's OIDC provider, configure a [User Source](/operate/identity/user-sources) on the gateway. - -## Building your own product? - -Connecting a client to a gateway takes the least work, and for many teams it is the whole rollout. When you are building your own product rather than configuring an agent, call Arcade directly instead: - -- [Arcade API reference](/references/api): the REST surface for tool calling and authorization -- [Agent frameworks](/get-started/agent-frameworks) for LangChain, CrewAI, OpenAI Agents, Google ADK, Mastra, Vercel AI SDK, and more -- [Get an API key](/get-started/setup/api-keys): required once you are calling Arcade from your own code -- [Build user-facing agents](/build/user-facing-agents): patterns for handling authorization on behalf of your users diff --git a/app/en/get-started/agent-plugin/tools-only/_meta.tsx b/app/en/get-started/agent-plugin/tools-only/_meta.tsx deleted file mode 100644 index 4187c208e..000000000 --- a/app/en/get-started/agent-plugin/tools-only/_meta.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import type { MetaRecord } from "nextra"; - -export const meta: MetaRecord = { - index: { - title: "Overview", - }, - "claude-desktop": { - title: "Claude Desktop", - }, - "any-mcp-client": { - title: "Any MCP client", - }, -}; - -export default meta; diff --git a/app/en/get-started/agent-plugin/tools-only/any-mcp-client/mcp-client-installer.tsx b/app/en/get-started/agent-plugin/tools-only/any-mcp-client/mcp-client-installer.tsx deleted file mode 100644 index fb78b2352..000000000 --- a/app/en/get-started/agent-plugin/tools-only/any-mcp-client/mcp-client-installer.tsx +++ /dev/null @@ -1,77 +0,0 @@ -"use client"; - -import { - Select, - SelectContent, - SelectItem, - SelectTrigger, -} from "@arcadeai/design-system"; -import { - getMcpClientMeta, - MCPInstallButton, - type McpClientId, -} from "@arcadeai/ui-kit/mcp-gateway-connect"; -import { useState } from "react"; -import { - AGENT_PLUGIN_ENGINE_PUBLIC_URL, - AGENT_PLUGIN_GATEWAY_SLUG, -} from "@/lib/agent-plugin"; - -const INSTALL_CLIENTS = [ - "cursor", - "vscode", -] as const satisfies readonly McpClientId[]; - -type InstallClient = (typeof INSTALL_CLIENTS)[number]; - -function isInstallClient(value: string | null): value is InstallClient { - return value === "cursor" || value === "vscode"; -} - -function ClientOption({ clientId }: { clientId: InstallClient }) { - const client = getMcpClientMeta(clientId); - - return ( - - - {client.logo} - - {client.name} - - ); -} - -export function MCPClientInstaller() { - const [selectedClient, setSelectedClient] = useState("cursor"); - - return ( -
- - - -
- ); -} diff --git a/app/en/get-started/agent-plugin/tools-only/any-mcp-client/page.mdx b/app/en/get-started/agent-plugin/tools-only/any-mcp-client/page.mdx deleted file mode 100644 index d7b421208..000000000 --- a/app/en/get-started/agent-plugin/tools-only/any-mcp-client/page.mdx +++ /dev/null @@ -1,40 +0,0 @@ ---- -title: "Install Arcade in any MCP client" -description: "Point any Streamable HTTP MCP client at the Arcade gateway to get tools for every app you connect, with no API key and no plugin install." ---- - -import { MCPClientInstaller } from "./mcp-client-installer"; - -# Install Arcade in any MCP client - -Any client that speaks the Streamable HTTP MCP transport can use Arcade tools, OpenCode included. This connection does not run plugin hooks and does not need Node.js. Add this as an MCP server: - -```text -{{ARCADE_PLUGIN_GATEWAY_URL}} -``` - -Your agent gets every tool on the gateway. Nothing else about how you use it changes. - -## One-click install - -Cursor and VS Code can add the gateway without editing any config: - - - -Both of those clients also load the full plugin, so use these only if you want the tools on their own. [Install the agent plugin](/get-started/agent-plugin) for the rest. - -## Sign in - -Your client signs you in to Arcade when it first connects. When a task needs an app, your agent gives you a browser sign-in link for the required permissions. You may need to reconnect if the connection expires or a later task needs additional permissions. After you finish in the browser, return to your agent and continue the original task. Arcade does not resume it for you. See [signing in](/get-started/agent-plugin/tools-only#sign-in) for how the two layers fit together. - -## Try it - -Ask your agent for an outcome rather than naming a tool. The first time a task needs an app you have not authorized, your agent hands you a link. After you approve it, return to your agent and continue the task, including steps that land in a different app. - -See [sample prompts](/get-started/agent-plugin#try-it) on the main install page, or ask "What apps can Arcade use?" - -## Next steps - -- [Tools-only MCP server](/get-started/agent-plugin/tools-only): what you give up by skipping the plugin -- [Install the agent plugin](/get-started/agent-plugin): use the client-native install for Cursor, Claude Code, VS Code, Copilot CLI, Codex, or Claude Desktop -- [Connect to MCP clients](/get-started/mcp-clients): point a client at a gateway you control, with your own tool list diff --git a/app/en/get-started/agent-plugin/tools-only/claude-desktop/page.mdx b/app/en/get-started/agent-plugin/tools-only/claude-desktop/page.mdx deleted file mode 100644 index 372e3b0b2..000000000 --- a/app/en/get-started/agent-plugin/tools-only/claude-desktop/page.mdx +++ /dev/null @@ -1,80 +0,0 @@ ---- -title: "Install Arcade in Claude Desktop" -description: "Add the Arcade plugin from a Claude Desktop marketplace for tools and skills, or connect the gateway as a custom connector for tools only." ---- - -import { Callout } from "nextra/components"; -import { SignupLink } from "@/app/_components/analytics"; - -# Install Arcade in Claude Desktop - -Add Arcade through Claude Desktop's plugin marketplace. Chat gets tools and both skills. Cowork and Code also load the operator, commands, and supported routing hooks when you enable the plugin there. - - - - -Install Arcade in Claude Desktop and run a task against one of your apps. - - - - - -1. Claude Desktop with plugin marketplace support -2. An Arcade account -3. [Node.js](https://nodejs.org/) on the PATH when Cowork or Code runs Arcade's routing hooks. Those hooks run `node`. Chat and the tools-only connector do not run them. - - - - - - - Using Claude Code inside the desktop app? You can also install Arcade with - the Claude Code marketplace commands below. - - -## Install the plugin - -**Customize → Plugins → Add marketplace → Add from a repository** → paste: - -```text -{{ARCADE_PLUGIN_REPO}} -``` - -Then install **Arcade** (`arcade@arcade`). - -From Claude Code in the desktop app, or a terminal: - -```bash -claude plugin marketplace add {{ARCADE_PLUGIN_REPO}} -claude plugin install arcade@arcade -``` - -If Claude Code is already open, run `/reload-plugins`. - -No documented `claude://` link adds a marketplace. The steps on this page are the install. - -## Tools only - -If you only want the gateway without skills, skip the marketplace. Open **Settings → Connectors**, click **Add custom connector**, and paste: - -```text -{{ARCADE_PLUGIN_GATEWAY_URL}} -``` - -Save, then start a new conversation. You get the same tools this way. You lose the skills that teach Claude how to chain tool calls across your apps. See [what you give up](/get-started/agent-plugin/tools-only#what-you-give-up). - -## Sign in - -Connecting Arcade signs you in and links Claude Desktop to the gateway. When a task needs an app, your agent gives you a browser sign-in link for the required permissions. After approval, Arcade stores the authorization. You may need to reconnect if the connection expires or a later task needs additional permissions. You can connect an app before you need it. After you finish in the browser, return to Claude and continue the original task. Arcade does not resume it for you. See [signing in](/get-started/agent-plugin/tools-only#sign-in) for how the two layers fit together. - -## Try it - -Ask Claude for an outcome rather than naming a tool. The first time a task needs an app you have not authorized, Claude hands you a link. After you approve it, return to Claude and continue the task, including steps that land in a different app. - -See [sample prompts](/get-started/agent-plugin#try-it) on the main install page, or ask "What apps can Arcade use?" - -## Next steps - -- [Tools-only MCP server](/get-started/agent-plugin/tools-only): what you give up by skipping the plugin -- [Install the agent plugin](/get-started/agent-plugin): the full experience in Cursor, Claude Code, VS Code, Copilot CLI, or Codex -- [Use Arcade in Claude Desktop with your own gateway](/get-started/mcp-clients/claude-desktop): pick exactly which tools Claude can call diff --git a/app/en/get-started/agent-plugin/tools-only/page.mdx b/app/en/get-started/agent-plugin/tools-only/page.mdx deleted file mode 100644 index d04717a56..000000000 --- a/app/en/get-started/agent-plugin/tools-only/page.mdx +++ /dev/null @@ -1,45 +0,0 @@ ---- -title: "Tools-only MCP server" -description: "Connect any MCP client to the Arcade gateway to get tools for every app you connect, without the agent plugin's skills, commands, or subagent." ---- - -import { SignupLink } from "@/app/_components/analytics"; - -# Tools-only MCP server - -The [agent plugin](/get-started/agent-plugin) ships more than tools: two skills, three commands, and the `arcade-operator` subagent, all of which need a client that loads [agent plugins](https://agent-plugins.org). Any client can still connect to the same gateway and get every tool on it without loading the rest of the plugin. This connection does not run plugin hooks and does not need Node.js. - -That is what this section covers. The gateway URL is: - -```text -{{ARCADE_PLUGIN_GATEWAY_URL}} -``` - -## Install it - -- **[Claude Desktop](/get-started/agent-plugin/tools-only/claude-desktop)** installs the full plugin from a marketplace, or connects with tools only through a custom connector. -- **[Any other MCP client](/get-started/agent-plugin/tools-only/any-mcp-client)** takes the gateway URL directly. Cursor and VS Code also have one-click links. - -## What you give up - -Tools alone still do the work. What you lose is the part that helps your agent use them well: - -- **The skills** teach your agent to turn "reply to that thread" into the right sequence of tool calls, and to walk you through a team rollout when you ask about one. -- **The commands** give you `/arcade-status`, `/arcade-connect`, and `/arcade-apps` for checking and managing connections without leaving your agent. -- **The subagent** keeps tool search out of your main conversation, so it does not crowd out your actual work. - -If your client supports [plugins](https://agent-plugins.org), you should [install the full plugin](/get-started/agent-plugin) instead. - -## Sign in - -No API keys. You authorize twice: your client signs you in to Arcade with your Arcade account when it first connects to the gateway. When a task needs an app, your agent gives you a browser sign-in link for the required permissions. After approval, Arcade stores the authorization. You may need to reconnect if the connection expires or a later task needs additional permissions. You can connect an app before you need it. - -After you finish in the browser, return to your agent and continue the original task. Arcade does not resume it for you. - -Arcade uses the app connections authorized for your signed-in identity. Authorize only the accounts you intend the agent to use. [Server-level and tool-level authorization](/learn/server-level-vs-tool-level-auth) covers the split in depth. - -## Next steps - -- [Install the agent plugin](/get-started/agent-plugin): use the client-native install for Cursor, Claude Code, VS Code, Copilot CLI, Codex, or Claude Desktop -- [Connect to MCP clients](/get-started/mcp-clients): point a client at a gateway you control, with your own tool list -- [From personal use to team rollout](/get-started/agent-plugin/team-rollout): what changes when a team depends on the workflow diff --git a/app/en/get-started/mcp-clients/claude-desktop/page.mdx b/app/en/get-started/mcp-clients/claude-desktop/page.mdx index aad9ca898..b45c6afd1 100644 --- a/app/en/get-started/mcp-clients/claude-desktop/page.mdx +++ b/app/en/get-started/mcp-clients/claude-desktop/page.mdx @@ -37,8 +37,8 @@ export const STEP_7_LIGHT_HEIGHT = 2450; # Use Arcade in Claude Desktop - **Setting Arcade up for yourself?** Install [the Arcade - bundle](/get-started/agent-plugin/tools-only/claude-desktop), which needs no API key and + **Setting Arcade up for yourself?** Install [the Arcade agent + plugin](/get-started/agent-plugin), which needs no API key and authorizes each app in the browser. This guide is for pointing Claude Desktop at a gateway you control, with your own tool list and your own end-user identities. diff --git a/public/llms.txt b/public/llms.txt index a6547d560..fb0590919 100644 --- a/public/llms.txt +++ b/public/llms.txt @@ -132,7 +132,6 @@ Arcade docs serve two audiences. Start with the path that matches your goal: - [Evaluate Tools](https://docs.arcade.dev/en/build/create-tools/evaluate-tools): This page teaches you how to systematically test and validate your tools using Arcade's evaluation framework to ensure they perform reliably in production. It provides techniques for measuring tool performance and guiding iterative improvements after initial development. - [Examples](https://docs.arcade.dev/en/resources/examples): This documentation page provides a collection of example applications that utilize Arcade's tools and MCP servers, showcasing various real-world scenarios and integration patterns. Users can explore complete source code and setup instructions for each example, enabling them to quickly understand and implement similar projects. - [Frequently Asked Questions](https://docs.arcade.dev/en/resources/faq): This documentation page provides answers to common questions about the Arcade platform, including how to create and contribute tools, the differences between various API keys, and authentication methods. Users can learn how to build custom tools, manage API keys for team collaboration, and understand -- [From personal use to team rollout](https://docs.arcade.dev/en/get-started/agent-plugin/team-rollout): What changes when an Arcade workflow you proved with the agent plugin becomes something a team depends on: a dedicated MCP Gateway, a curated tool list, and how end users sign in. - [Get Formatted Tool Definitions](https://docs.arcade.dev/en/build/tool-calling/custom-apps/get-tool-definitions): This documentation page teaches developers how to retrieve tool definitions in formats compatible with specific AI model providers using the Arcade Client, including methods to get single tools, multiple tools from a server, or all available tools. It also explains how to convert Arcade tool definitions into Zod schemas for TypeScript projects, enabling type safety and integration with popular AI frameworks like LangChain and Vercel AI SDK. - [Getting Your API Key](https://docs.arcade.dev/en/get-started/setup/api-keys): This documentation page guides users on how to obtain and manage their Arcade API key, detailing the steps for generating keys through both the Arcade dashboard and CLI. It emphasizes the importance of securely storing API keys, as they serve as administrator credentials that grant access to - [Governance](https://docs.arcade.dev/en/operate/governance): This documentation page explains how to govern agent tool usage through access control policies, runtime enforcement, and administrative oversight. It provides guidance on managing tool availability, monitoring tool executions, and reviewing audit logs to maintain security and compliance. @@ -143,8 +142,6 @@ Arcade docs serve two audiences. Start with the path that matches your goal: - [Hybrid MCP servers](https://docs.arcade.dev/en/operate/deploy/on-prem): This documentation page explains how to set up a hybrid MCP server that runs on your own infrastructure while connecting to Arcade Cloud, allowing you to access private resources and keep sensitive data within your network. You'll learn how to run an MCP server with HTTP transport, create a secure tunnel to expose it publicly, register it in Arcade, and test it using the Arcade Playground. - [Identity](https://docs.arcade.dev/en/operate/identity): This page explains how to configure user authentication for Arcade gateways and manage identity providers that connect end users to your system. It provides access to resources for setting up user sources, configuring authentication providers, and implementing secure authentication in production environments. - [In Custom Applications](https://docs.arcade.dev/en/build/tool-calling/custom-apps): This documentation teaches developers how to integrate Arcade tools into custom applications by managing user authentication, checking authorization status, and retrieving tool definitions programmatically. It provides guides for building tool-calling interfaces that handle these core requirements. -- [Install Arcade in any MCP client](https://docs.arcade.dev/en/get-started/agent-plugin/tools-only/any-mcp-client): Point any Streamable HTTP MCP client at the Arcade gateway to get tools for every app you connect, with no API key and no plugin install. -- [Install Arcade in Claude Desktop](https://docs.arcade.dev/en/get-started/agent-plugin/tools-only/claude-desktop): Add the Arcade plugin from a Claude Desktop marketplace for tools and skills, or connect the gateway as a custom connector for tools only. - [Install the Arcade agent plugin](https://docs.arcade.dev/en/get-started/agent-plugin): Install Arcade in Cursor, Claude Code, VS Code, GitHub Copilot CLI, Codex, or Claude Desktop. Your agent gets tools for every app you connect, with browser sign-in and no API keys. - [Mastra](https://docs.arcade.dev/en/get-started/agent-frameworks/mastra): This documentation page guides users in building a TypeScript AI agent using the Mastra framework, enabling interaction with Gmail and Slack through Arcade tools. Users will learn to create an agent capable of reading emails, sending messages, and summarizing emails for Slack, - [MCP Gateways](https://docs.arcade.dev/en/operate/governance/mcp-gateways): MCP Gateways allow you to combine tools from multiple MCP servers into a single endpoint, enabling centralized management and simplified access for agents, applications, and IDEs. You can create gateways through a dashboard or AI assistant, configure authentication methods, and connect any MCP client that supports Streamable HTTP transport to access the federated tools. @@ -179,7 +176,6 @@ Arcade docs serve two audiences. Start with the path that matches your goal: - [Tool error handling](https://docs.arcade.dev/en/build/tool-calling/error-handling): This page teaches users how to handle errors when calling tools through Arcade's client libraries, covering structured error types, handling examples in Python/JavaScript/Java, and best practices for robust error management. It explains Arcade's error hierarchy system and shows users how to debug failed tool calls using Arcade's recorded execution history. - [Tool executions](https://docs.arcade.dev/en/operate/governance/tool-executions): Arcade records every tool execution in a project, capturing which tool ran, for which user, when, and its outcome, with inputs and outputs restricted to project admins for security. This page helps developers debug failed tool runs by reviewing exact inputs and outputs, and helps platform operators monitor tool usage and ensure compliance across their projects. - [Tools](https://docs.arcade.dev/en/resources/tools): This documentation page provides an overview of Arcade's ecosystem for AI tools, enabling users to explore a catalog of pre-built integrations, create custom tools, and contribute their own tools to the community. It outlines the benefits of using Arcade tools, such as built -- [Tools-only MCP server](https://docs.arcade.dev/en/get-started/agent-plugin/tools-only): Connect any MCP client to the Arcade gateway to get tools for every app you connect, without the agent plugin's skills, commands, or subagent. - [Types of Tools](https://docs.arcade.dev/en/build/create-tools/improve/types-of-tools): Arcade offers two types of tools—Optimized and Unoptimized—that differ in their design approach but work identically through the same interface. Optimized tools are carefully designed to match AI chat interfaces and improve reliability by handling complex workflows automatically, while Unoptimized tools mirror original HTTP endpoints and require more careful evaluation before production use. Both types can be used seamlessly together in Arcade's Dashboard and SDK clients. - [Understanding `Context` and tools](https://docs.arcade.dev/en/build/create-tools/tool-basics/runtime-data-access): The `Context` class provides tools with access to both runtime capabilities and tool-specific data, such as OAuth tokens, secrets, and user information, as well as features like logging, LLM sampling, user elicitation, and progress reporting. This guide explains how to use the `Context` object that is automatically passed to tools by the MCP server to securely access authentication credentials and leverage runtime features during tool execution. - [Use Arcade in Claude Code](https://docs.arcade.dev/en/get-started/mcp-clients/claude-code): This documentation page guides users on how to connect Claude Code to an Arcade MCP Gateway using the Arcade Headers authentication mode. It outlines the prerequisites for setup, including creating an Arcade account, obtaining an API key, and creating an Arcade MCP Gateway, and provides step-by-step instructions for adding the gateway as a remote HTTP MCP server in Claude Code. diff --git a/redirects.ts b/redirects.ts index efa7e4e24..f8172aa0e 100644 --- a/redirects.ts +++ b/redirects.ts @@ -16,6 +16,27 @@ export type Redirect = { }; export const redirects: Redirect[] = [ + // Retired agent-plugin guides. + { + source: "/:locale/get-started/agent-plugin/tools-only", + destination: "/:locale/get-started/agent-plugin", + permanent: true, + }, + { + source: "/:locale/get-started/agent-plugin/tools-only/claude-desktop", + destination: "/:locale/get-started/agent-plugin", + permanent: true, + }, + { + source: "/:locale/get-started/agent-plugin/tools-only/any-mcp-client", + destination: "/:locale/get-started/mcp-clients", + permanent: true, + }, + { + source: "/:locale/get-started/agent-plugin/team-rollout", + destination: "/:locale/operate/governance/mcp-gateways", + permanent: true, + }, // The toolkit-page breadcrumb links "Resources" -> /resources, which has // no index page. Send it to the integrations registry instead of 404ing. { @@ -1172,12 +1193,12 @@ export const redirects: Redirect[] = [ }, { source: "/:locale/get-started/agent-plugin/any-mcp-client", - destination: "/:locale/get-started/agent-plugin/tools-only/any-mcp-client", + destination: "/:locale/get-started/mcp-clients", permanent: true, }, { source: "/:locale/get-started/agent-plugin/claude-desktop", - destination: "/:locale/get-started/agent-plugin/tools-only/claude-desktop", + destination: "/:locale/get-started/agent-plugin", permanent: true, }, ]; From d5f709fea3b2e20f60ebc563236d85f0c7d4ca0f Mon Sep 17 00:00:00 2001 From: Teal Larson Date: Thu, 15 Oct 2026 20:36:14 -0700 Subject: [PATCH 27/42] docs(agent-plugin): consolidate requirements and remove unsupported claim --- app/en/get-started/agent-plugin/page.mdx | 39 +++++++----------------- 1 file changed, 11 insertions(+), 28 deletions(-) diff --git a/app/en/get-started/agent-plugin/page.mdx b/app/en/get-started/agent-plugin/page.mdx index 6ebe2148d..7db7a966d 100644 --- a/app/en/get-started/agent-plugin/page.mdx +++ b/app/en/get-started/agent-plugin/page.mdx @@ -21,9 +21,9 @@ Install the Arcade agent plugin in your agent and run your first task against a -1. A supported client: Cursor, Claude Code, VS Code, GitHub Copilot CLI, Codex, or Claude Desktop -2. An Arcade account -3. For Claude Code, Claude Cowork, Cursor CLI, and GitHub Copilot CLI: [Node.js](https://nodejs.org/) on the PATH of the host that launches their routing hooks. Those hooks run `node`. Cursor IDE, VS Code, Codex, and Claude Desktop Chat do not need Node.js. +- A supported client: Cursor, Claude Code, VS Code, GitHub Copilot CLI, Codex, or Claude Desktop +- An Arcade account +- For Claude Code, Claude Cowork, Cursor CLI, and GitHub Copilot CLI: [Node.js](https://nodejs.org/) on the PATH of the host that launches their routing hooks. Those hooks run `node`. Cursor IDE and Cloud Agents, VS Code, Codex, and Claude Desktop Chat do not need Node.js. @@ -31,8 +31,6 @@ Install the Arcade agent plugin in your agent and run your first task against a ## Install -Each client installs plugins differently. Use the path for yours. - The cross-client `npx plugins add` command does not finish every client install. Use the client-native steps below so the gateway and every supported @@ -53,8 +51,6 @@ Each client installs plugins differently. Use the path for yours. 2. Run `/reload-plugins` if Claude Code is already open. 3. Verify the install with `claude plugin list` or `/plugin`. -Claude Code runs its routing hooks with `node`. The host that launches Claude Code must be able to find Node.js on its PATH. - @@ -101,8 +97,6 @@ Enterprise turns **Allow Local Plugin Imports** off by default. When it is off, 1. An admin opens **Dashboard → Plugins & MCPs → Team Marketplaces → Add Marketplace → Import from Repo** and pastes `https://github.com/{{ARCADE_PLUGIN_REPO}}`. 2. Each person opens **Customize**, finds **Arcade**, and selects **Install**. -Cursor CLI runs its session hook with `node`. The host that launches the CLI must be able to find Node.js on its PATH. Cursor IDE and Cloud Agents do not run that hook. - @@ -118,8 +112,6 @@ Cursor CLI runs its session hook with `node`. The host that launches the CLI mus 5. Run **MCP: List Servers**, select **arcade**, and choose **Start Server**. 6. Sign in when prompted, then return to VS Code and continue the original task. -VS Code does not run Arcade's routing hooks, so this install does not need Node.js. - @@ -131,29 +123,24 @@ VS Code does not run Arcade's routing hooks, so this install does not need Node. 2. Restart the session or run `/restart`. -Copilot CLI runs its session and subagent hooks with `node`. The host that launches Copilot CLI must be able to find Node.js on its PATH. - 1. Open **Customize → Plugins → Add marketplace → Add from a repository**. 2. Paste `{{ARCADE_PLUGIN_REPO}}`. 3. Install **Arcade** (`arcade@arcade`). - -Cowork and Code run their supported routing hooks with `node`. The desktop app must be able to find Node.js on its PATH for those hooks. Chat does not run them. +4. Start a new conversation. For Claude Code inside the desktop app, you can also use the commands in the **Claude Code** tab. -After installation, reload your agent or start a new session. - ## Sign in -Authentication happens in two layers: +Arcade separates [gateway sign-in from app authorization](/learn/server-level-vs-tool-level-auth): -1. **Into the gateway.** Your client will ask you to authenticate when it first connects. You sign in to Arcade in the browser, and the client can reach the gateway from then on. +1. **Into the gateway.** Your client asks you to sign in when it first connects. Sign in to Arcade in the browser so your client can connect to the gateway. 2. **Into each app.** When a task needs an app, your agent gives you a browser sign-in link for the required permissions. After approval, Arcade stores the authorization. You may need to reconnect if the connection expires or a later task needs additional permissions. After you finish in the browser, return to your agent and continue the original task. Arcade does not resume it for you. @@ -166,8 +153,6 @@ Arcade uses the app connections authorized for your signed-in identity. Authoriz The released plugin turns client-side usage telemetry off in code. No environment setting turns collection on. Requests you make through Arcade still go to its hosted gateway and the apps you authorize. See [Arcade's privacy policy](https://www.arcade.dev/privacy-policy). -Gateway sign-in and app authorization stay separate on every Arcade gateway, including the one in the plugin. [Server-level and tool-level authorization](/learn/server-level-vs-tool-level-auth) goes deeper on the split. - ## What you get in each agent Every install connects to the same Arcade gateway and gets the same tools. What differs is how much of the rest of the plugin each agent can load. @@ -176,7 +161,7 @@ Every install connects to the same Arcade gateway and gets the same tools. What | ----------------------------------- | :---: | :----: | :------: | :------: | :--: | :------: | | Cursor IDE and Cloud Agents | ✅ | 2 | ✅ | 3¹ | ✅ | —² | | Cursor CLI | ✅ | 2 | ✅ | 3 | — | ✅³ | -| Claude Code | ✅ | 2 | ✅ | 3 | — | ✅ | +| Claude Code (CLI and desktop Code tab) | ✅ | 2 | ✅ | 3 | — | ✅ | | Claude Cowork | ✅ | 2 | ✅ | 3 | — | partial⁴ | | GitHub Copilot CLI | ✅ | 2 | ✅ | — | — | ✅⁵ | | VS Code | ✅ | 2 | ✅ | — | — | —⁶ | @@ -193,7 +178,7 @@ Every install connects to the same Arcade gateway and gets the same tools. What ### Commands -Cursor, Claude Code, and Cowork load all three commands. Claude Code and Cowork namespace them as `/arcade:arcade-status`, `/arcade:arcade-connect`, and `/arcade:arcade-apps`. +Claude Code and Cowork namespace the commands as `/arcade:arcade-status`, `/arcade:arcade-connect`, and `/arcade:arcade-apps`. #### `/arcade-status` @@ -216,13 +201,13 @@ Skills are instructions your agent reads when relevant to a request: ### Subagent -The `arcade-operator` subagent runs an app task in its own context and reports the result. It keeps tool searches and intermediate results out of your main conversation. Cursor, Claude Code, Cowork, Copilot CLI, and VS Code load it. Codex and Claude Desktop Chat do not. +The `arcade-operator` subagent runs an app task in its own context and reports the result. It keeps tool searches and intermediate results out of your main conversation. ### Rule and hooks -The rule and hooks tell your agent when to use Arcade for app tasks. Cursor IDE and Cloud Agents use an always-apply rule. Cursor CLI, Claude Code, Cowork, and Copilot CLI run the hooks their hosts support. Those hooks run `node`. The host that launches them must be able to find Node.js on its PATH. +The rule and hooks tell your agent when to use Arcade for app tasks. -The columns thin out because the [Agent Plugins](https://agent-plugins.org) 1.0 specification only makes skills and MCP servers portable. Commands, subagents, hooks, and editor rules are specific to each agent, so the plugin ships them where the agents that support them will find them. +The [Agent Plugins](https://agent-plugins.org) 1.0 specification makes only skills and MCP servers portable. Commands, subagents, hooks, and editor rules require client-specific support. ### How Arcade chooses a connection @@ -232,8 +217,6 @@ Arcade prefers the plugin's gateway. If it cannot complete a task for a reason o ## Try it -This gateway includes every [optimized toolkit](/resources/integrations) in the catalog. Try asking your agent: - - "Send a summary of tomorrow's calendar events to me on Slack." - "Read my Granola notes from last week, check them against Linear, and file anything I promised that is not a ticket yet. Wait for me before creating anything." - "Find unread mail that needs a reply. Look the sender up in HubSpot if you can, draft a response, and Slack me the draft before sending." From 401dddf407e115f82ce729eda44ea1b1e2e31df4 Mon Sep 17 00:00:00 2001 From: Teal Larson Date: Thu, 15 Oct 2026 20:53:56 -0700 Subject: [PATCH 28/42] docs(agent-plugin): describe included skills and subagent directly --- app/en/get-started/agent-plugin/page.mdx | 32 ++++++++++++------------ 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/app/en/get-started/agent-plugin/page.mdx b/app/en/get-started/agent-plugin/page.mdx index 7db7a966d..3401fd46c 100644 --- a/app/en/get-started/agent-plugin/page.mdx +++ b/app/en/get-started/agent-plugin/page.mdx @@ -8,14 +8,14 @@ import { SignupLink } from "@/app/_components/analytics"; # Install the Arcade agent plugin -This guide is for agent developers who want to use Arcade in their own coding agent or desktop client. Install the plugin, sign in, and run a task across your apps without creating API keys or configuring a gateway. +This guide is for agent developers installing Arcade in their own coding agent or desktop client. Personal installs use Arcade's hosted gateway without creating API keys or configuring a gateway. -The plugin bundles a connection to Arcade's hosted MCP gateway with two skills, three commands, and the `arcade-operator` subagent. The gateway provides tools for email, calendar, chat, issues, docs, and other apps. The skills and other components help your agent choose and use those tools. Each client loads the components it supports, as shown in the [support table](#what-you-get-in-each-agent). +The plugin connects your agent to Arcade's hosted MCP gateway and bundles two skills, three command shortcuts, and the `arcade-operator` subagent. The gateway provides tools for email, calendar, chat, issues, docs, and other apps. -Install the Arcade agent plugin in your agent and run your first task against a connected app. +Install the Arcade agent plugin in a supported client and connect to its hosted gateway. @@ -29,6 +29,19 @@ Install the Arcade agent plugin in your agent and run your first task against a +## What's included + +### Skills + +- [`try-arcade`](https://github.com/ArcadeAI/arcade-plugin/blob/v0.3.0/skills/try-arcade/SKILL.md) guides tool selection, app sign-in, and tasks across connected apps. +- [`scale-arcade`](https://github.com/ArcadeAI/arcade-plugin/blob/v0.3.0/skills/scale-arcade/SKILL.md) guides gateway, tool selection, and end-user identity decisions for a proven workflow. + +Skills load when relevant to your request. In Codex and the ChatGPT local runtime, choose `@Arcade` or invoke `$arcade:try-arcade` or `$arcade:scale-arcade`. Codex does not expose these skills as slash commands. + +### Subagent + +The `arcade-operator` subagent executes app tasks in a separate context and returns the outcome. The `try-arcade` skill delegates to it when the client exposes `arcade-operator`. + ## Install @@ -65,8 +78,6 @@ Install the Arcade agent plugin in your agent and run your first task against a 3. Open `/plugins` and confirm **arcade** is installed and enabled. 4. Confirm the **arcade** MCP server is connected. -To invoke Arcade explicitly, choose `@Arcade` or use `$arcade:try-arcade`. For team-rollout guidance, use `$arcade:scale-arcade`. Codex does not expose these skills as slash commands. - @@ -192,17 +203,6 @@ Authorizes an app on demand, so you are not interrupted mid-task. Lists the apps you have connected and lets you disconnect one. -### Skills - -Skills are instructions your agent reads when relevant to a request: - -- `try-arcade` guides tasks across your connected apps, such as replying to a thread or checking your calendar. -- `scale-arcade` guides decisions about using a workflow with a team, including gateway setup, tool selection, and end-user identity. - -### Subagent - -The `arcade-operator` subagent runs an app task in its own context and reports the result. It keeps tool searches and intermediate results out of your main conversation. - ### Rule and hooks The rule and hooks tell your agent when to use Arcade for app tasks. From 73ca09a8b7da36d3b3a8d28073d1dc639d1a8a94 Mon Sep 17 00:00:00 2001 From: Teal Larson Date: Thu, 15 Oct 2026 21:07:14 -0700 Subject: [PATCH 29/42] docs(agent-plugin): separate included components from installation --- app/en/get-started/agent-plugin/_meta.tsx | 5 +- app/en/get-started/agent-plugin/page.mdx | 85 +---------- .../agent-plugin/whats-included/page.mdx | 144 ++++++++++++++++++ public/llms.txt | 1 + tests/mdx-page-metadata.test.ts | 7 +- 5 files changed, 158 insertions(+), 84 deletions(-) create mode 100644 app/en/get-started/agent-plugin/whats-included/page.mdx diff --git a/app/en/get-started/agent-plugin/_meta.tsx b/app/en/get-started/agent-plugin/_meta.tsx index 596d5a14c..490a07d94 100644 --- a/app/en/get-started/agent-plugin/_meta.tsx +++ b/app/en/get-started/agent-plugin/_meta.tsx @@ -2,7 +2,10 @@ import type { MetaRecord } from "nextra"; export const meta: MetaRecord = { index: { - title: "Overview", + title: "Install", + }, + "whats-included": { + title: "What's included", }, }; diff --git a/app/en/get-started/agent-plugin/page.mdx b/app/en/get-started/agent-plugin/page.mdx index 3401fd46c..39258e148 100644 --- a/app/en/get-started/agent-plugin/page.mdx +++ b/app/en/get-started/agent-plugin/page.mdx @@ -10,8 +10,6 @@ import { SignupLink } from "@/app/_components/analytics"; This guide is for agent developers installing Arcade in their own coding agent or desktop client. Personal installs use Arcade's hosted gateway without creating API keys or configuring a gateway. -The plugin connects your agent to Arcade's hosted MCP gateway and bundles two skills, three command shortcuts, and the `arcade-operator` subagent. The gateway provides tools for email, calendar, chat, issues, docs, and other apps. - @@ -21,7 +19,7 @@ Install the Arcade agent plugin in a supported client and connect to its hosted -- A supported client: Cursor, Claude Code, VS Code, GitHub Copilot CLI, Codex, or Claude Desktop +- A [supported client](/get-started/agent-plugin/whats-included#client-support): Cursor, Claude Code, VS Code, GitHub Copilot CLI, Codex, or Claude Desktop - An Arcade account - For Claude Code, Claude Cowork, Cursor CLI, and GitHub Copilot CLI: [Node.js](https://nodejs.org/) on the PATH of the host that launches their routing hooks. Those hooks run `node`. Cursor IDE and Cloud Agents, VS Code, Codex, and Claude Desktop Chat do not need Node.js. @@ -29,19 +27,6 @@ Install the Arcade agent plugin in a supported client and connect to its hosted -## What's included - -### Skills - -- [`try-arcade`](https://github.com/ArcadeAI/arcade-plugin/blob/v0.3.0/skills/try-arcade/SKILL.md) guides tool selection, app sign-in, and tasks across connected apps. -- [`scale-arcade`](https://github.com/ArcadeAI/arcade-plugin/blob/v0.3.0/skills/scale-arcade/SKILL.md) guides gateway, tool selection, and end-user identity decisions for a proven workflow. - -Skills load when relevant to your request. In Codex and the ChatGPT local runtime, choose `@Arcade` or invoke `$arcade:try-arcade` or `$arcade:scale-arcade`. Codex does not expose these skills as slash commands. - -### Subagent - -The `arcade-operator` subagent executes app tasks in a separate context and returns the outcome. The `try-arcade` skill delegates to it when the client exposes `arcade-operator`. - ## Install @@ -156,77 +141,13 @@ Arcade separates [gateway sign-in from app authorization](/learn/server-level-vs After you finish in the browser, return to your agent and continue the original task. Arcade does not resume it for you. -You never give your agent an API key or a password for either layer. To check or manage connections, ask your agent to "Check my Arcade connection," "Show my connected apps," or "Connect Google." You can connect an app before you need it. Clients that support Arcade commands also provide the shortcuts listed below. +You never give your agent an API key or a password for either layer. To check or manage connections, ask your agent to "Check my Arcade connection," "Show my connected apps," or "Connect Google." You can connect an app before you need it. Clients that support Arcade commands also provide [command shortcuts](/get-started/agent-plugin/whats-included#commands). Arcade uses the app connections authorized for your signed-in identity. Authorize only the accounts you intend the agent to use. -### Privacy - -The released plugin turns client-side usage telemetry off in code. No environment setting turns collection on. Requests you make through Arcade still go to its hosted gateway and the apps you authorize. See [Arcade's privacy policy](https://www.arcade.dev/privacy-policy). - -## What you get in each agent - -Every install connects to the same Arcade gateway and gets the same tools. What differs is how much of the rest of the plugin each agent can load. - -| Agent | Tools | Skills | Subagent | Commands | Rule | Hooks | -| ----------------------------------- | :---: | :----: | :------: | :------: | :--: | :------: | -| Cursor IDE and Cloud Agents | ✅ | 2 | ✅ | 3¹ | ✅ | —² | -| Cursor CLI | ✅ | 2 | ✅ | 3 | — | ✅³ | -| Claude Code (CLI and desktop Code tab) | ✅ | 2 | ✅ | 3 | — | ✅ | -| Claude Cowork | ✅ | 2 | ✅ | 3 | — | partial⁴ | -| GitHub Copilot CLI | ✅ | 2 | ✅ | — | — | ✅⁵ | -| VS Code | ✅ | 2 | ✅ | — | — | —⁶ | -| Codex and ChatGPT local runtime | ✅ | 2 | — | — | — | —⁷ | -| Claude Desktop Chat | ✅ | 2 | — | — | — | — | - -- ¹ Cursor IDE lists the commands on the plugin page but does not show them in the `/` menu. -- ² Cursor IDE and Cloud Agents do not run plugin hooks. The always-apply rule carries the routing guidance instead. -- ³ Cursor CLI runs the session hook but does not load the always-apply rule. -- ⁴ Cowork runs the prompt and subagent hooks but does not add the session-start text to the main conversation. -- ⁵ Copilot CLI runs session and subagent hooks, but drops prompt-hook output from configuration files. -- ⁶ VS Code reads the Copilot hook file but cannot run its Agent Plugins hook commands yet. -- ⁷ Codex does not run Agent Plugins lifecycle hooks yet. - -### Commands - -Claude Code and Cowork namespace the commands as `/arcade:arcade-status`, `/arcade:arcade-connect`, and `/arcade:arcade-apps`. - -#### `/arcade-status` - -Reports whether the gateway is reachable, whether you have signed in, and which apps you have authorized. - -#### `/arcade-connect ` - -Authorizes an app on demand, so you are not interrupted mid-task. - -#### `/arcade-apps` - -Lists the apps you have connected and lets you disconnect one. - -### Rule and hooks - -The rule and hooks tell your agent when to use Arcade for app tasks. - -The [Agent Plugins](https://agent-plugins.org) 1.0 specification makes only skills and MCP servers portable. Commands, subagents, hooks, and editor rules require client-specific support. - -### How Arcade chooses a connection - -Arcade prefers the plugin's gateway. If it cannot complete a task for a reason other than sign-in or permission denial, your agent may use another already-authorized connection within the task you approved. It checks the intended app account before using another Arcade gateway. Sign-in and permission failures require your attention. The agent does not switch connections to get around them. The plugin instructs your agent to confirm the action and destination before changing something in an app. - -`arcade-operator` falls back only to another authorized Arcade gateway. Fallback to any other tool belongs to the parent agent. - -## Try it - -- "Send a summary of tomorrow's calendar events to me on Slack." -- "Read my Granola notes from last week, check them against Linear, and file anything I promised that is not a ticket yet. Wait for me before creating anything." -- "Find unread mail that needs a reply. Look the sender up in HubSpot if you can, draft a response, and Slack me the draft before sending." -- "Pull my open GitHub pull requests, my Linear issues, and tomorrow's calendar. Write a standup update and send it to me on Slack." -- "Search my Drive and Notion for the product spec my team uses, then drop a one-paragraph summary in Slack." - -Or ask "What can Arcade do?" and pick a workflow from the answer. - ## Next steps +- [What's included](/get-started/agent-plugin/whats-included): plugin components and client support - [Connect to MCP clients](/get-started/mcp-clients): configure a client against a gateway you control - [Integrations catalog](/resources/integrations): every app and toolkit Arcade supports - [Agentic development](/get-started/setup/connect-arcade-docs): point your agent at these docs with `llms.txt` diff --git a/app/en/get-started/agent-plugin/whats-included/page.mdx b/app/en/get-started/agent-plugin/whats-included/page.mdx new file mode 100644 index 000000000..e3a8c14e6 --- /dev/null +++ b/app/en/get-started/agent-plugin/whats-included/page.mdx @@ -0,0 +1,144 @@ +--- +title: "What's included" +description: "Components bundled with the Arcade agent plugin and support across clients." +--- + +import { Code, Table } from "nextra/components"; + +# What's included + +For agent developers using the Arcade plugin, the package includes a connection to Arcade's hosted MCP gateway, two skills, three command shortcuts, and the `arcade-operator` subagent. + +## MCP server + +The plugin registers an MCP server named `arcade` at `{{ARCADE_PLUGIN_GATEWAY_URL}}`. The gateway provides tools for email, calendar, chat, issues, docs, and other apps. + +## Skills + +- [`try-arcade`](https://github.com/ArcadeAI/arcade-plugin/blob/v0.3.0/skills/try-arcade/SKILL.md) guides tool selection, app sign-in, and tasks across connected apps. +- [`scale-arcade`](https://github.com/ArcadeAI/arcade-plugin/blob/v0.3.0/skills/scale-arcade/SKILL.md) guides gateway, tool selection, and end-user identity decisions for a proven workflow. + +Skills load when relevant to your request. In Codex and the ChatGPT local runtime, choose `@Arcade` or invoke `$arcade:try-arcade` or `$arcade:scale-arcade`. Codex does not expose these skills as slash commands. + +## Subagent + +The `arcade-operator` subagent executes app tasks in a separate context and returns the outcome. The `try-arcade` skill delegates to it when the client exposes `arcade-operator`. + +The plugin's subagent is [not supported in every client](#client-support). + +## Client support + +**Every plugin install includes the Arcade MCP server and both skills.** The clients below load those components. Subagent and command support varies by client. + + + + + Client + Subagent + Commands + + + + + Cursor IDE and Cloud Agents + Yes + 3 (IDE: plugin page, not / menu) + + + Cursor CLI + Yes + 3 + + + Claude Code
CLI and desktop Code tab
+ Yes + 3 (/arcade: prefix) +
+ + Claude Cowork
No session-start text
+ Yes + 3 (/arcade: prefix) +
+ + GitHub Copilot CLI + Yes + None + + + VS Code
No lifecycle hooks
+ Yes + None +
+ + Codex / ChatGPT (local)
No lifecycle hooks.
+ No + None +
+ + Claude Desktop Chat + No + None + + +
+ +
+Routing details by client + +- **Cursor IDE and Cloud Agents:** the always-apply rule provides routing guidance; plugin hooks do not run. +- **Cursor CLI:** only the session hook runs; the always-apply rule does not load. +- **Claude Code:** the session, prompt, and subagent hooks run. +- **Claude Cowork:** prompt and subagent hooks run, but session-start text does not reach the main conversation. +- **GitHub Copilot CLI:** session and subagent hooks run; prompt-hook output from configuration files does not reach the model. +- **VS Code:** reads the Copilot hook file but cannot run its Agent Plugins hook commands yet. +- **Codex:** does not run Agent Plugins lifecycle hooks yet. +- **Claude Desktop Chat:** loads neither the rule nor hooks. + +
+ +## Commands + +Claude Code and Cowork namespace the commands as `/arcade:arcade-status`, `/arcade:arcade-connect`, and `/arcade:arcade-apps`. + +### `/arcade-status` + +Reports whether the gateway is reachable, whether you have signed in, and which apps you have authorized. + +### `/arcade-connect ` + +Authorizes an app on demand, so you are not interrupted mid-task. + +### `/arcade-apps` + +Lists the apps you have connected and lets you disconnect one. + +## Rule and hooks + +The rule and hooks tell your agent when to use Arcade for app tasks. + +The [Agent Plugins](https://agent-plugins.org) 1.0 specification makes only skills and MCP servers portable. Commands, subagents, hooks, and editor rules require client-specific support. + +## How Arcade chooses a connection + +Arcade prefers the plugin's gateway. If it cannot complete a task for a reason other than sign-in or permission denial, your agent may use another already-authorized connection within the task you approved. It checks the intended app account before using another Arcade gateway. Sign-in and permission failures require your attention. The agent does not switch connections to get around them. The plugin instructs your agent to confirm the action and destination before changing something in an app. + +`arcade-operator` falls back only to another authorized Arcade gateway. Fallback to any other tool belongs to the parent agent. + +## Privacy + +The released plugin turns client-side usage telemetry off in code. No environment setting turns collection on. Requests you make through Arcade still go to its hosted gateway and the apps you authorize. See [Arcade's privacy policy](https://www.arcade.dev/privacy-policy). + +## Example requests + +- "Send a summary of tomorrow's calendar events to me on Slack." +- "Read my Granola notes from last week, check them against Linear, and file anything I promised that is not a ticket yet. Wait for me before creating anything." +- "Find unread mail that needs a reply. Look the sender up in HubSpot if you can, draft a response, and Slack me the draft before sending." +- "Pull my open GitHub pull requests, my Linear issues, and tomorrow's calendar. Write a standup update and send it to me on Slack." +- "Search my Drive and Notion for the product spec my team uses, then drop a one-paragraph summary in Slack." + +Or ask "What can Arcade do?" and pick a workflow from the answer. + +## Next steps + +- [Install the Arcade agent plugin](/get-started/agent-plugin): client-native setup and gateway sign-in +- [Integrations catalog](/resources/integrations): supported apps and toolkits diff --git a/public/llms.txt b/public/llms.txt index fb0590919..05f73486c 100644 --- a/public/llms.txt +++ b/public/llms.txt @@ -189,6 +189,7 @@ Arcade docs serve two audiences. Start with the path that matches your goal: - [User Sources](https://docs.arcade.dev/en/operate/identity/user-sources): A User Source connects an MCP Gateway to your OIDC identity provider, allowing end users to sign in with their existing identities instead of requiring Arcade to manage them separately. This documentation guides you through registering an OAuth client with your identity provider and creating a User Source in Arcade to enable production authentication for your gateways. - [User-facing agents](https://docs.arcade.dev/en/build/user-facing-agents): This documentation guides agent developers on building and deploying agents that operate on behalf of end users with proper authorization and authentication. It provides resources for implementing secure authentication in production environments and integrating user authorization into tool-calling workflows. - [What are tools?](https://docs.arcade.dev/en/build/tool-calling): This documentation page explains what tools are in the context of language models and how Arcade enables tool calling—the ability for AI models to interact with external systems and APIs to accomplish tasks beyond text generation. It covers the use cases for tool calling, how it works, the authorization challenges Arcade solves, and introduces Tool Augmented Generation (TAG) as a flexible alternative to retrieval-based approaches. +- [What's included](https://docs.arcade.dev/en/get-started/agent-plugin/whats-included): The Arcade MCP server and skills, subagent and command support by client, and routing and authorization boundaries. - [Why evaluate tools?](https://docs.arcade.dev/en/build/create-tools/evaluate-tools/why-evaluate): Tool evaluations ensure AI models use your tools correctly in production by measuring whether the model selects the right tools and provides accurate parameters before deployment. Without evaluation, models risk misinterpreting user intents, providing incorrect arguments, or skipping necessary tool calls, which Arcade's evaluation framework helps prevent by comparing actual tool calls against expected ones and scoring them based on tool selection and parameter accuracy. - [Windows environment setup](https://docs.arcade.dev/en/get-started/setup/windows-environment): This documentation page provides step-by-step instructions for setting up the Arcade CLI on Windows, emphasizing the use of the `uv` package manager while offering fallback options with `pip`. It includes prerequisites, installation methods, validation steps, and troubleshooting tips to ensure diff --git a/tests/mdx-page-metadata.test.ts b/tests/mdx-page-metadata.test.ts index ec5378946..c9d182ca9 100644 --- a/tests/mdx-page-metadata.test.ts +++ b/tests/mdx-page-metadata.test.ts @@ -2,6 +2,8 @@ import { existsSync, readFileSync } from "node:fs"; import { readdir } from "node:fs/promises"; import { join, relative } from "node:path"; import type { NextConfig } from "next"; +import { createElement } from "react"; +import { renderToStaticMarkup } from "react-dom/server"; import { describe, expect, test } from "vitest"; import { stripMarkdownFromSwcPageExtensions } from "../lib/swc-page-extensions"; @@ -228,7 +230,10 @@ describe("MDX pages", () => { } const renderedTitle = readFileSync(html, "utf8").match(HTML_TITLE_RE)?.[1] ?? ""; - if (!renderedTitle.includes(frontmatterTitle)) { + const escapedTitle = renderToStaticMarkup( + createElement("title", null, frontmatterTitle) + ).match(HTML_TITLE_RE)?.[1]; + if (!(escapedTitle && renderedTitle.includes(escapedTitle))) { mismatches.push( `${relative(process.cwd(), page)}: expected "${frontmatterTitle}" in "${renderedTitle}"` ); From 0b57760b3849d750fcea9b23b78322e76542b35a Mon Sep 17 00:00:00 2001 From: Teal Larson Date: Thu, 15 Oct 2026 21:16:41 -0700 Subject: [PATCH 30/42] docs(agent-plugin): align simplest native install paths --- app/en/get-started/agent-plugin/page.mdx | 55 ++++++++++++++++++++---- 1 file changed, 46 insertions(+), 9 deletions(-) diff --git a/app/en/get-started/agent-plugin/page.mdx b/app/en/get-started/agent-plugin/page.mdx index 39258e148..7a13579d0 100644 --- a/app/en/get-started/agent-plugin/page.mdx +++ b/app/en/get-started/agent-plugin/page.mdx @@ -36,18 +36,33 @@ Install the Arcade agent plugin in a supported client and connect to its hosted repository and are not pinned to a release.
- + -1. Add the Arcade marketplace and install the plugin: +Requires [Claude Code 2.1.292 or later](https://code.claude.com/docs/en/discover-plugins#add-and-install-from-your-shell). + +1. Install Arcade: ```bash - claude plugin marketplace add {{ARCADE_PLUGIN_REPO}} - claude plugin install arcade@arcade + claude plugin install arcade --marketplace {{ARCADE_PLUGIN_REPO}} ``` 2. Run `/reload-plugins` if Claude Code is already open. -3. Verify the install with `claude plugin list` or `/plugin`. +3. Run `/arcade:try-arcade` to start. + +
+Earlier Claude Code versions + +Add the marketplace, then install the plugin: + +```bash +claude plugin marketplace add {{ARCADE_PLUGIN_REPO}} +claude plugin install arcade@arcade +``` + +Run `/reload-plugins` if Claude Code is already open. + +
@@ -62,6 +77,7 @@ Install the Arcade agent plugin in a supported client and connect to its hosted 2. Start a new Codex session or ChatGPT desktop chat. 3. Open `/plugins` and confirm **arcade** is installed and enabled. 4. Confirm the **arcade** MCP server is connected. +5. Choose `@Arcade` or invoke `$arcade:try-arcade` to start. @@ -78,6 +94,7 @@ For an individual plan, or a Teams or Enterprise plan with **Allow Local Plugin 2. Run **Developer: Reload Window**. 3. Open **Customize** and confirm the two Arcade skills, `arcade-operator`, rule, and MCP server are present. +4. Run `/try-arcade` to start. Keep the clone inside `~/.cursor/plugins/local/`. Cursor ignores symlinks to folders outside that directory. @@ -107,6 +124,7 @@ Enterprise turns **Allow Local Plugin Imports** off by default. When it is off, 4. Confirm **Arcade** appears under **Agent Plugins → Installed**. 5. Run **MCP: List Servers**, select **arcade**, and choose **Start Server**. 6. Sign in when prompted, then return to VS Code and continue the original task. +7. Run `/arcade:try-arcade` to start. @@ -118,16 +136,35 @@ Enterprise turns **Allow Local Plugin Imports** off by default. When it is off, ``` 2. Restart the session or run `/restart`. +3. Run `/try-arcade` to start. -1. Open **Customize → Plugins → Add marketplace → Add from a repository**. +Requires a [paid Claude plan](https://support.claude.com/en/articles/13837440-use-plugins-in-claude). On Team or Enterprise, your organization must allow this marketplace. + +1. Open **Customize → Plugins → Add → Add marketplace → Add from a repository**. 2. Paste `{{ARCADE_PLUGIN_REPO}}`. -3. Install **Arcade** (`arcade@arcade`). -4. Start a new conversation. +3. Add **Arcade** from the marketplace. +4. Open **Arcade → Connectors**, then add and connect **arcade** if it is not connected. Sign in to Arcade when prompted. +5. Start a new conversation and ask "What can Arcade do?" + +On Team or Enterprise, an Owner may need to [add the connector for your organization](https://claude.com/docs/plugins/overview#bundled-connectors) before you can connect it with your account. + +Use this flow for Desktop Chat and Cowork. [Installing from the Claude Code command line does not add the plugin to your Claude account](https://claude.com/docs/plugins/overview#find-the-plugin-in-each-app). + + + + +Your client must support remote HTTP MCP servers and browser sign-in. This connection includes tools only; it does not install the plugin's skills, subagent, or commands. + +1. Add an HTTP MCP server with this URL in your client's MCP settings: + + ```text + {{ARCADE_PLUGIN_GATEWAY_URL}} + ``` -For Claude Code inside the desktop app, you can also use the commands in the **Claude Code** tab. +2. Sign in to Arcade in the browser when prompted, then return to your client.
From 12e1a3edb0a4c265e533c8e9f33b75e49e50319c Mon Sep 17 00:00:00 2001 From: Teal Larson Date: Fri, 16 Oct 2026 01:42:40 -0700 Subject: [PATCH 31/42] docs(agent-plugin): clarify VS Code routing guidance --- app/en/get-started/agent-plugin/whats-included/page.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/en/get-started/agent-plugin/whats-included/page.mdx b/app/en/get-started/agent-plugin/whats-included/page.mdx index e3a8c14e6..2e08faad2 100644 --- a/app/en/get-started/agent-plugin/whats-included/page.mdx +++ b/app/en/get-started/agent-plugin/whats-included/page.mdx @@ -65,7 +65,7 @@ The plugin's subagent is [not supported in every client](#client-support). None - VS Code
No lifecycle hooks
+ VS Code Yes None
@@ -90,7 +90,7 @@ The plugin's subagent is [not supported in every client](#client-support). - **Claude Code:** the session, prompt, and subagent hooks run. - **Claude Cowork:** prompt and subagent hooks run, but session-start text does not reach the main conversation. - **GitHub Copilot CLI:** session and subagent hooks run; prompt-hook output from configuration files does not reach the model. -- **VS Code:** reads the Copilot hook file but cannot run its Agent Plugins hook commands yet. +- **VS Code:** use `try-arcade` for app tasks and `scale-arcade` for team or organization rollout. - **Codex:** does not run Agent Plugins lifecycle hooks yet. - **Claude Desktop Chat:** loads neither the rule nor hooks. From be16fe0fb3e227d7c7d13d6391a0e2c8596f0b06 Mon Sep 17 00:00:00 2001 From: Teal Larson Date: Fri, 16 Oct 2026 01:50:00 -0700 Subject: [PATCH 32/42] docs(agent-plugin): document VS Code Copilot routing hooks --- app/en/get-started/agent-plugin/whats-included/page.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/en/get-started/agent-plugin/whats-included/page.mdx b/app/en/get-started/agent-plugin/whats-included/page.mdx index 2e08faad2..6061821ad 100644 --- a/app/en/get-started/agent-plugin/whats-included/page.mdx +++ b/app/en/get-started/agent-plugin/whats-included/page.mdx @@ -65,7 +65,7 @@ The plugin's subagent is [not supported in every client](#client-support). None - VS Code + VS Code (Copilot sessions)
Session and subagent hooks
Yes None
@@ -90,7 +90,7 @@ The plugin's subagent is [not supported in every client](#client-support). - **Claude Code:** the session, prompt, and subagent hooks run. - **Claude Cowork:** prompt and subagent hooks run, but session-start text does not reach the main conversation. - **GitHub Copilot CLI:** session and subagent hooks run; prompt-hook output from configuration files does not reach the model. -- **VS Code:** use `try-arcade` for app tasks and `scale-arcade` for team or organization rollout. +- **VS Code:** in VS Code's Copilot sessions, Arcade adds routing guidance when a session or subagent starts. - **Codex:** does not run Agent Plugins lifecycle hooks yet. - **Claude Desktop Chat:** loads neither the rule nor hooks. From 13b49da471cc25318ed4cd464ee342bff672e2aa Mon Sep 17 00:00:00 2001 From: Teal Larson Date: Sun, 18 Oct 2026 12:29:13 -0400 Subject: [PATCH 33/42] docs: explain ChatGPT ZIP download and mobile installation limits --- app/en/get-started/agent-plugin/page.mdx | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/app/en/get-started/agent-plugin/page.mdx b/app/en/get-started/agent-plugin/page.mdx index 7a13579d0..8b43594da 100644 --- a/app/en/get-started/agent-plugin/page.mdx +++ b/app/en/get-started/agent-plugin/page.mdx @@ -169,6 +169,22 @@ Your client must support remote HTTP MCP servers and browser sign-in. This conne
+## Install the ChatGPT ZIP + +This path requires a ChatGPT account with plugin upload access. For a managed workspace, an eligible owner or admin uploads the plugin; members install it from their workspace's plugin directory. + +1. Open [Arcade's official plugin releases](https://github.com/ArcadeAI/arcade-plugin/releases) in your browser. +2. Expand **Assets** on a release that includes the ChatGPT plugin and download `arcade-chatgpt-{VERSION}.zip`. Do not use GitHub's **Source code (zip)** download. If the ChatGPT ZIP is absent, that release does not include it. +3. Keep the file compressed. On iPhone, Safari downloads appear in **Files → Browse → iCloud Drive → Downloads**, unless you chose another download location. On Android, find the file in Chrome's **Downloads** or your Files app. +4. Open [ChatGPT on the web](https://chatgpt.com) in the account and workspace where you want to install Arcade. Use the plugin upload option available to your account and select the downloaded ZIP. For eligible workspace owners and admins, the path is **Admin console → your workspace → Plugins → Add → Upload plugin**. +5. Select **Install plugin** if prompted, then connect Arcade and sign in when prompted. + +If you don't see an upload option, check your account's access or ask your workspace admin. Uploading a ZIP to an ordinary chat does not install it. This installation flow is separate from submitting a plugin for public publication. + +**Using a phone:** OpenAI documents plugin-directory installation in the mobile apps, but does not document ZIP upload in those apps or guarantee it in a mobile browser. Use ChatGPT web on a computer if the upload control is unavailable on your phone. After a workspace admin makes Arcade available, install it from that workspace's plugin directory in the mobile app. + +See [OpenAI's plugin installation guide](https://help.openai.com/en/articles/20001256-plugins-in-chatgpt), [Apple's download instructions](https://support.apple.com/en-us/102440), and [Chrome's Android download instructions](https://support.google.com/chrome/answer/95759?co=GENIE.Platform%3DAndroid&hl=en-GB). + ## Sign in Arcade separates [gateway sign-in from app authorization](/learn/server-level-vs-tool-level-auth): From 0a17bbfeefa8146c34f9c2a472acaa12c75d7196 Mon Sep 17 00:00:00 2001 From: Teal Larson Date: Sun, 18 Oct 2026 12:35:35 -0400 Subject: [PATCH 34/42] docs: distinguish plugin upload from runtime availability --- app/en/get-started/agent-plugin/page.mdx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/en/get-started/agent-plugin/page.mdx b/app/en/get-started/agent-plugin/page.mdx index 8b43594da..af738b88b 100644 --- a/app/en/get-started/agent-plugin/page.mdx +++ b/app/en/get-started/agent-plugin/page.mdx @@ -183,6 +183,8 @@ If you don't see an upload option, check your account's access or ask your works **Using a phone:** OpenAI documents plugin-directory installation in the mobile apps, but does not document ZIP upload in those apps or guarantee it in a mobile browser. Use ChatGPT web on a computer if the upload control is unavailable on your phone. After a workspace admin makes Arcade available, install it from that workspace's plugin directory in the mobile app. +Upload availability and where a plugin can run are separate. Plugins marked **Desktop only** require the ChatGPT desktop app. + See [OpenAI's plugin installation guide](https://help.openai.com/en/articles/20001256-plugins-in-chatgpt), [Apple's download instructions](https://support.apple.com/en-us/102440), and [Chrome's Android download instructions](https://support.google.com/chrome/answer/95759?co=GENIE.Platform%3DAndroid&hl=en-GB). ## Sign in From ee58ea8cf07054d60505c6d9cdb52c1238eadefd Mon Sep 17 00:00:00 2001 From: Teal Larson Date: Mon, 19 Oct 2026 11:47:49 -0400 Subject: [PATCH 35/42] Remove plugin substitutions and unpublished redirects --- lib/agent-plugin.ts | 13 ------ lib/remark-substitute.ts | 60 ------------------------ next.config.ts | 2 - redirects.ts | 31 ------------- tests/broken-link-check.test.ts | 11 +---- tests/remark-substitute.test.ts | 82 --------------------------------- 6 files changed, 1 insertion(+), 198 deletions(-) delete mode 100644 lib/agent-plugin.ts delete mode 100644 lib/remark-substitute.ts delete mode 100644 tests/remark-substitute.test.ts diff --git a/lib/agent-plugin.ts b/lib/agent-plugin.ts deleted file mode 100644 index 49346c987..000000000 --- a/lib/agent-plugin.ts +++ /dev/null @@ -1,13 +0,0 @@ -/** - * Every install surface for the Arcade agent plugin resolves from the values - * here. Swapping these constants updates the prose, the copyable commands, and - * the one-click install links together. - * - * MDX pages reach these through `{{TOKEN}}` placeholders — see - * `lib/remark-substitute.ts` for the token list. - */ -export const AGENT_PLUGIN_ENGINE_PUBLIC_URL = "https://api.arcade.dev"; -export const AGENT_PLUGIN_GATEWAY_SLUG = "arcade"; -export const AGENT_PLUGIN_GATEWAY_URL = `${AGENT_PLUGIN_ENGINE_PUBLIC_URL}/mcp/${AGENT_PLUGIN_GATEWAY_SLUG}`; - -export const AGENT_PLUGIN_REPO = "ArcadeAI/arcade-plugin"; diff --git a/lib/remark-substitute.ts b/lib/remark-substitute.ts deleted file mode 100644 index ab71fb90d..000000000 --- a/lib/remark-substitute.ts +++ /dev/null @@ -1,60 +0,0 @@ -import type { Root } from "mdast"; -import { visit } from "unist-util-visit"; -import { AGENT_PLUGIN_GATEWAY_URL, AGENT_PLUGIN_REPO } from "./agent-plugin"; - -/** - * Tokens an MDX page can write as `{{NAME}}`. Prose, inline code, fenced code - * blocks, and link targets all resolve them, which is why pages use these - * instead of importing the constants directly — a fenced code block cannot - * interpolate JavaScript. - */ -export const substitutions: Record = { - ARCADE_PLUGIN_GATEWAY_URL: AGENT_PLUGIN_GATEWAY_URL, - ARCADE_PLUGIN_REPO: AGENT_PLUGIN_REPO, -}; - -/** - * Unknown tokens are left alone. Auth provider reference pages already write - * OAuth placeholders such as `{{client_id}}`, and those have to survive to the - * rendered page. - */ -export function applySubstitutions(value: string): string { - let result = value; - for (const [token, replacement] of Object.entries(substitutions)) { - result = result.split(`{{${token}}}`).join(replacement); - } - return result; -} - -/** - * The shape of a VFile that this plugin touches. Declared here so the plugin - * does not depend on `vfile` directly. - */ -type SourceFile = { value?: unknown }; - -export function remarkSubstitute() { - return (tree: Root, file: SourceFile) => { - // Nextra exports the untouched source string alongside the AST, and that - // copy is what feeds the "copy page" button and the markdown the site - // serves to agents. Substitute there too, or those readers get the raw - // token. - if (typeof file.value === "string") { - file.value = applySubstitutions(file.value); - } - - visit(tree, (node) => { - if ( - node.type === "text" || - node.type === "inlineCode" || - node.type === "code" - ) { - node.value = applySubstitutions(node.value); - return; - } - - if (node.type === "link" || node.type === "definition") { - node.url = applySubstitutions(node.url); - } - }); - }; -} diff --git a/next.config.ts b/next.config.ts index e9da6d70c..c6a53a2a5 100644 --- a/next.config.ts +++ b/next.config.ts @@ -2,7 +2,6 @@ import type { NextConfig } from "next"; import nextra from "nextra"; import { withLlmsTxt } from "./lib/next-plugin-llmstxt"; import { remarkGlossary } from "./lib/remark-glossary"; -import { remarkSubstitute } from "./lib/remark-substitute"; import { stripMarkdownFromSwcPageExtensions } from "./lib/swc-page-extensions"; import { redirects } from "./redirects"; @@ -17,7 +16,6 @@ const withNextra = nextra({ remarkGlossary, { glossaryPath: "./app/en/resources/glossary/page.mdx" }, ], - remarkSubstitute, ], }, }); diff --git a/redirects.ts b/redirects.ts index 9c19f39c7..115babd0a 100644 --- a/redirects.ts +++ b/redirects.ts @@ -16,27 +16,6 @@ export type Redirect = { }; export const redirects: Redirect[] = [ - // Retired agent-plugin guides. - { - source: "/:locale/get-started/agent-plugin/tools-only", - destination: "/:locale/get-started/agent-plugin", - permanent: true, - }, - { - source: "/:locale/get-started/agent-plugin/tools-only/claude-desktop", - destination: "/:locale/get-started/agent-plugin", - permanent: true, - }, - { - source: "/:locale/get-started/agent-plugin/tools-only/any-mcp-client", - destination: "/:locale/get-started/mcp-clients", - permanent: true, - }, - { - source: "/:locale/get-started/agent-plugin/team-rollout", - destination: "/:locale/operate/governance/mcp-gateways", - permanent: true, - }, // The toolkit-page breadcrumb links "Resources" -> /resources, which has // no index page. Send it to the integrations registry instead of 404ing. { @@ -1196,14 +1175,4 @@ export const redirects: Redirect[] = [ destination: "/:locale/build", permanent: true, }, - { - source: "/:locale/get-started/agent-plugin/any-mcp-client", - destination: "/:locale/get-started/mcp-clients", - permanent: true, - }, - { - source: "/:locale/get-started/agent-plugin/claude-desktop", - destination: "/:locale/get-started/agent-plugin", - permanent: true, - }, ]; diff --git a/tests/broken-link-check.test.ts b/tests/broken-link-check.test.ts index d505e97da..593a89eac 100644 --- a/tests/broken-link-check.test.ts +++ b/tests/broken-link-check.test.ts @@ -3,7 +3,6 @@ import { join } from "node:path"; import fg from "fast-glob"; import { scanURLs, validateFiles } from "next-validate-link"; import { expect, test } from "vitest"; -import { applySubstitutions } from "@/lib/remark-substitute"; import { INTEGRATION_CATEGORIES, normalizeToolkitId, @@ -257,15 +256,7 @@ test( return false; }; - // Pages write `{{TOKEN}}` placeholders for values that live in one place in - // the codebase, so resolve them before validating or the checker sees the - // literal token as a relative path. - const files = (await fg("app/**/*.{md,mdx}")).map((path) => ({ - path, - content: applySubstitutions(readFileSync(path, "utf-8")), - })); - - const found = await validateFiles(files, { + const found = await validateFiles(await fg("app/**/*.{md,mdx}"), { scanned, whitelist, }); diff --git a/tests/remark-substitute.test.ts b/tests/remark-substitute.test.ts deleted file mode 100644 index 5be6e3dc5..000000000 --- a/tests/remark-substitute.test.ts +++ /dev/null @@ -1,82 +0,0 @@ -import type { Code, Link, Paragraph, Root, Text } from "mdast"; -import { describe, expect, it } from "vitest"; -import { AGENT_PLUGIN_GATEWAY_URL } from "@/lib/agent-plugin"; -import { applySubstitutions, remarkSubstitute } from "@/lib/remark-substitute"; - -const substitute = remarkSubstitute(); - -describe("applySubstitutions", () => { - it("replaces a known token", () => { - expect(applySubstitutions("Paste {{ARCADE_PLUGIN_GATEWAY_URL}}")).toBe( - `Paste ${AGENT_PLUGIN_GATEWAY_URL}` - ); - }); - - it("replaces every occurrence of a token", () => { - const result = applySubstitutions( - "{{ARCADE_PLUGIN_REPO}} and {{ARCADE_PLUGIN_REPO}}" - ); - expect(result).toBe("ArcadeAI/arcade-plugin and ArcadeAI/arcade-plugin"); - }); - - it("leaves unknown tokens alone so OAuth placeholders survive", () => { - expect(applySubstitutions('client_id: "{{client_id}}"')).toBe( - 'client_id: "{{client_id}}"' - ); - }); -}); - -describe("remarkSubstitute", () => { - it("substitutes in the raw source Nextra exports for copy-page and agents", () => { - const file = { - value: "Paste {{ARCADE_PLUGIN_GATEWAY_URL}} as an MCP server.", - }; - const tree: Root = { type: "root", children: [] }; - - substitute(tree, file); - - expect(file.value).toBe( - `Paste ${AGENT_PLUGIN_GATEWAY_URL} as an MCP server.` - ); - }); - - it("substitutes inside fenced code blocks", () => { - const code: Code = { - type: "code", - lang: "text", - value: "{{ARCADE_PLUGIN_GATEWAY_URL}}", - }; - const tree: Root = { type: "root", children: [code] }; - - substitute(tree, {}); - - expect(code.value).toBe(AGENT_PLUGIN_GATEWAY_URL); - }); - - it("substitutes inside link targets", () => { - const link: Link = { - type: "link", - url: "{{ARCADE_PLUGIN_GATEWAY_URL}}", - children: [], - }; - const paragraph: Paragraph = { type: "paragraph", children: [link] }; - const tree: Root = { type: "root", children: [paragraph] }; - - substitute(tree, {}); - - expect(link.url).toBe(AGENT_PLUGIN_GATEWAY_URL); - }); - - it("substitutes inside prose", () => { - const text: Text = { - type: "text", - value: "Install {{ARCADE_PLUGIN_REPO}} to start.", - }; - const paragraph: Paragraph = { type: "paragraph", children: [text] }; - const tree: Root = { type: "root", children: [paragraph] }; - - substitute(tree, {}); - - expect(text.value).toBe("Install ArcadeAI/arcade-plugin to start."); - }); -}); From 24e9b8e0862256e882cd5e530b9fc2148a1380ab Mon Sep 17 00:00:00 2001 From: Teal Larson Date: Mon, 19 Oct 2026 11:49:26 -0400 Subject: [PATCH 36/42] docs: clarify plugin installation and project secrets --- app/en/get-started/agent-plugin/page.mdx | 112 +++++++----------- .../agent-plugin/whats-included/page.mdx | 50 ++------ .../mcp-clients/claude-code/page.mdx | 6 +- .../mcp-clients/claude-desktop/page.mdx | 7 +- .../get-started/mcp-clients/cursor/page.mdx | 6 +- .../mcp-clients/github-copilot/page.mdx | 6 +- app/en/get-started/mcp-clients/page.mdx | 4 +- .../mcp-clients/visual-studio-code/page.mdx | 6 +- 8 files changed, 67 insertions(+), 130 deletions(-) diff --git a/app/en/get-started/agent-plugin/page.mdx b/app/en/get-started/agent-plugin/page.mdx index af738b88b..f0637c90c 100644 --- a/app/en/get-started/agent-plugin/page.mdx +++ b/app/en/get-started/agent-plugin/page.mdx @@ -1,14 +1,14 @@ --- title: "Install the Arcade agent plugin" -description: "Install Arcade in Cursor, Claude Code, VS Code, GitHub Copilot CLI, Codex, or Claude Desktop. Your agent gets tools for every app you connect, with browser sign-in and no API keys." +description: "Install Arcade in Cursor, Claude Code, VS Code, GitHub Copilot CLI, Codex, or Claude Desktop. Connect your agent to apps through Arcade with browser sign-in." --- -import { Callout, Tabs } from "nextra/components"; +import { Tabs } from "nextra/components"; import { SignupLink } from "@/app/_components/analytics"; # Install the Arcade agent plugin -This guide is for agent developers installing Arcade in their own coding agent or desktop client. Personal installs use Arcade's hosted gateway without creating API keys or configuring a gateway. +For agent developers, the Arcade plugin connects your coding agent or desktop client to apps through Arcade's hosted gateway. Sign in with your Arcade account. You don't need an Arcade API key or a gateway configuration. @@ -21,7 +21,7 @@ Install the Arcade agent plugin in a supported client and connect to its hosted - A [supported client](/get-started/agent-plugin/whats-included#client-support): Cursor, Claude Code, VS Code, GitHub Copilot CLI, Codex, or Claude Desktop - An Arcade account -- For Claude Code, Claude Cowork, Cursor CLI, and GitHub Copilot CLI: [Node.js](https://nodejs.org/) on the PATH of the host that launches their routing hooks. Those hooks run `node`. Cursor IDE and Cloud Agents, VS Code, Codex, and Claude Desktop Chat do not need Node.js. +- For Claude Code, Claude Cowork, Cursor CLI, and GitHub Copilot CLI: [Node.js](https://nodejs.org/) on the host's `PATH` @@ -29,86 +29,82 @@ Install the Arcade agent plugin in a supported client and connect to its hosted ## Install - - The cross-client `npx plugins add` command does not finish every client - install. Use the client-native steps below so the gateway and every supported - plugin component load together. The install commands below use the plugin - repository and are not pinned to a release. - - -Requires [Claude Code 2.1.292 or later](https://code.claude.com/docs/en/discover-plugins#add-and-install-from-your-shell). +Use [Claude Code 2.1.292 or later](https://code.claude.com/docs/en/discover-plugins#add-and-install-from-your-shell), or expand the earlier-version instructions. 1. Install Arcade: ```bash - claude plugin install arcade --marketplace {{ARCADE_PLUGIN_REPO}} + claude plugin install arcade --marketplace ArcadeAI/arcade-plugin ``` 2. Run `/reload-plugins` if Claude Code is already open. -3. Run `/arcade:try-arcade` to start. +3. Open `/mcp`, select **arcade**, and sign in to Arcade in the browser when prompted. +4. Run `/arcade:try-arcade` to start.
Earlier Claude Code versions -Add the marketplace, then install the plugin: +Use these commands for step 1: ```bash -claude plugin marketplace add {{ARCADE_PLUGIN_REPO}} +claude plugin marketplace add ArcadeAI/arcade-plugin claude plugin install arcade@arcade ``` -Run `/reload-plugins` if Claude Code is already open. -
+Use this installation for a [Codex session in the CLI or ChatGPT desktop app](https://developers.openai.com/plugins/build/plugins#enable-or-disable-a-plugin-for-a-repo). + 1. Add the Arcade marketplace and install the plugin: ```bash - codex plugin marketplace add {{ARCADE_PLUGIN_REPO}} + codex plugin marketplace add ArcadeAI/arcade-plugin codex plugin add arcade@arcade ``` -2. Start a new Codex session or ChatGPT desktop chat. +2. Start a new Codex session in the CLI or ChatGPT desktop app. 3. Open `/plugins` and confirm **arcade** is installed and enabled. -4. Confirm the **arcade** MCP server is connected. +4. Connect the **arcade** MCP server and sign in to Arcade in the browser when prompted. 5. Choose `@Arcade` or invoke `$arcade:try-arcade` to start. -**Local installation** +**Team marketplace** + +1. An admin opens **Dashboard → Plugins & MCPs → Team Marketplaces → Add Marketplace → Import from Repo** and pastes `https://github.com/ArcadeAI/arcade-plugin`. +2. The admin adds Arcade to the marketplace and sets access in **Marketplace Settings**. To receive repository updates, enable **Auto Refresh**. GitHub imports require the Cursor GitHub App on the repository. +3. Open **Customize**, find **Arcade**, and select **Install**. +4. Connect the **arcade** MCP server and sign in to Arcade in the browser when prompted. +5. Run `/try-arcade` to start. + +See [Cursor's marketplace instructions](https://cursor.com/docs/plugins#add-a-team-marketplace) for access and refresh settings. + +
+Local installation For an individual plan, or a Teams or Enterprise plan with **Allow Local Plugin Imports** enabled: 1. Clone the plugin into Cursor's local plugin directory: ```bash - git clone https://github.com/{{ARCADE_PLUGIN_REPO}} ~/.cursor/plugins/local/arcade-plugin + git clone https://github.com/ArcadeAI/arcade-plugin ~/.cursor/plugins/local/arcade-plugin ``` 2. Run **Developer: Reload Window**. -3. Open **Customize** and confirm the two Arcade skills, `arcade-operator`, rule, and MCP server are present. -4. Run `/try-arcade` to start. - -Keep the clone inside `~/.cursor/plugins/local/`. Cursor ignores symlinks to folders outside that directory. - -To update the plugin later: - -1. Run `git pull` in `~/.cursor/plugins/local/arcade-plugin`. -2. Run **Developer: Reload Window**. +3. Open **Customize** and confirm Arcade is present. +4. Connect the **arcade** MCP server and sign in to Arcade in the browser when prompted. +5. Run `/try-arcade` to start. -**Team marketplace alternative** +Keep the clone inside `~/.cursor/plugins/local/`. Cursor ignores symlinks to folders outside that directory. To update, run `git pull` in the clone and **Developer: Reload Window**. -Enterprise turns **Allow Local Plugin Imports** off by default. When it is off, Cursor ignores `~/.cursor/plugins/local`. Use a team marketplace: - -1. An admin opens **Dashboard → Plugins & MCPs → Team Marketplaces → Add Marketplace → Import from Repo** and pastes `https://github.com/{{ARCADE_PLUGIN_REPO}}`. -2. Each person opens **Customize**, finds **Arcade**, and selects **Install**. +
@@ -117,7 +113,7 @@ Enterprise turns **Allow Local Plugin Imports** off by default. When it is off, 2. Paste the repository URL: ```text - https://github.com/{{ARCADE_PLUGIN_REPO}} + https://github.com/ArcadeAI/arcade-plugin ``` 3. Turn on `chat.plugins.enabled` if needed, then reload VS Code. @@ -132,11 +128,12 @@ Enterprise turns **Allow Local Plugin Imports** off by default. When it is off, 1. Install with Copilot CLI's plugin command: ```bash - copilot plugin install {{ARCADE_PLUGIN_REPO}} + copilot plugin install ArcadeAI/arcade-plugin ``` 2. Restart the session or run `/restart`. -3. Run `/try-arcade` to start. +3. Connect the **arcade** MCP server and sign in to Arcade in the browser when prompted. +4. Run `/try-arcade` to start. @@ -144,7 +141,7 @@ Enterprise turns **Allow Local Plugin Imports** off by default. When it is off, Requires a [paid Claude plan](https://support.claude.com/en/articles/13837440-use-plugins-in-claude). On Team or Enterprise, your organization must allow this marketplace. 1. Open **Customize → Plugins → Add → Add marketplace → Add from a repository**. -2. Paste `{{ARCADE_PLUGIN_REPO}}`. +2. Paste `ArcadeAI/arcade-plugin`. 3. Add **Arcade** from the marketplace. 4. Open **Arcade → Connectors**, then add and connect **arcade** if it is not connected. Sign in to Arcade when prompted. 5. Start a new conversation and ask "What can Arcade do?" @@ -161,7 +158,7 @@ Your client must support remote HTTP MCP servers and browser sign-in. This conne 1. Add an HTTP MCP server with this URL in your client's MCP settings: ```text - {{ARCADE_PLUGIN_GATEWAY_URL}} + https://api.arcade.dev/mcp/arcade ``` 2. Sign in to Arcade in the browser when prompted, then return to your client. @@ -169,36 +166,13 @@ Your client must support remote HTTP MCP servers and browser sign-in. This conne
-## Install the ChatGPT ZIP - -This path requires a ChatGPT account with plugin upload access. For a managed workspace, an eligible owner or admin uploads the plugin; members install it from their workspace's plugin directory. - -1. Open [Arcade's official plugin releases](https://github.com/ArcadeAI/arcade-plugin/releases) in your browser. -2. Expand **Assets** on a release that includes the ChatGPT plugin and download `arcade-chatgpt-{VERSION}.zip`. Do not use GitHub's **Source code (zip)** download. If the ChatGPT ZIP is absent, that release does not include it. -3. Keep the file compressed. On iPhone, Safari downloads appear in **Files → Browse → iCloud Drive → Downloads**, unless you chose another download location. On Android, find the file in Chrome's **Downloads** or your Files app. -4. Open [ChatGPT on the web](https://chatgpt.com) in the account and workspace where you want to install Arcade. Use the plugin upload option available to your account and select the downloaded ZIP. For eligible workspace owners and admins, the path is **Admin console → your workspace → Plugins → Add → Upload plugin**. -5. Select **Install plugin** if prompted, then connect Arcade and sign in when prompted. - -If you don't see an upload option, check your account's access or ask your workspace admin. Uploading a ZIP to an ordinary chat does not install it. This installation flow is separate from submitting a plugin for public publication. - -**Using a phone:** OpenAI documents plugin-directory installation in the mobile apps, but does not document ZIP upload in those apps or guarantee it in a mobile browser. Use ChatGPT web on a computer if the upload control is unavailable on your phone. After a workspace admin makes Arcade available, install it from that workspace's plugin directory in the mobile app. - -Upload availability and where a plugin can run are separate. Plugins marked **Desktop only** require the ChatGPT desktop app. - -See [OpenAI's plugin installation guide](https://help.openai.com/en/articles/20001256-plugins-in-chatgpt), [Apple's download instructions](https://support.apple.com/en-us/102440), and [Chrome's Android download instructions](https://support.google.com/chrome/answer/95759?co=GENIE.Platform%3DAndroid&hl=en-GB). - -## Sign in - -Arcade separates [gateway sign-in from app authorization](/learn/server-level-vs-tool-level-auth): - -1. **Into the gateway.** Your client asks you to sign in when it first connects. Sign in to Arcade in the browser so your client can connect to the gateway. -2. **Into each app.** When a task needs an app, your agent gives you a browser sign-in link for the required permissions. After approval, Arcade stores the authorization. You may need to reconnect if the connection expires or a later task needs additional permissions. +## Connect apps -After you finish in the browser, return to your agent and continue the original task. Arcade does not resume it for you. +[Gateway sign-in and app authorization are separate](/learn/server-level-vs-tool-level-auth). After connecting the gateway during installation, ask your agent to use an app. If the app needs authorization, follow the browser sign-in link and approve the required permissions. -You never give your agent an API key or a password for either layer. To check or manage connections, ask your agent to "Check my Arcade connection," "Show my connected apps," or "Connect Google." You can connect an app before you need it. Clients that support Arcade commands also provide [command shortcuts](/get-started/agent-plugin/whats-included#commands). +Return to your agent after sign-in and continue the task. To manage connections, ask "Show my connected apps" or "Connect Google." -Arcade uses the app connections authorized for your signed-in identity. Authorize only the accounts you intend the agent to use. +Some tools require a provider API key or another secret. See [default-project setup](/get-started/agent-plugin/whats-included#projects-and-secrets) before using those tools. ## Next steps diff --git a/app/en/get-started/agent-plugin/whats-included/page.mdx b/app/en/get-started/agent-plugin/whats-included/page.mdx index 6061821ad..fa8af23d2 100644 --- a/app/en/get-started/agent-plugin/whats-included/page.mdx +++ b/app/en/get-started/agent-plugin/whats-included/page.mdx @@ -7,28 +7,26 @@ import { Code, Table } from "nextra/components"; # What's included -For agent developers using the Arcade plugin, the package includes a connection to Arcade's hosted MCP gateway, two skills, three command shortcuts, and the `arcade-operator` subagent. +For agent developers, the Arcade plugin provides tools and workflows for connected apps. Component support varies by client. ## MCP server -The plugin registers an MCP server named `arcade` at `{{ARCADE_PLUGIN_GATEWAY_URL}}`. The gateway provides tools for email, calendar, chat, issues, docs, and other apps. +The plugin registers an MCP server named `arcade` at `https://api.arcade.dev/mcp/arcade`. The gateway provides tools for email, calendar, chat, issues, docs, and other apps. ## Skills -- [`try-arcade`](https://github.com/ArcadeAI/arcade-plugin/blob/v0.3.0/skills/try-arcade/SKILL.md) guides tool selection, app sign-in, and tasks across connected apps. -- [`scale-arcade`](https://github.com/ArcadeAI/arcade-plugin/blob/v0.3.0/skills/scale-arcade/SKILL.md) guides gateway, tool selection, and end-user identity decisions for a proven workflow. +- [`try-arcade`](https://github.com/ArcadeAI/arcade-plugin/blob/main/skills/try-arcade/SKILL.md) guides tool selection, app sign-in, and tasks across connected apps. +- [`scale-arcade`](https://github.com/ArcadeAI/arcade-plugin/blob/main/skills/scale-arcade/SKILL.md) guides gateway, tool selection, and end-user identity decisions for a proven workflow. -Skills load when relevant to your request. In Codex and the ChatGPT local runtime, choose `@Arcade` or invoke `$arcade:try-arcade` or `$arcade:scale-arcade`. Codex does not expose these skills as slash commands. +Skills load when relevant to your request or when called directly. How to call a skill varies by client. ## Subagent The `arcade-operator` subagent executes app tasks in a separate context and returns the outcome. The `try-arcade` skill delegates to it when the client exposes `arcade-operator`. -The plugin's subagent is [not supported in every client](#client-support). - ## Client support -**Every plugin install includes the Arcade MCP server and both skills.** The clients below load those components. Subagent and command support varies by client. +The clients below load the Arcade MCP server and both skills. Subagent and command support varies. See the [plugin support matrix](https://github.com/ArcadeAI/arcade-plugin/blob/main/docs/support-matrix.md) for client details. @@ -55,7 +53,7 @@ The plugin's subagent is [not supported in every client](#client-support). 3 (/arcade: prefix) - Claude Cowork
No session-start text
+ Claude Cowork Yes 3 (/arcade: prefix)
@@ -65,12 +63,12 @@ The plugin's subagent is [not supported in every client](#client-support). None - VS Code (Copilot sessions)
Session and subagent hooks
+ VS Code (Copilot sessions) Yes None
- Codex / ChatGPT (local)
No lifecycle hooks.
+ Codex CLI and Codex in ChatGPT desktop No None
@@ -82,20 +80,6 @@ The plugin's subagent is [not supported in every client](#client-support).
-
-Routing details by client - -- **Cursor IDE and Cloud Agents:** the always-apply rule provides routing guidance; plugin hooks do not run. -- **Cursor CLI:** only the session hook runs; the always-apply rule does not load. -- **Claude Code:** the session, prompt, and subagent hooks run. -- **Claude Cowork:** prompt and subagent hooks run, but session-start text does not reach the main conversation. -- **GitHub Copilot CLI:** session and subagent hooks run; prompt-hook output from configuration files does not reach the model. -- **VS Code:** in VS Code's Copilot sessions, Arcade adds routing guidance when a session or subagent starts. -- **Codex:** does not run Agent Plugins lifecycle hooks yet. -- **Claude Desktop Chat:** loads neither the rule nor hooks. - -
- ## Commands Claude Code and Cowork namespace the commands as `/arcade:arcade-status`, `/arcade:arcade-connect`, and `/arcade:arcade-apps`. @@ -112,21 +96,11 @@ Authorizes an app on demand, so you are not interrupted mid-task. Lists the apps you have connected and lets you disconnect one. -## Rule and hooks - -The rule and hooks tell your agent when to use Arcade for app tasks. - -The [Agent Plugins](https://agent-plugins.org) 1.0 specification makes only skills and MCP servers portable. Commands, subagents, hooks, and editor rules require client-specific support. - -## How Arcade chooses a connection - -Arcade prefers the plugin's gateway. If it cannot complete a task for a reason other than sign-in or permission denial, your agent may use another already-authorized connection within the task you approved. It checks the intended app account before using another Arcade gateway. Sign-in and permission failures require your attention. The agent does not switch connections to get around them. The plugin instructs your agent to confirm the action and destination before changing something in an app. - -`arcade-operator` falls back only to another authorized Arcade gateway. Fallback to any other tool belongs to the parent agent. +## Projects and secrets -## Privacy +The plugin uses the default project created when you sign up for Arcade. Selecting another project in the Dashboard does not change the plugin's project. -The released plugin turns client-side usage telemetry off in code. No environment setting turns collection on. Requests you make through Arcade still go to its hosted gateway and the apps you authorize. See [Arcade's privacy policy](https://www.arcade.dev/privacy-policy). +Gateway sign-in does not require an Arcade API key. Individual tools may require a provider API key or another secret. Add these to your default project's [secrets](/build/create-tools/tool-basics/create-tool-secrets#store-your-secret). Secrets configured in another project are not available through the plugin. ## Example requests diff --git a/app/en/get-started/mcp-clients/claude-code/page.mdx b/app/en/get-started/mcp-clients/claude-code/page.mdx index 73a553cb5..a8f816244 100644 --- a/app/en/get-started/mcp-clients/claude-code/page.mdx +++ b/app/en/get-started/mcp-clients/claude-code/page.mdx @@ -4,10 +4,8 @@ import { SignupLink } from "@/app/_components/analytics"; # Use Arcade in Claude Code - **Setting Arcade up for yourself?** The [Arcade agent plugin](/get-started/agent-plugin) - installs through Claude's plugin marketplace, needs no API key, and signs you - in to each app in the browser. This guide is for pointing Claude Code at a - gateway you control, with your own tool list and your own end-user identities. + To use Arcade's hosted gateway, [install the Arcade agent plugin](/get-started/agent-plugin). + This guide connects your client to a gateway you configure. diff --git a/app/en/get-started/mcp-clients/claude-desktop/page.mdx b/app/en/get-started/mcp-clients/claude-desktop/page.mdx index b45c6afd1..a1eb3b5d3 100644 --- a/app/en/get-started/mcp-clients/claude-desktop/page.mdx +++ b/app/en/get-started/mcp-clients/claude-desktop/page.mdx @@ -37,11 +37,8 @@ export const STEP_7_LIGHT_HEIGHT = 2450; # Use Arcade in Claude Desktop - **Setting Arcade up for yourself?** Install [the Arcade agent - plugin](/get-started/agent-plugin), which needs no API key and - authorizes each app in the browser. This guide is for pointing Claude Desktop - at a gateway you control, with your own tool list and your own end-user - identities. + To use Arcade's hosted gateway, [install the Arcade agent plugin](/get-started/agent-plugin). + This guide connects your client to a gateway you configure. diff --git a/app/en/get-started/mcp-clients/cursor/page.mdx b/app/en/get-started/mcp-clients/cursor/page.mdx index 1fc47e4c3..e98080087 100644 --- a/app/en/get-started/mcp-clients/cursor/page.mdx +++ b/app/en/get-started/mcp-clients/cursor/page.mdx @@ -9,10 +9,8 @@ import { SignupLink } from "@/app/_components/analytics"; # Use Arcade in Cursor - **Setting Arcade up for yourself?** The [Arcade agent plugin](/get-started/agent-plugin) - installs from GitHub through Cursor's plugin flow, needs no API key, and signs - you in to each app in the browser. This guide is for pointing Cursor at a - gateway you control, with your own tool list and your own end-user identities. + To use Arcade's hosted gateway, [install the Arcade agent plugin](/get-started/agent-plugin). + This guide connects your client to a gateway you configure. Cursor is an MCP client. Point it at an Arcade [MCP Gateway](/operate/governance/mcp-gateways) URL over the Streamable HTTP transport and Cursor's agent can call any tool you selected on that gateway — GitHub, Linear, Gmail, Slack, or any other toolkit from the [Arcade integrations catalog](/resources/integrations), plus tools from your own [custom MCP servers](/build/create-tools/tool-basics/build-mcp-server). diff --git a/app/en/get-started/mcp-clients/github-copilot/page.mdx b/app/en/get-started/mcp-clients/github-copilot/page.mdx index 85ceaecc2..e5d23c119 100644 --- a/app/en/get-started/mcp-clients/github-copilot/page.mdx +++ b/app/en/get-started/mcp-clients/github-copilot/page.mdx @@ -21,10 +21,8 @@ export const VISUAL_STUDIO_STEP_6_HEIGHT = 360; # Use Arcade in GitHub Copilot - **Setting Arcade up for yourself?** The [Arcade agent plugin](/get-started/agent-plugin) - installs with Copilot CLI's plugin command, needs no API key, and signs you in - to each app in the browser. This guide is for pointing Copilot at a gateway - you control, with your own tool list and your own end-user identities. + To use Arcade's hosted gateway, [install the Arcade agent plugin](/get-started/agent-plugin). + This guide connects your client to a gateway you configure. diff --git a/app/en/get-started/mcp-clients/page.mdx b/app/en/get-started/mcp-clients/page.mdx index c5623b5ef..73eaf505f 100644 --- a/app/en/get-started/mcp-clients/page.mdx +++ b/app/en/get-started/mcp-clients/page.mdx @@ -13,6 +13,6 @@ Every supported MCP client, including Cursor, Claude Desktop, Claude Code, VS Co -## Setting Arcade up for yourself? +## Use the hosted gateway -These guides assume you want your own gateway, with a tool list and end-user identities you control. If you are setting Arcade up for your own work, the [Arcade agent plugin](/get-started/agent-plugin) is faster: install it through your client's plugin flow, skip the API key, and sign in to each app in the browser. +To connect your agent to apps through Arcade's hosted gateway, [install the Arcade agent plugin](/get-started/agent-plugin). These client guides connect to a gateway you configure. diff --git a/app/en/get-started/mcp-clients/visual-studio-code/page.mdx b/app/en/get-started/mcp-clients/visual-studio-code/page.mdx index dff90afb6..dfb1b49d6 100644 --- a/app/en/get-started/mcp-clients/visual-studio-code/page.mdx +++ b/app/en/get-started/mcp-clients/visual-studio-code/page.mdx @@ -6,10 +6,8 @@ import { SignupLink } from "@/app/_components/analytics"; In this guide, you'll learn how to connect Visual Studio Code to an Arcade MCP Gateway. - **Setting Arcade up for yourself?** The [Arcade agent plugin](/get-started/agent-plugin) - installs from source through the Command Palette, needs no API key, and signs - you in to each app in the browser. This guide is for pointing VS Code at a - gateway you control, with your own tool list and your own end-user identities. + To use Arcade's hosted gateway, [install the Arcade agent plugin](/get-started/agent-plugin). + This guide connects your client to a gateway you configure. From ad86a95c6291cd22c5454a0ed2e30385451ce743 Mon Sep 17 00:00:00 2001 From: Teal Larson Date: Mon, 19 Oct 2026 11:50:03 -0400 Subject: [PATCH 37/42] Update plugin guide descriptions in llms index --- public/llms.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/llms.txt b/public/llms.txt index b96dec293..39a2302d1 100644 --- a/public/llms.txt +++ b/public/llms.txt @@ -145,7 +145,7 @@ Arcade docs serve two audiences. Start with the path that matches your goal: - [Hybrid MCP servers](https://docs.arcade.dev/en/operate/deploy/on-prem): This documentation page explains how to set up a hybrid MCP server that runs on your own infrastructure while connecting to Arcade Cloud, allowing you to access private resources and keep sensitive data within your network. You'll learn how to run an MCP server with HTTP transport, create a secure tunnel to expose it publicly, register it in Arcade, and test it using the Arcade Playground. - [Identity](https://docs.arcade.dev/en/operate/identity): This page explains how to configure user authentication for Arcade gateways and manage identity providers that connect end users to your system. It provides access to resources for setting up user sources, configuring authentication providers, and implementing secure authentication in production environments. - [In Custom Applications](https://docs.arcade.dev/en/build/tool-calling/custom-apps): This documentation teaches developers how to integrate Arcade tools into custom applications by managing user authentication, checking authorization status, and retrieving tool definitions programmatically. It provides guides for building tool-calling interfaces that handle these core requirements. -- [Install the Arcade agent plugin](https://docs.arcade.dev/en/get-started/agent-plugin): Install Arcade in Cursor, Claude Code, VS Code, GitHub Copilot CLI, Codex, or Claude Desktop. Your agent gets tools for every app you connect, with browser sign-in and no API keys. +- [Install the Arcade agent plugin](https://docs.arcade.dev/en/get-started/agent-plugin): Install Arcade in Cursor, Claude Code, VS Code, GitHub Copilot CLI, Codex, or Claude Desktop. Connect your agent to apps through Arcade with browser sign-in. - [Internal networking](https://docs.arcade.dev/en/operate/deploy/helm/internal-networking): This guide explains how to deploy the Helm-installed Arcade platform entirely within your internal network without public internet access, using an internal load balancer or Gateway API and allowing the Arcade Engine to reach MCP servers on private addresses. It covers configuration options for Gateway API (recommended) and legacy Ingress methods, as well as how to configure SSRF allowlists to permit the Arcade Engine to communicate with internal MCP servers and workers. - [IPv6 and dual-stack](https://docs.arcade.dev/en/operate/deploy/helm/ipv6-dual-stack): This guide explains how to run the Helm-installed Arcade platform on a dual-stack Kubernetes cluster, including configuration values needed to enable IPv6 support and verification steps. It also documents current IPv6 limitations in deployed MCP servers' networking, outbound traffic policies, and external DNS configuration that users should plan around. - [Mastra](https://docs.arcade.dev/en/get-started/agent-frameworks/mastra): This documentation page guides users in building a TypeScript AI agent using the Mastra framework, enabling interaction with Gmail and Slack through Arcade tools. Users will learn to create an agent capable of reading emails, sending messages, and summarizing emails for Slack, @@ -196,7 +196,7 @@ Arcade docs serve two audiences. Start with the path that matches your goal: - [User Sources](https://docs.arcade.dev/en/operate/identity/user-sources): A User Source connects an MCP Gateway to your OIDC identity provider, allowing end users to sign in with their existing identities instead of requiring Arcade to manage them separately. This documentation guides you through registering an OAuth client with your identity provider and creating a User Source in Arcade to enable production authentication for your gateways. - [User-facing agents](https://docs.arcade.dev/en/build/user-facing-agents): This documentation guides agent developers on building and deploying agents that operate on behalf of end users with proper authorization and authentication. It provides resources for implementing secure authentication in production environments and integrating user authorization into tool-calling workflows. - [What are tools?](https://docs.arcade.dev/en/build/tool-calling): This documentation page explains what tools are in the context of language models and how Arcade enables tool calling—the ability for AI models to interact with external systems and APIs to accomplish tasks beyond text generation. It covers the use cases for tool calling, how it works, the authorization challenges Arcade solves, and introduces Tool Augmented Generation (TAG) as a flexible alternative to retrieval-based approaches. -- [What's included](https://docs.arcade.dev/en/get-started/agent-plugin/whats-included): The Arcade MCP server and skills, subagent and command support by client, and routing and authorization boundaries. +- [What's included](https://docs.arcade.dev/en/get-started/agent-plugin/whats-included): Components bundled with the Arcade agent plugin and support across clients. - [When not to use Tool Recommendation](https://docs.arcade.dev/en/operate/governance/mcp-gateways/tool-recommendation/limitations): Tool Recommendation is not suitable for gateways with fewer than ten tools, agents that already know their fixed set of tools, or toolsets with poor descriptions, as it adds unnecessary latency without benefit. Users should be aware of key limitations including that remote MCP server tool lists don't auto-update, new tools take time to become recommendable, and recommendations are limited to five tools per task and only cover allowed tools. - [Why evaluate tools?](https://docs.arcade.dev/en/build/create-tools/evaluate-tools/why-evaluate): Tool evaluations ensure AI models use your tools correctly in production by measuring whether the model selects the right tools and provides accurate parameters before deployment. Without evaluation, models risk misinterpreting user intents, providing incorrect arguments, or skipping necessary tool calls, which Arcade's evaluation framework helps prevent by comparing actual tool calls against expected ones and scoring them based on tool selection and parameter accuracy. - [Windows environment setup](https://docs.arcade.dev/en/get-started/setup/windows-environment): This documentation page provides step-by-step instructions for setting up the Arcade CLI on Windows, emphasizing the use of the `uv` package manager while offering fallback options with `pip`. It includes prerequisites, installation methods, validation steps, and troubleshooting tips to ensure From 757f784674707161717612d6cd7a4f22a7a899d4 Mon Sep 17 00:00:00 2001 From: Teal Larson Date: Mon, 19 Oct 2026 11:51:03 -0400 Subject: [PATCH 38/42] Clarify hook runtime and Cursor refresh requirements --- app/en/get-started/agent-plugin/page.mdx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/en/get-started/agent-plugin/page.mdx b/app/en/get-started/agent-plugin/page.mdx index f0637c90c..2c855d84d 100644 --- a/app/en/get-started/agent-plugin/page.mdx +++ b/app/en/get-started/agent-plugin/page.mdx @@ -21,7 +21,7 @@ Install the Arcade agent plugin in a supported client and connect to its hosted - A [supported client](/get-started/agent-plugin/whats-included#client-support): Cursor, Claude Code, VS Code, GitHub Copilot CLI, Codex, or Claude Desktop - An Arcade account -- For Claude Code, Claude Cowork, Cursor CLI, and GitHub Copilot CLI: [Node.js](https://nodejs.org/) on the host's `PATH` +- For Claude Code, Claude Cowork, Cursor CLI, GitHub Copilot CLI, and VS Code Copilot sessions: [Node.js](https://nodejs.org/) on the host's `PATH` @@ -79,7 +79,7 @@ Use this installation for a [Codex session in the CLI or ChatGPT desktop app](ht **Team marketplace** 1. An admin opens **Dashboard → Plugins & MCPs → Team Marketplaces → Add Marketplace → Import from Repo** and pastes `https://github.com/ArcadeAI/arcade-plugin`. -2. The admin adds Arcade to the marketplace and sets access in **Marketplace Settings**. To receive repository updates, enable **Auto Refresh**. GitHub imports require the Cursor GitHub App on the repository. +2. The admin adds Arcade to the marketplace and sets access in **Marketplace Settings**. For automatic updates from GitHub, enable **Auto Refresh** and install the Cursor GitHub App on the repository. 3. Open **Customize**, find **Arcade**, and select **Install**. 4. Connect the **arcade** MCP server and sign in to Arcade in the browser when prompted. 5. Run `/try-arcade` to start. From a057fae867dffef9521cff0b63992b153db62492 Mon Sep 17 00:00:00 2001 From: Teal Larson Date: Mon, 19 Oct 2026 14:51:22 -0400 Subject: [PATCH 39/42] artisinal edits from teal the human herself --- .../console-2026-05-20T16-00-47-612Z.log | 26 + .../page-2026-05-20T16-01-04-529Z.yml | 1338 ++++++++++++++++ .../page-2026-05-20T16-03-06-919Z.yml | 1373 +++++++++++++++++ .tmp/seo-apr24/gen_twins.py | 52 + .tmp/seo-apr24/insert_twins.py | 88 ++ app/en/get-started/agent-plugin/page.mdx | 2 +- .../agent-plugin/whats-included/page.mdx | 76 +- search-open.png | Bin 0 -> 149684 bytes 8 files changed, 2932 insertions(+), 23 deletions(-) create mode 100644 .playwright-mcp/console-2026-05-20T16-00-47-612Z.log create mode 100644 .playwright-mcp/page-2026-05-20T16-01-04-529Z.yml create mode 100644 .playwright-mcp/page-2026-05-20T16-03-06-919Z.yml create mode 100644 .tmp/seo-apr24/gen_twins.py create mode 100644 .tmp/seo-apr24/insert_twins.py create mode 100644 search-open.png diff --git a/.playwright-mcp/console-2026-05-20T16-00-47-612Z.log b/.playwright-mcp/console-2026-05-20T16-00-47-612Z.log new file mode 100644 index 000000000..c8b45f24e --- /dev/null +++ b/.playwright-mcp/console-2026-05-20T16-00-47-612Z.log @@ -0,0 +1,26 @@ +[ 16728ms] [ERROR] [PostHog.js] PostHog was initialized without a token. This likely indicates a misconfiguration. Please check the first argument passed to posthog.init() @ webpack-internal:///(app-pages-browser)/./node_modules/.pnpm/posthog-js@1.321.2/node_modules/posthog-js/dist/module.js:20 +[ 16760ms] [INFO] %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold @ webpack-internal:///(app-pages-browser)/./node_modules/.pnpm/next@16.1.1_@opentelemetry+api@1.9.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/next/dist/next-devtools/shared/forward-logs-shared.js:27 +[ 16847ms] [LOG] [HMR] connected @ webpack-internal:///(app-pages-browser)/./node_modules/.pnpm/next@16.1.1_@opentelemetry+api@1.9.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/next/dist/next-devtools/shared/forward-logs-shared.js:27 +[ 17239ms] [ERROR] Access to XMLHttpRequest at 'https://auth.arcade.dev/sessions/whoami' from origin 'http://localhost:3000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. @ http://localhost:3000/en/home:0 +[ 17240ms] [ERROR] Failed to load resource: net::ERR_FAILED @ https://auth.arcade.dev/sessions/whoami:0 +[ 17391ms] [ERROR] Item tracking: Missing tracking key @ webpack-internal:///(app-pages-browser)/./node_modules/.pnpm/next@16.1.1_@opentelemetry+api@1.9.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/next/dist/next-devtools/userspace/app/errors/intercept-console-error.js:51 +[ 20237ms] [ERROR] Failed to load resource: the server responded with a status of 400 () @ https://api.vector.co/pixel/phoenix/idex/did-006l/any?duid=334389048b87--01ks31x13e3ke6cp6xq6hc2b2h&did=did-006l&cd=.localhost&pu=http%3A%2F%2Flocalhost%3A3000%2F&resolve=sha2:0 +[ 20684ms] [ERROR] Failed to load resource: the server responded with a status of 400 () @ https://api.vector.co/pixel/phoenix/idex/did-006l/any?duid=334389048b87--01ks31x13e3ke6cp6xq6hc2b2h&did=did-006l&cd=.localhost&pu=http%3A%2F%2Flocalhost%3A3000%2F&resolve=sha2:0 +[ 20684ms] [ERROR] Error in executeCerebro: Error: RequestError: Failed sending request to url https://api.vector.co/pixel/phoenix/idex/did-006l/any?duid=334389048b87--01ks31x13e3ke6cp6xq6hc2b2h&did=did-006l&cd=.localhost&pu=http%3A%2F%2Flocalhost%3A3000%2F&resolve=sha2 + at https://cdn.vector.co/pixel.js:2:19913 + at https://cdn.vector.co/pixel.js:2:152673 + at Generator.throw () + at fw (https://cdn.vector.co/pixel.js:2:111921) + at s (https://cdn.vector.co/pixel.js:2:112152) @ webpack-internal:///(app-pages-browser)/./node_modules/.pnpm/next@16.1.1_@opentelemetry+api@1.9.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/next/dist/next-devtools/userspace/app/errors/intercept-console-error.js:51 +[ 263015ms] [ERROR] WebSocket connection to 'ws://localhost:3000/_next/webpack-hmr?id=N5m5PdGH108RDZdMd2Wid' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ webpack-internal:///(app-pages-browser)/./node_modules/.pnpm/next@16.1.1_@opentelemetry+api@1.9.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/next/dist/client/dev/hot-reloader/app/web-socket.js:59 +[ 264018ms] [ERROR] WebSocket connection to 'ws://localhost:3000/_next/webpack-hmr?id=N5m5PdGH108RDZdMd2Wid' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ webpack-internal:///(app-pages-browser)/./node_modules/.pnpm/next@16.1.1_@opentelemetry+api@1.9.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/next/dist/client/dev/hot-reloader/app/web-socket.js:59 +[ 265021ms] [ERROR] WebSocket connection to 'ws://localhost:3000/_next/webpack-hmr?id=N5m5PdGH108RDZdMd2Wid' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ webpack-internal:///(app-pages-browser)/./node_modules/.pnpm/next@16.1.1_@opentelemetry+api@1.9.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/next/dist/client/dev/hot-reloader/app/web-socket.js:59 +[ 266025ms] [ERROR] WebSocket connection to 'ws://localhost:3000/_next/webpack-hmr?id=N5m5PdGH108RDZdMd2Wid' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ webpack-internal:///(app-pages-browser)/./node_modules/.pnpm/next@16.1.1_@opentelemetry+api@1.9.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/next/dist/client/dev/hot-reloader/app/web-socket.js:59 +[ 267030ms] [ERROR] WebSocket connection to 'ws://localhost:3000/_next/webpack-hmr?id=N5m5PdGH108RDZdMd2Wid' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ webpack-internal:///(app-pages-browser)/./node_modules/.pnpm/next@16.1.1_@opentelemetry+api@1.9.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/next/dist/client/dev/hot-reloader/app/web-socket.js:59 +[ 272037ms] [ERROR] WebSocket connection to 'ws://localhost:3000/_next/webpack-hmr?id=N5m5PdGH108RDZdMd2Wid' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ webpack-internal:///(app-pages-browser)/./node_modules/.pnpm/next@16.1.1_@opentelemetry+api@1.9.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/next/dist/client/dev/hot-reloader/app/web-socket.js:59 +[ 277046ms] [ERROR] WebSocket connection to 'ws://localhost:3000/_next/webpack-hmr?id=N5m5PdGH108RDZdMd2Wid' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ webpack-internal:///(app-pages-browser)/./node_modules/.pnpm/next@16.1.1_@opentelemetry+api@1.9.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/next/dist/client/dev/hot-reloader/app/web-socket.js:59 +[ 282062ms] [ERROR] WebSocket connection to 'ws://localhost:3000/_next/webpack-hmr?id=N5m5PdGH108RDZdMd2Wid' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ webpack-internal:///(app-pages-browser)/./node_modules/.pnpm/next@16.1.1_@opentelemetry+api@1.9.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/next/dist/client/dev/hot-reloader/app/web-socket.js:59 +[ 287098ms] [ERROR] WebSocket connection to 'ws://localhost:3000/_next/webpack-hmr?id=N5m5PdGH108RDZdMd2Wid' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ webpack-internal:///(app-pages-browser)/./node_modules/.pnpm/next@16.1.1_@opentelemetry+api@1.9.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/next/dist/client/dev/hot-reloader/app/web-socket.js:59 +[ 292126ms] [ERROR] WebSocket connection to 'ws://localhost:3000/_next/webpack-hmr?id=N5m5PdGH108RDZdMd2Wid' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ webpack-internal:///(app-pages-browser)/./node_modules/.pnpm/next@16.1.1_@opentelemetry+api@1.9.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/next/dist/client/dev/hot-reloader/app/web-socket.js:59 +[ 297176ms] [ERROR] WebSocket connection to 'ws://localhost:3000/_next/webpack-hmr?id=N5m5PdGH108RDZdMd2Wid' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ webpack-internal:///(app-pages-browser)/./node_modules/.pnpm/next@16.1.1_@opentelemetry+api@1.9.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/next/dist/client/dev/hot-reloader/app/web-socket.js:59 +[ 302389ms] [ERROR] WebSocket connection to 'ws://localhost:3000/_next/webpack-hmr?id=N5m5PdGH108RDZdMd2Wid' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ webpack-internal:///(app-pages-browser)/./node_modules/.pnpm/next@16.1.1_@opentelemetry+api@1.9.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/next/dist/client/dev/hot-reloader/app/web-socket.js:59 diff --git a/.playwright-mcp/page-2026-05-20T16-01-04-529Z.yml b/.playwright-mcp/page-2026-05-20T16-01-04-529Z.yml new file mode 100644 index 000000000..ca4368276 --- /dev/null +++ b/.playwright-mcp/page-2026-05-20T16-01-04-529Z.yml @@ -0,0 +1,1338 @@ +- generic [active] [ref=e1]: + - link "Skip to Content" [ref=e2] [cursor=pointer]: + - /url: "#nextra-skip-nav" + - banner [ref=e3]: + - navigation [ref=e5]: + - link "Home page" [ref=e6] [cursor=pointer]: + - /url: https://arcade.dev/ + - img "Arcade" [ref=e8] + - button "Search docs" [ref=e13]: + - img [ref=e14] + - generic [ref=e17]: Search + - generic [ref=e18]: + - generic [ref=e19]: ⌘ + - text: K + - link "Github" [ref=e20] [cursor=pointer]: + - /url: https://github.com/ArcadeAI/arcade-mcp + - img "Github" [ref=e21] + - link "Discord" [ref=e23] [cursor=pointer]: + - /url: https://discord.gg/GUZEMpEZ9p + - img "Discord" [ref=e24] + - link "Sign Up" [ref=e26] [cursor=pointer]: + - /url: https://app.arcade.dev/register?utm_source=docs&utm_campaign=docs&utm_medium=navbar + - button "Sign Up" [ref=e27] + - link "Dashboard" [ref=e28] [cursor=pointer]: + - /url: https://app.arcade.dev/playground/chat + - button "Dashboard" [ref=e29] + - main [ref=e30]: + - generic [ref=e31]: + - complementary [ref=e32]: + - list [ref=e35]: + - listitem [ref=e36]: + - link "Docs Home" [ref=e37] [cursor=pointer]: + - /url: /en/home + - generic [ref=e38]: + - img [ref=e39] + - text: Docs Home + - listitem [ref=e42]: + - button "Get Started" [ref=e43] [cursor=pointer]: + - generic [ref=e44]: + - img [ref=e45] + - text: Get Started + - img [ref=e47] + - list [ref=e50]: + - listitem [ref=e51]: + - link "About Arcade" [ref=e52] [cursor=pointer]: + - /url: /en/get-started/about-arcade + - listitem [ref=e53]: + - button "Setup" [ref=e54] [cursor=pointer]: + - text: Setup + - img [ref=e55] + - list [ref=e57]: + - listitem [ref=e58]: + - link "Get an API key" [ref=e59] [cursor=pointer]: + - /url: /en/get-started/setup/api-keys + - listitem [ref=e60]: + - link "Connect Arcade docs to your IDE" [ref=e61] [cursor=pointer]: + - /url: /en/get-started/setup/connect-arcade-docs + - listitem [ref=e62]: + - link "Windows environment setup" [ref=e63] [cursor=pointer]: + - /url: /en/get-started/setup/windows-environment + - listitem [ref=e64]: + - button "Quickstarts" [ref=e65] [cursor=pointer]: + - text: Quickstarts + - img [ref=e66] + - list [ref=e68]: + - listitem [ref=e69]: + - link "Call tools in agents" [ref=e70] [cursor=pointer]: + - /url: /en/get-started/quickstarts/call-tool-agent + - listitem [ref=e71]: + - link "Call tools in IDE/MCP clients" [ref=e72] [cursor=pointer]: + - /url: /en/get-started/quickstarts/call-tool-client + - listitem [ref=e73]: + - link "Build an MCP server for custom tools" [ref=e74] [cursor=pointer]: + - /url: /en/get-started/quickstarts/mcp-server-quickstart + - listitem [ref=e75]: + - button "Agent Frameworks" [ref=e76] [cursor=pointer]: + - text: Agent Frameworks + - img [ref=e77] + - list [ref=e79]: + - listitem [ref=e80]: + - link "Overview" [ref=e81] [cursor=pointer]: + - /url: /en/get-started/agent-frameworks + - listitem [ref=e82]: + - link "Setup Arcade with your LLM (Python)" [ref=e83] [cursor=pointer]: + - /url: /en/get-started/agent-frameworks/setup-arcade-with-your-llm-python + - listitem [ref=e84]: + - button "AG2" [ref=e85] [cursor=pointer]: + - text: AG2 + - img [ref=e86] + - list [ref=e88]: + - listitem [ref=e89]: + - link "Setup Arcade tools with AG2" [ref=e90] [cursor=pointer]: + - /url: /en/get-started/agent-frameworks/ag2/use-arcade-tools + - listitem [ref=e91]: + - button "CrewAI" [ref=e92] [cursor=pointer]: + - text: CrewAI + - img [ref=e93] + - list [ref=e95]: + - listitem [ref=e96]: + - link "Setup Arcade tools with CrewAI" [ref=e97] [cursor=pointer]: + - /url: /en/get-started/agent-frameworks/crewai/use-arcade-tools + - listitem [ref=e98]: + - button "Google ADK" [ref=e99] [cursor=pointer]: + - text: Google ADK + - img [ref=e100] + - list [ref=e102]: + - listitem [ref=e103]: + - link "Overview" [ref=e104] [cursor=pointer]: + - /url: /en/get-started/agent-frameworks/google-adk/overview + - listitem [ref=e105]: + - link "Setup (Python)" [ref=e106] [cursor=pointer]: + - /url: /en/get-started/agent-frameworks/google-adk/setup-python + - listitem [ref=e107]: + - link "Setup (TypeScript)" [ref=e108] [cursor=pointer]: + - /url: /en/get-started/agent-frameworks/google-adk/setup-typescript + - listitem [ref=e109]: + - button "LangChain" [ref=e110] [cursor=pointer]: + - text: LangChain + - img [ref=e111] + - list [ref=e113]: + - listitem [ref=e114]: + - link "Overview" [ref=e115] [cursor=pointer]: + - /url: /en/get-started/agent-frameworks/langchain/overview + - listitem [ref=e116]: + - link "Setup (Python)" [ref=e117] [cursor=pointer]: + - /url: /en/get-started/agent-frameworks/langchain/use-arcade-with-langchain-py + - listitem [ref=e118]: + - link "Setup (TypeScript)" [ref=e119] [cursor=pointer]: + - /url: /en/get-started/agent-frameworks/langchain/use-arcade-with-langchain-ts + - listitem [ref=e120]: + - link "Authorizing Existing Tools" [ref=e121] [cursor=pointer]: + - /url: /en/get-started/agent-frameworks/langchain/auth-langchain-tools + - listitem [ref=e122]: + - link "Mastra" [ref=e123] [cursor=pointer]: + - /url: /en/get-started/agent-frameworks/mastra + - listitem [ref=e124]: + - button "OpenAI Agents" [ref=e125] [cursor=pointer]: + - text: OpenAI Agents + - img [ref=e126] + - list [ref=e128]: + - listitem [ref=e129]: + - link "Overview" [ref=e130] [cursor=pointer]: + - /url: /en/get-started/agent-frameworks/openai-agents/overview + - listitem [ref=e131]: + - link "Setup (Python)" [ref=e132] [cursor=pointer]: + - /url: /en/get-started/agent-frameworks/openai-agents/setup-python + - listitem [ref=e133]: + - link "Setup (TypeScript)" [ref=e134] [cursor=pointer]: + - /url: /en/get-started/agent-frameworks/openai-agents/setup-typescript + - listitem [ref=e135]: + - link "TanStack AI" [ref=e136] [cursor=pointer]: + - /url: /en/get-started/agent-frameworks/tanstack-ai + - listitem [ref=e137]: + - link "Vercel AI SDK" [ref=e138] [cursor=pointer]: + - /url: /en/get-started/agent-frameworks/vercelai + - listitem [ref=e139]: + - link "Spring AI SDK" [ref=e140] [cursor=pointer]: + - /url: /en/get-started/agent-frameworks/springai + - listitem [ref=e141]: + - button "MCP Clients" [ref=e142] [cursor=pointer]: + - text: MCP Clients + - img [ref=e143] + - list [ref=e145]: + - listitem [ref=e146]: + - link "Overview" [ref=e147] [cursor=pointer]: + - /url: /en/get-started/mcp-clients + - listitem [ref=e148]: + - link "Cursor" [ref=e149] [cursor=pointer]: + - /url: /en/get-started/mcp-clients/cursor + - listitem [ref=e150]: + - link "Claude Desktop" [ref=e151] [cursor=pointer]: + - /url: /en/get-started/mcp-clients/claude-desktop + - listitem [ref=e152]: + - link "Claude Code" [ref=e153] [cursor=pointer]: + - /url: /en/get-started/mcp-clients/claude-code + - listitem [ref=e154]: + - link "Visual Studio Code" [ref=e155] [cursor=pointer]: + - /url: /en/get-started/mcp-clients/visual-studio-code + - listitem [ref=e156]: + - link "Microsoft Copilot Studio" [ref=e157] [cursor=pointer]: + - /url: /en/get-started/mcp-clients/copilot-studio + - listitem [ref=e158]: + - link "GitHub Copilot" [ref=e159] [cursor=pointer]: + - /url: /en/get-started/mcp-clients/github-copilot + - listitem [ref=e160]: + - button "Resources" [ref=e161] [cursor=pointer]: + - generic [ref=e162]: + - img [ref=e163] + - text: Resources + - img [ref=e166] + - list [ref=e169]: + - listitem [ref=e170]: + - button "Integrations" [ref=e171] [cursor=pointer]: + - text: Integrations + - img [ref=e172] + - list [ref=e174]: + - listitem [ref=e175]: + - link "Overview" [ref=e176] [cursor=pointer]: + - /url: /en/resources/integrations + - listitem [ref=e177]: + - button "Productivity & Docs" [ref=e178] [cursor=pointer]: + - text: Productivity & Docs + - img [ref=e179] + - list [ref=e181]: + - listitem [ref=e182]: Optimized + - listitem [ref=e183]: + - link "Asana" [ref=e184] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/asana + - listitem [ref=e185]: + - link "ClickUp" [ref=e186] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/clickup + - listitem [ref=e187]: + - link "Confluence" [ref=e188] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/confluence + - listitem [ref=e189]: + - link "Dropbox" [ref=e190] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/dropbox + - listitem [ref=e191]: + - link "Figma" [ref=e192] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/figma + - listitem [ref=e193]: + - link "Gmail" [ref=e194] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/gmail + - listitem [ref=e195]: + - link "Google Calendar" [ref=e196] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/google-calendar + - listitem [ref=e197]: + - link "Google Contacts" [ref=e198] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/google-contacts + - listitem [ref=e199]: + - link "Google Docs" [ref=e200] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/google-docs + - listitem [ref=e201]: + - link "Google Drive" [ref=e202] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/google-drive + - listitem [ref=e203]: + - link "Google Sheets" [ref=e204] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/google-sheets + - listitem [ref=e205]: + - link "Google Slides" [ref=e206] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/google-slides + - listitem [ref=e207]: + - link "Granola" [ref=e208] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/granola + - listitem [ref=e209]: + - link "Jira" [ref=e210] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/jira + - listitem [ref=e211]: + - link "Linear" [ref=e212] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/linear + - listitem [ref=e213]: + - link "Microsoft Excel" [ref=e214] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/microsoft-excel + - listitem [ref=e215]: + - link "Microsoft OneDrive" [ref=e216] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/microsoft-onedrive + - listitem [ref=e217]: + - link "Microsoft Outlook Calendar" [ref=e218] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/microsoft-outlook-calendar + - listitem [ref=e219]: + - link "Microsoft Outlook Mail" [ref=e220] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/microsoft-outlook-mail + - listitem [ref=e221]: + - link "Microsoft PowerPoint" [ref=e222] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/microsoft-powerpoint + - listitem [ref=e223]: + - link "Microsoft SharePoint" [ref=e224] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/microsoft-sharepoint + - listitem [ref=e225]: + - link "Microsoft Word" [ref=e226] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/microsoft-word + - listitem [ref=e227]: Starter + - listitem [ref=e228]: + - link "Airtable API" [ref=e229] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/airtable-api + - listitem [ref=e230]: + - link "Asana API" [ref=e231] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/asana-api + - listitem [ref=e232]: + - link "Ashby API" [ref=e233] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/ashby-api + - listitem [ref=e234]: + - link "Box API" [ref=e235] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/box-api + - listitem [ref=e236]: + - link "Calendly API" [ref=e237] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/calendly-api + - listitem [ref=e238]: + - link "ClickUp API" [ref=e239] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/clickup-api + - listitem [ref=e240]: + - link "Figma API" [ref=e241] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/figma-api + - listitem [ref=e242]: + - link "Luma API" [ref=e243] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/luma-api + - listitem [ref=e244]: + - link "Mailchimp API" [ref=e245] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/mailchimp-marketing-api + - listitem [ref=e246]: + - link "Miro API" [ref=e247] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/miro-api + - listitem [ref=e248]: + - link "SquareUp API" [ref=e249] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/squareup-api + - listitem [ref=e250]: + - link "TickTick API" [ref=e251] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/ticktick-api + - listitem [ref=e252]: + - link "Trello API" [ref=e253] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/trello-api + - listitem [ref=e254]: + - link "Xero API" [ref=e255] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/xero-api + - listitem [ref=e256]: + - button "Social & Communication" [ref=e257] [cursor=pointer]: + - text: Social & Communication + - img [ref=e258] + - list [ref=e260]: + - listitem [ref=e261]: Optimized + - listitem [ref=e262]: + - link "LinkedIn" [ref=e263] [cursor=pointer]: + - /url: /en/resources/integrations/social/linkedin + - listitem [ref=e264]: + - link "Microsoft Teams" [ref=e265] [cursor=pointer]: + - /url: /en/resources/integrations/social/microsoft-teams + - listitem [ref=e266]: + - link "Reddit" [ref=e267] [cursor=pointer]: + - /url: /en/resources/integrations/social/reddit + - listitem [ref=e268]: + - link "Slack" [ref=e269] [cursor=pointer]: + - /url: /en/resources/integrations/social/slack + - listitem [ref=e270]: + - link "Telegram" [ref=e271] [cursor=pointer]: + - /url: /en/resources/integrations/social/telegram + - listitem [ref=e272]: + - link "X" [ref=e273] [cursor=pointer]: + - /url: /en/resources/integrations/social/x + - listitem [ref=e274]: + - link "Zoom" [ref=e275] [cursor=pointer]: + - /url: /en/resources/integrations/social/zoom + - listitem [ref=e276]: Starter + - listitem [ref=e277]: + - link "Slack API" [ref=e278] [cursor=pointer]: + - /url: /en/resources/integrations/social/slack-api + - listitem [ref=e279]: + - button "Entertainment" [ref=e280] [cursor=pointer]: + - text: Entertainment + - img [ref=e281] + - list [ref=e283]: + - listitem [ref=e284]: Optimized + - listitem [ref=e285]: + - link "Imgflip" [ref=e286] [cursor=pointer]: + - /url: /en/resources/integrations/entertainment/imgflip + - listitem [ref=e287]: + - link "Spotify" [ref=e288] [cursor=pointer]: + - /url: /en/resources/integrations/entertainment/spotify + - listitem [ref=e289]: + - button "Developer Tools" [ref=e290] [cursor=pointer]: + - text: Developer Tools + - img [ref=e291] + - list [ref=e293]: + - listitem [ref=e294]: Optimized + - listitem [ref=e295]: + - link "Bright Data" [ref=e296] [cursor=pointer]: + - /url: /en/resources/integrations/development/brightdata + - listitem [ref=e297]: + - link "Daytona" [ref=e298] [cursor=pointer]: + - /url: /en/resources/integrations/development/daytona + - listitem [ref=e299]: + - link "E2B" [ref=e300] [cursor=pointer]: + - /url: /en/resources/integrations/development/e2b + - listitem [ref=e301]: + - link "Firecrawl" [ref=e302] [cursor=pointer]: + - /url: /en/resources/integrations/development/firecrawl + - listitem [ref=e303]: + - link "GitHub" [ref=e304] [cursor=pointer]: + - /url: /en/resources/integrations/development/github + - listitem [ref=e305]: + - link "Math" [ref=e306] [cursor=pointer]: + - /url: /en/resources/integrations/development/math + - listitem [ref=e307]: + - link "PagerDuty" [ref=e308] [cursor=pointer]: + - /url: /en/resources/integrations/development/pagerduty + - listitem [ref=e309]: + - link "PostHog" [ref=e310] [cursor=pointer]: + - /url: /en/resources/integrations/development/posthog + - listitem [ref=e311]: Starter + - listitem [ref=e312]: + - link "Arcade Engine API" [ref=e313] [cursor=pointer]: + - /url: /en/resources/integrations/development/arcade-engine-api + - listitem [ref=e314]: + - link "Cursor Agents API" [ref=e315] [cursor=pointer]: + - /url: /en/resources/integrations/development/cursor-agents-api + - listitem [ref=e316]: + - link "Datadog API" [ref=e317] [cursor=pointer]: + - /url: /en/resources/integrations/development/datadog-api + - listitem [ref=e318]: + - link "GitHub API" [ref=e319] [cursor=pointer]: + - /url: /en/resources/integrations/development/github-api + - listitem [ref=e320]: + - link "PostHog API" [ref=e321] [cursor=pointer]: + - /url: /en/resources/integrations/development/posthog-api + - listitem [ref=e322]: + - link "Vercel API" [ref=e323] [cursor=pointer]: + - /url: /en/resources/integrations/development/vercel-api + - listitem [ref=e324]: + - link "Zoho Creator API" [ref=e325] [cursor=pointer]: + - /url: /en/resources/integrations/development/zoho-creator-api + - listitem [ref=e326]: + - button "Payments & Finance" [ref=e327] [cursor=pointer]: + - text: Payments & Finance + - img [ref=e328] + - list [ref=e330]: + - listitem [ref=e331]: Optimized + - listitem [ref=e332]: + - link "Stripe" [ref=e333] [cursor=pointer]: + - /url: /en/resources/integrations/payments/stripe + - listitem [ref=e334]: Starter + - listitem [ref=e335]: + - link "Stripe API" [ref=e336] [cursor=pointer]: + - /url: /en/resources/integrations/payments/stripe_api + - listitem [ref=e337]: + - link "Zoho Books API" [ref=e338] [cursor=pointer]: + - /url: /en/resources/integrations/payments/zoho-books-api + - listitem [ref=e339]: + - button "Search Tools" [ref=e340] [cursor=pointer]: + - text: Search Tools + - img [ref=e341] + - list [ref=e343]: + - listitem [ref=e344]: Optimized + - listitem [ref=e345]: + - link "Google Finance" [ref=e346] [cursor=pointer]: + - /url: /en/resources/integrations/search/google_finance + - listitem [ref=e347]: + - link "Google Flights" [ref=e348] [cursor=pointer]: + - /url: /en/resources/integrations/search/google_flights + - listitem [ref=e349]: + - link "Google Hotels" [ref=e350] [cursor=pointer]: + - /url: /en/resources/integrations/search/google_hotels + - listitem [ref=e351]: + - link "Google Jobs" [ref=e352] [cursor=pointer]: + - /url: /en/resources/integrations/search/google_jobs + - listitem [ref=e353]: + - link "Google Maps" [ref=e354] [cursor=pointer]: + - /url: /en/resources/integrations/search/google_maps + - listitem [ref=e355]: + - link "Google News" [ref=e356] [cursor=pointer]: + - /url: /en/resources/integrations/search/google_news + - listitem [ref=e357]: + - link "Google Search" [ref=e358] [cursor=pointer]: + - /url: /en/resources/integrations/search/google_search + - listitem [ref=e359]: + - link "Google Shopping" [ref=e360] [cursor=pointer]: + - /url: /en/resources/integrations/search/google_shopping + - listitem [ref=e361]: + - link "Walmart" [ref=e362] [cursor=pointer]: + - /url: /en/resources/integrations/search/walmart + - listitem [ref=e363]: + - link "Youtube" [ref=e364] [cursor=pointer]: + - /url: /en/resources/integrations/search/youtube + - listitem [ref=e365]: Starter + - listitem [ref=e366]: + - link "Exa API" [ref=e367] [cursor=pointer]: + - /url: /en/resources/integrations/search/exa-api + - listitem [ref=e368]: + - link "Tavily" [ref=e369] [cursor=pointer]: + - /url: /en/resources/integrations/search/tavily + - listitem [ref=e370]: + - button "Sales" [ref=e371] [cursor=pointer]: + - text: Sales + - img [ref=e372] + - list [ref=e374]: + - listitem [ref=e375]: Optimized + - listitem [ref=e376]: + - link "Attio" [ref=e377] [cursor=pointer]: + - /url: /en/resources/integrations/sales/attio + - listitem [ref=e378]: + - link "HubSpot" [ref=e379] [cursor=pointer]: + - /url: /en/resources/integrations/sales/hubspot + - listitem [ref=e380]: + - link "Salesforce" [ref=e381] [cursor=pointer]: + - /url: /en/resources/integrations/sales/salesforce + - listitem [ref=e382]: Starter + - listitem [ref=e383]: + - link "HubSpot Automation API" [ref=e384] [cursor=pointer]: + - /url: /en/resources/integrations/sales/hubspot-automation-api + - listitem [ref=e385]: + - link "HubSpot CMS API" [ref=e386] [cursor=pointer]: + - /url: /en/resources/integrations/sales/hubspot-cms-api + - listitem [ref=e387]: + - link "HubSpot Conversations API" [ref=e388] [cursor=pointer]: + - /url: /en/resources/integrations/sales/hubspot-conversations-api + - listitem [ref=e389]: + - link "HubSpot CRM API" [ref=e390] [cursor=pointer]: + - /url: /en/resources/integrations/sales/hubspot-crm-api + - listitem [ref=e391]: + - link "HubSpot Events API" [ref=e392] [cursor=pointer]: + - /url: /en/resources/integrations/sales/hubspot-events-api + - listitem [ref=e393]: + - link "HubSpot Marketing API" [ref=e394] [cursor=pointer]: + - /url: /en/resources/integrations/sales/hubspot-marketing-api + - listitem [ref=e395]: + - link "HubSpot Meetings API" [ref=e396] [cursor=pointer]: + - /url: /en/resources/integrations/sales/hubspot-meetings-api + - listitem [ref=e397]: + - link "HubSpot Users API" [ref=e398] [cursor=pointer]: + - /url: /en/resources/integrations/sales/hubspot-users-api + - listitem [ref=e399]: + - button "Databases" [ref=e400] [cursor=pointer]: + - text: Databases + - img [ref=e401] + - list [ref=e403]: + - listitem [ref=e404]: Optimized + - listitem [ref=e405]: + - link "Clickhouse" [ref=e406] [cursor=pointer]: + - /url: /en/resources/integrations/databases/clickhouse + - listitem [ref=e407]: + - link "MongoDB" [ref=e408] [cursor=pointer]: + - /url: /en/resources/integrations/databases/mongodb + - listitem [ref=e409]: + - link "Postgres" [ref=e410] [cursor=pointer]: + - /url: /en/resources/integrations/databases/postgres + - listitem [ref=e411]: Starter + - listitem [ref=e412]: + - link "Weaviate API" [ref=e413] [cursor=pointer]: + - /url: /en/resources/integrations/databases/weaviate-api + - listitem [ref=e414]: + - link "YugabyteDB" [ref=e415] [cursor=pointer]: + - /url: /en/resources/integrations/databases/yugabytedb + - listitem [ref=e416]: + - button "Customer Support" [ref=e417] [cursor=pointer]: + - text: Customer Support + - img [ref=e418] + - list [ref=e420]: + - listitem [ref=e421]: Optimized + - listitem [ref=e422]: + - link "Pylon" [ref=e423] [cursor=pointer]: + - /url: /en/resources/integrations/customer-support/pylon + - listitem [ref=e424]: + - link "Zendesk" [ref=e425] [cursor=pointer]: + - /url: /en/resources/integrations/customer-support/zendesk + - listitem [ref=e426]: Starter + - listitem [ref=e427]: + - link "Customer.io API" [ref=e428] [cursor=pointer]: + - /url: /en/resources/integrations/customer-support/customerio-api + - listitem [ref=e429]: + - link "Customer.io Pipelines API" [ref=e430] [cursor=pointer]: + - /url: /en/resources/integrations/customer-support/customerio-pipelines-api + - listitem [ref=e431]: + - link "Customer.io Track API" [ref=e432] [cursor=pointer]: + - /url: /en/resources/integrations/customer-support/customerio-track-api + - listitem [ref=e433]: + - link "Freshservice API" [ref=e434] [cursor=pointer]: + - /url: /en/resources/integrations/customer-support/freshservice-api + - listitem [ref=e435]: + - link "Intercom API" [ref=e436] [cursor=pointer]: + - /url: /en/resources/integrations/customer-support/intercom-api + - listitem [ref=e437]: + - link "PagerDuty API" [ref=e438] [cursor=pointer]: + - /url: /en/resources/integrations/customer-support/pagerduty-api + - listitem [ref=e439]: + - link "Pylon API" [ref=e440] [cursor=pointer]: + - /url: /en/resources/integrations/customer-support/pylon-api + - listitem [ref=e441]: Feedback + - listitem [ref=e442]: + - link "Tool Feedback" [ref=e443] [cursor=pointer]: + - /url: /en/resources/integrations/tool-feedback + - listitem [ref=e444]: + - link "Examples" [ref=e445] [cursor=pointer]: + - /url: /en/resources/examples + - listitem [ref=e446]: + - link "Tools" [ref=e447] [cursor=pointer]: + - /url: /en/resources/tools + - listitem [ref=e448]: + - link "Glossary" [ref=e449] [cursor=pointer]: + - /url: /en/resources/glossary + - listitem [ref=e450]: + - link "FAQ" [ref=e451] [cursor=pointer]: + - /url: /en/resources/faq + - listitem [ref=e452]: + - link "Security research program" [ref=e453] [cursor=pointer]: + - /url: /en/resources/security-research-program + - listitem [ref=e454]: + - link "Contact" [ref=e455] [cursor=pointer]: + - /url: /en/resources/contact-us + - listitem [ref=e456]: + - link "Arcade Registry Early Access" [ref=e457] [cursor=pointer]: + - /url: /en/resources/registry-early-access + - listitem [ref=e458]: + - button "Guides" [ref=e459] [cursor=pointer]: + - generic [ref=e460]: + - img [ref=e461] + - text: Guides + - img [ref=e467] + - list [ref=e470]: + - listitem [ref=e471]: + - link "Audit Logs" [ref=e472] [cursor=pointer]: + - /url: /en/guides/audit-logs + - listitem [ref=e473]: + - button "Contextual Access" [ref=e474] [cursor=pointer]: + - text: Contextual Access + - img [ref=e475] + - list [ref=e477]: + - listitem [ref=e478]: + - link "Contextual Access" [ref=e479] [cursor=pointer]: + - /url: /en/guides/contextual-access + - listitem [ref=e480]: + - link "How Hooks Work" [ref=e481] [cursor=pointer]: + - /url: /en/guides/contextual-access/how-hooks-work + - listitem [ref=e482]: + - link "Running an Extension" [ref=e483] [cursor=pointer]: + - /url: /en/guides/contextual-access/examples + - listitem [ref=e484]: + - link "Build Your Own" [ref=e485] [cursor=pointer]: + - /url: /en/guides/contextual-access/build-your-own + - listitem [ref=e486]: + - button "MCP Gateways" [ref=e487] [cursor=pointer]: + - text: MCP Gateways + - img [ref=e488] + - list [ref=e490]: + - listitem [ref=e491]: + - link "MCP Gateways" [ref=e492] [cursor=pointer]: + - /url: /en/guides/mcp-gateways + - listitem [ref=e493]: + - link "Add remote MCP servers" [ref=e494] [cursor=pointer]: + - /url: /en/guides/mcp-gateways/add-remote-servers + - listitem [ref=e495]: + - link "Create via Dashboard" [ref=e496] [cursor=pointer]: + - /url: /en/guides/mcp-gateways/create-via-dashboard + - listitem [ref=e497]: + - link "Create via AI Assistant" [ref=e498] [cursor=pointer]: + - /url: /en/guides/mcp-gateways/create-via-ai + - listitem [ref=e499]: + - button "Call tools" [ref=e500] [cursor=pointer]: + - text: Call tools + - img [ref=e501] + - list [ref=e503]: + - listitem [ref=e504]: + - link "Overview" [ref=e505] [cursor=pointer]: + - /url: /en/guides/tool-calling + - listitem [ref=e506]: + - link "Handling errors" [ref=e507] [cursor=pointer]: + - /url: /en/guides/tool-calling/error-handling + - listitem [ref=e508]: + - link "Call third-party APIs" [ref=e509] [cursor=pointer]: + - /url: /en/guides/tool-calling/call-third-party-apis + - listitem [ref=e510]: + - button "In custom applications" [ref=e511] [cursor=pointer]: + - text: In custom applications + - img [ref=e512] + - list [ref=e514]: + - listitem [ref=e515]: + - link "Overview" [ref=e516] [cursor=pointer]: + - /url: /en/guides/tool-calling/custom-apps + - listitem [ref=e517]: + - link "Authorize tool calling" [ref=e518] [cursor=pointer]: + - /url: /en/guides/tool-calling/custom-apps/auth-tool-calling + - listitem [ref=e519]: + - link "Check authorization status" [ref=e520] [cursor=pointer]: + - /url: /en/guides/tool-calling/custom-apps/check-auth-status + - listitem [ref=e521]: + - link "Get formatted tool definitions" [ref=e522] [cursor=pointer]: + - /url: /en/guides/tool-calling/custom-apps/get-tool-definitions + - listitem [ref=e523]: + - button "Create tools" [ref=e524] [cursor=pointer]: + - text: Create tools + - img [ref=e525] + - list [ref=e527]: + - listitem [ref=e528]: + - button "Build a tool" [ref=e529] [cursor=pointer]: + - text: Build a tool + - img [ref=e530] + - list [ref=e532]: + - listitem [ref=e533]: + - link "Overview" [ref=e534] [cursor=pointer]: + - /url: /en/guides/create-tools/tool-basics + - listitem [ref=e535]: + - link "Compare MCP server types" [ref=e536] [cursor=pointer]: + - /url: /en/guides/create-tools/tool-basics/compare-server-types + - listitem [ref=e537]: + - link "Build an MCP Server to write custom tools" [ref=e538] [cursor=pointer]: + - /url: /en/guides/create-tools/tool-basics/build-mcp-server + - listitem [ref=e539]: + - link "Create a tool with auth" [ref=e540] [cursor=pointer]: + - /url: /en/guides/create-tools/tool-basics/create-tool-auth + - listitem [ref=e541]: + - link "Create a tool with secrets" [ref=e542] [cursor=pointer]: + - /url: /en/guides/create-tools/tool-basics/create-tool-secrets + - listitem [ref=e543]: + - link "Access runtime data" [ref=e544] [cursor=pointer]: + - /url: /en/guides/create-tools/tool-basics/runtime-data-access + - listitem [ref=e545]: + - link "Call tools from MCP clients" [ref=e546] [cursor=pointer]: + - /url: /en/guides/create-tools/tool-basics/call-tools-mcp + - listitem [ref=e547]: + - link "Organize your MCP server and tools" [ref=e548] [cursor=pointer]: + - /url: /en/guides/create-tools/tool-basics/organize-mcp-tools + - listitem [ref=e549]: + - link "Add metadata to your tools" [ref=e550] [cursor=pointer]: + - /url: /en/guides/create-tools/tool-basics/add-tool-metadata + - listitem [ref=e551]: + - button "Evaluate tools" [ref=e552] [cursor=pointer]: + - text: Evaluate tools + - img [ref=e553] + - list [ref=e555]: + - listitem [ref=e556]: + - link "Overview" [ref=e557] [cursor=pointer]: + - /url: /en/guides/create-tools/evaluate-tools + - listitem [ref=e558]: + - link "Why evaluate tools?" [ref=e559] [cursor=pointer]: + - /url: /en/guides/create-tools/evaluate-tools/why-evaluate + - listitem [ref=e560]: + - link "Create an evaluation suite" [ref=e561] [cursor=pointer]: + - /url: /en/guides/create-tools/evaluate-tools/create-evaluation-suite + - listitem [ref=e562]: + - link "Run evaluations" [ref=e563] [cursor=pointer]: + - /url: /en/guides/create-tools/evaluate-tools/run-evaluations + - listitem [ref=e564]: + - link "Capture mode" [ref=e565] [cursor=pointer]: + - /url: /en/guides/create-tools/evaluate-tools/capture-mode + - listitem [ref=e566]: + - link "Comparative evaluations" [ref=e567] [cursor=pointer]: + - /url: /en/guides/create-tools/evaluate-tools/comparative-evaluations + - listitem [ref=e568]: + - button "Improve an existing toolkit" [ref=e569] [cursor=pointer]: + - text: Improve an existing toolkit + - img [ref=e570] + - list [ref=e572]: + - listitem [ref=e573]: + - link "Types of Tools" [ref=e574] [cursor=pointer]: + - /url: /en/guides/create-tools/improve/types-of-tools + - listitem [ref=e575]: + - button "Handle errors" [ref=e576] [cursor=pointer]: + - text: Handle errors + - img [ref=e577] + - list [ref=e579]: + - listitem [ref=e580]: + - link "Overview" [ref=e581] [cursor=pointer]: + - /url: /en/guides/create-tools/error-handling + - listitem [ref=e582]: + - link "Retry Tools with Improved Prompt" [ref=e583] [cursor=pointer]: + - /url: /en/guides/create-tools/error-handling/retry-tools + - listitem [ref=e584]: + - link "Provide Useful Tool Errors" [ref=e585] [cursor=pointer]: + - /url: /en/guides/create-tools/error-handling/useful-tool-errors + - listitem [ref=e586]: + - button "Secure your server" [ref=e587] [cursor=pointer]: + - text: Secure your server + - img [ref=e588] + - list [ref=e590]: + - listitem [ref=e591]: + - link "Overview" [ref=e592] [cursor=pointer]: + - /url: /en/guides/create-tools/secure-your-server + - listitem [ref=e593]: + - link "Add Resource Server auth" [ref=e594] [cursor=pointer]: + - /url: /en/guides/create-tools/secure-your-server/secure-your-mcp-server + - listitem [ref=e595]: + - link "Migrate from toolkits to MCP servers" [ref=e596] [cursor=pointer]: + - /url: /en/guides/create-tools/migrate-toolkits + - listitem [ref=e597]: + - button "User-facing agents" [ref=e598] [cursor=pointer]: + - text: User-facing agents + - img [ref=e599] + - list [ref=e601]: + - listitem [ref=e602]: + - link "Secure Auth in Production" [ref=e603] [cursor=pointer]: + - /url: /en/guides/user-facing-agents/secure-auth-production + - listitem [ref=e604]: + - button "Deployment & hosting" [ref=e605] [cursor=pointer]: + - text: Deployment & hosting + - img [ref=e606] + - list [ref=e608]: + - listitem [ref=e609]: + - link "Overview" [ref=e610] [cursor=pointer]: + - /url: /en/guides/deployment-hosting + - listitem [ref=e611]: + - link "Arcade Cloud" [ref=e612] [cursor=pointer]: + - /url: /en/guides/deployment-hosting/arcade-cloud + - listitem [ref=e613]: + - link "On-premises MCP servers" [ref=e614] [cursor=pointer]: + - /url: /en/guides/deployment-hosting/on-prem + - listitem [ref=e615]: + - link "Configure Arcade's engine" [ref=e616] [cursor=pointer]: + - /url: /en/guides/deployment-hosting/configure-engine + - listitem [ref=e617]: + - link "Arcade Deploy" [ref=e618] [cursor=pointer]: + - /url: /en/guides/deployment-hosting/arcade-deploy + - listitem [ref=e619]: + - button "Logic Extensions" [ref=e620] [cursor=pointer]: + - text: Logic Extensions + - img [ref=e621] + - list [ref=e623]: + - listitem [ref=e624]: + - link "Build Your Own" [ref=e625] [cursor=pointer]: + - /url: /en/guides/logic-extensions/build-your-own + - listitem [ref=e626]: + - button "Learn" [ref=e627] [cursor=pointer]: + - generic [ref=e628]: + - img [ref=e629] + - text: Learn + - img [ref=e631] + - list [ref=e634]: + - listitem [ref=e635]: + - link "Server-Level vs Tool-Level Authorization" [ref=e636] [cursor=pointer]: + - /url: /en/learn/server-level-vs-tool-level-auth + - listitem [ref=e637]: + - button "References" [ref=e638] [cursor=pointer]: + - generic [ref=e639]: + - img [ref=e640] + - text: References + - img [ref=e643] + - list [ref=e646]: + - listitem [ref=e647]: + - link "Overview" [ref=e648] [cursor=pointer]: + - /url: /en/references + - listitem [ref=e649]: + - link "Changelog" [ref=e650] [cursor=pointer]: + - /url: /en/references/changelog + - listitem [ref=e651]: + - link "API" [ref=e652] [cursor=pointer]: + - /url: /en/references/api + - listitem [ref=e653]: + - button "Arcade MCP" [ref=e654] [cursor=pointer]: + - text: Arcade MCP + - img [ref=e655] + - list [ref=e657]: + - listitem [ref=e658]: + - button "Python" [ref=e659] [cursor=pointer]: + - text: Python + - img [ref=e660] + - list [ref=e662]: + - listitem [ref=e663]: + - link "Overview" [ref=e664] [cursor=pointer]: + - /url: /en/references/mcp/python + - listitem [ref=e665]: + - link "Context" [ref=e666] [cursor=pointer]: + - /url: /en/references/mcp/python/context + - listitem [ref=e667]: + - link "Resources" [ref=e668] [cursor=pointer]: + - /url: /en/references/mcp/python/resources + - listitem [ref=e669]: + - link "Server" [ref=e670] [cursor=pointer]: + - /url: /en/references/mcp/python/server + - listitem [ref=e671]: + - link "Settings" [ref=e672] [cursor=pointer]: + - /url: /en/references/mcp/python/settings + - listitem [ref=e673]: + - link "Middleware" [ref=e674] [cursor=pointer]: + - /url: /en/references/mcp/python/middleware + - listitem [ref=e675]: + - link "Errors" [ref=e676] [cursor=pointer]: + - /url: /en/references/mcp/python/errors + - listitem [ref=e677]: + - link "Telemetry" [ref=e678] [cursor=pointer]: + - /url: /en/references/mcp/telemetry + - listitem [ref=e679]: + - link "Arcade CLI" [ref=e680] [cursor=pointer]: + - /url: /en/references/arcade-cli + - listitem [ref=e681]: + - link "CLI Cheat Sheet" [ref=e682] [cursor=pointer]: + - /url: /en/references/cli-cheat-sheet + - listitem [ref=e683]: + - link "Contextual Access Webhook API" [ref=e684] [cursor=pointer]: + - /url: /en/references/contextual-access-webhook-api + - listitem [ref=e685]: + - button "Auth Providers" [ref=e686] [cursor=pointer]: + - text: Auth Providers + - img [ref=e687] + - list [ref=e689]: + - listitem [ref=e690]: + - link "Overview" [ref=e691] [cursor=pointer]: + - /url: /en/references/auth-providers + - listitem [ref=e692]: + - link "OAuth 2.0" [ref=e693] [cursor=pointer]: + - /url: /en/references/auth-providers/oauth2 + - listitem [ref=e694]: + - link "Airtable" [ref=e695] [cursor=pointer]: + - /url: /en/references/auth-providers/airtable + - listitem [ref=e696]: + - link "Asana" [ref=e697] [cursor=pointer]: + - /url: /en/references/auth-providers/asana + - listitem [ref=e698]: + - link "Atlassian" [ref=e699] [cursor=pointer]: + - /url: /en/references/auth-providers/atlassian + - listitem [ref=e700]: + - link "Attio" [ref=e701] [cursor=pointer]: + - /url: /en/references/auth-providers/attio + - listitem [ref=e702]: + - link "Calendly" [ref=e703] [cursor=pointer]: + - /url: /en/references/auth-providers/calendly + - listitem [ref=e704]: + - link "ClickUp" [ref=e705] [cursor=pointer]: + - /url: /en/references/auth-providers/clickup + - listitem [ref=e706]: + - link "Discord" [ref=e707] [cursor=pointer]: + - /url: /en/references/auth-providers/discord + - listitem [ref=e708]: + - link "Dropbox" [ref=e709] [cursor=pointer]: + - /url: /en/references/auth-providers/dropbox + - listitem [ref=e710]: + - link "Figma" [ref=e711] [cursor=pointer]: + - /url: /en/references/auth-providers/figma + - listitem [ref=e712]: + - link "GitHub" [ref=e713] [cursor=pointer]: + - /url: /en/references/auth-providers/github + - listitem [ref=e714]: + - link "Google" [ref=e715] [cursor=pointer]: + - /url: /en/references/auth-providers/google + - listitem [ref=e716]: + - link "Hubspot" [ref=e717] [cursor=pointer]: + - /url: /en/references/auth-providers/hubspot + - listitem [ref=e718]: + - link "Linear" [ref=e719] [cursor=pointer]: + - /url: /en/references/auth-providers/linear + - listitem [ref=e720]: + - link "LinkedIn" [ref=e721] [cursor=pointer]: + - /url: /en/references/auth-providers/linkedin + - listitem [ref=e722]: + - link "Mailchimp" [ref=e723] [cursor=pointer]: + - /url: /en/references/auth-providers/mailchimp + - listitem [ref=e724]: + - link "Microsoft" [ref=e725] [cursor=pointer]: + - /url: /en/references/auth-providers/microsoft + - listitem [ref=e726]: + - link "Miro" [ref=e727] [cursor=pointer]: + - /url: /en/references/auth-providers/miro + - listitem [ref=e728]: + - link "Notion" [ref=e729] [cursor=pointer]: + - /url: /en/references/auth-providers/notion + - listitem [ref=e730]: + - link "PagerDuty" [ref=e731] [cursor=pointer]: + - /url: /en/references/auth-providers/pagerduty + - listitem [ref=e732]: + - link "Reddit" [ref=e733] [cursor=pointer]: + - /url: /en/references/auth-providers/reddit + - listitem [ref=e734]: + - link "Salesforce" [ref=e735] [cursor=pointer]: + - /url: /en/references/auth-providers/salesforce + - listitem [ref=e736]: + - link "Slack" [ref=e737] [cursor=pointer]: + - /url: /en/references/auth-providers/slack + - listitem [ref=e738]: + - link "Spotify" [ref=e739] [cursor=pointer]: + - /url: /en/references/auth-providers/spotify + - listitem [ref=e740]: + - link "Square" [ref=e741] [cursor=pointer]: + - /url: /en/references/auth-providers/square + - listitem [ref=e742]: + - link "TickTick" [ref=e743] [cursor=pointer]: + - /url: /en/references/auth-providers/ticktick + - listitem [ref=e744]: + - link "Twitch" [ref=e745] [cursor=pointer]: + - /url: /en/references/auth-providers/twitch + - listitem [ref=e746]: + - link "X" [ref=e747] [cursor=pointer]: + - /url: /en/references/auth-providers/x + - listitem [ref=e748]: + - link "Zendesk" [ref=e749] [cursor=pointer]: + - /url: /en/references/auth-providers/zendesk + - listitem [ref=e750]: + - link "Zoho" [ref=e751] [cursor=pointer]: + - /url: /en/references/auth-providers/zoho + - listitem [ref=e752]: + - link "Zoom" [ref=e753] [cursor=pointer]: + - /url: /en/references/auth-providers/zoom + - generic [ref=e754]: + - button "English" [ref=e755] [cursor=pointer]: + - img [ref=e756] + - text: English + - button "Change theme" [ref=e758] [cursor=pointer]: + - img [ref=e759] + - button "Collapse sidebar" [expanded] [ref=e761] [cursor=pointer]: + - img [ref=e762] + - article [ref=e765]: + - main [ref=e766]: + - generic [ref=e767]: + - generic [ref=e772]: + - heading "MCP Runtime for AI agents that get things done." [level=1] [ref=e773] + - paragraph [ref=e774]: Arcade handles OAuth, manages user tokens, and gives you 7,000+ pre-built integrations so your agents can take real action in production. + - generic [ref=e775]: + - link "Get Started" [ref=e776] [cursor=pointer]: + - /url: /get-started/quickstarts/call-tool-agent + - img + - text: Get Started + - link "Explore Tools" [ref=e777] [cursor=pointer]: + - /url: /en/resources/integrations + - img + - text: Explore Tools + - link "These docs are LLM-friendly — AI agents get clean markdown automatically" [ref=e779] [cursor=pointer]: + - /url: /get-started/setup/connect-arcade-docs + - img [ref=e780] + - text: These docs are LLM-friendly — AI agents get clean markdown automatically + - img [ref=e783] + - generic [ref=e787]: + - heading "Get Tools" [level=2] [ref=e788] + - link "Pre-built Integrations Browse 7,000+ ready-to-use integrations for Gmail, Slack, GitHub, and more. Gmail Slack GitHub Google Sheets Jira Notion Linear HubSpot Stripe Google Drive Dropbox Confluence Reddit Learn more" [ref=e792] [cursor=pointer]: + - /url: /en/resources/integrations + - generic [ref=e793]: + - img [ref=e795] + - generic [ref=e797]: Pre-built Integrations + - generic [ref=e798]: + - paragraph [ref=e799]: Browse 7,000+ ready-to-use integrations for Gmail, Slack, GitHub, and more. + - generic [ref=e801]: + - img "Gmail" [ref=e802] + - img "Slack" [ref=e803] + - img "GitHub" [ref=e804] + - img "Google Sheets" [ref=e805] + - img "Jira" [ref=e806] + - img "Notion" [ref=e807] + - img "Linear" [ref=e808] + - img "HubSpot" [ref=e809] + - img "Stripe" [ref=e810] + - img "Google Drive" [ref=e811] + - img "Dropbox" [ref=e812] + - img "Confluence" [ref=e813] + - img "Reddit" [ref=e814] + - generic [ref=e815]: + - text: Learn more + - img [ref=e816] + - link "Build Custom Tools Create your own MCP servers and custom tools with our SDK. Learn more" [ref=e821] [cursor=pointer]: + - /url: /guides/create-tools/tool-basics/build-mcp-server + - generic [ref=e822]: + - img [ref=e824] + - generic [ref=e826]: Build Custom Tools + - generic [ref=e827]: + - paragraph [ref=e828]: Create your own MCP servers and custom tools with our SDK. + - generic [ref=e829]: + - text: Learn more + - img [ref=e830] + - heading "Use Arcade" [level=2] [ref=e832] + - link "Connect to Your IDE Add tools to Cursor, VS Code, Claude Desktop, or any MCP client. Cursor VS Code Claude Desktop Learn more" [ref=e836] [cursor=pointer]: + - /url: /get-started/mcp-clients + - generic [ref=e837]: + - img [ref=e839] + - generic [ref=e841]: Connect to Your IDE + - generic [ref=e842]: + - paragraph [ref=e843]: Add tools to Cursor, VS Code, Claude Desktop, or any MCP client. + - generic [ref=e845]: + - img "Cursor" [ref=e846] + - img "VS Code" [ref=e847] + - img "Claude Desktop" [ref=e848] + - generic [ref=e849]: + - text: Learn more + - img [ref=e850] + - link "Power Your Agent Integrate with AG2, LangChain, OpenAI Agents, CrewAI, Vercel AI, and more. AG2 LangChain OpenAI CrewAI Vercel AI Google ADK Mastra TanStack AI Learn more" [ref=e855] [cursor=pointer]: + - /url: /get-started/agent-frameworks + - generic [ref=e856]: + - img [ref=e858] + - generic [ref=e861]: Power Your Agent + - generic [ref=e862]: + - paragraph [ref=e863]: Integrate with AG2, LangChain, OpenAI Agents, CrewAI, Vercel AI, and more. + - generic [ref=e865]: + - img "AG2" [ref=e866] + - img "LangChain" [ref=e867] + - img "OpenAI" [ref=e868] + - img "CrewAI" [ref=e869] + - img "Vercel AI" [ref=e870] + - img "Google ADK" [ref=e871] + - img "Mastra" [ref=e872] + - img "TanStack AI" [ref=e873] + - generic [ref=e874]: + - text: Learn more + - img [ref=e875] + - generic [ref=e878]: + - generic [ref=e879]: + - generic [ref=e880]: + - heading "Popular Integrations" [level=2] [ref=e881] + - paragraph [ref=e882]: Pre-built MCP servers ready to use with your agents. + - link "See all 7,000+" [ref=e883] [cursor=pointer]: + - /url: /en/resources/integrations + - text: See all 7,000+ + - img + - generic [ref=e884]: + - generic [ref=e885]: + - link "Google Sheets Google Sheets" [ref=e886] [cursor=pointer]: + - /url: /resources/integrations/productivity/google-sheets + - img "Google Sheets" [ref=e888] + - generic [ref=e889]: Google Sheets + - link "Jira Jira" [ref=e890] [cursor=pointer]: + - /url: /resources/integrations/productivity/jira + - img "Jira" [ref=e892] + - generic [ref=e893]: Jira + - link "Gmail Gmail" [ref=e894] [cursor=pointer]: + - /url: /resources/integrations/productivity/gmail + - img "Gmail" [ref=e896] + - generic [ref=e897]: Gmail + - link "Confluence Confluence" [ref=e898] [cursor=pointer]: + - /url: /resources/integrations/productivity/confluence + - img "Confluence" [ref=e900] + - generic [ref=e901]: Confluence + - link "Slack Slack" [ref=e902] [cursor=pointer]: + - /url: /resources/integrations/social/slack + - img "Slack" [ref=e904] + - generic [ref=e905]: Slack + - link "Google Docs Google Docs" [ref=e906] [cursor=pointer]: + - /url: /resources/integrations/productivity/google-docs + - img "Google Docs" [ref=e908] + - generic [ref=e909]: Google Docs + - link "Google Slides Google Slides" [ref=e910] [cursor=pointer]: + - /url: /resources/integrations/productivity/google-slides + - img "Google Slides" [ref=e912] + - generic [ref=e913]: Google Slides + - link "HubSpot HubSpot" [ref=e914] [cursor=pointer]: + - /url: /resources/integrations/sales/hubspot + - img "HubSpot" [ref=e916] + - generic [ref=e917]: HubSpot + - link "Linear Linear" [ref=e918] [cursor=pointer]: + - /url: /resources/integrations/productivity/linear + - img "Linear" [ref=e920] + - generic [ref=e921]: Linear + - link "Google Drive Google Drive" [ref=e922] [cursor=pointer]: + - /url: /resources/integrations/productivity/google-drive + - img "Google Drive" [ref=e924] + - generic [ref=e925]: Google Drive + - generic [ref=e926]: + - link "GitHub GitHub" [ref=e927] [cursor=pointer]: + - /url: /resources/integrations/development/github + - img "GitHub" [ref=e929] + - generic [ref=e930]: GitHub + - link "X X" [ref=e931] [cursor=pointer]: + - /url: /resources/integrations/social/x + - img "X" [ref=e933] + - generic [ref=e934]: X + - link "MS Teams MS Teams" [ref=e935] [cursor=pointer]: + - /url: /resources/integrations/social/microsoft-teams + - img "MS Teams" [ref=e937] + - generic [ref=e938]: MS Teams + - link "Stripe Stripe" [ref=e939] [cursor=pointer]: + - /url: /resources/integrations/payments/stripe + - img "Stripe" [ref=e941] + - generic [ref=e942]: Stripe + - link "Notion Notion" [ref=e943] [cursor=pointer]: + - /url: /resources/integrations/productivity/notion + - img "Notion" [ref=e945] + - generic [ref=e946]: Notion + - link "Asana Asana" [ref=e947] [cursor=pointer]: + - /url: /resources/integrations/productivity/asana + - img "Asana" [ref=e949] + - generic [ref=e950]: Asana + - link "Reddit Reddit" [ref=e951] [cursor=pointer]: + - /url: /resources/integrations/social/reddit + - img "Reddit" [ref=e953] + - generic [ref=e954]: Reddit + - link "YouTube YouTube" [ref=e955] [cursor=pointer]: + - /url: /resources/integrations/search/youtube + - img "YouTube" [ref=e957] + - generic [ref=e958]: YouTube + - link "Dropbox Dropbox" [ref=e959] [cursor=pointer]: + - /url: /resources/integrations/productivity/dropbox + - img "Dropbox" [ref=e961] + - generic [ref=e962]: Dropbox + - generic [ref=e964]: + - generic [ref=e965]: + - heading "Works With Your Stack" [level=2] [ref=e966] + - paragraph [ref=e967]: Arcade integrates with popular agent frameworks and LLM providers. + - generic [ref=e968]: + - link "AG2 AG2" [ref=e969] [cursor=pointer]: + - /url: /get-started/agent-frameworks/ag2/use-arcade-tools + - img "AG2" [ref=e971] + - generic [ref=e972]: AG2 + - link "LangChain LangChain" [ref=e973] [cursor=pointer]: + - /url: /guides/agent-frameworks/langchain/use-arcade-tools + - img "LangChain" [ref=e975] + - generic [ref=e976]: LangChain + - link "OpenAI Agents OpenAI Agents" [ref=e977] [cursor=pointer]: + - /url: /get-started/agent-frameworks/openai-agents/overview + - img "OpenAI Agents" [ref=e979] + - generic [ref=e980]: OpenAI Agents + - link "CrewAI CrewAI" [ref=e981] [cursor=pointer]: + - /url: /guides/agent-frameworks/crewai/use-arcade-tools + - img "CrewAI" [ref=e983] + - generic [ref=e984]: CrewAI + - link "Vercel AI Vercel AI" [ref=e985] [cursor=pointer]: + - /url: /guides/agent-frameworks/vercelai + - img "Vercel AI" [ref=e987] + - generic [ref=e988]: Vercel AI + - link "Google ADK Google ADK" [ref=e989] [cursor=pointer]: + - /url: /guides/agent-frameworks/google-adk/use-arcade-tools + - img "Google ADK" [ref=e991] + - generic [ref=e992]: Google ADK + - link "Mastra Mastra" [ref=e993] [cursor=pointer]: + - /url: /guides/agent-frameworks/mastra/use-arcade-tools + - img "Mastra" [ref=e995] + - generic [ref=e996]: Mastra + - link "TanStack AI TanStack AI" [ref=e997] [cursor=pointer]: + - /url: /get-started/agent-frameworks/tanstack-ai + - img "TanStack AI" [ref=e999] + - generic [ref=e1000]: TanStack AI + - generic [ref=e1002]: + - generic [ref=e1003]: + - heading "How Arcade Works" [level=2] [ref=e1004] + - paragraph [ref=e1005]: Three core components that power your AI agents. + - generic [ref=e1006]: + - link "Runtime Your MCP server and agentic tool provider. Manages authentication, tool registration, and execution. Learn more" [ref=e1009] [cursor=pointer]: + - /url: /get-started/about-arcade + - generic [ref=e1010]: + - img [ref=e1012] + - generic [ref=e1023]: Runtime + - generic [ref=e1024]: + - paragraph [ref=e1025]: Your MCP server and agentic tool provider. Manages authentication, tool registration, and execution. + - generic [ref=e1026]: + - text: Learn more + - img [ref=e1027] + - link "Tool Catalog Catalog of pre-built tools and integrations. Browse 7,000+ ready-to-use MCP servers. Learn more" [ref=e1031] [cursor=pointer]: + - /url: /en/resources/integrations + - generic [ref=e1032]: + - img [ref=e1034] + - generic [ref=e1038]: Tool Catalog + - generic [ref=e1039]: + - paragraph [ref=e1040]: Catalog of pre-built tools and integrations. Browse 7,000+ ready-to-use MCP servers. + - generic [ref=e1041]: + - text: Learn more + - img [ref=e1042] + - link "Agent Authorization Let agents act on behalf of users. Handle OAuth, API keys, and tokens for tools like Gmail and Google Drive. Learn more" [ref=e1046] [cursor=pointer]: + - /url: /guides/tool-calling/custom-apps/auth-tool-calling + - generic [ref=e1047]: + - img [ref=e1049] + - generic [ref=e1051]: Agent Authorization + - generic [ref=e1052]: + - paragraph [ref=e1053]: Let agents act on behalf of users. Handle OAuth, API keys, and tokens for tools like Gmail and Google Drive. + - generic [ref=e1054]: + - text: Learn more + - img [ref=e1055] + - generic [ref=e1058]: + - generic [ref=e1059]: + - generic [ref=e1060]: + - heading "Sample Applications" [level=2] [ref=e1061] + - paragraph [ref=e1062]: See Arcade in action with these example applications. + - link "See all examples" [ref=e1063] [cursor=pointer]: + - /url: /resources/examples + - text: See all examples + - img + - generic [ref=e1064]: + - link "Arcade Chat A chatbot that can help you with your daily tasks." [ref=e1066] [cursor=pointer]: + - /url: https://chat.arcade.dev/ + - generic [ref=e1069]: + - heading "Arcade Chat" [level=3] [ref=e1071] + - paragraph [ref=e1072]: A chatbot that can help you with your daily tasks. + - link "Archer A bot for Slack that can act on your behalf." [ref=e1074] [cursor=pointer]: + - /url: https://github.com/ArcadeAI/ArcadeSlackAgent + - generic [ref=e1077]: + - heading "Archer" [level=3] [ref=e1079] + - paragraph [ref=e1080]: A bot for Slack that can act on your behalf. + - link "YouTube Podcast Summarizer A Slack bot that extracts and summarizes YouTube transcripts." [ref=e1082] [cursor=pointer]: + - /url: https://github.com/dforwardfeed/slack-AIpodcast-summaries + - generic [ref=e1085]: + - heading "YouTube Podcast Summarizer" [level=3] [ref=e1087] + - paragraph [ref=e1088]: A Slack bot that extracts and summarizes YouTube transcripts. + - generic [ref=e1090]: + - heading "Quick Links" [level=2] [ref=e1092] + - generic [ref=e1093]: + - link "API Reference" [ref=e1094] [cursor=pointer]: + - /url: /references/api + - img [ref=e1095] + - generic [ref=e1097]: API Reference + - link "CLI Cheat Sheet" [ref=e1098] [cursor=pointer]: + - /url: /references/cli-cheat-sheet + - img [ref=e1099] + - generic [ref=e1102]: CLI Cheat Sheet + - link "FAQ" [ref=e1103] [cursor=pointer]: + - /url: /resources/faq + - img [ref=e1104] + - generic [ref=e1107]: FAQ + - link "Changelog" [ref=e1108] [cursor=pointer]: + - /url: /references/changelog + - img [ref=e1109] + - generic [ref=e1112]: Changelog + - generic [ref=e1115]: + - text: Last updated on + - time [ref=e1116]: May 20, 2026 + - link "About Arcade" [ref=e1118] [cursor=pointer]: + - /url: /en/get-started/about-arcade + - text: About Arcade + - img [ref=e1119] + - generic [ref=e1121]: + - separator [ref=e1122] + - contentinfo [ref=e1123]: + - generic [ref=e1124]: + - generic [ref=e1125]: + - generic [ref=e1126]: + - link "Arcade Logo Making AI take action" [ref=e1127] [cursor=pointer]: + - /url: https://arcade.dev/ + - img "Arcade Logo" [ref=e1129] + - generic [ref=e1130]: Making AI take action + - generic [ref=e1131]: + - link "Github" [ref=e1132] [cursor=pointer]: + - /url: https://github.com/ArcadeAI + - img "Github" [ref=e1133] + - link "Discord" [ref=e1135] [cursor=pointer]: + - /url: https://discord.gg/GUZEMpEZ9p + - img "Discord" [ref=e1136] + - link "LinkedIn" [ref=e1138] [cursor=pointer]: + - /url: https://www.linkedin.com/company/arcade-ai/ + - img "LinkedIn" [ref=e1139] + - link "Send us an email" [ref=e1141] [cursor=pointer]: + - /url: mailto:contact@arcade.dev + - img [ref=e1142] + - generic [ref=e1145]: + - generic [ref=e1146]: + - heading "Project" [level=3] [ref=e1147] + - list [ref=e1148]: + - listitem [ref=e1149]: + - link "GitHub" [ref=e1150] [cursor=pointer]: + - /url: https://github.com/ArcadeAI/arcade-ai + - listitem [ref=e1151]: + - link "GitHub Container Registry" [ref=e1152] [cursor=pointer]: + - /url: https://github.com/orgs/ArcadeAI/packages + - listitem [ref=e1153]: + - link "Status" [ref=e1154] [cursor=pointer]: + - /url: https://status.arcade.dev/ + - generic [ref=e1155]: + - heading "Resources" [level=3] [ref=e1156] + - list [ref=e1157]: + - listitem [ref=e1158]: + - link "Documentation" [ref=e1159] [cursor=pointer]: + - /url: / + - listitem [ref=e1160]: + - link "Releases" [ref=e1161] [cursor=pointer]: + - /url: https://github.com/ArcadeAI/arcade-ai/releases + - listitem [ref=e1162]: + - link "Examples" [ref=e1163] [cursor=pointer]: + - /url: https://github.com/ArcadeAI/arcade-ai/tree/main/examples + - generic [ref=e1164]: + - heading "Feedback" [level=3] [ref=e1165] + - list [ref=e1166]: + - listitem [ref=e1167]: + - link "Discord" [ref=e1168] [cursor=pointer]: + - /url: https://discord.gg/GUZEMpEZ9p + - listitem [ref=e1169]: + - link "Report an issue on GitHub" [ref=e1170] [cursor=pointer]: + - /url: https://github.com/ArcadeAI/arcade-ai/issues/new/choose + - generic [ref=e1171]: + - paragraph [ref=e1173]: © 2024 — present Arcade AI, Inc. + - link "Privacy Policy" [ref=e1175] [cursor=pointer]: + - /url: https://www.arcade.dev/privacy-policy + - button "Open Next.js Dev Tools" [ref=e1181] [cursor=pointer]: + - img [ref=e1182] \ No newline at end of file diff --git a/.playwright-mcp/page-2026-05-20T16-03-06-919Z.yml b/.playwright-mcp/page-2026-05-20T16-03-06-919Z.yml new file mode 100644 index 000000000..a76819644 --- /dev/null +++ b/.playwright-mcp/page-2026-05-20T16-03-06-919Z.yml @@ -0,0 +1,1373 @@ +- generic [ref=e1]: + - link "Skip to Content" [ref=e2] [cursor=pointer]: + - /url: "#nextra-skip-nav" + - banner [ref=e3]: + - navigation [ref=e5]: + - link "Home page" [ref=e6] [cursor=pointer]: + - /url: https://arcade.dev/ + - img "Arcade" [ref=e8] + - generic [ref=e12]: + - button "Search docs" [active] [ref=e13]: + - img [ref=e14] + - generic [ref=e17]: Search + - generic [ref=e18]: + - generic [ref=e19]: ⌘ + - text: K + - dialog "Search" [ref=e1199]: + - button "Close search" [ref=e1200] + - paragraph [ref=e1202]: + - text: Add + - code [ref=e1203]: NEXT_PUBLIC_ALGOLIA_APP_ID + - text: "," + - code [ref=e1204]: NEXT_PUBLIC_ALGOLIA_SEARCH_API_KEY + - text: ", and" + - code [ref=e1205]: NEXT_PUBLIC_ALGOLIA_INDEX_NAME + - text: to your environment to enable search. + - link "Github" [ref=e20] [cursor=pointer]: + - /url: https://github.com/ArcadeAI/arcade-mcp + - img "Github" [ref=e21] + - link "Discord" [ref=e23] [cursor=pointer]: + - /url: https://discord.gg/GUZEMpEZ9p + - img "Discord" [ref=e24] + - link "Sign Up" [ref=e26] [cursor=pointer]: + - /url: https://app.arcade.dev/register?utm_source=docs&utm_campaign=docs&utm_medium=navbar + - button "Sign Up" [ref=e27] + - link "Dashboard" [ref=e28] [cursor=pointer]: + - /url: https://app.arcade.dev/playground/chat + - button "Dashboard" [ref=e29] + - main [ref=e30]: + - generic [ref=e31]: + - complementary [ref=e32]: + - list [ref=e35]: + - listitem [ref=e36]: + - link "Docs Home" [ref=e37] [cursor=pointer]: + - /url: /en/home + - generic [ref=e38]: + - img [ref=e39] + - text: Docs Home + - listitem [ref=e42]: + - button "Get Started" [ref=e43] [cursor=pointer]: + - generic [ref=e44]: + - img [ref=e45] + - text: Get Started + - img [ref=e47] + - list [ref=e50]: + - listitem [ref=e51]: + - link "About Arcade" [ref=e52] [cursor=pointer]: + - /url: /en/get-started/about-arcade + - listitem [ref=e53]: + - button "Setup" [ref=e54] [cursor=pointer]: + - text: Setup + - img [ref=e55] + - list [ref=e57]: + - listitem [ref=e58]: + - link "Get an API key" [ref=e59] [cursor=pointer]: + - /url: /en/get-started/setup/api-keys + - listitem [ref=e60]: + - link "Connect Arcade docs to your IDE" [ref=e61] [cursor=pointer]: + - /url: /en/get-started/setup/connect-arcade-docs + - listitem [ref=e62]: + - link "Windows environment setup" [ref=e63] [cursor=pointer]: + - /url: /en/get-started/setup/windows-environment + - listitem [ref=e64]: + - button "Quickstarts" [ref=e65] [cursor=pointer]: + - text: Quickstarts + - img [ref=e66] + - list [ref=e68]: + - listitem [ref=e69]: + - link "Call tools in agents" [ref=e70] [cursor=pointer]: + - /url: /en/get-started/quickstarts/call-tool-agent + - listitem [ref=e71]: + - link "Call tools in IDE/MCP clients" [ref=e72] [cursor=pointer]: + - /url: /en/get-started/quickstarts/call-tool-client + - listitem [ref=e73]: + - link "Build an MCP server for custom tools" [ref=e74] [cursor=pointer]: + - /url: /en/get-started/quickstarts/mcp-server-quickstart + - listitem [ref=e75]: + - button "Agent Frameworks" [ref=e76] [cursor=pointer]: + - text: Agent Frameworks + - img [ref=e77] + - list [ref=e79]: + - listitem [ref=e80]: + - link "Overview" [ref=e81] [cursor=pointer]: + - /url: /en/get-started/agent-frameworks + - listitem [ref=e82]: + - link "Setup Arcade with your LLM (Python)" [ref=e83] [cursor=pointer]: + - /url: /en/get-started/agent-frameworks/setup-arcade-with-your-llm-python + - listitem [ref=e84]: + - button "AG2" [ref=e85] [cursor=pointer]: + - text: AG2 + - img [ref=e86] + - list [ref=e88]: + - listitem [ref=e89]: + - link "Setup Arcade tools with AG2" [ref=e90] [cursor=pointer]: + - /url: /en/get-started/agent-frameworks/ag2/use-arcade-tools + - listitem [ref=e91]: + - button "CrewAI" [ref=e92] [cursor=pointer]: + - text: CrewAI + - img [ref=e93] + - list [ref=e95]: + - listitem [ref=e96]: + - link "Setup Arcade tools with CrewAI" [ref=e97] [cursor=pointer]: + - /url: /en/get-started/agent-frameworks/crewai/use-arcade-tools + - listitem [ref=e98]: + - button "Google ADK" [ref=e99] [cursor=pointer]: + - text: Google ADK + - img [ref=e100] + - list [ref=e102]: + - listitem [ref=e103]: + - link "Overview" [ref=e104] [cursor=pointer]: + - /url: /en/get-started/agent-frameworks/google-adk/overview + - listitem [ref=e105]: + - link "Setup (Python)" [ref=e106] [cursor=pointer]: + - /url: /en/get-started/agent-frameworks/google-adk/setup-python + - listitem [ref=e107]: + - link "Setup (TypeScript)" [ref=e108] [cursor=pointer]: + - /url: /en/get-started/agent-frameworks/google-adk/setup-typescript + - listitem [ref=e109]: + - button "LangChain" [ref=e110] [cursor=pointer]: + - text: LangChain + - img [ref=e111] + - list [ref=e113]: + - listitem [ref=e114]: + - link "Overview" [ref=e115] [cursor=pointer]: + - /url: /en/get-started/agent-frameworks/langchain/overview + - listitem [ref=e116]: + - link "Setup (Python)" [ref=e117] [cursor=pointer]: + - /url: /en/get-started/agent-frameworks/langchain/use-arcade-with-langchain-py + - listitem [ref=e118]: + - link "Setup (TypeScript)" [ref=e119] [cursor=pointer]: + - /url: /en/get-started/agent-frameworks/langchain/use-arcade-with-langchain-ts + - listitem [ref=e120]: + - link "Authorizing Existing Tools" [ref=e121] [cursor=pointer]: + - /url: /en/get-started/agent-frameworks/langchain/auth-langchain-tools + - listitem [ref=e122]: + - link "Mastra" [ref=e123] [cursor=pointer]: + - /url: /en/get-started/agent-frameworks/mastra + - listitem [ref=e124]: + - button "OpenAI Agents" [ref=e125] [cursor=pointer]: + - text: OpenAI Agents + - img [ref=e126] + - list [ref=e128]: + - listitem [ref=e129]: + - link "Overview" [ref=e130] [cursor=pointer]: + - /url: /en/get-started/agent-frameworks/openai-agents/overview + - listitem [ref=e131]: + - link "Setup (Python)" [ref=e132] [cursor=pointer]: + - /url: /en/get-started/agent-frameworks/openai-agents/setup-python + - listitem [ref=e133]: + - link "Setup (TypeScript)" [ref=e134] [cursor=pointer]: + - /url: /en/get-started/agent-frameworks/openai-agents/setup-typescript + - listitem [ref=e135]: + - link "TanStack AI" [ref=e136] [cursor=pointer]: + - /url: /en/get-started/agent-frameworks/tanstack-ai + - listitem [ref=e137]: + - link "Vercel AI SDK" [ref=e138] [cursor=pointer]: + - /url: /en/get-started/agent-frameworks/vercelai + - listitem [ref=e139]: + - link "Spring AI SDK" [ref=e140] [cursor=pointer]: + - /url: /en/get-started/agent-frameworks/springai + - listitem [ref=e141]: + - button "MCP Clients" [ref=e142] [cursor=pointer]: + - text: MCP Clients + - img [ref=e143] + - list [ref=e145]: + - listitem [ref=e146]: + - link "Overview" [ref=e147] [cursor=pointer]: + - /url: /en/get-started/mcp-clients + - listitem [ref=e148]: + - link "Cursor" [ref=e149] [cursor=pointer]: + - /url: /en/get-started/mcp-clients/cursor + - listitem [ref=e150]: + - link "Claude Desktop" [ref=e151] [cursor=pointer]: + - /url: /en/get-started/mcp-clients/claude-desktop + - listitem [ref=e152]: + - link "Claude Code" [ref=e153] [cursor=pointer]: + - /url: /en/get-started/mcp-clients/claude-code + - listitem [ref=e154]: + - link "Visual Studio Code" [ref=e155] [cursor=pointer]: + - /url: /en/get-started/mcp-clients/visual-studio-code + - listitem [ref=e156]: + - link "Microsoft Copilot Studio" [ref=e157] [cursor=pointer]: + - /url: /en/get-started/mcp-clients/copilot-studio + - listitem [ref=e158]: + - link "GitHub Copilot" [ref=e159] [cursor=pointer]: + - /url: /en/get-started/mcp-clients/github-copilot + - listitem [ref=e160]: + - button "Resources" [ref=e161] [cursor=pointer]: + - generic [ref=e162]: + - img [ref=e163] + - text: Resources + - img [ref=e166] + - list [ref=e169]: + - listitem [ref=e170]: + - button "Integrations" [ref=e171] [cursor=pointer]: + - text: Integrations + - img [ref=e172] + - list [ref=e174]: + - listitem [ref=e175]: + - link "Overview" [ref=e176] [cursor=pointer]: + - /url: /en/resources/integrations + - listitem [ref=e177]: + - button "Productivity & Docs" [ref=e178] [cursor=pointer]: + - text: Productivity & Docs + - img [ref=e179] + - list [ref=e181]: + - listitem [ref=e182]: Optimized + - listitem [ref=e183]: + - link "Asana" [ref=e184] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/asana + - listitem [ref=e185]: + - link "ClickUp" [ref=e186] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/clickup + - listitem [ref=e187]: + - link "Confluence" [ref=e188] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/confluence + - listitem [ref=e189]: + - link "Dropbox" [ref=e190] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/dropbox + - listitem [ref=e191]: + - link "Figma" [ref=e192] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/figma + - listitem [ref=e193]: + - link "Gmail" [ref=e194] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/gmail + - listitem [ref=e195]: + - link "Google Calendar" [ref=e196] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/google-calendar + - listitem [ref=e197]: + - link "Google Contacts" [ref=e198] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/google-contacts + - listitem [ref=e199]: + - link "Google Docs" [ref=e200] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/google-docs + - listitem [ref=e201]: + - link "Google Drive" [ref=e202] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/google-drive + - listitem [ref=e203]: + - link "Google Sheets" [ref=e204] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/google-sheets + - listitem [ref=e205]: + - link "Google Slides" [ref=e206] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/google-slides + - listitem [ref=e207]: + - link "Granola" [ref=e208] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/granola + - listitem [ref=e209]: + - link "Jira" [ref=e210] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/jira + - listitem [ref=e211]: + - link "Linear" [ref=e212] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/linear + - listitem [ref=e213]: + - link "Microsoft Excel" [ref=e214] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/microsoft-excel + - listitem [ref=e215]: + - link "Microsoft OneDrive" [ref=e216] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/microsoft-onedrive + - listitem [ref=e217]: + - link "Microsoft Outlook Calendar" [ref=e218] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/microsoft-outlook-calendar + - listitem [ref=e219]: + - link "Microsoft Outlook Mail" [ref=e220] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/microsoft-outlook-mail + - listitem [ref=e221]: + - link "Microsoft PowerPoint" [ref=e222] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/microsoft-powerpoint + - listitem [ref=e223]: + - link "Microsoft SharePoint" [ref=e224] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/microsoft-sharepoint + - listitem [ref=e225]: + - link "Microsoft Word" [ref=e226] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/microsoft-word + - listitem [ref=e227]: Starter + - listitem [ref=e228]: + - link "Airtable API" [ref=e229] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/airtable-api + - listitem [ref=e230]: + - link "Asana API" [ref=e231] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/asana-api + - listitem [ref=e232]: + - link "Ashby API" [ref=e233] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/ashby-api + - listitem [ref=e234]: + - link "Box API" [ref=e235] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/box-api + - listitem [ref=e236]: + - link "Calendly API" [ref=e237] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/calendly-api + - listitem [ref=e238]: + - link "ClickUp API" [ref=e239] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/clickup-api + - listitem [ref=e240]: + - link "Figma API" [ref=e241] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/figma-api + - listitem [ref=e242]: + - link "Luma API" [ref=e243] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/luma-api + - listitem [ref=e244]: + - link "Mailchimp API" [ref=e245] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/mailchimp-marketing-api + - listitem [ref=e246]: + - link "Miro API" [ref=e247] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/miro-api + - listitem [ref=e248]: + - link "SquareUp API" [ref=e249] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/squareup-api + - listitem [ref=e250]: + - link "TickTick API" [ref=e251] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/ticktick-api + - listitem [ref=e252]: + - link "Trello API" [ref=e253] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/trello-api + - listitem [ref=e254]: + - link "Xero API" [ref=e255] [cursor=pointer]: + - /url: /en/resources/integrations/productivity/xero-api + - listitem [ref=e256]: + - button "Social & Communication" [ref=e257] [cursor=pointer]: + - text: Social & Communication + - img [ref=e258] + - list [ref=e260]: + - listitem [ref=e261]: Optimized + - listitem [ref=e262]: + - link "LinkedIn" [ref=e263] [cursor=pointer]: + - /url: /en/resources/integrations/social/linkedin + - listitem [ref=e264]: + - link "Microsoft Teams" [ref=e265] [cursor=pointer]: + - /url: /en/resources/integrations/social/microsoft-teams + - listitem [ref=e266]: + - link "Reddit" [ref=e267] [cursor=pointer]: + - /url: /en/resources/integrations/social/reddit + - listitem [ref=e268]: + - link "Slack" [ref=e269] [cursor=pointer]: + - /url: /en/resources/integrations/social/slack + - listitem [ref=e270]: + - link "Telegram" [ref=e271] [cursor=pointer]: + - /url: /en/resources/integrations/social/telegram + - listitem [ref=e272]: + - link "X" [ref=e273] [cursor=pointer]: + - /url: /en/resources/integrations/social/x + - listitem [ref=e274]: + - link "Zoom" [ref=e275] [cursor=pointer]: + - /url: /en/resources/integrations/social/zoom + - listitem [ref=e276]: Starter + - listitem [ref=e277]: + - link "Slack API" [ref=e278] [cursor=pointer]: + - /url: /en/resources/integrations/social/slack-api + - listitem [ref=e279]: + - button "Entertainment" [ref=e280] [cursor=pointer]: + - text: Entertainment + - img [ref=e281] + - list [ref=e283]: + - listitem [ref=e284]: Optimized + - listitem [ref=e285]: + - link "Imgflip" [ref=e286] [cursor=pointer]: + - /url: /en/resources/integrations/entertainment/imgflip + - listitem [ref=e287]: + - link "Spotify" [ref=e288] [cursor=pointer]: + - /url: /en/resources/integrations/entertainment/spotify + - listitem [ref=e289]: + - button "Developer Tools" [ref=e290] [cursor=pointer]: + - text: Developer Tools + - img [ref=e291] + - list [ref=e293]: + - listitem [ref=e294]: Optimized + - listitem [ref=e295]: + - link "Bright Data" [ref=e296] [cursor=pointer]: + - /url: /en/resources/integrations/development/brightdata + - listitem [ref=e297]: + - link "Daytona" [ref=e298] [cursor=pointer]: + - /url: /en/resources/integrations/development/daytona + - listitem [ref=e299]: + - link "E2B" [ref=e300] [cursor=pointer]: + - /url: /en/resources/integrations/development/e2b + - listitem [ref=e301]: + - link "Firecrawl" [ref=e302] [cursor=pointer]: + - /url: /en/resources/integrations/development/firecrawl + - listitem [ref=e303]: + - link "GitHub" [ref=e304] [cursor=pointer]: + - /url: /en/resources/integrations/development/github + - listitem [ref=e305]: + - link "Math" [ref=e306] [cursor=pointer]: + - /url: /en/resources/integrations/development/math + - listitem [ref=e307]: + - link "PagerDuty" [ref=e308] [cursor=pointer]: + - /url: /en/resources/integrations/development/pagerduty + - listitem [ref=e309]: + - link "PostHog" [ref=e310] [cursor=pointer]: + - /url: /en/resources/integrations/development/posthog + - listitem [ref=e311]: Starter + - listitem [ref=e312]: + - link "Arcade Engine API" [ref=e313] [cursor=pointer]: + - /url: /en/resources/integrations/development/arcade-engine-api + - listitem [ref=e314]: + - link "Cursor Agents API" [ref=e315] [cursor=pointer]: + - /url: /en/resources/integrations/development/cursor-agents-api + - listitem [ref=e316]: + - link "Datadog API" [ref=e317] [cursor=pointer]: + - /url: /en/resources/integrations/development/datadog-api + - listitem [ref=e318]: + - link "GitHub API" [ref=e319] [cursor=pointer]: + - /url: /en/resources/integrations/development/github-api + - listitem [ref=e320]: + - link "PostHog API" [ref=e321] [cursor=pointer]: + - /url: /en/resources/integrations/development/posthog-api + - listitem [ref=e322]: + - link "Vercel API" [ref=e323] [cursor=pointer]: + - /url: /en/resources/integrations/development/vercel-api + - listitem [ref=e324]: + - link "Zoho Creator API" [ref=e325] [cursor=pointer]: + - /url: /en/resources/integrations/development/zoho-creator-api + - listitem [ref=e326]: + - button "Payments & Finance" [ref=e327] [cursor=pointer]: + - text: Payments & Finance + - img [ref=e328] + - list [ref=e330]: + - listitem [ref=e331]: Optimized + - listitem [ref=e332]: + - link "Stripe" [ref=e333] [cursor=pointer]: + - /url: /en/resources/integrations/payments/stripe + - listitem [ref=e334]: Starter + - listitem [ref=e335]: + - link "Stripe API" [ref=e336] [cursor=pointer]: + - /url: /en/resources/integrations/payments/stripe_api + - listitem [ref=e337]: + - link "Zoho Books API" [ref=e338] [cursor=pointer]: + - /url: /en/resources/integrations/payments/zoho-books-api + - listitem [ref=e339]: + - button "Search Tools" [ref=e340] [cursor=pointer]: + - text: Search Tools + - img [ref=e341] + - list [ref=e343]: + - listitem [ref=e344]: Optimized + - listitem [ref=e345]: + - link "Google Finance" [ref=e346] [cursor=pointer]: + - /url: /en/resources/integrations/search/google_finance + - listitem [ref=e347]: + - link "Google Flights" [ref=e348] [cursor=pointer]: + - /url: /en/resources/integrations/search/google_flights + - listitem [ref=e349]: + - link "Google Hotels" [ref=e350] [cursor=pointer]: + - /url: /en/resources/integrations/search/google_hotels + - listitem [ref=e351]: + - link "Google Jobs" [ref=e352] [cursor=pointer]: + - /url: /en/resources/integrations/search/google_jobs + - listitem [ref=e353]: + - link "Google Maps" [ref=e354] [cursor=pointer]: + - /url: /en/resources/integrations/search/google_maps + - listitem [ref=e355]: + - link "Google News" [ref=e356] [cursor=pointer]: + - /url: /en/resources/integrations/search/google_news + - listitem [ref=e357]: + - link "Google Search" [ref=e358] [cursor=pointer]: + - /url: /en/resources/integrations/search/google_search + - listitem [ref=e359]: + - link "Google Shopping" [ref=e360] [cursor=pointer]: + - /url: /en/resources/integrations/search/google_shopping + - listitem [ref=e361]: + - link "Walmart" [ref=e362] [cursor=pointer]: + - /url: /en/resources/integrations/search/walmart + - listitem [ref=e363]: + - link "Youtube" [ref=e364] [cursor=pointer]: + - /url: /en/resources/integrations/search/youtube + - listitem [ref=e365]: Starter + - listitem [ref=e366]: + - link "Exa API" [ref=e367] [cursor=pointer]: + - /url: /en/resources/integrations/search/exa-api + - listitem [ref=e368]: + - link "Tavily" [ref=e369] [cursor=pointer]: + - /url: /en/resources/integrations/search/tavily + - listitem [ref=e370]: + - button "Sales" [ref=e371] [cursor=pointer]: + - text: Sales + - img [ref=e372] + - list [ref=e374]: + - listitem [ref=e375]: Optimized + - listitem [ref=e376]: + - link "Attio" [ref=e377] [cursor=pointer]: + - /url: /en/resources/integrations/sales/attio + - listitem [ref=e378]: + - link "HubSpot" [ref=e379] [cursor=pointer]: + - /url: /en/resources/integrations/sales/hubspot + - listitem [ref=e380]: + - link "Salesforce" [ref=e381] [cursor=pointer]: + - /url: /en/resources/integrations/sales/salesforce + - listitem [ref=e382]: Starter + - listitem [ref=e383]: + - link "HubSpot Automation API" [ref=e384] [cursor=pointer]: + - /url: /en/resources/integrations/sales/hubspot-automation-api + - listitem [ref=e385]: + - link "HubSpot CMS API" [ref=e386] [cursor=pointer]: + - /url: /en/resources/integrations/sales/hubspot-cms-api + - listitem [ref=e387]: + - link "HubSpot Conversations API" [ref=e388] [cursor=pointer]: + - /url: /en/resources/integrations/sales/hubspot-conversations-api + - listitem [ref=e389]: + - link "HubSpot CRM API" [ref=e390] [cursor=pointer]: + - /url: /en/resources/integrations/sales/hubspot-crm-api + - listitem [ref=e391]: + - link "HubSpot Events API" [ref=e392] [cursor=pointer]: + - /url: /en/resources/integrations/sales/hubspot-events-api + - listitem [ref=e393]: + - link "HubSpot Marketing API" [ref=e394] [cursor=pointer]: + - /url: /en/resources/integrations/sales/hubspot-marketing-api + - listitem [ref=e395]: + - link "HubSpot Meetings API" [ref=e396] [cursor=pointer]: + - /url: /en/resources/integrations/sales/hubspot-meetings-api + - listitem [ref=e397]: + - link "HubSpot Users API" [ref=e398] [cursor=pointer]: + - /url: /en/resources/integrations/sales/hubspot-users-api + - listitem [ref=e399]: + - button "Databases" [ref=e400] [cursor=pointer]: + - text: Databases + - img [ref=e401] + - list [ref=e403]: + - listitem [ref=e404]: Optimized + - listitem [ref=e405]: + - link "Clickhouse" [ref=e406] [cursor=pointer]: + - /url: /en/resources/integrations/databases/clickhouse + - listitem [ref=e407]: + - link "MongoDB" [ref=e408] [cursor=pointer]: + - /url: /en/resources/integrations/databases/mongodb + - listitem [ref=e409]: + - link "Postgres" [ref=e410] [cursor=pointer]: + - /url: /en/resources/integrations/databases/postgres + - listitem [ref=e411]: Starter + - listitem [ref=e412]: + - link "Weaviate API" [ref=e413] [cursor=pointer]: + - /url: /en/resources/integrations/databases/weaviate-api + - listitem [ref=e414]: + - link "YugabyteDB" [ref=e415] [cursor=pointer]: + - /url: /en/resources/integrations/databases/yugabytedb + - listitem [ref=e416]: + - button "Customer Support" [ref=e417] [cursor=pointer]: + - text: Customer Support + - img [ref=e418] + - list [ref=e420]: + - listitem [ref=e421]: Optimized + - listitem [ref=e422]: + - link "Pylon" [ref=e423] [cursor=pointer]: + - /url: /en/resources/integrations/customer-support/pylon + - listitem [ref=e424]: + - link "Zendesk" [ref=e425] [cursor=pointer]: + - /url: /en/resources/integrations/customer-support/zendesk + - listitem [ref=e426]: Starter + - listitem [ref=e427]: + - link "Customer.io API" [ref=e428] [cursor=pointer]: + - /url: /en/resources/integrations/customer-support/customerio-api + - listitem [ref=e429]: + - link "Customer.io Pipelines API" [ref=e430] [cursor=pointer]: + - /url: /en/resources/integrations/customer-support/customerio-pipelines-api + - listitem [ref=e431]: + - link "Customer.io Track API" [ref=e432] [cursor=pointer]: + - /url: /en/resources/integrations/customer-support/customerio-track-api + - listitem [ref=e433]: + - link "Freshservice API" [ref=e434] [cursor=pointer]: + - /url: /en/resources/integrations/customer-support/freshservice-api + - listitem [ref=e435]: + - link "Intercom API" [ref=e436] [cursor=pointer]: + - /url: /en/resources/integrations/customer-support/intercom-api + - listitem [ref=e437]: + - link "PagerDuty API" [ref=e438] [cursor=pointer]: + - /url: /en/resources/integrations/customer-support/pagerduty-api + - listitem [ref=e439]: + - link "Pylon API" [ref=e440] [cursor=pointer]: + - /url: /en/resources/integrations/customer-support/pylon-api + - listitem [ref=e441]: Feedback + - listitem [ref=e442]: + - link "Tool Feedback" [ref=e443] [cursor=pointer]: + - /url: /en/resources/integrations/tool-feedback + - listitem [ref=e444]: + - link "Examples" [ref=e445] [cursor=pointer]: + - /url: /en/resources/examples + - listitem [ref=e446]: + - link "Tools" [ref=e447] [cursor=pointer]: + - /url: /en/resources/tools + - listitem [ref=e448]: + - link "Glossary" [ref=e449] [cursor=pointer]: + - /url: /en/resources/glossary + - listitem [ref=e450]: + - link "FAQ" [ref=e451] [cursor=pointer]: + - /url: /en/resources/faq + - listitem [ref=e452]: + - link "Security research program" [ref=e453] [cursor=pointer]: + - /url: /en/resources/security-research-program + - listitem [ref=e454]: + - link "Contact" [ref=e455] [cursor=pointer]: + - /url: /en/resources/contact-us + - listitem [ref=e456]: + - link "Arcade Registry Early Access" [ref=e457] [cursor=pointer]: + - /url: /en/resources/registry-early-access + - listitem [ref=e458]: + - button "Guides" [ref=e459] [cursor=pointer]: + - generic [ref=e460]: + - img [ref=e461] + - text: Guides + - img [ref=e467] + - list [ref=e470]: + - listitem [ref=e471]: + - link "Audit Logs" [ref=e472] [cursor=pointer]: + - /url: /en/guides/audit-logs + - listitem [ref=e473]: + - button "Contextual Access" [ref=e474] [cursor=pointer]: + - text: Contextual Access + - img [ref=e475] + - list [ref=e477]: + - listitem [ref=e478]: + - link "Contextual Access" [ref=e479] [cursor=pointer]: + - /url: /en/guides/contextual-access + - listitem [ref=e480]: + - link "How Hooks Work" [ref=e481] [cursor=pointer]: + - /url: /en/guides/contextual-access/how-hooks-work + - listitem [ref=e482]: + - link "Running an Extension" [ref=e483] [cursor=pointer]: + - /url: /en/guides/contextual-access/examples + - listitem [ref=e484]: + - link "Build Your Own" [ref=e485] [cursor=pointer]: + - /url: /en/guides/contextual-access/build-your-own + - listitem [ref=e486]: + - button "MCP Gateways" [ref=e487] [cursor=pointer]: + - text: MCP Gateways + - img [ref=e488] + - list [ref=e490]: + - listitem [ref=e491]: + - link "MCP Gateways" [ref=e492] [cursor=pointer]: + - /url: /en/guides/mcp-gateways + - listitem [ref=e493]: + - link "Add remote MCP servers" [ref=e494] [cursor=pointer]: + - /url: /en/guides/mcp-gateways/add-remote-servers + - listitem [ref=e495]: + - link "Create via Dashboard" [ref=e496] [cursor=pointer]: + - /url: /en/guides/mcp-gateways/create-via-dashboard + - listitem [ref=e497]: + - link "Create via AI Assistant" [ref=e498] [cursor=pointer]: + - /url: /en/guides/mcp-gateways/create-via-ai + - listitem [ref=e499]: + - button "Call tools" [ref=e500] [cursor=pointer]: + - text: Call tools + - img [ref=e501] + - list [ref=e503]: + - listitem [ref=e504]: + - link "Overview" [ref=e505] [cursor=pointer]: + - /url: /en/guides/tool-calling + - listitem [ref=e506]: + - link "Handling errors" [ref=e507] [cursor=pointer]: + - /url: /en/guides/tool-calling/error-handling + - listitem [ref=e508]: + - link "Call third-party APIs" [ref=e509] [cursor=pointer]: + - /url: /en/guides/tool-calling/call-third-party-apis + - listitem [ref=e510]: + - button "In custom applications" [ref=e511] [cursor=pointer]: + - text: In custom applications + - img [ref=e512] + - list [ref=e514]: + - listitem [ref=e515]: + - link "Overview" [ref=e516] [cursor=pointer]: + - /url: /en/guides/tool-calling/custom-apps + - listitem [ref=e517]: + - link "Authorize tool calling" [ref=e518] [cursor=pointer]: + - /url: /en/guides/tool-calling/custom-apps/auth-tool-calling + - listitem [ref=e519]: + - link "Check authorization status" [ref=e520] [cursor=pointer]: + - /url: /en/guides/tool-calling/custom-apps/check-auth-status + - listitem [ref=e521]: + - link "Get formatted tool definitions" [ref=e522] [cursor=pointer]: + - /url: /en/guides/tool-calling/custom-apps/get-tool-definitions + - listitem [ref=e523]: + - button "Create tools" [ref=e524] [cursor=pointer]: + - text: Create tools + - img [ref=e525] + - list [ref=e527]: + - listitem [ref=e528]: + - button "Build a tool" [ref=e529] [cursor=pointer]: + - text: Build a tool + - img [ref=e530] + - list [ref=e532]: + - listitem [ref=e533]: + - link "Overview" [ref=e534] [cursor=pointer]: + - /url: /en/guides/create-tools/tool-basics + - listitem [ref=e535]: + - link "Compare MCP server types" [ref=e536] [cursor=pointer]: + - /url: /en/guides/create-tools/tool-basics/compare-server-types + - listitem [ref=e537]: + - link "Build an MCP Server to write custom tools" [ref=e538] [cursor=pointer]: + - /url: /en/guides/create-tools/tool-basics/build-mcp-server + - listitem [ref=e539]: + - link "Create a tool with auth" [ref=e540] [cursor=pointer]: + - /url: /en/guides/create-tools/tool-basics/create-tool-auth + - listitem [ref=e541]: + - link "Create a tool with secrets" [ref=e542] [cursor=pointer]: + - /url: /en/guides/create-tools/tool-basics/create-tool-secrets + - listitem [ref=e543]: + - link "Access runtime data" [ref=e544] [cursor=pointer]: + - /url: /en/guides/create-tools/tool-basics/runtime-data-access + - listitem [ref=e545]: + - link "Call tools from MCP clients" [ref=e546] [cursor=pointer]: + - /url: /en/guides/create-tools/tool-basics/call-tools-mcp + - listitem [ref=e547]: + - link "Organize your MCP server and tools" [ref=e548] [cursor=pointer]: + - /url: /en/guides/create-tools/tool-basics/organize-mcp-tools + - listitem [ref=e549]: + - link "Add metadata to your tools" [ref=e550] [cursor=pointer]: + - /url: /en/guides/create-tools/tool-basics/add-tool-metadata + - listitem [ref=e551]: + - button "Evaluate tools" [ref=e552] [cursor=pointer]: + - text: Evaluate tools + - img [ref=e553] + - list [ref=e555]: + - listitem [ref=e556]: + - link "Overview" [ref=e557] [cursor=pointer]: + - /url: /en/guides/create-tools/evaluate-tools + - listitem [ref=e558]: + - link "Why evaluate tools?" [ref=e559] [cursor=pointer]: + - /url: /en/guides/create-tools/evaluate-tools/why-evaluate + - listitem [ref=e560]: + - link "Create an evaluation suite" [ref=e561] [cursor=pointer]: + - /url: /en/guides/create-tools/evaluate-tools/create-evaluation-suite + - listitem [ref=e562]: + - link "Run evaluations" [ref=e563] [cursor=pointer]: + - /url: /en/guides/create-tools/evaluate-tools/run-evaluations + - listitem [ref=e564]: + - link "Capture mode" [ref=e565] [cursor=pointer]: + - /url: /en/guides/create-tools/evaluate-tools/capture-mode + - listitem [ref=e566]: + - link "Comparative evaluations" [ref=e567] [cursor=pointer]: + - /url: /en/guides/create-tools/evaluate-tools/comparative-evaluations + - listitem [ref=e568]: + - button "Improve an existing toolkit" [ref=e569] [cursor=pointer]: + - text: Improve an existing toolkit + - img [ref=e570] + - list [ref=e572]: + - listitem [ref=e573]: + - link "Types of Tools" [ref=e574] [cursor=pointer]: + - /url: /en/guides/create-tools/improve/types-of-tools + - listitem [ref=e575]: + - button "Handle errors" [ref=e576] [cursor=pointer]: + - text: Handle errors + - img [ref=e577] + - list [ref=e579]: + - listitem [ref=e580]: + - link "Overview" [ref=e581] [cursor=pointer]: + - /url: /en/guides/create-tools/error-handling + - listitem [ref=e582]: + - link "Retry Tools with Improved Prompt" [ref=e583] [cursor=pointer]: + - /url: /en/guides/create-tools/error-handling/retry-tools + - listitem [ref=e584]: + - link "Provide Useful Tool Errors" [ref=e585] [cursor=pointer]: + - /url: /en/guides/create-tools/error-handling/useful-tool-errors + - listitem [ref=e586]: + - button "Secure your server" [ref=e587] [cursor=pointer]: + - text: Secure your server + - img [ref=e588] + - list [ref=e590]: + - listitem [ref=e591]: + - link "Overview" [ref=e592] [cursor=pointer]: + - /url: /en/guides/create-tools/secure-your-server + - listitem [ref=e593]: + - link "Add Resource Server auth" [ref=e594] [cursor=pointer]: + - /url: /en/guides/create-tools/secure-your-server/secure-your-mcp-server + - listitem [ref=e595]: + - link "Migrate from toolkits to MCP servers" [ref=e596] [cursor=pointer]: + - /url: /en/guides/create-tools/migrate-toolkits + - listitem [ref=e597]: + - button "User-facing agents" [ref=e598] [cursor=pointer]: + - text: User-facing agents + - img [ref=e599] + - list [ref=e601]: + - listitem [ref=e602]: + - link "Secure Auth in Production" [ref=e603] [cursor=pointer]: + - /url: /en/guides/user-facing-agents/secure-auth-production + - listitem [ref=e604]: + - button "Deployment & hosting" [ref=e605] [cursor=pointer]: + - text: Deployment & hosting + - img [ref=e606] + - list [ref=e608]: + - listitem [ref=e609]: + - link "Overview" [ref=e610] [cursor=pointer]: + - /url: /en/guides/deployment-hosting + - listitem [ref=e611]: + - link "Arcade Cloud" [ref=e612] [cursor=pointer]: + - /url: /en/guides/deployment-hosting/arcade-cloud + - listitem [ref=e613]: + - link "On-premises MCP servers" [ref=e614] [cursor=pointer]: + - /url: /en/guides/deployment-hosting/on-prem + - listitem [ref=e615]: + - link "Configure Arcade's engine" [ref=e616] [cursor=pointer]: + - /url: /en/guides/deployment-hosting/configure-engine + - listitem [ref=e617]: + - link "Arcade Deploy" [ref=e618] [cursor=pointer]: + - /url: /en/guides/deployment-hosting/arcade-deploy + - listitem [ref=e619]: + - button "Logic Extensions" [ref=e620] [cursor=pointer]: + - text: Logic Extensions + - img [ref=e621] + - list [ref=e623]: + - listitem [ref=e624]: + - link "Build Your Own" [ref=e625] [cursor=pointer]: + - /url: /en/guides/logic-extensions/build-your-own + - listitem [ref=e626]: + - button "Learn" [ref=e627] [cursor=pointer]: + - generic [ref=e628]: + - img [ref=e629] + - text: Learn + - img [ref=e631] + - list [ref=e634]: + - listitem [ref=e635]: + - link "Server-Level vs Tool-Level Authorization" [ref=e636] [cursor=pointer]: + - /url: /en/learn/server-level-vs-tool-level-auth + - listitem [ref=e637]: + - button "References" [ref=e638] [cursor=pointer]: + - generic [ref=e639]: + - img [ref=e640] + - text: References + - img [ref=e643] + - list [ref=e646]: + - listitem [ref=e647]: + - link "Overview" [ref=e648] [cursor=pointer]: + - /url: /en/references + - listitem [ref=e649]: + - link "Changelog" [ref=e650] [cursor=pointer]: + - /url: /en/references/changelog + - listitem [ref=e651]: + - link "API" [ref=e652] [cursor=pointer]: + - /url: /en/references/api + - listitem [ref=e653]: + - button "Arcade MCP" [ref=e654] [cursor=pointer]: + - text: Arcade MCP + - img [ref=e655] + - list [ref=e657]: + - listitem [ref=e658]: + - button "Python" [ref=e659] [cursor=pointer]: + - text: Python + - img [ref=e660] + - list [ref=e662]: + - listitem [ref=e663]: + - link "Overview" [ref=e664] [cursor=pointer]: + - /url: /en/references/mcp/python + - listitem [ref=e665]: + - link "Context" [ref=e666] [cursor=pointer]: + - /url: /en/references/mcp/python/context + - listitem [ref=e667]: + - link "Resources" [ref=e668] [cursor=pointer]: + - /url: /en/references/mcp/python/resources + - listitem [ref=e669]: + - link "Server" [ref=e670] [cursor=pointer]: + - /url: /en/references/mcp/python/server + - listitem [ref=e671]: + - link "Settings" [ref=e672] [cursor=pointer]: + - /url: /en/references/mcp/python/settings + - listitem [ref=e673]: + - link "Middleware" [ref=e674] [cursor=pointer]: + - /url: /en/references/mcp/python/middleware + - listitem [ref=e675]: + - link "Errors" [ref=e676] [cursor=pointer]: + - /url: /en/references/mcp/python/errors + - listitem [ref=e677]: + - link "Telemetry" [ref=e678] [cursor=pointer]: + - /url: /en/references/mcp/telemetry + - listitem [ref=e679]: + - link "Arcade CLI" [ref=e680] [cursor=pointer]: + - /url: /en/references/arcade-cli + - listitem [ref=e681]: + - link "CLI Cheat Sheet" [ref=e682] [cursor=pointer]: + - /url: /en/references/cli-cheat-sheet + - listitem [ref=e683]: + - link "Contextual Access Webhook API" [ref=e684] [cursor=pointer]: + - /url: /en/references/contextual-access-webhook-api + - listitem [ref=e685]: + - button "Auth Providers" [ref=e686] [cursor=pointer]: + - text: Auth Providers + - img [ref=e687] + - list [ref=e689]: + - listitem [ref=e690]: + - link "Overview" [ref=e691] [cursor=pointer]: + - /url: /en/references/auth-providers + - listitem [ref=e692]: + - link "OAuth 2.0" [ref=e693] [cursor=pointer]: + - /url: /en/references/auth-providers/oauth2 + - listitem [ref=e694]: + - link "Airtable" [ref=e695] [cursor=pointer]: + - /url: /en/references/auth-providers/airtable + - listitem [ref=e696]: + - link "Asana" [ref=e697] [cursor=pointer]: + - /url: /en/references/auth-providers/asana + - listitem [ref=e698]: + - link "Atlassian" [ref=e699] [cursor=pointer]: + - /url: /en/references/auth-providers/atlassian + - listitem [ref=e700]: + - link "Attio" [ref=e701] [cursor=pointer]: + - /url: /en/references/auth-providers/attio + - listitem [ref=e702]: + - link "Calendly" [ref=e703] [cursor=pointer]: + - /url: /en/references/auth-providers/calendly + - listitem [ref=e704]: + - link "ClickUp" [ref=e705] [cursor=pointer]: + - /url: /en/references/auth-providers/clickup + - listitem [ref=e706]: + - link "Discord" [ref=e707] [cursor=pointer]: + - /url: /en/references/auth-providers/discord + - listitem [ref=e708]: + - link "Dropbox" [ref=e709] [cursor=pointer]: + - /url: /en/references/auth-providers/dropbox + - listitem [ref=e710]: + - link "Figma" [ref=e711] [cursor=pointer]: + - /url: /en/references/auth-providers/figma + - listitem [ref=e712]: + - link "GitHub" [ref=e713] [cursor=pointer]: + - /url: /en/references/auth-providers/github + - listitem [ref=e714]: + - link "Google" [ref=e715] [cursor=pointer]: + - /url: /en/references/auth-providers/google + - listitem [ref=e716]: + - link "Hubspot" [ref=e717] [cursor=pointer]: + - /url: /en/references/auth-providers/hubspot + - listitem [ref=e718]: + - link "Linear" [ref=e719] [cursor=pointer]: + - /url: /en/references/auth-providers/linear + - listitem [ref=e720]: + - link "LinkedIn" [ref=e721] [cursor=pointer]: + - /url: /en/references/auth-providers/linkedin + - listitem [ref=e722]: + - link "Mailchimp" [ref=e723] [cursor=pointer]: + - /url: /en/references/auth-providers/mailchimp + - listitem [ref=e724]: + - link "Microsoft" [ref=e725] [cursor=pointer]: + - /url: /en/references/auth-providers/microsoft + - listitem [ref=e726]: + - link "Miro" [ref=e727] [cursor=pointer]: + - /url: /en/references/auth-providers/miro + - listitem [ref=e728]: + - link "Notion" [ref=e729] [cursor=pointer]: + - /url: /en/references/auth-providers/notion + - listitem [ref=e730]: + - link "PagerDuty" [ref=e731] [cursor=pointer]: + - /url: /en/references/auth-providers/pagerduty + - listitem [ref=e732]: + - link "Reddit" [ref=e733] [cursor=pointer]: + - /url: /en/references/auth-providers/reddit + - listitem [ref=e734]: + - link "Salesforce" [ref=e735] [cursor=pointer]: + - /url: /en/references/auth-providers/salesforce + - listitem [ref=e736]: + - link "Slack" [ref=e737] [cursor=pointer]: + - /url: /en/references/auth-providers/slack + - listitem [ref=e738]: + - link "Spotify" [ref=e739] [cursor=pointer]: + - /url: /en/references/auth-providers/spotify + - listitem [ref=e740]: + - link "Square" [ref=e741] [cursor=pointer]: + - /url: /en/references/auth-providers/square + - listitem [ref=e742]: + - link "TickTick" [ref=e743] [cursor=pointer]: + - /url: /en/references/auth-providers/ticktick + - listitem [ref=e744]: + - link "Twitch" [ref=e745] [cursor=pointer]: + - /url: /en/references/auth-providers/twitch + - listitem [ref=e746]: + - link "X" [ref=e747] [cursor=pointer]: + - /url: /en/references/auth-providers/x + - listitem [ref=e748]: + - link "Zendesk" [ref=e749] [cursor=pointer]: + - /url: /en/references/auth-providers/zendesk + - listitem [ref=e750]: + - link "Zoho" [ref=e751] [cursor=pointer]: + - /url: /en/references/auth-providers/zoho + - listitem [ref=e752]: + - link "Zoom" [ref=e753] [cursor=pointer]: + - /url: /en/references/auth-providers/zoom + - generic [ref=e754]: + - button "English" [ref=e755] [cursor=pointer]: + - img [ref=e756] + - text: English + - button "Change theme" [ref=e758] [cursor=pointer]: + - img [ref=e1185] + - button "Collapse sidebar" [expanded] [ref=e761] [cursor=pointer]: + - img [ref=e762] + - article [ref=e765]: + - main [ref=e766]: + - generic [ref=e767]: + - generic [ref=e772]: + - heading "MCP Runtime for AI agents that get things done." [level=1] [ref=e773] + - paragraph [ref=e774]: Arcade handles OAuth, manages user tokens, and gives you 7,000+ pre-built integrations so your agents can take real action in production. + - generic [ref=e775]: + - link "Get Started" [ref=e776] [cursor=pointer]: + - /url: /get-started/quickstarts/call-tool-agent + - img + - text: Get Started + - link "Explore Tools" [ref=e777] [cursor=pointer]: + - /url: /en/resources/integrations + - img + - text: Explore Tools + - link "These docs are LLM-friendly — AI agents get clean markdown automatically" [ref=e779] [cursor=pointer]: + - /url: /get-started/setup/connect-arcade-docs + - img [ref=e780] + - text: These docs are LLM-friendly — AI agents get clean markdown automatically + - img [ref=e783] + - generic [ref=e787]: + - heading "Get Tools" [level=2] [ref=e788] + - link "Pre-built Integrations Browse 7,000+ ready-to-use integrations for Gmail, Slack, GitHub, and more. Gmail Slack GitHub Google Sheets Jira Notion Linear HubSpot Stripe Google Drive Dropbox Confluence Reddit Learn more" [ref=e792] [cursor=pointer]: + - /url: /en/resources/integrations + - generic [ref=e793]: + - img [ref=e795] + - generic [ref=e797]: Pre-built Integrations + - generic [ref=e798]: + - paragraph [ref=e799]: Browse 7,000+ ready-to-use integrations for Gmail, Slack, GitHub, and more. + - generic [ref=e801]: + - img "Gmail" [ref=e802] + - img "Slack" [ref=e803] + - img "GitHub" [ref=e804] + - img "Google Sheets" [ref=e805] + - img "Jira" [ref=e806] + - img "Notion" [ref=e807] + - img "Linear" [ref=e808] + - img "HubSpot" [ref=e809] + - img "Stripe" [ref=e810] + - img "Google Drive" [ref=e811] + - img "Dropbox" [ref=e812] + - img "Confluence" [ref=e813] + - img "Reddit" [ref=e814] + - generic [ref=e815]: + - text: Learn more + - img [ref=e816] + - link "Build Custom Tools Create your own MCP servers and custom tools with our SDK. Learn more" [ref=e821] [cursor=pointer]: + - /url: /guides/create-tools/tool-basics/build-mcp-server + - generic [ref=e822]: + - img [ref=e824] + - generic [ref=e826]: Build Custom Tools + - generic [ref=e827]: + - paragraph [ref=e828]: Create your own MCP servers and custom tools with our SDK. + - generic [ref=e829]: + - text: Learn more + - img [ref=e830] + - heading "Use Arcade" [level=2] [ref=e832] + - link "Connect to Your IDE Add tools to Cursor, VS Code, Claude Desktop, or any MCP client. Cursor VS Code Claude Desktop Learn more" [ref=e836] [cursor=pointer]: + - /url: /get-started/mcp-clients + - generic [ref=e837]: + - img [ref=e839] + - generic [ref=e841]: Connect to Your IDE + - generic [ref=e842]: + - paragraph [ref=e843]: Add tools to Cursor, VS Code, Claude Desktop, or any MCP client. + - generic [ref=e845]: + - img "Cursor" [ref=e846] + - img "VS Code" [ref=e847] + - img "Claude Desktop" [ref=e848] + - generic [ref=e849]: + - text: Learn more + - img [ref=e850] + - link "Power Your Agent Integrate with AG2, LangChain, OpenAI Agents, CrewAI, Vercel AI, and more. AG2 LangChain OpenAI CrewAI Vercel AI Google ADK Mastra TanStack AI Learn more" [ref=e855] [cursor=pointer]: + - /url: /get-started/agent-frameworks + - generic [ref=e856]: + - img [ref=e858] + - generic [ref=e861]: Power Your Agent + - generic [ref=e862]: + - paragraph [ref=e863]: Integrate with AG2, LangChain, OpenAI Agents, CrewAI, Vercel AI, and more. + - generic [ref=e865]: + - img "AG2" [ref=e866] + - img "LangChain" [ref=e867] + - img "OpenAI" [ref=e868] + - img "CrewAI" [ref=e869] + - img "Vercel AI" [ref=e870] + - img "Google ADK" [ref=e871] + - img "Mastra" [ref=e872] + - img "TanStack AI" [ref=e873] + - generic [ref=e874]: + - text: Learn more + - img [ref=e875] + - generic [ref=e878]: + - generic [ref=e879]: + - generic [ref=e880]: + - heading "Popular Integrations" [level=2] [ref=e881] + - paragraph [ref=e882]: Pre-built MCP servers ready to use with your agents. + - link "See all 7,000+" [ref=e883] [cursor=pointer]: + - /url: /en/resources/integrations + - text: See all 7,000+ + - img + - generic [ref=e884]: + - generic [ref=e885]: + - link "Google Sheets Google Sheets" [ref=e886] [cursor=pointer]: + - /url: /resources/integrations/productivity/google-sheets + - img "Google Sheets" [ref=e888] + - generic [ref=e889]: Google Sheets + - link "Jira Jira" [ref=e890] [cursor=pointer]: + - /url: /resources/integrations/productivity/jira + - img "Jira" [ref=e892] + - generic [ref=e893]: Jira + - link "Gmail Gmail" [ref=e894] [cursor=pointer]: + - /url: /resources/integrations/productivity/gmail + - img "Gmail" [ref=e896] + - generic [ref=e897]: Gmail + - link "Confluence Confluence" [ref=e898] [cursor=pointer]: + - /url: /resources/integrations/productivity/confluence + - img "Confluence" [ref=e900] + - generic [ref=e901]: Confluence + - link "Slack Slack" [ref=e902] [cursor=pointer]: + - /url: /resources/integrations/social/slack + - img "Slack" [ref=e904] + - generic [ref=e905]: Slack + - link "Google Docs Google Docs" [ref=e906] [cursor=pointer]: + - /url: /resources/integrations/productivity/google-docs + - img "Google Docs" [ref=e908] + - generic [ref=e909]: Google Docs + - link "Google Slides Google Slides" [ref=e910] [cursor=pointer]: + - /url: /resources/integrations/productivity/google-slides + - img "Google Slides" [ref=e912] + - generic [ref=e913]: Google Slides + - link "HubSpot HubSpot" [ref=e914] [cursor=pointer]: + - /url: /resources/integrations/sales/hubspot + - img "HubSpot" [ref=e916] + - generic [ref=e917]: HubSpot + - link "Linear Linear" [ref=e918] [cursor=pointer]: + - /url: /resources/integrations/productivity/linear + - img "Linear" [ref=e920] + - generic [ref=e921]: Linear + - link "Google Drive Google Drive" [ref=e922] [cursor=pointer]: + - /url: /resources/integrations/productivity/google-drive + - img "Google Drive" [ref=e924] + - generic [ref=e925]: Google Drive + - generic [ref=e926]: + - link "GitHub GitHub" [ref=e927] [cursor=pointer]: + - /url: /resources/integrations/development/github + - img "GitHub" [ref=e929] + - generic [ref=e930]: GitHub + - link "X X" [ref=e931] [cursor=pointer]: + - /url: /resources/integrations/social/x + - img "X" [ref=e933] + - generic [ref=e934]: X + - link "MS Teams MS Teams" [ref=e935] [cursor=pointer]: + - /url: /resources/integrations/social/microsoft-teams + - img "MS Teams" [ref=e937] + - generic [ref=e938]: MS Teams + - link "Stripe Stripe" [ref=e939] [cursor=pointer]: + - /url: /resources/integrations/payments/stripe + - img "Stripe" [ref=e941] + - generic [ref=e942]: Stripe + - link "Notion Notion" [ref=e943] [cursor=pointer]: + - /url: /resources/integrations/productivity/notion + - img "Notion" [ref=e945] + - generic [ref=e946]: Notion + - link "Asana Asana" [ref=e947] [cursor=pointer]: + - /url: /resources/integrations/productivity/asana + - img "Asana" [ref=e949] + - generic [ref=e950]: Asana + - link "Reddit Reddit" [ref=e951] [cursor=pointer]: + - /url: /resources/integrations/social/reddit + - img "Reddit" [ref=e953] + - generic [ref=e954]: Reddit + - link "YouTube YouTube" [ref=e955] [cursor=pointer]: + - /url: /resources/integrations/search/youtube + - img "YouTube" [ref=e957] + - generic [ref=e958]: YouTube + - link "Dropbox Dropbox" [ref=e959] [cursor=pointer]: + - /url: /resources/integrations/productivity/dropbox + - img "Dropbox" [ref=e961] + - generic [ref=e962]: Dropbox + - generic [ref=e964]: + - generic [ref=e965]: + - heading "Works With Your Stack" [level=2] [ref=e966] + - paragraph [ref=e967]: Arcade integrates with popular agent frameworks and LLM providers. + - generic [ref=e968]: + - link "AG2 AG2" [ref=e969] [cursor=pointer]: + - /url: /get-started/agent-frameworks/ag2/use-arcade-tools + - img "AG2" [ref=e971] + - generic [ref=e972]: AG2 + - link "LangChain LangChain" [ref=e973] [cursor=pointer]: + - /url: /guides/agent-frameworks/langchain/use-arcade-tools + - img "LangChain" [ref=e975] + - generic [ref=e976]: LangChain + - link "OpenAI Agents OpenAI Agents" [ref=e977] [cursor=pointer]: + - /url: /get-started/agent-frameworks/openai-agents/overview + - img "OpenAI Agents" [ref=e979] + - generic [ref=e980]: OpenAI Agents + - link "CrewAI CrewAI" [ref=e981] [cursor=pointer]: + - /url: /guides/agent-frameworks/crewai/use-arcade-tools + - img "CrewAI" [ref=e983] + - generic [ref=e984]: CrewAI + - link "Vercel AI Vercel AI" [ref=e985] [cursor=pointer]: + - /url: /guides/agent-frameworks/vercelai + - img "Vercel AI" [ref=e987] + - generic [ref=e988]: Vercel AI + - link "Google ADK Google ADK" [ref=e989] [cursor=pointer]: + - /url: /guides/agent-frameworks/google-adk/use-arcade-tools + - img "Google ADK" [ref=e991] + - generic [ref=e992]: Google ADK + - link "Mastra Mastra" [ref=e993] [cursor=pointer]: + - /url: /guides/agent-frameworks/mastra/use-arcade-tools + - img "Mastra" [ref=e995] + - generic [ref=e996]: Mastra + - link "TanStack AI TanStack AI" [ref=e997] [cursor=pointer]: + - /url: /get-started/agent-frameworks/tanstack-ai + - img "TanStack AI" [ref=e999] + - generic [ref=e1000]: TanStack AI + - generic [ref=e1002]: + - generic [ref=e1003]: + - heading "How Arcade Works" [level=2] [ref=e1004] + - paragraph [ref=e1005]: Three core components that power your AI agents. + - generic [ref=e1006]: + - link "Runtime Your MCP server and agentic tool provider. Manages authentication, tool registration, and execution. Learn more" [ref=e1009] [cursor=pointer]: + - /url: /get-started/about-arcade + - generic [ref=e1010]: + - img [ref=e1012] + - generic [ref=e1023]: Runtime + - generic [ref=e1024]: + - paragraph [ref=e1025]: Your MCP server and agentic tool provider. Manages authentication, tool registration, and execution. + - generic [ref=e1026]: + - text: Learn more + - img [ref=e1027] + - link "Tool Catalog Catalog of pre-built tools and integrations. Browse 7,000+ ready-to-use MCP servers. Learn more" [ref=e1031] [cursor=pointer]: + - /url: /en/resources/integrations + - generic [ref=e1032]: + - img [ref=e1034] + - generic [ref=e1038]: Tool Catalog + - generic [ref=e1039]: + - paragraph [ref=e1040]: Catalog of pre-built tools and integrations. Browse 7,000+ ready-to-use MCP servers. + - generic [ref=e1041]: + - text: Learn more + - img [ref=e1042] + - link "Agent Authorization Let agents act on behalf of users. Handle OAuth, API keys, and tokens for tools like Gmail and Google Drive. Learn more" [ref=e1046] [cursor=pointer]: + - /url: /guides/tool-calling/custom-apps/auth-tool-calling + - generic [ref=e1047]: + - img [ref=e1049] + - generic [ref=e1051]: Agent Authorization + - generic [ref=e1052]: + - paragraph [ref=e1053]: Let agents act on behalf of users. Handle OAuth, API keys, and tokens for tools like Gmail and Google Drive. + - generic [ref=e1054]: + - text: Learn more + - img [ref=e1055] + - generic [ref=e1058]: + - generic [ref=e1059]: + - generic [ref=e1060]: + - heading "Sample Applications" [level=2] [ref=e1061] + - paragraph [ref=e1062]: See Arcade in action with these example applications. + - link "See all examples" [ref=e1063] [cursor=pointer]: + - /url: /resources/examples + - text: See all examples + - img + - generic [ref=e1064]: + - link "Arcade Chat A chatbot that can help you with your daily tasks." [ref=e1066] [cursor=pointer]: + - /url: https://chat.arcade.dev/ + - generic [ref=e1069]: + - heading "Arcade Chat" [level=3] [ref=e1071] + - paragraph [ref=e1072]: A chatbot that can help you with your daily tasks. + - link "Archer A bot for Slack that can act on your behalf." [ref=e1074] [cursor=pointer]: + - /url: https://github.com/ArcadeAI/ArcadeSlackAgent + - generic [ref=e1077]: + - heading "Archer" [level=3] [ref=e1079] + - paragraph [ref=e1080]: A bot for Slack that can act on your behalf. + - link "YouTube Podcast Summarizer A Slack bot that extracts and summarizes YouTube transcripts." [ref=e1082] [cursor=pointer]: + - /url: https://github.com/dforwardfeed/slack-AIpodcast-summaries + - generic [ref=e1085]: + - heading "YouTube Podcast Summarizer" [level=3] [ref=e1087] + - paragraph [ref=e1088]: A Slack bot that extracts and summarizes YouTube transcripts. + - generic [ref=e1090]: + - heading "Quick Links" [level=2] [ref=e1092] + - generic [ref=e1093]: + - link "API Reference" [ref=e1094] [cursor=pointer]: + - /url: /references/api + - img [ref=e1095] + - generic [ref=e1097]: API Reference + - link "CLI Cheat Sheet" [ref=e1098] [cursor=pointer]: + - /url: /references/cli-cheat-sheet + - img [ref=e1099] + - generic [ref=e1102]: CLI Cheat Sheet + - link "FAQ" [ref=e1103] [cursor=pointer]: + - /url: /resources/faq + - img [ref=e1104] + - generic [ref=e1107]: FAQ + - link "Changelog" [ref=e1108] [cursor=pointer]: + - /url: /references/changelog + - img [ref=e1109] + - generic [ref=e1112]: Changelog + - generic [ref=e1115]: + - text: Last updated on + - time [ref=e1116]: May 20, 2026 + - link "About Arcade" [ref=e1118] [cursor=pointer]: + - /url: /en/get-started/about-arcade + - text: About Arcade + - img [ref=e1119] + - generic [ref=e1121]: + - separator [ref=e1122] + - contentinfo [ref=e1123]: + - generic [ref=e1124]: + - generic [ref=e1125]: + - generic [ref=e1126]: + - link "Arcade Logo Making AI take action" [ref=e1127] [cursor=pointer]: + - /url: https://arcade.dev/ + - img "Arcade Logo" [ref=e1129] + - generic [ref=e1130]: Making AI take action + - generic [ref=e1131]: + - link "Github" [ref=e1132] [cursor=pointer]: + - /url: https://github.com/ArcadeAI + - img "Github" [ref=e1133] + - link "Discord" [ref=e1135] [cursor=pointer]: + - /url: https://discord.gg/GUZEMpEZ9p + - img "Discord" [ref=e1136] + - link "LinkedIn" [ref=e1138] [cursor=pointer]: + - /url: https://www.linkedin.com/company/arcade-ai/ + - img "LinkedIn" [ref=e1139] + - link "Send us an email" [ref=e1141] [cursor=pointer]: + - /url: mailto:contact@arcade.dev + - img [ref=e1142] + - generic [ref=e1145]: + - generic [ref=e1146]: + - heading "Project" [level=3] [ref=e1147] + - list [ref=e1148]: + - listitem [ref=e1149]: + - link "GitHub" [ref=e1150] [cursor=pointer]: + - /url: https://github.com/ArcadeAI/arcade-ai + - listitem [ref=e1151]: + - link "GitHub Container Registry" [ref=e1152] [cursor=pointer]: + - /url: https://github.com/orgs/ArcadeAI/packages + - listitem [ref=e1153]: + - link "Status" [ref=e1154] [cursor=pointer]: + - /url: https://status.arcade.dev/ + - generic [ref=e1155]: + - heading "Resources" [level=3] [ref=e1156] + - list [ref=e1157]: + - listitem [ref=e1158]: + - link "Documentation" [ref=e1159] [cursor=pointer]: + - /url: / + - listitem [ref=e1160]: + - link "Releases" [ref=e1161] [cursor=pointer]: + - /url: https://github.com/ArcadeAI/arcade-ai/releases + - listitem [ref=e1162]: + - link "Examples" [ref=e1163] [cursor=pointer]: + - /url: https://github.com/ArcadeAI/arcade-ai/tree/main/examples + - generic [ref=e1164]: + - heading "Feedback" [level=3] [ref=e1165] + - list [ref=e1166]: + - listitem [ref=e1167]: + - link "Discord" [ref=e1168] [cursor=pointer]: + - /url: https://discord.gg/GUZEMpEZ9p + - listitem [ref=e1169]: + - link "Report an issue on GitHub" [ref=e1170] [cursor=pointer]: + - /url: https://github.com/ArcadeAI/arcade-ai/issues/new/choose + - generic [ref=e1171]: + - paragraph [ref=e1173]: © 2024 — present Arcade AI, Inc. + - link "Privacy Policy" [ref=e1175] [cursor=pointer]: + - /url: https://www.arcade.dev/privacy-policy + - generic [ref=e1180] [cursor=pointer]: + - button "Open Next.js Dev Tools" [ref=e1181]: + - img [ref=e1182] + - generic [ref=e1187]: + - button "Open issues overlay" [ref=e1188]: + - generic [ref=e1189]: + - generic [ref=e1190]: "1" + - generic [ref=e1191]: "2" + - generic [ref=e1192]: + - text: Issue + - generic [ref=e1193]: s + - button "Collapse issues badge" [ref=e1194]: + - img [ref=e1195] + - alert [ref=e1197] + - iframe [ref=e1198]: + - generic [ref=f1e2]: + - img [ref=f1e27] + - generic [ref=f1e34]: + - heading "Status embed installed correctly" [level=1] [ref=f1e35]: + - paragraph [ref=f1e36]: Status embed installed correctly + - generic [ref=f1e37]: This will be shown if an incident or maintenance is posted on your status page. + - link "View latest updates" [ref=f1e39] [cursor=pointer]: + - /url: https://status.arcade.dev?utm_source=embed + - button [ref=f1e41] [cursor=pointer]: + - img [ref=f1e42] + - iframe \ No newline at end of file diff --git a/.tmp/seo-apr24/gen_twins.py b/.tmp/seo-apr24/gen_twins.py new file mode 100644 index 000000000..04cd8184f --- /dev/null +++ b/.tmp/seo-apr24/gen_twins.py @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Generate locale-less twin redirect rules for next.config.ts. +For each rule with source: '/:locale/...', generate a sibling with: + - source: '/...' (no locale) + - destination: '/en/...' (hardcoded) +""" +import re +import sys + +with open('/Users/teal/workspace/arcade/docs/next.config.ts', 'r') as f: + content = f.read() + +# Find the redirects() return array +# Extract all redirect objects +redirect_pattern = re.compile( + r'\{[^{}]*source:\s*"([^"]+)"[^{}]*destination:\s*"([^"]+)"[^{}]*permanent:\s*(true|false)[^{}]*\}', + re.DOTALL +) + +matches = list(redirect_pattern.finditer(content)) +print(f"Found {len(matches)} redirect rules", file=sys.stderr) + +twins = [] +for m in matches: + source = m.group(1) + destination = m.group(2) + permanent = m.group(3) + + # Only process sources that start with /:locale/ (not constrained locales) + if source.startswith('/:locale/'): + # Create locale-less version + locale_less_source = source[len('/:locale'):] # e.g. /home/auth/... + + # Create destination with /en/ instead of /:locale/ + if destination.startswith('/:locale/'): + locale_less_dest = '/en/' + destination[len('/:locale/'):] + else: + # Skip if destination doesn't follow expected pattern + continue + + twins.append({ + 'source': locale_less_source, + 'destination': locale_less_dest, + 'permanent': permanent, + 'original_source': source, + }) + +print(f"Generated {len(twins)} twin rules", file=sys.stderr) +for t in twins: + print(f" {t['original_source']} -> twin: {t['source']} => {t['destination']}") + diff --git a/.tmp/seo-apr24/insert_twins.py b/.tmp/seo-apr24/insert_twins.py new file mode 100644 index 000000000..a42b7f669 --- /dev/null +++ b/.tmp/seo-apr24/insert_twins.py @@ -0,0 +1,88 @@ +#!/usr/bin/env python3 +""" +Insert locale-less twin redirect rules before each locale-prefixed rule in next.config.ts. +""" +import re + +CONFIG_PATH = '/Users/teal/workspace/arcade/docs/next.config.ts' + +with open(CONFIG_PATH, 'r') as f: + content = f.read() + +# We'll process line by line to find each redirect object block and insert twins before it +# Pattern: find each { source: "/:locale/...", ... } block and insert twin before it + +# Strategy: split on individual redirect object boundaries +# Each redirect is: +# { +# source: "...", +# destination: "...", +# permanent: true/false, +# }, +# We need to find each block that has source starting with /:locale/ + +# Let's use a more careful approach - find the start of each redirect object +# and insert a twin before it + +lines = content.split('\n') +output_lines = [] +i = 0 + +# Track which locale-constrained patterns we're inside (for the comment blocks) +in_locale_constrained = False + +while i < len(lines): + line = lines[i] + + # Check if this line starts a redirect object with /:locale/ source + # Look for: source: "/:locale/..." + source_match = re.search(r'source:\s*"(/:locale/[^"]+)"', line) + + if source_match: + # Find the full block - look backwards to find the opening brace of this object + # and forwards to find the closing brace + source_val = source_match.group(1) + + # Find destination on following lines + dest_val = None + permanent_val = None + + # Look ahead up to 5 lines for destination and permanent + for j in range(i, min(i+8, len(lines))): + dest_match = re.search(r'destination:\s*"(/:locale/[^"]+)"', lines[j]) + perm_match = re.search(r'permanent:\s*(true|false)', lines[j]) + if dest_match: + dest_val = dest_match.group(1) + if perm_match: + permanent_val = perm_match.group(1) + + if dest_val and permanent_val: + # Generate twin + locale_less_source = source_val[len('/:locale'):] + locale_less_dest = '/en/' + dest_val[len('/:locale/'):] + + # Find indentation of the current block opening (look back for the {) + indent = ' ' # default 8 spaces + # Look for the { that opens this block + for back in range(max(0, i-3), i+1): + brace_match = re.match(r'^(\s*)\{', lines[back]) + if brace_match: + indent = brace_match.group(1) + break + + # Insert twin before the current opening brace + # Find where the brace is (look back) + # We'll insert the twin just before the line with the opening brace of this block + output_lines.append(line) + else: + output_lines.append(line) + i += 1 + continue + + output_lines.append(line) + i += 1 + +print("Analysis only - checking pattern match") +print(f"Total lines: {len(lines)}") +print(f"Output lines: {len(output_lines)}") + diff --git a/app/en/get-started/agent-plugin/page.mdx b/app/en/get-started/agent-plugin/page.mdx index 2c855d84d..84c84bd0b 100644 --- a/app/en/get-started/agent-plugin/page.mdx +++ b/app/en/get-started/agent-plugin/page.mdx @@ -69,7 +69,7 @@ Use this installation for a [Codex session in the CLI or ChatGPT desktop app](ht ``` 2. Start a new Codex session in the CLI or ChatGPT desktop app. -3. Open `/plugins` and confirm **arcade** is installed and enabled. +3. Open `/plugins` and confirm **Arcade** is installed and enabled. 4. Connect the **arcade** MCP server and sign in to Arcade in the browser when prompted. 5. Choose `@Arcade` or invoke `$arcade:try-arcade` to start. diff --git a/app/en/get-started/agent-plugin/whats-included/page.mdx b/app/en/get-started/agent-plugin/whats-included/page.mdx index fa8af23d2..a4c8f68ed 100644 --- a/app/en/get-started/agent-plugin/whats-included/page.mdx +++ b/app/en/get-started/agent-plugin/whats-included/page.mdx @@ -7,7 +7,7 @@ import { Code, Table } from "nextra/components"; # What's included -For agent developers, the Arcade plugin provides tools and workflows for connected apps. Component support varies by client. +The Arcade plugin provides tools and workflows to connect to external services via Arcade's library of over 1,000 optimized tools. Component support within the plugin varies by client support. ## MCP server @@ -18,62 +18,94 @@ The plugin registers an MCP server named `arcade` at `https://api.arcade.dev/mcp - [`try-arcade`](https://github.com/ArcadeAI/arcade-plugin/blob/main/skills/try-arcade/SKILL.md) guides tool selection, app sign-in, and tasks across connected apps. - [`scale-arcade`](https://github.com/ArcadeAI/arcade-plugin/blob/main/skills/scale-arcade/SKILL.md) guides gateway, tool selection, and end-user identity decisions for a proven workflow. -Skills load when relevant to your request or when called directly. How to call a skill varies by client. +Skills load when relevant to your request or when called directly. How to call a skill will vary by client. ## Subagent -The `arcade-operator` subagent executes app tasks in a separate context and returns the outcome. The `try-arcade` skill delegates to it when the client exposes `arcade-operator`. +The `arcade-operator` subagent executes app tasks in a separate context and returns the outcome. The `try-arcade` skill delegates to it when the client exposes `arcade-operator`, keeping the main conversation thread clear. ## Client support -The clients below load the Arcade MCP server and both skills. Subagent and command support varies. See the [plugin support matrix](https://github.com/ArcadeAI/arcade-plugin/blob/main/docs/support-matrix.md) for client details. +All clients below load the Arcade MCP server and both skills. See the [plugin support matrix](https://github.com/ArcadeAI/arcade-plugin/blob/main/docs/support-matrix.md) for full up-to-date client details. - +
- Client + + Client + Subagent - Commands + + Commands + - Cursor IDE and Cloud Agents + + Cursor IDE and Cloud Agents + Yes - 3 (IDE: plugin page, not / menu) + + 3 (IDE: plugin page, not / menu) + - Cursor CLI + + Cursor CLI + Yes 3 - Claude Code
CLI and desktop Code tab
+ + Claude Code +
+ CLI and desktop Code tab +
Yes - 3 (/arcade: prefix) + + 3 (/arcade: prefix) +
- Claude Cowork + + Claude Cowork + Yes - 3 (/arcade: prefix) + + 3 (/arcade: prefix) + - GitHub Copilot CLI + + GitHub Copilot CLI + Yes None - VS Code (Copilot sessions) + + VS Code (Copilot sessions) + Yes None - Codex CLI and Codex in ChatGPT desktop + + Codex CLI and Codex in ChatGPT desktop + No None - Claude Desktop Chat + + Claude Desktop Chat + No None @@ -82,7 +114,7 @@ The clients below load the Arcade MCP server and both skills. Subagent and comma ## Commands -Claude Code and Cowork namespace the commands as `/arcade:arcade-status`, `/arcade:arcade-connect`, and `/arcade:arcade-apps`. +Some clients namespace the commands as `/arcade:arcade-status`, `/arcade:arcade-connect`, and `/arcade:arcade-apps`. ### `/arcade-status` @@ -90,7 +122,7 @@ Reports whether the gateway is reachable, whether you have signed in, and which ### `/arcade-connect ` -Authorizes an app on demand, so you are not interrupted mid-task. +Authorize an app ahead of time on demand, so you are not interrupted mid-task. ### `/arcade-apps` @@ -98,9 +130,9 @@ Lists the apps you have connected and lets you disconnect one. ## Projects and secrets -The plugin uses the default project created when you sign up for Arcade. Selecting another project in the Dashboard does not change the plugin's project. +The plugin uses the default project created when you sign up for Arcade. Selecting another project in the Dashboard, or joining another project via invite, **does not** change the plugin's project context. -Gateway sign-in does not require an Arcade API key. Individual tools may require a provider API key or another secret. Add these to your default project's [secrets](/build/create-tools/tool-basics/create-tool-secrets#store-your-secret). Secrets configured in another project are not available through the plugin. +Individual tools may require a provider API key or another secret. Add these to your default project's [secrets](/build/create-tools/tool-basics/create-tool-secrets#store-your-secret). Secrets configured in another project are not available to you through the plugin. ## Example requests diff --git a/search-open.png b/search-open.png new file mode 100644 index 0000000000000000000000000000000000000000..2f9e846b4e9b1c9a10987ec7d5d5fce83c845844 GIT binary patch literal 149684 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 z%0AXf&k$TP(KrFBF{ynk40bKrl5peT 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 literal 0 HcmV?d00001 From 795deb5113e1fd8333582032c1759d6aa5176bf2 Mon Sep 17 00:00:00 2001 From: Teal Larson Date: Mon, 19 Oct 2026 14:55:31 -0400 Subject: [PATCH 40/42] :broom: --- .../console-2026-05-20T16-00-47-612Z.log | 26 - .../page-2026-05-20T16-01-04-529Z.yml | 1338 ---------------- .../page-2026-05-20T16-03-06-919Z.yml | 1373 ----------------- .tmp/seo-apr24/gen_twins.py | 52 - .tmp/seo-apr24/insert_twins.py | 88 -- search-open.png | Bin 149684 -> 0 bytes 6 files changed, 2877 deletions(-) delete mode 100644 .playwright-mcp/console-2026-05-20T16-00-47-612Z.log delete mode 100644 .playwright-mcp/page-2026-05-20T16-01-04-529Z.yml delete mode 100644 .playwright-mcp/page-2026-05-20T16-03-06-919Z.yml delete mode 100644 .tmp/seo-apr24/gen_twins.py delete mode 100644 .tmp/seo-apr24/insert_twins.py delete mode 100644 search-open.png diff --git a/.playwright-mcp/console-2026-05-20T16-00-47-612Z.log b/.playwright-mcp/console-2026-05-20T16-00-47-612Z.log deleted file mode 100644 index c8b45f24e..000000000 --- a/.playwright-mcp/console-2026-05-20T16-00-47-612Z.log +++ /dev/null @@ -1,26 +0,0 @@ -[ 16728ms] [ERROR] [PostHog.js] PostHog was initialized without a token. This likely indicates a misconfiguration. Please check the first argument passed to posthog.init() @ webpack-internal:///(app-pages-browser)/./node_modules/.pnpm/posthog-js@1.321.2/node_modules/posthog-js/dist/module.js:20 -[ 16760ms] [INFO] %cDownload the React DevTools for a better development experience: https://react.dev/link/react-devtools font-weight:bold @ webpack-internal:///(app-pages-browser)/./node_modules/.pnpm/next@16.1.1_@opentelemetry+api@1.9.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/next/dist/next-devtools/shared/forward-logs-shared.js:27 -[ 16847ms] [LOG] [HMR] connected @ webpack-internal:///(app-pages-browser)/./node_modules/.pnpm/next@16.1.1_@opentelemetry+api@1.9.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/next/dist/next-devtools/shared/forward-logs-shared.js:27 -[ 17239ms] [ERROR] Access to XMLHttpRequest at 'https://auth.arcade.dev/sessions/whoami' from origin 'http://localhost:3000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. @ http://localhost:3000/en/home:0 -[ 17240ms] [ERROR] Failed to load resource: net::ERR_FAILED @ https://auth.arcade.dev/sessions/whoami:0 -[ 17391ms] [ERROR] Item tracking: Missing tracking key @ webpack-internal:///(app-pages-browser)/./node_modules/.pnpm/next@16.1.1_@opentelemetry+api@1.9.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/next/dist/next-devtools/userspace/app/errors/intercept-console-error.js:51 -[ 20237ms] [ERROR] Failed to load resource: the server responded with a status of 400 () @ https://api.vector.co/pixel/phoenix/idex/did-006l/any?duid=334389048b87--01ks31x13e3ke6cp6xq6hc2b2h&did=did-006l&cd=.localhost&pu=http%3A%2F%2Flocalhost%3A3000%2F&resolve=sha2:0 -[ 20684ms] [ERROR] Failed to load resource: the server responded with a status of 400 () @ https://api.vector.co/pixel/phoenix/idex/did-006l/any?duid=334389048b87--01ks31x13e3ke6cp6xq6hc2b2h&did=did-006l&cd=.localhost&pu=http%3A%2F%2Flocalhost%3A3000%2F&resolve=sha2:0 -[ 20684ms] [ERROR] Error in executeCerebro: Error: RequestError: Failed sending request to url https://api.vector.co/pixel/phoenix/idex/did-006l/any?duid=334389048b87--01ks31x13e3ke6cp6xq6hc2b2h&did=did-006l&cd=.localhost&pu=http%3A%2F%2Flocalhost%3A3000%2F&resolve=sha2 - at https://cdn.vector.co/pixel.js:2:19913 - at https://cdn.vector.co/pixel.js:2:152673 - at Generator.throw () - at fw (https://cdn.vector.co/pixel.js:2:111921) - at s (https://cdn.vector.co/pixel.js:2:112152) @ webpack-internal:///(app-pages-browser)/./node_modules/.pnpm/next@16.1.1_@opentelemetry+api@1.9.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/next/dist/next-devtools/userspace/app/errors/intercept-console-error.js:51 -[ 263015ms] [ERROR] WebSocket connection to 'ws://localhost:3000/_next/webpack-hmr?id=N5m5PdGH108RDZdMd2Wid' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ webpack-internal:///(app-pages-browser)/./node_modules/.pnpm/next@16.1.1_@opentelemetry+api@1.9.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/next/dist/client/dev/hot-reloader/app/web-socket.js:59 -[ 264018ms] [ERROR] WebSocket connection to 'ws://localhost:3000/_next/webpack-hmr?id=N5m5PdGH108RDZdMd2Wid' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ webpack-internal:///(app-pages-browser)/./node_modules/.pnpm/next@16.1.1_@opentelemetry+api@1.9.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/next/dist/client/dev/hot-reloader/app/web-socket.js:59 -[ 265021ms] [ERROR] WebSocket connection to 'ws://localhost:3000/_next/webpack-hmr?id=N5m5PdGH108RDZdMd2Wid' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ webpack-internal:///(app-pages-browser)/./node_modules/.pnpm/next@16.1.1_@opentelemetry+api@1.9.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/next/dist/client/dev/hot-reloader/app/web-socket.js:59 -[ 266025ms] [ERROR] WebSocket connection to 'ws://localhost:3000/_next/webpack-hmr?id=N5m5PdGH108RDZdMd2Wid' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ webpack-internal:///(app-pages-browser)/./node_modules/.pnpm/next@16.1.1_@opentelemetry+api@1.9.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/next/dist/client/dev/hot-reloader/app/web-socket.js:59 -[ 267030ms] [ERROR] WebSocket connection to 'ws://localhost:3000/_next/webpack-hmr?id=N5m5PdGH108RDZdMd2Wid' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ webpack-internal:///(app-pages-browser)/./node_modules/.pnpm/next@16.1.1_@opentelemetry+api@1.9.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/next/dist/client/dev/hot-reloader/app/web-socket.js:59 -[ 272037ms] [ERROR] WebSocket connection to 'ws://localhost:3000/_next/webpack-hmr?id=N5m5PdGH108RDZdMd2Wid' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ webpack-internal:///(app-pages-browser)/./node_modules/.pnpm/next@16.1.1_@opentelemetry+api@1.9.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/next/dist/client/dev/hot-reloader/app/web-socket.js:59 -[ 277046ms] [ERROR] WebSocket connection to 'ws://localhost:3000/_next/webpack-hmr?id=N5m5PdGH108RDZdMd2Wid' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ webpack-internal:///(app-pages-browser)/./node_modules/.pnpm/next@16.1.1_@opentelemetry+api@1.9.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/next/dist/client/dev/hot-reloader/app/web-socket.js:59 -[ 282062ms] [ERROR] WebSocket connection to 'ws://localhost:3000/_next/webpack-hmr?id=N5m5PdGH108RDZdMd2Wid' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ webpack-internal:///(app-pages-browser)/./node_modules/.pnpm/next@16.1.1_@opentelemetry+api@1.9.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/next/dist/client/dev/hot-reloader/app/web-socket.js:59 -[ 287098ms] [ERROR] WebSocket connection to 'ws://localhost:3000/_next/webpack-hmr?id=N5m5PdGH108RDZdMd2Wid' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ webpack-internal:///(app-pages-browser)/./node_modules/.pnpm/next@16.1.1_@opentelemetry+api@1.9.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/next/dist/client/dev/hot-reloader/app/web-socket.js:59 -[ 292126ms] [ERROR] WebSocket connection to 'ws://localhost:3000/_next/webpack-hmr?id=N5m5PdGH108RDZdMd2Wid' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ webpack-internal:///(app-pages-browser)/./node_modules/.pnpm/next@16.1.1_@opentelemetry+api@1.9.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/next/dist/client/dev/hot-reloader/app/web-socket.js:59 -[ 297176ms] [ERROR] WebSocket connection to 'ws://localhost:3000/_next/webpack-hmr?id=N5m5PdGH108RDZdMd2Wid' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ webpack-internal:///(app-pages-browser)/./node_modules/.pnpm/next@16.1.1_@opentelemetry+api@1.9.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/next/dist/client/dev/hot-reloader/app/web-socket.js:59 -[ 302389ms] [ERROR] WebSocket connection to 'ws://localhost:3000/_next/webpack-hmr?id=N5m5PdGH108RDZdMd2Wid' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED @ webpack-internal:///(app-pages-browser)/./node_modules/.pnpm/next@16.1.1_@opentelemetry+api@1.9.0_react-dom@19.2.3_react@19.2.3__react@19.2.3/node_modules/next/dist/client/dev/hot-reloader/app/web-socket.js:59 diff --git a/.playwright-mcp/page-2026-05-20T16-01-04-529Z.yml b/.playwright-mcp/page-2026-05-20T16-01-04-529Z.yml deleted file mode 100644 index ca4368276..000000000 --- a/.playwright-mcp/page-2026-05-20T16-01-04-529Z.yml +++ /dev/null @@ -1,1338 +0,0 @@ -- generic [active] [ref=e1]: - - link "Skip to Content" [ref=e2] [cursor=pointer]: - - /url: "#nextra-skip-nav" - - banner [ref=e3]: - - navigation [ref=e5]: - - link "Home page" [ref=e6] [cursor=pointer]: - - /url: https://arcade.dev/ - - img "Arcade" [ref=e8] - - button "Search docs" [ref=e13]: - - img [ref=e14] - - generic [ref=e17]: Search - - generic [ref=e18]: - - generic [ref=e19]: ⌘ - - text: K - - link "Github" [ref=e20] [cursor=pointer]: - - /url: https://github.com/ArcadeAI/arcade-mcp - - img "Github" [ref=e21] - - link "Discord" [ref=e23] [cursor=pointer]: - - /url: https://discord.gg/GUZEMpEZ9p - - img "Discord" [ref=e24] - - link "Sign Up" [ref=e26] [cursor=pointer]: - - /url: https://app.arcade.dev/register?utm_source=docs&utm_campaign=docs&utm_medium=navbar - - button "Sign Up" [ref=e27] - - link "Dashboard" [ref=e28] [cursor=pointer]: - - /url: https://app.arcade.dev/playground/chat - - button "Dashboard" [ref=e29] - - main [ref=e30]: - - generic [ref=e31]: - - complementary [ref=e32]: - - list [ref=e35]: - - listitem [ref=e36]: - - link "Docs Home" [ref=e37] [cursor=pointer]: - - /url: /en/home - - generic [ref=e38]: - - img [ref=e39] - - text: Docs Home - - listitem [ref=e42]: - - button "Get Started" [ref=e43] [cursor=pointer]: - - generic [ref=e44]: - - img [ref=e45] - - text: Get Started - - img [ref=e47] - - list [ref=e50]: - - listitem [ref=e51]: - - link "About Arcade" [ref=e52] [cursor=pointer]: - - /url: /en/get-started/about-arcade - - listitem [ref=e53]: - - button "Setup" [ref=e54] [cursor=pointer]: - - text: Setup - - img [ref=e55] - - list [ref=e57]: - - listitem [ref=e58]: - - link "Get an API key" [ref=e59] [cursor=pointer]: - - /url: /en/get-started/setup/api-keys - - listitem [ref=e60]: - - link "Connect Arcade docs to your IDE" [ref=e61] [cursor=pointer]: - - /url: /en/get-started/setup/connect-arcade-docs - - listitem [ref=e62]: - - link "Windows environment setup" [ref=e63] [cursor=pointer]: - - /url: /en/get-started/setup/windows-environment - - listitem [ref=e64]: - - button "Quickstarts" [ref=e65] [cursor=pointer]: - - text: Quickstarts - - img [ref=e66] - - list [ref=e68]: - - listitem [ref=e69]: - - link "Call tools in agents" [ref=e70] [cursor=pointer]: - - /url: /en/get-started/quickstarts/call-tool-agent - - listitem [ref=e71]: - - link "Call tools in IDE/MCP clients" [ref=e72] [cursor=pointer]: - - /url: /en/get-started/quickstarts/call-tool-client - - listitem [ref=e73]: - - link "Build an MCP server for custom tools" [ref=e74] [cursor=pointer]: - - /url: /en/get-started/quickstarts/mcp-server-quickstart - - listitem [ref=e75]: - - button "Agent Frameworks" [ref=e76] [cursor=pointer]: - - text: Agent Frameworks - - img [ref=e77] - - list [ref=e79]: - - listitem [ref=e80]: - - link "Overview" [ref=e81] [cursor=pointer]: - - /url: /en/get-started/agent-frameworks - - listitem [ref=e82]: - - link "Setup Arcade with your LLM (Python)" [ref=e83] [cursor=pointer]: - - /url: /en/get-started/agent-frameworks/setup-arcade-with-your-llm-python - - listitem [ref=e84]: - - button "AG2" [ref=e85] [cursor=pointer]: - - text: AG2 - - img [ref=e86] - - list [ref=e88]: - - listitem [ref=e89]: - - link "Setup Arcade tools with AG2" [ref=e90] [cursor=pointer]: - - /url: /en/get-started/agent-frameworks/ag2/use-arcade-tools - - listitem [ref=e91]: - - button "CrewAI" [ref=e92] [cursor=pointer]: - - text: CrewAI - - img [ref=e93] - - list [ref=e95]: - - listitem [ref=e96]: - - link "Setup Arcade tools with CrewAI" [ref=e97] [cursor=pointer]: - - /url: /en/get-started/agent-frameworks/crewai/use-arcade-tools - - listitem [ref=e98]: - - button "Google ADK" [ref=e99] [cursor=pointer]: - - text: Google ADK - - img [ref=e100] - - list [ref=e102]: - - listitem [ref=e103]: - - link "Overview" [ref=e104] [cursor=pointer]: - - /url: /en/get-started/agent-frameworks/google-adk/overview - - listitem [ref=e105]: - - link "Setup (Python)" [ref=e106] [cursor=pointer]: - - /url: /en/get-started/agent-frameworks/google-adk/setup-python - - listitem [ref=e107]: - - link "Setup (TypeScript)" [ref=e108] [cursor=pointer]: - - /url: /en/get-started/agent-frameworks/google-adk/setup-typescript - - listitem [ref=e109]: - - button "LangChain" [ref=e110] [cursor=pointer]: - - text: LangChain - - img [ref=e111] - - list [ref=e113]: - - listitem [ref=e114]: - - link "Overview" [ref=e115] [cursor=pointer]: - - /url: /en/get-started/agent-frameworks/langchain/overview - - listitem [ref=e116]: - - link "Setup (Python)" [ref=e117] [cursor=pointer]: - - /url: /en/get-started/agent-frameworks/langchain/use-arcade-with-langchain-py - - listitem [ref=e118]: - - link "Setup (TypeScript)" [ref=e119] [cursor=pointer]: - - /url: /en/get-started/agent-frameworks/langchain/use-arcade-with-langchain-ts - - listitem [ref=e120]: - - link "Authorizing Existing Tools" [ref=e121] [cursor=pointer]: - - /url: /en/get-started/agent-frameworks/langchain/auth-langchain-tools - - listitem [ref=e122]: - - link "Mastra" [ref=e123] [cursor=pointer]: - - /url: /en/get-started/agent-frameworks/mastra - - listitem [ref=e124]: - - button "OpenAI Agents" [ref=e125] [cursor=pointer]: - - text: OpenAI Agents - - img [ref=e126] - - list [ref=e128]: - - listitem [ref=e129]: - - link "Overview" [ref=e130] [cursor=pointer]: - - /url: /en/get-started/agent-frameworks/openai-agents/overview - - listitem [ref=e131]: - - link "Setup (Python)" [ref=e132] [cursor=pointer]: - - /url: /en/get-started/agent-frameworks/openai-agents/setup-python - - listitem [ref=e133]: - - link "Setup (TypeScript)" [ref=e134] [cursor=pointer]: - - /url: /en/get-started/agent-frameworks/openai-agents/setup-typescript - - listitem [ref=e135]: - - link "TanStack AI" [ref=e136] [cursor=pointer]: - - /url: /en/get-started/agent-frameworks/tanstack-ai - - listitem [ref=e137]: - - link "Vercel AI SDK" [ref=e138] [cursor=pointer]: - - /url: /en/get-started/agent-frameworks/vercelai - - listitem [ref=e139]: - - link "Spring AI SDK" [ref=e140] [cursor=pointer]: - - /url: /en/get-started/agent-frameworks/springai - - listitem [ref=e141]: - - button "MCP Clients" [ref=e142] [cursor=pointer]: - - text: MCP Clients - - img [ref=e143] - - list [ref=e145]: - - listitem [ref=e146]: - - link "Overview" [ref=e147] [cursor=pointer]: - - /url: /en/get-started/mcp-clients - - listitem [ref=e148]: - - link "Cursor" [ref=e149] [cursor=pointer]: - - /url: /en/get-started/mcp-clients/cursor - - listitem [ref=e150]: - - link "Claude Desktop" [ref=e151] [cursor=pointer]: - - /url: /en/get-started/mcp-clients/claude-desktop - - listitem [ref=e152]: - - link "Claude Code" [ref=e153] [cursor=pointer]: - - /url: /en/get-started/mcp-clients/claude-code - - listitem [ref=e154]: - - link "Visual Studio Code" [ref=e155] [cursor=pointer]: - - /url: /en/get-started/mcp-clients/visual-studio-code - - listitem [ref=e156]: - - link "Microsoft Copilot Studio" [ref=e157] [cursor=pointer]: - - /url: /en/get-started/mcp-clients/copilot-studio - - listitem [ref=e158]: - - link "GitHub Copilot" [ref=e159] [cursor=pointer]: - - /url: /en/get-started/mcp-clients/github-copilot - - listitem [ref=e160]: - - button "Resources" [ref=e161] [cursor=pointer]: - - generic [ref=e162]: - - img [ref=e163] - - text: Resources - - img [ref=e166] - - list [ref=e169]: - - listitem [ref=e170]: - - button "Integrations" [ref=e171] [cursor=pointer]: - - text: Integrations - - img [ref=e172] - - list [ref=e174]: - - listitem [ref=e175]: - - link "Overview" [ref=e176] [cursor=pointer]: - - /url: /en/resources/integrations - - listitem [ref=e177]: - - button "Productivity & Docs" [ref=e178] [cursor=pointer]: - - text: Productivity & Docs - - img [ref=e179] - - list [ref=e181]: - - listitem [ref=e182]: Optimized - - listitem [ref=e183]: - - link "Asana" [ref=e184] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/asana - - listitem [ref=e185]: - - link "ClickUp" [ref=e186] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/clickup - - listitem [ref=e187]: - - link "Confluence" [ref=e188] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/confluence - - listitem [ref=e189]: - - link "Dropbox" [ref=e190] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/dropbox - - listitem [ref=e191]: - - link "Figma" [ref=e192] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/figma - - listitem [ref=e193]: - - link "Gmail" [ref=e194] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/gmail - - listitem [ref=e195]: - - link "Google Calendar" [ref=e196] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/google-calendar - - listitem [ref=e197]: - - link "Google Contacts" [ref=e198] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/google-contacts - - listitem [ref=e199]: - - link "Google Docs" [ref=e200] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/google-docs - - listitem [ref=e201]: - - link "Google Drive" [ref=e202] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/google-drive - - listitem [ref=e203]: - - link "Google Sheets" [ref=e204] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/google-sheets - - listitem [ref=e205]: - - link "Google Slides" [ref=e206] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/google-slides - - listitem [ref=e207]: - - link "Granola" [ref=e208] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/granola - - listitem [ref=e209]: - - link "Jira" [ref=e210] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/jira - - listitem [ref=e211]: - - link "Linear" [ref=e212] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/linear - - listitem [ref=e213]: - - link "Microsoft Excel" [ref=e214] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/microsoft-excel - - listitem [ref=e215]: - - link "Microsoft OneDrive" [ref=e216] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/microsoft-onedrive - - listitem [ref=e217]: - - link "Microsoft Outlook Calendar" [ref=e218] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/microsoft-outlook-calendar - - listitem [ref=e219]: - - link "Microsoft Outlook Mail" [ref=e220] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/microsoft-outlook-mail - - listitem [ref=e221]: - - link "Microsoft PowerPoint" [ref=e222] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/microsoft-powerpoint - - listitem [ref=e223]: - - link "Microsoft SharePoint" [ref=e224] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/microsoft-sharepoint - - listitem [ref=e225]: - - link "Microsoft Word" [ref=e226] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/microsoft-word - - listitem [ref=e227]: Starter - - listitem [ref=e228]: - - link "Airtable API" [ref=e229] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/airtable-api - - listitem [ref=e230]: - - link "Asana API" [ref=e231] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/asana-api - - listitem [ref=e232]: - - link "Ashby API" [ref=e233] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/ashby-api - - listitem [ref=e234]: - - link "Box API" [ref=e235] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/box-api - - listitem [ref=e236]: - - link "Calendly API" [ref=e237] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/calendly-api - - listitem [ref=e238]: - - link "ClickUp API" [ref=e239] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/clickup-api - - listitem [ref=e240]: - - link "Figma API" [ref=e241] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/figma-api - - listitem [ref=e242]: - - link "Luma API" [ref=e243] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/luma-api - - listitem [ref=e244]: - - link "Mailchimp API" [ref=e245] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/mailchimp-marketing-api - - listitem [ref=e246]: - - link "Miro API" [ref=e247] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/miro-api - - listitem [ref=e248]: - - link "SquareUp API" [ref=e249] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/squareup-api - - listitem [ref=e250]: - - link "TickTick API" [ref=e251] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/ticktick-api - - listitem [ref=e252]: - - link "Trello API" [ref=e253] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/trello-api - - listitem [ref=e254]: - - link "Xero API" [ref=e255] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/xero-api - - listitem [ref=e256]: - - button "Social & Communication" [ref=e257] [cursor=pointer]: - - text: Social & Communication - - img [ref=e258] - - list [ref=e260]: - - listitem [ref=e261]: Optimized - - listitem [ref=e262]: - - link "LinkedIn" [ref=e263] [cursor=pointer]: - - /url: /en/resources/integrations/social/linkedin - - listitem [ref=e264]: - - link "Microsoft Teams" [ref=e265] [cursor=pointer]: - - /url: /en/resources/integrations/social/microsoft-teams - - listitem [ref=e266]: - - link "Reddit" [ref=e267] [cursor=pointer]: - - /url: /en/resources/integrations/social/reddit - - listitem [ref=e268]: - - link "Slack" [ref=e269] [cursor=pointer]: - - /url: /en/resources/integrations/social/slack - - listitem [ref=e270]: - - link "Telegram" [ref=e271] [cursor=pointer]: - - /url: /en/resources/integrations/social/telegram - - listitem [ref=e272]: - - link "X" [ref=e273] [cursor=pointer]: - - /url: /en/resources/integrations/social/x - - listitem [ref=e274]: - - link "Zoom" [ref=e275] [cursor=pointer]: - - /url: /en/resources/integrations/social/zoom - - listitem [ref=e276]: Starter - - listitem [ref=e277]: - - link "Slack API" [ref=e278] [cursor=pointer]: - - /url: /en/resources/integrations/social/slack-api - - listitem [ref=e279]: - - button "Entertainment" [ref=e280] [cursor=pointer]: - - text: Entertainment - - img [ref=e281] - - list [ref=e283]: - - listitem [ref=e284]: Optimized - - listitem [ref=e285]: - - link "Imgflip" [ref=e286] [cursor=pointer]: - - /url: /en/resources/integrations/entertainment/imgflip - - listitem [ref=e287]: - - link "Spotify" [ref=e288] [cursor=pointer]: - - /url: /en/resources/integrations/entertainment/spotify - - listitem [ref=e289]: - - button "Developer Tools" [ref=e290] [cursor=pointer]: - - text: Developer Tools - - img [ref=e291] - - list [ref=e293]: - - listitem [ref=e294]: Optimized - - listitem [ref=e295]: - - link "Bright Data" [ref=e296] [cursor=pointer]: - - /url: /en/resources/integrations/development/brightdata - - listitem [ref=e297]: - - link "Daytona" [ref=e298] [cursor=pointer]: - - /url: /en/resources/integrations/development/daytona - - listitem [ref=e299]: - - link "E2B" [ref=e300] [cursor=pointer]: - - /url: /en/resources/integrations/development/e2b - - listitem [ref=e301]: - - link "Firecrawl" [ref=e302] [cursor=pointer]: - - /url: /en/resources/integrations/development/firecrawl - - listitem [ref=e303]: - - link "GitHub" [ref=e304] [cursor=pointer]: - - /url: /en/resources/integrations/development/github - - listitem [ref=e305]: - - link "Math" [ref=e306] [cursor=pointer]: - - /url: /en/resources/integrations/development/math - - listitem [ref=e307]: - - link "PagerDuty" [ref=e308] [cursor=pointer]: - - /url: /en/resources/integrations/development/pagerduty - - listitem [ref=e309]: - - link "PostHog" [ref=e310] [cursor=pointer]: - - /url: /en/resources/integrations/development/posthog - - listitem [ref=e311]: Starter - - listitem [ref=e312]: - - link "Arcade Engine API" [ref=e313] [cursor=pointer]: - - /url: /en/resources/integrations/development/arcade-engine-api - - listitem [ref=e314]: - - link "Cursor Agents API" [ref=e315] [cursor=pointer]: - - /url: /en/resources/integrations/development/cursor-agents-api - - listitem [ref=e316]: - - link "Datadog API" [ref=e317] [cursor=pointer]: - - /url: /en/resources/integrations/development/datadog-api - - listitem [ref=e318]: - - link "GitHub API" [ref=e319] [cursor=pointer]: - - /url: /en/resources/integrations/development/github-api - - listitem [ref=e320]: - - link "PostHog API" [ref=e321] [cursor=pointer]: - - /url: /en/resources/integrations/development/posthog-api - - listitem [ref=e322]: - - link "Vercel API" [ref=e323] [cursor=pointer]: - - /url: /en/resources/integrations/development/vercel-api - - listitem [ref=e324]: - - link "Zoho Creator API" [ref=e325] [cursor=pointer]: - - /url: /en/resources/integrations/development/zoho-creator-api - - listitem [ref=e326]: - - button "Payments & Finance" [ref=e327] [cursor=pointer]: - - text: Payments & Finance - - img [ref=e328] - - list [ref=e330]: - - listitem [ref=e331]: Optimized - - listitem [ref=e332]: - - link "Stripe" [ref=e333] [cursor=pointer]: - - /url: /en/resources/integrations/payments/stripe - - listitem [ref=e334]: Starter - - listitem [ref=e335]: - - link "Stripe API" [ref=e336] [cursor=pointer]: - - /url: /en/resources/integrations/payments/stripe_api - - listitem [ref=e337]: - - link "Zoho Books API" [ref=e338] [cursor=pointer]: - - /url: /en/resources/integrations/payments/zoho-books-api - - listitem [ref=e339]: - - button "Search Tools" [ref=e340] [cursor=pointer]: - - text: Search Tools - - img [ref=e341] - - list [ref=e343]: - - listitem [ref=e344]: Optimized - - listitem [ref=e345]: - - link "Google Finance" [ref=e346] [cursor=pointer]: - - /url: /en/resources/integrations/search/google_finance - - listitem [ref=e347]: - - link "Google Flights" [ref=e348] [cursor=pointer]: - - /url: /en/resources/integrations/search/google_flights - - listitem [ref=e349]: - - link "Google Hotels" [ref=e350] [cursor=pointer]: - - /url: /en/resources/integrations/search/google_hotels - - listitem [ref=e351]: - - link "Google Jobs" [ref=e352] [cursor=pointer]: - - /url: /en/resources/integrations/search/google_jobs - - listitem [ref=e353]: - - link "Google Maps" [ref=e354] [cursor=pointer]: - - /url: /en/resources/integrations/search/google_maps - - listitem [ref=e355]: - - link "Google News" [ref=e356] [cursor=pointer]: - - /url: /en/resources/integrations/search/google_news - - listitem [ref=e357]: - - link "Google Search" [ref=e358] [cursor=pointer]: - - /url: /en/resources/integrations/search/google_search - - listitem [ref=e359]: - - link "Google Shopping" [ref=e360] [cursor=pointer]: - - /url: /en/resources/integrations/search/google_shopping - - listitem [ref=e361]: - - link "Walmart" [ref=e362] [cursor=pointer]: - - /url: /en/resources/integrations/search/walmart - - listitem [ref=e363]: - - link "Youtube" [ref=e364] [cursor=pointer]: - - /url: /en/resources/integrations/search/youtube - - listitem [ref=e365]: Starter - - listitem [ref=e366]: - - link "Exa API" [ref=e367] [cursor=pointer]: - - /url: /en/resources/integrations/search/exa-api - - listitem [ref=e368]: - - link "Tavily" [ref=e369] [cursor=pointer]: - - /url: /en/resources/integrations/search/tavily - - listitem [ref=e370]: - - button "Sales" [ref=e371] [cursor=pointer]: - - text: Sales - - img [ref=e372] - - list [ref=e374]: - - listitem [ref=e375]: Optimized - - listitem [ref=e376]: - - link "Attio" [ref=e377] [cursor=pointer]: - - /url: /en/resources/integrations/sales/attio - - listitem [ref=e378]: - - link "HubSpot" [ref=e379] [cursor=pointer]: - - /url: /en/resources/integrations/sales/hubspot - - listitem [ref=e380]: - - link "Salesforce" [ref=e381] [cursor=pointer]: - - /url: /en/resources/integrations/sales/salesforce - - listitem [ref=e382]: Starter - - listitem [ref=e383]: - - link "HubSpot Automation API" [ref=e384] [cursor=pointer]: - - /url: /en/resources/integrations/sales/hubspot-automation-api - - listitem [ref=e385]: - - link "HubSpot CMS API" [ref=e386] [cursor=pointer]: - - /url: /en/resources/integrations/sales/hubspot-cms-api - - listitem [ref=e387]: - - link "HubSpot Conversations API" [ref=e388] [cursor=pointer]: - - /url: /en/resources/integrations/sales/hubspot-conversations-api - - listitem [ref=e389]: - - link "HubSpot CRM API" [ref=e390] [cursor=pointer]: - - /url: /en/resources/integrations/sales/hubspot-crm-api - - listitem [ref=e391]: - - link "HubSpot Events API" [ref=e392] [cursor=pointer]: - - /url: /en/resources/integrations/sales/hubspot-events-api - - listitem [ref=e393]: - - link "HubSpot Marketing API" [ref=e394] [cursor=pointer]: - - /url: /en/resources/integrations/sales/hubspot-marketing-api - - listitem [ref=e395]: - - link "HubSpot Meetings API" [ref=e396] [cursor=pointer]: - - /url: /en/resources/integrations/sales/hubspot-meetings-api - - listitem [ref=e397]: - - link "HubSpot Users API" [ref=e398] [cursor=pointer]: - - /url: /en/resources/integrations/sales/hubspot-users-api - - listitem [ref=e399]: - - button "Databases" [ref=e400] [cursor=pointer]: - - text: Databases - - img [ref=e401] - - list [ref=e403]: - - listitem [ref=e404]: Optimized - - listitem [ref=e405]: - - link "Clickhouse" [ref=e406] [cursor=pointer]: - - /url: /en/resources/integrations/databases/clickhouse - - listitem [ref=e407]: - - link "MongoDB" [ref=e408] [cursor=pointer]: - - /url: /en/resources/integrations/databases/mongodb - - listitem [ref=e409]: - - link "Postgres" [ref=e410] [cursor=pointer]: - - /url: /en/resources/integrations/databases/postgres - - listitem [ref=e411]: Starter - - listitem [ref=e412]: - - link "Weaviate API" [ref=e413] [cursor=pointer]: - - /url: /en/resources/integrations/databases/weaviate-api - - listitem [ref=e414]: - - link "YugabyteDB" [ref=e415] [cursor=pointer]: - - /url: /en/resources/integrations/databases/yugabytedb - - listitem [ref=e416]: - - button "Customer Support" [ref=e417] [cursor=pointer]: - - text: Customer Support - - img [ref=e418] - - list [ref=e420]: - - listitem [ref=e421]: Optimized - - listitem [ref=e422]: - - link "Pylon" [ref=e423] [cursor=pointer]: - - /url: /en/resources/integrations/customer-support/pylon - - listitem [ref=e424]: - - link "Zendesk" [ref=e425] [cursor=pointer]: - - /url: /en/resources/integrations/customer-support/zendesk - - listitem [ref=e426]: Starter - - listitem [ref=e427]: - - link "Customer.io API" [ref=e428] [cursor=pointer]: - - /url: /en/resources/integrations/customer-support/customerio-api - - listitem [ref=e429]: - - link "Customer.io Pipelines API" [ref=e430] [cursor=pointer]: - - /url: /en/resources/integrations/customer-support/customerio-pipelines-api - - listitem [ref=e431]: - - link "Customer.io Track API" [ref=e432] [cursor=pointer]: - - /url: /en/resources/integrations/customer-support/customerio-track-api - - listitem [ref=e433]: - - link "Freshservice API" [ref=e434] [cursor=pointer]: - - /url: /en/resources/integrations/customer-support/freshservice-api - - listitem [ref=e435]: - - link "Intercom API" [ref=e436] [cursor=pointer]: - - /url: /en/resources/integrations/customer-support/intercom-api - - listitem [ref=e437]: - - link "PagerDuty API" [ref=e438] [cursor=pointer]: - - /url: /en/resources/integrations/customer-support/pagerduty-api - - listitem [ref=e439]: - - link "Pylon API" [ref=e440] [cursor=pointer]: - - /url: /en/resources/integrations/customer-support/pylon-api - - listitem [ref=e441]: Feedback - - listitem [ref=e442]: - - link "Tool Feedback" [ref=e443] [cursor=pointer]: - - /url: /en/resources/integrations/tool-feedback - - listitem [ref=e444]: - - link "Examples" [ref=e445] [cursor=pointer]: - - /url: /en/resources/examples - - listitem [ref=e446]: - - link "Tools" [ref=e447] [cursor=pointer]: - - /url: /en/resources/tools - - listitem [ref=e448]: - - link "Glossary" [ref=e449] [cursor=pointer]: - - /url: /en/resources/glossary - - listitem [ref=e450]: - - link "FAQ" [ref=e451] [cursor=pointer]: - - /url: /en/resources/faq - - listitem [ref=e452]: - - link "Security research program" [ref=e453] [cursor=pointer]: - - /url: /en/resources/security-research-program - - listitem [ref=e454]: - - link "Contact" [ref=e455] [cursor=pointer]: - - /url: /en/resources/contact-us - - listitem [ref=e456]: - - link "Arcade Registry Early Access" [ref=e457] [cursor=pointer]: - - /url: /en/resources/registry-early-access - - listitem [ref=e458]: - - button "Guides" [ref=e459] [cursor=pointer]: - - generic [ref=e460]: - - img [ref=e461] - - text: Guides - - img [ref=e467] - - list [ref=e470]: - - listitem [ref=e471]: - - link "Audit Logs" [ref=e472] [cursor=pointer]: - - /url: /en/guides/audit-logs - - listitem [ref=e473]: - - button "Contextual Access" [ref=e474] [cursor=pointer]: - - text: Contextual Access - - img [ref=e475] - - list [ref=e477]: - - listitem [ref=e478]: - - link "Contextual Access" [ref=e479] [cursor=pointer]: - - /url: /en/guides/contextual-access - - listitem [ref=e480]: - - link "How Hooks Work" [ref=e481] [cursor=pointer]: - - /url: /en/guides/contextual-access/how-hooks-work - - listitem [ref=e482]: - - link "Running an Extension" [ref=e483] [cursor=pointer]: - - /url: /en/guides/contextual-access/examples - - listitem [ref=e484]: - - link "Build Your Own" [ref=e485] [cursor=pointer]: - - /url: /en/guides/contextual-access/build-your-own - - listitem [ref=e486]: - - button "MCP Gateways" [ref=e487] [cursor=pointer]: - - text: MCP Gateways - - img [ref=e488] - - list [ref=e490]: - - listitem [ref=e491]: - - link "MCP Gateways" [ref=e492] [cursor=pointer]: - - /url: /en/guides/mcp-gateways - - listitem [ref=e493]: - - link "Add remote MCP servers" [ref=e494] [cursor=pointer]: - - /url: /en/guides/mcp-gateways/add-remote-servers - - listitem [ref=e495]: - - link "Create via Dashboard" [ref=e496] [cursor=pointer]: - - /url: /en/guides/mcp-gateways/create-via-dashboard - - listitem [ref=e497]: - - link "Create via AI Assistant" [ref=e498] [cursor=pointer]: - - /url: /en/guides/mcp-gateways/create-via-ai - - listitem [ref=e499]: - - button "Call tools" [ref=e500] [cursor=pointer]: - - text: Call tools - - img [ref=e501] - - list [ref=e503]: - - listitem [ref=e504]: - - link "Overview" [ref=e505] [cursor=pointer]: - - /url: /en/guides/tool-calling - - listitem [ref=e506]: - - link "Handling errors" [ref=e507] [cursor=pointer]: - - /url: /en/guides/tool-calling/error-handling - - listitem [ref=e508]: - - link "Call third-party APIs" [ref=e509] [cursor=pointer]: - - /url: /en/guides/tool-calling/call-third-party-apis - - listitem [ref=e510]: - - button "In custom applications" [ref=e511] [cursor=pointer]: - - text: In custom applications - - img [ref=e512] - - list [ref=e514]: - - listitem [ref=e515]: - - link "Overview" [ref=e516] [cursor=pointer]: - - /url: /en/guides/tool-calling/custom-apps - - listitem [ref=e517]: - - link "Authorize tool calling" [ref=e518] [cursor=pointer]: - - /url: /en/guides/tool-calling/custom-apps/auth-tool-calling - - listitem [ref=e519]: - - link "Check authorization status" [ref=e520] [cursor=pointer]: - - /url: /en/guides/tool-calling/custom-apps/check-auth-status - - listitem [ref=e521]: - - link "Get formatted tool definitions" [ref=e522] [cursor=pointer]: - - /url: /en/guides/tool-calling/custom-apps/get-tool-definitions - - listitem [ref=e523]: - - button "Create tools" [ref=e524] [cursor=pointer]: - - text: Create tools - - img [ref=e525] - - list [ref=e527]: - - listitem [ref=e528]: - - button "Build a tool" [ref=e529] [cursor=pointer]: - - text: Build a tool - - img [ref=e530] - - list [ref=e532]: - - listitem [ref=e533]: - - link "Overview" [ref=e534] [cursor=pointer]: - - /url: /en/guides/create-tools/tool-basics - - listitem [ref=e535]: - - link "Compare MCP server types" [ref=e536] [cursor=pointer]: - - /url: /en/guides/create-tools/tool-basics/compare-server-types - - listitem [ref=e537]: - - link "Build an MCP Server to write custom tools" [ref=e538] [cursor=pointer]: - - /url: /en/guides/create-tools/tool-basics/build-mcp-server - - listitem [ref=e539]: - - link "Create a tool with auth" [ref=e540] [cursor=pointer]: - - /url: /en/guides/create-tools/tool-basics/create-tool-auth - - listitem [ref=e541]: - - link "Create a tool with secrets" [ref=e542] [cursor=pointer]: - - /url: /en/guides/create-tools/tool-basics/create-tool-secrets - - listitem [ref=e543]: - - link "Access runtime data" [ref=e544] [cursor=pointer]: - - /url: /en/guides/create-tools/tool-basics/runtime-data-access - - listitem [ref=e545]: - - link "Call tools from MCP clients" [ref=e546] [cursor=pointer]: - - /url: /en/guides/create-tools/tool-basics/call-tools-mcp - - listitem [ref=e547]: - - link "Organize your MCP server and tools" [ref=e548] [cursor=pointer]: - - /url: /en/guides/create-tools/tool-basics/organize-mcp-tools - - listitem [ref=e549]: - - link "Add metadata to your tools" [ref=e550] [cursor=pointer]: - - /url: /en/guides/create-tools/tool-basics/add-tool-metadata - - listitem [ref=e551]: - - button "Evaluate tools" [ref=e552] [cursor=pointer]: - - text: Evaluate tools - - img [ref=e553] - - list [ref=e555]: - - listitem [ref=e556]: - - link "Overview" [ref=e557] [cursor=pointer]: - - /url: /en/guides/create-tools/evaluate-tools - - listitem [ref=e558]: - - link "Why evaluate tools?" [ref=e559] [cursor=pointer]: - - /url: /en/guides/create-tools/evaluate-tools/why-evaluate - - listitem [ref=e560]: - - link "Create an evaluation suite" [ref=e561] [cursor=pointer]: - - /url: /en/guides/create-tools/evaluate-tools/create-evaluation-suite - - listitem [ref=e562]: - - link "Run evaluations" [ref=e563] [cursor=pointer]: - - /url: /en/guides/create-tools/evaluate-tools/run-evaluations - - listitem [ref=e564]: - - link "Capture mode" [ref=e565] [cursor=pointer]: - - /url: /en/guides/create-tools/evaluate-tools/capture-mode - - listitem [ref=e566]: - - link "Comparative evaluations" [ref=e567] [cursor=pointer]: - - /url: /en/guides/create-tools/evaluate-tools/comparative-evaluations - - listitem [ref=e568]: - - button "Improve an existing toolkit" [ref=e569] [cursor=pointer]: - - text: Improve an existing toolkit - - img [ref=e570] - - list [ref=e572]: - - listitem [ref=e573]: - - link "Types of Tools" [ref=e574] [cursor=pointer]: - - /url: /en/guides/create-tools/improve/types-of-tools - - listitem [ref=e575]: - - button "Handle errors" [ref=e576] [cursor=pointer]: - - text: Handle errors - - img [ref=e577] - - list [ref=e579]: - - listitem [ref=e580]: - - link "Overview" [ref=e581] [cursor=pointer]: - - /url: /en/guides/create-tools/error-handling - - listitem [ref=e582]: - - link "Retry Tools with Improved Prompt" [ref=e583] [cursor=pointer]: - - /url: /en/guides/create-tools/error-handling/retry-tools - - listitem [ref=e584]: - - link "Provide Useful Tool Errors" [ref=e585] [cursor=pointer]: - - /url: /en/guides/create-tools/error-handling/useful-tool-errors - - listitem [ref=e586]: - - button "Secure your server" [ref=e587] [cursor=pointer]: - - text: Secure your server - - img [ref=e588] - - list [ref=e590]: - - listitem [ref=e591]: - - link "Overview" [ref=e592] [cursor=pointer]: - - /url: /en/guides/create-tools/secure-your-server - - listitem [ref=e593]: - - link "Add Resource Server auth" [ref=e594] [cursor=pointer]: - - /url: /en/guides/create-tools/secure-your-server/secure-your-mcp-server - - listitem [ref=e595]: - - link "Migrate from toolkits to MCP servers" [ref=e596] [cursor=pointer]: - - /url: /en/guides/create-tools/migrate-toolkits - - listitem [ref=e597]: - - button "User-facing agents" [ref=e598] [cursor=pointer]: - - text: User-facing agents - - img [ref=e599] - - list [ref=e601]: - - listitem [ref=e602]: - - link "Secure Auth in Production" [ref=e603] [cursor=pointer]: - - /url: /en/guides/user-facing-agents/secure-auth-production - - listitem [ref=e604]: - - button "Deployment & hosting" [ref=e605] [cursor=pointer]: - - text: Deployment & hosting - - img [ref=e606] - - list [ref=e608]: - - listitem [ref=e609]: - - link "Overview" [ref=e610] [cursor=pointer]: - - /url: /en/guides/deployment-hosting - - listitem [ref=e611]: - - link "Arcade Cloud" [ref=e612] [cursor=pointer]: - - /url: /en/guides/deployment-hosting/arcade-cloud - - listitem [ref=e613]: - - link "On-premises MCP servers" [ref=e614] [cursor=pointer]: - - /url: /en/guides/deployment-hosting/on-prem - - listitem [ref=e615]: - - link "Configure Arcade's engine" [ref=e616] [cursor=pointer]: - - /url: /en/guides/deployment-hosting/configure-engine - - listitem [ref=e617]: - - link "Arcade Deploy" [ref=e618] [cursor=pointer]: - - /url: /en/guides/deployment-hosting/arcade-deploy - - listitem [ref=e619]: - - button "Logic Extensions" [ref=e620] [cursor=pointer]: - - text: Logic Extensions - - img [ref=e621] - - list [ref=e623]: - - listitem [ref=e624]: - - link "Build Your Own" [ref=e625] [cursor=pointer]: - - /url: /en/guides/logic-extensions/build-your-own - - listitem [ref=e626]: - - button "Learn" [ref=e627] [cursor=pointer]: - - generic [ref=e628]: - - img [ref=e629] - - text: Learn - - img [ref=e631] - - list [ref=e634]: - - listitem [ref=e635]: - - link "Server-Level vs Tool-Level Authorization" [ref=e636] [cursor=pointer]: - - /url: /en/learn/server-level-vs-tool-level-auth - - listitem [ref=e637]: - - button "References" [ref=e638] [cursor=pointer]: - - generic [ref=e639]: - - img [ref=e640] - - text: References - - img [ref=e643] - - list [ref=e646]: - - listitem [ref=e647]: - - link "Overview" [ref=e648] [cursor=pointer]: - - /url: /en/references - - listitem [ref=e649]: - - link "Changelog" [ref=e650] [cursor=pointer]: - - /url: /en/references/changelog - - listitem [ref=e651]: - - link "API" [ref=e652] [cursor=pointer]: - - /url: /en/references/api - - listitem [ref=e653]: - - button "Arcade MCP" [ref=e654] [cursor=pointer]: - - text: Arcade MCP - - img [ref=e655] - - list [ref=e657]: - - listitem [ref=e658]: - - button "Python" [ref=e659] [cursor=pointer]: - - text: Python - - img [ref=e660] - - list [ref=e662]: - - listitem [ref=e663]: - - link "Overview" [ref=e664] [cursor=pointer]: - - /url: /en/references/mcp/python - - listitem [ref=e665]: - - link "Context" [ref=e666] [cursor=pointer]: - - /url: /en/references/mcp/python/context - - listitem [ref=e667]: - - link "Resources" [ref=e668] [cursor=pointer]: - - /url: /en/references/mcp/python/resources - - listitem [ref=e669]: - - link "Server" [ref=e670] [cursor=pointer]: - - /url: /en/references/mcp/python/server - - listitem [ref=e671]: - - link "Settings" [ref=e672] [cursor=pointer]: - - /url: /en/references/mcp/python/settings - - listitem [ref=e673]: - - link "Middleware" [ref=e674] [cursor=pointer]: - - /url: /en/references/mcp/python/middleware - - listitem [ref=e675]: - - link "Errors" [ref=e676] [cursor=pointer]: - - /url: /en/references/mcp/python/errors - - listitem [ref=e677]: - - link "Telemetry" [ref=e678] [cursor=pointer]: - - /url: /en/references/mcp/telemetry - - listitem [ref=e679]: - - link "Arcade CLI" [ref=e680] [cursor=pointer]: - - /url: /en/references/arcade-cli - - listitem [ref=e681]: - - link "CLI Cheat Sheet" [ref=e682] [cursor=pointer]: - - /url: /en/references/cli-cheat-sheet - - listitem [ref=e683]: - - link "Contextual Access Webhook API" [ref=e684] [cursor=pointer]: - - /url: /en/references/contextual-access-webhook-api - - listitem [ref=e685]: - - button "Auth Providers" [ref=e686] [cursor=pointer]: - - text: Auth Providers - - img [ref=e687] - - list [ref=e689]: - - listitem [ref=e690]: - - link "Overview" [ref=e691] [cursor=pointer]: - - /url: /en/references/auth-providers - - listitem [ref=e692]: - - link "OAuth 2.0" [ref=e693] [cursor=pointer]: - - /url: /en/references/auth-providers/oauth2 - - listitem [ref=e694]: - - link "Airtable" [ref=e695] [cursor=pointer]: - - /url: /en/references/auth-providers/airtable - - listitem [ref=e696]: - - link "Asana" [ref=e697] [cursor=pointer]: - - /url: /en/references/auth-providers/asana - - listitem [ref=e698]: - - link "Atlassian" [ref=e699] [cursor=pointer]: - - /url: /en/references/auth-providers/atlassian - - listitem [ref=e700]: - - link "Attio" [ref=e701] [cursor=pointer]: - - /url: /en/references/auth-providers/attio - - listitem [ref=e702]: - - link "Calendly" [ref=e703] [cursor=pointer]: - - /url: /en/references/auth-providers/calendly - - listitem [ref=e704]: - - link "ClickUp" [ref=e705] [cursor=pointer]: - - /url: /en/references/auth-providers/clickup - - listitem [ref=e706]: - - link "Discord" [ref=e707] [cursor=pointer]: - - /url: /en/references/auth-providers/discord - - listitem [ref=e708]: - - link "Dropbox" [ref=e709] [cursor=pointer]: - - /url: /en/references/auth-providers/dropbox - - listitem [ref=e710]: - - link "Figma" [ref=e711] [cursor=pointer]: - - /url: /en/references/auth-providers/figma - - listitem [ref=e712]: - - link "GitHub" [ref=e713] [cursor=pointer]: - - /url: /en/references/auth-providers/github - - listitem [ref=e714]: - - link "Google" [ref=e715] [cursor=pointer]: - - /url: /en/references/auth-providers/google - - listitem [ref=e716]: - - link "Hubspot" [ref=e717] [cursor=pointer]: - - /url: /en/references/auth-providers/hubspot - - listitem [ref=e718]: - - link "Linear" [ref=e719] [cursor=pointer]: - - /url: /en/references/auth-providers/linear - - listitem [ref=e720]: - - link "LinkedIn" [ref=e721] [cursor=pointer]: - - /url: /en/references/auth-providers/linkedin - - listitem [ref=e722]: - - link "Mailchimp" [ref=e723] [cursor=pointer]: - - /url: /en/references/auth-providers/mailchimp - - listitem [ref=e724]: - - link "Microsoft" [ref=e725] [cursor=pointer]: - - /url: /en/references/auth-providers/microsoft - - listitem [ref=e726]: - - link "Miro" [ref=e727] [cursor=pointer]: - - /url: /en/references/auth-providers/miro - - listitem [ref=e728]: - - link "Notion" [ref=e729] [cursor=pointer]: - - /url: /en/references/auth-providers/notion - - listitem [ref=e730]: - - link "PagerDuty" [ref=e731] [cursor=pointer]: - - /url: /en/references/auth-providers/pagerduty - - listitem [ref=e732]: - - link "Reddit" [ref=e733] [cursor=pointer]: - - /url: /en/references/auth-providers/reddit - - listitem [ref=e734]: - - link "Salesforce" [ref=e735] [cursor=pointer]: - - /url: /en/references/auth-providers/salesforce - - listitem [ref=e736]: - - link "Slack" [ref=e737] [cursor=pointer]: - - /url: /en/references/auth-providers/slack - - listitem [ref=e738]: - - link "Spotify" [ref=e739] [cursor=pointer]: - - /url: /en/references/auth-providers/spotify - - listitem [ref=e740]: - - link "Square" [ref=e741] [cursor=pointer]: - - /url: /en/references/auth-providers/square - - listitem [ref=e742]: - - link "TickTick" [ref=e743] [cursor=pointer]: - - /url: /en/references/auth-providers/ticktick - - listitem [ref=e744]: - - link "Twitch" [ref=e745] [cursor=pointer]: - - /url: /en/references/auth-providers/twitch - - listitem [ref=e746]: - - link "X" [ref=e747] [cursor=pointer]: - - /url: /en/references/auth-providers/x - - listitem [ref=e748]: - - link "Zendesk" [ref=e749] [cursor=pointer]: - - /url: /en/references/auth-providers/zendesk - - listitem [ref=e750]: - - link "Zoho" [ref=e751] [cursor=pointer]: - - /url: /en/references/auth-providers/zoho - - listitem [ref=e752]: - - link "Zoom" [ref=e753] [cursor=pointer]: - - /url: /en/references/auth-providers/zoom - - generic [ref=e754]: - - button "English" [ref=e755] [cursor=pointer]: - - img [ref=e756] - - text: English - - button "Change theme" [ref=e758] [cursor=pointer]: - - img [ref=e759] - - button "Collapse sidebar" [expanded] [ref=e761] [cursor=pointer]: - - img [ref=e762] - - article [ref=e765]: - - main [ref=e766]: - - generic [ref=e767]: - - generic [ref=e772]: - - heading "MCP Runtime for AI agents that get things done." [level=1] [ref=e773] - - paragraph [ref=e774]: Arcade handles OAuth, manages user tokens, and gives you 7,000+ pre-built integrations so your agents can take real action in production. - - generic [ref=e775]: - - link "Get Started" [ref=e776] [cursor=pointer]: - - /url: /get-started/quickstarts/call-tool-agent - - img - - text: Get Started - - link "Explore Tools" [ref=e777] [cursor=pointer]: - - /url: /en/resources/integrations - - img - - text: Explore Tools - - link "These docs are LLM-friendly — AI agents get clean markdown automatically" [ref=e779] [cursor=pointer]: - - /url: /get-started/setup/connect-arcade-docs - - img [ref=e780] - - text: These docs are LLM-friendly — AI agents get clean markdown automatically - - img [ref=e783] - - generic [ref=e787]: - - heading "Get Tools" [level=2] [ref=e788] - - link "Pre-built Integrations Browse 7,000+ ready-to-use integrations for Gmail, Slack, GitHub, and more. Gmail Slack GitHub Google Sheets Jira Notion Linear HubSpot Stripe Google Drive Dropbox Confluence Reddit Learn more" [ref=e792] [cursor=pointer]: - - /url: /en/resources/integrations - - generic [ref=e793]: - - img [ref=e795] - - generic [ref=e797]: Pre-built Integrations - - generic [ref=e798]: - - paragraph [ref=e799]: Browse 7,000+ ready-to-use integrations for Gmail, Slack, GitHub, and more. - - generic [ref=e801]: - - img "Gmail" [ref=e802] - - img "Slack" [ref=e803] - - img "GitHub" [ref=e804] - - img "Google Sheets" [ref=e805] - - img "Jira" [ref=e806] - - img "Notion" [ref=e807] - - img "Linear" [ref=e808] - - img "HubSpot" [ref=e809] - - img "Stripe" [ref=e810] - - img "Google Drive" [ref=e811] - - img "Dropbox" [ref=e812] - - img "Confluence" [ref=e813] - - img "Reddit" [ref=e814] - - generic [ref=e815]: - - text: Learn more - - img [ref=e816] - - link "Build Custom Tools Create your own MCP servers and custom tools with our SDK. Learn more" [ref=e821] [cursor=pointer]: - - /url: /guides/create-tools/tool-basics/build-mcp-server - - generic [ref=e822]: - - img [ref=e824] - - generic [ref=e826]: Build Custom Tools - - generic [ref=e827]: - - paragraph [ref=e828]: Create your own MCP servers and custom tools with our SDK. - - generic [ref=e829]: - - text: Learn more - - img [ref=e830] - - heading "Use Arcade" [level=2] [ref=e832] - - link "Connect to Your IDE Add tools to Cursor, VS Code, Claude Desktop, or any MCP client. Cursor VS Code Claude Desktop Learn more" [ref=e836] [cursor=pointer]: - - /url: /get-started/mcp-clients - - generic [ref=e837]: - - img [ref=e839] - - generic [ref=e841]: Connect to Your IDE - - generic [ref=e842]: - - paragraph [ref=e843]: Add tools to Cursor, VS Code, Claude Desktop, or any MCP client. - - generic [ref=e845]: - - img "Cursor" [ref=e846] - - img "VS Code" [ref=e847] - - img "Claude Desktop" [ref=e848] - - generic [ref=e849]: - - text: Learn more - - img [ref=e850] - - link "Power Your Agent Integrate with AG2, LangChain, OpenAI Agents, CrewAI, Vercel AI, and more. AG2 LangChain OpenAI CrewAI Vercel AI Google ADK Mastra TanStack AI Learn more" [ref=e855] [cursor=pointer]: - - /url: /get-started/agent-frameworks - - generic [ref=e856]: - - img [ref=e858] - - generic [ref=e861]: Power Your Agent - - generic [ref=e862]: - - paragraph [ref=e863]: Integrate with AG2, LangChain, OpenAI Agents, CrewAI, Vercel AI, and more. - - generic [ref=e865]: - - img "AG2" [ref=e866] - - img "LangChain" [ref=e867] - - img "OpenAI" [ref=e868] - - img "CrewAI" [ref=e869] - - img "Vercel AI" [ref=e870] - - img "Google ADK" [ref=e871] - - img "Mastra" [ref=e872] - - img "TanStack AI" [ref=e873] - - generic [ref=e874]: - - text: Learn more - - img [ref=e875] - - generic [ref=e878]: - - generic [ref=e879]: - - generic [ref=e880]: - - heading "Popular Integrations" [level=2] [ref=e881] - - paragraph [ref=e882]: Pre-built MCP servers ready to use with your agents. - - link "See all 7,000+" [ref=e883] [cursor=pointer]: - - /url: /en/resources/integrations - - text: See all 7,000+ - - img - - generic [ref=e884]: - - generic [ref=e885]: - - link "Google Sheets Google Sheets" [ref=e886] [cursor=pointer]: - - /url: /resources/integrations/productivity/google-sheets - - img "Google Sheets" [ref=e888] - - generic [ref=e889]: Google Sheets - - link "Jira Jira" [ref=e890] [cursor=pointer]: - - /url: /resources/integrations/productivity/jira - - img "Jira" [ref=e892] - - generic [ref=e893]: Jira - - link "Gmail Gmail" [ref=e894] [cursor=pointer]: - - /url: /resources/integrations/productivity/gmail - - img "Gmail" [ref=e896] - - generic [ref=e897]: Gmail - - link "Confluence Confluence" [ref=e898] [cursor=pointer]: - - /url: /resources/integrations/productivity/confluence - - img "Confluence" [ref=e900] - - generic [ref=e901]: Confluence - - link "Slack Slack" [ref=e902] [cursor=pointer]: - - /url: /resources/integrations/social/slack - - img "Slack" [ref=e904] - - generic [ref=e905]: Slack - - link "Google Docs Google Docs" [ref=e906] [cursor=pointer]: - - /url: /resources/integrations/productivity/google-docs - - img "Google Docs" [ref=e908] - - generic [ref=e909]: Google Docs - - link "Google Slides Google Slides" [ref=e910] [cursor=pointer]: - - /url: /resources/integrations/productivity/google-slides - - img "Google Slides" [ref=e912] - - generic [ref=e913]: Google Slides - - link "HubSpot HubSpot" [ref=e914] [cursor=pointer]: - - /url: /resources/integrations/sales/hubspot - - img "HubSpot" [ref=e916] - - generic [ref=e917]: HubSpot - - link "Linear Linear" [ref=e918] [cursor=pointer]: - - /url: /resources/integrations/productivity/linear - - img "Linear" [ref=e920] - - generic [ref=e921]: Linear - - link "Google Drive Google Drive" [ref=e922] [cursor=pointer]: - - /url: /resources/integrations/productivity/google-drive - - img "Google Drive" [ref=e924] - - generic [ref=e925]: Google Drive - - generic [ref=e926]: - - link "GitHub GitHub" [ref=e927] [cursor=pointer]: - - /url: /resources/integrations/development/github - - img "GitHub" [ref=e929] - - generic [ref=e930]: GitHub - - link "X X" [ref=e931] [cursor=pointer]: - - /url: /resources/integrations/social/x - - img "X" [ref=e933] - - generic [ref=e934]: X - - link "MS Teams MS Teams" [ref=e935] [cursor=pointer]: - - /url: /resources/integrations/social/microsoft-teams - - img "MS Teams" [ref=e937] - - generic [ref=e938]: MS Teams - - link "Stripe Stripe" [ref=e939] [cursor=pointer]: - - /url: /resources/integrations/payments/stripe - - img "Stripe" [ref=e941] - - generic [ref=e942]: Stripe - - link "Notion Notion" [ref=e943] [cursor=pointer]: - - /url: /resources/integrations/productivity/notion - - img "Notion" [ref=e945] - - generic [ref=e946]: Notion - - link "Asana Asana" [ref=e947] [cursor=pointer]: - - /url: /resources/integrations/productivity/asana - - img "Asana" [ref=e949] - - generic [ref=e950]: Asana - - link "Reddit Reddit" [ref=e951] [cursor=pointer]: - - /url: /resources/integrations/social/reddit - - img "Reddit" [ref=e953] - - generic [ref=e954]: Reddit - - link "YouTube YouTube" [ref=e955] [cursor=pointer]: - - /url: /resources/integrations/search/youtube - - img "YouTube" [ref=e957] - - generic [ref=e958]: YouTube - - link "Dropbox Dropbox" [ref=e959] [cursor=pointer]: - - /url: /resources/integrations/productivity/dropbox - - img "Dropbox" [ref=e961] - - generic [ref=e962]: Dropbox - - generic [ref=e964]: - - generic [ref=e965]: - - heading "Works With Your Stack" [level=2] [ref=e966] - - paragraph [ref=e967]: Arcade integrates with popular agent frameworks and LLM providers. - - generic [ref=e968]: - - link "AG2 AG2" [ref=e969] [cursor=pointer]: - - /url: /get-started/agent-frameworks/ag2/use-arcade-tools - - img "AG2" [ref=e971] - - generic [ref=e972]: AG2 - - link "LangChain LangChain" [ref=e973] [cursor=pointer]: - - /url: /guides/agent-frameworks/langchain/use-arcade-tools - - img "LangChain" [ref=e975] - - generic [ref=e976]: LangChain - - link "OpenAI Agents OpenAI Agents" [ref=e977] [cursor=pointer]: - - /url: /get-started/agent-frameworks/openai-agents/overview - - img "OpenAI Agents" [ref=e979] - - generic [ref=e980]: OpenAI Agents - - link "CrewAI CrewAI" [ref=e981] [cursor=pointer]: - - /url: /guides/agent-frameworks/crewai/use-arcade-tools - - img "CrewAI" [ref=e983] - - generic [ref=e984]: CrewAI - - link "Vercel AI Vercel AI" [ref=e985] [cursor=pointer]: - - /url: /guides/agent-frameworks/vercelai - - img "Vercel AI" [ref=e987] - - generic [ref=e988]: Vercel AI - - link "Google ADK Google ADK" [ref=e989] [cursor=pointer]: - - /url: /guides/agent-frameworks/google-adk/use-arcade-tools - - img "Google ADK" [ref=e991] - - generic [ref=e992]: Google ADK - - link "Mastra Mastra" [ref=e993] [cursor=pointer]: - - /url: /guides/agent-frameworks/mastra/use-arcade-tools - - img "Mastra" [ref=e995] - - generic [ref=e996]: Mastra - - link "TanStack AI TanStack AI" [ref=e997] [cursor=pointer]: - - /url: /get-started/agent-frameworks/tanstack-ai - - img "TanStack AI" [ref=e999] - - generic [ref=e1000]: TanStack AI - - generic [ref=e1002]: - - generic [ref=e1003]: - - heading "How Arcade Works" [level=2] [ref=e1004] - - paragraph [ref=e1005]: Three core components that power your AI agents. - - generic [ref=e1006]: - - link "Runtime Your MCP server and agentic tool provider. Manages authentication, tool registration, and execution. Learn more" [ref=e1009] [cursor=pointer]: - - /url: /get-started/about-arcade - - generic [ref=e1010]: - - img [ref=e1012] - - generic [ref=e1023]: Runtime - - generic [ref=e1024]: - - paragraph [ref=e1025]: Your MCP server and agentic tool provider. Manages authentication, tool registration, and execution. - - generic [ref=e1026]: - - text: Learn more - - img [ref=e1027] - - link "Tool Catalog Catalog of pre-built tools and integrations. Browse 7,000+ ready-to-use MCP servers. Learn more" [ref=e1031] [cursor=pointer]: - - /url: /en/resources/integrations - - generic [ref=e1032]: - - img [ref=e1034] - - generic [ref=e1038]: Tool Catalog - - generic [ref=e1039]: - - paragraph [ref=e1040]: Catalog of pre-built tools and integrations. Browse 7,000+ ready-to-use MCP servers. - - generic [ref=e1041]: - - text: Learn more - - img [ref=e1042] - - link "Agent Authorization Let agents act on behalf of users. Handle OAuth, API keys, and tokens for tools like Gmail and Google Drive. Learn more" [ref=e1046] [cursor=pointer]: - - /url: /guides/tool-calling/custom-apps/auth-tool-calling - - generic [ref=e1047]: - - img [ref=e1049] - - generic [ref=e1051]: Agent Authorization - - generic [ref=e1052]: - - paragraph [ref=e1053]: Let agents act on behalf of users. Handle OAuth, API keys, and tokens for tools like Gmail and Google Drive. - - generic [ref=e1054]: - - text: Learn more - - img [ref=e1055] - - generic [ref=e1058]: - - generic [ref=e1059]: - - generic [ref=e1060]: - - heading "Sample Applications" [level=2] [ref=e1061] - - paragraph [ref=e1062]: See Arcade in action with these example applications. - - link "See all examples" [ref=e1063] [cursor=pointer]: - - /url: /resources/examples - - text: See all examples - - img - - generic [ref=e1064]: - - link "Arcade Chat A chatbot that can help you with your daily tasks." [ref=e1066] [cursor=pointer]: - - /url: https://chat.arcade.dev/ - - generic [ref=e1069]: - - heading "Arcade Chat" [level=3] [ref=e1071] - - paragraph [ref=e1072]: A chatbot that can help you with your daily tasks. - - link "Archer A bot for Slack that can act on your behalf." [ref=e1074] [cursor=pointer]: - - /url: https://github.com/ArcadeAI/ArcadeSlackAgent - - generic [ref=e1077]: - - heading "Archer" [level=3] [ref=e1079] - - paragraph [ref=e1080]: A bot for Slack that can act on your behalf. - - link "YouTube Podcast Summarizer A Slack bot that extracts and summarizes YouTube transcripts." [ref=e1082] [cursor=pointer]: - - /url: https://github.com/dforwardfeed/slack-AIpodcast-summaries - - generic [ref=e1085]: - - heading "YouTube Podcast Summarizer" [level=3] [ref=e1087] - - paragraph [ref=e1088]: A Slack bot that extracts and summarizes YouTube transcripts. - - generic [ref=e1090]: - - heading "Quick Links" [level=2] [ref=e1092] - - generic [ref=e1093]: - - link "API Reference" [ref=e1094] [cursor=pointer]: - - /url: /references/api - - img [ref=e1095] - - generic [ref=e1097]: API Reference - - link "CLI Cheat Sheet" [ref=e1098] [cursor=pointer]: - - /url: /references/cli-cheat-sheet - - img [ref=e1099] - - generic [ref=e1102]: CLI Cheat Sheet - - link "FAQ" [ref=e1103] [cursor=pointer]: - - /url: /resources/faq - - img [ref=e1104] - - generic [ref=e1107]: FAQ - - link "Changelog" [ref=e1108] [cursor=pointer]: - - /url: /references/changelog - - img [ref=e1109] - - generic [ref=e1112]: Changelog - - generic [ref=e1115]: - - text: Last updated on - - time [ref=e1116]: May 20, 2026 - - link "About Arcade" [ref=e1118] [cursor=pointer]: - - /url: /en/get-started/about-arcade - - text: About Arcade - - img [ref=e1119] - - generic [ref=e1121]: - - separator [ref=e1122] - - contentinfo [ref=e1123]: - - generic [ref=e1124]: - - generic [ref=e1125]: - - generic [ref=e1126]: - - link "Arcade Logo Making AI take action" [ref=e1127] [cursor=pointer]: - - /url: https://arcade.dev/ - - img "Arcade Logo" [ref=e1129] - - generic [ref=e1130]: Making AI take action - - generic [ref=e1131]: - - link "Github" [ref=e1132] [cursor=pointer]: - - /url: https://github.com/ArcadeAI - - img "Github" [ref=e1133] - - link "Discord" [ref=e1135] [cursor=pointer]: - - /url: https://discord.gg/GUZEMpEZ9p - - img "Discord" [ref=e1136] - - link "LinkedIn" [ref=e1138] [cursor=pointer]: - - /url: https://www.linkedin.com/company/arcade-ai/ - - img "LinkedIn" [ref=e1139] - - link "Send us an email" [ref=e1141] [cursor=pointer]: - - /url: mailto:contact@arcade.dev - - img [ref=e1142] - - generic [ref=e1145]: - - generic [ref=e1146]: - - heading "Project" [level=3] [ref=e1147] - - list [ref=e1148]: - - listitem [ref=e1149]: - - link "GitHub" [ref=e1150] [cursor=pointer]: - - /url: https://github.com/ArcadeAI/arcade-ai - - listitem [ref=e1151]: - - link "GitHub Container Registry" [ref=e1152] [cursor=pointer]: - - /url: https://github.com/orgs/ArcadeAI/packages - - listitem [ref=e1153]: - - link "Status" [ref=e1154] [cursor=pointer]: - - /url: https://status.arcade.dev/ - - generic [ref=e1155]: - - heading "Resources" [level=3] [ref=e1156] - - list [ref=e1157]: - - listitem [ref=e1158]: - - link "Documentation" [ref=e1159] [cursor=pointer]: - - /url: / - - listitem [ref=e1160]: - - link "Releases" [ref=e1161] [cursor=pointer]: - - /url: https://github.com/ArcadeAI/arcade-ai/releases - - listitem [ref=e1162]: - - link "Examples" [ref=e1163] [cursor=pointer]: - - /url: https://github.com/ArcadeAI/arcade-ai/tree/main/examples - - generic [ref=e1164]: - - heading "Feedback" [level=3] [ref=e1165] - - list [ref=e1166]: - - listitem [ref=e1167]: - - link "Discord" [ref=e1168] [cursor=pointer]: - - /url: https://discord.gg/GUZEMpEZ9p - - listitem [ref=e1169]: - - link "Report an issue on GitHub" [ref=e1170] [cursor=pointer]: - - /url: https://github.com/ArcadeAI/arcade-ai/issues/new/choose - - generic [ref=e1171]: - - paragraph [ref=e1173]: © 2024 — present Arcade AI, Inc. - - link "Privacy Policy" [ref=e1175] [cursor=pointer]: - - /url: https://www.arcade.dev/privacy-policy - - button "Open Next.js Dev Tools" [ref=e1181] [cursor=pointer]: - - img [ref=e1182] \ No newline at end of file diff --git a/.playwright-mcp/page-2026-05-20T16-03-06-919Z.yml b/.playwright-mcp/page-2026-05-20T16-03-06-919Z.yml deleted file mode 100644 index a76819644..000000000 --- a/.playwright-mcp/page-2026-05-20T16-03-06-919Z.yml +++ /dev/null @@ -1,1373 +0,0 @@ -- generic [ref=e1]: - - link "Skip to Content" [ref=e2] [cursor=pointer]: - - /url: "#nextra-skip-nav" - - banner [ref=e3]: - - navigation [ref=e5]: - - link "Home page" [ref=e6] [cursor=pointer]: - - /url: https://arcade.dev/ - - img "Arcade" [ref=e8] - - generic [ref=e12]: - - button "Search docs" [active] [ref=e13]: - - img [ref=e14] - - generic [ref=e17]: Search - - generic [ref=e18]: - - generic [ref=e19]: ⌘ - - text: K - - dialog "Search" [ref=e1199]: - - button "Close search" [ref=e1200] - - paragraph [ref=e1202]: - - text: Add - - code [ref=e1203]: NEXT_PUBLIC_ALGOLIA_APP_ID - - text: "," - - code [ref=e1204]: NEXT_PUBLIC_ALGOLIA_SEARCH_API_KEY - - text: ", and" - - code [ref=e1205]: NEXT_PUBLIC_ALGOLIA_INDEX_NAME - - text: to your environment to enable search. - - link "Github" [ref=e20] [cursor=pointer]: - - /url: https://github.com/ArcadeAI/arcade-mcp - - img "Github" [ref=e21] - - link "Discord" [ref=e23] [cursor=pointer]: - - /url: https://discord.gg/GUZEMpEZ9p - - img "Discord" [ref=e24] - - link "Sign Up" [ref=e26] [cursor=pointer]: - - /url: https://app.arcade.dev/register?utm_source=docs&utm_campaign=docs&utm_medium=navbar - - button "Sign Up" [ref=e27] - - link "Dashboard" [ref=e28] [cursor=pointer]: - - /url: https://app.arcade.dev/playground/chat - - button "Dashboard" [ref=e29] - - main [ref=e30]: - - generic [ref=e31]: - - complementary [ref=e32]: - - list [ref=e35]: - - listitem [ref=e36]: - - link "Docs Home" [ref=e37] [cursor=pointer]: - - /url: /en/home - - generic [ref=e38]: - - img [ref=e39] - - text: Docs Home - - listitem [ref=e42]: - - button "Get Started" [ref=e43] [cursor=pointer]: - - generic [ref=e44]: - - img [ref=e45] - - text: Get Started - - img [ref=e47] - - list [ref=e50]: - - listitem [ref=e51]: - - link "About Arcade" [ref=e52] [cursor=pointer]: - - /url: /en/get-started/about-arcade - - listitem [ref=e53]: - - button "Setup" [ref=e54] [cursor=pointer]: - - text: Setup - - img [ref=e55] - - list [ref=e57]: - - listitem [ref=e58]: - - link "Get an API key" [ref=e59] [cursor=pointer]: - - /url: /en/get-started/setup/api-keys - - listitem [ref=e60]: - - link "Connect Arcade docs to your IDE" [ref=e61] [cursor=pointer]: - - /url: /en/get-started/setup/connect-arcade-docs - - listitem [ref=e62]: - - link "Windows environment setup" [ref=e63] [cursor=pointer]: - - /url: /en/get-started/setup/windows-environment - - listitem [ref=e64]: - - button "Quickstarts" [ref=e65] [cursor=pointer]: - - text: Quickstarts - - img [ref=e66] - - list [ref=e68]: - - listitem [ref=e69]: - - link "Call tools in agents" [ref=e70] [cursor=pointer]: - - /url: /en/get-started/quickstarts/call-tool-agent - - listitem [ref=e71]: - - link "Call tools in IDE/MCP clients" [ref=e72] [cursor=pointer]: - - /url: /en/get-started/quickstarts/call-tool-client - - listitem [ref=e73]: - - link "Build an MCP server for custom tools" [ref=e74] [cursor=pointer]: - - /url: /en/get-started/quickstarts/mcp-server-quickstart - - listitem [ref=e75]: - - button "Agent Frameworks" [ref=e76] [cursor=pointer]: - - text: Agent Frameworks - - img [ref=e77] - - list [ref=e79]: - - listitem [ref=e80]: - - link "Overview" [ref=e81] [cursor=pointer]: - - /url: /en/get-started/agent-frameworks - - listitem [ref=e82]: - - link "Setup Arcade with your LLM (Python)" [ref=e83] [cursor=pointer]: - - /url: /en/get-started/agent-frameworks/setup-arcade-with-your-llm-python - - listitem [ref=e84]: - - button "AG2" [ref=e85] [cursor=pointer]: - - text: AG2 - - img [ref=e86] - - list [ref=e88]: - - listitem [ref=e89]: - - link "Setup Arcade tools with AG2" [ref=e90] [cursor=pointer]: - - /url: /en/get-started/agent-frameworks/ag2/use-arcade-tools - - listitem [ref=e91]: - - button "CrewAI" [ref=e92] [cursor=pointer]: - - text: CrewAI - - img [ref=e93] - - list [ref=e95]: - - listitem [ref=e96]: - - link "Setup Arcade tools with CrewAI" [ref=e97] [cursor=pointer]: - - /url: /en/get-started/agent-frameworks/crewai/use-arcade-tools - - listitem [ref=e98]: - - button "Google ADK" [ref=e99] [cursor=pointer]: - - text: Google ADK - - img [ref=e100] - - list [ref=e102]: - - listitem [ref=e103]: - - link "Overview" [ref=e104] [cursor=pointer]: - - /url: /en/get-started/agent-frameworks/google-adk/overview - - listitem [ref=e105]: - - link "Setup (Python)" [ref=e106] [cursor=pointer]: - - /url: /en/get-started/agent-frameworks/google-adk/setup-python - - listitem [ref=e107]: - - link "Setup (TypeScript)" [ref=e108] [cursor=pointer]: - - /url: /en/get-started/agent-frameworks/google-adk/setup-typescript - - listitem [ref=e109]: - - button "LangChain" [ref=e110] [cursor=pointer]: - - text: LangChain - - img [ref=e111] - - list [ref=e113]: - - listitem [ref=e114]: - - link "Overview" [ref=e115] [cursor=pointer]: - - /url: /en/get-started/agent-frameworks/langchain/overview - - listitem [ref=e116]: - - link "Setup (Python)" [ref=e117] [cursor=pointer]: - - /url: /en/get-started/agent-frameworks/langchain/use-arcade-with-langchain-py - - listitem [ref=e118]: - - link "Setup (TypeScript)" [ref=e119] [cursor=pointer]: - - /url: /en/get-started/agent-frameworks/langchain/use-arcade-with-langchain-ts - - listitem [ref=e120]: - - link "Authorizing Existing Tools" [ref=e121] [cursor=pointer]: - - /url: /en/get-started/agent-frameworks/langchain/auth-langchain-tools - - listitem [ref=e122]: - - link "Mastra" [ref=e123] [cursor=pointer]: - - /url: /en/get-started/agent-frameworks/mastra - - listitem [ref=e124]: - - button "OpenAI Agents" [ref=e125] [cursor=pointer]: - - text: OpenAI Agents - - img [ref=e126] - - list [ref=e128]: - - listitem [ref=e129]: - - link "Overview" [ref=e130] [cursor=pointer]: - - /url: /en/get-started/agent-frameworks/openai-agents/overview - - listitem [ref=e131]: - - link "Setup (Python)" [ref=e132] [cursor=pointer]: - - /url: /en/get-started/agent-frameworks/openai-agents/setup-python - - listitem [ref=e133]: - - link "Setup (TypeScript)" [ref=e134] [cursor=pointer]: - - /url: /en/get-started/agent-frameworks/openai-agents/setup-typescript - - listitem [ref=e135]: - - link "TanStack AI" [ref=e136] [cursor=pointer]: - - /url: /en/get-started/agent-frameworks/tanstack-ai - - listitem [ref=e137]: - - link "Vercel AI SDK" [ref=e138] [cursor=pointer]: - - /url: /en/get-started/agent-frameworks/vercelai - - listitem [ref=e139]: - - link "Spring AI SDK" [ref=e140] [cursor=pointer]: - - /url: /en/get-started/agent-frameworks/springai - - listitem [ref=e141]: - - button "MCP Clients" [ref=e142] [cursor=pointer]: - - text: MCP Clients - - img [ref=e143] - - list [ref=e145]: - - listitem [ref=e146]: - - link "Overview" [ref=e147] [cursor=pointer]: - - /url: /en/get-started/mcp-clients - - listitem [ref=e148]: - - link "Cursor" [ref=e149] [cursor=pointer]: - - /url: /en/get-started/mcp-clients/cursor - - listitem [ref=e150]: - - link "Claude Desktop" [ref=e151] [cursor=pointer]: - - /url: /en/get-started/mcp-clients/claude-desktop - - listitem [ref=e152]: - - link "Claude Code" [ref=e153] [cursor=pointer]: - - /url: /en/get-started/mcp-clients/claude-code - - listitem [ref=e154]: - - link "Visual Studio Code" [ref=e155] [cursor=pointer]: - - /url: /en/get-started/mcp-clients/visual-studio-code - - listitem [ref=e156]: - - link "Microsoft Copilot Studio" [ref=e157] [cursor=pointer]: - - /url: /en/get-started/mcp-clients/copilot-studio - - listitem [ref=e158]: - - link "GitHub Copilot" [ref=e159] [cursor=pointer]: - - /url: /en/get-started/mcp-clients/github-copilot - - listitem [ref=e160]: - - button "Resources" [ref=e161] [cursor=pointer]: - - generic [ref=e162]: - - img [ref=e163] - - text: Resources - - img [ref=e166] - - list [ref=e169]: - - listitem [ref=e170]: - - button "Integrations" [ref=e171] [cursor=pointer]: - - text: Integrations - - img [ref=e172] - - list [ref=e174]: - - listitem [ref=e175]: - - link "Overview" [ref=e176] [cursor=pointer]: - - /url: /en/resources/integrations - - listitem [ref=e177]: - - button "Productivity & Docs" [ref=e178] [cursor=pointer]: - - text: Productivity & Docs - - img [ref=e179] - - list [ref=e181]: - - listitem [ref=e182]: Optimized - - listitem [ref=e183]: - - link "Asana" [ref=e184] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/asana - - listitem [ref=e185]: - - link "ClickUp" [ref=e186] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/clickup - - listitem [ref=e187]: - - link "Confluence" [ref=e188] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/confluence - - listitem [ref=e189]: - - link "Dropbox" [ref=e190] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/dropbox - - listitem [ref=e191]: - - link "Figma" [ref=e192] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/figma - - listitem [ref=e193]: - - link "Gmail" [ref=e194] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/gmail - - listitem [ref=e195]: - - link "Google Calendar" [ref=e196] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/google-calendar - - listitem [ref=e197]: - - link "Google Contacts" [ref=e198] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/google-contacts - - listitem [ref=e199]: - - link "Google Docs" [ref=e200] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/google-docs - - listitem [ref=e201]: - - link "Google Drive" [ref=e202] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/google-drive - - listitem [ref=e203]: - - link "Google Sheets" [ref=e204] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/google-sheets - - listitem [ref=e205]: - - link "Google Slides" [ref=e206] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/google-slides - - listitem [ref=e207]: - - link "Granola" [ref=e208] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/granola - - listitem [ref=e209]: - - link "Jira" [ref=e210] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/jira - - listitem [ref=e211]: - - link "Linear" [ref=e212] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/linear - - listitem [ref=e213]: - - link "Microsoft Excel" [ref=e214] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/microsoft-excel - - listitem [ref=e215]: - - link "Microsoft OneDrive" [ref=e216] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/microsoft-onedrive - - listitem [ref=e217]: - - link "Microsoft Outlook Calendar" [ref=e218] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/microsoft-outlook-calendar - - listitem [ref=e219]: - - link "Microsoft Outlook Mail" [ref=e220] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/microsoft-outlook-mail - - listitem [ref=e221]: - - link "Microsoft PowerPoint" [ref=e222] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/microsoft-powerpoint - - listitem [ref=e223]: - - link "Microsoft SharePoint" [ref=e224] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/microsoft-sharepoint - - listitem [ref=e225]: - - link "Microsoft Word" [ref=e226] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/microsoft-word - - listitem [ref=e227]: Starter - - listitem [ref=e228]: - - link "Airtable API" [ref=e229] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/airtable-api - - listitem [ref=e230]: - - link "Asana API" [ref=e231] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/asana-api - - listitem [ref=e232]: - - link "Ashby API" [ref=e233] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/ashby-api - - listitem [ref=e234]: - - link "Box API" [ref=e235] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/box-api - - listitem [ref=e236]: - - link "Calendly API" [ref=e237] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/calendly-api - - listitem [ref=e238]: - - link "ClickUp API" [ref=e239] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/clickup-api - - listitem [ref=e240]: - - link "Figma API" [ref=e241] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/figma-api - - listitem [ref=e242]: - - link "Luma API" [ref=e243] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/luma-api - - listitem [ref=e244]: - - link "Mailchimp API" [ref=e245] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/mailchimp-marketing-api - - listitem [ref=e246]: - - link "Miro API" [ref=e247] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/miro-api - - listitem [ref=e248]: - - link "SquareUp API" [ref=e249] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/squareup-api - - listitem [ref=e250]: - - link "TickTick API" [ref=e251] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/ticktick-api - - listitem [ref=e252]: - - link "Trello API" [ref=e253] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/trello-api - - listitem [ref=e254]: - - link "Xero API" [ref=e255] [cursor=pointer]: - - /url: /en/resources/integrations/productivity/xero-api - - listitem [ref=e256]: - - button "Social & Communication" [ref=e257] [cursor=pointer]: - - text: Social & Communication - - img [ref=e258] - - list [ref=e260]: - - listitem [ref=e261]: Optimized - - listitem [ref=e262]: - - link "LinkedIn" [ref=e263] [cursor=pointer]: - - /url: /en/resources/integrations/social/linkedin - - listitem [ref=e264]: - - link "Microsoft Teams" [ref=e265] [cursor=pointer]: - - /url: /en/resources/integrations/social/microsoft-teams - - listitem [ref=e266]: - - link "Reddit" [ref=e267] [cursor=pointer]: - - /url: /en/resources/integrations/social/reddit - - listitem [ref=e268]: - - link "Slack" [ref=e269] [cursor=pointer]: - - /url: /en/resources/integrations/social/slack - - listitem [ref=e270]: - - link "Telegram" [ref=e271] [cursor=pointer]: - - /url: /en/resources/integrations/social/telegram - - listitem [ref=e272]: - - link "X" [ref=e273] [cursor=pointer]: - - /url: /en/resources/integrations/social/x - - listitem [ref=e274]: - - link "Zoom" [ref=e275] [cursor=pointer]: - - /url: /en/resources/integrations/social/zoom - - listitem [ref=e276]: Starter - - listitem [ref=e277]: - - link "Slack API" [ref=e278] [cursor=pointer]: - - /url: /en/resources/integrations/social/slack-api - - listitem [ref=e279]: - - button "Entertainment" [ref=e280] [cursor=pointer]: - - text: Entertainment - - img [ref=e281] - - list [ref=e283]: - - listitem [ref=e284]: Optimized - - listitem [ref=e285]: - - link "Imgflip" [ref=e286] [cursor=pointer]: - - /url: /en/resources/integrations/entertainment/imgflip - - listitem [ref=e287]: - - link "Spotify" [ref=e288] [cursor=pointer]: - - /url: /en/resources/integrations/entertainment/spotify - - listitem [ref=e289]: - - button "Developer Tools" [ref=e290] [cursor=pointer]: - - text: Developer Tools - - img [ref=e291] - - list [ref=e293]: - - listitem [ref=e294]: Optimized - - listitem [ref=e295]: - - link "Bright Data" [ref=e296] [cursor=pointer]: - - /url: /en/resources/integrations/development/brightdata - - listitem [ref=e297]: - - link "Daytona" [ref=e298] [cursor=pointer]: - - /url: /en/resources/integrations/development/daytona - - listitem [ref=e299]: - - link "E2B" [ref=e300] [cursor=pointer]: - - /url: /en/resources/integrations/development/e2b - - listitem [ref=e301]: - - link "Firecrawl" [ref=e302] [cursor=pointer]: - - /url: /en/resources/integrations/development/firecrawl - - listitem [ref=e303]: - - link "GitHub" [ref=e304] [cursor=pointer]: - - /url: /en/resources/integrations/development/github - - listitem [ref=e305]: - - link "Math" [ref=e306] [cursor=pointer]: - - /url: /en/resources/integrations/development/math - - listitem [ref=e307]: - - link "PagerDuty" [ref=e308] [cursor=pointer]: - - /url: /en/resources/integrations/development/pagerduty - - listitem [ref=e309]: - - link "PostHog" [ref=e310] [cursor=pointer]: - - /url: /en/resources/integrations/development/posthog - - listitem [ref=e311]: Starter - - listitem [ref=e312]: - - link "Arcade Engine API" [ref=e313] [cursor=pointer]: - - /url: /en/resources/integrations/development/arcade-engine-api - - listitem [ref=e314]: - - link "Cursor Agents API" [ref=e315] [cursor=pointer]: - - /url: /en/resources/integrations/development/cursor-agents-api - - listitem [ref=e316]: - - link "Datadog API" [ref=e317] [cursor=pointer]: - - /url: /en/resources/integrations/development/datadog-api - - listitem [ref=e318]: - - link "GitHub API" [ref=e319] [cursor=pointer]: - - /url: /en/resources/integrations/development/github-api - - listitem [ref=e320]: - - link "PostHog API" [ref=e321] [cursor=pointer]: - - /url: /en/resources/integrations/development/posthog-api - - listitem [ref=e322]: - - link "Vercel API" [ref=e323] [cursor=pointer]: - - /url: /en/resources/integrations/development/vercel-api - - listitem [ref=e324]: - - link "Zoho Creator API" [ref=e325] [cursor=pointer]: - - /url: /en/resources/integrations/development/zoho-creator-api - - listitem [ref=e326]: - - button "Payments & Finance" [ref=e327] [cursor=pointer]: - - text: Payments & Finance - - img [ref=e328] - - list [ref=e330]: - - listitem [ref=e331]: Optimized - - listitem [ref=e332]: - - link "Stripe" [ref=e333] [cursor=pointer]: - - /url: /en/resources/integrations/payments/stripe - - listitem [ref=e334]: Starter - - listitem [ref=e335]: - - link "Stripe API" [ref=e336] [cursor=pointer]: - - /url: /en/resources/integrations/payments/stripe_api - - listitem [ref=e337]: - - link "Zoho Books API" [ref=e338] [cursor=pointer]: - - /url: /en/resources/integrations/payments/zoho-books-api - - listitem [ref=e339]: - - button "Search Tools" [ref=e340] [cursor=pointer]: - - text: Search Tools - - img [ref=e341] - - list [ref=e343]: - - listitem [ref=e344]: Optimized - - listitem [ref=e345]: - - link "Google Finance" [ref=e346] [cursor=pointer]: - - /url: /en/resources/integrations/search/google_finance - - listitem [ref=e347]: - - link "Google Flights" [ref=e348] [cursor=pointer]: - - /url: /en/resources/integrations/search/google_flights - - listitem [ref=e349]: - - link "Google Hotels" [ref=e350] [cursor=pointer]: - - /url: /en/resources/integrations/search/google_hotels - - listitem [ref=e351]: - - link "Google Jobs" [ref=e352] [cursor=pointer]: - - /url: /en/resources/integrations/search/google_jobs - - listitem [ref=e353]: - - link "Google Maps" [ref=e354] [cursor=pointer]: - - /url: /en/resources/integrations/search/google_maps - - listitem [ref=e355]: - - link "Google News" [ref=e356] [cursor=pointer]: - - /url: /en/resources/integrations/search/google_news - - listitem [ref=e357]: - - link "Google Search" [ref=e358] [cursor=pointer]: - - /url: /en/resources/integrations/search/google_search - - listitem [ref=e359]: - - link "Google Shopping" [ref=e360] [cursor=pointer]: - - /url: /en/resources/integrations/search/google_shopping - - listitem [ref=e361]: - - link "Walmart" [ref=e362] [cursor=pointer]: - - /url: /en/resources/integrations/search/walmart - - listitem [ref=e363]: - - link "Youtube" [ref=e364] [cursor=pointer]: - - /url: /en/resources/integrations/search/youtube - - listitem [ref=e365]: Starter - - listitem [ref=e366]: - - link "Exa API" [ref=e367] [cursor=pointer]: - - /url: /en/resources/integrations/search/exa-api - - listitem [ref=e368]: - - link "Tavily" [ref=e369] [cursor=pointer]: - - /url: /en/resources/integrations/search/tavily - - listitem [ref=e370]: - - button "Sales" [ref=e371] [cursor=pointer]: - - text: Sales - - img [ref=e372] - - list [ref=e374]: - - listitem [ref=e375]: Optimized - - listitem [ref=e376]: - - link "Attio" [ref=e377] [cursor=pointer]: - - /url: /en/resources/integrations/sales/attio - - listitem [ref=e378]: - - link "HubSpot" [ref=e379] [cursor=pointer]: - - /url: /en/resources/integrations/sales/hubspot - - listitem [ref=e380]: - - link "Salesforce" [ref=e381] [cursor=pointer]: - - /url: /en/resources/integrations/sales/salesforce - - listitem [ref=e382]: Starter - - listitem [ref=e383]: - - link "HubSpot Automation API" [ref=e384] [cursor=pointer]: - - /url: /en/resources/integrations/sales/hubspot-automation-api - - listitem [ref=e385]: - - link "HubSpot CMS API" [ref=e386] [cursor=pointer]: - - /url: /en/resources/integrations/sales/hubspot-cms-api - - listitem [ref=e387]: - - link "HubSpot Conversations API" [ref=e388] [cursor=pointer]: - - /url: /en/resources/integrations/sales/hubspot-conversations-api - - listitem [ref=e389]: - - link "HubSpot CRM API" [ref=e390] [cursor=pointer]: - - /url: /en/resources/integrations/sales/hubspot-crm-api - - listitem [ref=e391]: - - link "HubSpot Events API" [ref=e392] [cursor=pointer]: - - /url: /en/resources/integrations/sales/hubspot-events-api - - listitem [ref=e393]: - - link "HubSpot Marketing API" [ref=e394] [cursor=pointer]: - - /url: /en/resources/integrations/sales/hubspot-marketing-api - - listitem [ref=e395]: - - link "HubSpot Meetings API" [ref=e396] [cursor=pointer]: - - /url: /en/resources/integrations/sales/hubspot-meetings-api - - listitem [ref=e397]: - - link "HubSpot Users API" [ref=e398] [cursor=pointer]: - - /url: /en/resources/integrations/sales/hubspot-users-api - - listitem [ref=e399]: - - button "Databases" [ref=e400] [cursor=pointer]: - - text: Databases - - img [ref=e401] - - list [ref=e403]: - - listitem [ref=e404]: Optimized - - listitem [ref=e405]: - - link "Clickhouse" [ref=e406] [cursor=pointer]: - - /url: /en/resources/integrations/databases/clickhouse - - listitem [ref=e407]: - - link "MongoDB" [ref=e408] [cursor=pointer]: - - /url: /en/resources/integrations/databases/mongodb - - listitem [ref=e409]: - - link "Postgres" [ref=e410] [cursor=pointer]: - - /url: /en/resources/integrations/databases/postgres - - listitem [ref=e411]: Starter - - listitem [ref=e412]: - - link "Weaviate API" [ref=e413] [cursor=pointer]: - - /url: /en/resources/integrations/databases/weaviate-api - - listitem [ref=e414]: - - link "YugabyteDB" [ref=e415] [cursor=pointer]: - - /url: /en/resources/integrations/databases/yugabytedb - - listitem [ref=e416]: - - button "Customer Support" [ref=e417] [cursor=pointer]: - - text: Customer Support - - img [ref=e418] - - list [ref=e420]: - - listitem [ref=e421]: Optimized - - listitem [ref=e422]: - - link "Pylon" [ref=e423] [cursor=pointer]: - - /url: /en/resources/integrations/customer-support/pylon - - listitem [ref=e424]: - - link "Zendesk" [ref=e425] [cursor=pointer]: - - /url: /en/resources/integrations/customer-support/zendesk - - listitem [ref=e426]: Starter - - listitem [ref=e427]: - - link "Customer.io API" [ref=e428] [cursor=pointer]: - - /url: /en/resources/integrations/customer-support/customerio-api - - listitem [ref=e429]: - - link "Customer.io Pipelines API" [ref=e430] [cursor=pointer]: - - /url: /en/resources/integrations/customer-support/customerio-pipelines-api - - listitem [ref=e431]: - - link "Customer.io Track API" [ref=e432] [cursor=pointer]: - - /url: /en/resources/integrations/customer-support/customerio-track-api - - listitem [ref=e433]: - - link "Freshservice API" [ref=e434] [cursor=pointer]: - - /url: /en/resources/integrations/customer-support/freshservice-api - - listitem [ref=e435]: - - link "Intercom API" [ref=e436] [cursor=pointer]: - - /url: /en/resources/integrations/customer-support/intercom-api - - listitem [ref=e437]: - - link "PagerDuty API" [ref=e438] [cursor=pointer]: - - /url: /en/resources/integrations/customer-support/pagerduty-api - - listitem [ref=e439]: - - link "Pylon API" [ref=e440] [cursor=pointer]: - - /url: /en/resources/integrations/customer-support/pylon-api - - listitem [ref=e441]: Feedback - - listitem [ref=e442]: - - link "Tool Feedback" [ref=e443] [cursor=pointer]: - - /url: /en/resources/integrations/tool-feedback - - listitem [ref=e444]: - - link "Examples" [ref=e445] [cursor=pointer]: - - /url: /en/resources/examples - - listitem [ref=e446]: - - link "Tools" [ref=e447] [cursor=pointer]: - - /url: /en/resources/tools - - listitem [ref=e448]: - - link "Glossary" [ref=e449] [cursor=pointer]: - - /url: /en/resources/glossary - - listitem [ref=e450]: - - link "FAQ" [ref=e451] [cursor=pointer]: - - /url: /en/resources/faq - - listitem [ref=e452]: - - link "Security research program" [ref=e453] [cursor=pointer]: - - /url: /en/resources/security-research-program - - listitem [ref=e454]: - - link "Contact" [ref=e455] [cursor=pointer]: - - /url: /en/resources/contact-us - - listitem [ref=e456]: - - link "Arcade Registry Early Access" [ref=e457] [cursor=pointer]: - - /url: /en/resources/registry-early-access - - listitem [ref=e458]: - - button "Guides" [ref=e459] [cursor=pointer]: - - generic [ref=e460]: - - img [ref=e461] - - text: Guides - - img [ref=e467] - - list [ref=e470]: - - listitem [ref=e471]: - - link "Audit Logs" [ref=e472] [cursor=pointer]: - - /url: /en/guides/audit-logs - - listitem [ref=e473]: - - button "Contextual Access" [ref=e474] [cursor=pointer]: - - text: Contextual Access - - img [ref=e475] - - list [ref=e477]: - - listitem [ref=e478]: - - link "Contextual Access" [ref=e479] [cursor=pointer]: - - /url: /en/guides/contextual-access - - listitem [ref=e480]: - - link "How Hooks Work" [ref=e481] [cursor=pointer]: - - /url: /en/guides/contextual-access/how-hooks-work - - listitem [ref=e482]: - - link "Running an Extension" [ref=e483] [cursor=pointer]: - - /url: /en/guides/contextual-access/examples - - listitem [ref=e484]: - - link "Build Your Own" [ref=e485] [cursor=pointer]: - - /url: /en/guides/contextual-access/build-your-own - - listitem [ref=e486]: - - button "MCP Gateways" [ref=e487] [cursor=pointer]: - - text: MCP Gateways - - img [ref=e488] - - list [ref=e490]: - - listitem [ref=e491]: - - link "MCP Gateways" [ref=e492] [cursor=pointer]: - - /url: /en/guides/mcp-gateways - - listitem [ref=e493]: - - link "Add remote MCP servers" [ref=e494] [cursor=pointer]: - - /url: /en/guides/mcp-gateways/add-remote-servers - - listitem [ref=e495]: - - link "Create via Dashboard" [ref=e496] [cursor=pointer]: - - /url: /en/guides/mcp-gateways/create-via-dashboard - - listitem [ref=e497]: - - link "Create via AI Assistant" [ref=e498] [cursor=pointer]: - - /url: /en/guides/mcp-gateways/create-via-ai - - listitem [ref=e499]: - - button "Call tools" [ref=e500] [cursor=pointer]: - - text: Call tools - - img [ref=e501] - - list [ref=e503]: - - listitem [ref=e504]: - - link "Overview" [ref=e505] [cursor=pointer]: - - /url: /en/guides/tool-calling - - listitem [ref=e506]: - - link "Handling errors" [ref=e507] [cursor=pointer]: - - /url: /en/guides/tool-calling/error-handling - - listitem [ref=e508]: - - link "Call third-party APIs" [ref=e509] [cursor=pointer]: - - /url: /en/guides/tool-calling/call-third-party-apis - - listitem [ref=e510]: - - button "In custom applications" [ref=e511] [cursor=pointer]: - - text: In custom applications - - img [ref=e512] - - list [ref=e514]: - - listitem [ref=e515]: - - link "Overview" [ref=e516] [cursor=pointer]: - - /url: /en/guides/tool-calling/custom-apps - - listitem [ref=e517]: - - link "Authorize tool calling" [ref=e518] [cursor=pointer]: - - /url: /en/guides/tool-calling/custom-apps/auth-tool-calling - - listitem [ref=e519]: - - link "Check authorization status" [ref=e520] [cursor=pointer]: - - /url: /en/guides/tool-calling/custom-apps/check-auth-status - - listitem [ref=e521]: - - link "Get formatted tool definitions" [ref=e522] [cursor=pointer]: - - /url: /en/guides/tool-calling/custom-apps/get-tool-definitions - - listitem [ref=e523]: - - button "Create tools" [ref=e524] [cursor=pointer]: - - text: Create tools - - img [ref=e525] - - list [ref=e527]: - - listitem [ref=e528]: - - button "Build a tool" [ref=e529] [cursor=pointer]: - - text: Build a tool - - img [ref=e530] - - list [ref=e532]: - - listitem [ref=e533]: - - link "Overview" [ref=e534] [cursor=pointer]: - - /url: /en/guides/create-tools/tool-basics - - listitem [ref=e535]: - - link "Compare MCP server types" [ref=e536] [cursor=pointer]: - - /url: /en/guides/create-tools/tool-basics/compare-server-types - - listitem [ref=e537]: - - link "Build an MCP Server to write custom tools" [ref=e538] [cursor=pointer]: - - /url: /en/guides/create-tools/tool-basics/build-mcp-server - - listitem [ref=e539]: - - link "Create a tool with auth" [ref=e540] [cursor=pointer]: - - /url: /en/guides/create-tools/tool-basics/create-tool-auth - - listitem [ref=e541]: - - link "Create a tool with secrets" [ref=e542] [cursor=pointer]: - - /url: /en/guides/create-tools/tool-basics/create-tool-secrets - - listitem [ref=e543]: - - link "Access runtime data" [ref=e544] [cursor=pointer]: - - /url: /en/guides/create-tools/tool-basics/runtime-data-access - - listitem [ref=e545]: - - link "Call tools from MCP clients" [ref=e546] [cursor=pointer]: - - /url: /en/guides/create-tools/tool-basics/call-tools-mcp - - listitem [ref=e547]: - - link "Organize your MCP server and tools" [ref=e548] [cursor=pointer]: - - /url: /en/guides/create-tools/tool-basics/organize-mcp-tools - - listitem [ref=e549]: - - link "Add metadata to your tools" [ref=e550] [cursor=pointer]: - - /url: /en/guides/create-tools/tool-basics/add-tool-metadata - - listitem [ref=e551]: - - button "Evaluate tools" [ref=e552] [cursor=pointer]: - - text: Evaluate tools - - img [ref=e553] - - list [ref=e555]: - - listitem [ref=e556]: - - link "Overview" [ref=e557] [cursor=pointer]: - - /url: /en/guides/create-tools/evaluate-tools - - listitem [ref=e558]: - - link "Why evaluate tools?" [ref=e559] [cursor=pointer]: - - /url: /en/guides/create-tools/evaluate-tools/why-evaluate - - listitem [ref=e560]: - - link "Create an evaluation suite" [ref=e561] [cursor=pointer]: - - /url: /en/guides/create-tools/evaluate-tools/create-evaluation-suite - - listitem [ref=e562]: - - link "Run evaluations" [ref=e563] [cursor=pointer]: - - /url: /en/guides/create-tools/evaluate-tools/run-evaluations - - listitem [ref=e564]: - - link "Capture mode" [ref=e565] [cursor=pointer]: - - /url: /en/guides/create-tools/evaluate-tools/capture-mode - - listitem [ref=e566]: - - link "Comparative evaluations" [ref=e567] [cursor=pointer]: - - /url: /en/guides/create-tools/evaluate-tools/comparative-evaluations - - listitem [ref=e568]: - - button "Improve an existing toolkit" [ref=e569] [cursor=pointer]: - - text: Improve an existing toolkit - - img [ref=e570] - - list [ref=e572]: - - listitem [ref=e573]: - - link "Types of Tools" [ref=e574] [cursor=pointer]: - - /url: /en/guides/create-tools/improve/types-of-tools - - listitem [ref=e575]: - - button "Handle errors" [ref=e576] [cursor=pointer]: - - text: Handle errors - - img [ref=e577] - - list [ref=e579]: - - listitem [ref=e580]: - - link "Overview" [ref=e581] [cursor=pointer]: - - /url: /en/guides/create-tools/error-handling - - listitem [ref=e582]: - - link "Retry Tools with Improved Prompt" [ref=e583] [cursor=pointer]: - - /url: /en/guides/create-tools/error-handling/retry-tools - - listitem [ref=e584]: - - link "Provide Useful Tool Errors" [ref=e585] [cursor=pointer]: - - /url: /en/guides/create-tools/error-handling/useful-tool-errors - - listitem [ref=e586]: - - button "Secure your server" [ref=e587] [cursor=pointer]: - - text: Secure your server - - img [ref=e588] - - list [ref=e590]: - - listitem [ref=e591]: - - link "Overview" [ref=e592] [cursor=pointer]: - - /url: /en/guides/create-tools/secure-your-server - - listitem [ref=e593]: - - link "Add Resource Server auth" [ref=e594] [cursor=pointer]: - - /url: /en/guides/create-tools/secure-your-server/secure-your-mcp-server - - listitem [ref=e595]: - - link "Migrate from toolkits to MCP servers" [ref=e596] [cursor=pointer]: - - /url: /en/guides/create-tools/migrate-toolkits - - listitem [ref=e597]: - - button "User-facing agents" [ref=e598] [cursor=pointer]: - - text: User-facing agents - - img [ref=e599] - - list [ref=e601]: - - listitem [ref=e602]: - - link "Secure Auth in Production" [ref=e603] [cursor=pointer]: - - /url: /en/guides/user-facing-agents/secure-auth-production - - listitem [ref=e604]: - - button "Deployment & hosting" [ref=e605] [cursor=pointer]: - - text: Deployment & hosting - - img [ref=e606] - - list [ref=e608]: - - listitem [ref=e609]: - - link "Overview" [ref=e610] [cursor=pointer]: - - /url: /en/guides/deployment-hosting - - listitem [ref=e611]: - - link "Arcade Cloud" [ref=e612] [cursor=pointer]: - - /url: /en/guides/deployment-hosting/arcade-cloud - - listitem [ref=e613]: - - link "On-premises MCP servers" [ref=e614] [cursor=pointer]: - - /url: /en/guides/deployment-hosting/on-prem - - listitem [ref=e615]: - - link "Configure Arcade's engine" [ref=e616] [cursor=pointer]: - - /url: /en/guides/deployment-hosting/configure-engine - - listitem [ref=e617]: - - link "Arcade Deploy" [ref=e618] [cursor=pointer]: - - /url: /en/guides/deployment-hosting/arcade-deploy - - listitem [ref=e619]: - - button "Logic Extensions" [ref=e620] [cursor=pointer]: - - text: Logic Extensions - - img [ref=e621] - - list [ref=e623]: - - listitem [ref=e624]: - - link "Build Your Own" [ref=e625] [cursor=pointer]: - - /url: /en/guides/logic-extensions/build-your-own - - listitem [ref=e626]: - - button "Learn" [ref=e627] [cursor=pointer]: - - generic [ref=e628]: - - img [ref=e629] - - text: Learn - - img [ref=e631] - - list [ref=e634]: - - listitem [ref=e635]: - - link "Server-Level vs Tool-Level Authorization" [ref=e636] [cursor=pointer]: - - /url: /en/learn/server-level-vs-tool-level-auth - - listitem [ref=e637]: - - button "References" [ref=e638] [cursor=pointer]: - - generic [ref=e639]: - - img [ref=e640] - - text: References - - img [ref=e643] - - list [ref=e646]: - - listitem [ref=e647]: - - link "Overview" [ref=e648] [cursor=pointer]: - - /url: /en/references - - listitem [ref=e649]: - - link "Changelog" [ref=e650] [cursor=pointer]: - - /url: /en/references/changelog - - listitem [ref=e651]: - - link "API" [ref=e652] [cursor=pointer]: - - /url: /en/references/api - - listitem [ref=e653]: - - button "Arcade MCP" [ref=e654] [cursor=pointer]: - - text: Arcade MCP - - img [ref=e655] - - list [ref=e657]: - - listitem [ref=e658]: - - button "Python" [ref=e659] [cursor=pointer]: - - text: Python - - img [ref=e660] - - list [ref=e662]: - - listitem [ref=e663]: - - link "Overview" [ref=e664] [cursor=pointer]: - - /url: /en/references/mcp/python - - listitem [ref=e665]: - - link "Context" [ref=e666] [cursor=pointer]: - - /url: /en/references/mcp/python/context - - listitem [ref=e667]: - - link "Resources" [ref=e668] [cursor=pointer]: - - /url: /en/references/mcp/python/resources - - listitem [ref=e669]: - - link "Server" [ref=e670] [cursor=pointer]: - - /url: /en/references/mcp/python/server - - listitem [ref=e671]: - - link "Settings" [ref=e672] [cursor=pointer]: - - /url: /en/references/mcp/python/settings - - listitem [ref=e673]: - - link "Middleware" [ref=e674] [cursor=pointer]: - - /url: /en/references/mcp/python/middleware - - listitem [ref=e675]: - - link "Errors" [ref=e676] [cursor=pointer]: - - /url: /en/references/mcp/python/errors - - listitem [ref=e677]: - - link "Telemetry" [ref=e678] [cursor=pointer]: - - /url: /en/references/mcp/telemetry - - listitem [ref=e679]: - - link "Arcade CLI" [ref=e680] [cursor=pointer]: - - /url: /en/references/arcade-cli - - listitem [ref=e681]: - - link "CLI Cheat Sheet" [ref=e682] [cursor=pointer]: - - /url: /en/references/cli-cheat-sheet - - listitem [ref=e683]: - - link "Contextual Access Webhook API" [ref=e684] [cursor=pointer]: - - /url: /en/references/contextual-access-webhook-api - - listitem [ref=e685]: - - button "Auth Providers" [ref=e686] [cursor=pointer]: - - text: Auth Providers - - img [ref=e687] - - list [ref=e689]: - - listitem [ref=e690]: - - link "Overview" [ref=e691] [cursor=pointer]: - - /url: /en/references/auth-providers - - listitem [ref=e692]: - - link "OAuth 2.0" [ref=e693] [cursor=pointer]: - - /url: /en/references/auth-providers/oauth2 - - listitem [ref=e694]: - - link "Airtable" [ref=e695] [cursor=pointer]: - - /url: /en/references/auth-providers/airtable - - listitem [ref=e696]: - - link "Asana" [ref=e697] [cursor=pointer]: - - /url: /en/references/auth-providers/asana - - listitem [ref=e698]: - - link "Atlassian" [ref=e699] [cursor=pointer]: - - /url: /en/references/auth-providers/atlassian - - listitem [ref=e700]: - - link "Attio" [ref=e701] [cursor=pointer]: - - /url: /en/references/auth-providers/attio - - listitem [ref=e702]: - - link "Calendly" [ref=e703] [cursor=pointer]: - - /url: /en/references/auth-providers/calendly - - listitem [ref=e704]: - - link "ClickUp" [ref=e705] [cursor=pointer]: - - /url: /en/references/auth-providers/clickup - - listitem [ref=e706]: - - link "Discord" [ref=e707] [cursor=pointer]: - - /url: /en/references/auth-providers/discord - - listitem [ref=e708]: - - link "Dropbox" [ref=e709] [cursor=pointer]: - - /url: /en/references/auth-providers/dropbox - - listitem [ref=e710]: - - link "Figma" [ref=e711] [cursor=pointer]: - - /url: /en/references/auth-providers/figma - - listitem [ref=e712]: - - link "GitHub" [ref=e713] [cursor=pointer]: - - /url: /en/references/auth-providers/github - - listitem [ref=e714]: - - link "Google" [ref=e715] [cursor=pointer]: - - /url: /en/references/auth-providers/google - - listitem [ref=e716]: - - link "Hubspot" [ref=e717] [cursor=pointer]: - - /url: /en/references/auth-providers/hubspot - - listitem [ref=e718]: - - link "Linear" [ref=e719] [cursor=pointer]: - - /url: /en/references/auth-providers/linear - - listitem [ref=e720]: - - link "LinkedIn" [ref=e721] [cursor=pointer]: - - /url: /en/references/auth-providers/linkedin - - listitem [ref=e722]: - - link "Mailchimp" [ref=e723] [cursor=pointer]: - - /url: /en/references/auth-providers/mailchimp - - listitem [ref=e724]: - - link "Microsoft" [ref=e725] [cursor=pointer]: - - /url: /en/references/auth-providers/microsoft - - listitem [ref=e726]: - - link "Miro" [ref=e727] [cursor=pointer]: - - /url: /en/references/auth-providers/miro - - listitem [ref=e728]: - - link "Notion" [ref=e729] [cursor=pointer]: - - /url: /en/references/auth-providers/notion - - listitem [ref=e730]: - - link "PagerDuty" [ref=e731] [cursor=pointer]: - - /url: /en/references/auth-providers/pagerduty - - listitem [ref=e732]: - - link "Reddit" [ref=e733] [cursor=pointer]: - - /url: /en/references/auth-providers/reddit - - listitem [ref=e734]: - - link "Salesforce" [ref=e735] [cursor=pointer]: - - /url: /en/references/auth-providers/salesforce - - listitem [ref=e736]: - - link "Slack" [ref=e737] [cursor=pointer]: - - /url: /en/references/auth-providers/slack - - listitem [ref=e738]: - - link "Spotify" [ref=e739] [cursor=pointer]: - - /url: /en/references/auth-providers/spotify - - listitem [ref=e740]: - - link "Square" [ref=e741] [cursor=pointer]: - - /url: /en/references/auth-providers/square - - listitem [ref=e742]: - - link "TickTick" [ref=e743] [cursor=pointer]: - - /url: /en/references/auth-providers/ticktick - - listitem [ref=e744]: - - link "Twitch" [ref=e745] [cursor=pointer]: - - /url: /en/references/auth-providers/twitch - - listitem [ref=e746]: - - link "X" [ref=e747] [cursor=pointer]: - - /url: /en/references/auth-providers/x - - listitem [ref=e748]: - - link "Zendesk" [ref=e749] [cursor=pointer]: - - /url: /en/references/auth-providers/zendesk - - listitem [ref=e750]: - - link "Zoho" [ref=e751] [cursor=pointer]: - - /url: /en/references/auth-providers/zoho - - listitem [ref=e752]: - - link "Zoom" [ref=e753] [cursor=pointer]: - - /url: /en/references/auth-providers/zoom - - generic [ref=e754]: - - button "English" [ref=e755] [cursor=pointer]: - - img [ref=e756] - - text: English - - button "Change theme" [ref=e758] [cursor=pointer]: - - img [ref=e1185] - - button "Collapse sidebar" [expanded] [ref=e761] [cursor=pointer]: - - img [ref=e762] - - article [ref=e765]: - - main [ref=e766]: - - generic [ref=e767]: - - generic [ref=e772]: - - heading "MCP Runtime for AI agents that get things done." [level=1] [ref=e773] - - paragraph [ref=e774]: Arcade handles OAuth, manages user tokens, and gives you 7,000+ pre-built integrations so your agents can take real action in production. - - generic [ref=e775]: - - link "Get Started" [ref=e776] [cursor=pointer]: - - /url: /get-started/quickstarts/call-tool-agent - - img - - text: Get Started - - link "Explore Tools" [ref=e777] [cursor=pointer]: - - /url: /en/resources/integrations - - img - - text: Explore Tools - - link "These docs are LLM-friendly — AI agents get clean markdown automatically" [ref=e779] [cursor=pointer]: - - /url: /get-started/setup/connect-arcade-docs - - img [ref=e780] - - text: These docs are LLM-friendly — AI agents get clean markdown automatically - - img [ref=e783] - - generic [ref=e787]: - - heading "Get Tools" [level=2] [ref=e788] - - link "Pre-built Integrations Browse 7,000+ ready-to-use integrations for Gmail, Slack, GitHub, and more. Gmail Slack GitHub Google Sheets Jira Notion Linear HubSpot Stripe Google Drive Dropbox Confluence Reddit Learn more" [ref=e792] [cursor=pointer]: - - /url: /en/resources/integrations - - generic [ref=e793]: - - img [ref=e795] - - generic [ref=e797]: Pre-built Integrations - - generic [ref=e798]: - - paragraph [ref=e799]: Browse 7,000+ ready-to-use integrations for Gmail, Slack, GitHub, and more. - - generic [ref=e801]: - - img "Gmail" [ref=e802] - - img "Slack" [ref=e803] - - img "GitHub" [ref=e804] - - img "Google Sheets" [ref=e805] - - img "Jira" [ref=e806] - - img "Notion" [ref=e807] - - img "Linear" [ref=e808] - - img "HubSpot" [ref=e809] - - img "Stripe" [ref=e810] - - img "Google Drive" [ref=e811] - - img "Dropbox" [ref=e812] - - img "Confluence" [ref=e813] - - img "Reddit" [ref=e814] - - generic [ref=e815]: - - text: Learn more - - img [ref=e816] - - link "Build Custom Tools Create your own MCP servers and custom tools with our SDK. Learn more" [ref=e821] [cursor=pointer]: - - /url: /guides/create-tools/tool-basics/build-mcp-server - - generic [ref=e822]: - - img [ref=e824] - - generic [ref=e826]: Build Custom Tools - - generic [ref=e827]: - - paragraph [ref=e828]: Create your own MCP servers and custom tools with our SDK. - - generic [ref=e829]: - - text: Learn more - - img [ref=e830] - - heading "Use Arcade" [level=2] [ref=e832] - - link "Connect to Your IDE Add tools to Cursor, VS Code, Claude Desktop, or any MCP client. Cursor VS Code Claude Desktop Learn more" [ref=e836] [cursor=pointer]: - - /url: /get-started/mcp-clients - - generic [ref=e837]: - - img [ref=e839] - - generic [ref=e841]: Connect to Your IDE - - generic [ref=e842]: - - paragraph [ref=e843]: Add tools to Cursor, VS Code, Claude Desktop, or any MCP client. - - generic [ref=e845]: - - img "Cursor" [ref=e846] - - img "VS Code" [ref=e847] - - img "Claude Desktop" [ref=e848] - - generic [ref=e849]: - - text: Learn more - - img [ref=e850] - - link "Power Your Agent Integrate with AG2, LangChain, OpenAI Agents, CrewAI, Vercel AI, and more. AG2 LangChain OpenAI CrewAI Vercel AI Google ADK Mastra TanStack AI Learn more" [ref=e855] [cursor=pointer]: - - /url: /get-started/agent-frameworks - - generic [ref=e856]: - - img [ref=e858] - - generic [ref=e861]: Power Your Agent - - generic [ref=e862]: - - paragraph [ref=e863]: Integrate with AG2, LangChain, OpenAI Agents, CrewAI, Vercel AI, and more. - - generic [ref=e865]: - - img "AG2" [ref=e866] - - img "LangChain" [ref=e867] - - img "OpenAI" [ref=e868] - - img "CrewAI" [ref=e869] - - img "Vercel AI" [ref=e870] - - img "Google ADK" [ref=e871] - - img "Mastra" [ref=e872] - - img "TanStack AI" [ref=e873] - - generic [ref=e874]: - - text: Learn more - - img [ref=e875] - - generic [ref=e878]: - - generic [ref=e879]: - - generic [ref=e880]: - - heading "Popular Integrations" [level=2] [ref=e881] - - paragraph [ref=e882]: Pre-built MCP servers ready to use with your agents. - - link "See all 7,000+" [ref=e883] [cursor=pointer]: - - /url: /en/resources/integrations - - text: See all 7,000+ - - img - - generic [ref=e884]: - - generic [ref=e885]: - - link "Google Sheets Google Sheets" [ref=e886] [cursor=pointer]: - - /url: /resources/integrations/productivity/google-sheets - - img "Google Sheets" [ref=e888] - - generic [ref=e889]: Google Sheets - - link "Jira Jira" [ref=e890] [cursor=pointer]: - - /url: /resources/integrations/productivity/jira - - img "Jira" [ref=e892] - - generic [ref=e893]: Jira - - link "Gmail Gmail" [ref=e894] [cursor=pointer]: - - /url: /resources/integrations/productivity/gmail - - img "Gmail" [ref=e896] - - generic [ref=e897]: Gmail - - link "Confluence Confluence" [ref=e898] [cursor=pointer]: - - /url: /resources/integrations/productivity/confluence - - img "Confluence" [ref=e900] - - generic [ref=e901]: Confluence - - link "Slack Slack" [ref=e902] [cursor=pointer]: - - /url: /resources/integrations/social/slack - - img "Slack" [ref=e904] - - generic [ref=e905]: Slack - - link "Google Docs Google Docs" [ref=e906] [cursor=pointer]: - - /url: /resources/integrations/productivity/google-docs - - img "Google Docs" [ref=e908] - - generic [ref=e909]: Google Docs - - link "Google Slides Google Slides" [ref=e910] [cursor=pointer]: - - /url: /resources/integrations/productivity/google-slides - - img "Google Slides" [ref=e912] - - generic [ref=e913]: Google Slides - - link "HubSpot HubSpot" [ref=e914] [cursor=pointer]: - - /url: /resources/integrations/sales/hubspot - - img "HubSpot" [ref=e916] - - generic [ref=e917]: HubSpot - - link "Linear Linear" [ref=e918] [cursor=pointer]: - - /url: /resources/integrations/productivity/linear - - img "Linear" [ref=e920] - - generic [ref=e921]: Linear - - link "Google Drive Google Drive" [ref=e922] [cursor=pointer]: - - /url: /resources/integrations/productivity/google-drive - - img "Google Drive" [ref=e924] - - generic [ref=e925]: Google Drive - - generic [ref=e926]: - - link "GitHub GitHub" [ref=e927] [cursor=pointer]: - - /url: /resources/integrations/development/github - - img "GitHub" [ref=e929] - - generic [ref=e930]: GitHub - - link "X X" [ref=e931] [cursor=pointer]: - - /url: /resources/integrations/social/x - - img "X" [ref=e933] - - generic [ref=e934]: X - - link "MS Teams MS Teams" [ref=e935] [cursor=pointer]: - - /url: /resources/integrations/social/microsoft-teams - - img "MS Teams" [ref=e937] - - generic [ref=e938]: MS Teams - - link "Stripe Stripe" [ref=e939] [cursor=pointer]: - - /url: /resources/integrations/payments/stripe - - img "Stripe" [ref=e941] - - generic [ref=e942]: Stripe - - link "Notion Notion" [ref=e943] [cursor=pointer]: - - /url: /resources/integrations/productivity/notion - - img "Notion" [ref=e945] - - generic [ref=e946]: Notion - - link "Asana Asana" [ref=e947] [cursor=pointer]: - - /url: /resources/integrations/productivity/asana - - img "Asana" [ref=e949] - - generic [ref=e950]: Asana - - link "Reddit Reddit" [ref=e951] [cursor=pointer]: - - /url: /resources/integrations/social/reddit - - img "Reddit" [ref=e953] - - generic [ref=e954]: Reddit - - link "YouTube YouTube" [ref=e955] [cursor=pointer]: - - /url: /resources/integrations/search/youtube - - img "YouTube" [ref=e957] - - generic [ref=e958]: YouTube - - link "Dropbox Dropbox" [ref=e959] [cursor=pointer]: - - /url: /resources/integrations/productivity/dropbox - - img "Dropbox" [ref=e961] - - generic [ref=e962]: Dropbox - - generic [ref=e964]: - - generic [ref=e965]: - - heading "Works With Your Stack" [level=2] [ref=e966] - - paragraph [ref=e967]: Arcade integrates with popular agent frameworks and LLM providers. - - generic [ref=e968]: - - link "AG2 AG2" [ref=e969] [cursor=pointer]: - - /url: /get-started/agent-frameworks/ag2/use-arcade-tools - - img "AG2" [ref=e971] - - generic [ref=e972]: AG2 - - link "LangChain LangChain" [ref=e973] [cursor=pointer]: - - /url: /guides/agent-frameworks/langchain/use-arcade-tools - - img "LangChain" [ref=e975] - - generic [ref=e976]: LangChain - - link "OpenAI Agents OpenAI Agents" [ref=e977] [cursor=pointer]: - - /url: /get-started/agent-frameworks/openai-agents/overview - - img "OpenAI Agents" [ref=e979] - - generic [ref=e980]: OpenAI Agents - - link "CrewAI CrewAI" [ref=e981] [cursor=pointer]: - - /url: /guides/agent-frameworks/crewai/use-arcade-tools - - img "CrewAI" [ref=e983] - - generic [ref=e984]: CrewAI - - link "Vercel AI Vercel AI" [ref=e985] [cursor=pointer]: - - /url: /guides/agent-frameworks/vercelai - - img "Vercel AI" [ref=e987] - - generic [ref=e988]: Vercel AI - - link "Google ADK Google ADK" [ref=e989] [cursor=pointer]: - - /url: /guides/agent-frameworks/google-adk/use-arcade-tools - - img "Google ADK" [ref=e991] - - generic [ref=e992]: Google ADK - - link "Mastra Mastra" [ref=e993] [cursor=pointer]: - - /url: /guides/agent-frameworks/mastra/use-arcade-tools - - img "Mastra" [ref=e995] - - generic [ref=e996]: Mastra - - link "TanStack AI TanStack AI" [ref=e997] [cursor=pointer]: - - /url: /get-started/agent-frameworks/tanstack-ai - - img "TanStack AI" [ref=e999] - - generic [ref=e1000]: TanStack AI - - generic [ref=e1002]: - - generic [ref=e1003]: - - heading "How Arcade Works" [level=2] [ref=e1004] - - paragraph [ref=e1005]: Three core components that power your AI agents. - - generic [ref=e1006]: - - link "Runtime Your MCP server and agentic tool provider. Manages authentication, tool registration, and execution. Learn more" [ref=e1009] [cursor=pointer]: - - /url: /get-started/about-arcade - - generic [ref=e1010]: - - img [ref=e1012] - - generic [ref=e1023]: Runtime - - generic [ref=e1024]: - - paragraph [ref=e1025]: Your MCP server and agentic tool provider. Manages authentication, tool registration, and execution. - - generic [ref=e1026]: - - text: Learn more - - img [ref=e1027] - - link "Tool Catalog Catalog of pre-built tools and integrations. Browse 7,000+ ready-to-use MCP servers. Learn more" [ref=e1031] [cursor=pointer]: - - /url: /en/resources/integrations - - generic [ref=e1032]: - - img [ref=e1034] - - generic [ref=e1038]: Tool Catalog - - generic [ref=e1039]: - - paragraph [ref=e1040]: Catalog of pre-built tools and integrations. Browse 7,000+ ready-to-use MCP servers. - - generic [ref=e1041]: - - text: Learn more - - img [ref=e1042] - - link "Agent Authorization Let agents act on behalf of users. Handle OAuth, API keys, and tokens for tools like Gmail and Google Drive. Learn more" [ref=e1046] [cursor=pointer]: - - /url: /guides/tool-calling/custom-apps/auth-tool-calling - - generic [ref=e1047]: - - img [ref=e1049] - - generic [ref=e1051]: Agent Authorization - - generic [ref=e1052]: - - paragraph [ref=e1053]: Let agents act on behalf of users. Handle OAuth, API keys, and tokens for tools like Gmail and Google Drive. - - generic [ref=e1054]: - - text: Learn more - - img [ref=e1055] - - generic [ref=e1058]: - - generic [ref=e1059]: - - generic [ref=e1060]: - - heading "Sample Applications" [level=2] [ref=e1061] - - paragraph [ref=e1062]: See Arcade in action with these example applications. - - link "See all examples" [ref=e1063] [cursor=pointer]: - - /url: /resources/examples - - text: See all examples - - img - - generic [ref=e1064]: - - link "Arcade Chat A chatbot that can help you with your daily tasks." [ref=e1066] [cursor=pointer]: - - /url: https://chat.arcade.dev/ - - generic [ref=e1069]: - - heading "Arcade Chat" [level=3] [ref=e1071] - - paragraph [ref=e1072]: A chatbot that can help you with your daily tasks. - - link "Archer A bot for Slack that can act on your behalf." [ref=e1074] [cursor=pointer]: - - /url: https://github.com/ArcadeAI/ArcadeSlackAgent - - generic [ref=e1077]: - - heading "Archer" [level=3] [ref=e1079] - - paragraph [ref=e1080]: A bot for Slack that can act on your behalf. - - link "YouTube Podcast Summarizer A Slack bot that extracts and summarizes YouTube transcripts." [ref=e1082] [cursor=pointer]: - - /url: https://github.com/dforwardfeed/slack-AIpodcast-summaries - - generic [ref=e1085]: - - heading "YouTube Podcast Summarizer" [level=3] [ref=e1087] - - paragraph [ref=e1088]: A Slack bot that extracts and summarizes YouTube transcripts. - - generic [ref=e1090]: - - heading "Quick Links" [level=2] [ref=e1092] - - generic [ref=e1093]: - - link "API Reference" [ref=e1094] [cursor=pointer]: - - /url: /references/api - - img [ref=e1095] - - generic [ref=e1097]: API Reference - - link "CLI Cheat Sheet" [ref=e1098] [cursor=pointer]: - - /url: /references/cli-cheat-sheet - - img [ref=e1099] - - generic [ref=e1102]: CLI Cheat Sheet - - link "FAQ" [ref=e1103] [cursor=pointer]: - - /url: /resources/faq - - img [ref=e1104] - - generic [ref=e1107]: FAQ - - link "Changelog" [ref=e1108] [cursor=pointer]: - - /url: /references/changelog - - img [ref=e1109] - - generic [ref=e1112]: Changelog - - generic [ref=e1115]: - - text: Last updated on - - time [ref=e1116]: May 20, 2026 - - link "About Arcade" [ref=e1118] [cursor=pointer]: - - /url: /en/get-started/about-arcade - - text: About Arcade - - img [ref=e1119] - - generic [ref=e1121]: - - separator [ref=e1122] - - contentinfo [ref=e1123]: - - generic [ref=e1124]: - - generic [ref=e1125]: - - generic [ref=e1126]: - - link "Arcade Logo Making AI take action" [ref=e1127] [cursor=pointer]: - - /url: https://arcade.dev/ - - img "Arcade Logo" [ref=e1129] - - generic [ref=e1130]: Making AI take action - - generic [ref=e1131]: - - link "Github" [ref=e1132] [cursor=pointer]: - - /url: https://github.com/ArcadeAI - - img "Github" [ref=e1133] - - link "Discord" [ref=e1135] [cursor=pointer]: - - /url: https://discord.gg/GUZEMpEZ9p - - img "Discord" [ref=e1136] - - link "LinkedIn" [ref=e1138] [cursor=pointer]: - - /url: https://www.linkedin.com/company/arcade-ai/ - - img "LinkedIn" [ref=e1139] - - link "Send us an email" [ref=e1141] [cursor=pointer]: - - /url: mailto:contact@arcade.dev - - img [ref=e1142] - - generic [ref=e1145]: - - generic [ref=e1146]: - - heading "Project" [level=3] [ref=e1147] - - list [ref=e1148]: - - listitem [ref=e1149]: - - link "GitHub" [ref=e1150] [cursor=pointer]: - - /url: https://github.com/ArcadeAI/arcade-ai - - listitem [ref=e1151]: - - link "GitHub Container Registry" [ref=e1152] [cursor=pointer]: - - /url: https://github.com/orgs/ArcadeAI/packages - - listitem [ref=e1153]: - - link "Status" [ref=e1154] [cursor=pointer]: - - /url: https://status.arcade.dev/ - - generic [ref=e1155]: - - heading "Resources" [level=3] [ref=e1156] - - list [ref=e1157]: - - listitem [ref=e1158]: - - link "Documentation" [ref=e1159] [cursor=pointer]: - - /url: / - - listitem [ref=e1160]: - - link "Releases" [ref=e1161] [cursor=pointer]: - - /url: https://github.com/ArcadeAI/arcade-ai/releases - - listitem [ref=e1162]: - - link "Examples" [ref=e1163] [cursor=pointer]: - - /url: https://github.com/ArcadeAI/arcade-ai/tree/main/examples - - generic [ref=e1164]: - - heading "Feedback" [level=3] [ref=e1165] - - list [ref=e1166]: - - listitem [ref=e1167]: - - link "Discord" [ref=e1168] [cursor=pointer]: - - /url: https://discord.gg/GUZEMpEZ9p - - listitem [ref=e1169]: - - link "Report an issue on GitHub" [ref=e1170] [cursor=pointer]: - - /url: https://github.com/ArcadeAI/arcade-ai/issues/new/choose - - generic [ref=e1171]: - - paragraph [ref=e1173]: © 2024 — present Arcade AI, Inc. - - link "Privacy Policy" [ref=e1175] [cursor=pointer]: - - /url: https://www.arcade.dev/privacy-policy - - generic [ref=e1180] [cursor=pointer]: - - button "Open Next.js Dev Tools" [ref=e1181]: - - img [ref=e1182] - - generic [ref=e1187]: - - button "Open issues overlay" [ref=e1188]: - - generic [ref=e1189]: - - generic [ref=e1190]: "1" - - generic [ref=e1191]: "2" - - generic [ref=e1192]: - - text: Issue - - generic [ref=e1193]: s - - button "Collapse issues badge" [ref=e1194]: - - img [ref=e1195] - - alert [ref=e1197] - - iframe [ref=e1198]: - - generic [ref=f1e2]: - - img [ref=f1e27] - - generic [ref=f1e34]: - - heading "Status embed installed correctly" [level=1] [ref=f1e35]: - - paragraph [ref=f1e36]: Status embed installed correctly - - generic [ref=f1e37]: This will be shown if an incident or maintenance is posted on your status page. - - link "View latest updates" [ref=f1e39] [cursor=pointer]: - - /url: https://status.arcade.dev?utm_source=embed - - button [ref=f1e41] [cursor=pointer]: - - img [ref=f1e42] - - iframe \ No newline at end of file diff --git a/.tmp/seo-apr24/gen_twins.py b/.tmp/seo-apr24/gen_twins.py deleted file mode 100644 index 04cd8184f..000000000 --- a/.tmp/seo-apr24/gen_twins.py +++ /dev/null @@ -1,52 +0,0 @@ -#!/usr/bin/env python3 -""" -Generate locale-less twin redirect rules for next.config.ts. -For each rule with source: '/:locale/...', generate a sibling with: - - source: '/...' (no locale) - - destination: '/en/...' (hardcoded) -""" -import re -import sys - -with open('/Users/teal/workspace/arcade/docs/next.config.ts', 'r') as f: - content = f.read() - -# Find the redirects() return array -# Extract all redirect objects -redirect_pattern = re.compile( - r'\{[^{}]*source:\s*"([^"]+)"[^{}]*destination:\s*"([^"]+)"[^{}]*permanent:\s*(true|false)[^{}]*\}', - re.DOTALL -) - -matches = list(redirect_pattern.finditer(content)) -print(f"Found {len(matches)} redirect rules", file=sys.stderr) - -twins = [] -for m in matches: - source = m.group(1) - destination = m.group(2) - permanent = m.group(3) - - # Only process sources that start with /:locale/ (not constrained locales) - if source.startswith('/:locale/'): - # Create locale-less version - locale_less_source = source[len('/:locale'):] # e.g. /home/auth/... - - # Create destination with /en/ instead of /:locale/ - if destination.startswith('/:locale/'): - locale_less_dest = '/en/' + destination[len('/:locale/'):] - else: - # Skip if destination doesn't follow expected pattern - continue - - twins.append({ - 'source': locale_less_source, - 'destination': locale_less_dest, - 'permanent': permanent, - 'original_source': source, - }) - -print(f"Generated {len(twins)} twin rules", file=sys.stderr) -for t in twins: - print(f" {t['original_source']} -> twin: {t['source']} => {t['destination']}") - diff --git a/.tmp/seo-apr24/insert_twins.py b/.tmp/seo-apr24/insert_twins.py deleted file mode 100644 index a42b7f669..000000000 --- a/.tmp/seo-apr24/insert_twins.py +++ /dev/null @@ -1,88 +0,0 @@ -#!/usr/bin/env python3 -""" -Insert locale-less twin redirect rules before each locale-prefixed rule in next.config.ts. -""" -import re - -CONFIG_PATH = '/Users/teal/workspace/arcade/docs/next.config.ts' - -with open(CONFIG_PATH, 'r') as f: - content = f.read() - -# We'll process line by line to find each redirect object block and insert twins before it -# Pattern: find each { source: "/:locale/...", ... } block and insert twin before it - -# Strategy: split on individual redirect object boundaries -# Each redirect is: -# { -# source: "...", -# destination: "...", -# permanent: true/false, -# }, -# We need to find each block that has source starting with /:locale/ - -# Let's use a more careful approach - find the start of each redirect object -# and insert a twin before it - -lines = content.split('\n') -output_lines = [] -i = 0 - -# Track which locale-constrained patterns we're inside (for the comment blocks) -in_locale_constrained = False - -while i < len(lines): - line = lines[i] - - # Check if this line starts a redirect object with /:locale/ source - # Look for: source: "/:locale/..." - source_match = re.search(r'source:\s*"(/:locale/[^"]+)"', line) - - if source_match: - # Find the full block - look backwards to find the opening brace of this object - # and forwards to find the closing brace - source_val = source_match.group(1) - - # Find destination on following lines - dest_val = None - permanent_val = None - - # Look ahead up to 5 lines for destination and permanent - for j in range(i, min(i+8, len(lines))): - dest_match = re.search(r'destination:\s*"(/:locale/[^"]+)"', lines[j]) - perm_match = re.search(r'permanent:\s*(true|false)', lines[j]) - if dest_match: - dest_val = dest_match.group(1) - if perm_match: - permanent_val = perm_match.group(1) - - if dest_val and permanent_val: - # Generate twin - locale_less_source = source_val[len('/:locale'):] - locale_less_dest = '/en/' + dest_val[len('/:locale/'):] - - # Find indentation of the current block opening (look back for the {) - indent = ' ' # default 8 spaces - # Look for the { that opens this block - for back in range(max(0, i-3), i+1): - brace_match = re.match(r'^(\s*)\{', lines[back]) - if brace_match: - indent = brace_match.group(1) - break - - # Insert twin before the current opening brace - # Find where the brace is (look back) - # We'll insert the twin just before the line with the opening brace of this block - output_lines.append(line) - else: - output_lines.append(line) - i += 1 - continue - - output_lines.append(line) - i += 1 - -print("Analysis only - checking pattern match") -print(f"Total lines: {len(lines)}") -print(f"Output lines: {len(output_lines)}") - diff --git a/search-open.png b/search-open.png deleted file mode 100644 index 2f9e846b4e9b1c9a10987ec7d5d5fce83c845844..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 149684 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 z%0AXf&k$TP(KrFBF{ynk40bKrl5peT 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 From e6c10daefecefc62286875ab9b19978d969ce91f Mon Sep 17 00:00:00 2001 From: Teal Larson Date: Mon, 19 Oct 2026 15:09:45 -0400 Subject: [PATCH 41/42] Update app/en/get-started/mcp-clients/page.mdx Co-authored-by: Alex Laughnan --- app/en/get-started/mcp-clients/page.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/en/get-started/mcp-clients/page.mdx b/app/en/get-started/mcp-clients/page.mdx index 73eaf505f..e0fed70e8 100644 --- a/app/en/get-started/mcp-clients/page.mdx +++ b/app/en/get-started/mcp-clients/page.mdx @@ -15,4 +15,4 @@ Every supported MCP client, including Cursor, Claude Desktop, Claude Code, VS Co ## Use the hosted gateway -To connect your agent to apps through Arcade's hosted gateway, [install the Arcade agent plugin](/get-started/agent-plugin). These client guides connect to a gateway you configure. +To connect your agent to apps through Arcade's hosted gateway, [install the Arcade agent plugin](/get-started/agent-plugin). This guide connects your client to a gateway you configure. From 68760dfc5085d146cbf2912221582e04c53384af Mon Sep 17 00:00:00 2001 From: Teal Larson Date: Mon, 19 Oct 2026 17:06:20 -0400 Subject: [PATCH 42/42] chore: rerun docs checks