# Managing Arcade Apps

> List, disconnect, reconnect, and fix the apps Arcade is connected to for the user, including switching accounts, expired sign-ins, and missing permissions, plus the one-time sign-in when a task needs an app that isn't connected yet. Use when the user asks which apps are connected, wants to disconnect, reconnect, or switch the account for an app, or a tool returns a sign-in link. Not for performing tasks inside apps.

- Skill: `arcadeai-labs/managing-arcade-apps` (Agent Skill)
- Install (CLI): `npx skillmds@latest add arcadeai-labs/managing-arcade-apps`
- Raw SKILL.md: https://api.skillmd.com/api/skills/arcadeai-labs/managing-arcade-apps/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Productivity, Integrations & APIs
- Author: arcadeai-labs (https://skillmd.com/u/arcadeai-labs)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/arcadeai-labs/managing-arcade-apps

---


# Managing connected apps

`Arcade_Apps` lives on the `arcade` MCP server. It shows every app available
to the user, connected or not.

## Quick start

```text
Arcade_Apps(action: "list")                      # all apps + connected state + account
Arcade_Apps(action: "disconnect", app_id: "...") # remove one app (confirm first)
```

Use **apps** language: app, connected, not connected, permissions, sign in,
disconnect. Avoid authorization, OAuth, scopes, provider, token.

## List

Call `Arcade_Apps(action: "list")` and show each app, whether it's connected,
and the account it's connected as. Connected apps first. Don't show internal
ids or raw permission strings.

### Example

```text
Arcade_Apps(action: "list")
  → {apps: [{app_id: "app-a", name: "App A", connected: true, account: "you@example.com"},
            {app_id: "app-b", name: "App B", connected: false}, ...]}
Reply:
  Connected: App A (you@example.com)
  Not connected: App B, App C, …
```

## Disconnect

Call `Arcade_Apps(action: "disconnect", app_id: "<id from list>")`. **Confirm
with the user first** — disconnecting removes Arcade's access to that app.
Report the outcome plainly.

## Signing in to an app

The first time a task needs an app the user hasn't connected, a tool returns a
one-time sign-in link. **The response may say `success: true` — an
`authorization_url` in the output still means sign-in required, not a completed
task.**

1. Present the link: "Sign in to connect your **<App>** here, then tell me to
   continue."
2. Stop and wait for the user — never poll or retry in a loop.
3. After they confirm, retry the original request once.

## Fixing an app connection

For wrong account, expired sign-in, missing permissions, or an explicit
"reconnect" request, use `Arcade_Apps` (same tool as list/disconnect) with a
`tool_name` from the affected app:

```text
Arcade_Apps(action: "status", tool_name: "...")                            # check the connection
Arcade_Apps(action: "switch_account", tool_name: "...",
            provider_id: "<from status>")                                  # sign in as a different account
Arcade_Apps(action: "reauthorize", tool_name: "...",
            provider_id: "<from status>")                                  # expired / missing permissions
```

Each returns a fresh sign-in link — present it, stop, and wait, exactly like a
first-time sign-in. Keep apps language: say "switch the account" or "sign in
again", not reauthorize/OAuth/scopes. If the user was signed in with the wrong
account, remind them the sign-in screen may reuse their browser session — they
may need to switch accounts on the app's own page.

## When not to use

- Performing tasks inside an app (sending, fetching, scheduling) — that's the
  `using-arcade-tools` skill.
- Don't call `list` speculatively before every task; tools surface sign-in
  links on their own when an app is missing.

