# https://docs.arcade.dev llms-full.txt ## AI Agent Deployment # Welcome to Arcade! Learn how to move AI agents from demo to production with Arcade. Arcade enables your AI agent to securely take real-world actions through user-specific permissions, pre-built toolkits for Gmail, Slack, GitHub, and more. You can also build your own agentic tools and MCP servers with our authoring and testing suite. Arcade is your tool engine,registry, andruntime. Get started with a 5-minute quickstart. [Get Started](https://docs.arcade.dev/home/quickstart) [Build a tool](https://docs.arcade.dev/home/build-tools/create-a-mcp-server) Give your AI IDE access to Arcade.dev's documentation using our llms.txt files ( [short llms.txt](https://docs.arcade.dev/llms.txt), [llms-full.txt](https://docs.arcade.dev/llms-full.txt)), or use [context7](https://context7.com/arcadeai/docs). ## Sample Applications Get started quickly with our pre-built templates and example applications. [![Arcade Chat](https://docs.arcade.dev/_next/image?url=%2Fimages%2Fsample-apps%2Farcade-chat.png&w=3840&q=75)\\ \\ **Arcade Chat** \\ \\ A chatbot that can help you with your daily tasks.](https://chat.arcade.dev/) [![Archer](https://docs.arcade.dev/_next/image?url=%2Fimages%2Flogo%2Farcade.png&w=3840&q=75)\\ \\ **Archer** \\ \\ A bot for Slack that can act on your behalf.](https://github.com/ArcadeAI/ArcadeSlackAgent) [![Summarize YouTube Podcasts in Slack](https://docs.arcade.dev/_next/image?url=%2Fimages%2Fsample-apps%2Fslack-aipodcast-summaries.jpg&w=3840&q=75)\\ \\ **Summarize YouTube Podcasts in Slack** \\ \\ A Slack bot that extracts and summarizes YouTube transcripts in Weaviate, perfect for AI podcasts.](https://github.com/dforwardfeed/slack-AIpodcast-summaries) ## Arcade Overview ![arcade overview](https://docs.arcade.dev/_next/image?url=%2Fimages%2Foverview.png&w=2048&q=75) [Arcade Engine\\ \\ The Arcade engine is your MCP Server and Agentic tool provider. It allows you to write your tools once and serve them across any LLM or orchestration framework, no matter the protocol. The engine manages agent authentication, tool registration, and tool execution.](https://docs.arcade.dev/home#) [Dashboard\\ \\ The Arcade Dashboard is how you manage your tools, users, and deployments from a single place. No matter how large your deployment or organization gets, the Dashboard will scale with you.](https://docs.arcade.dev/home#) [Public and Private Tools\\ \\ Arcade makes it easy to develop custom tools that just work with Agents. Our SDKs and framework integrations make it easy to get started. When you are ready, it's easy to run your tools either on-prem or in our cloud.](https://docs.arcade.dev/home#) [Tools and MCP Servers Together\\ \\ The Arcade Engine is the only way to combine MCP servers with your Agentic tools. Regardless of where your tool is hosted, you can serve and manage access to it via the Engine. You easily can mix our public tools with your own private tools in your agents.](https://docs.arcade.dev/home#) [Contact us](https://docs.arcade.dev/home/contact-us "[object Object]") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Spotify Toolkit Overview [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Entertainment](https://docs.arcade.dev/mcp-servers/entertainment/imgflip "Entertainment") Spotify # Spotify **Description:** Enable agents to interact with Spotify tracks. **Author:** Arcade **Auth:** User authorizationvia the [Spotify auth provider](https://docs.arcade.dev/home/auth-providers/spotify) This Toolkit is not available in Arcade Cloud. You can use these tools with a [self-hosted](https://docs.arcade.dev/home/deployment/engine-configuration) instance of Arcade. [![PyPI Version](https://img.shields.io/pypi/v/arcade_spotify)](https://pypi.org/project/arcade_spotify/)[![License](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/arcadeai/arcade-ai/blob/main/LICENSE)[![Python Versions](https://img.shields.io/pypi/pyversions/arcade_spotify)](https://pypi.org/project/arcade_spotify/)[![Wheel Status](https://img.shields.io/pypi/wheel/arcade_spotify)](https://pypi.org/project/arcade_spotify/)[![Downloads](https://img.shields.io/pypi/dm/arcade_spotify)](https://pypi.org/project/arcade_spotify/) The Arcade Spotify MCP Server provides a pre-built set of tools for interacting with Spotify. These tools make it easy to build agents and AI apps that can: - Get information about tracks - Search for tracks - Control playback ## Available Tools [Permalink for this section](https://docs.arcade.dev/mcp-servers/entertainment/spotify\#available-tools) These tools are currently available in the Arcade Spotify toolkit. | Tool Name | Description | | --- | --- | | Spotify.GetTrackFromId | Get information about a track | | Spotify.AdjustPlaybackPosition | Adjust the playback position within the currently playing track. Note: This tool currently requires a self-hosted instance of Arcade. | | Spotify.SkipToPreviousTrack | Skip to the previous track in the user's queue, if any. Note: This tool currently requires a self-hosted instance of Arcade. | | Spotify.SkipToNextTrack | Skip to the next track in the user's queue, if any. Note: This tool currently requires a self-hosted instance of Arcade. | | Spotify.PausePlayback | Pause the currently playing track, if any. Note: This tool currently requires a self-hosted instance of Arcade. | | Spotify.ResumePlayback | Resume the currently playing track, if any. Note: This tool currently requires a self-hosted instance of Arcade. | | Spotify.StartTracksPlaybackById | Start playback of a list of tracks (songs). Note: This tool currently requires a self-hosted instance of Arcade. | | Spotify.GetPlaybackState | Get information about the user's current playback state, including track or episode, and active device. Note: This tool currently requires a self-hosted instance of Arcade. | | Spotify.GetCurrentlyPlaying | Get information about the user's currently playing track. Note: This tool currently requires a self-hosted instance of Arcade. | | Spotify.PlayArtistByName | Plays a song by an artist and queues four more songs by the same artist. Note: This tool currently requires a self-hosted instance of Arcade. | | Spotify.PlayTrackByName | Plays a song by name. Note: This tool currently requires a self-hosted instance of Arcade. | | Spotify.GetAvailableDevices | Get the available devices. Note: This tool currently requires a self-hosted instance of Arcade. | | Spotify.Search | Search Spotify catalog information. Note: This tool currently requires a self-hosted instance of Arcade. | If you need to perform an action that’s not listed here, you can [get in touch\\ with us](mailto:contact@arcade.dev) to request a new tool, or [create your\\ own tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server) with the [Spotify auth\\ provider](https://docs.arcade.dev/home/auth-providers/spotify#using-spotify-auth-in-customtools). ## Spotify.GetTrackFromId [Permalink for this section](https://docs.arcade.dev/mcp-servers/entertainment/spotify\#spotifygettrackfromid) See Example > Get information about a track **Parameters** - `track_id` _(string, required)_ The Spotify ID of the track * * * ## Spotify.AdjustPlaybackPosition [Permalink for this section](https://docs.arcade.dev/mcp-servers/entertainment/spotify\#spotifyadjustplaybackposition) See Example > Adjust the playback position within the currently playing track. Knowledge of the current playback state is NOT needed to use this tool as it handles clamping the position to valid start/end boundaries to prevent overshooting or negative values. This tool allows you to seek to a specific position within the currently playing track. You can either provide an absolute position in milliseconds or a relative position from the current playback position in milliseconds. Note: Either absolute\_position\_ms or relative\_position\_ms must be provided, but not both. **Parameters** - `absolute_position_ms` _(integer, optional)_ The absolute position in milliseconds to seek to - `relative_position_ms` _(integer, optional)_ The relative position from the current playback position in milliseconds to seek to * * * ## Spotify.SkipToPreviousTrack [Permalink for this section](https://docs.arcade.dev/mcp-servers/entertainment/spotify\#spotifyskiptoprevioustrack) See Example > Skip to the previous track in the user’s queue, if any * * * ## Spotify.SkipToNextTrack [Permalink for this section](https://docs.arcade.dev/mcp-servers/entertainment/spotify\#spotifyskiptonexttrack) See Example > Skip to the next track in the user’s queue, if any * * * ## Spotify.PausePlayback [Permalink for this section](https://docs.arcade.dev/mcp-servers/entertainment/spotify\#spotifypauseplayback) See Example > Pause the currently playing track, if any * * * ## Spotify.ResumePlayback [Permalink for this section](https://docs.arcade.dev/mcp-servers/entertainment/spotify\#spotifyresumeplayback) See Example > Resume the currently playing track, if any * * * ## Spotify.StartTracksPlaybackById [Permalink for this section](https://docs.arcade.dev/mcp-servers/entertainment/spotify\#spotifystarttracksplaybackbyid) See Example > Start playback of a list of tracks (songs) **Parameters** - `track_ids` _(array, required)_ A list of Spotify track (song) IDs to play. Order of execution is not guarenteed. - `position_ms` _(integer, optional)_ The position in milliseconds to start the first track from * * * ## Spotify.GetPlaybackState [Permalink for this section](https://docs.arcade.dev/mcp-servers/entertainment/spotify\#spotifygetplaybackstate) See Example > Get information about the user’s current playback state, including track or episode, and active device. This tool does not perform any actions. Use other tools to control playback. * * * ## Spotify.GetCurrentlyPlaying [Permalink for this section](https://docs.arcade.dev/mcp-servers/entertainment/spotify\#spotifygetcurrentlyplaying) See Example > Get information about the user’s currently playing track * * * ## Spotify.PlayArtistByName [Permalink for this section](https://docs.arcade.dev/mcp-servers/entertainment/spotify\#spotifyplayartistbyname) See Example > Plays a song by an artist and queues four more songs by the same artist **Parameters** - `name` _(string, required)_ The name of the artist to play * * * ## Spotify.PlayTrackByName [Permalink for this section](https://docs.arcade.dev/mcp-servers/entertainment/spotify\#spotifyplaytrackbyname) See Example > Plays a song by name **Parameters** - `track_name` _(string, required)_ The name of the track to play - `artist_name` _(string, optional)_ The name of the artist of the track ## Spotify.GetAvailableDevices [Permalink for this section](https://docs.arcade.dev/mcp-servers/entertainment/spotify\#spotifygetavailabledevices) See Example > Get the available devices * * * ## Spotify.Search [Permalink for this section](https://docs.arcade.dev/mcp-servers/entertainment/spotify\#spotifysearch) See Example > Search Spotify catalog information Explanation of the q parameter: You can narrow down your search using field filters. The available filters are album, artist, track, year, upc, tag:hipster, tag:new, isrc, and genre. Each field filter only applies to certain result types. The artist and year filters can be used while searching albums, artists and tracks. You can filter on a single year or a range (e.g. 1955-1960). The album filter can be used while searching albums and tracks. The genre filter can be used while searching artists and tracks. The isrc and track filters can be used while searching tracks. The upc, tag:new and tag:hipster filters can only be used while searching albums. The tag:new filter will return albums released in the past two weeks and tag:hipster can be used to return only albums with the lowest 10% popularity. Example: q=“remaster track:Doxy artist:Miles Davis” **Parameters** - `q` _(string, required)_ The search query - `types` _(array, required)_ The types of results to return, Valid values are ‘album’, ‘artist’, ‘playlist’, ‘track’, ‘show’, ‘episode’, ‘audiobook’ - `limit` _(integer, optional)_ The maximum number of results to return. Defaults to `1`. ## Get Building [Use tools hosted on Arcade Cloud\\ \\ Arcade tools are hosted by our cloud platform and ready to be used in your agents. Learn how.](https://docs.arcade.dev/home/quickstart) [Self Host Arcade tools\\ \\ Arcade tools can be self-hosted on your own infrastructure. Learn more about self-hosting.\\ \\ ```\\ pip install arcade_spotify\\ ```](https://docs.arcade.dev/home/hosting-overview) [Imgflip](https://docs.arcade.dev/mcp-servers/entertainment/imgflip "Imgflip") [Twitch](https://docs.arcade.dev/mcp-servers/entertainment/twitch "Twitch") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Arcade.dev Changelog [Home](https://docs.arcade.dev/home "Home") Changelog # Changelog _Here’s what’s new at Arcade.dev!_ ## 2025-09-26 [Permalink for this section](https://docs.arcade.dev/home/changelog\#for-the-week-ending-on-2025-09-26) **Toolkits** - `[feature - 🚀]` Introduce [Starter Tools](https://docs.arcade.dev/home/use-tools/types-of-tools), a new type of tool that mirrors the original HTTP API design of the upstream service. - `[feature - 🚀]` Release Slack started toolkit which contains support for most of the Slack API. - `[feature - 🚀]` Include advanced error handling in the following toolkits: Google, Microsoft, Slack, and Asana. Learn more about handling tool errors [here](https://docs.arcade.dev/home/build-tools/handle-tool-errorsk). - `[bugfix - 🐛]` \[toolkits/MS Teams\] Fix get\_chat\_metadata by chat’s users - `[feature - 🚀]` \[toolkits/confluence\] Adding WhoAmI tools for Confluence **CLI and TDK** - `[bugfix - 🐛]` Fix reference in `arcade docs` Python example template to USER\_ID instead of TOOL\_NAME **Misc** - `[documentation - 📝]` Documents API wrapper vs LLM-native toolkits; includes Slack API wrapper toolkit docs ## 2025-09-19 [Permalink for this section](https://docs.arcade.dev/home/changelog\#for-the-week-ending-on-2025-09-19) **Toolkits** - `[feature - 🚀]` \[Toolkits/ClickUp\] Removing no content additional messages in Evals - `[feature - 🚀]` \[Toolkits/MongoDB\] Add analytics MongoDB toolkit ( [PR #548](https://github.com/ArcadeAI/arcade-ai/pull/548)) - `[feature - 🚀]` \[toolkits/HubSpot\] Adding HubSpot toolkit enhancements ( [PR #441](https://github.com/ArcadeAI/docs/pull/441)) **CLI and TDK** - `[maintenance - 🔧]` Update Mastra example toolkit project **Misc** - `[documentation - 📝]` Term consistency ( [PR #445](https://github.com/ArcadeAI/docs/pull/445)) - `[documentation - 📝]` Update Tool Error Handling ( [PR #438](https://github.com/ArcadeAI/docs/pull/438)) - `[maintenance - 🔧]` Update Mastra example docs to better match the example repo ( [PR #444](https://github.com/ArcadeAI/docs/pull/444)) ## 2025-09-12 [Permalink for this section](https://docs.arcade.dev/home/changelog\#for-the-week-ending-on-2025-09-12) **CLI and TDK** - `[feature - 🚀]` Added support for multiple types of errors from tools, and updated client libraries to aid in disambiguating rate-limiting and other forms of upstream errors ( [Docs](https://github.com/ArcadeAI/docs/pull/438/files)). Added in v1.10.0 in `aracde-js`, v1.8.0 in `aracde-py`, and v0.1.0-alpha.6 in `aracde-go`. - `[maintenance - 🔧]` Update langchain version for Arcade integrations **Toolkits** - `[feature - 🚀]` Google Calendar improvements to video call scheduling ( [Docs](https://github.com/ArcadeAI/docs/pull/436)) - `[feature - 🚀]` \[toolkits/Jira\] Added `WhoAmI` tool to Jira, Google, Clickup, Slack, and Zendesk toolkits ( [Docs](https://github.com/ArcadeAI/docs/pull/426)) **Platform and Engine** - `[bugfix - 🐛]` Engine: Fix rate limiting algorithm - `[feature - 🚀]` Engine: Improve Tool Error Handling **Misc** - `[documentation - 📝]` Add a FAQ for requesting over-scoped permissions for Google Drive and similar tools ( [docs PR #440](https://github.com/ArcadeAI/docs/pull/440)) ## 2025-09-05 [Permalink for this section](https://docs.arcade.dev/home/changelog\#for-the-week-ending-on-2025-09-05) **Toolkits** - `[feature - 🚀]` Imgflip toolkit: tools for memes ( [docs PR #424](https://github.com/ArcadeAI/docs/pull/424)) - `[feature - 🚀]` Edit Google Document Tool ( [docs PR #427](https://github.com/ArcadeAI/docs/pull/427)) - `[bugfix - 🐛]` \[Toolkits/clickup\] fix fuzzy match search **Platform and Engine** - `[maintenance - 🔧]` Engine: updated stainless to generate SDK specs - `[feature - 🚀]` Dashboard: New sidebar and user-verification page & prepare for project-based resources **CLI and TDK** - `[maintenance - 🔧]` upgraded langchain\_arcade ( [PR #546](https://github.com/ArcadeAI/arcade-ai/pull/546)) **Misc** - `[documentation - 📝]` Adding ClickUp documentation ( [PR #413](https://github.com/ArcadeAI/docs/pull/413)) - `[documentation - 📝]` updated instructions on GH OAuth customization ( [PR #425](https://github.com/ArcadeAI/docs/pull/425)) ## 2025-08-29 [Permalink for this section](https://docs.arcade.dev/home/changelog\#for-the-week-ending-on-2025-08-29) **Toolkits** - `[feature - 🚀]` Re-add GoogleNews toolkit **Platform and Engine** - `[feature - 🚀]` Dashboard: Update toolkit and tool selection UI in playground - `[feature - 🚀]` Dashboard: Add toolkits and OAuth providers from the design system - `[feature - 🚀]` Dashboard: Add optional request parameters when adding OAuth providers **CLI and TDK** - `[feature - 🚀]` Improve Typedict and Basemodel support ( [PR #523](https://github.com/ArcadeAI/arcade-ai/pull/523)) **Misc** - `[documentation - 📝]` Add ClickUp auth provider documentation ( [PR #404](https://github.com/ArcadeAI/docs/pull/404)) - `[documentation - 📝]` Fix glossary: change ‘Authentication Scope’ to ‘Authorization Scope’ ( [PR #419](https://github.com/ArcadeAI/docs/pull/419)) - `[documentation - 📝]` Added missing parameter to the usage example templates ( [PR #537](https://github.com/ArcadeAI/arcade-ai/pull/537)) ## 2025-08-22 [Permalink for this section](https://docs.arcade.dev/home/changelog\#for-the-week-ending-on-2025-08-22) This week we released a new pricing model for Arcade which will be better for hobbyists and enterprises alike. Learn more here: [https://blog.arcade.dev/pricing-updates](https://blog.arcade.dev/pricing-updates) **Toolkits** - `[feature - 🚀]` \[X (Twitter)\] Reply to Tweet ( [PR #415](https://github.com/ArcadeAI/docs/pull/415)) - `[feature - 🚀]` \[Jira Toolkit\] Add “Add To Sprint” and “Remove from Sprint” tools ( [PR #412](https://github.com/ArcadeAI/docs/pull/412)) - `[bugfix - 🐛]` \[Google Drive, Docs, Sheets, Slides Toolkits\] Remove file picker url from tool response **Platform and Engine** - `[feature - 🚀]` Arcade Cloud: New pricing model - `[feature - 🚀]` Authenticate communication between Engine and Coordinator via key exchange - `[feature - 🚀]` Engine: Add additional redis cert check options ## 2025-08-15 [Permalink for this section](https://docs.arcade.dev/home/changelog\#for-the-week-ending-on-2025-08-15) This week we enforced a new requirement for all OAuth providers: they must have a unique callback URL. This is a minor security change, but does require you to update your OAuth configuration. This can be updated from the dashboard. **Toolkits** - `[feature - 🚀]` Sharepoint Toolkit added ( [docs](https://docs.arcade.dev/mcp-servers/productivity/sharepoint)) - `[feature - 🚀]` Google Slides Toolkit added - `[feature - 🚀]` Commenting on Google Docs added - `[bugfix - 🐛]` Improvements in Microsoft Teams message search tool for better agentic experience. Fix bug when no messages match the search query. - `[bugfix - 🐛]` Fix bugs in Google Workspace search tools **Platform and Engine** - `[feature - 🚀]` Custom OAuth providers now require a unique callback URL - `[bugfix - 🐛]` Engine: Resolve dynamic provider IDs when checking auth status - `[bugfix - 🐛]` Engine: Refresh token when checking the status of a completed request **Misc** - `[documentation - 📝]` Document Microsoft scopes required by Arcade toolkits ( [PR #409](https://github.com/ArcadeAI/docs/pull/409)) - `[documentation - 📝]` Microsoft SharePoint toolkit documentation ( [PR #400](https://github.com/ArcadeAI/docs/pull/400)) ## 2025-08-08 [Permalink for this section](https://docs.arcade.dev/home/changelog\#for-the-week-ending-on-2025-08-08) **Toolkits** - `[feature - 🚀]` Clickhouse Toolkit ( [PR #527](https://github.com/ArcadeAI/arcade-ai/pull/527)) - `[feature - 🚀]` Add search to Google Drive - `[bugfix - 🐛]` Fix and docstring improvement in MS Teams toolkit **Platform and Engine** - `[feature - 🚀]` Add support for GPT-5 models - `[feature - 🚀]` Per-app redirect URI info ## 2025-08-01 [Permalink for this section](https://docs.arcade.dev/home/changelog\#for-the-week-ending-on-2025-08-01) **Toolkits** - `[feature - 🚀]` Microsoft Teams toolkit added - `[feature - 🚀]` Jira Toolkit: Add List Sprints & Boards tools - `[feature - 🚀]` Google Sheets toolkit: Add pagination to GetSpreadsheet - `[bugfix - 🐛]` Jira toolkit: Return UI URL for items again - `[feature - 🚀]` Salesforce toolkit: Configure subdomain & max concurrency through secrets - `[feature - 🚀]` Confluence toolkit supports Atlassian multi-cloud **CLI and TDK** - `[bugfix - 🐛]` Fixes for the CLI docs generator ( [PR #524](https://github.com/ArcadeAI/arcade-ai/pull/524)) - `[feature - 🚀]` CLI: Rename auto-docs command to ‘docs’ and other improvements ( [PR #518](https://github.com/ArcadeAI/arcade-ai/pull/518)) ## 2025-07-25 [Permalink for this section](https://docs.arcade.dev/home/changelog\#for-the-week-ending-on-2025-07-25) Most Arcade toolkits have been removed from the `github.com/ArcadeAI/arcade-ai` repository, and transitioned to closed-source. Toolkit source code remains available upon request for our paying customers. This enables us to iterate more quickly and provide a better experience for our customers. The previously open-sourced toolkits are still available in the public repository’s git history. **Toolkits** - `[feature - 🚀]` Support for multiple Atlassian Clouds in the Jira Toolkit ( [PR #506](https://github.com/ArcadeAI/arcade-ai/pull/506)) **CLI and TDK** - `[bugfix - 🐛]` Fix `arcade worker list` endpoints ( [PR #504](https://github.com/ArcadeAI/arcade-ai/pull/504)) - `[feature - 🚀]` Support Tool Output in ValueSchema of ToolDefinition ( [PR #487](https://github.com/ArcadeAI/arcade-ai/pull/487)) **Platform and Engine** - `[feature - 🚀]` Self-service plan selection for Arcade Cloud and payment is now available. - `[bugfix - 🐛]` Dashboard: Userinfo config must respect response\_map property - `[feature - 🚀]` Dashboard: Add Tool Types in Metrics **Misc** - `[documentation - 📝]` Update OAuth docs with user\_info\_request.response\_map ( [PR #360](https://github.com/ArcadeAI/docs/pull/360)) - `[documentation - 📝]` Update Zendesk Custom OAuth ( [PR #359](https://github.com/ArcadeAI/docs/pull/359)) - `[documentation - 📝]` Add code samples & screenshots to user verification doc ( [PR #363](https://github.com/ArcadeAI/docs/pull/363)) ## 2025-07-18 [Permalink for this section](https://docs.arcade.dev/home/changelog\#for-the-week-ending-on-2025-07-18) Version 2.0.0 of the Arcade Engine was released this week. Upgrading to version 2.0.0 is recommended for all self-hosted developers, and includes an important security fix for [secure OAuth flows](https://docs.arcade.dev/home/auth/secure-auth-production). After upgrading, all projects will default to using the Arcade user verifier. If desired, you can then implement a custom user verifier in your application/agent and make the switch via the Arcade Dashboard. Self-hosed Arcade developers cannot be grandfathered into the old (insecure) behavior of skipping user verification once the Engine is upgraded to version 2.0.0 or higher. **Frameworks** **Toolkits** - `[feature - 🚀]` Add Linear Toolkit ( [PR #465](https://github.com/ArcadeAI/arcade-ai/pull/465)) - `[feature - 🚀]` Add Zendesk Toolkit ( [PR #458](https://github.com/ArcadeAI/arcade-ai/pull/458)) - `[bugfix - 🐛]` Fix bug in Slack user processing ( [PR #488](https://github.com/ArcadeAI/arcade-ai/pull/488)) - `[bugfix - 🐛]` fix URL expansion in Twitter ( [PR #500](https://github.com/ArcadeAI/arcade-ai/pull/500)) **CLI and TDK** - `[feature - 🚀]` Toolkit docs generator command for Arcade CLI ( [PR #414](https://github.com/ArcadeAI/arcade-ai/pull/414)) - `[feature - 🚀]` custom `callback_host` for arcade login ( [PR #481](https://github.com/ArcadeAI/arcade-ai/pull/481)) **Platform and Engine** - `[feature - 🚀]` Dashboard: Add filter for user id and providers in Connected Accounts - `[feature - 🚀]` Add new endpoint for upcoming scheduled subs - `[bugfix - 🐛]` Engine OAuth hardening: secure defaults, config updates, validation, additional API flags, and route for user confirmation - `[feature - 🚀]` Dashboard: UI for security settings - `[bugfix - 🐛]` Engine: Correctly handle nils in auth provider responses - `[bugfix - 🐛]` Platform: Improved success & error pages for OAuth **Misc** - `[documentation - 📝]` replaced creating toolkit video with full tutorial ( [PR #349](https://github.com/ArcadeAI/docs/pull/349)) - `[documentation - 📝]` Add secure/brand auth in production doc ( [PR #341](https://github.com/ArcadeAI/docs/pull/341)) ## 2025-07-11 [Permalink for this section](https://docs.arcade.dev/home/changelog\#for-the-week-ending-on-2025-07-11) **Frameworks** **Toolkits** - `[feature - 🚀]` Split previously combined Google, Microsoft, and other Toolkits into separate toolkits to aid in retrieval and maintenance ( [PR #438](https://github.com/ArcadeAI/arcade-ai/pull/438)) - `[feature - 🚀]` Slack Toolkit: Major refactor and improvements ( [PR #453](https://github.com/ArcadeAI/arcade-ai/pull/453)) **CLI and TDK** - `[feature - 🚀]` `--debug` flag added for CLI commands ( [PR #454](https://github.com/ArcadeAI/arcade-ai/pull/454)) **Platform and Engine** - `[bugfix - 🐛]` Fix token refresh bug **Misc** - `[documentation - 📝]` Document the OAuth scopes required by the Slack toolkit ( [PR #344](https://github.com/ArcadeAI/docs/pull/344)) ## 2025-07-04 [Permalink for this section](https://docs.arcade.dev/home/changelog\#for-the-week-ending-on-2025-07-04) **Toolkits** - `[bugfix - 🐛]` patching toolkit template generator for outside the main repo ( [PR #460](https://github.com/ArcadeAI/arcade-ai/pull/460)) - `[bugfix - 🐛]` Filter out unneeded files/directories before deploying workers ( [PR #464](https://github.com/ArcadeAI/arcade-ai/pull/464)) **Platform and Engine** - `[feature - 🚀]` Concurrent auth requests for the same user and same scopes use the same authentication flow and URLs. This means that your users only have to authenticate once if the agent chooses to use multiple tools at once with teh same scopes. - `[bugfix - 🐛]` Fix secret deletion **Cloud** - `[bugfix - 🐛]` Update cross-origin-opener-policy header to allow Google Drive File Picker popup **Platform and Engine** - `[feature - 🚀]` Dashboard: Allow editing the description of a secret - `[feature - 🚀]` Dashboard: Preserve tools when resetting parameters ## 2025-06-28 [Permalink for this section](https://docs.arcade.dev/home/changelog\#for-the-week-ending-on-2025-06-28) **Toolkits** - `[bugfix - 🐛]` Jira toolkit: deduplicate cloud data in Atlassian’s available-resources response ( [PR #456](https://github.com/ArcadeAI/arcade-ai/pull/456)) ## 2025-06-20 [Permalink for this section](https://docs.arcade.dev/home/changelog\#for-the-week-ending-on-2025-06-20) **Frameworks** - `[feature - 🚀]` Support for OpenAI Agent SDK in Typescript ( [docs](https://docs.arcade.dev/home/oai-agents/overview) and [example](https://github.com/ArcadeAI/arcade-ai/tree/main/examples/openai-agents-ts)) **Toolkits** - `[feature - 🚀]` Jira toolkit released ( [docs](https://docs.arcade.dev/mcp-servers/productivity/jira)) **CLI and TDK** - `[feature - 🚀]` V2.0 of Python Tool Development Kit (TDK) ( [migration guide](https://docs.arcade.dev/home/migrate-to-v2)) - `[feature - 🚀]` Admin API client support - Requires v1.6.0 of `arcade-py`, or v1.8.0 of `arcade-js`, or v0.1.0-alpha.4 of `arcade-go` **Platform and Engine** - `[feature - 🚀]` Admin APIs released for managing users, secrets, and tools ( [API References](https://reference.arcade.dev/api-reference#tag/admin)) - `[bugfix - 🐛]` Unauthenticated MCP servers can be called anonymously - `[feature - 🚀]` End-user credentials and auth status can be fetched in batches ( [docs](https://docs.arcade.dev/home/auth/tool-auth-status)) **Misc** - `[feature - 🚀]` Launched Github Discussions for product feedback and support ( [link](https://github.com/ArcadeAI/arcade-ai/discussions)) - `[feature - 🚀]` Launched status.arcade.dev for monitoring platform status ( [link](https://status.arcade.dev/)) [FAQ](https://docs.arcade.dev/home/faq "FAQ") [Registry Early Access](https://docs.arcade.dev/home/registry-early-access "Registry Early Access") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Google Search Toolkit [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Search Tools](https://docs.arcade.dev/mcp-servers/search/google_finance "Search Tools") Google Search # Google Search **Description:** Enable agents to perform Google searches using SerpAPI. **Author:** Arcade **Auth:** API Key [![PyPI Version](https://img.shields.io/pypi/v/arcade_google-search)](https://pypi.org/project/arcade_google-search/)[![License](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/arcadeai/arcade-ai/blob/main/LICENSE)[![Python Versions](https://img.shields.io/pypi/pyversions/arcade_google-search)](https://pypi.org/project/arcade_google-search/)[![Wheel Status](https://img.shields.io/pypi/wheel/arcade_google-search)](https://pypi.org/project/arcade_google-search/)[![Downloads](https://img.shields.io/pypi/dm/arcade_google-search)](https://pypi.org/project/arcade_google-search/) The Arcade Search MCP Server provides a pre-built set of tools for interacting with Google search results. These tools make it easy to build agents and AI apps that can: - Search Google and return results. ## Available Tools [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/google_search\#available-tools) | Tool Name | Description | | --- | --- | | GoogleSearch.Search | Search Google and return organic results. | If you need to perform an action that’s not listed here, you can [get in touch\\ with us](mailto:contact@arcade.dev) to request a new tool, or [create your\\ own tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server). ## GoogleSearch.Search [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/google_search\#googlesearchsearch) See Example > Search Google using SerpAPI and return organic search results. **Parameters** - **`query`** _(string, required)_ The search query. - **`n_results`** _(integer, optional, Defaults to 5)_ Number of results to retrieve. ## Auth [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/google_search\#auth) The Arcade Google Search toolkit uses the [SerpAPI](https://serpapi.com/) to get get results from a Google search. - **Secret:** - `SERP_API_KEY`: Your SerpAPI API key. Setting the `SERP_API_KEY` secret is only required if you are [self-hosting](https://docs.arcade.dev/home/deployment/engine-configuration) Arcade. If you’re using Arcade Cloud, the secret is already set for you. To manage your secrets, go to the [Secrets page](https://api.arcade.dev/dashboard/auth/secrets) in the Arcade Dashboard. ## Get Building [Use tools hosted on Arcade Cloud\\ \\ Arcade tools are hosted by our cloud platform and ready to be used in your agents. Learn how.](https://docs.arcade.dev/home/quickstart) [Self Host Arcade tools\\ \\ Arcade tools can be self-hosted on your own infrastructure. Learn more about self-hosting.\\ \\ ```\\ pip install arcade_google_search\\ ```](https://docs.arcade.dev/home/hosting-overview) [Google News](https://docs.arcade.dev/mcp-servers/search/google_news "Google News") [Google Shopping](https://docs.arcade.dev/mcp-servers/search/google_shopping "Google Shopping") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## MCP Overview [Home](https://docs.arcade.dev/home "Home") MCP Overview # Model Context Protocol (MCP): The Arcade.dev Perspective ## What is MCP and Why Should Developers Care? [Permalink for this section](https://docs.arcade.dev/home/mcp-overview\#what-is-mcp-and-why-should-developers-care) Model Context Protocol represents a significant step toward standardizing how AI agents interact with tools and external systems. As the developer-first platform for authenticated tool-calling, Arcade.dev has been at the forefront of connecting AI models to real-world actions - which is why our perspective on MCP matters. For developers building AI applications that need to do more than just generate text, understanding the strengths and limitations of protocols like MCP is critical to making informed architecture decisions. ## The Current State of Model Context Protocol [Permalink for this section](https://docs.arcade.dev/home/mcp-overview\#the-current-state-of-model-context-protocol) MCP aims to standardize how AI models access and use applications to get data or use tools - a problem space Arcade.dev has been solving since day one. While the protocol rightly focuses on how applications provide context to LLMs, our hands-on experience building production agent systems reveals both opportunities and challenges. ### Where MCP Gets It Right [Permalink for this section](https://docs.arcade.dev/home/mcp-overview\#where-mcp-gets-it-right) - **Standardization attempt**: Creating common patterns for tool definitions across different AI providers is a step in the right direction. It allows agent builders to switch between different LLM providers and optimize costs and performance for each component using an LLM. - **Focus on function-calling**: Correctly identifies that giving AI models the ability to call functions is fundamental to realize the agent’s full potential. The protocol got the difference between LLM resources and regular APIs right from the beginning. While traditional APIs are designed for developers to use, LLM-optimized tools require additional context to be used effectively by AI systems. The recognition of what we call [Machine Experience Engineering](https://blog.arcade.dev/the-birth-of-machine-experience-engineering) is something MCP designers also identified early on. - **Community momentum**: Building adoption across multiple providers creates healthy ecosystem dynamics, giving all actors that adopt MCP the benefits of a robust, well-tested and growing ecosystem of LLM-ready resources, both local and remote. ### Where MCP is Evolving [Permalink for this section](https://docs.arcade.dev/home/mcp-overview\#where-mcp-is-evolving) - **Authentication gaps**: The protocol was initially designed for local resources only, and required considerable technical knowledge to integrate with clients like VSCode, Cursor, and Claude Desktop. 99% of MCP servers today are built for single-user use, even hosted ones. If you need to configure the MCP server with a PAT (personal access token) or an API key, it’s not usable by a multi-user (B2B2C) or cloud-based agent. At a minimum, MCP servers need to support [HTTP](https://modelcontextprotocol.io/specification/2025-03-26/basic/transports#streamable-http), [MCP authorization](https://modelcontextprotocol.io/specification/draft/basic/authorization), and support multi-user authorization. Having a robust standard for tool calling without the same robustness for auth quickly began the adoption of ad-hoc solutions that were more or less insecure for remote tool calling, the #1 bottleneck in moving AI agents to production. Fortunately, active work is ongoing on the MCP community to adopt a solid auth component in the protocol. [Arcade.dev’s own auth team actively contribute](https://www.youtube.com/watch?v=f1sLBGWnByc) to the specification in this crucial area. - **Production readiness**: Enterprise-grade concerns like observability, security, and compliance need stronger representation. As the protocol evolves, we expect all of these aspects to be integrated into the protocol. - **Developer experience**: Implementation complexity can create significant friction for teams without specialized AI expertise. MCP is a very new protocol undergoing rapid changes, so the DX is expected to be turbulent until the protocol matures. Arcade.dev supports this from day one while providing the best DX for building tools that can be served over MCP to any AI agent. ## How Arcade.dev Complements and Extends MCP [Permalink for this section](https://docs.arcade.dev/home/mcp-overview\#how-arcadedev-complements-and-extends-mcp) Rather than viewing MCP as either perfect or problematic, we see it as part of an evolving ecosystem. Arcade.dev bridges critical gaps in the protocol by providing: 1. **Authentication-first architecture**: Secure, OAuth-based connections that let AI access tools as the end user - not as a “bot” 2. **Production infrastructure**: Monitoring, logging, and evaluation capabilities built for enterprise deployment. This also includes improvements to tool selection when many tools are enabled. 3. **Developer acceleration**: SDKs that dramatically reduce time-to-value when implementing tool-calling patterns 4. **Multi-model compatibility**: Works seamlessly with all major LLM providers, regardless of their MCP implementation status. You can start building your agents today, and switch to MCP seamlessly when your LLM provider supports it, or when the MCP SDK reaches enterprise level readiness | | | | --- | --- | | ![MCP Auth Diagram](https://docs.arcade.dev/images/mcp/mcp-auth-1.jpg) | ![MCP Auth Diagram](https://docs.arcade.dev/images/mcp/mcp-auth-2.jpg) | ## Why This Matters for Your AI Applications [Permalink for this section](https://docs.arcade.dev/home/mcp-overview\#why-this-matters-for-your-ai-applications) AI that can’t authenticate to access accounts or use data is fundamentally limited. This disconnect is why less than 30% of AI projects go to production. The biggest opportunity in AI today isn’t better models—it’s enabling those models to take real actions. Developers need secure connections between AI and authenticated services, user data, and enterprise systems. By combining MCP’s standardization efforts with Arcade.dev’s authentication-first approach, developers can build AI applications that don’t just suggest actions—they take them. ## Our Commitment to the Protocol Ecosystem [Permalink for this section](https://docs.arcade.dev/home/mcp-overview\#our-commitment-to-the-protocol-ecosystem) At Arcade.dev, we’re active participants in the evolving tool-calling ecosystem. Our team contributes to open standards like MCP while building the production-grade infrastructure developers need today. As Sam Partee, our CTO, explains: “Protocols like MCP are important stepping stones toward more capable AI agents. Our focus is making sure developers can build with these patterns today, with authentication and security baked in from the start.” ## Frequently Asked MCP Questions [Permalink for this section](https://docs.arcade.dev/home/mcp-overview\#frequently-asked-mcp-questions) ### Is Arcade.dev an alternative to MCP? [Permalink for this section](https://docs.arcade.dev/home/mcp-overview\#is-arcadedev-an-alternative-to-mcp) No. Arcade.dev complements protocol standards like MCP by providing the authentication layer, developer tooling, and production infrastructure needed to implement them successfully in real-world applications. Arcade’s Engine can be an MCP server with super-powers, and you can pull in upstream MCP servers as tools into Arcade. ### Do I need to understand MCP to use Arcade.dev? [Permalink for this section](https://docs.arcade.dev/home/mcp-overview\#do-i-need-to-understand-mcp-to-use-arcadedev) Not at all. Arcade.dev provides intuitive SDKs that handle the complexities of tool-calling patterns, regardless of which underlying protocol standards are in use. ### What models work with Arcade.dev’s approach to MCP? [Permalink for this section](https://docs.arcade.dev/home/mcp-overview\#what-models-work-with-arcadedevs-approach-to-mcp) Arcade.dev works with all major models including Claude, GPT-4, Llama, Mistral, and more - supporting both MCP-compatible and non-MCP implementations through our unified API. ### How does Arcade.dev handle authentication within the MCP framework? [Permalink for this section](https://docs.arcade.dev/home/mcp-overview\#how-does-arcadedev-handle-authentication-within-the-mcp-framework) Arcade.dev extends(\*) basic MCP implementations with enterprise-grade OAuth flows, secure token management, and fine-grained permissions - solving the authentication gap that often blocks production deployment. (\*) Arcade is currently compatible with the existing ratified MCP specifications, and is working to extend them for [tool authorization](https://github.com/modelcontextprotocol/modelcontextprotocol/pull/475). [Using Arcade tools](https://docs.arcade.dev/home/vercelai/use-arcade-tools "Using Arcade tools") [Use Arcade with Claude Desktop](https://docs.arcade.dev/home/mcp-desktop-clients/claude-desktop-client "Use Arcade with Claude Desktop") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Twitch Auth Configuration [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Entertainment](https://docs.arcade.dev/mcp-servers/entertainment/imgflip "Entertainment") Twitch # Twitch auth provider At this time, Arcade does not offer a default Twitch Auth Provider. To use Twitch auth, you must create a custom Auth Provider with your own Twitch OAuth 2.0 credentials as described below. The Twitch auth provider enables tools and agents to call the Twitch API on behalf of a user. Behind the scenes, the Arcade Engine and the Twitch auth provider seamlessly manage Twitch OAuth 2.0 authorization for your users. ### What’s documented here [Permalink for this section](https://docs.arcade.dev/mcp-servers/entertainment/twitch\#whats-documented-here) This page describes how to use and configure Twitch auth with Arcade. This auth provider is used by: - Your [app code](https://docs.arcade.dev/mcp-servers/entertainment/twitch#using-twitch-auth-in-app-code) that needs to call Twitch APIs - Or, your [custom tools](https://docs.arcade.dev/mcp-servers/entertainment/twitch#using-twitch-auth-in-custom-tools) that need to call Twitch APIs ## Configuring Twitch auth [Permalink for this section](https://docs.arcade.dev/mcp-servers/entertainment/twitch\#configuring-twitch-auth) ### Create a Twitch app [Permalink for this section](https://docs.arcade.dev/mcp-servers/entertainment/twitch\#create-a-twitch-app) - Twitch requires that you have two-factor authentication enabled for your account. Enable in your [account security seetings](https://www.twitch.tv/settings/security) - Create a Twitch Application in the [Twitch App Console](https://dev.twitch.tv/console/apps) - Set the OAuth Redirect URL to the redirect URL generated by Arcade (see below) - Select your Application category - Select the ‘Confidential’ Client Type - Copy the App key (Client ID) and App secret (Client Secret), which you’ll need below Next, add the Twitch app to your Arcade Engine configuration. You can do this in the Arcade Dashboard, or by editing the `engine.yaml` file directly (for a self-hosted instance). ### Configuring Twitch auth with the Arcade Dashboard [Permalink for this section](https://docs.arcade.dev/mcp-servers/entertainment/twitch\#configuring-twitch-auth-with-the-arcade-dashboard) 1. Navigate to the OAuth section of the Arcade Dashboard and click **Add OAuth Provider**. 2. Select **Twitch** as the provider. 3. Choose a unique **ID** for your provider (e.g. “my-twitch-provider”) with an optional **Description**. 4. Enter your **Client ID** and **Client Secret** from your Twitch app. 5. Note the **Redirect URL** generated by Arcade. This must be set as your Twitch app’s OAuth Redirect URL. 6. Click **Save**. When you use tools that require Twitch auth using your Arcade account credentials, the Arcade Engine will automatically use this Twitch OAuth provider. ### Configuring Twitch auth in self-hosted Arcade Engine configuration [Permalink for this section](https://docs.arcade.dev/mcp-servers/entertainment/twitch\#configuring-twitch-auth-in-self-hosted-arcade-engine-configuration) ### Set environment variables [Permalink for this section](https://docs.arcade.dev/mcp-servers/entertainment/twitch\#set-environment-variables) The Client ID is the Twitch “App key” and the Client Secret is the Twitch “App secret”. Set the following environment variables: ```nextra-code export TWITCH_CLIENT_ID="" export TWITCH_CLIENT_SECRET="" ``` Or, you can set these values in a `.env` file: ```nextra-code TWITCH_CLIENT_SECRET="" TWITCH_CLIENT_ID="" ``` See [Engine configuration](https://docs.arcade.dev/home/deployment/engine-configuration) for more information on how to set environment variables and configure the Arcade Engine. ### Edit the Engine configuration [Permalink for this section](https://docs.arcade.dev/mcp-servers/entertainment/twitch\#edit-the-engine-configuration) Edit the `engine.yaml` file and add a `twitch` item to the `auth.providers` section: ```nextra-code auth: providers: - id: default-twitch description: "The default Twitch provider" enabled: true type: oauth2 provider_id: twitch client_id: ${env:TWITCH_CLIENT_ID} client_secret: ${env:TWITCH_CLIENT_SECRET} ``` ## Using Twitch auth in app code [Permalink for this section](https://docs.arcade.dev/mcp-servers/entertainment/twitch\#using-twitch-auth-in-app-code) Use the Twitch auth provider in your own agents and AI apps to get a user-scoped token for the Twitch API. See [authorizing agents with Arcade](https://docs.arcade.dev/home/auth/how-arcade-helps) to understand how this works. Use `client.auth.start()` to get a user token for the Twitch API: PythonJavaScript ```nextra-code 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="twitch", scopes=["channel:manage:polls"], ) 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... ``` ## Using Twitch auth in custom tools [Permalink for this section](https://docs.arcade.dev/mcp-servers/entertainment/twitch\#using-twitch-auth-in-custom-tools) You can author your own [custom tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server) that interact with the Twitch API. Use the `Twitch()` auth class to specify that a tool requires authorization with Twitch. The `context.authorization.token` field will be automatically populated with the user’s Twitch token: ```nextra-code from typing import Annotated, Optional import httpx from arcade_tdk import ToolContext, tool from arcade_tdk.auth import Twitch @tool( requires_auth=Twitch( scopes=["channel:manage:polls"], ) ) async def create_poll( context: ToolContext, broadcaster_id: Annotated[\ str,\ "The ID of the broadcaster to create the poll for.",\ ], title: Annotated[\ str,\ "The title of the poll.",\ ], choices: Annotated[\ list[str],\ "The choices of the poll.",\ ], duration: Annotated[\ int,\ "The duration of the poll in seconds.",\ ], ) -> Annotated[dict, "The poll that was created"]: """Create a poll for a Twitch channel.""" url = "https://api.twitch.tv/helix/polls" headers = { "Authorization": f"Bearer {context.authorization.token}", "Client-Id": "your_client_id", "Content-Type": "application/json", } payload = { "broadcaster_id": broadcaster_id, "title": title, "choices": [{"title": choice} for choice in choices], "duration": duration, } async with httpx.AsyncClient() as client: response = await client.post(url, headers=headers, json=payload) response.raise_for_status() return response.json() ``` ## Get Building [Use tools hosted on Arcade Cloud\\ \\ Arcade tools are hosted by our cloud platform and ready to be used in your agents. Learn how.](https://docs.arcade.dev/home/quickstart) [Self Host Arcade tools\\ \\ Arcade tools can be self-hosted on your own infrastructure. Learn more about self-hosting.\\ \\ ```\\ pip install arcade_twitch\\ ```](https://docs.arcade.dev/home/hosting-overview) [Spotify](https://docs.arcade.dev/mcp-servers/entertainment/spotify "Spotify") [E2B](https://docs.arcade.dev/mcp-servers/development/e2b "E2B") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Google Hotels Toolkit [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Search Tools](https://docs.arcade.dev/mcp-servers/search/google_finance "Search Tools") Google Hotels # Google Hotels **Description:** Empower your agents to search for hotels using Arcade. **Author:** Arcade **Auth:** API Key [![PyPI Version](https://img.shields.io/pypi/v/arcade_google-hotels)](https://pypi.org/project/arcade_google-hotels/)[![License](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/arcadeai/arcade-ai/blob/main/LICENSE)[![Python Versions](https://img.shields.io/pypi/pyversions/arcade_google-hotels)](https://pypi.org/project/arcade_google-hotels/)[![Wheel Status](https://img.shields.io/pypi/wheel/arcade_google-hotels)](https://pypi.org/project/arcade_google-hotels/)[![Downloads](https://img.shields.io/pypi/dm/arcade_google-hotels)](https://pypi.org/project/arcade_google-hotels/) The Arcade Google Hotels toolkit lets you search for hotels with ease. Use this tool to build intelligent agents and applications that search for hotels worldwide. ## Available Tools [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/google_hotels\#available-tools) | Tool Name | Description | | --- | --- | | GoogleHotels.SearchHotels | Retrieve hotel search results using the Google Hotels API. | ## GoogleHotels.SearchHotels [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/google_hotels\#googlehotelssearchhotels) Retrieve hotel search results using the Google Hotels API. **Parameters** - **`location`** _(string, required)_: Location to search for hotels, e.g., a city name, a state, etc. - **`check_in_date`** _(string, required)_: Check-in date in YYYY-MM-DD format. - **`check_out_date`** _(string, required)_: Check-out date in YYYY-MM-DD format. - **`query`** _(string, optional)_: Anything that would be used in a regular Google Hotels search. - **`currency`** _(string, optional)_: Currency code for prices. Defaults to ‘USD’. - **`min_price`** _(int, optional)_: Minimum price per night. Defaults to no minimum. - **`max_price`** _(int, optional)_: Maximum price per night. Defaults to no maximum. - **`num_adults`** _(int, optional)_: Number of adults per room. Defaults to 2. - **`num_children`** _(int, optional)_: Number of children per room. Defaults to 0. - **`sort_by`** _(enum ( [GoogleHotelsSortBy](https://docs.arcade.dev/mcp-servers/search/google_hotels#googlehotelssortby)), optional)_: The sorting order of the results. Defaults to RELEVANCE. - **`num_results`** _(int, optional)_: Maximum number of results to return. Defaults to 5. Max 20. See Example > ## Auth [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/google_hotels\#auth) The Arcade Google Hotels toolkit uses the [SerpAPI](https://serpapi.com/) to search for hotels from Google Hotels. - **Secret:** - `SERP_API_KEY`: Your SerpAPI API key. Setting the `SERP_API_KEY` secret is only required if you are [self-hosting](https://docs.arcade.dev/home/deployment/engine-configuration) Arcade. If you’re using Arcade Cloud, the secret is already set for you. To manage your secrets, go to the [Secrets page](https://api.arcade.dev/dashboard/auth/secrets) in the Arcade Dashboard. ## Reference [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/google_hotels\#reference) ## GoogleHotelsSortBy [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/google_hotels\#googlehotelssortby) Defines the sorting options for hotel search results. - **`RELEVANCE`**: Sort by the most relevant results. - **`LOWEST_PRICE`**: Sort by the lowest price available. - **`HIGHEST_RATING`**: Sort by the highest customer ratings. - **`MOST_REVIEWED`**: Sort by the most reviewed hotels. ## Get Building [Use tools hosted on Arcade Cloud\\ \\ Arcade tools are hosted by our cloud platform and ready to be used in your agents. Learn how.](https://docs.arcade.dev/home/quickstart) [Self Host Arcade tools\\ \\ Arcade tools can be self-hosted on your own infrastructure. Learn more about self-hosting.\\ \\ ```\\ pip install arcade_google_hotels\\ ```](https://docs.arcade.dev/home/hosting-overview) [Google Flights](https://docs.arcade.dev/mcp-servers/search/google_flights "Google Flights") [Google Jobs](https://docs.arcade.dev/mcp-servers/search/google_jobs "Google Jobs") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## GitHub Auth Provider [Home](https://docs.arcade.dev/home "Home") [Customizing Auth](https://docs.arcade.dev/home/auth-providers "Customizing Auth") GitHub # GitHub auth provider The GitHub auth provider enables tools and agents to call [GitHub APIs](https://docs.github.com/en/rest/overview/resources-in-the-rest-api) on behalf of a user. Behind the scenes, the Arcade Engine and the GitHub auth provider seamlessly manage GitHub OAuth 2.0 authorization for your users. Want to quickly get started with GitHub in your agent or AI app? The pre-built [Arcade GitHub toolkit](https://docs.arcade.dev/mcp-servers/development/github/github) is what you want! ### What’s documented here [Permalink for this section](https://docs.arcade.dev/home/auth-providers/github\#whats-documented-here) This page describes how to use and configure GitHub auth with Arcade. This auth provider is used by: - The [Arcade GitHub toolkit](https://docs.arcade.dev/mcp-servers/development/github/github), which provides pre-built tools for interacting with GitHub - Your [app code](https://docs.arcade.dev/home/auth-providers/github#using-github-auth-in-app-code) that needs to call the GitHub API - Or, your [custom tools](https://docs.arcade.dev/home/auth-providers/github#using-github-auth-in-custom-tools) that need to call the GitHub API ## Configuring GitHub auth [Permalink for this section](https://docs.arcade.dev/home/auth-providers/github\#configuring-github-auth) When using your own app credentials, make sure you configure your project to use a [custom user verifier](https://docs.arcade.dev/home/auth/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 GitHub app credentials. This way, your users will see your application’s name requesting permission. You can use your own GitHub credentials in both the Arcade Cloud Platform or in a [self-hosted Arcade Engine](https://docs.arcade.dev/home/deployment/engine-configuration) instance. Before showing how to configure your GitHub app credentials, let’s go through the steps to create a GitHub app. ### Create a GitHub app [Permalink for this section](https://docs.arcade.dev/home/auth-providers/github\#create-a-github-app) - Follow GitHub’s guide to [registering a GitHub app](https://docs.github.com/en/apps/creating-github-apps/registering-a-github-app/registering-a-github-app). Make sure to use the “GitHub App” type, which [provides more granular permissions control compared to the “OAuth App” type](https://docs.github.com/en/apps/oauth-apps/building-oauth-apps/differences-between-github-apps-and-oauth-apps). - Choose the permissions you need for your app - At a minimum, you must enable read-only access to the Account > Email addresses permission - To access repo data, you must enable at least the Repository > Contents permission - Set the redirect URL to the redirect URL generated by Arcade (see below) - Leave “Expire user authorization tokens” **checked** - Leave “Request user authorization (OAuth) during installation” **unchecked** - Leave “Setup URL” blank and “Redirect on update” **unchecked** - Ensure Optional features > User-to-server token expiration is enabled - Copy the client ID and generate a client secret to use below If you need to access private repositories in an organization, you must also: 1. Make the app public via Advanced > Make public 2. Add the app to the organization via Install app Next, add the GitHub app to your Arcade Engine configuration. You can do this in the Arcade Dashboard, or by editing the `engine.yaml` file directly (for a self-hosted instance). ## Configuring your own GitHub Auth Provider in Arcade [Permalink for this section](https://docs.arcade.dev/home/auth-providers/github\#configuring-your-own-github-auth-provider-in-arcade) There are two ways to configure your GitHub app credentials in Arcade: 1. From the Arcade Dashboard GUI 2. By editing the `engine.yaml` file directly (for a self-hosted Arcade Engine) We show both options step-by-step below. Dashboard GUIEngine Configuration YAML ### Configure GitHub Auth Using the Arcade Dashboard GUI #### Access the Arcade Dashboard [Permalink for this section](https://docs.arcade.dev/home/auth-providers/github\#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](http://localhost:9099/dashboard). Adjust the host and port number to match your environment. #### Navigate to the OAuth Providers page [Permalink for this section](https://docs.arcade.dev/home/auth-providers/github\#navigate-to-the-oauth-providers-page) - Under the **OAuth** section of the Arcade Dashboard left-side menu, click **Providers**. - Click **Add OAuth Provider** in the top right corner. - Select the **Included Providers** tab at the top. - In the **Provider** dropdown, select **GitHub**. #### Enter the provider details [Permalink for this section](https://docs.arcade.dev/home/auth-providers/github\#enter-the-provider-details) - Choose a unique **ID** for your provider (e.g. “my-github-provider”). - Optionally enter a **Description**. - Enter the **Client ID** and **Client Secret** from your GitHub app. - Note the **Redirect URL** generated by Arcade. This must be added to your GitHub app’s Redirect URLs. #### Create the provider [Permalink for this section](https://docs.arcade.dev/home/auth-providers/github\#create-the-provider) Hit the **Create** button and the provider will be ready to be used. When you use tools that require GitHub auth using your Arcade account credentials, the Arcade Engine will automatically use this GitHub OAuth provider. If you have multiple GitHub providers, see [using multiple auth providers of the same type](https://docs.arcade.dev/home/auth-providers#using-multiple-providers-of-the-same-type) for more information. ## Using GitHub auth in app code [Permalink for this section](https://docs.arcade.dev/home/auth-providers/github\#using-github-auth-in-app-code) Use the GitHub auth provider in your own agents and AI apps to get a user token for the GitHub API. See [authorizing agents with Arcade](https://docs.arcade.dev/home/auth/how-arcade-helps) to understand how this works. Use `client.auth.start()` to get a user token for the GitHub API: PythonJavaScript ```nextra-code import requests from arcadepy import Arcade client = Arcade() # Automatically finds the `ARCADE_API_KEY` env variable user_id = "{arcade_user_id}" """ In this example, we will use Arcade to authenticate with GitHub and retrieve the number of stargazers of the ArcadeAI/arcade-ai repository. There is a tool for that in the Arcade SDK, which simplifies the process for you to interact with GitHub either through our Python or JavaScript SDKs or via LLM tool calling. Below we are just showing how to use Arcade as an auth provider, if you ever need to. """ # Start the authorization process auth_response = client.auth.start( user_id=user_id, provider="github", ) 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) if not auth_response.context.token: raise ValueError("No token found in auth response") token = auth_response.context.token owner = "ArcadeAI" name = "arcade-ai" headers = { "Accept": "application/vnd.github+json", "Authorization": f"Bearer {token}", "X-GitHub-Api-Version": "2022-11-28", } url = f"https://api.github.com/repos/{owner}/{name}" response = requests.get(url, headers=headers) response.raise_for_status() print(response.json().get("stargazers_count")) ``` ## Using GitHub auth in custom tools [Permalink for this section](https://docs.arcade.dev/home/auth-providers/github\#using-github-auth-in-custom-tools) You can use the pre-built [Arcade GitHub toolkit](https://docs.arcade.dev/mcp-servers/development/github/github) to quickly build agents and AI apps that interact with GitHub. If the pre-built tools in the GitHub toolkit don’t meet your needs, you can author your own [custom tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server) that interact with the GitHub API. Use the `GitHub()` auth class to specify that a tool requires authorization with GitHub. The `context.authorization.token` field will be automatically populated with the user’s GitHub token: ```nextra-code from typing import Annotated import httpx from arcade_tdk import ToolContext, tool from arcade_tdk.auth import GitHub @tool(requires_auth=GitHub()) async def count_stargazers( context: ToolContext, owner: Annotated[str, "The owner of the repository"], name: Annotated[str, "The name of the repository"], ) -> Annotated[int, "The number of stargazers (stars) for the specified repository"]: """Count the number of stargazers (stars) for a GitHub repository.""" if not context.authorization or not context.authorization.token: raise ValueError("No token found in context") headers = { "Accept": "application/vnd.github+json", "Authorization": f"Bearer {context.authorization.token}", "X-GitHub-Api-Version": "2022-11-28", } url = f"https://api.github.com/repos/{owner}/{name}" async with httpx.AsyncClient() as client: response = await client.get(url, headers=headers) response.raise_for_status() return response.json().get("stargazers_count", 0) ``` [Dropbox](https://docs.arcade.dev/home/auth-providers/dropbox "Dropbox") [Google](https://docs.arcade.dev/home/auth-providers/google "Google") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Google Docs Reference [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Productivity & Docs](https://docs.arcade.dev/mcp-servers/productivity/asana "Productivity & Docs") [Google Docs](https://docs.arcade.dev/mcp-servers/productivity/google_docs "Google Docs") Reference # GoogleDocs Reference Below is a reference of enumerations used by some tools in the GoogleDocs toolkit: ## OrderBy [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_docs/reference\#orderby) - **CREATED\_TIME**: `createdTime` - **CREATED\_TIME\_DESC**: `createdTime desc` - **FOLDER**: `folder` - **FOLDER\_DESC**: `folder desc` - **MODIFIED\_BY\_ME\_TIME**: `modifiedByMeTime` - **MODIFIED\_BY\_ME\_TIME\_DESC**: `modifiedByMeTime desc` - **MODIFIED\_TIME**: `modifiedTime` - **MODIFIED\_TIME\_DESC**: `modifiedTime desc` - **NAME**: `name` - **NAME\_DESC**: `name desc` - **NAME\_NATURAL**: `name_natural` - **NAME\_NATURAL\_DESC**: `name_natural desc` - **QUOTA\_BYTES\_USED**: `quotaBytesUsed` - **QUOTA\_BYTES\_USED\_DESC**: `quotaBytesUsed desc` - **RECENCY**: `recency` - **RECENCY\_DESC**: `recency desc` - **SHARED\_WITH\_ME\_TIME**: `sharedWithMeTime` - **SHARED\_WITH\_ME\_TIME\_DESC**: `sharedWithMeTime desc` - **STARRED**: `starred` - **STARRED\_DESC**: `starred desc` - **VIEWED\_BY\_ME\_TIME**: `viewedByMeTime` - **VIEWED\_BY\_ME\_TIME\_DESC**: `viewedByMeTime desc` ## DocumentFormat [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_docs/reference\#documentformat) - **MARKDOWN**: `markdown` - **HTML**: `html` - **GOOGLE\_API\_JSON**: `google_api_json` [Google Docs](https://docs.arcade.dev/mcp-servers/productivity/google_docs "Google Docs") [Google Drive](https://docs.arcade.dev/mcp-servers/productivity/google_drive "Google Drive") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Gmail Toolkit Reference [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Productivity & Docs](https://docs.arcade.dev/mcp-servers/productivity/asana "Productivity & Docs") [Gmail](https://docs.arcade.dev/mcp-servers/productivity/gmail "Gmail") Reference # Gmail Reference Below is a reference of enumerations used by some tools in the Gmail toolkit: ## GmailReplyToWhom [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/gmail/reference\#gmailreplytowhom) - **EVERY\_RECIPIENT**: `every_recipient` - **ONLY\_THE\_SENDER**: `only_the_sender` ## DateRange [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/gmail/reference\#daterange) - **TODAY**: `today` - **YESTERDAY**: `yesterday` - **LAST\_7\_DAYS**: `last_7_days` - **LAST\_30\_DAYS**: `last_30_days` - **THIS\_MONTH**: `this_month` - **LAST\_MONTH**: `last_month` - **THIS\_YEAR**: `this_year` [Gmail](https://docs.arcade.dev/mcp-servers/productivity/gmail "Gmail") [Google Calendar](https://docs.arcade.dev/mcp-servers/productivity/google_calendar "Google Calendar") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Zendesk Auth Provider [Home](https://docs.arcade.dev/home "Home") [Customizing Auth](https://docs.arcade.dev/home/auth-providers "Customizing Auth") Zendesk # Zendesk Auth Provider Arcade does not offer a default Zendesk Auth Provider. To use Zendesk auth, you must create a [custom provider configuration](https://docs.arcade.dev/home/auth-providers/oauth2) as described below. The Zendesk auth provider enables tools and agents to call Zendesk APIs on behalf of a user. Behind the scenes, the Arcade Engine and the Zendesk auth provider seamlessly manage Zendesk OAuth 2.0 authorization for your users. ## What’s documented here [Permalink for this section](https://docs.arcade.dev/home/auth-providers/zendesk\#whats-documented-here) This page describes how to use and configure Zendesk auth with Arcade. This auth provider is used by: - The [Arcade Zendesk toolkit](https://docs.arcade.dev/mcp-servers/customer-support/zendesk), which provides pre-built tools for interacting with Zendesk services - Your [app code](https://docs.arcade.dev/home/auth-providers/zendesk#using-zendesk-auth-in-app-code) that needs to call Zendesk APIs - Or, your [custom tools](https://docs.arcade.dev/home/auth-providers/zendesk#using-zendesk-auth-in-custom-tools) that need to call Zendesk APIs ## Create a Zendesk app [Permalink for this section](https://docs.arcade.dev/home/auth-providers/zendesk\#create-a-zendesk-app) When using your own app credentials, make sure you configure your project to use a [custom user verifier](https://docs.arcade.dev/home/auth/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. ### Additional guides [Permalink for this section](https://docs.arcade.dev/home/auth-providers/zendesk\#additional-guides) The following three guides from Zendesk will be helpful additional information as you progress through this guide: 1. [Using OAuth authentication with your application](https://support.zendesk.com/hc/en-us/articles/4408845965210-Using-OAuth-authentication-with-your-application) 2. [Set up a global OAuth client](https://developer.zendesk.com/documentation/marketplace/building-a-marketplace-app/set-up-a-global-oauth-client/) 3. [Getting a trial or sponsored account for development](https://developer.zendesk.com/documentation/api-basics/getting-started/getting-a-trial-or-sponsored-account-for-development/) ### Creating a Zendesk app for Arcade [Permalink for this section](https://docs.arcade.dev/home/auth-providers/zendesk\#creating-a-zendesk-app-for-arcade) 1. Create your Organization in the [Zendesk Marketplace portal](https://apps.zendesk.com/). 2. Create a Zendesk support account at [https://www.zendesk.com/login](https://www.zendesk.com/login) . If you need a global OAuth client, then the subdomain MUST begin with “d3v-”. You will need a global OAuth client if your app will use integrations/tools for multiple customers with their own Zendesk instances (multiple subdomains). 3. In [the Admin Center](https://support.zendesk.com/hc/en-us/articles/4581766374554#topic_hfg_dyz_1hb), click “Apps and integrations” in the sidebar, then select APIs > OAuth clients > Add OAuth client. - Ensure your identifier is prefixed with “zdg-” if you will need a global OAuth client. - Select “Public” for “Client kind”. - Use the redirect URL generated by Arcade (see below) as your “Redirect URL”. 4. Copy and store your identifier for later. This will be your **Client ID**. 5. Copy and store your generated secret for later. This will be your **Client Secret**. 6. (Only for Global OAuth client) Request a global OAuth client. - First, you will need to request a sponsored account and wait for approval from Zendesk. You can request a sponsored account [here](https://developer.zendesk.com/documentation/api-basics/getting-started/getting-a-trial-or-sponsored-account-for-development/#requesting-a-sponsored-test-account). - When filling out the sponsored account request form, ensure you select “App Developer / ISV” as your Developer Type. - After you have a sponsored account, sign into the [Zendesk Marketplace portal](https://apps.zendesk.com/) - Organization > Global OAuth Request and fill out the form. Zendesk will typically review your request within 1 week. ## Get your Zendesk subdomain [Permalink for this section](https://docs.arcade.dev/home/auth-providers/zendesk\#get-your-zendesk-subdomain) Your Zendesk subdomain is the value before the `.zendesk.com` part. For example, if your Zendesk domain is `https://d3v-acme-inc.zendesk.com`, your Zendesk subdomain is `d3v-acme-inc`. Take note of your Zendesk subdomain. You will need this value in the next steps. ## Set the Zendesk Subdomain Secret [Permalink for this section](https://docs.arcade.dev/home/auth-providers/zendesk\#set-the-zendesk-subdomain-secret) Set the `ZENDESK_SUBDOMAIN` secret in the [Arcade Dashboard](https://api.arcade.dev/dashboard/auth/secrets). ## Configuring Zendesk Auth [Permalink for this section](https://docs.arcade.dev/home/auth-providers/zendesk\#configuring-zendesk-auth) You can either configure Zendesk auth from the Arcade Dashboard or in the `engine.yaml` file if you are running the Engine yourself. We describe both options below. Dashboard GUIEngine Configuration YAML ### Configure Zendesk Auth Using the Arcade Dashboard GUI #### Access the Arcade Dashboard [Permalink for this section](https://docs.arcade.dev/home/auth-providers/zendesk\#access-the-arcade-dashboard) Navigate to the [Arcade Dashboard](https://api.arcade.dev/dashboard/auth/oauth) OAuth Providers page. #### Navigate to the Add Custom Provider page [Permalink for this section](https://docs.arcade.dev/home/auth-providers/zendesk\#navigate-to-the-add-custom-provider-page) - Click **Add OAuth Provider** in the top right corner. - Click the **Custom Provider** tab at the top. #### Enter the provider details [Permalink for this section](https://docs.arcade.dev/home/auth-providers/zendesk\#enter-the-provider-details) - ID: `zendesk` - Description: `` - Client ID: `` (This is prefixed with `zdg-` if you are using a global OAuth client) - Client Secret: `` - Authorization Endpoint: `https://.zendesk.com/oauth/authorizations/new` - Token Endpoint: `https://.zendesk.com/oauth/tokens` - PKCE Settings: - Enable PKCE: `enabled` - PKCE Method: `S256` (Default) - Authorization Settings: - Response Type: `code` (Default) - Scope: `{{scopes}} {{existing_scopes}}` (Default) - Token Settings: - Authentication Method: `Client Secret Basic` (Default) - Response Content Type: `application/json` (Default) - Refresh Token Settings: - Refresh Token Endpoint: `https://.zendesk.com/oauth/tokens` - Authentication Method: `Client Secret Basic` (Default) - Response Content Type: `application/json` - Token Introspection Settings: - Enable Token Introspection: `disabled` (Default) Note the **Redirect URL** generated by Arcade. This must be set as your Zendesk app’s redirect URL. ## Using Zendesk auth in app code [Permalink for this section](https://docs.arcade.dev/home/auth-providers/zendesk\#using-zendesk-auth-in-app-code) Use the Zendesk auth provider you just created in your own agents and AI apps to get a user token for Zendesk APIs. See [authorizing agents with Arcade](https://docs.arcade.dev/home/auth/how-arcade-helps) to understand how this works. Use `client.auth.start()` to get a user token for Zendesk APIs: PythonJavaScript ```nextra-code from arcadepy import Arcade client = Arcade() # Automatically finds the `ARCADE_API_KEY` env variable # Start the authorization process auth_response = client.auth.start( user_id="{arcade_user_id}", provider="zendesk", scopes=["read_account"], ) 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... ``` ## Using Zendesk auth in custom tools [Permalink for this section](https://docs.arcade.dev/home/auth-providers/zendesk\#using-zendesk-auth-in-custom-tools) If the [Arcade Zendesk toolkit](https://docs.arcade.dev/mcp-servers/customer-support/zendesk) does not meet your needs, you can author your own [custom tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server) that interact with Zendesk APIs. Use the `OAuth2()` auth class to specify that a tool requires authorization with Zendesk. The `context.authorization.token` field will be automatically populated with the user’s Zendesk token: ```nextra-code from typing import Annotated, Any from arcade_tdk import ToolContext, tool from arcade_tdk.auth import OAuth2 import httpx @tool( requires_auth=OAuth2(id="zendesk", scopes=["read"]), requires_secrets=["ZENDESK_SUBDOMAIN"], ) async def get_tickets( context: ToolContext ) -> Annotated[dict[str, Any], "Recent tickets from Zendesk"]: """Get recent tickets from Zendesk including basic ticket information""" token = context.get_auth_token_or_empty() subdomain = context.get_secret("ZENDESK_SUBDOMAIN") url = f"https://{subdomain}.zendesk.com/api/v2/tickets.json" headers = { "Authorization": f"Bearer {token}", "Content-Type": "application/json", "Accept": "application/json", } async with httpx.AsyncClient() as client: resp = await client.get(url, headers=headers) resp.raise_for_status() data = resp.json() return {"tickets": data} ``` [X](https://docs.arcade.dev/home/auth-providers/x "X") [Zoom](https://docs.arcade.dev/home/auth-providers/zoom "Zoom") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## LinkedIn Toolkit [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Social & Communication](https://docs.arcade.dev/mcp-servers/social-communication/discord "Social & Communication") LinkedIn # LinkedIn **Description:** Enable agents to interact with LinkedIn. **Author:** Arcade **Code:** [GitHub](https://github.com/ArcadeAI/arcade-ai/tree/main/mcp-servers/linkedin) **Auth:** User authorizationvia the [LinkedIn auth provider](https://docs.arcade.dev/home/auth-providers/linkedin) [![PyPI Version](https://img.shields.io/pypi/v/arcade_linkedin)](https://pypi.org/project/arcade_linkedin/)[![License](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/arcadeai/arcade-ai/blob/main/LICENSE)[![Python Versions](https://img.shields.io/pypi/pyversions/arcade_linkedin)](https://pypi.org/project/arcade_linkedin/)[![Wheel Status](https://img.shields.io/pypi/wheel/arcade_linkedin)](https://pypi.org/project/arcade_linkedin/)[![Downloads](https://img.shields.io/pypi/dm/arcade_linkedin)](https://pypi.org/project/arcade_linkedin/) The Arcade LinkedIn MCP Server provides a pre-built set of tools for interacting with LinkedIn. These tools make it easy to build agents and AI apps that can: - Create a post ## Available Tools [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/linkedin\#available-tools) These tools are currently available in the Arcade LinkedIn toolkit. | Tool Name | Description | | --- | --- | | Linkedin.CreateTextPost | Share a new text post to LinkedIn. | If you need to perform an action that’s not listed here, you can [get in touch\\ with us](mailto:contact@arcade.dev) to request a new tool, or [create your\\ own tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server) with the [LinkedIn auth\\ provider](https://docs.arcade.dev/home/auth-providers/linkedin#using-linkedin-auth-in-custom-tools). ## Linkedin.CreateTextPost [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/linkedin\#linkedincreatetextpost) See Example > Share a new text post to LinkedIn. **Parameters** - **`text`** _(string, required)_ The text content of the post. * * * ## Auth [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/linkedin\#auth) The Arcade LinkedIn toolkit uses the [LinkedIn auth provider](https://docs.arcade.dev/home/auth-providers/linkedin) to connect to users’ LinkedIn accounts. With the Arcade Cloud Platform, there’s nothing to configure. Your users will see `Arcade` as the name of the application that’s requesting permission. With a self-hosted installation of Arcade, you need to [configure the LinkedIn auth provider](https://docs.arcade.dev/home/auth-providers/linkedin#configuring-linkedin-auth) with your own LinkedIn app credentials. ## Get Building [Use tools hosted on Arcade Cloud\\ \\ Arcade tools are hosted by our cloud platform and ready to be used in your agents. Learn how.](https://docs.arcade.dev/home/quickstart) [Self Host Arcade tools\\ \\ Arcade tools can be self-hosted on your own infrastructure. Learn more about self-hosting.\\ \\ ```\\ pip install arcade_linkedin\\ ```](https://docs.arcade.dev/home/hosting-overview) [Discord](https://docs.arcade.dev/mcp-servers/social-communication/discord "Discord") [Slack](https://docs.arcade.dev/mcp-servers/social-communication/slack "Slack") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Arcade Local Installation [Home](https://docs.arcade.dev/home "Home") Local Deployment [Install](https://docs.arcade.dev/home/deployment/engine-configuration "Install") Local # Installing Arcade Locally This guide will help you install Arcade and set up your development environment. If you are developing tools to use with Arcade, this guide will provide you with a complete local deployment of Arcade for developing and testing tools. ## Prerequisites [Permalink for this section](https://docs.arcade.dev/home/deployment/engine-configuration\#prerequisites) Before you begin, make sure you have the following: - **Python 3.10 or higher** - **pip**: The Python package installer should be available. It’s typically included with Python. - **Arcade Account**: Sign up for an [Arcade account](https://api.arcade.dev/signup) if you haven’t already. - **Package Manager**: Either Brew (macOS) or Apt (linux) to install the engine binary. Verify your Python version by running `python --version` or `python3 --version` in your terminal. ## Installation [Permalink for this section](https://docs.arcade.dev/home/deployment/engine-configuration\#installation) ### Install the Client [Permalink for this section](https://docs.arcade.dev/home/deployment/engine-configuration\#install-the-client) To connect to the cloud or local Arcade Engine, we need to install the Arcade CLI from the `arcade-ai` package. ```nextra-code pip install arcade-ai arcade login ``` For a simple example on using the Arcade CLI, see the [quickstart on building tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server) ### Install the Engine [Permalink for this section](https://docs.arcade.dev/home/deployment/engine-configuration\#install-the-engine) To run the Arcade Engine locally, you’ll need to install `arcade-engine`. Choose the installation method that matches your operating system. This will install a template engine configuration. macOS (Homebrew)Ubuntu/Debian (APT)Windows (coming soon) ```nextra-code brew install ArcadeAI/tap/arcade-engine ``` ### Install a toolkit [Permalink for this section](https://docs.arcade.dev/home/deployment/engine-configuration\#install-a-toolkit) In order to run the Arcade worker, you’ll need to install at least one tool. For local development, you can just `pip install` a tool in the same environment as the client. ```nextra-code pip install arcade-math ``` For more information on installing toolkits, see the [Toolkit Installation](https://docs.arcade.dev/home/local-deployment/install/toolkits) page. To see all available toolkits, view the [Toolkits Page](https://docs.arcade.dev/toolkits). ### Set OpenAI API key [Permalink for this section](https://docs.arcade.dev/home/deployment/engine-configuration\#set-openai-api-key) Before starting the Engine, we need to set an OpenAI API Key that the Engine can use to connect to OpenAI. Edit the `engine.env` file to set the `OPENAI_API_KEY` environment variable: ```nextra-code OPENAI_API_KEY="" ``` See the [configuration overview](https://docs.arcade.dev/home/deployment/on-prem-mcp) for more information on how to configure Arcade Engine and how to locate the `engine.env` file. ### Start the Engine and worker [Permalink for this section](https://docs.arcade.dev/home/deployment/engine-configuration\#start-the-engine-and-worker) To run both the engine and a local worker, follow these steps: 1. First, start the worker: ```nextra-code arcade serve ``` 2. Then, start the engine: ```nextra-code arcade-engine ``` The Engine and worker should both be running locally now. To run the Engine on it’s own, you can run: ```nextra-code arcade-engine ``` Note that the Engine requires at least one Arcade worker to run. ### Connect [Permalink for this section](https://docs.arcade.dev/home/deployment/engine-configuration\#connect) To chat with the running Engine, in a separate terminal instance, run: ```nextra-code arcade chat -h localhost ``` You are now chatting with Arcade locally! ## Next Steps [Permalink for this section](https://docs.arcade.dev/home/deployment/engine-configuration\#next-steps) - **Building Tools**: Learn how to build tools with your local Arcade Instance in the [Creating a Toolkit](https://docs.arcade.dev/home/build-tools/create-a-mcp-server) guide. - **Hosting With Docker**: Learn how to run the [Engine in Docker](https://docs.arcade.dev/home/local-deployment/install/docker). ## Troubleshooting [Permalink for this section](https://docs.arcade.dev/home/deployment/engine-configuration\#troubleshooting) ### Engine Binary Not Found [Permalink for this section](https://docs.arcade.dev/home/deployment/engine-configuration\#engine-binary-not-found) ```nextra-code ❌ Engine binary not found ``` or ```nextra-code command not found: arcade-engine ``` This means that the Arcade Engine cannot be found in your path. Brew and Apt will automatically add the binary to you path. Check that the binary has been properly installed (These are the common installation locations): **Brew** ```nextra-code ls $HOMEBREW_REPOSITORY/Cellar/arcade-engine//bin/arcade-engine ``` **Apt** ```nextra-code ls /usr/bin/arcade-engine ``` If the binary is found, add it to your path with: ```nextra-code export PATH=$PATH:/path/to/your/binary ``` ### Toolkits Not Found [Permalink for this section](https://docs.arcade.dev/home/deployment/engine-configuration\#toolkits-not-found) ```nextra-code No toolkits found in Python environment. Exiting... ``` This means that there are no toolkits found in the same environment as the Arcade SDK. Ensure that you are installing the toolkit package in the same environment and see the [Toolkit Installation Guide](https://docs.arcade.dev/home/local-deployment/install/toolkits) for more details. ### Engine Config Not Found [Permalink for this section](https://docs.arcade.dev/home/deployment/engine-configuration\#engine-config-not-found) ```nextra-code ❌ Config file 'engine.yaml' not found in any of the default locations. ``` or ```nextra-code Arcade Engine has finished with error: unable to read config file $HOME/.arcade/engine.yaml: open $HOME/.arcade/engine.yaml: no such file or directory ``` The engine config may be located in one of the following directories: - $HOME/.arcade/engine.yaml - $HOMEBREW\_REPOSITORY/etc/arcade-engine/engine.yaml (Homebrew) - /etc/arcade-ai/engine.yaml (Apt) The engine config will be downloaded by and added to one of these locations when installing the engine. When running the engine, the config needs to be in the `$HOME/.arcade/` directory or explicitly located with `arcade-engine -c /path/to/engine.yaml`. If you cannot find your engine config, you can save and use the [Configuration Templates](https://docs.arcade.dev/home/local-deployment/configure/templates). * * * [Overview](https://docs.arcade.dev/home/deployment/engine-configuration "Overview") [Docker](https://docs.arcade.dev/home/local-deployment/install/docker "Docker") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Arcade Deploy Guide [Home](https://docs.arcade.dev/home "Home") Serve toolsArcade Deploy # Deploying to the cloud with Arcade Deploy This guide shows you how to deploy a worker with a local toolkit with Arcade Deploy. ## Requirements [Permalink for this section](https://docs.arcade.dev/home/serve-tools/arcade-deploy\#requirements) - **Python 3.10** or higher Verify your Python version by running `python --version` or `python3 --version` in your terminal. - **Arcade Account**: Sign up for an [Arcade account](https://api.arcade.dev/signup) if you haven’t already. - **Arcade CLI**: Install the Arcade CLI uvpip ```nextra-code uv pip install arcade-ai ``` ## Create your deployment config [Permalink for this section](https://docs.arcade.dev/home/serve-tools/arcade-deploy\#create-your-deployment-config) Create a `worker.toml` file in your project directory: ```nextra-code ### Worker 1 [[worker]] [worker.config] id = "my-worker" secret = # Replace with your own secret [worker.local_source] packages = ["./"] # Replace with the path to your toolkit directory ``` For more information on the `worker.toml` file, see the [Arcade Deploy documentation](https://docs.arcade.dev/home/local-deployment/configure/arcade-deploy). * * * ## Deploy your worker [Permalink for this section](https://docs.arcade.dev/home/serve-tools/arcade-deploy\#deploy-your-worker) Run the deploy command in the directory containing your `worker.toml` file: ```nextra-code arcade deploy ``` You should see output like the following: ```nextra-code Deploying 'my-worker...' main.py:589 ⠏ Deploying 1 workers ┏━━━━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━┓ ┃ Added ┃ Removed ┃ Updated ┃ No Changes ┃ ┡━━━━━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━┩ │ custom-toolkit │ │ │ │ └─────────────────┴─────────┴─────────┴────────────┘ ✅ Worker 'my-worker' deployed successfully. ``` * * * ## List your workers [Permalink for this section](https://docs.arcade.dev/home/serve-tools/arcade-deploy\#list-your-workers) Run the following command to list your workers: ```nextra-code arcade worker list ``` You should see output like the following: ```nextra-code Workers ┏━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓ ┃ ID ┃ Cloud Deployed ┃ Engine Registered ┃ Enabled ┃ Host ┃ Toolkits ┃ ┡━━━━━━━━━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩ │ my-worker │ True │ True │ True │ https://4bdfrgfdgftlu0ahyko56gdsr.server.arcade.dev │ CustomToolkit │ └───────────┴────────────────┴───────────────────┴─────────┴─────────────────────────────────────────────────────┴───────────────┘ ``` Your worker and toolkits are now deployed and registered with the engine and ready to use! You can go to the [dashboard](https://api.arcade.dev/dashboard/workers) to see your worker and its details. [Run evaluations](https://docs.arcade.dev/home/evaluate-tools/run-evaluations "Run evaluations") [Docker](https://docs.arcade.dev/home/serve-tools/docker-worker "Docker") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Firecrawl Toolkit [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Developer Tools](https://docs.arcade.dev/mcp-servers/development/e2b "Developer Tools") FirecrawlFirecrawl # Firecrawl **Description:** Enable agents to scrape, crawl, and map websites. **Author:** Arcade **Auth:** API Key [![PyPI Version](https://img.shields.io/pypi/v/arcade_firecrawl)](https://pypi.org/project/arcade_firecrawl/)[![License](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/arcadeai/arcade-ai/blob/main/LICENSE)[![Python Versions](https://img.shields.io/pypi/pyversions/arcade_firecrawl)](https://pypi.org/project/arcade_firecrawl/)[![Wheel Status](https://img.shields.io/pypi/wheel/arcade_firecrawl)](https://pypi.org/project/arcade_firecrawl/)[![Downloads](https://img.shields.io/pypi/dm/arcade_firecrawl)](https://pypi.org/project/arcade_firecrawl/) The Arcade Firecrawl MCP Server provides a pre-built set of tools for interacting with websites. These tools make it easy to build agents and AI apps that can: - Scrape web pages - Crawl websites - Map website structures - Retrieve crawl status and data - Cancel ongoing crawls ## Available Tools [Permalink for this section](https://docs.arcade.dev/mcp-servers/development/firecrawl/firecrawl\#available-tools) These tools are currently available in the Arcade Firecrawl toolkit. | Tool Name | Description | | --- | --- | | Firecrawl.ScrapeUrl | Scrape a URL and return data in specified formats. | | Firecrawl.CrawlWebsite | Crawl a website and return crawl status and data. | | Firecrawl.GetCrawlStatus | Retrieve the status of a crawl job. | | Firecrawl.GetCrawlData | Retrieve data from a completed crawl job. | | Firecrawl.CancelCrawl | Cancel an ongoing crawl job. | | Firecrawl.MapWebsite | Map a website from a single URL to a map of the entire website. | If you need to perform an action that’s not listed here, you can [get in touch\\ with us](mailto:contact@arcade.dev) to request a new tool, or [create your\\ own tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server). ## Firecrawl.ScrapeUrl [Permalink for this section](https://docs.arcade.dev/mcp-servers/development/firecrawl/firecrawl\#firecrawlscrapeurl) See Example > Scrape a URL and return data in specified formats. **Auth:** - **Environment Variables Required:** - `FIRECRAWL_API_KEY`: Your [Firecrawl](https://www.firecrawl.dev/) API key. **Parameters** - **`url`** _(string, required)_ The URL to scrape. - **`formats`** _(enum ( [Formats](https://docs.arcade.dev/mcp-servers/development/firecrawl/reference#formats)), optional)_ The format of the scraped web page. Defaults to `Formats.MARKDOWN`. - **`only_main_content`** _(bool, optional)_ Only return the main content of the page. Defaults to `True`. - **`include_tags`** _(list, optional)_ List of tags to include in the output. - **`exclude_tags`** _(list, optional)_ List of tags to exclude from the output. - **`wait_for`** _(int, optional)_ Delay in milliseconds before fetching content. Defaults to `10`. - **`timeout`** _(int, optional)_ Timeout in milliseconds for the request. Defaults to `30000`. * * * ## Firecrawl.CrawlWebsite [Permalink for this section](https://docs.arcade.dev/mcp-servers/development/firecrawl/firecrawl\#firecrawlcrawlwebsite) See Example > Crawl a website and return crawl status and data. **Auth:** - **Environment Variables Required:** - `FIRECRAWL_API_KEY`: Your [Firecrawl](https://www.firecrawl.dev/) API key. **Parameters** - **`url`** _(string, required)_ The URL to crawl. - **`exclude_paths`** _(list, optional)_ URL patterns to exclude from the crawl. - **`include_paths`** _(list, optional)_ URL patterns to include in the crawl. - **`max_depth`** _(int, required)_ Maximum depth to crawl. Defaults to `2`. - **`ignore_sitemap`** _(bool, required)_ Ignore the website sitemap. Defaults to `True`. - **`limit`** _(int, required)_ Limit the number of pages to crawl. Defaults to `10`. - **`allow_backward_links`** _(bool, required)_ Enable navigation to previously linked pages. Defaults to `False`. - **`allow_external_links`** _(bool, required)_ Allow following links to external websites. Defaults to `False`. - **`webhook`** _(string, optional)_ URL to send a POST request when the crawl is started, updated, and completed. - **`async_crawl`** _(bool, required)_ Run the crawl asynchronously. Defaults to `True`. * * * ## Firecrawl.GetCrawlStatus [Permalink for this section](https://docs.arcade.dev/mcp-servers/development/firecrawl/firecrawl\#firecrawlgetcrawlstatus) See Example > Retrieve the status of a crawl job. **Auth:** - **Environment Variables Required:** - `FIRECRAWL_API_KEY`: Your [Firecrawl](https://www.firecrawl.dev/) API key. **Parameters** - **`crawl_id`** _(string, required)_ The ID of the crawl job. * * * ## Firecrawl.GetCrawlData [Permalink for this section](https://docs.arcade.dev/mcp-servers/development/firecrawl/firecrawl\#firecrawlgetcrawldata) See Example > Retrieve data from a completed crawl job. **Auth:** - **Environment Variables Required:** - `FIRECRAWL_API_KEY`: Your [Firecrawl](https://www.firecrawl.dev/) API key. **Parameters** - **`crawl_id`** _(string, required)_ The ID of the crawl job. * * * ## Firecrawl.CancelCrawl [Permalink for this section](https://docs.arcade.dev/mcp-servers/development/firecrawl/firecrawl\#firecrawlcancelcrawl) See Example > Cancel an ongoing crawl job. **Auth:** - **Environment Variables Required:** - `FIRECRAWL_API_KEY`: Your [Firecrawl](https://www.firecrawl.dev/) API key. **Parameters** - **`crawl_id`** _(string, required)_ The ID of the asynchronous crawl job to cancel. * * * ## Firecrawl.MapWebsite [Permalink for this section](https://docs.arcade.dev/mcp-servers/development/firecrawl/firecrawl\#firecrawlmapwebsite) See Example > Map a website from a single URL to a map of the entire website. **Auth:** - **Environment Variables Required:** - `FIRECRAWL_API_KEY`: Your [Firecrawl](https://www.firecrawl.dev/) API key. **Parameters** - **`url`** _(string, required)_ The base URL to start crawling from. - **`search`** _(string, optional)_ Search query to use for mapping. - **`ignore_sitemap`** _(bool, required)_ Ignore the website sitemap. Defaults to `True`. - **`include_subdomains`** _(bool, required)_ Include subdomains of the website. Defaults to `False`. - **`limit`** _(int, required)_ Maximum number of links to return. Defaults to `5000`. ## Auth [Permalink for this section](https://docs.arcade.dev/mcp-servers/development/firecrawl/firecrawl\#auth) The Arcade Web toolkit uses [Firecrawl](https://www.firecrawl.dev/) to scrape, crawl, and map websites. **Global Environment Variables:** - `FIRECRAWL_API_KEY`: Your [Firecrawl](https://www.firecrawl.dev/) API key. ## Get Building [Use tools hosted on Arcade Cloud\\ \\ Arcade tools are hosted by our cloud platform and ready to be used in your agents. Learn how.](https://docs.arcade.dev/home/quickstart) [Self Host Arcade tools\\ \\ Arcade tools can be self-hosted on your own infrastructure. Learn more about self-hosting.\\ \\ ```\\ pip install arcade_firecrawl\\ ```](https://docs.arcade.dev/home/hosting-overview) [Reference](https://docs.arcade.dev/mcp-servers/development/github/reference "Reference") [Reference](https://docs.arcade.dev/mcp-servers/development/firecrawl/reference "Reference") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Twilio Toolkit [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Social & Communication](https://docs.arcade.dev/mcp-servers/social-communication/discord "Social & Communication") [Twilio](https://docs.arcade.dev/mcp-servers/social-communication/twilio/readme "Twilio") Reference # Twilio Toolkit | | | | --- | --- | | Name | twilio | | Package | [arcade\_twilio](https://pypi.org/project/arcade_twilio/0.1.0/) | | Repository | [Github](https://github.com/sdserranog/arcade-twilio) | | Install | `pip install arcade_twilio==0.1.0` | | Description | A twilio integration to send SMS and WhatsApps. | | Author | [sdserranog@gmail.com](mailto:sdserranog@gmail.com) | | Tool Name | Description | | --- | --- | | [SendSms](https://docs.arcade.dev/mcp-servers/social-communication/twilio/reference#sendsms) | Send an SMS/text message to a phone number | | [SendWhatsapp](https://docs.arcade.dev/mcp-servers/social-communication/twilio/reference#sendwhatsapp) | Send a WhatsApp message to a phone number | ### SendSms [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/twilio/reference\#sendsms) Send an SMS/text message to a phone number #### Parameters [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/twilio/reference\#parameters) - `phone_number` _(string, required)_ The phone number to send the message to. Use ‘my\_phone\_number’ when a phone number is not specified or when the request implies sending to the user themselves - `message` _(string, required)_ The text content to be sent via SMS * * * ### SendWhatsapp [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/twilio/reference\#sendwhatsapp) Send a WhatsApp message to a phone number #### Parameters [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/twilio/reference\#parameters-1) - `phone_number` _(string, required)_ The phone number to send the message to. Use ‘my\_phone\_number’ when a phone number is not specified or when the request implies sending to the user themselves - `message` _(string, required)_ The text content to be sent via WhatsApp [Readme](https://docs.arcade.dev/mcp-servers/social-communication/twilio/readme "Readme") [X](https://docs.arcade.dev/mcp-servers/social-communication/x "X") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Microsoft Teams Reference [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Social & Communication](https://docs.arcade.dev/mcp-servers/social-communication/discord "Social & Communication") [Microsoft Teams](https://docs.arcade.dev/mcp-servers/social-communication/microsoft_teams "Microsoft Teams") Reference # MicrosoftTeams Reference Below is a reference of enumerations used by some tools in the MicrosoftTeams toolkit: ## PartialMatchType [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/microsoft_teams/reference\#partialmatchtype) - **PARTIAL\_ALL**: `match_all_keywords` - **PARTIAL\_ANY**: `match_any_of_the_keywords` ## MatchType [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/microsoft_teams/reference\#matchtype) - **EXACT**: `exact_match` - **PARTIAL\_ALL**: `partial_match_all_keywords` - **PARTIAL\_ANY**: `partial_match_any_of_the_keywords` ## TeamMembershipType [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/microsoft_teams/reference\#teammembershiptype) - **DIRECT\_MEMBER**: `direct_member_of_the_team` - **MEMBER\_OF\_SHARED\_CHANNEL**: `member_of_a_shared_channel_in_another_team` [Microsoft Teams](https://docs.arcade.dev/mcp-servers/social-communication/microsoft_teams "Microsoft Teams") [Reddit](https://docs.arcade.dev/mcp-servers/social-communication/reddit "Reddit") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Stripe Payment Toolkit [Integrations](https://docs.arcade.dev/toolkits "Integrations") Payments & FinanceStripe # Stripe **Description:** Empower your agents to interact with the Stripe API. **Author:** Arcade **Auth:** API Key [![PyPI Version](https://img.shields.io/pypi/v/arcade_stripe)](https://pypi.org/project/arcade_stripe/)[![License](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/arcadeai/arcade-ai/blob/main/LICENSE)[![Python Versions](https://img.shields.io/pypi/pyversions/arcade_stripe)](https://pypi.org/project/arcade_stripe/)[![Wheel Status](https://img.shields.io/pypi/wheel/arcade_stripe)](https://pypi.org/project/arcade_stripe/)[![Downloads](https://img.shields.io/pypi/dm/arcade_stripe)](https://pypi.org/project/arcade_stripe/) The Arcade Stripe toolkit lets you interact with the Stripe API. Use these tools to build intelligent agents and applications that process payments, create invoices, and more. ## Available Tools [Permalink for this section](https://docs.arcade.dev/mcp-servers/payments/stripe\#available-tools) | Tool Name | Description | | --- | --- | | Stripe.CreateCustomer | This tool will create a customer in Stripe. | | Stripe.ListCustomers | This tool will fetch a list of Customers from Stripe. | | Stripe.CreateProduct | This tool will create a product in Stripe. | | Stripe.ListProducts | This tool will fetch a list of Products from Stripe. | | Stripe.CreatePrice | This tool will create a price in Stripe. If a product has not already been | | Stripe.ListPrices | This tool will fetch a list of Prices from Stripe. | | Stripe.CreatePaymentLink | This tool will create a payment link in Stripe. | | Stripe.ListInvoices | This tool will list invoices in Stripe. | | Stripe.CreateInvoice | This tool will create an invoice in Stripe. | | Stripe.CreateInvoiceItem | This tool will create an invoice item in Stripe. | | Stripe.FinalizeInvoice | This tool will finalize an invoice in Stripe. | | Stripe.RetrieveBalance | This tool will retrieve the balance from Stripe. It takes no input. | | Stripe.CreateRefund | This tool will refund a payment intent in Stripe. | | Stripe.ListPaymentIntents | This tool will list payment intents in Stripe. | | Stripe.CreateBillingPortalSession | This tool will create a billing portal session. | If you need an action that’s not listed here, please [contact us](mailto:contact@arcade.dev) to request a new tool, or [create your own tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server). ## Stripe.CreateCustomer [Permalink for this section](https://docs.arcade.dev/mcp-servers/payments/stripe\#stripecreatecustomer) Create a customer in Stripe. **Parameters** - **`name`** _(string, required)_: The name of the customer. - **`email`** _(string, optional)_: The email address of the customer. See Example > ## Stripe.ListCustomers [Permalink for this section](https://docs.arcade.dev/mcp-servers/payments/stripe\#stripelistcustomers) Fetch a list of customers from Stripe. **Parameters** - **`limit`** _(int, optional, defaults to 10)_: A limit on the number of objects to be returned. Limit can range between 1 and 100. - **`email`** _(string, optional)_: A case-sensitive filter on the list based on the customer’s email field. See Example > ## Stripe.CreateProduct [Permalink for this section](https://docs.arcade.dev/mcp-servers/payments/stripe\#stripecreateproduct) Create a product in Stripe. **Parameters** - **`name`** _(string, required)_: The name of the product. - **`description`** _(string, optional)_: The description of the product. See Example > ## Stripe.ListProducts [Permalink for this section](https://docs.arcade.dev/mcp-servers/payments/stripe\#stripelistproducts) Fetch a list of products from Stripe. **Parameters** - **`limit`** _(int, optional, defaults to 10)_: A limit on the number of products returned. Limit can range between 1 and 100, and defaults to 10. See Example > ## Stripe.CreatePrice [Permalink for this section](https://docs.arcade.dev/mcp-servers/payments/stripe\#stripecreateprice) Create a price in Stripe. **Parameters** - **`product`** _(string, required)_: The ID of the product to create the price for. - **`unit_amount`** _(int, required)_: The unit amount of the price in cents. - **`currency`** _(string, required)_: The currency of the price. See Example > ## Stripe.ListPrices [Permalink for this section](https://docs.arcade.dev/mcp-servers/payments/stripe\#stripelistprices) Fetch a list of prices from Stripe. **Parameters** - **`product`** _(string, optional)_: The ID of the product to list prices for. - **`limit`** _(int, optional, defaults to 10)_: A limit on the number of objects to be returned. Limit can range between 1 and 100, and defaults to 10. See Example > ## Stripe.CreatePaymentLink [Permalink for this section](https://docs.arcade.dev/mcp-servers/payments/stripe\#stripecreatepaymentlink) Create a payment link in Stripe. **Parameters** - **`price`** _(string, required)_: The ID of the price to create the payment link for. - **`quantity`** _(int, required)_: The quantity of the product to include. See Example > ## Stripe.ListInvoices [Permalink for this section](https://docs.arcade.dev/mcp-servers/payments/stripe\#stripelistinvoices) List invoices in Stripe. **Parameters** - **`customer`** _(string, optional)_: The ID of the customer to list invoices for. - **`limit`** _(int, optional, defaults to 10)_: A limit on the number of invoices returned. Limit can range between 1 and 100, and defaults to 10. See Example > ## Stripe.CreateInvoice [Permalink for this section](https://docs.arcade.dev/mcp-servers/payments/stripe\#stripecreateinvoice) Create an invoice in Stripe. **Parameters** - **`customer`** _(string, required)_: The ID of the customer to create the invoice for. - **`days_until_due`** _(int, optional)_: The number of days until the invoice is due. See Example > ## Stripe.CreateInvoiceItem [Permalink for this section](https://docs.arcade.dev/mcp-servers/payments/stripe\#stripecreateinvoiceitem) Create an invoice item in Stripe. **Parameters** - **`customer`** _(string, required)_: The ID of the customer to create the invoice item for. - **`price`** _(string, required)_: The ID of the price for the item. - **`invoice`** _(string, required)_: The ID of the invoice to create the item for. See Example > ## Stripe.FinalizeInvoice [Permalink for this section](https://docs.arcade.dev/mcp-servers/payments/stripe\#stripefinalizeinvoice) Finalize an invoice in Stripe. **Parameters** - **`invoice`** _(string, required)_: The ID of the invoice to finalize. See Example > ## Stripe.RetrieveBalance [Permalink for this section](https://docs.arcade.dev/mcp-servers/payments/stripe\#striperetrievebalance) Retrieve the balance from Stripe. This tool takes no inputs. See Example > ## Stripe.CreateRefund [Permalink for this section](https://docs.arcade.dev/mcp-servers/payments/stripe\#stripecreaterefund) Refund a payment intent in Stripe. **Parameters** - **`payment_intent`** _(string, required)_: The ID of the PaymentIntent to refund. - **`amount`** _(int, optional)_: The refund amount to refund in cents. See Example > ## Stripe.ListPaymentIntents [Permalink for this section](https://docs.arcade.dev/mcp-servers/payments/stripe\#stripelistpaymentintents) List payment intents in Stripe. **Parameters** - **`customer`** _(string, optional)_: The ID of the customer to list payment intents for. - **`limit`** _(int, optional)_: A limit on the number of payment intents returned. Limit can range between 1 and 100, and defaults to 10. See Example > ## Stripe.CreateBillingPortalSession [Permalink for this section](https://docs.arcade.dev/mcp-servers/payments/stripe\#stripecreatebillingportalsession) Create a billing portal session in Stripe. **Parameters** - **`customer`** _(string, required)_: The ID of the customer to create the billing portal session for. - **`return_url`** _(string, optional)_: The default URL to return to afterwards. See Example > ## Auth [Permalink for this section](https://docs.arcade.dev/mcp-servers/payments/stripe\#auth) The Arcade Stripe toolkit uses the [Stripe Agent Toolkit](https://github.com/stripe/agent-toolkit) to interact with the Stripe API. - **Required Secret:** - `STRIPE_SECRET_KEY`: Your Stripe API key. ## Get Building [Use tools hosted on Arcade Cloud\\ \\ Arcade tools are hosted by our cloud platform and ready to be used in your agents. Learn how.](https://docs.arcade.dev/home/quickstart) [Self Host Arcade tools\\ \\ Arcade tools can be self-hosted on your own infrastructure. Learn more about self-hosting.\\ \\ ```\\ pip install arcade_stripe\\ ```](https://docs.arcade.dev/home/hosting-overview) [Reference](https://docs.arcade.dev/mcp-servers/development/firecrawl/reference "Reference") [Google Finance](https://docs.arcade.dev/mcp-servers/search/google_finance "Google Finance") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Notion Toolkit [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Productivity & Docs](https://docs.arcade.dev/mcp-servers/productivity/asana "Productivity & Docs") Notion # Notion **Description:** Enable agents to interact with Notion. **Author:** Arcade **Auth:** User authorizationvia the [Notion auth provider](https://docs.arcade.dev/home/auth-providers/notion) [![PyPI Version](https://img.shields.io/pypi/v/arcade_notion-toolkit)](https://pypi.org/project/arcade_notion-toolkit/)[![License](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/arcadeai/arcade-ai/blob/main/LICENSE)[![Python Versions](https://img.shields.io/pypi/pyversions/arcade_notion-toolkit)](https://pypi.org/project/arcade_notion-toolkit/)[![Wheel Status](https://img.shields.io/pypi/wheel/arcade_notion-toolkit)](https://pypi.org/project/arcade_notion-toolkit/)[![Downloads](https://img.shields.io/pypi/dm/arcade_notion-toolkit)](https://pypi.org/project/arcade_notion-toolkit/) The Arcade Notion MCP Server provides a pre-built set of tools for interacting with Notion. These tools make it easy to build agents and AI apps that can: - Get a page’s content - Create a new page - Search for pages or databases by title - Get the metadata of a Notion object (page or database) - Get a workspace’s folder structure ## Available tools [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/notion\#available-tools) These tools are currently available in the Arcade Notion toolkit. | Tool Name | Description | | --- | --- | | NotionToolkit.GetPageContentById | Get the content of a Notion page as markdown by page ID. | | NotionToolkit.GetPageContentByTitle | Get the content of a Notion page as markdown by title. | | NotionToolkit.CreatePage | Create a new Notion page by specifying a parent page title. | | NotionToolkit.SearchByTitle | Search for pages or databases by title. | | NotionToolkit.GetObjectMetadata | Get the metadata of a Notion object (page or database) using its title or ID. | | NotionToolkit.GetWorkspaceStructure | Get the complete workspace structure of your Notion workspace. | | NotionToolkit.AppendContentToEndOfPage | Append content to the end of a Notion page. | | NotionToolkit.WhoAmI | Get comprehensive user profile and Notion workspace information. | If you need to perform an action that’s not listed here, you can [get in touch with us](mailto:contact@arcade.dev) to request a new tool, or [create your own tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server) with the [Notion auth provider](https://docs.arcade.dev/home/auth-providers/notion). ## NotionToolkit.GetPageContentById [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/notion\#notiontoolkitgetpagecontentbyid) See Example > Get the content of a Notion page as markdown with the page’s ID. **Parameters** - **`page_id`** _(string, required)_ The ID of the page to get content from. * * * ## NotionToolkit.GetPageContentByTitle [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/notion\#notiontoolkitgetpagecontentbytitle) See Example > Get the content of a Notion page as markdown with the page’s title. **Parameters** - **`title`** _(string, required)_ The title of the page to get content from. * * * ## NotionToolkit.CreatePage [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/notion\#notiontoolkitcreatepage) See Example > Create a new Notion page by specifying an existing parent page and the new page details. **Parameters** - **`parent_title`** _(string, required)_ Title of an existing page where the new page will be created. - **`title`** _(string, required)_ Title of the new page. - **`content`** _(string, optional)_ The content of the new page. * * * ## NotionToolkit.SearchByTitle [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/notion\#notiontoolkitsearchbytitle) See Example > Search for similar titles of pages, databases, or both within the user’s Notion workspace. This tool returns minimal information about matching objects without their content. **Parameters** - **`query`** _(string, optional)_ A substring to search for within page and database titles. If not provided, all items are returned. - **`select`** _(str, optional)_ Limit the search to only pages or only databases. If provided, must be one of `page` or `database`. Defaults to both. - **`order_by`** _(str, optional)_ The direction to sort search results by last edited time. Must be either `ascending` or `descending`. Defaults to `descending`. - **`limit`** _(int, optional)_ The maximum number of results to return. Defaults to 100. Use -1 for no limit. * * * ## NotionToolkit.GetObjectMetadata [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/notion\#notiontoolkitgetobjectmetadata) See Example > Get the metadata of a Notion object (page or database) using its title or ID. One of `object_title` or `object_id` must be provided (but not both). The returned metadata includes the object’s ID, timestamps, properties, URL, and more. **Parameters** - **`object_title`** _(string, optional)_ The title of the page or database whose metadata to retrieve. - **`object_id`** _(string, optional)_ The ID of the page or database whose metadata to retrieve. - **`object_type`** _(str, optional)_ The type of object to match the title against. If provided, must be one of `page` or `database`. Defaults to both if not provided. * * * ## NotionToolkit.GetWorkspaceStructure [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/notion\#notiontoolkitgetworkspacestructure) See Example > Get the complete workspace structure of your Notion workspace. This tool returns a hierarchical view of pages and databases, making it easier to understand the organization of your workspace. **Parameters** _None_ * * * ## NotionToolkit.AppendContentToEndOfPage [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/notion\#notiontoolkitappendcontenttoendofpage) See Example > Append markdown content to the end of a Notion page using either the page’s ID or title. **Parameters** - **`page_id_or_title`** _(string, required)_ The ID or title of the page to append content to. - **`content`** _(string, required)_ The markdown content to append to the end of the page. * * * ## NotionToolkit.WhoAmI [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/notion\#notiontoolkitwhoami) See Example > Get comprehensive user profile and Notion workspace information. **Parameters** This tool does not take any parameters. ## Auth [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/notion\#auth) The Arcade Notion toolkit uses the [Notion auth provider](https://docs.arcade.dev/home/auth-providers/notion) to connect to users’ Notion accounts. With the Arcade Cloud Platform, there’s nothing to configure. Your users will see `Arcade` as the name of the application that’s requesting permission. With a self-hosted installation of Arcade, you need to [configure the Notion auth provider](https://docs.arcade.dev/home/auth-providers/notion#configuring-notion-auth) with your own Notion app credentials. ## Get Building [Use tools hosted on Arcade Cloud\\ \\ Arcade tools are hosted by our cloud platform and ready to be used in your agents. Learn how.](https://docs.arcade.dev/home/quickstart) [Self Host Arcade tools\\ \\ Arcade tools can be self-hosted on your own infrastructure. Learn more about self-hosting.\\ \\ ```\\ pip install arcade_notion_toolkit\\ ```](https://docs.arcade.dev/home/hosting-overview) [Linear](https://docs.arcade.dev/mcp-servers/productivity/linear "Linear") [Obsidian](https://docs.arcade.dev/mcp-servers/productivity/obsidian "Obsidian") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## X Auth Provider Guide [Home](https://docs.arcade.dev/home "Home") [Customizing Auth](https://docs.arcade.dev/home/auth-providers "Customizing Auth") X # X auth provider The X auth provider enables tools and agents to call the X (Twitter) API on behalf of a user. Behind the scenes, the Arcade Engine and the X auth provider seamlessly manage X OAuth 2.0 authorization for your users. Want to quickly get started with X services in your agent or AI app? The pre-built [Arcade X toolkit](https://docs.arcade.dev/mcp-servers/social-communication/x) is what you want! ### What’s documented here [Permalink for this section](https://docs.arcade.dev/home/auth-providers/x\#whats-documented-here) This page describes how to use and configure X auth with Arcade. This auth provider is used by: - The [Arcade X toolkit](https://docs.arcade.dev/mcp-servers/social-communication/x), which provides pre-built tools for interacting with X - Your [app code](https://docs.arcade.dev/home/auth-providers/x#using-x-auth-in-app-code) that needs to call X APIs - Or, your [custom tools](https://docs.arcade.dev/home/auth-providers/x#using-x-auth-in-custom-tools) that need to call X APIs ## Configuring X auth [Permalink for this section](https://docs.arcade.dev/home/auth-providers/x\#configuring-x-auth) When using your own app credentials, make sure you configure your project to use a [custom user verifier](https://docs.arcade.dev/home/auth/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. You can use your own X credentials in both the Arcade Cloud Platform or in a [self-hosted Arcade Engine](https://docs.arcade.dev/home/deployment/engine-configuration) instance. Before showing how to configure your X app credentials, let’s go through the steps to create a X app. ### Create an X app [Permalink for this section](https://docs.arcade.dev/home/auth-providers/x\#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 your Arcade Engine configuration. You can do this in the Arcade Dashboard, or by editing the `engine.yaml` file directly (for a self-hosted instance). ## Configuring your own X Auth Provider in Arcade [Permalink for this section](https://docs.arcade.dev/home/auth-providers/x\#configuring-your-own-x-auth-provider-in-arcade) There are two ways to configure your X app credentials in Arcade: 1. From the Arcade Dashboard GUI 2. By editing the `engine.yaml` file directly (for a self-hosted Arcade Engine) We show both options step-by-step below. Dashboard GUIEngine Configuration YAML ### Configure X Auth Using the Arcade Dashboard GUI #### Access the Arcade Dashboard [Permalink for this section](https://docs.arcade.dev/home/auth-providers/x\#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](http://localhost:9099/dashboard). Adjust the host and port number to match your environment. #### Navigate to the OAuth Providers page [Permalink for this section](https://docs.arcade.dev/home/auth-providers/x\#navigate-to-the-oauth-providers-page) - Under the **OAuth** section of the Arcade Dashboard left-side menu, click **Providers**. - 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 [Permalink for this section](https://docs.arcade.dev/home/auth-providers/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 [Permalink for this section](https://docs.arcade.dev/home/auth-providers/x\#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, the Arcade Engine will automatically use this X OAuth provider. If you have multiple X providers, see [using multiple auth providers of the same type](https://docs.arcade.dev/home/auth-providers#using-multiple-providers-of-the-same-type) for more information. ## Using X auth in app code [Permalink for this section](https://docs.arcade.dev/home/auth-providers/x\#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](https://docs.arcade.dev/home/auth/how-arcade-helps) to understand how this works. Use `client.auth.start()` to get a user token for X: PythonJavaScript ```nextra-code 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... ``` ## Using X auth in custom tools [Permalink for this section](https://docs.arcade.dev/home/auth-providers/x\#using-x-auth-in-custom-tools) You can use the pre-built [Arcade X toolkit](https://docs.arcade.dev/mcp-servers/social-communication/x) to quickly build agents and AI apps that interact with X. If the pre-built tools in the X toolkit don’t meet your needs, you can author your own [custom tools](https://docs.arcade.dev/home/build-tools/create-a-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: ```nextra-code 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}" ``` [Twitch](https://docs.arcade.dev/home/auth-providers/twitch "Twitch") [Zendesk](https://docs.arcade.dev/home/auth-providers/zendesk "Zendesk") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Imgflip Meme Toolkit [Integrations](https://docs.arcade.dev/toolkits "Integrations") EntertainmentImgflip # Imgflip **Description:** Enable agents to create memes with Imgflip. **Author:** Arcade **Auth:** API Key [![PyPI Version](https://img.shields.io/pypi/v/arcade_imgflip)](https://pypi.org/project/arcade_imgflip/)[![License](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/arcadeai/arcade-ai/blob/main/LICENSE)[![Python Versions](https://img.shields.io/pypi/pyversions/arcade_imgflip)](https://pypi.org/project/arcade_imgflip/)[![Wheel Status](https://img.shields.io/pypi/wheel/arcade_imgflip)](https://pypi.org/project/arcade_imgflip/)[![Downloads](https://img.shields.io/pypi/dm/arcade_imgflip)](https://pypi.org/project/arcade_imgflip/) The Arcade Imgflip MCP Server provides a pre-built set of tools for interacting with Imgflip. These tools make it easy to build agents and AI apps that can: - Create memes - Search for memes - Get popular meme templates ## Available Tools [Permalink for this section](https://docs.arcade.dev/mcp-servers/entertainment/imgflip\#available-tools) These tools are currently available in the Arcade Imgflip toolkit. | Tool Name | Description | | --- | --- | | Imgflip.SearchMemes | Search for meme templates by query (Premium feature) | | Imgflip.GetPopularMemes | Get popular meme templates from Imgflip | | Imgflip.CreateMeme | Create a custom meme using an Imgflip template | If you need to perform an action that’s not listed here, you can [get in touch\\ with us](mailto:contact@arcade.dev) to request a new tool, or [create your\\ own tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server) with the [Imgflip auth\\ provider](https://docs.arcade.dev/home/auth-providers/imgflip#using-imgflip-auth-in-customtools). ## Imgflip.SearchMemes [Permalink for this section](https://docs.arcade.dev/mcp-servers/entertainment/imgflip\#imgflipsearchmemes) See Example > Search for meme templates by query (Premium feature) This tool searches through Imgflip’s database of over 1 million meme templates to find ones that match your search query. This is a Premium feature that requires a paid Imgflip subscription. **Parameters** - `query` _(string, required)_ Search query to find meme templates. Be specific for better results. - `include_nsfw` _(boolean, optional)_ Include not-safe-for-work memes in search results. Defaults to False. - `limit` _(integer, optional)_ Maximum number of meme templates to return. Defaults to 20. * * * ## Imgflip.GetPopularMemes [Permalink for this section](https://docs.arcade.dev/mcp-servers/entertainment/imgflip\#imgflipgetpopularmemes) See Example > Get popular meme templates from Imgflip This tool retrieves a list of popular meme templates that can be used to create custom memes. These templates are ordered by popularity based on how many times they’ve been captioned. **Parameters** - `limit` _(integer, optional)_ Maximum number of meme templates to return. Defaults to 20. * * * ## Imgflip.CreateMeme [Permalink for this section](https://docs.arcade.dev/mcp-servers/entertainment/imgflip\#imgflipcreatememe) See Example > Create a custom meme using an Imgflip template This tool creates a custom meme by adding your text to an existing meme template. You can specify top and bottom text, choose fonts, and control text sizing. **Parameters** - `template_id` _(string, required)_ The meme template ID to use for creation. You can get this from get\_popular\_memes. - `top_text` _(string, optional)_ Text to display at the top of the meme. Leave empty if not needed. - `bottom_text` _(string, optional)_ Text to display at the bottom of the meme. Leave empty if not needed. - `font` _(Font, optional)_ Font family to use for the text. Defaults to IMPACT. - `max_font_size` _(integer, optional)_ Maximum font size for the text. Defaults to 50. - `no_watermark` _(boolean, optional)_ Remove the Imgflip watermark (Premium feature). Defaults to False. ## Get Building [Use tools hosted on Arcade Cloud\\ \\ Arcade tools are hosted by our cloud platform and ready to be used in your agents. Learn how.](https://docs.arcade.dev/home/quickstart) [Self Host Arcade tools\\ \\ Arcade tools can be self-hosted on your own infrastructure. Learn more about self-hosting.\\ \\ ```\\ pip install arcade_imgflip\\ ```](https://docs.arcade.dev/home/hosting-overview) [Reference](https://docs.arcade.dev/mcp-servers/social-communication/teams/reference "Reference") [Spotify](https://docs.arcade.dev/mcp-servers/entertainment/spotify "Spotify") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## User Auth Management [Home](https://docs.arcade.dev/home "Home") [Mastra](https://docs.arcade.dev/home/mastra/overview "Mastra") Managing user authorization ## Dynamic Tool Loading with Toolsets [Permalink for this section](https://docs.arcade.dev/home/mastra/user-auth-interrupts\#dynamic-tool-loading-with-toolsets) Mastra lets you dynamically provide tools to an agent at runtime using toolsets. This approach is essential when integrating Arcade tools in web applications where each user needs their own authentication flow. ### Per-User Tool Authentication in Web Applications [Permalink for this section](https://docs.arcade.dev/home/mastra/user-auth-interrupts\#per-user-tool-authentication-in-web-applications) In web applications serving multiple users, implement user-specific authentication flows with these steps: First, set up your Mastra configuration and agents in separate files: ```nextra-code // @/mastra/index.ts import { Mastra } from "@mastra/core"; import { githubAgent } from "./agents/githubAgent"; // Initialize Mastra export const mastra = new Mastra({ agents: { githubAgent, }, }); ``` ```nextra-code // @/mastra/agents/githubAgent.ts import { Agent } from "@mastra/core/agent"; import { anthropic } from "@ai-sdk/anthropic"; // Create the agent without tools - we'll add them at runtime export const githubAgent = new Agent({ name: "githubAgent", instructions: `You are a GitHub Agent that helps with repository management. You can help with tasks like: - Listing repositories - Creating and managing issues - Viewing pull requests - Managing repository settings If a tool requires authorization, you will receive an authorization URL. When that happens, clearly present this URL to the user and ask them to visit it to grant permissions.`, model: anthropic("claude-3-7-sonnet-20250219"), // No tools defined here - will be provided dynamically at runtime }); ``` Then, create an API endpoint that provides tools dynamically: ```nextra-code // app/api/chat/route.ts import { NextRequest, NextResponse } from "next/server"; import { mastra } from "@/mastra"; import { Arcade } from "@arcadeai/arcadejs"; import { getUserSession } from "@/lib/auth"; // Your authentication handling import { toZodToolSet } from "@arcadeai/arcadejs/lib"; import { executeOrAuthorizeZodTool } from "@arcadeai/arcadejs/lib"; export async function POST(req: NextRequest) { // Extract request data const { messages, threadId } = await req.json(); // Authenticate the user const session = await getUserSession(req); if (!session) { return NextResponse.json({ message: "Unauthorized" }, { status: 401 }); } try { // Get the agent from Mastra const githubAgent = mastra.getAgent("githubAgent"); const arcade = new Arcade(); const githubToolkit = await arcade.tools.list({ toolkit: "github", limit: 30 }); // Fetch user-specific Arcade tools for GitHub const arcadeTools = toZodToolSet({ tools: githubToolkit.items, client: arcade, userId: session.user.email, executeFactory: executeOrAuthorizeZodTool, }); // Stream the response with dynamically provided tools const response = await githubAgent.stream(messages, { threadId, // Optional: For maintaining conversation context resourceId: session.user.id, // Optional: For associating memory with user toolChoice: "auto", toolsets: { arcade: arcadeTools, // Provide tools in a named toolset }, }); // Return streaming response return response.toDataStreamResponse(); } catch (error) { console.error("Error processing GitHub request:", error); return NextResponse.json( { message: "Failed to process request" }, { status: 500 }, ); } } ``` This approach provides several benefits: - Each user gets their own separate authentication flow with Arcade tools - A single agent instance works with multiple user-specific toolsets The toolsets parameter provides tools only for the current request without modifying the agent’s base configuration. This makes it ideal for multi-user applications where each user needs their own secure OAuth flow with Arcade. ## Handling Tool Authorization [Permalink for this section](https://docs.arcade.dev/home/mastra/user-auth-interrupts\#handling-tool-authorization) When a tool requires user authorization, the agent receives a response with: ```nextra-code { authorization_required: true, url: "https://auth.arcade.com/...", message: "Forward this url to the user for authorization" } ``` Your agent should recognize this pattern and present the URL to the user. To create a better user experience: - Display the authorization URL as a clickable link in your UI - Explain which service needs authorization and why - Provide a way for users to retry their request after authorization ## Tips for Selecting Tools [Permalink for this section](https://docs.arcade.dev/home/mastra/user-auth-interrupts\#tips-for-selecting-tools) - **Focus on relevance**: Choose tools that directly support your agent’s specific purpose - **Consider performance**: Some tools may have higher latency than others - **Handle errors gracefully**: Implement robust error handling for third-party service failures - **Create clear user flows**: Design intuitive authorization experiences ## Next Steps [Permalink for this section](https://docs.arcade.dev/home/mastra/user-auth-interrupts\#next-steps) After integrating Arcade tools into your Mastra agent, you can: - Add [memory capabilities](https://mastra.ai/docs/agents/agent-memory) to maintain context between interactions - Implement [structured workflows](https://mastra.ai/docs/workflows/overview) for complex multi-step operations - Enhance your agent with [RAG capabilities](https://mastra.ai/docs/rag/overview) for domain-specific knowledge - Set up [logging and tracing](https://mastra.ai/docs/observability/logging) to monitor performance For more detailed information on Mastra’s capabilities, visit the [Mastra documentation](https://mastra.ai/docs). [Using Arcade tools](https://docs.arcade.dev/home/mastra/use-arcade-tools "Using Arcade tools") [Overview](https://docs.arcade.dev/home/oai-agents/overview "Overview") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Arcade Toolkits Overview # Toolkits There are 4 designations for Arcade toolkits: ## Arcade Optimized Toolkit Official toolkits hand-crafted by Arcade that are ready for use and optimized for LLM-usage. [Learn more](https://docs.arcade.dev/home/use-tools/types-of-tools#optimized-tools). ## Arcade Starter Toolkit Auto-generated toolkits developed by Arcade that may require customization. [Learn more](https://docs.arcade.dev/home/use-tools/types-of-tools#starter-tools). ## Verified Toolkit Community-created toolkits, thoroughly tested and verified by Arcade. ## Community Toolkit Created and maintained by the Arcade community, offering a wide range of toolkits. ## Auth Provider Auth integrations allow you to develop custom tools that connect your agent APIs and services. ## Build your own integration Don't see what you need? Use Arcade's SDK to integrate with any service or API. [Learn how to build a toolkit](https://docs.arcade.dev/home/build-tools/create-a-mcp-server) 104 result(s) found All ToolsProductivity & DocsSocial & CommunicationDeveloper ToolsEntertainmentSearchPayments & FinanceSalesDatabasesCustomer Support [AS\\ \\ Asana\\ \\ Arcade Optimized Toolkit\\ \\ Manage projects, tasks, and more in Asana with your agents.](https://docs.arcade.dev/mcp-servers/productivity/asana) [CL\\ \\ ClickUp\\ \\ Arcade Optimized Toolkit\\ \\ Manage projects, tasks, and documents with your agents.](https://docs.arcade.dev/mcp-servers/productivity/clickup) [CO\\ \\ Confluence\\ \\ Arcade Optimized Toolkit\\ \\ Manage Confluence pages and spaces with your agents](https://docs.arcade.dev/mcp-servers/productivity/confluence) [DR\\ \\ Dropbox\\ \\ Arcade Optimized Toolkit\\ \\ Manage Dropbox files and folders with your agents](https://docs.arcade.dev/mcp-servers/productivity/dropbox/dropbox) [E2\\ \\ E2B\\ \\ Arcade Optimized Toolkit\\ \\ Execute and test code in a secure sandbox environment](https://docs.arcade.dev/mcp-servers/development/e2b) [FI\\ \\ Firecrawl\\ \\ Arcade Optimized Toolkit\\ \\ Browse and interact with web pages programmatically](https://docs.arcade.dev/mcp-servers/development/firecrawl/firecrawl) [GI\\ \\ GitHub\\ \\ Arcade Optimized Toolkit\\ \\ Interact with private and public GitHub repositories, issues, pull requests, and more](https://docs.arcade.dev/mcp-servers/development/github/github) [GM\\ \\ Gmail\\ \\ Arcade Optimized Toolkit\\ \\ Send, write, draft, delete, trash, and search Gmail emails with your agents.](https://docs.arcade.dev/mcp-servers/productivity/gmail) [GO\\ \\ Google Calendar\\ \\ Arcade Optimized Toolkit\\ \\ Create, update, delete, and search events in Google Calendar with your agents.](https://docs.arcade.dev/mcp-servers/productivity/google_calendar) [GO\\ \\ Google Contacts\\ \\ Arcade Optimized Toolkit\\ \\ Create and search contacts in Google Contacts with your agents.](https://docs.arcade.dev/mcp-servers/productivity/google_contacts) [GO\\ \\ Google Docs\\ \\ Arcade Optimized Toolkit\\ \\ Create, edit, and get information about Google Docs documents with your agents.](https://docs.arcade.dev/mcp-servers/productivity/google_docs) [GO\\ \\ Google Drive\\ \\ Arcade Optimized Toolkit\\ \\ List documents in Google Drive with your agents.](https://docs.arcade.dev/mcp-servers/productivity/google_drive) [GO\\ \\ Google Finance\\ \\ Arcade Optimized Toolkit\\ \\ Get stock data from Google Finance](https://docs.arcade.dev/mcp-servers/search/google_finance) [GO\\ \\ Google Flights\\ \\ Arcade Optimized Toolkit\\ \\ Search for flights](https://docs.arcade.dev/mcp-servers/search/google_flights) [GO\\ \\ Google Hotels\\ \\ Arcade Optimized Toolkit\\ \\ Search for hotels](https://docs.arcade.dev/mcp-servers/search/google_hotels) [GO\\ \\ Google Jobs\\ \\ Arcade Optimized Toolkit\\ \\ Search for job openings with Google Jobs.](https://docs.arcade.dev/mcp-servers/search/google_jobs) [GO\\ \\ Google Maps\\ \\ Arcade Optimized Toolkit\\ \\ Get directions between two locations with Google Maps](https://docs.arcade.dev/mcp-servers/search/google_maps) [GO\\ \\ Google News\\ \\ Arcade Optimized Toolkit\\ \\ Search for news articles with Google News](https://docs.arcade.dev/mcp-servers/search/google_news) [GO\\ \\ Google Search\\ \\ Arcade Optimized Toolkit\\ \\ Perform Google searches and retrieve relevant information](https://docs.arcade.dev/mcp-servers/search/google_search) [GO\\ \\ Google Sheets\\ \\ Arcade Optimized Toolkit\\ \\ Create, read, and update Google Sheets with your agents.](https://docs.arcade.dev/mcp-servers/productivity/google_sheets) [GO\\ \\ Google Shopping\\ \\ Arcade Optimized Toolkit\\ \\ Search for products on Google Shopping.](https://docs.arcade.dev/mcp-servers/search/google_shopping) [GO\\ \\ Google Slides\\ \\ Arcade Optimized Toolkit\\ \\ Create, read, and update Google Slides with your agents.](https://docs.arcade.dev/mcp-servers/productivity/google_slides) [HU\\ \\ HubSpot\\ \\ Arcade Optimized Toolkit\\ \\ Manage companies, contacts, deals, and more in HubSpot with your agents.](https://docs.arcade.dev/mcp-servers/sales/hubspot) [IM\\ \\ Imgflip\\ \\ Arcade Optimized Toolkit\\ \\ Create memes with Imgflip](https://docs.arcade.dev/mcp-servers/entertainment/imgflip) [LI\\ \\ Linear\\ \\ Arcade Optimized Toolkit\\ \\ Manage issues and projects with your agents.](https://docs.arcade.dev/mcp-servers/productivity/linear) [LI\\ \\ LinkedIn\\ \\ Arcade Optimized Toolkit\\ \\ Connect and interact with LinkedIn's professional network through your agents](https://docs.arcade.dev/mcp-servers/social-communication/linkedin) [MI\\ \\ Microsoft SharePoint\\ \\ Arcade Optimized Toolkit\\ \\ Manage SharePoint sites, lists, drives, and files with your agents.](https://docs.arcade.dev/mcp-servers/productivity/sharepoint) [MI\\ \\ Microsoft Teams\\ \\ Arcade Optimized Toolkit\\ \\ Manage teams, messages, chats, and channels with your agents.](https://docs.arcade.dev/mcp-servers/social-communication/microsoft_teams) [NO\\ \\ Notion\\ \\ Arcade Optimized Toolkit\\ \\ Create, read, and search Notion pages](https://docs.arcade.dev/mcp-servers/productivity/notion) [OU\\ \\ Outlook Calendar\\ \\ Arcade Optimized Toolkit\\ \\ Manage Outlook calendar with your agents](https://docs.arcade.dev/mcp-servers/productivity/outlook_calendar) [OU\\ \\ Outlook Mail\\ \\ Arcade Optimized Toolkit\\ \\ Manage Outlook emails with your agents](https://docs.arcade.dev/mcp-servers/productivity/outlook_mail) [RE\\ \\ Reddit\\ \\ Arcade Optimized Toolkit\\ \\ Interact with Reddit with your agents](https://docs.arcade.dev/mcp-servers/social-communication/reddit) [SA\\ \\ Salesforce\\ \\ Arcade Optimized Toolkit\\ \\ Manage customer relationships and sales with your agents.](https://docs.arcade.dev/mcp-servers/sales/salesforce) [SL\\ \\ Slack\\ \\ Arcade Optimized Toolkit\\ \\ Send and receive messages to Slack channels and users with agents](https://docs.arcade.dev/mcp-servers/social-communication/slack) [SP\\ \\ Spotify\\ \\ Arcade Optimized Toolkit\\ \\ Control music playback and manage playlists on Spotify](https://docs.arcade.dev/mcp-servers/entertainment/spotify) [ST\\ \\ Stripe\\ \\ Arcade Optimized Toolkit\\ \\ Process payments and manage subscriptions with your agents.](https://docs.arcade.dev/mcp-servers/payments/stripe) [WA\\ \\ Walmart Search\\ \\ Arcade Optimized Toolkit\\ \\ Search and get details about products listed on Walmart.](https://docs.arcade.dev/mcp-servers/search/walmart) [X\\ \\ X\\ \\ Arcade Optimized Toolkit\\ \\ Integrate agents with X (Twitter), including tweets, users, and more](https://docs.arcade.dev/mcp-servers/social-communication/x) [YO\\ \\ Youtube Search\\ \\ Arcade Optimized Toolkit\\ \\ Search and get details about YouTube videos.](https://docs.arcade.dev/mcp-servers/search/youtube) [ZE\\ \\ Zendesk\\ \\ Arcade Optimized Toolkit\\ \\ Manage customer support and service with your agents.](https://docs.arcade.dev/mcp-servers/customer-support/zendesk) [ZO\\ \\ Zoom\\ \\ Arcade Optimized Toolkit\\ \\ Join and manage Zoom meetings with your agents](https://docs.arcade.dev/mcp-servers/social-communication/zoom) [TW\\ \\ Twilio\\ \\ Verified Toolkit\\ \\ Send SMS and WhatsApp messages through Twilio's platform](https://docs.arcade.dev/mcp-servers/social-communication/twilio/readme) [CL\\ \\ Clickhouse\\ \\ Community Toolkit\\ \\ Interact with Clickhouse databases with your agents.](https://docs.arcade.dev/mcp-servers/databases/clickhouse) [CL\\ \\ Close.io\\ \\ Community Toolkit\\ \\ Manage leads, contacts, and deals in Close.io CRM](https://docs.arcade.dev/mcp-servers/productivity/closeio) [DI\\ \\ Discord\\ \\ Auth Provider\\ \\ Manage Discord servers, channels, and more with your agents](https://docs.arcade.dev/mcp-servers/social-communication/discord) [JI\\ \\ Jira\\ \\ Auth Provider\\ \\ Manage Jira projects, issues, and more with your agents](https://docs.arcade.dev/mcp-servers/productivity/jira) [MO\\ \\ MongoDB\\ \\ Community Toolkit\\ \\ Interact with MongoDB databases with your agents.](https://docs.arcade.dev/mcp-servers/databases/mongodb) [OB\\ \\ Obsidian\\ \\ Community Toolkit\\ \\ Create, edit, and manage Obsidian notes](https://docs.arcade.dev/mcp-servers/productivity/obsidian) [PO\\ \\ Postgres\\ \\ Community Toolkit\\ \\ Interact with PostgreSQL databases with your agents.](https://docs.arcade.dev/mcp-servers/databases/postgres) [SL\\ \\ Slack API\\ \\ Arcade Starter Toolkit\\ \\ Enable LLMs to interact with the low-level Slack API](https://docs.arcade.dev/mcp-servers/social-communication/slack_api) [TW\\ \\ Twitch\\ \\ Auth Provider\\ \\ Create clips, get videos, and more from Twitch with your agents](https://docs.arcade.dev/mcp-servers/entertainment/twitch) AD ADP Workforce Now Arcade Optimized Toolkit Coming Soon Manage payroll, HR, and workforce data with your agents. AH Aha Arcade Optimized Toolkit Coming Soon Manage product roadmaps and strategy with your agents. AI Airtable Arcade Optimized Toolkit Coming Soon Create, edit, and manage Airtable bases with your agents. AM Amplitude Arcade Optimized Toolkit Coming Soon Analyze user behavior and product analytics with your agents. AS Ashby Arcade Optimized Toolkit Coming Soon Manage recruiting and hiring processes with your agents. AU Auth0 Arcade Optimized Toolkit Coming Soon Manage authentication and authorization with your agents. BA BambooHR Arcade Optimized Toolkit Coming Soon Manage employee data and HR processes with your agents. BA Basecamp Arcade Optimized Toolkit Coming Soon Manage projects, tasks, and team communication with your agents. BI Bill.com Arcade Optimized Toolkit Coming Soon Manage invoices and payments with your agents. BI Bitbucket Arcade Optimized Toolkit Coming Soon Manage repositories, pull requests, and pipelines with your agents. BL Bluesky Arcade Optimized Toolkit Coming Soon Interact with Bluesky with your agents. BO Box Arcade Optimized Toolkit Coming Soon Manage files and folders in Box with your agents. BR Braze Arcade Optimized Toolkit Coming Soon Manage customer engagement campaigns with your agents. BR Brex Arcade Optimized Toolkit Coming Soon Manage business expenses and cards with your agents. BU Buffer Arcade Optimized Toolkit Coming Soon Schedule and manage social media posts with your agents. CA Calendly Arcade Optimized Toolkit Coming Soon Manage scheduling and appointments with your agents. CO Coinbase Arcade Optimized Toolkit Coming Soon Manage cryptocurrency transactions and wallets with your agents. DA Datadog Arcade Optimized Toolkit Coming Soon Monitor applications and infrastructure with your agents. DI DigitalOcean Arcade Optimized Toolkit Coming Soon Manage cloud servers and infrastructure with your agents. EB eBay Arcade Optimized Toolkit Coming Soon Manage listings, orders, and inventory on eBay with your agents. EV Evernote Arcade Optimized Toolkit Coming Soon Create and manage notes with your agents. FA Factorial Arcade Optimized Toolkit Coming Soon Manage HR processes and employee data with your agents. FI Figma Arcade Optimized Toolkit Coming Soon Access design files and collaborate on designs with your agents. GI GitLab Arcade Optimized Toolkit Coming Soon Manage repositories, issues, and merge requests with your agents. HE Heroku Arcade Optimized Toolkit Coming Soon Deploy and manage applications on Heroku with your agents. HO Hootsuite Arcade Optimized Toolkit Coming Soon Manage and schedule social media content with your agents. IN Intercom Arcade Optimized Toolkit Coming Soon Manage customer communications and support with your agents. MA Mailchimp Arcade Optimized Toolkit Coming Soon Manage email campaigns and subscribers with your agents. MI Microsoft Dynamics Arcade Optimized Toolkit Coming Soon Manage CRM and ERP processes with your agents. MI Miro Arcade Optimized Toolkit Coming Soon Create and collaborate on visual boards with your agents. MO Model Context Protocol (MCP) Arcade Optimized Toolkit Coming Soon Manage context and improve AI interactions with your agents. MO Monday Arcade Optimized Toolkit Coming Soon Manage projects and workflows with your agents. NE Netsuite Arcade Optimized Toolkit Coming Soon Manage financial and business operations with your agents. OK Okta Arcade Optimized Toolkit Coming Soon Manage identity and access with your agents. ON OneDrive Arcade Optimized Toolkit Coming Soon Manage OneDrive files and folders with your agents PI Pinecone Arcade Optimized Toolkit Coming Soon Manage vector databases and similarity search with your agents. PI Pinterest Arcade Optimized Toolkit Coming Soon Create and manage pins and boards with your agents. PI Pipedrive Arcade Optimized Toolkit Coming Soon Manage sales pipelines and leads with your agents. PL Plaid Arcade Optimized Toolkit Coming Soon Connect with financial accounts and manage financial data with your agents. QU QuickBooks Arcade Optimized Toolkit Coming Soon Manage accounting and finances with your agents. SH Shopify Arcade Optimized Toolkit Coming Soon Manage e-commerce stores and products with your agents. SI SingleStore Arcade Optimized Toolkit Coming Soon Manage databases and data operations with your agents. SN Snowflake Arcade Optimized Toolkit Coming Soon Manage data warehouses and analytics with your agents. SP Splunk Arcade Optimized Toolkit Coming Soon Monitor and analyze machine data with your agents. SQ Square Arcade Optimized Toolkit Coming Soon Process payments and manage business operations with your agents. SQ Squarespace Arcade Optimized Toolkit Coming Soon Manage websites and online presence with your agents. TI TikTok Arcade Optimized Toolkit Coming Soon Create and manage TikTok content with your agents. TR Trello Arcade Optimized Toolkit Coming Soon Manage boards, cards, and lists with your agents. VE Vercel Arcade Optimized Toolkit Coming Soon Deploy and manage web applications with your agents. WE Weaviate Arcade Optimized Toolkit Coming Soon Manage vector databases and semantic search with your agents. WO Workday Arcade Optimized Toolkit Coming Soon Manage HR, finance, and planning with your agents. WR Wrike Arcade Optimized Toolkit Coming Soon Manage projects and collaborate with your agents. XE Xero Arcade Optimized Toolkit Coming Soon Manage accounting and finances with your agents. [Asana](https://docs.arcade.dev/mcp-servers/productivity/asana "Asana") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Agent Authorization Simplified [Home](https://docs.arcade.dev/home "Home") AuthorizationHow Arcade Helps # How Arcade helps with Agent Authorization ### The challenges that Arcade solves [Permalink for this section](https://docs.arcade.dev/home/auth/how-arcade-helps\#the-challenges-that-arcade-solves) Applications that use models to perform tasks ( _agentic applications_) commonly require access to sensitive data and services. Authentication complexities often hinder AI from performing tasks that require user-specific information, like what emails you recently received or what’s coming up on your calendar. To retrieve this information, agentic applications need to be able to authenticate and authorize access to external services you use like Gmail or Google Calendar. Authenticating to retrieve information, however, is not the only challenge. Agentic applications also need to authenticate in order to **act** on your behalf - like sending an email or updating your calendar. Without auth, AI agents are severely limited in what they can do. ### How Arcade solves this [Permalink for this section](https://docs.arcade.dev/home/auth/how-arcade-helps\#how-arcade-solves-this) Arcade provides an authorization system that handles OAuth 2.0, API keys, and user tokens needed by AI agents to access external services through tools. This means your AI agents can now act on behalf of users securely and privately. With Arcade, developers can now create agents that can _act as the end users of their application_ to perform tasks like: - Creating a new Zoom meeting - Sending or reading email - Answering questions about files in Google Drive. ### Auth permissions and scopes [Permalink for this section](https://docs.arcade.dev/home/auth/how-arcade-helps\#auth-permissions-and-scopes) Each tool in Arcade’s toolkits has a set of required permissions - or, more commonly referred to in OAuth2, **scopes**. For example, the [`Gmail.SendEmail`](https://docs.arcade.dev/mcp-servers/productivity/gmail#gmailsendemail) tool requires the [`https://www.googleapis.com/auth/gmail.send`](https://developers.google.com/identity/protocols/oauth2/scopes#gmail) scope. A scope is what the user has authorized someone else (in this case, the AI agent) to do on their behalf. In any OAuth2-compatible service, each kind of action requires a different set of permissions. This gives the user fine-grained control over what data third-party services can access and what actions can be executed in their accounts. When a tool is called, the Arcade Engine will check if the user has granted the required permissions. If not, it will automatically prompt the user to authorize the tool, coordinating the OAuth2 flow with the service provider. ### How to implement OAuth2-authorized tool calling [Permalink for this section](https://docs.arcade.dev/home/auth/how-arcade-helps\#how-to-implement-oauth2-authorized-tool-calling) To learn how Arcade allows for actions (tools) to be authorized through OAuth2 and how to implement it, check out [Authorized Tool Calling](https://docs.arcade.dev/home/auth/auth-tool-calling). ### Tools that don’t require authorization [Permalink for this section](https://docs.arcade.dev/home/auth/how-arcade-helps\#tools-that-dont-require-authorization) Some tools, like [`GoogleSearch.Search`](https://docs.arcade.dev/mcp-servers/search/google_search#googlesearchsearch), allow AI agents to retrieve information or perform actions without needing user-specific authorization. PythonJavaScript ```nextra-code from arcadepy import Arcade client = Arcade(api_key="arcade_api_key") # or set the ARCADE_API_KEY env var # Use the GoogleSearch.Searchtool to perform a web search response = await client.tools.execute( tool_name="GoogleSearch.Search", input={"query": "Latest AI advancements"}, ) print(response.output.value) ``` [Types of tools](https://docs.arcade.dev/home/use-tools/types-of-tools "Types of tools") [Authorized Tool Calling](https://docs.arcade.dev/home/auth/auth-tool-calling "Authorized Tool Calling") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Dropbox Toolkit Integration [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Productivity & Docs](https://docs.arcade.dev/mcp-servers/productivity/asana "Productivity & Docs") DropboxDropbox # Dropbox **Description:** Enable agents to interact with files and folders in Dropbox. **Author:** Arcade **Code:** [GitHub](https://github.com/ArcadeAI/arcade-ai/tree/main/mcp-servers/dropbox) **Auth:** User authorization [![PyPI Version](https://img.shields.io/pypi/v/arcade_dropbox)](https://pypi.org/project/arcade_dropbox/)[![License](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/arcadeai/arcade-ai/blob/main/LICENSE)[![Python Versions](https://img.shields.io/pypi/pyversions/arcade_dropbox)](https://pypi.org/project/arcade_dropbox/)[![Wheel Status](https://img.shields.io/pypi/wheel/arcade_dropbox)](https://pypi.org/project/arcade_dropbox/)[![Downloads](https://img.shields.io/pypi/dm/arcade_dropbox)](https://pypi.org/project/arcade_dropbox/) The Arcade Dropbox MCP Server provides a pre-built set of tools for interacting with Dropbox. These tools make it easy to build agents and AI apps that can: - Browse files and folders - Search for files and folders - Download files ## Available Tools [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/dropbox/dropbox\#available-tools) | Tool Name | Description | | --- | --- | | Dropbox.ListItemsInFolder | List all items in a folder. | | Dropbox.SearchFilesAndFolders | Search for files and folders in Dropbox. | | Dropbox.DownloadFile | Download a file from Dropbox. | If you need to perform an action that’s not listed here, you can [get in touch\\ with us](mailto:contact@arcade.dev) to request a new tool, or [create your\\ own tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server). ## Dropbox.ListItemsInFolder [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/dropbox/dropbox\#dropboxlistitemsinfolder) See Example > List all items in a folder. **Parameters** - **folder\_path** _(string, required)_ Path to the folder. E.g. ‘/My Documents/My Folder’ - **limit** _(int, optional, Defaults to `100`)_ Maximum number of items to return. Defaults to 100. Maximum allowed is 2000. - **cursor** _(string, optional)_ A cursor to use for pagination. Defaults to `None`. ## Dropbox.SearchFilesAndFolders [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/dropbox/dropbox\#dropboxsearchfilesandfolders) See Example > Search for files and folders in Dropbox. **Parameters** - **keywords** _(string, required)_ The keywords to search for. E.g. ‘quarterly report’ - **search\_in\_folder\_path** _(string, optional)_ Restricts the search to the specified folder path. E.g. ‘/My Documents/My Folder’. Defaults to `None` (search in the entire Dropbox). - **filter\_by\_category** _(list of enum [DropboxItemCategory](https://docs.arcade.dev/mcp-servers/productivity/dropbox/reference#dropboxitemcategory), optional)_ Restricts the search to the specified category(ies) of items. Defaults to `None` (returns all items). - **limit** _(int, optional, Defaults to `100`)_ Maximum number of items to return. Defaults to 100. Maximum allowed is 2000. - **cursor** _(string, optional)_ A cursor to use for pagination. Defaults to `None`. ## Dropbox.DownloadFile [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/dropbox/dropbox\#dropboxdownloadfile) See Example > Download a file from Dropbox. **Parameters** - **file\_path** _(string, optional)_ Path to the file. E.g. ‘/My Documents/My Folder/My File.pdf’ - **file\_id** _(string, optional)_ The ID of the file to download. E.g. ‘id:a4ayc\_80\_OEAAAAAAAAAYa’ Note: to call this tool, you must provide either `file_path` or `file_id`. ## Auth [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/dropbox/dropbox\#auth) The Arcade Dropbox toolkit uses the [Dropbox auth provider](https://docs.arcade.dev/home/auth-providers/dropbox) to connect to users’ Dropbox accounts. With the Arcade Cloud Platform, there’s nothing to configure. Your users will see `Arcade` as the name of the application that’s requesting permission. With a self-hosted installation of Arcade, you need to [configure the Dropbox auth provider](https://docs.arcade.dev/home/auth-providers/dropbox#configuring-dropbox-auth) with your own Dropbox app credentials. ## Get Building [Use tools hosted on Arcade Cloud\\ \\ Arcade tools are hosted by our cloud platform and ready to be used in your agents. Learn how.](https://docs.arcade.dev/home/quickstart) [Self Host Arcade tools\\ \\ Arcade tools can be self-hosted on your own infrastructure. Learn more about self-hosting.\\ \\ ```\\ pip install arcade_dropbox\\ ```](https://docs.arcade.dev/home/hosting-overview) [Confluence](https://docs.arcade.dev/mcp-servers/productivity/confluence "Confluence") [Reference](https://docs.arcade.dev/mcp-servers/productivity/dropbox/reference "Reference") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Linear Auth Provider [Home](https://docs.arcade.dev/home "Home") [Customizing Auth](https://docs.arcade.dev/home/auth-providers "Customizing Auth") Linear # Linear auth provider The Linear auth provider enables tools and agents to call [Linear APIs](https://linear.app/developers/graphql) on behalf of a user. Behind the scenes, the Arcade Engine and the Linear auth provider seamlessly manage Linear OAuth 2.0 authorization for your users. ### What’s documented here [Permalink for this section](https://docs.arcade.dev/home/auth-providers/linear\#whats-documented-here) This page describes how to use and configure Linear auth with Arcade. This auth provider is used by: - Your [app code](https://docs.arcade.dev/home/auth-providers/linear#using-linear-auth-in-app-code) that needs to call the Linear API - Or, your [custom tools](https://docs.arcade.dev/home/auth-providers/linear#using-Linear-auth-in-custom-tools) that need to call the Linear API ## Configuring Linear auth [Permalink for this section](https://docs.arcade.dev/home/auth-providers/linear\#configuring-linear-auth) When using your own app credentials, make sure you configure your project to use a [custom user verifier](https://docs.arcade.dev/home/auth/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 Linear app credentials. This way, your users will see your application’s name requesting permission. You can use your own Linear credentials in both the Arcade Cloud Platform or in a [self-hosted Arcade Engine](https://docs.arcade.dev/home/deployment/engine-configuration) instance. Before showing how to configure your Linear app credentials, let’s go through the steps to create a Linear app. ### Create a Linear app [Permalink for this section](https://docs.arcade.dev/home/auth-providers/linear\#create-a-linear-app) - It is **highly recommended** to first [create a new Linear workspace](https://linear.app/join) for the purpose of managing the OAuth2 Application. - Create a new public OAuth2 Application in your [integration’s settings page](https://linear.app/settings/api/applications/new). - Fill out your application specific information such as application name and description. - Set the Callback URL to the redirect URL generated by Arcade (see below) - Toggle the **Public** switch to enable public access to the application if you want other workspaces to be able to use your application. - Once you complete creating your integration, copy the client ID and client secret to use below. Next, add the Linear app to your Arcade Engine configuration. You can do this in the Arcade Dashboard, or by editing the `engine.yaml` file directly (for a self-hosted instance). ## Configuring your own Linear Auth Provider in Arcade [Permalink for this section](https://docs.arcade.dev/home/auth-providers/linear\#configuring-your-own-linear-auth-provider-in-arcade) There are two ways to configure your Linear app credentials in Arcade: 1. From the Arcade Dashboard GUI 2. By editing the `engine.yaml` file directly (for a self-hosted Arcade Engine) We show both options step-by-step below. Dashboard GUIEngine Configuration YAML ### Configure Linear Auth Using the Arcade Dashboard GUI #### Access the Arcade Dashboard [Permalink for this section](https://docs.arcade.dev/home/auth-providers/linear\#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](http://localhost:9099/dashboard). Adjust the host and port number to match your environment. #### Navigate to the OAuth Providers page [Permalink for this section](https://docs.arcade.dev/home/auth-providers/linear\#navigate-to-the-oauth-providers-page) - Under the **OAuth** section of the Arcade Dashboard left-side menu, click **Providers**. - Click **Add OAuth Provider** in the top right corner. - Select the **Included Providers** tab at the top. - In the **Provider** dropdown, select **Linear**. #### Enter the provider details [Permalink for this section](https://docs.arcade.dev/home/auth-providers/linear\#enter-the-provider-details) - Choose a unique **ID** for your provider (e.g. “my-linear-provider”). - Optionally enter a **Description**. - Enter the **Client ID** and **Client Secret** from your Linear app. - Note the **Redirect URL** generated by Arcade. This must be set as your Linear app’s Callback URL. #### Create the provider [Permalink for this section](https://docs.arcade.dev/home/auth-providers/linear\#create-the-provider) Hit the **Create** button and the provider will be ready to be used. When you use tools that require Linear auth using your Arcade account credentials, the Arcade Engine will automatically use this Linear OAuth provider. If you have multiple Linear providers, see [using multiple auth providers of the same type](https://docs.arcade.dev/home/auth-providers#using-multiple-providers-of-the-same-type) for more information. ## Using Linear auth in app code [Permalink for this section](https://docs.arcade.dev/home/auth-providers/linear\#using-linear-auth-in-app-code) Use the Linear auth provider in your own agents and AI apps to get a user token for the Linear API. See [authorizing agents with Arcade](https://docs.arcade.dev/home/auth/how-arcade-helps) to understand how this works. Use `client.auth.start()` to get a user token for the Linear API: PythonJavaScript ```nextra-code 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="linear", scopes=[\ "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... ``` ## Using Linear auth in custom tools [Permalink for this section](https://docs.arcade.dev/home/auth-providers/linear\#using-linear-auth-in-custom-tools) You can use the pre-built [Arcade Linear toolkit](https://docs.arcade.dev/mcp-servers/productivity/linear) to quickly build agents and AI apps that interact with Linear. If the pre-built tools in the Linear toolkit don’t meet your needs, you can author your own [custom tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server) that interact with the Linear API. Use the `Linear()` auth class to specify that a tool requires authorization with Linear. The `context.authorization.token` field will be automatically populated with the user’s Linear token: ```nextra-code from typing import Annotated, Any from arcade_tdk import ToolContext, tool from arcade_tdk.auth import Linear import httpx @tool(requires_auth=Linear(scopes=["read"])) async def get_teams(context: ToolContext) -> Annotated[dict[str, Any], "Teams in the workspace with member information"]: """Get Linear teams and team information including team members""" token = context.get_auth_token_or_empty() url = "https://api.linear.app/graphql" headers = { "Authorization": f"Bearer {token}", "Content-Type": "application/json", "Accept": "application/json", } query = """ query Teams { teams { nodes { id name key } } } """ async with httpx.AsyncClient() as client: resp = await client.post(url, json={"query": query}, headers=headers) resp.raise_for_status() data = resp.json() teams = data["data"]["teams"]["nodes"] return teams ``` [Hubspot](https://docs.arcade.dev/home/auth-providers/hubspot "Hubspot") [Linkedin](https://docs.arcade.dev/home/auth-providers/linkedin "Linkedin") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Arcade Toolkit Installation [Home](https://docs.arcade.dev/home "Home") Local Deployment [Install](https://docs.arcade.dev/home/deployment/engine-configuration "Install") Toolkits # Install a tool or toolkit ## Running a Local worker [Permalink for this section](https://docs.arcade.dev/home/local-deployment/install/toolkits\#running-a-local-worker) To run a local worker without the arcade engine, you can run the following command locally: ```nextra-code arcade serve ``` This will check for any toolkits installed in the current python virtual environment and register them with the worker. You can also pass in the `--host` and `--port` flags to specify the host and port to run the worker on. The default host is `127.0.0.1` and the default port is `8002`. ## PyPI Installation [Permalink for this section](https://docs.arcade.dev/home/local-deployment/install/toolkits\#pypi-installation) All Arcade toolkits are available on PyPI. To install a toolkit, run the following in the same python virtual environment as the arcade-ai package: ```nextra-code pip install arcade-[toolkit_name] ``` For example, to install the math toolkit, run: ```nextra-code pip install arcade-math ``` To verify the installation, run: ```nextra-code arcade show --local ``` which should return output similar to: ```nextra-code ┏━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━┓ ┃ Name ┃ Description ┃ Toolkit ┃ Version ┃ ┡━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━┩ │ Math.Add │ Add two numbers together │ Math │ 0.1.0 │ └──────────────┴──────────────────────────────┴─────────┴─────────┘ ``` These are all tools that are installed in the same python virtual environment as the arcade-ai package. See our [Toolkits Overview page](https://docs.arcade.dev/toolkits) for all available toolkits and individual installation instructions. ## Local Package Installation [Permalink for this section](https://docs.arcade.dev/home/local-deployment/install/toolkits\#local-package-installation) Locally built toolkits can also be installed with: ```nextra-code pip install . ``` or ```nextra-code pip install ``` in the same python virtual environment as the arcade-ai package. ## Hosted Toolkits [Permalink for this section](https://docs.arcade.dev/home/local-deployment/install/toolkits\#hosted-toolkits) To add a toolkit to a hosted worker such as FastAPI, you can register them in the worker itself. This allows you to explicitly define which tools should be included on a particular worker. ```nextra-code import arcade_math from fastapi import FastAPI from arcade_tdk import Toolkit from arcade_serve.fastapi import FastAPIWorker app = FastAPI() worker_secret = os.environ.get("ARCADE_WORKER_SECRET") worker = FastAPIWorker(app, secret=worker_secret) worker.register_toolkit(Toolkit.from_module(arcade_math)) ``` ## Showing Tools From a Hosted Engine [Permalink for this section](https://docs.arcade.dev/home/local-deployment/install/toolkits\#showing-tools-from-a-hosted-engine) To show all tools that are available on an engine, you can run ```nextra-code arcade show -h -p ``` ```nextra-code ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━┓ ┃ Name ┃ Description ┃ Package ┃ Version ┃ ┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━┩ │ Github.CountStargazers │ Count the number of stargazers (stars) for a GitHub repository. │ Github │ 0.0.15 │ │ Github.CreateIssue │ Create an issue in a GitHub repository. │ Github │ 0.0.15 │ │ Github.CreateIssueComment │ Create a comment on an issue in a GitHub repository. │ Github │ 0.0.15 │ │ Github.CreateReplyForReviewComment │ Create a reply to a review comment for a pull request. │ Github │ 0.0.15 │ │ Github.CreateReviewComment │ Create a review comment for a pull request in a GitHub repository. │ Github │ 0.0.15 │ │ Github.GetPullRequest │ Get details of a pull request in a GitHub repository. │ Github │ 0.0.15 │ │ Github.GetRepository │ Get a repository. │ Github │ 0.0.15 │ .... ``` ## Authenticated Tools [Permalink for this section](https://docs.arcade.dev/home/local-deployment/install/toolkits\#authenticated-tools) Some Toolkits may need authentication through an API key or OAuth, which can be configured in the Arcade Engine. To see the specific configuration requirements, you can checkout our [Auth Providers](https://docs.arcade.dev/home/auth-providers). [Docker](https://docs.arcade.dev/home/local-deployment/install/docker "Docker") [Overview](https://docs.arcade.dev/home/deployment/on-prem-mcp "Overview") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Arcade FAQ [Home](https://docs.arcade.dev/home "Home") FAQ # Frequently Asked Questions ## What if I need a Tool that Arcade doesn’t have? [Permalink for this section](https://docs.arcade.dev/home/faq\#what-if-i-need-a-tool-that-arcade-doesnt-have) Arcade makes it easy to build your own tools! You can fork our existing tools, or build your own from scratch. Learn more about [building your own toolkit](https://docs.arcade.dev/home/build-tools/create-a-mcp-server). ## How do I contribute back a Tool to the Registry? [Permalink for this section](https://docs.arcade.dev/home/faq\#how-do-i-contribute-back-a-tool-to-the-registry) We’re always looking for new tools and toolkits! If you have a tool that you think would be useful to others, please let us know. You can contribute a tool by submitting a pull request to the [Arcade GitHub repository](https://github.com/ArcadeAI/arcade-ai). ## What is the difference between the Arcade CLI and the Arcade Clients? [Permalink for this section](https://docs.arcade.dev/home/faq\#what-is-the-difference-between-the-arcade-cli-and-the-arcade-clients) The [Arcade CLI](https://docs.arcade.dev/home/arcade-cli) is a command line tool that makes it easy to build, test, and deploy your own tools to production. The [Arcade Client libraries](https://docs.arcade.dev/home/arcade-clients) are what you will use within your own agents and applications to call the tools. ## How does Arcade.dev relate to the Model Context Protocol (MCP)? [Permalink for this section](https://docs.arcade.dev/home/faq\#how-does-arcadedev-relate-to-the-model-context-protocol-mcp) The Arcade.dev engine both speaks MCP and extends it with an authentication-first architecture. This means that you can use Arcade.dev to build tools that can be called by any LLM that supports MCP, while also providing a secure and easy way to authenticate users and manage access to those tools. Learn more about [Arcade.dev and MCP](https://docs.arcade.dev/home/mcp-overview). ## Auth FAQ [Permalink for this section](https://docs.arcade.dev/home/faq\#auth-faq) ### What is the difference between adding an included provider and adding a custom provider? [Permalink for this section](https://docs.arcade.dev/home/faq\#what-is-the-difference-between-adding-an-included-provider-and-adding-a-custom-provider) This is an important observation. Technically, both included and custom providers are OAuth providers. However, when you add an included provider, the Arcade Engine requires less information from you to configure the provider, because it can use the values defined by that provider on their official documentation. Also, most importantly, the Engine will automatically route tools so they connect to the added provider. ### Can my users connect multiple accounts of the same provider? [Permalink for this section](https://docs.arcade.dev/home/faq\#can-my-users-connect-multiple-accounts-of-the-same-provider) Please [contact us](mailto:support@arcade.dev) if you need this feature. ### Can I authenticate multiple tools at once? [Permalink for this section](https://docs.arcade.dev/home/faq\#can-i-authenticate-multiple-tools-at-once) Yes, as long as they are from the same OAuth provider. You need to collect all the scopes required by the tools you need, and then authenticate with that provider with all these scopes. For example, for [Google\\ Tools](https://docs.arcade.dev/home/auth-providers/google), you can use this code to authenticate once: PythonJavaScript ```nextra-code from arcadepy import Arcade client = Arcade() # Automatically finds the `ARCADE_API_KEY` env variable USER_ID = "{arcade_user_id}" # get the list of tools tools = client.tools.list(toolkit="Gmail") # collect the scopes scopes = set() for tool in tools: if tool.requirements.authorization.oauth2.scopes: scopes |= set(tool.requirements.authorization.oauth2.scopes) # start auth auth_response = client.auth.start(user_id=USER_ID, scopes=list(scopes), provider="google") # show the url to the user if needed if auth_response.status != "complete": print(f"Please click here to authorize: {auth_response.url}") # Wait for the authorization to complete client.auth.wait_for_completion(auth_response) ``` ### Can I use broader OAuth scopes than what a tool requires? [Permalink for this section](https://docs.arcade.dev/home/faq\#can-i-use-broader-oauth-scopes-than-what-a-tool-requires) Yes! If you need broader permissions than what a tool defines as its minimum requirement, you can request additional scopes during authentication. For example, the `GoogleDrive.SearchFiles` tool requires the `/auth/drive.file` scope (which only searches files created by your app or selected via file picker), but if you have approval for the broader `/auth/drive` scope, you can authenticate with both scopes to search all files on Google Drive. The tool will work with the broader permissions while still satisfying its minimum scope requirement. Here’s how to authenticate with multiple scopes: PythonJavaScript ```nextra-code from arcadepy import Arcade client = Arcade() # Automatically finds the `ARCADE_API_KEY` env variable user_id = "{arcade_user_id}" auth_response = client.auth.start( user_id=user_id, provider="google", scopes=[\ "https://www.googleapis.com/auth/drive.file",\ "https://www.googleapis.com/auth/drive"\ ] ) ``` After authentication, call `GoogleDrive.SearchFiles` as usual and it will be able to search all files using the broader token permissions. ## Your question is not here? [Permalink for this section](https://docs.arcade.dev/home/faq\#your-question-is-not-here) Please go to the discussions page on GitHub. Someone else may have asked something similar already. If not, please start a new discussion and we’ll get to it as soon as possible. [Get Answers on GitHub](https://github.com/ArcadeAI/arcade-ai/discussions) [Glossary](https://docs.arcade.dev/home/glossary "Glossary") [Changelog](https://docs.arcade.dev/home/changelog "Changelog") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Arcade Google ADK Integration [Home](https://docs.arcade.dev/home "Home") Google ADKOverview # Arcade with Google ADK The `google-adk-arcade` package provides a seamless integration between [Arcade](https://arcade.dev/) and the [Google ADK](https://github.com/google/adk-python/). This integration allows you to enhance your AI agents with powerful Arcade tools including Google Mail, LinkedIn, GitHub, and many more. ## Installation [Permalink for this section](https://docs.arcade.dev/home/google-adk/overview\#installation) Install the necessary packages to get started: ```nextra-code pip install google-adk-arcade ``` Make sure you have your Arcade API key ready. [Get an API key](https://docs.arcade.dev/home/api-keys) if you don’t already have one. ## Key features [Permalink for this section](https://docs.arcade.dev/home/google-adk/overview\#key-features) - **Easy integration** with the Google ADK framework - **Access to all Arcade toolkits** including Google, GitHub, LinkedIn, X, and more - **Create custom tools** with the Arcade Tool SDK - **Manage user authentication** for tools that require it - **Asynchronous support** compatible with Google’s ADK framework ## Basic usage [Permalink for this section](https://docs.arcade.dev/home/google-adk/overview\#basic-usage) Here’s a simple example of using Arcade tools with OpenAI Agents: ```nextra-code import asyncio from arcadepy import AsyncArcade from google.adk import Agent, Runner from google.adk.artifacts import InMemoryArtifactService from google.adk.sessions import InMemorySessionService from google.genai import types from google_adk_arcade.tools import get_arcade_tools async def main(): app_name = 'my_app' user_id = '{arcade_user_id}' session_service = InMemorySessionService() artifact_service = InMemoryArtifactService() client = AsyncArcade() google_tools = await get_arcade_tools(client, tools=["Gmail.ListEmails"]) # authorize the tools for tool in google_tools: result = await client.tools.authorize( tool_name=tool.name, user_id=user_id ) if result.status != "completed": print(f"Click this link to authorize {tool.name}:\n{result.url}") await client.auth.wait_for_completion(result) # create the agent google_agent = Agent( model="gemini-2.0-flash", name="google_tool_agent", instruction="I can use Google tools to manage an inbox!", description="An agent equipped with tools to read Gmail emails." tools=google_tools, ) #create the session and pass the user ID to the state session = await session_service.create_session( app_name=app_name, user_id=user_id, state={ "user_id": user_id, } ) runner = Runner( app_name=app_name, agent=google_agent, artifact_service=artifact_service, session_service=session_service, ) user_input = "summarize my latest 3 emails" content = types.Content( role='user', parts=[types.Part.from_text(text=user_input)] ) for event in runner.run( user_id=user_id, session_id=session.id, new_message=content, ): if event.content.parts and event.content.parts[0].text: print(f'** {event.author}: {event.content.parts[0].text}') if __name__ == '__main__': asyncio.run(main()) ``` ## Handling authorization [Permalink for this section](https://docs.arcade.dev/home/google-adk/overview\#handling-authorization) When a user needs to authorize access to a tool (like Google or GitHub), the agent will reply with a URL for the user to visit, which will be displayed to the user. After visiting the URL and authorizing access, the user can run the agent again with the same `user_id`, and it will work without requiring re-authorization. Alternatively, you can authorize the tool before running the agent: ```nextra-code # authorize the tools for tool in google_tools: result = await client.tools.authorize( tool_name=tool.name, user_id=user_id ) if result.status != "completed": print(f"Click this link to authorize {tool.name}:\n{result.url}") await client.auth.wait_for_completion(result) ``` ## Available toolkits [Permalink for this section](https://docs.arcade.dev/home/google-adk/overview\#available-toolkits) Arcade provides a variety of toolkits you can use with your agents: - **Google Suite**: Gmail, Calendar, Drive, Docs - **Social Media**: LinkedIn, X - **Development**: GitHub - **Web**: Web search, content extraction - **And more**: Weather, financial data, etc. For a full list of available toolkits, visit the [Arcade Toolkits](https://docs.arcade.dev/toolkits) documentation. ## Next steps [Permalink for this section](https://docs.arcade.dev/home/google-adk/overview\#next-steps) Ready to start building with Arcade and OpenAI Agents? Check out these guides: - [Using Arcade tools](https://docs.arcade.dev/home/google-adk/use-arcade-tools) \- Learn the basics of using Arcade tools with Google ADK - [Creating custom tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server) \- Build your own tools with the Arcade Tool SDK Enjoy exploring Arcade and building powerful AI-enabled applications! [Custom auth flow](https://docs.arcade.dev/home/crewai/custom-auth-flow "Custom auth flow") [Using Arcade tools](https://docs.arcade.dev/home/google-adk/use-arcade-tools "Using Arcade tools") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Create Evaluation Suite [Home](https://docs.arcade.dev/home "Home") [Evaluate tools](https://docs.arcade.dev/home/evaluate-tools/why-evaluate-tools "Evaluate tools") Create an evaluation suite # Evaluate tools In this guide, you’ll learn how to evaluate your custom tools to ensure they function correctly with the AI assistant, including defining evaluation cases and using different critics. We’ll create evaluation cases to test our `hello` tool and measure its performance. ### Prerequisites [Permalink for this section](https://docs.arcade.dev/home/evaluate-tools/create-an-evaluation-suite\#prerequisites) - [Build a custom tool](https://docs.arcade.dev/home/build-tools/create-a-mcp-server) - Install the evaluation dependencies: uvpip ```nextra-code uv pip install 'arcade-ai[evals]' ``` ### Create an evaluation suite [Permalink for this section](https://docs.arcade.dev/home/evaluate-tools/create-an-evaluation-suite\#create-an-evaluation-suite) Navigate to your toolkit’s `evals` directory: ```nextra-code cd arcade_my_new_toolkit/evals ``` Create a new Python file for your evaluations, e.g., `eval_hello.py`. ### Define your evaluation cases [Permalink for this section](https://docs.arcade.dev/home/evaluate-tools/create-an-evaluation-suite\#define-your-evaluation-cases) Open `eval_hello.py` and add the following code: ```nextra-code from arcade_evals import ( EvalSuite, EvalRubric, ExpectedToolCall, BinaryCritic, tool_eval, ) from arcade_tdk import ToolCatalog from arcade_my_new_toolkit.tools.hello import hello # Create a catalog of tools to include in the evaluation catalog = ToolCatalog() catalog.add_tool(hello) # Define the evaluation rubric rubric = EvalRubric( fail_threshold=0.8, warn_threshold=0.9, ) @tool_eval() def hello_eval_suite() -> EvalSuite: """Create an evaluation suite for the hello tool.""" suite = EvalSuite( name="Hello Tool Evaluation", system_message="You are a helpful assistant.", catalog=catalog, rubric=rubric, ) # Example evaluation case suite.add_case( name="Simple Greeting", user_message="Say hello to Alice", expected_tool_calls=[\ ExpectedToolCall(\ func=hello,\ args={\ "name": "Alice",\ },\ )\ ], critics=[\ BinaryCritic(critic_field="name", weight=1.0),\ ], ) return suite ``` ### Run the evaluation [Permalink for this section](https://docs.arcade.dev/home/evaluate-tools/create-an-evaluation-suite\#run-the-evaluation) From the `evals` directory, run: ```nextra-code arcade evals . ``` This command executes your evaluation suite and provides a report. ### How it works [Permalink for this section](https://docs.arcade.dev/home/evaluate-tools/create-an-evaluation-suite\#how-it-works) The evaluation framework in Arcade allows you to define test cases ( `EvalCase`) with expected tool calls and use critics to assess the AI’s performance. By running the evaluation suite, you can measure how well the AI assistant is using your tools. ### Next steps [Permalink for this section](https://docs.arcade.dev/home/evaluate-tools/create-an-evaluation-suite\#next-steps) Explore different types of critics and evaluation criteria to thoroughly test your tools. [Learn more about Critic classes](https://docs.arcade.dev/home/evaluate-tools/create-an-evaluation-suite#critic-classes) ## Critic classes [Permalink for this section](https://docs.arcade.dev/home/evaluate-tools/create-an-evaluation-suite\#critic-classes) Arcade provides several critic classes to evaluate different aspects of tool usage. ### BinaryCritic [Permalink for this section](https://docs.arcade.dev/home/evaluate-tools/create-an-evaluation-suite\#binarycritic) Checks if a parameter value matches exactly. ```nextra-code BinaryCritic(critic_field="name", weight=1.0) ``` ### SimilarityCritic [Permalink for this section](https://docs.arcade.dev/home/evaluate-tools/create-an-evaluation-suite\#similaritycritic) Evaluates the similarity between expected and actual values. ```nextra-code from arcade_evals import SimilarityCritic SimilarityCritic(critic_field="message", weight=1.0) ``` ### NumericCritic [Permalink for this section](https://docs.arcade.dev/home/evaluate-tools/create-an-evaluation-suite\#numericcritic) Assesses numeric values within a specified tolerance. ```nextra-code from arcade_evals import NumericCritic NumericCritic(critic_field="score", tolerance=0.1, weight=1.0) ``` ### DatetimeCritic [Permalink for this section](https://docs.arcade.dev/home/evaluate-tools/create-an-evaluation-suite\#datetimecritic) Evaluates the closeness of datetime values within a specified tolerance. ```nextra-code from datetime import timedelta from arcade_evals import DatetimeCritic DatetimeCritic(critic_field="start_time", tolerance=timedelta(seconds=10), weight=1.0) ``` ## Advanced evaluation cases [Permalink for this section](https://docs.arcade.dev/home/evaluate-tools/create-an-evaluation-suite\#advanced-evaluation-cases) You can add more evaluation cases to test different scenarios. ### Example: Greeting with emotion [Permalink for this section](https://docs.arcade.dev/home/evaluate-tools/create-an-evaluation-suite\#example-greeting-with-emotion) Modify your `hello` tool to accept an `emotion` parameter: ```nextra-code from arcade_tdk import tool from typing import Annotated class Emotion(str, Enum): HAPPY = "happy" SLIGHTLY_HAPPY = "slightly happy" SAD = "sad" SLIGHTLY_SAD = "slightly sad" @tool def hello( name: Annotated[str, "The name of the person to greet"] = "there", emotion: Annotated[Emotion, "The emotion to convey"] = Emotion.HAPPY ) -> Annotated[str, "A greeting to the user"]: """ Say hello to the user with a specific emotion. """ return f"Hello {name}! I'm feeling {emotion.value} today." ``` Add an evaluation case for this new parameter: ```nextra-code suite.add_case( name="Greeting with Emotion", user_message="Say hello to Bob sadly", expected_tool_calls=[\ ExpectedToolCall(\ func=hello,\ args={\ "name": "Bob",\ "emotion": Emotion.SAD,\ },\ )\ ], critics=[\ BinaryCritic(critic_field="name", weight=0.5),\ SimilarityCritic(critic_field="emotion", weight=0.5),\ ], ) ``` Add an evaluation case with additional conversation context: ```nextra-code suite.add_case( name="Greeting with Emotion", user_message="Say hello to Bob based on my current mood.", expected_tool_calls=[\ ExpectedToolCall(\ func=hello,\ args={\ "name": "Bob",\ "emotion": Emotion.HAPPY,\ },\ )\ ], critics=[\ BinaryCritic(critic_field="name", weight=0.5),\ SimilarityCritic(critic_field="emotion", weight=0.5),\ ], # Add some context to the evaluation case additional_messages= [\ {"role": "user", "content": "Hi, I'm so happy!"},\ {\ "role": "assistant",\ "content": "That’s awesome! What’s got you feeling so happy today?",\ },\ ] ) ``` Add an evalutation case with multiple expected tool calls: ```nextra-code suite.add_case( name="Greeting with Emotion", user_message="Say hello to Bob based on my current mood. And then say hello to Alice with slightly less of that emotion.", expected_tool_calls=[\ ExpectedToolCall(\ func=hello,\ args={\ "name": "Bob",\ "emotion": Emotion.HAPPY,\ },\ ),\ ExpectedToolCall(\ func=hello,\ args={\ "name": "Alice",\ "emotion": Emotion.SLIGHTLY_HAPPY,\ },\ )\ ], critics=[\ BinaryCritic(critic_field="name", weight=0.5),\ SimilarityCritic(critic_field="emotion", weight=0.5),\ ], # Add some context to the evaluation case additional_messages= [\ {"role": "user", "content": "Hi, I'm so happy!"},\ {\ "role": "assistant",\ "content": "That’s awesome! What’s got you feeling so happy today?",\ },\ ] ) ``` * * * Ensure that your `hello` tool and evaluation cases are updated accordingly and that you rerun `arcade evals .` to test your changes. [Why evaluate tools?](https://docs.arcade.dev/home/evaluate-tools/why-evaluate-tools "Why evaluate tools?") [Run evaluations](https://docs.arcade.dev/home/evaluate-tools/run-evaluations "Run evaluations") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## ClickUp Toolkit [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Productivity & Docs](https://docs.arcade.dev/mcp-servers/productivity/asana "Productivity & Docs") Clickup # Clickup **Description:** Enable agents to interact with Clickup **Author:** Arcade **Auth:** User authorization [![PyPI Version](https://img.shields.io/pypi/v/arcade_clickup)](https://pypi.org/project/arcade_clickup/)[![License](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/arcadeai/arcade-ai/blob/main/LICENSE)[![Python Versions](https://img.shields.io/pypi/pyversions/arcade_clickup)](https://pypi.org/project/arcade_clickup/)[![Wheel Status](https://img.shields.io/pypi/wheel/arcade_clickup)](https://pypi.org/project/arcade_clickup/)[![Downloads](https://img.shields.io/pypi/dm/arcade_clickup)](https://pypi.org/project/arcade_clickup/) The ClickUp MCP Server provides tools to interact with ClickUp workspaces, projects (spaces/folders/lists), tasks, comments, and members. It enables building agents and apps that can: - Discover workspace structure and users. - Create, view, and modify tasks. - Manage task assignments and task planning metadata. - Work with comments and threaded replies. - Search for containers and people by approximate name when location is unknown. - Retrieve guidance for agent decision-making. ## Available Tools [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/clickup\#available-tools) | Tool Name | Description | | --- | --- | | Clickup.GetTaskCommentReplies | Get threaded replies for a specific ClickUp comment with pagination support. | | Clickup.CreateTaskCommentReply | Create a new threaded reply to an existing ClickUp comment. | | Clickup.CreateTask | Create a new task in a ClickUp list with optional planning metadata. | | Clickup.GetTaskById | Get detailed information about a specific task by its ID. Also supports custom task IDs | | Clickup.UpdateTask | Update one or more fields of an existing ClickUp task. | | Clickup.GetTasksByScope | Get filtered tasks from ClickUp with advanced filtering options. | | Clickup.GetTasksByAssignees | Get filtered tasks assigned to specific team members with advanced filtering options. | | Clickup.UpdateTaskAssignees | Update task assignees by adding and/or removing specific users. | | Clickup.GetSpaces | Retrieve spaces from a ClickUp workspace. | | Clickup.GetFoldersForSpace | Retrieve folders (also called directories, project categories, or project areas) from a | | Clickup.GetListsForFolder | Retrieve task lists from a ClickUp folder (when users refer to a folder as a directory, | | Clickup.GetListsForSpace | Retrieve all task lists from a ClickUp space by collecting lists from all folders within the | | Clickup.GetStatusesForList | Retrieve the possible task statuses for a specific ClickUp list. | | Clickup.GetMembersForWorkspace | Retrieve all team members from a specific ClickUp workspace. | | Clickup.WhoAmI | Return current user profile and accessible workspaces (teams). | | Clickup.GetSystemGuidance | Return static guidance intended solely to help agents make informed decisions. | | Clickup.GetWorkspaceInsights | Return a brief overview for a workspace using the latest updated tasks to inform the user. | | Clickup.GetTaskComments | Get comments for a specific ClickUp task with pagination support. | | Clickup.CreateTaskComment | Create a new comment on a ClickUp task with optional assignment. | | Clickup.UpdateTaskComment | Update an existing comment on a ClickUp task. | | Clickup.FuzzySearchTasksByName | Search for tasks using fuzzy matching on task names. | | Clickup.FuzzySearchListsByName | Search for lists using fuzzy matching on list names. | | Clickup.FuzzySearchFoldersByName | Search for folders using fuzzy matching on folder names. | | Clickup.FuzzySearchMembersByName | Search for workspace members using fuzzy matching on member names. | If you need to perform an action that’s not listed here, you can [get in touch\\ with us](mailto:contact@arcade.dev) to request a new tool, or [create your\\ own tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server). ## Clickup.GetTaskCommentReplies [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/clickup\#clickupgettaskcommentreplies) See Example > Get threaded replies for a specific ClickUp comment with pagination support. **Parameters** - **comment\_id** ( `string`, required) The ClickUp comment ID to get replies for - **offset** ( `integer`, optional) Starting position for offset-based retrieval (default: 0) - **limit** ( `integer`, optional) Maximum number of replies to return (max: 50, default: 20) ## Clickup.CreateTaskCommentReply [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/clickup\#clickupcreatetaskcommentreply) See Example > Create a new threaded reply to an existing ClickUp comment. **Parameters** - **comment\_id** ( `string`, required) The ClickUp comment ID to reply to - **reply\_text** ( `string`, required) The text content of the reply - **assignee\_id** ( `integer`, optional) User ID to assign the reply to ## Clickup.CreateTask [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/clickup\#clickupcreatetask) See Example > Create a new task in a ClickUp list with optional planning metadata. **Parameters** - **list\_id** ( `string`, required) The ClickUp list ID where the task will be created - **task\_title** ( `string`, required) The name/title of the task - **description** ( `string`, optional) The description/content of the task - **priority** ( `Enum` [TaskPriority](https://docs.arcade.dev/mcp-servers/productivity/clickup/reference#TaskPriority), optional) Task priority - **status** ( `string`, optional) Task status label (string) - **parent\_task\_id** ( `string`, optional) The parent task ID if this is a subtask - **start\_date** ( `string`, optional) Date string in format YYYY-MM-DD or YYYY-MM-DD HH:MM\[:SS\]; ISO-8601 also supported - **due\_date** ( `string`, optional) Date string in format YYYY-MM-DD or YYYY-MM-DD HH:MM\[:SS\]; ISO-8601 also supported - **sprint\_points** ( `integer`, optional) The sprint points for the task ## Clickup.GetTaskById [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/clickup\#clickupgettaskbyid) See Example > Get detailed information about a specific task by its ID. Also supports custom task IDs **Parameters** - **task\_id** ( `string`, required) The task ID or custom task ID to retrieve - **include\_subtasks** ( `boolean`, optional) Include subtask information (default: false ) - **workspace\_id\_for\_custom\_id** ( `string`, optional) The ClickUp workspace ID (provide this to use custom task IDs) ## Clickup.UpdateTask [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/clickup\#clickupupdatetask) See Example > Update one or more fields of an existing ClickUp task. **Parameters** - **task\_id** ( `string`, required) The ClickUp task ID to update - **task\_title** ( `string`, optional) The new name/title of the task - **description** ( `string`, optional) The new description/content of the task - **priority** ( `Enum` [TaskPriority](https://docs.arcade.dev/mcp-servers/productivity/clickup/reference#TaskPriority), optional) Task priority - **status** ( `string`, optional) Task status label (string) - **parent\_task\_id** ( `string`, optional) The new parent task ID - **start\_date** ( `string`, optional) Date string in format YYYY-MM-DD or YYYY-MM-DD HH:MM\[:SS\]; ISO-8601 also supported - **due\_date** ( `string`, optional) Date string in format YYYY-MM-DD or YYYY-MM-DD HH:MM\[:SS\]; ISO-8601 also supported - **sprint\_points** ( `integer`, optional) The new sprint points for the task ## Clickup.GetTasksByScope [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/clickup\#clickupgettasksbyscope) See Example > Get filtered tasks from ClickUp with advanced filtering options. **Parameters** - **workspace\_id** ( `string`, required) The ClickUp workspace ID for GUI URL generation (should be a number) - **scope** ( `Enum` [FilterScope](https://docs.arcade.dev/mcp-servers/productivity/clickup/reference#FilterScope), required) The scope to filter tasks by (all, spaces, folders, or lists) - **item\_ids** ( `array[string]`, optional) List of IDs to get tasks from (required for spaces/folders/lists, ignored for ‘all’) - **offset** ( `integer`, optional) Starting position for offset-based retrieval (default: 0) - **limit** ( `integer`, optional) Maximum number of tasks to return (max: 50, default: 20) - **order\_by** ( `Enum` [TaskOrderBy](https://docs.arcade.dev/mcp-servers/productivity/clickup/reference#TaskOrderBy), optional) Field to sort tasks by - **should\_sort\_by\_reverse** ( `boolean`, optional) Whether to sort in descending order (default: False) - **statuses** ( `array[string]`, optional) List of status strings to filter by - **include\_closed** ( `boolean`, optional) Whether to include closed tasks (default: False) - **due\_date\_gt** ( `string`, optional) Due date greater than (date string in format YYYY-MM-DD or YYYY-MM-DD HH:MM\[:SS\]) - **due\_date\_lt** ( `string`, optional) Due date less than (date string in format YYYY-MM-DD or YYYY-MM-DD HH:MM\[:SS\]) - **date\_created\_gt** ( `string`, optional) Created date greater than (date string in format YYYY-MM-DD or YYYY-MM-DD HH:MM\[:SS\]) - **date\_created\_lt** ( `string`, optional) Created date less than (date string in format YYYY-MM-DD or YYYY-MM-DD HH:MM\[:SS\]) ## Clickup.GetTasksByAssignees [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/clickup\#clickupgettasksbyassignees) See Example > Get filtered tasks assigned to specific team members with advanced filtering options. **Parameters** - **workspace\_id** ( `string`, required) The ClickUp workspace ID for GUI URL generation (should be a number) - **assignees\_ids** ( `array[integer]`, required) List of assignee user IDs to get tasks for - **offset** ( `integer`, optional) Starting position for offset-based retrieval (default: 0) - **limit** ( `integer`, optional) Maximum number of tasks to return (max: 50, default: 20) - **order\_by** ( `Enum` [TaskOrderBy](https://docs.arcade.dev/mcp-servers/productivity/clickup/reference#TaskOrderBy), optional) Field to sort tasks by - **should\_sort\_by\_reverse** ( `boolean`, optional) Whether to sort in descending order (default: False) - **statuses** ( `array[string]`, optional) List of status strings to filter by - **include\_closed** ( `boolean`, optional) Whether to include closed tasks (default: False) - **due\_date\_gt** ( `string`, optional) Due date greater than (date string in format YYYY-MM-DD or YYYY-MM-DD HH:MM\[:SS\]) - **due\_date\_lt** ( `string`, optional) Due date less than (date string in format YYYY-MM-DD or YYYY-MM-DD HH:MM\[:SS\]) - **date\_created\_gt** ( `string`, optional) Created date greater than (date string in format YYYY-MM-DD or YYYY-MM-DD HH:MM\[:SS\]) - **date\_created\_lt** ( `string`, optional) Created date less than (date string in format YYYY-MM-DD or YYYY-MM-DD HH:MM\[:SS\]) ## Clickup.UpdateTaskAssignees [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/clickup\#clickupupdatetaskassignees) See Example > Update task assignees by adding and/or removing specific users. **Parameters** - **task\_id** ( `string`, required) The ClickUp task ID to update assignees for - **assignee\_ids\_to\_add** ( `array[integer]`, optional) List of user IDs to add as assignees - **assignee\_ids\_to\_remove** ( `array[integer]`, optional) List of user IDs to remove from assignees ## Clickup.GetSpaces [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/clickup\#clickupgetspaces) See Example > Retrieve spaces from a ClickUp workspace. **Parameters** - **workspace\_id** ( `string`, required) The ClickUp workspace ID to get spaces from (should be a number) - **offset** ( `integer`, optional) Starting position for offset-based retrieval (default: 0) - **limit** ( `integer`, optional) Maximum number of spaces to return (max: 50, default: 50) - **include\_archived** ( `boolean`, optional) Whether to include archived spaces (default: False) ## Clickup.GetFoldersForSpace [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/clickup\#clickupgetfoldersforspace) See Example > Retrieve folders (also called directories, project categories, or project areas) from a **Parameters** - **space\_id** ( `string`, required) The ClickUp space ID to get folders from - **workspace\_id** ( `string`, required) The ClickUp workspace ID for GUI URL generation (should be a number) - **offset** ( `integer`, optional) Starting position for offset-based retrieval (default: 0) - **limit** ( `integer`, optional) Maximum number of folders to return (max: 50, default: 50) - **include\_archived** ( `boolean`, optional) Whether to include archived, inactive, or deleted folders (default: False) ## Clickup.GetListsForFolder [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/clickup\#clickupgetlistsforfolder) See Example > Retrieve task lists from a ClickUp folder (when users refer to a folder as a “directory”, **Parameters** - **folder\_id** ( `string`, required) The ClickUp folder ID (also called directory ID) to get lists from - **workspace\_id** ( `string`, required) The ClickUp workspace ID for GUI URL generation (should be a number) - **offset** ( `integer`, optional) Starting position for offset-based retrieval (default: 0) - **limit** ( `integer`, optional) Maximum number of lists to return (max: 50, default: 50) - **include\_archived** ( `boolean`, optional) Whether to include archived, inactive, or completed lists (default: False) ## Clickup.GetListsForSpace [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/clickup\#clickupgetlistsforspace) See Example > Retrieve all task lists from a ClickUp space by collecting lists from all folders within the **Parameters** - **space\_id** ( `string`, required) The ClickUp space ID to get lists from - **workspace\_id** ( `string`, required) The ClickUp workspace ID for GUI URL generation (should be a number) - **offset** ( `integer`, optional) Starting position for offset-based retrieval (default: 0) - **limit** ( `integer`, optional) Maximum number of lists to return (max: 50, default: 50) - **include\_archived** ( `boolean`, optional) Whether to include archived, inactive, or completed lists (default: False) ## Clickup.GetStatusesForList [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/clickup\#clickupgetstatusesforlist) See Example > Retrieve the possible task statuses for a specific ClickUp list. **Parameters** - **list\_id** ( `string`, required) The ClickUp list ID to retrieve possible task statuses for ## Clickup.GetMembersForWorkspace [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/clickup\#clickupgetmembersforworkspace) See Example > Retrieve all team members from a specific ClickUp workspace. **Parameters** - **workspace\_id** ( `string`, required) The ID of the ClickUp workspace to get team members from (should be a number) - **offset** ( `integer`, optional) Starting position for offset-based retrieval (default: 0) - **limit** ( `integer`, optional) Maximum number of members to return (max: 50, default: 50) ## Clickup.WhoAmI [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/clickup\#clickupwhoami) See Example > Return current user profile and accessible workspaces (teams). **Parameters** This tool does not take any parameters. ## Clickup.GetSystemGuidance [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/clickup\#clickupgetsystemguidance) See Example > Return static guidance intended solely to help agents make informed decisions. **Parameters** This tool does not take any parameters. ## Clickup.GetWorkspaceInsights [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/clickup\#clickupgetworkspaceinsights) See Example > Return a brief overview for a workspace using the latest updated tasks to inform the user. **Parameters** - **workspace\_id** ( `string`, required) The ClickUp workspace ID to summarize (should be a number) ## Clickup.GetTaskComments [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/clickup\#clickupgettaskcomments) See Example > Get comments for a specific ClickUp task with pagination support. **Parameters** - **task\_id** ( `string`, required) The ClickUp task ID to get comments for - **limit** ( `integer`, optional) Number of comments to retrieve (max 25, default: 5) - **oldest\_comment\_id** ( `string`, optional) ID of the oldest comment from previous call for pagination ## Clickup.CreateTaskComment [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/clickup\#clickupcreatetaskcomment) See Example > Create a new comment on a ClickUp task with optional assignment. **Parameters** - **task\_id** ( `string`, required) The ClickUp task ID to add a comment to - **comment\_text** ( `string`, required) The text content of the comment - **assignee\_id** ( `integer`, optional) User ID to assign the comment to (optional) ## Clickup.UpdateTaskComment [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/clickup\#clickupupdatetaskcomment) See Example > Update an existing comment on a ClickUp task. **Parameters** - **comment\_id** ( `string`, required) The ClickUp comment ID to update - **task\_id** ( `string`, required) The ClickUp task ID the comment belongs to - **comment\_text** ( `string`, optional) New text content for the comment (optional) - **assignee\_id** ( `integer`, optional) User ID to assign the comment to (optional) - **resolution** ( `Enum` [CommentResolution](https://docs.arcade.dev/mcp-servers/productivity/clickup/reference#CommentResolution), optional) Set comment resolution status (optional) ## Clickup.FuzzySearchTasksByName [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/clickup\#clickupfuzzysearchtasksbyname) See Example > Search for tasks using fuzzy matching on task names. **Parameters** - **name\_to\_search** ( `string`, required) Task name to search for (minimum 6 characters) - **workspace\_id** ( `string`, required) The workspace ID to search tasks in (should be a number) - **scan\_size** ( `integer`, optional) Number of recent tasks to scan (max 500 default: 500) - **include\_closed** ( `boolean`, optional) Include closed/completed tasks (default: false) - **statuses** ( `array[string]`, optional) Filter by specific ClickUp status names. Each list has its own statuses set. - **assignee\_ids** ( `array[string]`, optional) Filter by assignee user IDs - **space\_ids** ( `array[string]`, optional) Filter by ClickUp space IDs - limit search to specific spaces/teams - **folder\_ids** ( `array[string]`, optional) Filter by ClickUp folder IDs - limit search to specific folders/projects - **list\_ids** ( `array[string]`, optional) Filter by ClickUp list IDs - limit search to specific lists - **limit** ( `integer`, optional) Maximum number of matches to return (max: 50, default: 10) ## Clickup.FuzzySearchListsByName [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/clickup\#clickupfuzzysearchlistsbyname) See Example > Search for lists using fuzzy matching on list names. **Parameters** - **name\_to\_search** ( `string`, required) List name to search for (minimum 6 characters) - **workspace\_id** ( `string`, required) The workspace ID to search lists in (should be a number) - **scan\_size** ( `integer`, optional) Number of lists to scan (in increments of 100, max 500 default: 500) - **space\_ids** ( `array[string]`, optional) Filter by ClickUp space IDs - limit search to specific spaces/teams - **folder\_ids** ( `array[string]`, optional) Filter by ClickUp folder IDs - limit search to specific folders/projects - **should\_include\_archived** ( `boolean`, optional) Include archived lists (default: false) - **limit** ( `integer`, optional) Maximum number of matches to return (max: 50, default: 10) ## Clickup.FuzzySearchFoldersByName [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/clickup\#clickupfuzzysearchfoldersbyname) See Example > Search for folders using fuzzy matching on folder names. **Parameters** - **name\_to\_search** ( `string`, required) Folder name to search for (minimum 6 characters) - **workspace\_id** ( `string`, required) The workspace ID to search folders in (should be a number) - **scan\_size** ( `integer`, optional) Number of folders to scan (in increments of 100, max 500 default: 500) - **space\_ids** ( `array[string]`, optional) Filter by ClickUp space IDs - limit search to specific spaces/teams - **should\_include\_archived** ( `boolean`, optional) Include archived folders (default: false) - **limit** ( `integer`, optional) Maximum number of matches to return (max: 50, default: 10) ## Clickup.FuzzySearchMembersByName [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/clickup\#clickupfuzzysearchmembersbyname) See Example > Search for workspace members using fuzzy matching on member names. **Parameters** - **name\_to\_search** ( `string`, required) Member name to search for (minimum 6 characters) - **workspace\_id** ( `string`, required) The workspace ID to search members in (should be a number) - **scan\_size** ( `integer`, optional) Number of members to scan (in increments of 100, max 500 default: 500) - **limit** ( `integer`, optional) Maximum number of matches to return (max: 50, default: 10) ## Reference [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/clickup\#reference) Below is a reference of enumerations used by some of the tools in the Clickup toolkit: ## TaskPriority [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/clickup\#taskpriority) - **URGENT**: `URGENT` - **HIGH**: `HIGH` - **NORMAL**: `NORMAL` - **LOW**: `LOW` ## FilterScope [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/clickup\#filterscope) - **ALL**: `all` - **SPACES**: `spaces` - **FOLDERS**: `folders` - **LISTS**: `lists` ## TaskOrderBy [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/clickup\#taskorderby) - **CREATED**: `created` - **UPDATED**: `updated` - **DUE\_DATE**: `due_date` ## CommentResolution [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/clickup\#commentresolution) - **SET\_AS\_RESOLVED**: `resolved` - **SET\_AS\_UNRESOLVED**: `unresolved` ## Auth [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/clickup\#auth) The Arcade Clickup toolkit uses the [Clickup auth provider](https://docs.arcade.dev/home/auth-providers/clickup) to connect to users’ Clickup accounts. Please refer to the [Clickup auth provider](https://docs.arcade.dev/home/auth-providers/clickup) documentation to learn how to configure auth. ## Get Building [Use tools hosted on Arcade Cloud\\ \\ Arcade tools are hosted by our cloud platform and ready to be used in your agents. Learn how.](https://docs.arcade.dev/home/quickstart) [Self Host Arcade tools\\ \\ Arcade tools can be self-hosted on your own infrastructure. Learn more about self-hosting.\\ \\ ```\\ pip install arcade_clickup\\ ```](https://docs.arcade.dev/home/hosting-overview) [Reference](https://docs.arcade.dev/mcp-servers/productivity/outlook_mail/reference "Reference") [Reference](https://docs.arcade.dev/mcp-servers/productivity/clickup/reference "Reference") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## GitHub Toolkit Integration [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Developer Tools](https://docs.arcade.dev/mcp-servers/development/e2b "Developer Tools") GitHubGitHub # GitHub **Description:** Enable agents to interact with GitHub repositories, issues, and pull requests. **Author:** Arcade **Auth:** User authorizationvia the [GitHub auth provider](https://docs.arcade.dev/home/auth-providers/github) [![PyPI Version](https://img.shields.io/pypi/v/arcade_github)](https://pypi.org/project/arcade_github/)[![License](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/arcadeai/arcade-ai/blob/main/LICENSE)[![Python Versions](https://img.shields.io/pypi/pyversions/arcade_github)](https://pypi.org/project/arcade_github/)[![Wheel Status](https://img.shields.io/pypi/wheel/arcade_github)](https://pypi.org/project/arcade_github/)[![Downloads](https://img.shields.io/pypi/dm/arcade_github)](https://pypi.org/project/arcade_github/) The Arcade GitHub MCP Server provides a pre-built set of tools for interacting with GitHub. These tools make it easy to build agents and AI apps that can: - Access private repositories (with the user’s permission) - Get info about repositories, issues, pull requests, and more - Post issues, comments, and replies as the user ## Available Tools [Permalink for this section](https://docs.arcade.dev/mcp-servers/development/github/github\#available-tools) These tools are currently available in the Arcade GitHub toolkit. | Tool Name | Description | | --- | --- | | Github.SetStarred | Star or unstar a GitHub repository. | | Github.ListStargazers | List the stargazers of a GitHub repository. | | Github.CreateIssue | Create an issue in a GitHub repository. | | Github.CreateIssueComment | Create a comment on an issue in a GitHub repository. | | Github.ListPullRequests | List pull requests in a GitHub repository. | | Github.GetPullRequest | Get details of a pull request in a GitHub repository. | | Github.UpdatePullRequest | Update a pull request in a GitHub repository. | | Github.ListPullRequestCommits | List commits on a pull request in a GitHub repository. | | Github.CreateReplyForReviewComment | Create a reply to a review comment on a pull request. | | Github.ListReviewCommentsOnPullRequest | List review comments on a pull request. | | Github.CreateReviewComment | Create a review comment on a pull request. | | Github.CountStargazers | Count the number of stargazers for a GitHub repository. | | Github.ListOrgRepositories | List repositories of a GitHub organization. | | Github.GetRepository | Get details of a GitHub repository. | | Github.ListRepositoryActivities | List activities of a GitHub repository. | | Github.ListReviewCommentsInARepository | List review comments in a repository. | If you need to perform an action that’s not listed here, you can [get in touch\\ with us](mailto:contact@arcade.dev) to request a new tool, or [create your\\ own tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server) with the [GitHub auth\\ provider](https://docs.arcade.dev/home/auth-providers/github#using-github-auth-in-customtools). ## Github.SetStarred [Permalink for this section](https://docs.arcade.dev/mcp-servers/development/github/github\#githubsetstarred) See Example > Star or unstar a GitHub repository. **Parameters** - **`owner`** _(string, required)_ The owner of the repository. - **`name`** _(string, required)_ The name of the repository. - **`starred`** _(boolean, required)_ Whether to star ( `true`) or unstar ( `false`) the repository. * * * ## Github.ListStargazers [Permalink for this section](https://docs.arcade.dev/mcp-servers/development/github/github\#githubliststargazers) See Example > List the stargazers of a GitHub repository. **Parameters** - **`owner`** _(string, required)_ The owner of the repository. - **`repo`** _(string, required)_ The name of the repository. - **`limit`** _(int, optional, Defaults to `None`)_ The maximum number of stargazers to return. If not provided, all stargazers will be returned. * * * ## Github.CreateIssue [Permalink for this section](https://docs.arcade.dev/mcp-servers/development/github/github\#githubcreateissue) See Example > Create an issue in a GitHub repository. **Parameters** - **`owner`** _(string, required)_ The account owner of the repository. The name is not case sensitive. - **`repo`** _(string, required)_ The name of the repository without the .git extension. The name is not case sensitive. - **`title`** _(string, required)_ The title of the issue. - **`body`** _(string, optional)_ The contents of the issue. - **`assignees`** _(array of strings, optional)_ Logins for Users to assign to this issue. - **`milestone`** _(integer, optional)_ The number of the milestone to associate this issue with. - **`labels`** _(array of strings, optional)_ Labels to associate with this issue. - **`include_extra_data`** _(boolean, optional, Defaults to `false`)_ If true, return all the data available about the issue. This is a large payload and may impact performance - use with caution. * * * ## Github.CreateIssueComment [Permalink for this section](https://docs.arcade.dev/mcp-servers/development/github/github\#githubcreateissuecomment) See Example > Create a comment on an issue in a GitHub repository. **Parameters** - **`owner`** _(string, required)_ The account owner of the repository. The name is not case sensitive. - **`repo`** _(string, required)_ The name of the repository without the .git extension. The name is not case sensitive. - **`issue_number`** _(integer, required)_ The number that identifies the issue. - **`body`** _(string, required)_ The contents of the comment. - **`include_extra_data`** _(boolean, optional, Defaults to `false`)_ If true, return all the data available about the comment. This is a large payload and may impact performance - use with caution. * * * ## Github.ListPullRequests [Permalink for this section](https://docs.arcade.dev/mcp-servers/development/github/github\#githublistpullrequests) See Example > List pull requests in a GitHub repository. **Parameters** - **`owner`** _(string, required)_ The account owner of the repository. The name is not case sensitive. - **`repo`** _(string, required)_ The name of the repository without the .git extension. The name is not case sensitive. - **`state`** _(enum ( [PRState](https://docs.arcade.dev/mcp-servers/development/github/reference#prstate)), optional, Defaults to `PRState.OPEN`)_ The state of the pull requests to return. - **`head`** _(string, optional)_ Filter pulls by head user or head organization and branch name in the format of user:ref-name or organization:ref-name. - **`base`** _(string, optional, Defaults to `'main'`)_ Filter pulls by base branch name. - **`sort`** _(enum ( [PRSortProperty](https://docs.arcade.dev/mcp-servers/development/github/reference#prsortproperty)), optional, Defaults to `PRSortProperty.CREATED`)_ The property to sort the results by. - **`direction`** _(enum ( [SortDirection](https://docs.arcade.dev/mcp-servers/development/github/reference#sortdirection)), optional)_ The direction of the sort. - **`per_page`** _(integer, optional, Defaults to `30`)_ The number of results per page (max 100). - **`page`** _(integer, optional, Defaults to `1`)_ The page number of the results to fetch. - **`include_extra_data`** _(boolean, optional, Defaults to `false`)_ If true, return all the data available about the pull requests. This is a large payload and may impact performance - use with caution. * * * ## Github.GetPullRequest [Permalink for this section](https://docs.arcade.dev/mcp-servers/development/github/github\#githubgetpullrequest) See Example > Get details of a pull request in a GitHub repository. **Parameters** - **`owner`** _(string, required)_ The account owner of the repository. The name is not case sensitive. - **`repo`** _(string, required)_ The name of the repository without the .git extension. The name is not case sensitive. - **`pull_number`** _(integer, required)_ The number that identifies the pull request. - **`include_diff_content`** _(boolean, optional, Defaults to `false`)_ If true, return the diff content of the pull request. - **`include_extra_data`** _(boolean, optional, Defaults to `false`)_ If true, return all the data available about the pull requests. This is a large payload and may impact performance - use with caution. * * * ## Github.UpdatePullRequest [Permalink for this section](https://docs.arcade.dev/mcp-servers/development/github/github\#githubupdatepullrequest) See Example > Update a pull request in a GitHub repository. **Parameters** - **`owner`** _(string, required)_ The account owner of the repository. The name is not case sensitive. - **`repo`** _(string, required)_ The name of the repository without the .git extension. The name is not case sensitive. - **`pull_number`** _(integer, required)_ The number that identifies the pull request. - **`title`** _(string, optional)_ The title of the pull request. - **`body`** _(string, optional)_ The contents of the pull request. - **`state`** _(enum ( [PRState](https://docs.arcade.dev/mcp-servers/development/github/reference#prstate)), optional)_ State of this Pull Request. Either open or closed. - **`base`** _(string, optional)_ The name of the branch you want your changes pulled into. - **`maintainer_can_modify`** _(boolean, optional)_ Indicates whether maintainers can modify the pull request. * * * ## Github.ListPullRequestCommits [Permalink for this section](https://docs.arcade.dev/mcp-servers/development/github/github\#githublistpullrequestcommits) See Example > List commits (from oldest to newest) on a pull request in a GitHub repository. **Parameters** - **`owner`** _(string, required)_ The account owner of the repository. The name is not case sensitive. - **`repo`** _(string, required)_ The name of the repository without the .git extension. The name is not case sensitive. - **`pull_number`** _(integer, required)_ The number that identifies the pull request. - **`per_page`** _(integer, optional, Defaults to `30`)_ The number of results per page (max 100). - **`page`** _(integer, optional, Defaults to `1`)_ The page number of the results to fetch. - **`include_extra_data`** _(boolean, optional, Defaults to `false`)_ If true, return all the data available about the pull requests. This is a large payload and may impact performance - use with caution. * * * ## Github.CreateReplyForReviewComment [Permalink for this section](https://docs.arcade.dev/mcp-servers/development/github/github\#githubcreatereplyforreviewcomment) See Example > Create a reply to a review comment for a pull request in a GitHub repository. **Parameters** - **`owner`** _(string, required)_ The account owner of the repository. The name is not case sensitive. - **`repo`** _(string, required)_ The name of the repository without the .git extension. The name is not case sensitive. - **`pull_number`** _(integer, required)_ The number that identifies the pull request. - **`comment_id`** _(integer, required)_ The unique identifier of the comment to reply to. - **`body`** _(string, required)_ The text of the reply comment. * * * ## Github.ListReviewCommentsOnPullRequest [Permalink for this section](https://docs.arcade.dev/mcp-servers/development/github/github\#githublistreviewcommentsonpullrequest) See Example > List review comments on a pull request in a GitHub repository. **Parameters** - **`owner`** _(string, required)_ The account owner of the repository. The name is not case sensitive. - **`repo`** _(string, required)_ The name of the repository without the .git extension. The name is not case sensitive. - **`pull_number`** _(integer, required)_ The number that identifies the pull request. - **`sort`** _(enum ( [ReviewCommentSortProperty](https://docs.arcade.dev/mcp-servers/development/github/reference#reviewcommentsortproperty)), optional, Defaults to `'created'`)_ The property to sort the results by. Can be one of: `created`, `updated`. - **`direction`** _(enum ( [SortDirection](https://docs.arcade.dev/mcp-servers/development/github/reference#sortdirection)), optional, Defaults to `'desc'`)_ The direction to sort results. Can be one of: `asc`, `desc`. - **`since`** _(string, optional)_ Only show results that were last updated after the given time. This is a timestamp in ISO 8601 format: YYYY-MM-DDTHH:MM:SSZ. - **`per_page`** _(integer, optional, Defaults to `30`)_ The number of results per page (max 100). - **`page`** _(integer, optional, Defaults to `1`)_ The page number of the results to fetch. - **`include_extra_data`** _(boolean, optional, Defaults to `false`)_ If true, return all the data available about the pull requests. This is a large payload and may impact performance - use with caution. * * * ## Github.CreateReviewComment [Permalink for this section](https://docs.arcade.dev/mcp-servers/development/github/github\#githubcreatereviewcomment) See Example > Create a review comment for a pull request in a GitHub repository. If the subject\_type is not ‘file’, then the start\_line and end\_line parameters are required. If the subject\_type is ‘file’, then the start\_line and end\_line parameters are ignored. If the commit\_id is not provided, the latest commit SHA of the PR’s base branch will be used. **Parameters** - **`owner`** _(string, required)_ The account owner of the repository. The name is not case sensitive. - **`repo`** _(string, required)_ The name of the repository without the .git extension. The name is not case sensitive. - **`pull_number`** _(integer, required)_ The number that identifies the pull request. - **`body`** _(string, required)_ The text of the review comment. - **`path`** _(string, required)_ The relative path to the file that necessitates a comment. - **`commit_id`** _(string, optional)_ The SHA of the commit needing a comment. If not provided, the latest commit SHA of the PR’s base branch will be used. - **`start_line`** _(integer, optional)_ The start line of the range of lines in the pull request diff that the comment applies to. Required unless ‘subject\_type’ is ‘file’. - **`end_line`** _(integer, optional)_ The end line of the range of lines in the pull request diff that the comment applies to. Required unless ‘subject\_type’ is ‘file’. - **`side`** _(enum ( [DiffSide](https://docs.arcade.dev/mcp-servers/development/github/reference#diffside)), optional, Defaults to `'RIGHT'`)_ The side of the diff that the pull request’s changes appear on. Use LEFT for deletions that appear in red. Use RIGHT for additions that appear in green or unchanged lines that appear in white and are shown for context. - **`start_side`** _(string, optional)_ The starting side of the diff that the comment applies to. - **`subject_type`** _(enum ( [ReviewCommentSubjectType](https://docs.arcade.dev/mcp-servers/development/github/reference#reviewcommentsubjecttype)), optional, Defaults to `'FILE'`)_ The type of subject that the comment applies to. Can be one of: file, hunk, or line. - **`include_extra_data`** _(boolean, optional, Defaults to `false`)_ If true, return all the data available about the review comment. This is a large payload and may impact performance - use with caution. * * * ## Github.CountStargazers [Permalink for this section](https://docs.arcade.dev/mcp-servers/development/github/github\#githubcountstargazers) See Example > Count the number of stargazers (stars) for a GitHub repository. **Parameters** - **`owner`** _(string, required)_ The owner of the repository. - **`name`** _(string, required)_ The name of the repository. * * * ## Github.ListOrgRepositories [Permalink for this section](https://docs.arcade.dev/mcp-servers/development/github/github\#githublistorgrepositories) See Example > List repositories for the specified GitHub organization. **Parameters** - **`org`** _(string, required)_ The organization name. The name is not case sensitive. - **`repo_type`** _(enum ( [RepoType](https://docs.arcade.dev/mcp-servers/development/github/reference#repotype)), optional, Defaults to `'ALL'`)_ The types of repositories to return. - **`sort`** _(enum ( [RepoSortProperty](https://docs.arcade.dev/mcp-servers/development/github/reference#reposortproperty)), optional, Defaults to `'CREATED'`)_ The property to sort the results by. - **`sort_direction`** _(enum ( [SortDirection](https://docs.arcade.dev/mcp-servers/development/github/reference#sortdirection)), optional, Defaults to `'ASC'`)_ The order to sort by. - **`per_page`** _(integer, optional, Defaults to `30`)_ The number of results per page. - **`page`** _(integer, optional, Defaults to `1`)_ The page number of the results to fetch. - **`include_extra_data`** _(boolean, optional, Defaults to `false`)_ If true, return all the data available about the repositories. This is a large payload and may impact performance - use with caution. * * * ## Github.GetRepository [Permalink for this section](https://docs.arcade.dev/mcp-servers/development/github/github\#githubgetrepository) See Example > Get detailed information about a GitHub repository. **Parameters** - **`owner`** _(string, required)_ The account owner of the repository. The name is not case sensitive. - **`repo`** _(string, required)_ The name of the repository without the .git extension. The name is not case sensitive. - **`include_extra_data`** _(boolean, optional, Defaults to `false`)_ If true, return all the data available about the repository. This is a large payload and may impact performance - use with caution. * * * ## Github.ListRepositoryActivities [Permalink for this section](https://docs.arcade.dev/mcp-servers/development/github/github\#githublistrepositoryactivities) See Example > List repository activities such as pushes, merges, force pushes, and branch changes. Retrieves a detailed history of changes to a repository, such as pushes, merges, force pushes, and branch changes,and associates these changes with commits and users. **Parameters** - **`owner`** _(string, required)_ The account owner of the repository. The name is not case sensitive. - **`repo`** _(string, required)_ The name of the repository without the .git extension. The name is not case sensitive. - **`direction`** _(enum ( [SortDirection](https://docs.arcade.dev/mcp-servers/development/github/reference#sortdirection)), optional, Defaults to `'DESC'`)_ The direction to sort the results by. - **`per_page`** _(integer, optional, Defaults to `30`)_ The number of results per page (max 100). - **`before`** _(string, optional)_ A cursor (unique identifier, e.g., a SHA of a commit) to search for results before this cursor. - **`after`** _(string, optional)_ A cursor (unique identifier, e.g., a SHA of a commit) to search for results after this cursor. - **`ref`** _(string, optional)_ The Git reference for the activities you want to list. Can be formatted as `refs/heads/BRANCH_NAME` or just `BRANCH_NAME`. - **`actor`** _(string, optional)_ The GitHub username to filter by the actor who performed the activity. - **`time_period`** _(enum ( [RepoTimePeriod](https://docs.arcade.dev/mcp-servers/development/github/reference#repotimeperiod)), optional)_ The time period to filter by. - **`activity_type`** _(enum ( [ActivityType](https://docs.arcade.dev/mcp-servers/development/github/reference#activitytype)), optional)_ The activity type to filter by. - **`include_extra_data`** _(boolean, optional, Defaults to `false`)_ If true, return all the data available about the activities. This is a large payload and may impact performance - use with caution. * * * ## Github.ListReviewCommentsInARepository [Permalink for this section](https://docs.arcade.dev/mcp-servers/development/github/github\#githublistreviewcommentsinarepository) See Example > List review comments in a GitHub repository. **Parameters** - **`owner`** _(string, required)_ The account owner of the repository. The name is not case sensitive. - **`repo`** _(string, required)_ The name of the repository without the .git extension. The name is not case sensitive. - **`sort`** _(enum ( [ReviewCommentSortProperty](https://docs.arcade.dev/mcp-servers/development/github/reference#reviewcommentsortproperty)), optional, Defaults to `'created'`)_ The property to sort the results by. Can be one of: created, updated. - **`direction`** _(enum ( [SortDirection](https://docs.arcade.dev/mcp-servers/development/github/reference#sortdirection)), optional, Defaults to `'DESC'`)_ The direction to sort results. Ignored without sort parameter. Can be one of: asc, desc. - **`since`** _(string, optional)_ Only show results that were last updated after the given time. This is a timestamp in ISO 8601 format: YYYY-MM-DDTHH:MM:SSZ. - **`per_page`** _(integer, optional, Defaults to `30`)_ The number of results per page (max 100). - **`page`** _(integer, optional, Defaults to `1`)_ The page number of the results to fetch. - **`include_extra_data`** _(boolean, optional, Defaults to `false`)_ If true, return all the data available about the pull requests. This is a large payload and may impact performance - use with caution. * * * ## Auth [Permalink for this section](https://docs.arcade.dev/mcp-servers/development/github/github\#auth) The Arcade GitHub toolkit uses the [GitHub auth provider](https://docs.arcade.dev/home/auth-providers/github) to connect to users’ GitHub accounts. With the Arcade Cloud Platform, there’s nothing to configure. Your users will see `Arcade` as the name of the application that’s requesting permission. With a self-hosted installation of Arcade, you need to [configure the GitHub auth provider](https://docs.arcade.dev/home/auth-providers/github#configuring-github-auth) with your own GitHub app credentials. ## Get Building [Use tools hosted on Arcade Cloud\\ \\ Arcade tools are hosted by our cloud platform and ready to be used in your agents. Learn how.](https://docs.arcade.dev/home/quickstart) [Self Host Arcade tools\\ \\ Arcade tools can be self-hosted on your own infrastructure. Learn more about self-hosting.\\ \\ ```\\ pip install arcade_github\\ ```](https://docs.arcade.dev/home/hosting-overview) [E2B](https://docs.arcade.dev/mcp-servers/development/e2b "E2B") [Reference](https://docs.arcade.dev/mcp-servers/development/github/reference "Reference") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Spotify Auth Provider [Home](https://docs.arcade.dev/home "Home") [Customizing Auth](https://docs.arcade.dev/home/auth-providers "Customizing Auth") Spotify # Spotify auth provider At this time, Arcade does not offer a default Spotify Auth Provider. To use Spotify auth, you must create a custom Auth Provider with your own Spotify OAuth 2.0 credentials as described below. The Spotify auth provider enables tools and agents to call the Spotify API on behalf of a user. Behind the scenes, the Arcade Engine and the Spotify auth provider seamlessly manage Spotify OAuth 2.0 authorization for your users. ### What’s documented here [Permalink for this section](https://docs.arcade.dev/home/auth-providers/spotify\#whats-documented-here) This page describes how to use and configure Spotify auth with Arcade. This auth provider is used by: - Your [app code](https://docs.arcade.dev/home/auth-providers/spotify#using-spotify-auth-in-app-code) that needs to call Spotify APIs - Or, your [custom tools](https://docs.arcade.dev/home/auth-providers/spotify#using-spotify-auth-in-custom-tools) that need to call Spotify APIs ## Configuring Spotify auth [Permalink for this section](https://docs.arcade.dev/home/auth-providers/spotify\#configuring-spotify-auth) When using your own app credentials, make sure you configure your project to use a [custom user verifier](https://docs.arcade.dev/home/auth/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 Spotify app credentials. This way, your users will see your application’s name requesting permission. You can use your own Spotify credentials in both the Arcade Cloud Platform or in a [self-hosted Arcade Engine](https://docs.arcade.dev/home/deployment/engine-configuration) instance. Before showing how to configure your Spotify app credentials, let’s go through the steps to create a Spotify app. ### Create a Spotify app [Permalink for this section](https://docs.arcade.dev/home/auth-providers/spotify\#create-a-spotify-app) - Follow Spotify’s guide to [registering an app](https://developer.spotify.com/documentation/web-api/tutorials/getting-started) - Choose the “Web API” product (at a minimum) - 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 Spotify app to your Arcade Engine configuration. You can do this in the Arcade Dashboard, or by editing the `engine.yaml` file directly (for a self-hosted instance). ## Configuring your own Spotify Auth Provider in Arcade [Permalink for this section](https://docs.arcade.dev/home/auth-providers/spotify\#configuring-your-own-spotify-auth-provider-in-arcade) There are two ways to configure your Spotify app credentials in Arcade: 1. From the Arcade Dashboard GUI 2. By editing the `engine.yaml` file directly (for a self-hosted Arcade Engine) We show both options step-by-step below. Dashboard GUIEngine Configuration YAML ### Configure Spotify Auth Using the Arcade Dashboard GUI #### Access the Arcade Dashboard [Permalink for this section](https://docs.arcade.dev/home/auth-providers/spotify\#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](http://localhost:9099/dashboard). Adjust the host and port number to match your environment. #### Navigate to the OAuth Providers page [Permalink for this section](https://docs.arcade.dev/home/auth-providers/spotify\#navigate-to-the-oauth-providers-page) - Under the **OAuth** section of the Arcade Dashboard left-side menu, click **Providers**. - Click **Add OAuth Provider** in the top right corner. - Select the **Included Providers** tab at the top. - In the **Provider** dropdown, select **Spotify**. #### Enter the provider details [Permalink for this section](https://docs.arcade.dev/home/auth-providers/spotify\#enter-the-provider-details) - Choose a unique **ID** for your provider (e.g. “my-spotify-provider”). - Optionally enter a **Description**. - Enter the **Client ID** and **Client Secret** from your Spotify app. - Note the **Redirect URL** generated by Arcade. This must be set as your Spotify app’s redirect URL. #### Create the provider [Permalink for this section](https://docs.arcade.dev/home/auth-providers/spotify\#create-the-provider) Hit the **Create** button and the provider will be ready to be used. When you use tools that require Spotify auth using your Arcade account credentials, the Arcade Engine will automatically use this Spotify OAuth provider. If you have multiple Spotify providers, see [using multiple auth providers of the same type](https://docs.arcade.dev/home/auth-providers#using-multiple-providers-of-the-same-type) for more information. ## Using Spotify auth in app code [Permalink for this section](https://docs.arcade.dev/home/auth-providers/spotify\#using-spotify-auth-in-app-code) Use the Spotify auth provider in your own agents and AI apps to get a user token for the Spotify API. See [authorizing agents with Arcade](https://docs.arcade.dev/home/auth/how-arcade-helps) to understand how this works. Use `client.auth.start()` to get a user token for the Spotify API: PythonJavaScript ```nextra-code 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="spotify", scopes=["user-read-playback-state"], ) 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... ``` ## Using Spotify auth in custom tools [Permalink for this section](https://docs.arcade.dev/home/auth-providers/spotify\#using-spotify-auth-in-custom-tools) You can author your own [custom tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server) that interact with the Spotify API. Use the `Spotify()` auth class to specify that a tool requires authorization with Spotify. The `context.authorization.token` field will be automatically populated with the user’s Spotify token: ```nextra-code from typing import Annotated import httpx from arcade_tdk import ToolContext, tool from arcade_tdk.auth import Spotify @tool( requires_auth=Spotify( scopes=["user-read-playback-state"], ) ) async def get_playback_state( context: ToolContext, ) -> Annotated[dict, "Information about the user's current playback state"]: """Get information about the user's current playback state, including track or episode, progress, and active device.""" endpoint = "/me/player" headers = {"Authorization": f"Bearer {context.authorization.token}"} async with httpx.AsyncClient() as client: response = await client.get( f"https://api.spotify.com/v1/{endpoint}", headers=headers, ) response.raise_for_status() if response.status_code == 204: return {"status": "Playback not available or active"} return response.json() ``` [Slack](https://docs.arcade.dev/home/auth-providers/slack "Slack") [Twitch](https://docs.arcade.dev/home/auth-providers/twitch "Twitch") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Google Flights Toolkit [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Search Tools](https://docs.arcade.dev/mcp-servers/search/google_finance "Search Tools") Google Flights # Google Flights **Description:** Empower your agents to search for flights using Arcade. **Author:** Arcade **Auth:** API Key [![PyPI Version](https://img.shields.io/pypi/v/arcade_google-flights)](https://pypi.org/project/arcade_google-flights/)[![License](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/arcadeai/arcade-ai/blob/main/LICENSE)[![Python Versions](https://img.shields.io/pypi/pyversions/arcade_google-flights)](https://pypi.org/project/arcade_google-flights/)[![Wheel Status](https://img.shields.io/pypi/wheel/arcade_google-flights)](https://pypi.org/project/arcade_google-flights/)[![Downloads](https://img.shields.io/pypi/dm/arcade_google-flights)](https://pypi.org/project/arcade_google-flights/) The Arcade Google Flights toolkit lets you search for flights with ease. Use these tools to build intelligent agents and applications that: - Search for one-way flights. ## Available Tools [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/google_flights\#available-tools) | Tool Name | Description | | --- | --- | | GoogleFlights.SearchOneWayFlights | Retrieve one-way flight search results using Google Flights. | ## GoogleFlights.SearchOneWayFlights [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/google_flights\#googleflightssearchonewayflights) Retrieve flight search results for a one-way flight using Google Flights. **Parameters** - **`departure_airport_code`** _(string, required)_: The departure airport code. An uppercase 3-letter code. - **`arrival_airport_code`** _(string, required)_: The arrival airport code. An uppercase 3-letter code. - **`outbound_date`** _(string, required)_: Flight departure date in YYYY-MM-DD format. - **`currency_code`** _(string, optional)_: Currency of the returned prices. Defaults to ‘USD’. - **`travel_class`** _(enum ( [GoogleFlightsTravelClass](https://docs.arcade.dev/mcp-servers/search/google_flights#googleflightstravelclass)), optional)_: Travel class of the flight. Defaults to ‘ECONOMY’. - **`num_adults`** _(int, optional)_: Number of adult passengers. Defaults to 1. - **`num_children`** _(int, optional)_: Number of child passengers. Defaults to 0. - **`max_stops`** _(enum ( [GoogleFlightsMaxStops](https://docs.arcade.dev/mcp-servers/search/google_flights#googleflightsmaxstops)), optional)_: Maximum number of stops (layovers) for the flight. Defaults to any number of stops. - **`sort_by`** _(enum ( [GoogleFlightsSortBy](https://docs.arcade.dev/mcp-servers/search/google_flights#googleflightssortby)), optional)_: The sorting order of the results. Defaults to TOP\_FLIGHTS. See Example > ## Auth [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/google_flights\#auth) The Arcade Google Flights toolkit uses the [SerpAPI](https://serpapi.com/) to search for flights from Google Flights. - **Secret:** - `SERP_API_KEY`: Your SerpAPI API key. Setting the `SERP_API_KEY` secret is only required if you are [self-hosting](https://docs.arcade.dev/home/deployment/engine-configuration) Arcade. If you’re using Arcade Cloud, the secret is already set for you. To manage your secrets, go to the [Secrets page](https://api.arcade.dev/dashboard/auth/secrets) in the Arcade Dashboard. * * * ## Reference [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/google_flights\#reference) ## GoogleFlightsMaxStops [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/google_flights\#googleflightsmaxstops) Defines the maximum number of stops for flights. - **`ANY`**: Any number of stops is allowed. - **`NONSTOP`**: Only nonstop flights are allowed. - **`ONE`**: Only flights with one stop are allowed. - **`TWO`**: Only flights with two stops are allowed. ## GoogleFlightsSortBy [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/google_flights\#googleflightssortby) Defines the sorting options for flight search results. - **`TOP_FLIGHTS`**: Sort by the best available flights. - **`PRICE`**: Sort by the lowest price. - **`DEPARTURE_TIME`**: Sort by the earliest departure time. - **`ARRIVAL_TIME`**: Sort by the earliest arrival time. - **`DURATION`**: Sort by the shortest flight duration. - **`EMISSIONS`**: Sort by the lowest carbon emissions. ## GoogleFlightsTravelClass [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/google_flights\#googleflightstravelclass) Defines the travel class options for flights. - **`ECONOMY`**: Economy class. - **`PREMIUM_ECONOMY`**: Premium economy class. - **`BUSINESS`**: Business class. - **`FIRST`**: First class. ## Get Building [Use tools hosted on Arcade Cloud\\ \\ Arcade tools are hosted by our cloud platform and ready to be used in your agents. Learn how.](https://docs.arcade.dev/home/quickstart) [Self Host Arcade tools\\ \\ Arcade tools can be self-hosted on your own infrastructure. Learn more about self-hosting.\\ \\ ```\\ pip install arcade_google_flights\\ ```](https://docs.arcade.dev/home/hosting-overview) [Google Finance](https://docs.arcade.dev/mcp-servers/search/google_finance "Google Finance") [Google Hotels](https://docs.arcade.dev/mcp-servers/search/google_hotels "Google Hotels") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Deploy Arcade Worker [Home](https://docs.arcade.dev/home "Home") [Serve tools](https://docs.arcade.dev/home/serve-tools/arcade-deploy "Serve tools") Modal # Deploy a custom worker on Modal This guide shows you how to deploy a custom Arcade Worker using Modal. It takes you through setting up the environment, deploying the worker, and connecting it to the Arcade Engine. ### Requirements [Permalink for this section](https://docs.arcade.dev/home/serve-tools/modal-worker\#requirements) - Python 3.10+ - Modal CLI ( `pip install modal`) ### Deploy [Permalink for this section](https://docs.arcade.dev/home/serve-tools/modal-worker\#deploy) Navigate to the directory containing your worker script and deploy it using Modal: ```nextra-code cd examples/serving-tools modal deploy run-arcade-worker.py ``` ### Changing the Toolkits [Permalink for this section](https://docs.arcade.dev/home/serve-tools/modal-worker\#changing-the-toolkits) To change the toolkits, edit the `toolkits` list in the `run-arcade-worker.py` file. ### Example `run-arcade-worker.py` [Permalink for this section](https://docs.arcade.dev/home/serve-tools/modal-worker\#example-run-arcade-workerpy) ```nextra-code import os from modal import App, Image, asgi_app # Define the FastAPI app app = App("arcade-worker") toolkits = ["arcade-google", "arcade-slack"] image = ( Image.debian_slim() .pip_install("arcade_tdk") .pip_install("arcade_serve") .pip_install(toolkits) ) @app.function(image=image) @asgi_app() def fastapi_app(): from fastapi import FastAPI from arcade_tdk import Toolkit from arcade_serve.fastapi import FastAPIWorker web_app = FastAPI() # Initialize app and Arcade FastAPIWorker worker_secret = os.environ.get("ARCADE_WORKER_SECRET", "dev") worker = FastAPIWorker(web_app, secret=worker_secret) # Register toolkits we've installed installed_toolkits = Toolkit.find_all_arcade_toolkits() for toolkit in toolkits: if toolkit in installed_toolkits: worker.register_toolkit(toolkit) return web_app ``` ### Connect to Arcade Engine [Permalink for this section](https://docs.arcade.dev/home/serve-tools/modal-worker\#connect-to-arcade-engine) To connect the Arcade Engine to your worker, configure the worker URL in the engine’s configuration file. Start the engine with the appropriate configuration. For more details, refer to the [Arcade Engine configuration documentation](https://docs.arcade.dev/home/deployment/engine-configuration). * * * ## Next Steps [Permalink for this section](https://docs.arcade.dev/home/serve-tools/modal-worker\#next-steps) - Ensure your environment variables (like `ARCADE_WORKER_SECRET`) are set securely for production use. - Explore deploying your worker in different environments supported by Modal. [Docker](https://docs.arcade.dev/home/serve-tools/docker-worker "Docker") [Using Arcade tools](https://docs.arcade.dev/home/langchain/use-arcade-tools "Using Arcade tools") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Create Tool with Secrets [Home](https://docs.arcade.dev/home "Home") [Build tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server "Build tools") Create a tool with secrets # Create a tool with secrets In this guide, you’ll learn how to use secrets in your custom Arcade tools. Secrets are sensitive strings like passwords, api-keys, or other tokens that grant access to a protected resource or API. Although you could use secrets to transfer any static information to your tool, such as a parameter needed to call a remote API. ### Prerequisites [Permalink for this section](https://docs.arcade.dev/home/build-tools/create-a-tool-with-secrets\#prerequisites) - [Set up Arcade](https://docs.arcade.dev/home/quickstart) - [Create a toolkit](https://docs.arcade.dev/home/build-tools/create-a-mcp-server) - [Understand Tool Context](https://docs.arcade.dev/home/build-tools/tool-context) ### Set the secret in the Arcade Dashboard [Permalink for this section](https://docs.arcade.dev/home/build-tools/create-a-tool-with-secrets\#set-the-secret-in-the-arcade-dashboard) Go to the [Auth > Secrets section](https://api.arcade.dev/dashboard/auth/secrets) in the Arcade Dashboard. ![An image showing how the Arcade UI allows users to manage secrets](https://docs.arcade.dev/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fsecrets-dashboard-2.eb90edeb.png&w=3840&q=75&dpl=dpl_3fU5AVnKzu14o3RauPt9AEJrvZTe) In the top-right corner, click the **\+ Add Secret** button and enter: - **ID**: `MY_SECRET_INFO` - **Secret Value**: `my-secret-value` - **Description**: optionally add a description Click **Submit** to save the secret. ### Define your tool and access the secret [Permalink for this section](https://docs.arcade.dev/home/build-tools/create-a-tool-with-secrets\#define-your-tool-and-access-the-secret) Use the `@tool` decorator to define the secret requirement. The `context` object has a `get_secret` method that you can use to access the secret value. ```nextra-code from arcade_tdk import ToolContext, tool @tool(requires_secrets=["MY_SECRET_INFO"]) def my_tool_using_secret(context: ToolContext) -> str: secret_value = context.get_secret("MY_SECRET_INFO") return f"The secret value is {secret_value}" ``` When your tool is executed, it will return: `"The secret value is my-secret-value"`. In a real world application, you would use this secret to connect to a remote database, API, etc. [Create a tool with auth](https://docs.arcade.dev/home/build-tools/create-a-tool-with-auth "Create a tool with auth") [Handle tool errors](https://docs.arcade.dev/home/build-tools/handle-tool-errors "Handle tool errors") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Atlassian Auth Provider [Home](https://docs.arcade.dev/home "Home") [Customizing Auth](https://docs.arcade.dev/home/auth-providers "Customizing Auth") Atlassian # Atlassian auth provider At this time, Arcade does not offer a default Atlassian Auth Provider. To use Atlassian auth, you must create a custom Auth Provider with your own Atlassian OAuth 2.0 credentials as described below. The Atlassian auth provider enables tools and agents to call the Atlassian API on behalf of a user. Behind the scenes, the Arcade Engine and the Atlassian auth provider seamlessly manage Atlassian OAuth 2.0 authorization for your users. ### What’s documented here [Permalink for this section](https://docs.arcade.dev/home/auth-providers/atlassian\#whats-documented-here) This page describes how to use and configure Atlassian auth with Arcade. This auth provider is used by: - Your [app code](https://docs.arcade.dev/home/auth-providers/atlassian#using-atlassian-auth-in-app-code) that needs to call Atlassian APIs - Or, your [custom tools](https://docs.arcade.dev/home/auth-providers/atlassian#using-atlassian-auth-in-custom-tools) that need to call Atlassian APIs ## Configuring Atlassian auth [Permalink for this section](https://docs.arcade.dev/home/auth-providers/atlassian\#configuring-atlassian-auth) When using your own app credentials, make sure you configure your project to use a [custom user verifier](https://docs.arcade.dev/home/auth/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 Atlassian app credentials. This way, your users will see your application’s name requesting permission. You can use your own Atlassian credentials in both the Arcade Cloud Platform or in a [self-hosted Arcade Engine](https://docs.arcade.dev/home/deployment/engine-configuration) instance. Before showing how to configure your Atlassian app credentials, let’s go through the steps to create an Atlassian app. ### Create an Atlassian app [Permalink for this section](https://docs.arcade.dev/home/auth-providers/atlassian\#create-an-atlassian-app) - Create a Atlassian app in the [Atlassian developer console](https://developer.atlassian.com/console/myapps/) - In the Authorization tab, click the “Add” action button and set the Callback URL to the redirect URL generated by Arcade (see below) - In the Permissions tab, enable any permissions you need for your app - In the Settings tab, copy the Client ID and Secret to use below ## Configuring your own Atlassian Auth Provider in Arcade [Permalink for this section](https://docs.arcade.dev/home/auth-providers/atlassian\#configuring-your-own-atlassian-auth-provider-in-arcade) There are two ways to configure your Atlassian app credentials in Arcade: 1. From the Arcade Dashboard GUI 2. By editing the `engine.yaml` file directly (for a self-hosted Arcade Engine) We show both options step-by-step below. Dashboard GUIEngine Configuration YAML ### Configure Atlassian Auth Using the Arcade Dashboard GUI #### Access the Arcade Dashboard [Permalink for this section](https://docs.arcade.dev/home/auth-providers/atlassian\#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](http://localhost:9099/dashboard). Adjust the host and port number to match your environment. #### Navigate to the OAuth Providers page [Permalink for this section](https://docs.arcade.dev/home/auth-providers/atlassian\#navigate-to-the-oauth-providers-page) - Under the **OAuth** section of the Arcade Dashboard left-side menu, click **Providers**. - Click **Add OAuth Provider** in the top right corner. - Select the **Included Providers** tab at the top. - In the **Provider** dropdown, select **Atlassian**. #### Enter the provider details [Permalink for this section](https://docs.arcade.dev/home/auth-providers/atlassian\#enter-the-provider-details) - Choose a unique **ID** for your provider (e.g. “my-atlassian-provider”). - Optionally enter a **Description**. - Enter the **Client ID** and **Client Secret** from your Atlassian app. - Note the **Redirect URL** generated by Arcade. This must be added to your Atlassian app as a Callback URL. #### Create the provider [Permalink for this section](https://docs.arcade.dev/home/auth-providers/atlassian\#create-the-provider) Hit the **Create** button and the provider will be ready to be used. When you use tools that require Atlassian auth using your Arcade account credentials, the Arcade Engine will automatically use this Atlassian OAuth provider. If you have multiple Atlassian providers, see [using multiple auth providers of the same type](https://docs.arcade.dev/home/auth-providers#using-multiple-providers-of-the-same-type) for more information. ## Using Atlassian auth in app code [Permalink for this section](https://docs.arcade.dev/home/auth-providers/atlassian\#using-atlassian-auth-in-app-code) Use the Atlassian auth provider in your own agents and AI apps to get a user token for the Atlassian API. See [authorizing agents with Arcade](https://docs.arcade.dev/home/auth/how-arcade-helps) to understand how this works. Use `client.auth.start()` to get a user token for the Atlassian API: PythonJavaScript ```nextra-code 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="atlassian", scopes=["read:me", "read:jira-user", "read:confluence-user"], ) 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... ``` ## Using Atlassian auth in custom tools [Permalink for this section](https://docs.arcade.dev/home/auth-providers/atlassian\#using-atlassian-auth-in-custom-tools) You can author your own [custom tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server) that interact with the Atlassian API. Use the `Atlassian()` auth class to specify that a tool requires authorization with Atlassian. The `context.authorization.token` field will be automatically populated with the user’s Atlassian token: ```nextra-code from typing import Annotated, Optional import httpx from arcade_tdk import ToolContext, tool from arcade_tdk.auth import Atlassian @tool( requires_auth=Atlassian( scopes=["read:jira-work"], ) ) async def list_projects( context: ToolContext, query: Annotated[\ Optional[str],\ "The query to filter the projects by. Defaults to empty string to list all projects.",\ ] = "", ) -> Annotated[dict, "The list of projects in a user's Jira instance"]: """List a Jira user's projects.""" url = f"https://api.atlassian.com/ex/jira//rest/api/3/project/search?query={query}" 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() ``` [Asana](https://docs.arcade.dev/home/auth-providers/asana "Asana") [Clickup](https://docs.arcade.dev/home/auth-providers/clickup "Clickup") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Arcade Engine Configuration [Home](https://docs.arcade.dev/home "Home") [Local Deployment](https://docs.arcade.dev/home/local-deployment/install "Local Deployment") [Configure](https://docs.arcade.dev/home/deployment/on-prem-mcp "Configure") Engine # Arcade Engine configuration Arcade Engine’s configuration is a [YAML file](https://yaml.org/) with the following sections: | Section | Description | | --- | --- | | API Configuration | Configures the server for specific protocols | | Auth Configuration | Configures user authorization providers and token storage | | Cache Configuration | Configures the short-lived cache | | Security Configuration | Configures security and encryption | | Storage Configuration | Configures persistent storage | | Telemetry Configuration | Configures telemetry and observability (OTEL) | | Tools Configuration | Configures tools for AI models to use | ## Specify a config file [Permalink for this section](https://docs.arcade.dev/home/deployment/engine-configuration\#specify-a-config-file) To start the Arcade Engine, pass a config file with `-c` or `--config`: ```nextra-code arcade-engine -c /path/to/config.yaml ``` Ensure you have a worker running before starting the engine. See [arcade serve CLI command](https://docs.arcade.dev/home/arcade-cli#arcade-serve) for how to start a worker via the CLI. ## Dotenv files [Permalink for this section](https://docs.arcade.dev/home/deployment/engine-configuration\#dotenv-files) Arcade Engine automatically loads environment variables from `.env` files in the directory where it was called. Use the `-e` or `--env` flag to specify a path: ```nextra-code arcade-engine -e .env.dev -c config.yaml ``` ## Secrets [Permalink for this section](https://docs.arcade.dev/home/deployment/engine-configuration\#secrets) Arcade Engine supports two ways of passing sensitive information like API keys without storing them directly in the config file. Environment variables: ```nextra-code topic: area: - id: primary vendor: api_key: ${env:OPENAI_API_KEY} ``` External files (useful in cloud setups): ```nextra-code topic: area: - id: primary vendor: api_key: ${file:/path/to/secret} ``` ## API configuration [Permalink for this section](https://docs.arcade.dev/home/deployment/engine-configuration\#api-configuration) HTTP is the supported protocol for Arcade Engine’s API. The following configuration options are available: - `api.development` _(optional, default: `false`)_ \- Enable development mode, with more logging and simple [worker authentication](https://docs.arcade.dev/home/deployment/engine-configuration#http-worker-configuration) - `api.http.host` _(default: `localhost`)_ \- Address to which Arcade Engine binds its server (e.g., `localhost` or `0.0.0.0`) - `api.http.read_timeout` _(optional, default: `30s`)_ \- Timeout for reading data from clients - `api.http.write_timeout` _(optional, default: `1m`)_ \- Timeout for writing data to clients - `api.http.idle_timeout` _(optional, default: `30s`)_ \- Timeout for idle connections - `api.http.max_request_body_size` _(optional, default: `4Mb`)_ \- Maximum request body size A typical configuration for production looks like: ```nextra-code api: development: false host: localhost port: 9099 ``` For local development, set `api.development = true`. In development mode, Arcade Engine does not require [worker authentication](https://docs.arcade.dev/home/deployment/engine-configuration#http-worker-configuration). ## Auth configuration [Permalink for this section](https://docs.arcade.dev/home/deployment/engine-configuration\#auth-configuration) Arcade Engine manages auth for [AI tools](https://docs.arcade.dev/home/auth/auth-tool-calling) and [direct API calls](https://docs.arcade.dev/home/auth/call-third-party-apis-directly). It supports many built-in [auth providers](https://docs.arcade.dev/home/auth-providers), and can also connect to any [OAuth 2.0](https://docs.arcade.dev/home/auth-providers/oauth2) authorization server. The `auth.providers` section defines the providers that users can authorize with. Each provider must have a unique `id` in the array. There are two ways to configure a provider: For [built-in providers](https://docs.arcade.dev/home/auth-providers), use the `provider_id` field to reference the pre-built configuration. For example: ```nextra-code auth: providers: - id: default-github description: The default GitHub provider enabled: true type: oauth2 provider_id: github client_id: ${env:GITHUB_CLIENT_ID} client_secret: ${env:GITHUB_CLIENT_SECRET} ``` For custom OAuth 2.0 providers, specify the full connection details in the `oauth2` sub-section. For full documentation on the custom provider configuration, see the [OAuth 2.0 provider configuration](https://docs.arcade.dev/home/auth-providers/oauth2) page. You can specify a mix of built-in and custom providers. ## Cache configuration [Permalink for this section](https://docs.arcade.dev/home/deployment/engine-configuration\#cache-configuration) The `cache` section configures the short-lived cache. Configuring the cache is optional. If not configured, the cache will default to an in-memory cache implementation suitable for a single-node Arcade Engine deployment. The `cache` section has the following configuration options: - `api_key_ttl` _(optional, default: `10s`)_ \- The time-to-live for API keys in the cache Two cache implementations are available: - `in_memory` \- _(default)_ An in-memory cache implementation suitable for a single-node Arcade Engine deployment. - `redis` \- A Redis cache implementation suitable for a multi-node Arcade Engine deployment: ```nextra-code cache: api_key_ttl: 10s redis: addr: 'localhost:6379' password: '' db: 0 ``` ## Security configuration [Permalink for this section](https://docs.arcade.dev/home/deployment/engine-configuration\#security-configuration) The `security` section configures the root encryption keys that the Arcade Engine uses to encrypt and decrypt data at rest. See the [storage configuration](https://docs.arcade.dev/home/deployment/engine-configuration#storage-configuration) section below to configure where data is stored. A typical configuration looks like this: ```nextra-code security: root_keys: - id: key1 default: true value: ${env:ROOT_KEY_1} - id: key2 value: ${env:ROOT_KEY_2} ``` Keys should be a long random string of characters. For example: ```nextra-code openssl rand -base64 32 ``` ### Default root key [Permalink for this section](https://docs.arcade.dev/home/deployment/engine-configuration\#default-root-key) When you [install Arcade Engine locally](https://docs.arcade.dev/home/deployment/engine-configuration), an `engine.env` file is created with a default root key: ```nextra-code # Encryption keys (change this when deploying to production) ROOT_KEY_1=default-key-value ``` This default value can only be used in development mode (see [API configuration](https://docs.arcade.dev/home/deployment/engine-configuration#api-configuration) above). You **must** replace the value of `ROOT_KEY_1` in `engine.env` before deploying to production. ## Storage configuration [Permalink for this section](https://docs.arcade.dev/home/deployment/engine-configuration\#storage-configuration) The `storage` section configures the storage backend that the Arcade Engine uses to store persistent data. There are three storage implementations available: - `in_memory` \- _(default)_ An in-memory database, suitable for testing. - `sqlite` \- A SQLite file on disk, suitable for local development: ```nextra-code storage: sqlite: # Stores DB in ~/.arcade/arcade-engine.sqlite3 connection_string: '@ARCADE_HOME/arcade-engine.sqlite3' ``` - `postgres` \- A PostgreSQL database, suitable for production: ```nextra-code storage: postgres: user: ${env:POSTGRES_USER} password: ${env:POSTGRES_PASSWORD} host: ${env:POSTGRES_HOST} port: ${env:POSTGRES_PORT} db: ${env:POSTGRES_DB} sslmode: require ``` ## Telemetry configuration [Permalink for this section](https://docs.arcade.dev/home/deployment/engine-configuration\#telemetry-configuration) Arcade supports logs, metrics, and traces with [OpenTelemetry](https://opentelemetry.io/). If you are using the Arcade Engine locally, you can set the `environment` field to `local`. This will only output logs to the console: ```nextra-code telemetry: environment: local logging: # debug, info, warn, error, fatal level: debug encoding: console ``` To connect to OpenTelemetry compatible collectors, set the necessary [OpenTelemetry environment variables](https://opentelemetry.io/docs/specs/otel/configuration/sdk-environment-variables/) in the `engine.env` file. `environment` and `version` are fields that are added to the telemetry attributes, which can be filtered on later. ```nextra-code telemetry: environment: prod logging: level: info encoding: console ``` ### Notes [Permalink for this section](https://docs.arcade.dev/home/deployment/engine-configuration\#notes) - The Engine service name is set to `arcade_engine` - Traces currently cover the `/v1/health` endpoints, as well as authentication attempts ## Tools configuration [Permalink for this section](https://docs.arcade.dev/home/deployment/engine-configuration\#tools-configuration) Arcade Engine orchestrates [tools](https://docs.arcade.dev/home/use-tools/tools-overview) that AI models can use. Tools are executed by distributed workers called **workers**, which are grouped into **directors**. The `tools.directors` section configures the workers that are available to service tool calls: ```nextra-code tools: directors: - id: default enabled: true max_tools: 64 workers: - id: local_worker enabled: true http: uri: 'http://localhost:8002' timeout: 30 retry: 3 secret: ${env:ARCADE_WORKER_SECRET} ``` When a worker is added to an enabled director, all of the tools hosted by that worker will be available to the model and through the Arcade API. ### HTTP worker configuration [Permalink for this section](https://docs.arcade.dev/home/deployment/engine-configuration\#http-worker-configuration) The `http` sub-section configures the HTTP client used to call the worker’s tools: - `uri` _(required)_ \- The base URL of the worker’s tools - `secret` _(required)_ \- Secret used to authenticate with the worker - `timeout` _(optional, default: `30s`)_ \- Timeout for calling the worker’s tools - `retry` _(optional, default: `3`)_ \- Number of times to retry a failed tool call Workers must be configured with a `secret` that is used to authenticate with the worker. This ensures that workers are not exposed to the public internet without security. If `api.development = true`, the secret will default to `"dev"` for local development **only**. In production, the secret must be set to a random value. ## Config file version history [Permalink for this section](https://docs.arcade.dev/home/deployment/engine-configuration\#config-file-version-history) - 1.0: [Full example](https://raw.githubusercontent.com/ArcadeAI/docs/refs/heads/main/examples/code/home/configuration/engine/full_config.1.0.yaml) and [schema](https://raw.githubusercontent.com/ArcadeAI/schemas/refs/heads/main/engine/config/1.0/schema.json) [Overview](https://docs.arcade.dev/home/deployment/on-prem-mcp "Overview") [Configuring Arcade Deploy](https://docs.arcade.dev/home/local-deployment/configure/arcade-deploy "Configuring Arcade Deploy") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Hubspot Auth Provider [Home](https://docs.arcade.dev/home "Home") [Customizing Auth](https://docs.arcade.dev/home/auth-providers "Customizing Auth") Hubspot # Hubspot auth provider The Hubspot auth provider enables tools and agents to call Hubspot APIs on behalf of a user. Behind the scenes, the Arcade Engine and the Hubspot auth provider seamlessly manage Hubspot OAuth 2.0 authorization for your users. Want to quickly get started with Hubspot services in your agent or AI app? The pre-built [Arcade Hubspot toolkit](https://docs.arcade.dev/mcp-servers/sales/hubspot) is what you want! ## What’s documented here [Permalink for this section](https://docs.arcade.dev/home/auth-providers/hubspot\#whats-documented-here) This page describes how to use and configure Hubspot auth with Arcade. This auth provider is used by: - The [Arcade Hubspot toolkit](https://docs.arcade.dev/mcp-servers/sales/hubspot), which provides pre-built tools for interacting with Hubspot - Your [app code](https://docs.arcade.dev/home/auth-providers/hubspot#using-hubspot-auth-in-app-code) that needs to call Hubspot APIs - Or, your [custom tools](https://docs.arcade.dev/home/auth-providers/hubspot#using-hubspot-auth-in-custom-tools) that need to call Hubspot APIs ## Use Arcade’s Default Hubspot Auth Provider [Permalink for this section](https://docs.arcade.dev/home/auth-providers/hubspot\#use-arcades-default-hubspot-auth-provider) Arcade offers a default Hubspot auth provider that you can use in the Arcade Cloud Platform. In this case, your users will see `Arcade` as the name of the application that’s requesting permission. If you choose to use Arcade’s Hubspot auth, you don’t need to configure anything. Follow the [Hubspot toolkit examples](https://docs.arcade.dev/mcp-servers/sales/hubspot) to get started calling Hubspot tools. ## Use Your Own Hubspot App Credentials [Permalink for this section](https://docs.arcade.dev/home/auth-providers/hubspot\#use-your-own-hubspot-app-credentials) When using your own app credentials, make sure you configure your project to use a [custom user verifier](https://docs.arcade.dev/home/auth/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 Hubspot app credentials. This way, your users will see your application’s name requesting permission. You can use your own Hubspot credentials in both the Arcade Cloud Platform or in a [self-hosted Arcade Engine](https://docs.arcade.dev/home/deployment/engine-configuration) instance. Before showing how to configure your Hubspot app credentials, let’s go through the steps to create a Hubspot app. ## Create a Hubspot App [Permalink for this section](https://docs.arcade.dev/home/auth-providers/hubspot\#create-a-hubspot-app) Hubspot has two types of apps: Public and Private. You will need to create a Public one. Follow [Hubspot’s tutorial](https://developers.hubspot.com/docs/guides/apps/public-apps/overview) to create your Public App. You will need a [developer account](https://app.hubspot.com/signup-hubspot/developers) to do this. When creating your app, use the following settings: - Under **App Info**, choose a name, description, and logo for your app - Under **Auth**, enter the **Redirect URL** generated by Arcade (see below) - In the **Scopes** section, click **Add Scope** and add the following scopes with the **Conditionally Required** scope type: - `crm.objects.companies.read` - `crm.objects.contacts.read` - `crm.objects.contacts.write` - `crm.objects.deals.read` - `sales-email-read` Create the app and take note of the **Client ID** and **Client Secret**. You don’t need to follow Hubspot’s instructions to install the app. If you are implementing your own [Hubspot custom\\ tools](https://docs.arcade.dev/home/auth-providers/hubspot#using-hubspot-auth-in-custom-tools), make sure to also add [any extra\\ scopes](https://developers.hubspot.com/docs/guides/apps/authentication/scopes) necessary for the actions your tools need to perform. All extra scopes must be added to the app as `Conditionally Required` or `Optional`, never as `Required`, otherwise the Arcade Hubspot toolkit will not work. Read more about [Hubspot scope\\ types](https://developers.hubspot.com/changelog/advanced-auth-and-scope-settings-for-public-apps). ## Configuring your own Hubspot Auth Provider in Arcade [Permalink for this section](https://docs.arcade.dev/home/auth-providers/hubspot\#configuring-your-own-hubspot-auth-provider-in-arcade) There are two ways to configure your Hubspot app credentials in Arcade: 1. From the Arcade Dashboard GUI 2. By editing the `engine.yaml` file directly (only possible with a self-hosted Arcade Engine) We show both options step-by-step below. Dashboard GUIEngine Configuration YAML ### Configure Hubspot Auth Using the Arcade Dashboard GUI #### Access the Arcade Dashboard [Permalink for this section](https://docs.arcade.dev/home/auth-providers/hubspot\#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](http://localhost:9099/dashboard). Adjust the host and port number to match your environment. #### Navigate to the OAuth Providers page [Permalink for this section](https://docs.arcade.dev/home/auth-providers/hubspot\#navigate-to-the-oauth-providers-page) - Under the **OAuth** section of the Arcade Dashboard left-side menu, click **Providers**. - Click **Add OAuth Provider** in the top right corner. - Select the **Included Providers** tab at the top. - In the **Provider** dropdown, select **Hubspot**. #### Enter the provider details [Permalink for this section](https://docs.arcade.dev/home/auth-providers/hubspot\#enter-the-provider-details) - Enter `hubspot` as the **ID** for your provider - Optionally enter a **Description**. - Enter the **Client ID** and **Client Secret** from your Hubspot app. - Note the **Redirect URL** generated by Arcade. This must be set as your Hubspot app’s Redirect URL. #### Create the provider [Permalink for this section](https://docs.arcade.dev/home/auth-providers/hubspot\#create-the-provider) Hit the **Create** button and the provider will be ready to be used. When you use tools that require Hubspot auth using your Arcade account credentials, the Arcade Engine will automatically use this Hubspot OAuth provider. If you have multiple Hubspot providers, see [using multiple auth providers of the same type](https://docs.arcade.dev/home/auth-providers#using-multiple-providers-of-the-same-type) for more information. ## Using the Arcade Hubspot Toolkit [Permalink for this section](https://docs.arcade.dev/home/auth-providers/hubspot\#using-the-arcade-hubspot-toolkit) The [Arcade Hubspot toolkit](https://docs.arcade.dev/mcp-servers/sales/hubspot) provides tools to interact with various Hubspot objects, such as companies, contacts, deals, and email messages. Refer to the [toolkit documentation and examples](https://docs.arcade.dev/mcp-servers/sales/hubspot) to learn how to use the toolkit to build agents and AI apps that interact with Hubspot services. ## Using Hubspot auth in app code [Permalink for this section](https://docs.arcade.dev/home/auth-providers/hubspot\#using-hubspot-auth-in-app-code) Use the Hubspot auth provider in your own agents and AI apps to get a user-scoped token for the Hubspot API. See [authorizing agents with Arcade](https://docs.arcade.dev/home/auth/how-arcade-helps) to understand how this works. Use `client.auth.start()` to get a user token for the Hubspot API: PythonJavaScript If you are [self-hosting Arcade](https://docs.arcade.dev/home/deployment/engine-configuration), change the `base_url` parameter in the `Arcade` constructor to match your Arcade Engine URL. By default, the Engine will be available at `http://localhost:9099`. ```nextra-code from arcadepy import Arcade client = Arcade(base_url="https://api.arcade.dev") # 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="hubspot", scopes=["oauth", "crm.objects.companies.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... ``` You can use the auth token to call [Hubspot Companies endpoints](https://developers.hubspot.com/docs/guides/api/crm/objects/companies) and read information about companies. By changing or adding scopes to the `client.auth.start` call, you can call other Hubspot endpoints. The scopes supported by the Arcade Hubspot auth provider are the ones [listed above](https://docs.arcade.dev/home/auth-providers/hubspot#create-a-hubspot-app). If you created your own Hubspot app, make sure to add the scopes you intend to use in the `client.auth.start` call. ## Using Hubspot auth in custom tools [Permalink for this section](https://docs.arcade.dev/home/auth-providers/hubspot\#using-hubspot-auth-in-custom-tools) You can author your own [custom tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server) that interact with the Hubspot API. Use the `Hubspot()` auth class to specify that a tool requires authorization with Hubspot. The authentication token needed to call the Hubspot API is available in the tool context through the `context.get_auth_token_or_empty()` method. ```nextra-code from typing import Annotated import httpx from arcade_tdk import ToolContext, tool from arcade_tdk.auth import Hubspot @tool( requires_auth=Hubspot( scopes=["oauth", "crm.objects.companies.read"], ) ) async def get_company_details( context: ToolContext, company_id: Annotated[\ str,\ "The ID of the company to get the details of.",\ ], ) -> Annotated[dict, "Details of the company"]: """Gets the details of a company.""" url = f"https://api.hubapi.com/crm//v3/objects/companies/{company_id}" headers = {"Authorization": f"Bearer {context.get_auth_token_or_empty()}"} async with httpx.AsyncClient() as client: response = await client.get(url, headers=headers) response.raise_for_status() return response.json() ``` If you are [self-hosting Arcade](https://docs.arcade.dev/home/deployment/engine-configuration), you will need to restart the Arcade Worker and the Engine for the new tool to be available. Your new tool can be called like demonstrated below: PythonJavaScript If you are self-hosting, change the `base_url` parameter in the `Arcade` constructor to match your Arcade Engine URL. By default, the Engine will be available at `http://localhost:9099`. ```nextra-code from arcadepy import Arcade client = Arcade(base_url="https://api.arcade.dev") # Automatically finds the `ARCADE_API_KEY` env variable USER_ID = "{arcade_user_id}" TOOL_NAME = "Hubspot.GetCompanyDetails" auth_response = client.tools.authorize(tool_name=TOOL_NAME, user_id=USER_ID) if auth_response.status != "completed": print(f"Click this link to authorize: {auth_response.url}") # Wait for the authorization to complete client.auth.wait_for_completion(auth_response) tool_input = { "company_id": "32134490789", } response = client.tools.execute( tool_name=TOOL_NAME, input=tool_input, user_id=USER_ID, ) print(response.output.value) ``` [Google](https://docs.arcade.dev/home/auth-providers/google "Google") [Linear](https://docs.arcade.dev/home/auth-providers/linear "Linear") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Zoom Auth Provider [Home](https://docs.arcade.dev/home "Home") [Customizing Auth](https://docs.arcade.dev/home/auth-providers "Customizing Auth") Zoom # Zoom auth provider At this time, Arcade does not offer a default Zoom Auth Provider. To use Zoom auth, you must create a custom Auth Provider with your own Zoom OAuth 2.0 credentials as described below. The Zoom auth provider enables tools and agents to call the Zoom API on behalf of a user. Behind the scenes, the Arcade Engine and the Zoom auth provider seamlessly manage Zoom OAuth 2.0 authorization for your users. ### What’s documented here [Permalink for this section](https://docs.arcade.dev/home/auth-providers/zoom\#whats-documented-here) This page describes how to use and configure Zoom auth with Arcade. This auth provider is used by: - Your [app code](https://docs.arcade.dev/home/auth-providers/zoom#using-zoom-auth-in-app-code) that needs to call Zoom APIs - Or, your [custom tools](https://docs.arcade.dev/home/auth-providers/zoom#using-zoom-auth-in-custom-tools) that need to call Zoom APIs ## Configuring Zoom auth [Permalink for this section](https://docs.arcade.dev/home/auth-providers/zoom\#configuring-zoom-auth) When using your own app credentials, make sure you configure your project to use a [custom user verifier](https://docs.arcade.dev/home/auth/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 Zoom app credentials. This way, your users will see your application’s name requesting permission. You can use your own Zoom credentials in both the Arcade Cloud Platform or in a [self-hosted Arcade Engine](https://docs.arcade.dev/home/deployment/engine-configuration) instance. Before showing how to configure your Zoom app credentials, let’s go through the steps to create a Zoom app. ### Create a Zoom app [Permalink for this section](https://docs.arcade.dev/home/auth-providers/zoom\#create-a-zoom-app) - Follow Zoom’s guide to [registering an app](https://developers.zoom.us/docs/integrations/create/) on the Zoom marketplace - Set the redirect URL to the redirect URL generated by Arcade (see below) and enable Strict Mode - Enable the Zoom features and permissions (scopes) that your app needs - Copy the client ID and client secret to use below Next, add the Zoom app to your Arcade Engine configuration. You can do this in the Arcade Dashboard, or by editing the `engine.yaml` file directly (for a self-hosted instance). ## Configuring your own Zoom Auth Provider in Arcade [Permalink for this section](https://docs.arcade.dev/home/auth-providers/zoom\#configuring-your-own-zoom-auth-provider-in-arcade) There are two ways to configure your Zoom app credentials in Arcade: 1. From the Arcade Dashboard GUI 2. By editing the `engine.yaml` file directly (for a self-hosted Arcade Engine) We show both options step-by-step below. Dashboard GUIEngine Configuration YAML ### Configure Zoom Auth Using the Arcade Dashboard GUI #### Access the Arcade Dashboard [Permalink for this section](https://docs.arcade.dev/home/auth-providers/zoom\#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](http://localhost:9099/dashboard). Adjust the host and port number to match your environment. #### Navigate to the OAuth Providers page [Permalink for this section](https://docs.arcade.dev/home/auth-providers/zoom\#navigate-to-the-oauth-providers-page) - Under the **OAuth** section of the Arcade Dashboard left-side menu, click **Providers**. - Click **Add OAuth Provider** in the top right corner. - Select the **Included Providers** tab at the top. - In the **Provider** dropdown, select **Zoom**. #### Enter the provider details [Permalink for this section](https://docs.arcade.dev/home/auth-providers/zoom\#enter-the-provider-details) - Choose a unique **ID** for your provider (e.g. “my-zoom-provider”). - Optionally enter a **Description**. - Enter the **Client ID** and **Client Secret** from your Zoom app. - Note the **Redirect URL** generated by Arcade. This must be set as your Zoom app’s redirect URL. #### Create the provider [Permalink for this section](https://docs.arcade.dev/home/auth-providers/zoom\#create-the-provider) Hit the **Create** button and the provider will be ready to be used. When you use tools that require Zoom auth using your Arcade account credentials, the Arcade Engine will automatically use this Zoom OAuth provider. If you have multiple Zoom providers, see [using multiple auth providers of the same type](https://docs.arcade.dev/home/auth-providers#using-multiple-providers-of-the-same-type) for more information. ## Using Zoom auth in app code [Permalink for this section](https://docs.arcade.dev/home/auth-providers/zoom\#using-zoom-auth-in-app-code) Use the Zoom auth provider in your own agents and AI apps to get a user token for the Zoom API. See [authorizing agents with Arcade](https://docs.arcade.dev/home/auth/how-arcade-helps) to understand how this works. Use `client.auth.start()` to get a user token for the Zoom API: PythonJavaScript ```nextra-code 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="zoom", scopes=["meeting:read:list_upcoming_meetings"], ) 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... ``` ## Using Zoom auth in custom tools [Permalink for this section](https://docs.arcade.dev/home/auth-providers/zoom\#using-zoom-auth-in-custom-tools) You can author your own [custom tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server) that interact with the Zoom API. Use the `Zoom()` auth class to specify that a tool requires authorization with Zoom. The `context.authorization.token` field will be automatically populated with the user’s Zoom token: ```nextra-code from typing import Annotated, Optional import httpx from arcade_tdk import ToolContext, tool from arcade_tdk.auth import Zoom @tool( requires_auth=Zoom( scopes=["meeting:read:list_upcoming_meetings"], ) ) async def list_upcoming_meetings( context: ToolContext, user_id: Annotated[\ Optional[str],\ "The user's user ID or email address. Defaults to 'me' for the current user.",\ ] = "me", ) -> Annotated[dict, "List of upcoming meetings within the next 24 hours"]: """List a Zoom user's upcoming meetings within the next 24 hours.""" url = f"https://api.zoom.us/v2/users/{user_id}/upcoming_meetings" 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() ``` [Zendesk](https://docs.arcade.dev/home/auth-providers/zendesk "Zendesk") [Glossary](https://docs.arcade.dev/home/glossary "Glossary") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Microsoft Teams Toolkit [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Social & Communication](https://docs.arcade.dev/mcp-servers/social-communication/discord "Social & Communication") Microsoft Teams # MicrosoftTeams **Description:** Enable agents to interact with MicrosoftTeams **Author:** Arcade **Auth:** User authorization [![PyPI Version](https://img.shields.io/pypi/v/arcade_microsoft_teams)](https://pypi.org/project/arcade_microsoft_teams/)[![License](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/arcadeai/arcade-ai/blob/main/LICENSE)[![Python Versions](https://img.shields.io/pypi/pyversions/arcade_microsoft_teams)](https://pypi.org/project/arcade_microsoft_teams/)[![Wheel Status](https://img.shields.io/pypi/wheel/arcade_microsoft_teams)](https://pypi.org/project/arcade_microsoft_teams/)[![Downloads](https://img.shields.io/pypi/dm/arcade_microsoft_teams)](https://pypi.org/project/arcade_microsoft_teams/) The Microsoft Teams MCP Server provides a comprehensive set of tools for interacting with Microsoft Teams. Users can efficiently manage teams, channels, and chats, enabling them to: - Retrieve information about teams, channels, and chats. - List, search, and manage users and teams. - Send and reply to messages in both channels and chats. - Access and search for messages across chats and channels. - Create new chats and retrieve metadata about existing chats and channels. This toolkit streamlines collaboration and communication within Microsoft Teams, making it easier to manage interactions and information flow. ## Available Tools [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/microsoft_teams\#available-tools) | Tool Name | Description | | --- | --- | | MicrosoftTeams.WhoAmI | Get information about the current user and their Microsoft Teams environment. | | MicrosoftTeams.GetSignedInUser | Get the user currently signed in Microsoft Teams. | | MicrosoftTeams.ListUsers | Lists the users in the Microsoft Teams tenant. | | MicrosoftTeams.SearchUsers | Searches for users in the Microsoft Teams tenant. | | MicrosoftTeams.GetChannelMetadata | Retrieves metadata about a Microsoft Teams channel and its members. | | MicrosoftTeams.ListChannels | Lists channels in Microsoft Teams (including shared incoming channels). | | MicrosoftTeams.SearchChannels | Searches for channels in a given Microsoft Teams team. | | MicrosoftTeams.GetChannelMessages | Retrieves the messages in a Microsoft Teams channel. | | MicrosoftTeams.GetChannelMessageReplies | Retrieves the replies to a Microsoft Teams channel message. | | MicrosoftTeams.SendMessageToChannel | Sends a message to a Microsoft Teams channel. | | MicrosoftTeams.ReplyToChannelMessage | Sends a reply to a Microsoft Teams channel message. | | MicrosoftTeams.ListTeams | Lists the teams the current user is associated with in Microsoft Teams. | | MicrosoftTeams.SearchTeams | Searches for teams available to the current user in Microsoft Teams. | | MicrosoftTeams.GetTeam | Retrieves metadata about a team in Microsoft Teams. | | MicrosoftTeams.ListTeamMembers | Lists the members of a team in Microsoft Teams. | | MicrosoftTeams.SearchTeamMembers | Searches for members of a team in Microsoft Teams. | | MicrosoftTeams.GetChatMessageById | Retrieves a Microsoft Teams chat message. | | MicrosoftTeams.GetChatMessages | Retrieves messages from a Microsoft Teams chat (individual or group). | | MicrosoftTeams.GetChatMetadata | Retrieves metadata about a Microsoft Teams chat. | | MicrosoftTeams.ListChats | List the Microsoft Teams chats to which the current user is a member of. | | MicrosoftTeams.SendMessageToChat | Sends a message to a Microsoft Teams chat. | | MicrosoftTeams.ReplyToChatMessage | Sends a reply to a Microsoft Teams chat message. | | MicrosoftTeams.CreateChat | Creates a Microsoft Teams chat. | | MicrosoftTeams.SearchPeople | Searches for people the user has interacted with in Microsoft Teams and other 365 products. | | MicrosoftTeams.SearchMessages | Searches for messages across Microsoft Teams chats and channels. | If you need to perform an action that’s not listed here, you can [get in touch\\ with us](mailto:contact@arcade.dev) to request a new tool, or [create your\\ own tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server). ## MicrosoftTeams.WhoAmI [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/microsoft_teams\#microsoftteamswhoami) See Example > Get information about the current user and their Microsoft Teams environment. **Parameters** This tool does not take any parameters. ## MicrosoftTeams.GetSignedInUser [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/microsoft_teams\#microsoftteamsgetsignedinuser) See Example > Get the user currently signed in Microsoft Teams. **Parameters** This tool does not take any parameters. ## MicrosoftTeams.ListUsers [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/microsoft_teams\#microsoftteamslistusers) See Example > Lists the users in the Microsoft Teams tenant. **Parameters** - **limit** ( `integer`, optional) The maximum number of users to return. Defaults to 50, max is 100. - **offset** ( `integer`, optional) The offset to start from. ## MicrosoftTeams.SearchUsers [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/microsoft_teams\#microsoftteamssearchusers) See Example > Searches for users in the Microsoft Teams tenant. **Parameters** - **keywords** ( `array[string]`, required) The keywords to match against users’ names. - **match\_type** ( `Enum` [PartialMatchType](https://docs.arcade.dev/mcp-servers/social-communication/microsoft_teams/reference#PartialMatchType), optional) The type of match to use for the keywords. Defaults to match\_any\_of\_the\_keywords. - **limit** ( `integer`, optional) The maximum number of users to return. Defaults to 50, max is 999. - **offset** ( `integer`, optional) The offset to start from. ## MicrosoftTeams.GetChannelMetadata [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/microsoft_teams\#microsoftteamsgetchannelmetadata) See Example > Retrieves metadata about a Microsoft Teams channel and its members. **Parameters** - **channel\_id** ( `string`, optional) The ID of the channel to get. Provide either this or channel\_name. - **channel\_name** ( `string`, optional) The name of the channel to get. Provide either this or channel\_id. - **team\_id\_or\_name** ( `string`, optional) The ID or name of the team to get the channel of (optional). If not provided: in case the user is a member of a single team, the tool will use it; otherwise an error will be returned with a list of all teams to pick from. ## MicrosoftTeams.ListChannels [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/microsoft_teams\#microsoftteamslistchannels) See Example > Lists channels in Microsoft Teams (including shared incoming channels). **Parameters** - **limit** ( `integer`, optional) The maximum number of channels to return. Defaults to 50, max is 100. - **offset** ( `integer`, optional) The offset to start from. - **team\_id\_or\_name** ( `string`, optional) The ID or name of the team to list the channels of (optional). If not provided: in case the user is a member of a single team, the tool will use it; otherwise an error will be returned with a list of all teams to pick from. ## MicrosoftTeams.SearchChannels [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/microsoft_teams\#microsoftteamssearchchannels) See Example > Searches for channels in a given Microsoft Teams team. **Parameters** - **keywords** ( `array[string]`, required) The keywords to search for in channel names. - **match\_type** ( `Enum` [MatchType](https://docs.arcade.dev/mcp-servers/social-communication/microsoft_teams/reference#MatchType), optional) The type of match to use for the search. Defaults to ‘partial\_match\_all\_keywords’. - **limit** ( `integer`, optional) The maximum number of channels to return. Defaults to 50. Max of 100. - **offset** ( `integer`, optional) The offset to start from. - **team\_id\_or\_name** ( `string`, optional) The ID or name of the team to search the channels of (optional). If not provided: in case the user is a member of a single team, the tool will use it; otherwise an error will be returned with a list of all teams to pick from. ## MicrosoftTeams.GetChannelMessages [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/microsoft_teams\#microsoftteamsgetchannelmessages) See Example > Retrieves the messages in a Microsoft Teams channel. **Parameters** - **channel\_id** ( `string`, optional) The ID of the channel to get the messages of. - **channel\_name** ( `string`, optional) The name of the channel to get the messages of. - **limit** ( `integer`, optional) The maximum number of messages to return. Defaults to 50, max is 50. - **team\_id\_or\_name** ( `string`, optional) The ID or name of the team to get the messages of. If not provided: in case the user is a member of a single team, the tool will use it; otherwise an error will be returned with a list of all teams to pick from. ## MicrosoftTeams.GetChannelMessageReplies [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/microsoft_teams\#microsoftteamsgetchannelmessagereplies) See Example > Retrieves the replies to a Microsoft Teams channel message. **Parameters** - **message\_id** ( `string`, required) The ID of the message to get the replies of. - **channel\_id\_or\_name** ( `string`, required) The ID or name of the channel to get the replies of. - **team\_id\_or\_name** ( `string`, optional) The ID or name of the team to get the replies of. If not provided: in case the user is a member of a single team, the tool will use it; otherwise an error will be returned with a list of all teams to pick from. ## MicrosoftTeams.SendMessageToChannel [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/microsoft_teams\#microsoftteamssendmessagetochannel) See Example > Sends a message to a Microsoft Teams channel. **Parameters** - **message** ( `string`, required) The message to send to the channel. - **channel\_id\_or\_name** ( `string`, required) The ID or name of the channel to send the message to. - **team\_id\_or\_name** ( `string`, optional) The ID or name of the team to send the message to. If not provided: in case the user is a member of a single team, the tool will use it; otherwise an error will be returned with a list of all teams to pick from. ## MicrosoftTeams.ReplyToChannelMessage [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/microsoft_teams\#microsoftteamsreplytochannelmessage) See Example > Sends a reply to a Microsoft Teams channel message. **Parameters** - **reply\_content** ( `string`, required) The content of the reply message. - **message\_id** ( `string`, required) The ID of the message to reply to. - **channel\_id\_or\_name** ( `string`, required) The ID or name of the channel to send the message to. - **team\_id\_or\_name** ( `string`, optional) The ID or name of the team to send the message to. If not provided: in case the user is a member of a single team, the tool will use it; otherwise an error will be returned with a list of all teams to pick from. ## MicrosoftTeams.ListTeams [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/microsoft_teams\#microsoftteamslistteams) See Example > Lists the teams the current user is associated with in Microsoft Teams. **Parameters** - **membership\_type** ( `Enum` [TeamMembershipType](https://docs.arcade.dev/mcp-servers/social-communication/microsoft_teams/reference#TeamMembershipType), optional) The type of membership to filter by. Defaults to ‘direct\_member\_of\_the\_team’. ## MicrosoftTeams.SearchTeams [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/microsoft_teams\#microsoftteamssearchteams) See Example > Searches for teams available to the current user in Microsoft Teams. **Parameters** - **team\_name\_starts\_with** ( `string`, required) The prefix to match the name of the teams. - **limit** ( `integer`, optional) The maximum number of teams to return. Defaults to 10, max is 50. - **next\_page\_token** ( `string`, optional) The token to use to get the next page of results. ## MicrosoftTeams.GetTeam [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/microsoft_teams\#microsoftteamsgetteam) See Example > Retrieves metadata about a team in Microsoft Teams. **Parameters** - **team\_id** ( `string`, optional) The ID of the team to get. - **team\_name** ( `string`, optional) The name of the team to get. Prefer providing a team\_id, when available, for optimal performance. ## MicrosoftTeams.ListTeamMembers [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/microsoft_teams\#microsoftteamslistteammembers) See Example > Lists the members of a team in Microsoft Teams. **Parameters** - **team\_id** ( `string`, optional) The ID of the team to list the members of. - **team\_name** ( `string`, optional) The name of the team to list the members of. Prefer providing a team\_id, when available, for optimal performance. - **limit** ( `integer`, optional) The maximum number of members to return. Defaults to 50, max is 999. - **offset** ( `integer`, optional) The number of members to skip. Defaults to 0. ## MicrosoftTeams.SearchTeamMembers [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/microsoft_teams\#microsoftteamssearchteammembers) See Example > Searches for members of a team in Microsoft Teams. **Parameters** - **member\_name\_starts\_with** ( `string`, required) The prefix to match the name of the members. - **team\_id** ( `string`, optional) The ID of the team to list the members of. - **team\_name** ( `string`, optional) The name of the team to list the members of. Prefer providing a team\_id, when available, for optimal performance. - **limit** ( `integer`, optional) The maximum number of members to return. Defaults to 50, max is 100. - **offset** ( `integer`, optional) The number of members to skip. Defaults to 0. ## MicrosoftTeams.GetChatMessageById [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/microsoft_teams\#microsoftteamsgetchatmessagebyid) See Example > Retrieves a Microsoft Teams chat message. **Parameters** - **message\_id** ( `string`, required) The ID of the message to get. - **chat\_id** ( `string`, required) The ID of the chat to get the message from. - **user\_ids** ( `array[string]`, optional) The IDs of the users in the chat to get the message from. - **user\_names** ( `array[string]`, optional) The names of the users in the chat to get the message from. Prefer providing user\_ids, when available, since the performance is better. ## MicrosoftTeams.GetChatMessages [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/microsoft_teams\#microsoftteamsgetchatmessages) See Example > Retrieves messages from a Microsoft Teams chat (individual or group). **Parameters** - **chat\_id** ( `string`, optional) The ID of the chat to get messages from. - **user\_ids** ( `array[string]`, optional) The IDs of the users in the chat to get messages from. - **user\_names** ( `array[string]`, optional) The names of the users in the chat to get messages from. Prefer providing user\_ids, when available, since the performance is better. - **start\_datetime** ( `string`, optional) The start date to filter messages. Provide a string in the format ‘YYYY-MM-DD’ or ‘YYYY-MM-DD HH:MM:SS’. Defaults to None (no start date filter). - **end\_datetime** ( `string`, optional) The end date to filter messages. Provide a string in the format ‘YYYY-MM-DD’ or ‘YYYY-MM-DD HH:MM:SS’. Defaults to None (no end date filter). - **limit** ( `integer`, optional) The maximum number of messages to return. Defaults to 50, max is 50. ## MicrosoftTeams.GetChatMetadata [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/microsoft_teams\#microsoftteamsgetchatmetadata) See Example > Retrieves metadata about a Microsoft Teams chat. **Parameters** - **chat\_id** ( `string`, optional) The ID of the chat to get metadata about. - **user\_ids** ( `array[string]`, optional) The IDs of the users in the chat to get metadata about. - **user\_names** ( `array[string]`, optional) The names of the users in the chat to get messages from. Prefer providing user\_ids, when available, since the performance is better. ## MicrosoftTeams.ListChats [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/microsoft_teams\#microsoftteamslistchats) See Example > List the Microsoft Teams chats to which the current user is a member of. **Parameters** - **limit** ( `integer`, optional) The maximum number of chats to return. Defaults to 50, max is 50. - **next\_page\_token** ( `string`, optional) The token to use to get the next page of results. ## MicrosoftTeams.SendMessageToChat [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/microsoft_teams\#microsoftteamssendmessagetochat) See Example > Sends a message to a Microsoft Teams chat. **Parameters** - **message** ( `string`, required) The message to send to the chat. - **chat\_id** ( `string`, optional) The ID of the chat to send the message. - **user\_ids** ( `array[string]`, optional) The IDs of the users in the chat to send the message. - **user\_names** ( `array[string]`, optional) The names of the users in the chat to send the message. Prefer providing user\_ids, when available, since the performance is better. ## MicrosoftTeams.ReplyToChatMessage [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/microsoft_teams\#microsoftteamsreplytochatmessage) See Example > Sends a reply to a Microsoft Teams chat message. **Parameters** - **reply\_content** ( `string`, required) The content of the reply message. - **message\_id** ( `string`, required) The ID of the message to reply to. - **chat\_id** ( `string`, optional) The ID of the chat to send the message. - **user\_ids** ( `array[string]`, optional) The IDs of the users in the chat to send the message. - **user\_names** ( `array[string]`, optional) The names of the users in the chat to send the message. Prefer providing user\_ids, when available, since the performance is better. ## MicrosoftTeams.CreateChat [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/microsoft_teams\#microsoftteamscreatechat) See Example > Creates a Microsoft Teams chat. **Parameters** - **user\_ids** ( `array[string]`, optional) The IDs of the users to create a chat with. - **user\_names** ( `array[string]`, optional) The names of the users to create a chat with. ## MicrosoftTeams.SearchPeople [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/microsoft_teams\#microsoftteamssearchpeople) See Example > Searches for people the user has interacted with in Microsoft Teams and other 365 products. **Parameters** - **keywords** ( `array[string]`, required) The keywords to match against people’s names. Provide one or more expressions. - **match\_type** ( `Enum` [PartialMatchType](https://docs.arcade.dev/mcp-servers/social-communication/microsoft_teams/reference#PartialMatchType), optional) The type of match to use for the keywords. Defaults to match\_any\_of\_the\_keywords. - **limit** ( `integer`, optional) The maximum number of people to return. Defaults to 50, max is 100. - **next\_page\_token** ( `string`, optional) The next page token to use for pagination. ## MicrosoftTeams.SearchMessages [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/microsoft_teams\#microsoftteamssearchmessages) See Example > Searches for messages across Microsoft Teams chats and channels. **Parameters** - **keywords** ( `string`, required) The keywords to match against messages’ content. - **limit** ( `integer`, optional) The maximum number of messages to return. Defaults to 50, max is 50. - **offset** ( `integer`, optional) The offset to start from. ## Auth [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/microsoft_teams\#auth) The Arcade MicrosoftTeams toolkit uses the [Microsoft auth provider](https://docs.arcade.dev/home/auth-providers/microsoft) to connect to users’ MicrosoftTeams accounts. Please refer to the [Microsoft auth provider](https://docs.arcade.dev/home/auth-providers/microsoft) documentation to learn how to configure auth. ## Get Building [Use tools hosted on Arcade Cloud\\ \\ Arcade tools are hosted by our cloud platform and ready to be used in your agents. Learn how.](https://docs.arcade.dev/home/quickstart) [Self Host Arcade tools\\ \\ Arcade tools can be self-hosted on your own infrastructure. Learn more about self-hosting.\\ \\ ```\\ pip install arcade_microsoft_teams\\ ```](https://docs.arcade.dev/home/hosting-overview) [Zoom](https://docs.arcade.dev/mcp-servers/social-communication/zoom "Zoom") [Reference](https://docs.arcade.dev/mcp-servers/social-communication/microsoft_teams/reference "Reference") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Close.io Productivity Tools [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Productivity & Docs](https://docs.arcade.dev/mcp-servers/productivity/asana "Productivity & Docs") Close.io # Close.io Coming Soon [Reference](https://docs.arcade.dev/mcp-servers/productivity/clickup/reference "Reference") [Sharepoint](https://docs.arcade.dev/mcp-servers/productivity/sharepoint "Sharepoint") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Arcade AI Tools Guide ``` # https://docs.arcade.dev llms.txt - [Arcade AI Deployment](https://docs.arcade.dev/home): Learn to deploy AI agents securely with Arcade tools. - [API Key Management](https://docs.arcade.dev/home/api-keys): Learn how to generate and manage your API keys. - [Arcade CLI Tool](https://docs.arcade.dev/home/arcade-cli): Command-line tool for managing Arcade deployments and toolkits. - [Arcade Clients Overview](https://docs.arcade.dev/home/arcade-clients): Explore Arcade clients for Python, JavaScript, and Go. - [Auth Providers Overview](https://docs.arcade.dev/home/auth-providers): Explore various auth providers for seamless data access. - [Asana Auth Provider](https://docs.arcade.dev/home/auth-providers/asana): Integrate Asana APIs using Arcade's auth provider seamlessly. - [Atlassian Auth Provider](https://docs.arcade.dev/home/auth-providers/atlassian): Guide to configuring Atlassian auth provider in Arcade. - [ClickUp Auth Provider](https://docs.arcade.dev/home/auth-providers/clickup): Configure ClickUp auth for seamless API integration with Arcade. - [Discord Auth Provider](https://docs.arcade.dev/home/auth-providers/discord): Guide to configuring Discord auth provider for Arcade. - [Dropbox Auth Provider](https://docs.arcade.dev/home/auth-providers/dropbox): Guide to configuring Dropbox authentication for Arcade applications. - [GitHub Auth Provider](https://docs.arcade.dev/home/auth-providers/github): Learn to configure GitHub auth for Arcade applications. - [Google Auth Provider](https://docs.arcade.dev/home/auth-providers/google): Integrate Google OAuth for seamless API access in apps. - [Hubspot Auth Provider](https://docs.arcade.dev/home/auth-providers/hubspot): Integrate Hubspot APIs using Arcade's auth provider seamlessly. - [Linear Auth Provider](https://docs.arcade.dev/home/auth-providers/linear): Guide to configuring Linear auth provider for Arcade apps. - [LinkedIn Auth Provider](https://docs.arcade.dev/home/auth-providers/linkedin): Integrate LinkedIn API with Arcade for user authentication. - [Microsoft Auth Provider](https://docs.arcade.dev/home/auth-providers/microsoft): Guide to configuring Microsoft Auth Provider for Arcade. - [Notion Auth Provider](https://docs.arcade.dev/home/auth-providers/notion): Configure Notion auth for seamless API integration with Arcade. - [OAuth 2.0 Setup](https://docs.arcade.dev/home/auth-providers/oauth2): Configure OAuth 2.0 for Arcade tools and apps easily. - [Reddit Auth Provider](https://docs.arcade.dev/home/auth-providers/reddit): Guide to configuring Reddit auth provider for Arcade. - [Salesforce Auth Provider](https://docs.arcade.dev/home/auth-providers/salesforce): Guide to configuring Salesforce Auth Provider for Arcade. - [Slack Auth Provider](https://docs.arcade.dev/home/auth-providers/slack): Integrate Slack authentication for apps using Arcade tools. - [Spotify Auth Provider](https://docs.arcade.dev/home/auth-providers/spotify): Guide to configuring Spotify Auth Provider for Arcade. - [Twitch Auth Provider](https://docs.arcade.dev/home/auth-providers/twitch): Guide to configuring Twitch Auth Provider for Arcade. - [X Auth Provider](https://docs.arcade.dev/home/auth-providers/x): Integrate X (Twitter) API with Arcade for user authentication. - [Zendesk Auth Configuration](https://docs.arcade.dev/home/auth-providers/zendesk): Guide to configuring Zendesk authentication with Arcade platform. - [Zoom Auth Provider](https://docs.arcade.dev/home/auth-providers/zoom): Guide to configuring Zoom auth provider for Arcade apps. - [Authorized Tool Calling](https://docs.arcade.dev/home/auth/auth-tool-calling): Learn how to authorize tools for AI agents securely. - [Direct API Calls](https://docs.arcade.dev/home/auth/call-third-party-apis-directly): Learn to authorize and call third-party APIs directly. - [Agent Authorization Simplified](https://docs.arcade.dev/home/auth/how-arcade-helps): Arcade simplifies agent authorization for secure user actions. - [Secure Auth in Production](https://docs.arcade.dev/home/auth/secure-auth-production): Secure user verification for production auth flows with Arcade. - [Tool Authorization Status](https://docs.arcade.dev/home/auth/tool-auth-status): Check tool authorization status and requirements for users. - [Create Tool with Auth](https://docs.arcade.dev/home/build-tools/create-a-tool-with-auth): Learn to add user authorization to custom tools using Arcade. - [Create Tools with Secrets](https://docs.arcade.dev/home/build-tools/create-a-tool-with-secrets): Learn to create tools using sensitive secrets securely. - [Create Arcade Toolkit](https://docs.arcade.dev/home/build-tools/create-a-mcp-server): Guide to create and publish a custom Arcade toolkit. - [Handle Tool Errors](https://docs.arcade.dev/home/build-tools/handle-tool-errors): Guide to effectively handle tool errors in Arcade SDK. - [Retryable Tool Error](https://docs.arcade.dev/home/build-tools/retry-tools-with-improved-prompt): Learn to use RetryableToolError for improved tool calls. - [Understanding ToolContext](https://docs.arcade.dev/home/build-tools/tool-context): Learn about ToolContext for managing user authorization. - [Arcade.dev Changelog](https://docs.arcade.dev/home/changelog): Latest updates and features for Arcade.dev platform tools. - [Contact Arcade Support](https://docs.arcade.dev/home/contact-us): Get support and resources for Arcade services and community. - [Custom Auth Flow](https://docs.arcade.dev/home/crewai/custom-auth-flow): Guide to create a custom authentication flow for CrewAI. - [Using Arcade Tools](https://docs.arcade.dev/home/crewai/use-arcade-tools): Integrate Arcade tools into your CrewAI application effectively. - [Create Evaluation Suite](https://docs.arcade.dev/home/evaluate-tools/create-an-evaluation-suite): Learn to create and run evaluation suites for tools. - [Run Evaluations](https://docs.arcade.dev/home/evaluate-tools/run-evaluations): Run evaluations of language models using Arcade CLI efficiently. - [Evaluate Tool Effectiveness](https://docs.arcade.dev/home/evaluate-tools/why-evaluate-tools): Evaluate language models' tool-calling capabilities effectively and reliably. - [Arcade FAQ](https://docs.arcade.dev/home/faq): Find answers to common questions about Arcade tools and usage. - [Arcade Glossary](https://docs.arcade.dev/home/glossary): Comprehensive glossary of terms related to Arcade platform. - [Arcade Google ADK Integration](https://docs.arcade.dev/home/google-adk/overview): Integrate Arcade with Google ADK for enhanced AI tools. - [Arcade Tools Integration](https://docs.arcade.dev/home/google-adk/use-arcade-tools): Integrate Arcade tools into Google ADK applications effectively. - [Arcade Hosting Overview](https://docs.arcade.dev/home/hosting-overview): Explore hosting options for Arcade, including cloud and local. - [Hybrid Worker Setup](https://docs.arcade.dev/home/deployment/on-prem-mcp): Learn to set up and manage hybrid workers effectively. - [Authorize LangChain Tools](https://docs.arcade.dev/home/langchain/auth-langchain-tools): Guide to authorize LangChain tools using Arcade API. - [Arcade Tools Integration](https://docs.arcade.dev/home/langchain/use-arcade-tools): Integrate Arcade tools into LangGraph applications effectively. - [User Authorization Workflows](https://docs.arcade.dev/home/langchain/user-auth-interrupts): Create workflows requiring user authorization for Arcade tools. - [Arcade Deploy Configuration](https://docs.arcade.dev/home/local-deployment/configure/arcade-deploy): Guide to configure and deploy workers using Arcade CLI. - [Arcade Engine Configuration](https://docs.arcade.dev/home/deployment/engine-configuration): Guide to configure Arcade Engine with YAML settings. - [Arcade Engine Configuration](https://docs.arcade.dev/home/deployment/on-prem-mcp): Overview of Arcade Engine configuration files and settings. - [Arcade Configuration Templates](https://docs.arcade.dev/home/local-deployment/configure/templates): Configuration templates for local deployment of Arcade applications. - [Arcade Docker Installation](https://docs.arcade.dev/home/local-deployment/install/docker): Guide to install and run Arcade Engine using Docker. - [Arcade Local Installation](https://docs.arcade.dev/home/deployment/engine-configuration): Guide to install Arcade locally for development purposes. - [Arcade Installation Overview](https://docs.arcade.dev/home/deployment/engine-configuration): Explore various installation methods for Arcade software locally. - [Arcade Toolkit Installation](https://docs.arcade.dev/home/local-deployment/install/toolkits): Guide to install and run toolkits locally for Arcade. - [Arcade Tools Integration](https://docs.arcade.dev/home/mastra/overview): Integrate Arcade tools with Mastra for enhanced AI applications. - [Using Arcade Tools](https://docs.arcade.dev/home/mastra/use-arcade-tools): Integrate and use Arcade tools within Mastra agents effectively. - [User Authentication Management](https://docs.arcade.dev/home/mastra/user-auth-interrupts): Manage user authentication flows with dynamic tool loading. - [Connect Claude Desktop](https://docs.arcade.dev/home/mcp-desktop-clients/claude-desktop-client): Guide to connect Claude Desktop with Arcade server setup. - [Arcade in VS Code](https://docs.arcade.dev/home/mcp-desktop-clients/vscode-client): Connect Visual Studio Code to Arcade's MCP server easily. - [Model Context Protocol Overview](https://docs.arcade.dev/home/mcp-overview): Overview of Model Context Protocol and its significance for developers. - [Arcade V2 Migration](https://docs.arcade.dev/home/migrate-to-v2): Guide for migrating projects to Arcade CLI version 2.0.0 - [OpenAI Agents Overview](https://docs.arcade.dev/home/oai-agents/overview): Integrate OpenAI Agents with Arcade for enhanced AI tools. - [Using Arcade Tools](https://docs.arcade.dev/home/oai-agents/use-arcade-tools): Integrate Arcade tools into OpenAI Agents applications effectively. - [User Authorization Guide](https://docs.arcade.dev/home/oai-agents/user-auth-interrupts): Learn to manage user authorization in OpenAI Agents applications. - [Arcade Quickstart Guide](https://docs.arcade.dev/home/quickstart): Quickstart guide to build AI agents with Arcade tools. - [Arcade Registry Overview](https://docs.arcade.dev/home/registry-early-access): Arcade Registry connects developers to share and sell tools. - [Arcade Deploy Guide](https://docs.arcade.dev/home/serve-tools/arcade-deploy): Guide to deploying workers using Arcade Deploy tools. - [Custom Docker Worker Guide](https://docs.arcade.dev/home/serve-tools/docker-worker): Guide to build custom Docker worker images using Arcade. - [Deploy Arcade Worker](https://docs.arcade.dev/home/serve-tools/modal-worker): Guide to deploy custom Arcade Worker using Modal tools. - [Get Tool Definitions](https://docs.arcade.dev/home/use-tools/get-tool-definitions): Learn how to get tool definitions formatted for various models. - [Tool Calling Overview](https://docs.arcade.dev/home/use-tools/tools-overview): Explore tool calling for enhanced AI interactions and applications. - [Arcade Tools with Vercel AI](https://docs.arcade.dev/home/vercelai/use-arcade-tools): Learn to integrate Arcade tools with Vercel AI SDK. - [Arcade Integrations Overview](https://docs.arcade.dev/toolkits): Explore various integrations for productivity, communication, and development. - [Arcade Toolkit Template](https://docs.arcade.dev/mcp-servers/community-toolkit-template): Community-driven toolkit for Arcade development and contributions. - [Contribute a Toolkit](https://docs.arcade.dev/mcp-servers/contribute-a-toolkit): Learn how to contribute your toolkit to Arcade documentation. - [Zendesk Customer Support](https://docs.arcade.dev/mcp-servers/customer-support/zendesk): Toolkit for managing customer support tickets in Zendesk. - [Zendesk Toolkit Reference](https://docs.arcade.dev/mcp-servers/customer-support/zendesk/reference): Reference for Zendesk ticket statuses and sorting options. - [Clickhouse Database Toolkit](https://docs.arcade.dev/mcp-servers/databases/clickhouse): Interact with Clickhouse databases using read-only tools and features. - [MongoDB Toolkit Overview](https://docs.arcade.dev/mcp-servers/databases/mongodb): Explore MongoDB databases with read-only access tools. - [PostgreSQL Toolkit](https://docs.arcade.dev/mcp-servers/databases/postgres): Interact with PostgreSQL databases using read-only tools. - [E2B Toolkit Overview](https://docs.arcade.dev/mcp-servers/development/e2b): Run code in a sandboxed environment with E2B toolkit. - [Firecrawl Toolkit](https://docs.arcade.dev/mcp-servers/development/firecrawl/firecrawl): Scrape, crawl, and map websites with Firecrawl toolkit. - [Firecrawl Toolkit Reference](https://docs.arcade.dev/mcp-servers/development/firecrawl/reference): Explore Firecrawl Toolkit formats for web scraping options. - [GitHub Toolkit Integration](https://docs.arcade.dev/mcp-servers/development/github/github): Integrate GitHub with agents for repository management and automation. - [GitHub Toolkit Reference](https://docs.arcade.dev/mcp-servers/development/github/reference): Comprehensive reference for GitHub Toolkit features and options. - [Imgflip Meme Toolkit](https://docs.arcade.dev/mcp-servers/entertainment/imgflip): Create and search memes easily with Imgflip toolkit. - [Spotify Toolkit Overview](https://docs.arcade.dev/mcp-servers/entertainment/spotify): Interact with Spotify tracks using Arcade's toolkit features. - [Twitch Auth Configuration](https://docs.arcade.dev/mcp-servers/entertainment/twitch): Guide to configuring Twitch authentication for Arcade tools. - [Stripe Payment Toolkit](https://docs.arcade.dev/mcp-servers/payments/stripe): Interact with Stripe API for payments and invoicing. - [Asana Toolkit Integration](https://docs.arcade.dev/mcp-servers/productivity/asana): Integrate Asana for task and project management easily. - [Asana Toolkit Reference](https://docs.arcade.dev/mcp-servers/productivity/asana/reference): Comprehensive Asana reference for tag colors and task sorting. - [ClickUp Toolkit](https://docs.arcade.dev/mcp-servers/productivity/clickup): Integrate ClickUp for task management and collaboration tools. - [Clickup Toolkit Reference](https://docs.arcade.dev/mcp-servers/productivity/clickup/reference): Comprehensive reference for Clickup toolkit enumerations and values. - [Close.io Productivity](https://docs.arcade.dev/mcp-servers/productivity/closeio): Explore Close.io for productivity and integration tools. - [Confluence Toolkit](https://docs.arcade.dev/mcp-servers/productivity/confluence): Toolkit for integrating and managing Confluence content easily. - [Dropbox Toolkit Integration](https://docs.arcade.dev/mcp-servers/productivity/dropbox/dropbox): Integrate Dropbox for file management and agent interaction. - [Dropbox Item Categories](https://docs.arcade.dev/mcp-servers/productivity/dropbox/reference): Comprehensive reference for Dropbox item categories and integrations. - [Arcade Gmail Toolkit](https://docs.arcade.dev/mcp-servers/productivity/gmail): Manage emails effortlessly with the Arcade Gmail toolkit. - [Gmail Toolkit Reference](https://docs.arcade.dev/mcp-servers/productivity/gmail/reference): Reference for Gmail toolkit enumerations and date ranges. - [Google Calendar Toolkit](https://docs.arcade.dev/mcp-servers/productivity/google_calendar): Integrate Google Calendar for event management and scheduling. - [Google Calendar Reference](https://docs.arcade.dev/mcp-servers/productivity/google_calendar/reference): Reference for Google Calendar toolkit enumerations and options. - [Google Contacts Toolkit](https://docs.arcade.dev/mcp-servers/productivity/google_contacts): Interact with Google Contacts to manage and search contacts. - [Google Docs Toolkit](https://docs.arcade.dev/mcp-servers/productivity/google_docs): Toolkit for integrating and managing Google Docs documents easily. - [Google Docs Reference](https://docs.arcade.dev/mcp-servers/productivity/google_docs/reference): Reference for Google Docs toolkit enumerations and formats. - [Google Drive Toolkit](https://docs.arcade.dev/mcp-servers/productivity/google_drive): Toolkit for managing and accessing Google Drive files efficiently. - [Google Drive Reference](https://docs.arcade.dev/mcp-servers/productivity/google_drive/reference): Reference for Google Drive toolkit enumerations and file types. - [Google Sheets Toolkit](https://docs.arcade.dev/mcp-servers/productivity/google_sheets): Integrate Google Sheets with agents for enhanced productivity. - [Google Sheets Reference](https://docs.arcade.dev/mcp-servers/productivity/google_sheets/reference): Reference for Google Sheets toolkit enumerations and orderings. - [Google Slides Toolkit](https://docs.arcade.dev/mcp-servers/productivity/google_slides): Interact with Google Slides to create, comment, and search presentations. - [Jira Toolkit](https://docs.arcade.dev/mcp-servers/productivity/jira): Comprehensive toolkit for managing Jira issues and projects. - [Jira Environment Variables](https://docs.arcade.dev/mcp-servers/productivity/jira/environment_variables): Manage Jira API settings with environment variables for performance. - [Jira Toolkit Reference](https://docs.arcade.dev/mcp-servers/productivity/jira/reference): Reference for Jira toolkit enumerations and configurations. - [Linear Toolkit](https://docs.arcade.dev/mcp-servers/productivity/linear): Streamlined toolkit for interacting with Linear's issue tracking. - [Notion Toolkit](https://docs.arcade.dev/mcp-servers/productivity/notion): Toolkit for integrating and managing Notion pages easily. - [Arcade Obsidian Toolkit](https://docs.arcade.dev/mcp-servers/productivity/obsidian): Community-driven toolkit for enhancing productivity in Obsidian. - [Outlook Calendar Toolkit](https://docs.arcade.dev/mcp-servers/productivity/outlook_calendar): Create and manage events using Outlook Calendar integration. - [Outlook Mail Toolkit](https://docs.arcade.dev/mcp-servers/productivity/outlook_mail): Toolkit for managing emails using Outlook API features. - [Outlook Mail Reference](https://docs.arcade.dev/mcp-servers/productivity/outlook_mail/reference): Reference for Outlook Mail toolkit enumerations and filters. - [SharePoint Toolkit](https://docs.arcade.dev/mcp-servers/productivity/sharepoint): Toolkit for efficient SharePoint site interactions and management. - [Hubspot CRM Integration](https://docs.arcade.dev/mcp-servers/sales/hubspot): Integrate Hubspot CRM with agents for seamless data access. - [Salesforce CRM Toolkit](https://docs.arcade.dev/mcp-servers/sales/salesforce): Integrate Salesforce CRM with custom auth and tools. - [Google Finance Toolkit](https://docs.arcade.dev/mcp-servers/search/google_finance): Retrieve real-time and historical stock data easily. - [Google Flights Toolkit](https://docs.arcade.dev/mcp-servers/search/google_flights): Search for flights easily with Arcade's Google Flights toolkit. - [Google Hotels Toolkit](https://docs.arcade.dev/mcp-servers/search/google_hotels): Search for hotels globally with Arcade's Google Hotels toolkit. - [Google Jobs Toolkit](https://docs.arcade.dev/mcp-servers/search/google_jobs): Search for job openings using Google Jobs toolkit. - [Google Maps Toolkit](https://docs.arcade.dev/mcp-servers/search/google_maps): Integrate Google Maps for directions between locations easily. - [Google News Toolkit](https://docs.arcade.dev/mcp-servers/search/google_news): Search for news stories using Google News toolkit. - [Google Search Toolkit](https://docs.arcade.dev/mcp-servers/search/google_search): Enable agents to perform Google searches using SerpAPI. - [Google Shopping Search](https://docs.arcade.dev/mcp-servers/search/google_shopping): Search for products easily using Google Shopping toolkit. - [Walmart Product Search](https://docs.arcade.dev/mcp-servers/search/walmart): Search for Walmart products and get product details easily. - [YouTube Video Search](https://docs.arcade.dev/mcp-servers/search/youtube): Search for YouTube videos and get video details easily. - [Discord Auth Configuration](https://docs.arcade.dev/mcp-servers/social-communication/discord): Guide to configure Discord auth with Arcade tools. - [LinkedIn Toolkit](https://docs.arcade.dev/mcp-servers/social-communication/linkedin): Toolkit for integrating LinkedIn interactions in applications. - [Microsoft Teams Toolkit](https://docs.arcade.dev/mcp-servers/social-communication/microsoft_teams): Toolkit for managing Microsoft Teams interactions and communications. - [Microsoft Teams Reference](https://docs.arcade.dev/mcp-servers/social-communication/microsoft_teams/reference): Reference for Microsoft Teams toolkit enumerations and types. - [Reddit Toolkit](https://docs.arcade.dev/mcp-servers/social-communication/reddit): Toolkit for Reddit interactions, including posting and commenting. - [Slack Toolkit Overview](https://docs.arcade.dev/mcp-servers/social-communication/slack): Integrate Slack for efficient communication and user management. - [Slack Environment Variables](https://docs.arcade.dev/mcp-servers/social-communication/slack/environment_variables): Manage Slack API requests with environment variable settings. - [Arcade Slack Integration](https://docs.arcade.dev/mcp-servers/social-communication/slack/install): Integrate Arcade with Slack for enhanced team communication. - [Slack Toolkit Reference](https://docs.arcade.dev/mcp-servers/social-communication/slack/reference): Reference for Slack toolkit conversation types and integrations. - [Teams Toolkit Reference](https://docs.arcade.dev/mcp-servers/social-communication/teams/reference): Reference for Teams toolkit enumerations and match types. - [Arcade Twilio Toolkit](https://docs.arcade.dev/mcp-servers/social-communication/twilio/readme): Toolkit for sending SMS and WhatsApp messages via Twilio. - [Twilio Toolkit](https://docs.arcade.dev/mcp-servers/social-communication/twilio/reference): Twilio toolkit for sending SMS and WhatsApp messages. - [X Toolkit](https://docs.arcade.dev/mcp-servers/social-communication/x): Toolkit for agents to interact with X (formerly Twitter). - [Zoom Toolkit Integration](https://docs.arcade.dev/mcp-servers/social-communication/zoom): Integrate Zoom for meeting management and invitations. - [Arcade Zoom Integration](https://docs.arcade.dev/mcp-servers/social-communication/zoom/install): Integrate Arcade with Zoom for efficient meeting management. - [404 Error Page](https://docs.arcade.dev/mcp-servers/development/code-sandbox): Page not found error with status updates available. - [404 Error Page](https://docs.arcade.dev/mcp-servers/productivity/google/reference): Page not found error with status updates available. ``` ## Arcade Tools Overview https://docs.arcade.dev2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/api-keys2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/arcade-cli2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/arcade-clients2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/auth-providers2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/auth-providers/asana2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/auth-providers/atlassian2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/auth-providers/clickup2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/auth-providers/discord2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/auth-providers/dropbox2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/auth-providers/github2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/auth-providers/google2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/auth-providers/hubspot2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/auth-providers/linear2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/auth-providers/linkedin2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/auth-providers/microsoft2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/auth-providers/notion2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/auth-providers/oauth22025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/auth-providers/reddit2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/auth-providers/salesforce2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/auth-providers/slack2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/auth-providers/spotify2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/auth-providers/twitch2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/auth-providers/x2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/auth-providers/zendesk2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/auth-providers/zoom2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/auth/auth-tool-calling2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/auth/call-third-party-apis-directly2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/auth/how-arcade-helps2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/auth/secure-auth-production2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/auth/tool-auth-status2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/build-tools/create-a-tool-with-auth2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/build-tools/create-a-tool-with-secrets2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/build-tools/create-a-mcp-server2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/build-tools/handle-tool-errors2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/build-tools/retry-tools-with-improved-prompt2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/build-tools/tool-context2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/changelog2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/contact-us2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/crewai/custom-auth-flow2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/crewai/use-arcade-tools2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/evaluate-tools/create-an-evaluation-suite2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/evaluate-tools/run-evaluations2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/evaluate-tools/why-evaluate-tools2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/faq2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/glossary2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/google-adk/overview2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/google-adk/use-arcade-tools2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/hosting-overview2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/deployment/on-prem-mcp2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/langchain/auth-langchain-tools2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/langchain/use-arcade-tools2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/langchain/user-auth-interrupts2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/local-deployment/configure/arcade-deploy2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/deployment/engine-configuration2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/deployment/on-prem-mcp2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/local-deployment/configure/templates2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/local-deployment/install/docker2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/deployment/engine-configuration2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/deployment/engine-configuration2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/local-deployment/install/toolkits2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/mastra/overview2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/mastra/use-arcade-tools2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/mastra/user-auth-interrupts2025-09-27T01:29:11.415Zdaily0.7https://docs.arcade.dev/home/mcp-desktop-clients/claude-desktop-client2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/home/mcp-desktop-clients/vscode-client2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/home/mcp-overview2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/home/migrate-to-v22025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/home/oai-agents/overview2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/home/oai-agents/use-arcade-tools2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/home/oai-agents/user-auth-interrupts2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/home/quickstart2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/home/registry-early-access2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/home/serve-tools/arcade-deploy2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/home/serve-tools/docker-worker2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/home/serve-tools/modal-worker2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/home/use-tools/get-tool-definitions2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/home/use-tools/tools-overview2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/home/use-tools/types-of-tools2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/home/vercelai/use-arcade-tools2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/toolkits2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/community-toolkit-template2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/contribute-a-toolkit2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/customer-support/zendesk2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/customer-support/zendesk/reference2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/databases/clickhouse2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/databases/mongodb2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/databases/postgres2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/development/e2b2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/development/firecrawl/firecrawl2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/development/firecrawl/reference2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/development/github/github2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/development/github/reference2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/entertainment/imgflip2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/entertainment/spotify2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/entertainment/twitch2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/payments/stripe2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/productivity/asana2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/productivity/asana/reference2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/productivity/clickup2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/productivity/clickup/reference2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/productivity/closeio2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/productivity/confluence2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/productivity/dropbox/dropbox2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/productivity/dropbox/reference2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/productivity/gmail2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/productivity/gmail/reference2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/productivity/google\_calendar2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/productivity/google\_calendar/reference2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/productivity/google\_contacts2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/productivity/google\_docs2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/productivity/google\_docs/reference2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/productivity/google\_drive2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/productivity/google\_drive/reference2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/productivity/google\_sheets2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/productivity/google\_sheets/reference2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/productivity/google\_slides2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/productivity/jira2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/productivity/jira/environment\_variables2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/productivity/jira/reference2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/productivity/linear2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/productivity/notion2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/productivity/obsidian2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/productivity/outlook\_calendar2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/productivity/outlook\_mail2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/productivity/outlook\_mail/reference2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/productivity/sharepoint2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/sales/hubspot2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/sales/hubspot/reference2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/sales/salesforce2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/search/google\_finance2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/search/google\_flights2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/search/google\_hotels2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/search/google\_jobs2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/search/google\_maps2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/search/google\_news2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/search/google\_search2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/search/google\_shopping2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/search/walmart2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/search/youtube2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/social-communication/discord2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/social-communication/linkedin2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/social-communication/microsoft\_teams2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/social-communication/microsoft\_teams/reference2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/social-communication/reddit2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/social-communication/slack2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/social-communication/slack/environment\_variables2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/social-communication/slack/install2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/social-communication/slack/reference2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/social-communication/slack\_api2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/social-communication/teams/reference2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/social-communication/twilio/readme2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/social-communication/twilio/reference2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/social-communication/x2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/social-communication/zoom2025-09-27T01:29:11.416Zdaily0.7https://docs.arcade.dev/mcp-servers/social-communication/zoom/install2025-09-27T01:29:11.416Zdaily0.7 ## OAuth 2.0 Setup [Home](https://docs.arcade.dev/home "Home") [Customizing Auth](https://docs.arcade.dev/home/auth-providers "Customizing Auth") OAuth 2.0 # OAuth 2.0 auth provider The OAuth 2.0 auth provider enables tools and agents to authorize with any OAuth 2.0-compatible API on behalf of a user. Behind the scenes, the Arcade Engine and this auth provider seamlessly manage OAuth 2.0 authorization for your users. Arcade has [pre-built integrations](https://docs.arcade.dev/home/auth-providers) with many popular OAuth 2.0 providers. Use this OAuth 2.0 provider to connect to other systems that aren’t pre-built. ### What’s documented here [Permalink for this section](https://docs.arcade.dev/home/auth-providers/oauth2\#whats-documented-here) This page describes how to configure OAuth 2.0 with Arcade, and use it in: - Your [app code](https://docs.arcade.dev/home/auth-providers/oauth2#using-oauth-20-in-app-code) that needs to call APIs protected by OAuth 2.0 - Or, your [custom tools](https://docs.arcade.dev/home/auth-providers/oauth2#using-oauth-20-in-custom-tools) that need to call APIs protected by OAuth 2.0 ### Supported OAuth 2.0 flows [Permalink for this section](https://docs.arcade.dev/home/auth-providers/oauth2\#supported-oauth-20-flows) The only supported OAuth 2.0 flow is the authorization code grant flow (with or without PKCE). ## Configuring OAuth 2.0 [Permalink for this section](https://docs.arcade.dev/home/auth-providers/oauth2\#configuring-oauth-20) How you configure the OAuth 2.0 provider depends on whether you use the Arcade Cloud Engine or a [self-hosted Engine](https://docs.arcade.dev/home/deployment/engine-configuration). If you use the Cloud Engine, you must configure your provider in the Dashboard. When configuring your app in the OAuth 2.0 enabled service, you must use the redirect URL generated by Arcade (see below) as the redirect URL (sometimes called the redirect URI or callback URL). ### Using the Arcade Dashboard [Permalink for this section](https://docs.arcade.dev/home/auth-providers/oauth2\#using-the-arcade-dashboard) When using the Arcade Cloud Platform, the Dashboard is available at [`https://api.arcade.dev/dashboard`](https://api.arcade.dev/dashboard). If you are [self-hosting Arcade](https://docs.arcade.dev/home/deployment/engine-configuration), by default the Dashboard is available at [`http://localhost:9099/dashboard`](http://localhost:9099/dashboard). Adjust the host and port, if necessary, to match your environment. 1. Navigate to the OAuth section of the Arcade Dashboard and click **Add OAuth Provider**. 2. Select **OAuth 2.0** as the provider. 3. Choose a unique **ID** for your provider (e.g. “my-oauth2-provider”) with an optional **Description**. 4. Enter your **Client ID** and **Client Secret** from your OAuth 2.0 provider. 5. Note the **Redirect URL** generated by Arcade. This must be set as the redirect URL in the external service’s configuration. 6. Click **Save**. When you use tools that require OAuth 2.0 authorization using your Arcade account credentials, the Arcade Engine will automatically use this OAuth 2.0 provider. ### Using the `engine.yaml` configuration file [Permalink for this section](https://docs.arcade.dev/home/auth-providers/oauth2\#using-the-engineyaml-configuration-file) This method is only available when you are [self-hosting the engine](https://docs.arcade.dev/home/deployment/engine-configuration) ### Set environment variables [Permalink for this section](https://docs.arcade.dev/home/auth-providers/oauth2\#set-environment-variables) Set the following environment variables. Replace `HOOLI` with the name of the OAuth 2.0 provider you are configuring: ```nextra-code export HOOLI_CLIENT_ID="" export HOOLI_CLIENT_SECRET="" ``` Or, you can set these values in a `.env` file: ```nextra-code HOOLI_CLIENT_ID="" HOOLI_CLIENT_SECRET="" ``` See [configuration](https://docs.arcade.dev/home/deployment/engine-configuration) for more information on how to set environment variables and configure the Arcade Engine. ### Edit the Engine configuration [Permalink for this section](https://docs.arcade.dev/home/auth-providers/oauth2\#edit-the-engine-configuration) To locate the `engine.yaml` file in your OS after installing the Arcade Engine, check the [Engine configuration file](https://docs.arcade.dev/home/deployment/on-prem-mcp) documentation. Edit the `engine.yaml` file and add a new item to the `auth.providers` section: ```nextra-code auth: providers: - id: default-github description: The default GitHub provider enabled: true type: oauth2 provider_id: github client_id: ${env:GITHUB_CLIENT_ID} client_secret: ${env:GITHUB_CLIENT_SECRET} - id: hooli description: Hooli OAuth 2.0 provider enabled: true type: oauth2 client_id: ${env:HOOLI_CLIENT_ID} client_secret: ${env:HOOLI_CLIENT_SECRET} oauth2: # For a custom OAuth 2.0 provider, specify the full OAuth configuration: ``` The ID of the provider ( `hooli` in this example) can be any string. It’s used to reference the provider in your app code and must be unique. Each service expects a slightly different set of values in the `oauth2` section. Refer to the configuration reference below, and to your service’s documentation to understand what values are required. If you need help configuring a specific provider, [get in touch with\\ us](mailto:contact@arcade.dev)! ### Configuration reference [Permalink for this section](https://docs.arcade.dev/home/auth-providers/oauth2\#configuration-reference) For a full example, see the [full configuration example](https://docs.arcade.dev/home/auth-providers/oauth2#full-configuration-example) below. `scope_delimiter` _(optional, defaults to the space character)_: The delimiter to use between scopes. `pkce` _(optional)_: - `enabled` _(optional, default `false`)_: If `true`, PKCE will be used. - `code_challenge_method` _(optional, default `S256`)_: The code challenge method to use. The only supported method is `S256`. This parameter is ignored if PKCE is not enabled. #### `authorize_request` [Permalink for this section](https://docs.arcade.dev/home/auth-providers/oauth2\#authorize_request) This section configures the initial authorization request. - `endpoint`: The authorization endpoint for your OAuth 2.0 server, e.g. `/oauth2/authorize` - `params`: A map of parameter keys and values to include in the authorization request. These placeholders are available in `params`: - `{{client_id}}`: The configured client ID. - `{{redirect_uri}}`: The redirect URI managed by Arcade. - `{{scopes}}`: The scopes to request, if any - `{{existing_scopes}}`: The scopes that the user has already granted, if any. The `state` parameter is automatically added to the request, and does not need to be included in `params`. If PKCE is enabled, `code_challenge` and `code_challenge_method` are also added automatically. For most providers, `oauth2.authorize_request` will look like: ```nextra-code authorize_request: endpoint: 'https://example.com/oauth2/authorize' params: response_type: code client_id: '{{client_id}}' redirect_uri: '{{redirect_uri}}' scope: '{{scopes}} {{existing_scopes}}' ``` Some providers support additional parameters in the authorization request. These can be added to `params` as well. For example: ```nextra-code authorize_request: endpoint: 'https://example.com/oauth2/authorize' params: response_type: code client_id: '{{client_id}}' redirect_uri: '{{redirect_uri}}' scope: '{{scopes}} {{existing_scopes}}' prompt: consent access_type: offline ``` #### `token_request` [Permalink for this section](https://docs.arcade.dev/home/auth-providers/oauth2\#token_request) This section configures the code/token exchange request, after the user has approved access to your app. - `endpoint`: The token endpoint for your OAuth 2.0 server, e.g. `/oauth2/token` - `auth_method` _(optional, default none)_: The authentication method to use. Supported values are none (omitted) and `client_secret_basic`. - `params`: A map of parameter keys and values to include in the token request. These placeholders are available in `params`: - `{{client_id}}`: The configured client ID. - `{{client_secret}}`: The configured client secret. - `{{redirect_uri}}`: The redirect URI managed by Arcade. The `code` parameter is automatically added to the request, and does not need to be included in `params`. If PKCE is enabled, the `code_verifier` parameter is also added to the request automatically. For most providers, `oauth2.token_request.params` will look like: ```nextra-code token_request: endpoint: 'https://example.com/oauth2/token' params: grant_type: authorization_code redirect_uri: '{{redirect_uri}}' client_id: '{{client_id}}' client_secret: '{{client_secret}}' # Omit if using PKCE ``` - `response_content_type` _(optional, default `application/json`)_: The expected content type of the response. Supported values are `application/json` and `application/x-www-form-urlencoded`. - `response_map` _(optional)_: A map of keys and values to extract from the response. Supported keys are `access_token`, `expires_in`, `refresh_token`, `scope`, and `token_type`. Supports simple JSONPath expressions. Only applicable if `response_content_type` is `application/json`. See the [JSONPath reference](https://docs.arcade.dev/home/auth-providers/oauth2#jsonpath-expressions-in-response_map) for details on extracting values using JSONPath. #### `refresh_request` [Permalink for this section](https://docs.arcade.dev/home/auth-providers/oauth2\#refresh_request) This section configures the refresh token request, if your OAuth 2.0 server supports refresh tokens. If not provided, refresh tokens will not be used. - `endpoint`: The refresh token endpoint for your OAuth 2.0 server, e.g. `/oauth2/token` - `auth_method` _(optional, default none)_: The authentication method to use. Supported values are none (omitted), `client_secret_basic`, and `bearer_access_token`. - `params`: A map of parameter keys and values to include in the refresh token request. These placeholders are available in `params`: - `{{refresh_token}}`: The refresh token to use. - `{{client_id}}`: The configured client ID. - `{{client_secret}}`: The configured client secret. For most providers, `oauth2.refresh_request.params` will look like: ```nextra-code refresh_request: endpoint: 'https://example.com/oauth2/token' params: grant_type: refresh_token client_id: '{{client_id}}' client_secret: '{{client_secret}}' ``` - `response_content_type` _(optional, default `application/json`)_: The expected content type of the response. Supported values are `application/json` and `application/x-www-form-urlencoded`. - `response_map` _(optional)_: A map of keys and values to extract from the response. Supported keys are `access_token`, `expires_in`, `refresh_token`, `scope`, and `token_type`. Supports simple JSONPath expressions. Only applicable if `response_content_type` is `application/json`. See the [JSONPath reference](https://docs.arcade.dev/home/auth-providers/oauth2#jsonpath-expressions-in-response_map) for details on extracting values using JSONPath. #### `user_info_request` [Permalink for this section](https://docs.arcade.dev/home/auth-providers/oauth2\#user_info_request) Some OAuth 2.0 APIs provide a user info endpoint that returns information about the user. Arcade Engine can automatically request user info from servers that support it. If the `user_info_request` section is omitted, user info will not be requested. - `endpoint`: The user info endpoint for your OAuth 2.0 server, e.g. `/oauth2/userinfo` - `auth_method` _(optional, default `bearer_access_token`)_: The authentication method to use. The only supported value is `bearer_access_token`. - `response_content_type` _(optional, default `application/json`)_: The expected content type of the response. The only supported value is `application/json`. - `response_map` _(optional)_: A map of keys and values to extract from the response. If no `response_map` is provided, the entire response will be extracted verbatim. Supports simple JSONPath expressions. Only applicable if `response_content_type` is `application/json`. See the [JSONPath reference](https://docs.arcade.dev/home/auth-providers/oauth2#jsonpath-expressions-in-response_map) for details on extracting values using JSONPath. - `triggers`: Controls when the user info request is made. - `on_token_grant`: If `true`, the user info request will be made when a token is granted. This is typically only once for each user, unless new scopes are granted. - `on_token_refresh`: If `true`, the user info request will be made every time a token is refreshed. #### `token_introspection_request` [Permalink for this section](https://docs.arcade.dev/home/auth-providers/oauth2\#token_introspection_request) Some OAuth 2.0 APIs provide a token introspection endpoint that can be used to check the validity of a token and retrieve additional information such as token expiration time. An example of a token introspection request configuration: ```nextra-code auth: providers: - id: custom-provider description: "Custom provider" enabled: true type: oauth2 client_id: ${env:CUSTOM_CLIENT_ID} client_secret: ${env:CUSTOM_CLIENT_SECRET} oauth2: token_introspection_request: enabled: true endpoint: 'https://example.oauth.com/services/oauth2/introspect' method: POST params: token: '{{access_token}}' auth_method: 'client_secret_basic' request_content_type: application/x-www-form-urlencoded response_content_type: application/json response_map: expires_in: '$.exp' scope: '$.scope' expiration_format: absolute_unix_timestamp triggers: on_token_grant: true on_token_refresh: true ``` - `enabled` _(optional, default `false`)_: If `true`, the token introspection request will be made. - `endpoint` _(required)_: The endpoint to use for the token introspection request. - `method` _(optional, default `GET`)_: The HTTP method to use for the token introspection request. - `params` _(optional)_: A map of parameter keys and values to include in the token introspection request. Currently, only mapping a field to the internal `access_token` field is supported. - `auth_method` _(optional, default `client_secret_basic`)_: The authentication method to use for the token introspection request. Supported values are `client_secret_basic` and `bearer_access_token`. - `request_content_type` _(optional, default `application/x-www-form-urlencoded`)_: The content type of the request body. - `response_content_type` _(optional, default `application/json`)_: The content type of the response body. - `response_map` _(required)_: A map of keys and values to extract from the response. Supported keys are `expires_in` and `scope`. Supports simple JSONPath expressions. - `expiration_format` _(optional, default `absolute_unix_timestamp`)_: The format of the expiration time. Supported values are `absolute_unix_timestamp` and `relative_seconds`. - `triggers` _(required)_: Controls when the token introspection request is made. - `on_token_grant`: If `true`, the token introspection request will be made when a token is granted. This is typically only once for each user, unless new scopes are granted. - `on_token_refresh`: If `true`, the token introspection request will be made every time a token is refreshed. #### JSONPath expressions in `response_map` [Permalink for this section](https://docs.arcade.dev/home/auth-providers/oauth2\#jsonpath-expressions-in-response_map) In the `token_request`, `refresh_request`, `token_introspection_request`, and `user_info_request` sections, you can specify a `response_map`. Configuring a response map is useful if your OAuth 2.0 server returns a JSON object with nested properties, or properties with non-standard names. For example, for the token request, most OAuth 2.0 servers return a JSON payload that looks like this: ```nextra-code { "access_token": "...", "refresh_token": "...", "expires_in": 3600, "scope": "scope1 scope2" } ``` If your server returns a payload of this shape, you don’t need `response_map`! But if your server returns: ```nextra-code { "data": { "access_token": "...", "expires_in": 3600, "refresh_token": "...", "scope": "scope1 scope2" } } ``` Then you need to configure `response_map` to extract the nested properties from inside the `data` object. Use [JSONPath](https://en.wikipedia.org/wiki/JSONPath) expressions to select the properties you need: ```nextra-code token_request: response_map: access_token: "$.data.access_token" expires_in: "$.data.expires_in" refresh_token: "$.data.refresh_token" # Only needed if refresh tokens are used scope: "$.data.scope" # Only needed if scopes are used ``` Similarly, for user info or token introspection requests, you can use `response_map` to extract custom properties from the response. #### Handling scope arrays [Permalink for this section](https://docs.arcade.dev/home/auth-providers/oauth2\#handling-scope-arrays) Most OAuth 2.0 servers return scopes as a delimited string, such as `scope1 scope2` or `scope1,scope2`. If your server follows this convention, configuring the top-level `scope_delimiter` property in the `oauth2` section is all you need to do. Some OAuth 2.0 servers return an array of scopes instead of a delimited string. For example: ```nextra-code { "access_token": "...", "expires_in": 3600, "scope": ["scope1", "scope2"] } ``` In this case, you need to use the `join()` function in `response_map` to join the scopes into a delimited string: ```nextra-code token_request: response_map: access_token: "$.access_token" expires_in: "$.expires_in" scope: "join('$.scope', ' ')" ``` `join()` takes two arguments: - `path`: The JSONPath expression to select the array to join. - `delimiter`: The delimiter to use between array elements. Make sure this matches the `scope_delimiter` setting in the `oauth2` section. #### Extracting values from JWTs [Permalink for this section](https://docs.arcade.dev/home/auth-providers/oauth2\#extracting-values-from-jwts) Some OAuth 2.0 servers return JWT tokens that contain claims you might need to extract. For example, the token might contain scopes or other information about the user. You can use the `jwt_decode()` function in `response_map` to extract values from JWT tokens: ```nextra-code token_request: response_map: access_token: "$.access_token" expires_in: "$.expires_in" scope: "jwt_decode('$.access_token', '$.scope')" ``` `jwt_decode()` takes two arguments: - `token_path`: The JSONPath expression to select the JWT token. - `claim_path`: The JSONPath expression to select the claim within the decoded JWT payload. If the claim is an array (like scopes often are), you can combine `jwt_decode()` with `join()` to extract and format the values: ```nextra-code token_request: response_map: access_token: "$.access_token" expires_in: "$.expires_in" scope: "join(jwt_decode('$.access_token', '$.scp'), ' ')" ``` This is particularly useful when the JWT token contains scopes in an array format (like `scp: ["scope1", "scope2"]`) and you need to convert them to a space-delimited string. You can also extract nested claims from the JWT payload using dot notation in the claim path: ```nextra-code token_request: response_map: access_token: "$.access_token" expires_in: "$.expires_in" scope: "jwt_decode('$.access_token', '$.nested.scopes')" ``` #### Full configuration example [Permalink for this section](https://docs.arcade.dev/home/auth-providers/oauth2\#full-configuration-example) Here’s a full example of the YAML configuration for a custom OAuth 2.0 provider: Click to view example ## Using OAuth 2.0 in app code [Permalink for this section](https://docs.arcade.dev/home/auth-providers/oauth2\#using-oauth-20-in-app-code) Use the OAuth 2.0 auth provider in your own agents and AI apps to get a user token for any OAuth 2.0-compatible APIs. See [authorizing agents with Arcade](https://docs.arcade.dev/home/auth/how-arcade-helps) to understand how this works. Use `client.auth.start()` to get an access token: PythonJavaScript ```nextra-code 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="hooli", scopes=["scope1", "scope2"], ) 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 # TODO: Do something interesting with the token... ``` ## Using OAuth 2.0 in custom tools [Permalink for this section](https://docs.arcade.dev/home/auth-providers/oauth2\#using-oauth-20-in-custom-tools) You can author your own [custom tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server) that interact with any OAuth 2.0-compatible APIs. Use the `OAuth2()` auth class to specify that a tool requires OAuth 2.0 authorization. In your tool function, `context.authorization` will be automatically populated with the following properties: - `context.authorization.token` contains the user’s access token. - If `oauth2.user_info_request` is configured, the user info will be fetched and placed in `context.authorization.user_info`. The data payload is specific to each provider. ```nextra-code from typing import Annotated from arcade_tdk import ToolContext, tool from arcade_tdk.auth import OAuth2 @tool( requires_auth=OAuth2( provider_id="hooli", scopes=["scope1", "scope2"], ) ) async def reticulate_splines( context: ToolContext, num_splines: Annotated[int, "The number of splines to reticulate"], ): """Reticulate the specified number of splines.""" # Get an access token to call an API token = context.authorization.token # Get user info (if configured and supported by the OAuth 2.0 server): user_id = context.authorization.user_info.get("sub") ``` [Notion](https://docs.arcade.dev/home/auth-providers/notion "Notion") [Reddit](https://docs.arcade.dev/home/auth-providers/reddit "Reddit") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Slack Environment Variables [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Social & Communication](https://docs.arcade.dev/mcp-servers/social-communication/discord "Social & Communication") [Slack](https://docs.arcade.dev/mcp-servers/social-communication/slack "Slack") Environment Variables # Slack Environment Variables ### `SLACK_MAX_CONCURRENT_REQUESTS` [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack/environment_variables\#slack_max_concurrent_requests) Arcade uses asynchronous calls to request Slack API endpoints. In some tools, multiple concurrent HTTP requests may be issued to speed up execution. This environment variable controls the maximum number of concurrent requests to Slack API in any tool execution. The value must be a numeric string with an integer greater than or equal to 1. **Default:** `3` ### `MAX_PAGINATION_SIZE_LIMIT` [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack/environment_variables\#max_pagination_size_limit) This environment variable controls the maximum number of items requested in a single call to a Slack API endpoint. Some of the Slack tools allow the tool caller to request a larger number of items per tool call, but the tool will paginate the results internally while respecting the `MAX_PAGINATION_SIZE_LIMIT`. **Default:** `200` (Slack supports, but discourages a limit larger than 200) ### `MAX_PAGINATION_TIMEOUT_SECONDS` [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack/environment_variables\#max_pagination_timeout_seconds) Controls the maximum number of seconds any given Slack tool should wait while paginating responses from the Slack API. **Default:** `30` (expressed in seconds) [Slack](https://docs.arcade.dev/mcp-servers/social-communication/slack "Slack") [Reference](https://docs.arcade.dev/mcp-servers/social-communication/slack/reference "Reference") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Connect Claude Desktop [Home](https://docs.arcade.dev/home "Home") IDEs and desktop clientsUse Arcade with Claude Desktop # Use Arcade with Claude Desktop In this guide, you’ll learn how to connect Claude Desktop to a local Arcade server. ### Prerequisites [Permalink for this section](https://docs.arcade.dev/home/mcp-desktop-clients/claude-desktop-client\#prerequisites) 1. Create an [Arcade account](https://api.arcade.dev/signup) 2. Get an [Arcade API key](https://docs.arcade.dev/home/api-keys) 3. Install **Python 3.10** or higher Verify your Python version by running `python --version` or `python3 --version` in your terminal. ### Install Dependencies [Permalink for this section](https://docs.arcade.dev/home/mcp-desktop-clients/claude-desktop-client\#install-dependencies) ```nextra-code pip install arcade-ai pip install arcade-google ``` See more of Arcade’s [Toolkits](https://docs.arcade.dev/toolkits) that can be installed. ### Set up Claude Desktop [Permalink for this section](https://docs.arcade.dev/home/mcp-desktop-clients/claude-desktop-client\#set-up-claude-desktop) 1. Download and open [Claude Desktop](https://claude.ai/download) 2. Claude Menu —> “Settings” —> “Developer” —> “Edit Config” 3. This will create a configuration file at: - On Mac: `~/Library/Application Support/Claude/claude_desktop_config.json` - On Windows: `%APPDATA%\Claude\claude_desktop_config.json` 4. Open the configuration file and replace the file contents with this: Replace `YOUR_ARCADE_API_KEY_HERE` with your actual Arcade API key and `/path/to/python` with the path to your Python interpreter and `/path/to/arcade` with the path to the Arcade package. ```nextra-code { "mcpServers": { "arcade-stdio": { "command": "bash", "args": [\ "-c",\ "export ARCADE_API_KEY=YOUR_ARCADE_API_KEY_HERE && /path/to/python /path/to/arcade serve --mcp"\ ] } } } ``` 5. Restart Claude Desktop. Upon restarting, you should have access to the Arcade toolkits you installed. [MCP Overview](https://docs.arcade.dev/home/mcp-overview "MCP Overview") [Use Arcade in Visual Studio Code](https://docs.arcade.dev/home/mcp-desktop-clients/vscode-client "Use Arcade in Visual Studio Code") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Google Sheets Reference [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Productivity & Docs](https://docs.arcade.dev/mcp-servers/productivity/asana "Productivity & Docs") [Google Sheets](https://docs.arcade.dev/mcp-servers/productivity/google_sheets "Google Sheets") Reference # GoogleSheets Reference Below is a reference of enumerations used by some tools in the GoogleSheets toolkit: ## OrderBy [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_sheets/reference\#orderby) - **CREATED\_TIME**: `createdTime` - **CREATED\_TIME\_DESC**: `createdTime desc` - **FOLDER**: `folder` - **FOLDER\_DESC**: `folder desc` - **MODIFIED\_BY\_ME\_TIME**: `modifiedByMeTime` - **MODIFIED\_BY\_ME\_TIME\_DESC**: `modifiedByMeTime desc` - **MODIFIED\_TIME**: `modifiedTime` - **MODIFIED\_TIME\_DESC**: `modifiedTime desc` - **NAME**: `name` - **NAME\_DESC**: `name desc` - **NAME\_NATURAL**: `name_natural` - **NAME\_NATURAL\_DESC**: `name_natural desc` - **QUOTA\_BYTES\_USED**: `quotaBytesUsed` - **QUOTA\_BYTES\_USED\_DESC**: `quotaBytesUsed desc` - **RECENCY**: `recency` - **RECENCY\_DESC**: `recency desc` - **SHARED\_WITH\_ME\_TIME**: `sharedWithMeTime` - **SHARED\_WITH\_ME\_TIME\_DESC**: `sharedWithMeTime desc` - **STARRED**: `starred` - **STARRED\_DESC**: `starred desc` - **VIEWED\_BY\_ME\_TIME**: `viewedByMeTime` - **VIEWED\_BY\_ME\_TIME\_DESC**: `viewedByMeTime desc` [Google Sheets](https://docs.arcade.dev/mcp-servers/productivity/google_sheets "Google Sheets") [Jira](https://docs.arcade.dev/mcp-servers/productivity/jira "Jira") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Outlook Calendar Toolkit [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Productivity & Docs](https://docs.arcade.dev/mcp-servers/productivity/asana "Productivity & Docs") Outlook Calendar # Outlook Calendar **Description:** Enable agents to create and list events in Outlook Calendar. **Author:** Arcade **Auth:** User authorizationvia the [Microsoft auth provider](https://docs.arcade.dev/home/auth-providers/microsoft) [![PyPI Version](https://img.shields.io/pypi/v/arcade_outlook_calendar)](https://pypi.org/project/arcade_outlook_calendar/)[![License](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/arcadeai/arcade-ai/blob/main/LICENSE)[![Python Versions](https://img.shields.io/pypi/pyversions/arcade_outlook_calendar)](https://pypi.org/project/arcade_outlook_calendar/)[![Wheel Status](https://img.shields.io/pypi/wheel/arcade_outlook_calendar)](https://pypi.org/project/arcade_outlook_calendar/)[![Downloads](https://img.shields.io/pypi/dm/arcade_outlook_calendar)](https://pypi.org/project/arcade_outlook_calendar/) The Arcade Outlook Calendar MCP Server provides pre-built tools for working with calendar events using the Outlook API. Use these tools to: - Create events - List events - Get an event ## Available Tools [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/outlook_calendar\#available-tools) These tools are currently available in the Arcade Outlook Calendar toolkit. | Tool Name | Description | | --- | --- | | OutlookCalendar.WhoAmI | Get information about the current user and their Outlook Calendar environment. | | OutlookCalendar.CreateEvent | Create an event in the authenticated user's default calendar | | OutlookCalendar.GetEvent | Get an event by its ID from the user's calendar | | OutlookCalendar.ListEventsInTimeRange | ist events in the user's calendar in a specific time range | If you need to perform an action that’s not listed here, you can [get in touch\\ with us](mailto:contact@arcade.dev) to request a new tool, or [create your\\ own tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server) with the [Google auth\\ provider](https://docs.arcade.dev/home/auth-providers/google#using-google-auth-in-custom-tools). ## OutlookCalendar.WhoAmI [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/outlook_calendar\#outlookcalendarwhoami) Get information about the current user and their Outlook Calendar environment. See Example > **Parameters** This tool does not take any parameters. * * * ## OutlookCalendar.CreateEvent [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/outlook_calendar\#outlookcalendarcreateevent) Create an event in the authenticated user’s default calendar. Ignores timezone offsets provided in the start\_date\_time and end\_date\_time parameters. Instead, uses the user’s default calendar timezone to filter events. If the user has not set a timezone for their calendar, then the timezone will be UTC. **Parameters** - **`subject`** _(string, required)_: The text of the event’s subject (title) line. - **`body`** _(string, required)_: The body of the event. - **`start_date_time`** _(datetime, required)_: The datetime of the event’s start, represented in ISO 8601 format. Timezone offset is ignored. For example, 2025-04-25T13:00:00 - **`end_date_time`** _(datetime, required)_: The datetime of the event’s end, represented in ISO 8601 format. Timezone offset is ignored. For example, 2025-04-25T13:30:00 - **`location`** _(string, optional)_: The location of the event. - **`attendee_emails`** _(list of strings, optional)_: The email addresses of the attendees of the event. Must be valid email addresses e.g., [username@domain.com](mailto:username@domain.com). - **`is_online_meeting`** _(bool, optional)_: Whether the event is an online meeting. Defaults to False See Example > * * * ## OutlookCalendar.GetEvent [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/outlook_calendar\#outlookcalendargetevent) Get an event by its ID from the user’s calendar. **Parameters** - **`event_id`** _(string, required)_: The ID of the event to get. See Example > * * * ## OutlookCalendar.ListEventsInTimeRange [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/outlook_calendar\#outlookcalendarlisteventsintimerange) List events in the user’s calendar in a specific time range. Ignores timezone offsets provided in the start\_date\_time and end\_date\_time parameters. Instead, uses the user’s default calendar timezone to filter events. If the user has not set a timezone for their calendar, then the timezone will be UTC. **Parameters** - **`start_date_time`** (datetime, required): The start date and time of the time range, represented in ISO 8601 format. Timezone offset is ignored. For example, 2025-04-24T19:00:00 - **`end_date_time`** (datetime, required): The end date and time of the time range, represented in ISO 8601 format. Timezone offset is ignored. For example, 2025-04-24T19:30:00 - **`limit`** (int, optional): The maximum number of events to return. Max 1000. Defaults to 10. See Example > * * * ## Auth [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/outlook_calendar\#auth) The Arcade Outlook Calendar toolkit uses the [Microsoft auth provider](https://docs.arcade.dev/home/auth-providers/microsoft) to connect to users’ Microsoft accounts. With the Arcade Cloud Platform, there’s nothing to configure. Your users will see `Arcade` as the name of the application that’s requesting permission. With a self-hosted installation of Arcade, you need to [configure the Microsoft auth provider](https://docs.arcade.dev/home/auth-providers/microsoft#configuring-microsoft-auth) with your own Microsoft app credentials. * * * ## Get Building [Use tools hosted on Arcade Cloud\\ \\ Arcade tools are hosted by our cloud platform and ready to be used in your agents. Learn how.](https://docs.arcade.dev/home/quickstart) [Self Host Arcade tools\\ \\ Arcade tools can be self-hosted on your own infrastructure. Learn more about self-hosting.\\ \\ ```\\ pip install arcade_outlook_calendar\\ ```](https://docs.arcade.dev/home/hosting-overview) [Obsidian](https://docs.arcade.dev/mcp-servers/productivity/obsidian "Obsidian") [Outlook Mail](https://docs.arcade.dev/mcp-servers/productivity/outlook_mail "Outlook Mail") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Slack Toolkit Reference [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Social & Communication](https://docs.arcade.dev/mcp-servers/social-communication/discord "Social & Communication") [Slack](https://docs.arcade.dev/mcp-servers/social-communication/slack "Slack") Reference # Slack Reference Below is a reference of enumerations used by some tools in the Slack toolkit: ## ConversationType [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack/reference\#conversationtype) - **PUBLIC\_CHANNEL**: `public_channel` - **PRIVATE\_CHANNEL**: `private_channel` - **MULTI\_PERSON\_DIRECT\_MESSAGE**: `multi_person_direct_message` - **DIRECT\_MESSAGE**: `direct_message` [Environment Variables](https://docs.arcade.dev/mcp-servers/social-communication/slack/environment_variables "Environment Variables") [Readme](https://docs.arcade.dev/mcp-servers/social-communication/twilio/readme "Readme") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Tool Authorization Status [Home](https://docs.arcade.dev/home "Home") [Authorization](https://docs.arcade.dev/home/auth/how-arcade-helps "Authorization") Checking Authorization Status # Checking Tool Authorization Status Before executing tools that require authorization, you can check their authorization status to understand what permissions are needed and whether they’re currently available for a user. This is useful for: - Displaying authorization requirements in your UI - Pre-checking tool availability before execution - Understanding which tools need user approval - Debugging authorization issues ### Initialize the client [Permalink for this section](https://docs.arcade.dev/home/auth/tool-auth-status\#initialize-the-client) Import the Arcade client in a Python/Javascript script. PythonJavaScript ```nextra-code from arcadepy import Arcade client = Arcade() # Automatically finds the `ARCADE_API_KEY` env variable ``` ### Check authorization status for all tools [Permalink for this section](https://docs.arcade.dev/home/auth/tool-auth-status\#check-authorization-status-for-all-tools) You can get a list of all available tools and check their authorization status for a specific user: PythonJavaScript ```nextra-code USER_ID = "{arcade_user_id}" # Get all tools for the user tools = client.tools.list(user_id=USER_ID) for tool in tools: print(f"Tool: {tool.name}") if tool.requirements: # Check if all requirements are met print(f"Requirements met: {tool.requirements.met}") # Check authorization status if tool.requirements.authorization: print(f"Authorization status: {tool.requirements.authorization.status}") print(f"Token status: {tool.requirements.authorization.token_status}") # Check secret requirements if tool.requirements.secrets: for secret in tool.requirements.secrets: print(f"Secret '{secret.key}' met: {secret.met}") if not secret.met and secret.status_reason: print(f"Reason: {secret.status_reason}") print("---") ``` If a username is not provided, the Token Status will be excluded and only the requirements for the provider will be shown. ### Check authorization status for a specific tool [Permalink for this section](https://docs.arcade.dev/home/auth/tool-auth-status\#check-authorization-status-for-a-specific-tool) You can also check the authorization status for a specific tool by name: PythonJavaScript ```nextra-code USER_ID = "{arcade_user_id}" TOOL_NAME = "Gmail.ListEmails" # Get specific tool details tool = client.tools.get(tool_name=TOOL_NAME, user_id=USER_ID) print(f"Tool: {tool.name}") print(f"Description: {tool.description}") if tool.requirements: print(f"All requirements met: {tool.requirements.met}") if tool.requirements.authorization: auth = tool.requirements.authorization print(f"Authorization required: {auth.provider_type}") print(f"Authorization status: {auth.status}") print(f"Token status: {auth.token_status}") if auth.status_reason: print(f"Status reason: {auth.status_reason}") if tool.requirements.secrets: print("Secret requirements:") for secret in tool.requirements.secrets: status = "✓" if secret.met else "✗" print(f" {status} {secret.key}") ``` ### Understanding the status values [Permalink for this section](https://docs.arcade.dev/home/auth/tool-auth-status\#understanding-the-status-values) #### Authorization Status [Permalink for this section](https://docs.arcade.dev/home/auth/tool-auth-status\#authorization-status) - `active`: If the provider is configured and enabled - `inactive`: Authorization is not found or is disabled #### Token Status [Permalink for this section](https://docs.arcade.dev/home/auth/tool-auth-status\#token-status) - `not_started`: Authorization process hasn’t begun - `pending`: Authorization is in progress (user needs to approve) - `completed`: Authorization is complete and tokens are available - `failed`: Authorization process failed #### Requirements Met [Permalink for this section](https://docs.arcade.dev/home/auth/tool-auth-status\#requirements-met) - `true`: All requirements for the tool are satisfied - `false`: Some requirements are missing (authorization, secrets, etc.) #### Secret Met [Permalink for this section](https://docs.arcade.dev/home/auth/tool-auth-status\#secret-met) - `true`: The secret exists for the tool - `false`: The secret does not exist for the tool [Authorized Tool Calling](https://docs.arcade.dev/home/auth/auth-tool-calling "Authorized Tool Calling") [Direct Third-Party API Call](https://docs.arcade.dev/home/auth/call-third-party-apis-directly "Direct Third-Party API Call") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Arcade Docker Installation [Home](https://docs.arcade.dev/home "Home") Local Deployment [Install](https://docs.arcade.dev/home/deployment/engine-configuration "Install") Docker # Docker Installation ## Engine [Permalink for this section](https://docs.arcade.dev/home/local-deployment/install/docker\#engine) ### Pulling the Engine Image [Permalink for this section](https://docs.arcade.dev/home/local-deployment/install/docker\#pulling-the-engine-image) The Arcade Engine is stateless and the docker image is designed to scale horizontally for production environments. The docker image for the engine can be pulled with ```nextra-code docker pull ghcr.io/arcadeai/engine:latest ``` ### Running the Engine [Permalink for this section](https://docs.arcade.dev/home/local-deployment/install/docker\#running-the-engine) The engine can be run with: ```nextra-code docker run -d -p 9099:9099 -v ./engine.yaml:/bin/engine.yaml ghcr.io/arcadeai/engine:latest ``` where config.yaml is the path to the [configuration file](https://docs.arcade.dev/home/local-deployment/configure/templates). ## Worker [Permalink for this section](https://docs.arcade.dev/home/local-deployment/install/docker\#worker) Arcade now provides a base Worker image that you can use to build your custom Worker image. Follow the [Build custom worker images with docker](https://docs.arcade.dev/home/serve-tools/docker-worker) guide to create your own Worker image using Arcade’s base Worker image. [Local](https://docs.arcade.dev/home/deployment/engine-configuration "Local") [Toolkits](https://docs.arcade.dev/home/local-deployment/install/toolkits "Toolkits") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Walmart Product Search [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Search Tools](https://docs.arcade.dev/mcp-servers/search/google_finance "Search Tools") Walmart # Walmart Search **Description:** Enable agents to search for products with Walmart. **Author:** Arcade **Auth:** API Key [![PyPI Version](https://img.shields.io/pypi/v/arcade_walmart)](https://pypi.org/project/arcade_walmart/)[![License](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/arcadeai/arcade-ai/blob/main/LICENSE)[![Python Versions](https://img.shields.io/pypi/pyversions/arcade_walmart)](https://pypi.org/project/arcade_walmart/)[![Wheel Status](https://img.shields.io/pypi/wheel/arcade_walmart)](https://pypi.org/project/arcade_walmart/)[![Downloads](https://img.shields.io/pypi/dm/arcade_walmart)](https://pypi.org/project/arcade_walmart/) The Arcade Walmart Search MCP Server provides a pre-built set of tools for interacting with Walmart. These tools make it easy to build agents and AI apps that can: - Search for products listed on Walmart stores; - Get details about a product. ## Available Tools [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/walmart\#available-tools) | Tool Name | Description | | --- | --- | | Walmart.SearchProducts | Search for products listed on Walmart stores. | | Walmart.GetProductDetails | Get details about a product listed on Walmart. | If you need to perform an action that’s not listed here, you can [get in touch\\ with us](mailto:contact@arcade.dev) to request a new tool, or [create your\\ own tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server). ## Walmart.SearchProducts [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/walmart\#walmartsearchproducts) See Example > Search for products listed on Walmart stores. **Parameters** - **keywords** _(string, required)_ Keywords to search for. E.g. ‘apple iphone’ or ‘samsung galaxy’ - **sort\_by** _(enum [WalmartSortBy](https://docs.arcade.dev/mcp-servers/search/walmart#walmartsortby), optional, Defaults to `WalmartSortBy.RELEVANCE`)_ Sort the results by the specified criteria. Defaults to `WalmartSortBy.RELEVANCE`. - **min\_price** _(float, optional, Defaults to `None`)_ Minimum price to filter the results. - **max\_price** _(float, optional, Defaults to `None`)_ Maximum price to filter the results. - **next\_day\_delivery** _(bool, optional, Defaults to `False`)_ Whether to filter the results by next day delivery. Defaults to False (returns all products, regardless of delivery status). - **page** _(int, optional, Defaults to `1`)_ Page number to fetch. Defaults to 1 (first page of results). The maximum page value is 100. ## Walmart.GetProductDetails [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/walmart\#walmartgetproductdetails) See Example > Get details about a product listed on Walmart. **Parameters** - **item\_id** _(string, required)_ Item ID. E.g. ‘414600577’. This can be retrieved from the search results of the `SearchWalmartProducts` tool. ## Auth [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/walmart\#auth) The Arcade Walmart Search toolkit uses the [SerpAPI](https://serpapi.com/) to get product information from Walmart. - **Secret:** - `SERP_API_KEY`: Your SerpAPI API key. Setting the `SERP_API_KEY` secret is only required if you are [self-hosting](https://docs.arcade.dev/home/deployment/engine-configuration) Arcade. If you’re using Arcade Cloud, the secret is already set for you. To manage your secrets, go to the [Secrets page](https://api.arcade.dev/dashboard/auth/secrets) in the Arcade Dashboard. * * * ## Reference [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/walmart\#reference) ## WalmartSortBy [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/walmart\#walmartsortby) - **`RELEVANCE`**: `'relevance_according_to_keywords_searched'` \- Sort by relevance. - **`PRICE_LOW_TO_HIGH`**: `'lowest_price_first'` \- Sort by price from low to high. - **`PRICE_HIGH_TO_LOW`**: `'highest_price_first'` \- Sort by price from high to low. - **`BEST_SELLING`**: `'best_selling_products_first'` \- Sort by best selling. - **`RATING_HIGH`**: `'highest_rating_first'` \- Sort by rating from high to low. - **`NEW_ARRIVALS`**: `'new_arrivals_first'` \- Sort by new arrivals. ## Get Building [Use tools hosted on Arcade Cloud\\ \\ Arcade tools are hosted by our cloud platform and ready to be used in your agents. Learn how.](https://docs.arcade.dev/home/quickstart) [Self Host Arcade tools\\ \\ Arcade tools can be self-hosted on your own infrastructure. Learn more about self-hosting.\\ \\ ```\\ pip install arcade_walmart\\ ```](https://docs.arcade.dev/home/hosting-overview) [Google Shopping](https://docs.arcade.dev/mcp-servers/search/google_shopping "Google Shopping") [Youtube](https://docs.arcade.dev/mcp-servers/search/youtube "Youtube") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Zendesk Toolkit Reference [Integrations](https://docs.arcade.dev/toolkits "Integrations") Customer Support [Zendesk](https://docs.arcade.dev/mcp-servers/customer-support/zendesk "Zendesk") Reference # Zendesk Reference Below is a reference of enumerations used by some tools in the Zendesk toolkit: ## TicketStatus [Permalink for this section](https://docs.arcade.dev/mcp-servers/customer-support/zendesk/reference\#ticketstatus) - **NEW**: `new` - **OPEN**: `open` - **PENDING**: `pending` - **SOLVED**: `solved` - **CLOSED**: `closed` ## SortOrder [Permalink for this section](https://docs.arcade.dev/mcp-servers/customer-support/zendesk/reference\#sortorder) - **ASC**: `asc` - **DESC**: `desc` ## ArticleSortBy [Permalink for this section](https://docs.arcade.dev/mcp-servers/customer-support/zendesk/reference\#articlesortby) - **CREATED\_AT**: `created_at` - **RELEVANCE**: `relevance` [Zendesk](https://docs.arcade.dev/mcp-servers/customer-support/zendesk "Zendesk") [Contribute a toolkit](https://docs.arcade.dev/mcp-servers/contribute-a-toolkit "Contribute a toolkit") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Get Tool Definitions [Home](https://docs.arcade.dev/home "Home") [Tool Calling](https://docs.arcade.dev/home/use-tools/tools-overview "Tool Calling") Tool formats # Get Formatted Tool Definitions When calling tools directly, it can be useful to get tool definitions in a specific model provider’s format. The Arcade Client provides methods for getting a tool’s definition and also for listing the definitions of multiple tools in a specific model provider’s format. ## Get a single tool definition formatted for a model [Permalink for this section](https://docs.arcade.dev/home/use-tools/get-tool-definitions\#get-a-single-tool-definition-formatted-for-a-model) It can be useful to get a tool’s definition in a specific model provider’s format. For example, you may want to get the `Github.SetStarred` tool’s definition in OpenAI’s format. To do this, you can use the `client.tools.formatted.get` method and specify the tool name and format. PythonJavaScript ```nextra-code from arcadepy import Arcade client = Arcade() # Get a specific tool formatted for OpenAI github_star_repo = client.tools.formatted.get(name="Github.SetStarred", format="openai") print(github_star_repo) ``` See output ## Get all tool definitions in a toolkit formatted for a model [Permalink for this section](https://docs.arcade.dev/home/use-tools/get-tool-definitions\#get-all-tool-definitions-in-a-toolkit-formatted-for-a-model) It can be useful to list tool definitions for a toolkit in a specific model provider’s format. For example, you may want to get the definitions of tools in the `Github` toolkit in OpenAI’s format. To do this, you can use the `client.tools.formatted.list` method and specify the toolkit and format. Since this method returns an iterator of pages, you can cast to a list to get all the tools. PythonJavaScript ```nextra-code from arcadepy import Arcade client = Arcade() # Get all tools in the Github toolkit formatted for OpenAI github_tools = list(client.tools.formatted.list(format="openai", toolkit="github")) # Print the number of tools in the Github toolkit print(len(github_tools)) ``` ## Get all tool definitions formatted for a model [Permalink for this section](https://docs.arcade.dev/home/use-tools/get-tool-definitions\#get-all-tool-definitions-formatted-for-a-model) To get all tools formatted for OpenAI, you can use the `client.tools.formatted.list` method without specifying a toolkit. PythonJavaScript ```nextra-code from arcadepy import Arcade client = Arcade() # Get all tools formatted for OpenAI all_tools = list(client.tools.formatted.list(format="openai")) # Print the number of tools print(len(all_tools)) ``` ## Get Zod Tool Definitions [Permalink for this section](https://docs.arcade.dev/home/use-tools/get-tool-definitions\#get-zod-tool-definitions) [Zod](https://zod.dev/) is a TypeScript-first schema validation library that helps you define and validate data structures. The [Arcade JS](https://github.com/ArcadeAI/arcade-js) client offers methods to convert Arcade tool definitions into Zod schemas, providing type safety and validation while enabling seamless integration with AI frameworks like LangChain, Vercel AI SDK, and Mastra AI. Using Zod with Arcade provides: 1. **Type Safety**: Runtime validation of tool inputs and outputs against their defined types 2. **TypeScript Integration**: Provides excellent TypeScript support with automatic type inference 3. **Framework Compatibility**: Direct integration with LangChain, Vercel AI SDK, and Mastra AI ### Convert to Zod Format [Permalink for this section](https://docs.arcade.dev/home/use-tools/get-tool-definitions\#convert-to-zod-format) Arcade offers three ways to convert your tools into Zod schemas, each for different use cases: #### 1\. Convert to array of Zod tools [Permalink for this section](https://docs.arcade.dev/home/use-tools/get-tool-definitions\#1-convert-to-array-of-zod-tools) This method returns an array of tools with Zod validation. ```nextra-code import { toZod } from "@arcadeai/arcadejs/lib" const googleToolkit = await arcade.tools.list({ limit: 20, toolkit: "gmail", }); const tools = toZod({ tools: googleToolkit.items, client: arcade, userId: "", }) ``` #### 2\. Convert to object of Zod tools [Permalink for this section](https://docs.arcade.dev/home/use-tools/get-tool-definitions\#2-convert-to-object-of-zod-tools) This method returns an object with tool names as keys, allowing direct access to tools by name: ```nextra-code import { toZodToolSet } from "@arcadeai/arcadejs/lib" const googleToolkit = await arcade.tools.list({ limit: 20, toolkit: "gmail", }); const tools = toZodToolSet({ tools: googleToolkit.items, client: arcade, userId: "", }) const emails = await tools.Gmail_ListEmails.execute({ limit: 10, }); ``` #### 3\. Convert a single tool [Permalink for this section](https://docs.arcade.dev/home/use-tools/get-tool-definitions\#3-convert-a-single-tool) When you only need to work with a specific tool, use this method to convert just that tool to a Zod schema: ```nextra-code import { createZodTool } from "@arcadeai/arcadejs/lib" const listEmails = await arcade.tools.get("Gmail_ListEmails"); const listEmailsTool = createZodTool({ tool: listEmails, client: arcade, userId: "", }); const emails = await listEmailsTool.execute({ limit: 10, }); ``` ### Handle Authorization [Permalink for this section](https://docs.arcade.dev/home/use-tools/get-tool-definitions\#handle-authorization) When working with tools that require user authorization (like Gmail, GitHub, Slack, etc.), Arcade provides two approaches to handle the authorization flow when using Zod-converted tools: #### Option 1: Manual handling [Permalink for this section](https://docs.arcade.dev/home/use-tools/get-tool-definitions\#option-1-manual-handling) When you convert Arcade tools to Zod without adding an `executeFactory`, Arcade will try to run tools directly. For tools that need permission (like Gmail or Slack), you’ll see a `PermissionDeniedError` if the user hasn’t given access yet. This approach gives you complete control over the authorization flow, making it perfect for custom UI implementations or complex workflows. You’ll have full flexibility to design your own user experience, but you’ll need to handle authorization flows and error states manually in your code. ```nextra-code import { PermissionDeniedError } from "@arcadeai/arcadejs" const tools = toZodToolSet({ tools: googleToolkit.items, client: arcade, userId: "", }) try { const result = await tools.Gmail_ListEmails.execute({ limit: 10, }); console.log(result); } catch (error) { if (error instanceof PermissionDeniedError) { // You can use the `arcade.tools.authorize` method to get an authorization URL for the user const authorizationResponse = await arcade.tools.authorize({ tool_name: "Gmail.ListEmails", user_id: "", }); console.log(authorizationResponse.url); } else { console.error("Error executing tool:", error); } } ``` #### Option 2: Execute and authorize tool [Permalink for this section](https://docs.arcade.dev/home/use-tools/get-tool-definitions\#option-2-execute-and-authorize-tool) Arcade offers a more convenient way to handle tool execution and initial authorization steps. When converting tools to Zod, you can add the `executeOrAuthorizeZodTool` helper to the `executeFactory`. With this helper, your code no longer needs to catch a `PermissionDeniedError` for tools requiring permissions (as shown in Option 1). Instead, if the user hasn’t yet granted access, the `execute` method will return an `ToolAuthorizationResponse` object that contains the authorization URL. This approach simplifies your code by: 1. Attempting to execute the tool. 2. If permissions are missing, it returns an object containing the authorization URL. This eliminates the need for both a `try...catch` block for `PermissionDeniedError` and a separate call (like `arcade.tools.authorize`) just to retrieve this URL. 3. If the tool is already authorized, it executes directly. Arcade remembers user authorizations, so once a user approves access, subsequent calls using this helper will execute the tool without prompting for authorization again. While this helper streamlines obtaining the authorization URL, you are still responsible for presenting this URL to the user. It’s particularly useful for straightforward implementations where you want to reduce boilerplate. ```nextra-code import { executeOrAuthorizeZodTool } from "@arcadeai/arcadejs" const tools = toZodToolSet({ tools: googleToolkit.items, client: arcade, userId: "", executeFactory: executeOrAuthorizeZodTool, // Automatically handles tool authorization flows, including generating auth URLs }); const result = await tools.Gmail_ListEmails.execute({ limit: 10, }); if ("authorization_required" in result && result.authorization_required) { console.log( `Please visit ${result.authorization_response.url} to authorize the tool`, ); } else { console.log(result); } ``` [Introduction](https://docs.arcade.dev/home/use-tools/tools-overview "Introduction") [Types of tools](https://docs.arcade.dev/home/use-tools/types-of-tools "Types of tools") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Google Calendar Toolkit [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Productivity & Docs](https://docs.arcade.dev/mcp-servers/productivity/asana "Productivity & Docs") Google Calendar # Google Calendar **Description:** Enable agents to interact with Google Calendar **Author:** Arcade **Auth:** User authorizationvia the [Google auth provider](https://docs.arcade.dev/home/auth-providers/google) [![PyPI Version](https://img.shields.io/pypi/v/arcade_google_calendar)](https://pypi.org/project/arcade_google_calendar/)[![License](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/arcadeai/arcade-ai/blob/main/LICENSE)[![Python Versions](https://img.shields.io/pypi/pyversions/arcade_google_calendar)](https://pypi.org/project/arcade_google_calendar/)[![Wheel Status](https://img.shields.io/pypi/wheel/arcade_google_calendar)](https://pypi.org/project/arcade_google_calendar/)[![Downloads](https://img.shields.io/pypi/dm/arcade_google_calendar)](https://pypi.org/project/arcade_google_calendar/) The Arcade Google Calendar MCP Server provides a pre-built set of tools for interacting with a user’s Google Calendar. These tools make it easy to build agents and apps that can: - Discover calendars accessible to the user and inspect user/profile/calendar environment (ListCalendars, WhoAmI). - Create, update, list, and delete events (CreateEvent, UpdateEvent, ListEvents, DeleteEvent). - Find available meeting times across attendees within a date/time range (FindTimeSlotsWhenEveryoneIsFree). ## Available Tools [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_calendar\#available-tools) These tools are currently available in the Arcade Google Calendar toolkit. | Tool Name | Description | | --- | --- | | GoogleCalendar.ListCalendars | List all calendars accessible by the user. | | GoogleCalendar.CreateEvent | Create a new event/meeting/sync/meetup in the specified calendar. | | GoogleCalendar.ListEvents | List events from Google Calendar. | | GoogleCalendar.UpdateEvent | Update an existing event in the specified calendar with new details. | | GoogleCalendar.DeleteEvent | Delete an event from Google Calendar. | | GoogleCalendar.FindTimeSlotsWhenEveryoneIsFree | Provides time slots when everyone is free within a given date range and time boundaries. | | GoogleCalendar.WhoAmI | Get comprehensive user profile and Google Calendar environment information. | If you need to perform an action that’s not listed here, you can [get in touch\\ with us](mailto:contact@arcade.dev) to request a new tool, or [create your\\ own tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server) with the [Google auth\\ provider](https://docs.arcade.dev/home/auth-providers/google#using-google-auth-in-custom-tools). ## GoogleCalendar.ListCalendars [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_calendar\#googlecalendarlistcalendars) See Example > List all calendars accessible by the user. **Parameters** - **`max_results`** ( `integer`, optional) The maximum number of calendars to return. Up to 250 calendars, defaults to 10. - **`show_deleted`** ( `boolean`, optional) Whether to show deleted calendars. Defaults to False - **`show_hidden`** ( `boolean`, optional) Whether to show hidden calendars. Defaults to False - **`next_page_token`** ( `string`, optional) The token to retrieve the next page of calendars. Optional. ## GoogleCalendar.CreateEvent [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_calendar\#googlecalendarcreateevent) See Example > Create a new event/meeting/sync/meetup in the specified calendar. **Parameters** - **`summary`** ( `string`, required) The title of the event - **`start_datetime`** ( `string`, required) The datetime when the event starts in ISO 8601 format, e.g., ‘2024-12-31T15:30:00’. - **`end_datetime`** ( `string`, required) The datetime when the event ends in ISO 8601 format, e.g., ‘2024-12-31T17:30:00’. - **`calendar_id`** ( `string`, optional) The ID of the calendar to create the event in, usually ‘primary’. - **`description`** ( `string`, optional) The description of the event - **`location`** ( `string`, optional) The location of the event - **`visibility`** ( `Enum` [EventVisibility](https://docs.arcade.dev/mcp-servers/productivity/google_calendar/reference#EventVisibility), optional) The visibility of the event - **`attendee_emails`** ( `array[string]`, optional) The list of attendee emails. Must be valid email addresses e.g., [username@domain.com](mailto:username@domain.com). - **`send_notifications_to_attendees`** ( `Enum` [SendUpdatesOptions](https://docs.arcade.dev/mcp-servers/productivity/google_calendar/reference#SendUpdatesOptions), optional) Should attendees be notified by email of the invitation? (none, all, external\_only) - **`add_google_meet`** ( `boolean`, optional) Whether to add a Google Meet link to the event. Defaults to False. ## GoogleCalendar.ListEvents [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_calendar\#googlecalendarlistevents) See Example > List events from the specified calendar within the given datetime range. min\_end\_datetime serves as the lower bound (exclusive) for an event’s end time. max\_start\_datetime serves as the upper bound (exclusive) for an event’s start time. For example: If min\_end\_datetime is set to 2024-09-15T09:00:00 and max\_start\_datetime is set to 2024-09-16T17:00:00, the function will return events that: 1. End after 09:00 on September 15, 2024 (exclusive) 2. Start before 17:00 on September 16, 2024 (exclusive) This means an event starting at 08:00 on September 15 and ending at 10:00 on September 15 would be included, but an event starting at 17:00 on September 16 would not be included. **Parameters** - **`min_end_datetime`** ( `string`, required) Filter by events that end on or after this datetime in ISO 8601 format, e.g., ‘2024-09-15T09:00:00’. - **`max_start_datetime`** ( `string`, required) Filter by events that start before this datetime in ISO 8601 format, e.g., ‘2024-09-16T17:00:00’. - **`calendar_id`** ( `string`, optional) The ID of the calendar to list events from - **`max_results`** ( `integer`, optional) The maximum number of events to return ## GoogleCalendar.UpdateEvent [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_calendar\#googlecalendarupdateevent) See Example > Update an existing event in the specified calendar with the provided details. Only the provided fields will be updated; others will remain unchanged. `updated_start_datetime` and `updated_end_datetime` are independent and can be provided separately. **Parameters** - **`event_id`** ( `string`, required) The ID of the event to update - **`updated_start_datetime`** ( `string`, optional) The updated datetime that the event starts in ISO 8601 format, e.g., ‘2024-12-31T15:30:00’. - **`updated_end_datetime`** ( `string`, optional) The updated datetime that the event ends in ISO 8601 format, e.g., ‘2024-12-31T17:30:00’. - **`updated_calendar_id`** ( `string`, optional) The updated ID of the calendar containing the event. - **`updated_summary`** ( `string`, optional) The updated title of the event - **`updated_description`** ( `string`, optional) The updated description of the event - **`updated_location`** ( `string`, optional) The updated location of the event - **`updated_visibility`** ( `Enum` [EventVisibility](https://docs.arcade.dev/mcp-servers/productivity/google_calendar/reference#EventVisibility), optional) The visibility of the event - **`attendee_emails_to_add`** ( `array[string]`, optional) The list of attendee emails to add. Must be valid email addresses e.g., [username@domain.com](mailto:username@domain.com). - **`attendee_emails_to_remove`** ( `array[string]`, optional) The list of attendee emails to remove. Must be valid email addresses e.g., [username@domain.com](mailto:username@domain.com). - **`send_notifications_to_attendees`** ( `Enum` [SendUpdatesOptions](https://docs.arcade.dev/mcp-servers/productivity/google_calendar/reference#SendUpdatesOptions), optional) Should attendees be notified of the update? (none, all, external\_only) - **`update_google_meet`** ( `Enum` [UpdateGoogleMeetOptions](https://docs.arcade.dev/mcp-servers/productivity/google_calendar/reference#UpdateGoogleMeetOptions), optional) Whether to update the Google Meet link to the event. (none, add, remove) ## GoogleCalendar.DeleteEvent [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_calendar\#googlecalendardeleteevent) See Example > Delete an event from Google Calendar. **Parameters** - **`event_id`** ( `string`, required) The ID of the event to delete - **`calendar_id`** ( `string`, optional) The ID of the calendar containing the event - **`send_updates`** ( `Enum` [SendUpdatesOptions](https://docs.arcade.dev/mcp-servers/productivity/google_calendar/reference#SendUpdatesOptions), optional) Specifies which attendees to notify about the deletion ## GoogleCalendar.FindTimeSlotsWhenEveryoneIsFree [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_calendar\#googlecalendarfindtimeslotswheneveryoneisfree) See Example > Provides time slots when everyone is free within a given date range and time boundaries. **Parameters** - **`email_addresses`** ( `array[string]`, optional) The list of email addresses from people in the same organization domain (apart from the currently logged in user) to search for free time slots. Defaults to None, which will return free time slots for the current user only. - **`start_date`** ( `string`, optional) The start date to search for time slots in the format ‘YYYY-MM-DD’. Defaults to today’s date. It will search starting from this date at the time 00:00:00. - **`end_date`** ( `string`, optional) The end date to search for time slots in the format ‘YYYY-MM-DD’. Defaults to seven days from the start date. It will search until this date at the time 23:59:59. - **`start_time_boundary`** ( `string`, optional) Will return free slots in any given day starting from this time in the format ‘HH:MM’. Defaults to ‘08:00’, which is a usual business hour start time. - **`end_time_boundary`** ( `string`, optional) Will return free slots in any given day until this time in the format ‘HH:MM’. Defaults to ‘18:00’, which is a usual business hour end time. ## GoogleCalendar.WhoAmI [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_calendar\#googlecalendarwhoami) See Example > Get comprehensive user profile and Google Calendar environment information. **Parameters** This tool does not take any parameters. * * * ## Auth [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_calendar\#auth) The Arcade Google Calendar toolkit uses the [Google auth provider](https://docs.arcade.dev/home/auth-providers/google) to connect to users’ Google accounts. With the Arcade Cloud Platform, there’s nothing to configure. Your users will see `Arcade` as the name of the application that’s requesting permission. With a self-hosted installation of Arcade, you need to [configure the Google auth provider](https://docs.arcade.dev/home/auth-providers/google#configuring-google-auth) with your own Google app credentials. * * * ## Reference [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_calendar\#reference) ### EventVisibility [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_calendar\#eventvisibility) Defines the visibility of an event. - **`DEFAULT`**: Default visibility. - **`PUBLIC`**: Public visibility. - **`PRIVATE`**: Private visibility. - **`CONFIDENTIAL`**: Confidential visibility. ### SendUpdatesOptions [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_calendar\#sendupdatesoptions) - **`NONE`**: No notifications are sent. - **`ALL`**: Notifications are sent to all guests. - **`EXTERNAL_ONLY`**: Notifications are sent to non-Google Calendar guests only. ## UpdateGoogleMeetOptions [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_calendar\#updategooglemeetoptions) - **`NONE`**: No action is taken. - **`ADD`**: Add the Google Meet link to the event. - **`REMOVE`**: Remove the Google Meet link from the event. ## Get Building [Use tools hosted on Arcade Cloud\\ \\ Arcade tools are hosted by our cloud platform and ready to be used in your agents. Learn how.](https://docs.arcade.dev/home/quickstart) [Self Host Arcade tools\\ \\ Arcade tools can be self-hosted on your own infrastructure. Learn more about self-hosting.\\ \\ ```\\ pip install arcade_google_calendar\\ ```](https://docs.arcade.dev/home/hosting-overview) [Reference](https://docs.arcade.dev/mcp-servers/productivity/gmail/reference "Reference") [Reference](https://docs.arcade.dev/mcp-servers/productivity/google_calendar/reference "Reference") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Evaluate Tool Effectiveness [Home](https://docs.arcade.dev/home "Home") Evaluate toolsWhy evaluate tools? # Why evaluate tools? When deploying language models with tool-calling capabilities in production environments, it’s essential to ensure their effectiveness and reliability. This evaluation process goes beyond traditional testing and focuses on two key aspects: 1. **Tool Utilization**: Assessing how efficiently the language model uses the available tools. 2. **Intent Understanding**: Evaluating the language model’s ability to comprehend user intents and select the appropriate tools to fulfill those intents. Arcade’s Evaluation Framework provides a comprehensive approach to assess and validate the tool-calling capabilities of language models, ensuring they meet the high standards required for real-world applications. How to evaluate Agentic tools using Arcade - YouTube [Photo image of Arcade](https://www.youtube.com/channel/UCsSxkIlOhS4u-4BZnyRDwlQ?embeds_referring_euri=https%3A%2F%2Fdocs.arcade.dev%2F) Arcade 593 subscribers [How to evaluate Agentic tools using Arcade](https://www.youtube.com/watch?v=EJCpZclFzdg) Arcade Search Info Shopping Tap to unmute If playback doesn't begin shortly, try restarting your device. You're signed out Videos you watch may be added to the TV's watch history and influence TV recommendations. To avoid this, cancel and sign in to YouTube on your computer. CancelConfirm Share Include playlist An error occurred while retrieving sharing information. Please try again later. Watch later Share Copy link Watch on 0:00 / •Live • ## Why Evaluate Tool Calling by Task? [Permalink for this section](https://docs.arcade.dev/home/evaluate-tools/why-evaluate-tools\#why-evaluate-tool-calling-by-task) Language models augmented with tool-use capabilities can perform complex tasks by invoking external tools or APIs. However, without proper evaluation, these models might: - **Misinterpret user intents**, leading to incorrect tool selection. - **Provide incorrect arguments** to tools, causing failures or undesired outcomes. - **Fail to execute the necessary sequence of tool calls**, especially in tasks requiring multiple steps. Evaluating tool calling by task ensures that the language model can handle specific scenarios reliably, providing confidence in its performance in production settings. ## Evaluation Scoring [Permalink for this section](https://docs.arcade.dev/home/evaluate-tools/why-evaluate-tools\#evaluation-scoring) Scoring in the evaluation framework is based on comparing the model’s actual tool calls with the expected ones for each evaluation case. The total score for a case depends on: 1. **Tool Selection**: Whether the model selected the correct tools for the task. 2. **Tool Call Arguments**: The correctness of the arguments provided to the tools, evaluated by critics. 3. **Evaluation Rubric**: Each aspect of the evaluation is weighted according to the rubric, affecting its impact on the final score. The evaluation result includes: - **Score**: A normalized value between 0.0 and 1.0. - **Result**: - _Passed_: Score is above the fail threshold. - _Failed_: Score is below the fail threshold. - _Warned_: Score is between the warning and fail thresholds. ## Critics: Types and Usage [Permalink for this section](https://docs.arcade.dev/home/evaluate-tools/why-evaluate-tools\#critics-types-and-usage) Critics are essential for evaluating the correctness of tool call arguments. Different types of critics serve various evaluation needs: ### BinaryCritic [Permalink for this section](https://docs.arcade.dev/home/evaluate-tools/why-evaluate-tools\#binarycritic) `BinaryCritic` s check for exact matches between expected and actual values after casting. - **Use Case**: When exact values are required (e.g., specific numeric parameters). - **Example**: Ensuring the model provides the exact user ID in a function call. ### NumericCritic [Permalink for this section](https://docs.arcade.dev/home/evaluate-tools/why-evaluate-tools\#numericcritic) `NumericCritic` evaluates numeric values within a specified range, allowing for acceptable deviations. - **Use Case**: When values can be approximate but should be within a certain threshold. - **Example**: Accepting approximate results in mathematical computations due to floating-point precision. ### SimilarityCritic [Permalink for this section](https://docs.arcade.dev/home/evaluate-tools/why-evaluate-tools\#similaritycritic) `SimilarityCritic` measures the similarity between expected and actual string values using metrics like cosine similarity. - **Use Case**: When the exact wording isn’t critical, but the content should be similar. - **Example**: Evaluating if the message content in a communication tool is similar to the expected message. ### DatetimeCritic [Permalink for this section](https://docs.arcade.dev/home/evaluate-tools/why-evaluate-tools\#datetimecritic) `DatetimeCritic` evaluates the closeness of datetime values within a specified tolerance. - **Use Case**: When datetime values should be within a certain range of the expected time. - **Example**: Verifying if a scheduled event time is close enough to the intended time. ### Choosing the Right Critic [Permalink for this section](https://docs.arcade.dev/home/evaluate-tools/why-evaluate-tools\#choosing-the-right-critic) - **Exact Matches Needed**: Use **BinaryCritic** for strict equality. - **Numeric Ranges**: Use **NumericCritic** when a tolerance is acceptable. - **Textual Similarity**: Use **SimilarityCritic** for comparing messages or descriptions. - **Datetime Tolerance**: Use **DatetimeCritic** when a tolerance is acceptable for datetime comparisons. Critics are defined with fields such as `critic_field`, `weight`, and parameters specific to their types (e.g., `similarity_threshold` for `SimilarityCritic`). ## Rubrics and Setting Thresholds [Permalink for this section](https://docs.arcade.dev/home/evaluate-tools/why-evaluate-tools\#rubrics-and-setting-thresholds) An **EvalRubric** defines the evaluation criteria and thresholds for determining pass/fail outcomes. Key components include: - **Fail Threshold**: The minimum score required to pass the evaluation. - **Warn Threshold**: The score threshold for issuing a warning. - **Weights**: Assigns importance to different aspects of the evaluation (e.g., tool selection, argument correctness). ### Setting Up a Rubric [Permalink for this section](https://docs.arcade.dev/home/evaluate-tools/why-evaluate-tools\#setting-up-a-rubric) - **Define Fail and Warn Thresholds**: Choose values between 0.0 and 1.0 to represent acceptable performance levels. - **Assign Weights**: Allocate weights to tool selection and critics to reflect their importance in the overall evaluation. - **Configure Failure Conditions**: Set flags like `fail_on_tool_selection` to enforce strict criteria. ### Example Rubric Configuration: [Permalink for this section](https://docs.arcade.dev/home/evaluate-tools/why-evaluate-tools\#example-rubric-configuration) A rubric that requires a score of at least 0.85 to pass and issues a warning if the score is between 0.85 and 0.95: - Fail Threshold: 0.85 - Warn Threshold: 0.95 - Fail on Tool Selection: True - Tool Selection Weight: 1.0 ```nextra-code rubric = EvalRubric( fail_threshold=0.85, warn_threshold=0.95, fail_on_tool_selection=True, tool_selection_weight=1.0, ) ``` ## Building an Evaluation Suite [Permalink for this section](https://docs.arcade.dev/home/evaluate-tools/why-evaluate-tools\#building-an-evaluation-suite) An **EvalSuite** orchestrates the running of multiple evaluation cases. Here’s how to build one: 1. **Initialize EvalSuite**: Provide a name, system message, tool catalog, and rubric. 2. **Add Evaluation Cases**: Use `add_case` or `extend_case` to include various scenarios. 3. **Specify Expected Tool Calls**: Define the tools and arguments expected for each case. 4. **Assign Critics**: Attach critics relevant to each case to evaluate specific arguments. 5. **Run the Suite**: Execute the suite using the Arcade CLI to collect results. ### Example: Math Tools Evaluation Suite [Permalink for this section](https://docs.arcade.dev/home/evaluate-tools/why-evaluate-tools\#example-math-tools-evaluation-suite) An evaluation suite for math tools might include cases such as: - **Adding Two Large Numbers**: - **User Message**: “Add 12345 and 987654321” - **Expected Tool Call**: `add(a=12345, b=987654321)` - **Critics**: - `BinaryCritic` for arguments `a` and `b` - **Calculating Square Roots**: - **User Message**: “What is the square root of 3224990521?” - **Expected Tool Call**: `sqrt(a=3224990521)` - **Critics**: - `BinaryCritic` for argument `a` ### Example: Slack Messaging Tools Evaluation Suite [Permalink for this section](https://docs.arcade.dev/home/evaluate-tools/why-evaluate-tools\#example-slack-messaging-tools-evaluation-suite) An evaluation suite for Slack messaging tools might include cases such as: - **Sending a Direct Message**: - **User Message**: “Send a direct message to johndoe saying ‘Hello, can we meet at 3 PM?’” - **Expected Tool Call**: `send_dm_to_user(user_name='johndoe', message='Hello, can we meet at 3 PM?')` - **Critics**: - `BinaryCritic` for `user_name` - `SimilarityCritic` for `message` - **Posting a Message to a Channel**: - **User Message**: “Post ‘The new feature is now live!’ in the #announcements channel” - **Expected Tool Call**: `send_message_to_channel(channel_name='announcements', message='The new feature is now live!')` - **Critics**: - `BinaryCritic` for `channel_name` - `SimilarityCritic` for `message` [Retry tools with improved prompt](https://docs.arcade.dev/home/build-tools/retry-tools-with-improved-prompt "Retry tools with improved prompt") [Create an evaluation suite](https://docs.arcade.dev/home/evaluate-tools/create-an-evaluation-suite "Create an evaluation suite") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Clickup Toolkit Reference [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Productivity & Docs](https://docs.arcade.dev/mcp-servers/productivity/asana "Productivity & Docs") [Clickup](https://docs.arcade.dev/mcp-servers/productivity/clickup "Clickup") Reference # Clickup Reference Below is a reference of enumerations used by some tools in the Clickup toolkit: ## TaskPriority [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/clickup/reference\#taskpriority) Task priority values are used in the `Clickup.CreateTask` tool to set the priority of a new task. Those are default values and cannot be changed by the user. - **URGENT**: `URGENT` - **HIGH**: `HIGH` - **NORMAL**: `NORMAL` - **LOW**: `LOW` ## FilterScope [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/clickup/reference\#filterscope) Filter scope values are used in the `Clickup.GetTasksByScope` tool to filter tasks by scope. The following enumeration values represent the possible scopes supported by the Clickup API: - **ALL**: `all` - **SPACES**: `spaces` - **FOLDERS**: `folders` - **LISTS**: `lists` ## TaskOrderBy [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/clickup/reference\#taskorderby) Task order by values are used in the `Clickup.GetTasksByScope` tool to order tasks by a specific field. The following enumeration values represent the possible order by fields supported by the Clickup API: - **CREATED**: `created` - **UPDATED**: `updated` - **DUE\_DATE**: `due_date` ## CommentResolution [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/clickup/reference\#commentresolution) Comment resolution values are used in the comment tools to set the resolution of a comment. The following enumeration values represent the possible resolutions supported by the Clickup API: - **SET\_AS\_RESOLVED**: `resolved` - **SET\_AS\_UNRESOLVED**: `unresolved` [Clickup](https://docs.arcade.dev/mcp-servers/productivity/clickup "Clickup") [Close.io](https://docs.arcade.dev/mcp-servers/productivity/closeio "Close.io") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Hybrid Worker Setup [Home](https://docs.arcade.dev/home "Home") Hybrid DeploymentHybrid Worker # Hybrid Worker A hybrid deployment allows you to execute tools in your own environment while still leveraging Arcade’s cloud Engine infrastructure. This gives you the flexibility to access private resources, maintain data security, and customize your worker environment while leveraging Arcade’s Engine and management capabilities. ## How hybrid workers work [Permalink for this section](https://docs.arcade.dev/home/deployment/on-prem-mcp\#how-hybrid-workers-work) The hybrid worker model uses a bidirectional connection between your local environment and Arcade’s cloud engine: 1. You run the Arcade worker in your environment (on-premises, private cloud, etc.) 2. Your worker is exposed to Arcade’s cloud engine using a public URL 3. The Arcade cloud engine routes tool calls to your worker 4. Your worker processes the requests and returns responses to the engine ## Benefits of hybrid workers [Permalink for this section](https://docs.arcade.dev/home/deployment/on-prem-mcp\#benefits-of-hybrid-workers) - **Resource access**: Access private databases, APIs, or other resources not accessible from Arcade’s cloud - **Data control**: Keep sensitive data within your environment while still using Arcade’s capabilities - **Custom environments**: Use specific dependencies or configurations required by your tools - **Compliance**: Meet regulatory requirements by keeping data processing within your infrastructure ## Setting up a hybrid worker [Permalink for this section](https://docs.arcade.dev/home/deployment/on-prem-mcp\#setting-up-a-hybrid-worker) ### Setup your toolkits [Permalink for this section](https://docs.arcade.dev/home/deployment/on-prem-mcp\#setup-your-toolkits) Follow the [Creating a Toolkit](https://docs.arcade.dev/home/build-tools/create-a-mcp-server) guide to create your toolkits. Alternatively, you can install an Arcade Toolkit: ```nextra-code pip install arcade-math ``` ### Start your local worker [Permalink for this section](https://docs.arcade.dev/home/deployment/on-prem-mcp\#start-your-local-worker) Run your Arcade worker locally with a secret that you generate in some secure way: ```nextra-code export ARCADE_WORKER_SECRET=your-secret arcade serve ``` Verify your worker is running by visiting [http://localhost:8002/worker/health](http://localhost:8002/worker/health). ### Create a public URL [Permalink for this section](https://docs.arcade.dev/home/deployment/on-prem-mcp\#create-a-public-url) To allow the Arcade cloud engine to connect to your locally running worker, you need a public URL. Here are a few options: ngrokCloudflareTailscale ```nextra-code ngrok http 8002 ``` ### Register your worker in Arcade [Permalink for this section](https://docs.arcade.dev/home/deployment/on-prem-mcp\#register-your-worker-in-arcade) 1. Navigate to the [Workers](https://api.arcade.dev/dashboard/workers) page in your Arcade dashboard 2. Click **Add Worker** 3. Fill in the form: - **ID**: Choose a unique identifier (e.g., `my-hybrid-worker`) - **Worker Type**: Select `Arcade` - **URL**: Enter your public URL from Step 3 - **Secret**: Enter the secret for your worker (or use `dev` for testing) - **Timeout** and **Retry**: Configure as needed for your use case 4. Click **Create** ### Test the connection to your worker [Permalink for this section](https://docs.arcade.dev/home/deployment/on-prem-mcp\#test-the-connection-to-your-worker) You can now test your worker by making requests through the Arcade API or using the Playground: 1. Go to the [Playground](https://api.arcade.dev/dashboard/playground) 2. Select a tool from your toolkit and execute it 3. Verify that the response is correct and you see request logs in your worker ## Best practices [Permalink for this section](https://docs.arcade.dev/home/deployment/on-prem-mcp\#best-practices) - **Persistent URLs**: For production use, set up a persistent public URL rather than ephemeral ones - **TLS**: Use a TLS-enabled URL for production use - **Security**: Use strong secrets for worker authentication - **Monitoring**: Set up monitoring for your hybrid workers to ensure availability - **Scaling**: For high-load scenarios, consider running multiple workers behind a load balancer ## Troubleshooting [Permalink for this section](https://docs.arcade.dev/home/deployment/on-prem-mcp\#troubleshooting) - **Connection issues**: Ensure your public URL is accessible and that your local worker is running - **Authentication failures**: Verify that the worker secret matches what’s configured in the Arcade dashboard - **Timeout errors**: If your worker takes too long to respond, increase the timeout value in the worker configuration ## Next steps [Permalink for this section](https://docs.arcade.dev/home/deployment/on-prem-mcp\#next-steps) - [Create custom tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server) for your hybrid worker - [Set up authentication](https://docs.arcade.dev/home/build-tools/create-a-tool-with-auth) for secure access to resources - [Configure secrets](https://docs.arcade.dev/home/build-tools/create-a-tool-with-secrets) for your worker [Overview](https://docs.arcade.dev/home/hosting-overview "Overview") [Overview](https://docs.arcade.dev/home/deployment/engine-configuration "Overview") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## User Authorization Guide [Home](https://docs.arcade.dev/home "Home") [OpenAI Agents](https://docs.arcade.dev/home/oai-agents/overview "OpenAI Agents") Managing user authorization ## User authorization with OpenAI Agents [Permalink for this section](https://docs.arcade.dev/home/oai-agents/user-auth-interrupts\#user-authorization-with-openai-agents) In this guide, you will learn how to handle user authorization for Arcade tools in your OpenAI Agents application. When a tool requires authorization, the agent will raise an `AuthorizationError` with a URL for the user to visit and grant permissions. ### Prerequisites [Permalink for this section](https://docs.arcade.dev/home/oai-agents/user-auth-interrupts\#prerequisites) - [Obtain an Arcade API key](https://docs.arcade.dev/home/api-keys) ### Install the required packages [Permalink for this section](https://docs.arcade.dev/home/oai-agents/user-auth-interrupts\#install-the-required-packages) Set up your environment with the following installations: PythonJavaScript ```nextra-code pip install agents-arcade arcadepy ``` ### Configure your Arcade environment [Permalink for this section](https://docs.arcade.dev/home/oai-agents/user-auth-interrupts\#configure-your-arcade-environment) Make sure you have set your Arcade API key in the environment, or assign it directly in the code: > Need an Arcade API key? Visit the [Get an API key](https://docs.arcade.dev/home/api-keys) page to create one. PythonJavaScript ```nextra-code import os from arcadepy import AsyncArcade from agents import Agent, Runner from agents_arcade import get_arcade_tools from agents_arcade.errors import AuthorizationError # Set your API key os.environ["ARCADE_API_KEY"] = "YOUR_ARCADE_API_KEY" # Initialize the Arcade client client = AsyncArcade() ``` ### Fetch Arcade tools [Permalink for this section](https://docs.arcade.dev/home/oai-agents/user-auth-interrupts\#fetch-arcade-tools) Get the tools you need for your agent. In this example, we’ll use GitHub tools: PythonJavaScript ```nextra-code # Get GitHub tools for this example tools = await get_arcade_tools(client, toolkits=["github"]) # Create an agent with GitHub tools github_agent = Agent( name="GitHub agent", instructions="You are a helpful assistant that can assist with GitHub API calls.", model="gpt-4o-mini", tools=tools, ) ``` ### Handle authorization errors [Permalink for this section](https://docs.arcade.dev/home/oai-agents/user-auth-interrupts\#handle-authorization-errors) PythonJavaScript When a user needs to authorize access to a tool, the agent will raise an `AuthorizationError`. You can handle it like this: ```nextra-code try: result = await Runner.run( starting_agent=github_agent, input="Star the arcadeai/arcade-ai repo", # Pass a unique user_id for authentication context={"user_id": "{arcade_user_id}"}, ) print("Final output:\n\n", result.final_output) except AuthorizationError as e: # Display the authorization URL to the user print(f"Please Login to GitHub: {e}") # The error contains the authorization URL that the user should visit ``` ### Wait for authorization completion [Permalink for this section](https://docs.arcade.dev/home/oai-agents/user-auth-interrupts\#wait-for-authorization-completion) You can also wait for the user to complete the authorization before continuing: PythonJavaScript ```nextra-code from arcadepy import AsyncArcade import asyncio client = AsyncArcade() async def handle_auth_flow(auth_id): # Display a message to the user print("Please visit the authorization URL in your browser") # Wait for the user to authenticate await client.auth.wait_for_completion(auth_id) # Check if authorization was successful if await is_authorized(auth_id): print("Authorization successful! You can now use the tool.") return True else: print("Authorization failed or timed out.") return False # In your main function try: # Run agent code # ... except AuthorizationError as e: auth_id = e.auth_id if await handle_auth_flow(auth_id): # Try running the agent again result = await Runner.run( starting_agent=github_agent, input="Star the arcadeai/arcade-ai repo", context={"user_id": "{arcade_user_id}"}, ) print("Final output:\n\n", result.final_output) ``` ### Complete example [Permalink for this section](https://docs.arcade.dev/home/oai-agents/user-auth-interrupts\#complete-example) Here’s a full example that demonstrates the authorization flow with waiting for authentication: PythonJavaScript ```nextra-code from arcadepy.auth import wait_for_authorization_completion import time from agents import Agent, Runner from arcadepy import AsyncArcade from agents_arcade import get_arcade_tools from agents_arcade.errors import AuthorizationError async def main(): client = AsyncArcade() # Use the "github" toolkit for this example tools = await get_arcade_tools(client, toolkits=["github"]) github_agent = Agent( name="GitHub agent", instructions="You are a helpful assistant that can assist with GitHub API calls.", model="gpt-4o-mini", tools=tools, ) user_id = "{arcade_user_id}" # Make sure to use a unique user ID while True: try: result = await Runner.run( starting_agent=github_agent, input="Star the arcadeai/arcade-ai repo", # Pass the user_id for auth context={"user_id": user_id}, ) print("Final output:\n\n", result.final_output) break # Exit the loop if successful except AuthorizationError as e: auth_url = str(e) print(f"{auth_url}. Please authenticate to continue.") # Wait for the user to authenticate await client.auth.wait_for_completion(e.result.id) if __name__ == "__main__": import asyncio asyncio.run(main()) ``` This example handles the authentication flow by: 1. Attempting to run the agent 2. Catching any AuthorizationError 3. Open the authentication URL in a browser 4. Waiting for the user to complete authentication 5. Retrying the operation after a wait period ## Authentication persistence [Permalink for this section](https://docs.arcade.dev/home/oai-agents/user-auth-interrupts\#authentication-persistence) Once a user authorizes an integration, Arcade will remember the authorization for that specific user\_id and toolkit. You don’t need to re-authorize each time you run the agent. Key points to remember: - Always use a consistent and unique `user_id` for each user - Store the `user_id` securely in your application - Different toolkits require separate authorization flows - Authorization tokens are managed by Arcade, not your application ## Next steps [Permalink for this section](https://docs.arcade.dev/home/oai-agents/user-auth-interrupts\#next-steps) - Build a user interface to handle authorization flows smoothly - Explore other Arcade toolkits like Google, LinkedIn, or X - Create multi-step workflows with multiple tools and authorizations - Learn to build your own custom tools with the Arcade Tool SDK By handling Arcade’s authorization flow correctly, you can build AI-driven applications that securely integrate with various services while respecting user permissions. Have fun exploring Arcade! [Using Arcade tools](https://docs.arcade.dev/home/oai-agents/use-arcade-tools "Using Arcade tools") [Using Arcade tools](https://docs.arcade.dev/home/vercelai/use-arcade-tools "Using Arcade tools") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Using Arcade Tools [Home](https://docs.arcade.dev/home "Home") CrewAIUsing Arcade tools ## Use CrewAI with Arcade [Permalink for this section](https://docs.arcade.dev/home/crewai/use-arcade-tools\#use-crewai-with-arcade) In this guide, we will explore how to integrate Arcade tools into your CrewAI application. Follow the step-by-step instructions below. If a tool requires authorization, an authorization URL will appear in the console, waiting for your approval. This process ensures that only the tools you choose to authorize are executed. To tailor the tool authorization flow to meet your application’s specific needs, check out the [Custom Auth Flow with CrewAI](https://docs.arcade.dev/home/crewai/custom-auth-flow) guide. ### Prerequisites [Permalink for this section](https://docs.arcade.dev/home/crewai/use-arcade-tools\#prerequisites) - [Obtain an Arcade API key](https://docs.arcade.dev/home/api-keys) ### Set up your environment [Permalink for this section](https://docs.arcade.dev/home/crewai/use-arcade-tools\#set-up-your-environment) Install the required package, and ensure your environment variables are set with your Arcade and OpenAI API keys: ```nextra-code pip install crewai-arcade ``` ### Configure API keys [Permalink for this section](https://docs.arcade.dev/home/crewai/use-arcade-tools\#configure-api-keys) Provide your Arcade and OpenAI API keys. You can store them in environment variables like so: ```nextra-code export ARCADE_API_KEY="your_arcade_api_key" export OPENAI_API_KEY="your_openai_api_key" ``` ### Get Arcade tools [Permalink for this section](https://docs.arcade.dev/home/crewai/use-arcade-tools\#get-arcade-tools) Use the `ArcadeToolManager` to initialize, add, and get Arcade tools: ```nextra-code from crewai_arcade import ArcadeToolManager manager = ArcadeToolManager(default_user_id="{arcade_user_id}") """ Retrieves the provided tools and/or toolkits as CrewAI StructuredTools. """ tools = manager.get_tools(tools=["Gmail.ListEmails"], toolkits=["Slack"]) ``` ### Use tools in your CrewAI agent team [Permalink for this section](https://docs.arcade.dev/home/crewai/use-arcade-tools\#use-tools-in-your-crewai-agent-team) Create a Crew that uses your tools. When the tool is called, you will be prompted to go visit an authorization page to authorize the tool before it executes. ```nextra-code from crewai import Agent, Crew, Task from crewai.llm import LLM crew_agent = Agent( role="Main Agent", backstory="You are a helpful assistant", goal="Help the user with their requests", tools=tools, allow_delegation=False, verbose=True, llm=LLM(model="gpt-4o"), ) task = Task( description="Get the 5 most recent emails from the user's inbox and summarize them and recommend a response for each.", expected_output="A bulleted list with a one sentence summary of each email and a recommended response to the email.", agent=crew_agent, tools=crew_agent.tools, ) crew = Crew( agents=[crew_agent], tasks=[task], verbose=True, memory=True, ) result = crew.kickoff() print("\n\n\n ------------ Result ------------ \n\n\n") print(result) ``` Click to view a full example ## Tips for selecting tools [Permalink for this section](https://docs.arcade.dev/home/crewai/use-arcade-tools\#tips-for-selecting-tools) - **Relevance**: Pick only the tools you need. Avoid using all tools at once. - **Avoid conflicts**: Be mindful of duplicate or overlapping functionality. ## Next steps [Permalink for this section](https://docs.arcade.dev/home/crewai/use-arcade-tools\#next-steps) Now that you have integrated Arcade tools into your CrewAI agent team, you can: - Experiment with different toolkits, such as “Math” or “Search.” - Customize the agent’s prompts for specific tasks. - Customize the tool authorization and execution flow to meet your application’s requirements. [Authorizing existing tools](https://docs.arcade.dev/home/langchain/auth-langchain-tools "Authorizing existing tools") [Custom auth flow](https://docs.arcade.dev/home/crewai/custom-auth-flow "Custom auth flow") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Hubspot Toolkit Reference [Integrations](https://docs.arcade.dev/toolkits "Integrations") Sales [Hubspot](https://docs.arcade.dev/mcp-servers/sales/hubspot "Hubspot") Reference # Hubspot Reference Below is a reference of enumerations used by some of the tools in the Hubspot toolkit: ## HubspotCallDirection [Permalink for this section](https://docs.arcade.dev/mcp-servers/sales/hubspot/reference\#hubspotcalldirection) - **INBOUND**: `INBOUND` - **OUTBOUND**: `OUTBOUND` ## HubspotEmailDirection [Permalink for this section](https://docs.arcade.dev/mcp-servers/sales/hubspot/reference\#hubspotemaildirection) - **EMAIL**: `EMAIL` - **INCOMING\_EMAIL**: `INCOMING_EMAIL` - **FORWARDED\_EMAIL**: `FORWARDED_EMAIL` ## HubspotEmailStatus [Permalink for this section](https://docs.arcade.dev/mcp-servers/sales/hubspot/reference\#hubspotemailstatus) - **BOUNCED**: `BOUNCED` - **FAILED**: `FAILED` - **SCHEDULED**: `SCHEDULED` - **SENDING**: `SENDING` - **SENT**: `SENT` ## HubspotMeetingOutcome [Permalink for this section](https://docs.arcade.dev/mcp-servers/sales/hubspot/reference\#hubspotmeetingoutcome) - **SCHEDULED**: `SCHEDULED` - **COMPLETED**: `COMPLETED` - **RESCHEDULED**: `RESCHEDULED` - **NO\_SHOW**: `NO_SHOW` - **CANCELED**: `CANCELED` ## HubspotCommunicationChannel [Permalink for this section](https://docs.arcade.dev/mcp-servers/sales/hubspot/reference\#hubspotcommunicationchannel) - **SMS**: `SMS` - **WHATS\_APP**: `WHATS_APP` - **LINKEDIN\_MESSAGE**: `LINKEDIN_MESSAGE` - **PHYSICAL\_MAIL**: `PHYSICAL_MAIL` - **CUSTOM\_CHANNEL\_CONVERSATION**: `CUSTOM_CHANNEL_CONVERSATION` ## HubspotActivityType [Permalink for this section](https://docs.arcade.dev/mcp-servers/sales/hubspot/reference\#hubspotactivitytype) - **NOTE**: `note` - **CALL**: `call` - **EMAIL**: `email` - **MEETING**: `meeting` - **TASK**: `task` - **COMMUNICATION**: `communication` ## HubspotSortOrder [Permalink for this section](https://docs.arcade.dev/mcp-servers/sales/hubspot/reference\#hubspotsortorder) - **LATEST\_MODIFIED**: `LATEST_MODIFIED` - **OLDEST\_MODIFIED**: `OLDEST_MODIFIED` - **ALPHABETICAL**: `ALPHABETICAL` ## HubspotDealType [Permalink for this section](https://docs.arcade.dev/mcp-servers/sales/hubspot/reference\#hubspotdealtype) - **NEW\_BUSINESS**: `newbusiness` - **EXISTING\_BUSINESS**: `existingbusiness` ## HubspotDealPriority [Permalink for this section](https://docs.arcade.dev/mcp-servers/sales/hubspot/reference\#hubspotdealpriority) - **LOW**: `low` - **MEDIUM**: `medium` - **HIGH**: `high` [Hubspot](https://docs.arcade.dev/mcp-servers/sales/hubspot "Hubspot") [Salesforce](https://docs.arcade.dev/mcp-servers/sales/salesforce "Salesforce") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Arcade Obsidian Toolkit [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Productivity & Docs](https://docs.arcade.dev/mcp-servers/productivity/asana "Productivity & Docs") Obsidian # Arcade Obsidian Toolkit The Arcade Obsidian Toolkit is a community contributed toolkit verified by the Arcade team. To learn more about the toolkit, please visit the [Arcade Obsidian GitHub repository](https://github.com/spartee/arcade-obsidian). [Notion](https://docs.arcade.dev/mcp-servers/productivity/notion "Notion") [Outlook Calendar](https://docs.arcade.dev/mcp-servers/productivity/outlook_calendar "Outlook Calendar") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Retryable Tool Error [Home](https://docs.arcade.dev/home "Home") [Build tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server "Build tools") Retry tools with improved prompt # RetryableToolError in Arcade Sometimes you may want to retry a tool call with additional context to improve the tool call’s input parameters predicted by the model and try again. You can do this by raising a `RetryableToolError` within the tool. ### Understanding RetryableToolError [Permalink for this section](https://docs.arcade.dev/home/build-tools/retry-tools-with-improved-prompt\#understanding-retryabletoolerror) Raising the `RetryableToolError` is useful when you want to retry the tool call and give the model that is generating the tool call’s input parameters additional context to improve the parameters for the next tool call. ### When to Use RetryableToolError [Permalink for this section](https://docs.arcade.dev/home/build-tools/retry-tools-with-improved-prompt\#when-to-use-retryabletoolerror) A RetryableToolError should be raised from within a tool if additional prompt content would likely improve the tool call outcome. ### Example: Sending a Direct Message in Slack [Permalink for this section](https://docs.arcade.dev/home/build-tools/retry-tools-with-improved-prompt\#example-sending-a-direct-message-in-slack) Below is an example of a tool that sends a direct message to a user in Slack: 1. If the specified user is not found, the tool retrieves a list of all valid inputs for the `user_name` parameter. 2. The tool then raises a `RetryableToolError` with the list of valid inputs. 3. This allows the model to generate a valid input for the `user_name` parameter in the next tool call iteration. ```nextra-code from typing import Annotated from slack_sdk import WebClient from arcade_tdk.errors import RetryableToolError from arcade_tdk import ToolContext, tool from arcade_tdk.auth import Slack @tool( requires_auth=Slack( scopes=[\ "chat:write",\ "im:write",\ "users.profile:read",\ "users:read",\ ], ) ) def send_dm_to_user( context: ToolContext, user_name: Annotated[\ str,\ "The Slack username of the person you want to message. Slack usernames are ALWAYS lowercase.",\ ], message: Annotated[str, "The message you want to send"], ) -> Annotated[str, "A confirmation message that the DM was sent"]: """Send a direct message to a user in Slack.""" slackClient = WebClient(token=context.authorization.token) # Step 1: Retrieve the user's Slack ID based on their username userListResponse = slackClient.users_list() user_id = None for user in userListResponse["members"]: if user["name"].lower() == user_name.lower(): user_id = user["id"] break # If the user is not found, raise a RetryableToolError with a # list of all valid inputs for the user_name parameter if not user_id: raise RetryableToolError( "User not found", developer_message=f"User with username '{user_name}' not found.", additional_prompt_content=f"Valid values for user_name input param: {userListResponse}", retry_after_ms=500, ) # Step 2: Retrieve the DM channel ID with the user im_response = slackClient.conversations_open(users=[user_id]) dm_channel_id = im_response["channel"]["id"] # Step 3: Send the DM slackClient.chat_postMessage(channel=dm_channel_id, text=message) return "DM sent successfully" ``` [Handle tool errors](https://docs.arcade.dev/home/build-tools/handle-tool-errors "Handle tool errors") [Why evaluate tools?](https://docs.arcade.dev/home/evaluate-tools/why-evaluate-tools "Why evaluate tools?") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Auth Providers Overview [Home](https://docs.arcade.dev/home "Home") Customizing AuthOverview # Auth Providers Auth providers enable users to seamlessly and securely allow Arcade tools to access their data. Arcade has several auth providers available in the Arcade Cloud Platform so you don’t have to configure your own. However, using Arcade’s auth providers means that your users will see the Arcade brand (name and logo) on the auth screen and your authentications will share any rate limits from those providers with other Arcade customers. It can be useful to configure your own auth provider for the following reasons: - You want to use your own brand on the auth screen - You want to isolate your rate limits from other Arcade customers - You want to use a provider that Arcade [does not have a built-in integration for](https://docs.arcade.dev/home/auth-providers/oauth2) After adding an auth provider used by an Arcade tool, executing the tool will automatically use your auth provider. Even in the Arcade Cloud Platform, your auth provider will take precedence over the arcade-provided auth provider. Adding multiple providers of the same type, not including the arcade-provided ones, can cause Arcade’s tool authorization to fail, see [Using multiple providers of the same type](https://docs.arcade.dev/home/auth-providers#using-multiple-providers-of-the-same-type) for more information. ## Catalog of providers [Permalink for this section](https://docs.arcade.dev/home/auth-providers\#catalog-of-providers) For more information on how to customize your auth provider, select an auth provider from the list below: [![Asana logo](https://docs.arcade.dev/images/icons/asana.svg)\\ \\ **Asana**\\ \\ **Auth** \\ \\ Authorize tools and agents with Asana](https://docs.arcade.dev/home/auth-providers/asana) [![Atlassian logo](https://docs.arcade.dev/images/icons/atlassian.png)\\ \\ **Atlassian**\\ \\ **Auth** \\ \\ Authorize tools and agents with Atlassian](https://docs.arcade.dev/home/auth-providers/atlassian) [![Discord logo](https://docs.arcade.dev/images/icons/discord.png)\\ \\ **Discord**\\ \\ **Auth** \\ \\ Authorize tools and agents with Discord in a user's context](https://docs.arcade.dev/home/auth-providers/discord) [![Dropbox logo](https://docs.arcade.dev/images/icons/dropbox.png)\\ \\ **Dropbox**\\ \\ **Auth** \\ \\ Authorize tools and agents with Dropbox in a user's context](https://docs.arcade.dev/home/auth-providers/dropbox) [![GitHub logo](https://docs.arcade.dev/images/icons/github.png)\\ \\ **GitHub**\\ \\ **Auth** \\ \\ Authorize tools and agents with GitHub, including private repositories](https://docs.arcade.dev/home/auth-providers/github) [![Google logo](https://docs.arcade.dev/images/icons/google.png)\\ \\ **Google**\\ \\ **Auth** \\ \\ Authorize tools and agents with Google: Gmail, Calendar, YouTube, Drive, and more](https://docs.arcade.dev/home/auth-providers/google) [![HubSpot logo](https://docs.arcade.dev/images/icons/hubspot.png)\\ \\ **HubSpot**\\ \\ **Auth** \\ \\ Authorize tools and agents with HubSpot](https://docs.arcade.dev/home/auth-providers/hubspot) [![Linear logo](https://docs.arcade.dev/images/icons/linear.svg)\\ \\ **Linear**\\ \\ **Auth** \\ \\ Authorize tools and agents with Linear](https://docs.arcade.dev/home/auth-providers/linear) [![LinkedIn logo](https://docs.arcade.dev/images/icons/linkedin.png)\\ \\ **LinkedIn**\\ \\ **Auth** \\ \\ Authorize tools and agents with LinkedIn](https://docs.arcade.dev/home/auth-providers/linkedin) [![Microsoft logo](https://docs.arcade.dev/images/icons/msft.png)\\ \\ **Microsoft**\\ \\ **Auth** \\ \\ Authorize tools and agents with Microsoft Graph](https://docs.arcade.dev/home/auth-providers/microsoft) [![Notion logo](https://docs.arcade.dev/images/icons/notion.png)\\ \\ **Notion**\\ \\ **Auth** \\ \\ Authorize tools and agents with Notion](https://docs.arcade.dev/home/auth-providers/notion) [![Reddit logo](https://docs.arcade.dev/images/icons/reddit.png)\\ \\ **Reddit**\\ \\ **Auth** \\ \\ Authorize tools and agents with Reddit](https://docs.arcade.dev/home/auth-providers/reddit) [![Slack logo](https://docs.arcade.dev/images/icons/slack.png)\\ \\ **Slack**\\ \\ **Auth** \\ \\ Authorize tools and agents with Slack](https://docs.arcade.dev/home/auth-providers/slack) [![Spotify logo](https://docs.arcade.dev/images/icons/spotify.png)\\ \\ **Spotify**\\ \\ **Auth** \\ \\ Authorize tools and agents with Spotify](https://docs.arcade.dev/home/auth-providers/spotify) [![Twitch logo](https://docs.arcade.dev/images/icons/twitch.png)\\ \\ **Twitch**\\ \\ **Auth** \\ \\ Authorize tools and agents with Twitch](https://docs.arcade.dev/home/auth-providers/twitch) [![X logo](https://docs.arcade.dev/images/icons/twitter.png)\\ \\ **X**\\ \\ **Auth** \\ \\ Authorize tools and agents with X (Twitter)](https://docs.arcade.dev/home/auth-providers/x) [![Zoom logo](https://docs.arcade.dev/images/icons/zoom_fav.svg)\\ \\ **Zoom**\\ \\ **Auth** \\ \\ Authorize tools and agents with Zoom](https://docs.arcade.dev/home/auth-providers/zoom) [![OAuth 2.0 logo](https://docs.arcade.dev/images/icons/oauth2.png)\\ \\ **OAuth 2.0**\\ \\ **Auth** \\ \\ Authorize tools and agents with any OAuth 2.0-compatible provider](https://docs.arcade.dev/home/auth-providers/oauth2) If the auth provider you need is not listed, try the [OAuth 2.0](https://docs.arcade.dev/home/auth-providers/oauth2) provider, or [get in touch](mailto:contact@arcade.dev) with us! ## Using multiple providers of the same type [Permalink for this section](https://docs.arcade.dev/home/auth-providers\#using-multiple-providers-of-the-same-type) You can create multiple auth providers of the same type, for example, you can have multiple Google auth providers, each with their own client ID and secret. This might be useful if you want separate Google clients to handle calendar and email scopes, for example. However, Arcade’s tools are configured to select an auth provider by the type. This means that if you have multiple auth providers of the same type, Arcade will not know which one to use and authorizing the tool will fail. To work around this, you can fork Arcade’s tools and modify them to specify your own auth provider by the unique ID that you give each of them. For example, if you have two Google auth providers, `acme-google-calendar` and `acme-google-email`, you can modify Arcade’s Gmail.ListEmails tool like this: ```nextra-code @tool( requires_auth=Google( id="acme-google-email", # This is the unique ID you gave your auth provider scopes=["https://www.googleapis.com/auth/gmail.readonly"], ) ) async def list_emails( # ... ``` This is similar to the pattern used in the generic OAuth2 provider, but instead of using the `OAuth2` class, you use the `Google` class and specify the `id` of the auth provider you want to use. See the docs about [Authoring Tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server) for more information on how to create and serve a toolkit. [Configuration Templates](https://docs.arcade.dev/home/local-deployment/configure/templates "Configuration Templates") [Asana](https://docs.arcade.dev/home/auth-providers/asana "Asana") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Teams Toolkit Reference [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Social & Communication](https://docs.arcade.dev/mcp-servers/social-communication/discord "Social & Communication") teamsReference # Teams Reference Below is a reference of enumerations used by some tools in the Teams toolkit: ## PartialMatchType [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/teams/reference\#partialmatchtype) - **PARTIAL\_ALL**: `match_all_keywords` - **PARTIAL\_ANY**: `match_any_of_the_keywords` ## MatchType [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/teams/reference\#matchtype) - **EXACT**: `exact_match` - **PARTIAL\_ALL**: `partial_match_all_keywords` - **PARTIAL\_ANY**: `partial_match_any_of_the_keywords` ## TeamMembershipType [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/teams/reference\#teammembershiptype) - **DIRECT\_MEMBER**: `direct_member_of_the_team` - **MEMBER\_OF\_SHARED\_CHANNEL**: `member_of_a_shared_channel_in_another_team` ## PartialMatchType [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/teams/reference\#partialmatchtype-1) - **PARTIAL\_ALL**: `match_all_keywords` - **PARTIAL\_ANY**: `match_any_of_the_keywords` [Slack API](https://docs.arcade.dev/mcp-servers/social-communication/slack_api "Slack API") [Imgflip](https://docs.arcade.dev/mcp-servers/entertainment/imgflip "Imgflip") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Arcade Engine Configuration [Home](https://docs.arcade.dev/home "Home") [Local Deployment](https://docs.arcade.dev/home/local-deployment/install "Local Deployment") ConfigureOverview # Configuration Overview Arcade uses configuration files to manage engine settings and default values. When you install the Arcade Engine, two files are created: - The `engine.yaml` file for engine configuration. - The `engine.env` file for environment variables. Let’s explore each file to understand their purpose and how to locate them. ## Engine configuration file [Permalink for this section](https://docs.arcade.dev/home/deployment/on-prem-mcp\#engine-configuration-file) The `engine.yaml` file controls Arcade Engine settings. It supports variable expansion so you can integrate secrets and environment values seamlessly. You can customize this file to suit your setup. For more details, check the [Engine Configuration](https://docs.arcade.dev/home/deployment/engine-configuration) page. Choose your installation method to view the default location of `engine.yaml`: macOS (Homebrew)Ubuntu/Debian (APT)Manual Download ```nextra-code $HOMEBREW_REPOSITORY/etc/arcade-engine/engine.yaml ``` ## Engine environment file [Permalink for this section](https://docs.arcade.dev/home/deployment/on-prem-mcp\#engine-environment-file) The `engine.env` file contains default environment variables that power Arcade Engine. You can override these defaults by exporting your own variables or by editing the file directly. Select your installation method below to see the default path for `engine.env`: macOS (Homebrew)Ubuntu/Debian (APT)Manual Download ```nextra-code $HOMEBREW_REPOSITORY/etc/arcade-engine/engine.env ``` [Toolkits](https://docs.arcade.dev/home/local-deployment/install/toolkits "Toolkits") [Engine](https://docs.arcade.dev/home/deployment/engine-configuration "Engine") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Arcade Gmail Toolkit [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Productivity & Docs](https://docs.arcade.dev/mcp-servers/productivity/asana "Productivity & Docs") Gmail # Gmail **Description:** Enable agents to send, read, and manage emails in Gmail. **Author:** Arcade **Auth:** User authorizationvia the [Google auth provider](https://docs.arcade.dev/home/auth-providers/google) [![PyPI Version](https://img.shields.io/pypi/v/arcade_gmail)](https://pypi.org/project/arcade_gmail/)[![License](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/arcadeai/arcade-ai/blob/main/LICENSE)[![Python Versions](https://img.shields.io/pypi/pyversions/arcade_gmail)](https://pypi.org/project/arcade_gmail/)[![Wheel Status](https://img.shields.io/pypi/wheel/arcade_gmail)](https://pypi.org/project/arcade_gmail/)[![Downloads](https://img.shields.io/pypi/dm/arcade_gmail)](https://pypi.org/project/arcade_gmail/) The Arcade Gmail MCP Server provides a pre-built set of tools for interacting with Gmail. These tools make it easy to build agents and AI apps that can: - Send, read, and manage emails - Compose and update draft emails - Delete emails - Search for emails by header - List emails in the user’s mailbox ## Available Tools [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/gmail\#available-tools) These tools are currently available in the Arcade Gmail toolkit. | Tool Name | Description | | --- | --- | | Gmail.SendEmail | Send an email using the Gmail API. | | Gmail.SendDraftEmail | Send a draft email using the Gmail API. | | Gmail.WriteDraftEmail | Compose a new email draft using the Gmail API. | | Gmail.UpdateDraftEmail | Update an existing email draft. | | Gmail.DeleteDraftEmail | Delete a draft email using the Gmail API. | | Gmail.TrashEmail | Move an email to the trash folder. | | Gmail.ListDraftEmails | List draft emails in the user's mailbox. | | Gmail.ListEmailsByHeader | Search for emails by header using the Gmail API. | | Gmail.ListEmails | Read emails and extract plain text content. | | Gmail.SearchThreads | Search for threads in the user's mailbox. | | Gmail.ListThreads | List threads in the user's mailbox. | | Gmail.GetThread | Get the specified thread by ID. | | Gmail.WhoAmI | Get comprehensive user profile and Gmail account information. | If you need to perform an action that’s not listed here, you can [get in touch\\ with us](mailto:contact@arcade.dev) to request a new tool, or [create your\\ own tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server) with the [Google auth\\ provider](https://docs.arcade.dev/home/auth-providers/google#using-google-auth-in-custom-tools). ## Gmail.SendEmail [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/gmail\#gmailsendemail) See Example > Send an email using the Gmail API. **Parameters** - **`subject`** _(string, required)_ The subject of the email. - **`body`** _(string, required)_ The body of the email. - **`recipient`** _(string, required)_ The recipient of the email. - **`cc`** _(array, optional, Defaults to None)_ CC recipients of the email. - **`bcc`** _(array, optional, Defaults to None)_ BCC recipients of the email. * * * ## Gmail.SendDraftEmail [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/gmail\#gmailsenddraftemail) See Example > Send a draft email using the Gmail API. **Parameters** - **`email_id`** _(string, required)_ The ID of the draft to send. * * * ## Gmail.WriteDraftEmail [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/gmail\#gmailwritedraftemail) See Example > Compose a new email draft using the Gmail API. **Parameters** - **`subject`** _(string, required)_ The subject of the draft email. - **`body`** _(string, required)_ The body of the draft email. - **`recipient`** _(string, required)_ The recipient of the draft email. - **`cc`** _(array, optional, Defaults to None)_ CC recipients of the draft email. - **`bcc`** _(array, optional, Defaults to None)_ BCC recipients of the draft email. * * * ## Gmail.UpdateDraftEmail [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/gmail\#gmailupdatedraftemail) See Example > Update an existing email draft. **Parameters** - **`draft_email_id`** _(string, required)_ The ID of the draft email to update. - **`subject`** _(string, required)_ The subject of the draft email. - **`body`** _(string, required)_ The body of the draft email. - **`recipient`** _(string, required)_ The recipient of the draft email. - **`cc`** _(array, optional, Defaults to None)_ CC recipients of the draft email. - **`bcc`** _(array, optional, Defaults to None)_ BCC recipients of the draft email. * * * ## Gmail.DeleteDraftEmail [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/gmail\#gmaildeletedraftemail) See Example > Delete a draft email using the Gmail API. **Parameters** - **`draft_email_id`** _(string, required)_ The ID of the draft email to delete. * * * ## Gmail.TrashEmail [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/gmail\#gmailtrashemail) The `TrashEmail` tool is currently only available on a self-hosted instance of the Arcade Engine. To learn more about self-hosting, see the [self-hosting documentation](https://docs.arcade.devhttp://localhost:3000/en/home/deployment/engine-configuration). See Example > Move an email to the trash folder. **Parameters** - **`email_id`** _(string, required)_ The ID of the email to trash. * * * ## Gmail.ListDraftEmails [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/gmail\#gmaillistdraftemails) See Example > List draft emails in the user’s mailbox. **Parameters** - **`n_drafts`** _(integer, optional, Defaults to 5)_ Number of draft emails to read. * * * ## Gmail.ListEmailsByHeader [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/gmail\#gmaillistemailsbyheader) See Example > Search for emails by header using the Gmail API. _At least one of the following parameters must be provided: `sender`, `recipient`, `subject`, `body`._ **Parameters** - **`sender`** _(string, optional, Defaults to None)_ The name or email address of the sender. - **`recipient`** _(string, optional, Defaults to None)_ The name or email address of the recipient. - **`subject`** _(string, optional, Defaults to None)_ Words to find in the subject of the email. - **`body`** _(string, optional, Defaults to None)_ Words to find in the body of the email. - **`date_range`** _(string, optional, Defaults to None)_ The date range of the emails. - **`limit`** _(integer, optional, Defaults to 25)_ The maximum number of emails to return. * * * ## Gmail.ListEmails [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/gmail\#gmaillistemails) See Example > Read emails from a Gmail account and extract plain text content. **Parameters** - **`n_emails`** _(integer, optional, Defaults to 5)_ Number of emails to read. * * * ## Gmail.SearchThreads [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/gmail\#gmailsearchthreads) See Example > Search for threads in the user’s mailbox **Parameters** - **`page_token`** _(string, optional)_ Page token to retrieve a specific page of results in the list. - **`max_results`** _(integer, optional, Defaults to `10`)_ The maximum number of threads to return. - **`include_spam_trash`** _(boolean, optional)_ Whether to include spam and trash in the results. - **`label_ids`** _(array, optional)_ The IDs of labels to filter by. - **`sender`** _(string, optional)_ The name or email address of the sender of the email. - **`recipient`** _(string, optional)_ The name or email address of the recipient. - **`subject`** _(string, optional)_ Words to find in the subject of the email. - **`body`** _(string, optional)_ Words to find in the body of the email. - **`date_range`** _(string, optional)_ The date range of the email. Valid values are ‘today’, ‘yesterday’, ‘last\_7\_days’, ‘last\_30\_days’, ‘this\_month’, ‘last\_month’, ‘this\_year’. * * * ## Gmail.ListThreads [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/gmail\#gmaillistthreads) See Example > List threads in the user’s mailbox. **Parameters** - **`page_token`** _(string, optional)_ Page token to retrieve a specific page of results in the list. - **`max_results`** _(integer, optional, Defaults to `10`)_ The maximum number of threads to return. - **`include_spam_trash`** _(boolean, optional)_ Whether to include spam and trash in the results. * * * ## Gmail.GetThread [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/gmail\#gmailgetthread) See Example > Get the specified thread by ID. **Parameters** - **`thread_id`** _(string, required)_ The ID of the thread to retrieve. ## Gmail.WhoAmI [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/gmail\#gmailwhoami) See Example > Get comprehensive user profile and Gmail account information. **Parameters** This tool does not take any parameters. ## Auth [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/gmail\#auth) The Arcade Gmail toolkit uses the [Google auth provider](https://docs.arcade.dev/home/auth-providers/google) to connect to users’ Google accounts. With the Arcade Cloud Platform, there’s nothing to configure. Your users will see `Arcade` as the name of the application that’s requesting permission. With a self-hosted installation of Arcade, you need to [configure the Google auth provider](https://docs.arcade.dev/home/auth-providers/google#configuring-google-auth) with your own Google app credentials. * * * ## Reference [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/gmail\#reference) ### GmailReplyToWhom [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/gmail\#gmailreplytowhom) The type of recipient to reply to. - **`EVERY_RECIPIENT`**: Reply to the original sender and all recipients. - **`ONLY_THE_SENDER`**: Reply to the original sender only. ## Get Building [Use tools hosted on Arcade Cloud\\ \\ Arcade tools are hosted by our cloud platform and ready to be used in your agents. Learn how.](https://docs.arcade.dev/home/quickstart) [Self Host Arcade tools\\ \\ Arcade tools can be self-hosted on your own infrastructure. Learn more about self-hosting.\\ \\ ```\\ pip install arcade_gmail\\ ```](https://docs.arcade.dev/home/hosting-overview) [Reference](https://docs.arcade.dev/mcp-servers/productivity/dropbox/reference "Reference") [Reference](https://docs.arcade.dev/mcp-servers/productivity/gmail/reference "Reference") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Tool Error Handling Guide [Home](https://docs.arcade.dev/home "Home") [Build tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server "Build tools") Handle tool errors # Tool Error Handling When building tools with Arcade’s Tool Development Kit (TDK), understanding error handling is crucial for creating robust and reliable tools. This guide covers everything you need to know about handling errors from a tool developer’s perspective. ## Error handling philosophy [Permalink for this section](https://docs.arcade.dev/home/build-tools/handle-tool-errors\#error-handling-philosophy) Arcade’s error handling is designed to minimize boilerplate code while providing rich error information. In most cases, you don’t need to explicitly handle errors in your tools because the `@tool` decorator automatically adapts common exceptions into appropriate Arcade errors. ## Error hierarchy [Permalink for this section](https://docs.arcade.dev/home/build-tools/handle-tool-errors\#error-hierarchy) Arcade uses a structured error hierarchy to categorize different types of errors: ```nextra-code ToolkitError # (Abstract base class) ├── ToolkitLoadError # Occurs during toolkit import └── ToolError # (Abstract) ├── ToolDefinitionError # Detected when tool is added to catalog │ ├── ToolInputSchemaError # Invalid input parameter types/annotations │ └── ToolOutputSchemaError # Invalid return type annotations └── ToolRuntimeError # Errors during tool execution ├── ToolSerializationError # (Abstract) │ ├── ToolInputError # JSON to Python conversion fails │ └── ToolOutputError # Python to JSON conversion fails └── ToolExecutionError # Errors during tool execution ├── RetryableToolError # Tool can be retried with extra context ├── ContextRequiredToolError # Additional context needed before retry ├── FatalToolError # Unhandled bugs in the tool implementation └── UpstreamError # HTTP/API errors from external services └── UpstreamRateLimitError # Rate limiting errors from external services ``` ## Error adapters [Permalink for this section](https://docs.arcade.dev/home/build-tools/handle-tool-errors\#error-adapters) Error adapters automatically translate common exceptions (from `httpx`, `requests`, SDKs, etc.) into appropriate Arcade errors. This means zero boilerplate error handling code for you. To see which SDKs already have error adapters, see [arcade\_tdk/error\_adapters/ **init**.py](https://github.com/ArcadeAI/arcade-ai/blob/main/libs/arcade-tdk/arcade_tdk/error_adapters/__init__.py). You may want to create your own error adapter or contribute an error adapter to the TDK. If so, see the [HTTP Error Adapter](https://github.com/ArcadeAI/arcade-ai/blob/main/libs/arcade-tdk/arcade_tdk/providers/http/error_adapter.py) for an example. Ensure your error adapter implements the [ErrorAdapter protocol](https://github.com/ArcadeAI/arcade-ai/blob/main/libs/arcade-tdk/arcade_tdk/error_adapters/base.py). ### Automatic error adaptation [Permalink for this section](https://docs.arcade.dev/home/build-tools/handle-tool-errors\#automatic-error-adaptation) For tools using `httpx` or `requests`, error adaptation happens automatically: ```nextra-code from typing import Annotated from arcade_tdk import tool import httpx @tool def fetch_data( url: Annotated[str, "The URL to fetch data from"], ) -> Annotated[dict, "The data fetched from the API endpoint"]: """Fetch data from an API endpoint.""" # No need to wrap in try/catch - Arcade handles HTTP errors automatically response = httpx.get(url) response.raise_for_status() # This will be adapted to UpstreamError if it raises return response.json() ``` ### Explicit error adapters [Permalink for this section](https://docs.arcade.dev/home/build-tools/handle-tool-errors\#explicit-error-adapters) For tools using specific SDKs, you can specify error adapters explicitly: ```nextra-code import googleapiclient from typing import Annotated from arcade_tdk import tool from arcade_tdk.error_adapters import GoogleErrorAdapter @tool( requires_auth=Google(scopes=["https://www.googleapis.com/auth/gmail.readonly"]), error_adapters=[GoogleErrorAdapter] # note the tool opts-into the error adapter ) def send_email( num_emails: Annotated[int, "The number of emails to send"], ) -> Annotated[dict, "The emails sent using the Gmail API"]: """Send an email using the Gmail API.""" # Google API Client errors will be automatically adapted to Upstream Arcade errors for you service = _build_gmail_service(context) emails = service.users.messages().get( userId="me", id=num_emails ).execute() # This will be adapted to UpstreamError if it raises parsed_emails = _parse_emails(emails) return parsed_emails ``` ## When to raise errors explicitly [Permalink for this section](https://docs.arcade.dev/home/build-tools/handle-tool-errors\#when-to-raise-errors-explicitly) While Arcade handles most errors automatically, there are specific cases where you should raise errors explicitly: ### RetryableToolError [Permalink for this section](https://docs.arcade.dev/home/build-tools/handle-tool-errors\#retryabletoolerror) Use when the LLM can retry the tool call with more context to improve the tool call’s input parameters: ```nextra-code from typing import Annotated from arcade_tdk import tool from arcade_tdk.errors import RetryableToolError @tool(requires_auth=Reddit(scopes=["read"])) def search_posts( subreddit: Annotated[str, "The subreddit to search in"], query: Annotated[str, "The query to search for"], ) -> Annotated[list[dict], "The posts found in the subreddit"]: """Search for posts in a subreddit.""" if is_invalid_subreddit(subreddit): # additional_prompt_content should be provided back to the LLM raise RetryableToolError( "Please specify a subreddit name, such as 'python' or 'programming'", additional_prompt_content=f"{subreddit} is an invalid subreddit name. Please specify a valid subreddit name" ) # ... rest of implementation ``` ### ContextRequiredToolError [Permalink for this section](https://docs.arcade.dev/home/build-tools/handle-tool-errors\#contextrequiredtoolerror) Use when additional context from the user or orchestrator is needed before the tool call can be retried by an LLM: ```nextra-code from os import path from typing import Annotated from arcade_tdk import tool from arcade_tdk.errors import ContextRequiredToolError @tool def delete_file(filename: Annotated[str, "The filename to delete"]) -> Annotated[str, "The filename that was deleted"]: """Delete a file from the system.""" if not os.path.exists(filename): raise ContextRequiredToolError( "File with provided filename does not exist", additional_prompt_content=f"{filename} does not exist. Did you mean one of these: {get_valid_filenames()}", ) # ... deletion logic ``` ### ToolExecutionError [Permalink for this section](https://docs.arcade.dev/home/build-tools/handle-tool-errors\#toolexecutionerror) Use for unrecoverable, but known, errors when you want to provide specific error context: ```nextra-code from typing import Annotated from arcade_tdk import tool from arcade_tdk.errors import ToolExecutionError @tool def process_data(data_id: Annotated[str, "The ID of the data to process"]) -> Annotated[dict, "The processed data"]: """Process data by ID.""" try: data = get_data_from_database(data_id) except Exception as e: raise ToolExecutionError("Database connection failed.") from e # ... processing logic ``` ### UpstreamError [Permalink for this section](https://docs.arcade.dev/home/build-tools/handle-tool-errors\#upstreamerror) Use for custom handling of upstream service errors: ```nextra-code from arcade_tdk import tool from arcade_tdk.errors import UpstreamError import httpx @tool def create_issue(title: str, description: str) -> dict: """Create a GitHub issue.""" try: response = httpx.post("/repos/owner/repo/issues", json={ "title": title, "body": description }) response.raise_for_status() except httpx.HTTPStatusError as e: if e.response.status_code == 422: raise UpstreamError( "Invalid issue data provided. Check title and description.", status_code=422 ) from e # Let other HTTP errors be handled automatically raise return response.json() ``` ## Common error scenarios [Permalink for this section](https://docs.arcade.dev/home/build-tools/handle-tool-errors\#common-error-scenarios) ### Tool definition errors [Permalink for this section](https://docs.arcade.dev/home/build-tools/handle-tool-errors\#tool-definition-errors) These errors occur when your tool has invalid definitions and are caught when the tool is loaded: #### Invalid input parameter types [Permalink for this section](https://docs.arcade.dev/home/build-tools/handle-tool-errors\#invalid-input-parameter-types) ```nextra-code from arcade_tdk import tool @tool def invalid_tool(data: tuple[str, str, str]) -> str: # ❌ Tuples not supported """This will raise a ToolInputSchemaError.""" return f"Hello {data[0]}" ``` #### Missing return type annotation [Permalink for this section](https://docs.arcade.dev/home/build-tools/handle-tool-errors\#missing-return-type-annotation) ```nextra-code from arcade_tdk import tool @tool def invalid_tool(name: str): # ❌ Missing return type """This will raise a ToolOutputSchemaError.""" return f"Hello {name}" ``` #### Invalid parameter annotations [Permalink for this section](https://docs.arcade.dev/home/build-tools/handle-tool-errors\#invalid-parameter-annotations) ```nextra-code from typing import Annotated from arcade_tdk import tool @tool def invalid_tool(name: Annotated[str, "desc1", "desc2", "extra"]) -> str: # ❌ Too many annotations """This will raise a ToolInputSchemaError.""" return f"Hello {name}" ``` ### Runtime errors [Permalink for this section](https://docs.arcade.dev/home/build-tools/handle-tool-errors\#runtime-errors) These errors occur during tool execution: #### Output type mismatch [Permalink for this section](https://docs.arcade.dev/home/build-tools/handle-tool-errors\#output-type-mismatch) ```nextra-code from typing import Annotated from arcade_tdk import tool @tool def invalid_output(name: Annotated[str, "Name to greet"]) -> str: """Says hello to a friend.""" return ["hello", name] # ❌ Returns list instead of string ``` This will raise a `ToolOutputError` because the return type doesn’t match the annotation. ## Handling tool errors in client libraries [Permalink for this section](https://docs.arcade.dev/home/build-tools/handle-tool-errors\#handling-tool-errors-in-client-libraries) When using Arcade’s client libraries to execute tools, you may encounter various types of errors returned by the tools. The client libraries provide structured error information that helps you handle different error scenarios appropriately. ### Client error handling examples [Permalink for this section](https://docs.arcade.dev/home/build-tools/handle-tool-errors\#client-error-handling-examples) Here’s how to handle different types of output errors when executing tools with Arcade’s client libraries: PythonJavaScript ```nextra-code """ This example demonstrates how to handle different kinds of output errors when executing a tool. """ from arcadepy import Arcade # pip install arcadepy from arcadepy.types.execute_tool_response import OutputError # Requires arcadepy >= 1.8.0 def handle_tool_error(error: OutputError) -> None: """Example of how to identify different kinds of output errors.""" error_kind = error.kind if error_kind == OutputError.Kind.TOOL_RUNTIME_BAD_INPUT_VALUE: # You provided the executed tool with an invalid input value print(error.message) elif error_kind == OutputError.Kind.TOOL_RUNTIME_RETRY: # The tool returned a retryable error. Provide the additional # prompt content to the LLM and retry the tool call instructions_for_llm = error.additional_prompt_content print(instructions_for_llm) elif error_kind == OutputError.Kind.TOOL_RUNTIME_CONTEXT_REQUIRED: # The tool requires extra context from the user or orchestrator. # Provide the additional prompt content to them and then retry the # tool call with the new context request_for_context = error.additional_prompt_content print(request_for_context) elif error_kind == OutputError.Kind.TOOL_RUNTIME_FATAL: # The tool encountered a fatal error during execution print(error.message) elif error_kind == OutputError.Kind.UPSTREAM_RUNTIME_RATE_LIMIT: # The tool encountered a rate limit error from an upstream service # Wait for the specified amount of time and then retry the tool call seconds_to_wait = error.retry_after_ms / 1000 print(f"Wait for {seconds_to_wait} seconds before retrying the tool call") elif error_kind.startswith("UPSTREAM_"): # The tool encountered an error from an upstream service print(error.message) client = Arcade() # Automatically finds the `ARCADE_API_KEY` env variable user_id = "{arcade_user_id}" tool_name = "Reddit.GetPostsInSubreddit" tool_input = {"subreddit": "programming", "limit": 1} # Go through the OAuth flow for the tool auth_response = client.tools.authorize( tool_name=tool_name, user_id=user_id, ) if auth_response.status != "completed": print(f"Click this link to authorize: {auth_response.url}") client.auth.wait_for_completion(auth_response) # Execute the tool response = client.tools.execute( tool_name=tool_name, input=tool_input, user_id=user_id, include_error_stacktrace=True, ) if response.output.error: handle_tool_error(response.output.error) ``` ### Error types in client libraries [Permalink for this section](https://docs.arcade.dev/home/build-tools/handle-tool-errors\#error-types-in-client-libraries) To see the full structure of an OutputError, see [arcade-py OutputError](https://github.com/ArcadeAI/arcade-py/blob/942eb2cf41bc14b6c82f0e4acd8b11ef1978cb8d/src/arcadepy/types/execute_tool_response.py#L12) and [arcade-js OutputError](https://github.com/ArcadeAI/arcade-js/blob/902ef0ce9ff0412ca0d66a862cb4301759d3f87f/src/resources/tools/tools.ts#L166). ## Best practices [Permalink for this section](https://docs.arcade.dev/home/build-tools/handle-tool-errors\#best-practices) 1. **Let Arcade handle most errors**: There’s no need to wrap your tool logic in try/catch blocks unless you need custom error handling. 2. **Use specific error types**: When you do need to raise errors explicitly, use the most specific error type available. 3. **Include additional context**: For `RetryableToolError` and `ContextRequiredToolError`, use the `additional_prompt_content` parameter to guide the LLM or user. [Create a tool with secrets](https://docs.arcade.dev/home/build-tools/create-a-tool-with-secrets "Create a tool with secrets") [Retry tools with improved prompt](https://docs.arcade.dev/home/build-tools/retry-tools-with-improved-prompt "Retry tools with improved prompt") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Tool Calling Overview [Home](https://docs.arcade.dev/home "Home") Tool CallingIntroduction # What are tools? Language models excel at text generation but struggle with tasks like calculations, data retrieval, or interacting with external systems. To make an analogy, these models have impressive _brains_ or reasoning capabilities, but lack the _hands_ to interact with the digital world. To solve this, many AI models support tool calling (sometimes referred to as ‘function calling’). ## The use case for tool-calling [Permalink for this section](https://docs.arcade.dev/home/use-tools/tools-overview\#the-use-case-for-tool-calling) Say a colleague shares a document with you on Google Drive, and you’d like an LLM to help you analyze it. You could go to your Drive/Docs, open the document, copy its contents, and paste it into your chat. But what if the LLM could do this for you? The Arcade Google Docs MCP Server provides a [`SearchAndRetrieveDocuments`](https://docs.arcade.dev/mcp-servers/productivity/google_docs#searchandretrievedocuments) tool. By calling it, the LLM can find and read the document without you having to do anything. After analyzing the document, you decide that a meeting is needed with your colleague. You can ask the LLM to schedule a meeting and it will use the [Google Calendar toolkit](https://docs.arcade.dev/mcp-servers/productivity/google_calendar) to do it without you needing to leave the chat. Or you could ask the LLM to send a summary of the analysis to your colleague by email and it would use the [Gmail toolkit](https://docs.arcade.dev/mcp-servers/productivity/gmail) for that. ## Possibilities for Application and AI Agent developers [Permalink for this section](https://docs.arcade.dev/home/use-tools/tools-overview\#possibilities-for-application-and-ai-agent-developers) Tool-calling combines the reasoning power of LLMs with virtually any action available through APIs or code execution. With the Arcade SDKs, it is easy to build applications and AI Agents that can leverage tool-calling in order to provide an LLM-powered experience to users in a secure and privacy-forward way. ## How tool calling works [Permalink for this section](https://docs.arcade.dev/home/use-tools/tools-overview\#how-tool-calling-works) AI models that support tool calling can determine when and how to use specific tools to fulfill a user’s request. The developer decides which tools to make available to the model, whether existing tools or tools they’ve built themselves. In the example above, when the user asks: “ _help me analyze the ‘Project XYZ’ Google document shared by John_”, the LLM can use its reasoning capabilities to: 1. Recognize that it needs to access external data; 2. Evaluate that the `GoogleDocs.SearchAndRetrieveDocuments` tool is the best way to get that data; 3. Call the tool with the appropriate parameters; 4. Read the document content and use it to answer the user’s questions. ## The authorization problem [Permalink for this section](https://docs.arcade.dev/home/use-tools/tools-overview\#the-authorization-problem) One challenge to make all that happen is authorization. How do you give the LLM permission to access someone’s Google Docs and Gmail in a secure and convenient way? Arcade solves this problem by providing a standardized [interface for authorization](https://docs.arcade.dev/home/auth/how-arcade-helps), as well as pre-built integrations with [popular services](https://docs.arcade.dev/home/auth-providers) such as Google, Dropbox, GitHub, Notion, and many more. Our SDK also [allows you to integrate](https://docs.arcade.dev/home/auth-providers/oauth2) LLMs with any OAuth 2.0-compliant API. ## Tool Augmented Generation (TAG) [Permalink for this section](https://docs.arcade.dev/home/use-tools/tools-overview\#tool-augmented-generation-tag) Similar to Retrieval Augmented Generation (RAG), tool calling allows the AI to use external data to answer questions. Unlike RAG, tool calling is more flexible and allows the AI to use tools that are much more diverse than text or vector search alone. The following is a diagram of how tool calling is used to provide context to a language model similar to RAG. ![Tool calling diagram 1](https://docs.arcade.dev/images/tool-call-diagrams/tool-call-1.png) First, a language model is given a user’s request. The model then determines if it needs to use a tool to fulfill the request. If so, the model selects the appropriate tool from the tools listed in the request. The model then predicts the parameters of that tool and passes these parameters back to the client application. ![Tool calling diagram 2](https://docs.arcade.dev/images/tool-call-diagrams/tool-call-2.png) Now that the tool has been executed, the model can use the output to generate a response. ![Tool calling diagram 3](https://docs.arcade.dev/images/tool-call-diagrams/tool-call-3.png) This process shows the general outline of the Tool Augmented Generation (TAG) process at a high level. ### Next steps [Permalink for this section](https://docs.arcade.dev/home/use-tools/tools-overview\#next-steps) - Explore the [Toolkits](https://docs.arcade.dev/toolkits) available on Arcade - Build your own [custom toolkit](https://docs.arcade.dev/home/build-tools/create-a-mcp-server) [Use Arcade in Visual Studio Code](https://docs.arcade.dev/home/mcp-desktop-clients/vscode-client "Use Arcade in Visual Studio Code") [Tool formats](https://docs.arcade.dev/home/use-tools/get-tool-definitions "Tool formats") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Google Slides Toolkit [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Productivity & Docs](https://docs.arcade.dev/mcp-servers/productivity/asana "Productivity & Docs") Google Slides # GoogleSlides **Description:** Enable agents to interact with GoogleSlides **Author:** Arcade **Auth:** User authorization [![PyPI Version](https://img.shields.io/pypi/v/arcade_google_slides)](https://pypi.org/project/arcade_google_slides/)[![License](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/arcadeai/arcade-ai/blob/main/LICENSE)[![Python Versions](https://img.shields.io/pypi/pyversions/arcade_google_slides)](https://pypi.org/project/arcade_google_slides/)[![Wheel Status](https://img.shields.io/pypi/wheel/arcade_google_slides)](https://pypi.org/project/arcade_google_slides/)[![Downloads](https://img.shields.io/pypi/dm/arcade_google_slides)](https://pypi.org/project/arcade_google_slides/) The GoogleSlides MCP Server provides a set of tools for interacting with Google Slides presentations. These tools enable users and AI applications to: - Create new presentations and add slides. - Comment on specific slides and list all comments in a presentation. - Search for presentations in Google Drive. - Retrieve and convert presentation content to markdown format. ## Available Tools [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_slides\#available-tools) | Tool Name | Description | | --- | --- | | GoogleSlides.CommentOnPresentation | Comment on a specific slide by its index in a Google Slides presentation. | | GoogleSlides.ListPresentationComments | List all comments on the specified Google Slides presentation. | | GoogleSlides.CreatePresentation | Create a new Google Slides presentation | | GoogleSlides.CreateSlide | Create a new slide at the end of the specified presentation | | GoogleSlides.SearchPresentations | Searches for presentations in the user's Google Drive. | | GoogleSlides.WhoAmI | Get comprehensive user profile and Google Slides environment information. | | GoogleSlides.GenerateGoogleFilePickerUrl | Generate a Google File Picker URL for user-driven file selection and authorization. | | GoogleSlides.GetPresentationAsMarkdown | Get the specified Google Slides presentation and convert it to markdown. | If you need to perform an action that’s not listed here, you can [get in touch\\ with us](mailto:contact@arcade.dev) to request a new tool, or [create your\\ own tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server). ## GoogleSlides.CommentOnPresentation [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_slides\#googleslidescommentonpresentation) See Example > Comment on a specific slide by its index in a Google Slides presentation. **Parameters** - **presentation\_id** ( `string`, required) The ID of the presentation to comment on - **comment\_text** ( `string`, required) The comment to add to the slide ## GoogleSlides.ListPresentationComments [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_slides\#googleslideslistpresentationcomments) See Example > List all comments on the specified Google Slides presentation. **Parameters** - **presentation\_id** ( `string`, required) The ID of the presentation to list comments for - **include\_deleted** ( `boolean`, optional) Whether to include deleted comments in the results. Defaults to False. ## GoogleSlides.CreatePresentation [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_slides\#googleslidescreatepresentation) See Example > Create a new Google Slides presentation **Parameters** - **title** ( `string`, required) The title of the presentation to create - **subtitle** ( `string`, optional) The subtitle of the presentation to create ## GoogleSlides.CreateSlide [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_slides\#googleslidescreateslide) See Example > Create a new slide at the end of the specified presentation **Parameters** - **presentation\_id** ( `string`, required) The ID of the presentation to create the slide in - **slide\_title** ( `string`, required) The title of the slide to create - **slide\_body** ( `string`, required) The body (text) of the slide to create ## GoogleSlides.SearchPresentations [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_slides\#googleslidessearchpresentations) See Example > Searches for presentations in the user’s Google Drive. **Parameters** - **presentation\_contains** ( `array[string]`, optional) Keywords or phrases that must be in the presentation title or content. Provide a list of keywords or phrases if needed. - **presentation\_not\_contains** ( `array[string]`, optional) Keywords or phrases that must NOT be in the presentation title or content. Provide a list of keywords or phrases if needed. - **search\_only\_in\_shared\_drive\_id** ( `string`, optional) The ID of the shared drive to restrict the search to. If provided, the search will only return presentations from this drive. Defaults to None, which searches across all drives. - **include\_shared\_drives** ( `boolean`, optional) Whether to include presentations from shared drives. Defaults to False (searches only in the user’s ‘My Drive’). - **include\_organization\_domain\_presentations** ( `boolean`, optional) Whether to include presentations from the organization’s domain. This is applicable to admin users who have permissions to view organization-wide presentations in a Google Workspace account. Defaults to False. - **order\_by** ( `Enum` [OrderBy](https://docs.arcade.dev/mcp-servers/productivity/google_slides#orderby), optional) Sort order. Defaults to listing the most recently modified presentations first - **limit** ( `integer`, optional) The number of presentations to list - **pagination\_token** ( `string`, optional) The pagination token to continue a previous request ## GoogleSlides.WhoAmI [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_slides\#googleslideswhoami) See Example > Get comprehensive user profile and Google Slides environment information. **Parameters** This tool does not take any parameters. ## GoogleSlides.GenerateGoogleFilePickerUrl [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_slides\#googleslidesgenerategooglefilepickerurl) See Example > Generate a Google File Picker URL for user-driven file selection and authorization. **Parameters** This tool does not take any parameters. ## GoogleSlides.GetPresentationAsMarkdown [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_slides\#googleslidesgetpresentationasmarkdown) See Example > Get the specified Google Slides presentation and convert it to markdown. **Parameters** - **presentation\_id** ( `string`, required) The ID of the presentation to retrieve. ## Auth [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_slides\#auth) The Arcade GoogleSlides toolkit uses the [Google auth provider](https://docs.arcade.dev/home/auth-providers/google) to connect to users’ GoogleSlides accounts. Please refer to the [Google auth provider](https://docs.arcade.dev/home/auth-providers/google) documentation to learn how to configure auth. ## GoogleSlides Reference [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_slides\#googleslides-reference) Below is a reference of enumerations used by some tools in the GoogleSlides toolkit: ### OrderBy [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_slides\#orderby) - **CREATED\_TIME**: `createdTime` - **CREATED\_TIME\_DESC**: `createdTime desc` - **FOLDER**: `folder` - **FOLDER\_DESC**: `folder desc` - **MODIFIED\_BY\_ME\_TIME**: `modifiedByMeTime` - **MODIFIED\_BY\_ME\_TIME\_DESC**: `modifiedByMeTime desc` - **MODIFIED\_TIME**: `modifiedTime` - **MODIFIED\_TIME\_DESC**: `modifiedTime desc` - **NAME**: `name` - **NAME\_DESC**: `name desc` - **NAME\_NATURAL**: `name_natural` - **NAME\_NATURAL\_DESC**: `name_natural desc` - **QUOTA\_BYTES\_USED**: `quotaBytesUsed` - **QUOTA\_BYTES\_USED\_DESC**: `quotaBytesUsed desc` - **RECENCY**: `recency` - **RECENCY\_DESC**: `recency desc` - **SHARED\_WITH\_ME\_TIME**: `sharedWithMeTime` - **SHARED\_WITH\_ME\_TIME\_DESC**: `sharedWithMeTime desc` - **STARRED**: `starred` - **STARRED\_DESC**: `starred desc` - **VIEWED\_BY\_ME\_TIME**: `viewedByMeTime` - **VIEWED\_BY\_ME\_TIME\_DESC**: `viewedByMeTime desc` ## Get Building [Use tools hosted on Arcade Cloud\\ \\ Arcade tools are hosted by our cloud platform and ready to be used in your agents. Learn how.](https://docs.arcade.dev/home/quickstart) [Self Host Arcade tools\\ \\ Arcade tools can be self-hosted on your own infrastructure. Learn more about self-hosting.\\ \\ ```\\ pip install arcade_google_slides\\ ```](https://docs.arcade.dev/home/hosting-overview) [Reference](https://docs.arcade.dev/mcp-servers/productivity/google_drive/reference "Reference") [Google Sheets](https://docs.arcade.dev/mcp-servers/productivity/google_sheets "Google Sheets") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Zoom Toolkit Integration [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Social & Communication](https://docs.arcade.dev/mcp-servers/social-communication/discord "Social & Communication") Zoom # Zoom **Description:** Enable agents to interact with Zoom by retrieving meeting information and invitations. **Author:** Arcade **Auth:** User authorizationvia the [Zoom auth provider](https://docs.arcade.dev/home/auth-providers/zoom) [![PyPI Version](https://img.shields.io/pypi/v/arcade_zoom)](https://pypi.org/project/arcade_zoom/)[![License](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/arcadeai/arcade-ai/blob/main/LICENSE)[![Python Versions](https://img.shields.io/pypi/pyversions/arcade_zoom)](https://pypi.org/project/arcade_zoom/)[![Wheel Status](https://img.shields.io/pypi/wheel/arcade_zoom)](https://pypi.org/project/arcade_zoom/)[![Downloads](https://img.shields.io/pypi/dm/arcade_zoom)](https://pypi.org/project/arcade_zoom/) The Arcade Zoom MCP Server provides tools for interacting with Zoom. With these tools, you can build agents and AI applications that can: - List upcoming meetings - Retrieve meeting invitation details ## Available Tools [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/zoom\#available-tools) These tools are currently available in the Arcade Zoom toolkit. | Tool Name | Description | | --- | --- | | Zoom.ListUpcomingMeetings | List a Zoom user's upcoming meetings within the next 24 hours. | | Zoom.GetMeetingInvitation | Retrieve the invitation note for a specific Zoom meeting. | If you need to perform an action that’s not listed here, you can [get in touch\\ with us](mailto:contact@arcade.dev) to request a new tool, or [create your own\\ tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server) with the [Zoom auth\\ provider](https://docs.arcade.dev/home/auth-providers/zoom#using-zoom-auth-in-custom-tools). ## Zoom.ListUpcomingMeetings [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/zoom\#zoomlistupcomingmeetings) List a Zoom user’s upcoming meetings within the next 24 hours. **Parameters** - **`user_id`** _(string, optional)_ The user’s user ID or email address. Defaults to ‘me’ for the current user. * * * ## Zoom.GetMeetingInvitation [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/zoom\#zoomgetmeetinginvitation) Retrieve the invitation note for a specific Zoom meeting. **Parameters** - **`meeting_id`** _(string, required)_ The meeting’s numeric ID (as a string). * * * ## Auth [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/zoom\#auth) The Arcade Zoom toolkit uses the [Zoom auth provider](https://docs.arcade.dev/home/auth-providers/zoom) to connect to users’ Zoom accounts. With the Arcade Cloud Platform, there’s nothing to configure. Your users will see `Arcade ` as the name of the application that’s requesting permission. With a self-hosted installation of Arcade, you need to [configure the Zoom auth provider](https://docs.arcade.dev/home/auth-providers/zoom#configuring-zoom-auth) with your own Zoom app credentials. ## Get Building [Use tools hosted on Arcade Cloud\\ \\ Arcade tools are hosted by our cloud platform and ready to be used in your agents. Learn how.](https://docs.arcade.dev/home/quickstart) [Self Host Arcade tools\\ \\ Arcade tools can be self-hosted on your own infrastructure. Learn more about self-hosting.\\ \\ ```\\ pip install arcade_zoom\\ ```](https://docs.arcade.dev/home/hosting-overview) [X](https://docs.arcade.dev/mcp-servers/social-communication/x "X") [Microsoft Teams](https://docs.arcade.dev/mcp-servers/social-communication/microsoft_teams "Microsoft Teams") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Arcade Deploy Configuration [Home](https://docs.arcade.dev/home "Home") [Local Deployment](https://docs.arcade.dev/home/local-deployment/install "Local Deployment") [Configure](https://docs.arcade.dev/home/deployment/on-prem-mcp "Configure") Configuring Arcade Deploy # Configuring Arcade Deploy The `arcade deploy` command deploys your worker to the cloud. ## Requirements [Permalink for this section](https://docs.arcade.dev/home/local-deployment/configure/arcade-deploy\#requirements) - **Python 3.10** or higher Verify your Python version by running `python --version` or `python3 --version` in your terminal. - **Arcade Account**: Sign up for an [Arcade account](https://api.arcade.dev/signup) if you haven’t already. - **Arcade CLI**: Install the Arcade CLI with `pip install arcade-ai`. ## Deployment Config [Permalink for this section](https://docs.arcade.dev/home/local-deployment/configure/arcade-deploy\#deployment-config) The `worker.toml` file is used to configure your worker. Running `arcade deploy` will use the `worker.toml` file in the current directory or you can specify a different file with the `-d` flag. Running the CLI command `arcade new` will automatically create an example `worker.toml` file for the created toolkit. ```nextra-code # worker.toml # Arcade Deploy supports configuring multiple workers in a single file. # Configurations below each [[worker]] block will be deployed as a separate worker. [[worker]] # (Required) The worker configuration [worker.config] # (Required) The unique identifier for the worker. id = "my-example-worker" # (Optional) Whether the worker is enabled. enabled = true # (Optional) The timeout for the worker for requests to the worker. timeout = 30 # (Optional) The number of times to retry a connection to the worker before giving up. retries = 3 # (Required) The secret for the worker. # The default "dev" secret or empty string is not allowed. # Environment variables can also be used by setting the secret with the format "${env:YOUR_VARIABLE_NAME}" secret = # (Optional) Localy packages to deploy with the worker. # You can specify a list of directories that contain a toolkit. # The directory must contain a pyproject.toml file or a setup.py file. [worker.local_source] packages = [ "./my_toolkit1", "./my_toolkit2"] # (Optional) Pypi packages to install for the worker. [worker.pypi_source] packages = [ "arcade-math", "my-pypi-package"] ``` ## Secrets [Permalink for this section](https://docs.arcade.dev/home/local-deployment/configure/arcade-deploy\#secrets) You can use a secret from the environment to configure the worker with the `${env: MY_SECRET}` syntax. ```nextra-code [[worker]] [worker.config] secret = "${env: MY_ENVIRONMENT_SECRET}" ``` ## Using with a local engine [Permalink for this section](https://docs.arcade.dev/home/local-deployment/configure/arcade-deploy\#using-with-a-local-engine) To register the worker with your local engine, you can use the host and port flags. ```nextra-code arcade deploy -h localhost -p 9099 --no-tls ``` ## Logs [Permalink for this section](https://docs.arcade.dev/home/local-deployment/configure/arcade-deploy\#logs) To see the logs for the worker, you can use the `arcade logs` command. ```nextra-code arcade logs my-example-worker ``` [Engine](https://docs.arcade.dev/home/deployment/engine-configuration "Engine") [Configuration Templates](https://docs.arcade.dev/home/local-deployment/configure/templates "Configuration Templates") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Discord Auth Configuration [Integrations](https://docs.arcade.dev/toolkits "Integrations") Social & CommunicationDiscord # Discord auth provider The Discord auth provider enables tools and agents to call the Discord API on behalf of a user. Behind the scenes, the Arcade Engine and the Discord auth provider seamlessly manage Discord OAuth 2.0 authorization for your users. ### What’s documented here [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/discord\#whats-documented-here) This page describes how to use and configure Discord auth with Arcade. This auth provider is used by: - Your [app code](https://docs.arcade.dev/mcp-servers/social-communication/discord#using-discord-auth-in-app-code) that needs to call Discord APIs - Or, your [custom tools](https://docs.arcade.dev/mcp-servers/social-communication/discord#using-discord-auth-in-custom-tools) that need to call Discord APIs ## Configuring Discord auth [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/discord\#configuring-discord-auth) ### Create a Discord app [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/discord\#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 your Arcade Engine configuration. You can do this in the Arcade Dashboard, or by editing the `engine.yaml` file directly (for a self-hosted instance). ### Configuring Discord auth with the Arcade Dashboard [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/discord\#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, the Arcade Engine will automatically use this Discord OAuth provider. ### Configuring Discord auth in self-hosted Arcade Engine configuration [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/discord\#configuring-discord-auth-in-self-hosted-arcade-engine-configuration) ### Set environment variables [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/discord\#set-environment-variables) Set the following environment variables: ```nextra-code export DISCORD_CLIENT_ID="" export DISCORD_CLIENT_SECRET="" ``` Or, you can set these values in a `.env` file: ```nextra-code DISCORD_CLIENT_SECRET="" DISCORD_CLIENT_ID="" ``` See [Engine configuration](https://docs.arcade.dev/home/deployment/engine-configuration) for more information on how to set environment variables and configure the Arcade Engine. ### Edit the Engine configuration [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/discord\#edit-the-engine-configuration) Edit the `engine.yaml` file and add a `discord` item to the `auth.providers` section: ```nextra-code auth: providers: - id: default-discord description: "The default Discord provider" enabled: true type: oauth2 provider_id: discord client_id: ${env:DISCORD_CLIENT_ID} client_secret: ${env:DISCORD_CLIENT_SECRET} ``` ## Using Discord auth in app code [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/discord\#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](https://docs.arcade.dev/home/auth/how-arcade-helps) to understand how this works. Use `client.auth.start()` to get a user token for the Discord API: PythonJavaScript ```nextra-code 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... ``` ## Using Discord auth in custom tools [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/discord\#using-discord-auth-in-custom-tools) You can author your own [custom tools](https://docs.arcade.dev/home/build-tools/create-a-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: ```nextra-code 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() ``` [Sharepoint](https://docs.arcade.dev/mcp-servers/productivity/sharepoint "Sharepoint") [LinkedIn](https://docs.arcade.dev/mcp-servers/social-communication/linkedin "LinkedIn") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Arcade Hosting Overview [Home](https://docs.arcade.dev/home "Home") Overview # Hosting Options The best way to use Arcade is to use our cloud service. However, if you need to run Arcade locally to either connect your tools to local-only resources (e.g. a local database or filesystem), or your policies require it, Arcade has you covered! ## Customizing Auth [Permalink for this section](https://docs.arcade.dev/home/hosting-overview\#customizing-auth) You don’t have to host Arcade to customize your auth experiences. Arcade’s cloud service supports a number of auth providers out of the box, but you can always provide your own OAuth app credentials. We recommend doing this for any production use so that you can have isolated rate limits with the OAuth service provider and give your users a consistent experience when they go through an auth flow. You can still use the same tools when you customize your auth, no code changes are required. See [Customizing Auth](https://docs.arcade.dev/home/auth-providers) for more information. ## Hybrid Deployments [Permalink for this section](https://docs.arcade.dev/home/hosting-overview\#hybrid-deployments) Hybrid deployments combine the benefits of running Arcade locally with the benefits of using our cloud service. You can use our cloud service to manage your users and authentication, but run your tools locally. See [Hybrid Deployment](https://docs.arcade.dev/home/deployment/on-prem-mcp) for more information. ## Local Deployments [Permalink for this section](https://docs.arcade.dev/home/hosting-overview\#local-deployments) Local deployments involve running all of the Arcade services locally. This is more complex than a hybrid deployment, but it does give you the flexibility to run Arcade anywhere. See [Local Deployment](https://docs.arcade.dev/home/deployment/engine-configuration) for more information. [Arcade Clients](https://docs.arcade.dev/home/arcade-clients "Arcade Clients") [Hybrid Worker](https://docs.arcade.dev/home/deployment/on-prem-mcp "Hybrid Worker") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Asana Toolkit Reference [Integrations](https://docs.arcade.dev/toolkits "Integrations") Productivity & Docs [Asana](https://docs.arcade.dev/mcp-servers/productivity/asana "Asana") Reference # Asana Reference Below is a reference of enumerations used by some tools in the Asana toolkit: ## TagColor [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/asana/reference\#tagcolor) - **DARK\_GREEN**: `'dark-green'` - **DARK\_RED**: `'dark-red'` - **DARK\_BLUE**: `'dark-blue'` - **DARK\_PURPLE**: `'dark-purple'` - **DARK\_PINK**: `'dark-pink'` - **DARK\_ORANGE**: `'dark-orange'` - **DARK\_TEAL**: `'dark-teal'` - **DARK\_BROWN**: `'dark-brown'` - **DARK\_WARM\_GRAY**: `'dark-warm-gray'` - **LIGHT\_GREEN**: `'light-green'` - **LIGHT\_RED**: `'light-red'` - **LIGHT\_BLUE**: `'light-blue'` - **LIGHT\_PURPLE**: `'light-purple'` - **LIGHT\_PINK**: `'light-pink'` - **LIGHT\_ORANGE**: `'light-orange'` - **LIGHT\_TEAL**: `'light-teal'` - **LIGHT\_BROWN**: `'light-brown'` - **LIGHT\_WARM\_GRAY**: `'light-warm-gray'` ## TaskSortBy [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/asana/reference\#tasksortby) - **DUE\_DATE**: `'due_date'` - **CREATED\_AT**: `'created_at'` - **COMPLETED\_AT**: `'completed_at'` - **MODIFIED\_AT**: `'modified_at'` - **LIKES**: `'likes'` ## SortOrder [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/asana/reference\#sortorder) - **ASCENDING**: `'ascending'` - **DESCENDING**: `'descending'` [Asana](https://docs.arcade.dev/mcp-servers/productivity/asana "Asana") [Confluence](https://docs.arcade.dev/mcp-servers/productivity/confluence "Confluence") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Arcade Tools with Vercel AI [Home](https://docs.arcade.dev/home "Home") Vercel AIUsing Arcade tools ## Use Arcade with Vercel AI SDK [Permalink for this section](https://docs.arcade.dev/home/vercelai/use-arcade-tools\#use-arcade-with-vercel-ai-sdk) The [Vercel AI SDK](https://sdk.vercel.ai/) is an open-source library that simplifies the process of building AI-powered applications. It provides a consistent interface for working with various AI providers and includes several useful features: - Streaming AI responses for real-time interactions - Framework-agnostic support for React, Next.js, Vue, Nuxt, and SvelteKit. - Easy switching between AI providers with a single line of code Let’s supercharge your Vercel AI SDK applications with Arcade’s tools. You’ll get instant access to production-ready tools for working with Google, Slack, GitHub, LinkedIn, and many other popular services, all with built-in authentication. Browse our [complete toolkit catalog](https://docs.arcade.dev/toolkits) to discover what you can build. In this guide, we’ll show you how to use Arcade’s Gmail toolkit to create an AI agent that can read and summarize emails. You can find the complete code in our [GitHub repository](https://github.com/ArcadeAI/arcade-ai/tree/main/examples/ai-sdk) or follow along below. ## Getting started [Permalink for this section](https://docs.arcade.dev/home/vercelai/use-arcade-tools\#getting-started) ### Install the required dependencies [Permalink for this section](https://docs.arcade.dev/home/vercelai/use-arcade-tools\#install-the-required-dependencies) We’ll use the `@ai-sdk/openai` package in this example, but you can use any AI provider supported by the Vercel AI SDK. See the [full list of providers](https://ai-sdk.dev/docs/foundations/providers-and-models#ai-sdk-providers). pnpmnpmyarn ```nextra-code pnpm add ai @ai-sdk/openai @arcadeai/arcadejs ``` ### Get your API keys and set up environment variables [Permalink for this section](https://docs.arcade.dev/home/vercelai/use-arcade-tools\#get-your-api-keys-and-set-up-environment-variables) You’ll need two API keys: - **OpenAI API key** from [OpenAI dashboard](https://platform.openai.com/api-keys) - **Arcade API key** from our [Getting your API key guide](https://docs.arcade.dev/home/api-keys) Add them to your environment: ```nextra-code OPENAI_API_KEY= ARCADE_API_KEY= ``` ### Import Libraries and Initialize Arcade [Permalink for this section](https://docs.arcade.dev/home/vercelai/use-arcade-tools\#import-libraries-and-initialize-arcade) ```nextra-code import { openai } from "@ai-sdk/openai" import { generateText } from "ai" import { Arcade } from "@arcadeai/arcadejs" import { toZodToolSet, executeOrAuthorizeZodTool } from "@arcadeai/arcadejs/lib" const arcade = new Arcade() ``` ### Get tools from Arcade’s Gmail toolkit and convert them to Zod [Permalink for this section](https://docs.arcade.dev/home/vercelai/use-arcade-tools\#get-tools-from-arcades-gmail-toolkit-and-convert-them-to-zod) Arcade offers methods to convert tools into Zod schemas, which is essential since the Vercel AI SDK defines tools using Zod. The `toZodToolSet` method is particularly useful, as it simplifies this integration and makes it easier to use Arcade’s tools with the Vercel AI SDK. Learn more about Arcade’s Zod integration options [here](https://docs.arcade.dev/home/use-tools/get-tool-definitions#get-zod-tool-definitions). ```nextra-code // Get Arcade's gmail toolkit const googleToolkit = await arcade.tools.list({ toolkit: "gmail", limit: 30 }) const googleTools = toZodToolSet({ tools: googleToolkit.items, client: arcade, userId: "", // Your app's internal ID for the user (an email, UUID, etc). It's used internally to identify your user in Arcade executeFactory: executeOrAuthorizeZodTool, // Checks if tool is authorized and executes it, or returns authorization URL if needed }) ``` ### Generate text with the tools [Permalink for this section](https://docs.arcade.dev/home/vercelai/use-arcade-tools\#generate-text-with-the-tools) ```nextra-code const result = await generateText({ model: openai("gpt-4o-mini"), prompt: "Read my last email and summarize it in a few sentences", tools: googleTools, maxSteps: 5, }) console.log(result.text) ``` On your first run, you’ll get an authorization message with a link to connect your Google account. Open it in your browser to complete the setup. That’s all you need to do! Arcade will remember your approval for future requests. You can see the full code in our [GitHub repository](https://github.com/ArcadeAI/arcade-ai/blob/main/examples/ai-sdk/generateText.js). ## Stream the response [Permalink for this section](https://docs.arcade.dev/home/vercelai/use-arcade-tools\#stream-the-response) Vercel AI SDK supports streaming responses. This creates a more engaging, chat-like experience as the responses appear progressively instead of waiting for the complete answer. To enable streaming, make these key changes: 1. Import `streamText` instead of `generateText` 2. Use `streamText` to create a streamable response 3. Process the response chunk by chunk ```nextra-code import { streamText } from "ai" const { textStream } = streamText({ model: openai("gpt-4o-mini"), prompt: "Read my last email and summarize it in a few sentences", tools: googleTools, maxSteps: 5, }) for await (const chunk of textStream) { process.stdout.write(chunk) } ``` You can see the full code in our [GitHub repository](https://github.com/ArcadeAI/arcade-ai/blob/main/examples/ai-sdk/index.js). ## How to use other toolkits [Permalink for this section](https://docs.arcade.dev/home/vercelai/use-arcade-tools\#how-to-use-other-toolkits) You just need to change the toolkit parameter in the `list` method. For example, to use Slack tools: ```nextra-code const slackToolkit = await arcade.tools.list({ toolkit: "slack", limit: 30 }) ``` Browse our [complete toolkit catalog](https://docs.arcade.dev/toolkits) to see all available toolkits and their capabilities. Each toolkit comes with pre-built tools that are ready to use with your AI applications. Arcade also is the best way to create your own custom tools and toolkits - learn more [here](https://docs.arcade.dev/home/build-tools/create-a-mcp-server). [Managing user authorization](https://docs.arcade.dev/home/oai-agents/user-auth-interrupts "Managing user authorization") [MCP Overview](https://docs.arcade.dev/home/mcp-overview "MCP Overview") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## PostgreSQL Toolkit [Integrations](https://docs.arcade.dev/toolkits "Integrations") DatabasesPostgres # Postgres **Description:** Enable agents to interact with PostgreSQL databases (read only). **Author:** Arcade **Code:** [GitHub](https://github.com/ArcadeAI/arcade-ai/tree/main/mcp-servers/postgres) **Auth:** database connection string [![PyPI Version](https://img.shields.io/pypi/v/arcade_postgres)](https://pypi.org/project/arcade_postgres/)[![License](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/arcadeai/arcade-ai/blob/main/LICENSE)[![Python Versions](https://img.shields.io/pypi/pyversions/arcade_postgres)](https://pypi.org/project/arcade_postgres/)[![Wheel Status](https://img.shields.io/pypi/wheel/arcade_postgres)](https://pypi.org/project/arcade_postgres/)[![Downloads](https://img.shields.io/pypi/dm/arcade_postgres)](https://pypi.org/project/arcade_postgres/) The Arcade Postgres MCP Server provides a pre-built set of tools for interacting with PostgreSQL databases in a read-only manner. This toolkit enables agents to discover database schemas, explore table structures, and execute SELECT queries safely. This toolkit is a companion to the blog post [Designing SQL Tools for AI Agents](https://blog.arcade.dev/sql-tools-ai-agents-security). This toolkit is meant to be an example of how to build a toolkit for a database, and is not intended to be used in production - you won’t find it listed in the Arcade dashboard or APIs. For production use, we recommend forking this repository and building your own toolkit with use-case specific tools. ## Key Features [Permalink for this section](https://docs.arcade.dev/mcp-servers/databases/postgres\#key-features) This toolkit demonstrates several important concepts for LLM-powered database interactions: - **Schema Discovery**: Automatically discover available database schemas - **Table Exploration**: Find all tables within a specific schema - **Schema Inspection**: Get detailed column information including data types, primary keys, and indexes - **Safe Query Execution**: Execute SELECT queries with built-in safety measures - **Connection Pooling**: Reuse database connections efficiently - **Read-Only Access**: Enforce read-only access to prevent data modification - **Row Limits**: Automatically limit query results to prevent overwhelming responses ## Available Tools [Permalink for this section](https://docs.arcade.dev/mcp-servers/databases/postgres\#available-tools) | Tool Name | Description | | --- | --- | | Postgres.DiscoverSchemas | Discover all schemas in a PostgreSQL database. | | Postgres.DiscoverTables | Discover all tables in a specific schema. | | Postgres.GetTableSchema | Get the detailed schema of a specific table. | | Postgres.ExecuteSelectQuery | Execute a SELECT query with comprehensive clause support. | Note that all tools require the `POSTGRES_DATABASE_CONNECTION_STRING` secret to be set. ## Postgres.DiscoverSchemas [Permalink for this section](https://docs.arcade.dev/mcp-servers/databases/postgres\#postgresdiscoverschemas) Discover all schemas in a PostgreSQL database. This tool returns a list of all available schemas, excluding the `information_schema` for security. See Example > ## Postgres.DiscoverTables [Permalink for this section](https://docs.arcade.dev/mcp-servers/databases/postgres\#postgresdiscovertables) Discover all tables in a specific schema. This tool should be used before any other tool that requires a table name. **Parameters:** - `schema_name` (str): The database schema to discover tables in (default: “public”) See Example > ## Postgres.GetTableSchema [Permalink for this section](https://docs.arcade.dev/mcp-servers/databases/postgres\#postgresgettableschema) Get the detailed schema of a specific table. This tool provides column information including data types, primary key indicators, and index information. Always use this tool before executing any query. **Parameters:** - `schema_name` (str): The database schema containing the table - `table_name` (str): The name of the table to inspect See Example > ## Postgres.ExecuteSelectQuery [Permalink for this section](https://docs.arcade.dev/mcp-servers/databases/postgres\#postgresexecuteselectquery) Execute a SELECT query with comprehensive clause support. This tool allows you to build complex queries using individual clauses while maintaining safety and performance. **Parameters:** - `select_clause` (str): Columns to select (without SELECT keyword) - `from_clause` (str): Table(s) to query from (without FROM keyword) - `limit` (int): Maximum rows to return (default: 100) - `offset` (int): Number of rows to skip (default: 0) - `join_clause` (str, optional): JOIN conditions (without JOIN keyword) - `where_clause` (str, optional): WHERE conditions (without WHERE keyword) - `having_clause` (str, optional): HAVING conditions (without HAVING keyword) - `group_by_clause` (str, optional): GROUP BY columns (without GROUP BY keyword) - `order_by_clause` (str, optional): ORDER BY columns (without ORDER BY keyword) - `with_clause` (str, optional): WITH clause for CTEs (without WITH keyword) **Query Construction:** The final query is constructed as: ```nextra-code SELECT {select_clause} FROM {from_clause} JOIN {join_clause} WHERE {where_clause} HAVING {having_clause} GROUP BY {group_by_clause} ORDER BY {order_by_clause} LIMIT {limit} OFFSET {offset} ``` **Best Practices:** - Always use `discover_tables` and `get_table_schema` before executing queries - Never use “SELECT \*” - always specify the columns you need - Order results by primary keys or important columns - Use case-insensitive string matching - Trim strings in queries - Prefer LIKE queries over exact matches or regex - Only join on indexed columns or primary keys See Example > ## Usage Workflow [Permalink for this section](https://docs.arcade.dev/mcp-servers/databases/postgres\#usage-workflow) For optimal results, follow this workflow when using the Postgres toolkit: 1. **Discover Schemas**: Use `discover_schemas` to see available schemas 2. **Discover Tables**: Use `discover_tables` with your target schema 3. **Get Table Schema**: Use `get_table_schema` for each table you plan to query 4. **Execute Query**: Use `execute_select_query` with the schema information This workflow ensures your agent has complete information about the database structure before attempting queries, reducing errors and improving query performance. ## Get Building [Use tools hosted on Arcade Cloud\\ \\ Arcade tools are hosted by our cloud platform and ready to be used in your agents. Learn how.](https://docs.arcade.dev/home/quickstart) [Self Host Arcade tools\\ \\ Arcade tools can be self-hosted on your own infrastructure. Learn more about self-hosting.\\ \\ ```\\ pip install arcade_postgres\\ ```](https://docs.arcade.dev/home/hosting-overview) [Salesforce](https://docs.arcade.dev/mcp-servers/sales/salesforce "Salesforce") [MongoDB](https://docs.arcade.dev/mcp-servers/databases/mongodb "MongoDB") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Google Docs Toolkit [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Productivity & Docs](https://docs.arcade.dev/mcp-servers/productivity/asana "Productivity & Docs") Google Docs # Google Docs **Description:** Enable agents to interact with Google Docs documents. **Author:** Arcade **Auth:** User authorizationvia the [Google auth provider](https://docs.arcade.dev/home/auth-providers/google) This Toolkit is not available in Arcade Cloud. You can use these tools with a [self-hosted](https://docs.arcade.dev/home/deployment/engine-configuration) instance of Arcade. [![PyPI Version](https://img.shields.io/pypi/v/arcade_google_docs)](https://pypi.org/project/arcade_google_docs/)[![License](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/arcadeai/arcade-ai/blob/main/LICENSE)[![Python Versions](https://img.shields.io/pypi/pyversions/arcade_google_docs)](https://pypi.org/project/arcade_google_docs/)[![Wheel Status](https://img.shields.io/pypi/wheel/arcade_google_docs)](https://pypi.org/project/arcade_google_docs/)[![Downloads](https://img.shields.io/pypi/dm/arcade_google_docs)](https://pypi.org/project/arcade_google_docs/) The Arcade Google Docs MCP Server provides a pre-built set of tools for interacting with Google Docs. These tools make it easy to build agents and AI apps that can: - Create, update, list, and delete documents ## Available Tools [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_docs\#available-tools) These tools are currently available in the Arcade Google Docs toolkit. | Tool Name | Description | | --- | --- | | GoogleDocs.WhoAmI | Get comprehensive user profile and Google Docs environment information. | | GoogleDocs.GetDocumentById | Retrieve a Google Docs document by ID. | | GoogleDocs.GetDocumentAsDocMD | Retrieve a Google Docs document by ID in DocMD format with metadata tags. | | GoogleDocs.EditDocument | Edit a Google Docs document using natural language edit requests. | | GoogleDocs.InsertTextAtEndOfDocument | Insert text at the end of a Google Docs document. | | GoogleDocs.CreateBlankDocument | Create a new blank Google Docs document with a title. | | GoogleDocs.CreateDocumentFromText | Create a new Google Docs document with specified text content. | | GoogleDocs.SearchDocuments | Search for documents in the user's Google Drive. | | GoogleDocs.SearchAndRetrieveDocuments | Search and retrieve the contents of Google documents in the user's Google Drive. | | GoogleDocs.ListDocumentComments | List all comments on the specified Google Docs document. | | GoogleDocs.CommentOnDocument | Comment on a specific document by its ID. | If you need to perform an action that’s not listed here, you can [get in touch\\ with us](mailto:contact@arcade.dev) to request a new tool, or [create your\\ own tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server) with the [Google auth\\ provider](https://docs.arcade.dev/home/auth-providers/google#using-google-auth-in-custom-tools). ## GoogleDocs.WhoAmI [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_docs\#googledocswhoami) See Example > Get comprehensive user profile and Google Docs environment information. **Parameters** This tool does not take any parameters. * * * ## GoogleDocs.GetDocumentById [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_docs\#googledocsgetdocumentbyid) See Example > Get the latest version of the specified Google Docs document. **Parameters** - **`document_id`** _(string, required)_ The ID of the document to retrieve. * * * ## GoogleDocs.GetDocumentAsDocMD [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_docs\#googledocsgetdocumentasdocmd) See Example > Get the latest version of the specified Google Docs document in DocMD format. The DocMD output includes tags that can be used to annotate the document with location information, block types, block IDs, and other metadata. **Parameters** - **`document_id`** _(string, required)_ The ID of the document to retrieve. * * * ## GoogleDocs.EditDocument [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_docs\#googledocseditdocument) See Example > Edit a Google Docs document using natural language edit requests. This tool is stateless and does not have context about previous edits. If your edit request depends on knowledge about previous edits, provide that context in the edit requests. Note that this tool is agentic, and requires the secret OPENAI\_API\_KEY to be set. **Parameters** - **`document_id`** _(string, required)_ The ID of the document to edit. - **`edit_requests`** _(list\[str\], required)_ A list of natural language descriptions of the desired changes to the document. Each entry should be a single, self-contained edit request that can be fully understood independently. Note: Each request may result in zero, one, or multiple actual edits depending on what changes are needed (e.g., a request might be ignored if the change already exists in the document). - **`reasoning_effort`** _(enum ( [ReasoningEffort](https://docs.arcade.dev/mcp-servers/productivity/google_docs#reasoningeffort)), optional)_ The effort to put into reasoning about the edits. Defaults to medium. * * * ## GoogleDocs.InsertTextAtEndOfDocument [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_docs\#googledocsinserttextatendofdocument) See Example > Insert text at the end of an existing Google Docs document. **Parameters** - **`document_id`** _(string, required)_ The ID of the document to update. - **`text_content`** _(string, required)_ The text content to insert into the document. * * * ## GoogleDocs.CreateBlankDocument [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_docs\#googledocscreateblankdocument) See Example > Create a blank Google Docs document with the specified title. **Parameters** - **`title`** _(string, required)_ The title of the blank document to create. * * * ## GoogleDocs.CreateDocumentFromText [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_docs\#googledocscreatedocumentfromtext) See Example > Create a Google Docs document with the specified title and text content. **Parameters** - **`title`** _(string, required)_ The title of the document to create. - **`text_content`** _(string, required)_ The text content to insert into the document. * * * ## GoogleDocs.SearchDocuments [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_docs\#googledocssearchdocuments) See Example > Search Google documents in the user’s Google Drive. Excludes documents that are in the trash. **Parameters** - **`document_contains`** _(list\[str\], optional)_ Keywords or phrases that must be in the document title or body. Provide a list of keywords or phrases if needed. - **`document_not_contains`** _(list\[str\], optional)_ Keywords or phrases that must not be in the document title or body. Provide a list of keywords or phrases if needed. - **`search_only_in_shared_drive_id`** _(str, optional)_ The ID of the shared drive to restrict the search to. If provided, the search will only return documents from this drive. Defaults to None, which searches across all drives. - **`include_shared_drives`** _(bool, optional)_ Whether to include documents from shared drives in the search results. Defaults to False (searches only in the user’s ‘My Drive’). - **`include_organization_domain_documents`** _(bool, optional)_ Whether to include documents from the organization’s domain. This is applicable to admin users who have permissions to view organization-wide documents in a Google Workspace account. Defaults to False. - **`order_by`** _(enum ( [OrderBy](https://docs.arcade.dev/mcp-servers/productivity/google_docs#orderby)), optional)_ Sort order. Defaults to listing the most recently modified documents first. - **`limit`** _(int, optional)_ The number of documents to list. Defaults to `50`. - **`pagination_token`** _(str, optional)_ The pagination token to continue a previous request ## GoogleDrive.SearchAndRetrieveDocuments [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_docs\#googledrivesearchandretrievedocuments) See Example > Searches for documents in the user’s Google Drive and returns a list of documents (with text content) matching the search criteria. Excludes documents that are in the trash. **Parameters** - **`document_format`** _(enum ( [DocumentFormat](https://docs.arcade.dev/mcp-servers/productivity/google_docs#documentformat)), optional)_ The format of the document to be returned. Defaults to Markdown. - **`document_contains`** _(list\[str\], optional)_ Keywords or phrases that must be in the document title or body. Provide a list of keywords or phrases if needed. - **`document_not_contains`** _(list\[str\], optional)_ Keywords or phrases that must not be in the document title or body. Provide a list of keywords or phrases if needed. - **`search_only_in_shared_drive_id`** _(str, optional)_ The ID of the shared drive to restrict the search to. If provided, the search will only return documents from this drive. Defaults to None, which searches across all drives. - **`include_shared_drives`** _(bool, optional)_ Whether to include documents from shared drives in the search results. Defaults to False (searches only in the user’s ‘My Drive’). - **`include_organization_domain_documents`** _(bool, optional)_ Whether to include documents from the organization’s domain. This is applicable to admin users who have permissions to view organization-wide documents in a Google Workspace account. Defaults to False. - **`order_by`** _(enum ( [OrderBy](https://docs.arcade.dev/mcp-servers/productivity/google_docs#orderby)), optional)_ Sort order. Defaults to listing the most recently modified documents first. - **`limit`** _(int, optional)_ The number of documents to list. Defaults to `50`. - **`pagination_token`** _(str, optional)_ The pagination token to continue a previous request * * * ## GoogleDocs.ListDocumentComments [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_docs\#googledocslistdocumentcomments) See Example > List all comments on the specified Google Docs document. **Parameters** - **`document_id`** _(string, required)_ The ID of the document to list comments for. - **`include_deleted`** _(bool, optional)_ Whether to include deleted comments in the results. Defaults to False. * * * ## GoogleDocs.CommentOnDocument [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_docs\#googledocscommentondocument) See Example > Comment on a specific document by its ID. **Parameters** - **`document_id`** _(string, required)_ The ID of the document to comment on. - **`comment_text`** _(string, required)_ The comment to add to the document. * * * ## Auth [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_docs\#auth) The Arcade Docs toolkit uses the [Google auth provider](https://docs.arcade.dev/home/auth-providers/google) to connect to users’ Google accounts. With the Arcade Cloud Platform, there’s nothing to configure. Your users will see `Arcade` as the name of the application that’s requesting permission. With a self-hosted installation of Arcade, you need to [configure the Google auth provider](https://docs.arcade.dev/home/auth-providers/google#configuring-google-auth) with your own Google app credentials. * * * ## Reference [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_docs\#reference) ### DocumentFormat [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_docs\#documentformat) The format of the document to be returned. - **`MARKDOWN`**: Markdown format. - **`HTML`**: HTML format. - **`GOOGLE_API_JSON`**: Original JSON format returned by the Google API. ### OrderBy [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_docs\#orderby) Sort keys for ordering files in Google Drive. Each key has both ascending and descending options. - **`CREATED_TIME`**: When the file was created (ascending). - **`CREATED_TIME_DESC`**: When the file was created (descending). - **`FOLDER`**: The folder ID, sorted using alphabetical ordering (ascending). - **`FOLDER_DESC`**: The folder ID, sorted using alphabetical ordering (descending). - **`MODIFIED_BY_ME_TIME`**: The last time the file was modified by the user (ascending). - **`MODIFIED_BY_ME_TIME_DESC`**: The last time the file was modified by the user (descending). - **`MODIFIED_TIME`**: The last time the file was modified by anyone (ascending). - **`MODIFIED_TIME_DESC`**: The last time the file was modified by anyone (descending). - **`NAME`**: The name of the file, sorted using alphabetical ordering (ascending). - **`NAME_DESC`**: The name of the file, sorted using alphabetical ordering (descending). - **`NAME_NATURAL`**: The name of the file, sorted using natural sort ordering (ascending). - **`NAME_NATURAL_DESC`**: The name of the file, sorted using natural sort ordering (descending). - **`QUOTA_BYTES_USED`**: The number of storage quota bytes used by the file (ascending). - **`QUOTA_BYTES_USED_DESC`**: The number of storage quota bytes used by the file (descending). - **`RECENCY`**: The most recent timestamp from the file’s date-time fields (ascending). - **`RECENCY_DESC`**: The most recent timestamp from the file’s date-time fields (descending). - **`SHARED_WITH_ME_TIME`**: When the file was shared with the user, if applicable (ascending). - **`SHARED_WITH_ME_TIME_DESC`**: When the file was shared with the user, if applicable (descending). - **`STARRED`**: Whether the user has starred the file (ascending). - **`STARRED_DESC`**: Whether the user has starred the file (descending). - **`VIEWED_BY_ME_TIME`**: The last time the file was viewed by the user (ascending). - **`VIEWED_BY_ME_TIME_DESC`**: The last time the file was viewed by the user (descending). ### ReasoningEffort [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_docs\#reasoningeffort) The effort to put into reasoning about document edits. - **`MINIMAL`**: Minimal reasoning effort for simple, straightforward edits. - **`LOW`**: Minimal reasoning effort for simple, straightforward edits. - **`MEDIUM`**: Moderate reasoning effort for most editing tasks (default). - **`HIGH`**: Maximum reasoning effort for complex edits requiring careful analysis. ## Get Building [Use tools hosted on Arcade Cloud\\ \\ Arcade tools are hosted by our cloud platform and ready to be used in your agents. Learn how.](https://docs.arcade.dev/home/quickstart) [Self Host Arcade tools\\ \\ Arcade tools can be self-hosted on your own infrastructure. Learn more about self-hosting.\\ \\ ```\\ pip install arcade_google_docs\\ ```](https://docs.arcade.dev/home/hosting-overview) [Google Contacts](https://docs.arcade.dev/mcp-servers/productivity/google_contacts "Google Contacts") [Reference](https://docs.arcade.dev/mcp-servers/productivity/google_docs/reference "Reference") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Google Calendar Reference [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Productivity & Docs](https://docs.arcade.dev/mcp-servers/productivity/asana "Productivity & Docs") [Google Calendar](https://docs.arcade.dev/mcp-servers/productivity/google_calendar "Google Calendar") Reference # GoogleCalendar Reference Below is a reference of enumerations used by some tools in the GoogleCalendar toolkit: ## EventVisibility [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_calendar/reference\#eventvisibility) - **DEFAULT**: `default` - **PUBLIC**: `public` - **PRIVATE**: `private` - **CONFIDENTIAL**: `confidential` ## SendUpdatesOptions [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_calendar/reference\#sendupdatesoptions) - **NONE**: `none` - **ALL**: `all` - **EXTERNAL\_ONLY**: `externalOnly` [Google Calendar](https://docs.arcade.dev/mcp-servers/productivity/google_calendar "Google Calendar") [Google Contacts](https://docs.arcade.dev/mcp-servers/productivity/google_contacts "Google Contacts") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Google Contacts Toolkit [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Productivity & Docs](https://docs.arcade.dev/mcp-servers/productivity/asana "Productivity & Docs") Google Contacts # Google Contacts **Description:** Enable agents to interact with Google Contacts. **Author:** Arcade **Auth:** User authorizationvia the [Google auth provider](https://docs.arcade.dev/home/auth-providers/google) [![PyPI Version](https://img.shields.io/pypi/v/arcade_google_contacts)](https://pypi.org/project/arcade_google_contacts/)[![License](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/arcadeai/arcade-ai/blob/main/LICENSE)[![Python Versions](https://img.shields.io/pypi/pyversions/arcade_google_contacts)](https://pypi.org/project/arcade_google_contacts/)[![Wheel Status](https://img.shields.io/pypi/wheel/arcade_google_contacts)](https://pypi.org/project/arcade_google_contacts/)[![Downloads](https://img.shields.io/pypi/dm/arcade_google_contacts)](https://pypi.org/project/arcade_google_contacts/) The Arcade Google Contacts MCP Server provides a pre-built set of tools for interacting with Google Contacts. These tools make it easy to build agents and AI apps that can: - Create new contacts - Search for contacts by name or email ## Available Tools [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_contacts\#available-tools) These tools are currently available in the Arcade Google Contacts toolkit. | Tool Name | Description | | --- | --- | | GoogleContacts.SearchContactsByEmail | Search the user's contacts in Google Contacts by email address. | | GoogleContacts.SearchContactsByName | Search the user's contacts in Google Contacts by name. | | GoogleContacts.CreateContact | Create a new contact record in Google Contacts. | | GoogleContacts.WhoAmI | Get comprehensive user profile and Google Contacts environment information. | If you need to perform an action that’s not listed here, you can [get in touch\\ with us](mailto:contact@arcade.dev) to request a new tool, or [create your\\ own tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server) with the [Google auth\\ provider](https://docs.arcade.dev/home/auth-providers/google#using-google-auth-in-custom-tools). ## GoogleContacts.SearchContactsByEmail [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_contacts\#googlecontactssearchcontactsbyemail) Search the user’s contacts in Google Contacts by email address. See Example > **Parameters** - **`email`** _(string, required)_: The email address to search for. - **`limit`** _(integer, optional)_: The maximum number of contacts to return (30 is the max allowed by the Google API). * * * ## GoogleContacts.SearchContactsByName [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_contacts\#googlecontactssearchcontactsbyname) Search the user’s contacts in Google Contacts by name. See Example > **Parameters** - **`name`** _(string, required)_: The full name to search for. - **`limit`** _(integer, optional)_: The maximum number of contacts to return (30 is the max allowed by the Google API). * * * ## GoogleContacts.CreateContact [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_contacts\#googlecontactscreatecontact) Create a new contact record in Google Contacts. See Example > **Parameters** - **`given_name`** _(string, required)_: The given name of the contact. - **`family_name`** _(string, optional)_: The optional family name of the contact. - **`email`** _(string, optional)_: The optional email address of the contact. * * * ## GoogleContacts.WhoAmI [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_contacts\#googlecontactswhoami) See Example > Get comprehensive user profile and Google Contacts environment information. **Parameters** This tool does not take any parameters. * * * ## Auth [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_contacts\#auth) The Arcade Google Contacts toolkit uses the [Google auth provider](https://docs.arcade.dev/home/auth-providers/google) to connect to users’ Google accounts. With the Arcade Cloud Platform, there’s nothing to configure. Your users will see `Arcade` as the name of the application that’s requesting permission. With a self-hosted installation of Arcade, you need to [configure the Google auth provider](https://docs.arcade.dev/home/auth-providers/google#configuring-google-auth) with your own Google app credentials. ## Get Building [Use tools hosted on Arcade Cloud\\ \\ Arcade tools are hosted by our cloud platform and ready to be used in your agents. Learn how.](https://docs.arcade.dev/home/quickstart) [Self Host Arcade tools\\ \\ Arcade tools can be self-hosted on your own infrastructure. Learn more about self-hosting.\\ \\ ```\\ pip install arcade_google_contacts\\ ```](https://docs.arcade.dev/home/hosting-overview) [Reference](https://docs.arcade.dev/mcp-servers/productivity/google_calendar/reference "Reference") [Google Docs](https://docs.arcade.dev/mcp-servers/productivity/google_docs "Google Docs") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Arcade Glossary [Home](https://docs.arcade.dev/home "Home") Glossary # Arcade Glossary ## Agents and Tools [Permalink for this section](https://docs.arcade.dev/home/glossary\#agents-and-tools) ### Agent [Permalink for this section](https://docs.arcade.dev/home/glossary\#agent) An ‘agent’ is the application you are building. It can be a chatbot, a web application, a mobile app, or any other type of application that happens to use an LLM as part of its functionality. Agents interact with the world by calling tools. Helping you build, test, authenticate, and deploy tools is what Arcade is all about. ### Toolkit [Permalink for this section](https://docs.arcade.dev/home/glossary\#toolkit) A ‘toolkit’ is a collection of tools that can be used by an agent, grouped logically together by a common theme or provider. Toolkits are the unit of deployment for tools within Arcade. ### Tool [Permalink for this section](https://docs.arcade.dev/home/glossary\#tool) A ‘tool’ is a function that can be called by an agent which performs some action - commonly via an API, filesystem, database, etc. Tools are written in Python and deployed by running a worker which contains the toolkit’s code. Tools are defined by the `@tool()` decorator and will be passed `ToolContext` as the first argument. If a tool has dependencies that are not met (a secret is not provided, for example), the tool will fail to execute. Tools are commonly referred to by a qualified name that includes their toolkit. For example, [Gmail.SendEmail](https://docs.arcade.dev/mcp-servers/productivity/gmail#gmailsendemail) _Learn more about [tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server)._ #### Optimized tools [Permalink for this section](https://docs.arcade.dev/home/glossary\#optimized-tools) [Optimized tools](https://docs.arcade.dev/home/use-tools/types-of-tools#optimized-tools) are designed from scratch to provide the best performance for LLMs in terms of speed, reliability, accuracy, and cost-effectiveness. #### Starter tools [Permalink for this section](https://docs.arcade.dev/home/glossary\#starter-tools) [Starter tools](https://docs.arcade.dev/home/use-tools/types-of-tools#starter-tools) are designed to mirror the original HTTP API design of the upstream service. They are not optimized for LLM usage and are not subject to evaluation suites. We recommend thoroughly evaluating each Starter tool with your Agents or chatbots before using it in production. Understand why [LLMs usually perform poorly](https://docs.arcade.dev/home/use-tools/types-of-tools#why-llms-perform-poorly-when-calling-http-apis) when calling HTTP APIs. ### Tool Context [Permalink for this section](https://docs.arcade.dev/home/glossary\#tool-context) ‘Tool context’ is an object that is passed to a tool as a parameter when the tool is executed. It contains information about the tool call, the user for which the tool is being called, and any secrets the tool requires to run. _Learn more about [tool context](https://docs.arcade.dev/home/build-tools/tool-context)._ ### MCP (Model Context Protocol) [Permalink for this section](https://docs.arcade.dev/home/glossary\#mcp-model-context-protocol) MCP is an open standard protocol that enables LLMs to access and use tools and data sources. Arcade tools go further than MCP with enterprise-grade authentication, secure token management, and fine-grained permissions. This allows your tools to be accessible to any LLM that supports MCP, while maintaining security and user privacy. Arcade Tools can be presented as an MCP server (via the Arcade Engine), allowing any LLM that supports MCP to access your tools. In the future, you will be able to add remote MCP servers to your project as additional workers, making their tools available to your agents. _Learn more about [MCP and Arcade](https://docs.arcade.dev/home/mcp-overview)._ ## The Arcade Platform [Permalink for this section](https://docs.arcade.dev/home/glossary\#the-arcade-platform) ### Account [Permalink for this section](https://docs.arcade.dev/home/glossary\#account) The ‘account’ is you (or your teammates), the developer(s) who are using Arcade to build an application or agent. You can sign into the Arcade dashboard, manage projects, and more. ### Tenant [Permalink for this section](https://docs.arcade.dev/home/glossary\#tenant) A ‘tenant’ is a collection of projects with unified billing details. It is the top-level unit of organization in Arcade. You can be a member of one or more tenants, and each tenant can have multiple projects. ### Project [Permalink for this section](https://docs.arcade.dev/home/glossary\#project) A ‘project’ is a collection of agents and tools. It is smallest unit of organization and isolation in Arcade. You can have multiple projects, and each project can have multiple agents and tools. Accounts can be members of multiple projects, and each project will have different API keys. ### API Key [Permalink for this section](https://docs.arcade.dev/home/glossary\#api-key) An ‘API key’ is a secret key that is used to authenticate requests to the Arcade API. It is used to identify the project that the request is for. API keys are project-specific. ## Authentication and Billing [Permalink for this section](https://docs.arcade.dev/home/glossary\#authentication-and-billing) ### User [Permalink for this section](https://docs.arcade.dev/home/glossary\#user) A ‘user’ is your end-user, the person who is using your application or agent. Users are counted by the unique `user_id` properties sent when calling tools. `user_id` values are commonly email addresses, but can be any string or number. ### Monthly Active Users (MAU) [Permalink for this section](https://docs.arcade.dev/home/glossary\#monthly-active-users-mau) Monthly Active Users are the unique end-users (counted by `user_id`) who have executed a tool in your app/agent within the past month. If the same `user_id` calls a tool multiple times in the same month, or executes multiple tools, it is only counted once. ### User Challenges [Permalink for this section](https://docs.arcade.dev/home/glossary\#user-challenges) User Challenges are the count of authorizations performed for any user (specified by `user_id` in Arcade’s SDKs and APIs). Authorization challenges occur when a user needs a new permission or scope that they don’t currently have, including previously-held scopes that were deleted or expired. The same user authenticating to multiple toolkits will have a User Challenge for each toolkit (e.g. once for Slack and once for Google). We also count the act of elevating permissions to a user who has already authenticated to a toolkit (e.g. adding a “write” scope when they previously only had a “read” scope). ### Auth Provider [Permalink for this section](https://docs.arcade.dev/home/glossary\#auth-provider) An ‘auth provider’ is a service that your users sign in with to let the agent access their data or take actions on their behalf. This can be a hosted service like Google or Slack, or a custom OAuth provider. Multiple Toolkits may share the same auth provider (for example, Gmail and Google Drive both use Google’s OAuth provider). Custom auth providers are defined in the Arcade Dashboard, or in your Engine YAML if you’re self-hosting. _Learn more about [auth providers](https://docs.arcade.dev/home/auth-providers)._ ### Authorization Scope [Permalink for this section](https://docs.arcade.dev/home/glossary\#authorization-scope) An ‘authorization scope’ is a permission that a user can grant to an agent. This is used to control what the agent can do with the user’s data. Available authorization scopes are defined by the authentication provider, and each tool defines the scopes it requires. Learn more about [authorized tool calling](https://docs.arcade.dev/home/auth/auth-tool-calling). ### Tool Executions [Permalink for this section](https://docs.arcade.dev/home/glossary\#tool-executions) A ‘tool execution’ is a single call to a tool to interact with a remote system or service. The tool execution itself may fail (e.g. the user does not have permission to call the tool), but as long as the execution was able to be routed to a worker, it will be counted. _Learn more about [tool executions](https://docs.arcade.dev/home/use-tools/tools-overview)._ ### Standard and Pro Tool executions [Permalink for this section](https://docs.arcade.dev/home/glossary\#standard-and-pro-tool-executions) Arcade tools are divided into 2 categories: Standard and Pro. While all tools have some cost for Arcade to run, Pro tools are significantly more costly - either due to infrastructure costs, the complexity of the tool, or a cost imposed by the provider of the tool. Pro tools cost more to execute and have different limits. Learn more about tool pricing [here](https://www.arcade.dev/pricing). ### Bring Your Own Credentials (BYOC) [Permalink for this section](https://docs.arcade.dev/home/glossary\#bring-your-own-credentials-byoc) Bring Your Own Credentials (BYOC) is a feature that allows you to use your own credentials to certain pro tools. This changes the cost of the tool execution, as you will be charged directly by the provider of the tool, rather than relying on Arcade to pay the bill for you. To set your own credentials, set the requisite secret within the Arcade Dashboard, overwriting the default ‘static’ credentials. ## Tool Execution and Tool Development [Permalink for this section](https://docs.arcade.dev/home/glossary\#tool-execution-and-tool-development) ### Arcade Client [Permalink for this section](https://docs.arcade.dev/home/glossary\#arcade-client) The ‘Arcade client’ is the SDK that you use to interact with the Arcade platform. It is how your agent lists and calls tools, tied back to your project via an API key. We offer clients for many popular languages and frameworks, including Python, JavaScript, and more. _Learn more about [the Arcade clients](https://docs.arcade.dev/home/arcade-clients)._ ### Arcade Engine [Permalink for this section](https://docs.arcade.dev/home/glossary\#arcade-engine) The Arcade Engine is the core of the Arcade platform. It is responsible for routing tool execution requests to the correct worker, managing the lifecycle of tool executions, and for enforcing security and authorization decisions. The Arcade Engine is also responsible for the OAuth flow for your agent’s users. This includes granting and elevating permissions and keeping tokens fresh. ### Worker [Permalink for this section](https://docs.arcade.dev/home/glossary\#worker) A ‘worker’ is a process that runs all the tools with a toolkit. Workers are microservices that are called by the Arcade Engine to handle tool execution requests. Workers are either [deployed to Arcade’s infrastructure](https://docs.arcade.dev/home/serve-tools/arcade-deploy) via `arcade deploy`, or run in your own infrastructure. _Learn more about workers [here](https://docs.arcade.dev/home/deployment/on-prem-mcp)._ and [here](https://docs.arcade.dev/home/serve-tools/docker-worker). ### TDK (Tool Development Kit) [Permalink for this section](https://docs.arcade.dev/home/glossary\#tdk-tool-development-kit) The Arcade TDK is a command-line application that helps you create, test, and deploy tools. _Learn more about the TDK [here](https://docs.arcade.dev/home/build-tools/create-a-mcp-server)._ ### Evaluations (Evals) [Permalink for this section](https://docs.arcade.dev/home/glossary\#evaluations-evals) Evaluations are a way to test the LLMs’ ability to select and call your tools. Arcade’s eval suite can and should be run as part of the development process to ensure your tools are working as expected. _Learn more about evaluations [here](https://docs.arcade.dev/home/evaluate-tools/why-evaluate-tools)._ [Zoom](https://docs.arcade.dev/home/auth-providers/zoom "Zoom") [FAQ](https://docs.arcade.dev/home/faq "FAQ") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Google Auth Provider [Home](https://docs.arcade.dev/home "Home") [Customizing Auth](https://docs.arcade.dev/home/auth-providers "Customizing Auth") Google # Google auth provider The Google auth provider enables tools and agents to call Google/Google Workspace APIs on behalf of a user. Behind the scenes, the Arcade Engine and the Google auth provider seamlessly manage Google OAuth 2.0 authorization for your users. Want to quickly get started with Google services in your agent or AI app? The pre-built [Arcade Gmail toolkit](https://docs.arcade.dev/mcp-servers/productivity/gmail) is what you want! ### What’s documented here [Permalink for this section](https://docs.arcade.dev/home/auth-providers/google\#whats-documented-here) This page describes how to use and configure Google auth with Arcade. This auth provider is used by: - The [Arcade Gmail toolkit](https://docs.arcade.dev/mcp-servers/productivity/gmail), which provides pre-built tools for interacting with Google services - Your [app code](https://docs.arcade.dev/home/auth-providers/google#using-google-auth-in-app-code) that needs to call Google APIs - Or, your [custom tools](https://docs.arcade.dev/home/auth-providers/google#using-google-auth-in-custom-tools) that need to call Google APIs ## Configuring Google auth [Permalink for this section](https://docs.arcade.dev/home/auth-providers/google\#configuring-google-auth) When using your own app credentials, make sure you configure your project to use a [custom user verifier](https://docs.arcade.dev/home/auth/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 Google app credentials. This way, your users will see your application’s name requesting permission. You can use your own Google credentials in both the Arcade Cloud Platform or in a [self-hosted Arcade Engine](https://docs.arcade.dev/home/deployment/engine-configuration) instance. Before showing how to configure your Google app credentials, let’s go through the steps to create a Google app. ### Create a Google app [Permalink for this section](https://docs.arcade.dev/home/auth-providers/google\#create-a-google-app) - Follow Google’s guide to [setting up OAuth credentials](https://support.google.com/cloud/answer/6158849?hl=en) - Choose the [scopes](https://developers.google.com/identity/protocols/oauth2/scopes) (permissions) you need for your app - At a minimum, you must enable these scopes: - `https://www.googleapis.com/auth/userinfo.email` - `https://www.googleapis.com/auth/userinfo.profile` - Add the redirect URL generated by Arcade (see below) to the Authorized redirect URIs list - Copy the client ID and client secret to use below Next, add the Google app to your Arcade Engine configuration. You can do this in the Arcade Dashboard, or by editing the `engine.yaml` file directly (for a self-hosted instance). ## Configuring your own Google Auth Provider in Arcade [Permalink for this section](https://docs.arcade.dev/home/auth-providers/google\#configuring-your-own-google-auth-provider-in-arcade) There are two ways to configure your Google app credentials in Arcade: 1. From the Arcade Dashboard GUI 2. By editing the `engine.yaml` file directly (for a self-hosted Arcade Engine) We show both options step-by-step below. Dashboard GUIEngine Configuration YAML ### Configure Google Auth Using the Arcade Dashboard GUI #### Access the Arcade Dashboard [Permalink for this section](https://docs.arcade.dev/home/auth-providers/google\#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](http://localhost:9099/dashboard). Adjust the host and port number to match your environment. #### Navigate to the OAuth Providers page [Permalink for this section](https://docs.arcade.dev/home/auth-providers/google\#navigate-to-the-oauth-providers-page) - Under the **OAuth** section of the Arcade Dashboard left-side menu, click **Providers**. - Click **Add OAuth Provider** in the top right corner. - Select the **Included Providers** tab at the top. - In the **Provider** dropdown, select **Google**. #### Enter the provider details [Permalink for this section](https://docs.arcade.dev/home/auth-providers/google\#enter-the-provider-details) - Choose a unique **ID** for your provider (e.g. “my-google-provider”). - Optionally enter a **Description**. - Enter the **Client ID** and **Client Secret** from your Google app. - Note the **Redirect URL** generated by Arcade. This must be added to your Google app’s Authorized redirect URIs list. #### Create the provider [Permalink for this section](https://docs.arcade.dev/home/auth-providers/google\#create-the-provider) Hit the **Create** button and the provider will be ready to be used. When you use tools that require Google auth using your Arcade account credentials, the Arcade Engine will automatically use this Google OAuth provider. If you have multiple Google providers, see [using multiple auth providers of the same type](https://docs.arcade.dev/home/auth-providers#using-multiple-providers-of-the-same-type) for more information. ## Using Google auth in app code [Permalink for this section](https://docs.arcade.dev/home/auth-providers/google\#using-google-auth-in-app-code) Use the Google auth provider in your own agents and AI apps to get a user token for Google APIs. See [authorizing agents with Arcade](https://docs.arcade.dev/home/auth/how-arcade-helps) to understand how this works. Use `client.auth.start()` to get a user token for Google APIs: PythonJavaScript ```nextra-code from arcadepy import Arcade from google.oauth2.credentials import Credentials from googleapiclient.discovery import build client = Arcade() # Automatically finds the `ARCADE_API_KEY` env variable user_id = "{arcade_user_id}" """ In this example, we will use Arcade to authenticate with Google and retrieve Gmail messages. There is a tool for that in the Arcade SDK, which simplifies the process for you to retrieve email messages either through our Python or JavaScript SDKs or via LLM tool calling. Below we are just showing how to use Arcade as an auth provider, if you ever need to. """ # Start the authorization process auth_response = client.auth.start( user_id=user_id, provider="google", scopes=["https://www.googleapis.com/auth/gmail.readonly"], ) 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 if not token: raise ValueError("No token found in auth response") credentials = Credentials(token) gmail = build("gmail", "v1", credentials=credentials) email_messages = ( gmail.users().messages().list(userId="me").execute().get("messages", []) ) print(email_messages) ``` ## Using Google auth in custom tools [Permalink for this section](https://docs.arcade.dev/home/auth-providers/google\#using-google-auth-in-custom-tools) You can use the pre-built Arcade Google toolkits, like [Arcade Gmail toolkit](https://docs.arcade.dev/mcp-servers/productivity/gmail), to quickly build agents and AI apps that interact with Google services like Gmail, Calendar, Drive, and more. If the pre-built tools in the Google toolkits don’t meet your needs, you can author your own [custom tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server) that interact with Google APIs. Use the `Google()` auth class to specify that a tool requires authorization with Google. The `context.authorization.token` field will be automatically populated with the user’s Google token: ```nextra-code from typing import Annotated from arcade_tdk import ToolContext, tool from arcade_tdk.auth import Google from google.oauth2.credentials import Credentials from googleapiclient.discovery import build @tool( requires_auth=Google( scopes=["https://www.googleapis.com/auth/gmail.readonly"], ) ) async def list_emails( context: ToolContext, subject: Annotated[str, "The subject of the email"], body: Annotated[str, "The body of the email"], recipient: Annotated[str, "The recipient of the email"], ) -> Annotated[str, "A confirmation message with the sent email ID and URL"]: """ Send an email using the Gmail API. """ if not context.authorization or not context.authorization.token: raise ValueError("No token found in context") credentials = Credentials(context.authorization.token) gmail = build("gmail", "v1", credentials=credentials) email_messages = ( gmail.users().messages().list(userId="me").execute().get("messages", []) ) return email_messages ``` [GitHub](https://docs.arcade.dev/home/auth-providers/github "GitHub") [Hubspot](https://docs.arcade.dev/home/auth-providers/hubspot "Hubspot") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Google Jobs Toolkit [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Search Tools](https://docs.arcade.dev/mcp-servers/search/google_finance "Search Tools") Google Jobs # Google Jobs **Description:** Enable agents to search for job openings with Google Jobs. **Author:** Arcade **Auth:** API Key [![PyPI Version](https://img.shields.io/pypi/v/arcade_google-jobs)](https://pypi.org/project/arcade_google-jobs/)[![License](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/arcadeai/arcade-ai/blob/main/LICENSE)[![Python Versions](https://img.shields.io/pypi/pyversions/arcade_google-jobs)](https://pypi.org/project/arcade_google-jobs/)[![Wheel Status](https://img.shields.io/pypi/wheel/arcade_google-jobs)](https://pypi.org/project/arcade_google-jobs/)[![Downloads](https://img.shields.io/pypi/dm/arcade_google-jobs)](https://pypi.org/project/arcade_google-jobs/) The Arcade Google Jobs MCP Server provides a pre-built set of tools for interacting with Google Jobs. These tools make it easy to build agents and AI apps that can: - Search for job openings with Google Jobs. ## Available Tools [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/google_jobs\#available-tools) | Tool Name | Description | | --- | --- | | GoogleJobs.SearchJobs | Search for job openings with Google Jobs. | If you need to perform an action that’s not listed here, you can [get in touch\\ with us](mailto:contact@arcade.dev) to request a new tool, or [create your\\ own tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server). ## GoogleJobs.SearchJobs [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/google_jobs\#googlejobssearchjobs) See Example > Search for job openings with Google Jobs. **Parameters** - **`query`** _(string, required)_ Search query. Provide a job title, company name, and/or any keywords in general representing what kind of jobs the user is looking for. - **`location`** _(string, optional, Defaults to `None`)_ Location to search for jobs. E.g. ‘United States’ or ‘New York, NY’. Defaults to None. - **`language`** _(string, optional, Defaults to ‘en’ English)_ 2-character language code to use in the Google Jobs search. - **`limit`** _(int, optional, Defaults to 10)_ Maximum number of results to retrieve. Defaults to 10 (max supported by the API). - **`next_page_token`** _(string, optional, Defaults to `None`)_ Next page token to paginate results. Defaults to None (start from the first page). ## Auth [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/google_jobs\#auth) The Arcade Google Jobs toolkit uses the [SerpAPI](https://serpapi.com/) to get job data from Google Jobs. - **Secret:** - `SERP_API_KEY`: Your SerpAPI API key. Setting the `SERP_API_KEY` secret is only required if you are [self-hosting](https://docs.arcade.dev/home/deployment/engine-configuration) Arcade. If you’re using Arcade Cloud, the secret is already set for you. To manage your secrets, go to the [Secrets page](https://api.arcade.dev/dashboard/auth/secrets) in the Arcade Dashboard. ## Default parameters [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/google_jobs\#default-parameters) Language is configurable through environment variables. When set, they will be used as default for Google Jobs tools. Providing a different value as `language` argument in a tool call will override the default value. **Language** The language code is a 2-character code that determines the language in which the API will search and return news articles. There are two environment variables: - `ARCADE_GOOGLE_LANGUAGE`: a default value for all Google search tools. If not set, defaults to ‘en’ (English). - `ARCADE_GOOGLE_JOBS_LANGUAGE`: a default value for the jobs search tools. If not set, defaults to `ARCADE_GOOGLE_LANGUAGE`. A list of supported language codes can be found [here](https://docs.arcade.dev/mcp-servers/search/google_jobs#languagecodes). ## LanguageCodes [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/google_jobs\#languagecodes) - **`ar`**: Arabic - **`bn`**: Bengali - **`da`**: Danish - **`de`**: German - **`el`**: Greek - **`en`**: English - **`es`**: Spanish - **`fi`**: Finnish - **`fr`**: French - **`hi`**: Hindi - **`hu`**: Hungarian - **`id`**: Indonesian - **`it`**: Italian - **`ja`**: Japanese - **`ko`**: Korean - **`ms`**: Malay - **`nl`**: Dutch - **`no`**: Norwegian - **`pcm`**: Nigerian Pidgin - **`pl`**: Polish - **`pt`**: Portuguese - **`pt-br`**: Portuguese (Brazil) - **`pt-pt`**: Portuguese (Portugal) - **`ru`**: Russian - **`sv`**: Swedish - **`tl`**: Filipino - **`tr`**: Turkish - **`uk`**: Ukrainian - **`zh`**: Chinese - **`zh-cn`**: Chinese (Simplified) - **`zh-tw`**: Chinese (Traditional) ## Get Building [Use tools hosted on Arcade Cloud\\ \\ Arcade tools are hosted by our cloud platform and ready to be used in your agents. Learn how.](https://docs.arcade.dev/home/quickstart) [Self Host Arcade tools\\ \\ Arcade tools can be self-hosted on your own infrastructure. Learn more about self-hosting.\\ \\ ```\\ pip install arcade_google_jobs\\ ```](https://docs.arcade.dev/home/hosting-overview) [Google Hotels](https://docs.arcade.dev/mcp-servers/search/google_hotels "Google Hotels") [Google Maps](https://docs.arcade.dev/mcp-servers/search/google_maps "Google Maps") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Twitch Auth Provider [Home](https://docs.arcade.dev/home "Home") [Customizing Auth](https://docs.arcade.dev/home/auth-providers "Customizing Auth") Twitch # Twitch auth provider At this time, Arcade does not offer a default Twitch Auth Provider. To use Twitch auth, you must create a custom Auth Provider with your own Twitch OAuth 2.0 credentials as described below. The Twitch auth provider enables tools and agents to call the Twitch API on behalf of a user. Behind the scenes, the Arcade Engine and the Twitch auth provider seamlessly manage Twitch OAuth 2.0 authorization for your users. ### What’s documented here [Permalink for this section](https://docs.arcade.dev/home/auth-providers/twitch\#whats-documented-here) This page describes how to use and configure Twitch auth with Arcade. This auth provider is used by: - Your [app code](https://docs.arcade.dev/home/auth-providers/twitch#using-twitch-auth-in-app-code) that needs to call Twitch APIs - Or, your [custom tools](https://docs.arcade.dev/home/auth-providers/twitch#using-twitch-auth-in-custom-tools) that need to call Twitch APIs ## Configuring Twitch auth [Permalink for this section](https://docs.arcade.dev/home/auth-providers/twitch\#configuring-twitch-auth) When using your own app credentials, make sure you configure your project to use a [custom user verifier](https://docs.arcade.dev/home/auth/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 Twitch app credentials. This way, your users will see your application’s name requesting permission. You can use your own Twitch credentials in both the Arcade Cloud Platform or in a [self-hosted Arcade Engine](https://docs.arcade.dev/home/deployment/engine-configuration) instance. Before showing how to configure your Twitch app credentials, let’s go through the steps to create a Twitch app. ### Create a Twitch app [Permalink for this section](https://docs.arcade.dev/home/auth-providers/twitch\#create-a-twitch-app) - Twitch requires that you have two-factor authentication enabled for your account. Enable in your [account security seetings](https://www.twitch.tv/settings/security) - Create a Twitch Application in the [Twitch App Console](https://dev.twitch.tv/console/apps) - Set the OAuth Redirect URL to the redirect URL generated by Arcade (see below) - Select your Application category - Select the ‘Confidential’ Client Type - Copy the App key (Client ID) and App secret (Client Secret), which you’ll need below Next, add the Twitch app to your Arcade Engine configuration. You can do this in the Arcade Dashboard, or by editing the `engine.yaml` file directly (for a self-hosted instance). ## Configuring your own Twitch Auth Provider in Arcade [Permalink for this section](https://docs.arcade.dev/home/auth-providers/twitch\#configuring-your-own-twitch-auth-provider-in-arcade) There are two ways to configure your Twitch app credentials in Arcade: 1. From the Arcade Dashboard GUI 2. By editing the `engine.yaml` file directly (for a self-hosted Arcade Engine) We show both options step-by-step below. Dashboard GUIEngine Configuration YAML ### Configure Twitch Auth Using the Arcade Dashboard GUI #### Access the Arcade Dashboard [Permalink for this section](https://docs.arcade.dev/home/auth-providers/twitch\#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](http://localhost:9099/dashboard). Adjust the host and port number to match your environment. #### Navigate to the OAuth Providers page [Permalink for this section](https://docs.arcade.dev/home/auth-providers/twitch\#navigate-to-the-oauth-providers-page) - Under the **OAuth** section of the Arcade Dashboard left-side menu, click **Providers**. - Click **Add OAuth Provider** in the top right corner. - Select the **Included Providers** tab at the top. - In the **Provider** dropdown, select **Twitch**. #### Enter the provider details [Permalink for this section](https://docs.arcade.dev/home/auth-providers/twitch\#enter-the-provider-details) - Choose a unique **ID** for your provider (e.g. “my-twitch-provider”). - Optionally enter a **Description**. - Enter the **Client ID** and **Client Secret** from your Twitch app. - Note the **Redirect URL** generated by Arcade. This must be set as your Twitch app’s OAuth Redirect URL. #### Create the provider [Permalink for this section](https://docs.arcade.dev/home/auth-providers/twitch\#create-the-provider) Hit the **Create** button and the provider will be ready to be used. When you use tools that require Twitch auth using your Arcade account credentials, the Arcade Engine will automatically use this Twitch OAuth provider. If you have multiple Twitch providers, see [using multiple auth providers of the same type](https://docs.arcade.dev/home/auth-providers#using-multiple-providers-of-the-same-type) for more information. ## Using Twitch auth in app code [Permalink for this section](https://docs.arcade.dev/home/auth-providers/twitch\#using-twitch-auth-in-app-code) Use the Twitch auth provider in your own agents and AI apps to get a user-scoped token for the Twitch API. See [authorizing agents with Arcade](https://docs.arcade.dev/home/auth/how-arcade-helps) to understand how this works. Use `client.auth.start()` to get a user token for the Twitch API: PythonJavaScript ```nextra-code 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="twitch", scopes=["channel:manage:polls"], ) 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... ``` ## Using Twitch auth in custom tools [Permalink for this section](https://docs.arcade.dev/home/auth-providers/twitch\#using-twitch-auth-in-custom-tools) You can author your own [custom tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server) that interact with the Twitch API. Use the `Twitch()` auth class to specify that a tool requires authorization with Twitch. The `context.authorization.token` field will be automatically populated with the user’s Twitch token: ```nextra-code from typing import Annotated, Optional import httpx from arcade_tdk import ToolContext, tool from arcade_tdk.auth import Twitch @tool( requires_auth=Twitch( scopes=["channel:manage:polls"], ) ) async def create_poll( context: ToolContext, broadcaster_id: Annotated[\ str,\ "The ID of the broadcaster to create the poll for.",\ ], title: Annotated[\ str,\ "The title of the poll.",\ ], choices: Annotated[\ list[str],\ "The choices of the poll.",\ ], duration: Annotated[\ int,\ "The duration of the poll in seconds.",\ ], ) -> Annotated[dict, "The poll that was created"]: """Create a poll for a Twitch channel.""" url = "https://api.twitch.tv/helix/polls" headers = { "Authorization": f"Bearer {context.authorization.token}", "Client-Id": "your_client_id", "Content-Type": "application/json", } payload = { "broadcaster_id": broadcaster_id, "title": title, "choices": [{"title": choice} for choice in choices], "duration": duration, } async with httpx.AsyncClient() as client: response = await client.post(url, headers=headers, json=payload) response.raise_for_status() return response.json() ``` [Spotify](https://docs.arcade.dev/home/auth-providers/spotify "Spotify") [X](https://docs.arcade.dev/home/auth-providers/x "X") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Contact Arcade Support # Contact Us We’re here to help you succeed with Arcade! Choose the support channel that best fits your needs. ### Status [Permalink for this section](https://docs.arcade.dev/home/contact-us\#-status) Learn about the current status of Arcade’s services at [status.arcade.dev](https://status.arcade.dev/). ### Discord Discord Community [Permalink for this section](https://docs.arcade.dev/home/contact-us\#-discord-community) Our active Discord community is the fastest way to get help: - Get real-time assistance from the Arcade team - Connect with fellow developers - Stay updated on latest features [Join our Discord Server →](https://discord.gg/GUZEMpEZ9p) ### GitHub GitHub Issues [Permalink for this section](https://docs.arcade.dev/home/contact-us\#-github-issues) For technical issues, feature requests, and contributions: - Report bugs with detailed reproduction steps - Request new features and enhancements - Contribute to documentation improvements [Open a GitHub Issue →](https://github.com/ArcadeAI/arcade-ai/issues/new/choose) ### Resources [Permalink for this section](https://docs.arcade.dev/home/contact-us\#-resources) Before reaching out, you might find your answer in our resources: - [Documentation](https://docs.arcade.dev/) \- Comprehensive guides and API references - [Blog](https://blog.arcade.dev/) \- Latest updates and technical articles - [Examples](https://github.com/ArcadeAI/arcade-ai/tree/main/examples) \- Examples and guides for using arcade-ai ### Email [Permalink for this section](https://docs.arcade.dev/home/contact-us\#-email) For general inquiries and support: - [Contact us via email](mailto:support@arcade.dev) Email responses are not guaranteed within a specific timeframe. For faster assistance, we recommend joining our Discord community. ### Security Research Program [Permalink for this section](https://docs.arcade.dev/home/contact-us\#-security-research-program) At Arcade.dev, security is fundamental to our mission of building safe and reliable tools. We recognize that the security research community plays a valuable role in identifying potential vulnerabilities. #### Scope [Permalink for this section](https://docs.arcade.dev/home/contact-us\#scope) Our program covers security issues in: - Arcade.dev production services and APIs - Agent authentication and authorization mechanisms - Data handling and storage systems - Published open-source components #### What We’re Looking For [Permalink for this section](https://docs.arcade.dev/home/contact-us\#what-were-looking-for) We’re interested in reports about: - Authentication or authorization bypasses - Data exposure or leakage - Injection vulnerabilities - Logic flaws affecting agent behavior - Issues that could compromise user data or agent integrity #### Reporting Process [Permalink for this section](https://docs.arcade.dev/home/contact-us\#reporting-process) Please email [security@arcade.dev](mailto:security@arcade.dev) with: - A clear description of the issue - Steps to reproduce - Potential impact assessment - Any relevant proof-of-concept code (please be responsible) We’ll acknowledge receipt within 72 hours and aim to provide an initial assessment within one week. #### Guidelines [Permalink for this section](https://docs.arcade.dev/home/contact-us\#guidelines) - Please allow us reasonable time to address issues before public disclosure - Avoid automated scanning that could impact service availability - Do not access or modify other users’ data - Keep any discovered vulnerabilities confidential until resolved #### Recognition [Permalink for this section](https://docs.arcade.dev/home/contact-us\#recognition) While we’re a small team with limited resources, we appreciate the effort researchers put into improving our security. We’ll credit researchers (with permission) in our security updates and may provide modest rewards for significant findings on a case-by-case basis. For questions about this program, please contact [security@arcade.dev](mailto:security@arcade.dev). Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Notion Auth Provider [Home](https://docs.arcade.dev/home "Home") [Customizing Auth](https://docs.arcade.dev/home/auth-providers "Customizing Auth") Notion # Notion auth provider The Notion auth provider enables tools and agents to call [Notion APIs](https://developers.notion.com/reference/intro) on behalf of a user. Behind the scenes, the Arcade Engine and the Notion auth provider seamlessly manage Notion OAuth 2.0 authorization for your users. ### What’s documented here [Permalink for this section](https://docs.arcade.dev/home/auth-providers/notion\#whats-documented-here) This page describes how to use and configure Notion auth with Arcade. This auth provider is used by: - Your [app code](https://docs.arcade.dev/home/auth-providers/notion#using-notion-auth-in-app-code) that needs to call the Notion API - Or, your [custom tools](https://docs.arcade.dev/home/auth-providers/notion#using-notion-auth-in-custom-tools) that need to call the Notion API ## Configuring Notion auth [Permalink for this section](https://docs.arcade.dev/home/auth-providers/notion\#configuring-notion-auth) When using your own app credentials, make sure you configure your project to use a [custom user verifier](https://docs.arcade.dev/home/auth/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 Notion app credentials. This way, your users will see your application’s name requesting permission. You can use your own Notion credentials in both the Arcade Cloud Platform or in a [self-hosted Arcade Engine](https://docs.arcade.dev/home/deployment/engine-configuration) instance. Before showing how to configure your Notion app credentials, let’s go through the steps to create a Notion app. ### Create a Notion app [Permalink for this section](https://docs.arcade.dev/home/auth-providers/notion\#create-a-notion-app) - Create a new public integration in your [integration’s settings page](https://www.notion.so/profile/integrations) - Set the redirect URI to the redirect URL generated by Arcade (see below) - Once you complete creating your integration, copy the client ID and client secret to use below Next, add the Notion app to your Arcade Engine configuration. You can do this in the Arcade Dashboard, or by editing the `engine.yaml` file directly (for a self-hosted instance). ## Configuring your own Notion Auth Provider in Arcade [Permalink for this section](https://docs.arcade.dev/home/auth-providers/notion\#configuring-your-own-notion-auth-provider-in-arcade) There are two ways to configure your Notion app credentials in Arcade: 1. From the Arcade Dashboard GUI 2. By editing the `engine.yaml` file directly (for a self-hosted Arcade Engine) We show both options step-by-step below. Dashboard GUIEngine Configuration YAML ### Configure Notion Auth Using the Arcade Dashboard GUI #### Access the Arcade Dashboard [Permalink for this section](https://docs.arcade.dev/home/auth-providers/notion\#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](http://localhost:9099/dashboard). Adjust the host and port number to match your environment. #### Navigate to the OAuth Providers page [Permalink for this section](https://docs.arcade.dev/home/auth-providers/notion\#navigate-to-the-oauth-providers-page) - Under the **OAuth** section of the Arcade Dashboard left-side menu, click **Providers**. - Click **Add OAuth Provider** in the top right corner. - Select the **Included Providers** tab at the top. - In the **Provider** dropdown, select **Notion**. #### Enter the provider details [Permalink for this section](https://docs.arcade.dev/home/auth-providers/notion\#enter-the-provider-details) - Choose a unique **ID** for your provider (e.g. “my-notion-provider”). - Optionally enter a **Description**. - Enter the **Client ID** and **Client Secret** from your Notion app. - Note the **Redirect URL** generated by Arcade. This must be set as your Notion app’s redirect URI. #### Create the provider [Permalink for this section](https://docs.arcade.dev/home/auth-providers/notion\#create-the-provider) Hit the **Create** button and the provider will be ready to be used. When you use tools that require Notion auth using your Arcade account credentials, the Arcade Engine will automatically use this Notion OAuth provider. If you have multiple Notion providers, see [using multiple auth providers of the same type](https://docs.arcade.dev/home/auth-providers#using-multiple-providers-of-the-same-type) for more information. ## Using Notion auth in app code [Permalink for this section](https://docs.arcade.dev/home/auth-providers/notion\#using-notion-auth-in-app-code) Use the Notion auth provider in your own agents and AI apps to get a user token for the Notion API. See [authorizing agents with Arcade](https://docs.arcade.dev/home/auth/how-arcade-helps) to understand how this works. Use `client.auth.start()` to get a user token for the Notion API: PythonJavaScript ```nextra-code 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="notion" ) 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... ``` ## Using Notion auth in custom tools [Permalink for this section](https://docs.arcade.dev/home/auth-providers/notion\#using-notion-auth-in-custom-tools) You can use the pre-built [Arcade Notion toolkit](https://docs.arcade.dev/mcp-servers/development/github/github) to quickly build agents and AI apps that interact with Notion. If the pre-built tools in the Notion toolkit don’t meet your needs, you can author your own [custom tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server) that interact with the Notion API. Use the `Notion()` auth class to specify that a tool requires authorization with Notion. The `context.authorization.token` field will be automatically populated with the user’s Notion token: ```nextra-code from typing import Annotated import httpx from arcade_tdk import ToolContext, tool from arcade_tdk.auth import Notion @tool(requires_auth=Notion()) async def search_page_by_title( context: ToolContext, title_includes: Annotated[str, "The text to compare against page and database titles."], ) -> Annotated[dict, "The matching pages."]: """ Search for a Notion page by its title. """ url = "https://api.notion.com/v1/search" headers = { "Authorization": context.authorization.token, "Content-Type": "application/json", "Notion-Version": "2022-06-28", } payload = {"query": title_includes, "filter": {"property": "object", "value": "page"}} async with httpx.AsyncClient() as client: response = await client.post(url, headers=headers, json=payload) response.raise_for_status() return dict(response.json()) ``` [Microsoft](https://docs.arcade.dev/home/auth-providers/microsoft "Microsoft") [OAuth 2.0](https://docs.arcade.dev/home/auth-providers/oauth2 "OAuth 2.0") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## API Key Management [Home](https://docs.arcade.dev/home "Home") Get an API key # Getting Your API Key Before you begin, you’ll need an Arcade account - if you haven’t created one yet, you can [sign up here](https://api.arcade.dev/signup). Once you have an account, you can generate API keys through either our dashboard or CLI. DashboardCLI ### Using the Dashboard ### Navigate to API Keys page [Permalink for this section](https://docs.arcade.dev/home/api-keys\#navigate-to-api-keys-page) Visit the [API Keys page](https://api.arcade.dev/dashboard/api-keys) in Arcade Dashboard. ### Create a new API key [Permalink for this section](https://docs.arcade.dev/home/api-keys\#create-a-new-api-key) 1. Click the `Create API Key` button in the top right 2. Enter a descriptive name to help identify your key 3. Click `Create API Key` to generate your key ### Save your API key securely [Permalink for this section](https://docs.arcade.dev/home/api-keys\#save-your-api-key-securely) 1. Copy your API key immediately - it will only be shown once 2. Store it securely 3. You can always generate new keys if needed API keys are administrator credentials. Anyone who has your API key can make requests to Arcade as you. Always store your API keys in a safe place, such as system environment variables, and never commit them to version control, share them publicly, or use them in browser or frontend code. ## Next Steps [Permalink for this section](https://docs.arcade.dev/home/api-keys\#next-steps) Once you have your API key, you can: - [Start using tools](https://docs.arcade.dev/home/quickstart) - [Create custom tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server) [Quickstart](https://docs.arcade.dev/home/quickstart "Quickstart") [Create a toolkit](https://docs.arcade.dev/home/build-tools/create-a-mcp-server "Create a toolkit") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Discord Auth Provider [Home](https://docs.arcade.dev/home "Home") [Customizing Auth](https://docs.arcade.dev/home/auth-providers "Customizing Auth") Discord # Discord auth provider At this time, Arcade does not offer a default Discord Auth Provider. To use Discord auth, you must create a custom Auth Provider with your own Discord OAuth 2.0 credentials as described below. The Discord auth provider enables tools and agents to call the Discord API on behalf of a user. Behind the scenes, the Arcade Engine and the Discord auth provider seamlessly manage Discord OAuth 2.0 authorization for your users. ### What’s documented here [Permalink for this section](https://docs.arcade.dev/home/auth-providers/discord\#whats-documented-here) This page describes how to use and configure Discord auth with Arcade. This auth provider is used by: - Your [app code](https://docs.arcade.dev/home/auth-providers/discord#using-discord-auth-in-app-code) that needs to call Discord APIs - Or, your [custom tools](https://docs.arcade.dev/home/auth-providers/discord#using-discord-auth-in-custom-tools) that need to call Discord APIs ## Configuring Discord auth [Permalink for this section](https://docs.arcade.dev/home/auth-providers/discord\#configuring-discord-auth) When using your own app credentials, make sure you configure your project to use a [custom user verifier](https://docs.arcade.dev/home/auth/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 Discord app credentials. This way, your users will see your application’s name requesting permission. You can use your own Discord credentials in both the Arcade Cloud Platform or in a [self-hosted Arcade Engine](https://docs.arcade.dev/home/deployment/engine-configuration) instance. Before showing how to configure your Discord app credentials, let’s go through the steps to create a Discord app. ### Create a Discord app [Permalink for this section](https://docs.arcade.dev/home/auth-providers/discord\#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 your Arcade Engine configuration. You can do this in the Arcade Dashboard, or by editing the `engine.yaml` file directly (for a self-hosted instance). ## Configuring your own Discord Auth Provider in Arcade [Permalink for this section](https://docs.arcade.dev/home/auth-providers/discord\#configuring-your-own-discord-auth-provider-in-arcade) There are two ways to configure your Atlassian app credentials in Arcade: 1. From the Arcade Dashboard GUI 2. By editing the `engine.yaml` file directly (for a self-hosted Arcade Engine) We show both options step-by-step below. Dashboard GUIEngine Configuration YAML ### Configure Discord Auth Using the Arcade Dashboard GUI #### Access the Arcade Dashboard [Permalink for this section](https://docs.arcade.dev/home/auth-providers/discord\#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](http://localhost:9099/dashboard). Adjust the host and port number to match your environment. #### Navigate to the OAuth Providers page [Permalink for this section](https://docs.arcade.dev/home/auth-providers/discord\#navigate-to-the-oauth-providers-page) - Under the **OAuth** section of the Arcade Dashboard left-side menu, click **Providers**. - Click **Add OAuth Provider** in the top right corner. - Select the **Included Providers** tab at the top. - In the **Provider** dropdown, select **Discord**. #### Enter the provider details [Permalink for this section](https://docs.arcade.dev/home/auth-providers/discord\#enter-the-provider-details) - Choose a unique **ID** for your provider (e.g. “my-discord-provider”). - Optionally enter a **Description**. - Enter the **Client ID** and **Client Secret** from your Discord app. - Note the **Redirect URL** generated by Arcade. This must be added to your Discord app’s Redirect URIs. #### Create the provider [Permalink for this section](https://docs.arcade.dev/home/auth-providers/discord\#create-the-provider) Hit the **Create** button and the provider will be ready to be used. When you use tools that require Discord auth using your Arcade account credentials, the Arcade Engine will automatically use this Discord OAuth provider. If you have multiple Discord providers, see [using multiple auth providers of the same type](https://docs.arcade.dev/home/auth-providers#using-multiple-providers-of-the-same-type) for more information. ## Using Discord auth in app code [Permalink for this section](https://docs.arcade.dev/home/auth-providers/discord\#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](https://docs.arcade.dev/home/auth/how-arcade-helps) to understand how this works. Use `client.auth.start()` to get a user token for the Discord API: PythonJavaScript ```nextra-code 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... ``` ## Using Discord auth in custom tools [Permalink for this section](https://docs.arcade.dev/home/auth-providers/discord\#using-discord-auth-in-custom-tools) You can author your own [custom tools](https://docs.arcade.dev/home/build-tools/create-a-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: ```nextra-code 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() ``` [Clickup](https://docs.arcade.dev/home/auth-providers/clickup "Clickup") [Dropbox](https://docs.arcade.dev/home/auth-providers/dropbox "Dropbox") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Arcade CLI Tool [Home](https://docs.arcade.dev/home "Home") Arcade CLI # The Arcade CLI The Arcade CLI is a command-line tool that allows you to manage your Arcade deployments, generate, test, and manage your toolkits, and more. This same package contains the SDK that you will use to [build your own toolkits](https://docs.arcade.dev/home/build-tools/create-a-mcp-server). ## Installation [Permalink for this section](https://docs.arcade.dev/home/arcade-cli\#installation) Like all python packages, the Arcade CLI needs to be installed within the python virtual environment you are using for your Arcade development environment. Python + uvPython + CondaStandard Python ```nextra-code # install uv: https://docs.astral.sh/uv/getting-started/installation/ uv venv --seed source .venv/bin/activate ``` Now that your python virtual environment is activated, you can install the Arcade CLI with the following command: uvpip ```nextra-code uv pip install arcade-ai ``` ## Usage [Permalink for this section](https://docs.arcade.dev/home/arcade-cli\#usage) ```nextra-code Usage: arcade [OPTIONS] COMMAND [ARGS]... ╭─ Options ───────────────────────────────────────────────────────────────────────────╮ │ --version -v Print version and exit. │ │ --help Show this message and exit. │ ╰─────────────────────────────────────────────────────────────────────────────────────╯ ╭─ User ──────────────────────────────────────────────────────────────────────────────╮ │ login Log in to Arcade Cloud │ │ logout Log out of Arcade Cloud │ │ dashboard Open the Arcade Dashboard in a web browser │ ╰─────────────────────────────────────────────────────────────────────────────────────╯ ╭─ Tool Development ──────────────────────────────────────────────────────────────────╮ │ new Create a new toolkit package directory │ │ show Show the installed toolkits or details of a specific tool │ │ chat Start a chat with a model in the terminal to test tools │ │ evals Run tool calling evaluations │ ╰─────────────────────────────────────────────────────────────────────────────────────╯ ╭─ Launch ────────────────────────────────────────────────────────────────────────────╮ │ serve Start tool server worker with locally installed tools │ ╰─────────────────────────────────────────────────────────────────────────────────────╯ ╭─ Deployment ────────────────────────────────────────────────────────────────────────╮ │ deploy Deploy toolkits to Arcade Cloud │ │ worker Manage deployments of tool servers (logs, list, etc) │ ╰─────────────────────────────────────────────────────────────────────────────────────╯ ``` You can learn more about any of the commands by running `arcade --help`, e.g. `arcade new --help`. ## `arcade login` [Permalink for this section](https://docs.arcade.dev/home/arcade-cli\#arcade-login) ```nextra-code Usage: arcade login [OPTIONS] Log in to Arcade Cloud ╭─ Options ─────────────────────────────────────────────────────────────────────────╮ │ --host -h TEXT The Arcade Cloud host to log in to. │ │ [default: cloud.arcade.dev] │ │ --port -p INTEGER The port of the Arcade Cloud host (if running locally). │ │ [default: None] │ │ --help Show this message and exit. │ ╰───────────────────────────────────────────────────────────────────────────────────╯ ``` ## `arcade logout` [Permalink for this section](https://docs.arcade.dev/home/arcade-cli\#arcade-logout) ```nextra-code Usage: arcade logout [OPTIONS] Log out of Arcade Cloud ╭─ Options ─────────────────────────────────────────────────────────────────────────╮ │ --help Show this message and exit. │ ╰───────────────────────────────────────────────────────────────────────────────────╯ ``` ## `arcade dashboard` [Permalink for this section](https://docs.arcade.dev/home/arcade-cli\#arcade-dashboard) ```nextra-code Usage: arcade dashboard [OPTIONS] Open the Arcade Dashboard in a web browser ╭─ Options ─────────────────────────────────────────────────────────────────────────╮ │ --host -h TEXT The Arcade Engine host that serves the dashboard. │ │ [default: api.arcade.dev] │ │ --port -p INTEGER The port of the Arcade Engine. │ │ [default: None] │ │ --local -l Open the local dashboard instead of the default remote │ │ dashboard. │ │ --tls Whether to force TLS for the connection to the Arcade │ │ Engine. │ │ --no-tls Whether to disable TLS for the connection to the │ │ Arcade Engine. │ │ --help Show this message and exit. │ ╰───────────────────────────────────────────────────────────────────────────────────╯ ``` ## `arcade new` [Permalink for this section](https://docs.arcade.dev/home/arcade-cli\#arcade-new) ```nextra-code Usage: arcade new [OPTIONS] TOOLKIT_NAME Create a new toolkit package directory. Example: arcade new my_toolkit ╭─ Arguments ──────────────────────────────────────────────────────────────────────╮ │ * toolkit_name TEXT The name of the toolkit to create [required] │ ╰───────────────────────────────────────────────────────────────────────────────────╯ ╭─ Options ─────────────────────────────────────────────────────────────────────────╮ │ --dir TEXT tools directory path │ │ [default: current directory] │ │ --help Show this message and exit. │ ╰───────────────────────────────────────────────────────────────────────────────────╯ ``` ## `arcade show` [Permalink for this section](https://docs.arcade.dev/home/arcade-cli\#arcade-show) ```nextra-code Usage: arcade show [OPTIONS] Show the installed toolkits or details of a specific tool ╭─ Options ─────────────────────────────────────────────────────────────────────────╮ │ --toolkit -T TEXT The toolkit to show the tools of │ │ [default: None] │ │ --tool -t TEXT The specific tool to show details for │ │ [default: None] │ │ --host -h TEXT The Arcade Engine address to show the tools/toolkits │ │ of. │ │ [default: api.arcade.dev] │ │ --local -l Show the local environment's catalog instead of an │ │ Arcade Engine's catalog. │ │ --port -p INTEGER The port of the Arcade Engine. │ │ [default: None] │ │ --tls Whether to force TLS for the connection to the Arcade │ │ Engine. If not specified, the connection will use TLS │ │ if the engine URL uses a 'https' scheme. │ │ --no-tls Whether to disable TLS for the connection to the │ │ Arcade Engine. │ │ --debug -d Show debug information │ │ --help Show this message and exit. │ ╰───────────────────────────────────────────────────────────────────────────────────╯ ``` ## `arcade chat` [Permalink for this section](https://docs.arcade.dev/home/arcade-cli\#arcade-chat) ```nextra-code Usage: arcade chat [OPTIONS] Start a chat with a model in the terminal to test tools ╭─ Options ───────────────────────────────────────────────────────────────────────────╮ │ --model -m TEXT The model to use for prediction. │ │ [default: gpt-4o] │ │ --stream -s Stream the tool output. │ │ --prompt TEXT The system prompt to use for the chat. │ │ [default: None] │ │ --debug -d Show debug information │ │ --host -h TEXT The Arcade Engine address to send chat requests to. │ │ [default: api.arcade.dev] │ │ --port -p INTEGER The port of the Arcade Engine. │ │ [default: None] │ │ --tls Whether to force TLS for the connection to the Arcade │ │ Engine. If not specified, the connection will use TLS if │ │ the engine URL uses a 'https' scheme. │ │ --no-tls Whether to disable TLS for the connection to the Arcade │ │ Engine. │ │ --help Show this message and exit. │ ╰─────────────────────────────────────────────────────────────────────────────────────╯ ``` ## `arcade evals` [Permalink for this section](https://docs.arcade.dev/home/arcade-cli\#arcade-evals) ```nextra-code Run tool calling evaluations ╭─ Arguments ─────────────────────────────────────────────────────────────────────────╮ │ directory [DIRECTORY] Directory containing evaluation files │ │ [default: .] │ ╰─────────────────────────────────────────────────────────────────────────────────────╯ ╭─ Options ───────────────────────────────────────────────────────────────────────────╮ │ --details -d Show detailed results │ │ --max-concurrent -c INTEGER Maximum number of concurrent evaluations │ │ (default: 1) │ │ [default: 1] │ │ --models -m TEXT The models to use for evaluation (default: │ │ gpt-4o). Use commas to separate multiple models. │ │ [default: gpt-4o] │ │ --host -h TEXT The Arcade Engine address to send chat requests │ │ to. │ │ [default: localhost] │ │ --cloud Whether to run evaluations against the Arcade │ │ Cloud Engine. Overrides the 'host' option. │ │ --port -p INTEGER The port of the Arcade Engine. │ │ [default: None] │ │ --tls Whether to force TLS for the connection to the │ │ Arcade Engine. If not specified, the connection │ │ will use TLS if the engine URL uses a 'https' │ │ scheme. │ │ --no-tls Whether to disable TLS for the connection to the │ │ Arcade Engine. │ │ --help Show this message and exit. │ ╰─────────────────────────────────────────────────────────────────────────────────────╯ ``` ## `arcade serve` [Permalink for this section](https://docs.arcade.dev/home/arcade-cli\#arcade-serve) ```nextra-code Usage: arcade serve [OPTIONS] Start tool server worker with locally installed tools ╭─ Options ───────────────────────────────────────────────────────────────────────────╮ │ --host TEXT Host for the app, from settings by default. │ │ [default: 127.0.0.1] │ │ --port -p INTEGER Port for the app, defaults to │ │ [default: 8002] │ │ --no-auth Disable authentication for the worker. Not │ │ recommended for production. | | --reload Enable auto-reloading when toolkit or server files | | change. │ │ --otel-enable Send logs to OpenTelemetry │ │ --mcp Run as a local MCP server over stdio │ │ --debug -d Show debug information │ │ --help Show this message and exit. │ ╰─────────────────────────────────────────────────────────────────────────────────────╯ ``` ## `arcade deploy` [Permalink for this section](https://docs.arcade.dev/home/arcade-cli\#arcade-deploy) ```nextra-code Usage: arcade deploy [OPTIONS] Deploy toolkits to Arcade Cloud ╭─ Options ───────────────────────────────────────────────────────────────────────────╮ │ --deployment-file -d TEXT The deployment file to deploy. │ │ [default: worker.toml] │ │ --host -h TEXT The Arcade Engine host to register the worker │ │ to. │ │ [default: api.arcade.dev] │ │ --port -p INTEGER The port of the Arcade Engine host. │ │ [default: None] │ │ --tls Whether to force TLS for the connection to the │ │ Arcade Engine. If not specified, the connection │ │ will use TLS if the engine URL uses a 'https' │ │ scheme. │ │ --no-tls Whether to disable TLS for the connection to │ │ the Arcade Engine. │ │ --help Show this message and exit. │ ╰─────────────────────────────────────────────────────────────────────────────────────╯ ``` ## `arcade worker` [Permalink for this section](https://docs.arcade.dev/home/arcade-cli\#arcade-worker) ```nextra-code Usage: arcade worker [OPTIONS] COMMAND [ARGS]... Manage deployments of tool servers (logs, list, etc) ╭─ Options ───────────────────────────────────────────────────────────────────────────╮ │ --host -h TEXT The Arcade Engine host. │ │ [default: api.arcade.dev] │ │ --port -p INTEGER The port of the Arcade Engine host. │ │ [default: None] │ │ --tls Whether to force TLS for the connection to the Arcade │ │ Engine. │ │ --no-tls Whether to disable TLS for the connection to the Arcade │ │ Engine. │ │ --help Show this message and exit. │ ╰─────────────────────────────────────────────────────────────────────────────────────╯ ╭─ Commands ──────────────────────────────────────────────────────────────────────────╮ │ list List all workers │ │ enable Enable a worker │ │ disable Disable a worker │ │ rm Remove a worker │ │ logs Get logs for a worker │ ╰─────────────────────────────────────────────────────────────────────────────────────╯ ``` [Secure Auth in Production](https://docs.arcade.dev/home/auth/secure-auth-production "Secure Auth in Production") [Arcade Clients](https://docs.arcade.dev/home/arcade-clients "Arcade Clients") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Asana Auth Provider [Home](https://docs.arcade.dev/home "Home") [Customizing Auth](https://docs.arcade.dev/home/auth-providers "Customizing Auth") Asana # Asana auth provider The Asana auth provider enables tools and agents to call Asana APIs on behalf of a user. Behind the scenes, the Arcade Engine and the Asana auth provider seamlessly manage Asana OAuth 2.0 authorization for your users. Want to quickly get started with Asana services in your agent or AI app? The pre-built [Arcade Asana toolkit](https://docs.arcade.dev/mcp-servers/productivity/asana) is what you want! ## What’s documented here [Permalink for this section](https://docs.arcade.dev/home/auth-providers/asana\#whats-documented-here) This page describes how to use and configure Asana auth with Arcade. This auth provider is used by: - The [Arcade Asana toolkit](https://docs.arcade.dev/mcp-servers/productivity/asana), which provides pre-built tools for interacting with Asana - Your [app code](https://docs.arcade.dev/home/auth-providers/asana#using-asana-auth-in-app-code) that needs to call Asana APIs - Or, your [custom tools](https://docs.arcade.dev/home/auth-providers/asana#using-asana-auth-in-custom-tools) that need to call Asana APIs ## Use Arcade’s Default Asana Auth Provider [Permalink for this section](https://docs.arcade.dev/home/auth-providers/asana\#use-arcades-default-asana-auth-provider) Arcade offers a default Asana auth provider that you can use in the Arcade Cloud Platform. In this case, your users will see `Arcade` as the name of the application that’s requesting permission. If you choose to use Arcade’s Asana auth, you don’t need to configure anything. Follow the [Asana toolkit examples](https://docs.arcade.dev/mcp-servers/productivity/asana) to get started calling Asana tools. ## Use Your Own Asana App Credentials [Permalink for this section](https://docs.arcade.dev/home/auth-providers/asana\#use-your-own-asana-app-credentials) When using your own app credentials, make sure you configure your project to use a [custom user verifier](https://docs.arcade.dev/home/auth/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 Asana app credentials. This way, your users will see your application’s name requesting permission. You can use your own Asana credentials in both the Arcade Cloud Platform or in a [self-hosted Arcade Engine](https://docs.arcade.dev/home/deployment/engine-configuration) instance. Before showing how to configure your Asana app credentials, let’s go through the steps to create an Asana app. ## Create an Asana App [Permalink for this section](https://docs.arcade.dev/home/auth-providers/asana\#create-an-asana-app) Follow the documentation on [Building an App with Asana](https://developers.asana.com/docs/overview). You may create a [developer sandbox account](https://developers.asana.com/docs/developer-sandbox) to test your app before moving to production. When creating your app, use the following settings: - Set an appropriate App name, description and icon. This will be visible to your users authorizing access to your app. - Take note of the **Client ID** and **Client Secret**. - In the OAuth settings: - Under “Redirect URLs”, click **Add Redirect URL** and add the redirect URL generated by Arcade (see below). - Under “Permission Scopes”, select “Full Permissions” - In the “App Listing Details” section, optionally add more information about your app. - In the “Manage Distribution” section, under “Choose a distribution method”, select “Any workspace”. - Optionally, submit your app for the Asana team review. Asana [recently\\ introduced](https://forum.asana.com/t/new-oauth-permission-scopes/1048556) granular permission scopes. This feature is still in preview and the scopes available at the moment do not include all endpoints/actions that the Asana Toolkit needs. For those reasons, Arcade uses the “Full Permissions” scope. ## Configuring your own Asana Auth Provider in Arcade [Permalink for this section](https://docs.arcade.dev/home/auth-providers/asana\#configuring-your-own-asana-auth-provider-in-arcade) There are two ways to configure your Asana app credentials in Arcade: 1. From the Arcade Dashboard GUI 2. By editing the `engine.yaml` file directly (only possible with a self-hosted Arcade Engine) We show both options step-by-step below. Dashboard GUIEngine Configuration YAML ### Configure Asana Auth Using the Arcade Dashboard GUI #### Access the Arcade Dashboard [Permalink for this section](https://docs.arcade.dev/home/auth-providers/asana\#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](http://localhost:9099/dashboard). Adjust the host and port number to match your environment. #### Navigate to the OAuth Providers page [Permalink for this section](https://docs.arcade.dev/home/auth-providers/asana\#navigate-to-the-oauth-providers-page) - Under the **OAuth** section of the Arcade Dashboard left-side menu, click **Providers**. - Click **Add OAuth Provider** in the top right corner. - Select the **Included Providers** tab at the top. - In the **Provider** dropdown, select **Asana**. #### Enter the provider details [Permalink for this section](https://docs.arcade.dev/home/auth-providers/asana\#enter-the-provider-details) - Choose a unique **ID** for your provider (e.g. “my-asana-provider”). - Optionally enter a **Description**. - Enter the **Client ID** and **Client Secret** from your Asana app. - Note the **Redirect URL** generated by Arcade. This must be added to your Asana app’s Redirect URLs. #### Create the provider [Permalink for this section](https://docs.arcade.dev/home/auth-providers/asana\#create-the-provider) Hit the **Create** button and the provider will be ready to be used. When you use tools that require Asana auth using your Arcade account credentials, the Arcade Engine will automatically use this Asana OAuth provider. If you have multiple Asana providers, see [using multiple auth providers of the same type](https://docs.arcade.dev/home/auth-providers#using-multiple-providers-of-the-same-type) for more information. ## Using the Arcade Asana Toolkit [Permalink for this section](https://docs.arcade.dev/home/auth-providers/asana\#using-the-arcade-asana-toolkit) The [Arcade Asana toolkit](https://docs.arcade.dev/mcp-servers/productivity/asana) provides tools to interact with various Asana objects, such as tasks, projects, teams, and users. Refer to the [toolkit documentation and examples](https://docs.arcade.dev/mcp-servers/productivity/asana) to learn how to use the toolkit to build agents and AI apps that interact with Asana services. ## Using Asana auth in app code [Permalink for this section](https://docs.arcade.dev/home/auth-providers/asana\#using-asana-auth-in-app-code) Use the Asana auth provider in your own agents and AI apps to get a user-scoped token for the Asana API. See [authorizing agents with Arcade](https://docs.arcade.dev/home/auth/how-arcade-helps) to understand how this works. Use `client.auth.start()` to get a user token for the Asana API: As explained [above](https://docs.arcade.dev/home/auth-providers/asana#create-an-asana-app), the Asana granular permission scopes are in preview and not yet supported. The `"default"` scope should be used to authorize any action/endpoint you need to call in the Asana API. PythonJavaScript If you are [self-hosting Arcade](https://docs.arcade.dev/home/deployment/engine-configuration), change the `base_url` parameter in the `Arcade` constructor to match your Arcade Engine URL. By default, the Engine will be available at `http://localhost:9099`. ```nextra-code from arcadepy import Arcade client = Arcade(base_url="https://api.arcade.dev") # 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="asana", scopes=["default"], ) 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) # Do something interesting with the token... auth_token = auth_response.context.token ``` You can use the auth token to call the [Get multiple tasks endpoint](https://developers.asana.com/reference/gettasks) and read information about tasks, for example. Any Asana API endpoint can be called with the auth token. ## Using Asana auth in custom tools [Permalink for this section](https://docs.arcade.dev/home/auth-providers/asana\#using-asana-auth-in-custom-tools) You can use the pre-built [Arcade Asana toolkit](https://docs.arcade.dev/mcp-servers/productivity/asana) to quickly build agents and AI apps that interact with Asana. If the pre-built tools in the Asana toolkit don’t meet your needs, you can author your own [custom tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server) that interact with Asana API. Use the `Asana()` auth class to specify that a tool requires authorization with Asana. The authentication token needed to call the Asana API is available in the tool context through the `context.get_auth_token_or_empty()` method. As explained [above](https://docs.arcade.dev/home/auth-providers/asana#create-an-asana-app), the Asana granular permission scopes are in preview and not yet supported. The `"default"` scope should be used as the only scope in all tools. ```nextra-code from typing import Annotated import httpx from arcade_tdk import ToolContext, tool from arcade_tdk.auth import Asana @tool(requires_auth=Asana(scopes=["default"])) async def delete_task( context: ToolContext, task_id: Annotated[str, "The ID of the task to delete."], ) -> Annotated[dict, "Details of the deletion response"]: """Deletes a task.""" url = f"https://api.asana.com/api/1.0/tasks/{task_id}" headers = { "Authorization": f"Bearer {context.get_auth_token_or_empty()}", "Accept": "application/json", } async with httpx.AsyncClient() as client: response = await client.delete(url, headers=headers) response.raise_for_status() return response.json() ``` If you are [self-hosting Arcade](https://docs.arcade.dev/home/deployment/engine-configuration), you will need to restart the Arcade Worker and the Engine for the new tool to be available. Your new tool can be called like demonstrated below: PythonJavaScript If you are self-hosting, change the `base_url` parameter in the `Arcade` constructor to match your Arcade Engine URL. By default, the Engine will be available at `http://localhost:9099`. ```nextra-code from arcadepy import Arcade client = Arcade(base_url="https://api.arcade.dev") # Automatically finds the `ARCADE_API_KEY` env variable USER_ID = "{arcade_user_id}" TOOL_NAME = "Asana.DeleteTask" auth_response = client.tools.authorize(tool_name=TOOL_NAME, user_id=USER_ID) if auth_response.status != "completed": print(f"Click this link to authorize: {auth_response.url}") # Wait for the authorization to complete client.auth.wait_for_completion(auth_response) tool_input = { "task_id": "1234567890", } response = client.tools.execute( tool_name=TOOL_NAME, input=tool_input, user_id=USER_ID, ) print(response.output.value) ``` [Overview](https://docs.arcade.dev/home/auth-providers "Overview") [Atlassian](https://docs.arcade.dev/home/auth-providers/atlassian "Atlassian") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Authorized Tool Calling [Home](https://docs.arcade.dev/home "Home") [Authorization](https://docs.arcade.dev/home/auth/how-arcade-helps "Authorization") Authorized Tool Calling # Authorized Tool Calling Arcade provides an authorization system that handles OAuth 2.0, API keys, and user tokens needed by AI agents to access external services through tools. This means your AI agents can now act on behalf of users securely and privately. With Arcade, developers can now create agents that can as _as the end user of their application_ to perform tasks like: - Creating a new Zoom meeting - Sending or reading email - Answering questions about files in Google Drive. Arcade also allows for actions (tools) to be authorized directly. For example, to access a user’s Gmail account, you can utilize the following guide. ### Initialize the client [Permalink for this section](https://docs.arcade.dev/home/auth/auth-tool-calling\#initialize-the-client) Import the Arcade client in a Python/Javascript script. The client automatically finds API keys set by `arcade login`. PythonJavaScript ```nextra-code from arcadepy import Arcade client = Arcade() # Automatically finds the `ARCADE_API_KEY` env variable ``` ### Authorize a tool directly [Permalink for this section](https://docs.arcade.dev/home/auth/auth-tool-calling\#authorize-a-tool-directly) Many tools require authorization. For example, the `Gmail.ListEmails` tool requires authorization with Google. This authorization must be approved by the user. By approving, the user allows your agent or app to access only the data they’ve approved. PythonJavaScript ```nextra-code # As the developer, you must identify the user you're authorizing # and pass a unique identifier for them (e.g. an email or user ID) to Arcade: USER_ID = "{arcade_user_id}" # Request access to the user's Gmail account auth_response = client.tools.authorize( tool_name="Gmail.ListEmails", user_id=USER_ID, ) if auth_response.status != "completed": print(f"Click this link to authorize: {auth_response.url}") ``` This will print a URL that the user must visit to approve the authorization. ### Check for authorization status [Permalink for this section](https://docs.arcade.dev/home/auth/auth-tool-calling\#check-for-authorization-status) You can wait for the authorization to complete using the following methods: PythonJavaScript ```nextra-code client.auth.wait_for_completion(auth_response) ``` ### Call the tool with authorization [Permalink for this section](https://docs.arcade.dev/home/auth/auth-tool-calling\#call-the-tool-with-authorization) Once the user has approved the action, you can run the tool. You only need to pass the `user_id`: PythonJavaScript ```nextra-code emails_response = client.tools.execute( tool_name="Gmail.ListEmails", user_id=USER_ID, ) print(emails_response) ``` Arcade remembers the user’s authorization tokens, so you don’t have to! Next time the user runs the same tool, they won’t have to go through the authorization process again until the auth expires or is revoked. ### How it works [Permalink for this section](https://docs.arcade.dev/home/auth/auth-tool-calling\#how-it-works) When you call a tool with `client.tools.execute()`, Arcade: 1. Checks for authorization. 2. Routes the request to the tool’s provider. 3. Returns the tool’s response. With `client.tools.authorize()`, you can also authorize tools for later use. These APIs give you programmatic control over tool calling. ### Next steps [Permalink for this section](https://docs.arcade.dev/home/auth/auth-tool-calling\#next-steps) Arcade also allows you to [build your own tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server) to integrate any custom functionality or API to your Agent or AI workflows. Your tools can use the [service providers supported by Arcade](https://docs.arcade.dev/home/auth-providers) or you can integrate with any [OAuth2-compatible service](https://docs.arcade.dev/home/auth-providers/oauth2). [How Arcade Helps](https://docs.arcade.dev/home/auth/how-arcade-helps "How Arcade Helps") [Checking Authorization Status](https://docs.arcade.dev/home/auth/tool-auth-status "Checking Authorization Status") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Jira Toolkit Reference [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Productivity & Docs](https://docs.arcade.dev/mcp-servers/productivity/asana "Productivity & Docs") [Jira](https://docs.arcade.dev/mcp-servers/productivity/jira "Jira") Reference # Jira Reference Below is a reference of enumerations used by some tools in the Jira toolkit: ## SprintState [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/jira/reference\#sprintstate) Sprint states are used in the `Jira.ListSprints` tool to filter sprints. The following enumeration values represent the possible states supported by the Jira API, either individually or in combination: - **FUTURE**: `future` - **ACTIVE**: `active` - **CLOSED**: `closed` - **FUTURE\_AND\_ACTIVE**: `future_and_active` - **FUTURE\_AND\_CLOSED**: `future_and_closed` - **ACTIVE\_AND\_CLOSED**: `active_and_closed` - **ALL**: `all` ## PrioritySchemeOrderBy [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/jira/reference\#priorityschemeorderby) - **NAME\_ASCENDING**: `name ascending` - **NAME\_DESCENDING**: `name descending` ## IssueCommentOrderBy [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/jira/reference\#issuecommentorderby) - **CREATED\_DATE\_ASCENDING**: `created_date_ascending` - **CREATED\_DATE\_DESCENDING**: `created_date_descending` [Environment Variables](https://docs.arcade.dev/mcp-servers/productivity/jira/environment_variables "Environment Variables") [Linear](https://docs.arcade.dev/mcp-servers/productivity/linear "Linear") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Confluence Toolkit [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Productivity & Docs](https://docs.arcade.dev/mcp-servers/productivity/asana "Productivity & Docs") Confluence # Confluence **Description:** Enable agents to interact with Confluence. **Author:** Arcade **Auth:** User authorizationvia the [Atlassian auth provider](https://docs.arcade.dev/home/auth-providers/atlassian) [![PyPI Version](https://img.shields.io/pypi/v/arcade_confluence)](https://pypi.org/project/arcade_confluence/)[![License](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/arcadeai/arcade-ai/blob/main/LICENSE)[![Python Versions](https://img.shields.io/pypi/pyversions/arcade_confluence)](https://pypi.org/project/arcade_confluence/)[![Wheel Status](https://img.shields.io/pypi/wheel/arcade_confluence)](https://pypi.org/project/arcade_confluence/)[![Downloads](https://img.shields.io/pypi/dm/arcade_confluence)](https://pypi.org/project/arcade_confluence/) The Arcade Confluence MCP Server provides a pre-built set of tools for interacting with Confluence. These tools make it easy to build agents and AI apps that can: - Work with pages, spaces, and attachments - Search for content ## Available tools [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/confluence\#available-tools) These tools are currently available in the Arcade Confluence toolkit. | Tool Name | Description | | --- | --- | | Confluence.CreatePage | Create a new page at the root of the given space. | | Confluence.UpdatePageContent | Update a page's content. | | Confluence.RenamePage | Rename a page by changing its title. | | Confluence.GetPage | Retrieve a SINGLE page's content by its ID or title. | | Confluence.GetPagesById | Get the content of MULTIPLE pages by their ID in a single efficient request. | | Confluence.ListPages | Get the content of multiple pages by their ID. | | Confluence.ListAttachments | List attachments in a workspace. | | Confluence.GetAttachmentsForPage | Get attachments for a page by its ID or title. | | Confluence.SearchContent | Search for content in Confluence. | | Confluence.GetSpace | Get the details of a space by its ID or key. | | Confluence.ListSpaces | List all spaces sorted by name in ascending order. | | Confluence.GetSpaceHierarchy | Retrieve the full hierarchical structure of a Confluence space as a tree structure. | If you need to perform an action that’s not listed here, you can [get in touch with us](mailto:contact@arcade.dev) to request a new tool, or [create your own tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server) with the [Confluence auth provider](https://docs.arcade.dev/home/auth-providers/atlassian). ## Confluence.CreatePage [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/confluence\#confluencecreatepage) Create a new page at the root of the given space. **Parameters** - **`space_identifier`** _(string, required)_: The ID or title of the space to create the page in - **`title`** _(string, required)_: The title of the page - **`content`** _(string, required)_: The content of the page. Only plain text is supported - **`parent_id`** _(string, optional)_: The ID of the parent. If not provided, the page will be created at the root of the space - **`is_private`** _(bool, optional)_: If true, then only the user who creates this page will be able to see it. Defaults to False - **`is_draft`** _(bool, optional)_: If true, then the page will be created as a draft. Defaults to False See Example > * * * ## Confluence.UpdatePageContent [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/confluence\#confluenceupdatepagecontent) Update a page’s content. **Parameters** - **`page_identifier`** _(string, required)_: The ID or title of the page to update. Numerical titles are NOT supported - **`content`** _(string, required)_: The content of the page. Only plain text is supported - **`update_mode`** _(enum ( [PageUpdateMode](https://docs.arcade.dev/mcp-servers/productivity/confluence#pageupdatemode)), optional)_: The mode of update. Defaults to ‘append’ See Example > ## Confluence.RenamePage [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/confluence\#confluencerenamepage) Rename a page by changing its title. **Parameters** - **`page_identifier`** _(string, required)_: The ID or title of the page to rename. Numerical titles are NOT supported - **`title`** _(string, required)_: The title of the page See Example > * * * ## Confluence.GetPage [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/confluence\#confluencegetpage) Retrieve a SINGLE page’s content by its ID or title. If a title is provided, then the first page with an exact matching title will be returned. IMPORTANT: For retrieving MULTIPLE pages, use `get_pages_by_id` instead for a massive performance and efficiency boost. If you call this function multiple times instead of using `get_pages_by_id`, then the universe will explode. **Parameters** - **`page_identifier`** _(string, required)_: Can be a page’s ID or title. Numerical titles are NOT supported See Example > * * * ## Confluence.GetPagesById [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/confluence\#confluencegetpagesbyid) Get the content of MULTIPLE pages by their ID in a single efficient request. IMPORTANT: Always use this function when you need to retrieve content from more than one page, rather than making multiple separate calls to get\_page, because this function is significantly more efficient than calling get\_page multiple times. **Parameters** - **`page_ids`** _(list of strings, required)_: The IDs of the pages to get. IDs are numeric. Titles of pages are NOT supported. Maximum of 250 page ids supported See Example > * * * ## Confluence.ListPages [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/confluence\#confluencelistpages) Get the content of multiple pages by their ID. **Parameters** - **`space_ids`** _(list of strings, optional)_: Restrict the response to only include pages in these spaces. Only space IDs are supported. Titles of spaces are NOT supported. If not provided, then no restriction is applied. Maximum of 100 space ids supported - **`sort_by`** _(enum ( [PageSortOrder](https://docs.arcade.dev/mcp-servers/productivity/confluence#pagesortorder)), optional)_: The order of the pages to sort by. Defaults to created-date-newest-to-oldest - **`limit`** _(int, optional)_: The maximum number of pages to return. Defaults to 25. Max is 250 - **`pagination_token`** _(string, optional)_: The pagination token to use for the next page of results See Example > * * * ## Confluence.ListAttachments [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/confluence\#confluencelistattachments) List attachments in a workspace. **Parameters** - **`sort_order`** _(enum ( [AttachmentSortOrder](https://docs.arcade.dev/mcp-servers/productivity/confluence#attachmentsortorder)), optional)_: The order of the attachments to sort by. Defaults to created-date-newest-to-oldest - **`limit`** _(int, optional)_: The maximum number of attachments to return. Defaults to 25. Max is 250 - **`pagination_token`** _(string, optional)_: The pagination token to use for the next page of results See Example > * * * ## Confluence.GetAttachmentsForPage [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/confluence\#confluencegetattachmentsforpage) Get attachments for a page by its ID or title. If a page title is provided, then the first page with an exact matching title will be returned. **Parameters** - **`page_identifier`** _(string, required)_: The ID or title of the page to get attachments for - **`limit`** _(int, optional)_: The maximum number of attachments to return. Defaults to 25. Max is 250 - **`pagination_token`** _(string, optional)_: The pagination token to use for the next page of results See Example > * * * ## Confluence.SearchContent [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/confluence\#confluencesearchcontent) Search for content in Confluence. The search is performed across all content in the authenticated user’s Confluence workspace. All search terms in Confluence are case insensitive. You can use the parameters in different ways: - must\_contain\_all: For AND logic - content must contain ALL of these - can\_contain\_any: For OR logic - content can contain ANY of these - Combine them: must\_contain\_all=\[‘banana’\] AND can\_contain\_any=\[‘database’, ‘guide’\] **Parameters** - **`must_contain_all`** _(list of strings, optional)_: Words/phrases that content MUST contain (AND logic). Each item can be: - Single word: ‘banana’ - content must contain this word - Multi-word phrase: ‘How to’ - content must contain all these words (in any order) - All items in this list must be present for content to match - Example: \[‘banana’, ‘apple’\] finds content containing BOTH ‘banana’ AND ‘apple’ - **`can_contain_any`** _(list of strings, optional)_: Words/phrases where content can contain ANY of these (OR logic). Each item can be: - Single word: ‘project’ - content containing this word will match - Multi-word phrase: ‘pen & paper’ - content containing all these words will match - Content matching ANY item in this list will be included - Example: \[‘project’, ‘documentation’\] finds content with ‘project’ OR ‘documentation’ - **`enable_fuzzy`** _(bool, optional)_: Enable fuzzy matching to find similar terms (e.g. ‘roam’ will find ‘foam’). Defaults to True - **`limit`** _(int, optional)_: Maximum number of results to return (1-100). Defaults to 25 See Example > * * * ## Confluence.GetSpace [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/confluence\#confluencegetspace) Get the details of a space by its ID or key. **Parameters** - **`space_identifier`** _(string, required)_: Can be a space’s ID or key. Numerical keys are NOT supported See Example > * * * ## Confluence.ListSpaces [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/confluence\#confluencelistspaces) List all spaces sorted by name in ascending order. **Parameters** - **`limit`** _(int, optional)_: The maximum number of spaces to return. Defaults to 25. Max is 250 - **`pagination_token`** _(string, optional)_: The pagination token to use for the next page of results See Example > * * * ## Confluence.GetSpaceHierarchy [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/confluence\#confluencegetspacehierarchy) Retrieve the full hierarchical structure of a Confluence space as a tree structure. Only structural metadata is returned (not content). The response is akin to the sidebar in the Confluence UI. Includes all pages, folders, whiteboards, databases, smart links, etc. organized by parent-child relationships. **Parameters** - **`space_identifier`** _(string, required)_: Can be a space’s ID or key. Numerical keys are NOT supported See Example > ## Auth [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/confluence\#auth) The Arcade Notion toolkit uses the [Notion auth provider](https://docs.arcade.dev/home/auth-providers/notion) to connect to users’ Notion accounts. With the Arcade Cloud Platform, there’s nothing to configure. Your users will see `Arcade` as the name of the application that’s requesting permission. With a self-hosted installation of Arcade, you need to [configure the Notion auth provider](https://docs.arcade.dev/home/auth-providers/notion#configuring-notion-auth) with your own Notion app credentials. * * * ## Reference [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/confluence\#reference) ### PageUpdateMode [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/confluence\#pageupdatemode) The mode of update. - **`prepend`** _(string: “prepend”)_ - **`append`** _(string: “append”)_ - **`replace`** _(string: “replace”)_ ### PageSortOrder [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/confluence\#pagesortorder) The order of the pages to sort by. - **`id-ascending`**: Sort by ID in ascending order. - **`id-descending`**: Sort by ID in descending order. - **`title-ascending`**: Sort by title in ascending order. - **`title-descending`**: Sort by title in descending order. - **`created-date-oldest-to-newest`**: Sort by created date from oldest to newest. - **`created-date-newest-to-oldest`**: Sort by created date from newest to oldest. - **`modified-date-oldest-to-newest`**: Sort by modified date from oldest to newest. - **`modified-date-newest-to-oldest`**: Sort by modified date from newest to oldest. ### AttachmentSortOrder [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/confluence\#attachmentsortorder) The order of the attachments to sort by. - **`created-date-oldest-to-newest`**: Sort by created date from oldest to newest. - **`created-date-newest-to-oldest`**: Sort by created date from newest to oldest. - **`modified-date-oldest-to-newest`**: Sort by modified date from oldest to newest. - **`modified-date-newest-to-oldest`**: Sort by modified date from newest to oldest. ## Get Building [Use tools hosted on Arcade Cloud\\ \\ Arcade tools are hosted by our cloud platform and ready to be used in your agents. Learn how.](https://docs.arcade.dev/home/quickstart) [Self Host Arcade tools\\ \\ Arcade tools can be self-hosted on your own infrastructure. Learn more about self-hosting.\\ \\ ```\\ pip install arcade_confluence\\ ```](https://docs.arcade.dev/home/hosting-overview) [Reference](https://docs.arcade.dev/mcp-servers/productivity/asana/reference "Reference") [Dropbox](https://docs.arcade.dev/mcp-servers/productivity/dropbox/dropbox "Dropbox") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Arcade Tools Integration [Home](https://docs.arcade.dev/home "Home") [Google ADK](https://docs.arcade.dev/home/google-adk/overview "Google ADK") Using Arcade tools ## Use Arcade with Google ADK [Permalink for this section](https://docs.arcade.dev/home/google-adk/use-arcade-tools\#use-arcade-with-google-adk) In this guide, let’s explore how to integrate Arcade tools into your Google ADK application. Follow the step-by-step instructions below. ### Prerequisites [Permalink for this section](https://docs.arcade.dev/home/google-adk/use-arcade-tools\#prerequisites) - [Obtain an Arcade API key](https://docs.arcade.dev/home/api-keys) ### Set up your environment [Permalink for this section](https://docs.arcade.dev/home/google-adk/use-arcade-tools\#set-up-your-environment) Install the required packages, and ensure your environment variables are set with your Arcade API key: ```nextra-code pip install google-adk-arcade ``` ### Configure API keys [Permalink for this section](https://docs.arcade.dev/home/google-adk/use-arcade-tools\#configure-api-keys) Provide your Arcade and Google API keys. You can store it in environment variables or directly in your code: > Need an Arcade API key? Visit the [Get an API key](https://docs.arcade.dev/home/api-keys) page to create one. ```nextra-code export ARCADE_API_KEY='YOUR_ARCADE_API_KEY' export GOOGLE_API_KEY='YOUR_GOOGLE_API_KEY' export GOOGLE_GENAI_USE_VERTEXAI=FALSE ``` ### Create and manage Arcade tools [Permalink for this section](https://docs.arcade.dev/home/google-adk/use-arcade-tools\#create-and-manage-arcade-tools) Use the `get_arcade_tools` function to retrieve tools from specific toolkits: ```nextra-code from arcadepy import AsyncArcade from google_adk_arcade.tools import get_arcade_tools # Initialize the Arcade client client = AsyncArcade() # Get all tools from the "Gmail" toolkit tools = await get_arcade_tools(client, toolkits=["gmail"]) # You can request multiple toolkits at once tools = await get_arcade_tools(client, toolkits=["gmail", "github", "linkedin"]) # You can request specific tools tools = await get_arcade_tools(client, tools=["Gmail_ListEmails", "Slack_ListUsers", "Slack_SendDmToUser"]) ``` ### Authorize the tools [Permalink for this section](https://docs.arcade.dev/home/google-adk/use-arcade-tools\#authorize-the-tools) Enable the tools for your agents: ```nextra-code # authorize the tools for tool in google_tools: result = await client.tools.authorize( tool_name=tool.name, user_id=user_id ) if result.status != "completed": print(f"Click this link to authorize {tool.name}:\n{result.url}") await client.auth.wait_for_completion(result) ``` ### Set up the agent with Arcade tools [Permalink for this section](https://docs.arcade.dev/home/google-adk/use-arcade-tools\#set-up-the-agent-with-arcade-tools) Create an agent and provide it with the Arcade tools: ```nextra-code # import the Google ADK requirements from google.adk import Agent, Runner from google.adk.artifacts import InMemoryArtifactService from google.adk.sessions import InMemorySessionService from google.genai import types # create a new session and artifact services session_service = InMemorySessionService() artifact_service = InMemoryArtifactService() # Create an agent with Gmail tools google_agent = Agent( model="gemini-2.0-flash", name="google_tool_agent", instruction="I can use Gmail tools to manage an inbox!", description="An agent equipped with tools to read Gmail emails." tools=tools, ) ``` ### Run the agent with user context [Permalink for this section](https://docs.arcade.dev/home/google-adk/use-arcade-tools\#run-the-agent-with-user-context) Run the agent, providing a user\_id for tool authorization: ```nextra-code # create a new session and pass the user id into the context session = await session_service.create_session( app_name=app_name, user_id=user_id, state={ "user_id": user_id, } ) # create a new runner with the agent and services runner = Runner( app_name=app_name, agent=google_agent, artifact_service=artifact_service, session_service=session_service, ) # pass a prompt to the agent and stream the response user_input = "summarize my latest 3 emails" content = types.Content( role='user', parts=[types.Part.from_text(text=user_input)] ) for event in runner.run( user_id=user_id, session_id=session.id, new_message=content, ): if event.content.parts and event.content.parts[0].text: print(f'** {event.author}: {event.content.parts[0].text}') ``` ### Complete example [Permalink for this section](https://docs.arcade.dev/home/google-adk/use-arcade-tools\#complete-example) Here’s a complete example putting everything together: ```nextra-code import asyncio from arcadepy import AsyncArcade from google.adk import Agent, Runner from google.adk.artifacts import InMemoryArtifactService from google.adk.sessions import InMemorySessionService from google.genai import types from google_adk_arcade.tools import get_arcade_tools async def main(): app_name = 'my_app' user_id = 'mateo@arcade.dev' session_service = InMemorySessionService() artifact_service = InMemoryArtifactService() client = AsyncArcade() google_tools = await get_arcade_tools(client, tools=["Gmail.ListEmails"]) # authorize the tools for tool in google_tools: result = await client.tools.authorize( tool_name=tool.name, user_id=user_id ) if result.status != "completed": print(f"Click this link to authorize {tool.name}:\n{result.url}") await client.auth.wait_for_completion(result) google_agent = Agent( model="gemini-2.0-flash", name="google_tool_agent", instruction="I can use Gmail tools to manage an inbox!", description="An agent equipped with tools to read Gmail emails. " "Make sure to call gmail_listemails to read and summarize" " emails", tools=google_tools, ) session = await session_service.create_session( app_name=app_name, user_id=user_id, state={ "user_id": user_id, } ) runner = Runner( app_name=app_name, agent=google_agent, artifact_service=artifact_service, session_service=session_service, ) user_input = "summarize my latest 3 emails" content = types.Content( role='user', parts=[types.Part.from_text(text=user_input)] ) for event in runner.run( user_id=user_id, session_id=session.id, new_message=content, ): if event.content.parts and event.content.parts[0].text: print(f'** {event.author}: {event.content.parts[0].text}') if __name__ == '__main__': asyncio.run(main()) ``` ## Tips for selecting tools [Permalink for this section](https://docs.arcade.dev/home/google-adk/use-arcade-tools\#tips-for-selecting-tools) - **Relevance**: Pick only the tools you need. Avoid using all tools at once. - **User identification**: Always provide a unique and consistent `user_id` for each user. Use your internal or database user ID, not something entered by the user. ## Next steps [Permalink for this section](https://docs.arcade.dev/home/google-adk/use-arcade-tools\#next-steps) Now that you have integrated Arcade tools into your Google ADK application, you can: - Experiment with different toolkits, such as “github” or “linkedin” - Customize the agent’s instructions for specific tasks - Try out multi-agent systems using different Arcade tools - Build your own custom tools with the Arcade Tool SDK Enjoy exploring Arcade and building powerful AI-enabled Python applications! [Overview](https://docs.arcade.dev/home/google-adk/overview "Overview") [Overview](https://docs.arcade.dev/home/mastra/overview "Overview") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Arcade Zoom Integration [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Social & Communication](https://docs.arcade.dev/mcp-servers/social-communication/discord "Social & Communication") [Zoom](https://docs.arcade.dev/mcp-servers/social-communication/zoom "Zoom") Install # Arcade for Zoom ## Integrate Arcade with your Zoom account [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/zoom/install\#integrate-arcade-with-your-zoom-account) Arcade securely connects your AI agents to APIs, data, code, and other systems via Tools. Our Zoom integration allows Arcade’s tools to connect to your Zoom account, helping you manage meetings and gather information more efficiently. You can leverage this app in Arcade’s Playground when you log in to the Arcade Dashboard, or in your own applications. While the Arcade app for Zoom does not directly expose a Large Language Model (LLM) to you, you will likely use Arcade’s tools in conjunction with an LLM. When using LLMs, there’s always potential to generate inaccurate responses, summaries, or other output. Arcade’s Zoom app brings Arcade’s powerful AI tool-calling capabilities to your meeting management. The Arcade app for Zoom can: - List your upcoming meetings within the next 24 hours - Retrieve meeting invitation details for specific meetings - Find the participants and/or registrants for a specific meeting - and more! For more details on what tools are available and what scopes they require, see the [Zoom toolkit documentation](https://docs.arcade.dev/mcp-servers/social-communication/zoom). The Arcade Zoom app requires an active Arcade account. If you don’t have one yet, [sign up for free](https://api.arcade.dev/signup). ## How it works [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/zoom/install\#how-it-works) ### Start using Arcade’s Zoom tools [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/zoom/install\#start-using-arcades-zoom-tools) Use Arcade’s [tools for Zoom](https://docs.arcade.dev/mcp-servers/social-communication/zoom) to: - List your upcoming meetings - Get meeting invitation details - Find meeting participants and registrants - and more! Try leveraging the Arcade Zoom tools in the Arcade Playground by [chatting with an LLM](https://api.arcade.dev/dashboard/playground/chat) asking, “What meetings do I have scheduled today?” or [executing Zoom tools directly](https://api.arcade.dev/dashboard/playground/execute?toolId=ListUpcomingMeetings&toolkits=%5B%5D&authProviders=%5B%5D&secrets=%5B%5D&input=%7B%22user_id%22%3A%22me%22%7D) without interacting with an LLM. When using LLMs with Zoom, responses may sometimes contain inaccuracies. Always review AI-generated content before taking action. ## Support and troubleshooting [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/zoom/install\#support-and-troubleshooting) If you encounter any issues connecting Arcade to your Zoom account: 1. Verify you’ve granted all required permissions during authorization 2. Ensure your Zoom account is active and in good standing 3. Check that you’re using a compatible browser (Chrome, Firefox, Safari, or Edge) 4. Clear your browser cache and cookies, then try again ### Adding the Arcade Zoom app to your Zoom account [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/zoom/install\#adding-the-arcade-zoom-app-to-your-zoom-account) If using the Arcade playground directly did not work, you can try adding the Arcade Zoom app to your Zoom account by clicking the “Connect with Zoom” button below. [![](https://docs.arcade.dev/images/icons/zoom_fav.svg)Connect with Zoom](https://docs.arcade.dev/mcp-servers/social-communication/zoom/install#) You’ll need to have a Zoom account with appropriate permissions to allow Arcade to access your Zoom data. ### Authorize the requested permissions [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/zoom/install\#authorize-the-requested-permissions) When connecting Arcade to your Zoom account, depending on which Arcade tools you’ll be using, you’ll be asked to authorize specific permissions: - **user:read:user** \- Allows Arcade to access basic profile information - **user:read:email** \- Enables Arcade to access your email address - **meeting:read:meetings** \- Enables Arcade to list your upcoming meetings - **meeting:read:invitation** \- Enables Arcade to read meeting invitation details These permissions ensure Arcade can perform the necessary functions while protecting your privacy and security. ### Removing the Arcade Zoom app [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/zoom/install\#removing-the-arcade-zoom-app) To remove the Arcade Zoom app from your Zoom account, you can do so by going to the [Zoom App Marketplace](https://marketplace.zoom.us/user/installed) and uninstalling the app. Arcade only stores authentication tokens, not your Zoom data. These tokens become invalid when you uninstall the app and will eventually expire. To remove tokens immediately, delete the Zoom Auth Provider from the [Arcade Dashboard](https://api.arcade.dev/dashboard/auth/oauth). ## Privacy and security [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/zoom/install\#privacy-and-security) Arcade takes the security of your Zoom data seriously: - We only request the minimum permissions needed for our tools to function - Your Zoom credentials are never stored on our servers - All communication between Arcade and Zoom is encrypted - You can revoke Arcade’s access to your Zoom account at any time through your [Zoom App Marketplace](https://marketplace.zoom.us/user/installed) ## Next steps [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/zoom/install\#next-steps) The Arcade Zoom app is a sample of what Arcade can do with your Zoom account. For your own applications, you might want to [create your own Zoom app](https://docs.arcade.dev/home/auth-providers/zoom). Creating your own Zoom application will allow you to brand the app, customize the permissions, and more. ## Need help? [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/zoom/install\#need-help) If you have any questions or need assistance: - Check our [Zoom toolkit documentation](https://docs.arcade.dev/mcp-servers/social-communication/zoom) - [Contact our support team](https://docs.arcade.dev/home/contact-us) [Zoom](https://docs.arcade.dev/mcp-servers/social-communication/zoom "Zoom") [Reference](https://docs.arcade.dev/mcp-servers/social-communication/microsoft_teams/reference "Reference") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Arcade Installation Overview [Home](https://docs.arcade.dev/home "Home") Local DeploymentInstallOverview # Installation Explore the different installation options for Arcade. - Set up Arcade [locally](https://docs.arcade.dev/home/deployment/engine-configuration) - Run Arcade in [Docker](https://docs.arcade.dev/home/local-deployment/install/docker) - Kubernetes (coming soon) ## Client [Permalink for this section](https://docs.arcade.dev/home/deployment/engine-configuration\#client) The Arcade Client can be installed with `pip` by following the [quickstart guide](https://docs.arcade.dev/home/quickstart). ## CLI [Permalink for this section](https://docs.arcade.dev/home/deployment/engine-configuration\#cli) The Arcade CLI & SDK can be installed with `pip` by following the [CLI guide](https://docs.arcade.dev/home/arcade-cli). ## Engine [Permalink for this section](https://docs.arcade.dev/home/deployment/engine-configuration\#engine) ### Brew and APT [Permalink for this section](https://docs.arcade.dev/home/deployment/engine-configuration\#brew-and-apt) The `arcade-engine` binary can be downloaded through system package managers like `brew` or `apt` following the instructions [here](https://docs.arcade.devhttp://localhost:3000/en/home/deployment/engine-configuration) ### Binary [Permalink for this section](https://docs.arcade.dev/home/deployment/engine-configuration\#binary) The `arcade-engine` binary can be downloaded through system package managers like `brew` or `apt-get` or [directly](https://deb.arcade.dev/ubuntu/dists/stable/main/) ### Docker [Permalink for this section](https://docs.arcade.dev/home/deployment/engine-configuration\#docker) Containers can be downloaded from [GHCR](https://github.com/orgs/ArcadeAI/packages). Apple Silicon Macs and Intel Chip Macs can use the linux/arm64 and linux/amd64 images respectively. ### Kubernetes [Permalink for this section](https://docs.arcade.dev/home/deployment/engine-configuration\#kubernetes) Kubernetes deployments are not yet supported but coming soon. [Hybrid Worker](https://docs.arcade.dev/home/deployment/on-prem-mcp "Hybrid Worker") [Local](https://docs.arcade.dev/home/deployment/engine-configuration "Local") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Arcade Slack Integration [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Social & Communication](https://docs.arcade.dev/mcp-servers/social-communication/discord "Social & Communication") [Slack](https://docs.arcade.dev/mcp-servers/social-communication/slack "Slack") Install # Arcade for Slack ## Integrate Arcade with your Slack workspace [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack/install\#integrate-arcade-with-your-slack-workspace) Arcade securely connects your AI agents to APIs, data, code, and other systems via Tools. Our integration for Slack allows Arcade’s tools to connect to your Slack workspace, helping your team work more efficiently. You can leverage this app in Arcade’s Playground when you log in to the Arcade Dashboard, or in your own applications. While the Arcade app for Slack does not directly expose a Large Language Model (LLM) to you, you will likely use Arcade’s tools in conjunction with an LLM. When using LLMs, there’s always potential to generate inaccurate responses, summaries, or other output. Arcade’s sample app for Slack brings Arcade’s powerful AI tool-calling capabilities to your team’s everyday conversations. The Arcade app for Slack can: - Send messages to your Slack channels and direct messages on your behalf - Find information in your Slack channels and direct messages - Generate content, summaries, and responses for messages you receive - and more! For more details on what tools are available and what scopes they require, see the [Slack toolkit documentation](https://docs.arcade.dev/mcp-servers/social-communication/slack). The Arcade app for Slack requires an active Arcade account. If you don’t have one yet, [sign up for free](https://api.arcade.dev/signup). ## How it works [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack/install\#how-it-works) ### Install the Arcade app for Slack [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack/install\#install-the-arcade-app-for-slack) Click the “Add to Slack” button below to install Arcade in your workspace. [![Add to Slack](https://platform.slack-edge.com/img/add_to_slack.png)](https://docs.arcade.dev/mcp-servers/social-communication/slack/install#) You’ll need to be a workspace admin or have permission to install apps to add Arcade to your Slack workspace. ### Invite Arcade to your channels [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack/install\#invite-arcade-to-your-channels) Invite Arcade to any channel or direct message by typing `/invite @Arcade` to allow it to read and interact with content in that channel. ### Start using Arcade’s Slack tools [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack/install\#start-using-arcades-slack-tools) Use Arcade’s [tools for Slack](https://docs.arcade.dev/mcp-servers/social-communication/slack) to: - Send messages to channels and DMs - Find information in conversations - Generate summaries of discussions Try leveraging the Arcade tools for Slack in the Arcade Playground by [chatting with an LLM](https://api.arcade.dev/dashboard/playground/chat) asking, “What are the last 5 messages in the general Slack channel?” or [executing Slack tools directly](https://api.arcade.dev/dashboard/playground/execute?toolId=GetMessagesInChannelByName&toolkits=%5B%5D&authProviders=%5B%5D&secrets=%5B%5D&input=%7B%22owner%22%3A%22ArcadeAI%22%2C%22name%22%3A%22arcade-ai%22%2C%22starred%22%3A%22true%22%2C%22channel_name%22%3A%22general%22%2C%22limit%22%3A%225%22%7D) without interacting with an LLM. When using LLMs with Slack, responses may sometimes contain inaccuracies. Always review AI-generated content before taking action. ## Next steps [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack/install\#next-steps) The Arcade app for Slack is a sample for what Arcade can do with your Slack workspace. It’s likely that for your own applications you’ll need to [create your own app for Slack](https://docs.arcade.dev/home/auth-providers/slack). Creating your own application for Slack will allow you to brand the app, customize the permissions, and more. ## Need help? [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack/install\#need-help) If you have any questions or need assistance: - Check our [Slack toolkit documentation](https://docs.arcade.dev/mcp-servers/social-communication/slack) - [Contact our support team](https://docs.arcade.dev/home/contact-us) [Slack](https://docs.arcade.dev/mcp-servers/social-communication/slack "Slack") [Reference](https://docs.arcade.dev/mcp-servers/social-communication/slack/reference "Reference") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Authorize LangChain Tools [Home](https://docs.arcade.dev/home "Home") [LangChain](https://docs.arcade.dev/home/langchain/use-arcade-tools "LangChain") Authorizing existing tools ## Authorize Existing Tools [Permalink for this section](https://docs.arcade.dev/home/langchain/auth-langchain-tools\#authorize-existing-tools) In this guide, we’ll show you how to authorize LangChain tools like the `GmailToolkit` using Arcade. You may already have tools you want to use, and this guide will show you how to authorize them. Arcade handles retrieving, authorizing, and managing tokens so you don’t have to. For complete working examples, see our [Python](https://github.com/ArcadeAI/arcade-ai/blob/main/examples/langchain/langchain_tool_arcade_auth.py) and [JavaScript](https://github.com/ArcadeAI/arcade-ai/blob/main/examples/langchain-ts/langchain-tool-arcade-auth.ts) examples. ### Prerequisites [Permalink for this section](https://docs.arcade.dev/home/langchain/auth-langchain-tools\#prerequisites) - [Obtain an Arcade API key](https://docs.arcade.dev/home/api-keys) ### Install the required packages [Permalink for this section](https://docs.arcade.dev/home/langchain/auth-langchain-tools\#install-the-required-packages) Instead of the `langchain_arcade` package, you only need the `arcadepy` package to authorize existing tools since Arcade tools are not being used. PythonJavaScript ```nextra-code pip install langchain-openai langgraph arcadepy langchain-google-community ``` ### Import the necessary packages [Permalink for this section](https://docs.arcade.dev/home/langchain/auth-langchain-tools\#import-the-necessary-packages) PythonJavaScript ```nextra-code import os from arcadepy import Arcade from google.oauth2.credentials import Credentials from langchain_google_community import GmailToolkit from langchain_google_community.gmail.utils import build_resource_service from langchain_openai import ChatOpenAI from langgraph.prebuilt import create_react_agent ``` ### Initialize the Arcade client [Permalink for this section](https://docs.arcade.dev/home/langchain/auth-langchain-tools\#initialize-the-arcade-client) PythonJavaScript ```nextra-code api_key = os.getenv("ARCADE_API_KEY") client = Arcade(api_key=api_key) ``` ### Start the authorization process for Gmail [Permalink for this section](https://docs.arcade.dev/home/langchain/auth-langchain-tools\#start-the-authorization-process-for-gmail) PythonJavaScript ```nextra-code user_id = "{arcade_user_id}" auth_response = client.auth.start( user_id=user_id, provider="google", scopes=["https://www.googleapis.com/auth/gmail.readonly"], ) ``` ### Prompt the user to authorize [Permalink for this section](https://docs.arcade.dev/home/langchain/auth-langchain-tools\#prompt-the-user-to-authorize) PythonJavaScript ```nextra-code if auth_response.status != "completed": print("Please authorize the application in your browser:") print(auth_response.url) ``` The `auth_response.status` will be `"completed"` if the user has already authorized the application, so they won’t be prompted to authorize again. ### Wait for authorization completion [Permalink for this section](https://docs.arcade.dev/home/langchain/auth-langchain-tools\#wait-for-authorization-completion) PythonJavaScript ```nextra-code auth_response = client.auth.wait_for_completion(auth_response) ``` The `wait_for_completion` method will do nothing if the user has already authorized the application. ### Use the token to initialize the Gmail toolkit [Permalink for this section](https://docs.arcade.dev/home/langchain/auth-langchain-tools\#use-the-token-to-initialize-the-gmail-toolkit) PythonJavaScript ```nextra-code creds = Credentials(auth_response.context.token) api_resource = build_resource_service(credentials=creds) toolkit = GmailToolkit(api_resource=api_resource) tools = toolkit.get_tools() ``` ### Initialize the agent [Permalink for this section](https://docs.arcade.dev/home/langchain/auth-langchain-tools\#initialize-the-agent) PythonJavaScript ```nextra-code model = ChatOpenAI(model="gpt-4o") agent_executor = create_react_agent(model, tools) ``` ### Execute the agent [Permalink for this section](https://docs.arcade.dev/home/langchain/auth-langchain-tools\#execute-the-agent) PythonJavaScript ```nextra-code example_query = "Read my latest emails and summarize them." events = agent_executor.stream( {"messages": [("user", example_query)]}, stream_mode="values", ) for event in events: event["messages"][-1].pretty_print() ``` ### Next Steps [Permalink for this section](https://docs.arcade.dev/home/langchain/auth-langchain-tools\#next-steps) Now you’re ready to explore more LangChain tools with Arcade. Try integrating additional toolkits and crafting more complex queries to enhance your AI workflows. [User authorization](https://docs.arcade.dev/home/langchain/user-auth-interrupts "User authorization") [Using Arcade tools](https://docs.arcade.dev/home/crewai/use-arcade-tools "Using Arcade tools") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## MongoDB Toolkit Overview [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Databases](https://docs.arcade.dev/mcp-servers/databases/postgres "Databases") MongoDB # MongoDB **Description:** Enable agents to interact with MongoDB databases (read only). **Author:** Arcade **Code:** [GitHub](https://github.com/ArcadeAI/arcade-ai/tree/main/mcp-servers/mongodb) **Auth:** database connection string [![PyPI Version](https://img.shields.io/pypi/v/arcade_mongodb)](https://pypi.org/project/arcade_mongodb/)[![License](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/arcadeai/arcade-ai/blob/main/LICENSE)[![Python Versions](https://img.shields.io/pypi/pyversions/arcade_mongodb)](https://pypi.org/project/arcade_mongodb/)[![Wheel Status](https://img.shields.io/pypi/wheel/arcade_mongodb)](https://pypi.org/project/arcade_mongodb/)[![Downloads](https://img.shields.io/pypi/dm/arcade_mongodb)](https://pypi.org/project/arcade_mongodb/) The Arcade MongoDB MCP Server provides a pre-built set of tools for interacting with MongoDB databases in a read-only manner. This toolkit enables agents to discover databases and collections, explore document structures, and execute queries safely. This toolkit is a companion to the blog post [Designing SQL Tools for AI Agents](https://blog.arcade.dev/sql-tools-ai-agents-security). This toolkit is meant to be an example of how to build a toolkit for a database, and is not intended to be used in production - you won’t find it listed in the Arcade dashboard or APIs. For production use, we recommend forking this repository and building your own toolkit with use-case specific tools. ## Key Features [Permalink for this section](https://docs.arcade.dev/mcp-servers/databases/mongodb\#key-features) This toolkit demonstrates several important concepts for LLM-powered database interactions: - **Database Discovery**: Automatically discover available databases in the MongoDB instance - **Collection Exploration**: Find all collections within a specific database - **Schema Inference**: Sample documents to infer schema structure and data types - **Safe Query Execution**: Execute find queries with built-in safety measures - **Aggregation Support**: Run complex aggregation pipelines for data analysis - **Document Counting**: Count documents matching specific criteria - **Connection Pooling**: Reuse database connections efficiently - **Read-Only Access**: Enforce read-only access to prevent data modification - **Result Limits**: Automatically limit query results to prevent overwhelming responses ## Available Tools [Permalink for this section](https://docs.arcade.dev/mcp-servers/databases/mongodb\#available-tools) | Tool Name | Description | | --- | --- | | MongoDB.DiscoverDatabases | Discover all databases in the MongoDB instance. | | MongoDB.DiscoverCollections | Discover all collections in a specific database. | | MongoDB.GetCollectionSchema | Get the schema structure of a collection by sampling documents. | | MongoDB.FindDocuments | Find documents in a collection with filtering, projection, and sorting. | | MongoDB.CountDocuments | Count documents matching a specific filter. | | MongoDB.AggregateDocuments | Execute aggregation pipelines for complex data analysis. | Note that all tools require the `MONGODB_CONNECTION_STRING` secret to be set. ## MongoDB.DiscoverDatabases [Permalink for this section](https://docs.arcade.dev/mcp-servers/databases/mongodb\#mongodbdiscoverdatabases) Discover all databases in the MongoDB instance. This tool returns a list of all available databases, excluding system databases like `admin`, `config`, and `local` for security. See Example > ## MongoDB.DiscoverCollections [Permalink for this section](https://docs.arcade.dev/mcp-servers/databases/mongodb\#mongodbdiscovercollections) Discover all collections in a specific database. This tool should be used before any other tool that requires a collection name. **Parameters:** - `database_name` (str): The database name to discover collections in See Example > ## MongoDB.GetCollectionSchema [Permalink for this section](https://docs.arcade.dev/mcp-servers/databases/mongodb\#mongodbgetcollectionschema) Get the schema structure of a collection by sampling documents. Since MongoDB is schema-less, this tool samples a configurable number of documents to infer the schema structure and data types. Always use this tool before executing any query. **Parameters:** - `database_name` (str): The database name containing the collection - `collection_name` (str): The name of the collection to inspect - `sample_size` (int): The number of documents to sample for schema discovery (default: 100) See Example > ## MongoDB.FindDocuments [Permalink for this section](https://docs.arcade.dev/mcp-servers/databases/mongodb\#mongodbfinddocuments) Find documents in a collection with filtering, projection, and sorting. This tool allows you to build complex queries using MongoDB’s query operators while maintaining safety and performance. **Parameters:** - `database_name` (str): The database name to query - `collection_name` (str): The collection name to query - `filter_dict` (str, optional): MongoDB filter/query as JSON string. Leave None for no filter - `projection` (str, optional): Fields to include/exclude as JSON string. Use 1 to include, 0 to exclude - `sort` (list\[str\], optional): Sort criteria as list of JSON strings with ‘field’ and ‘direction’ keys - `limit` (int): Maximum number of documents to return (default: 100) - `skip` (int): Number of documents to skip (default: 0) **Best Practices:** - Always use `discover_collections` and `get_collection_schema` before executing queries - Always specify projection to limit fields returned if you don’t need all data - Always sort your results by the most important fields first - Use appropriate MongoDB query operators for complex filtering ($gte, $lte, $in, $regex, etc.) - Be mindful of case sensitivity when querying string fields - Use indexes when possible (typically on \_id and commonly queried fields) See Example > ## MongoDB.CountDocuments [Permalink for this section](https://docs.arcade.dev/mcp-servers/databases/mongodb\#mongodbcountdocuments) Count documents in a collection matching the given filter. This tool is useful for getting quick counts without retrieving the actual documents. **Parameters:** - `database_name` (str): The database name to query - `collection_name` (str): The collection name to query - `filter_dict` (str, optional): MongoDB filter/query as JSON string. Leave None to count all documents See Example > ## MongoDB.AggregateDocuments [Permalink for this section](https://docs.arcade.dev/mcp-servers/databases/mongodb\#mongodbaggregatedocuments) Execute aggregation pipelines for complex data analysis. This tool allows you to run sophisticated data processing operations including grouping, filtering, and transformations. **Parameters:** - `database_name` (str): The database name to query - `collection_name` (str): The collection name to query - `pipeline` (list\[str\]): MongoDB aggregation pipeline as a list of JSON strings - `limit` (int): Maximum number of results to return (default: 100) **Common Aggregation Stages:** - `$match` \- filter documents - `$group` \- group documents and perform calculations - `$project` \- reshape documents - `$sort` \- sort documents - `$limit` \- limit results - `$lookup` \- join with other collections See Example > ## Usage Workflow [Permalink for this section](https://docs.arcade.dev/mcp-servers/databases/mongodb\#usage-workflow) For optimal results, follow this workflow when using the MongoDB toolkit: 1. **Discover Databases**: Use `discover_databases` to see available databases 2. **Discover Collections**: Use `discover_collections` with your target database 3. **Get Collection Schema**: Use `get_collection_schema` for each collection you plan to query 4. **Execute Queries**: Use `find_documents`, `count_documents`, or `aggregate_documents` with the schema information This workflow ensures your agent has complete information about the database structure before attempting queries, reducing errors and improving query performance. ## Get Building [Use tools hosted on Arcade Cloud\\ \\ Arcade tools are hosted by our cloud platform and ready to be used in your agents. Learn how.](https://docs.arcade.dev/home/quickstart) [Self Host Arcade tools\\ \\ Arcade tools can be self-hosted on your own infrastructure. Learn more about self-hosting.\\ \\ ```\\ pip install arcade_mongodb\\ ```](https://docs.arcade.dev/home/hosting-overview) [Postgres](https://docs.arcade.dev/mcp-servers/databases/postgres "Postgres") [Clickhouse](https://docs.arcade.dev/mcp-servers/databases/clickhouse "Clickhouse") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Arcade Toolkit Template [Integrations](https://docs.arcade.dev/toolkits "Integrations") Community Toolkit Template # Arcade YOUR-TOOLKIT-NAME Toolkit The Arcade YOUR-TOOLKIT-NAME Toolkit is a community contributed toolkit meaning that it is created and maintained by the community. To learn more about the toolkit, please visit the [Arcade YOUR-TOOLKIT-NAME GitHub repository](https://github.com/YOUR-GITHUB-USERNAME/YOUR-TOOLKIT-REPO-NAME). [Contribute a toolkit](https://docs.arcade.dev/mcp-servers/contribute-a-toolkit "Contribute a toolkit") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Dropbox Auth Provider [Home](https://docs.arcade.dev/home "Home") [Customizing Auth](https://docs.arcade.dev/home/auth-providers "Customizing Auth") Dropbox # Dropbox auth provider At this time, Arcade does not offer a default Dropbox Auth Provider. To use Dropbox auth, you must create a custom Auth Provider with your own Dropbox OAuth 2.0 credentials as described below. The Dropbox auth provider enables tools and agents to call the Dropbox API on behalf of a user. Behind the scenes, the Arcade Engine and the Dropbox auth provider seamlessly manage Dropbox OAuth 2.0 authorization for your users. ### What’s documented here [Permalink for this section](https://docs.arcade.dev/home/auth-providers/dropbox\#whats-documented-here) This page describes how to use and configure Dropbox auth with Arcade. This auth provider is used by: - Your [app code](https://docs.arcade.dev/home/auth-providers/dropbox#using-dropbox-auth-in-app-code) that needs to call Dropbox APIs - Or, your [custom tools](https://docs.arcade.dev/home/auth-providers/dropbox#using-dropbox-auth-in-custom-tools) that need to call Dropbox APIs ## Configuring Dropbox auth [Permalink for this section](https://docs.arcade.dev/home/auth-providers/dropbox\#configuring-dropbox-auth) When using your own app credentials, make sure you configure your project to use a [custom user verifier](https://docs.arcade.dev/home/auth/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 Dropbox app credentials. This way, your users will see your application’s name requesting permission. You can use your own Dropbox credentials in both the Arcade Cloud Platform or in a [self-hosted Arcade Engine](https://docs.arcade.dev/home/deployment/engine-configuration) instance. Before showing how to configure your Dropbox app credentials, let’s go through the steps to create a Dropbox app. ### Create a Dropbox app [Permalink for this section](https://docs.arcade.dev/home/auth-providers/dropbox\#create-a-dropbox-app) - Create a Dropbox Application in the [Dropbox App Console](https://www.dropbox.com/developers/apps) - In the Settings tab, under the “OAuth 2” section, set the redirect URI to the redirect URL generated by Arcade (see below) - In the Permissions tab, add any scopes that your app will need - In the Settings tab, copy the App key (Client ID) and App secret (Client Secret), which you’ll need below Next, add the Dropbox app to your Arcade Engine configuration. You can do this in the Arcade Dashboard, or by editing the `engine.yaml` file directly (for a self-hosted instance). ## Configuring your own Dropbox Auth Provider in Arcade [Permalink for this section](https://docs.arcade.dev/home/auth-providers/dropbox\#configuring-your-own-dropbox-auth-provider-in-arcade) There are two ways to configure your Dropbox app credentials in Arcade: 1. From the Arcade Dashboard GUI 2. By editing the `engine.yaml` file directly (for a self-hosted Arcade Engine) We show both options step-by-step below. Dashboard GUIEngine Configuration YAML ### Configure Dropbox Auth Using the Arcade Dashboard GUI #### Access the Arcade Dashboard [Permalink for this section](https://docs.arcade.dev/home/auth-providers/dropbox\#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](http://localhost:9099/dashboard). Adjust the host and port number to match your environment. #### Navigate to the OAuth Providers page [Permalink for this section](https://docs.arcade.dev/home/auth-providers/dropbox\#navigate-to-the-oauth-providers-page) - Under the **OAuth** section of the Arcade Dashboard left-side menu, click **Providers**. - Click **Add OAuth Provider** in the top right corner. - Select the **Included Providers** tab at the top. - In the **Provider** dropdown, select **Dropbox**. #### Enter the provider details [Permalink for this section](https://docs.arcade.dev/home/auth-providers/dropbox\#enter-the-provider-details) - Choose a unique **ID** for your provider (e.g. “my-dropbox-provider”). - Optionally enter a **Description**. - Enter the **Client ID** and **Client Secret** from your Dropbox app. - Note the **Redirect URL** generated by Arcade. This must be added to your Dropbox app’s Redirect URIs. #### Create the provider [Permalink for this section](https://docs.arcade.dev/home/auth-providers/dropbox\#create-the-provider) Hit the **Create** button and the provider will be ready to be used. When you use tools that require Dropbox auth using your Arcade account credentials, the Arcade Engine will automatically use this Dropbox OAuth provider. If you have multiple Dropbox providers, see [using multiple auth providers of the same type](https://docs.arcade.dev/home/auth-providers#using-multiple-providers-of-the-same-type) for more information. ## Using Dropbox auth in app code [Permalink for this section](https://docs.arcade.dev/home/auth-providers/dropbox\#using-dropbox-auth-in-app-code) Use the Dropbox auth provider in your own agents and AI apps to get a user-scoped token for the Dropbox API. See [authorizing agents with Arcade](https://docs.arcade.dev/home/auth/how-arcade-helps) to understand how this works. Use `client.auth.start()` to get a user token for the Dropbox API: PythonJavaScript ```nextra-code 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="dropbox", scopes=["openid", "sharing.read", "files.metadata.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... ``` ## Using Dropbox auth in custom tools [Permalink for this section](https://docs.arcade.dev/home/auth-providers/dropbox\#using-dropbox-auth-in-custom-tools) You can author your own [custom tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server) that interact with the Dropbox API. Use the `Dropbox()` auth class to specify that a tool requires authorization with Dropbox. The `context.authorization.token` field will be automatically populated with the user’s Dropbox token: ```nextra-code from typing import Annotated, Optional import httpx from arcade_tdk import ToolContext, tool from arcade_tdk.auth import Dropbox @tool( requires_auth=Dropbox( scopes=["files.metadata.read"], ) ) async def list_files( context: ToolContext, path: Annotated[\ Optional[str],\ "The path to the folder to list the contents of. Defaults to empty string to list the root folder.",\ ] = "", ) -> Annotated[dict, "List of servers the user is a member of"]: """Starts returning the contents of a folder.""" url = "https://api.dropboxapi.com/2/files/list_folder" headers = {"Authorization": f"Bearer {context.authorization.token}"} async with httpx.AsyncClient() as client: response = await client.post(url, headers=headers, json={"path": path}) response.raise_for_status() return response.json() ``` [Discord](https://docs.arcade.dev/home/auth-providers/discord "Discord") [GitHub](https://docs.arcade.dev/home/auth-providers/github "GitHub") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Google Drive Reference [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Productivity & Docs](https://docs.arcade.dev/mcp-servers/productivity/asana "Productivity & Docs") [Google Drive](https://docs.arcade.dev/mcp-servers/productivity/google_drive "Google Drive") Reference # GoogleDrive Reference Below is a reference of enumerations used by some tools in the GoogleDrive toolkit: ## OrderBy [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_drive/reference\#orderby) - **CREATED\_TIME**: `createdTime` - **CREATED\_TIME\_DESC**: `createdTime desc` - **FOLDER**: `folder` - **FOLDER\_DESC**: `folder desc` - **MODIFIED\_BY\_ME\_TIME**: `modifiedByMeTime` - **MODIFIED\_BY\_ME\_TIME\_DESC**: `modifiedByMeTime desc` - **MODIFIED\_TIME**: `modifiedTime` - **MODIFIED\_TIME\_DESC**: `modifiedTime desc` - **NAME**: `name` - **NAME\_DESC**: `name desc` - **NAME\_NATURAL**: `name_natural` - **NAME\_NATURAL\_DESC**: `name_natural desc` - **QUOTA\_BYTES\_USED**: `quotaBytesUsed` - **QUOTA\_BYTES\_USED\_DESC**: `quotaBytesUsed desc` - **RECENCY**: `recency` - **RECENCY\_DESC**: `recency desc` - **SHARED\_WITH\_ME\_TIME**: `sharedWithMeTime` - **SHARED\_WITH\_ME\_TIME\_DESC**: `sharedWithMeTime desc` - **STARRED**: `starred` - **STARRED\_DESC**: `starred desc` - **VIEWED\_BY\_ME\_TIME**: `viewedByMeTime` - **VIEWED\_BY\_ME\_TIME\_DESC**: `viewedByMeTime desc` ## GoogleDriveFileType [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_drive/reference\#googledrivefiletype) - **SPREADSHEET**: `spreadsheet` - **SLIDES**: `slides` - **DOCUMENT**: `document` - **DRAWING**: `drawing` - **FORM**: `form` - **FOLDER**: `folder` - **IMAGE**: `image` - **VIDEO**: `video` - **AUDIO**: `audio` - **SCRIPT**: `script` - **SITES**: `sites` - **PDF**: `pdf` [Google Drive](https://docs.arcade.dev/mcp-servers/productivity/google_drive "Google Drive") [Google Slides](https://docs.arcade.dev/mcp-servers/productivity/google_slides "Google Slides") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Asana Toolkit Integration [Integrations](https://docs.arcade.dev/toolkits "Integrations") Productivity & DocsAsana # Asana **Description:** Enable agents to interact with tasks, projects, and workspaces in Asana. **Author:** Arcade **Auth:** User authorization [![PyPI Version](https://img.shields.io/pypi/v/arcade_asana)](https://pypi.org/project/arcade_asana/)[![License](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/arcadeai/arcade-ai/blob/main/LICENSE)[![Python Versions](https://img.shields.io/pypi/pyversions/arcade_asana)](https://pypi.org/project/arcade_asana/)[![Wheel Status](https://img.shields.io/pypi/wheel/arcade_asana)](https://pypi.org/project/arcade_asana/)[![Downloads](https://img.shields.io/pypi/dm/arcade_asana)](https://pypi.org/project/arcade_asana/) The Arcade Asana MCP Server provides a pre-built set of tools for interacting with Asana. These tools make it easy to build agents and AI apps that can: - Manage teams, projects, and workspaces. - Create, update, and search for tasks. - Retrieve data about tasks, projects, workspaces, users, etc. - Manage task attachments. ## Available Tools [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/asana\#available-tools) | Tool Name | Description | | --- | --- | | Asana.GetProjectById | Get a project by its ID. | | Asana.ListProjects | List projects associated to one or more teams. | | Asana.GetTagById | Get a tag by its ID. | | Asana.CreateTag | Create a tag. | | Asana.ListTags | List tags associated to one or more workspaces. | | Asana.GetTasksWithoutId | Search and retrieve tasks using full-text and filters when you don't have the task ID. | | Asana.GetTaskById | Get a task by its ID. | | Asana.GetSubtasksFromATask | Get subtasks associated to a task. | | Asana.UpdateTask | Update a task. | | Asana.MarkTaskAsCompleted | Mark a task as completed. | | Asana.CreateTask | Create a task. | | Asana.AttachFileToTask | Attach a file to a task. | | Asana.ListUsers | List users that are members of one or more workspaces. | | Asana.GetUserById | Get a user by their ID. | | Asana.GetWorkspaceById | Get a workspace by its ID. | | Asana.ListWorkspaces | List the user workspaces. | | Asana.GetTeamById | Get a team by its ID. | | Asana.ListTeamsTheCurrentUserIsAMemberOf | List the teams the current user is a member of. | | Asana.ListTeams | List teams associated to a workspace. | If you need to perform an action that’s not listed here, you can [get in touch\\ with us](mailto:contact@arcade.dev) to request a new tool, or [create your\\ own tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server). ## Asana.GetProjectById [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/asana\#asanagetprojectbyid) See Example > Get a project by its ID. **Parameters** - **project\_id** _(string, required)_ The ID of the project. E.g. ‘1234567890’ ## Asana.ListProjects [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/asana\#asanalistprojects) See Example > List projects associated to one or more teams. **Parameters** - **team\_id** _(string, optional)_ The team ID to get projects from. Defaults to None (does not filter by team). - **workspace\_id** _(string, optional)_ The workspace ID to get projects from. Defaults to None. If not provided and the user has only one workspace, it will use that workspace. If not provided and the user has multiple workspaces, it will raise an error listing the available workspaces. - **limit** _(int, optional, Defaults to `100`)_ The maximum number of projects to return. Min is 1, max is 100. Defaults to 100. - **next\_page\_token** _(string, optional)_ The token to retrieve the next page of projects. Defaults to None (start from the first page). ## Asana.GetTagById [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/asana\#asanagettagbyid) See Example > Get a tag by its ID. **Parameters** - **tag\_id** _(string, required)_ The ID of the tag. E.g. ‘1234567890’ ## Asana.CreateTag [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/asana\#asanacreatetag) See Example > Create a tag. **Parameters** - **name** _(string, required)_ The name of the tag. E.g. ‘Priority’. - **description** _(string, optional)_ The description of the tag. Defaults to None (no description). - **color** _(list of enum [TagColor](https://docs.arcade.dev/mcp-servers/productivity/asana/reference#tagcolor), optional)_ The color of the tag. Defaults to None (no color). - **workspace\_id** _(string, None)_ The ID of the workspace to create the tag in. If not provided, it will associate the tag to the user’s workspace, if there’s only one. Otherwise, it will raise an error. ## Asana.ListTags [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/asana\#asanalisttags) See Example > List tags associated to one or more workspaces. **Parameters** - **workspace\_id** _(string, optional)_ The workspace ID to retrieve tags from. Defaults to None. If not provided and the user has only one workspace, it will use that workspace. If not provided and the user has multiple workspaces, it will raise an error listing the available workspaces. - **limit** _(int, optional, Defaults to `100`)_ Maximum number of items to return. Defaults to 100. Maximum allowed is 100. - **next\_page\_token** _(string, optional)_ The token to retrieve the next page of tags. Defaults to None (start from the first page). ## Asana.GetTasksWithoutId [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/asana\#asanagettaskswithoutid) See Example > Search and retrieve tasks using full-text and filters when you don’t have the task ID. **Parameters** - **keywords** _(string, optional)_ Keywords to search for tasks. Matches against the task name and description. Defaults to None (no keyword filter). - **workspace\_id** _(string, optional)_ The workspace ID to search for tasks. Defaults to None. If not provided and the user has only one workspace, it will use that workspace. If not provided and the user has multiple workspaces, it will raise an error listing the available workspaces. - **assignee\_id** _(string, optional)_ The ID of the user to filter tasks assigned to. Defaults to None (does not filter by assignee). - **project** _(string, optional)_ The ID or name of the project to filter tasks. Defaults to None (does not filter by project). - **team\_id** _(string, optional)_ The ID of the team to filter tasks. Defaults to None (does not filter by team). - **tags** _(list of strings, optional)_ Restricts the search to tasks associated to the given tags. Each item in the list can be a tag name (e.g. ‘My Tag’) or a tag ID (e.g. ‘1234567890’). Defaults to None (searches tasks associated to any tag or no tag). - **due\_on** _(string, optional)_ Match tasks that are due exactly on this date. Format: YYYY-MM-DD. Ex: ‘2025-01-01’. Defaults to None (searches tasks due on any date or without a due date). - **due\_on\_or\_after** _(string, optional)_ Match tasks that are due on OR AFTER this date. Format: YYYY-MM-DD. Ex: ‘2025-01-01’. Defaults to None (searches tasks due on any date or without a due date). - **due\_on\_or\_before** _(string, optional)_ Match tasks that are due on OR BEFORE this date. Format: YYYY-MM-DD. Ex: ‘2025-01-01’. Defaults to None (searches tasks due on any date or without a due date). - **completed** _(bool, optional)_ Match tasks that are completed. Defaults to False (tasks that are NOT completed). - **start\_on** _(string, optional)_ Match tasks that started on this date. Format: YYYY-MM-DD. Ex: ‘2025-01-01’. Defaults to None (searches tasks started on any date or without a start date). - **start\_on\_or\_after** _(string, optional)_ Match tasks that started on OR AFTER this date. Format: YYYY-MM-DD. Ex: ‘2025-01-01’. Defaults to None (searches tasks started on any date or without a start date). - \\*\\* start\_on\_or\_before\*\* _(string, optional)_ Match tasks that started on OR BEFORE this date. Format: YYYY-MM-DD. Ex: ‘2025-01-01’. Defaults to None (searches tasks started on any date or without a start date). - **completed** _(bool, optional)_ Match tasks that are completed. Defaults to False (tasks that are NOT completed). - **limit** _(int, optional, Defaults to `20`)_ Maximum number of tasks to return. Min of 1, max of 20. Defaults to 20. - **sort\_by** _(enum [TaskSortBy](https://docs.arcade.dev/mcp-servers/productivity/asana/reference#tasksortby), optional)_ The field to sort the tasks by. Defaults to TaskSortBy.MODIFIED\_AT. - **sort\_order** _(enum [SortOrder](https://docs.arcade.dev/mcp-servers/productivity/asana/reference#sortorder), optional)_ The order to sort the tasks by. Defaults to SortOrder.DESCENDING. ## Asana.GetTaskById [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/asana\#asanagettaskbyid) See Example > Get a task by its ID. **Parameters** - **task\_id** _(string, required)_ The ID of the task. E.g. ‘1234567890’ - **max\_subtasks** _(int, optional)_ The maximum number of subtasks to return. Min of 0 (no subtasks), max of 100. Defaults to 100. ## Asana.GetSubtasksFromATask [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/asana\#asanagetsubtasksfromatask) See Example > Get subtasks associated to a task. **Parameters** - **task\_id** _(string, required)_ The ID of the task. E.g. ‘1234567890’ - **limit** _(int, optional, Defaults to `100`)_ Maximum number of subtasks to return. Defaults to 100. Maximum allowed is 100. - **next\_page\_token** _(string, optional)_ The token to retrieve the next page of subtasks. Defaults to None (start from the first page). ## Asana.UpdateTask [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/asana\#asanaupdatetask) See Example > Update a task. **Parameters** - **task\_id** _(string, required)_ The ID of the task. E.g. ‘1234567890’ - **name** _(string, optional)_ The new name of the task. Defaults to None (does not change the current name). - **description** _(string, optional)_ The new description of the task. Defaults to None (does not change the current description). - **completed** _(bool, optional)_ The new completion status of the task. Provide True to mark the task as completed, False to mark it as not completed. Defaults to None (does not change the current completion status). - **start\_date** _(string, optional)_ The new start date of the task. Format: YYYY-MM-DD. Ex: ‘2025-01-01’. Defaults to None (does not change the current start date). - **due\_date** _(string, optional)_ The new due date of the task. Format: YYYY-MM-DD. Ex: ‘2025-01-01’. Defaults to None (does not change the current due date). - **assignee\_id** _(string, optional)_ The ID of the user to assign the task to. Defaults to None (does not change the current assignee). ## Asana.MarkTaskAsCompleted [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/asana\#asanamarktaskascompleted) See Example > Mark a task as completed. **Parameters** - **task\_id** _(string, required)_ The ID of the task. E.g. ‘1234567890’ ## Asana.CreateTask [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/asana\#asanacreatetask) See Example > Create a task. **Parameters** - **name** _(string, required)_ The name of the task. E.g. ‘My Task’ - **description** _(string, optional)_ The description of the task. Defaults to None (no description). - **start\_date** _(string, optional)_ The start date of the task. Format: YYYY-MM-DD. Ex: ‘2025-01-01’. Defaults to None (no start date). - **due\_date** _(string, optional)_ The due date of the task. Format: YYYY-MM-DD. Ex: ‘2025-01-01’. Defaults to None (no due date). - **parent\_task\_id** _(string, optional)_ The ID of the parent task. Defaults to None (no parent task). - **workspace\_id** _(string, optional)_ The ID of the workspace to associate the task to. Defaults to None. - **project** _(string, optional)_ The ID or name of the project to associate the task to. Defaults to None (no project). - **assignee\_id** _(string, optional)_ The ID of the user to assign the task to. Defaults to None (does not assign the task to anyone). - **tags** _(list of strings, optional)_ The tags to associate with the task. Multiple tags can be provided in the list. Each item in the list can be a tag name (e.g. ‘My Tag’) or a tag ID (e.g. ‘1234567890’). If a tag name does not exist, it will be automatically created with the new task. Defaults to None (no tags associated). Observations: A new task must be associated to at least one of the following: parent\_task\_id, project, or workspace\_id. If none of these are provided and the account has only one workspace, the task will be associated to that workspace. If none are provided and the account has multiple workspaces, an error will be raised with a list of available workspaces. ## Asana.AttachFileToTask [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/asana\#asanaattachfiletotask) See Example > Attach a file to a task. **Parameters** - **task\_id** _(string, required)_ The ID of the task. E.g. ‘1234567890’ - **file\_name** _(string, required)_ The name of the file to attach with format extension. E.g. ‘Image.png’ or ‘Report.pdf’. - **file\_content\_stream** _(string, required)_ The string contents of the file to attach. Use this if the file is a text file. Defaults to None. - **file\_content\_base64** _(string, required)_ The base64-encoded binary contents of the file. Use this for binary files like images or PDFs. Defaults to None. - **file\_content\_url** _(string, required)_ The URL of the file to attach. Use this if the file is hosted on an external URL. Defaults to None. - **file\_encoding** _(string, optional)_ The encoding of the file to attach. Only used with file\_content\_str. Defaults to ‘utf-8’. Observations: Provide exactly one of `file_content_str`, `file_content_base64`, or `file_content_url`, never more than one or none. - Use `file_content_str` for text files (will be encoded using `file_encoding`) - Use `file_content_base64` for binary files like images, PDFs, etc. - Use `file_content_url` if the file is hosted on an external URL ## Asana.ListUsers [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/asana\#asanalistusers) See Example > List users that are members of one or more workspaces. **Parameters** - **workspace\_id** _(string, optional)_ The workspace ID to list users from. Defaults to None. If no workspace ID is provided, it will use the current user’s workspace , if there’s only one. If the user has multiple workspaces, it will raise an error. - **limit** _(int, optional, Defaults to `500`)_ The maximum number of users to retrieve. Min is 1, max is 500. Defaults to 500. - **next\_page\_token** _(string, optional)_ The token to retrieve the next page of users. Defaults to None (start from the first page). ## Asana.GetUserById [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/asana\#asanagetuserbyid) See Example > Get a user by their ID. **Parameters** - **user\_id** _(string, required)_ The ID of the user. E.g. ‘1234567890’ ## Asana.GetTeamById [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/asana\#asanagetteambyid) See Example > Get a team by its ID. **Parameters** - **team\_id** _(string, required)_ The ID of the team. E.g. ‘1234567890’ ## Asana.ListTeamsTheCurrentUserIsAMemberOf [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/asana\#asanalistteamsthecurrentuserisamemberof) See Example > List the teams the current user is a member of. **Parameters** - **workspace\_id** _(string, optional)_ The workspace ID to list teams from. Defaults to None. If no workspace ID is provided, it will use the current user’s workspace , if there’s only one. If the user has multiple workspaces, it will raise an error. - **limit** _(int, optional, Defaults to `100`)_ The maximum number of teams to retrieve. Min is 1, max is 100. Defaults to 100. - **next\_page\_token** _(string, optional)_ The token to retrieve the next page of teams. Defaults to None (start from the first page). ## Asana.ListTeams [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/asana\#asanalistteams) See Example > List teams associated to a workspace. **Parameters** - **workspace\_id** _(string, optional)_ The workspace ID to list teams from. Defaults to None. If no workspace ID is provided, it will use the current user’s workspace, if there’s only one. If the user has multiple workspaces, it will raise an error listing the available workspaces. ## Asana.GetWorkspaceById [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/asana\#asanagetworkspacebyid) See Example > Get a workspace by its ID. **Parameters** - **workspace\_id** _(string, required)_ The ID of the workspace. E.g. ‘1234567890’ ## Asana.ListWorkspaces [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/asana\#asanalistworkspaces) See Example > List the user workspaces. **Parameters** - **limit** _(int, optional, Defaults to `100`)_ The maximum number of workspaces to retrieve. Min is 1, max is 100. Defaults to 100. - **next\_page\_token** _(string, optional)_ The token to retrieve the next page of workspaces. Defaults to None (start from the first page). ## Auth [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/asana\#auth) The Arcade Asana toolkit uses the [Asana auth provider](https://docs.arcade.dev/home/auth-providers/asana) to connect to users’ Asana accounts. With the Arcade Cloud Platform, there’s nothing to configure. Your users will see `Arcade` as the name of the application that’s requesting permission. With a self-hosted installation of Arcade, you need to [configure the Asana auth provider](https://docs.arcade.dev/home/auth-providers/asana#configuring-asana-auth) with your own Asana app credentials. ## Get Building [Use tools hosted on Arcade Cloud\\ \\ Arcade tools are hosted by our cloud platform and ready to be used in your agents. Learn how.](https://docs.arcade.dev/home/quickstart) [Self Host Arcade tools\\ \\ Arcade tools can be self-hosted on your own infrastructure. Learn more about self-hosting.\\ \\ ```\\ pip install arcade_asana\\ ```](https://docs.arcade.dev/home/hosting-overview) [Overview](https://docs.arcade.dev/toolkits "Overview") [Reference](https://docs.arcade.dev/mcp-servers/productivity/asana/reference "Reference") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## YouTube Video Search [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Search Tools](https://docs.arcade.dev/mcp-servers/search/google_finance "Search Tools") Youtube # YouTube Search **Description:** Enable agents to search for videos on YouTube. **Author:** Arcade **Auth:** API Key [![PyPI Version](https://img.shields.io/pypi/v/arcade_youtube)](https://pypi.org/project/arcade_youtube/)[![License](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/arcadeai/arcade-ai/blob/main/LICENSE)[![Python Versions](https://img.shields.io/pypi/pyversions/arcade_youtube)](https://pypi.org/project/arcade_youtube/)[![Wheel Status](https://img.shields.io/pypi/wheel/arcade_youtube)](https://pypi.org/project/arcade_youtube/)[![Downloads](https://img.shields.io/pypi/dm/arcade_youtube)](https://pypi.org/project/arcade_youtube/) The Arcade YouTube Search MCP Server provides a pre-built set of tools for interacting with YouTube. These tools make it easy to build agents and AI apps that can: - Search for videos on YouTube; - Get details about a video. ## Available Tools [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/youtube\#available-tools) | Tool Name | Description | | --- | --- | | Youtube.SearchForVideos | Search for videos on YouTube. | | Youtube.GetYoutubeVideoDetails | Get details about a video on YouTube. | If you need to perform an action that’s not listed here, you can [get in touch\\ with us](mailto:contact@arcade.dev) to request a new tool, or [create your\\ own tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server). ## Youtube.SearchForVideos [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/youtube\#youtubesearchforvideos) See Example > Search for videos on YouTube. **Parameters** - **keywords** _(string, required)_ Keywords to search for. E.g. ‘apple iphone’ or ‘samsung galaxy’ - **`language_code`** _(string, optional, Defaults to ‘en’ English)_ 2-character language code to use in the YouTube search. A list of supported language codes can be found [here](https://docs.arcade.dev/mcp-servers/search/youtube#languagecodes). - **`country_code`** _(string, optional, Defaults to ‘us’ United States)_ 2-character country code to use in the YouTube search. A list of supported country codes can be found [here](https://docs.arcade.dev/mcp-servers/search/youtube#countrycodes). - **`next_page_token`** _(string, optional, Defaults to ‘None’)_ The next page token to use for pagination. Defaults to `None` (start from the first page). ## Youtube.GetYoutubeVideoDetails [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/youtube\#youtubegetyoutubevideodetails) See Example > Get details about a video on YouTube. **Parameters** - **video\_id** _(string, required)_ Video ID. E.g. ‘414600577’. This can be retrieved from the search results of the `SearchYoutubeVideos` tool. - **`language_code`** _(string, optional, Defaults to ‘en’ English)_ 2-character language code to return information about the video. A list of supported language codes can be found [here](https://docs.arcade.dev/mcp-servers/search/youtube#languagecodes). - **`country_code`** _(string, optional, Defaults to ‘us’ United States)_ 2-character country code to return information about the video. A list of supported country codes can be found [here](https://docs.arcade.dev/mcp-servers/search/youtube#countrycodes). ## Auth [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/youtube\#auth) The Arcade YouTube Search toolkit uses the [SerpAPI](https://serpapi.com/) to get video information from YouTube. - **Secret:** - `SERP_API_KEY`: Your SerpAPI API key. Setting the `SERP_API_KEY` secret is only required if you are [self-hosting](https://docs.arcade.dev/home/deployment/engine-configuration) Arcade. If you’re using Arcade Cloud, the secret is already set for you. To manage your secrets, go to the [Secrets page](https://api.arcade.dev/dashboard/auth/secrets) in the Arcade Dashboard. ## Default parameter values [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/youtube\#default-parameter-values) Language and Country are configurable through environment variables. When set, they will be used as default for YouTube tools. Providing a different value as `language_code` or `country_code` argument in a tool call will override the default value set in the environment variables. **Language** The language code is a 2-character code that determines the language in which the API will search and return video information. There are two environment variables: - `ARCADE_GOOGLE_LANGUAGE`: a default value for all Google Search tools. If not set, defaults to ‘en’ (English). - `ARCADE_YOUTUBE_SEARCH_LANGUAGE`: a default value for the YouTube Search tools. If not set, defaults to `ARCADE_GOOGLE_LANGUAGE`. A list of supported language codes can be found [here](https://docs.arcade.dev/mcp-servers/search/youtube#languagecodes). **Country** The country code is a 2-character code that determines the country in which the API will search for videos: - `ARCADE_GOOGLE_COUNTRY`: a default value for all Google Search tools. If not set, defaults to `None`. - `ARCADE_YOUTUBE_SEARCH_COUNTRY`: a default value for the YouTube Search tools. If not set, defaults to `ARCADE_GOOGLE_COUNTRY`. If `ARCADE_GOOGLE_COUNTRY` is not set, the default country for YouTube tools will be `us` (United States). A list of supported country codes can be found [here](https://docs.arcade.dev/mcp-servers/search/youtube#countrycodes). * * * ## Reference [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/youtube\#reference) ## LanguageCodes [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/youtube\#languagecodes) - **`ar`**: Arabic - **`bn`**: Bengali - **`da`**: Danish - **`de`**: German - **`el`**: Greek - **`en`**: English - **`es`**: Spanish - **`fi`**: Finnish - **`fr`**: French - **`hi`**: Hindi - **`hu`**: Hungarian - **`id`**: Indonesian - **`it`**: Italian - **`ja`**: Japanese - **`ko`**: Korean - **`ms`**: Malay - **`nl`**: Dutch - **`no`**: Norwegian - **`pcm`**: Nigerian Pidgin - **`pl`**: Polish - **`pt`**: Portuguese - **`pt-br`**: Portuguese (Brazil) - **`pt-pt`**: Portuguese (Portugal) - **`ru`**: Russian - **`sv`**: Swedish - **`tl`**: Filipino - **`tr`**: Turkish - **`uk`**: Ukrainian - **`zh`**: Chinese - **`zh-cn`**: Chinese (Simplified) - **`zh-tw`**: Chinese (Traditional) ## CountryCodes [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/youtube\#countrycodes) - **`af`**: Afghanistan - **`al`**: Albania - **`dz`**: Algeria - **`as`**: American Samoa - **`ad`**: Andorra - **`ao`**: Angola - **`ai`**: Anguilla - **`aq`**: Antarctica - **`ag`**: Antigua and Barbuda - **`ar`**: Argentina - **`am`**: Armenia - **`aw`**: Aruba - **`au`**: Australia - **`at`**: Austria - **`az`**: Azerbaijan - **`bs`**: Bahamas - **`bh`**: Bahrain - **`bd`**: Bangladesh - **`bb`**: Barbados - **`by`**: Belarus - **`be`**: Belgium - **`bz`**: Belize - **`bj`**: Benin - **`bm`**: Bermuda - **`bt`**: Bhutan - **`bo`**: Bolivia - **`ba`**: Bosnia and Herzegovina - **`bw`**: Botswana - **`bv`**: Bouvet Island - **`br`**: Brazil - **`io`**: British Indian Ocean Territory - **`bn`**: Brunei Darussalam - **`bg`**: Bulgaria - **`bf`**: Burkina Faso - **`bi`**: Burundi - **`kh`**: Cambodia - **`cm`**: Cameroon - **`ca`**: Canada - **`cv`**: Cape Verde - **`ky`**: Cayman Islands - **`cf`**: Central African Republic - **`td`**: Chad - **`cl`**: Chile - **`cn`**: China - **`cx`**: Christmas Island - **`cc`**: Cocos (Keeling) Islands - **`co`**: Colombia - **`km`**: Comoros - **`cg`**: Congo - **`cd`**: Congo, the Democratic Republic of the - **`ck`**: Cook Islands - **`cr`**: Costa Rica - **`ci`**: Cote D’ivoire - **`hr`**: Croatia - **`cu`**: Cuba - **`cy`**: Cyprus - **`cz`**: Czech Republic - **`dk`**: Denmark - **`dj`**: Djibouti - **`dm`**: Dominica - **`do`**: Dominican Republic - **`ec`**: Ecuador - **`eg`**: Egypt - **`sv`**: El Salvador - **`gq`**: Equatorial Guinea - **`er`**: Eritrea - **`ee`**: Estonia - **`et`**: Ethiopia - **`fk`**: Falkland Islands (Malvinas) - **`fo`**: Faroe Islands - **`fj`**: Fiji - **`fi`**: Finland - **`fr`**: France - **`gf`**: French Guiana - **`pf`**: French Polynesia - **`tf`**: French Southern Territories - **`ga`**: Gabon - **`gm`**: Gambia - **`ge`**: Georgia - **`de`**: Germany - **`gh`**: Ghana - **`gi`**: Gibraltar - **`gr`**: Greece - **`gl`**: Greenland - **`gd`**: Grenada - **`gp`**: Guadeloupe - **`gu`**: Guam - **`gt`**: Guatemala - **`gg`**: Guernsey - **`gn`**: Guinea - **`gw`**: Guinea-Bissau - **`gy`**: Guyana - **`ht`**: Haiti - **`hm`**: Heard Island and Mcdonald Islands - **`va`**: Holy See (Vatican City State) - **`hn`**: Honduras - **`hk`**: Hong Kong - **`hu`**: Hungary - **`is`**: Iceland - **`in`**: India - **`id`**: Indonesia - **`ir`**: Iran, Islamic Republic of - **`iq`**: Iraq - **`ie`**: Ireland - **`im`**: Isle of Man - **`il`**: Israel - **`it`**: Italy - **`je`**: Jersey - **`jm`**: Jamaica - **`jp`**: Japan - **`jo`**: Jordan - **`kz`**: Kazakhstan - **`ke`**: Kenya - **`ki`**: Kiribati - **`kp`**: Korea, Democratic People’s Republic of - **`kr`**: Korea, Republic of - **`kw`**: Kuwait - **`kg`**: Kyrgyzstan - **`la`**: Lao People’s Democratic Republic - **`lv`**: Latvia - **`lb`**: Lebanon - **`ls`**: Lesotho - **`lr`**: Liberia - **`ly`**: Libyan Arab Jamahiriya - **`li`**: Liechtenstein - **`lt`**: Lithuania - **`lu`**: Luxembourg - **`mo`**: Macao - **`mk`**: Macedonia, the Former Yugosalv Republic of - **`mg`**: Madagascar - **`mw`**: Malawi - **`my`**: Malaysia - **`mv`**: Maldives - **`ml`**: Mali - **`mt`**: Malta - **`mh`**: Marshall Islands - **`mq`**: Martinique - **`mr`**: Mauritania - **`mu`**: Mauritius - **`yt`**: Mayotte - **`mx`**: Mexico - **`fm`**: Micronesia, Federated States of - **`md`**: Moldova, Republic of - **`mc`**: Monaco - **`mn`**: Mongolia - **`me`**: Montenegro - **`ms`**: Montserrat - **`ma`**: Morocco - **`mz`**: Mozambique - **`mm`**: Myanmar - **`na`**: Namibia - **`nr`**: Nauru - **`np`**: Nepal - **`nl`**: Netherlands - **`an`**: Netherlands Antilles - **`nc`**: New Caledonia - **`nz`**: New Zealand - **`ni`**: Nicaragua - **`ne`**: Niger - **`ng`**: Nigeria - **`nu`**: Niue - **`nf`**: Norfolk Island - **`mp`**: Northern Mariana Islands - **`no`**: Norway - **`om`**: Oman - **`pk`**: Pakistan - **`pw`**: Palau - **`ps`**: Palestinian Territory, Occupied - **`pa`**: Panama - **`pg`**: Papua New Guinea - **`py`**: Paraguay - **`pe`**: Peru - **`ph`**: Philippines - **`pn`**: Pitcairn - **`pl`**: Poland - **`pt`**: Portugal - **`pr`**: Puerto Rico - **`qa`**: Qatar - **`re`**: Reunion - **`ro`**: Romania - **`ru`**: Russian Federation - **`rw`**: Rwanda - **`sh`**: Saint Helena - **`kn`**: Saint Kitts and Nevis - **`lc`**: Saint Lucia - **`pm`**: Saint Pierre and Miquelon - **`vc`**: Saint Vincent and the Grenadines - **`ws`**: Samoa - **`sm`**: San Marino - **`st`**: Sao Tome and Principe - **`sa`**: Saudi Arabia - **`sn`**: Senegal - **`rs`**: Serbia - **`sc`**: Seychelles - **`sl`**: Sierra Leone - **`sg`**: Singapore - **`sk`**: Slovakia - **`si`**: Slovenia - **`sb`**: Solomon Islands - **`so`**: Somalia - **`za`**: South Africa - **`gs`**: South Georgia and the South Sandwich Islands - **`es`**: Spain - **`lk`**: Sri Lanka - **`sd`**: Sudan - **`sr`**: Suriname - **`sj`**: Svalbard and Jan Mayen - **`sz`**: Swaziland - **`se`**: Sweden - **`ch`**: Switzerland - **`sy`**: Syrian Arab Republic - **`tw`**: Taiwan, Province of China - **`tj`**: Tajikistan - **`tz`**: Tanzania, United Republic of - **`th`**: Thailand - **`tl`**: Timor-Leste - **`tg`**: Togo - **`tk`**: Tokelau - **`to`**: Tonga - **`tt`**: Trinidad and Tobago - **`tn`**: Tunisia - **`tr`**: Turkiye - **`tm`**: Turkmenistan - **`tc`**: Turks and Caicos Islands - **`tv`**: Tuvalu - **`ug`**: Uganda - **`ua`**: Ukraine - **`ae`**: United Arab Emirates - **`uk`**: United Kingdom - **`gb`**: United Kingdom - **`us`**: United States - **`um`**: United States Minor Outlying Islands - **`uy`**: Uruguay - **`uz`**: Uzbekistan - **`vu`**: Vanuatu - **`ve`**: Venezuela - **`vn`**: Viet Nam - **`vg`**: Virgin Islands, British - **`vi`**: Virgin Islands, U.S. - **`wf`**: Wallis and Futuna - **`eh`**: Western Sahara - **`ye`**: Yemen - **`zm`**: Zambia - **`zw`**: Zimbabwe ## Get Building [Use tools hosted on Arcade Cloud\\ \\ Arcade tools are hosted by our cloud platform and ready to be used in your agents. Learn how.](https://docs.arcade.dev/home/quickstart) [Self Host Arcade tools\\ \\ Arcade tools can be self-hosted on your own infrastructure. Learn more about self-hosting.\\ \\ ```\\ pip install arcade_youtube\\ ```](https://docs.arcade.dev/home/hosting-overview) [Walmart](https://docs.arcade.dev/mcp-servers/search/walmart "Walmart") [Hubspot](https://docs.arcade.dev/mcp-servers/sales/hubspot "Hubspot") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Clickhouse Database Toolkit [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Databases](https://docs.arcade.dev/mcp-servers/databases/postgres "Databases") Clickhouse # Clickhouse **Description:** Enable agents to interact with Clickhouse databases (read only). **Author:** Arcade **Code:** [GitHub](https://github.com/ArcadeAI/arcade-ai/tree/main/mcp-servers/clickhouse) **Auth:** database connection string [![PyPI Version](https://img.shields.io/pypi/v/arcade_clickhouse)](https://pypi.org/project/arcade_clickhouse/)[![License](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/arcadeai/arcade-ai/blob/main/LICENSE)[![Python Versions](https://img.shields.io/pypi/pyversions/arcade_clickhouse)](https://pypi.org/project/arcade_clickhouse/)[![Wheel Status](https://img.shields.io/pypi/wheel/arcade_clickhouse)](https://pypi.org/project/arcade_clickhouse/)[![Downloads](https://img.shields.io/pypi/dm/arcade_clickhouse)](https://pypi.org/project/arcade_clickhouse/) The Arcade Clickhouse MCP Server provides a pre-built set of tools for interacting with Clickhouse databases in a read-only manner. This toolkit enables agents to discover database schemas, explore table structures, and execute SELECT queries safely. This toolkit is a companion to the blog post [Designing SQL Tools for AI Agents](https://blog.arcade.dev/sql-tools-ai-agents-security). This toolkit is meant to be an example of how to build a toolkit for a database, and is not intended to be used in production - you won’t find it listed in the Arcade dashboard or APIs. For production use, we recommend forking this repository and building your own toolkit with use-case specific tools. ## Key Features [Permalink for this section](https://docs.arcade.dev/mcp-servers/databases/clickhouse\#key-features) This toolkit demonstrates several important concepts for LLM-powered database interactions: - **Schema Discovery**: Automatically discover available database schemas - **Table Exploration**: Find all tables within a specific schema - **Schema Inspection**: Get detailed column information including data types, primary keys, and indexes - **Safe Query Execution**: Execute SELECT queries with built-in safety measures - **Connection Pooling**: Reuse database connections efficiently - **Read-Only Access**: Enforce read-only access to prevent data modification - **Row Limits**: Automatically limit query results to prevent overwhelming responses ## Available Tools [Permalink for this section](https://docs.arcade.dev/mcp-servers/databases/clickhouse\#available-tools) | Tool Name | Description | | --- | --- | | Clickhouse.DiscoverDatabases | Discover all databases in a Clickhouse database. | | Clickhouse.DiscoverSchemas | Discover all schemas in a Clickhouse database. | | Clickhouse.DiscoverTables | Discover all tables in a specific schema. | | Clickhouse.GetTableSchema | Get the detailed schema of a specific table. | | Clickhouse.ExecuteSelectQuery | Execute a SELECT query with comprehensive clause support. | Note that all tools require the `CLICKHOUSE_DATABASE_CONNECTION_STRING` secret to be set. ## Clickhouse.DiscoverDatabases [Permalink for this section](https://docs.arcade.dev/mcp-servers/databases/clickhouse\#clickhousediscoverdatabases) Discover all databases in a Clickhouse database. This tool returns a list of all available databases. See Example > ## Clickhouse.DiscoverSchemas [Permalink for this section](https://docs.arcade.dev/mcp-servers/databases/clickhouse\#clickhousediscoverschemas) Discover all schemas in a Clickhouse database. This tool returns a list of all available schemas, excluding the `information_schema` for security. See Example > ## Clickhouse.DiscoverTables [Permalink for this section](https://docs.arcade.dev/mcp-servers/databases/clickhouse\#clickhousediscovertables) Discover all tables in a specific schema. This tool should be used before any other tool that requires a table name. **Parameters:** - `schema_name` (str): The database schema to discover tables in (default: “public”) See Example > ## Clickhouse.GetTableSchema [Permalink for this section](https://docs.arcade.dev/mcp-servers/databases/clickhouse\#clickhousegettableschema) Get the detailed schema of a specific table. This tool provides column information including data types, primary key indicators, and index information. Always use this tool before executing any query. **Parameters:** - `schema_name` (str): The database schema containing the table - `table_name` (str): The name of the table to inspect See Example > ## Clickhouse.ExecuteSelectQuery [Permalink for this section](https://docs.arcade.dev/mcp-servers/databases/clickhouse\#clickhouseexecuteselectquery) Execute a SELECT query with comprehensive clause support. This tool allows you to build complex queries using individual clauses while maintaining safety and performance. **Parameters:** - `select_clause` (str): Columns to select (without SELECT keyword) - `from_clause` (str): Table(s) to query from (without FROM keyword) - `limit` (int): Maximum rows to return (default: 100) - `offset` (int): Number of rows to skip (default: 0) - `join_clause` (str, optional): JOIN conditions (without JOIN keyword) - `where_clause` (str, optional): WHERE conditions (without WHERE keyword) - `having_clause` (str, optional): HAVING conditions (without HAVING keyword) - `group_by_clause` (str, optional): GROUP BY columns (without GROUP BY keyword) - `order_by_clause` (str, optional): ORDER BY columns (without ORDER BY keyword) - `with_clause` (str, optional): WITH clause for CTEs (without WITH keyword) **Query Construction:** The final query is constructed as: ```nextra-code SELECT {select_clause} FROM {from_clause} JOIN {join_clause} WHERE {where_clause} HAVING {having_clause} GROUP BY {group_by_clause} ORDER BY {order_by_clause} LIMIT {limit} OFFSET {offset} ``` **Best Practices:** - Always use `discover_tables` and `get_table_schema` before executing queries - Never use “SELECT \*” - always specify the columns you need - Order results by primary keys or important columns - Use case-insensitive string matching - Trim strings in queries - Prefer LIKE queries over exact matches or regex - Only join on indexed columns or primary keys See Example > ## Usage Workflow [Permalink for this section](https://docs.arcade.dev/mcp-servers/databases/clickhouse\#usage-workflow) For optimal results, follow this workflow when using the Clickhouse toolkit: 1. **Discover Schemas**: Use `discover_schemas` to see available schemas 2. **Discover Tables**: Use `discover_tables` with your target schema 3. **Get Table Schema**: Use `get_table_schema` for each table you plan to query 4. **Execute Query**: Use `execute_select_query` with the schema information This workflow ensures your agent has complete information about the database structure before attempting queries, reducing errors and improving query performance. ## Get Building [Use tools hosted on Arcade Cloud\\ \\ Arcade tools are hosted by our cloud platform and ready to be used in your agents. Learn how.](https://docs.arcade.dev/home/quickstart) [Self Host Arcade tools\\ \\ Arcade tools can be self-hosted on your own infrastructure. Learn more about self-hosting.\\ \\ ```\\ pip install arcade_clickhouse\\ ```](https://docs.arcade.dev/home/hosting-overview) [MongoDB](https://docs.arcade.dev/mcp-servers/databases/mongodb "MongoDB") [Zendesk](https://docs.arcade.dev/mcp-servers/customer-support/zendesk "Zendesk") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Arcade Documentation Sitemap https://docs.arcade.dev/sitemap-0.xml ## X Toolkit for Agents [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Social & Communication](https://docs.arcade.dev/mcp-servers/social-communication/discord "Social & Communication") X # X (formerly Twitter) **Description:** Enable agents to interact with X (formerly Twitter). **Author:** Arcade **Auth:** User authorization [![PyPI Version](https://img.shields.io/pypi/v/arcade_x)](https://pypi.org/project/arcade_x/)[![License](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/arcadeai/arcade-ai/blob/main/LICENSE)[![Python Versions](https://img.shields.io/pypi/pyversions/arcade_x)](https://pypi.org/project/arcade_x/)[![Wheel Status](https://img.shields.io/pypi/wheel/arcade_x)](https://pypi.org/project/arcade_x/)[![Downloads](https://img.shields.io/pypi/dm/arcade_x)](https://pypi.org/project/arcade_x/) The Arcade X (formerly Twitter) MCP Server provides a pre-built set of tools for interacting with X (formerly Twitter). These tools make it easy to build agents and AI apps that can: - Post tweets - Reply to tweets - Quote tweets - Delete tweets - Search for tweets by username - Search for tweets by keywords - Look up a user by username ## Available Tools [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/x\#available-tools) | Tool Name | Description | | --- | --- | | X.LookupSingleUserByUsername | Look up a user on X (Twitter) by their username. | | X.PostTweet | Post a tweet to X (Twitter). | | X.ReplyToTweet | Reply to a tweet on X (Twitter). | | X.DeleteTweetById | Delete a tweet on X (Twitter). | | X.SearchRecentTweetsByUsername | Search for recent tweets (last 7 days) on X (Twitter) by username. | | X.SearchRecentTweetsByKeywords | Search for recent tweets (last 7 days) on X (Twitter) by required keywords and phrases. | | X.LookupTweetById | Look up a tweet on X (Twitter) by tweet ID. | If you need to perform an action that’s not listed here, you can [get in touch\\ with us](mailto:contact@arcade.dev) to request a new tool, or [create your\\ own tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server). ## X.LookupSingleUserByUsername [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/x\#xlookupsingleuserbyusername) See Example > Look up a user on X (Twitter) by their username. **Parameters** - **username** ( `string`, required) The username of the X (Twitter) user to look up ## X.PostTweet [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/x\#xposttweet) See Example > Post a tweet to X (Twitter). **Parameters** - **tweet\_text** ( `string`, required) The text content of the tweet you want to post - **quote\_tweet\_id** ( `string`, optional) The ID of the tweet you want to quote. Optional. ## X.ReplyToTweet [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/x\#xreplytotweet) See Example > Reply to a tweet on X (Twitter). **Parameters** - **tweet\_id** ( `string`, required) The ID of the tweet you want to reply to - **tweet\_text** ( `string`, required) The text content of the tweet you want to post - **quote\_tweet\_id** ( `string`, optional) The ID of the tweet you want to quote. Optional. ## X.DeleteTweetById [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/x\#xdeletetweetbyid) See Example > Delete a tweet on X (Twitter). **Parameters** - **tweet\_id** ( `string`, required) The ID of the tweet you want to delete ## X.SearchRecentTweetsByUsername [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/x\#xsearchrecenttweetsbyusername) See Example > Search for recent tweets (last 7 days) on X (Twitter) by username. **Parameters** - **username** ( `string`, required) The username of the X (Twitter) user to look up - **max\_results** ( `integer`, optional) The maximum number of results to return. Must be in range \[1, 100\] inclusive - **next\_token** ( `string`, optional) The pagination token starting from which to return results ## X.SearchRecentTweetsByKeywords [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/x\#xsearchrecenttweetsbykeywords) See Example > Search for recent tweets (last 7 days) on X (Twitter) by required keywords and phrases. **Parameters** - **keywords** ( `array[string]`, optional) List of keywords that must be present in the tweet - **phrases** ( `array[string]`, optional) List of phrases that must be present in the tweet - **max\_results** ( `integer`, optional) The maximum number of results to return. Must be in range \[1, 100\] inclusive - **next\_token** ( `string`, optional) The pagination token starting from which to return results ## X.LookupTweetById [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/x\#xlookuptweetbyid) See Example > Look up a tweet on X (Twitter) by tweet ID. **Parameters** - **tweet\_id** ( `string`, required) The ID of the tweet you want to look up ## Auth [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/x\#auth) The Arcade X toolkit uses the [X auth provider](https://docs.arcade.dev/home/auth-providers/x) to connect to users’ X accounts. Please refer to the [X auth provider](https://docs.arcade.dev/home/auth-providers/x) documentation to learn how to configure auth. ## Get Building [Use tools hosted on Arcade Cloud\\ \\ Arcade tools are hosted by our cloud platform and ready to be used in your agents. Learn how.](https://docs.arcade.dev/home/quickstart) [Self Host Arcade tools\\ \\ Arcade tools can be self-hosted on your own infrastructure. Learn more about self-hosting.\\ \\ ```\\ pip install arcade_x\\ ```](https://docs.arcade.dev/home/hosting-overview) [Reference](https://docs.arcade.dev/mcp-servers/social-communication/twilio/reference "Reference") [Zoom](https://docs.arcade.dev/mcp-servers/social-communication/zoom "Zoom") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## AI Agent Deployment # Welcome to Arcade! Learn how to move AI agents from demo to production with Arcade. Arcade enables your AI agent to securely take real-world actions through user-specific permissions, pre-built toolkits for Gmail, Slack, GitHub, and more. You can also build your own agentic tools and MCP servers with our authoring and testing suite. Arcade is your tool engine,registry, andruntime. Get started with a 5-minute quickstart. [Get Started](https://docs.arcade.dev/home/quickstart) [Build a tool](https://docs.arcade.dev/home/build-tools/create-a-mcp-server) Give your AI IDE access to Arcade.dev's documentation using our llms.txt files ( [short llms.txt](https://docs.arcade.dev/llms.txt), [llms-full.txt](https://docs.arcade.dev/llms-full.txt)), or use [context7](https://context7.com/arcadeai/docs). ## Sample Applications Get started quickly with our pre-built templates and example applications. [![Arcade Chat](https://docs.arcade.dev/_next/image?url=%2Fimages%2Fsample-apps%2Farcade-chat.png&w=3840&q=75)\\ \\ **Arcade Chat** \\ \\ A chatbot that can help you with your daily tasks.](https://chat.arcade.dev/) [![Archer](https://docs.arcade.dev/_next/image?url=%2Fimages%2Flogo%2Farcade.png&w=3840&q=75)\\ \\ **Archer** \\ \\ A bot for Slack that can act on your behalf.](https://github.com/ArcadeAI/ArcadeSlackAgent) [![Summarize YouTube Podcasts in Slack](https://docs.arcade.dev/_next/image?url=%2Fimages%2Fsample-apps%2Fslack-aipodcast-summaries.jpg&w=3840&q=75)\\ \\ **Summarize YouTube Podcasts in Slack** \\ \\ A Slack bot that extracts and summarizes YouTube transcripts in Weaviate, perfect for AI podcasts.](https://github.com/dforwardfeed/slack-AIpodcast-summaries) ## Arcade Overview ![arcade overview](https://docs.arcade.dev/_next/image?url=%2Fimages%2Foverview.png&w=2048&q=75) [Arcade Engine\\ \\ The Arcade engine is your MCP Server and Agentic tool provider. It allows you to write your tools once and serve them across any LLM or orchestration framework, no matter the protocol. The engine manages agent authentication, tool registration, and tool execution.](https://docs.arcade.dev/home#) [Dashboard\\ \\ The Arcade Dashboard is how you manage your tools, users, and deployments from a single place. No matter how large your deployment or organization gets, the Dashboard will scale with you.](https://docs.arcade.dev/home#) [Public and Private Tools\\ \\ Arcade makes it easy to develop custom tools that just work with Agents. Our SDKs and framework integrations make it easy to get started. When you are ready, it's easy to run your tools either on-prem or in our cloud.](https://docs.arcade.dev/home#) [Tools and MCP Servers Together\\ \\ The Arcade Engine is the only way to combine MCP servers with your Agentic tools. Regardless of where your tool is hosted, you can serve and manage access to it via the Engine. You easily can mix our public tools with your own private tools in your agents.](https://docs.arcade.dev/home#) [Contact us](https://docs.arcade.dev/home/contact-us "[object Object]") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Google News Toolkit [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Search Tools](https://docs.arcade.dev/mcp-servers/search/google_finance "Search Tools") Google News # Google News **Description:** Enable agents to search for news stories with Google News. **Author:** Arcade **Auth:** API Key [![PyPI Version](https://img.shields.io/pypi/v/arcade_google-news)](https://pypi.org/project/arcade_google-news/)[![License](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/arcadeai/arcade-ai/blob/main/LICENSE)[![Python Versions](https://img.shields.io/pypi/pyversions/arcade_google-news)](https://pypi.org/project/arcade_google-news/)[![Wheel Status](https://img.shields.io/pypi/wheel/arcade_google-news)](https://pypi.org/project/arcade_google-news/)[![Downloads](https://img.shields.io/pypi/dm/arcade_google-news)](https://pypi.org/project/arcade_google-news/) The Arcade Google News MCP Server provides a pre-built set of tools for interacting with Google News. These tools make it easy to build agents and AI apps that can: - Search for news stories with Google News. ## Available Tools [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/google_news\#available-tools) | Tool Name | Description | | --- | --- | | GoogleNews.SearchNews | Search for news stories with Google News. | If you need to perform an action that’s not listed here, you can [get in touch\\ with us](mailto:contact@arcade.dev) to request a new tool, or [create your\\ own tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server). ## GoogleNews.SearchNews [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/google_news\#googlenewssearchnews) See Example > Search for news stories with Google News. **Parameters** - **`query`** _(string, required)_ Keywords to search for news articles. E.g. ‘Apple launches new iPhone’. - **`country_code`** _(string, optional, Defaults to `None`)_ 2-character country code to search for news articles. E.g. ‘us’ (United States). Defaults to `None` (search news globally). - **`language`** _(string, optional, Defaults to ‘en’ English)_ 2-character language code to search for news articles. E.g. ‘en’ (English). Defaults to ‘en’ (English). - **`limit`** _(int, optional, Defaults to `None`)_ Maximum number of news articles to return. Defaults to None (returns all results found by the API). ## Auth [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/google_news\#auth) The Arcade Google News toolkit uses the [SerpAPI](https://serpapi.com/) to get news data from Google News. - **Secret:** - `SERP_API_KEY`: Your SerpAPI API key. Setting the `SERP_API_KEY` secret is only required if you are [self-hosting](https://docs.arcade.dev/home/deployment/engine-configuration) Arcade. If you’re using Arcade Cloud, the secret is already set for you. To manage your secrets, go to the [Secrets page](https://api.arcade.dev/dashboard/auth/secrets) in the Arcade Dashboard. ## Default parameters [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/google_news\#default-parameters) Language and Country are configurable through environment variables. When set, they will be used as default for Google News tools. Providing a different value as `language_code` or `country_code` argument in the tool call will override the default value. **Language** The language code is a 2-character code that determines the language in which the API will search and return news articles. There are two environment variables: - `ARCADE_GOOGLE_LANGUAGE`: a default value for all Google search tools. If not set, defaults to ‘en’ (English). - `ARCADE_GOOGLE_NEWS_LANGUAGE`: a default value for the news search tools. If not set, defaults to `ARCADE_GOOGLE_LANGUAGE`. A list of supported language codes can be found [here](https://docs.arcade.dev/mcp-servers/search/google_news#languagecodes). **Country** The country code is a 2-character code that determines the country in which the API will search for news articles. There are two environment variables: - `ARCADE_GOOGLE_NEWS_COUNTRY`: a default value for the `SearchNews` tool. If not set, defaults to `None` (search news globally). A list of supported country codes can be found [here](https://docs.arcade.dev/mcp-servers/search/google_news#countrycodes). * * * ## Reference [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/google_news\#reference) ## LanguageCodes [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/google_news\#languagecodes) - **`ar`**: Arabic - **`bn`**: Bengali - **`da`**: Danish - **`de`**: German - **`el`**: Greek - **`en`**: English - **`es`**: Spanish - **`fi`**: Finnish - **`fr`**: French - **`hi`**: Hindi - **`hu`**: Hungarian - **`id`**: Indonesian - **`it`**: Italian - **`ja`**: Japanese - **`ko`**: Korean - **`ms`**: Malay - **`nl`**: Dutch - **`no`**: Norwegian - **`pcm`**: Nigerian Pidgin - **`pl`**: Polish - **`pt`**: Portuguese - **`pt-br`**: Portuguese (Brazil) - **`pt-pt`**: Portuguese (Portugal) - **`ru`**: Russian - **`sv`**: Swedish - **`tl`**: Filipino - **`tr`**: Turkish - **`uk`**: Ukrainian - **`zh`**: Chinese - **`zh-cn`**: Chinese (Simplified) - **`zh-tw`**: Chinese (Traditional) ## CountryCodes [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/google_news\#countrycodes) - **`af`**: Afghanistan - **`al`**: Albania - **`dz`**: Algeria - **`as`**: American Samoa - **`ad`**: Andorra - **`ao`**: Angola - **`ai`**: Anguilla - **`aq`**: Antarctica - **`ag`**: Antigua and Barbuda - **`ar`**: Argentina - **`am`**: Armenia - **`aw`**: Aruba - **`au`**: Australia - **`at`**: Austria - **`az`**: Azerbaijan - **`bs`**: Bahamas - **`bh`**: Bahrain - **`bd`**: Bangladesh - **`bb`**: Barbados - **`by`**: Belarus - **`be`**: Belgium - **`bz`**: Belize - **`bj`**: Benin - **`bm`**: Bermuda - **`bt`**: Bhutan - **`bo`**: Bolivia - **`ba`**: Bosnia and Herzegovina - **`bw`**: Botswana - **`bv`**: Bouvet Island - **`br`**: Brazil - **`io`**: British Indian Ocean Territory - **`bn`**: Brunei Darussalam - **`bg`**: Bulgaria - **`bf`**: Burkina Faso - **`bi`**: Burundi - **`kh`**: Cambodia - **`cm`**: Cameroon - **`ca`**: Canada - **`cv`**: Cape Verde - **`ky`**: Cayman Islands - **`cf`**: Central African Republic - **`td`**: Chad - **`cl`**: Chile - **`cn`**: China - **`cx`**: Christmas Island - **`cc`**: Cocos (Keeling) Islands - **`co`**: Colombia - **`km`**: Comoros - **`cg`**: Congo - **`cd`**: Congo, the Democratic Republic of the - **`ck`**: Cook Islands - **`cr`**: Costa Rica - **`ci`**: Cote D’ivoire - **`hr`**: Croatia - **`cu`**: Cuba - **`cy`**: Cyprus - **`cz`**: Czech Republic - **`dk`**: Denmark - **`dj`**: Djibouti - **`dm`**: Dominica - **`do`**: Dominican Republic - **`ec`**: Ecuador - **`eg`**: Egypt - **`sv`**: El Salvador - **`gq`**: Equatorial Guinea - **`er`**: Eritrea - **`ee`**: Estonia - **`et`**: Ethiopia - **`fk`**: Falkland Islands (Malvinas) - **`fo`**: Faroe Islands - **`fj`**: Fiji - **`fi`**: Finland - **`fr`**: France - **`gf`**: French Guiana - **`pf`**: French Polynesia - **`tf`**: French Southern Territories - **`ga`**: Gabon - **`gm`**: Gambia - **`ge`**: Georgia - **`de`**: Germany - **`gh`**: Ghana - **`gi`**: Gibraltar - **`gr`**: Greece - **`gl`**: Greenland - **`gd`**: Grenada - **`gp`**: Guadeloupe - **`gu`**: Guam - **`gt`**: Guatemala - **`gg`**: Guernsey - **`gn`**: Guinea - **`gw`**: Guinea-Bissau - **`gy`**: Guyana - **`ht`**: Haiti - **`hm`**: Heard Island and Mcdonald Islands - **`va`**: Holy See (Vatican City State) - **`hn`**: Honduras - **`hk`**: Hong Kong - **`hu`**: Hungary - **`is`**: Iceland - **`in`**: India - **`id`**: Indonesia - **`ir`**: Iran, Islamic Republic of - **`iq`**: Iraq - **`ie`**: Ireland - **`im`**: Isle of Man - **`il`**: Israel - **`it`**: Italy - **`je`**: Jersey - **`jm`**: Jamaica - **`jp`**: Japan - **`jo`**: Jordan - **`kz`**: Kazakhstan - **`ke`**: Kenya - **`ki`**: Kiribati - **`kp`**: Korea, Democratic People’s Republic of - **`kr`**: Korea, Republic of - **`kw`**: Kuwait - **`kg`**: Kyrgyzstan - **`la`**: Lao People’s Democratic Republic - **`lv`**: Latvia - **`lb`**: Lebanon - **`ls`**: Lesotho - **`lr`**: Liberia - **`ly`**: Libyan Arab Jamahiriya - **`li`**: Liechtenstein - **`lt`**: Lithuania - **`lu`**: Luxembourg - **`mo`**: Macao - **`mk`**: Macedonia, the Former Yugosalv Republic of - **`mg`**: Madagascar - **`mw`**: Malawi - **`my`**: Malaysia - **`mv`**: Maldives - **`ml`**: Mali - **`mt`**: Malta - **`mh`**: Marshall Islands - **`mq`**: Martinique - **`mr`**: Mauritania - **`mu`**: Mauritius - **`yt`**: Mayotte - **`mx`**: Mexico - **`fm`**: Micronesia, Federated States of - **`md`**: Moldova, Republic of - **`mc`**: Monaco - **`mn`**: Mongolia - **`me`**: Montenegro - **`ms`**: Montserrat - **`ma`**: Morocco - **`mz`**: Mozambique - **`mm`**: Myanmar - **`na`**: Namibia - **`nr`**: Nauru - **`np`**: Nepal - **`nl`**: Netherlands - **`an`**: Netherlands Antilles - **`nc`**: New Caledonia - **`nz`**: New Zealand - **`ni`**: Nicaragua - **`ne`**: Niger - **`ng`**: Nigeria - **`nu`**: Niue - **`nf`**: Norfolk Island - **`mp`**: Northern Mariana Islands - **`no`**: Norway - **`om`**: Oman - **`pk`**: Pakistan - **`pw`**: Palau - **`ps`**: Palestinian Territory, Occupied - **`pa`**: Panama - **`pg`**: Papua New Guinea - **`py`**: Paraguay - **`pe`**: Peru - **`ph`**: Philippines - **`pn`**: Pitcairn - **`pl`**: Poland - **`pt`**: Portugal - **`pr`**: Puerto Rico - **`qa`**: Qatar - **`re`**: Reunion - **`ro`**: Romania - **`ru`**: Russian Federation - **`rw`**: Rwanda - **`sh`**: Saint Helena - **`kn`**: Saint Kitts and Nevis - **`lc`**: Saint Lucia - **`pm`**: Saint Pierre and Miquelon - **`vc`**: Saint Vincent and the Grenadines - **`ws`**: Samoa - **`sm`**: San Marino - **`st`**: Sao Tome and Principe - **`sa`**: Saudi Arabia - **`sn`**: Senegal - **`rs`**: Serbia - **`sc`**: Seychelles - **`sl`**: Sierra Leone - **`sg`**: Singapore - **`sk`**: Slovakia - **`si`**: Slovenia - **`sb`**: Solomon Islands - **`so`**: Somalia - **`za`**: South Africa - **`gs`**: South Georgia and the South Sandwich Islands - **`es`**: Spain - **`lk`**: Sri Lanka - **`sd`**: Sudan - **`sr`**: Suriname - **`sj`**: Svalbard and Jan Mayen - **`sz`**: Swaziland - **`se`**: Sweden - **`ch`**: Switzerland - **`sy`**: Syrian Arab Republic - **`tw`**: Taiwan, Province of China - **`tj`**: Tajikistan - **`tz`**: Tanzania, United Republic of - **`th`**: Thailand - **`tl`**: Timor-Leste - **`tg`**: Togo - **`tk`**: Tokelau - **`to`**: Tonga - **`tt`**: Trinidad and Tobago - **`tn`**: Tunisia - **`tr`**: Turkiye - **`tm`**: Turkmenistan - **`tc`**: Turks and Caicos Islands - **`tv`**: Tuvalu - **`ug`**: Uganda - **`ua`**: Ukraine - **`ae`**: United Arab Emirates - **`uk`**: United Kingdom - **`gb`**: United Kingdom - **`us`**: United States - **`um`**: United States Minor Outlying Islands - **`uy`**: Uruguay - **`uz`**: Uzbekistan - **`vu`**: Vanuatu - **`ve`**: Venezuela - **`vn`**: Viet Nam - **`vg`**: Virgin Islands, British - **`vi`**: Virgin Islands, U.S. - **`wf`**: Wallis and Futuna - **`eh`**: Western Sahara - **`ye`**: Yemen - **`zm`**: Zambia - **`zw`**: Zimbabwe ## Get Building [Use tools hosted on Arcade Cloud\\ \\ Arcade tools are hosted by our cloud platform and ready to be used in your agents. Learn how.](https://docs.arcade.dev/home/quickstart) [Self Host Arcade tools\\ \\ Arcade tools can be self-hosted on your own infrastructure. Learn more about self-hosting.\\ \\ ```\\ pip install arcade_google_news\\ ```](https://docs.arcade.dev/home/hosting-overview) [Google Maps](https://docs.arcade.dev/mcp-servers/search/google_maps "Google Maps") [Google Search](https://docs.arcade.dev/mcp-servers/search/google_search "Google Search") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Using Arcade Tools [Home](https://docs.arcade.dev/home "Home") [Mastra](https://docs.arcade.dev/home/mastra/overview "Mastra") Using Arcade tools This guide shows you how to integrate and use Arcade tools within a Mastra agent. For the complete working example, check out our [GitHub repository](https://github.com/ArcadeAI/arcade-ai/tree/main/examples/mastra). ### Prerequisites [Permalink for this section](https://docs.arcade.dev/home/mastra/use-arcade-tools\#prerequisites) - [Obtain an Arcade API key](https://docs.arcade.dev/home/api-keys) - Basic familiarity with TypeScript and Mastra concepts ### Create a Mastra project [Permalink for this section](https://docs.arcade.dev/home/mastra/use-arcade-tools\#create-a-mastra-project) Start by creating a new Mastra project using the official CLI: ```nextra-code # Create a new Mastra project npx create-mastra@latest my-arcade-agent # Navigate to the project cd my-arcade-agent ``` For more details on setting up a Mastra project, refer to the [Mastra documentation](https://mastra.ai/docs/getting-started/installation). ### Install Arcade client [Permalink for this section](https://docs.arcade.dev/home/mastra/use-arcade-tools\#install-arcade-client) Install the Arcade client: pnpmnpmyarn ```nextra-code pnpm add @arcadeai/arcadejs ``` ### Configure API keys [Permalink for this section](https://docs.arcade.dev/home/mastra/use-arcade-tools\#configure-api-keys) Set up your environment with the required API keys: ```nextra-code // Set your API keys in your environment variables or .env file process.env.ARCADE_API_KEY = "your_arcade_api_key"; process.env.ANTHROPIC_API_KEY = "your_anthropic_api_key"; // or another supported model provider ``` ### Convert Arcade tools to Mastra tools [Permalink for this section](https://docs.arcade.dev/home/mastra/use-arcade-tools\#convert-arcade-tools-to-mastra-tools) Arcade offers methods to convert tools into Zod schemas, which is essential since Mastra defines tools using Zod. The `toZodToolSet` method is particularly useful, as it simplifies this integration and makes it easier to use Arcade’s tools with Mastra. Learn more about Arcade’s Zod integration options [here](https://docs.arcade.dev/home/use-tools/get-tool-definitions#get-zod-tool-definitions). ```nextra-code import { Arcade } from "@arcadeai/arcadejs"; import { executeOrAuthorizeZodTool, toZodToolSet, } from "@arcadeai/arcadejs/lib"; // Initialize Arcade const arcade = new Arcade(); // Get Gmail toolkit // Toolkit names can be found in the Arcade dashboard via Tools > view > Toolkit or via the CLI `arcade workers list` const gmailToolkit = await arcade.tools.list({ toolkit: "Gmail", limit: 30 }); // Get Gmail tools export const gmailTools = toZodToolSet({ tools: gmailToolkit.items, client: arcade, userId: "", // Your app's internal ID for the user (an email, UUID, etc). It's used internally to identify your user in Arcade executeFactory: executeOrAuthorizeZodTool, // Checks if tool is authorized and executes it, or returns authorization URL if needed }); ``` ### Create and configure your Mastra agent [Permalink for this section](https://docs.arcade.dev/home/mastra/use-arcade-tools\#create-and-configure-your-mastra-agent) Now create a Mastra agent that uses Arcade tools: ```nextra-code import { Agent } from "@mastra/core/agent"; import { anthropic } from "@ai-sdk/anthropic"; // Create the Mastra agent with Arcade tools export const gmailAgent = new Agent({ name: "gmailAgent", instructions: `You are a Gmail assistant that helps users manage their inbox. When helping users: - Always verify their intent before performing actions - Keep responses clear and concise - Confirm important actions before executing them - Respect user privacy and data security Use the gmailTools to interact with various Gmail services and perform related tasks.`, model: anthropic("claude-3-7-sonnet-20250219"), tools: gmailTools, }); ``` ### Interact with your agent [Permalink for this section](https://docs.arcade.dev/home/mastra/use-arcade-tools\#interact-with-your-agent) You can interact with your agent in two main ways: **1\. Using the Mastra Development Playground:** Start the Mastra development server: ```nextra-code npm run dev ``` This will launch a local development playground, typically accessible at `http://localhost:4111`. Open this URL in your browser, select the `gmailAgent` from the list of available agents, and start chatting with it directly in the UI. **2\. Programmatically:** Alternatively, you can interact with the agent directly in your code: ```nextra-code // Generate a response from the agent const response = await gmailAgent.generate( "Read my last email and summarize it in a few sentences", ); console.log(response.text); // Or stream the response for a more interactive experience const stream = await gmailAgent.stream("Send an email to dev@arcade.dev with the subject 'Hello from Mastra'"); for await (const chunk of stream.textStream) { process.stdout.write(chunk); } ``` ⚠️ When running your agent for the first time with tools that require user consent (like Google or Github), the agent will return an authorization reponse (e.g., `{ authorization_required: true, url: '...', message: '...' }`). Your agent’s instructions should guide it to present this URL to the user. After the user visits this URL and grants permissions, the tool can be used successfully. See the [Managing user authorization](https://docs.arcade.dev/home/mastra/user-auth-interrupts) guide for more details on handling authentication flows. [Overview](https://docs.arcade.dev/home/mastra/overview "Overview") [Managing user authorization](https://docs.arcade.dev/home/mastra/user-auth-interrupts "Managing user authorization") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Reddit Auth Provider [Home](https://docs.arcade.dev/home "Home") [Customizing Auth](https://docs.arcade.dev/home/auth-providers "Customizing Auth") Reddit # Reddit auth provider At this time, Arcade does not offer a default Reddit Auth Provider. To use Reddit auth, you must create a custom Auth Provider with your own Reddit OAuth 2.0 credentials as described below. The Reddit auth provider enables tools and agents to call the Reddit API on behalf of a user. Behind the scenes, the Arcade Engine and the Reddit auth provider seamlessly manage Reddit OAuth 2.0 authorization for your users. ### What’s documented here [Permalink for this section](https://docs.arcade.dev/home/auth-providers/reddit\#whats-documented-here) This page describes how to use and configure Reddit auth with Arcade. This auth provider is used by: - Your [app code](https://docs.arcade.dev/home/auth-providers/reddit#using-reddit-auth-in-app-code) that needs to call Reddit APIs - Or, your [custom tools](https://docs.arcade.dev/home/auth-providers/reddit#using-reddit-auth-in-custom-tools) that need to call Reddit APIs ## Configuring Reddit auth [Permalink for this section](https://docs.arcade.dev/home/auth-providers/reddit\#configuring-reddit-auth) When using your own app credentials, make sure you configure your project to use a [custom user verifier](https://docs.arcade.dev/home/auth/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 Reddit app credentials. This way, your users will see your application’s name requesting permission. You can use your own Reddit credentials in both the Arcade Cloud Platform or in a [self-hosted Arcade Engine](https://docs.arcade.dev/home/deployment/engine-configuration) instance. Before showing how to configure your Reddit app credentials, let’s go through the steps to create a Reddit app. ### Create a Reddit app [Permalink for this section](https://docs.arcade.dev/home/auth-providers/reddit\#create-a-reddit-app) - Create a Reddit Application in the [Reddit App Console](https://www.reddit.com/prefs/apps) - Set the OAuth Redirect URL to the redirect URL generated by Arcade (see below) - Copy the App key (Client ID) and App secret (Client Secret), which you’ll need below Next, add the Reddit app to your Arcade Engine configuration. You can do this in the Arcade Dashboard, or by editing the `engine.yaml` file directly (for a self-hosted instance). ## Configuring your own Reddit Auth Provider in Arcade [Permalink for this section](https://docs.arcade.dev/home/auth-providers/reddit\#configuring-your-own-reddit-auth-provider-in-arcade) There are two ways to configure your Reddit app credentials in Arcade: 1. From the Arcade Dashboard GUI 2. By editing the `engine.yaml` file directly (for a self-hosted Arcade Engine) We show both options step-by-step below. Dashboard GUIEngine Configuration YAML ### Configure Reddit Auth Using the Arcade Dashboard GUI #### Access the Arcade Dashboard [Permalink for this section](https://docs.arcade.dev/home/auth-providers/reddit\#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](http://localhost:9099/dashboard). Adjust the host and port number to match your environment. #### Navigate to the OAuth Providers page [Permalink for this section](https://docs.arcade.dev/home/auth-providers/reddit\#navigate-to-the-oauth-providers-page) - Under the **OAuth** section of the Arcade Dashboard left-side menu, click **Providers**. - Click **Add OAuth Provider** in the top right corner. - Select the **Included Providers** tab at the top. - In the **Provider** dropdown, select **Reddit**. #### Enter the provider details [Permalink for this section](https://docs.arcade.dev/home/auth-providers/reddit\#enter-the-provider-details) - Choose a unique **ID** for your provider (e.g. “my-reddit-provider”). - Optionally enter a **Description**. - Enter the **Client ID** and **Client Secret** from your Reddit app. - Note the **Redirect URL** generated by Arcade. This must be set as your Reddit app’s OAuth Redirect URL. #### Create the provider [Permalink for this section](https://docs.arcade.dev/home/auth-providers/reddit\#create-the-provider) Hit the **Create** button and the provider will be ready to be used. When you use tools that require Reddit auth using your Arcade account credentials, the Arcade Engine will automatically use this Reddit OAuth provider. If you have multiple Reddit providers, see [using multiple auth providers of the same type](https://docs.arcade.dev/home/auth-providers#using-multiple-providers-of-the-same-type) for more information. ## Using Reddit auth in app code [Permalink for this section](https://docs.arcade.dev/home/auth-providers/reddit\#using-reddit-auth-in-app-code) Use the Reddit auth provider in your own agents and AI apps to get a user-scoped token for the Reddit API. See [authorizing agents with Arcade](https://docs.arcade.dev/home/auth/how-arcade-helps) to understand how this works. Use `client.auth.start()` to get a user token for the Reddit API: PythonJavaScript ```nextra-code 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="reddit", scopes=["identity"], ) 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 # TODO: Do something interesting with the token... ``` ## Using Reddit auth in custom tools [Permalink for this section](https://docs.arcade.dev/home/auth-providers/reddit\#using-reddit-auth-in-custom-tools) You can author your own [custom tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server) that interact with the Reddit API. Use the `Reddit()` auth class to specify that a tool requires authorization with Reddit. The `context.authorization.token` field will be automatically populated with the user’s Reddit token: ```nextra-code from typing import Annotated import httpx from arcade_tdk import ToolContext, tool from arcade_tdk.auth import Reddit @tool( requires_auth=Reddit( scopes=["identity"], ) ) async def get_user_info( context: ToolContext, ) -> Annotated[dict, "The user info"]: """Get the user info for the current user.""" url = "https://oauth.reddit.com/api/v1/me" headers = { "Authorization": f"Bearer {context.authorization.token}", "User-Agent": "YourAppName v1.0 by u/YourRedditUsername", } async with httpx.AsyncClient() as client: response = await client.get(url, headers=headers) response.raise_for_status() return response.json() ``` [OAuth 2.0](https://docs.arcade.dev/home/auth-providers/oauth2 "OAuth 2.0") [Salesforce](https://docs.arcade.dev/home/auth-providers/salesforce "Salesforce") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Contribute a Toolkit [Integrations](https://docs.arcade.dev/toolkits "Integrations") Contribute a toolkit # How to contribute a toolkit Arcade welcomes your toolkit contributions. By adding your toolkit to the Arcade documentation, you help other developers discover and use your tools. Follow these steps to submit your own toolkit. ## Prerequisites [Permalink for this section](https://docs.arcade.dev/mcp-servers/contribute-a-toolkit\#prerequisites) - Build your toolkit. See [build a toolkit](https://docs.arcade.dev/home/build-tools/create-a-mcp-server) for guidance. - Publish your toolkit on PyPI. ## Submit your toolkit [Permalink for this section](https://docs.arcade.dev/mcp-servers/contribute-a-toolkit\#submit-your-toolkit) Open a pull request in the [Arcade Documentation GitHub repository](https://github.com/ArcadeAI/docs) that completes the [community toolkit checklist](https://github.com/ArcadeAI/docs/blob/main/.github/PULL_REQUEST_TEMPLATE/community_contributed_toolkit.md). The checklist will guide you through the necessary steps to ensure your toolkit contribution is successful. ## Review and merge [Permalink for this section](https://docs.arcade.dev/mcp-servers/contribute-a-toolkit\#review-and-merge) After submitting your pull request: - Double-check all checklist items have been completed. - Address any feedback from the reviewers. - Once approved, your toolkit will be added to the Arcade documentation for other developers to discover and use! [Reference](https://docs.arcade.dev/mcp-servers/customer-support/zendesk/reference "Reference") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Zendesk Customer Support [Integrations](https://docs.arcade.dev/toolkits "Integrations") Customer SupportZendesk # Zendesk **Description:** Enable agents to interact with Zendesk **Author:** Arcade **Code:** [GitHub](https://github.com/ArcadeAI/arcade-ai/tree/main/mcp-servers/zendesk) **Auth:** User authorization [![PyPI Version](https://img.shields.io/pypi/v/arcade_zendesk)](https://pypi.org/project/arcade_zendesk/)[![License](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/arcadeai/arcade-ai/blob/main/LICENSE)[![Python Versions](https://img.shields.io/pypi/pyversions/arcade_zendesk)](https://pypi.org/project/arcade_zendesk/)[![Wheel Status](https://img.shields.io/pypi/wheel/arcade_zendesk)](https://pypi.org/project/arcade_zendesk/)[![Downloads](https://img.shields.io/pypi/dm/arcade_zendesk)](https://pypi.org/project/arcade_zendesk/) The Zendesk MCP Server provides a set of tools for managing customer support tickets and knowledge base articles. With this toolkit, users can: - List and paginate through tickets in their Zendesk account. - Retrieve all comments for specific tickets, including the original description and conversation history. - Add comments to existing tickets to facilitate communication. - Mark tickets as solved, optionally including a final comment. - Search for published Help Center articles in the knowledge base, with support for multiple filters in a single request. This toolkit streamlines the process of handling customer inquiries and accessing support resources. ## Available Tools [Permalink for this section](https://docs.arcade.dev/mcp-servers/customer-support/zendesk\#available-tools) | Tool Name | Description | | --- | --- | | Zendesk.ListTickets | List tickets from your Zendesk account with offset-based pagination. | | Zendesk.GetTicketComments | Get all comments for a specific Zendesk ticket, including the original description. | | Zendesk.AddTicketComment | Add a comment to an existing Zendesk ticket. | | Zendesk.MarkTicketSolved | Mark a Zendesk ticket as solved, optionally with a final comment. | | Zendesk.SearchArticles | Search for Help Center articles in your Zendesk knowledge base. | | Zendesk.WhoAmI | Get comprehensive user profile and Zendesk account information. | If you need to perform an action that’s not listed here, you can [get in touch\\ with us](mailto:contact@arcade.dev) to request a new tool, or [create your\\ own tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server). ## Zendesk.ListTickets [Permalink for this section](https://docs.arcade.dev/mcp-servers/customer-support/zendesk\#zendesklisttickets) See Example > List tickets from your Zendesk account with offset-based pagination. **Parameters** - **status** ( `Enum` [TicketStatus](https://docs.arcade.dev/mcp-servers/customer-support/zendesk/reference#TicketStatus), optional) The status of tickets to filter by. Defaults to ‘open’ - **limit** ( `integer`, optional) Number of tickets to return. Defaults to 30 - **offset** ( `integer`, optional) Number of tickets to skip before returning results. Defaults to 0 - **sort\_order** ( `Enum` [SortOrder](https://docs.arcade.dev/mcp-servers/customer-support/zendesk/reference#SortOrder), optional) Sort order for tickets by ID. ‘asc’ returns oldest first, ‘desc’ returns newest first. Defaults to ‘desc’ **Secrets** This tool requires the following secrets: `zendesk_subdomain` (learn how to [configure secrets](https://docs.arcade.dev/home/build-tools/create-a-tool-with-secrets#supplying-the-secret)) ## Zendesk.GetTicketComments [Permalink for this section](https://docs.arcade.dev/mcp-servers/customer-support/zendesk\#zendeskgetticketcomments) See Example > Get all comments for a specific Zendesk ticket, including the original description. **Parameters** - **ticket\_id** ( `integer`, required) The ID of the ticket to get comments for **Secrets** This tool requires the following secrets: `zendesk_subdomain` (learn how to [configure secrets](https://docs.arcade.dev/home/build-tools/create-a-tool-with-secrets#supplying-the-secret)) ## Zendesk.AddTicketComment [Permalink for this section](https://docs.arcade.dev/mcp-servers/customer-support/zendesk\#zendeskaddticketcomment) See Example > Add a comment to an existing Zendesk ticket. **Parameters** - **ticket\_id** ( `integer`, required) The ID of the ticket to comment on - **comment\_body** ( `string`, required) The text of the comment - **public** ( `boolean`, optional) Whether the comment is public (visible to requester) or internal. Defaults to True **Secrets** This tool requires the following secrets: `zendesk_subdomain` (learn how to [configure secrets](https://docs.arcade.dev/home/build-tools/create-a-tool-with-secrets#supplying-the-secret)) ## Zendesk.MarkTicketSolved [Permalink for this section](https://docs.arcade.dev/mcp-servers/customer-support/zendesk\#zendeskmarkticketsolved) See Example > Mark a Zendesk ticket as solved, optionally with a final comment. **Parameters** - **ticket\_id** ( `integer`, required) The ID of the ticket to mark as solved - **comment\_body** ( `string`, optional) Optional final comment to add when solving the ticket - **comment\_public** ( `boolean`, optional) Whether the comment is visible to the requester. Defaults to False **Secrets** This tool requires the following secrets: `zendesk_subdomain` (learn how to [configure secrets](https://docs.arcade.dev/home/build-tools/create-a-tool-with-secrets#supplying-the-secret)) ## Zendesk.SearchArticles [Permalink for this section](https://docs.arcade.dev/mcp-servers/customer-support/zendesk\#zendesksearcharticles) See Example > Search for Help Center articles in your Zendesk knowledge base. **Parameters** - **query** ( `string`, optional) Search text to match against articles. Supports quoted expressions for exact matching - **label\_names** ( `array[string]`, optional) List of label names to filter by (case-insensitive). Article must have at least one matching label. Available on Professional/Enterprise plans only - **created\_after** ( `string`, optional) Filter articles created after this date (format: YYYY-MM-DD) - **created\_before** ( `string`, optional) Filter articles created before this date (format: YYYY-MM-DD) - **created\_at** ( `string`, optional) Filter articles created on this exact date (format: YYYY-MM-DD) - **sort\_by** ( `Enum` [ArticleSortBy](https://docs.arcade.dev/mcp-servers/customer-support/zendesk/reference#ArticleSortBy), optional) Field to sort articles by. Defaults to relevance according to the search query - **sort\_order** ( `Enum` [SortOrder](https://docs.arcade.dev/mcp-servers/customer-support/zendesk/reference#SortOrder), optional) Sort order direction. Defaults to descending - **limit** ( `integer`, optional) Number of articles to return. Defaults to 30 - **offset** ( `integer`, optional) Number of articles to skip before returning results. Defaults to 0 - **include\_body** ( `boolean`, optional) Include article body content in results. Bodies will be cleaned of HTML and truncated - **max\_article\_length** ( `integer`, optional) Maximum length for article body content in characters. Set to None for no limit. Defaults to 500 **Secrets** This tool requires the following secrets: `zendesk_subdomain` (learn how to [configure secrets](https://docs.arcade.dev/home/build-tools/create-a-tool-with-secrets#supplying-the-secret)) ## Zendesk.WhoAmI [Permalink for this section](https://docs.arcade.dev/mcp-servers/customer-support/zendesk\#zendeskwhoami) See Example > Get comprehensive user profile and Zendesk account information. **Parameters** This tool does not take any parameters. **Secrets** This tool requires the following secrets: `zendesk_subdomain` (learn how to [configure secrets](https://docs.arcade.dev/home/build-tools/create-a-tool-with-secrets#supplying-the-secret)) ## Get Building [Use tools hosted on Arcade Cloud\\ \\ Arcade tools are hosted by our cloud platform and ready to be used in your agents. Learn how.](https://docs.arcade.dev/home/quickstart) [Self Host Arcade tools\\ \\ Arcade tools can be self-hosted on your own infrastructure. Learn more about self-hosting.\\ \\ ```\\ pip install arcade_zendesk\\ ```](https://docs.arcade.dev/home/hosting-overview) [Clickhouse](https://docs.arcade.dev/mcp-servers/databases/clickhouse "Clickhouse") [Reference](https://docs.arcade.dev/mcp-servers/customer-support/zendesk/reference "Reference") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Direct API Call Guide [Home](https://docs.arcade.dev/home "Home") [Authorization](https://docs.arcade.dev/home/auth/how-arcade-helps "Authorization") Direct Third-Party API Call # Direct Third-Party API Call In this guide, you’ll learn how to use Arcade to obtain user authorization and interact with third-party services by calling their API endpoints directly, without using Arcade for tool execution or definition. We’ll use Google’s Gmail API as an example to demonstrate how to: - Get authorization tokens through Arcade - Handle user authentication flows - Use tokens with external services This can be useful when you need to manage authorization flows in your application. ### Prerequisites [Permalink for this section](https://docs.arcade.dev/home/auth/call-third-party-apis-directly\#prerequisites) - Sign up for an [Arcade account](https://api.arcade.dev/signup) if you haven’t already - Generate an [Arcade API key](https://docs.arcade.dev/home/api-keys) and take note of it ### Install required libraries [Permalink for this section](https://docs.arcade.dev/home/auth/call-third-party-apis-directly\#install-required-libraries) PythonJavaScript ```nextra-code pip install arcadepy google-api-python-client google-auth-httplib2 google-auth-oauthlib ``` ### Start coding [Permalink for this section](https://docs.arcade.dev/home/auth/call-third-party-apis-directly\#start-coding) PythonJavaScript Create a new file `direct_api_call.py` and import all libraries we’re going to use: ```nextra-code from arcadepy import Arcade from google.oauth2.credentials import Credentials from googleapiclient.discovery import build ``` ### Initialize the Arcade client [Permalink for this section](https://docs.arcade.dev/home/auth/call-third-party-apis-directly\#initialize-the-arcade-client) Create an instance of the Arcade client: PythonJavaScript ```nextra-code client = Arcade() # Automatically finds the `ARCADE_API_KEY` env variable ``` ### Initiate an authorization request [Permalink for this section](https://docs.arcade.dev/home/auth/call-third-party-apis-directly\#initiate-an-authorization-request) Use `client.auth.start()` to initiate the authorization process: PythonJavaScript ```nextra-code # This would be your app's internal ID for the user (an email, UUID, etc.) user_id = "{arcade_user_id}" # Start the authorization process auth_response = client.auth.start( user_id=user_id, provider="google", scopes=["https://www.googleapis.com/auth/gmail.readonly"], ) ``` ### Guide the user through authorization [Permalink for this section](https://docs.arcade.dev/home/auth/call-third-party-apis-directly\#guide-the-user-through-authorization) If authorization is not completed, prompt the user to visit the authorization URL: PythonJavaScript ```nextra-code if auth_response.status != "completed": print("Please complete the authorization challenge in your browser:") print(auth_response.url) ``` ### Wait for the user to authorize the request [Permalink for this section](https://docs.arcade.dev/home/auth/call-third-party-apis-directly\#wait-for-the-user-to-authorize-the-request) PythonJavaScript ```nextra-code auth_response = client.auth.wait_for_completion(auth_response) ``` ### Use the obtained token [Permalink for this section](https://docs.arcade.dev/home/auth/call-third-party-apis-directly\#use-the-obtained-token) Once authorization is complete, you can use the obtained token to access the third-party service: PythonJavaScript ```nextra-code credentials = Credentials(auth_response.context.token) gmail = build("gmail", "v1", credentials=credentials) email_messages = ( gmail.users().messages().list(userId="me").execute().get("messages", []) ) print(email_messages) ``` ### Execute the code [Permalink for this section](https://docs.arcade.dev/home/auth/call-third-party-apis-directly\#execute-the-code) PythonJavaScript ```nextra-code python3 direct_api_call.py ``` You should see an output similar to this:, which is a list of the email messages returned by the Gmail API: ```nextra-code [{'id': '195f77a8ce90f2c1', 'threadId': '195f77a8ce90f2c1'}, {'id': '195ed467a90e8538', 'threadId': '195ed467a90e8538'}, ...] ``` For each item in the list/array, you could use the [`users.messages.get`](https://developers.google.com/workspace/gmail/api/reference/rest/v1/users.messages/get) endpoint to get the full message details. Consider using the [Arcade Gmail toolkit](https://docs.arcade.dev/mcp-servers/productivity/gmail), which simplifies the process for retrieving email messages even further! The pattern described here is useful if you need to directly get a token to use with Google in other parts of your codebase. ### How it works [Permalink for this section](https://docs.arcade.dev/home/auth/call-third-party-apis-directly\#how-it-works) By using `client.auth.start` and `client.auth.wait_for_completion`, you leverage Arcade to manage the OAuth flow for user authorization. Arcade handles the authorization challenges and tokens, simplifying the process for you. ### Next steps [Permalink for this section](https://docs.arcade.dev/home/auth/call-third-party-apis-directly\#next-steps) Integrate this authorization flow into your application, and explore how you can manage different [auth providers](https://docs.arcade.dev/home/auth-providers) and scopes. [Checking Authorization Status](https://docs.arcade.dev/home/auth/tool-auth-status "Checking Authorization Status") [Secure Auth in Production](https://docs.arcade.dev/home/auth/secure-auth-production "Secure Auth in Production") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Custom Auth Flow [Home](https://docs.arcade.dev/home "Home") [CrewAI](https://docs.arcade.dev/home/crewai/use-arcade-tools "CrewAI") Custom auth flow ## Custom Auth Flow with CrewAI [Permalink for this section](https://docs.arcade.dev/home/crewai/custom-auth-flow\#custom-auth-flow-with-crewai) In this guide, we will explore how to create a custom auth flow that will be performed before executing Arcade tools within your CrewAI agent team. The `ArcadeToolManager`’s built-in authorization and tool execution flows work well for many typical use cases. However, some scenarios call for a tailored approach. By implementing a custom auth flow, you gain flexibility in handling tool authorization. If your use case calls for a unique interface, additional approval steps, or specialized error handling, then this guide is for you. ### Prerequisites [Permalink for this section](https://docs.arcade.dev/home/crewai/custom-auth-flow\#prerequisites) - [Obtain an Arcade API key](https://docs.arcade.dev/home/api-keys) ### Set up your environment [Permalink for this section](https://docs.arcade.dev/home/crewai/custom-auth-flow\#set-up-your-environment) Install the required package, and ensure your environment variables are set with your Arcade and OpenAI API keys: ```nextra-code pip install crewai-arcade ``` ### Configure API keys [Permalink for this section](https://docs.arcade.dev/home/crewai/custom-auth-flow\#configure-api-keys) Provide your Arcade and OpenAI API keys. You can store them in environment variables like so: ```nextra-code export ARCADE_API_KEY="your_arcade_api_key" export OPENAI_API_KEY="your_openai_api_key" ``` ### Define your custom auth flow [Permalink for this section](https://docs.arcade.dev/home/crewai/custom-auth-flow\#define-your-custom-auth-flow) The custom auth flow defined in the following code snippet is a function that will be called whenever CrewAI needs to call a tool. ```nextra-code from typing import Any from crewai_arcade import ArcadeToolManager USER_ID = "{arcade_user_id}" def custom_auth_flow( manager: ArcadeToolManager, tool_name: str, **tool_input: dict[str, Any] ) -> Any: """Custom auth flow for the ArcadeToolManager This function is called when CrewAI needs to call a tool that requires authorization. Authorization is handled before executing the tool. This function overrides the ArcadeToolManager's default auth flow performed by ArcadeToolManager.authorize_tool """ # Get authorization status auth_response = manager.authorize(tool_name, USER_ID) # If the user is not authorized for the tool, # then we need to handle the authorization before executing the tool if not manager.is_authorized(auth_response.id): print(f"Authorization required for tool: '{tool_name}' with inputs:") for input_name, input_value in tool_input.items(): print(f" {input_name}: {input_value}") # Handle authorization print(f"\nTo authorize, visit: {auth_response.url}") # Block until the user has completed the authorization auth_response = manager.wait_for_auth(auth_response) # Ensure authorization completed successfully if not manager.is_authorized(auth_response.id): raise ValueError(f"Authorization failed for {tool_name}. URL: {auth_response.url}") else: print(f"Authorization already granted for tool: '{tool_name}' with inputs:") for input_name, input_value in tool_input.items(): print(f" {input_name}: {input_value}") def tool_manager_callback(tool_manager: ArcadeToolManager, tool_name: str, **tool_input: dict[str, Any]) -> Any: """Tool executor callback with custom auth flow for the ArcadeToolManager ArcadeToolManager's default executor handles authorization and tool execution. This function overrides the default executor to handle authorization in a custom way and then executes the tool. """ custom_auth_flow(tool_manager, tool_name, **tool_input) return tool_manager.execute_tool(USER_ID, tool_name, **tool_input) ``` ### Get Arcade tools [Permalink for this section](https://docs.arcade.dev/home/crewai/custom-auth-flow\#get-arcade-tools) You can now provide the tool manager callback to the `ArcadeToolManager` upon initialization: ```nextra-code # Provide the tool manager callback to the ArcadeToolManager manager = ArcadeToolManager(executor=tool_manager_callback) # Retrieve the provided tools and/or toolkits as CrewAI StructuredTools. tools = manager.get_tools(tools=["Gmail.ListEmails"], toolkits=["Slack"]) ``` ### Use tools in your CrewAI agent team [Permalink for this section](https://docs.arcade.dev/home/crewai/custom-auth-flow\#use-tools-in-your-crewai-agent-team) Create a Crew that uses your tools with the custom auth flow. When the tool is called, your tool manager callback will be called to handle the authorization and then the tool will be executed. ```nextra-code from crewai import Agent, Crew, Task from crewai.llm import LLM crew_agent = Agent( role="Main Agent", backstory="You are a helpful assistant", goal="Help the user with their requests", tools=tools, allow_delegation=False, verbose=True, llm=LLM(model="gpt-4o"), ) task = Task( description="Get the 5 most recent emails from the user's inbox and summarize them and recommend a response for each.", expected_output="A bulleted list with a one sentence summary of each email and a recommended response to the email.", agent=crew_agent, tools=crew_agent.tools, ) crew = Crew( agents=[crew_agent], tasks=[task], verbose=True, memory=True, ) result = crew.kickoff() print("\n\n\n ------------ Result ------------ \n\n\n") print(result) ``` Click to view a full example ## Next steps [Permalink for this section](https://docs.arcade.dev/home/crewai/custom-auth-flow\#next-steps) Now you’re ready to integrate Arcade tools with a custom auth flow into your own CrewAI agent team. [Using Arcade tools](https://docs.arcade.dev/home/crewai/use-arcade-tools "Using Arcade tools") [Overview](https://docs.arcade.dev/home/google-adk/overview "Overview") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## SharePoint Toolkit [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Productivity & Docs](https://docs.arcade.dev/mcp-servers/productivity/asana "Productivity & Docs") Sharepoint # Sharepoint **Description:** Enable agents to interact with Sharepoint **Author:** Arcade **Auth:** User authorization [![PyPI Version](https://img.shields.io/pypi/v/arcade_sharepoint)](https://pypi.org/project/arcade_sharepoint/)[![License](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/arcadeai/arcade-ai/blob/main/LICENSE)[![Python Versions](https://img.shields.io/pypi/pyversions/arcade_sharepoint)](https://pypi.org/project/arcade_sharepoint/)[![Wheel Status](https://img.shields.io/pypi/wheel/arcade_sharepoint)](https://pypi.org/project/arcade_sharepoint/)[![Downloads](https://img.shields.io/pypi/dm/arcade_sharepoint)](https://pypi.org/project/arcade_sharepoint/) The SharePoint MCP Server provides a comprehensive set of tools for interacting with SharePoint sites and their contents. Users can perform various actions, including: - Retrieve lists, items, and pages from SharePoint sites. - Access metadata and content of specific pages. - Search for and retrieve information about SharePoint sites and drives. - Browse and download files from SharePoint drives / document libraries. This toolkit simplifies the process of accessing and managing SharePoint resources efficiently for AI Agents and chat bots. ## Available Tools [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/sharepoint\#available-tools) | Tool Name | Description | | --- | --- | | Sharepoint.GetListsFromSite | Retrieve lists from a SharePoint site. | | Sharepoint.GetItemsFromList | Retrieve items from a list in a SharePoint site. | | Sharepoint.GetPage | Retrieve metadata and the contents of a page in a SharePoint site. | | Sharepoint.ListPages | Retrieve pages from a SharePoint site. | | Sharepoint.GetSite | Retrieve information about a specific SharePoint site by its ID, URL, or name. | | Sharepoint.SearchSites | Search for SharePoint sites by name or description. | | Sharepoint.ListSites | List all SharePoint sites accessible to the current user. | | Sharepoint.GetFollowedSites | Retrieve a list of SharePoint sites that are followed by the current user. | | Sharepoint.GetDrivesFromSite | Retrieve drives / document libraries from a SharePoint site. | | Sharepoint.ListRootItemsInDrive | Retrieve items from the root of a drive in a SharePoint site. | | Sharepoint.ListItemsInFolder | Retrieve items from a folder in a drive in a SharePoint site. | | Sharepoint.SearchDriveItems | Search for items in one or more Sharepoint drives. | If you need to perform an action that’s not listed here, you can [get in touch\\ with us](mailto:contact@arcade.dev) to request a new tool, or [create your\\ own tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server). ## Sharepoint.GetListsFromSite [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/sharepoint\#sharepointgetlistsfromsite) See Example > Retrieve lists from a SharePoint site. **Parameters** - **site** ( `string`, required) Site ID, SharePoint URL, or site name to get lists from. Prefer using a site ID whenever available for optimal performance. ## Sharepoint.GetItemsFromList [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/sharepoint\#sharepointgetitemsfromlist) See Example > Retrieve items from a list in a SharePoint site. **Parameters** - **site** ( `string`, required) Site ID, SharePoint URL, or site name to get lists from. Prefer using a site ID whenever available for optimal performance. - **list\_id** ( `string`, required) The ID of the list to get items from. ## Sharepoint.GetPage [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/sharepoint\#sharepointgetpage) See Example > Retrieve metadata and the contents of a page in a SharePoint site. **Parameters** - **site** ( `string`, required) Site ID, SharePoint URL, or site name to retrieve base pages from. Prefer using a site ID whenever available for optimal performance - **page\_id** ( `string`, required) The ID of the page to retrieve. - **include\_page\_content** ( `boolean`, optional) Whether to include the page content in the response. Defaults to True. If set to False, the tool will return only the page metadata. ## Sharepoint.ListPages [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/sharepoint\#sharepointlistpages) See Example > Retrieve pages from a SharePoint site. **Parameters** - **site** ( `string`, required) Site ID, SharePoint URL, or site name to retrieve base pages from. Prefer using a site ID whenever available for optimal performance. - **limit** ( `integer`, optional) The maximum number of pages to return. Defaults to 10, max is 200. ## Sharepoint.GetSite [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/sharepoint\#sharepointgetsite) See Example > Retrieve information about a specific SharePoint site by its ID, URL, or name. **Parameters** - **site** ( `string`, required) Site ID, SharePoint URL, or site name to search for. ## Sharepoint.SearchSites [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/sharepoint\#sharepointsearchsites) See Example > Search for SharePoint sites by name or description. **Parameters** - **keywords** ( `string`, required) The search term to find sites by name or description. - **limit** ( `integer`, optional) The maximum number of sites to return. Defaults to 10, max is 100. - **offset** ( `integer`, optional) The offset to start from. ## Sharepoint.ListSites [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/sharepoint\#sharepointlistsites) See Example > List all SharePoint sites accessible to the current user. **Parameters** - **limit** ( `integer`, optional) The maximum number of sites to return. Defaults to 10, max is 100. - **offset** ( `integer`, optional) The offset to start from. ## Sharepoint.GetFollowedSites [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/sharepoint\#sharepointgetfollowedsites) See Example > Retrieve a list of SharePoint sites that are followed by the current user. **Parameters** - **limit** ( `integer`, optional) The maximum number of sites to return. Defaults to 10, max is 100. ## Sharepoint.GetDrivesFromSite [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/sharepoint\#sharepointgetdrivesfromsite) See Example > Retrieve drives / document libraries from a SharePoint site. **Parameters** - **site** ( `string`, required) Site ID, SharePoint URL, or site name to get drives from. Prefer using a site ID whenever available for optimal performance. ## Sharepoint.ListRootItemsInDrive [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/sharepoint\#sharepointlistrootitemsindrive) See Example > Retrieve items from the root of a drive in a SharePoint site. **Parameters** - **drive\_id** ( `string`, required) The ID of the drive to get items from. - **limit** ( `integer`, optional) The number of items to get. Defaults to 100, max is 500. - **offset** ( `integer`, optional) The number of items to skip. ## Sharepoint.ListItemsInFolder [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/sharepoint\#sharepointlistitemsinfolder) See Example > Retrieve items from a folder in a drive in a SharePoint site. **Parameters** - **drive\_id** ( `string`, required) The ID of the drive to get items from. - **folder\_id** ( `string`, required) The ID of the folder to get items from. - **limit** ( `integer`, optional) The number of items to get. Defaults to 100, max is 500. - **offset** ( `integer`, optional) The number of items to skip. ## Sharepoint.SearchDriveItems [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/sharepoint\#sharepointsearchdriveitems) See Example > Search for items in one or more Sharepoint drives. **Parameters** - **keywords** ( `string`, required) The keywords to search for files in the drive. - **drive\_id** ( `string`, optional) Optionally, the ID of the drive to search items in. If not provided, the search will be performed in all drives. - **folder\_id** ( `string`, optional) Optionally narrow the search within a specific folder by its ID. If not provided, the search will be performed in the whole drive. If a folder\_id is provided, it is required to provide a drive\_id as well. - **limit** ( `integer`, optional) The number of files to get. Defaults to 50, max is 500. - **offset** ( `integer`, optional) The number of files to skip. ## Auth [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/sharepoint\#auth) The Arcade Sharepoint toolkit uses the [Microsoft auth provider](https://docs.arcade.dev/home/auth-providers/microsoft) to connect to users’ Sharepoint accounts. Please refer to the [Microsoft auth provider](https://docs.arcade.dev/home/auth-providers/microsoft) documentation to learn how to configure auth. ## Get Building [Use tools hosted on Arcade Cloud\\ \\ Arcade tools are hosted by our cloud platform and ready to be used in your agents. Learn how.](https://docs.arcade.dev/home/quickstart) [Self Host Arcade tools\\ \\ Arcade tools can be self-hosted on your own infrastructure. Learn more about self-hosting.\\ \\ ```\\ pip install arcade_sharepoint\\ ```](https://docs.arcade.dev/home/hosting-overview) [Close.io](https://docs.arcade.dev/mcp-servers/productivity/closeio "Close.io") [Discord](https://docs.arcade.dev/mcp-servers/social-communication/discord "Discord") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Arcade in VS Code [Home](https://docs.arcade.dev/home "Home") [IDEs and desktop clients](https://docs.arcade.dev/home/mcp-desktop-clients/claude-desktop-client "IDEs and desktop clients") Use Arcade in Visual Studio Code # Use Arcade in Visual Studio Code In this guide, you’ll learn how to connect Visual Studio Code to Arcade.dev’s MCP server. As of version 1.100.0, Visual Studio Code does not yet support [MCP authorization](https://modelcontextprotocol.io/specification/draft/basic/authorization). Only tools that do not require auth, such as math and [search](https://docs.arcade.dev/mcp-servers/search/google_search) tools, will work with Visual Studio Code. We’re working to improve this - stay tuned! ### Set up Visual Studio Code [Permalink for this section](https://docs.arcade.dev/home/mcp-desktop-clients/vscode-client\#set-up-visual-studio-code) 1. Download and open [Visual Studio Code](https://code.visualstudio.com/download) (version 1.100.0 or higher) 2. Open the command palette and select **MCP: Add Server…** 3. Choose **HTTP** 4. Paste the following URL: `https://api.arcade.dev/v1/mcps/arcade-anon/mcp` This URL is Arcade’s public beta MCP server. We’d love to [hear your feedback](https://docs.arcade.dev/home/contact-us)! Coming soon: deploy a server with your own tools. 5. Give your MCP server a name, like `mcp-arcade-dev` Visual Studio Code will update your `settings.json` file with the following: ```nextra-code "mcp": { "servers": { "mcp-arcade-dev": { "url": "https://api.arcade.dev/v1/mcps/arcade-anon/mcp" } } }, ``` ### Try it out [Permalink for this section](https://docs.arcade.dev/home/mcp-desktop-clients/vscode-client\#try-it-out) 1. Open the chat pane (typically Cmd-Shift-I or Ctrl-Shift-I) 2. Make sure you are in **Agent** mode 3. Click the 🛠️ Tools button, which opens a panel of available tools 4. Click to select the tools you want to use, and type your request in the chat pane! ![Visual Studio Code tools panel](https://docs.arcade.dev/videos/vscode_mcp_demo.webp) [Use Arcade with Claude Desktop](https://docs.arcade.dev/home/mcp-desktop-clients/claude-desktop-client "Use Arcade with Claude Desktop") [Introduction](https://docs.arcade.dev/home/use-tools/tools-overview "Introduction") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Arcade Tools Integration [Home](https://docs.arcade.dev/home "Home") LangChainUsing Arcade tools ## Use LangGraph with Arcade [Permalink for this section](https://docs.arcade.dev/home/langchain/use-arcade-tools\#use-langgraph-with-arcade) In this guide, let’s explore how to integrate Arcade tools into your LangGraph application. Follow the step-by-step instructions below. For complete working examples, see our [Python](https://github.com/ArcadeAI/arcade-ai/blob/main/examples/langchain/langgraph_arcade_minimal.py) and [JavaScript](https://github.com/ArcadeAI/arcade-ai/blob/main/examples/langchain-ts/langgraph-arcade-minimal.ts) examples. ### Prerequisites [Permalink for this section](https://docs.arcade.dev/home/langchain/use-arcade-tools\#prerequisites) - [Obtain an Arcade API key](https://docs.arcade.dev/home/api-keys) ### Set up your environment [Permalink for this section](https://docs.arcade.dev/home/langchain/use-arcade-tools\#set-up-your-environment) Install the required packages, and ensure your environment variables are set with your Arcade and OpenAI API keys: PythonJavaScript ```nextra-code pip install langchain-arcade langchain-openai langgraph ``` ### Configure API keys [Permalink for this section](https://docs.arcade.dev/home/langchain/use-arcade-tools\#configure-api-keys) Provide your Arcade and OpenAI API keys. You can store them in environment variables or directly in your code: > Need an Arcade API key? Visit the [Get an API key](https://docs.arcade.dev/home/api-keys) page to create one. PythonJavaScript ```nextra-code import os arcade_api_key = os.environ.get("ARCADE_API_KEY", "YOUR_ARCADE_API_KEY") openai_api_key = os.environ.get("OPENAI_API_KEY", "YOUR_OPENAI_API_KEY") ``` ### Create and manage Arcade tools [Permalink for this section](https://docs.arcade.dev/home/langchain/use-arcade-tools\#create-and-manage-arcade-tools) PythonJavaScript Use the ArcadeToolManager to retrieve specific tools or entire toolkits: ```nextra-code from langchain_arcade import ArcadeToolManager manager = ArcadeToolManager(api_key=arcade_api_key) # Fetch the "ScrapeUrl" tool from the "Firecrawl" toolkit tools = manager.get_tools(tools=["Firecrawl.ScrapeUrl"]) print(manager.tools) # Get all tools from the "Gmail" toolkit tools = manager.get_tools(toolkits=["Gmail"]) print(manager.tools) ``` ### Set up the language model and memory [Permalink for this section](https://docs.arcade.dev/home/langchain/use-arcade-tools\#set-up-the-language-model-and-memory) Create an AI model and bind your tools. Use MemorySaver for checkpointing: PythonJavaScript ```nextra-code from langchain_openai import ChatOpenAI from langgraph.checkpoint.memory import MemorySaver model = ChatOpenAI(model="gpt-4o", api_key=openai_api_key) bound_model = model.bind_tools(tools) memory = MemorySaver() ``` ### Create a ReAct-style agent [Permalink for this section](https://docs.arcade.dev/home/langchain/use-arcade-tools\#create-a-react-style-agent) Use the prebuilt ReAct agent from LangGraph to handle your Arcade tools: PythonJavaScript ```nextra-code from langgraph.prebuilt import create_react_agent graph = create_react_agent(model=bound_model, tools=tools, checkpointer=memory) ``` ### Provide configuration and user query [Permalink for this section](https://docs.arcade.dev/home/langchain/use-arcade-tools\#provide-configuration-and-user-query) Supply a basic config dictionary and a user query. Notice that user\_id is required for tool authorization: PythonJavaScript ```nextra-code config = { "configurable": { "thread_id": "1", "user_id": "{arcade_user_id}" } } user_input = { "messages": [\ ("user", "List any new and important emails in my inbox.")\ ] } ``` ### Stream the response [Permalink for this section](https://docs.arcade.dev/home/langchain/use-arcade-tools\#stream-the-response) Stream the assistant’s output. If the tool requires authorization, the agent will ask the user to authorize the tool. PythonJavaScript ```nextra-code from langgraph.errors import NodeInterrupt try: for chunk in graph.stream(user_input, config, stream_mode="values"): chunk["messages"][-1].pretty_print() except NodeInterrupt as exc: print(f"\nNodeInterrupt occurred: {exc}") print("Please authorize the tool or update the request, then re-run.") ``` ## Tips for selecting tools [Permalink for this section](https://docs.arcade.dev/home/langchain/use-arcade-tools\#tips-for-selecting-tools) - **Relevance**: Pick only the tools you need. Avoid using all tools at once. - **Avoid conflicts**: Be mindful of duplicate or overlapping functionality. ## Next steps [Permalink for this section](https://docs.arcade.dev/home/langchain/use-arcade-tools\#next-steps) Now that you have integrated Arcade tools into your LangGraph agent, you can: - Experiment with different toolkits, such as “Math” or “Search.” - Customize the agent’s prompts for specific tasks. - Try out other language models and compare their performance. Enjoy exploring Arcade and building powerful AI-enabled Python applications! [Modal](https://docs.arcade.dev/home/serve-tools/modal-worker "Modal") [User authorization](https://docs.arcade.dev/home/langchain/user-auth-interrupts "User authorization") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Mastra Overview [Home](https://docs.arcade.dev/home "Home") MastraOverview ## Overview: Arcade Tools in Mastra [Permalink for this section](https://docs.arcade.dev/home/mastra/overview\#overview-arcade-tools-in-mastra) [Mastra](https://mastra.ai/docs) is an open-source TypeScript agent framework that provides essential primitives for building AI applications. Integrate Arcade’s extensive tool ecosystem to enhance your Mastra agents and enable them to interact seamlessly with numerous third-party services. This integration enables you to: - **Access a wide range of tools:** Use Arcade’s [pre-built tools](https://docs.arcade.dev/toolkits) for GitHub, Google Workspace, Slack, and more directly within your Mastra agent. - **Simplify tool management:** Let Arcade handle the complexities of tool discovery, execution, and authentication. - **Build sophisticated agents:** Combine Mastra’s agent framework (including memory, workflows, and RAG) with Arcade’s powerful tool capabilities. ### How it Works [Permalink for this section](https://docs.arcade.dev/home/mastra/overview\#how-it-works) The integration works through three key mechanisms: 1. **Tool Discovery:** Access available tools through a unified API ( `arcade.tools.list`). 2. **Schema Conversion:** Transform Arcade’s tool definitions into Mastra-compatible Zod schemas with the `toZodToolSet` utility, enabling seamless integration between the two frameworks without manual schema mapping. 3. **Execution Delegation:** Seamlessly route tool calls from your Mastra agent through Arcade’s API, which handles all the complexities of third-party service authentication and execution. Before starting, obtain an [Arcade API key](https://docs.arcade.dev/home/api-keys). ### Next Steps [Permalink for this section](https://docs.arcade.dev/home/mastra/overview\#next-steps) - Learn how to [use Arcade tools](https://docs.arcade.dev/home/mastra/use-arcade-tools) in a Mastra agent - Implement [user authentication handling](https://docs.arcade.dev/home/mastra/user-auth-interrupts) for tools in multi-user applications [Using Arcade tools](https://docs.arcade.dev/home/google-adk/use-arcade-tools "Using Arcade tools") [Using Arcade tools](https://docs.arcade.dev/home/mastra/use-arcade-tools "Using Arcade tools") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Dropbox Item Categories [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Productivity & Docs](https://docs.arcade.dev/mcp-servers/productivity/asana "Productivity & Docs") [Dropbox](https://docs.arcade.dev/mcp-servers/productivity/dropbox/dropbox "Dropbox") Reference ## DropboxItemCategory [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/dropbox/reference\#dropboxitemcategory) - **IMAGE**: `'image'` - **DOCUMENT**: `'document'` - **PDF**: `'pdf'` - **SPREADSHEET**: `'spreadsheet'` - **PRESENTATION**: `'presentation'` - **AUDIO**: `'audio'` - **VIDEO**: `'video'` - **FOLDER**: `'folder'` - **PAPER**: `'paper'` [Dropbox](https://docs.arcade.dev/mcp-servers/productivity/dropbox/dropbox "Dropbox") [Gmail](https://docs.arcade.dev/mcp-servers/productivity/gmail "Gmail") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## OpenAI Agents Overview [Home](https://docs.arcade.dev/home "Home") OpenAI AgentsOverview # Arcade with OpenAI Agents Arcade provides seamless integration with the [OpenAI Agents Library](https://github.com/openai/openai-python) and [OpenAI Agents JS](https://openai.github.io/openai-agents-js/), allowing you to enhance your AI agents with powerful tools including Gmail, LinkedIn, GitHub, and many more. This integration is available through the `agents-arcade` package for Python and our [JavaScript client library](https://github.com/ArcadeAI/arcade-js). ## Installation [Permalink for this section](https://docs.arcade.dev/home/oai-agents/overview\#installation) Install the necessary packages to get started: PythonJavaScript ```nextra-code pip install agents-arcade arcadepy ``` Make sure you have your Arcade API key ready. [Get an API key](https://docs.arcade.dev/home/api-keys) if you don’t already have one. ## Key features [Permalink for this section](https://docs.arcade.dev/home/oai-agents/overview\#key-features) - **Easy integration** with the OpenAI Agents framework - **Access to all Arcade toolkits** including Google, GitHub, LinkedIn, X, and more - **Create custom tools** with the Arcade Tool SDK - **Manage user authentication** for tools that require it - **Asynchronous support** compatible with OpenAI’s Agent framework ## Basic usage [Permalink for this section](https://docs.arcade.dev/home/oai-agents/overview\#basic-usage) Here’s a simple example of using Arcade tools with OpenAI Agents: PythonJavaScript ```nextra-code from agents import Agent, Runner from arcadepy import AsyncArcade from agents_arcade import get_arcade_tools from agents_arcade.errors import AuthorizationError async def main(): # Initialize the Arcade client client = AsyncArcade() # Get tools from the "gmail" toolkit tools = await get_arcade_tools(client, toolkits=["gmail"]) # Create an agent with Gmail tools google_agent = Agent( name="Gmail agent", instructions="You are a helpful assistant that can assist with Gmail API calls.", model="gpt-4o-mini", tools=tools, ) try: # Run the agent with a unique user_id for authorization result = await Runner.run( starting_agent=google_agent, input="What are my latest emails?", context={"user_id": "{arcade_user_id}"}, ) print("Final output:\n\n", result.final_output) except AuthorizationError as e: print("Please Login to Google:", e) if __name__ == "__main__": import asyncio asyncio.run(main()) ``` ## Handling authorization [Permalink for this section](https://docs.arcade.dev/home/oai-agents/overview\#handling-authorization) PythonJavaScript When a user needs to authorize access to a tool (like Google or GitHub), the agent will raise an `AuthorizationError` with a URL for the user to visit: ```nextra-code try: # Run agent code # ... except AuthorizationError as e: # Display the authorization URL to the user print(f"Please visit this URL to authorize: {e}") ``` After visiting the URL and authorizing access, the user can run the agent again with the same `user_id`, and it will work without requiring re-authorization. ## Available toolkits [Permalink for this section](https://docs.arcade.dev/home/oai-agents/overview\#available-toolkits) Arcade provides a variety of toolkits you can use with your agents: - **Google Suite**: Gmail, Calendar, Drive, Docs - **Social Media**: LinkedIn, X - **Development**: GitHub - **Web**: Web search, content extraction - **And more**: Weather, financial data, etc. For a full list of available toolkits, visit the [Arcade Toolkits](https://docs.arcade.dev/toolkits) documentation. ## Next steps [Permalink for this section](https://docs.arcade.dev/home/oai-agents/overview\#next-steps) Ready to start building with Arcade and OpenAI Agents? Check out these guides: - [Using Arcade tools](https://docs.arcade.dev/home/oai-agents/use-arcade-tools) \- Learn the basics of using Arcade tools with OpenAI Agents - [Managing user authorization](https://docs.arcade.dev/home/oai-agents/user-auth-interrupts) \- Handle tool authorization efficiently - [Creating custom tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server) \- Build your own tools with the Arcade Tool SDK Enjoy exploring Arcade and building powerful AI-enabled applications! [Managing user authorization](https://docs.arcade.dev/home/mastra/user-auth-interrupts "Managing user authorization") [Using Arcade tools](https://docs.arcade.dev/home/oai-agents/use-arcade-tools "Using Arcade tools") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Jira Toolkit [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Productivity & Docs](https://docs.arcade.dev/mcp-servers/productivity/asana "Productivity & Docs") Jira # Jira **Description:** Enable agents to interact with Jira **Author:** Arcade **Auth:** User authorization [![PyPI Version](https://img.shields.io/pypi/v/arcade_jira)](https://pypi.org/project/arcade_jira/)[![License](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/arcadeai/arcade-ai/blob/main/LICENSE)[![Python Versions](https://img.shields.io/pypi/pyversions/arcade_jira)](https://pypi.org/project/arcade_jira/)[![Wheel Status](https://img.shields.io/pypi/wheel/arcade_jira)](https://pypi.org/project/arcade_jira/)[![Downloads](https://img.shields.io/pypi/dm/arcade_jira)](https://pypi.org/project/arcade_jira/) The Jira MCP Server provides a comprehensive set of tools for interacting with Jira, enabling users and AI applications to efficiently manage issues and projects. With this toolkit, you can: - Create, update, and search for Jira issues using various parameters. - Retrieve detailed information about issues, projects, users, and issue types. - Manage issue labels and attachments, including adding and removing them. - Transition issues between different statuses and manage comments on issues. - Browse and list available projects, priorities, and users within Jira. - Browse and list information of available boards and sprints within a Jira cloud. This toolkit streamlines the process of issue management, making it easier to integrate Jira functionalities into applications and workflows. ## Handling multiple Atlassian Clouds [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/jira\#handling-multiple-atlassian-clouds) A Jira user may have multiple Atlassian Clouds authorized via the same OAuth grant. In such cases, the Jira tools must be called with the `atlassian_cloud_id` argument. The [`Jira.GetAvailableAtlassianClouds`](https://docs.arcade.dev/mcp-servers/productivity/jira#jiragetavailableatlassianclouds) tool can be used to get the available Atlassian Clouds and their IDs. When a tool call does not receive a value for `atlassian_cloud_id` and the user only has a single Atlassian Cloud authorized, the tool will use that. Otherwise, an error will be raised. The error will contain an additional content listing the available Atlassian Clouds and their IDs. Your AI Agent or AI-powered chat application can use the tool referenced above (or the exception’s additional content) to guide the user into selecting the correct Atlassian Cloud. When the user selects an Atlassian Cloud, it may be appropriate to keep this information in the LLM’s context window for subsequent tool calls, avoiding the need to ask the user multiple times. **_It is the job of the AI Agent or chat application to:_** 1. Make it clear to the chat’s end user which Atlassian Cloud is being used at any moment, to avoid, for example, having a Jira Issue being created in the wrong Atlassian Cloud; 2. Appropriately instruct the LLM and keep the relevant information in its context window, enabling it to correctly call the Jira tools, **especially in multi-turn conversations**. ## Available Tools [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/jira\#available-tools) | Tool Name | Description | | --- | --- | | Jira.ListIssueTypesByProject | Get the list of issue types (e.g. 'Task', 'Epic', etc.) available to a given project. | | Jira.GetIssueTypeById | Get the details of a Jira issue type by its ID. | | Jira.GetIssueById | Get the details of a Jira issue by its ID. | | Jira.GetIssuesWithoutId | Search for Jira issues when you don't have the issue ID(s). | | Jira.ListIssues | Get the issues for a given project. | | Jira.SearchIssuesWithoutJql | Parameterized search for Jira issues (without having to provide a JQL query). | | Jira.SearchIssuesWithJql | Search for Jira issues using a JQL (Jira Query Language) query. | | Jira.CreateIssue | Create a new Jira issue. | | Jira.AddLabelsToIssue | Add labels to an existing Jira issue. | | Jira.RemoveLabelsFromIssue | Remove labels from an existing Jira issue. | | Jira.UpdateIssue | Update an existing Jira issue. | | Jira.ListSprintsForBoards | Retrieve sprints from Jira boards with filtering options for planning and tracking purposes. | | Jira.GetSprintIssues | Get all issues that are currently assigned to a specific sprint with pagination support. | | Jira.AddIssuesToSprint | Add a list of issues to a sprint. | | Jira.MoveIssuesFromSprintToBacklog | Move issues from active or future sprints back to the board's backlog. | | Jira.ListLabels | Get the existing labels (tags) in the user's Jira instance. | | Jira.ListUsers | Browse users in Jira. | | Jira.GetUserById | Get user information by their ID. | | Jira.GetUsersWithoutId | Get users without their account ID, searching by display name and email address. | | Jira.GetAvailableAtlassianClouds | Get available Atlassian Clouds. | | Jira.AttachFileToIssue | Add an attachment to an issue. | | Jira.ListIssueAttachmentsMetadata | Get the metadata about the files attached to an issue. | | Jira.GetAttachmentMetadata | Get the metadata of an attachment. | | Jira.DownloadAttachment | Download the contents of an attachment associated with an issue. | | Jira.GetTransitionById | Get a transition by its ID. | | Jira.GetTransitionsAvailableForIssue | Get the transitions available for an existing Jira issue. | | Jira.GetTransitionByStatusName | Get a transition available for an issue by the transition name. | | Jira.TransitionIssueToNewStatus | Transition a Jira issue to a new status. | | Jira.WhoAmI | CALL THIS TOO FIRST to establish user profile context. | | Jira.ListProjects | Browse projects available in Jira. | | Jira.SearchProjects | Get the details of all Jira projects. | | Jira.GetProjectById | Get the details of a Jira project by its ID or key. | | Jira.GetBoards | Get Jira boards, with the option to filter by a list of board names or IDs (accepts a mix of both). Supports 'offset' and 'limit' parameters. | | Jira.GetBoardBacklogIssues | Get all issues in a board's backlog. Supports 'offset' and 'limit' parameters. | | Jira.GetPriorityById | Get the details of a priority by its ID. | | Jira.ListPrioritySchemes | Browse the priority schemes available in Jira. | | Jira.ListPrioritiesAssociatedWithAPriorityScheme | Browse the priorities associated with a priority scheme. | | Jira.ListProjectsAssociatedWithAPriorityScheme | Browse the projects associated with a priority scheme. | | Jira.ListPrioritiesAvailableToAProject | Browse the priorities available to be used in issues in the specified Jira project. | | Jira.ListPrioritiesAvailableToAnIssue | Browse the priorities available to be used in the specified Jira issue. | | Jira.GetCommentById | Get a comment by its ID. | | Jira.GetIssueComments | Get the comments of a Jira issue by its ID. | | Jira.AddCommentToIssue | Add a comment to a Jira issue. | If you need to perform an action that’s not listed here, you can [get in touch\\ with us](mailto:contact@arcade.dev) to request a new tool, or [create your\\ own tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server). ## Jira.ListIssueTypesByProject [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/jira\#jiralistissuetypesbyproject) See Example > Get the list of issue types (e.g. ‘Task’, ‘Epic’, etc.) available to a given project. **Parameters** - **project** ( `string`, required) The project to get issue types for. Provide a project name, key, or ID. If a project name is provided, the tool will try to find a unique exact match among the available projects. - **limit** ( `integer`, optional) The maximum number of issue types to retrieve. Min of 1, max of 200. Defaults to 200. - **offset** ( `integer`, optional) The number of issue types to skip. Defaults to 0 (start from the first issue type). - **atlassian\_cloud\_id** ( `string`, optional) The ID of the Atlassian Cloud to use (defaults to None). If not provided and the user has a single cloud authorized, the tool will use that. Otherwise, an error will be raised. ## Jira.GetIssueTypeById [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/jira\#jiragetissuetypebyid) See Example > Get the details of a Jira issue type by its ID. **Parameters** - **issue\_type\_id** ( `string`, required) The ID of the issue type to retrieve - **atlassian\_cloud\_id** ( `string`, optional) The ID of the Atlassian Cloud to use (defaults to None). If not provided and the user has a single cloud authorized, the tool will use that. Otherwise, an error will be raised. ## Jira.GetIssueById [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/jira\#jiragetissuebyid) See Example > Get the details of a Jira issue by its ID. **Parameters** - **issue** ( `string`, required) The ID or key of the issue to retrieve - **atlassian\_cloud\_id** ( `string`, optional) The ID of the Atlassian Cloud to use (defaults to None). If not provided and the user has a single cloud authorized, the tool will use that. Otherwise, an error will be raised. ## Jira.GetIssuesWithoutId [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/jira\#jiragetissueswithoutid) See Example > Search for Jira issues when you don’t have the issue ID(s). **Parameters** - **keywords** ( `string`, optional) Keywords to search for issues. Matches against the issue name, description, comments, and any custom field of type text. Defaults to None (no keywords filtering). - **due\_from** ( `string`, optional) Match issues due on or after this date. Format: YYYY-MM-DD. Ex: ‘2025-01-01’. Defaults to None (no due date filtering). - **due\_until** ( `string`, optional) Match issues due on or before this date. Format: YYYY-MM-DD. Ex: ‘2025-01-01’. Defaults to None (no due date filtering). - **status** ( `string`, optional) Match issues that are in this status. Provide a status name. Ex: ‘To Do’, ‘In Progress’, ‘Done’. Defaults to None (any status). - **priority** ( `string`, optional) Match issues that have this priority. Provide a priority name. E.g. ‘Highest’. Defaults to None (any priority). - **assignee** ( `string`, optional) Match issues that are assigned to this user. Provide the user’s name or email address. Ex: ‘John Doe’ or ‘ [john.doe@example.com](mailto:john.doe@example.com)’. Defaults to None (any assignee). - **project** ( `string`, optional) Match issues that are associated with this project. Provide the project’s name, ID, or key. If a project name is provided, the tool will try to find a unique exact match among the available projects. Defaults to None (search across all projects). - **issue\_type** ( `string`, optional) Match issues that are of this issue type. Provide an issue type name or ID. E.g. ‘Task’, ‘Epic’, ‘12345’. If a name is provided, the tool will try to find a unique exact match among the available issue types. Defaults to None (any issue type). - **labels** ( `array[string]`, optional) Match issues that are in these labels. Defaults to None (any label). - **parent\_issue** ( `string`, optional) Match issues that are a child of this issue. Provide the issue’s ID or key. Defaults to None (no parent issue filtering). - **limit** ( `integer`, optional) The maximum number of issues to retrieve. Min 1, max 100, default 50. - **next\_page\_token** ( `string`, optional) The token to use to get the next page of issues. Defaults to None (first page). - **atlassian\_cloud\_id** ( `string`, optional) The ID of the Atlassian Cloud to use (defaults to None). If not provided and the user has a single cloud authorized, the tool will use that. Otherwise, an error will be raised. ## Jira.ListIssues [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/jira\#jiralistissues) See Example > Get the issues for a given project. **Parameters** - **project** ( `string`, optional) The project to get issues for. Provide a project ID, key or name. If a project is not provided and 1) the user has only one project, the tool will use that; 2) the user has multiple projects, the tool will raise an error listing the available projects to choose from. - **limit** ( `integer`, optional) The maximum number of issues to retrieve. Min 1, max 100, default 50. - **next\_page\_token** ( `string`, optional) The token to use to get the next page of issues. Defaults to None (first page). - **atlassian\_cloud\_id** ( `string`, optional) The ID of the Atlassian Cloud to use (defaults to None). If not provided and the user has a single cloud authorized, the tool will use that. Otherwise, an error will be raised. ## Jira.SearchIssuesWithoutJql [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/jira\#jirasearchissueswithoutjql) See Example > Parameterized search for Jira issues (without having to provide a JQL query). **Parameters** - **keywords** ( `string`, optional) Keywords to search for issues. Matches against the issue name, description, comments, and any custom field of type text. Defaults to None (no keywords filtering). - **due\_from** ( `string`, optional) Match issues due on or after this date. Format: YYYY-MM-DD. Ex: ‘2025-01-01’. Defaults to None (no due date filtering). - **due\_until** ( `string`, optional) Match issues due on or before this date. Format: YYYY-MM-DD. Ex: ‘2025-01-01’. Defaults to None (no due date filtering). - **status** ( `string`, optional) Match issues that are in this status. Provide a status name. Ex: ‘To Do’, ‘In Progress’, ‘Done’. Defaults to None (any status). - **priority** ( `string`, optional) Match issues that have this priority. Provide a priority name. E.g. ‘Highest’. Defaults to None (any priority). - **assignee** ( `string`, optional) Match issues that are assigned to this user. Provide the user’s name or email address. Ex: ‘John Doe’ or ‘ [john.doe@example.com](mailto:john.doe@example.com)’. Defaults to None (any assignee). - **project** ( `string`, optional) Match issues that are associated with this project. Provide the project’s name, ID, or key. If a project name is provided, the tool will try to find a unique exact match among the available projects. Defaults to None (search across all projects). - **issue\_type** ( `string`, optional) Match issues that are of this issue type. Provide an issue type name or ID. E.g. ‘Task’, ‘Epic’, ‘12345’. If a name is provided, the tool will try to find a unique exact match among the available issue types. Defaults to None (any issue type). - **labels** ( `array[string]`, optional) Match issues that are in these labels. Defaults to None (any label). - **parent\_issue** ( `string`, optional) Match issues that are a child of this issue. Provide the issue’s ID or key. Defaults to None (no parent issue filtering). - **limit** ( `integer`, optional) The maximum number of issues to retrieve. Min 1, max 100, default 50. - **next\_page\_token** ( `string`, optional) The token to use to get the next page of issues. Defaults to None (first page). - **atlassian\_cloud\_id** ( `string`, optional) The ID of the Atlassian Cloud to use (defaults to None). If not provided and the user has a single cloud authorized, the tool will use that. Otherwise, an error will be raised. ## Jira.SearchIssuesWithJql [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/jira\#jirasearchissueswithjql) See Example > Search for Jira issues using a JQL (Jira Query Language) query. **Parameters** - **jql** ( `string`, required) The JQL (Jira Query Language) query to search for issues - **limit** ( `integer`, optional) The maximum number of issues to retrieve. Min of 1, max of 100. Defaults to 50. - **next\_page\_token** ( `string`, optional) The token to use to get the next page of issues. Defaults to None (first page). - **atlassian\_cloud\_id** ( `string`, optional) The ID of the Atlassian Cloud to use (defaults to None). If not provided and the user has a single cloud authorized, the tool will use that. Otherwise, an error will be raised. ## Jira.CreateIssue [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/jira\#jiracreateissue) See Example > Create a new Jira issue. **Parameters** - **title** ( `string`, required) The title of the issue. - **issue\_type** ( `string`, required) The name or ID of the issue type. If a name is provided, the tool will try to find a unique exact match among the available issue types. - **project** ( `string`, optional) The ID, key or name of the project to associate the issue with. If a name is provided, the tool will try to find a unique exact match among the available projects. Defaults to None (no project). If `project` and `parent_issue` are not provided, the tool will select the single project available. If the user has multiple, an error will be returned with the available projects to choose from. - **due\_date** ( `string`, optional) The due date of the issue. Format: YYYY-MM-DD. Ex: ‘2025-01-01’. Defaults to None (no due date). - **description** ( `string`, optional) The description of the issue. Defaults to None (no description). - **environment** ( `string`, optional) The environment of the issue. Defaults to None (no environment). - **labels** ( `array[string]`, optional) The labels of the issue. Defaults to None (no labels). A label cannot contain spaces. If a label is provided with spaces, they will be trimmed and replaced by underscores. - **parent\_issue** ( `string`, optional) The ID or key of the parent issue. Defaults to None (no parent issue). Must provide at least one of `parent_issue` or `project` arguments. - **priority** ( `string`, optional) The ID or name of the priority to use for the issue. If a name is provided, the tool will try to find a unique exact match among the available priorities. Defaults to None (the issue is created with Jira’s default priority for the specified project). - **assignee** ( `string`, optional) The name, email or ID of the user to assign the issue to. If a name or email is provided, the tool will try to find a unique exact match among the available users. Defaults to None (no assignee). - **reporter** ( `string`, optional) The name, email or ID of the user who is the reporter of the issue. If a name or email is provided, the tool will try to find a unique exact match among the available users. Defaults to None (no reporter). - **atlassian\_cloud\_id** ( `string`, optional) The ID of the Atlassian Cloud to use (defaults to None). If not provided and the user has a single cloud authorized, the tool will use that. Otherwise, an error will be raised. ## Jira.AddLabelsToIssue [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/jira\#jiraaddlabelstoissue) See Example > Add labels to an existing Jira issue. **Parameters** - **issue** ( `string`, required) The ID or key of the issue to update - **labels** ( `array[string]`, required) The labels to add to the issue. A label cannot contain spaces. If a label is provided with spaces, they will be trimmed and replaced by underscores. - **notify\_watchers** ( `boolean`, optional) Whether to notify the issue’s watchers. Defaults to True (notifies watchers). - **atlassian\_cloud\_id** ( `string`, optional) The ID of the Atlassian Cloud to use (defaults to None). If not provided and the user has a single cloud authorized, the tool will use that. Otherwise, an error will be raised. ## Jira.RemoveLabelsFromIssue [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/jira\#jiraremovelabelsfromissue) See Example > Remove labels from an existing Jira issue. **Parameters** - **issue** ( `string`, required) The ID or key of the issue to update - **labels** ( `array[string]`, required) The labels to remove from the issue (case-insensitive) - **notify\_watchers** ( `boolean`, optional) Whether to notify the issue’s watchers. Defaults to True (notifies watchers). - **atlassian\_cloud\_id** ( `string`, optional) The ID of the Atlassian Cloud to use (defaults to None). If not provided and the user has a single cloud authorized, the tool will use that. Otherwise, an error will be raised. ## Jira.UpdateIssue [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/jira\#jiraupdateissue) See Example > Update an existing Jira issue. **Parameters** - **issue** ( `string`, required) The key or ID of the issue to update - **title** ( `string`, optional) The new issue title. Provide an empty string to clear the title. Defaults to None (does not change the title). - **description** ( `string`, optional) The new issue description. Provide an empty string to clear the description. Defaults to None (does not change the description). - **environment** ( `string`, optional) The new issue environment. Provide an empty string to clear the environment. Defaults to None (does not change the environment). - **due\_date** ( `string`, optional) The new issue due date. Format: YYYY-MM-DD. Ex: ‘2025-01-01’. Provide an empty string to clear the due date. Defaults to None (does not change the due date). - **issue\_type** ( `string`, optional) The new issue type name or ID. If a name is provided, the tool will try to find a unique exact match among the available issue types. Defaults to None (does not change the issue type). - **priority** ( `string`, optional) The name or ID of the new issue priority. If a name is provided, the tool will try to find a unique exact match among the available priorities. Defaults to None (does not change the priority). - **parent\_issue** ( `string`, optional) The ID or key of the parent issue. A parent cannot be removed by providing an empty string. It is possible to change the parent issue by providing a new issue ID or key, or to leave it unchanged. Defaults to None (does not change the parent issue). - **assignee** ( `string`, optional) The new issue assignee name, email, or ID. If a name or email is provided, the tool will try to find a unique exact match among the available users. Provide an empty string to remove the assignee. Defaults to None (does not change the assignee). - **reporter** ( `string`, optional) The new issue reporter name, email, or ID. If a name or email is provided, the tool will try to find a unique exact match among the available users. Provide an empty string to remove the reporter. Defaults to None (does not change the reporter). - **labels** ( `array[string]`, optional) The new issue labels. This argument will replace all labels with the new list. Providing an empty list will remove all labels. To add or remove a subset of labels, use the `Jira.AddLabelsToIssue` or the `Jira.RemoveLabelsFromIssue` tools. Defaults to None (does not change the labels). A label cannot contain spaces. If a label is provided with spaces, they will be trimmed and replaced by underscores. - **notify\_watchers** ( `boolean`, optional) Whether to notify the issue’s watchers. Defaults to True (notifies watchers). - **atlassian\_cloud\_id** ( `string`, optional) The ID of the Atlassian Cloud to use (defaults to None). If not provided and the user has a single cloud authorized, the tool will use that. Otherwise, an error will be raised. ## Jira.ListSprintsForBoards [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/jira\#jiralistsprintsforboards) See Example > Retrieve sprints from Jira boards with filtering options for planning and tracking purposes. **Parameters** - **board\_identifiers\_list** ( `array[string]`, optional) List of board names or numeric IDs (as strings) to retrieve sprints from. Include all mentioned boards in a single list for best performance. Maximum 25 boards per operation. Optional, defaults to None. - **max\_sprints\_per\_board** ( `integer`, optional) Maximum sprints per board (1-50). Latest sprints first. Optional, defaults to 50. - **offset** ( `integer`, optional) Number of sprints to skip per board for pagination. Optional, defaults to 0. - **state** ( `Enum` [SprintState](https://docs.arcade.dev/mcp-servers/productivity/jira/reference#SprintState), optional) Filter by sprint state. NOTE: Date filters (start\_date, end\_date, specific\_date) have higher priority than state filtering. Use state filtering only when no date criteria is specified. For temporal queries like ‘last month’ or ‘next week’, use date parameters instead. Optional, defaults to None (all states). - **start\_date** ( `string`, optional) Start date filter in YYYY-MM-DD format. Can combine with end\_date. Optional, defaults to None. - **end\_date** ( `string`, optional) End date filter in YYYY-MM-DD format. Can combine with start\_date. Optional, defaults to None. - **specific\_date** ( `string`, optional) Specific date in YYYY-MM-DD to find sprints active on that date. Cannot combine with start\_date/end\_date. Optional, defaults to None. - **atlassian\_cloud\_id** ( `string`, optional) Atlassian Cloud ID to use. Optional, defaults to None (uses single authorized cloud). ## Jira.GetSprintIssues [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/jira\#jiragetsprintissues) See Example > Get all issues that are currently assigned to a specific sprint with pagination support. **Parameters** - **sprint\_id** ( `string`, required) The numeric Jira sprint ID that identifies the sprint in Jira’s API. - **limit** ( `integer`, optional) The maximum number of issues to return. Must be between 1 and 100 inclusive. Controls pagination and determines how many issues are fetched and returned. Defaults to 50 for improved performance. - **offset** ( `integer`, optional) The number of issues to skip before starting to return results. Used for pagination when the sprint has many issues. Must be 0 or greater. Defaults to 0. - **atlassian\_cloud\_id** ( `string`, optional) The ID of the Atlassian Cloud to use (defaults to None). If not provided and the user has a single cloud authorized, the tool will use that. Otherwise, an error will be raised. ## Jira.AddIssuesToSprint [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/jira\#jiraaddissuestosprint) See Example > Add a list of issues to a sprint. **Parameters** - **sprint\_id** ( `string`, required) The numeric Jira sprint ID that identifies the sprint in Jira’s API. - **issue\_ids** ( `array[string]`, required) List of issue IDs or keys to add to the sprint. Must not be empty and cannot exceed 50 issues. - **atlassian\_cloud\_id** ( `string`, optional) The ID of the Atlassian Cloud to use (defaults to None). If not provided and the user has a single cloud authorized, the tool will use that. Otherwise, an error will be raised. ## Jira.MoveIssuesFromSprintToBacklog [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/jira\#jiramoveissuesfromsprinttobacklog) See Example > Move issues from active or future sprints back to the board’s backlog. **Parameters** - **sprint\_id** ( `string`, required) The numeric Jira sprint ID that identifies the sprint in Jira’s API. - **issue\_identifiers** ( `array[string]`, required) List of issue IDs or keys to move from the sprint to the backlog. Maximum 50 issues per call. Issues will be moved back to the board’s backlog. - **atlassian\_cloud\_id** ( `string`, optional) The ID of the Atlassian Cloud to use (defaults to None). If not provided and the user has a single cloud authorized, the tool will use that. Otherwise, an error will be raised. ## Jira.ListLabels [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/jira\#jiralistlabels) See Example > Get the existing labels (tags) in the user’s Jira instance. **Parameters** - **limit** ( `integer`, optional) The maximum number of labels to return. Min of 1, Max of 200. Defaults to 200. - **offset** ( `integer`, optional) The number of labels to skip. Defaults to 0 (starts from the first label) - **atlassian\_cloud\_id** ( `string`, optional) The ID of the Atlassian Cloud to use (defaults to None). If not provided and the user has a single cloud authorized, the tool will use that. Otherwise, an error will be raised. ## Jira.ListUsers [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/jira\#jiralistusers) See Example > Browse users in Jira. **Parameters** - **account\_type** ( `string`, optional) The account type of the users to return. Defaults to ‘atlassian’. Provide `None` to disable filtering by account type. The account type filter will be applied after retrieving users from Jira API, thus the tool may return less users than the limit and still have more users to paginate. Check the `pagination` key in the response dictionary. - **limit** ( `integer`, optional) The maximum number of users to return. Min of 1, max of 50. Defaults to 50. - **offset** ( `integer`, optional) The number of users to skip before starting to return users. Defaults to 0 (start from the first user). - **atlassian\_cloud\_id** ( `string`, optional) The ID of the Atlassian Cloud to use (defaults to None). If not provided and the user has a single cloud authorized, the tool will use that. Otherwise, an error will be raised. ## Jira.GetUserById [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/jira\#jiragetuserbyid) See Example > Get user information by their ID. **Parameters** - **user\_id** ( `string`, required) The the user’s ID. - **atlassian\_cloud\_id** ( `string`, optional) The ID of the Atlassian Cloud to use (defaults to None). If not provided and the user has a single cloud authorized, the tool will use that. Otherwise, an error will be raised. ## Jira.GetUsersWithoutId [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/jira\#jiragetuserswithoutid) See Example > Get users without their account ID, searching by display name and email address. **Parameters** - **name\_or\_email** ( `string`, required) The user’s display name or email address to search for (case-insensitive). The string can match the prefix of the user’s attribute. For example, a string of ‘john’ will match users with a display name or email address that starts with ‘john’, such as ‘John Doe’, ‘Johnson’, ‘ [john@example.com](mailto:john@example.com)’, etc. - **enforce\_exact\_match** ( `boolean`, optional) Whether to enforce an exact match of the name\_or\_email against users’ display name and email attributes. Defaults to False (return all users that match the prefix). If set to True, before returning results, the tool will filter users with a display name OR email address that match exactly the value of the `name_or_email` argument. - **limit** ( `integer`, optional) The maximum number of users to return. Min of 1, max of 50. Defaults to 50. - **offset** ( `integer`, optional) The number of users to skip before starting to return users. Defaults to 0 (start from the first user). - **atlassian\_cloud\_id** ( `string`, optional) The ID of the Atlassian Cloud to use (defaults to None). If not provided and the user has a single cloud authorized, the tool will use that. Otherwise, an error will be raised. ## Jira.GetAvailableAtlassianClouds [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/jira\#jiragetavailableatlassianclouds) See Example > Get available Atlassian Clouds. **Parameters** This tool does not take any parameters. ## Jira.AttachFileToIssue [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/jira\#jiraattachfiletoissue) See Example > Add an attachment to an issue. **Parameters** - **issue** ( `string`, required) The issue ID or key to add the attachment to - **filename** ( `string`, required) The name of the file to add as an attachment. The filename should contain the file extension (e.g. ‘test.txt’, ‘report.pdf’), but it is not mandatory. - **file\_content\_str** ( `string`, optional) The string content of the file to attach. Use this if the file is a text file. Defaults to None. - **file\_content\_base64** ( `string`, optional) The base64-encoded binary contents of the file. Use this for binary files like images or PDFs. Defaults to None. - **file\_encoding** ( `string`, optional) The encoding of the file to attach. Only used with file\_content\_str. Defaults to ‘utf-8’. - **file\_type** ( `string`, optional) The type of the file to attach. E.g. ‘application/pdf’, ‘text’, ‘image/png’. If not provided, the tool will try to infer the type from the filename. If the filename is not recognized, it will attach the file without specifying a type. Defaults to None (infer from filename or attach without type). - **atlassian\_cloud\_id** ( `string`, optional) The ID of the Atlassian Cloud to use (defaults to None). If not provided and the user has a single cloud authorized, the tool will use that. Otherwise, an error will be raised. ## Jira.ListIssueAttachmentsMetadata [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/jira\#jiralistissueattachmentsmetadata) See Example > Get the metadata about the files attached to an issue. **Parameters** - **issue** ( `string`, required) The ID or key of the issue to retrieve - **atlassian\_cloud\_id** ( `string`, optional) The ID of the Atlassian Cloud to use (defaults to None). If not provided and the user has a single cloud authorized, the tool will use that. Otherwise, an error will be raised. ## Jira.GetAttachmentMetadata [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/jira\#jiragetattachmentmetadata) See Example > Get the metadata of an attachment. **Parameters** - **attachment\_id** ( `string`, required) The ID of the attachment to retrieve - **atlassian\_cloud\_id** ( `string`, optional) The ID of the Atlassian Cloud to use (defaults to None). If not provided and the user has a single cloud authorized, the tool will use that. Otherwise, an error will be raised. ## Jira.DownloadAttachment [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/jira\#jiradownloadattachment) See Example > Download the contents of an attachment associated with an issue. **Parameters** - **attachment\_id** ( `string`, required) The ID of the attachment to download - **atlassian\_cloud\_id** ( `string`, optional) The ID of the Atlassian Cloud to use (defaults to None). If not provided and the user has a single cloud authorized, the tool will use that. Otherwise, an error will be raised. ## Jira.GetTransitionById [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/jira\#jiragettransitionbyid) See Example > Get a transition by its ID. **Parameters** - **issue** ( `string`, required) The ID or key of the issue - **transition\_id** ( `string`, required) The ID of the transition - **atlassian\_cloud\_id** ( `string`, optional) The ID of the Atlassian Cloud to use (defaults to None). If not provided and the user has a single cloud authorized, the tool will use that. Otherwise, an error will be raised. ## Jira.GetTransitionsAvailableForIssue [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/jira\#jiragettransitionsavailableforissue) See Example > Get the transitions available for an existing Jira issue. **Parameters** - **issue** ( `string`, required) The ID or key of the issue - **atlassian\_cloud\_id** ( `string`, optional) The ID of the Atlassian Cloud to use (defaults to None). If not provided and the user has a single cloud authorized, the tool will use that. Otherwise, an error will be raised. ## Jira.GetTransitionByStatusName [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/jira\#jiragettransitionbystatusname) See Example > Get a transition available for an issue by the transition name. **Parameters** - **issue** ( `string`, required) The ID or key of the issue - **transition** ( `string`, required) The name of the transition status - **atlassian\_cloud\_id** ( `string`, optional) The ID of the Atlassian Cloud to use (defaults to None). If not provided and the user has a single cloud authorized, the tool will use that. Otherwise, an error will be raised. ## Jira.TransitionIssueToNewStatus [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/jira\#jiratransitionissuetonewstatus) See Example > Transition a Jira issue to a new status. **Parameters** - **issue** ( `string`, required) The ID or key of the issue - **transition** ( `string`, required) The transition to perform. Provide the transition ID or its name (case insensitive). - **atlassian\_cloud\_id** ( `string`, optional) The ID of the Atlassian Cloud to use (defaults to None). If not provided and the user has a single cloud authorized, the tool will use that. Otherwise, an error will be raised. ## Jira.WhoAmI [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/jira\#jirawhoami) See Example > Fetches the current user’s profile information. **Parameters** This tool does not take any parameters. ## Jira.ListProjects [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/jira\#jiralistprojects) See Example > Browse projects available in Jira. **Parameters** - **limit** ( `integer`, optional) The maximum number of projects to return. Min of 1, Max of 50. Defaults to 50. - **offset** ( `integer`, optional) The number of projects to skip. Defaults to 0 (starts from the first project) - **atlassian\_cloud\_id** ( `string`, optional) The ID of the Atlassian Cloud to use (defaults to None). If not provided and the user has a single cloud authorized, the tool will use that. Otherwise, an error will be raised. ## Jira.SearchProjects [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/jira\#jirasearchprojects) See Example > Get the details of all Jira projects. **Parameters** - **keywords** ( `string`, optional) The keywords to search for projects. Matches against project name and key (case insensitive). Defaults to None (no keywords filter). - **limit** ( `integer`, optional) The maximum number of projects to return. Min of 1, Max of 50. Defaults to 50. - **offset** ( `integer`, optional) The number of projects to skip. Defaults to 0 (starts from the first project) - **atlassian\_cloud\_id** ( `string`, optional) The ID of the Atlassian Cloud to use (defaults to None). If not provided and the user has a single cloud authorized, the tool will use that. Otherwise, an error will be raised. ## Jira.GetProjectById [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/jira\#jiragetprojectbyid) See Example > Get the details of a Jira project by its ID or key. **Parameters** - **project** ( `string`, required) The ID or key of the project to retrieve - **atlassian\_cloud\_id** ( `string`, optional) The ID of the Atlassian Cloud to use (defaults to None). If not provided and the user has a single cloud authorized, the tool will use that. Otherwise, an error will be raised. ## Jira.GetBoards [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/jira\#jiragetboards) See Example > Retrieve Jira boards either by specifying their names or IDs, or get all **Parameters** - **board\_identifiers\_list** ( `array[string]`, optional) List of board names or numeric IDs (as strings) to retrieve using pagination. Include all mentioned boards in a single list for best performance. Default None retrieves all boards. Maximum 50 boards returned per call. - **limit** ( `integer`, optional) Maximum number of boards to return (1-50). Defaults to max that is 50. - **offset** ( `integer`, optional) Number of boards to skip for pagination. Must be 0 or greater. Defaults to 0. - **atlassian\_cloud\_id** ( `string`, optional) Atlassian Cloud ID to use. Defaults to None (uses single authorized cloud). ## Jira.GetBoardBacklogIssues [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/jira\#jiragetboardbacklogissues) See Example > Get all issues in a board’s backlog with pagination support. **Parameters** - **board\_id** ( `string`, required) The ID of the board to retrieve backlog issues from. Must be a valid board ID that supports backlogs (typically Scrum or Kanban boards). - **limit** ( `integer`, optional) The maximum number of issues to return. Must be between 1 and 100 inclusive. Controls pagination and determines how many issues are fetched and returned. Defaults to 50 for improved performance. - **offset** ( `integer`, optional) The number of issues to skip before starting to return results. Used for pagination when the backlog has many issues. For example, offset=50 with limit=50 would return issues 51-100. Must be 0 or greater. Defaults to 0. - **atlassian\_cloud\_id** ( `string`, optional) The ID of the Atlassian Cloud to use (defaults to None). If not provided and the user has a single cloud authorized, the tool will use that. Otherwise, an error will be raised. ## Jira.GetPriorityById [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/jira\#jiragetprioritybyid) See Example > Get the details of a priority by its ID. **Parameters** - **priority\_id** ( `string`, required) The ID of the priority to retrieve. - **atlassian\_cloud\_id** ( `string`, optional) The ID of the Atlassian Cloud to use (defaults to None). If not provided and the user has a single cloud authorized, the tool will use that. Otherwise, an error will be raised. ## Jira.ListPrioritySchemes [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/jira\#jiralistpriorityschemes) See Example > Browse the priority schemes available in Jira. **Parameters** - **scheme\_name** ( `string`, optional) Filter by scheme name. Defaults to None (returns all scheme names). - **limit** ( `integer`, optional) The maximum number of priority schemes to return. Min of 1, max of 50. Defaults to 50. - **offset** ( `integer`, optional) The number of priority schemes to skip. Defaults to 0 (start from the first scheme). - **order\_by** ( `Enum` [PrioritySchemeOrderBy](https://docs.arcade.dev/mcp-servers/productivity/jira/reference#PrioritySchemeOrderBy), optional) The order in which to return the priority schemes. Defaults to name ascending. - **atlassian\_cloud\_id** ( `string`, optional) The ID of the Atlassian Cloud to use (defaults to None). If not provided and the user has a single cloud authorized, the tool will use that. Otherwise, an error will be raised. ## Jira.ListPrioritiesAssociatedWithAPriorityScheme [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/jira\#jiralistprioritiesassociatedwithapriorityscheme) See Example > Browse the priorities associated with a priority scheme. **Parameters** - **scheme\_id** ( `string`, required) The ID of the priority scheme to retrieve priorities for. - **limit** ( `integer`, optional) The maximum number of priority schemes to return. Min of 1, max of 50. Defaults to 50. - **offset** ( `integer`, optional) The number of priority schemes to skip. Defaults to 0 (start from the first scheme). - **atlassian\_cloud\_id** ( `string`, optional) The ID of the Atlassian Cloud to use (defaults to None). If not provided and the user has a single cloud authorized, the tool will use that. Otherwise, an error will be raised. ## Jira.ListProjectsAssociatedWithAPriorityScheme [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/jira\#jiralistprojectsassociatedwithapriorityscheme) See Example > Browse the projects associated with a priority scheme. **Parameters** - **scheme\_id** ( `string`, required) The ID of the priority scheme to retrieve projects for. - **project** ( `string`, optional) Filter by project ID, key or name. Defaults to None (returns all projects). - **limit** ( `integer`, optional) The maximum number of projects to return. Min of 1, max of 50. Defaults to 50. - **offset** ( `integer`, optional) The number of projects to skip. Defaults to 0 (start from the first project). - **atlassian\_cloud\_id** ( `string`, optional) The ID of the Atlassian Cloud to use (defaults to None). If not provided and the user has a single cloud authorized, the tool will use that. Otherwise, an error will be raised. ## Jira.ListPrioritiesAvailableToAProject [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/jira\#jiralistprioritiesavailabletoaproject) See Example > Browse the priorities available to be used in issues in the specified Jira project. **Parameters** - **project** ( `string`, required) The ID, key or name of the project to retrieve priorities for. - **atlassian\_cloud\_id** ( `string`, optional) The ID of the Atlassian Cloud to use (defaults to None). If not provided and the user has a single cloud authorized, the tool will use that. Otherwise, an error will be raised. ## Jira.ListPrioritiesAvailableToAnIssue [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/jira\#jiralistprioritiesavailabletoanissue) See Example > Browse the priorities available to be used in the specified Jira issue. **Parameters** - **issue** ( `string`, required) The ID or key of the issue to retrieve priorities for. - **atlassian\_cloud\_id** ( `string`, optional) The ID of the Atlassian Cloud to use (defaults to None). If not provided and the user has a single cloud authorized, the tool will use that. Otherwise, an error will be raised. ## Jira.GetCommentById [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/jira\#jiragetcommentbyid) See Example > Get a comment by its ID. **Parameters** - **issue\_id** ( `string`, required) The ID or key of the issue to retrieve the comment from. - **comment\_id** ( `string`, required) The ID of the comment to retrieve - **include\_adf\_content** ( `boolean`, optional) Whether to include the ADF (Atlassian Document Format) content of the comment in the response. Defaults to False (return only the HTML rendered content). - **atlassian\_cloud\_id** ( `string`, optional) The ID of the Atlassian Cloud to use (defaults to None). If not provided and the user has a single cloud authorized, the tool will use that. Otherwise, an error will be raised. ## Jira.GetIssueComments [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/jira\#jiragetissuecomments) See Example > Get the comments of a Jira issue by its ID. **Parameters** - **issue** ( `string`, required) The ID or key of the issue to retrieve - **limit** ( `integer`, optional) The maximum number of comments to retrieve. Min 1, max 100, default 100. - **offset** ( `integer`, optional) The number of comments to skip. Defaults to 0 (start from the first comment). - **order\_by** ( `Enum` [IssueCommentOrderBy](https://docs.arcade.dev/mcp-servers/productivity/jira/reference#IssueCommentOrderBy), optional) The order in which to return the comments. Defaults to ‘created\_date\_descending’ (most recent first). - **include\_adf\_content** ( `boolean`, optional) Whether to include the ADF (Atlassian Document Format) content of the comment in the response. Defaults to False (return only the HTML rendered content). - **atlassian\_cloud\_id** ( `string`, optional) The ID of the Atlassian Cloud to use (defaults to None). If not provided and the user has a single cloud authorized, the tool will use that. Otherwise, an error will be raised. ## Jira.AddCommentToIssue [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/jira\#jiraaddcommenttoissue) See Example > Add a comment to a Jira issue. **Parameters** - **issue** ( `string`, required) The ID or key of the issue to comment on. - **body** ( `string`, required) The body of the comment to add to the issue. - **reply\_to\_comment** ( `string`, optional) Quote a previous comment as a reply to it. Provide the comment’s ID. Must be a comment from the same issue. Defaults to None (no quoted comment). - **mention\_users** ( `array[string]`, optional) The users to mention in the comment. Provide the user display name, email address, or ID. Ex: ‘John Doe’ or ‘ [john.doe@example.com](mailto:john.doe@example.com)’. Defaults to None (no user mentions). - **atlassian\_cloud\_id** ( `string`, optional) The ID of the Atlassian Cloud to use (defaults to None). If not provided and the user has a single cloud authorized, the tool will use that. Otherwise, an error will be raised. ## Auth [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/jira\#auth) The Arcade Jira toolkit uses the [Atlassian auth provider](https://docs.arcade.dev/home/auth-providers/atlassian) to connect to users’ Jira accounts. Please refer to the [Atlassian auth provider](https://docs.arcade.dev/home/auth-providers/atlassian) documentation to learn how to configure auth. ## Get Building [Use tools hosted on Arcade Cloud\\ \\ Arcade tools are hosted by our cloud platform and ready to be used in your agents. Learn how.](https://docs.arcade.dev/home/quickstart) [Self Host Arcade tools\\ \\ Arcade tools can be self-hosted on your own infrastructure. Learn more about self-hosting.\\ \\ ```\\ pip install arcade_jira\\ ```](https://docs.arcade.dev/home/hosting-overview) [Reference](https://docs.arcade.dev/mcp-servers/productivity/google_sheets/reference "Reference") [Environment Variables](https://docs.arcade.dev/mcp-servers/productivity/jira/environment_variables "Environment Variables") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Slack Integration Toolkit [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Social & Communication](https://docs.arcade.dev/mcp-servers/social-communication/discord "Social & Communication") Slack # Slack **Description:** Enable agents to interact with Slack **Author:** Arcade **Auth:** User authorization [![PyPI Version](https://img.shields.io/pypi/v/arcade_slack)](https://pypi.org/project/arcade_slack/)[![License](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/arcadeai/arcade-ai/blob/main/LICENSE)[![Python Versions](https://img.shields.io/pypi/pyversions/arcade_slack)](https://pypi.org/project/arcade_slack/)[![Wheel Status](https://img.shields.io/pypi/wheel/arcade_slack)](https://pypi.org/project/arcade_slack/)[![Downloads](https://img.shields.io/pypi/dm/arcade_slack)](https://pypi.org/project/arcade_slack/) The Slack MCP Server provides a comprehensive set of tools for interacting with the Slack platform, enabling users and AI applications to efficiently manage conversations and user information. With this toolkit, you can: - Retrieve detailed information about users, including their IDs, usernames, and emails. - List all users in your Slack team and get users in specific conversations. - Send messages to channels, direct messages, or multi-person conversations. - Access messages and metadata from various conversations, including channels and direct messages. - Manage and list conversations, including public and private channels. This toolkit streamlines communication and enhances collaboration within Slack. ## Available Tools [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack\#available-tools) | Tool Name | Description | | --- | --- | | Slack.WhoAmI | Get comprehensive user profile. | | Slack.GetUsersInfo | Get the information of one or more users in Slack by ID, username, and/or email. | | Slack.ListUsers | List all users in the authenticated user's Slack team. | | Slack.SendMessage | Send a message to a Channel, Direct Message (IM/DM), or Multi-Person (MPIM) conversation | | Slack.GetUsersInConversation | Get the users in a Slack conversation (Channel, DM/IM, or MPIM) by its ID or by channel name. | | Slack.GetMessages | Get messages in a Slack Channel, DM (direct message) or MPIM (multi-person) conversation. | | Slack.GetConversationMetadata | Get metadata of a Channel, a Direct Message (IM / DM) or a Multi-Person (MPIM) conversation. | | Slack.ListConversations | List metadata for Slack conversations (channels, DMs, MPIMs) the user is a member of. | | Slack.GetUserInfoById | Get the information of a user in Slack. | | Slack.SendDmToUser | Send a direct message to a user in Slack. | | Slack.SendMessageToChannel | Send a message to a channel in Slack. | | Slack.GetMembersInConversationById | Get the members of a conversation in Slack by the conversation's ID. | | Slack.GetMembersInChannelByName | Get the members of a conversation in Slack by the conversation's name. | | Slack.GetMessagesInChannelByName | Get the messages in a channel by the channel's name. | | Slack.GetMessagesInConversationById | Get the messages in a conversation by the conversation's ID. | | Slack.GetMessagesInDirectMessageConversationByUsername | Get the messages in a direct conversation by the user's name. | | Slack.GetMessagesInMultiPersonDmConversationByUsernames | Get the messages in a multi-person direct message conversation by the usernames. | | Slack.ListConversationsMetadata | List Slack conversations (channels, DMs, MPIMs) the user is a member of. | | Slack.ListPublicChannelsMetadata | List metadata for public channels in Slack that the user is a member of. | | Slack.ListPrivateChannelsMetadata | List metadata for private channels in Slack that the user is a member of. | | Slack.ListGroupDirectMessageConversationsMetadata | List metadata for group direct message conversations that the user is a member of. | | Slack.ListDirectMessageConversationsMetadata | List metadata for direct message conversations in Slack that the user is a member of. | | Slack.GetConversationMetadataById | Get the metadata of a conversation in Slack searching by its ID. | | Slack.GetChannelMetadataByName | Get the metadata of a channel in Slack searching by its name. | | Slack.GetDirectMessageConversationMetadataByUsername | Get the metadata of a direct message conversation in Slack by the username. | | Slack.GetMultiPersonDmConversationMetadataByUsernames | Get the metadata of a multi-person direct message conversation in Slack by the usernames. | If you need to perform an action that’s not listed here, you can [get in touch\\ with us](mailto:contact@arcade.dev) to request a new tool, or [create your\\ own tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server). ## Slack.WhoAmI [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack\#slackwhoami) See Example > Get comprehensive user profile information. **Parameters** This tool takes no parameters. ## Slack.GetUsersInfo [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack\#slackgetusersinfo) See Example > Get the information of one or more users in Slack by ID, username, and/or email. **Parameters** - **user\_ids** ( `array[string]`, optional) The IDs of the users to get - **usernames** ( `array[string]`, optional) The usernames of the users to get. Prefer retrieving by user\_ids and/or emails, when available, since the performance is better. - **emails** ( `array[string]`, optional) The emails of the users to get ## Slack.ListUsers [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack\#slacklistusers) See Example > List all users in the authenticated user’s Slack team. **Parameters** - **exclude\_bots** ( `boolean`, optional) Whether to exclude bots from the results. Defaults to True. - **limit** ( `integer`, optional) The maximum number of users to return. Defaults to 200. Maximum is 500. - **next\_cursor** ( `string`, optional) The next cursor token to use for pagination. ## Slack.SendMessage [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack\#slacksendmessage) See Example > Send a message to a Channel, Direct Message (IM/DM), or Multi-Person (MPIM) conversation. Provide exactly one of: - channel\_name; or - conversation\_id; or - any combination of user\_ids, usernames, and/or emails. In case multiple user\_ids, usernames, and/or emails are provided, the tool will open a multi-person conversation with the specified people and send the message to it. To improve performance, prefer providing a conversation\_id over a channel\_name, when available. When referencing users, prefer providing user\_ids and/or emails, when possible. **Parameters** - **message** ( `string`, required) The content of the message to send. - **channel\_name** ( `string`, optional) The channel name to send the message to. Prefer providing a conversation\_id, when available, since the performance is better. - **conversation\_id** ( `string`, optional) The conversation ID to send the message to. - **user\_ids** ( `array[string]`, optional) The Slack user IDs of the people to message. - **emails** ( `array[string]`, optional) The emails of the people to message. - **usernames** ( `array[string]`, optional) The Slack usernames of the people to message. Prefer providing user\_ids and/or emails, when available, since the performance is better. ## Slack.GetUsersInConversation [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack\#slackgetusersinconversation) See Example > Get the users in a Slack conversation (Channel, DM/IM, or MPIM) by its ID or by channel name. Provide exactly one of conversation\_id or channel\_name. Prefer providing a conversation\_id, when available, since the performance is better. **Parameters** - **conversation\_id** ( `string`, optional) The ID of the conversation to get users in. - **channel\_name** ( `string`, optional) The name of the channel to get users in. Prefer providing a conversation\_id, when available, since the performance is better. - **limit** ( `integer`, optional) The maximum number of users to return. Defaults to 200. Maximum is 500. - **next\_cursor** ( `string`, optional) The cursor to use for pagination. ## Slack.GetMessages [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack\#slackgetmessages) See Example > Get messages in a Slack Channel, DM (direct message) or MPIM (multi-person) conversation. Provide exactly one of: - conversation\_id; or - channel\_name; or - any combination of user\_ids, usernames, and/or emails. To improve performance, prefer providing a conversation\_id over a channel\_name, when available. When referencing users, prefer providing user\_ids and/or emails, when possible. **Parameters** - **conversation\_id** ( `string`, optional) The ID of the conversation to get messages from. Provide exactly one of conversation\_id OR any combination of user\_ids, usernames, and/or emails. - **channel\_name** ( `string`, optional) The name of the channel to get messages from. Prefer providing a conversation\_id, when available, since the performance is better. - **user\_ids** ( `array[string]`, optional) The IDs of the users in the conversation to get messages from. - **usernames** ( `array[string]`, optional) The usernames of the users in the conversation to get messages from. Prefer providinguser\_ids and/or emails, when available, since the performance is better. - **emails** ( `array[string]`, optional) The emails of the users in the conversation to get messages from. - **oldest\_relative** ( `string`, optional) The oldest message to include in the results, specified as a time offset from the current time in the format ‘DD:HH:MM’ - **latest\_relative** ( `string`, optional) The latest message to include in the results, specified as a time offset from the current time in the format ‘DD:HH:MM’ - **oldest\_datetime** ( `string`, optional) The oldest message to include in the results, specified as a datetime object in the format ‘YYYY-MM-DD HH:MM:SS’ - **latest\_datetime** ( `string`, optional) The latest message to include in the results, specified as a datetime object in the format ‘YYYY-MM-DD HH:MM:SS’ - **limit** ( `integer`, optional) The maximum number of messages to return. Defaults to 20. Maximum is 100. - **next\_cursor** ( `string`, optional) The cursor to use for pagination. **Notes about the date/time filtering parameters:** To filter messages by an absolute datetime, use ‘oldest\_datetime’ and/or ‘latest\_datetime’. If only ‘oldest\_datetime’ is provided, it will return messages from the oldest\_datetime to the current time. If only ‘latest\_datetime’ is provided, it will return messages since the beginning of the conversation to the latest\_datetime. To filter messages by a relative datetime (e.g. 3 days ago, 1 hour ago, etc.), use ‘oldest\_relative’ and/or ‘latest\_relative’. If only ‘oldest\_relative’ is provided, it will return messages from the oldest\_relative to the current time. If only ‘latest\_relative’ is provided, it will return messages from the current time to the latest\_relative. Do not provide both ‘oldest\_datetime’ and ‘oldest\_relative’ or both ‘latest\_datetime’ and ‘latest\_relative’. Leave all arguments with the default None to get messages without date/time filtering ## Slack.GetConversationMetadata [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack\#slackgetconversationmetadata) See Example > Get metadata of a Channel, a Direct Message (IM / DM) or a Multi-Person (MPIM) conversation. Provide exactly one of: - conversation\_id; or - channel\_name; or - any combination of user\_ids, usernames, and/or emails. To improve performance, prefer providing a conversation\_id over a channel\_name, when available. When referencing users, prefer providing user\_ids and/or emails, when possible. **Parameters** - **conversation\_id** ( `string`, optional) The ID of the conversation to get metadata for - **channel\_name** ( `string`, optional) The name of the channel to get metadata for. Prefer providing a conversation\_id, when available, since the performance is better. - **usernames** ( `array[string]`, optional) The usernames of the users to get the conversation metadata. Prefer providing user\_ids and/or emails, when available, since the performance is better. - **emails** ( `array[string]`, optional) The emails of the users to get the conversation metadata. - **user\_ids** ( `array[string]`, optional) The IDs of the users to get the conversation metadata. ## Slack.ListConversations [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack\#slacklistconversations) See Example > List metadata for Slack conversations (channels, DMs, MPIMs) the user is a member of. **Parameters** - **conversation\_types** ( `Enum` [ConversationType](https://docs.arcade.dev/mcp-servers/social-communication/slack/reference#ConversationType), optional) Optionally filter by the type(s) of conversations. Defaults to None (all types). - **limit** ( `integer`, optional) The maximum number of conversations to list. Defaults to 200. Maximum is 500. - **next\_cursor** ( `string`, optional) The cursor to use for pagination. ## Slack.GetUserInfoById [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack\#slackgetuserinfobyid) This tool is marked for deprecation and will be removed in a future release. Please use [Slack.GetUsersInfo](https://docs.arcade.dev/mcp-servers/social-communication/slack#slackgetusersinfo) instead. See Example > Get the information of a user in Slack. **Parameters** - **user\_id** ( `string`, required) The ID of the user to get ## Slack.SendDmToUser [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack\#slacksenddmtouser) This tool is marked for deprecation and will be removed in a future release. Please use [Slack.SendMessage](https://docs.arcade.dev/mcp-servers/social-communication/slack#slacksendmessage) instead. See Example > Send a direct message to a user in Slack. **Parameters** - **user\_name** ( `string`, required) The Slack username of the person you want to message. Slack usernames are ALWAYS lowercase. - **message** ( `string`, required) The message you want to send ## Slack.SendMessageToChannel [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack\#slacksendmessagetochannel) This tool is marked for deprecation and will be removed in a future release. Please use [Slack.SendMessage](https://docs.arcade.dev/mcp-servers/social-communication/slack#slacksendmessage) instead. See Example > Send a message to a channel in Slack. **Parameters** - **channel\_name** ( `string`, required) The Slack channel name where you want to send the message. - **message** ( `string`, required) The message you want to send ## Slack.GetMembersInConversationById [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack\#slackgetmembersinconversationbyid) This tool is marked for deprecation and will be removed in a future release. Please use [Slack.GetUsersInConversation](https://docs.arcade.dev/mcp-servers/social-communication/slack#slackgetusersinconversation) instead. See Example > Get the members of a conversation in Slack by the conversation’s ID. **Parameters** - **conversation\_id** ( `string`, required) The ID of the conversation to get members for - **limit** ( `integer`, optional) The maximum number of members to return. - **next\_cursor** ( `string`, optional) The cursor to use for pagination. ## Slack.GetMembersInChannelByName [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack\#slackgetmembersinchannelbyname) This tool is marked for deprecation and will be removed in a future release. Please use [Slack.GetUsersInConversation](https://docs.arcade.dev/mcp-servers/social-communication/slack#slackgetusersinconversation) instead. See Example > Get the members of a conversation in Slack by the conversation’s name. **Parameters** - **channel\_name** ( `string`, required) The name of the channel to get members for - **limit** ( `integer`, optional) The maximum number of members to return. - **next\_cursor** ( `string`, optional) The cursor to use for pagination. ## Slack.GetMessagesInChannelByName [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack\#slackgetmessagesinchannelbyname) This tool is marked for deprecation and will be removed in a future release. Please use [Slack.GetMessages](https://docs.arcade.dev/mcp-servers/social-communication/slack#slackgetmessages) instead. See Example > Get the messages in a channel by the channel’s name. **Parameters** - **channel\_name** ( `string`, required) The name of the channel - **oldest\_relative** ( `string`, optional) The oldest message to include in the results, specified as a time offset from the current time in the format ‘DD:HH:MM’ - **latest\_relative** ( `string`, optional) The latest message to include in the results, specified as a time offset from the current time in the format ‘DD:HH:MM’ - **oldest\_datetime** ( `string`, optional) The oldest message to include in the results, specified as a datetime object in the format ‘YYYY-MM-DD HH:MM:SS’ - **latest\_datetime** ( `string`, optional) The latest message to include in the results, specified as a datetime object in the format ‘YYYY-MM-DD HH:MM:SS’ - **limit** ( `integer`, optional) The maximum number of messages to return. - **next\_cursor** ( `string`, optional) The cursor to use for pagination. ## Slack.GetMessagesInConversationById [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack\#slackgetmessagesinconversationbyid) This tool is marked for deprecation and will be removed in a future release. Please use [Slack.GetMessages](https://docs.arcade.dev/mcp-servers/social-communication/slack#slackgetmessages) instead. See Example > Get the messages in a conversation by the conversation’s ID. **Parameters** - **conversation\_id** ( `string`, required) The ID of the conversation to get history for - **oldest\_relative** ( `string`, optional) The oldest message to include in the results, specified as a time offset from the current time in the format ‘DD:HH:MM’ - **latest\_relative** ( `string`, optional) The latest message to include in the results, specified as a time offset from the current time in the format ‘DD:HH:MM’ - **oldest\_datetime** ( `string`, optional) The oldest message to include in the results, specified as a datetime object in the format ‘YYYY-MM-DD HH:MM:SS’ - **latest\_datetime** ( `string`, optional) The latest message to include in the results, specified as a datetime object in the format ‘YYYY-MM-DD HH:MM:SS’ - **limit** ( `integer`, optional) The maximum number of messages to return. - **next\_cursor** ( `string`, optional) The cursor to use for pagination. ## Slack.GetMessagesInDirectMessageConversationByUsername [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack\#slackgetmessagesindirectmessageconversationbyusername) This tool is marked for deprecation and will be removed in a future release. Please use [Slack.GetMessages](https://docs.arcade.dev/mcp-servers/social-communication/slack#slackgetmessages) instead. See Example > Get the messages in a direct conversation by the user’s name. **Parameters** - **username** ( `string`, required) The username of the user to get messages from - **oldest\_relative** ( `string`, optional) The oldest message to include in the results, specified as a time offset from the current time in the format ‘DD:HH:MM’ - **latest\_relative** ( `string`, optional) The latest message to include in the results, specified as a time offset from the current time in the format ‘DD:HH:MM’ - **oldest\_datetime** ( `string`, optional) The oldest message to include in the results, specified as a datetime object in the format ‘YYYY-MM-DD HH:MM:SS’ - **latest\_datetime** ( `string`, optional) The latest message to include in the results, specified as a datetime object in the format ‘YYYY-MM-DD HH:MM:SS’ - **limit** ( `integer`, optional) The maximum number of messages to return. - **next\_cursor** ( `string`, optional) The cursor to use for pagination. ## Slack.GetMessagesInMultiPersonDmConversationByUsernames [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack\#slackgetmessagesinmultipersondmconversationbyusernames) This tool is marked for deprecation and will be removed in a future release. Please use [Slack.GetMessages](https://docs.arcade.dev/mcp-servers/social-communication/slack#slackgetmessages) instead. See Example > Get the messages in a multi-person direct message conversation by the usernames. **Parameters** - **usernames** ( `array[string]`, required) The usernames of the users to get messages from - **oldest\_relative** ( `string`, optional) The oldest message to include in the results, specified as a time offset from the current time in the format ‘DD:HH:MM’ - **latest\_relative** ( `string`, optional) The latest message to include in the results, specified as a time offset from the current time in the format ‘DD:HH:MM’ - **oldest\_datetime** ( `string`, optional) The oldest message to include in the results, specified as a datetime object in the format ‘YYYY-MM-DD HH:MM:SS’ - **latest\_datetime** ( `string`, optional) The latest message to include in the results, specified as a datetime object in the format ‘YYYY-MM-DD HH:MM:SS’ - **limit** ( `integer`, optional) The maximum number of messages to return. - **next\_cursor** ( `string`, optional) The cursor to use for pagination. ## Slack.ListConversationsMetadata [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack\#slacklistconversationsmetadata) This tool is marked for deprecation and will be removed in a future release. Please use [Slack.ListConversations](https://docs.arcade.dev/mcp-servers/social-communication/slack#slacklistconversations) instead. See Example > List Slack conversations (channels, DMs, MPIMs) the user is a member of. **Parameters** - **conversation\_types** ( `Enum` [ConversationType](https://docs.arcade.dev/mcp-servers/social-communication/slack/reference#ConversationType), optional) Optionally filter by the type(s) of conversations. Defaults to None (all types). - **limit** ( `integer`, optional) The maximum number of conversations to list. - **next\_cursor** ( `string`, optional) The cursor to use for pagination. ## Slack.ListPublicChannelsMetadata [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack\#slacklistpublicchannelsmetadata) This tool is marked for deprecation and will be removed in a future release. Please use [Slack.ListConversations](https://docs.arcade.dev/mcp-servers/social-communication/slack#slacklistconversations) instead. See Example > List metadata for public channels in Slack that the user is a member of. **Parameters** - **limit** ( `integer`, optional) The maximum number of channels to list. ## Slack.ListPrivateChannelsMetadata [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack\#slacklistprivatechannelsmetadata) This tool is marked for deprecation and will be removed in a future release. Please use [Slack.ListConversations](https://docs.arcade.dev/mcp-servers/social-communication/slack#slacklistconversations) instead. See Example > List metadata for private channels in Slack that the user is a member of. **Parameters** - **limit** ( `integer`, optional) The maximum number of channels to list. ## Slack.ListGroupDirectMessageConversationsMetadata [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack\#slacklistgroupdirectmessageconversationsmetadata) This tool is marked for deprecation and will be removed in a future release. Please use [Slack.ListConversations](https://docs.arcade.dev/mcp-servers/social-communication/slack#slacklistconversations) instead. See Example > List metadata for group direct message conversations that the user is a member of. **Parameters** - **limit** ( `integer`, optional) The maximum number of conversations to list. ## Slack.ListDirectMessageConversationsMetadata [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack\#slacklistdirectmessageconversationsmetadata) This tool is marked for deprecation and will be removed in a future release. Please use [Slack.ListConversations](https://docs.arcade.dev/mcp-servers/social-communication/slack#slacklistconversations) instead. See Example > List metadata for direct message conversations in Slack that the user is a member of. **Parameters** - **limit** ( `integer`, optional) The maximum number of conversations to list. ## Slack.GetConversationMetadataById [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack\#slackgetconversationmetadatabyid) This tool is marked for deprecation and will be removed in a future release. Please use [Slack.GetConversationMetadata](https://docs.arcade.dev/mcp-servers/social-communication/slack#slackgetconversationmetadata) instead. See Example > Get the metadata of a conversation in Slack searching by its ID. **Parameters** - **conversation\_id** ( `string`, required) The ID of the conversation to get metadata for ## Slack.GetChannelMetadataByName [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack\#slackgetchannelmetadatabyname) This tool is marked for deprecation and will be removed in a future release. Please use [Slack.GetConversationMetadata](https://docs.arcade.dev/mcp-servers/social-communication/slack#slackgetconversationmetadata) instead. See Example > Get the metadata of a channel in Slack searching by its name. **Parameters** - **channel\_name** ( `string`, required) The name of the channel to get metadata for - **next\_cursor** ( `string`, optional) The cursor to use for pagination, if continuing from a previous search. ## Slack.GetDirectMessageConversationMetadataByUsername [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack\#slackgetdirectmessageconversationmetadatabyusername) This tool is marked for deprecation and will be removed in a future release. Please use [Slack.GetConversationMetadata](https://docs.arcade.dev/mcp-servers/social-communication/slack#slackgetconversationmetadata) instead. See Example > Get the metadata of a direct message conversation in Slack by the username. **Parameters** - **username** ( `string`, required) The username of the user/person to get messages with - **next\_cursor** ( `string`, optional) The cursor to use for pagination, if continuing from a previous search. ## Slack.GetMultiPersonDmConversationMetadataByUsernames [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack\#slackgetmultipersondmconversationmetadatabyusernames) This tool is marked for deprecation and will be removed in a future release. Please use [Slack.GetConversationMetadata](https://docs.arcade.dev/mcp-servers/social-communication/slack#slackgetconversationmetadata) instead. See Example > Get the metadata of a multi-person direct message conversation in Slack by the usernames. **Parameters** - **usernames** ( `array[string]`, required) The usernames of the users/people to get messages with - **next\_cursor** ( `string`, optional) The cursor to use for pagination, if continuing from a previous search. ## Auth [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack\#auth) The Arcade Slack toolkit uses the [Slack auth provider](https://docs.arcade.dev/home/auth-providers/slack) to connect to users’ Slack accounts. Please refer to the [Slack auth provider](https://docs.arcade.dev/home/auth-providers/slack) documentation to learn how to configure auth. ## Get Building [Use tools hosted on Arcade Cloud\\ \\ Arcade tools are hosted by our cloud platform and ready to be used in your agents. Learn how.](https://docs.arcade.dev/home/quickstart) [Self Host Arcade tools\\ \\ Arcade tools can be self-hosted on your own infrastructure. Learn more about self-hosting.\\ \\ ```\\ pip install arcade_slack\\ ```](https://docs.arcade.dev/home/hosting-overview) [LinkedIn](https://docs.arcade.dev/mcp-servers/social-communication/linkedin "LinkedIn") [Environment Variables](https://docs.arcade.dev/mcp-servers/social-communication/slack/environment_variables "Environment Variables") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## E2B Toolkit Overview [Integrations](https://docs.arcade.dev/toolkits "Integrations") Developer ToolsE2B # E2B **Description:** Enable agents to run code in a sandboxed environment. **Author:** Arcade **Auth:** API Key [![PyPI Version](https://img.shields.io/pypi/v/arcade_e2b)](https://pypi.org/project/arcade_e2b/)[![License](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/arcadeai/arcade-ai/blob/main/LICENSE)[![Python Versions](https://img.shields.io/pypi/pyversions/arcade_e2b)](https://pypi.org/project/arcade_e2b/)[![Wheel Status](https://img.shields.io/pypi/wheel/arcade_e2b)](https://pypi.org/project/arcade_e2b/)[![Downloads](https://img.shields.io/pypi/dm/arcade_e2b)](https://pypi.org/project/arcade_e2b/) The Arcade E2B MCP Server provides a pre-built set of tools for running code in a sandboxed environment. These tools make it easy to build agents and AI apps that can: - Run code in a sandboxed environment - Create a static matplotlib chart ## Available Tools [Permalink for this section](https://docs.arcade.dev/mcp-servers/development/e2b\#available-tools) These tools are currently available in the Arcade E2B toolkit. | Tool Name | Description | | --- | --- | | E2b.RunCode | Run code in a sandboxed environment. | | E2b.CreateStaticMatplotlibChart | Create a static matplotlib chart. | If you need to perform an action that’s not listed here, you can [get in touch\\ with us](mailto:contact@arcade.dev) to request a new tool, or [create your\\ own tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server). ## E2b.RunCode [Permalink for this section](https://docs.arcade.dev/mcp-servers/development/e2b\#e2bruncode) See Example > Run code in a sandbox and return the output. **Auth:** - **Environment Variables Required:** - `E2B_API_KEY`: Your API key for authentication. **Parameters** - **`code`** _(string, required)_ The code to run. - **`language`** _(string, optional)_ The language of the code. Valid values are ‘python’, ‘js’, ‘r’, ‘java’, ‘bash’. Defaults to ‘python’. * * * ## E2b.CreateStaticMatplotlibChart [Permalink for this section](https://docs.arcade.dev/mcp-servers/development/e2b\#e2bcreatestaticmatplotlibchart) See Example > Run the provided Python code to generate a static matplotlib chart. The resulting chart is returned as a base64 encoded image. **Auth:** - **Environment Variables Required:** - `E2B_API_KEY`: Your API key for authentication. **Parameters** - **`code`** _(string, required)_ The Python code to run. ## Auth [Permalink for this section](https://docs.arcade.dev/mcp-servers/development/e2b\#auth) The Arcade E2B toolkit uses [E2B](https://e2b.dev/) to run code in a sandboxed environment. **Global Environment Variables:** - `E2B_API_KEY`: Your [E2B](https://e2b.dev/) API key. ## Get Building [Use tools hosted on Arcade Cloud\\ \\ Arcade tools are hosted by our cloud platform and ready to be used in your agents. Learn how.](https://docs.arcade.dev/home/quickstart) [Self Host Arcade tools\\ \\ Arcade tools can be self-hosted on your own infrastructure. Learn more about self-hosting.\\ \\ ```\\ pip install arcade-e2b\\ ```](https://docs.arcade.dev/home/hosting-overview) [Twitch](https://docs.arcade.dev/mcp-servers/entertainment/twitch "Twitch") [GitHub](https://docs.arcade.dev/mcp-servers/development/github/github "GitHub") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Reddit Toolkit [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Social & Communication](https://docs.arcade.dev/mcp-servers/social-communication/discord "Social & Communication") Reddit # Reddit **Description:** Enable agents to interact with Reddit. **Author:** Arcade **Auth:** User authorizationvia the [Reddit auth provider](https://docs.arcade.dev/home/auth-providers/reddit) [![PyPI Version](https://img.shields.io/pypi/v/arcade_reddit)](https://pypi.org/project/arcade_reddit/)[![License](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/arcadeai/arcade-ai/blob/main/LICENSE)[![Python Versions](https://img.shields.io/pypi/pyversions/arcade_reddit)](https://pypi.org/project/arcade_reddit/)[![Wheel Status](https://img.shields.io/pypi/wheel/arcade_reddit)](https://pypi.org/project/arcade_reddit/)[![Downloads](https://img.shields.io/pypi/dm/arcade_reddit)](https://pypi.org/project/arcade_reddit/) The Arcade Reddit MCP Server provides a pre-built set of tools for interacting with Reddit. These tools make it easy to build agents and AI apps that can: - Submit text posts - Comment on posts - Reply to comments - Get posts (title and other metadata) in a subreddit - Get content (body) of posts - Get top-level comments of a post - Determine if a subreddit exists or is private - Get rules of a subreddit - Get the authenticated user’s username - Get posts by the authenticated user ## Available Tools [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/reddit\#available-tools) These tools are currently available in the Arcade Reddit toolkit. | Tool Name | Description | | --- | --- | | Reddit.SubmitTextPost | Submit a text-based post to Reddit. | | Reddit.CommentOnPost | Comment on a Reddit post. | | Reddit.ReplyToComment | Reply to a Reddit comment. | | Reddit.GetPostsInSubreddit | Gets posts titles, links, and other metadata in the specified subreddit | | Reddit.GetContentOfPost | Get content (body) of a Reddit post. | | Reddit.GetContentOfMultiplePosts | Get content (body) of multiple Reddit posts. | | Reddit.GetTopLevelCommentsOfPost | Get the first page of top-level comments of a Reddit post. | | Reddit.CheckSubredditAccess | Check whether a user has access to a subreddit, including whether it exists | | Reddit.GetSubredditRules | Get the rules of a subreddit | | Reddit.GetMyUsername | Get the authenticated user's username | | Reddit.GetMyPosts | Get posts created by the authenticated user | If you need to perform an action that’s not listed here, you can [get in touch\\ with us](mailto:contact@arcade.dev) to request a new tool, or [create your\\ own tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server) with the [Reddit auth\\ provider](https://docs.arcade.dev/home/auth-providers/reddit#using-reddit-auth-in-custom-tools). ## Reddit.SubmitTextPost [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/reddit\#redditsubmittextpost) See Example > Submit a text-based post to a subreddit **Parameters** - **`subreddit`** _(string, required)_ The name of the subreddit to which the post will be submitted. - **`title`** _(string, required)_ The title of the submission. - **`body`** _(string, optional)_ The body of the post in markdown format. Should never be the same as the title. - **`nsfw`** _(boolean, optional)_ Indicates if the submission is NSFW. Default is `False`. - **`spoiler`** _(boolean, optional)_ Indicates if the post is marked as a spoiler. Default is `False`. - **`send_replies`** _(boolean, optional)_ If true, sends replies to the user’s inbox. Default is `True`. * * * ## Reddit.CommentOnPost [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/reddit\#redditcommentonpost) See Example > Comment on a Reddit post. **Parameters** - **`post_identifier`** _(string, required)_ The identifier of the Reddit post. The identifier may be a Reddit URL, a permalink, a fullname, or a post id. - **`text`** _(string, required)_ The body of the comment in markdown format. * * * ## Reddit.ReplyToComment [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/reddit\#redditreplytocomment) See Example > Reply to a Reddit comment **Parameters** - **`comment_identifier`** _(string, required)_ The identifier of the Reddit comment to reply to. The identifier may be a comment ID, a Reddit URL to the comment, a permalink to the comment, or the fullname of the comment. - **`text`** _(string, required)_ The body of the reply in markdown format. * * * ## Reddit.GetPostsInSubreddit [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/reddit\#redditgetpostsinsubreddit) See Example > Gets posts titles, links, and other metadata in the specified subreddit. The time\_range is required if the listing type is ‘top’ or ‘controversial’. **Parameters** - **`subreddit`** _(string, required)_ The name of the subreddit to fetch posts from. - **`listing`** _(enum ( [SubredditListingType](https://docs.arcade.dev/mcp-servers/social-communication/reddit#subredditlistingtype)), optional)_ The type of listing to fetch. For simple listings such as ‘hot’, ‘new’, or ‘rising’, the time\_range parameter is ignored. For time-based listings such as ‘top’ or ‘controversial’, the ‘time\_range’ parameter is required. Default is ‘hot’. - **`limit`** _(integer, optional)_ The maximum number of posts to fetch. Default is 10, max is 100. - **`cursor`** _(str, optional)_ The pagination token from a previous call. - **`time_range`** _(enum ( [RedditTimeFilter](https://docs.arcade.dev/mcp-servers/social-communication/reddit#reddittimefilter)), optional)_ The time range for filtering posts. Must be provided if the listing type is ‘top’ or ‘controversial’. Otherwise, it is ignored. Defaults to ‘today’. * * * ## Reddit.GetContentOfPost [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/reddit\#redditgetcontentofpost) See Example > Get the content (body) of a Reddit post by its identifier. **Parameters** - **`post_identifier`** _(string, required)_ The identifier of the Reddit post. The identifier may be a Reddit URL, a permalink, a fullname, or a post id. * * * ## Reddit.GetContentOfMultiplePosts [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/reddit\#redditgetcontentofmultipleposts) See Example > Get the content (body) of multiple Reddit posts by their identifiers in a single request **Parameters** - **`post_identifiers`** _(list of strings, required)_ A list of identifiers of the Reddit posts. The identifiers may be Reddit URLs, permalinks, fullnames, or post ids. * * * ## Reddit.GetTopLevelCommentsOfPost [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/reddit\#redditgettoplevelcommentsofpost) See Example > Get the first page of top-level comments of a Reddit post. **Parameters** - **`post_identifier`** _(string, required)_ The identifier of the Reddit post. The identifier may be a Reddit URL, a permalink, a fullname, or a post id. * * * ## Reddit.CheckSubredditAccess [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/reddit\#redditchecksubredditaccess) See Example > Checks whether the specified subreddit exists and also if it is accessible to the authenticated user. **Parameters** - **`subreddit`** _(string, required)_ The name of the subreddit to check. * * * ## Reddit.GetSubredditRules [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/reddit\#redditgetsubredditrules) See Example > Gets the rules of the specified subreddit **Parameters** - **`subreddit`** _(string, required)_ The name of the subreddit for which to fetch rules. * * * ## Reddit.GetMyUsername [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/reddit\#redditgetmyusername) See Example > Gets the username of the authenticated user. * * * ## Reddit.GetMyPosts [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/reddit\#redditgetmyposts) See Example > Get posts that were created by the authenticated user sorted by newest first **Parameters** - **`limit`** _(integer, optional)_ The maximum number of posts to fetch. Default is 10, max is 100. - **`include_body`** _(boolean, optional)_ Whether to include the body of the posts in the response. Default is `True`. - **`cursor`** _(str, optional)_ The pagination token from a previous call. ## Auth [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/reddit\#auth) The Arcade Reddit toolkit uses the [Reddit auth provider](https://docs.arcade.dev/home/auth-providers/reddit) to connect to users’ Reddit accounts. With the Arcade Cloud Platform, there’s nothing to configure. Your users will see `Arcade` as the name of the application that’s requesting permission. With a self-hosted installation of Arcade, you need to [configure the Reddit auth provider](https://docs.arcade.dev/home/auth-providers/reddit#configuring-reddit-auth) with your own Reddit app credentials. ## Reference [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/reddit\#reference) ### SubredditListingType [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/reddit\#subredditlistingtype) The type of listing to fetch. - **`HOT`** _(string: “hot”)_: The hottest posts in the subreddit. - **`NEW`** _(string: “new”)_: The newest posts in the subreddit. - **`RISING`** _(string: “rising”)_: The posts that are trending up in the subreddit. - **`TOP`** _(string: “top”)_: The top posts in the subreddit (time-based). - **`CONTROVERSIAL`** _(string: “controversial”)_: The posts that are currently controversial in the subreddit (time-based). ### RedditTimeFilter [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/reddit\#reddittimefilter) The time range for filtering posts. - **`NOW`** _(string: “NOW”)_ - **`TODAY`** _(string: “TODAY”)_ - **`THIS_WEEK`** _(string: “THIS\_WEEK”)_ - **`THIS_MONTH`** _(string: “THIS\_MONTH”)_ - **`THIS_YEAR`** _(string: “THIS\_YEAR”)_ - **`ALL_TIME`** _(string: “ALL\_TIME”)_ ## Get Building [Use tools hosted on Arcade Cloud\\ \\ Arcade tools are hosted by our cloud platform and ready to be used in your agents. Learn how.](https://docs.arcade.dev/home/quickstart) [Self Host Arcade tools\\ \\ Arcade tools can be self-hosted on your own infrastructure. Learn more about self-hosting.\\ \\ ```\\ pip install arcade_reddit\\ ```](https://docs.arcade.dev/home/hosting-overview) [Reference](https://docs.arcade.dev/mcp-servers/social-communication/microsoft_teams/reference "Reference") [Slack API](https://docs.arcade.dev/mcp-servers/social-communication/slack_api "Slack API") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Outlook Mail Toolkit [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Productivity & Docs](https://docs.arcade.dev/mcp-servers/productivity/asana "Productivity & Docs") Outlook Mail # Outlook Mail **Description:** Enable agents to read, write, and send emails with Outlook. **Author:** Arcade **Auth:** User authorizationvia the [Microsoft auth provider](https://docs.arcade.dev/home/auth-providers/microsoft) [![PyPI Version](https://img.shields.io/pypi/v/arcade_outlook_mail)](https://pypi.org/project/arcade_outlook_mail/)[![License](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/arcadeai/arcade-ai/blob/main/LICENSE)[![Python Versions](https://img.shields.io/pypi/pyversions/arcade_outlook_mail)](https://pypi.org/project/arcade_outlook_mail/)[![Wheel Status](https://img.shields.io/pypi/wheel/arcade_outlook_mail)](https://pypi.org/project/arcade_outlook_mail/)[![Downloads](https://img.shields.io/pypi/dm/arcade_outlook_mail)](https://pypi.org/project/arcade_outlook_mail/) The Arcade Outlook Mail MCP Server provides pre-built tools for working with emails using the Outlook API. Use these tools to: - Read emails - Write emails - Send emails ## Available Tools [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/outlook_mail\#available-tools) These tools are currently available in the Arcade Outlook Mail toolkit. | Tool Name | Description | | --- | --- | | OutlookMail.WhoAmI | Get comprehensive user profile and Outlook Mail environment information. | | OutlookMail.CreateDraftEmail | Compose a new draft email in Outlook | | OutlookMail.UpdateDraftEmail | Update an existing draft email in Outlook | | OutlookMail.SendDraftEmail | Send an existing draft email in Outlook | | OutlookMail.CreateAndSendEmail | Create and immediately send a new email in Outlook to the specified recipients | | OutlookMail.ReplyToEmail | Reply only to the sender of an existing email in Outlook. | | OutlookMail.ReplyAllToEmail | Reply to all recipients of an existing email in Outlook. | | OutlookMail.ListEmails | List emails in the user's mailbox across all folders. | | OutlookMail.ListEmailsInFolder | List the user's emails in the specified folder. | | OutlookMail.ListEmailsByProperty | List emails in the user's mailbox across all folders filtering by a property. | If you need to perform an action that’s not listed here, you can [get in touch\\ with us](mailto:contact@arcade.dev) to request a new tool, or [create your\\ own tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server) with the [Google auth\\ provider](https://docs.arcade.dev/home/auth-providers/google#using-google-auth-in-custom-tools). ## OutlookMail.WhoAmI [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/outlook_mail\#outlookmailwhoami) See Example > Get comprehensive user profile and Outlook Mail environment information. **Parameters** This tool does not take any parameters. * * * ## OutlookMail.CreateDraftEmail [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/outlook_mail\#outlookmailcreatedraftemail) Compose a new draft email in Outlook. **Parameters** - **`subject`** _(string, required)_: The subject of the email to create. - **`body`** _(string, required)_: The body of the email to create. - **`to_recipients`** _(list of strings, required)_: The email addresses that will be the recipients of the draft email. - **`cc_recipients`** _(list of strings, optional)_: The email addresses that will be the CC recipients of the draft email. - **`bcc_recipients`** _(list of strings, optional)_: The email addresses that will be the BCC recipients of the draft email. See Example > * * * ## OutlookMail.UpdateDraftEmail [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/outlook_mail\#outlookmailupdatedraftemail) Update an existing draft email in Outlook. This tool overwrites the subject and body of a draft email (if provided), and modifies its recipient lists by selectively adding or removing email addresses. This tool can update any un-sent email: - draft - reply-draft - reply-all draft - forward draft **Parameters** - **`message_id`** _(string, required)_: The ID of the draft email to update. - **`subject`** _(string, optional)_: The new subject of the draft email. If provided, the existing subject will be overwritten. - **`body`** _(string, optional)_: The new body of the draft email. If provided, the existing body will be overwritten - **`to_add`** _(list of strings, optional)_: Email addresses to add as ‘To’ recipients. - **`to_remove`** _(list of strings, optional)_: Email addresses to remove from the current ‘To’ recipients. - **`cc_add`** _(list of strings, optional)_: Email addresses to add as ‘CC’ recipients. - **`cc_remove`** _(list of strings, optional)_: Email addresses to remove from the current ‘CC’ recipients. - **`bcc_add`** _(list of strings, optional)_: Email addresses to add as ‘BCC’ recipients. - **`bcc_remove`** _(list of strings, optional)_: Email addresses to remove from the current ‘BCC’ recipients. See Example > * * * ## OutlookMail.SendDraftEmail [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/outlook_mail\#outlookmailsenddraftemail) Send an existing draft email in Outlook This tool can send any un-sent email: - draft - reply-draft - reply-all draft - forward draft **Parameters** - **`message_id`** (string, required): The ID of the draft email to send See Example > * * * ## OutlookMail.CreateAndSendEmail [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/outlook_mail\#outlookmailcreateandsendemail) Create and immediately send a new email in Outlook to the specified recipients **Parameters** - **`subject`** (string, required): The subject of the email to create - **`body`** (string, required): The body of the email to create - **`to_recipients`** (list\[str\], required): The email addresses that will be the recipients of the email - **`cc_recipients`** (list\[str\], optional): The email addresses that will be the CC recipients of the email. - **`bcc_recipients`** (list\[str\], optional): The email addresses that will be the BCC recipients of the email. See Example > * * * ## OutlookMail.ReplyToEmail [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/outlook_mail\#outlookmailreplytoemail) Reply to an existing email in Outlook. Use this tool to reply to the sender or all recipients of the email. Specify the reply\_type to determine the scope of the reply. **Parameters** - **`message_id`** (string, required): The ID of the email to reply to - **`body`** (string, required): The body of the reply to the email - **`reply_type`** (enum ( [ReplyType](https://docs.arcade.dev/mcp-servers/productivity/outlook_mail#replytype)), required): Specify “reply” to reply only to the sender or “reply\_all” to reply to all recipients. See Example > * * * ## OutlookMail.ListEmails [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/outlook_mail\#outlookmaillistemails) List emails in the user’s mailbox across all folders. Since this tool lists email across all folders, it may return sent items, drafts, and other items that are not in the inbox. **Parameters** - **`limit`** (int, optional): The number of messages to return. Max is 100. Defaults to 5. - **`pagination_token`** (str, optional): The pagination token to continue a previous request See Example > * * * ## OutlookMail.ListEmailsInFolder [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/outlook_mail\#outlookmaillistemailsinfolder) List the user’s emails in the specified folder. Exactly one of `well_known_folder_name` or `folder_id` MUST be provided. **Parameters** - **`well_known_folder_name`** (enum ( [WellKnownFolderNames](https://docs.arcade.dev/mcp-servers/productivity/outlook_mail#wellknownfoldernames)), optional): The name of the folder to list emails from. Defaults to None. - **`folder_id`** (str, optional): The ID of the folder to list emails from if the folder is not a well-known folder. Defaults to None. - **`limit`** (int, optional): The number of messages to return. Max is 100. Defaults to 5. - **`pagination_token`** (str, optional): The pagination token to continue a previous request See Example > * * * ## OutlookMail.ListEmailsByProperty [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/outlook_mail\#outlookmaillistemailsbyproperty) List emails in the user’s mailbox across all folders filtering by a property. **Parameters** - **`property`** (enum ( [EmailFilterProperty](https://docs.arcade.dev/mcp-servers/productivity/outlook_mail#emailfilterproperty)), required): The property to filter the emails by. - **`operator`** (enum ( [FilterOperator](https://docs.arcade.dev/mcp-servers/productivity/outlook_mail#filteroperator)), required): The operator to use for the filter - **`value`** (string, required): The value to filter the emails by. - **`limit`** (int, optional): The number of messages to return. Max is 100. Defaults to 5. - **`pagination_token`** (str, optional): The pagination token to continue a previous request See Example > * * * ## Auth [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/outlook_mail\#auth) The Arcade Outlook Mail toolkit uses the [Microsoft auth provider](https://docs.arcade.dev/home/auth-providers/microsoft) to connect to users’ Microsoft accounts. With the Arcade Cloud Platform, there’s nothing to configure. Your users will see `Arcade` as the name of the application that’s requesting permission. With a self-hosted installation of Arcade, you need to [configure the Microsoft auth provider](https://docs.arcade.dev/home/auth-providers/microsoft#configuring-microsoft-auth) with your own Microsoft app credentials. * * * ## Reference [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/outlook_mail\#reference) ### WellKnownFolderNames [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/outlook_mail\#wellknownfoldernames) Well-known folder names that are created for users by default. Instead of using the ID of these folders, you can use the well-known folder names. - **`DELETED_ITEMS`** _(string: “deleteditems”)_ - **`DRAFTS`** _(string: “drafts”)_ - **`INBOX`** _(string: “inbox”)_ - **`JUNK_EMAIL`** _(string: “junkemail”)_ - **`SENT_ITEMS`** _(string: “sentitems”)_ - **`STARRED`** _(string: “starred”)_ - **`TODO`** _(string: “tasks”)_ ### ReplyType [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/outlook_mail\#replytype) The type of reply to send to an email. - **`REPLY`** _(string: “reply”)_ - **`REPLY_ALL`** _(string: “reply\_all”)_ ### EmailFilterProperty [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/outlook_mail\#emailfilterproperty) The property to filter the emails by. - **`SUBJECT`** _(string: “subject”)_ - **`CONVERSATION_ID`** _(string: “conversationId”)_ - **`RECEIVED_DATE_TIME`** _(string: “receivedDateTime”)_ - **`SENDER`** _(string: “sender/emailAddress/address”)_ ### FilterOperator [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/outlook_mail\#filteroperator) The operator to use for the filter. - **`EQUAL`** _(string: “eq”)_ - **`NOT_EQUAL`** _(string: “ne”)_ - **`GREATER_THAN`** _(string: “gt”)_ - **`GREATER_THAN_OR_EQUAL_TO`** _(string: “ge”)_ - **`LESS_THAN`** _(string: “lt”)_ - **`LESS_THAN_OR_EQUAL_TO`** _(string: “le”)_ - **`STARTS_WITH`** _(string: “startsWith”)_ - **`ENDS_WITH`** _(string: “endsWith”)_ - **`CONTAINS`** _(string: “contains”)_ ## Get Building [Use tools hosted on Arcade Cloud\\ \\ Arcade tools are hosted by our cloud platform and ready to be used in your agents. Learn how.](https://docs.arcade.dev/home/quickstart) [Self Host Arcade tools\\ \\ Arcade tools can be self-hosted on your own infrastructure. Learn more about self-hosting.\\ \\ ```\\ pip install arcade_outlook_mail\\ ```](https://docs.arcade.dev/home/hosting-overview) [Outlook Calendar](https://docs.arcade.dev/mcp-servers/productivity/outlook_calendar "Outlook Calendar") [Reference](https://docs.arcade.dev/mcp-servers/productivity/outlook_mail/reference "Reference") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Outlook Mail Reference [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Productivity & Docs](https://docs.arcade.dev/mcp-servers/productivity/asana "Productivity & Docs") [Outlook Mail](https://docs.arcade.dev/mcp-servers/productivity/outlook_mail "Outlook Mail") Reference # OutlookMail Reference Below is a reference of enumerations used by some tools in the OutlookMail toolkit: ## ReplyType [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/outlook_mail/reference\#replytype) - **REPLY**: `reply` - **REPLY\_ALL**: `reply_all` ## WellKnownFolderNames [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/outlook_mail/reference\#wellknownfoldernames) - **DELETED\_ITEMS**: `deleteditems` - **DRAFTS**: `drafts` - **INBOX**: `inbox` - **JUNK\_EMAIL**: `junkemail` - **SENT\_ITEMS**: `sentitems` - **STARRED**: `starred` - **TODO**: `tasks` ## EmailFilterProperty [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/outlook_mail/reference\#emailfilterproperty) - **SUBJECT**: `subject` - **CONVERSATION\_ID**: `conversationId` - **RECEIVED\_DATE\_TIME**: `receivedDateTime` - **SENDER**: `sender/emailAddress/address` ## FilterOperator [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/outlook_mail/reference\#filteroperator) - **EQUAL**: `eq` - **NOT\_EQUAL**: `ne` - **GREATER\_THAN**: `gt` - **GREATER\_THAN\_OR\_EQUAL\_TO**: `ge` - **LESS\_THAN**: `lt` - **LESS\_THAN\_OR\_EQUAL\_TO**: `le` - **STARTS\_WITH**: `startsWith` - **ENDS\_WITH**: `endsWith` - **CONTAINS**: `contains` [Outlook Mail](https://docs.arcade.dev/mcp-servers/productivity/outlook_mail "Outlook Mail") [Clickup](https://docs.arcade.dev/mcp-servers/productivity/clickup "Clickup") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Arcade Robots.txt ``` # * User-agent: * Allow: / # Host Host: https://docs.arcade.dev # Sitemaps Sitemap: https://docs.arcade.dev/sitemap.xml ``` ## Understanding ToolContext [Home](https://docs.arcade.dev/home "Home") [Build tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server "Build tools") Tool Context # Understanding ToolContext ## What is ToolContext? [Permalink for this section](https://docs.arcade.dev/home/build-tools/tool-context\#what-is-toolcontext) `ToolContext` is a crucial component in Arcade that manages authorization and user information for tools requiring authentication. Let’s explore how it works and how you can use it in your projects. `ToolContext` is a class that holds two main pieces of information: 1. Authorization context: This includes a token for making authenticated requests to external APIs as well as structured user information for providers that support retrieving user information. 2. User ID: This identifies the user invoking the tool. Some authorization providers may also include additional structured user information in the `ToolContext`. ## How ToolContext Works [Permalink for this section](https://docs.arcade.dev/home/build-tools/tool-context\#how-toolcontext-works) When you invoke a tool that requires authorization, Arcade’s Tool SDK automatically: 1. Creates a `ToolContext` object 2. Passes this object to your tool You can then use the `ToolContext` object to make authenticated requests to external APIs. ## Next Steps [Permalink for this section](https://docs.arcade.dev/home/build-tools/tool-context\#next-steps) Now that you understand the basics of `ToolContext`, you’re ready to apply this knowledge in creating your own authorized tools. To learn how to build a custom tool that requires user authorization, check out our guide on [adding user authorization to your tools](https://docs.arcade.dev/home/build-tools/create-a-tool-with-auth) or [adding secrets to your tools](https://docs.arcade.dev/home/build-tools/create-a-tool-with-secrets). [Create a toolkit](https://docs.arcade.dev/home/build-tools/create-a-mcp-server "Create a toolkit") [Create a tool with auth](https://docs.arcade.dev/home/build-tools/create-a-tool-with-auth "Create a tool with auth") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Linear Toolkit [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Productivity & Docs](https://docs.arcade.dev/mcp-servers/productivity/asana "Productivity & Docs") Linear # Linear **Description:** Enable agents to interact with Linear **Author:** Arcade **Auth:** User authorization [![PyPI Version](https://img.shields.io/pypi/v/arcade_linear)](https://pypi.org/project/arcade_linear/)[![License](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/arcadeai/arcade-ai/blob/main/LICENSE)[![Python Versions](https://img.shields.io/pypi/pyversions/arcade_linear)](https://pypi.org/project/arcade_linear/)[![Wheel Status](https://img.shields.io/pypi/wheel/arcade_linear)](https://pypi.org/project/arcade_linear/)[![Downloads](https://img.shields.io/pypi/dm/arcade_linear)](https://pypi.org/project/arcade_linear/) The Linear toolkit offers a streamlined set of tools for interacting with Linear’s issue tracking and team management features. With this toolkit, users can: - Retrieve detailed information about a specific issue, including their status, comments, and related dependencies. - Access comprehensive team information, including team members, roles, and settings. This toolkit is ideal for users looking to read and analyze issue and team data within Linear without making any modifications. ## Available Tools [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/linear\#available-tools) | Tool Name | Description | | --- | --- | | Linear.GetIssue | Get detailed information about a specific Linear issue | | Linear.GetTeams | Get Linear teams and team information including team members | If you need to perform an action that’s not listed here, you can [get in touch\\ with us](mailto:contact@arcade.dev) to request a new tool, or [create your\\ own tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server). ## Linear.GetIssue [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/linear\#lineargetissue) See Example > Get detailed information about a specific Linear issue **Parameters** - **issue\_id** ( `string`, required) The Linear issue ID or identifier (e.g. ‘FE-123’, ‘API-456’) to retrieve. - **include\_comments** ( `boolean`, optional) Whether to include comments in the response. Defaults to True. - **include\_attachments** ( `boolean`, optional) Whether to include attachments in the response. Defaults to True. - **include\_relations** ( `boolean`, optional) Whether to include issue relations (blocks, dependencies) in the response. Defaults to True. - **include\_children** ( `boolean`, optional) Whether to include sub-issues in the response. Defaults to True. ## Linear.GetTeams [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/linear\#lineargetteams) See Example > Get Linear teams and team information including team members **Parameters** - **team\_name** ( `string`, optional) Filter by team name. Provide specific team name (e.g. ‘Frontend’, ‘Product Web’) or partial name. Use this to find specific teams or check team membership. Defaults to None (all teams). - **include\_archived** ( `boolean`, optional) Whether to include archived teams in results. Defaults to False. - **created\_after** ( `string`, optional) Filter teams created after this date. Can be: - Relative date string (e.g. ‘last month’, ‘this week’, ‘yesterday’) - ISO date string (e.g. ‘YYYY-MM-DD’) Defaults to None (all time). - **limit** ( `integer`, optional) Maximum number of teams to return. Min 1, max 100. Defaults to 50. - **end\_cursor** ( `string`, optional) Cursor for pagination - get teams after this cursor. Use the ‘end\_cursor’ from previous response. Defaults to None (start from beginning). ## Auth [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/linear\#auth) The Arcade Linear toolkit uses the [Linear auth provider](https://docs.arcade.dev/home/auth-providers/linear) to connect to users’ Linear accounts. Please refer to the [Linear auth provider](https://docs.arcade.dev/home/auth-providers/linear) documentation to learn how to configure auth. ## Get Building [Use tools hosted on Arcade Cloud\\ \\ Arcade tools are hosted by our cloud platform and ready to be used in your agents. Learn how.](https://docs.arcade.dev/home/quickstart) [Self Host Arcade tools\\ \\ Arcade tools can be self-hosted on your own infrastructure. Learn more about self-hosting.\\ \\ ```\\ pip install arcade_linear\\ ```](https://docs.arcade.dev/home/hosting-overview) [Reference](https://docs.arcade.dev/mcp-servers/productivity/jira/reference "Reference") [Notion](https://docs.arcade.dev/mcp-servers/productivity/notion "Notion") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Arcade Configuration Templates [Home](https://docs.arcade.dev/home "Home") [Local Deployment](https://docs.arcade.dev/home/local-deployment/install "Local Deployment") [Configure](https://docs.arcade.dev/home/deployment/on-prem-mcp "Configure") Configuration Templates # Engine Config Templates ### engine.yaml [Permalink for this section](https://docs.arcade.dev/home/local-deployment/configure/templates\#engineyaml) ```nextra-code # yaml-language-server: $schema=https://raw.githubusercontent.com/ArcadeAI/schemas/main/engine/config/1.0/schema.json $schema: https://raw.githubusercontent.com/ArcadeAI/schemas/main/engine/config/1.0/schema.json api: development: ${env:API_DEVELOPMENT} host: ${env:ARCADE_API_HOST} port: ${env:ARCADE_API_PORT} auth: providers: - id: default-atlassian description: 'The default Atlassian provider' enabled: false type: oauth2 provider_id: atlassian client_id: ${env:ATLASSIAN_CLIENT_ID} client_secret: ${env:ATLASSIAN_CLIENT_SECRET} - id: default-discord description: 'The default Discord provider' enabled: false type: oauth2 provider_id: discord client_id: ${env:DISCORD_CLIENT_ID} client_secret: ${env:DISCORD_CLIENT_SECRET} - id: default-dropbox description: 'The default Dropbox provider' enabled: false type: oauth2 provider_id: dropbox client_id: ${env:DROPBOX_CLIENT_ID} client_secret: ${env:DROPBOX_CLIENT_SECRET} - id: default-github description: 'The default GitHub provider' enabled: false type: oauth2 provider_id: github client_id: ${env:GITHUB_CLIENT_ID} client_secret: ${env:GITHUB_CLIENT_SECRET} - id: default-google description: 'The default Google provider' enabled: false type: oauth2 provider_id: google client_id: ${env:GOOGLE_CLIENT_ID} client_secret: ${env:GOOGLE_CLIENT_SECRET} - id: default-linkedin description: 'The default LinkedIn provider' enabled: false type: oauth2 provider_id: linkedin client_id: ${env:LINKEDIN_CLIENT_ID} client_secret: ${env:LINKEDIN_CLIENT_SECRET} - id: default-microsoft description: 'The default Microsoft provider' enabled: false type: oauth2 provider_id: microsoft client_id: ${env:MICROSOFT_CLIENT_ID} client_secret: ${env:MICROSOFT_CLIENT_SECRET} - id: default-reddit description: 'The default Reddit provider' enabled: false type: oauth2 provider_id: reddit client_id: ${env:REDDIT_CLIENT_ID} client_secret: ${env:REDDIT_CLIENT_SECRET} - id: default-slack description: 'The default Slack provider' enabled: false type: oauth2 provider_id: slack client_id: ${env:SLACK_CLIENT_ID} client_secret: ${env:SLACK_CLIENT_SECRET} - id: default-spotify description: 'The default Spotify provider' enabled: false type: oauth2 provider_id: spotify client_id: ${env:SPOTIFY_CLIENT_ID} client_secret: ${env:SPOTIFY_CLIENT_SECRET} - id: default-twitch description: 'The default Twitch provider' enabled: false type: oauth2 provider_id: twitch client_id: ${env:TWITCH_CLIENT_ID} client_secret: ${env:TWITCH_CLIENT_SECRET} - id: default-x description: 'The default X provider' enabled: false type: oauth2 provider_id: x client_id: ${env:X_CLIENT_ID} client_secret: ${env:X_CLIENT_SECRET} - id: default-zoom description: 'The default Zoom provider' enabled: false type: oauth2 provider_id: zoom client_id: ${env:ZOOM_CLIENT_ID} client_secret: ${env:ZOOM_CLIENT_SECRET} llm: models: - id: my-openai-model-provider openai: api_key: ${env:OPENAI_API_KEY} #- id: my-anthropic-model-provider # anthropic: # api_key: ${env:ANTHROPIC_API_KEY} # - id: my-ollama-model-provider # openai: # base_url: http://localhost:11434 # chat_endpoint: /v1/chat/completions # model: llama3.2 # api_key: ollama #- id: my-groq-model-provider # openai: # base_url: 'https://api.groq.com/openai/v1' # api_key: ${env:GROQ_API_KEY} security: root_keys: - id: key1 default: true value: ${env:ROOT_KEY_1} storage: postgres: user: ${env:POSTGRES_USER} password: ${env:POSTGRES_PASSWORD} host: ${env:POSTGRES_HOST} port: ${env:POSTGRES_PORT} db: ${env:POSTGRES_DB} sslmode: require telemetry: environment: ${env:TELEMETRY_ENVIRONMENT} logging: # debug, info, warn, error level: ${env:TELEMETRY_LOGGING_LEVEL} encoding: ${env:TELEMETRY_LOGGING_ENCODING} tools: directors: - id: default enabled: true max_tools: 64 workers: - id: worker enabled: true http: uri: ${env:ARCADE_WORKER_URI} timeout: 30 retry: 3 secret: ${env:ARCADE_WORKER_SECRET} ``` ### engine.env [Permalink for this section](https://docs.arcade.dev/home/local-deployment/configure/templates\#engineenv) ```nextra-code ### Engine configuration ### API_DEVELOPMENT=true ARCADE_API_HOST=localhost ARCADE_API_PORT=9099 ANALYTICS_ENABLED=true # Encryption keys (change this when deploying to production) ROOT_KEY_1=default-key-value ### Model Provider API keys ### # OPENAI_API_KEY= # ANTHROPIC_API_KEY= # GROQ_API_KEY= ### Security configuration ### ROOT_KEY_1= ### Storage configuration ### # POSTGRES_USER= # POSTGRES_PASSWORD= # POSTGRES_HOST= # POSTGRES_PORT= # POSTGRES_DB= ### Telemetry (OTEL) configuration ### TELEMETRY_ENVIRONMENT=local TELEMETRY_LOGGING_LEVEL=debug TELEMETRY_LOGGING_ENCODING=console ### Worker Configuration ### ARCADE_WORKER_URI=http://localhost:8002 ARCADE_WORKER_SECRET=dev # OAuth Providers ATLASSIAN_CLIENT_ID="" ATLASSIAN_CLIENT_SECRET= DISCORD_CLIENT_ID="" DISCORD_CLIENT_SECRET= DROPBOX_CLIENT_ID="" DROPBOX_CLIENT_SECRET= GITHUB_CLIENT_ID="" GITHUB_CLIENT_SECRET= GOOGLE_CLIENT_ID="" GOOGLE_CLIENT_SECRET= LINKEDIN_CLIENT_ID="" LINKEDIN_CLIENT_SECRET= MICROSOFT_CLIENT_ID="" MICROSOFT_CLIENT_SECRET= REDDIT_CLIENT_ID="" REDDIT_CLIENT_SECRET= SLACK_CLIENT_ID="" SLACK_CLIENT_SECRET= SPOTIFY_CLIENT_ID="" SPOTIFY_CLIENT_SECRET= TWITCH_CLIENT_ID="" SPOTIFY_CLIENT_SECRET= X_CLIENT_ID="" X_CLIENT_SECRET= ZOOM_CLIENT_ID="" ZOOM_CLIENT_SECRET= ``` [Configuring Arcade Deploy](https://docs.arcade.dev/home/local-deployment/configure/arcade-deploy "Configuring Arcade Deploy") [Overview](https://docs.arcade.dev/home/auth-providers "Overview") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Google Drive Toolkit [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Productivity & Docs](https://docs.arcade.dev/mcp-servers/productivity/asana "Productivity & Docs") Google Drive # GoogleDrive **Description:** Enable agents to interact with GoogleDrive **Author:** Arcade **Auth:** User authorization [![PyPI Version](https://img.shields.io/pypi/v/arcade_google_drive)](https://pypi.org/project/arcade_google_drive/)[![License](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/arcadeai/arcade-ai/blob/main/LICENSE)[![Python Versions](https://img.shields.io/pypi/pyversions/arcade_google_drive)](https://pypi.org/project/arcade_google_drive/)[![Wheel Status](https://img.shields.io/pypi/wheel/arcade_google_drive)](https://pypi.org/project/arcade_google_drive/)[![Downloads](https://img.shields.io/pypi/dm/arcade_google_drive)](https://pypi.org/project/arcade_google_drive/) The GoogleDrive MCP Server provides a set of tools for interacting with Google Drive, enabling users to efficiently manage and access their files. With this toolkit, users can: - Retrieve the file and folder structure of their Google Drive. - Generate a Google File Picker URL for user-driven file selection and authorization, allowing secure access to files. - Search for specific files within Google Drive. ## Available Tools [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_drive\#available-tools) | Tool Name | Description | | --- | --- | | GoogleDrive.WhoAmI | Get comprehensive user profile and Google Drive environment information. | | GoogleDrive.GetFileTreeStructure | Get the file/folder tree structure of the user's Google Drive. | | GoogleDrive.GenerateGoogleFilePickerUrl | Generate a Google File Picker URL for user-driven file selection and authorization. | | GoogleDrive.SearchFiles | Search for files in Google Drive | If you need to perform an action that’s not listed here, you can [get in touch\\ with us](mailto:contact@arcade.dev) to request a new tool, or [create your\\ own tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server). ## GoogleDrive.WhoAmI [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_drive\#googledrivewhoami) See Example > Get comprehensive user profile and Google Drive environment information. **Parameters** This tool does not take any parameters. * * * ## GoogleDrive.GetFileTreeStructure [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_drive\#googledrivegetfiletreestructure) See Example > Get the file/folder tree structure of the user’s Google Drive. **Parameters** - **include\_shared\_drives** ( `boolean`, optional) Whether to include shared drives in the file tree structure. Defaults to False. - **restrict\_to\_shared\_drive\_id** ( `string`, optional) If provided, only include files from this shared drive in the file tree structure. Defaults to None, which will include files and folders from all drives. - **include\_organization\_domain\_documents** ( `boolean`, optional) Whether to include documents from the organization’s domain. This is applicable to admin users who have permissions to view organization-wide documents in a Google Workspace account. Defaults to False. - **order\_by** ( `Enum` [OrderBy](https://docs.arcade.dev/mcp-servers/productivity/google_drive/reference#OrderBy), optional) Sort order. Defaults to listing the most recently modified documents first - **limit** ( `integer`, optional) The number of files and folders to list. Defaults to None, which will list all files and folders. ## GoogleDrive.GenerateGoogleFilePickerUrl [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_drive\#googledrivegenerategooglefilepickerurl) See Example > Generate a Google File Picker URL for user-driven file selection and authorization. **Parameters** This tool does not take any parameters. ## GoogleDrive.SearchFiles [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_drive\#googledrivesearchfiles) See Example > Search for files in Google Drive **Parameters** - **query** ( `string`, required) The search query to use to find files in Google DriveThis can include document titles or body content. - **include\_shared\_drives** ( `boolean`, optional) Whether to include shared drives in the search. Defaults to False. - **restrict\_to\_shared\_drive\_id** ( `string`, optional) If provided, only search files from this shared drive. Defaults to None, which will search files from all drives. - **include\_organization\_domain\_documents** ( `boolean`, optional) Whether to include documents from the organization’s domain. This is applicable to admin users who have permissions to view organization-wide documents in a Google Workspace account. Defaults to False. - **order\_by** ( `Enum` [OrderBy](https://docs.arcade.dev/mcp-servers/productivity/google_drive/reference#OrderBy), optional) Sort order for search results. Defaults to listing the most recently modified documents first - **limit** ( `integer`, optional) The maximum number of search results to return. Defaults to 50. - **file\_types** ( `Enum` [GoogleDriveFileType](https://docs.arcade.dev/mcp-servers/productivity/google_drive/reference#GoogleDriveFileType), optional) Filter by specific file types. Defaults to None, which includes all file types. ## Auth [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_drive\#auth) The Arcade GoogleDrive toolkit uses the [Google auth provider](https://docs.arcade.dev/home/auth-providers/google) to connect to users’ GoogleDrive accounts. Please refer to the [Google auth provider](https://docs.arcade.dev/home/auth-providers/google) documentation to learn how to configure auth. ## Get Building [Use tools hosted on Arcade Cloud\\ \\ Arcade tools are hosted by our cloud platform and ready to be used in your agents. Learn how.](https://docs.arcade.dev/home/quickstart) [Self Host Arcade tools\\ \\ Arcade tools can be self-hosted on your own infrastructure. Learn more about self-hosting.\\ \\ ```\\ pip install arcade_google_drive\\ ```](https://docs.arcade.dev/home/hosting-overview) [Reference](https://docs.arcade.dev/mcp-servers/productivity/google_docs/reference "Reference") [Reference](https://docs.arcade.dev/mcp-servers/productivity/google_drive/reference "Reference") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Jira Environment Variables [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Productivity & Docs](https://docs.arcade.dev/mcp-servers/productivity/asana "Productivity & Docs") [Jira](https://docs.arcade.dev/mcp-servers/productivity/jira "Jira") Environment Variables # Jira Environment Variables ### `JIRA_MAX_CONCURRENT_REQUESTS` [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/jira/environment_variables\#jira_max_concurrent_requests) Arcade uses asynchronous calls to request Jira API endpoints. In some tools, multiple concurrent HTTP requests may be made to speed up execution. This environment variable controls the maximum number of concurrent requests to Jira API in any tool execution. The value must be a numeric string with an integer greater than or equal to 1. **Default:** `3` ### `JIRA_API_REQUEST_TIMEOUT` [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/jira/environment_variables\#jira_api_request_timeout) Controls the maximum number of seconds to wait for a response from the Jira API. This is also applied, in some cases, as a global max timeout for multiple requests that are made in a single tool execution. For instance, when a tool needs to paginate results from a given endpoint, this timeout may apply to the entire pagination process in total, not only to the individual requests. The value must be a numeric string with an integer greater than or equal to 1. **Default:** `30` ### `JIRA_CACHE_MAX_ITEMS` [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/jira/environment_variables\#jira_cache_max_items) The caching strategy does not involve caching Jira API responses that go into tool output, but only internal values. The Arcade Jira toolkit will cache some values that are repeatedly used in tool execution to enable better performance. This environment variable controls the maximum number of items to hold in each cache. The value must be a numeric string with an integer greater than or equal to 1. **Default:** `5000` [Jira](https://docs.arcade.dev/mcp-servers/productivity/jira "Jira") [Reference](https://docs.arcade.dev/mcp-servers/productivity/jira/reference "Reference") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Arcade Clients Overview [Home](https://docs.arcade.dev/home "Home") Arcade Clients # Arcade Clients Arcade provides clients for several languages. These clients make it easy to use Arcade’s tools within your agents and applications. ## Python Client [Permalink for this section](https://docs.arcade.dev/home/arcade-clients\#python-client) Install with: `pip install arcadepy` Learn more about the [Python Client](https://github.com/ArcadeAI/arcade-py). ## JavaScript / TypeScript Client [Permalink for this section](https://docs.arcade.dev/home/arcade-clients\#javascript--typescript-client) Install with: `npm install @arcadeai/arcadejs` Learn more about the [JavaScript / TypeScript Client](https://github.com/ArcadeAI/arcade-js). ## Go Client [Permalink for this section](https://docs.arcade.dev/home/arcade-clients\#go-client) Install with: `go get -u 'github.com/ArcadeAI/arcade-go'` Learn more about the [Go Client](https://github.com/ArcadeAI/arcade-go). [Arcade CLI](https://docs.arcade.dev/home/arcade-cli "Arcade CLI") [Overview](https://docs.arcade.dev/home/hosting-overview "Overview") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## GitHub Toolkit Reference [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Developer Tools](https://docs.arcade.dev/mcp-servers/development/e2b "Developer Tools") [GitHub](https://docs.arcade.dev/mcp-servers/development/github/github "GitHub") Reference # Reference for GitHub Toolkit ## PRSortProperty [Permalink for this section](https://docs.arcade.dev/mcp-servers/development/github/reference\#prsortproperty) Specifies the property to sort pull requests by. - **`CREATED`**: Sort by creation date. - **`UPDATED`**: Sort by last update date. - **`POPULARITY`**: Sort by popularity. - **`LONG_RUNNING`**: Sort by how long the pull request has been open. ## PRState [Permalink for this section](https://docs.arcade.dev/mcp-servers/development/github/reference\#prstate) Specifies the state of pull requests to return. - **`OPEN`**: Open pull requests. - **`CLOSED`**: Closed pull requests. - **`ALL`**: All pull requests. ## ReviewCommentSortProperty [Permalink for this section](https://docs.arcade.dev/mcp-servers/development/github/reference\#reviewcommentsortproperty) Specifies the property to sort review comments by. - **`CREATED`**: Sort by creation date. - **`UPDATED`**: Sort by last update date. ## ReviewCommentSubjectType [Permalink for this section](https://docs.arcade.dev/mcp-servers/development/github/reference\#reviewcommentsubjecttype) Specifies the type of subject for review comments. - **`FILE`**: Comments on the entire file. - **`LINE`**: Comments on a specific line. ## DiffSide [Permalink for this section](https://docs.arcade.dev/mcp-servers/development/github/reference\#diffside) Specifies the side of the diff that the pull request’s changes appear on. - **`LEFT`**: For deletions that appear in red. - **`RIGHT`**: For additions that appear in green or unchanged lines that appear in white and are shown for context. ## RepoType [Permalink for this section](https://docs.arcade.dev/mcp-servers/development/github/reference\#repotype) Specifies the type of repositories to return. - **`ALL`**: All repositories. - **`PUBLIC`**: Public repositories only. - **`PRIVATE`**: Private repositories only. - **`FORKS`**: Forked repositories only. - **`SOURCES`**: Source repositories only (not forks). - **`MEMBER`**: Repositories to which the user has explicit permission. ## RepoSortProperty [Permalink for this section](https://docs.arcade.dev/mcp-servers/development/github/reference\#reposortproperty) Specifies the property to sort repositories by. - **`CREATED`**: Sort by creation date. - **`UPDATED`**: Sort by last update date. - **`PUSHED`**: Sort by last push date. - **`FULL_NAME`**: Sort by full name. ## RepoTimePeriod [Permalink for this section](https://docs.arcade.dev/mcp-servers/development/github/reference\#repotimeperiod) Specifies the time period to filter by when listing repository activities. - **`DAY`**: Activities from the last day. - **`WEEK`**: Activities from the last week. - **`MONTH`**: Activities from the last month. - **`QUARTER`**: Activities from the last quarter. - **`YEAR`**: Activities from the last year. ## ActivityType [Permalink for this section](https://docs.arcade.dev/mcp-servers/development/github/reference\#activitytype) Specifies the activity type to filter by when listing repository activities. - **`PUSH`**: Regular push events. - **`FORCE_PUSH`**: Force push events. - **`BRANCH_CREATION`**: Branch creation events. - **`BRANCH_DELETION`**: Branch deletion events. - **`PR_MERGE`**: Pull request merge events. - **`MERGE_QUEUE_MERGE`**: Merge queue merge events. ## SortDirection [Permalink for this section](https://docs.arcade.dev/mcp-servers/development/github/reference\#sortdirection) Specifies the direction to sort results. - **`ASC`**: Sort in ascending order. - **`DESC`**: Sort in descending order. [GitHub](https://docs.arcade.dev/mcp-servers/development/github/github "GitHub") [Firecrawl](https://docs.arcade.dev/mcp-servers/development/firecrawl/firecrawl "Firecrawl") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Arcade V2 Migration [Home](https://docs.arcade.dev/home "Home") Migrate to V2 # Migration Guide If your project does not have its dependency on `arcade-ai` pinned to the v1 major version, you must pin it to the v1 major version immediately to prevent potential breakages. ## Release Timeline [Permalink for this section](https://docs.arcade.dev/home/migrate-to-v2\#release-timeline) Version 2.0.0 of the Arcade CLI was released on **Tuesday, June 17th**. Make sure to pin your project’s dependency on `arcade-ai` to the v1 major version before this date to avoid any disruptions. ## Package Changes [Permalink for this section](https://docs.arcade.dev/home/migrate-to-v2\#package-changes) With the release of version 2.0.0, the [arcade-ai PyPI package](https://pypi.org/project/arcade-ai/) has been divided into three distinct packages. Previously, `arcade-ai` was a monolithic package that included: - Tool Development Kit (TDK) - Core execution engine and catalog functionality - FastAPI/MCP server/worker components - CLI functionality - Evaluation framework Now, the `arcade-ai` package serves as Arcade.dev’s CLI, allowing you to create ‘starter’ toolkits, serve and deploy toolkits, chat, and more via the command line. Also, two new packages have been introduced: `arcade-serve` and `arcade-tdk`. This means faster build times, lighter dependencies, and better performance. ## Package Overview [Permalink for this section](https://docs.arcade.dev/home/migrate-to-v2\#package-overview) - **arcade-ai**: - To get [the CLI](https://docs.arcade.dev/home/arcade-cli), install via: `pip install arcade-ai` - To get [the evaluation framework](https://docs.arcade.dev/home/build-tools/evaluation-framework), install via: `pip install 'arcade-ai[evals]'` - To get everything including the TDK and Serve, install via: `pip install 'arcade-ai[all]'` - **arcade-tdk**: - If you’re [writing your own](https://docs.arcade.dev/home/build-tools/create-a-mcp-server) Arcade tools/toolkits. - Install via: `pip install arcade-tdk` - **arcade-serve**: - If you’re [writing your own](https://docs.arcade.dev/home/serve-tools/modal-worker) custom worker. - Install via: `pip install arcade-serve` ## Code Migration Steps [Permalink for this section](https://docs.arcade.dev/home/migrate-to-v2\#code-migration-steps) Migrating from v1 to v2 is straightforward with a few find-and-replace actions: 1. Replace all occurrences of `arcade.sdk.eval` with `arcade_evals`. 2. Replace all remaining occurrences of `arcade.sdk` with `arcade_tdk`. 3. Replace all occurrences of `arcade.worker` with `arcade_serve`. 4. Remove your project’s required dependency on `arcade-ai`. 5. Add `arcade_tdk>=2.0.0,<3.0.0` as a required dependency if you replaced `arcade.sdk` with `arcade_tdk` in step 2. 6. Add `arcade-ai[evals]>=2.0.0,<3.0.0` as an optional dev dependency if you use the evaluation framework or the CLI. 7. Add `arcade-serve>=2.0.0,<3.0.0` as an optional dev dependency if you use the `arcade serve` CLI command. [Registry Early Access](https://docs.arcade.dev/home/registry-early-access "Registry Early Access") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Salesforce Auth Provider [Home](https://docs.arcade.dev/home "Home") [Customizing Auth](https://docs.arcade.dev/home/auth-providers "Customizing Auth") Salesforce # Salesforce Auth Provider At this time, Arcade does not offer a default Salesforce Auth Provider and cannot support Salesforce auth in the Arcade Cloud Platform. To use Salesforce auth, the [Salesforce toolkit](https://docs.arcade.dev/mcp-servers/sales/salesforce), or to develop your [custom Salesforce tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server), you must [self-host the Arcade Engine](https://docs.arcade.dev/home/deployment/engine-configuration) and create a custom Auth Provider with your own Salesforce OAuth 2.0 credentials as described below. The Salesforce auth provider enables tools and agents to call Salesforce APIs on behalf of a user. Behind the scenes, the Arcade Engine and the Salesforce auth provider seamlessly manage Salesforce OAuth 2.0 authorization for your users. ## What’s documented here [Permalink for this section](https://docs.arcade.dev/home/auth-providers/salesforce\#whats-documented-here) This page describes how to use and configure Salesforce auth with Arcade. This auth provider is used by: - The [Arcade Salesforce toolkit](https://docs.arcade.dev/mcp-servers/sales/salesforce), which provides pre-built tools for interacting with Salesforce services - Your [app code](https://docs.arcade.dev/home/auth-providers/salesforce#calling-salesforce-apis-directly) that needs to call Salesforce APIs - Or, your [custom tools](https://docs.arcade.dev/home/auth-providers/salesforce#create-your-own-salesforce-tools) that need to call Salesforce APIs ## Create a Salesforce app [Permalink for this section](https://docs.arcade.dev/home/auth-providers/salesforce\#create-a-salesforce-app) When using your own app credentials, make sure you configure your project to use a [custom user verifier](https://docs.arcade.dev/home/auth/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. Salesforce has two types of apps: **Connected App** and **Lightning App**. For this guide, we’ll create a **Connected App**. Make sure to follow the instructions below while you [create your Connected App](https://help.salesforce.com/s/articleView?id=xcloud.connected_app_create.htm&type=5). When creating your app, make sure to: - Under “API (Enable OAuth Settings)”, check the **Enable OAuth Settings** box - Set the callback URL to the redirect URL generated by Arcade (see below) - In the **Available OAuth Scopes**, add the two following scopes: - “Manage User Data Via APIs (api)” - “Perform requests at any time (refresh\_token, offline\_access)” - Uncheck the **Require Proof Key for Code Exchange (PKCE)** option, unless you want to use PKCE (in which case, you’ll also need to enable PKCE in the Salesforce auth configuration as [described below](https://docs.arcade.dev/home/auth-providers/salesforce#configuring-salesforce-auth)) - Check “Enable Token Exchange Flow” - Check “Enable Refresh Token Rotation” - Leave all other settings as default and save your app Right after creating the app, Salesforce will redirect you to the app’s page. In the “API (Enable OAuth Settings)” section, click on the **Manage Consumer Details** button and take note of the **API Key** and **Client Secret** values. Then, go back to the App’s page and click on the **Manage** button at the top, then click on the **Edit Policies** button, at the top of the Manage page, and follow the instructions below: - In “IP Relaxation”, select **Relax IP Restrictions**. - In “Refresh Token Policy”, make sure the option **Refresh token is valid until revoked** is checked. With that, your Salesforce app is ready to be used with Arcade. ## Get your Salesforce Org Subdomain [Permalink for this section](https://docs.arcade.dev/home/auth-providers/salesforce\#get-your-salesforce-org-subdomain) Follow the steps below to find your Salesforce Org Subdomain: 1. In the Setup menu, click on **Quick Find** in the top left corner and type `"my domain"`. 2. In the search results, under **Company Settings**, click on **My Domain**. 3. Under **My Domain Details**, check the value of the **Current My Domain URL** field. Your **Salesforce Org Subdomain** is the value before the `.my.salesforce.com` part. For example, if your Salesforce domain is `https://acme-inc.my.salesforce.com`, your Salesforce Org Subdomain is `acme-inc`. If you have a developer account, your URL might look like `https://acme-inc.develop.my.salesforce.com`. In this case, your Salesforce Org Subdomain is `acme-inc.develop`. Take note of your Salesforce Org Subdomain. You will need this value in the next steps. ## Set the Salesforce Org Subdomain Environment Variable [Permalink for this section](https://docs.arcade.dev/home/auth-providers/salesforce\#set-the-salesforce-org-subdomain-environment-variable) Refer to the [previous step](https://docs.arcade.dev/home/auth-providers/salesforce#get-your-salesforce-org-subdomain) to find your Salesforce Org Subdomain. Set the `SALESFORCE_ORG_SUBDOMAIN` environment variable in the same runtime where your Arcade Worker is executed: ```nextra-code export SALESFORCE_ORG_SUBDOMAIN={your-salesforce-subdomain} ``` ## Create and Assign Custom Scopes to your Connected App [Permalink for this section](https://docs.arcade.dev/home/auth-providers/salesforce\#create-and-assign-custom-scopes-to-your-connected-app) The Salesforce API requires the App developer to create [OAuth custom scopes](https://help.salesforce.com/s/articleView?id=xcloud.remoteaccess_oauth_customscopes.htm&type=5) defining granular permissions for their application users to authorize. The custom scopes required by the [Arcade Salesforce toolkit](https://docs.arcade.dev/mcp-servers/sales/salesforce) are listed below, along with their descriptions: The custom scopes listed below are only required if you are using the [Arcade Salesforce toolkit](https://docs.arcade.dev/mcp-servers/sales/salesforce). If you’re creating your own [custom Salesforce tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server) or using Arcade to authorize users and call Salesforce APIs directly, you are free to define custom scope(s) that fit best your application use cases. Observe that you must have at least one custom scope assigned to your Salesforce app in order to use the Salesforce API. - `read_account`: Read access to account data. - `read_contact`: Read access to contact data. - `read_lead`: Read access to lead data. - `read_note`: Read access to note data. - `read_opportunity`: Read access to opportunity data. - `read_task`: Read access to task data. - `write_contact`: Write access to create contact. Follow the [Create an OAuth Custom Scope](https://help.salesforce.com/s/articleView?id=xcloud.remoteaccess_oauth_customscopes_create.htm&type=5) and [Assign an OAuth Custom Scope to a Connected App](https://help.salesforce.com/s/articleView?id=xcloud.remoteaccess_oauth_customscopes_assign.htm&type=5) Salesforce documentation to understand how to define and assign these scopes to your Salesforce app. The scope names aren’t really attached to any endpoint or action. It’s the developer’s job to honor the permissions communicated to the user when authorizing the app. You could, in theory, assign one single scope (e.g. `fullaccess`) and use it to query any Salesforce API endpoint. ## Configuring Salesforce Auth [Permalink for this section](https://docs.arcade.dev/home/auth-providers/salesforce\#configuring-salesforce-auth) Refer to [Installing Arcade Locally](https://docs.arcade.dev/home/deployment/engine-configuration) for more information on how to install and run the Arcade Engine. You can either configure Salesforce auth from the Arcade Engine Dashboard graphical interface or in the `engine.yaml` file. We describe both options below. Dashboard GUIEngine Configuration YAML ### Configure Salesforce Auth Using the Arcade Dashboard GUI #### Access the Arcade Dashboard [Permalink for this section](https://docs.arcade.dev/home/auth-providers/salesforce\#access-the-arcade-dashboard) By default, the Arcade Dashboard will be available at [http://localhost:9099/dashboard](http://localhost:9099/dashboard) (if you’re accessing it from the same machine where it’s running). Change the host and port number to match your environment. #### Navigate to the OAuth Providers page [Permalink for this section](https://docs.arcade.dev/home/auth-providers/salesforce\#navigate-to-the-oauth-providers-page) - Under the **OAuth** section of the Arcade Dashboard left-side menu, click **Providers**. - Click **Add OAuth Provider** in the top right corner. - Select the **Custom Provider** tab at the top. #### Enter the provider details [Permalink for this section](https://docs.arcade.dev/home/auth-providers/salesforce\#enter-the-provider-details) - Enter `salesforce` as the **ID** for your provider (the ID must be `salesforce` in order to use the [Arcade Salesforce toolkit](https://docs.arcade.dev/mcp-servers/sales/salesforce)). - Optionally enter a **Description**. - Enter your **Client ID** and **Client Secret** from your Salesforce app. - Note the **Redirect URL** generated by Arcade. This must be set as your Salesforce app’s callback URL. #### Configure the auth endpoints [Permalink for this section](https://docs.arcade.dev/home/auth-providers/salesforce\#configure-the-auth-endpoints) Replace `salesforce-org-subdomain` with your [Salesforce Org Subdomain](https://docs.arcade.dev/home/auth-providers/salesforce#get-your-salesforce-org-subdomain). - Enter the auth endpoints: - **Authorization Endpoint**: `https://salesforce-org-subdomain.my.salesforce.com/services/oauth2/authorize` - **Token Endpoint**: `https://salesforce-org-subdomain.my.salesforce.com/services/oauth2/token` - Under **Refresh Token Settings**: - Enter the **Refresh Token Endpoint**: `https://salesforce-org-subdomain.my.salesforce.com/services/oauth2/token` - In **Response Content Type**, select `application/json`. - Under **Token Introspection Settings**: - Check the **Enable Token Introspection** option. - Enter the **Token Introspection Endpoint**: `https://salesforce-org-subdomain.my.salesforce.com/services/oauth2/introspect` - In **HTTP Method**, select `POST` - In **Authentication Method**, select `Client Secret Basic` - In **Request Content Type**, select `application/x-www-form-urlencoded`. - Under **Request Parameters** section, add the following key-value pair: - **Key**: `token` - **Value**: `{{access_token}}` - In **Response Content Type**, select `application/json`. - In **Expiration Format**, select `Absolute Unix Timestamp`. - Under the **Response Map** section: - Set the **expires\_in** field to `$.exp` - Set the **scope** field to `$.scope` - Leave the other fields as default - Under **Triggers** section, enable the **On Token Grant** and **On Token Refresh** options. #### Optional Auth Settings [Permalink for this section](https://docs.arcade.dev/home/auth-providers/salesforce\#optional-auth-settings) - Under **PKCE Settings**, check the **Enable PKCE** option if you have enabled PKCE when creating your Salesforce app. - Leave the **Authorization Settings** and **Token Settings** sections as default. #### Create the provider [Permalink for this section](https://docs.arcade.dev/home/auth-providers/salesforce\#create-the-provider) Click the **Create** button and the provider will be ready to be used in the Arcade Engine. ## Using the Arcade Salesforce Toolkit [Permalink for this section](https://docs.arcade.dev/home/auth-providers/salesforce\#using-the-arcade-salesforce-toolkit) The [Arcade Salesforce toolkit](https://docs.arcade.dev/mcp-servers/sales/salesforce) provides tools to interact with various Salesforce objects, such as accounts, contacts, leads, opportunities, notes, tasks, email messages, call logs, etc. Refer to the [toolkit documentation and examples](https://docs.arcade.dev/mcp-servers/sales/salesforce) to learn how to use the toolkit to build agents and AI apps that interact with Salesforce services. Check our introductory documentation to understand what are tools and how [tool calling works](https://docs.arcade.dev/home/use-tools/tools-overview). ## Calling Salesforce APIs directly [Permalink for this section](https://docs.arcade.dev/home/auth-providers/salesforce\#calling-salesforce-apis-directly) Use the Salesforce auth provider to get a user authorization token and call Salesforce API endpoints directly, without the use of any tools. See [How Arcade helps with Agent Authorization](https://docs.arcade.dev/home/auth/how-arcade-helps) to understand how this works. ### Prerequisites [Permalink for this section](https://docs.arcade.dev/home/auth-providers/salesforce\#prerequisites) 1. Create an [Arcade account](https://api.arcade.dev/signup) 2. Get an [Arcade API key](https://docs.arcade.dev/home/api-keys). 3. Set the `ARCADE_API_KEY` environment variable with `export ARCADE_API_KEY=`. 4. Make sure to have Python 3.10+ or Node.js 18+ installed. PythonJavaScript ### Install the Arcade Python Client [Permalink for this section](https://docs.arcade.dev/home/auth-providers/salesforce\#install-the-arcade-python-client) ```nextra-code pip install arcadepy ``` ### Import necessary modules and instantiate the client [Permalink for this section](https://docs.arcade.dev/home/auth-providers/salesforce\#import-necessary-modules-and-instantiate-the-client) Create a new script called `salesforce_example.py`. Import the necessary modules and instantiate the Arcade client: The Arcade Engine service is available at `http://localhost:9099` by default. Replace the host and port, if necessary, to match your environment. ```nextra-code import requests from arcadepy import Arcade client = Arcade(base_url="http://localhost:9099") # Automatically finds the `ARCADE_API_KEY` env variable ``` ### Set the values required for the Salesforce API call [Permalink for this section](https://docs.arcade.dev/home/auth-providers/salesforce\#set-the-values-required-for-the-salesforce-api-call) ```nextra-code salesforce_provider_id = "salesforce" salesforce_org_subdomain = "salesforce-org-subdomain" user_id = "{arcade_user_id}" scopes = ["read_account"] ``` Here’s a break down of each value: - **`salesforce_provider_id`**: the ID you entered when setting up the [Salesforce auth provider](https://docs.arcade.dev/home/auth-providers/salesforce#configuring-salesforce-auth); - **`salesforce_org_subdomain`**: your [Salesforce Org Subdomain](https://docs.arcade.dev/home/auth-providers/salesforce#get-your-salesforce-org-subdomain); - **`user_id`**: an internal identifier for your application user (it could be an email address, a username, UUID, etc); for demonstration purposes, in this example, enter your own email address; - **`scopes`**: the list of scopes you want to request from the user; if you assigned the [custom scopes required by the Arcade Salesforce toolkit](https://docs.arcade.dev/home/auth-providers/salesforce#create-and-assign-custom-scopes-to-your-connected-app) use `["read_account"]` in this example. ### Start the authorization process and wait for completion [Permalink for this section](https://docs.arcade.dev/home/auth-providers/salesforce\#start-the-authorization-process-and-wait-for-completion) The Arcade client will prompt the user to access a URL and authorize the app to access their Salesforce data. At the end of the auth process, you will have a token that can be used to call Salesforce APIs on behalf of that user. ```nextra-code auth_response = client.auth.start( user_id=user_id, provider=salesforce_provider_id, scopes=scopes, ) 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 if not token: raise ValueError("No token found in auth response") ``` If the same scopes have already been authorized by the user before and the token is still valid, the auth process will be skipped and the token will be returned immediately, without prompting with the authorization URL. The Arcade Engine associates a previously authorized token with the `user_id` you provided. ### Call the Salesforce API [Permalink for this section](https://docs.arcade.dev/home/auth-providers/salesforce\#call-the-salesforce-api) We will now call the Salesforce `/parameterizedSearch` API endpoint to search and retrieve account data. Replace the `q` value of `"acme"` with any keyword combination of your choice. In a real-world scenario, this value would most likely come from a user’s input. Observe that the `q` argument must be a string with two or more characters. ```nextra-code response = requests.post( f"https://{salesforce_org_subdomain}.my.salesforce.com/services/data/v63.0/parameterizedSearch", headers={"Authorization": f"Bearer {token}"}, json={ "q": "acme", "sobjects": [\ {"name": "Account", "fields": ["Id", "Name", "Website", "Phone"]},\ ], "in": "ALL", "overallLimit": 10, "offset": 0, }, ) if not response.ok: raise ValueError( f"Failed to retrieve Salesforce data: {response.status_code} - {response.text}" ) ``` Click to view the full example ## Create your own Salesforce Tools [Permalink for this section](https://docs.arcade.dev/home/auth-providers/salesforce\#create-your-own-salesforce-tools) If the pre-built tools in the [Arcade Salesforce toolkit](https://docs.arcade.dev/mcp-servers/sales/salesforce) don’t meet your needs, you can create your own [custom tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server) that interact with the Salesforce APIs. The code implemented in the Arcade Salesforce tools is the best guide for you to understand how to implement your own. Check the [Contact](https://github.com/ArcadeAI/arcade-ai/blob/main/mcp-servers/salesforce/arcade_salesforce/tools/crm/contact.py) and [Account](https://github.com/ArcadeAI/arcade-ai/blob/main/mcp-servers/salesforce/arcade_salesforce/tools/crm/account.py) tools in our public Github repository. [Reddit](https://docs.arcade.dev/home/auth-providers/reddit "Reddit") [Slack](https://docs.arcade.dev/home/auth-providers/slack "Slack") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Run Evaluations [Home](https://docs.arcade.dev/home "Home") [Evaluate tools](https://docs.arcade.dev/home/evaluate-tools/why-evaluate-tools "Evaluate tools") Run evaluations # Run evaluations with the Arcade CLI The Arcade Evaluation Framework allows you to run evaluations of your tool-enabled language models conveniently using the command-line interface (CLI). This enables you to execute your evaluation suites, gather results, and analyze the performance of your models in an efficient and streamlined manner. ### Using the `arcade evals` Command [Permalink for this section](https://docs.arcade.dev/home/evaluate-tools/run-evaluations\#using-the-arcade-evals-command) To run evaluations, use the `arcade evals` command provided by the Arcade CLI. This command searches for evaluation files in the specified directory, executes any functions decorated with `@tool_eval`, and displays the results. #### Basic Usage [Permalink for this section](https://docs.arcade.dev/home/evaluate-tools/run-evaluations\#basic-usage) ```nextra-code arcade evals ``` - ``: The directory containing your evaluation files. By default, it searches the current directory ( `.`). For example, to run evaluations in the current directory: ```nextra-code arcade evals . ``` The Arcade Evaluation Framework also supports running a single evaluation file: ```nextra-code arcade evals ``` #### Evaluation File Naming Convention [Permalink for this section](https://docs.arcade.dev/home/evaluate-tools/run-evaluations\#evaluation-file-naming-convention) The `arcade evals` command looks for Python files that start with `eval_` and end with `.py` (e.g., `eval_math_tools.py`, `eval_slack_messaging.py`). These files should contain your evaluation suites. #### Command Options [Permalink for this section](https://docs.arcade.dev/home/evaluate-tools/run-evaluations\#command-options) The `arcade evals` command supports several options to customize the evaluation process: - `--details`, `-d`: Show detailed results for each evaluation case, including critic feedback. Example: ```nextra-code arcade evals . --details ``` - `--models`, `-m`: Specify the models to use for evaluation. Provide a comma-separated list of model names. Example: ```nextra-code arcade evals . --models gpt-4o,gpt-3.5 ``` - `--max-concurrent`, `-c`: Set the maximum number of concurrent evaluations to run in parallel. Example: ```nextra-code arcade evals . --max-concurrent 4 ``` - `--host`, `-h`: Specify the Arcade Engine address to send evaluation requests to. - `--port`, `-p`: Specify the port of the Arcade Engine. - `--tls`: Force TLS for the connection to the Arcade Engine. - `--no-tls`: Disable TLS for the connection to the Arcade Engine. #### Example Command [Permalink for this section](https://docs.arcade.dev/home/evaluate-tools/run-evaluations\#example-command) Running evaluations in the `toolkits/math/evals` directory, showing detailed results, using the `gpt-4o` model: ```nextra-code arcade evals toolkits/math/evals --details --models gpt-4o ``` ### Execution Process [Permalink for this section](https://docs.arcade.dev/home/evaluate-tools/run-evaluations\#execution-process) When you run the `arcade evals` command, the following steps occur: 1. **Preparation**: The CLI loads the evaluation suites from the specified directory, looking for files that match the naming convention. 2. **Execution**: The evaluation suites are executed asynchronously. Each suite’s evaluation function, decorated with `@tool_eval`, is called with the appropriate configuration, including the model and concurrency settings. 3. **Concurrency**: Evaluations can run concurrently based on the `--max-concurrent` setting, improving efficiency. 4. **Result Aggregation**: Results from all evaluation cases and models are collected and aggregated. ### Displaying Results [Permalink for this section](https://docs.arcade.dev/home/evaluate-tools/run-evaluations\#displaying-results) After the evaluations are complete, the results are displayed in a concise and informative format, similar to testing frameworks like `pytest`. The output includes: - **Summary**: Shows the total number of cases, how many passed, failed, or issued warnings. Example: ```nextra-code Summary -- Total: 5 -- Passed: 4 -- Failed: 1 ``` - **Detailed Case Results**: For each evaluation case, the status (PASSED, FAILED, WARNED), the case name, and the score are displayed. Example: ```nextra-code PASSED Add two large numbers -- Score: 1.00 FAILED Send DM with ambiguous username -- Score: 0.75 ``` - **Critic Feedback**: If the `--details` flag is used, detailed feedback from each critic is provided, highlighting matches, mismatches, and scores for each evaluated field. Example: ```nextra-code Details: user_name: Match: False, Score: 0.00/0.50 Expected: johndoe Actual: john_doe message: Match: True, Score: 0.50/0.50 ``` ### Interpreting the Results [Permalink for this section](https://docs.arcade.dev/home/evaluate-tools/run-evaluations\#interpreting-the-results) - **Passed**: The evaluation case met or exceeded the fail threshold specified in the rubric. - **Failed**: The evaluation case did not meet the fail threshold. - **Warnings**: If the score is between the warn threshold and the fail threshold, a warning is issued. Use the detailed feedback to understand where the model’s performance can be improved, particularly focusing on mismatches identified by critics. ### Customizing Evaluations [Permalink for this section](https://docs.arcade.dev/home/evaluate-tools/run-evaluations\#customizing-evaluations) You can customize the evaluation process by adjusting: - **Rubrics**: Modify fail and warn thresholds, and adjust weights to emphasize different aspects of evaluation. - **Critics**: Add or modify critics in your evaluation cases to target specific arguments or behaviors. - **Concurrency**: Adjust the `--max-concurrent` option to optimize performance based on your environment. ### Handling Multiple Models [Permalink for this section](https://docs.arcade.dev/home/evaluate-tools/run-evaluations\#handling-multiple-models) You can evaluate multiple models in a single run by specifying them in the `--models` option as a comma-separated list. This allows you to compare the performance of different models across the same evaluation suites. Example: ```nextra-code arcade evals . --models gpt-4o,gpt-3.5 ``` ### Considerations [Permalink for this section](https://docs.arcade.dev/home/evaluate-tools/run-evaluations\#considerations) - **Engine Availability**: Ensure the Arcade Engine is running and accessible. You can specify the host and port if running the engine locally or on a different server. - **Authentication**: Make sure you are logged in and have the necessary API keys configured. - **Evaluation Files**: Ensure your evaluation files are correctly named and contain the evaluation suites decorated with `@tool_eval`. ## Conclusion [Permalink for this section](https://docs.arcade.dev/home/evaluate-tools/run-evaluations\#conclusion) Running evaluations using the Arcade CLI provides a powerful and convenient way to assess the tool-calling capabilities of your language models. By leveraging the `arcade evals` command, you can efficiently execute your evaluation suites, analyze results, and iterate on your models and toolkits. Integrating this evaluation process into your development workflow helps ensure that your models interact with tools as expected, enhances reliability, and builds confidence in deploying actionable language models in production environments. [Create an evaluation suite](https://docs.arcade.dev/home/evaluate-tools/create-an-evaluation-suite "Create an evaluation suite") [Arcade Deploy](https://docs.arcade.dev/home/serve-tools/arcade-deploy "Arcade Deploy") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Arcade Quickstart Guide [Home](https://docs.arcade.dev/home "Home") Quickstart # Arcade Quickstart **Build AI agents that actually take action.** Most AI apps are stuck in read-only mode. Arcade gives your AI the power to act — send Gmail, update Notion, message in Slack, and more. In this quickstart, you’ll: - Install the Arcade client - Authenticate your first real-world tool - Run your first tool call using the arcade client This it’s the foundation to build full agents. Real tools. Real actions. Real fast. Ready to start? Follow the Quickstart below. Arcade.dev quickstart guide - YouTube [Photo image of Arcade](https://www.youtube.com/channel/UCsSxkIlOhS4u-4BZnyRDwlQ?embeds_referring_euri=https%3A%2F%2Fdocs.arcade.dev%2F) Arcade 593 subscribers [Arcade.dev quickstart guide](https://www.youtube.com/watch?v=USoqJOOUP6c) Arcade Search Info Shopping Tap to unmute If playback doesn't begin shortly, try restarting your device. You're signed out Videos you watch may be added to the TV's watch history and influence TV recommendations. To avoid this, cancel and sign in to YouTube on your computer. CancelConfirm Share Include playlist An error occurred while retrieving sharing information. Please try again later. Watch later Share Copy link Watch on 0:00 / •Live • ### Prerequisites [Permalink for this section](https://docs.arcade.dev/home/quickstart\#prerequisites) 1. Create an [Arcade account](https://api.arcade.dev/signup) 2. Get an [Arcade API key](https://docs.arcade.dev/home/api-keys) and take note, you’ll need it in the next steps. ### Install the Arcade client [Permalink for this section](https://docs.arcade.dev/home/quickstart\#install-the-arcade-client) PythonJavaScript ```nextra-code pip install arcadepy ``` ### Instantiate and use the client [Permalink for this section](https://docs.arcade.dev/home/quickstart\#instantiate-and-use-the-client) PythonJavaScript Create a new script called `example.py`: ```nextra-code from arcadepy import Arcade # You can also set the `ARCADE_API_KEY` environment variable instead of passing it as a parameter. client = Arcade(api_key="{arcade_api_key}") # Arcade needs a unique identifier for your application user (this could be an email address, a UUID, etc). # In this example, use the email you used to sign up for Arcade.dev: user_id = "{arcade_user_id}" # Let's use the `Math.Sqrt` tool from the Arcade Math toolkit to get the square root of a number. response = client.tools.execute( tool_name="Math.Sqrt", input={"a": '625'}, user_id=user_id, ) print(f"The square root of 625 is {response.output.value}") # Now, let's use a tool that requires authentication to star a GitHub repository auth_response = client.tools.authorize( tool_name="GitHub.SetStarred", user_id=user_id, ) if auth_response.status != "completed": print(f"Click this link to authorize: `{auth_response.url}`. The process will continue once you have authorized the app." ) # Wait for the user to authorize the app client.auth.wait_for_completion(auth_response.id); response = client.tools.execute( tool_name="GitHub.SetStarred", input={ "owner": "ArcadeAI", "name": "arcade-ai", "starred": True, }, user_id=user_id, ) print(response.output.value) ``` ### Run the code [Permalink for this section](https://docs.arcade.dev/home/quickstart\#run-the-code) PythonJavaScript ```nextra-code python3 example.py > The square root of 625 is 25 > Successfully starred the repository ArcadeAI/arcade-ai ``` ## Next Steps [Permalink for this section](https://docs.arcade.dev/home/quickstart\#next-steps) In this simple example, we call the tool methods directly. In your real applications and agents, you’ll likely be letting the LLM decide which tools to call - lean more about using Arcade with Frameworks in the [Frameworks](https://docs.arcade.dev/home/langchain/use-arcade-tools) section, or [how to build your own tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server). [Contact us](https://docs.arcade.dev/home/contact-us "[object Object]") [Get an API key](https://docs.arcade.dev/home/api-keys "Get an API key") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## User Authorization Guide [Home](https://docs.arcade.dev/home "Home") [Build tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server "Build tools") Create a tool with auth # Adding user authorization to your tools In this guide, you’ll learn how to add user authorization to your custom tools, using Arcade. You’ll create a tool that sends a message on behalf of a user via Slack. ### Prerequisites [Permalink for this section](https://docs.arcade.dev/home/build-tools/create-a-tool-with-auth\#prerequisites) - [Set up Arcade](https://docs.arcade.dev/home/quickstart) - Install the Arcade SDK and any third-party SDKs you need (e.g., Slack SDK): - [Understand Tool Context](https://docs.arcade.dev/home/build-tools/tool-context) uvpip ```nextra-code uv pip install arcade-ai slack_sdk ``` ### Define your authorized tool [Permalink for this section](https://docs.arcade.dev/home/build-tools/create-a-tool-with-auth\#define-your-authorized-tool) Create a new Python file, e.g., `slack_tools.py`, and import the necessary modules: ```nextra-code from typing import Annotated from arcade_tdk import ToolContext, tool from arcade_tdk.auth import Slack from arcade_tdk.errors import RetryableToolError from slack_sdk import WebClient ``` Now, define your tool using the `@tool` decorator and specify the required authorization, in this case, by using the built-in `Slack` auth provider: ```nextra-code @tool( requires_auth=Slack( scopes=[\ "chat:write",\ "im:write",\ "users.profile:read",\ "users:read",\ ], ) ) def send_dm_to_user( context: ToolContext, user_name: Annotated[str, "The Slack username of the person you want to message"], message: Annotated[str, "The message you want to send"], ) -> Annotated[str, "A confirmation message that the DM was sent"]: """Send a direct message to a user in Slack.""" slack_client = WebClient(token=context.authorization.token) # Retrieve the user ID based on username user_list_response = slack_client.users_list() user_id = None for user in user_list_response["members"]: if user["name"].lower() == user_name.lower(): user_id = user["id"] break if not user_id: raise RetryableToolError( "User not found", developer_message=f"User with username '{user_name}' not found." ) # Open a conversation and send the message im_response = slack_client.conversations_open(users=[user_id]) dm_channel_id = im_response["channel"]["id"] slack_client.chat_postMessage(channel=dm_channel_id, text=message) return "DM sent successfully" ``` Arcade offers a number of [built-in auth providers](https://docs.arcade.dev/home/auth-providers), including Slack, Google, and GitHub. You can also require authorization with a custom auth provider, using the `OAuth2` class, a subclass of the `ToolAuthorization` class: ```nextra-code @tool( requires_auth=OAuth2( id="your-oauth-provider-id", scopes=["scope1", "scope2"], ) ) ``` The `OAuth2` class requires an `id` parameter to identify the auth provider in the Arcade Engine. For built-in providers like `Slack`, you can skip the `id` \- the Arcade Engine will find the right provider using your credentials. While you can specify an `id` for built-in providers, only do this for private tools that won’t be shared. ### Use your authorized tool with Arcade [Permalink for this section](https://docs.arcade.dev/home/build-tools/create-a-tool-with-auth\#use-your-authorized-tool-with-arcade) Now you can use your custom authorized tool with Arcade in your application. Here’s an example of how to use your tool: ```nextra-code from arcadepy import Arcade client = Arcade() # Automatically finds the `ARCADE_API_KEY` env variable user_id = "{arcade_user_id}" # Use the tool response = client.tools.execute( tool_name="Slack.SendDmToUser", input={ "user_name": "johndoe", "message": "Hello!", }, user_id=user_id, ) print(response.output.value) ``` ### Handle authorization [Permalink for this section](https://docs.arcade.dev/home/build-tools/create-a-tool-with-auth\#handle-authorization) Since your tool requires authorization, the first time you use it, the user (identified by `user_id`) needs to authorize access. Arcade handles the authorization flow, prompting the user to visit a URL to grant permissions. Your application should guide the user through this process. ### How it works [Permalink for this section](https://docs.arcade.dev/home/build-tools/create-a-tool-with-auth\#how-it-works) By specifying the `requires_auth` parameter in the `@tool` decorator, you indicate that the tool needs user authorization. Arcade manages the OAuth flow, and provides the token in `context.authorization.token` when the tool is executed. Arcade also remembers the user’s authorization tokens, so they won’t have to go through the authorization process again until the auth expires or is revoked. ### Next steps [Permalink for this section](https://docs.arcade.dev/home/build-tools/create-a-tool-with-auth\#next-steps) Try adding more authorized tools, or explore how to handle different authorization providers and scopes. [Tool Context](https://docs.arcade.dev/home/build-tools/tool-context "Tool Context") [Create a tool with secrets](https://docs.arcade.dev/home/build-tools/create-a-tool-with-secrets "Create a tool with secrets") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Create Arcade Toolkit [Home](https://docs.arcade.dev/home "Home") Build toolsCreate a toolkit # Creating a Toolkit This guide walks you through the complete process of creating a custom toolkit for Arcade - from initial setup to publishing on PyPI. You’ll build a simple arithmetic toolkit with operations like addition, subtraction, and multiplication. When creating or extending an Arcade toolkit, we make it easy to develop the tool alongside your agent, providing a pleasant local development experience. As your agent will be loading its available tools from the Arcade Engine, you can mix existing tools and your locally developed tool by following this guide. You’ll be running your local worker with the Arcade CLI and registering it with the Engine so that your agent can find and use your tool. Build an Arcade.dev Toolkit from scratch: FULL TUTORIAL - YouTube [Photo image of Arcade](https://www.youtube.com/channel/UCsSxkIlOhS4u-4BZnyRDwlQ?embeds_referring_euri=https%3A%2F%2Fdocs.arcade.dev%2F) Arcade 593 subscribers [Build an Arcade.dev Toolkit from scratch: FULL TUTORIAL](https://www.youtube.com/watch?v=q2V_P35KYCg) Arcade Search Info Shopping Tap to unmute If playback doesn't begin shortly, try restarting your device. You're signed out Videos you watch may be added to the TV's watch history and influence TV recommendations. To avoid this, cancel and sign in to YouTube on your computer. CancelConfirm Share Include playlist An error occurred while retrieving sharing information. Please try again later. Watch later Share Copy link Watch on 0:00 / •Live • ## Prerequisites [Permalink for this section](https://docs.arcade.dev/home/build-tools/create-a-mcp-server\#prerequisites) Before starting, make sure you have: - An [Arcade account](https://api.arcade.dev/signup) - For this guide, we’ll use [uv](https://docs.astral.sh/uv/getting-started/installation/) as our package manager. ## Generate a toolkit template [Permalink for this section](https://docs.arcade.dev/home/build-tools/create-a-mcp-server\#generate-a-toolkit-template) Run the following command to start creating your toolkit: ```nextra-code uv tool run --from arcade-ai arcade new arithmetic ``` Enter the optional information when prompted: - **Description**: Provide a brief explanation of what your toolkit will do - **Author GitHub username and email**: Your contact information - **Generate test and evaluation directories**: Whether you want additional directories created for you After completion, a directory with your toolkit name (arithmetic) will be created with the following structure: ```nextra-code arithmetic/ ├── arcade_arithmetic/ # Core package directory │ ├── __init__.py │ └── tools/ # Directory for your tools │ ├── __init__.py │ └── hello.py # Example tool ├── evals/ # Evaluation directory │ └── eval_arithmetic.py # Example evaluation file ├── tests/ # Test directory │ ├── __init__.py │ └── test_arithmetic.py # Example test file ├── pyproject.toml # uv project configuration ├── README.md └── Makefile # uv helper commands ``` Navigate to your toolkit directory: ```nextra-code cd arithmetic ``` ## Set up the development environment [Permalink for this section](https://docs.arcade.dev/home/build-tools/create-a-mcp-server\#set-up-the-development-environment) An active virtual environment for your shell(s) is required to run the local development commands. ```nextra-code uv venv --seed -p 3.13 ``` Install dependencies and pre-commit hooks: ```nextra-code make install ``` This installs all dependencies specified in `pyproject.toml`, pre-commit hooks for code quality, and your toolkit in development mode. The Makefile provides several helpful commands: - `build` \- Build wheel file using uv - `bump-version` \- Bump the version in the pyproject.toml file by a patch version - `check` \- Run code quality tools - `clean-build` \- Clean build artifacts - `coverage` \- Generate coverage report - `install` \- Install the uv environment and install all packages with dependencies - `install-local` \- Install Arcade components (CLI, TDK, etc.) from source in editable mode. Only use this when you are developing against the latest unreleased code from the [arcade-ai repo](https://github.com/ArcadeAI/arcade-ai) main branch instead of the published packages - `test` \- Test the code with pytest Activate the environment with: ```nextra-code source .venv/bin/activate ``` or ```nextra-code uv run ``` ## Define your tools [Permalink for this section](https://docs.arcade.dev/home/build-tools/create-a-mcp-server\#define-your-tools) Create a Python file for your tools in the `arcade_arithmetic/tools` directory. The following example shows a simple math toolkit with three tools: `add`, `subtract`, and `multiply`: ```nextra-code # arcade_arithmetic/tools/operations.py from typing import Annotated from arcade_tdk import tool @tool def add( a: Annotated[int, "The first number"], b: Annotated[int, "The second number"] ) -> Annotated[int, "The sum of the two numbers"]: """ Add two numbers together Examples: add(3, 4) -> 7 add(-1, 5) -> 4 """ return a + b @tool def subtract( a: Annotated[int, "The first number"], b: Annotated[int, "The second number"] ) -> Annotated[int, "The difference of the two numbers"]: """ Subtract the second number from the first Examples: subtract(10, 4) -> 6 subtract(5, 7) -> -2 """ return a - b @tool def multiply( a: Annotated[int, "The first number"], b: Annotated[int, "The second number"] ) -> Annotated[int, "The product of the two numbers"]: """ Multiply two numbers together Examples: multiply(3, 4) -> 12 multiply(-2, 5) -> -10 """ return a * b ``` Update the package initialization files to expose your tools: ```nextra-code # arcade_arithmetic/tools/__init__.py from arcade_arithmetic.tools.operations import add, multiply, subtract __all__ = ["add", "multiply", "subtract"] ``` ```nextra-code # arcade_arithmetic/__init__.py from arcade_arithmetic.tools import add, multiply, subtract __all__ = ["add", "multiply", "subtract"] ``` ## Test your toolkit [Permalink for this section](https://docs.arcade.dev/home/build-tools/create-a-mcp-server\#test-your-toolkit) Write tests for your tools in the `tests` directory: ```nextra-code # tests/test_operations.py import pytest from arcade_arithmetic.tools.operations import add, multiply, subtract def test_add(): assert add(3, 4) == 7 assert add(-1, 5) == 4 assert add(0, 0) == 0 def test_subtract(): assert subtract(10, 4) == 6 assert subtract(5, 7) == -2 assert subtract(0, 0) == 0 def test_multiply(): assert multiply(3, 4) == 12 assert multiply(-2, 5) == -10 assert multiply(0, 5) == 0 ``` Run the tests: ```nextra-code make test ``` Check code quality: ```nextra-code make check ``` Generate a coverage report (optional): ```nextra-code make coverage ``` ## Verify local installation [Permalink for this section](https://docs.arcade.dev/home/build-tools/create-a-mcp-server\#verify-local-installation) Your toolkit should already be installed locally from the `make install` command. Verify it’s properly registered: ```nextra-code arcade show --local ``` You should see your toolkit listed in the output. ## Test your tools locally [Permalink for this section](https://docs.arcade.dev/home/build-tools/create-a-mcp-server\#test-your-tools-locally) Serve your toolkit locally with the Arcade CLI: ```nextra-code arcade serve ``` You can use the `--reload` flag to automatically reload the server when you make changes to your toolkit: ```nextra-code arcade serve --reload ``` Visit [http://localhost:8002/worker/health](http://localhost:8002/worker/health) to see that your worker is running. ## Connect your toolkit to the Arcade Engine [Permalink for this section](https://docs.arcade.dev/home/build-tools/create-a-mcp-server\#connect-your-toolkit-to-the-arcade-engine) In another terminal, use a service like [ngrok](https://ngrok.com/docs/), [tailscale](https://tailscale.com/kb/1223/funnel), or [cloudflare](https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/do-more-with-tunnels/local-management/create-local-tunnel/) to give your local worker a public URL. ngrokTailscaleCloudflare ```nextra-code ngrok http 8002 ``` Then in your Arcade dashboard: 1. Navigate to the [Workers](https://api.arcade.dev/dashboard/workers) page. 2. Click **Add Worker**. 3. Fill in the form with the following values: - **ID**: `my-arithmetic-worker` - **Worker Type**: `Arcade` - **URL**: your public URL from ngrok, tailscale, or cloudflare - **Secret**: `dev` - **Timeout** and **Retry**: can be left at default values 4. Click **Create**. Now, in the [Playground](https://api.arcade.dev/dashboard/playground), you can see your tools in action. ## Deploy your toolkit to the Arcade Engine [Permalink for this section](https://docs.arcade.dev/home/build-tools/create-a-mcp-server\#deploy-your-toolkit-to-the-arcade-engine) Alternatively, you can deploy your toolkit to Arcade’s cloud instead of tunneling to it locally. Find the `worker.toml` file in your toolkit’s root directory (where you ran `uv tool run --from arcade-ai arcade new arithmetic`): ```nextra-code [[worker]] [worker.config] id = "demo-worker" # Choose a unique ID enabled = true timeout = 30 retries = 3 secret = "" # This is randomly generated for you by `uv tool run --from arcade-ai arcade new arithmetic` [worker.local_source] packages = ["./arithmetic"] # Path to your toolkit directory ``` See [Configuring Arcade Deploy](https://docs.arcade.dev/home/local-deployment/configure/arcade-deploy) for more configuration options. From the root of your toolkit, deploy your toolkit to Arcade’s cloud with: This may take a while your first time. ```nextra-code arcade deploy ``` Verify the deployment: ```nextra-code arcade worker list ``` ## Package and publish to PyPI [Permalink for this section](https://docs.arcade.dev/home/build-tools/create-a-mcp-server\#package-and-publish-to-pypi) Clean any previous build artifacts: ```nextra-code make clean-build ``` If you’re updating an existing package, bump the version: ```nextra-code make bump-version ``` Create a comprehensive README.md file that explains your toolkit’s purpose, installation, and usage. Build your package: ```nextra-code make build ``` Publish to PyPI: ```nextra-code uv publish --token YOUR_PYPI_TOKEN_HERE ``` ## Using your published toolkit [Permalink for this section](https://docs.arcade.dev/home/build-tools/create-a-mcp-server\#using-your-published-toolkit) Now that your toolkit is published, you can use it in any Arcade application: ```nextra-code from arcadepy import Arcade # Initialize the Arcade client client = Arcade() # Use your Tools response = client.tools.execute( tool_name="Arithmetic.Add", input={ "a": 12, "b": 34 }, ) print(response.output.value) ``` ## Ongoing toolkit maintenance [Permalink for this section](https://docs.arcade.dev/home/build-tools/create-a-mcp-server\#ongoing-toolkit-maintenance) As you continue to develop your toolkit, use these Makefile commands to maintain it: - `make check` \- Run code quality checks before committing changes - `make test` \- Run tests to ensure your changes don’t break existing functionality - `make coverage` \- Monitor test coverage as you add new features - `make bump-version` \- Update the version when releasing new changes - `make build` \- Build new distribution packages - `make clean-build` \- Clean up build artifacts when needed ## Next steps [Permalink for this section](https://docs.arcade.dev/home/build-tools/create-a-mcp-server\#next-steps) - **Add more tools**: Expand your toolkit with more complex operations - **Add authentication**: [Learn how to create tools with authentication](https://docs.arcade.dev/home/build-tools/create-a-tool-with-auth) - **Add secrets**: [Learn how to create tools with secrets](https://docs.arcade.dev/home/build-tools/create-a-tool-with-secrets) - **Evaluate your tools**: [Explore how to evaluate tool performance](https://docs.arcade.dev/home/evaluate-tools/why-evaluate-tools) - **Set up CI/CD**: Automate testing and deployment with continuous integration [Get an API key](https://docs.arcade.dev/home/api-keys "Get an API key") [Tool Context](https://docs.arcade.dev/home/build-tools/tool-context "Tool Context") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## LinkedIn Auth Provider [Home](https://docs.arcade.dev/home "Home") [Customizing Auth](https://docs.arcade.dev/home/auth-providers "Customizing Auth") Linkedin # LinkedIn auth provider The LinkedIn auth provider enables tools and agents to call the LinkedIn API on behalf of a user. Behind the scenes, the Arcade Engine and the LinkedIn auth provider seamlessly manage LinkedIn OAuth 2.0 authorization for your users. ### What’s documented here [Permalink for this section](https://docs.arcade.dev/home/auth-providers/linkedin\#whats-documented-here) This page describes how to use and configure LinkedIn auth with Arcade. This auth provider is used by: - Your [app code](https://docs.arcade.dev/home/auth-providers/linkedin#using-linkedin-auth-in-app-code) that needs to call LinkedIn APIs - Or, your [custom tools](https://docs.arcade.dev/home/auth-providers/linkedin#using-linkedin-auth-in-custom-tools) that need to call LinkedIn APIs ## Configuring LinkedIn auth [Permalink for this section](https://docs.arcade.dev/home/auth-providers/linkedin\#configuring-linkedin-auth) When using your own app credentials, make sure you configure your project to use a [custom user verifier](https://docs.arcade.dev/home/auth/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 LinkedIn app credentials. This way, your users will see your application’s name requesting permission. You can use your own LinkedIn credentials in both the Arcade Cloud Platform or in a [self-hosted Arcade Engine](https://docs.arcade.dev/home/deployment/engine-configuration) instance. Before showing how to configure your LinkedIn app credentials, let’s go through the steps to create a LinkedIn app. ### Create a LinkedIn app [Permalink for this section](https://docs.arcade.dev/home/auth-providers/linkedin\#create-a-linkedin-app) - Follow LinkedIn’s guide to [setting up user authorization](https://learn.microsoft.com/en-us/linkedin/shared/authentication/authentication) - On the Products tab, add the products you need for your app (e.g. “Share on LinkedIn”) - At a minimum, you _must_ add the “Sign In with LinkedIn using OpenID Connect” product - On the Auth tab, 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 LinkedIn app to your Arcade Engine configuration. You can do this in the Arcade Dashboard, or by editing the `engine.yaml` file directly (for a self-hosted instance). ## Configuring your own LinkedIn Auth Provider in Arcade [Permalink for this section](https://docs.arcade.dev/home/auth-providers/linkedin\#configuring-your-own-linkedin-auth-provider-in-arcade) There are two ways to configure your LinkedIn app credentials in Arcade: 1. From the Arcade Dashboard GUI 2. By editing the `engine.yaml` file directly (for a self-hosted Arcade Engine) We show both options step-by-step below. Dashboard GUIEngine Configuration YAML ### Configure LinkedIn Auth Using the Arcade Dashboard GUI #### Access the Arcade Dashboard [Permalink for this section](https://docs.arcade.dev/home/auth-providers/linkedin\#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](http://localhost:9099/dashboard). Adjust the host and port number to match your environment. #### Navigate to the OAuth Providers page [Permalink for this section](https://docs.arcade.dev/home/auth-providers/linkedin\#navigate-to-the-oauth-providers-page) - Under the **OAuth** section of the Arcade Dashboard left-side menu, click **Providers**. - Click **Add OAuth Provider** in the top right corner. - Select the **Included Providers** tab at the top. - In the **Provider** dropdown, select **LinkedIn**. #### Enter the provider details [Permalink for this section](https://docs.arcade.dev/home/auth-providers/linkedin\#enter-the-provider-details) - Choose a unique **ID** for your provider (e.g. “my-linkedin-provider”). - Optionally enter a **Description**. - Enter the **Client ID** and **Client Secret** from your LinkedIn app. - Note the **Redirect URL** generated by Arcade. This must be set as your LinkedIn app’s redirect URL. #### Create the provider [Permalink for this section](https://docs.arcade.dev/home/auth-providers/linkedin\#create-the-provider) Hit the **Create** button and the provider will be ready to be used. When you use tools that require LinkedIn auth using your Arcade account credentials, the Arcade Engine will automatically use this LinkedIn OAuth provider. If you have multiple LinkedIn providers, see [using multiple auth providers of the same type](https://docs.arcade.dev/home/auth-providers#using-multiple-providers-of-the-same-type) for more information. ## Using LinkedIn auth in app code [Permalink for this section](https://docs.arcade.dev/home/auth-providers/linkedin\#using-linkedin-auth-in-app-code) Use the LinkedIn auth provider in your own agents and AI apps to get a user token for LinkedIn APIs. See [authorizing agents with Arcade](https://docs.arcade.dev/home/auth/how-arcade-helps) to understand how this works. Use `client.auth.start()` to get a user token for LinkedIn APIs: PythonJavaScript ```nextra-code import requests from arcadepy import Arcade client = Arcade() # Automatically finds the `ARCADE_API_KEY` env variable user_id = "{arcade_user_id}" """ In this example, we will use Arcade to authenticate with LinkedIn and post a message to the user's LinkedIn feed. There is a tool for that in the Arcade SDK, which simplifies the process for you to post messages to the user's LinkedIn feed either through our Python or JavaScript SDKs or via LLM tool calling. Below we are just showing how to use Arcade as an auth provider, if you ever need to. """ # Start the authorization process auth_response = client.auth.start( user_id=user_id, provider="linkedin", scopes=["w_member_social"], ) 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) if not auth_response.context.token: raise ValueError("No token found in auth response") token = auth_response.context.token user_id = ( None if not auth_response.context.authorization else auth_response.context.authorization.user_info.get("sub") ) if not user_id: raise ValueError("User ID not found.") # Prepare the payload data for the LinkedIn API message = "Hello, from Arcade.dev!" payload = { "author": f"urn:li:person:{user_id}", "lifecycleState": "PUBLISHED", "specificContent": { "com.linkedin.ugc.ShareContent": { "shareCommentary": {"text": message}, "shareMediaCategory": "NONE", } }, "visibility": {"com.linkedin.ugc.MemberNetworkVisibility": "PUBLIC"}, } response = requests.post( "https://api.linkedin.com/v2/ugcPosts", headers={"Authorization": f"Bearer {token}"}, json=payload, ) response.raise_for_status() print(response.json()) ``` ## Using LinkedIn auth in custom tools [Permalink for this section](https://docs.arcade.dev/home/auth-providers/linkedin\#using-linkedin-auth-in-custom-tools) You can author your own [custom tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server) that interact with LinkedIn APIs. Use the `LinkedIn()` auth class to specify that a tool requires authorization with LinkedIn. The `context.authorization.token` field will be automatically populated with the user’s LinkedIn token: ```nextra-code from typing import Annotated import httpx from arcade_tdk.errors import ToolExecutionError from arcade_tdk import ToolContext, tool from arcade_tdk.auth import LinkedIn @tool( requires_auth=LinkedIn( scopes=["w_member_social"], ) ) async def create_text_post( context: ToolContext, text: Annotated[str, "The text content of the post"], ) -> Annotated[str, "URL of the shared post"]: """Share a new text post to LinkedIn.""" endpoint = "/ugcPosts" # The LinkedIn user ID is required to create a post, even though we're using the user's access token. # Arcade Engine gets the current user's info from LinkedIn and automatically populates context.authorization.user_info. # LinkedIn calls the user ID "sub" in their user_info data payload. See: # https://learn.microsoft.com/en-us/linkedin/consumer/integrations/self-serve/sign-in-with-linkedin-v2#api-request-to-retreive-member-details user_id = context.authorization.user_info.get("sub") if not user_id: raise ToolExecutionError( "User ID not found.", developer_message="User ID not found in `context.authorization.user_info.sub`", ) headers = {"Authorization": f"Bearer {context.authorization.token}"} author_id = f"urn:li:person:{user_id}" payload = { "author": author_id, "lifecycleState": "PUBLISHED", "specificContent": { "com.linkedin.ugc.ShareContent": { "shareCommentary": {"text": text}, "shareMediaCategory": "NONE", } }, "visibility": {"com.linkedin.ugc.MemberNetworkVisibility": "PUBLIC"}, } async with httpx.AsyncClient() as client: response = await client.post( url=f"https://api.linkedin.com/v2/{endpoint}", headers=headers, json=payload, ) response.raise_for_status() share_id = response.json().get("id") return f"https://www.linkedin.com/feed/update/{share_id}/" ``` [Linear](https://docs.arcade.dev/home/auth-providers/linear "Linear") [Microsoft](https://docs.arcade.dev/home/auth-providers/microsoft "Microsoft") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## ClickUp Auth Provider [Home](https://docs.arcade.dev/home "Home") [Customizing Auth](https://docs.arcade.dev/home/auth-providers "Customizing Auth") Clickup # ClickUp auth provider The ClickUp auth provider enables tools and agents to call the ClickUp API on behalf of a user. Behind the scenes, the Arcade Engine and the ClickUp auth provider seamlessly manage ClickUp OAuth 2.0 authorization for your users. ### What’s documented here [Permalink for this section](https://docs.arcade.dev/home/auth-providers/clickup\#whats-documented-here) This page describes how to use and configure ClickUp auth with Arcade. This auth provider is used by: - Your [app code](https://docs.arcade.dev/home/auth-providers/clickup#using-clickup-auth-in-app-code) that needs to call ClickUp APIs - Or, your [custom tools](https://docs.arcade.dev/home/auth-providers/clickup#using-clickup-auth-in-custom-tools) that need to call ClickUp APIs ## Configuring ClickUp auth [Permalink for this section](https://docs.arcade.dev/home/auth-providers/clickup\#configuring-clickup-auth) When using your own app credentials, make sure you configure your project to use a [custom user verifier](https://docs.arcade.dev/home/auth/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 ClickUp app credentials. This way, your users will see your application’s name requesting permission. You can use your own ClickUp credentials in both the Arcade Cloud Platform or in a [self-hosted Arcade Engine](https://docs.arcade.dev/home/deployment/engine-configuration) instance. Before showing how to configure your ClickUp app credentials, let’s go through the steps to create a ClickUp app. ### Create a ClickUp app [Permalink for this section](https://docs.arcade.dev/home/auth-providers/clickup\#create-a-clickup-app) - Navigate to your ClickUp workspace and go to **Settings → Apps** - Click **Create new app** in the OAuth Apps section - Fill in your app name and description - Set the OAuth Redirect URL to: `https://cloud.arcade.dev/api/v1/oauth/callback` - Copy the Client ID and Client Secret, which you’ll need below Next, add the ClickUp app to your Arcade Engine configuration. You can do this in the Arcade Dashboard, or by editing the `engine.yaml` file directly (for a self-hosted instance). ## Configuring your own ClickUp Auth Provider in Arcade [Permalink for this section](https://docs.arcade.dev/home/auth-providers/clickup\#configuring-your-own-clickup-auth-provider-in-arcade) There are two ways to configure your ClickUp app credentials in Arcade: 1. From the Arcade Dashboard GUI 2. By editing the `engine.yaml` file directly (for a self-hosted Arcade Engine) We show both options step-by-step below. Dashboard GUIEngine Configuration YAML ### Configure ClickUp Auth Using the Arcade Dashboard GUI #### Access the Arcade Dashboard [Permalink for this section](https://docs.arcade.dev/home/auth-providers/clickup\#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 [Permalink for this section](https://docs.arcade.dev/home/auth-providers/clickup\#navigate-to-the-oauth-providers-page) - Under the **OAuth** section of the Arcade Dashboard left-side menu, click **Providers**. - Click **Add OAuth Provider** in the top right corner. - Select the **Included Providers** tab at the top. - In the **Provider** dropdown, select **ClickUp**. #### Enter the provider details [Permalink for this section](https://docs.arcade.dev/home/auth-providers/clickup\#enter-the-provider-details) - Choose a unique **ID** for your provider (e.g. “my-clickup-provider”). - Optionally enter a **Description**. - Enter the **Client ID** and **Client Secret** from your ClickUp app. #### Create the provider [Permalink for this section](https://docs.arcade.dev/home/auth-providers/clickup\#create-the-provider) Hit the **Create** button and the provider will be ready to be used. When you use tools that require ClickUp auth using your Arcade account credentials, the Arcade Engine will automatically use this ClickUp OAuth provider. If you have multiple ClickUp providers, see [using multiple auth providers of the same type](https://docs.arcade.dev/home/auth-providers#using-multiple-providers-of-the-same-type) for more information. ## Using ClickUp auth in app code [Permalink for this section](https://docs.arcade.dev/home/auth-providers/clickup\#using-clickup-auth-in-app-code) Use the ClickUp auth provider in your own agents and AI apps to get a user-scoped token for the ClickUp API. See [authorizing agents with Arcade](https://docs.arcade.dev/home/auth/how-arcade-helps) to understand how this works. Use `client.auth.start()` to get a user token for the ClickUp API: PythonJavaScript ```nextra-code 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="clickup", ) 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 # TODO: Do something interesting with the token... ``` ## Using ClickUp auth in custom tools [Permalink for this section](https://docs.arcade.dev/home/auth-providers/clickup\#using-clickup-auth-in-custom-tools) You can author your own [custom tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server) that interact with the ClickUp API. Use the `ClickUp()` auth class to specify that a tool requires authorization with ClickUp. The `context.authorization.token` field will be automatically populated with the user’s ClickUp token: ```nextra-code import httpx from arcade_tdk import tool, ToolContext from arcade_tdk.auth import ClickUp @tool(requires_auth=ClickUp()) async def get_my_workspaces(context: ToolContext) -> dict: """Get the authenticated user's workspaces (teams) from ClickUp.""" token = context.authorization.token # Make authenticated request to ClickUp API async with httpx.AsyncClient() as client: response = await client.get( "https://api.clickup.com/api/v2/team", headers={ "Authorization": token, "Content-Type": "application/json" } ) if response.status_code == 200: data = response.json() teams = data.get("teams", []) return { "success": True, "teams": [{"id": team["id"], "name": team["name"]} for team in teams] } else: return { "success": False, "error": f"ClickUp API error: {response.status_code} - {response.text}" } ``` [Atlassian](https://docs.arcade.dev/home/auth-providers/atlassian "Atlassian") [Discord](https://docs.arcade.dev/home/auth-providers/discord "Discord") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## HubSpot Sales Toolkit [Integrations](https://docs.arcade.dev/toolkits "Integrations") SalesHubspot # Hubspot **Description:** Enable agents to interact with Hubspot **Author:** Arcade **Auth:** User authorization [![PyPI Version](https://img.shields.io/pypi/v/arcade_hubspot)](https://pypi.org/project/arcade_hubspot/)[![License](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/arcadeai/arcade-ai/blob/main/LICENSE)[![Python Versions](https://img.shields.io/pypi/pyversions/arcade_hubspot)](https://pypi.org/project/arcade_hubspot/)[![Wheel Status](https://img.shields.io/pypi/wheel/arcade_hubspot)](https://pypi.org/project/arcade_hubspot/)[![Downloads](https://img.shields.io/pypi/dm/arcade_hubspot)](https://pypi.org/project/arcade_hubspot/) The Hubspot toolkit offers pre-built tools for interacting with HubSpot CRM. Use these tools to automate CRM updates, log interactions, link records, and query HubSpot data for workflows and agents. ## Available Tools [Permalink for this section](https://docs.arcade.dev/mcp-servers/sales/hubspot\#available-tools) | Tool Name | Description | | --- | --- | | Hubspot.GetAllUsers | Get all users/owners in the HubSpot portal. | | Hubspot.GetUserById | Get detailed information about a specific user/owner by their ID. | | Hubspot.WhoAmI | Get current user information from HubSpot. | | Hubspot.ToolkitEnviromentGuidance | Get guidance and considerations for using the HubSpot toolkit effectively. | | Hubspot.CreateNoteActivity | Create a note engagement activity with required owner and associations. | | Hubspot.CreateCallActivity | Create a call engagement activity with required owner and associations. | | Hubspot.CreateEmailActivity | Create a logged email engagement activity with essential fields including email headers. | | Hubspot.CreateMeetingActivity | Create a meeting with essential fields including separate date and time. | | Hubspot.CreateCommunicationActivity | Create a communication activity for logging communications that are not done via | | Hubspot.AssociateActivityToDeal | Associate a single activity object to a deal using HubSpot standard association type. | | Hubspot.GetContactDataByKeywords | Retrieve contact data with associated companies, deals, calls, emails, | | Hubspot.CreateContact | Create a contact associated with a company. | | Hubspot.ListContacts | List contacts with optional filtering by company ID or deal ID, with pagination support. | | Hubspot.GetDealDataByKeywords | Retrieve deal data with associated contacts, companies, calls, emails, | | Hubspot.CreateDeal | Create a new deal in HubSpot. | | Hubspot.UpdateDealCloseDate | Update the expected close date of an existing deal in HubSpot. | | Hubspot.UpdateDealStage | Updates a deal's stage, validating against the current pipeline if provided | | Hubspot.GetDealById | Retrieve a specific deal by its ID from HubSpot. | | Hubspot.AssociateContactToDeal | Associate a contact with an existing deal in HubSpot. | | Hubspot.ListDeals | List deals with optional filtering by contact ID or company ID, with pagination support. | | Hubspot.GetNoteDataByKeywords | Search for note activities by search terms in NOTE object properties. | | Hubspot.GetCallDataByKeywords | Search for call activities by search terms in CALL object properties. | | Hubspot.GetEmailDataByKeywords | Search for email activities by search terms in EMAIL object properties. | | Hubspot.GetMeetingDataByKeywords | Search for meeting activities by search terms in MEETING object properties. | | Hubspot.GetTaskDataByKeywords | Search for task activities by search terms in TASK object properties. | | Hubspot.GetCommunicationDataByKeywords | Search for communication activities by search terms in COMMUNICATION object properties. | | Hubspot.GetCompanyDataByKeywords | Retrieve company data with associated contacts, deals, calls, emails, | | Hubspot.CreateCompany | Create a new company in HubSpot. | | Hubspot.ListCompanies | List companies with pagination support. | | Hubspot.GetAvailableIndustryTypes | Get all available industry types for HubSpot companies. | | Hubspot.GetDealPipelines | List HubSpot deal pipelines with their stages, optionally filtered by a search string. | | Hubspot.GetDealPipelineStages | List stages for a specific HubSpot deal pipeline. | If you need to perform an action that’s not listed here, you can [get in touch\\ with us](mailto:contact@arcade.dev) to request a new tool, or [create your\\ own tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server). ## Hubspot.GetAllUsers [Permalink for this section](https://docs.arcade.dev/mcp-servers/sales/hubspot\#hubspotgetallusers) See Example > Get all users/owners in the HubSpot portal. **Parameters** This tool does not take any parameters. ## Hubspot.GetUserById [Permalink for this section](https://docs.arcade.dev/mcp-servers/sales/hubspot\#hubspotgetuserbyid) See Example > Get detailed information about a specific user/owner by their ID. **Parameters** - **owner\_id** ( `integer`, required) The HubSpot owner/user ID to retrieve ## Hubspot.WhoAmI [Permalink for this section](https://docs.arcade.dev/mcp-servers/sales/hubspot\#hubspotwhoami) See Example > Get current user information from HubSpot. **Parameters** This tool does not take any parameters. ## Hubspot.ToolkitEnviromentGuidance [Permalink for this section](https://docs.arcade.dev/mcp-servers/sales/hubspot\#hubspottoolkitenviromentguidance) See Example > Get guidance and considerations for using the HubSpot toolkit effectively. **Parameters** This tool does not take any parameters. ## Hubspot.CreateNoteActivity [Permalink for this section](https://docs.arcade.dev/mcp-servers/sales/hubspot\#hubspotcreatenoteactivity) See Example > Create a note engagement activity with required owner and associations. **Parameters** - **body** ( `string`, required) The note content/body. - **when\_occurred** ( `string`, required) When the note was created (ISO date format: YYYY-MM-DDTHH:MM:SS). - **associate\_to\_contact\_id** ( `integer`, optional) Contact ID to associate this note with. - **associate\_to\_company\_id** ( `integer`, optional) Company ID to associate this note with. - **associate\_to\_deal\_id** ( `integer`, optional) Deal ID to associate this note with. ## Hubspot.CreateCallActivity [Permalink for this section](https://docs.arcade.dev/mcp-servers/sales/hubspot\#hubspotcreatecallactivity) See Example > Create a call engagement activity with required owner and associations. **Parameters** - **title** ( `string`, required) Short title for the call. - **when\_occurred** ( `string`, required) When the call occurred (ISO date format: YYYY-MM-DDTHH:MM:SS). - **direction** ( `Enum` [HubspotCallDirection](https://docs.arcade.dev/mcp-servers/sales/hubspot/reference#HubspotCallDirection), optional) Call direction (INBOUND or OUTBOUND). - **summary** ( `string`, optional) Short summary/notes of the call. - **duration** ( `integer`, optional) Call duration in seconds. - **to\_number** ( `string`, optional) Phone number called to. - **from\_number** ( `string`, optional) Phone number called from. - **associate\_to\_contact\_id** ( `integer`, optional) Contact ID to associate this call with. - **associate\_to\_company\_id** ( `integer`, optional) Company ID to associate this call with. - **associate\_to\_deal\_id** ( `integer`, optional) Deal ID to associate this call with. ## Hubspot.CreateEmailActivity [Permalink for this section](https://docs.arcade.dev/mcp-servers/sales/hubspot\#hubspotcreateemailactivity) See Example > Create a logged email engagement activity with essential fields including email headers. **Parameters** - **subject** ( `string`, required) Email subject. - **when\_occurred** ( `string`, required) When the email occurred (ISO date format: YYYY-MM-DDTHH:MM:SS). - **from\_email** ( `string`, required) Sender email address. - **to\_email** ( `string`, required) Primary recipient email address. - **body\_text** ( `string`, optional) Email body in plain text. - **body\_html** ( `string`, optional) Email body in HTML format. - **from\_first\_name** ( `string`, optional) Sender first name. - **from\_last\_name** ( `string`, optional) Sender last name. - **to\_first\_name** ( `string`, optional) Primary recipient first name. - **to\_last\_name** ( `string`, optional) Primary recipient last name. - **cc\_emails** ( `array[string]`, optional) CC recipient email addresses. - **bcc\_emails** ( `array[string]`, optional) BCC recipient email addresses. - **direction** ( `Enum` [HubspotEmailDirection](https://docs.arcade.dev/mcp-servers/sales/hubspot/reference#HubspotEmailDirection), optional) Direction the email was sent (EMAIL, INCOMING\_EMAIL, FORWARDED\_EMAIL). - **status** ( `Enum` [HubspotEmailStatus](https://docs.arcade.dev/mcp-servers/sales/hubspot/reference#HubspotEmailStatus), optional) Email status indicating the state of the email. - **associate\_to\_contact\_id** ( `integer`, optional) Contact ID to associate this email with. - **associate\_to\_company\_id** ( `integer`, optional) Company ID to associate this email with. - **associate\_to\_deal\_id** ( `integer`, optional) Deal ID to associate this email with. ## Hubspot.CreateMeetingActivity [Permalink for this section](https://docs.arcade.dev/mcp-servers/sales/hubspot\#hubspotcreatemeetingactivity) See Example > Create a meeting with essential fields including separate date and time. **Parameters** - **title** ( `string`, required) Meeting title. - **start\_date** ( `string`, required) Start date (YYYY-MM-DD format). - **start\_time** ( `string`, required) Start time (HH:MM or HH:MM:SS format). - **duration** ( `string`, optional) Meeting duration in HH:MM format (e.g., 1:30 for 1 hour 30 minutes). - **location** ( `string`, optional) Meeting location. - **outcome** ( `Enum` [HubspotMeetingOutcome](https://docs.arcade.dev/mcp-servers/sales/hubspot/reference#HubspotMeetingOutcome), optional) Meeting outcome. - **associate\_to\_contact\_id** ( `integer`, optional) Contact ID to associate this meeting with. - **associate\_to\_company\_id** ( `integer`, optional) Company ID to associate this meeting with. - **associate\_to\_deal\_id** ( `integer`, optional) Deal ID to associate this meeting with. ## Hubspot.CreateCommunicationActivity [Permalink for this section](https://docs.arcade.dev/mcp-servers/sales/hubspot\#hubspotcreatecommunicationactivity) See Example > Create a communication activity for logging communications that are not done via **Parameters** - **channel** ( `Enum` [HubspotCommunicationChannel](https://docs.arcade.dev/mcp-servers/sales/hubspot/reference#HubspotCommunicationChannel), required) Communication channel type. - **when\_occurred** ( `string`, required) When the communication occurred (ISO date format: YYYY-MM-DDTHH:MM:SS). - **body\_text** ( `string`, optional) Full message content. - **associate\_to\_contact\_id** ( `integer`, optional) Contact ID to associate this communication with. - **associate\_to\_company\_id** ( `integer`, optional) Company ID to associate this communication with. - **associate\_to\_deal\_id** ( `integer`, optional) Deal ID to associate this communication with. ## Hubspot.AssociateActivityToDeal [Permalink for this section](https://docs.arcade.dev/mcp-servers/sales/hubspot\#hubspotassociateactivitytodeal) See Example > Associate a single activity object to a deal using HubSpot standard association type. **Parameters** - **activity\_type** ( `Enum` [HubspotActivityType](https://docs.arcade.dev/mcp-servers/sales/hubspot/reference#HubspotActivityType), required) Engagement activity type. - **activity\_id** ( `integer`, required) The activity object ID - **deal\_id** ( `integer`, required) The deal ID to associate to ## Hubspot.GetContactDataByKeywords [Permalink for this section](https://docs.arcade.dev/mcp-servers/sales/hubspot\#hubspotgetcontactdatabykeywords) See Example > Retrieve contact data with associated companies, deals, calls, emails, **Parameters** - **keywords** ( `string`, required) The keywords to search for contacts. It will match against the contact’s first and last name, email addresses, phone numbers, and company name. - **limit** ( `integer`, optional) The maximum number of contacts to return. Defaults to 10. Max is 100. - **next\_page\_token** ( `string`, optional) The token to get the next page of results. Defaults to None (returns first page of results) ## Hubspot.CreateContact [Permalink for this section](https://docs.arcade.dev/mcp-servers/sales/hubspot\#hubspotcreatecontact) See Example > Create a contact associated with a company. **Parameters** - **company\_id** ( `integer`, required) The ID of the company to create the contact for. - **first\_name** ( `string`, required) The first name of the contact. - **last\_name** ( `string`, optional) The last name of the contact. - **email** ( `string`, optional) The email address of the contact. - **phone** ( `string`, optional) The phone number of the contact. - **mobile\_phone** ( `string`, optional) The mobile phone number of the contact. - **job\_title** ( `string`, optional) The job title of the contact. ## Hubspot.ListContacts [Permalink for this section](https://docs.arcade.dev/mcp-servers/sales/hubspot\#hubspotlistcontacts) See Example > List contacts with optional filtering by company ID or deal ID, with pagination support. **Parameters** - **limit** ( `integer`, optional) The maximum number of contacts to return. Defaults to 10. Max is 50. - **company\_id** ( `integer`, optional) Filter contacts by company ID. Defaults to None (no filtering). - **deal\_id** ( `integer`, optional) Filter contacts by deal ID. Defaults to None (no filtering). - **sort\_order** ( `Enum` [HubspotSortOrder](https://docs.arcade.dev/mcp-servers/sales/hubspot/reference#HubspotSortOrder), optional) Sort order for results. Defaults to LATEST\_MODIFIED. - **next\_page\_token** ( `string`, optional) The token to get the next page of results. Defaults to None (returns first page of results) ## Hubspot.GetDealDataByKeywords [Permalink for this section](https://docs.arcade.dev/mcp-servers/sales/hubspot\#hubspotgetdealdatabykeywords) See Example > Retrieve deal data with associated contacts, companies, calls, emails, **Parameters** - **keywords** ( `string`, required) The keywords to search for deals. It will match against the deal name and description. - **limit** ( `integer`, optional) The maximum number of deals to return. Defaults to 10. Max is 10. - **next\_page\_token** ( `string`, optional) The token to get the next page of results. Defaults to None (returns first page of results) ## Hubspot.CreateDeal [Permalink for this section](https://docs.arcade.dev/mcp-servers/sales/hubspot\#hubspotcreatedeal) See Example > Create a new deal in HubSpot. **Parameters** - **deal\_name** ( `string`, required) The deal name (required) - **deal\_amount** ( `number`, optional) The deal amount/value - **deal\_stage** ( `string`, optional) The deal stage - **deal\_type** ( `Enum` [HubspotDealType](https://docs.arcade.dev/mcp-servers/sales/hubspot/reference#HubspotDealType), optional) The deal type. - **expected\_close\_date** ( `string`, optional) Expected close date in YYYY-MM-DD format - **pipeline\_id** ( `string`, optional) Pipeline id. Use ‘default’ for default pipeline or pass a pipeline id (integer) - **deal\_owner** ( `string`, optional) The deal owner user ID - **priority\_level** ( `Enum` [HubspotDealPriority](https://docs.arcade.dev/mcp-servers/sales/hubspot/reference#HubspotDealPriority), optional) Priority level. - **deal\_description** ( `string`, optional) The deal description ## Hubspot.UpdateDealCloseDate [Permalink for this section](https://docs.arcade.dev/mcp-servers/sales/hubspot\#hubspotupdatedealclosedate) See Example > Update the expected close date of an existing deal in HubSpot. **Parameters** - **deal\_id** ( `integer`, required) The ID of the deal to update - **expected\_close\_date** ( `string`, required) New expected close date in YYYY-MM-DD format ## Hubspot.UpdateDealStage [Permalink for this section](https://docs.arcade.dev/mcp-servers/sales/hubspot\#hubspotupdatedealstage) See Example > Updates a deal’s stage, validating against the current pipeline if provided **Parameters** - **deal\_id** ( `integer`, required) The ID of the deal to update - **deal\_stage** ( `string`, required) New deal stage ID - **current\_pipeline\_id** ( `string`, optional) Current pipeline id for this deal, if already known (skips fetching the deal) - **allow\_pipeline\_change** ( `boolean`, optional) If true, allows changing the deal’s pipeline when the stage belongs to another pipeline ## Hubspot.GetDealById [Permalink for this section](https://docs.arcade.dev/mcp-servers/sales/hubspot\#hubspotgetdealbyid) See Example > Retrieve a specific deal by its ID from HubSpot. **Parameters** - **deal\_id** ( `integer`, required) The ID of the deal to retrieve ## Hubspot.AssociateContactToDeal [Permalink for this section](https://docs.arcade.dev/mcp-servers/sales/hubspot\#hubspotassociatecontacttodeal) See Example > Associate a contact with an existing deal in HubSpot. **Parameters** - **deal\_id** ( `integer`, required) The ID of the deal to associate the contact with - **contact\_id** ( `integer`, required) The ID of the contact to associate with the deal ## Hubspot.ListDeals [Permalink for this section](https://docs.arcade.dev/mcp-servers/sales/hubspot\#hubspotlistdeals) See Example > List deals with optional filtering by contact ID or company ID, with pagination support. **Parameters** - **limit** ( `integer`, optional) The maximum number of deals to return. Defaults to 10. Max is 50. - **contact\_id** ( `integer`, optional) Filter deals by contact ID. Defaults to None (no filtering). - **company\_id** ( `integer`, optional) Filter deals by company ID. Defaults to None (no filtering). - **sort\_order** ( `Enum` [HubspotSortOrder](https://docs.arcade.dev/mcp-servers/sales/hubspot/reference#HubspotSortOrder), optional) Sort order for results. Defaults to LATEST\_MODIFIED. - **next\_page\_token** ( `string`, optional) The token to get the next page of results. Defaults to None (returns first page of results) ## Hubspot.GetNoteDataByKeywords [Permalink for this section](https://docs.arcade.dev/mcp-servers/sales/hubspot\#hubspotgetnotedatabykeywords) See Example > Search for note activities by search terms in NOTE object properties. **Parameters** - **search\_terms** ( `string`, required) Search phrase or terms to find in NOTE properties. - **limit** ( `integer`, optional) The maximum number of notes to return. Defaults to 10. Max is 50. - **truncate\_big\_strings** ( `boolean`, optional) Whether to truncate string properties longer than 100 characters. Defaults to False. - **next\_page\_token** ( `string`, optional) The token to get the next page of results. Defaults to None (returns first page of results) ## Hubspot.GetCallDataByKeywords [Permalink for this section](https://docs.arcade.dev/mcp-servers/sales/hubspot\#hubspotgetcalldatabykeywords) See Example > Search for call activities by search terms in CALL object properties. **Parameters** - **search\_terms** ( `string`, required) Search phrase or terms to find in CALL properties. - **limit** ( `integer`, optional) The maximum number of calls to return. Defaults to 10. Max is 50. - **truncate\_big\_strings** ( `boolean`, optional) Whether to truncate string properties longer than 100 characters. Defaults to False. - **next\_page\_token** ( `string`, optional) The token to get the next page of results. Defaults to None (returns first page of results) ## Hubspot.GetEmailDataByKeywords [Permalink for this section](https://docs.arcade.dev/mcp-servers/sales/hubspot\#hubspotgetemaildatabykeywords) See Example > Search for email activities by search terms in EMAIL object properties. **Parameters** - **search\_terms** ( `string`, required) Search phrase or terms to find in EMAIL properties. - **limit** ( `integer`, optional) The maximum number of emails to return. Defaults to 10. Max is 50. - **truncate\_big\_strings** ( `boolean`, optional) Whether to truncate string properties longer than 100 characters. Defaults to False. - **next\_page\_token** ( `string`, optional) The token to get the next page of results. Defaults to None (returns first page of results) ## Hubspot.GetMeetingDataByKeywords [Permalink for this section](https://docs.arcade.dev/mcp-servers/sales/hubspot\#hubspotgetmeetingdatabykeywords) See Example > Search for meeting activities by search terms in MEETING object properties. **Parameters** - **search\_terms** ( `string`, required) Search phrase or terms to find in MEETING properties. - **limit** ( `integer`, optional) The maximum number of meetings to return. Defaults to 10. Max is 50. - **truncate\_big\_strings** ( `boolean`, optional) Whether to truncate string properties longer than 100 characters. Defaults to False. - **next\_page\_token** ( `string`, optional) The token to get the next page of results. Defaults to None (returns first page of results) ## Hubspot.GetTaskDataByKeywords [Permalink for this section](https://docs.arcade.dev/mcp-servers/sales/hubspot\#hubspotgettaskdatabykeywords) See Example > Search for task activities by search terms in TASK object properties. **Parameters** - **search\_terms** ( `string`, required) Search phrase or terms to find in TASK properties. - **limit** ( `integer`, optional) The maximum number of tasks to return. Defaults to 10. Max is 50. - **truncate\_big\_strings** ( `boolean`, optional) Whether to truncate string properties longer than 100 characters. Defaults to False. - **next\_page\_token** ( `string`, optional) The token to get the next page of results. Defaults to None (returns first page of results) ## Hubspot.GetCommunicationDataByKeywords [Permalink for this section](https://docs.arcade.dev/mcp-servers/sales/hubspot\#hubspotgetcommunicationdatabykeywords) See Example > Search for communication activities by search terms in COMMUNICATION object properties. **Parameters** - **search\_terms** ( `string`, required) Search phrase or terms to find in COMMUNICATION properties. - **limit** ( `integer`, optional) The maximum number of communications to return. Defaults to 10. Max is 50. - **truncate\_big\_strings** ( `boolean`, optional) Whether to truncate string properties longer than 100 characters. Defaults to False. - **next\_page\_token** ( `string`, optional) The token to get the next page of results. Defaults to None (returns first page of results) ## Hubspot.GetCompanyDataByKeywords [Permalink for this section](https://docs.arcade.dev/mcp-servers/sales/hubspot\#hubspotgetcompanydatabykeywords) See Example > Retrieve company data with associated contacts, deals, calls, emails, **Parameters** - **keywords** ( `string`, required) The keywords to search for companies. It will match against the company name, phone, and website. - **limit** ( `integer`, optional) The maximum number of companies to return. Defaults to 10. Max is 10. - **next\_page\_token** ( `string`, optional) The token to get the next page of results. Defaults to None (returns first page of results) ## Hubspot.CreateCompany [Permalink for this section](https://docs.arcade.dev/mcp-servers/sales/hubspot\#hubspotcreatecompany) See Example > Create a new company in HubSpot. **Parameters** - **company\_name** ( `string`, required) The company name (required) - **web\_domain** ( `string`, optional) The company web domain (e.g., example.com) - **industry\_type** ( `string`, optional) The company industry type (case-insensitive). - **company\_city** ( `string`, optional) The company city location - **company\_state** ( `string`, optional) The company state or province - **company\_country** ( `string`, optional) The company country - **phone\_number** ( `string`, optional) The company main phone number - **website\_url** ( `string`, optional) The company website URL ## Hubspot.ListCompanies [Permalink for this section](https://docs.arcade.dev/mcp-servers/sales/hubspot\#hubspotlistcompanies) See Example > List companies with pagination support. **Parameters** - **limit** ( `integer`, optional) The maximum number of companies to return. Defaults to 10. Max is 50. - **sort\_order** ( `Enum` [HubspotSortOrder](https://docs.arcade.dev/mcp-servers/sales/hubspot/reference#HubspotSortOrder), optional) Sort order for results. Defaults to LATEST\_MODIFIED. - **next\_page\_token** ( `string`, optional) The token to get the next page of results. Defaults to None (returns first page of results) ## Hubspot.GetAvailableIndustryTypes [Permalink for this section](https://docs.arcade.dev/mcp-servers/sales/hubspot\#hubspotgetavailableindustrytypes) See Example > Get all available industry types for HubSpot companies. **Parameters** This tool does not take any parameters. ## Hubspot.GetDealPipelines [Permalink for this section](https://docs.arcade.dev/mcp-servers/sales/hubspot\#hubspotgetdealpipelines) See Example > List HubSpot deal pipelines with their stages, optionally filtered by a search string. **Parameters** - **search** ( `string`, optional) Optional case-insensitive search string to filter pipelines by id or label ## Hubspot.GetDealPipelineStages [Permalink for this section](https://docs.arcade.dev/mcp-servers/sales/hubspot\#hubspotgetdealpipelinestages) See Example > List stages for a specific HubSpot deal pipeline. **Parameters** - **pipeline\_id** ( `string`, required) The pipeline id (e.g., ‘default’ or a pipeline GUID) ## Auth [Permalink for this section](https://docs.arcade.dev/mcp-servers/sales/hubspot\#auth) The Arcade Cloud Platform offers a default [Hubspot auth provider](https://docs.arcade.dev/home/auth-providers/hubspot). If you use it, there’s nothing to configure. Your users will see `Arcade` as the name of the application requesting permission. ## Get Building [Use tools hosted on Arcade Cloud\\ \\ Arcade tools are hosted by our cloud platform and ready to be used in your agents. Learn how.](https://docs.arcade.dev/home/quickstart) [Self Host Arcade tools\\ \\ Arcade tools can be self-hosted on your own infrastructure. Learn more about self-hosting.\\ \\ ```\\ pip install arcade_hubspot\\ ```](https://docs.arcade.dev/home/hosting-overview) [Youtube](https://docs.arcade.dev/mcp-servers/search/youtube "Youtube") [Reference](https://docs.arcade.dev/mcp-servers/sales/hubspot/reference "Reference") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Salesforce CRM Toolkit [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Sales](https://docs.arcade.dev/mcp-servers/sales/hubspot "Sales") Salesforce # Salesforce CRM At this time, Arcade does not offer a default Salesforce Auth Provider. To use Salesforce auth and toolkit, you must create a custom Auth Provider with your own Salesforce OAuth 2.0 credentials as documented in [Salesforce Auth Provider](https://docs.arcade.dev/home/auth-providers/salesforce). **Description:** Enable agents to interact with accounts, leads, contacts, etc in the Salesforce CRM. **Author:** Arcade **Auth:** OAuth 2.0 [![PyPI Version](https://img.shields.io/pypi/v/arcade_salesforce)](https://pypi.org/project/arcade_salesforce/)[![License](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/arcadeai/arcade-ai/blob/main/LICENSE)[![Python Versions](https://img.shields.io/pypi/pyversions/arcade_salesforce)](https://pypi.org/project/arcade_salesforce/)[![Wheel Status](https://img.shields.io/pypi/wheel/arcade_salesforce)](https://pypi.org/project/arcade_salesforce/)[![Downloads](https://img.shields.io/pypi/dm/arcade_salesforce)](https://pypi.org/project/arcade_salesforce/) The Arcade Salesforce CRM MCP Server provides a pre-built set of tools for interacting with Accounts, Leads, Contacts, etc in the Salesforce CRM. These tools make it easy to build agents and AI apps that can: - Search for Accounts and Contacts by keywords or retrieve them by ID - Read information about Accounts, such as company metadata, opportunities, deals, etc. - Read information about Contacts, such as name, email addresses, phone numbers, email messages, call logs, notes, meetings, tasks, etc. - Create contacts ## Install and Run the Arcade Engine [Permalink for this section](https://docs.arcade.dev/mcp-servers/sales/salesforce\#install-and-run-the-arcade-engine) At this time, you need to [self-host](https://docs.arcade.dev/home/auth-providers/salesforce) the Arcade Engine to use the Salesforce toolkit. Follow the step-by-step instructions in the [Salesforce Auth Provider](https://docs.arcade.dev/home/auth-providers/salesforce) page. ## Install [Permalink for this section](https://docs.arcade.dev/mcp-servers/sales/salesforce\#install) ```nextra-code pip install arcade_salesforce ``` ## Available Tools [Permalink for this section](https://docs.arcade.dev/mcp-servers/sales/salesforce\#available-tools) | Tool Name | Description | | --- | --- | | Salesforce.GetAccountDataByKeywords | Searches for accounts in Salesforce and returns them with related info: contacts, leads, notes, calls, opportunities, tasks, emails, and events. | | Salesforce.GetAccountDataByID | Gets the account with related info (contacts, leads, notes, calls, etc). | | Salesforce.CreateContact | Creates a contact in Salesforce associated with an account. | If you need to perform an action that’s not listed here, you can [get in touch\\ with us](mailto:contact@arcade.dev) to request a new tool, or [create your\\ own tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server). In order to use the Salesforce toolkit, you must [self-host the Arcade Engine](https://docs.arcade.dev/home/deployment/engine-configuration) and [configure the Salesforce auth provider](https://docs.arcade.dev/home/auth-providers/salesforce). The Arcade Engine is available at `http://localhost:9099` by default. In the code examples below, if necessary, adjust the `base_url` (in Python) or `baseURL` (in JavaScript) parameter in the `Arcade` client constructor to match your environment. ## Salesforce.GetAccountDataByKeywords [Permalink for this section](https://docs.arcade.dev/mcp-servers/sales/salesforce\#salesforcegetaccountdatabykeywords) See Example > Searches for accounts in Salesforce and returns them with related info: contacts, leads, notes, calls, opportunities, tasks, emails, and events (up to 10 items of each type). **Parameters** - **query** _(string, required)_ The query to search for accounts. MUST be longer than one character. It will match the keywords against all account fields, such as name, website, phone, address, etc. E.g. ‘Acme’. - **limit** _(int, optional, Defaults to `10`)_ The maximum number of accounts to return. Defaults to 10. Maximum allowed is 10. - **page** _(string, optional)_ The page number to return. Defaults to 1 (first page of results).” ## Salesforce.GetAccountDataByID [Permalink for this section](https://docs.arcade.dev/mcp-servers/sales/salesforce\#salesforcegetaccountdatabyid) See Example > Gets the account with related info: contacts, leads, notes, calls, opportunities, tasks, emails, and events (up to 10 items of each type). **Parameters** - **account\_id** _(string, required)_ The ID of the account to get data for. ## Salesforce.CreateContact [Permalink for this section](https://docs.arcade.dev/mcp-servers/sales/salesforce\#salesforcecreatecontact) See Example > Creates a contact in Salesforce associated with an account. **Parameters** - **account\_id** _(string, required)_ The ID of the account to create the contact for. - **first\_name** _(string, required)_ The first name of the contact. - **last\_name** _(string, required)_ The last name of the contact. - **email** _(string, required)_ The email address of the contact. - **phone** _(string, optional)_ The phone number of the contact. - **mobile\_phone** _(string, optional)_ The mobile phone number of the contact. - **title** _(string, optional)_ The title of the contact. E.g. ‘CEO’, ‘Sales Director’, ‘CTO’, etc. - **department** _(string, optional)_ The department of the contact. E.g. ‘Marketing’, ‘Sales’, ‘IT’, etc.”. - **description** _(string, optional)_ A description of the contact. ## Self-hosting the Arcade Engine with Salesforce Auth [Permalink for this section](https://docs.arcade.dev/mcp-servers/sales/salesforce\#self-hosting-the-arcade-engine-with-salesforce-auth) At this time, Arcade Cloud does not support Salesforce auth. In order to use the Salesforce toolkit (or develop custom tools for Salesforce), you have to [self-host the Arcade Engine](https://docs.arcade.dev/home/deployment/engine-configuration) and [configure the Salesforce auth provider](https://docs.arcade.dev/home/auth-providers/salesforce) in your engine configuration. [Reference](https://docs.arcade.dev/mcp-servers/sales/hubspot/reference "Reference") [Postgres](https://docs.arcade.dev/mcp-servers/databases/postgres "Postgres") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Custom Docker Worker Guide [Home](https://docs.arcade.dev/home "Home") [Serve tools](https://docs.arcade.dev/home/serve-tools/arcade-deploy "Serve tools") Docker # Build custom worker images with docker This guide shows you how to build a custom Worker image using Arcade’s base Worker image. It takes you through creating a Dockerfile, installing toolkits, and running the resulting container. ### Requirements [Permalink for this section](https://docs.arcade.dev/home/serve-tools/docker-worker\#requirements) - Docker installed on your machine ### Create your Dockerfile [Permalink for this section](https://docs.arcade.dev/home/serve-tools/docker-worker\#create-your-dockerfile) Create a Dockerfile in your project directory: ```nextra-code ARG VERSION=latest FROM ghcr.io/arcadeai/worker-base:${VERSION} # Copy the file that lists all your desired toolkits COPY toolkits.txt ./ # Install these toolkits RUN pip install -r toolkits.txt ``` With this Dockerfile, we start from the Arcade worker base image, copy in a file named toolkits.txt, and install each toolkit listed there. * * * ## List Your Toolkits [Permalink for this section](https://docs.arcade.dev/home/serve-tools/docker-worker\#list-your-toolkits) Create a file named toolkits.txt in the same directory. Add the toolkits you want installed: ```nextra-code arcade-google arcade-firecrawl arcade-zoom ``` Adjust this file as needed. Each line in toolkits.txt should specify a Python package name and version. * * * ## 3\. Build the Image [Permalink for this section](https://docs.arcade.dev/home/serve-tools/docker-worker\#3-build-the-image) From the directory containing the Dockerfile and toolkits.txt, run: ```nextra-code docker build -t custom-worker:0.1.0 . ``` This command creates a Docker image named custom-worker with the tag 0.1.0 using the instructions in your Dockerfile. * * * ## Run the Worker [Permalink for this section](https://docs.arcade.dev/home/serve-tools/docker-worker\#run-the-worker) To start the worker container: ```nextra-code docker run -p 8002:8002 \ -e ARCADE_WORKER_SECRET="your_secret_here" \ custom-worker:0.1.0 ``` Replace “your\_secret\_here” with a secret of your choice. Your engine will need access to this secret to call your worker. The worker will be accessible on port 8002 of your local machine. * * * ## Next Steps [Permalink for this section](https://docs.arcade.dev/home/serve-tools/docker-worker\#next-steps) - Set environment variables (like ARCADE\_WORKER\_SECRET) securely for production use. - Deploy your container to a suitable environment (Docker Swarm, Kubernetes, or another container orchestration platform). Happy coding with Arcade! [Arcade Deploy](https://docs.arcade.dev/home/serve-tools/arcade-deploy "Arcade Deploy") [Modal](https://docs.arcade.dev/home/serve-tools/modal-worker "Modal") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Google Shopping Search [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Search Tools](https://docs.arcade.dev/mcp-servers/search/google_finance "Search Tools") Google Shopping # Google Shopping Search **Description:** Enable agents to search for products with Google Shopping. **Author:** Arcade **Auth:** API Key [![PyPI Version](https://img.shields.io/pypi/v/arcade_google-shopping)](https://pypi.org/project/arcade_google-shopping/)[![License](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/arcadeai/arcade-ai/blob/main/LICENSE)[![Python Versions](https://img.shields.io/pypi/pyversions/arcade_google-shopping)](https://pypi.org/project/arcade_google-shopping/)[![Wheel Status](https://img.shields.io/pypi/wheel/arcade_google-shopping)](https://pypi.org/project/arcade_google-shopping/)[![Downloads](https://img.shields.io/pypi/dm/arcade_google-shopping)](https://pypi.org/project/arcade_google-shopping/) The Arcade Google Shopping Search MCP Server provides a pre-built set of tools for interacting with Google Shopping. These tools make it easy to build agents and AI apps that can: - Search for products on Google Shopping; ## Available Tools [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/google_shopping\#available-tools) | Tool Name | Description | | --- | --- | | GoogleShopping.SearchProducts | Search for products on Google Shopping. | If you need to perform an action that’s not listed here, you can [get in touch\\ with us](mailto:contact@arcade.dev) to request a new tool, or [create your\\ own tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server). ## GoogleShopping.SearchProducts [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/google_shopping\#googleshoppingsearchproducts) See Example > Search for products on Google Shopping. **Parameters** - **keywords** _(string, required)_ Keywords to search for. E.g. ‘apple iphone’ or ‘samsung galaxy’ - **`country_code`** _(string, optional, Defaults to ‘us’ United States)_ 2-character country code to use in the Google Shopping search. A list of supported country codes can be found [here](https://docs.arcade.dev/mcp-servers/search/google_shopping#countrycodes). - **`language_code`** _(string, optional, Defaults to ‘en’ English)_ 2-character language code to use in the Google Shopping search. A list of supported language codes can be found [here](https://docs.arcade.dev/mcp-servers/search/google_shopping#languagecodes). ## Auth [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/google_shopping\#auth) The Arcade Google Shopping Search toolkit uses the [SerpAPI](https://serpapi.com/) to get product information from Google Shopping. - **Secret:** - `SERP_API_KEY`: Your SerpAPI API key. Setting the `SERP_API_KEY` secret is only required if you are [self-hosting](https://docs.arcade.dev/home/deployment/engine-configuration) Arcade. If you’re using Arcade Cloud, the secret is already set for you. To manage your secrets, go to the [Secrets page](https://api.arcade.dev/dashboard/auth/secrets) in the Arcade Dashboard. ## Default parameter values [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/google_shopping\#default-parameter-values) Language and Country are configurable through environment variables. When set, they will be used as default for YouTube tools. Providing a different value as `language_code` or `country_code` argument in a tool call will override the default value set in the environment variables. **Language** The language code is a 2-character code that determines the language in which the API will search and return video information. There are two environment variables: - `ARCADE_GOOGLE_LANGUAGE`: a default value for all Google Search tools. If not set, defaults to ‘en’ (English). - `ARCADE_GOOGLE_SHOPPING_LANGUAGE`: a default value for the Google Shopping Search tools. If not set, defaults to `ARCADE_GOOGLE_LANGUAGE`. A list of supported language codes can be found [here](https://docs.arcade.dev/mcp-servers/search/google_shopping#languagecodes). **Country** The country code is a 2-character code that determines the country in which the API will search for videos: - `ARCADE_GOOGLE_COUNTRY`: a default value for all Google Search tools. If not set, defaults to `None`. - `ARCADE_GOOGLE_SHOPPING_COUNTRY`: a default value for the Google Shopping Search tools. If not set, defaults to `ARCADE_GOOGLE_COUNTRY`. If `ARCADE_GOOGLE_COUNTRY` is not set, the default country for Google Shopping tools will be `us` (United States). A list of supported country codes can be found [here](https://docs.arcade.dev/mcp-servers/search/google_shopping#countrycodes). * * * ## Reference [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/google_shopping\#reference) ## LanguageCodes [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/google_shopping\#languagecodes) - **`ar`**: Arabic - **`bn`**: Bengali - **`da`**: Danish - **`de`**: German - **`el`**: Greek - **`en`**: English - **`es`**: Spanish - **`fi`**: Finnish - **`fr`**: French - **`hi`**: Hindi - **`hu`**: Hungarian - **`id`**: Indonesian - **`it`**: Italian - **`ja`**: Japanese - **`ko`**: Korean - **`ms`**: Malay - **`nl`**: Dutch - **`no`**: Norwegian - **`pcm`**: Nigerian Pidgin - **`pl`**: Polish - **`pt`**: Portuguese - **`pt-br`**: Portuguese (Brazil) - **`pt-pt`**: Portuguese (Portugal) - **`ru`**: Russian - **`sv`**: Swedish - **`tl`**: Filipino - **`tr`**: Turkish - **`uk`**: Ukrainian - **`zh`**: Chinese - **`zh-cn`**: Chinese (Simplified) - **`zh-tw`**: Chinese (Traditional) ## CountryCodes [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/google_shopping\#countrycodes) - **`af`**: Afghanistan - **`al`**: Albania - **`dz`**: Algeria - **`as`**: American Samoa - **`ad`**: Andorra - **`ao`**: Angola - **`ai`**: Anguilla - **`aq`**: Antarctica - **`ag`**: Antigua and Barbuda - **`ar`**: Argentina - **`am`**: Armenia - **`aw`**: Aruba - **`au`**: Australia - **`at`**: Austria - **`az`**: Azerbaijan - **`bs`**: Bahamas - **`bh`**: Bahrain - **`bd`**: Bangladesh - **`bb`**: Barbados - **`by`**: Belarus - **`be`**: Belgium - **`bz`**: Belize - **`bj`**: Benin - **`bm`**: Bermuda - **`bt`**: Bhutan - **`bo`**: Bolivia - **`ba`**: Bosnia and Herzegovina - **`bw`**: Botswana - **`bv`**: Bouvet Island - **`br`**: Brazil - **`io`**: British Indian Ocean Territory - **`bn`**: Brunei Darussalam - **`bg`**: Bulgaria - **`bf`**: Burkina Faso - **`bi`**: Burundi - **`kh`**: Cambodia - **`cm`**: Cameroon - **`ca`**: Canada - **`cv`**: Cape Verde - **`ky`**: Cayman Islands - **`cf`**: Central African Republic - **`td`**: Chad - **`cl`**: Chile - **`cn`**: China - **`cx`**: Christmas Island - **`cc`**: Cocos (Keeling) Islands - **`co`**: Colombia - **`km`**: Comoros - **`cg`**: Congo - **`cd`**: Congo, the Democratic Republic of the - **`ck`**: Cook Islands - **`cr`**: Costa Rica - **`ci`**: Cote D’ivoire - **`hr`**: Croatia - **`cu`**: Cuba - **`cy`**: Cyprus - **`cz`**: Czech Republic - **`dk`**: Denmark - **`dj`**: Djibouti - **`dm`**: Dominica - **`do`**: Dominican Republic - **`ec`**: Ecuador - **`eg`**: Egypt - **`sv`**: El Salvador - **`gq`**: Equatorial Guinea - **`er`**: Eritrea - **`ee`**: Estonia - **`et`**: Ethiopia - **`fk`**: Falkland Islands (Malvinas) - **`fo`**: Faroe Islands - **`fj`**: Fiji - **`fi`**: Finland - **`fr`**: France - **`gf`**: French Guiana - **`pf`**: French Polynesia - **`tf`**: French Southern Territories - **`ga`**: Gabon - **`gm`**: Gambia - **`ge`**: Georgia - **`de`**: Germany - **`gh`**: Ghana - **`gi`**: Gibraltar - **`gr`**: Greece - **`gl`**: Greenland - **`gd`**: Grenada - **`gp`**: Guadeloupe - **`gu`**: Guam - **`gt`**: Guatemala - **`gg`**: Guernsey - **`gn`**: Guinea - **`gw`**: Guinea-Bissau - **`gy`**: Guyana - **`ht`**: Haiti - **`hm`**: Heard Island and Mcdonald Islands - **`va`**: Holy See (Vatican City State) - **`hn`**: Honduras - **`hk`**: Hong Kong - **`hu`**: Hungary - **`is`**: Iceland - **`in`**: India - **`id`**: Indonesia - **`ir`**: Iran, Islamic Republic of - **`iq`**: Iraq - **`ie`**: Ireland - **`im`**: Isle of Man - **`il`**: Israel - **`it`**: Italy - **`je`**: Jersey - **`jm`**: Jamaica - **`jp`**: Japan - **`jo`**: Jordan - **`kz`**: Kazakhstan - **`ke`**: Kenya - **`ki`**: Kiribati - **`kp`**: Korea, Democratic People’s Republic of - **`kr`**: Korea, Republic of - **`kw`**: Kuwait - **`kg`**: Kyrgyzstan - **`la`**: Lao People’s Democratic Republic - **`lv`**: Latvia - **`lb`**: Lebanon - **`ls`**: Lesotho - **`lr`**: Liberia - **`ly`**: Libyan Arab Jamahiriya - **`li`**: Liechtenstein - **`lt`**: Lithuania - **`lu`**: Luxembourg - **`mo`**: Macao - **`mk`**: Macedonia, the Former Yugosalv Republic of - **`mg`**: Madagascar - **`mw`**: Malawi - **`my`**: Malaysia - **`mv`**: Maldives - **`ml`**: Mali - **`mt`**: Malta - **`mh`**: Marshall Islands - **`mq`**: Martinique - **`mr`**: Mauritania - **`mu`**: Mauritius - **`yt`**: Mayotte - **`mx`**: Mexico - **`fm`**: Micronesia, Federated States of - **`md`**: Moldova, Republic of - **`mc`**: Monaco - **`mn`**: Mongolia - **`me`**: Montenegro - **`ms`**: Montserrat - **`ma`**: Morocco - **`mz`**: Mozambique - **`mm`**: Myanmar - **`na`**: Namibia - **`nr`**: Nauru - **`np`**: Nepal - **`nl`**: Netherlands - **`an`**: Netherlands Antilles - **`nc`**: New Caledonia - **`nz`**: New Zealand - **`ni`**: Nicaragua - **`ne`**: Niger - **`ng`**: Nigeria - **`nu`**: Niue - **`nf`**: Norfolk Island - **`mp`**: Northern Mariana Islands - **`no`**: Norway - **`om`**: Oman - **`pk`**: Pakistan - **`pw`**: Palau - **`ps`**: Palestinian Territory, Occupied - **`pa`**: Panama - **`pg`**: Papua New Guinea - **`py`**: Paraguay - **`pe`**: Peru - **`ph`**: Philippines - **`pn`**: Pitcairn - **`pl`**: Poland - **`pt`**: Portugal - **`pr`**: Puerto Rico - **`qa`**: Qatar - **`re`**: Reunion - **`ro`**: Romania - **`ru`**: Russian Federation - **`rw`**: Rwanda - **`sh`**: Saint Helena - **`kn`**: Saint Kitts and Nevis - **`lc`**: Saint Lucia - **`pm`**: Saint Pierre and Miquelon - **`vc`**: Saint Vincent and the Grenadines - **`ws`**: Samoa - **`sm`**: San Marino - **`st`**: Sao Tome and Principe - **`sa`**: Saudi Arabia - **`sn`**: Senegal - **`rs`**: Serbia - **`sc`**: Seychelles - **`sl`**: Sierra Leone - **`sg`**: Singapore - **`sk`**: Slovakia - **`si`**: Slovenia - **`sb`**: Solomon Islands - **`so`**: Somalia - **`za`**: South Africa - **`gs`**: South Georgia and the South Sandwich Islands - **`es`**: Spain - **`lk`**: Sri Lanka - **`sd`**: Sudan - **`sr`**: Suriname - **`sj`**: Svalbard and Jan Mayen - **`sz`**: Swaziland - **`se`**: Sweden - **`ch`**: Switzerland - **`sy`**: Syrian Arab Republic - **`tw`**: Taiwan, Province of China - **`tj`**: Tajikistan - **`tz`**: Tanzania, United Republic of - **`th`**: Thailand - **`tl`**: Timor-Leste - **`tg`**: Togo - **`tk`**: Tokelau - **`to`**: Tonga - **`tt`**: Trinidad and Tobago - **`tn`**: Tunisia - **`tr`**: Turkiye - **`tm`**: Turkmenistan - **`tc`**: Turks and Caicos Islands - **`tv`**: Tuvalu - **`ug`**: Uganda - **`ua`**: Ukraine - **`ae`**: United Arab Emirates - **`uk`**: United Kingdom - **`gb`**: United Kingdom - **`us`**: United States - **`um`**: United States Minor Outlying Islands - **`uy`**: Uruguay - **`uz`**: Uzbekistan - **`vu`**: Vanuatu - **`ve`**: Venezuela - **`vn`**: Viet Nam - **`vg`**: Virgin Islands, British - **`vi`**: Virgin Islands, U.S. - **`wf`**: Wallis and Futuna - **`eh`**: Western Sahara - **`ye`**: Yemen - **`zm`**: Zambia - **`zw`**: Zimbabwe ## Get Building [Use tools hosted on Arcade Cloud\\ \\ Arcade tools are hosted by our cloud platform and ready to be used in your agents. Learn how.](https://docs.arcade.dev/home/quickstart) [Self Host Arcade tools\\ \\ Arcade tools can be self-hosted on your own infrastructure. Learn more about self-hosting.\\ \\ ```\\ pip install arcade_google_shopping\\ ```](https://docs.arcade.dev/home/hosting-overview) [Google Search](https://docs.arcade.dev/mcp-servers/search/google_search "Google Search") [Walmart](https://docs.arcade.dev/mcp-servers/search/walmart "Walmart") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Arcade Twilio Toolkit [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Social & Communication](https://docs.arcade.dev/mcp-servers/social-communication/discord "Social & Communication") TwilioReadme # Arcade Twilio A handy toolkit for easily sending SMS and WhatsApp messages with Twilio. ## Features [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/twilio/readme\#features) - Send SMS messages via Twilio - Send WhatsApp messages via Twilio - Built for Arcade integration ## Prerequisites [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/twilio/readme\#prerequisites) A Twilio account with: - Account SID - API Key SID - API Key Secret - A Twilio phone number - WhatsApp enabled on your Twilio number (for WhatsApp functionality) To set up your Twilio account and acquire the required credentials, please refer to the Twilio documentation: [Create an API Key](https://www.twilio.com/docs/iam/api-keys#create-an-api-key). This guide will walk you through the process of creating an account and generating the necessary API keys. ## Configuration [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/twilio/readme\#configuration) By default, the configuration is loaded from an `engine.env` file in your project root, but you can specify a different file if needed. Ensure the file contains the following variables: ```nextra-code TWILIO_ACCOUNT_SID=your_account_sid TWILIO_API_KEY_SID=your_api_key_sid TWILIO_API_KEY_SECRET=your_api_key_secret TWILIO_PHONE_NUMBER=your_twilio_phone_number MY_PHONE_NUMBER=your_personal_phone_number ``` ## Usage Examples [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/twilio/readme\#usage-examples) Explore the versatility of this toolkit with the following example prompts: - **📩 Send an SMS to your personal number:** _Prompt:_ “Send an SMS to my number saying ‘Hello from Arcade!’” - **💬 Dispatch a WhatsApp message:** _Prompt:_ “Send a WhatsApp message to +19999999999 with the top 10 movies of all time.” - **⏰ Schedule a reminder SMS:** _Prompt:_ “Send an SMS to my number reminding me about the meeting at 3 PM tomorrow.” - **💡 Share a motivational quote via WhatsApp:** _Prompt:_ “Send a WhatsApp message to +19999999999 with the quote ‘The only way to do great work is to love what you do. - Steve Jobs’” - **🌤️ Provide a weather update via SMS:** _Prompt:_ “Send an SMS to +19999999999 with today’s weather forecast for New York City.” - **🎉 Send a birthday greeting via WhatsApp:** _Prompt:_ “Send a WhatsApp message to +19999999999 saying ‘Happy Birthday! Hope you have a fantastic day!’” [Reference](https://docs.arcade.dev/mcp-servers/social-communication/slack/reference "Reference") [Reference](https://docs.arcade.dev/mcp-servers/social-communication/twilio/reference "Reference") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Google Maps Toolkit [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Search Tools](https://docs.arcade.dev/mcp-servers/search/google_finance "Search Tools") Google Maps # Google Maps **Description:** Enable agents to get directions between two locations with Google Maps. **Author:** Arcade **Auth:** API Key [![PyPI Version](https://img.shields.io/pypi/v/arcade_google-maps)](https://pypi.org/project/arcade_google-maps/)[![License](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/arcadeai/arcade-ai/blob/main/LICENSE)[![Python Versions](https://img.shields.io/pypi/pyversions/arcade_google-maps)](https://pypi.org/project/arcade_google-maps/)[![Wheel Status](https://img.shields.io/pypi/wheel/arcade_google-maps)](https://pypi.org/project/arcade_google-maps/)[![Downloads](https://img.shields.io/pypi/dm/arcade_google-maps)](https://pypi.org/project/arcade_google-maps/) The Arcade Google Maps MCP Server provides a pre-built set of tools for interacting with Google Maps. These tools make it easy to build agents and AI apps that can: - Get directions to a location using an address or latitude/longitude. ## Available Tools [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/google_maps\#available-tools) | Tool Name | Description | | --- | --- | | GoogleMaps.GetDirectionsBetweenAddresses | Get directions between two addresses. | | GoogleMaps.GetDirectionsBetweenCoordinates | Get directions between two latitude/longitude coordinates. | If you need to perform an action that’s not listed here, you can [get in touch\\ with us](mailto:contact@arcade.dev) to request a new tool, or [create your\\ own tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server). ## GoogleMaps.GetDirectionsBetweenAddresses [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/google_maps\#googlemapsgetdirectionsbetweenaddresses) See Example > Get directions between two addresses. **Parameters** - **`origin_address`** _(string, required)_ The origin address. Example: ‘123 Main St, New York, NY 10001’. - **`destination_address`** _(string, required)_ The destination address. Example: ‘456 Main St, New York, NY 10001’. - **`language`** _(string, optional, Defaults to ‘en’ English)_ 2-character language code to use in the Google Maps search. A list of supported language codes can be found [here](https://docs.arcade.dev/mcp-servers/search/google_maps#languagecodes). - **`country`** _(string, optional, Defaults to `None`)_ 2-character country code to use in the Google Maps search. A list of supported country codes can be found [here](https://docs.arcade.dev/mcp-servers/search/google_maps#countrycodes). - **`distance_unit`** _(enum ( [GoogleMapsDistanceUnit](https://docs.arcade.dev/mcp-servers/search/google_maps#googlemapsdistanceunit)), optional, Defaults to `GoogleMapsDistanceUnit.KM`)_ Distance unit to use in the Google Maps search. - **`travel_mode`** _(enum ( [GoogleMapsTravelMode](https://docs.arcade.dev/mcp-servers/search/google_maps#googlemapstravelmode)), optional, Defaults to `GoogleMapsTravelMode.BEST`)_ Travel mode to use in the Google Maps search. ## GoogleMaps.GetDirectionsBetweenCoordinates [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/google_maps\#googlemapsgetdirectionsbetweencoordinates) See Example > Get directions between two latitude/longitude coordinates. **Parameters** - **`origin_latitude`** _(float, required)_ The origin latitude. - **`origin_longitude`** _(float, required)_ The origin longitude. - **`destination_latitude`** _(float, required)_ The destination latitude. - **`destination_longitude`** _(float, required)_ The destination longitude. - **`language`** _(string, optional, Defaults to ‘en’ English)_ 2-character language code to use in the Google Maps search. A list of supported language codes can be found [here](https://docs.arcade.dev/mcp-servers/search/google_maps#languagecodes). - **`country`** _(string, optional, Defaults to `None`)_ 2-character country code to use in the Google Maps search. A list of supported country codes can be found [here](https://docs.arcade.dev/mcp-servers/search/google_maps#countrycodes). - **`distance_unit`** _(enum ( [GoogleMapsDistanceUnit](https://docs.arcade.dev/mcp-servers/search/google_maps#googlemapsdistanceunit)), optional, Defaults to `GoogleMapsDistanceUnit.KM`)_ Distance unit to use in the Google Maps search. - **`travel_mode`** _(enum ( [GoogleMapsTravelMode](https://docs.arcade.dev/mcp-servers/search/google_maps#googlemapstravelmode)), optional, Defaults to `GoogleMapsTravelMode.BEST`)_ Travel mode to use in the Google Maps search. ## Auth [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/google_maps\#auth) The Arcade Google Maps toolkit uses the [SerpAPI](https://serpapi.com/) to get directions. - **Secret:** - `SERP_API_KEY`: Your SerpAPI API key. Setting the `SERP_API_KEY` secret is only required if you are [self-hosting](https://docs.arcade.dev/home/deployment/engine-configuration) Arcade. If you’re using Arcade Cloud, the secret is already set for you. To manage your secrets, go to the [Secrets page](https://api.arcade.dev/dashboard/auth/secrets) in the Arcade Dashboard. ## Default parameters [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/google_maps\#default-parameters) Language, Country, Distance Unit, and Travel Mode are configurable through environment variables. When set, they will be used as default for Google Maps tools. Providing a different value as `language`, `country`, `distance_unit`, or `travel_mode` argument in a tool call will override the default value. **Language** The language code is a 2-character code that determines the language in which the API will search and return directions. There are two environment variables: - `ARCADE_GOOGLE_LANGUAGE`: a default value for all Google tools. If not set, defaults to ‘en’ (English). - `ARCADE_GOOGLE_MAPS_LANGUAGE`: a default value for the Google Maps tools. If not set, defaults to `ARCADE_GOOGLE_LANGUAGE`. A list of supported language codes can be found [here](https://docs.arcade.dev/mcp-servers/search/google_maps#languagecodes). **Country** The country code is a 2-character code that determines the country in which the API will search for directions: - `ARCADE_GOOGLE_MAPS_COUNTRY`: a default value for the Google Maps tools. If not set, defaults to `None`. A list of supported country codes can be found [here](https://docs.arcade.dev/mcp-servers/search/google_maps#countrycodes). **Distance Unit** The distance unit is a string that determines the unit of distance to use in the Google Maps search: - `ARCADE_GOOGLE_MAPS_DISTANCE_UNIT`: a default value for the Google Maps tools. If not set, defaults to `GoogleMapsDistanceUnit.KM`. A list of supported distance units can be found [here](https://docs.arcade.dev/mcp-servers/search/google_maps#googlemapsdistanceunit). **Travel Mode** The travel mode is a string that determines the mode of travel to use in the Google Maps search: - `ARCADE_GOOGLE_MAPS_TRAVEL_MODE`: a default value for the Google Maps tools. If not set, defaults to `GoogleMapsTravelMode.BEST`. A list of supported travel modes can be found [here](https://docs.arcade.dev/mcp-servers/search/google_maps#googlemapstravelmode). - **Secret:** - `SERP_API_KEY`: Your SerpAPI API key. Setting the `SERP_API_KEY` secret is only required if you are [self-hosting](https://docs.arcade.dev/home/deployment/engine-configuration) Arcade. If you’re using Arcade Cloud, the secret is already set for you. To manage your secrets, go to the [Secrets page](https://api.arcade.dev/dashboard/auth/secrets) in the Arcade Dashboard. * * * ## Reference [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/google_maps\#reference) ### GoogleMapsDistanceUnit [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/google_maps\#googlemapsdistanceunit) Distance unit to use in the Google Maps search. - **`KM`**: Kilometers. - **`MI`**: Miles. ### GoogleMapsTravelMode [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/google_maps\#googlemapstravelmode) Travel mode to use in the Google Maps search. - **`BEST`**: Best mode. - **`DRIVING`**: Driving mode. - **`MOTORCYCLE`**: Motorcycle mode. - **`PUBLIC_TRANSPORTATION`**: Public transportation mode. - **`WALKING`**: Walking mode. - **`BICYCLE`**: Bicycling mode. - **`FLIGHT`**: Flight mode. ### LanguageCodes [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/google_maps\#languagecodes) - **`ar`**: Arabic - **`bn`**: Bengali - **`da`**: Danish - **`de`**: German - **`el`**: Greek - **`en`**: English - **`es`**: Spanish - **`fi`**: Finnish - **`fr`**: French - **`hi`**: Hindi - **`hu`**: Hungarian - **`id`**: Indonesian - **`it`**: Italian - **`ja`**: Japanese - **`ko`**: Korean - **`ms`**: Malay - **`nl`**: Dutch - **`no`**: Norwegian - **`pcm`**: Nigerian Pidgin - **`pl`**: Polish - **`pt`**: Portuguese - **`pt-br`**: Portuguese (Brazil) - **`pt-pt`**: Portuguese (Portugal) - **`ru`**: Russian - **`sv`**: Swedish - **`tl`**: Filipino - **`tr`**: Turkish - **`uk`**: Ukrainian - **`zh`**: Chinese - **`zh-cn`**: Chinese (Simplified) - **`zh-tw`**: Chinese (Traditional) ### CountryCodes [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/google_maps\#countrycodes) - **`af`**: Afghanistan - **`al`**: Albania - **`dz`**: Algeria - **`as`**: American Samoa - **`ad`**: Andorra - **`ao`**: Angola - **`ai`**: Anguilla - **`aq`**: Antarctica - **`ag`**: Antigua and Barbuda - **`ar`**: Argentina - **`am`**: Armenia - **`aw`**: Aruba - **`au`**: Australia - **`at`**: Austria - **`az`**: Azerbaijan - **`bs`**: Bahamas - **`bh`**: Bahrain - **`bd`**: Bangladesh - **`bb`**: Barbados - **`by`**: Belarus - **`be`**: Belgium - **`bz`**: Belize - **`bj`**: Benin - **`bm`**: Bermuda - **`bt`**: Bhutan - **`bo`**: Bolivia - **`ba`**: Bosnia and Herzegovina - **`bw`**: Botswana - **`bv`**: Bouvet Island - **`br`**: Brazil - **`io`**: British Indian Ocean Territory - **`bn`**: Brunei Darussalam - **`bg`**: Bulgaria - **`bf`**: Burkina Faso - **`bi`**: Burundi - **`kh`**: Cambodia - **`cm`**: Cameroon - **`ca`**: Canada - **`cv`**: Cape Verde - **`ky`**: Cayman Islands - **`cf`**: Central African Republic - **`td`**: Chad - **`cl`**: Chile - **`cn`**: China - **`cx`**: Christmas Island - **`cc`**: Cocos (Keeling) Islands - **`co`**: Colombia - **`km`**: Comoros - **`cg`**: Congo - **`cd`**: Congo, the Democratic Republic of the - **`ck`**: Cook Islands - **`cr`**: Costa Rica - **`ci`**: Cote D’ivoire - **`hr`**: Croatia - **`cu`**: Cuba - **`cy`**: Cyprus - **`cz`**: Czech Republic - **`dk`**: Denmark - **`dj`**: Djibouti - **`dm`**: Dominica - **`do`**: Dominican Republic - **`ec`**: Ecuador - **`eg`**: Egypt - **`sv`**: El Salvador - **`gq`**: Equatorial Guinea - **`er`**: Eritrea - **`ee`**: Estonia - **`et`**: Ethiopia - **`fk`**: Falkland Islands (Malvinas) - **`fo`**: Faroe Islands - **`fj`**: Fiji - **`fi`**: Finland - **`fr`**: France - **`gf`**: French Guiana - **`pf`**: French Polynesia - **`tf`**: French Southern Territories - **`ga`**: Gabon - **`gm`**: Gambia - **`ge`**: Georgia - **`de`**: Germany - **`gh`**: Ghana - **`gi`**: Gibraltar - **`gr`**: Greece - **`gl`**: Greenland - **`gd`**: Grenada - **`gp`**: Guadeloupe - **`gu`**: Guam - **`gt`**: Guatemala - **`gg`**: Guernsey - **`gn`**: Guinea - **`gw`**: Guinea-Bissau - **`gy`**: Guyana - **`ht`**: Haiti - **`hm`**: Heard Island and Mcdonald Islands - **`va`**: Holy See (Vatican City State) - **`hn`**: Honduras - **`hk`**: Hong Kong - **`hu`**: Hungary - **`is`**: Iceland - **`in`**: India - **`id`**: Indonesia - **`ir`**: Iran, Islamic Republic of - **`iq`**: Iraq - **`ie`**: Ireland - **`im`**: Isle of Man - **`il`**: Israel - **`it`**: Italy - **`je`**: Jersey - **`jm`**: Jamaica - **`jp`**: Japan - **`jo`**: Jordan - **`kz`**: Kazakhstan - **`ke`**: Kenya - **`ki`**: Kiribati - **`kp`**: Korea, Democratic People’s Republic of - **`kr`**: Korea, Republic of - **`kw`**: Kuwait - **`kg`**: Kyrgyzstan - **`la`**: Lao People’s Democratic Republic - **`lv`**: Latvia - **`lb`**: Lebanon - **`ls`**: Lesotho - **`lr`**: Liberia - **`ly`**: Libyan Arab Jamahiriya - **`li`**: Liechtenstein - **`lt`**: Lithuania - **`lu`**: Luxembourg - **`mo`**: Macao - **`mk`**: Macedonia, the Former Yugosalv Republic of - **`mg`**: Madagascar - **`mw`**: Malawi - **`my`**: Malaysia - **`mv`**: Maldives - **`ml`**: Mali - **`mt`**: Malta - **`mh`**: Marshall Islands - **`mq`**: Martinique - **`mr`**: Mauritania - **`mu`**: Mauritius - **`yt`**: Mayotte - **`mx`**: Mexico - **`fm`**: Micronesia, Federated States of - **`md`**: Moldova, Republic of - **`mc`**: Monaco - **`mn`**: Mongolia - **`me`**: Montenegro - **`ms`**: Montserrat - **`ma`**: Morocco - **`mz`**: Mozambique - **`mm`**: Myanmar - **`na`**: Namibia - **`nr`**: Nauru - **`np`**: Nepal - **`nl`**: Netherlands - **`an`**: Netherlands Antilles - **`nc`**: New Caledonia - **`nz`**: New Zealand - **`ni`**: Nicaragua - **`ne`**: Niger - **`ng`**: Nigeria - **`nu`**: Niue - **`nf`**: Norfolk Island - **`mp`**: Northern Mariana Islands - **`no`**: Norway - **`om`**: Oman - **`pk`**: Pakistan - **`pw`**: Palau - **`ps`**: Palestinian Territory, Occupied - **`pa`**: Panama - **`pg`**: Papua New Guinea - **`py`**: Paraguay - **`pe`**: Peru - **`ph`**: Philippines - **`pn`**: Pitcairn - **`pl`**: Poland - **`pt`**: Portugal - **`pr`**: Puerto Rico - **`qa`**: Qatar - **`re`**: Reunion - **`ro`**: Romania - **`ru`**: Russian Federation - **`rw`**: Rwanda - **`sh`**: Saint Helena - **`kn`**: Saint Kitts and Nevis - **`lc`**: Saint Lucia - **`pm`**: Saint Pierre and Miquelon - **`vc`**: Saint Vincent and the Grenadines - **`ws`**: Samoa - **`sm`**: San Marino - **`st`**: Sao Tome and Principe - **`sa`**: Saudi Arabia - **`sn`**: Senegal - **`rs`**: Serbia - **`sc`**: Seychelles - **`sl`**: Sierra Leone - **`sg`**: Singapore - **`sk`**: Slovakia - **`si`**: Slovenia - **`sb`**: Solomon Islands - **`so`**: Somalia - **`za`**: South Africa - **`gs`**: South Georgia and the South Sandwich Islands - **`es`**: Spain - **`lk`**: Sri Lanka - **`sd`**: Sudan - **`sr`**: Suriname - **`sj`**: Svalbard and Jan Mayen - **`sz`**: Swaziland - **`se`**: Sweden - **`ch`**: Switzerland - **`sy`**: Syrian Arab Republic - **`tw`**: Taiwan, Province of China - **`tj`**: Tajikistan - **`tz`**: Tanzania, United Republic of - **`th`**: Thailand - **`tl`**: Timor-Leste - **`tg`**: Togo - **`tk`**: Tokelau - **`to`**: Tonga - **`tt`**: Trinidad and Tobago - **`tn`**: Tunisia - **`tr`**: Turkiye - **`tm`**: Turkmenistan - **`tc`**: Turks and Caicos Islands - **`tv`**: Tuvalu - **`ug`**: Uganda - **`ua`**: Ukraine - **`ae`**: United Arab Emirates - **`uk`**: United Kingdom - **`gb`**: United Kingdom - **`us`**: United States - **`um`**: United States Minor Outlying Islands - **`uy`**: Uruguay - **`uz`**: Uzbekistan - **`vu`**: Vanuatu - **`ve`**: Venezuela - **`vn`**: Viet Nam - **`vg`**: Virgin Islands, British - **`vi`**: Virgin Islands, U.S. - **`wf`**: Wallis and Futuna - **`eh`**: Western Sahara - **`ye`**: Yemen - **`zm`**: Zambia - **`zw`**: Zimbabwe ## Get Building [Use tools hosted on Arcade Cloud\\ \\ Arcade tools are hosted by our cloud platform and ready to be used in your agents. Learn how.](https://docs.arcade.dev/home/quickstart) [Self Host Arcade tools\\ \\ Arcade tools can be self-hosted on your own infrastructure. Learn more about self-hosting.\\ \\ ```\\ pip install arcade_google_maps\\ ```](https://docs.arcade.dev/home/hosting-overview) [Google Jobs](https://docs.arcade.dev/mcp-servers/search/google_jobs "Google Jobs") [Google News](https://docs.arcade.dev/mcp-servers/search/google_news "Google News") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Slack Auth Provider [Home](https://docs.arcade.dev/home "Home") [Customizing Auth](https://docs.arcade.dev/home/auth-providers "Customizing Auth") Slack # Slack auth provider The Slack auth provider enables tools and agents to call [Slack APIs](https://api.slack.com/docs) on behalf of a user. Behind the scenes, the Arcade Engine and the Slack auth provider seamlessly manage Slack OAuth 2.0 authorization for your users. Want to quickly get started with Slack in your agent or AI app? The pre-built [Arcade Slack toolkit](https://docs.arcade.dev/mcp-servers/social-communication/slack) is what you want! ### What’s documented here [Permalink for this section](https://docs.arcade.dev/home/auth-providers/slack\#whats-documented-here) This page describes how to use and configure Slack auth with Arcade. This auth provider is used by: - The [Arcade Slack toolkit](https://docs.arcade.dev/mcp-servers/social-communication/slack), which provides pre-built tools for interacting with Slack - Your [app code](https://docs.arcade.dev/home/auth-providers/slack#using-slack-auth-in-app-code) that needs to call the Slack API - Or, your [custom tools](https://docs.arcade.dev/home/auth-providers/slack#using-slack-auth-in-custom-tools) that need to call the Slack API ## Configuring Slack auth [Permalink for this section](https://docs.arcade.dev/home/auth-providers/slack\#configuring-slack-auth) When using your own app credentials, make sure you configure your project to use a [custom user verifier](https://docs.arcade.dev/home/auth/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 Slack app credentials. This way, your users will see your application’s name requesting permission. You can use your own Slack credentials in both the Arcade Cloud Platform or in a [self-hosted Arcade Engine](https://docs.arcade.dev/home/deployment/engine-configuration) instance. Before showing how to configure your Slack app credentials, let’s go through the steps to create a Slack app. ### Create a Slack app [Permalink for this section](https://docs.arcade.dev/home/auth-providers/slack\#create-a-slack-app) In May 29, 2025, [Slack announced](https://api.slack.com/changelog/2025-05-terms-rate-limit-update-and-faq) changes to their API rate-limits and terms of service for apps that are not approved for the Slack Marketplace. The `conversations.history` and `conversations.replies` endpoints are now limited to 1 request/minute and up to 15 objects returned per request. This affects various tools in the [Arcade Slack toolkit](https://docs.arcade.dev/mcp-servers/social-communication/slack). Additionally, the [API Terms of Service](https://slack.com/terms-of-service/api) now requires [Slack Marketplace](https://api.slack.com/slack-marketplace/using) approval for commercial distribution. - Follow Slack’s guide to [registering a Slack app](https://api.slack.com/quickstart) - If you plan to use the [Arcade Slack toolkit](https://docs.arcade.dev/mcp-servers/social-communication/slack), select the scopes below (include additional scopes for your application’s authorization needs or custom tools, in any): - `channels:history` - `channels:read` - `chat:write` - `groups:read` - `groups:history` - `groups:write` - `im:history` - `im:read` - `im:write` - `mpim:history` - `mpim:read` - `mpim:write` - `users:read` - `users:read.email` - Set the redirect URL to the redirect URL generated by Arcade (see below) - Copy the client ID and client secret Next, add the Slack app to your Arcade Engine configuration. You can do this in the Arcade Dashboard, or by editing the `engine.yaml` file directly (for a self-hosted instance). ## Configuring your own Slack Auth Provider in Arcade [Permalink for this section](https://docs.arcade.dev/home/auth-providers/slack\#configuring-your-own-slack-auth-provider-in-arcade) There are two ways to configure your Slack app credentials in Arcade: 1. From the Arcade Dashboard GUI 2. By editing the `engine.yaml` file directly (for a self-hosted Arcade Engine) We show both options step-by-step below. Dashboard GUIEngine Configuration YAML ### Configure Slack Auth Using the Arcade Dashboard GUI #### Access the Arcade Dashboard [Permalink for this section](https://docs.arcade.dev/home/auth-providers/slack\#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](http://localhost:9099/dashboard). Adjust the host and port number to match your environment. #### Navigate to the OAuth Providers page [Permalink for this section](https://docs.arcade.dev/home/auth-providers/slack\#navigate-to-the-oauth-providers-page) - Under the **OAuth** section of the Arcade Dashboard left-side menu, click **Providers**. - Click **Add OAuth Provider** in the top right corner. - Select the **Included Providers** tab at the top. - In the **Provider** dropdown, select **Slack**. #### Enter the provider details [Permalink for this section](https://docs.arcade.dev/home/auth-providers/slack\#enter-the-provider-details) - Choose a unique **ID** for your provider (e.g. “my-slack-provider”). - Optionally enter a **Description**. - Enter the **Client ID** and **Client Secret** from your Slack app. - Note the **Redirect URL** generated by Arcade. This must be set as your Slack app’s redirect URL. #### Create the provider [Permalink for this section](https://docs.arcade.dev/home/auth-providers/slack\#create-the-provider) Hit the **Create** button and the provider will be ready to be used. When you use tools that require Slack auth using your Arcade account credentials, the Arcade Engine will automatically use this Slack OAuth provider. If you have multiple Slack providers, see [using multiple auth providers of the same type](https://docs.arcade.dev/home/auth-providers#using-multiple-providers-of-the-same-type) for more information. ## Using Slack auth in app code [Permalink for this section](https://docs.arcade.dev/home/auth-providers/slack\#using-slack-auth-in-app-code) Use the Slack auth provider in your own agents and AI apps to get a user token for the Slack API. See [authorizing agents with Arcade](https://docs.arcade.dev/home/auth/how-arcade-helps) to understand how this works. Use `client.auth.start()` to get a user token for the Slack API: PythonJavaScript ```nextra-code 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="slack", scopes=[\ "chat:write",\ "im:write",\ "users.profile:read",\ "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... ``` ## Using Slack auth in custom tools [Permalink for this section](https://docs.arcade.dev/home/auth-providers/slack\#using-slack-auth-in-custom-tools) You can use the pre-built [Arcade Slack toolkit](https://docs.arcade.dev/mcp-servers/social-communication/slack) to quickly build agents and AI apps that interact with Slack. If the pre-built tools in the Slack toolkit don’t meet your needs, you can author your own [custom tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server) that interact with the Slack API. Use the `Slack()` auth class to specify that a tool requires authorization with Slack. The `context.authorization.token` field will be automatically populated with the user’s Slack token: ```nextra-code from typing import Annotated from slack_sdk import WebClient from arcade_tdk import ToolContext, tool from arcade_tdk.auth import Slack from arcade_tdk.errors import RetryableToolError @tool( requires_auth=Slack( scopes=[\ "chat:write",\ "im:write",\ "users.profile:read",\ "users:read",\ ], ) ) def send_dm_to_user( context: ToolContext, user_name: Annotated[\ str,\ "The Slack username of the person you want to message. Slack usernames are ALWAYS lowercase.",\ ], message: Annotated[str, "The message you want to send"], ): """Send a direct message to a user in Slack.""" slackClient = WebClient(token=context.authorization.token) # Retrieve the user's Slack ID based on their username userListResponse = slackClient.users_list() user_id = None for user in userListResponse["members"]: if user["name"].lower() == user_name.lower(): user_id = user["id"] break if not user_id: raise RetryableToolError( "User not found", developer_message=f"User with username '{user_name}' not found.", ) # Step 2: Retrieve the DM channel ID with the user im_response = slackClient.conversations_open(users=[user_id]) dm_channel_id = im_response["channel"]["id"] # Step 3: Send the message as if it's from you (because we're using a user token) slackClient.chat_postMessage(channel=dm_channel_id, text=message) ``` [Salesforce](https://docs.arcade.dev/home/auth-providers/salesforce "Salesforce") [Spotify](https://docs.arcade.dev/home/auth-providers/spotify "Spotify") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Secure Auth in Production [Home](https://docs.arcade.dev/home "Home") [Authorization](https://docs.arcade.dev/home/auth/how-arcade-helps "Authorization") Secure Auth in Production # Secure and Brand the Auth Flow in Production To keep your users safe, Arcade.dev performs a user verification check when a tool is authorized for the first time. This check verifies that the user who is authorizing the tool is the same user who started the authorization flow, which helps prevent phishing attacks. There are two ways to secure your auth flows with Arcade.dev: - Use the **Arcade user verifier** for development (enabled by default) - Implement a **custom user verifier** for production This setting is configured in the [Auth > Settings section](https://api.arcade.dev/dashboard/auth/settings) of the Arcade Dashboard. ## Use the Arcade user verifier [Permalink for this section](https://docs.arcade.dev/home/auth/secure-auth-production\#use-the-arcade-user-verifier) If you’re building a proof-of-concept app or a solo project, use the Arcade user verifier. This option requires no custom development and is on by default when you create a new Arcade.dev account. This setting is configured in the [Auth > Settings section](https://api.arcade.dev/dashboard/auth/settings) of the Arcade Dashboard: ![An image showing how to pick the Arcade user verifier option in the Arcade Dashboard](https://docs.arcade.dev/images/docs/auth/dashboard-arcade-verifier.png) When you authorize a tool, you’ll be prompted to sign in to your Arcade.dev account. If you are already signed in (to the Arcade Dashboard, for example), this verification will succeed silently. The Arcade.dev user verifier helps keep your auth flows secure while you are building and testing your agent or app. When you’re ready to share your work with others, implement a [custom user verifier](https://docs.arcade.dev/home/auth/secure-auth-production#build-a-custom-user-verifier) so your users don’t need to sign in to Arcade.dev. Arcade’s default OAuth apps can _only_ be used with the Arcade user verifier. If you are building a multi-user production app, you must obtain your own OAuth app credentials and add them to Arcade. For example, see our docs on [configuring Google auth in the Arcade Dashboard](https://docs.arcade.dev/home/auth-providers/google#access-the-arcade-dashboard). ## Build a custom user verifier [Permalink for this section](https://docs.arcade.dev/home/auth/secure-auth-production\#build-a-custom-user-verifier) In a production application or agent, end-users are verified by your code, not Arcade.dev. This allows you to fully control the user experience of the auth flow. To enable this, build a custom verifier route and add the URL to the Arcade Dashboard. When your users authorize a tool, Arcade.dev will redirect the user’s browser to your verifier route with some information in the query string. Your custom verifier route must send a response back to Arcade.dev to confirm the user’s ID. If you need help, join the [Implementing a custom user verifier](https://github.com/ArcadeAI/arcade-ai/discussions/486) GitHub discussion and we’ll be happy to assist. ### Build a new route [Permalink for this section](https://docs.arcade.dev/home/auth/secure-auth-production\#build-a-new-route) Create a public route in your app or API that can accept a browser redirect (HTTP 303) from Arcade.dev after a user has authorized a tool. The route must gather the following information: - The `flow_id` from the current URL’s query string - The unique ID of the user currently signed in, commonly an ID from your application’s database, an email address, or similar. How the user’s unique ID is retrieved varies depending on how your app is built, but it is typically retrieved from a session cookie or other secure storage. It **must** match the user ID that your code specified at the start of the authorization flow. ### Verify the user’s identity [Permalink for this section](https://docs.arcade.dev/home/auth/secure-auth-production\#verify-the-users-identity) Use the Arcade SDK (or our REST API) to verify the user’s identity. Because this request uses your Arcade API key, it _must not_ be made from the client side (a browser or desktop app). This code must be run on a server. JavaScriptPythonREST ```nextra-code import { Arcade } from '@arcadeai/arcadejs'; const client = new Arcade(); // Looks for process.env.ARCADE_API_KEY by default // Within a server GET handler: // Validate required parameters if (!flow_id) { throw new Error('Missing required parameters: flow_id'); } // Confirm the user's identity try { const result = await client.auth.confirmUser({ flow_id: flow_id as string, user_id: user_id_from_your_app_session, // Replace with the user's ID }); } catch (error) { console.error('Error during verification', 'status code:', error.status, 'data:', error.data); throw error; } ``` **Valid Response** If the user’s ID matches the ID specified at the start of the authorization flow, the response will contain some information about the auth flow. You can either: - Redirect the user’s browser to Arcade’s `next_uri` - Redirect to a different route in your application - Look up the auth flow’s status in the Arcade API and render a success page JavaScriptPythonREST ```nextra-code // Either redirect to result.next_uri, or render a success page: const authResponse = await client.auth.waitForCompletion(result.auth_id); if (authResponse.status === "completed") { return "Thanks for authorizing!"; } else { return "Something went wrong. Please try again."; } ``` **Invalid Response** If the user’s ID does not match the ID specified at the start of the authorization flow, the response will contain an error. JavaScriptPythonREST ```nextra-code console.error('Error during verification', 'status code:', error.status, 'data:', error.data); throw error; ``` ### Add your custom verifier route to Arcade [Permalink for this section](https://docs.arcade.dev/home/auth/secure-auth-production\#add-your-custom-verifier-route-to-arcade) In the [Auth > Settings section](https://api.arcade.dev/dashboard/auth/settings) of the Arcade Dashboard, pick the **Custom verifier** option and add the URL of your verifier route. ![An image showing how to pick the custom verifier option in the Arcade Dashboard](https://docs.arcade.dev/images/docs/auth/dashboard-custom-verifier.png) Arcade’s default OAuth apps _only_ support the Arcade user verifier. Authorization flows using Arcade’s default OAuth apps will use the Arcade user verifier even if you have a custom verifier route set up. [Direct Third-Party API Call](https://docs.arcade.dev/home/auth/call-third-party-apis-directly "Direct Third-Party API Call") [Arcade CLI](https://docs.arcade.dev/home/arcade-cli "Arcade CLI") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Firecrawl Toolkit Reference [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Developer Tools](https://docs.arcade.dev/mcp-servers/development/e2b "Developer Tools") [Firecrawl](https://docs.arcade.dev/mcp-servers/development/firecrawl/firecrawl "Firecrawl") Reference # Reference for Firecrawl Toolkit ## Formats [Permalink for this section](https://docs.arcade.dev/mcp-servers/development/firecrawl/reference\#formats) The format of the scraped web page. - **`MARKDOWN`**: Returns the scraped web page in Markdown format. - **`HTML`**: Returns the scraped web page in HTML format. - **`RAW_HTML`**: Returns the raw HTML of the scraped web page. - **`LINKS`**: Returns only the links from the scraped web page. - **`SCREENSHOT`**: Takes a screenshot of the scraped web page. - **`SCREENSHOT_AT_FULL_PAGE`**: Takes a full-page screenshot of the scraped web page. [Firecrawl](https://docs.arcade.dev/mcp-servers/development/firecrawl/firecrawl "Firecrawl") [Stripe](https://docs.arcade.dev/mcp-servers/payments/stripe "Stripe") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Microsoft Auth Provider [Home](https://docs.arcade.dev/home "Home") [Customizing Auth](https://docs.arcade.dev/home/auth-providers "Customizing Auth") Microsoft # Microsoft auth provider At this time, Arcade does not offer a default Microsoft Auth Provider. To use Microsoft auth, you must create a custom Auth Provider with your own Microsoft OAuth 2.0 credentials as described below. The Microsoft auth provider enables tools and agents to call the Microsoft Graph API on behalf of a user. Behind the scenes, the Arcade Engine and the Microsoft auth provider seamlessly manage Microsoft OAuth 2.0 authorization for your users. ### What’s documented here [Permalink for this section](https://docs.arcade.dev/home/auth-providers/microsoft\#whats-documented-here) This page describes how to use and configure Microsoft auth with Arcade. This auth provider is used by: - Your [app code](https://docs.arcade.dev/home/auth-providers/microsoft#using-microsoft-auth-in-app-code) that needs to call Microsoft Graph APIs - Or, your [custom tools](https://docs.arcade.dev/home/auth-providers/microsoft#using-microsoft-auth-in-custom-tools) that need to call Microsoft Graph APIs ## Configuring Microsoft auth [Permalink for this section](https://docs.arcade.dev/home/auth-providers/microsoft\#configuring-microsoft-auth) When using your own app credentials, make sure you configure your project to use a [custom user verifier](https://docs.arcade.dev/home/auth/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 Microsoft app credentials. This way, your users will see your application’s name requesting permission. You can use your own Microsoft credentials in both the Arcade Cloud Platform or in a [self-hosted Arcade Engine](https://docs.arcade.dev/home/deployment/engine-configuration) instance. Before showing how to configure your Microsoft app credentials, let’s go through the steps to create a Microsoft app. ### Create a Microsoft app [Permalink for this section](https://docs.arcade.dev/home/auth-providers/microsoft\#create-a-microsoft-app) - Follow Microsoft’s guide to [registering an app with the Microsoft identity platform](https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app) - Choose the permissions (scopes) you need for your app. Refer to the [section below](https://docs.arcade.dev/home/auth-providers/microsoft#arcade-microsoft-toolkits-scopes) for a list of scopes needed by the Arcade Microsoft Toolkits, in case you intend to use them. - 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 Microsoft app to your Arcade Engine configuration. You can do this in the Arcade Dashboard, or by editing the `engine.yaml` file directly (for a self-hosted instance). ### Arcade Microsoft Toolkits Scopes [Permalink for this section](https://docs.arcade.dev/home/auth-providers/microsoft\#arcade-microsoft-toolkits-scopes) Below is the list of scopes required by the Arcade Microsoft Toolkits: | Toolkit | Required Permissions | | --- | --- | | [Outlook Calendar](https://docs.arcade.dev/mcp-servers/productivity/outlook_calendar) | `Calendars.ReadBasic`
`Calendars.ReadWrite`
`MailboxSettings.Read` | | [Outlook Mail](https://docs.arcade.dev/mcp-servers/productivity/outlook_mail) | `Mail.Read`
`Mail.ReadWrite`
`Mail.Send` | | [Teams](https://docs.arcade.dev/mcp-servers/social-communication/microsoft_teams) | `Channel.ReadBasic.All`
`ChannelMessage.Read.All`
`ChannelMessage.Send`
`Chat.Create`
`Chat.Read`
`ChatMessage.Read`
`ChatMessage.Send`
`People.Read`
`Team.ReadBasic.All`
`TeamMember.Read.All`
`User.Read` | | [SharePoint](https://docs.arcade.dev/mcp-servers/productivity/sharepoint) | `Sites.Read.All` | ## Configuring your own Microsoft Auth Provider in Arcade [Permalink for this section](https://docs.arcade.dev/home/auth-providers/microsoft\#configuring-your-own-microsoft-auth-provider-in-arcade) There are two ways to configure your Microsoft app credentials in Arcade: 1. From the Arcade Dashboard GUI 2. By editing the `engine.yaml` file directly (for a self-hosted Arcade Engine) We show both options step-by-step below. Dashboard GUIEngine Configuration YAML ### Configure Microsoft Auth Using the Arcade Dashboard GUI #### Access the Arcade Dashboard [Permalink for this section](https://docs.arcade.dev/home/auth-providers/microsoft\#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](http://localhost:9099/dashboard). Adjust the host and port number to match your environment. #### Navigate to the OAuth Providers page [Permalink for this section](https://docs.arcade.dev/home/auth-providers/microsoft\#navigate-to-the-oauth-providers-page) - Under the **OAuth** section of the Arcade Dashboard left-side menu, click **Providers**. - Click **Add OAuth Provider** in the top right corner. - Select the **Included Providers** tab at the top. - In the **Provider** dropdown, select **Microsoft**. #### Enter the provider details [Permalink for this section](https://docs.arcade.dev/home/auth-providers/microsoft\#enter-the-provider-details) - Choose a unique **ID** for your provider (e.g. “my-microsoft-provider”). - Optionally enter a **Description**. - Enter the **Client ID** and **Client Secret** from your Microsoft app. - Note the **Redirect URL** generated by Arcade. This must be set as your Microsoft app’s redirect URL. #### Create the provider [Permalink for this section](https://docs.arcade.dev/home/auth-providers/microsoft\#create-the-provider) Hit the **Create** button and the provider will be ready to be used. When you use tools that require Microsoft auth using your Arcade account credentials, the Arcade Engine will automatically use this Microsoft OAuth provider. If you have multiple Microsoft providers, see [using multiple auth providers of the same type](https://docs.arcade.dev/home/auth-providers#using-multiple-providers-of-the-same-type) for more information. ## Using Microsoft auth in app code [Permalink for this section](https://docs.arcade.dev/home/auth-providers/microsoft\#using-microsoft-auth-in-app-code) Use the Microsoft auth provider in your own agents and AI apps to get a user token for Microsoft Graph APIs. See [authorizing agents with Arcade](https://docs.arcade.dev/home/auth/how-arcade-helps) to understand how this works. Use `client.auth.start()` to get a user token for Microsoft Graph APIs: PythonJavaScript ```nextra-code 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="microsoft", scopes=["User.Read", "Files.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 # TODO: Do something interesting with the token... ``` ## Using Microsoft auth in custom tools [Permalink for this section](https://docs.arcade.dev/home/auth-providers/microsoft\#using-microsoft-auth-in-custom-tools) You can author your own [custom tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server) that interact with Microsoft Graph APIs. Use the `Microsoft()` auth class to specify that a tool requires authorization with Microsoft. The `context.authorization.token` field will be automatically populated with the user’s Microsoft token: ```nextra-code from typing import Annotated import httpx from arcade_tdk import ToolContext, tool from arcade_tdk.auth import Microsoft @tool( requires_auth=Microsoft( scopes=["User.Read", "Files.Read"], ) ) async def get_file_contents( context: ToolContext, file_id: Annotated[str, "The ID of the file to get the contents of"], ) -> Annotated[str, "The contents of the file"]: """Get the contents of a file from Microsoft Graph.""" url = f"https://graph.microsoft.com/v1.0/me/drive/items/{file_id}" headers = {"Authorization": f"Bearer {context.authorization.token}"} async with httpx.AsyncClient() as client: response = await client.get( url=url, headers=headers, ) response.raise_for_status() return response.json() ``` [Linkedin](https://docs.arcade.dev/home/auth-providers/linkedin "Linkedin") [Notion](https://docs.arcade.dev/home/auth-providers/notion "Notion") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Arcade Registry Overview [Home](https://docs.arcade.dev/home "Home") Registry Early Access # The Arcade Registry The **Arcade Registry** is how agentic tool developers share their work with the world. Arcade.dev is collecting all the integrations that agents will ever need in one place - think HuggingFace or Pypi but for LLM tools. A powerful community of open source and for-profit developers building out robust and evaluated workflows is how agents can be elevated to being _truly_ useful. Take the survey **_The components of the Arcade Registry_**![The Arcade Registry diagram](https://docs.arcade.dev/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fregistry.d8b58aa5.png&w=3840&q=75&dpl=dpl_3fU5AVnKzu14o3RauPt9AEJrvZTe) Unlike traditional read-only tool libraries, Arcade.dev couples the runtime with the registry. This way we can collect real metrics and usage information about your tools, sharing meaningful information and feedback back to the developers. You’ll get error reports and statistics about how your tools are getting used. Arcade.dev also makes it possible for developers to optionally choose to sell their tools with a markup on top of the Arcade platform fees. Thanks to the Arcade Engine, your toolkits will be available via all the protocols Arcade supports - be that MCP for locally-running applications, OXP for server applications, and whatever comes next. Use the open-source Arcade SDKs to future-proof your tools. We are seeking beta testers who are interested in building, maintaining, and sharing toolkits with the world in either a free-to-use or for-profit manner. Sign up today to join the Arcade Registry Beta. ## Early Access Registry Survey Question 1 of 617% What is your name? BackNext [Changelog](https://docs.arcade.dev/home/changelog "Changelog") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Using Arcade Tools [Home](https://docs.arcade.dev/home "Home") [OpenAI Agents](https://docs.arcade.dev/home/oai-agents/overview "OpenAI Agents") Using Arcade tools ## Use Arcade with OpenAI Agents [Permalink for this section](https://docs.arcade.dev/home/oai-agents/use-arcade-tools\#use-arcade-with-openai-agents) In this guide, let’s explore how to integrate Arcade tools into your OpenAI Agents application. Follow the step-by-step instructions below. ### Prerequisites [Permalink for this section](https://docs.arcade.dev/home/oai-agents/use-arcade-tools\#prerequisites) - [Obtain an Arcade API key](https://docs.arcade.dev/home/api-keys) ### Set up your environment [Permalink for this section](https://docs.arcade.dev/home/oai-agents/use-arcade-tools\#set-up-your-environment) Install the required packages, and ensure your environment variables are set with your Arcade API key: PythonJavaScript ```nextra-code pip install agents-arcade arcadepy ``` ### Configure API keys [Permalink for this section](https://docs.arcade.dev/home/oai-agents/use-arcade-tools\#configure-api-keys) Provide your Arcade API key. You can store it in environment variables or directly in your code: > Need an Arcade API key? Visit the [Get an API key](https://docs.arcade.dev/home/api-keys) page to create one. PythonJavaScript ```nextra-code import os os.environ["ARCADE_API_KEY"] = "YOUR_ARCADE_API_KEY" # Or set it directly when initializing the client ``` ### Create and manage Arcade tools [Permalink for this section](https://docs.arcade.dev/home/oai-agents/use-arcade-tools\#create-and-manage-arcade-tools) PythonJavaScript Use the `get_arcade_tools` function to retrieve tools from specific toolkits: ```nextra-code from arcadepy import AsyncArcade from agents_arcade import get_arcade_tools # Initialize the Arcade client client = AsyncArcade() # Get all tools from the "Gmail" toolkit tools = await get_arcade_tools(client, toolkits=["gmail"]) # You can request multiple toolkits at once tools = await get_arcade_tools(client, toolkits=["gmail", "github", "linkedin"]) # You can request specific tools tools = await get_arcade_tools(client, tools=["Gmail_ListEmails", "Slack_ListUsers", "Slack_SendDmToUser"]) ``` ### Set up the agent with Arcade tools [Permalink for this section](https://docs.arcade.dev/home/oai-agents/use-arcade-tools\#set-up-the-agent-with-arcade-tools) Create an agent and provide it with the Arcade tools: PythonJavaScript ```nextra-code from agents import Agent, Runner # Create an agent with Gmail tools google_agent = Agent( name="Gmail agent", instructions="You are a helpful assistant that can assist with Google API calls.", model="gpt-4o-mini", tools=tools, ) ``` ### Run the agent [Permalink for this section](https://docs.arcade.dev/home/oai-agents/use-arcade-tools\#run-the-agent) PythonJavaScript Run the agent, providing a user\_id for tool authorization: ```nextra-code try: result = await Runner.run( starting_agent=google_agent, input="What are my latest emails?", context={"user_id": "{arcade_user_id}"}, ) print("Final output:\n\n", result.final_output) except AuthorizationError as e: print("Please Login to Google:", e) ``` ### Handle authentication [Permalink for this section](https://docs.arcade.dev/home/oai-agents/use-arcade-tools\#handle-authentication) PythonJavaScript If a tool requires authorization, an `AuthorizationError` will be raised with an authorization URL: ```nextra-code from agents_arcade.errors import AuthorizationError try: # Run agent code from earlier examples # ... except AuthorizationError as e: print(f"Please visit this URL to authorize: {e}") # The URL contained in the error will take the user to the authorization page ``` ### Complete example [Permalink for this section](https://docs.arcade.dev/home/oai-agents/use-arcade-tools\#complete-example) Here’s a complete example putting everything together: PythonJavaScript ```nextra-code from agents import Agent, Runner from arcadepy import AsyncArcade from agents_arcade import get_arcade_tools from agents_arcade.errors import AuthorizationError async def main(): client = AsyncArcade() tools = await get_arcade_tools(client, toolkits=["gmail"]) google_agent = Agent( name="Google agent", instructions="You are a helpful assistant that can assist with Google API calls.", model="gpt-4o-mini", tools=tools, ) try: result = await Runner.run( starting_agent=google_agent, input="What are my latest emails?", context={"user_id": "{arcade_user_id}"}, ) print("Final output:\n\n", result.final_output) except AuthorizationError as e: print("Please Login to Google:", e) if __name__ == "__main__": import asyncio asyncio.run(main()) ``` ## Tips for selecting tools [Permalink for this section](https://docs.arcade.dev/home/oai-agents/use-arcade-tools\#tips-for-selecting-tools) - **Relevance**: Pick only the tools you need. Avoid using all tools at once. - **User identification**: Always provide a unique and consistent `user_id` for each user. Use your internal or database user ID, not something entered by the user. ## Next steps [Permalink for this section](https://docs.arcade.dev/home/oai-agents/use-arcade-tools\#next-steps) Now that you have integrated Arcade tools into your OpenAI Agents application, you can: - Experiment with different toolkits, such as “github” or “linkedin” - Customize the agent’s instructions for specific tasks - Try out multi-agent systems using different Arcade tools - Build your own custom tools with the Arcade Tool SDK Enjoy exploring Arcade and building powerful AI-enabled Python applications! [Overview](https://docs.arcade.dev/home/oai-agents/overview "Overview") [Managing user authorization](https://docs.arcade.dev/home/oai-agents/user-auth-interrupts "Managing user authorization") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Google Finance Toolkit [Integrations](https://docs.arcade.dev/toolkits "Integrations") Search ToolsGoogle Finance # Google Finance **Description:** Empower your agents to retrieve stock data using Arcade. **Author:** Arcade **Auth:** API Key [![PyPI Version](https://img.shields.io/pypi/v/arcade_google-finance)](https://pypi.org/project/arcade_google-finance/)[![License](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/arcadeai/arcade-ai/blob/main/LICENSE)[![Python Versions](https://img.shields.io/pypi/pyversions/arcade_google-finance)](https://pypi.org/project/arcade_google-finance/)[![Wheel Status](https://img.shields.io/pypi/wheel/arcade_google-finance)](https://pypi.org/project/arcade_google-finance/)[![Downloads](https://img.shields.io/pypi/dm/arcade_google-finance)](https://pypi.org/project/arcade_google-finance/) The Arcade Google Finance toolkit lets you fetch real-time and historical stock data with ease. Use these tools to build intelligent agents and applications that fetch: - Stock summary data. - Historical stock data. ## Available Tools [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/google_finance\#available-tools) | Tool Name | Description | | --- | --- | | GoogleFinance.GetStockSummary | Retrieve current price and recent price movement of a stock. | | GoogleFinance.GetStockHistoricalData | Fetch historical stock price and volume data for a specified time window. | If you need an action that’s not listed here, please [contact us](mailto:contact@arcade.dev) to request a new tool, or [create your own tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server). ## GoogleFinance.GetStockSummary [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/google_finance\#googlefinancegetstocksummary) Retrieve summary information for a given stock using the Google Finance API via SerpAPI. This tool returns the current price and price change from the most recent trading day. **Parameters** - **`ticker_symbol`** _(string, required)_: The stock ticker, e.g., ‘GOOG’. - **`exchange_identifier`** _(string, required)_: The market identifier, e.g., ‘NASDAQ’. See Example > ## GoogleFinance.GetStockHistoricalData [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/google_finance\#googlefinancegetstockhistoricaldata) Fetch historical data for a given stock over a defined time window. This tool returns the stock’s price and volume data along with key events when available. **Parameters** - **`ticker_symbol`** _(string, required)_: The stock ticker, e.g., ‘GOOG’. - **`exchange_identifier`** _(string, required)_: The market identifier, e.g., ‘NASDAQ’ or ‘NYSE’. - **`window`** _(enum ( [GoogleFinanceWindow](https://docs.arcade.dev/mcp-servers/search/google_finance#googlefinancewindow)), optional, defaults to ONE\_MONTH)_: Time window for the graph data. See Example > ## Auth [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/google_finance\#auth) The Arcade Google Finance toolkit uses the [SerpAPI](https://serpapi.com/) to get stock data from Google Finance. - **Secret:** - `SERP_API_KEY`: Your SerpAPI API key. Setting the `SERP_API_KEY` secret is only required if you are [self-hosting](https://docs.arcade.dev/home/deployment/engine-configuration) Arcade. If you’re using Arcade Cloud, the secret is already set for you. To manage your secrets, go to the [Secrets page](https://api.arcade.dev/dashboard/auth/secrets) in the Arcade Dashboard. * * * ## Reference [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/google_finance\#reference) ## GoogleFinanceWindow [Permalink for this section](https://docs.arcade.dev/mcp-servers/search/google_finance\#googlefinancewindow) Defines the time window for fetching stock data from Google Finance. - **`ONE_DAY`**: Represents a 1-day time window. - **`FIVE_DAYS`**: Represents a 5-day time window. - **`ONE_MONTH`**: Represents a 1-month time window. - **`SIX_MONTHS`**: Represents a 6-month time window. - **`YEAR_TO_DATE`**: Represents the time from the start of the year to the current date. - **`ONE_YEAR`**: Represents a 1-year time window. - **`FIVE_YEARS`**: Represents a 5-year time window. - **`MAX`**: Represents the maximum available time window. ## Get Building [Use tools hosted on Arcade Cloud\\ \\ Arcade tools are hosted by our cloud platform and ready to be used in your agents. Learn how.](https://docs.arcade.dev/home/quickstart) [Self Host Arcade tools\\ \\ Arcade tools can be self-hosted on your own infrastructure. Learn more about self-hosting.\\ \\ ```\\ pip install arcade_google_finance\\ ```](https://docs.arcade.dev/home/hosting-overview) [Stripe](https://docs.arcade.dev/mcp-servers/payments/stripe "Stripe") [Google Flights](https://docs.arcade.dev/mcp-servers/search/google_flights "Google Flights") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## User Authorization Workflows [Home](https://docs.arcade.dev/home "Home") [LangChain](https://docs.arcade.dev/home/langchain/use-arcade-tools "LangChain") User authorization ## User Authorization in LangGraph [Permalink for this section](https://docs.arcade.dev/home/langchain/user-auth-interrupts\#user-authorization-in-langgraph) In this guide, you will create a LangGraph workflow that requires user authorization before running certain Arcade tools. When a tool needs authorization, the graph displays an authorization URL and waits for the user’s approval. This ensures that only the tools you explicitly authorize are available to the language model. For complete working examples, see our [Python](https://github.com/ArcadeAI/arcade-ai/blob/main/examples/langchain/langgraph_with_user_auth.py) and [JavaScript](https://github.com/ArcadeAI/arcade-ai/blob/main/examples/langchain-ts/langgraph-with-user-auth.ts) examples. ### Prerequisites [Permalink for this section](https://docs.arcade.dev/home/langchain/user-auth-interrupts\#prerequisites) - [Obtain an Arcade API key](https://docs.arcade.dev/home/api-keys) ### Install the required packages [Permalink for this section](https://docs.arcade.dev/home/langchain/user-auth-interrupts\#install-the-required-packages) Set up your environment with the following installations: PythonJavaScript ```nextra-code pip install langchain-arcade langchain-openai langgraph ``` ### Configure your Arcade environment [Permalink for this section](https://docs.arcade.dev/home/langchain/user-auth-interrupts\#configure-your-arcade-environment) Make sure you have set your Arcade API key (and any other relevant keys) in the environment, or assign them directly in the code: > Need an Arcade API key? Visit the [Get an API key](https://docs.arcade.dev/home/api-keys) page to create one. PythonJavaScript ```nextra-code import os # Import necessary classes and modules from langchain_arcade import ArcadeToolManager from langchain_openai import ChatOpenAI from langgraph.checkpoint.memory import MemorySaver from langgraph.graph import END, START, MessagesState, StateGraph from langgraph.prebuilt import ToolNode arcade_api_key = os.environ["ARCADE_API_KEY"] # Initialize the tool manager and fetch tools compatible with langgraph tool_manager = ArcadeToolManager(api_key=arcade_api_key) tools = tool_manager.get_tools(toolkits=["Gmail"]) tool_node = ToolNode(tools) # Create a language model instance and bind it with the tools model = ChatOpenAI(model="gpt-4o") model_with_tools = model.bind_tools(tools) ``` Here are the main code elements: - arcade\_api\_key is your Arcade key. - tool\_manager fetches your Arcade tools, for example the “Gmail” toolkit. - tool\_node encapsulates these tools for usage in LangGraph. - model\_with\_tools binds your tools to the “gpt-4o” language model, enabling tool calls. ### Define the workflow steps [Permalink for this section](https://docs.arcade.dev/home/langchain/user-auth-interrupts\#define-the-workflow-steps) You will create three primary functions to handle AI interaction, tool authorization, and flow control. PythonJavaScript ```nextra-code # Function to invoke the model and get a response def call_agent(state: MessagesState): messages = state["messages"] response = model_with_tools.invoke(messages) # Return the updated message history return {"messages": [response]} # Function to determine the next step in the workflow based on the last message def should_continue(state: MessagesState): if state["messages"][-1].tool_calls: for tool_call in state["messages"][-1].tool_calls: if tool_manager.requires_auth(tool_call["name"]): return "authorization" return "tools" # Proceed to tool execution if no authorization is needed return END # End the workflow if no tool calls are present # Function to handle authorization for tools that require it def authorize(state: MessagesState, config: dict): user_id = config["configurable"].get("user_id") for tool_call in state["messages"][-1].tool_calls: tool_name = tool_call["name"] if not tool_manager.requires_auth(tool_name): continue auth_response = tool_manager.authorize(tool_name, user_id) if auth_response.status != "completed": # Prompt the user to visit the authorization URL print(f"Visit the following URL to authorize: {auth_response.url}") # Wait for the user to complete the authorization # and then check the authorization status again tool_manager.wait_for_auth(auth_response.id) if not tool_manager.is_authorized(auth_response.id): # This stops execution if authorization fails raise ValueError("Authorization failed") return {"messages": []} ``` Explanations for these functions: - call\_agent: Invokes the language model using the latest conversation state. - should\_continue: Checks the last AI message for any tool calls. If a tool requires authorization, the flow transitions to authorization. Otherwise, it goes straight to tool execution or ends if no tools are called. - authorize: Prompts the user to authorize any required tools, blocking until authorization is completed successfully or fails. ### Build and compile your LangGraph workflow [Permalink for this section](https://docs.arcade.dev/home/langchain/user-auth-interrupts\#build-and-compile-your-langgraph-workflow) Use StateGraph to assemble the nodes and edges, then compile the graph with a MemorySaver. PythonJavaScript ```nextra-code if __name__ == "__main__": # Build the workflow graph using StateGraph workflow = StateGraph(MessagesState) # Add nodes (steps) to the graph workflow.add_node("agent", call_agent) workflow.add_node("tools", tool_node) workflow.add_node("authorization", authorize) # Define the edges and control flow between nodes workflow.add_edge(START, "agent") workflow.add_conditional_edges("agent", should_continue, ["authorization", "tools", END]) workflow.add_edge("authorization", "tools") workflow.add_edge("tools", "agent") # Set up memory for checkpointing the state memory = MemorySaver() # Compile the graph with the checkpointer graph = workflow.compile(checkpointer=memory) ``` ### Provide inputs and run the graph [Permalink for this section](https://docs.arcade.dev/home/langchain/user-auth-interrupts\#provide-inputs-and-run-the-graph) Finally, define user-supplied messages, authorization config, and stream the outputs. The graph will pause for any required tool authorization. PythonJavaScript ```nextra-code # Define the input messages from the user inputs = { "messages": [\ {\ "role": "user",\ "content": "Check and see if I have any important emails in my inbox",\ }\ ], } # Configuration with thread and user IDs for authorization purposes config = {"configurable": {"thread_id": "4", "user_id": "{arcade_user_id}"}} # Run the graph and stream the outputs for chunk in graph.stream(inputs, config=config, stream_mode="values"): # Pretty-print the last message in the chunk chunk["messages"][-1].pretty_print() ``` In this example: - The user prompts the agent to check emails. - The message triggers a potential need for the “Gmail” tools. - If authorization is required, the code prints a URL and waits until you permit the tool call. ## Next steps [Permalink for this section](https://docs.arcade.dev/home/langchain/user-auth-interrupts\#next-steps) - Experiment with more Arcade toolkits for expanded capabilities. - Explore advanced authorization logic, such as multi-user or role-based checks. - Integrate additional nodes to handle more complex flows or multi-step tasks in your LangGraph. By combining Arcade’s authorization features with stateful management in LangGraph, you can build AI-driven workflows that respect user permissions at every step. Have fun exploring Arcade! [Using Arcade tools](https://docs.arcade.dev/home/langchain/use-arcade-tools "Using Arcade tools") [Authorizing existing tools](https://docs.arcade.dev/home/langchain/auth-langchain-tools "Authorizing existing tools") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Google Sheets Toolkit [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Productivity & Docs](https://docs.arcade.dev/mcp-servers/productivity/asana "Productivity & Docs") Google Sheets # GoogleSheets **Description:** Enable agents to interact with GoogleSheets **Author:** Arcade **Auth:** User authorization [![PyPI Version](https://img.shields.io/pypi/v/arcade_google_sheets)](https://pypi.org/project/arcade_google_sheets/)[![License](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/arcadeai/arcade-ai/blob/main/LICENSE)[![Python Versions](https://img.shields.io/pypi/pyversions/arcade_google_sheets)](https://pypi.org/project/arcade_google_sheets/)[![Wheel Status](https://img.shields.io/pypi/wheel/arcade_google_sheets)](https://pypi.org/project/arcade_google_sheets/)[![Downloads](https://img.shields.io/pypi/dm/arcade_google_sheets)](https://pypi.org/project/arcade_google_sheets/) The Arcade GoogleSheets MCP Server provides a pre-built set of tools for working with Google Sheets. These tools make it easy to build agents and AI apps that can: - Create new spreadsheets and seed initial data. - Search Google Drive for spreadsheets and retrieve metadata (titles, IDs, URLs; excludes trash). - Read specific ranges from sheets. - Write to single cells or update ranges with flexible data formats. - Add notes to cells. - Get detailed spreadsheet and sheet metadata (names, IDs, positions, row/column counts; metadata only). ## Available Tools [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_sheets\#available-tools) | Tool Name | Description | | --- | --- | | GoogleSheets.CreateSpreadsheet | Create a new spreadsheet with the provided title and data in its first sheet | | GoogleSheets.WriteToCell | Write a value to a single cell in a spreadsheet. | | GoogleSheets.UpdateCells | Write values to a Google Sheet using a flexible data format. | | GoogleSheets.AddNoteToCell | Add a note to a specific cell in a spreadsheet. A note is a small | | GoogleSheets.SearchSpreadsheets | Searches for spreadsheets in the user's Google Drive based on the titles and content and | | GoogleSheets.WhoAmI | Get comprehensive user profile and Google Sheets environment information. | | GoogleSheets.GenerateGoogleFilePickerUrl | Generate a Google File Picker URL for user-driven file selection and authorization. | | GoogleSheets.GetSpreadsheet | Gets the specified range of cells from a single sheet in the spreadsheet. | | GoogleSheets.GetSpreadsheetMetadata | Gets the metadata for a spreadsheet including the metadata for the sheets in the spreadsheet. | If you need to perform an action that’s not listed here, you can [get in touch\\ with us](mailto:contact@arcade.dev) to request a new tool, or [create your\\ own tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server). ## GoogleSheets.CreateSpreadsheet [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_sheets\#googlesheetscreatespreadsheet) See Example > Create a new spreadsheet with the provided title and data in its first sheet **Parameters** - **title** ( `string`, optional) The title of the new spreadsheet - **data** ( `string`, optional) The data to write to the spreadsheet. A JSON string (property names enclosed in double quotes) representing a dictionary that maps row numbers to dictionaries that map column letters to cell values. For example, data\[23\]\[‘C’\] would be the value of the cell in row 23, column C. Type hint: dict\[int, dict\[str, Union\[int, float, str, bool\]\]\] ## GoogleSheets.WriteToCell [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_sheets\#googlesheetswritetocell) See Example > Write a value to a single cell in a spreadsheet. **Parameters** - **spreadsheet\_id** ( `string`, required) The id of the spreadsheet to write to - **column** ( `string`, required) The column string to write to. For example, ‘A’, ‘F’, or ‘AZ’ - **row** ( `integer`, required) The row number to write to - **value** ( `string`, required) The value to write to the cell - **sheet\_name** ( `string`, optional) The name of the sheet to write to. Defaults to ‘Sheet1’ ## GoogleSheets.UpdateCells [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_sheets\#googlesheetsupdatecells) See Example > Write values to a Google Sheet using a flexible data format. **Parameters** - **spreadsheet\_id** ( `string`, required) The id of the spreadsheet to write to - **data** ( `string`, required) The data to write. A JSON string (property names enclosed in double quotes) representing a dictionary that maps row numbers to dictionaries that map column letters to cell values. For example, data\[23\]\[‘C’\] is the value for cell C23. This is the same format accepted by create\_spreadsheet. Type hint: dict\[int, dict\[str, int \| float \| str \| bool\]\] - **sheet\_position** ( `integer`, optional) The position/tab of the sheet in the spreadsheet to write to. A value of 1 represents the first (leftmost/Sheet1) sheet. Defaults to 1. - **sheet\_id\_or\_name** ( `string`, optional) The id or name of the sheet to write to. If provided, takes precedence over sheet\_position. ## GoogleSheets.AddNoteToCell [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_sheets\#googlesheetsaddnotetocell) See Example > Add a note to a specific cell in a spreadsheet. A note is a small **Parameters** - **spreadsheet\_id** ( `string`, required) The id of the spreadsheet to add a comment to - **column** ( `string`, required) The column string to add a note to. For example, ‘A’, ‘F’, or ‘AZ’ - **row** ( `integer`, required) The row number to add a note to - **note\_text** ( `string`, required) The text for the note to add - **sheet\_position** ( `integer`, optional) The position/tab of the sheet in the spreadsheet to write to. A value of 1 represents the first (leftmost/Sheet1) sheet. Defaults to 1. - **sheet\_id\_or\_name** ( `string`, optional) The id or name of the sheet to write to. If provided, takes precedence over sheet\_position. ## GoogleSheets.SearchSpreadsheets [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_sheets\#googlesheetssearchspreadsheets) See Example > Searches for spreadsheets in the user’s Google Drive based on the titles and content and **Parameters** - **spreadsheet\_contains** ( `array[string]`, optional) Keywords or phrases that must be in the spreadsheet title. Provide a list of keywords or phrases if needed. - **spreadsheet\_not\_contains** ( `array[string]`, optional) Keywords or phrases that must NOT be in the spreadsheet title. Provide a list of keywords or phrases if needed. - **search\_only\_in\_shared\_drive\_id** ( `string`, optional) The ID of the shared drive to restrict the search to. If provided, the search will only return spreadsheets from this drive. Defaults to None, which searches across all drives. - **include\_shared\_drives** ( `boolean`, optional) Whether to include spreadsheets from shared drives. Defaults to False (searches only in the user’s ‘My Drive’). - **include\_organization\_domain\_spreadsheets** ( `boolean`, optional) Whether to include spreadsheets from the organization’s domain. This is applicable to admin users who have permissions to view organization-wide spreadsheets in a Google Workspace account. Defaults to False. - **order\_by** ( `Enum` [OrderBy](https://docs.arcade.dev/mcp-servers/productivity/google_sheets/reference#orderby), optional) Sort order. Defaults to listing the most recently modified spreadsheets first - **limit** ( `integer`, optional) The maximum number of spreadsheets to list. Defaults to 10. Max is 50 - **pagination\_token** ( `string`, optional) The pagination token to continue a previous request ## GoogleSheets.WhoAmI [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_sheets\#googlesheetswhoami) See Example > Get comprehensive user profile and Google Sheets environment information. **Parameters** This tool does not take any parameters. ## GoogleSheets.GenerateGoogleFilePickerUrl [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_sheets\#googlesheetsgenerategooglefilepickerurl) See Example > Generate a Google File Picker URL for user-driven file selection and authorization. **Parameters** This tool does not take any parameters. ## GoogleSheets.GetSpreadsheet [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_sheets\#googlesheetsgetspreadsheet) See Example > Gets the specified range of cells from a single sheet in the spreadsheet. **Parameters** - **spreadsheet\_id** ( `string`, required) The id of the spreadsheet to get - **sheet\_position** ( `integer`, optional) The position/tab of the sheet in the spreadsheet to get. A value of 1 represents the first (leftmost/Sheet1) sheet . Defaults to 1. - **sheet\_id\_or\_name** ( `string`, optional) The id or name of the sheet to get. Defaults to None, which means sheet\_position will be used instead. - **start\_row** ( `integer`, optional) Starting row number (1-indexed, defaults to 1) - **start\_col** ( `string`, optional) Starting column letter(s) or 1-based column number (defaults to ‘A’) - **max\_rows** ( `integer`, optional) Maximum number of rows to fetch for each sheet in the spreadsheet. Must be between 1 and 1000. Defaults to 1000. - **max\_cols** ( `integer`, optional) Maximum number of columns to fetch for each sheet in the spreadsheet. Must be between 1 and 100. Defaults to 100. ## GoogleSheets.GetSpreadsheetMetadata [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_sheets\#googlesheetsgetspreadsheetmetadata) See Example > Gets the metadata for a spreadsheet including the metadata for the sheets in the spreadsheet. **Parameters** - **spreadsheet\_id** ( `string`, required) The id of the spreadsheet to get metadata for ## Auth [Permalink for this section](https://docs.arcade.dev/mcp-servers/productivity/google_sheets\#auth) The Arcade GoogleSheets toolkit uses the [Google auth provider](https://docs.arcade.dev/home/auth-providers/google) to connect to users’ GoogleSheets accounts. Please refer to the [Google auth provider](https://docs.arcade.dev/home/auth-providers/google) documentation to learn how to configure auth. ## Get Building [Use tools hosted on Arcade Cloud\\ \\ Arcade tools are hosted by our cloud platform and ready to be used in your agents. Learn how.](https://docs.arcade.dev/home/quickstart) [Self Host Arcade tools\\ \\ Arcade tools can be self-hosted on your own infrastructure. Learn more about self-hosting.\\ \\ ```\\ pip install arcade_google_sheets\\ ```](https://docs.arcade.dev/home/hosting-overview) [Google Slides](https://docs.arcade.dev/mcp-servers/productivity/google_slides "Google Slides") [Reference](https://docs.arcade.dev/mcp-servers/productivity/google_sheets/reference "Reference") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Types of Tools [Home](https://docs.arcade.dev/home "Home") [Tool Calling](https://docs.arcade.dev/home/use-tools/tools-overview "Tool Calling") Types of tools # Types of Tools Arcade offers two types of tools: - Starter tools - Optimized tools The distinction is merely a matter of how they are designed. Both types of tools can be used seamlessly in the same way. There is no difference in their interfaces, the way they are called, or how you interact with them through the Arcade [Dashboard](https://api.arcade.dev/dashboard/) or the Arcade [SDK clients](https://docs.arcade.dev/home/arcade-clients). Before we understand the two types, let’s first understand the background for why we need to differentiate between them. ## Why LLMs perform poorly when calling HTTP APIs [Permalink for this section](https://docs.arcade.dev/home/use-tools/types-of-tools\#why-llms-perform-poorly-when-calling-http-apis) Traditionally, the HTTP APIs offered by upstream services such as GitHub, Google, Slack, etc., were designed to be consumed by human software engineers. When we expose such interfaces for LLMs to call as tools, they usually do not perform very well. One of the main reasons is that the data model of the HTTP API rarely matches the data model of an AI-powered chat interface. For instance, consider the following user prompt: > “Send a DM to John asking about a project update” The data model mismatches are: | Dimension | Chat interface | Slack HTTP API | | --- | --- | --- | | Action | Send message to a **_person_** | Send message to a **_channel_** | | Argument | `username = "John"` | `channel_id = ???` | In order to bridge the gap in the data models, the LLM has to make multiple API calls: 1. Retrieve the current user’s Slack ID 2. Browse the list of users to find John’s ID 3. Open a DM (direct message) channel between the user and John, and get this channel’s ID 4. Send the message to the channel Even the most powerful LLMs usually perform poorly when they need to reason such complex workflows on the fly, not to mention the increased cost and risk of hallucinations. As a result, AI Agents and chatbots that rely on HTTP APIs often end up being unreliable. ## Optimized tools [Permalink for this section](https://docs.arcade.dev/home/use-tools/types-of-tools\#optimized-tools) Arcade’s Optimized toolkits are designed to match the typical data models expected in AI-powered chat interfaces and are subject to evaluation suites to ensure LLMs can safely use them. Following the example above, our Slack toolkit offers the [`Slack.SendMessage`](https://docs.arcade.dev/mcp-servers/social-communication/slack#slacksendmessage) tool, which accepts a `username` as argument, matching exactly both the action and argument value expected to be present in the LLM context window. When a user says “Send a DM to John asking about a project update”, the LLM can directly call the `Slack.SendMessage` tool with the `username` argument, and the tool will take care of the rest. Optimized tools dramatically improve the speed, reliability and cost-effectiveness of AI Agents and chatbots. Since they require careful design and evaluation, Optimized tools take time and effort to build. We understand that your Agent or chatbot project might need capabilities not yet covered by our Optimized toolkits. For this reason, we also offer low-level Starter toolkits. ## Starter tools [Permalink for this section](https://docs.arcade.dev/home/use-tools/types-of-tools\#starter-tools) To provide your Agent or chatbot with more freedom to interact with the upstream services, we offer Starter toolkits. Starter tools are heavily influenced by the original API design. Each tool mirrors one HTTP endpoint. Although we redesign the tool name and argument descriptions to make them more suitable for LLMs, Starter tools are still not optimized for LLM usage. Also, they are not subject to evaluation suites like Optimized tools. For those reasons, we recommend thoroughly evaluating each Starter tool with your Agents or chatbots before using it in production. When your Agent’s needs are covered by an Optimized tool, we recommend using it instead of a Starter one. Use Starter tools as a complement. Carefully engineer your prompts to ensure your Agent can call them safely. [Tool formats](https://docs.arcade.dev/home/use-tools/get-tool-definitions "Tool formats") [How Arcade Helps](https://docs.arcade.dev/home/auth/how-arcade-helps "How Arcade Helps") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed) ## Slack API Toolkit [Integrations](https://docs.arcade.dev/toolkits "Integrations") [Social & Communication](https://docs.arcade.dev/mcp-servers/social-communication/discord "Social & Communication") Slack API # SlackApi **Description:** Enable agents to interact with SlackApi **Author:** Arcade **Auth:** User authorization [![PyPI Version](https://img.shields.io/pypi/v/arcade_slack_api)](https://pypi.org/project/arcade_slack_api/)[![License](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/arcadeai/arcade-ai/blob/main/LICENSE)[![Python Versions](https://img.shields.io/pypi/pyversions/arcade_slack_api)](https://pypi.org/project/arcade_slack_api/)[![Wheel Status](https://img.shields.io/pypi/wheel/arcade_slack_api)](https://pypi.org/project/arcade_slack_api/)[![Downloads](https://img.shields.io/pypi/dm/arcade_slack_api)](https://pypi.org/project/arcade_slack_api/) SlackApi is a [Starter](https://docs.arcade.dev/home/use-tools/types-of-tools#starter-tools) toolkit: each tool mirrors one HTTP endpoint and offers LLMs a way to interact with the low-level API. Differently from [Optimized tools](https://docs.arcade.dev/home/use-tools/types-of-tools#optimized-tools), Starter tools are heavily influenced by the original API design, which is not usually optimized for LLM usage. For this reason, we recommend thoroughly evaluating the toolkit with your Agents or chatbots before using it in production. [Read more](https://docs.arcade.dev/home/use-tools/types-of-tools) about Optimized vs Starter tools. The SlackApi toolkit offers a comprehensive set of tools for administering Slack workspaces, automating messaging, managing channels, calls, files, emojis, user groups, invites, and user/team data. Key capabilities include: - Workspace & team management: create/update team name/description, fetch team info, settings, preferences, integration logs, billable users, and list/inspect teams in an Enterprise org. - User and identity operations: list workspace/team users, find users by email, get user profiles, presence, identity, and manage profile photos. - Channels & conversations: create/join conversations, get conversation info and members, list channels/conversations accessible to a user, open/resume DMs, invite users, set read cursors, and manage shared channel invites. - Messaging & scheduling: send messages (regular and ephemeral), schedule/delete scheduled messages, list scheduled messages, get message permalinks, and search messages/files. - Calls: register calls, get call info, add/remove participants. - Files & sharing: obtain external upload URLs, fetch remote file info, share remote files to channels, enable public sharing. - Bookmarks, pins & reactions: add/edit/remove bookmarks, pin/list pinned items, add/remove reactions. - Emoji management: list custom emojis, rename emojis, and add emoji aliases (Enterprise). - User groups: create, enable/disable, list, update user groups and their membership. - Invite/workflow management: list pending/approved/denied workspace invites, accept/approve/deny shared channel invites, and list shared invites. - Admin tools & verification: fetch workspace settings, owners, channels for org usergroups, list enterprise emojis/teams, revoke tokens, verify API calling code, and retrieve integration logs. - Custom behavior: provide custom unfurling for URLs. This toolkit is designed for admins and apps requiring broad Slack API access (admin, invites, calls, chat, files, usergroups, reactions, users scopes). ## Available Tools [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#available-tools) | Tool Name | Description | | --- | --- | | SlackApi.AddSlackEmojiAlias | Add an emoji alias in a Slack Enterprise organization. | | SlackApi.ListSlackEnterpriseEmojis | Retrieve emojis for a Slack Enterprise organization. | | SlackApi.RenameSlackEmoji | Rename an emoji in a Slack Enterprise organization. | | SlackApi.ListApprovedWorkspaceInviteRequests | Retrieve all approved workspace invite requests from Slack. | | SlackApi.ListDeniedSlackInviteRequests | Retrieve denied Slack workspace invite requests. | | SlackApi.ListPendingWorkspaceInvites | Retrieve all pending workspace invite requests from Slack. | | SlackApi.ListTeamsInEnterprise | Retrieve all teams in an Enterprise organization on Slack. | | SlackApi.ListSlackWorkspaceOwners | Retrieve all owners in a Slack workspace. | | SlackApi.FetchWorkspaceSettingsInfo | Retrieve settings information for a Slack workspace. | | SlackApi.SetWorkspaceDescription | Update the description of a Slack workspace. | | SlackApi.SetSlackWorkspaceName | Update the name of a Slack workspace. | | SlackApi.ListChannelsForUsergroup | Retrieve channels linked to an org-level user group in Slack. | | SlackApi.ListWorkspaceUsers | Retrieve a list of users from a Slack workspace. | | SlackApi.CheckApiCallingCode | Verify the correctness of API calling code for Slack. | | SlackApi.RevokeSlackToken | Revoke a Slack authentication token. | | SlackApi.EditSlackBookmark | Edit an existing bookmark in a Slack channel. | | SlackApi.RemoveSlackBookmark | Remove a bookmark from a Slack channel. | | SlackApi.GetSlackBotInfo | Retrieve details about a Slack bot user. | | SlackApi.RegisterSlackCall | Registers a new call on Slack. | | SlackApi.GetCallInformation | Retrieve detailed information about a specific call in Slack. | | SlackApi.AddCallParticipants | Add new participants to a Slack call. | | SlackApi.RemoveCallParticipants | Remove participants from a Slack call. | | SlackApi.DeleteScheduledSlackMessage | Delete a pending scheduled message from Slack queue. | | SlackApi.GetSlackMessagePermalink | Retrieve a permalink URL for a specific Slack message. | | SlackApi.SendEphemeralMessageSlack | Send an ephemeral message to a user in a Slack channel. | | SlackApi.SendSlackMessage | Sends a message to a Slack channel. | | SlackApi.ListScheduledMessages | Retrieve scheduled messages from Slack. | | SlackApi.ScheduleSlackMessage | Schedule a message to be sent later in Slack. | | SlackApi.CustomUnfurlSlackUrls | Provide custom unfurl behavior for user-posted URLs on Slack. | | SlackApi.AcceptSlackInvite | Accept invitations to a Slack Connect channel. | | SlackApi.ApproveSlackChannelInvitation | Approve an invitation to a Slack Connect channel. | | SlackApi.CreateSlackConversation | Create a new public or private Slack conversation. | | SlackApi.GetConversationInfo | Fetches information about a Slack conversation. | | SlackApi.InviteUserToSlackChannel | Invite users to a Slack channel. | | SlackApi.JoinSlackConversation | Join an existing conversation in Slack. | | SlackApi.ListSlackChannels | Retrieve a list of all channels in a Slack team. | | SlackApi.ListSharedChannelInvites | Retrieve unapproved shared channel invites from Slack. | | SlackApi.SetSlackChannelReadCursor | Update the read cursor in a Slack channel. | | SlackApi.GetSlackConversationMembers | Retrieve members from a specified Slack conversation. | | SlackApi.OpenOrResumeSlackConversation | Open or resume a direct or multi-person message in Slack. | | SlackApi.GetSlackThreadMessages | Retrieve messages from a Slack conversation thread. | | SlackApi.DenySharedInviteRequest | Denies an external user invitation to a Slack channel. | | SlackApi.ListCustomEmojiForTeam | Retrieve a list of custom emojis for a specific team. | | SlackApi.GetExternalFileUploadUrl | Retrieve a URL to upload an external file to Slack. | | SlackApi.GetRemoteFileInfoSlack | Retrieve details about a remote file from Slack. | | SlackApi.GetSlackRemoteFilesInfo | Retrieve information about remote files added to Slack. | | SlackApi.ShareRemoteFileInChannel | Share a remote file into a Slack channel. | | SlackApi.EnableSlackFileSharing | Enable a Slack file for public sharing. | | SlackApi.PinItemToSlackChannel | Pin an item to a Slack channel. | | SlackApi.ListPinnedItems | Retrieve items pinned to a Slack channel. | | SlackApi.AddSlackReaction | Add a reaction to a Slack item. | | SlackApi.RemoveReactionFromItem | Remove a reaction from a Slack item. | | SlackApi.SearchFilesInSlack | Search for files in Slack using a query. | | SlackApi.SearchSlackMessages | Search Slack messages based on a query. | | SlackApi.GetTeamBillableUsersInfo | Retrieves billable users info for the current Slack team. | | SlackApi.GetCurrentSlackTeamInfo | Retrieve information about the current Slack team. | | SlackApi.GetIntegrationLogs | Retrieve integration logs for the current Slack team. | | SlackApi.GetSlackTeamPreferences | Retrieve a list of a workspace's team preferences. | | SlackApi.GetTeamProfile | Retrieve a team's profile information from Slack. | | SlackApi.CreateSlackUserGroup | Creates a new user group in Slack. | | SlackApi.DisableUserGroup | Disable an existing Slack User Group. | | SlackApi.EnableSlackUserGroup | Enable a user group in Slack. | | SlackApi.ListSlackUserGroups | Retrieve all user groups for a Slack team. | | SlackApi.UpdateSlackUserGroup | Update an existing User Group in Slack. | | SlackApi.UpdateSlackUsergroupUsers | Update the list of users in a Slack user group. | | SlackApi.ListAccessibleSlackConversations | Retrieve a list of conversations the user can access on Slack. | | SlackApi.CheckSlackDiscoverability | Check if an email is discoverable on Slack. | | SlackApi.GetSlackUserPresence | Retrieve user presence information from Slack. | | SlackApi.GetUserIdentity | Retrieve a user's identity information from Slack. | | SlackApi.ListSlackTeamUsers | Fetches a list of all users in a Slack team. | | SlackApi.FindSlackUserByEmail | Find a Slack user using their email address. | | SlackApi.GetSlackUserProfile | Retrieve Slack user profile information and custom status. | | SlackApi.SetSlackProfilePhoto | Set the user's profile photo on Slack. | If you need to perform an action that’s not listed here, you can [get in touch\\ with us](mailto:contact@arcade.dev) to request a new tool, or [create your\\ own tools](https://docs.arcade.dev/home/build-tools/create-a-mcp-server). ## SlackApi.AddSlackEmojiAlias [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapiaddslackemojialias) See Example > Add an emoji alias in a Slack Enterprise organization. **Parameters** - **emoji\_alias\_name** ( `string`, required) The new alias for the specified emoji. Whitespace or colons will be automatically trimmed. - **target\_emoji\_name** ( `string`, required) The name of the existing emoji to which the new alias is being added. Remove any surrounding whitespace or colons. ## SlackApi.ListSlackEnterpriseEmojis [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapilistslackenterpriseemojis) See Example > Retrieve emojis for a Slack Enterprise organization. **Parameters** - **pagination\_cursor** ( `string`, optional) Cursor for fetching the next page of emojis. Use ‘next\_cursor’ from the previous response. - **max\_items\_to\_return** ( `integer`, optional) The maximum number of emojis to return, between 1 and 1000 inclusive. (default: ‘100’) ## SlackApi.RenameSlackEmoji [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapirenameslackemoji) See Example > Rename an emoji in a Slack Enterprise organization. **Parameters** - **current\_emoji\_name** ( `string`, required) The current name of the emoji to be renamed. Colons (:myemoji:) around the value are optional. - **new\_emoji\_name** ( `string`, required) The new name to assign to the emoji in the Slack Enterprise organization. ## SlackApi.ListApprovedWorkspaceInviteRequests [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapilistapprovedworkspaceinviterequests) See Example > Retrieve all approved workspace invite requests from Slack. **Parameters** - **workspace\_id** ( `string`, optional) ID for the Slack workspace where the invite requests were made. Required if the Enterprise org has more than one workspace. - **pagination\_cursor** ( `string`, optional) Value of the `next_cursor` from the previous API response for paginating results. - **result\_limit** ( `integer`, optional) Specify the number of results to return, between 1 and 1000 inclusive. (default: ‘100’) ## SlackApi.ListDeniedSlackInviteRequests [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapilistdeniedslackinviterequests) See Example > Retrieve denied Slack workspace invite requests. **Parameters** - **workspace\_team\_id** ( `string`, optional) ID of the workspace where the invite requests were made. Required if the Enterprise org has multiple workspaces. - **pagination\_cursor** ( `string`, optional) The cursor value from the previous API response to fetch the next set of results. Use this for pagination. - **result\_limit** ( `integer`, optional) Specify the number of denied invite request results to return, between 1 and 1000 inclusive. (default: ‘100’) ## SlackApi.ListPendingWorkspaceInvites [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapilistpendingworkspaceinvites) See Example > Retrieve all pending workspace invite requests from Slack. **Parameters** - **workspace\_id** ( `string`, optional) The ID of the workspace to list pending invite requests from. Required for multi-workspace enterprises. - **pagination\_cursor** ( `string`, optional) The cursor value for fetching the next set of invite requests. Use the `next_cursor` from the previous response if available. - **result\_limit** ( `integer`, optional) The number of invite requests to return per call, must be between 1 and 1000. (default: ‘100’) ## SlackApi.ListTeamsInEnterprise [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapilistteamsinenterprise) See Example > Retrieve all teams in an Enterprise organization on Slack. **Parameters** - **maximum\_items\_to\_return** ( `integer`, optional) Specify the maximum number of teams to retrieve. Must be a positive integer, up to 1000. (default: ‘100’) - **pagination\_cursor** ( `string`, optional) Use this to retrieve the next page of results by setting it to the `next_cursor` from the previous response. ## SlackApi.ListSlackWorkspaceOwners [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapilistslackworkspaceowners) See Example > Retrieve all owners in a Slack workspace. **Parameters** - **workspace\_id** ( `string`, required) The unique identifier of the Slack workspace for which to list the owners. - **maximum\_items\_to\_return** ( `integer`, optional) Specifies the maximum number of owners to return, ranging from 1 to 1000. (default: ‘100’) - **pagination\_cursor** ( `string`, optional) The cursor from the previous response used to fetch the next page of owners. Leave empty for the first page. ## SlackApi.FetchWorkspaceSettingsInfo [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapifetchworkspacesettingsinfo) See Example > Retrieve settings information for a Slack workspace. **Parameters** - **slack\_team\_id** ( `string`, required) The unique identifier of the Slack workspace (team) for which to fetch the settings information. ## SlackApi.SetWorkspaceDescription [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapisetworkspacedescription) See Example > Update the description of a Slack workspace. **Parameters** - **workspace\_id** ( `string`, required) The unique identifier for the Slack workspace where the description will be updated. - **workspace\_description** ( `string`, required) The new description to set for the Slack workspace. Provide a clear and concise text. ## SlackApi.SetSlackWorkspaceName [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapisetslackworkspacename) See Example > Update the name of a Slack workspace. **Parameters** - **workspace\_id** ( `string`, required) Unique identifier for the Slack workspace whose name you want to update. - **new\_workspace\_name** ( `string`, required) The desired new name for the Slack workspace. This replaces the existing name. ## SlackApi.ListChannelsForUsergroup [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapilistchannelsforusergroup) See Example > Retrieve channels linked to an org-level user group in Slack. **Parameters** - **usergroup\_id** ( `string`, required) The ID of the IDP group to list channels for. It identifies which organizational group to retrieve the default channels from. - **workspace\_id** ( `string`, optional) The unique identifier for the Slack workspace. - **include\_member\_count\_in\_channels** ( `boolean`, optional) Set to true to include the count of members for each channel, otherwise set to false. ## SlackApi.ListWorkspaceUsers [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapilistworkspaceusers) See Example > Retrieve a list of users from a Slack workspace. **Parameters** - **workspace\_team\_id** ( `string`, optional) The ID of the Slack workspace (e.g., T1234) to filter users from. Only users from this workspace will be listed. - **pagination\_cursor** ( `string`, optional) Use this to navigate through paginated results by setting it to the `next_cursor` from a previous response. - **user\_retrieval\_limit** ( `integer`, optional) Maximum number of users to retrieve per page from the Slack workspace. (default: ‘100’) - **return\_only\_active\_users** ( `boolean`, optional) Return only active users if true; return only deactivated users if false. Default is true. - **include\_deactivated\_user\_workspaces** ( `boolean`, optional) Include workspaces for users even if they are deactivated. Only applies with org token and no team\_id. Default is false. - **return\_only\_guest\_users** ( `boolean`, optional) If true, returns only guests and their expiration dates that belong to the specified team\_id. ## SlackApi.CheckApiCallingCode [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapicheckapicallingcode) See Example > Verify the correctness of API calling code for Slack. **Parameters** - **simulate\_error\_response** ( `string`, optional) Specify an error code to simulate an error response for testing API calls. Useful for testing error handling. ## SlackApi.RevokeSlackToken [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapirevokeslacktoken) See Example > Revoke a Slack authentication token. **Parameters** - **trigger\_testing\_mode** ( `boolean`, optional) Set to true to trigger testing mode where the token will not be revoked. Useful for testing. ## SlackApi.EditSlackBookmark [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapieditslackbookmark) See Example > Edit an existing bookmark in a Slack channel. **Parameters** - **slack\_channel\_id** ( `string`, required) The ID of the Slack channel where the bookmark will be updated. - **target\_bookmark\_id** ( `string`, required) The unique identifier of the bookmark you want to update. - **bookmark\_title** ( `string`, optional) The new title for the bookmark to update. - **bookmark\_link** ( `string`, optional) URL of the bookmark to be edited. Ensure it is a valid format starting with http or https. - **emoji\_tag** ( `string`, optional) The emoji tag to apply to the bookmark link. It should be a valid emoji code (e.g., :smile:). ## SlackApi.RemoveSlackBookmark [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapiremoveslackbookmark) See Example > Remove a bookmark from a Slack channel. **Parameters** - **slack\_channel\_id\_to\_remove\_bookmark** ( `string`, required) The ID of the Slack channel from which the bookmark should be removed. This ID specifies the target channel and is required to locate and delete the bookmark. - **bookmark\_id\_to\_remove** ( `string`, required) The ID of the bookmark to be removed from a Slack channel. Ensure it is specified correctly to delete the correct bookmark. - **quip\_section\_id** ( `string`, optional) The ID of the Quip section to unbookmark. This is required to specify which section’s bookmark should be removed. ## SlackApi.GetSlackBotInfo [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapigetslackbotinfo) See Example > Retrieve details about a Slack bot user. **Parameters** - **target\_bot\_id** ( `string`, optional) The unique bot ID for which information is requested. This ID is specific to each workspace the bot is in. - **team\_id\_for\_org\_token\_use** ( `string`, optional) Encoded team or enterprise ID where the bot exists. Required if using an organization token. Ignored if using a workspace-level token. ## SlackApi.RegisterSlackCall [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapiregisterslackcall) See Example > Registers a new call on Slack. **Parameters** - **unique\_call\_id** ( `string`, required) A unique ID for the Call, provided by the 3rd-party Call provider. Ensure it is unique across all calls from your service. - **call\_join\_url** ( `string`, required) The URL required for a client to join the Call on Slack. - **optional\_human\_readable\_display\_id** ( `string`, optional) An optional, human-readable ID for the call, supplied by the third-party provider. This ID will be displayed in the Call object if given. - **desktop\_app\_join\_url** ( `string`, optional) The URL used to directly launch the 3rd-party Call from Slack clients, if provided. - **call\_start\_timestamp** ( `integer`, optional) Unix timestamp indicating when the call is scheduled to start. - **call\_title** ( `string`, optional) The name of the Call to be registered on Slack. This title will be used to identify the Call within Slack. - **call\_creator\_user\_id** ( `string`, optional) The valid Slack user ID of the creator of this call. Optional if using a user token, which defaults to the authed user. - **participants\_info** ( `array[string]`, optional) A list of participants to register for the call, including ‘slack\_id’, ‘external\_id’, ‘display\_name’, and ‘avatar\_url’ for each user. ## SlackApi.GetCallInformation [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapigetcallinformation) See Example > Retrieve detailed information about a specific call in Slack. **Parameters** - **call\_id** ( `string`, required) The unique identifier of the call as returned by the `calls.add` method. This ID is necessary to retrieve detailed call information. ## SlackApi.AddCallParticipants [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapiaddcallparticipants) See Example > Add new participants to a Slack call. **Parameters** - **call\_id** ( `string`, required) The unique identifier for the call, as returned by the `calls.add` method. This ID specifies which call the participants will be added to. - **participant\_users** ( `array[string]`, required) List of users to add, specified by `slack_id` or `external_id`. Include optional `display_name` and `avatar_url` for each user. ## SlackApi.RemoveCallParticipants [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapiremovecallparticipants) See Example > Remove participants from a Slack call. **Parameters** - **call\_id** ( `string`, required) The unique identifier for the call from which participants are to be removed. This `id` is obtained from the `calls.add` method. - **users\_to\_remove** ( `array[string]`, required) A list of user IDs to remove as participants from the call. Refer to Slack’s documentation for specifying user IDs. ## SlackApi.DeleteScheduledSlackMessage [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapideletescheduledslackmessage) See Example > Delete a pending scheduled message from Slack queue. **Parameters** - **channel\_id** ( `string`, required) The ID of the channel where the scheduled message is set to post. Required to identify the correct message to delete. - **scheduled\_message\_id** ( `string`, required) The ID of the scheduled message to be deleted. This ID is obtained from the `chat.scheduleMessage` response. - **delete\_as\_authenticated\_user** ( `boolean`, optional) Set to true to delete the message as the authenticated user with `chat:write:user` scope. Bot users are considered authenticated users. If false, the message will be deleted with `chat:write:bot` scope. ## SlackApi.GetSlackMessagePermalink [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapigetslackmessagepermalink) See Example > Retrieve a permalink URL for a specific Slack message. **Parameters** - **channel\_id** ( `string`, required) The unique identifier of the Slack conversation or channel containing the message. - **message\_timestamp** ( `string`, required) The unique timestamp of the message to retrieve the permalink for. It identifies the message within the Slack channel. ## SlackApi.SendEphemeralMessageSlack [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapisendephemeralmessageslack) See Example > Send an ephemeral message to a user in a Slack channel. **Parameters** - **target\_channel** ( `string`, required) The channel, private group, or IM channel where the ephemeral message will be sent. Accepts an encoded ID or the channel’s name. - **recipient\_user\_id** ( `string`, required) The ID of the user who will receive the ephemeral message. Must be in the specified channel. - **structured\_attachments** ( `array[string]`, optional) A JSON-encoded array of structured attachments for the message. Presented as a URL-encoded string. - **structured\_blocks** ( `array[string]`, optional) A URL-encoded JSON array of structured Slack block elements. Use for rich message formatting. - **message\_icon\_emoji** ( `string`, optional) Emoji to display as the message icon, overriding icon\_url. Specify using the emoji name like :smile:. - **message\_icon\_url** ( `string`, optional) URL for the image to be used as the icon for the message. It overrides the icon\_emoji if provided. - **message\_markdown\_text** ( `string`, optional) The main text formatted in markdown to be sent as an ephemeral message. Do not use with `blocks` or `text`. Character limit: 12,000. - **message\_parse\_mode** ( `string`, optional) Specifies how the message text is interpreted. Options are: ‘none’, ‘full’, ‘mrkdwn’, or ‘false’. Defaults to ‘none’. (default: ‘none’) - **ephemeral\_message\_text** ( `string`, optional) The main text of the ephemeral message for Slack. It acts as a fallback when using blocks; can be formatted as plain text or markdown. Limit to a few thousand bytes. - **parent\_message\_timestamp** ( `string`, optional) The timestamp of the parent message to post this ephemeral message in its thread. Ensure there is already an active thread. - **bot\_username** ( `string`, optional) The username for the bot sending the ephemeral message. This sets the display name in the Slack message. - **link\_names\_auto\_link** ( `boolean`, optional) Set to true to automatically find and link channel names and usernames. ## SlackApi.SendSlackMessage [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapisendslackmessage) See Example > Sends a message to a Slack channel. **Parameters** - **target\_channel\_id\_or\_name** ( `string`, required) The encoded ID or name of the channel, private group, or IM where the message will be sent. Retrieve using Slack’s conversations.list API. - **message\_attachments** ( `array[string]`, optional) A JSON array of structured attachment objects for the message, provided as a URL-encoded string. Example: `[{"pretext": "pre-hello", "text": "text-world"}]`. - **structured\_blocks** ( `array[string]`, optional) A JSON-based array of structured blocks for constructing messages using Block Kit. Provide as a URL-encoded string. Include fallback text if necessary. - **emoji\_icon\_for\_message** ( `string`, optional) Emoji to display as the icon for the Slack message. Overrides any image URL icon. - **message\_icon\_url** ( `string`, optional) URL to an image to use as the icon for the message. Overrides any specified icon emoji. - **message\_markdown** ( `string`, optional) The message text formatted using markdown, up to 12,000 characters. Cannot be used with `blocks` or `text`. - **message\_metadata** ( `string`, optional) A JSON object with ‘event\_type’ and ‘event\_payload’ fields, URL-encoded, providing additional metadata for the message. - **parse\_mode** ( `string`, optional) Specifies how the message content should be treated. Options are ‘none’ to remove hyperlinks or ‘full’ to ignore markdown formatting. - **message\_text** ( `string`, optional) The main text of the message. Acts as the primary message or a fallback for notifications when using blocks. Supports plain text or markdown. - **thread\_timestamp** ( `string`, optional) Timestamp of the parent message to which this message will be a reply. Use the parent’s `ts` value, not a reply’s. - **bot\_username** ( `string`, optional) The display name to use for the bot when sending the message to Slack. - **post\_as\_authenticated\_user** ( `boolean`, optional) Set to true to post the message as the authenticated user instead of as a bot. Only applicable for classic apps. - **link\_user\_groups** ( `boolean`, optional) Enable linking of user groups in the message. Individual user linking is not supported. - **enable\_slack\_markup\_parsing** ( `boolean`, optional) Set to true to enable Slack markup parsing in the message. Default is enabled. - **broadcast\_reply\_to\_channel** ( `boolean`, optional) Set to true to make the reply visible to everyone in the channel when responding to a thread. Use with ‘thread\_ts’. Default is false. - **enable\_unfurling\_text\_content** ( `boolean`, optional) Set to true to enable unfurling of primarily text-based content in Slack messages. - **disable\_media\_unfurling** ( `boolean`, optional) Set to false to enable media unfurling and true to disable it. (default: ‘false’) ## SlackApi.ListScheduledMessages [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapilistscheduledmessages) See Example > Retrieve scheduled messages from Slack. **Parameters** - **channel\_id** ( `string`, optional) The ID of the Slack channel from which to retrieve scheduled messages. - **pagination\_cursor** ( `string`, optional) Cursor value for pagination to specify the starting point of the list from a previous call. - **latest\_timestamp** ( `string`, optional) A Unix timestamp marking the latest point in the time range for fetching scheduled messages. Ensure it is greater than the `oldest` timestamp if both are set. - **max\_number\_of\_entries** ( `integer`, optional) Specify the maximum number of scheduled messages to return from Slack. - **oldest\_timestamp** ( `string`, optional) A Unix timestamp representing the start of the time range for scheduled messages. It must be less than the `latest_timestamp` if both are specified. - **team\_id** ( `string`, optional) Encoded team ID to specify which team’s channels to list. Required if using an org-level token; ignore for workspace-level tokens. ## SlackApi.ScheduleSlackMessage [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapischeduleslackmessage) See Example > Schedule a message to be sent later in Slack. **Parameters** - **slack\_channel\_id\_or\_name** ( `string`, required) Specify the target Slack channel, private group, or DM. Use an encoded ID or the channel name. Retrieve channel ID via `conversations.list`. - **schedule\_time\_unix\_timestamp** ( `integer`, required) Unix timestamp for when the message should be posted to Slack. Must be within 120 days and not exceed 30 messages per 5-minute window. - **attachments\_json** ( `string`, optional) A JSON array of structured attachments as a URL-encoded string for the Slack message. - **structured\_blocks\_json** ( `string`, optional) A URL-encoded string of a JSON-based array containing structured blocks for message formatting. - **message\_markdown** ( `string`, optional) Message text in markdown format. Avoid using with ‘blocks’ or ‘text’. Maximum 12,000 characters. - **message\_parsing\_mode** ( `string`, optional) Specifies how the message content should be parsed and interpreted when sending to Slack. For more details, refer to chat.postMessage documentation. - **message\_text** ( `string`, optional) The main body of the Slack message or a fallback text when using blocks. Can be plain text or formatted with mrkdwn. - **parent\_message\_timestamp** ( `string`, optional) Timestamp of the parent message to which this message is a reply. Use the original message’s timestamp, not a reply’s timestamp. - **metadata\_json** ( `string`, optional) JSON object containing ‘event\_type’ and ‘event\_payload’ fields. Must be URL-encoded. Note: using this will prevent scheduled messages from posting. - **enable\_group\_linking** ( `boolean`, optional) Set to true to link user groups in the message. Linking individual users is not supported; use mention syntax instead. - **make\_reply\_visible\_to\_everyone** ( `boolean`, optional) Set to true to make the reply visible to everyone in the channel or conversation. Use with `thread_ts`. Defaults to false. - **enable\_link\_unfurling** ( `boolean`, optional) Pass true to enable unfurling of primarily text-based content. - **disable\_unfurling\_of\_media\_content** ( `boolean`, optional) Set to true to disable unfurling of media content. Defaults to false. ## SlackApi.CustomUnfurlSlackUrls [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapicustomunfurlslackurls) See Example > Provide custom unfurl behavior for user-posted URLs on Slack. **Parameters** - **channel\_id** ( `string`, required) ID of the Slack channel where the message is posted. Required with ‘ts’ for custom unfurl or with ‘unfurl\_id’ and ‘source’. - **message\_timestamp** ( `string`, required) Timestamp of the message to which unfurl behavior will be added. Ensure it corresponds to a message in the specified channel containing a fully-qualified URL registered with your Slack app. - **unfurl\_url\_map** ( `string`, required) A URL-encoded JSON map with URLs as keys and their corresponding unfurl data as values. Each URL should point to a single attachment, like message buttons. - **authentication\_invitation\_message** ( `string`, optional) A simple formatted string sent as an ephemeral message inviting the user to authenticate for full unfurl behavior. Supports Slack’s _bold_, _italics_, and linking formatting. If provided, this takes precedence over `authentication_invitation_url`. - **custom\_authentication\_url** ( `string`, optional) A URL to redirect users for app authentication to enable full URL unfurling, requires URL encoding. - **user\_authentication\_blocks** ( `array[string]`, optional) A URL-encoded JSON array of structured blocks to send as an ephemeral message for user authentication invitation. - **unfurl\_link\_id** ( `string`, optional) The ID of the link to unfurl. Must be used with ‘source’. - **link\_source** ( `string`, optional) Specify the source of the link to unfurl as either ‘composer’ for links inside the message composer or ‘conversations\_history’ for links posted to a conversation. Must be used with ‘unfurl\_id’, or alternatively with ‘channel’ and ‘ts’. - **require\_user\_authentication** ( `boolean`, optional) Set to true if the user must install your Slack app to trigger unfurls for this domain. ## SlackApi.AcceptSlackInvite [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapiacceptslackinvite) See Example > Accept invitations to a Slack Connect channel. **Parameters** - **channel\_name** ( `string`, required) Provide the desired name for the Slack Connect channel. If the channel doesn’t exist in your workspace, this name will be assigned to it. - **invite\_id** ( `string`, optional) ID of the invitation you want to accept. Must provide either this or channel\_id. - **slack\_channel\_id\_to\_accept** ( `string`, optional) The ID of the channel you would like to accept the invitation for. Either this or `invite_id` is required. - **workspace\_id** ( `string`, optional) The ID of the workspace where the channel should be accepted. Required if using an org-level token. - **is\_channel\_private** ( `boolean`, optional) True to make the channel private; false to make it public. - **use\_free\_trial** ( `boolean`, optional) Set to ‘True’ to use your workspace’s free trial to start using Slack Connect. ## SlackApi.ApproveSlackChannelInvitation [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapiapproveslackchannelinvitation) See Example > Approve an invitation to a Slack Connect channel. **Parameters** - **shared\_channel\_invite\_id** ( `string`, required) The ID of the shared channel invitation you want to approve. It is required to specifically identify which invitation is being approved for the Slack Connect channel. - **other\_party\_team\_id** ( `string`, optional) The team or enterprise ID of the other party involved in the Slack Connect invitation you are approving. ## SlackApi.CreateSlackConversation [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapicreateslackconversation) See Example > Create a new public or private Slack conversation. **Parameters** - **channel\_name** ( `string`, required) The name of the new Slack channel to create. It must contain only lowercase letters, numbers, hyphens, and underscores, and be 80 characters or less. - **encoded\_team\_id** ( `string`, optional) The encoded team ID where the channel will be created. Required when using an organization-level token. Ignored if using a workspace-level token. - **create\_private\_channel** ( `boolean`, optional) Set to true to create a private channel instead of a public one. ## SlackApi.GetConversationInfo [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapigetconversationinfo) See Example > Fetches information about a Slack conversation. **Parameters** - **conversation\_id** ( `string`, required) The unique ID of the Slack conversation to retrieve information for. - **include\_locale** ( `boolean`, optional) Set to `true` to receive the locale for this conversation. Defaults to `false`. - **include\_member\_count** ( `boolean`, optional) Set to true to include the member count for the specified conversation. Defaults to false. ## SlackApi.InviteUserToSlackChannel [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapiinviteusertoslackchannel) See Example > Invite users to a Slack channel. **Parameters** - **slack\_channel\_id** ( `string`, required) The ID of the Slack channel to invite users to. It can be a public or private channel ID. - **user\_ids\_list** ( `string`, required) A list of up to 100 user IDs to invite, separated by commas. - **continue\_with\_valid\_users** ( `boolean`, optional) Set to true to invite valid users while ignoring invalid IDs when multiple user IDs are provided. Default is false. ## SlackApi.JoinSlackConversation [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapijoinslackconversation) See Example > Join an existing conversation in Slack. **Parameters** - **conversation\_id** ( `string`, required) The ID of the conversation or channel you want to join in Slack. ## SlackApi.ListSlackChannels [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapilistslackchannels) See Example > Retrieve a list of all channels in a Slack team. **Parameters** - **pagination\_cursor** ( `string`, optional) The cursor used to paginate through data collections. Use the `next_cursor` from a previous response to continue; omit for the first page. - **maximum\_number\_of\_channels** ( `integer`, optional) Specify the maximum number of channels to return. Must be an integer under 1000. Note that fewer channels than requested may be returned. (default: ‘100’) - **team\_id\_for\_org\_app** ( `string`, optional) Encoded team ID to list channels. Required for org-level tokens; ignored for workspace-level tokens. - **channel\_types** ( `string`, optional) Comma-separated list of channel types to include, e.g., ‘public\_channel’, ‘private\_channel’, ‘mpim’, ‘im’. (default: ‘public\_channel’) - **exclude\_archived\_channels** ( `boolean`, optional) Set to true to exclude archived channels from the list of Slack channels. Default is false. ## SlackApi.ListSharedChannelInvites [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapilistsharedchannelinvites) See Example > Retrieve unapproved shared channel invites from Slack. **Parameters** - **workspace\_team\_id** ( `string`, optional) The encoded team ID for the workspace to retrieve invites from. Required when using an organization token. - **maximum\_invites\_to\_return** ( `integer`, optional) Specify the maximum number of unapproved shared channel invites to retrieve. (default: ‘100’) - **pagination\_cursor** ( `string`, optional) The cursor for paginating through results, obtained from a previous call’s next\_cursor. ## SlackApi.SetSlackChannelReadCursor [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapisetslackchannelreadcursor) See Example > Update the read cursor in a Slack channel. **Parameters** - **channel\_id** ( `string`, required) The ID of the Slack channel or conversation where you want to set the read cursor. This should be a valid Slack channel ID. - **timestamp\_of\_message\_to\_mark\_as\_read** ( `string`, required) The unique identifier (timestamp) of the message you want to mark as most recently seen in the conversation. ## SlackApi.GetSlackConversationMembers [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapigetslackconversationmembers) See Example > Retrieve members from a specified Slack conversation. **Parameters** - **conversation\_id** ( `string`, required) The ID of the Slack conversation to retrieve members from. This can be a channel, group, or direct message. - **pagination\_cursor** ( `string`, optional) Cursor for pagination, set to the `next_cursor` value from a previous response to continue retrieving members from a conversation. - **max\_items\_to\_return** ( `integer`, optional) The maximum number of conversation members to return. Recommended to specify a value under 1000, with no more than 200 results at a time for optimal pagination. (default: ‘100’) ## SlackApi.OpenOrResumeSlackConversation [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapiopenorresumeslackconversation) See Example > Open or resume a direct or multi-person message in Slack. **Parameters** - **conversation\_channel\_id** ( `string`, optional) The ID of an existing direct or multi-person message channel to resume. Alternatively, provide the `users` field to start a new conversation. - **target\_user\_ids** ( `string`, optional) A comma-separated list of user IDs to open or resume a conversation. Provide 1 to 8 IDs. Supplying 1 ID opens a 1:1 DM, while more than 1 ID opens a multi-person DM. Do not include the caller’s ID. - **return\_full\_im\_channel\_definition** ( `boolean`, optional) Set to true to receive the entire IM channel definition; false returns only the conversation ID. - **prevent\_creation** ( `boolean`, optional) If true, does not create a new conversation and instead checks for an existing DM or MPDM. ## SlackApi.GetSlackThreadMessages [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapigetslackthreadmessages) See Example > Retrieve messages from a Slack conversation thread. **Parameters** - **conversation\_id** ( `string`, required) The ID of the Slack conversation from which to fetch the message thread. - **thread\_message\_timestamp** ( `string`, required) Unique identifier of a parent message or a thread message (timestamp). Fetches the thread or the single message. - **pagination\_cursor** ( `string`, optional) Cursor for pagination. Use the `next_cursor` from a previous response to fetch the next page of data. - **latest\_message\_timestamp** ( `string`, optional) Only include messages posted before this Unix timestamp in the results. (default: ‘now’) - **maximum\_items\_to\_return** ( `integer`, optional) Specify the maximum number of messages to fetch. The default and maximum are 15 for certain apps, with possible rate limits. (default: ‘1000’) - **start\_time\_unix\_timestamp** ( `string`, optional) Only include messages after this Unix timestamp in results. (default: ‘0’) - **include\_all\_message\_metadata** ( `boolean`, optional) Set to true to return all metadata associated with this message. - **include\_boundary\_timestamps** ( `boolean`, optional) Include messages with ‘oldest’ or ‘latest’ timestamps. Ignored unless either timestamp is specified. ## SlackApi.DenySharedInviteRequest [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapidenysharedinviterequest) See Example > Denies an external user invitation to a Slack channel. **Parameters** - **shared\_channel\_invite\_id** ( `string`, required) The ID for the shared channel invite request that you intend to deny. This is required for specifying which invite to decline. - **deny\_invite\_message** ( `string`, optional) An optional message explaining why the invitation was denied. This message will be sent to the requester. ## SlackApi.ListCustomEmojiForTeam [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapilistcustomemojiforteam) See Example > Retrieve a list of custom emojis for a specific team. **Parameters** - **include\_emoji\_categories** ( `boolean`, optional) Set to true to include categories for Unicode emojis in the response. ## SlackApi.GetExternalFileUploadUrl [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapigetexternalfileuploadurl) See Example > Retrieve a URL to upload an external file to Slack. **Parameters** - **file\_size\_in\_bytes** ( `integer`, required) Specify the size of the file to be uploaded, measured in bytes. Ensure this value accurately reflects the file size. - **file\_name** ( `string`, required) The name of the file to be uploaded to Slack. - **snippet\_syntax\_type** ( `string`, optional) Specify the syntax highlighting type for the snippet being uploaded, such as ‘javascript’, ‘python’, etc. - **alt\_text\_description** ( `string`, optional) A description of the image for screen-readers, limited to 1000 characters. ## SlackApi.GetRemoteFileInfoSlack [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapigetremotefileinfoslack) See Example > Retrieve details about a remote file from Slack. **Parameters** - **file\_external\_identifier** ( `string`, optional) The GUID defined by the creator for the remote file to retrieve its information. - **file\_id** ( `string`, optional) The unique identifier of the file to retrieve information about. Use this to specify the file in Slack. ## SlackApi.GetSlackRemoteFilesInfo [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapigetslackremotefilesinfo) See Example > Retrieve information about remote files added to Slack. **Parameters** - **filter\_by\_channel\_id** ( `string`, optional) Filter remote files to only include those appearing in the specified Slack channel, indicated by its channel ID. - **pagination\_cursor** ( `string`, optional) A cursor for paginating through data. Use the `next_cursor` from a prior request to fetch the next set of results. Defaults to the first page if not set. - **maximum\_items\_to\_return** ( `integer`, optional) Specify the maximum number of remote file records to retrieve from Slack. - **filter\_files\_from\_timestamp** ( `string`, optional) Filter files created after this inclusive timestamp. Use a Unix timestamp format. (default: ‘0’) - **timestamp\_filter\_end** ( `string`, optional) Filter files created before this timestamp (inclusive) in Unix epoch time format. (default: ‘now’) ## SlackApi.ShareRemoteFileInChannel [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapishareremotefileinchannel) See Example > Share a remote file into a Slack channel. **Parameters** - **target\_channel\_ids** ( `string`, required) Comma-separated list of Slack channel IDs where the remote file will be shared. Ensure IDs are valid and the user has permission to share files in these channels. - **file\_external\_identifier** ( `string`, optional) The globally unique identifier (GUID) for the file set by the app when registering with Slack. Required if ‘file’ is not provided. - **file\_id** ( `string`, optional) The ID of a file registered with Slack to be shared. Required if `external_id` is not provided. ## SlackApi.EnableSlackFileSharing [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapienableslackfilesharing) See Example > Enable a Slack file for public sharing. **Parameters** - **file\_id\_to\_share** ( `string`, required) The ID of the file on Slack that you want to enable for public sharing. ## SlackApi.PinItemToSlackChannel [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapipinitemtoslackchannel) See Example > Pin an item to a Slack channel. **Parameters** - **channel\_id** ( `string`, required) The ID of the Slack channel where the message will be pinned. A `timestamp` must also be provided. - **message\_timestamp** ( `string`, optional) The timestamp ( `ts`) of the message to pin in the Slack channel. Ensure the channel is also specified. ## SlackApi.ListPinnedItems [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapilistpinneditems) See Example > Retrieve items pinned to a Slack channel. **Parameters** - **channel\_id** ( `string`, required) The ID of the Slack channel to retrieve pinned items from. This is required to specify which channel’s pinned items will be listed. ## SlackApi.AddSlackReaction [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapiaddslackreaction) See Example > Add a reaction to a Slack item. **Parameters** - **slack\_channel\_id** ( `string`, required) ID of the channel where the message is posted. Use to specify the location for adding a reaction. - **reaction\_emoji\_name** ( `string`, required) The name of the emoji to be used as a reaction. Include skin tone modifiers if applicable (e.g., ‘thumbsup::skin-tone-2’). - **message\_timestamp** ( `string`, required) The timestamp of the message to which the reaction will be added. Ensure the format matches the Slack API requirements. ## SlackApi.RemoveReactionFromItem [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapiremovereactionfromitem) See Example > Remove a reaction from a Slack item. **Parameters** - **reaction\_emoji\_name** ( `string`, required) The name of the emoji reaction to be removed, such as ‘smile’ or ‘thumbsup’. - **target\_file\_id** ( `string`, optional) The identifier of the file from which to remove the reaction. Specify either this, `target_file_comment_id`, or both `target_channel_id` and `target_message_timestamp`. - **file\_comment\_id** ( `string`, optional) The ID of the file comment from which you want to remove the reaction. Provide this if the reaction is on a file comment. - **message\_channel\_id** ( `string`, optional) Channel ID where the message to remove the reaction from was posted. Required if removing a reaction from a message. Use in combination with ‘message\_timestamp’. - **message\_timestamp** ( `string`, optional) The exact timestamp of the message from which to remove the reaction. Specify when targeting a message. ## SlackApi.SearchFilesInSlack [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapisearchfilesinslack) See Example > Search for files in Slack using a query. **Parameters** - **search\_query** ( `string`, required) The text string to search for in Slack files. Use keywords or phrases to narrow down results. - **items\_per\_page** ( `integer`, optional) The number of file results to return per page. Maximum allowed value is 100. (default: ‘20’) - **results\_page\_number** ( `integer`, optional) The specific page number of results to retrieve, with a maximum value of 100. (default: ‘1’) - **sort\_files\_by** ( `string`, optional) Specify how to sort the search results: either by ‘score’ or ‘timestamp’. (default: ‘score’) - **sort\_direction** ( `string`, optional) Change the sort direction for search results to ascending (‘asc’) or descending (‘desc’). (default: ‘desc’) - **encoded\_team\_id** ( `string`, optional) Encoded team ID to specify the search domain when using an org-level token. Ignored with a workspace-level token. - **enable\_query\_highlight** ( `boolean`, optional) Set to true to enable highlight markers for matching query terms in the search results. ## SlackApi.SearchSlackMessages [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapisearchslackmessages) See Example > Search Slack messages based on a query. **Parameters** - **search\_query** ( `string`, required) The text to search for in Slack messages. Use keywords or phrases to narrow down results. - **results\_per\_page** ( `integer`, optional) The number of search results to return per page, with a maximum limit of 100. (default: ‘20’) - **page\_number** ( `integer`, optional) The page number of search results to retrieve, maximum value of 100. (default: ‘1’) - **pagination\_cursor** ( `string`, optional) Use ’\*’ for the first call to start pagination or provide the ‘next\_cursor’ value from previous results to continue. - **sort\_results\_by** ( `string`, optional) Specify the criterion for sorting the search results, either by ‘score’ for relevance or ‘timestamp’ for chronological order. (default: ‘score’) - **sort\_direction** ( `string`, optional) Specify the order for sorting results: use ‘asc’ for ascending or ‘desc’ for descending. (default: ‘desc’) - **team\_id** ( `string`, optional) The encoded team ID to search within. Required only if an organization-level token is used. Ignored for workspace-level tokens. - **enable\_query\_highlighting** ( `boolean`, optional) Set to true to enable query highlight markers, marking matching terms in the results. ## SlackApi.GetTeamBillableUsersInfo [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapigetteambillableusersinfo) See Example > Retrieves billable users info for the current Slack team. **Parameters** - **pagination\_cursor** ( `string`, optional) Cursor for pagination. Use the `next_cursor` from the previous response to fetch the next page of users. (default: ‘fetches the first page’) - **maximum\_items\_to\_return** ( `integer`, optional) Specifies the maximum number of billable user entries to be retrieved. - **specific\_user\_id** ( `string`, optional) The ID of a specific user to retrieve billable information for. Leave empty to retrieve info for all users. - **encoded\_team\_id** ( `string`, optional) Encoded team ID for retrieving billable info, required if using an org token. Ignored with workspace-level tokens. ## SlackApi.GetCurrentSlackTeamInfo [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapigetcurrentslackteaminfo) See Example > Retrieve information about the current Slack team. **Parameters** - **query\_by\_domain** ( `string`, optional) Comma-separated domains to query instead of a team, used when the team is not specified. This only works for domains in the same enterprise as the querying team token. - **specific\_team\_id** ( `string`, optional) The ID of the Slack team to retrieve information about. If omitted, information about the current team will be returned. ## SlackApi.GetIntegrationLogs [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapigetintegrationlogs) See Example > Retrieve integration logs for the current Slack team. **Parameters** - **filter\_by\_app\_id** ( `string`, optional) Filter integration logs to a specific Slack app. If not provided, logs for all apps are retrieved. - **filter\_by\_change\_type** ( `string`, optional) Specify the change type to filter logs. Options: ‘added’, ‘removed’, ‘enabled’, ‘disabled’, ‘updated’. Defaults to all logs. - **result\_count** ( `string`, optional) The number of log entries to retrieve. Specify the maximum number of logs to return in a single request. (default: ‘100’) - **result\_page\_number** ( `string`, optional) The specific page number of the integration logs to retrieve. Used for pagination. (default: ‘1’) - **filter\_by\_service\_id** ( `string`, optional) Specify the service ID to filter integration logs related to a specific service. If not provided, logs for all services will be retrieved. - **encoded\_team\_id** ( `string`, optional) The encoded team ID to get logs from, required if using an org-level token. Ignored if using a workspace-level token. - **filter\_by\_user** ( `string`, optional) Filter logs generated by a specific user’s actions. Defaults to all logs if not specified. ## SlackApi.GetSlackTeamPreferences [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapigetslackteampreferences) See Example > Retrieve a list of a workspace’s team preferences. **Parameters** This tool does not take any parameters. ## SlackApi.GetTeamProfile [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapigetteamprofile) See Example > Retrieve a team’s profile information from Slack. **Parameters** - **visibility\_filter** ( `string`, optional) Filter the profile fields based on visibility. Options: ‘all’, ‘visible’, ‘hidden’. Default is ‘all’. ## SlackApi.CreateSlackUserGroup [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapicreateslackusergroup) See Example > Creates a new user group in Slack. **Parameters** - **user\_group\_name** ( `string`, required) A unique name for the user group to be created, distinguishing it from other user groups. - **default\_channel\_ids** ( `array[string]`, optional) A list of channel IDs to set as default for the User Group. Use comma-separated values. - **custom\_additional\_channels** ( `array[string]`, optional) Comma-separated encoded channel IDs where the User Group can add members. - **user\_group\_description** ( `string`, optional) A brief text describing the purpose or role of the user group in Slack. - **unique\_mention\_handle** ( `string`, optional) A unique mention handle for the user group. It must not duplicate existing handles of channels, users, or other user groups. - **team\_id\_for\_user\_group\_creation** ( `string`, optional) Encoded team ID for the user group creation, required if using an org-level token. - **include\_user\_count** ( `boolean`, optional) Set to true to include the number of users in each User Group. - **enable\_display\_as\_sidebar\_section** ( `boolean`, optional) Set to true to display the user group as a sidebar section for all group members if the group has one or more default channels. ## SlackApi.DisableUserGroup [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapidisableusergroup) See Example > Disable an existing Slack User Group. **Parameters** - **user\_group\_id** ( `string`, required) The encoded ID of the User Group to be disabled. - **team\_id** ( `string`, optional) Encoded target team ID where the user group exists. Required only if using an org-level token; ignored for workspace-level tokens. - **include\_user\_count** ( `boolean`, optional) Include the number of users in the User Group. Set to true to include the count. ## SlackApi.EnableSlackUserGroup [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapienableslackusergroup) See Example > Enable a user group in Slack. **Parameters** - **user\_group\_id** ( `string`, required) The encoded ID of the User Group to be enabled in Slack. - **team\_id** ( `string`, optional) Provide the encoded team ID where the user group is located. Only required if using an org-level token. Ignored with workspace-level tokens. - **include\_user\_count** ( `boolean`, optional) Set to true to include the number of users in the User Group. ## SlackApi.ListSlackUserGroups [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapilistslackusergroups) See Example > Retrieve all user groups for a Slack team. **Parameters** - **team\_id\_for\_org\_token** ( `string`, optional) Encoded team ID required when using an org-level token. Ignored if using a workspace-level token. - **include\_user\_count** ( `boolean`, optional) Set to true to include the number of users in each User Group. - **include\_disabled\_groups** ( `boolean`, optional) Set to true to include disabled user groups in the results. - **include\_users\_in\_group** ( `boolean`, optional) Include the list of users for each User Group in the response. ## SlackApi.UpdateSlackUserGroup [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapiupdateslackusergroup) See Example > Update an existing User Group in Slack. **Parameters** - **user\_group\_id** ( `string`, required) The encoded ID of the User Group to update in Slack. - **default\_channel\_ids** ( `array[string]`, optional) A comma-separated list of channel IDs where the User Group is set as default. Use encoded channel IDs. - **additional\_channel\_ids** ( `array[string]`, optional) Comma separated encoded channel IDs for custom additions to user group members. - **user\_group\_description** ( `string`, optional) A short description of the User Group to update in Slack. This should clearly define the group’s purpose or role. - **user\_group\_handle** ( `string`, optional) Unique mention handle for the User Group, distinct from all channels, users, and other User Groups. - **user\_group\_name** ( `string`, optional) A unique name for the User Group to update. Ensure it does not duplicate any existing User Group names. - **team\_id\_for\_org\_token** ( `string`, optional) Encoded team ID where the user group exists, required for org-level tokens. Ignored if using a workspace-level token. - **include\_user\_count** ( `boolean`, optional) Set to true to include the number of users in the User Group. - **enable\_sidebar\_section** ( `boolean`, optional) Set to true to configure the user group to appear as a sidebar section for all group members. Only relevant if the group has 1 or more default channels. ## SlackApi.UpdateSlackUsergroupUsers [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapiupdateslackusergroupusers) See Example > Update the list of users in a Slack user group. **Parameters** - **user\_group\_id** ( `string`, required) The encoded ID of the Slack user group to update. - **user\_ids\_list** ( `array[string]`, required) A comma separated string of encoded Slack user IDs representing the complete user list for the group. This replaces all current members. - **team\_id\_for\_org\_token** ( `string`, optional) Encoded team ID where the user group exists. Required if using an organization token; ignored with workspace-level token. - **update\_additional\_channels** ( `array[string]`, optional) Encoded channel IDs to add user group members to, separated by commas. These represent additional channels for custom user group member additions. - **include\_user\_count** ( `boolean`, optional) Set to true to include the number of users in the user group in the response. - **is\_shared\_section** ( `boolean`, optional) Indicates if the API call involves a shared section. Set to true if it does, otherwise false. ## SlackApi.ListAccessibleSlackConversations [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapilistaccessibleslackconversations) See Example > Retrieve a list of conversations the user can access on Slack. **Parameters** - **pagination\_cursor** ( `string`, optional) A cursor for pagination to continue listing conversations from a specific point. Use the ‘next\_cursor’ from a previous response. Default is the first page. - **maximum\_items\_to\_return** ( `integer`, optional) The maximum number of conversations to return in the response. Must be an integer with a maximum value of 999. It is recommended to request no more than 200 results at a time for optimal performance. (default: ‘100’) - **slack\_team\_id** ( `string`, optional) The encoded ID of the Slack team to list conversations for. Required if using an organization-level token. Ignored if a workspace-level token is used. - **channel\_types** ( `string`, optional) Comma-separated list of channel types to filter conversations. Options: public\_channel, private\_channel, mpim, im. (default: ‘public\_channel’) - **specific\_user\_id** ( `string`, optional) Filter conversations by a specific user ID’s membership. Only includes conversations shared with the calling user. - **exclude\_archived\_channels** ( `boolean`, optional) Set to true to exclude archived channels from the retrieved list of Slack conversations. (default: false) ## SlackApi.CheckSlackDiscoverability [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapicheckslackdiscoverability) See Example > Check if an email is discoverable on Slack. **Parameters** - **email\_to\_check** ( `string`, required) The email address to verify if it is associated with a discoverable Slack user. ## SlackApi.GetSlackUserPresence [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapigetslackuserpresence) See Example > Retrieve user presence information from Slack. **Parameters** - **target\_user\_id** ( `string`, optional) The Slack user ID for which you want to retrieve presence information. (default: ‘authed user’) ## SlackApi.GetUserIdentity [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapigetuseridentity) See Example > Retrieve a user’s identity information from Slack. **Parameters** This tool does not take any parameters. ## SlackApi.ListSlackTeamUsers [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapilistslackteamusers) See Example > Fetches a list of all users in a Slack team. **Parameters** - **pagination\_cursor** ( `string`, optional) Cursor for paginating through data. Use the `next_cursor` from a previous response to continue. - **maximum\_items\_to\_return** ( `integer`, optional) Maximum number of users to return (recommended max is 200 for pagination). - **slack\_team\_id** ( `string`, optional) The encoded team ID to list users from, necessary if an organization-level token is used. Ignored if a workspace-level token is provided. - **include\_user\_locale** ( `boolean`, optional) Set to true to receive locale information for each user. Default is false. ## SlackApi.FindSlackUserByEmail [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapifindslackuserbyemail) See Example > Find a Slack user using their email address. **Parameters** - **user\_email\_address** ( `string`, required) The email address of the user in the Slack workspace to search for. ## SlackApi.GetSlackUserProfile [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapigetslackuserprofile) See Example > Retrieve Slack user profile information and custom status. **Parameters** - **target\_user\_id** ( `string`, optional) The unique identifier of the Slack user whose profile information is to be retrieved. - **include\_labels** ( `boolean`, optional) Include labels for each ID in custom profile fields. This option can heavily rate-limit requests and is not recommended. Default is false. ## SlackApi.SetSlackProfilePhoto [Permalink for this section](https://docs.arcade.dev/mcp-servers/social-communication/slack_api\#slackapisetslackprofilephoto) See Example > Set the user’s profile photo on Slack. **Parameters** - **crop\_box\_size** ( `string`, optional) The size of the square crop box for the profile photo in pixels. Specify the width and height, which are the same value for a square. - **crop\_box\_x\_coordinate** ( `string`, optional) X coordinate of the top-left corner of the crop box for the profile photo. - **crop\_y\_coordinate** ( `string`, optional) Y coordinate of the top-left corner of the crop box for the user’s profile photo on Slack. This determines where the cropping of the image will start on the vertical axis. - **profile\_photo\_image** ( `string`, optional) The image file to set as the Slack profile photo. Provide image data directly with the correct content type (e.g., image/jpeg, image/png). ## Get Building [Use tools hosted on Arcade Cloud\\ \\ Arcade tools are hosted by our cloud platform and ready to be used in your agents. Learn how.](https://docs.arcade.dev/home/quickstart) [Self Host Arcade tools\\ \\ Arcade tools can be self-hosted on your own infrastructure. Learn more about self-hosting.\\ \\ ```\\ pip install arcade_slack_api\\ ```](https://docs.arcade.dev/home/hosting-overview) [Reddit](https://docs.arcade.dev/mcp-servers/social-communication/reddit "Reddit") [Reference](https://docs.arcade.dev/mcp-servers/social-communication/teams/reference "Reference") Frame # Status embed installed correctly This will be shown if an incident or maintenance is posted on your status page. [View latest updates](https://status.arcade.dev/?utm_source=embed)