import { Tabs } from "nextra/components"; import { Callout, Steps } from "nextra/components"; # Discord The Discord auth provider enables tools and agents to call the Discord API on behalf of a user. ### What's documented here This page describes how to use and configure Discord auth with Arcade. This auth provider is used by: - Your [app code](#using-discord-auth-in-app-code) that needs to call Discord APIs - Or, your [custom tools](#using-discord-auth-in-custom-tools) that need to call Discord APIs ## Configuring Discord auth ### Create a Discord app - Create a Discord Application in the [Discord developer portal](https://discord.com/developers/applications) - In the OAuth2 tab, set the redirect URI to the redirect URL generated by Arcade (see below) - Copy the Client ID and Client Secret (you may need to reset the secret to see it) Next, add the Discord app to Arcade. ### Configuring Discord auth with the Arcade Dashboard 1. Navigate to the OAuth section of the Arcade Dashboard and click **Add OAuth Provider**. 2. Select **Discord** as the provider. 3. Choose a unique **ID** for your provider (e.g. "my-discord-provider") with an optional **Description**. 4. Enter your **Client ID** and **Client Secret** from your Discord app. 5. Note the **Redirect URL** generated by Arcade. This must be set as your Discord app's redirect URL. 6. Click **Save**. When you use tools that require Discord auth using your Arcade account credentials, Arcade will automatically use this Discord OAuth provider. ## Using Discord auth in app code Use the Discord auth provider in your own agents and AI apps to get a user token for the Discord API. See [authorizing agents with Arcade](/get-started/about-arcade) to understand how this works. Use `client.auth.start()` to get a user token for the Discord API: ```python {8-12} from arcadepy import Arcade client = Arcade() # Automatically finds the `ARCADE_API_KEY` env variable user_id = "{arcade_user_id}" # Start the authorization process auth_response = client.auth.start( user_id=user_id, provider="discord", scopes=["identify", "email", "guilds", "guilds.join"], ) if auth_response.status != "completed": print("Please complete the authorization challenge in your browser:") print(auth_response.url) # Wait for the authorization to complete auth_response = client.auth.wait_for_completion(auth_response) token = auth_response.context.token # Do something interesting with the token... ``` ```javascript {8-10} import { Arcade } from "@arcadeai/arcadejs"; const client = new Arcade(); const userId = "{arcade_user_id}"; // Start the authorization process const authResponse = await client.auth.start(userId, "discord", { scopes: ["identify", "email", "guilds", "guilds.join"], }); if (authResponse.status !== "completed") { console.log("Please complete the authorization challenge in your browser:"); console.log(authResponse.url); } // Wait for the authorization to complete authResponse = await client.auth.waitForCompletion(authResponse); const token = authResponse.context.token; // Do something interesting with the token... ``` ## Using Discord auth in custom tools You can author your own [custom tools](/guides/create-tools/tool-basics/build-mcp-server) that interact with the Discord API. Use the `Discord()` auth class to specify that a tool requires authorization with Discord. The `context.authorization.token` field will be automatically populated with the user's Discord token: ```python {5-6,9-13,23} from typing import Annotated, Optional import httpx from arcade_tdk import ToolContext, tool from arcade_tdk.auth import Discord @tool( requires_auth=Discord( scopes=["guilds"], ) ) async def list_servers( context: ToolContext, user_id: Annotated[ Optional[str], "The user's user ID. Defaults to '@me' for the current user.", ] = "@me", ) -> Annotated[dict, "List of servers the user is a member of"]: """List a Discord user's servers they are a member of.""" url = f"https://discord.com/api/users/{user_id}/guilds" headers = {"Authorization": f"Bearer {context.authorization.token}"} async with httpx.AsyncClient() as client: response = await client.get(url, headers=headers) response.raise_for_status() return response.json() ```