import { Tabs, Callout, Steps } from "nextra/components"; # X The X auth provider enables tools and agents to call the X (Twitter) API on behalf of a user. Want to quickly get started with X services in your agent or AI app? The pre-built [Arcade X MCP Server](/resources/integrations/social-communication/x) is what you want! ### What's documented here This page describes how to use and configure X auth with Arcade. This auth provider is used by: - The [Arcade X MCP Server](/resources/integrations/social-communication/x), which provides pre-built tools for interacting with X - Your [app code](#using-x-auth-in-app-code) that needs to call X APIs - Or, your [custom tools](#using-x-auth-in-custom-tools) that need to call X APIs ## Configuring X auth When using your own app credentials, make sure you configure your project to use a [custom user verifier](/guides/user-facing-agents/secure-auth-production#build-a-custom-user-verifier). Without this, your end-users will not be able to use your app or agent in production. In a production environment, you will most likely want to use your own X app credentials. This way, your users will see your application's name requesting permission. Before showing how to configure your X app credentials, let's go through the steps to create a X app. ### Create an X app - Follow X's guide to [creating an app](https://developer.x.com/en/docs/x-api/getting-started/getting-access-to-the-x-api) - Enable user authentication for your new app, and set its type to "Web App, Automated App or Bot" - Set the redirect URL to the redirect URL generated by Arcade (see below) - Copy the client ID and client secret to use below Next, add the X app to Arcade. ## Configuring your own X Auth Provider in Arcade ### Configure X Auth Using the Arcade Dashboard GUI #### Access the Arcade Dashboard To access the Arcade Cloud dashboard, go to [api.arcade.dev/dashboard](https://api.arcade.dev/dashboard). If you are self-hosting, by default the dashboard will be available at http://localhost:9099/dashboard. Adjust the host and port number to match your environment. #### Navigate to the OAuth Providers page - Under the **Connections** section of the Arcade Dashboard left-side menu, click **Connected Apps**. - Click **Add OAuth Provider** in the top right corner. - Select the **Included Providers** tab at the top. - In the **Provider** dropdown, select **X**. #### Enter the provider details - Choose a unique **ID** for your provider (e.g. "my-x-provider"). - Optionally enter a **Description**. - Enter the **Client ID** and **Client Secret** from your X app. - Note the **Redirect URL** generated by Arcade. This must be set as your X app's redirect URL. #### Create the provider Hit the **Create** button and the provider will be ready to be used. When you use tools that require X auth using your Arcade account credentials, Arcade will automatically use this X OAuth provider. If you have multiple X providers, see [using multiple auth providers of the same type](/references/auth-providers#using-multiple-providers-of-the-same-type) for more information. ## Using X auth in app code Use the X auth provider in your own agents and AI apps to get a user token for the X 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 X: ```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="x", scopes=["tweet.read", "tweet.write", "users.read"], ) 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-12} import { Arcade } from "@arcadeai/arcadejs"; const client = new Arcade(); // Automatically finds the `ARCADE_API_KEY` env variable const userId = "{arcade_user_id}"; // Start the authorization process let authResponse = await client.auth.start(userId, "x", [ "tweet.read", "tweet.write", "users.read", ]); 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 X auth in custom tools You can use the pre-built [Arcade X MCP Server](/resources/integrations/social-communication/x) to quickly build agents and AI apps that interact with X. If the pre-built tools in the X MCP Server don't meet your needs, you can author your own [custom tools](/guides/create-tools/tool-basics/build-mcp-server) that interact with the X API. Use the `X()` auth class to specify that a tool requires authorization with X. The `context.authorization.token` field will be automatically populated with the user's X token: ```python {5-6,9-13,21} from typing import Annotated import httpx from arcade_tdk import ToolContext, tool from arcade_tdk.auth import X @tool( requires_auth=X( scopes=["tweet.read", "tweet.write", "users.read"], ) ) async def post_tweet( context: ToolContext, tweet_text: Annotated[str, "The text content of the tweet you want to post"], ) -> Annotated[str, "Success string and the URL of the tweet"]: """Post a tweet to X (Twitter).""" url = "https://api.x.com/2/tweets" headers = { "Authorization": f"Bearer {context.authorization.token}", "Content-Type": "application/json", } payload = {"text": tweet_text} async with httpx.AsyncClient() as client: response = await client.post(url, headers=headers, json=payload) response.raise_for_status() tweet_id = response.json()["data"]["id"] return f"Tweet with id {tweet_id} posted successfully. URL: https://x.com/x/status/{tweet_id}" ```