From 2fef6a178e7508cf6a17f7939e7fedde399340d2 Mon Sep 17 00:00:00 2001 From: Rachel Lee Nabors Date: Tue, 30 Dec 2025 17:41:40 +0000 Subject: [PATCH 01/26] =?UTF-8?q?tentatively=20scaffolds=20new=20folder=20?= =?UTF-8?q?structure=E2=80=94very=20breaking,=20much=20sad?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/en/_meta.tsx | 165 +++++++++++++++-- .../about-arcade}/page.mdx | 14 +- .../quickstarts/call-tool-agent}/page.mdx | 0 .../quickstarts/call-tool-client}/page.mdx | 0 .../mcp-server-quickstart}/page.mdx | 0 .../setup}/api-keys/page.mdx | 0 .../setup/connect-arcade-docs}/page.mdx | 0 .../agent-frameworks}/crewai/_meta.tsx | 0 .../crewai/custom-auth-flow/page.mdx | 0 .../crewai/use-arcade-tools/page.mdx | 0 .../agent-frameworks}/google-adk/_meta.tsx | 0 .../google-adk/overview/page.mdx | 0 .../google-adk/use-arcade-tools/page.mdx | 0 .../agent-frameworks}/langchain/_meta.tsx | 0 .../langchain/auth-langchain-tools/page.mdx | 0 .../langchain/use-arcade-tools/page.mdx | 0 .../use-arcade-with-langchain/page.mdx | 0 .../langchain/user-auth-interrupts/page.mdx | 0 .../agent-frameworks}/mastra/_meta.tsx | 0 .../mastra/overview/page.mdx | 0 .../mastra/use-arcade-tools/page.mdx | 0 .../mastra/user-auth-interrupts/page.mdx | 0 .../agent-frameworks/openai-agents}/_meta.tsx | 0 .../openai-agents}/overview/page.mdx | 0 .../openai-agents}/use-arcade-tools/page.mdx | 0 .../user-auth-interrupts/page.mdx | 0 .../agent-frameworks}/page.mdx | 0 .../agent-frameworks}/vercelai/_meta.tsx | 0 .../vercelai/using-arcade-tools/page.mdx | 0 .../registry-early-access/page.mdx | 0 .../registry-early-access/take-survey.tsx | 0 .../error-handling/migrate-toolkits}/page.mdx | 0 .../error-handling/retry-tools}/page.mdx | 0 .../useful-tool-errors}/page.mdx | 0 .../create-tools}/evaluate-tools/_meta.tsx | 0 .../create-evaluation-suite}/page.mdx | 0 .../evaluate-tools/run-evaluations/page.mdx | 0 .../evaluate-tools/why-evaluate}/page.mdx | 0 .../create-tools}/mcp-gateways/page.mdx | 0 .../performance}/types-of-tools/page.mdx | 0 .../tool-basics/build-mcp-server}/page.mdx | 0 .../tool-basics/call-tools-mcp}/page.mdx | 0 .../compare-server-types/page.mdx | 0 .../tool-basics/create-tool-auth}/page.mdx | 0 .../tool-basics/create-tool-secrets}/page.mdx | 0 .../tool-basics/organize-mcp-tools}/page.mdx | 0 .../tool-basics/runtime-data-access}/page.mdx | 0 .../deployment-hosting}/_meta.tsx | 0 .../deployment-hosting/arcade-cloud}/page.mdx | 0 .../arcade-deploy/page.mdx | 0 .../configure-engine}/page.mdx | 0 .../deployment-hosting/on-prem}/page.mdx | 0 .../deployment-hosting}/page.mdx | 0 .../security}/secure-your-mcp-server/page.mdx | 0 .../security}/securing-arcade-mcp/page.mdx | 0 .../security-research-program}/page.mdx | 0 .../call-third-party-apis-directly/page.mdx | 0 .../custom-apps}/auth-tool-calling/page.mdx | 0 .../get-tool-definitions/page.mdx | 0 .../custom-apps}/tool-auth-status/page.mdx | 0 .../tool-calling}/error-handling/page.mdx | 0 .../tool-calling}/mcp-clients/_meta.tsx | 0 .../mcp-clients/claude-desktop/page.mdx | 0 .../tool-calling}/mcp-clients/cursor/page.mdx | 0 .../mcp-clients/visual-studio-code/page.mdx | 0 .../tool-calling}/page.mdx | 0 .../secure-auth-production/page.mdx | 0 app/en/home/_meta.tsx | 165 ----------------- app/en/home/auth/_meta.tsx | 7 - app/en/home/auth/how-arcade-helps.mdx | 78 -------- app/en/home/build-tools/_meta.tsx | 13 -- app/en/home/serve-tools/_meta.tsx | 4 - app/en/home/use-tools/_meta.tsx | 8 - .../{mcp-servers => integrations}/_meta.tsx | 0 .../components/coming-soon-modal.tsx | 0 .../components/filters-bar.tsx | 0 .../components/tool-card.tsx | 0 .../components/toolkit-utils.ts | 0 .../components/toolkits.tsx | 0 .../components/type-config.tsx | 0 .../components/use-toolkit-filters.ts | 0 .../contribute-a-server/page.mdx | 0 .../customer-support/_meta.tsx | 0 .../customer-support/customerio-api/page.mdx | 0 .../customerio-pipelines-api/page.mdx | 0 .../customerio-track-api/page.mdx | 0 .../freshservice-api/page.mdx | 0 .../customer-support/intercom-api/page.mdx | 0 .../customer-support/pagerduty/page.mdx | 0 .../customer-support/pylon/page.mdx | 0 .../customer-support/zendesk/_meta.tsx | 0 .../customer-support/zendesk/page.mdx | 0 .../zendesk/reference/page.mdx | 0 .../databases/_meta.ts | 0 .../databases/_meta.tsx | 0 .../databases/clickhouse/page.mdx | 0 .../databases/mongodb/page.mdx | 0 .../databases/postgres/clickhouse.mdx | 0 .../databases/postgres/mongodb.mdx | 0 .../databases/postgres/page.mdx | 0 .../databases/weaviate-api/page.mdx | 0 .../development/_meta.tsx | 0 .../development/arcade-engine-api/page.mdx | 0 .../development/brightdata/page.mdx | 0 .../development/cursor-agents-api/page.mdx | 0 .../development/datadog-api/page.mdx | 0 .../development/e2b/page.mdx | 0 .../development/figma/page.mdx | 0 .../development/firecrawl/_meta.tsx | 0 .../development/firecrawl/page.mdx | 0 .../development/firecrawl/reference/page.mdx | 0 .../development/github-api/page.mdx | 0 .../development/github/page.mdx | 0 .../development/pagerduty-api/page.mdx | 0 .../development/posthog-api/page.mdx | 0 .../development/vercel-api/page.mdx | 0 .../development/zoho-creator-api/page.mdx | 0 .../entertainment/_meta.tsx | 0 .../entertainment/imgflip/page.mdx | 0 .../entertainment/spotify/imgflip.mdx | 0 .../entertainment/spotify/page.mdx | 0 .../entertainment/twitch/page.mdx | 0 app/en/{mcp-servers => integrations}/page.mdx | 0 .../payments/_meta.tsx | 0 .../payments/stripe/page.mdx | 0 .../payments/stripe_api/page.mdx | 0 .../payments/zoho-books-api/page.mdx | 0 .../productivity/_meta.tsx | 0 .../productivity/airtable-api/page.mdx | 0 .../productivity/asana-api/page.mdx | 0 .../productivity/asana/_meta.tsx | 0 .../productivity/asana/page.mdx | 0 .../productivity/asana/reference/page.mdx | 0 .../productivity/ashby-api/page.mdx | 0 .../productivity/box-api/page.mdx | 0 .../productivity/calendly-api/page.mdx | 0 .../productivity/clickup-api/page.mdx | 0 .../productivity/clickup/_meta.tsx | 0 .../productivity/clickup/page.mdx | 0 .../productivity/clickup/reference/page.mdx | 0 .../productivity/closeio/page.mdx | 0 .../productivity/confluence/page.mdx | 0 .../productivity/dropbox/_meta.tsx | 0 .../productivity/dropbox/page.mdx | 0 .../productivity/dropbox/reference/page.mdx | 0 .../productivity/figma-api/page.mdx | 0 .../productivity/gmail/_meta.tsx | 0 .../productivity/gmail/page.mdx | 0 .../productivity/gmail/reference/page.mdx | 0 .../productivity/google-calendar/_meta.tsx | 0 .../productivity/google-calendar/page.mdx | 0 .../google-calendar/reference/page.mdx | 0 .../productivity/google-contacts/page.mdx | 0 .../productivity/google-docs/_meta.tsx | 0 .../productivity/google-docs/page.mdx | 0 .../google-docs/reference/page.mdx | 0 .../productivity/google-drive/_meta.tsx | 0 .../productivity/google-drive/page.mdx | 0 .../google-drive/reference/page.mdx | 0 .../productivity/google-sheets/_meta.tsx | 0 .../productivity/google-sheets/page.mdx | 0 .../google-sheets/reference/page.mdx | 0 .../productivity/google-slides/page.mdx | 0 .../productivity/jira/_meta.tsx | 0 .../jira/environment-variables/page.mdx | 0 .../productivity/jira/page.mdx | 0 .../productivity/jira/reference/page.mdx | 0 .../productivity/linear/page.mdx | 0 .../productivity/luma-api/page.mdx | 0 .../mailchimp-marketing-api/page.mdx | 0 .../productivity/miro-api/page.mdx | 0 .../productivity/notion/page.mdx | 0 .../productivity/obsidian/page.mdx | 0 .../productivity/outlook-calendar/page.mdx | 0 .../productivity/outlook-mail/_meta.tsx | 0 .../productivity/outlook-mail/page.mdx | 0 .../outlook-mail/reference/page.mdx | 0 .../productivity/sharepoint/page.mdx | 0 .../productivity/squareup-api/page.mdx | 0 .../productivity/ticktick-api/page.mdx | 0 .../productivity/trello-api/page.mdx | 0 .../productivity/xero-api/page.mdx | 0 .../sales/_meta.tsx | 0 .../sales/hubspot-automation-api/page.mdx | 0 .../sales/hubspot-cms-api/page.mdx | 0 .../sales/hubspot-conversations-api/page.mdx | 0 .../sales/hubspot-crm-api/page.mdx | 0 .../sales/hubspot-events-api/page.mdx | 0 .../sales/hubspot-marketing-api/page.mdx | 0 .../sales/hubspot-meetings-api/page.mdx | 0 .../sales/hubspot-users-api/page.mdx | 0 .../sales/hubspot/_meta.tsx | 0 .../sales/hubspot/page.mdx | 0 .../sales/hubspot/reference/page.mdx | 0 .../sales/salesforce/page.mdx | 0 .../search/_meta.tsx | 0 .../search/exa-api/page.mdx | 0 .../search/google_finance/page.mdx | 0 .../search/google_flights/page.mdx | 0 .../search/google_hotels/page.mdx | 0 .../search/google_jobs/page.mdx | 0 .../search/google_maps/page.mdx | 0 .../search/google_news/page.mdx | 0 .../search/google_search/page.mdx | 0 .../search/google_shopping/page.mdx | 0 .../search/walmart/page.mdx | 0 .../search/youtube/page.mdx | 0 .../social-communication/_meta.tsx | 0 .../social-communication/discord/page.mdx | 0 .../social-communication/linkedin/page.mdx | 0 .../microsoft-teams/_meta.tsx | 0 .../microsoft-teams/page.mdx | 0 .../microsoft-teams/reference/page.mdx | 0 .../social-communication/reddit/page.mdx | 0 .../social-communication/slack-api/page.mdx | 0 .../social-communication/slack/_meta.tsx | 0 .../slack/environment-variables/page.mdx | 0 .../slack/install/page.mdx | 0 .../slack/install/slack-auth-link.tsx | 0 .../social-communication/slack/page.mdx | 0 .../slack/reference/page.mdx | 0 .../social-communication/slack_api.mdx | 0 .../social-communication/teams/_meta.tsx | 0 .../teams/reference/page.mdx | 0 .../social-communication/twilio/page.mdx | 0 .../twilio/reference/page.mdx | 0 .../social-communication/x/page.mdx | 0 .../social-communication/zoom/_meta.tsx | 0 .../zoom/install/page.mdx | 0 .../zoom/install/zoom-auth-link.tsx | 0 .../social-communication/zoom/page.mdx | 0 app/en/{home => }/landing-page.tsx | 0 .../server-level-vs-tool-level-auth/page.mdx | 0 app/en/{home => }/page.mdx | 0 .../{home => references}/arcade-cli/page.mdx | 0 .../auth-providers/_meta.tsx | 0 .../auth-providers/airtable/page.mdx | 0 .../auth-providers/asana/page.mdx | 0 .../auth-providers/atlassian/page.mdx | 0 .../auth-providers/calendly/page.mdx | 0 .../auth-providers/clickup/page.mdx | 0 .../auth-providers/discord/page.mdx | 0 .../auth-providers/dropbox/page.mdx | 0 .../auth-providers/figma/page.mdx | 0 .../auth-providers/github/page.mdx | 0 .../auth-providers/google/page.mdx | 0 .../auth-providers/hubspot/page.mdx | 0 .../auth-providers/linear/page.mdx | 0 .../auth-providers/linkedin/page.mdx | 0 .../auth-providers/mailchimp/page.mdx | 0 .../auth-providers/microsoft/page.mdx | 0 .../auth-providers/miro/page.mdx | 0 .../auth-providers/notion/page.mdx | 0 .../auth-providers/oauth2/page.mdx | 0 .../auth-providers/page.mdx | 0 .../auth-providers/pagerduty/page.mdx | 0 .../auth-providers/reddit/page.mdx | 0 .../auth-providers/salesforce/page.mdx | 0 .../auth-providers/slack/page.mdx | 0 .../auth-providers/spotify/page.mdx | 0 .../auth-providers/square/page.mdx | 0 .../auth-providers/ticktick/page.mdx | 0 .../auth-providers/twitch/page.mdx | 0 .../auth-providers/x/page.mdx | 0 .../auth-providers/zendesk/page.mdx | 0 .../auth-providers/zoho/page.mdx | 0 .../auth-providers/zoom/page.mdx | 0 app/en/{home => resources}/changelog/page.mdx | 0 .../contact-us/contact-cards.tsx | 0 .../{home => resources}/contact-us/page.mdx | 0 app/en/{home => resources}/examples/page.mdx | 0 app/en/{home => resources}/faq/page.mdx | 0 app/en/{home => resources}/glossary/page.mdx | 0 app/en/resources/tools/page.mdx | 35 ++++ .../code/guides/agentauth/auth_with_google.js | 49 ----- .../code/guides/agentauth/auth_with_google.py | 44 ----- .../guides/agentauth/use_token_with_google.py | 11 -- .../toolsdk/retryable_tool_error_example.py | 57 ------ .../build-tools/create-a-tool/app.ts.fake | 107 ----------- .../home/build-tools/create-a-tool/imports.py | 3 - .../home/build-tools/create-a-tool/schema.sql | 16 -- .../build-tools/create-a-tool/sql-tool.py | 48 ----- .../engine/config_template.1.0.yaml | 174 ------------------ .../code/home/configuration/engine/engine.env | 77 -------- .../configuration/engine/full_config.1.0.yaml | 145 --------------- examples/code/home/crewai/custom_auth_flow.py | 82 --------- .../custom_auth_flow_callback_section.py | 46 ----- examples/code/home/crewai/use_arcade_tools.py | 37 ---- .../streamable-http/typescript-client.ts.fake | 129 ------------- .../call-tools-directly/github_directly.js | 17 -- .../call-tools-directly/github_directly.py | 17 -- .../call-tools-directly/quickstart.mjs | 46 ----- .../call-tools-directly/quickstart.py | 41 ----- .../get_openai_formatted_all_tools.js | 9 - .../get_openai_formatted_all_tools.py | 9 - .../get_openai_formatted_tool.js | 10 - .../get_openai_formatted_tool.py | 8 - .../get_openai_formatted_tool_output.json | 25 --- .../get_openai_formatted_toolkit.js | 12 -- .../get_openai_formatted_toolkit.py | 9 - .../asana/config_provider.engine.yaml | 9 - .../code/integrations/asana/custom_auth.js | 21 --- .../code/integrations/asana/custom_auth.py | 22 --- .../code/integrations/asana/custom_tool.py | 24 --- .../integrations/asana/custom_tool_call.js | 31 ---- .../integrations/asana/custom_tool_call.py | 25 --- .../atlassian/config_provider.engine.yaml | 9 - .../integrations/atlassian/custom_auth.js | 21 --- .../integrations/atlassian/custom_auth.py | 22 --- .../integrations/atlassian/custom_tool.py | 28 --- .../clickup/clickup_custom_auth.js | 15 -- .../clickup/clickup_custom_auth.py | 21 --- .../clickup/clickup_custom_tool.py | 31 ---- .../clickup/config_provider.engine.yaml | 9 - .../discord/config_provider.engine.yaml | 9 - .../code/integrations/discord/custom_auth.js | 21 --- .../code/integrations/discord/custom_auth.py | 22 --- .../code/integrations/discord/custom_tool.py | 28 --- .../dropbox/config_provider.engine.yaml | 10 - .../code/integrations/dropbox/custom_auth.js | 21 --- .../code/integrations/dropbox/custom_auth.py | 22 --- .../code/integrations/dropbox/custom_tool.py | 28 --- .../github/config_provider.engine.yaml | 9 - .../code/integrations/github/custom_auth.js | 50 ----- .../code/integrations/github/custom_auth.py | 50 ----- .../code/integrations/github/custom_tool.py | 28 --- .../google/config_provider.engine.yaml | 9 - .../code/integrations/google/custom_auth.js | 56 ------ .../code/integrations/google/custom_auth.py | 47 ----- .../code/integrations/google/custom_tool.py | 34 ---- .../hubspot/config_provider.engine.yaml | 8 - .../code/integrations/hubspot/custom_auth.js | 21 --- .../code/integrations/hubspot/custom_auth.py | 22 --- .../code/integrations/hubspot/custom_tool.py | 28 --- .../integrations/hubspot/custom_tool_call.js | 31 ---- .../integrations/hubspot/custom_tool_call.py | 25 --- .../linear/config_provider.engine.yaml | 9 - .../code/integrations/linear/custom_auth.js | 21 --- .../code/integrations/linear/custom_auth.py | 24 --- .../code/integrations/linear/custom_tool.py | 37 ---- .../linkedin/config_provider.engine.yaml | 9 - .../code/integrations/linkedin/custom_auth.js | 72 -------- .../code/integrations/linkedin/custom_auth.py | 70 ------- .../code/integrations/linkedin/custom_tool.py | 56 ------ .../microsoft/config_provider.engine.yaml | 9 - .../integrations/microsoft/custom_auth.js | 21 --- .../integrations/microsoft/custom_auth.py | 22 --- .../integrations/microsoft/custom_tool.py | 28 --- .../notion/config_provider.engine.yaml | 9 - .../code/integrations/notion/custom_auth.js | 19 -- .../code/integrations/notion/custom_auth.py | 21 --- .../code/integrations/notion/custom_tool.py | 27 --- .../code/integrations/oauth2/custom_auth.js | 22 --- .../code/integrations/oauth2/custom_auth.py | 23 --- .../code/integrations/oauth2/custom_tool.py | 23 --- .../reddit/config_provider.engine.yaml | 9 - .../code/integrations/reddit/custom_auth.js | 21 --- .../code/integrations/reddit/custom_auth.py | 22 --- .../code/integrations/reddit/custom_tool.py | 27 --- .../salesforce/config_provider.engine.yaml | 46 ----- .../integrations/salesforce/custom_auth.js | 60 ------ .../integrations/salesforce/custom_auth.py | 50 ----- .../slack/config_provider.engine.yaml | 9 - .../code/integrations/slack/custom_auth.js | 21 --- .../code/integrations/slack/custom_auth.py | 27 --- .../code/integrations/slack/custom_tool.py | 51 ----- .../spotify/config_provider.engine.yaml | 9 - .../code/integrations/spotify/custom_auth.js | 21 --- .../code/integrations/spotify/custom_auth.py | 22 --- .../code/integrations/spotify/custom_tool.py | 30 --- .../twitch/config_provider.engine.yaml | 9 - .../code/integrations/twitch/custom_auth.js | 21 --- .../code/integrations/twitch/custom_auth.py | 22 --- .../code/integrations/twitch/custom_tool.py | 50 ----- .../x/config_provider.engine.yaml | 9 - examples/code/integrations/x/custom_auth.js | 23 --- examples/code/integrations/x/custom_auth.py | 22 --- examples/code/integrations/x/custom_tool.py | 31 ---- .../zendesk/config_provider.engine.yaml | 43 ----- .../code/integrations/zendesk/custom_auth.js | 23 --- .../code/integrations/zendesk/custom_auth.py | 21 --- .../code/integrations/zendesk/custom_tool.py | 31 ---- .../zoom/config_provider.engine.yaml | 9 - .../code/integrations/zoom/custom_auth.js | 21 --- .../code/integrations/zoom/custom_auth.py | 22 --- .../code/integrations/zoom/custom_tool.py | 28 --- 386 files changed, 192 insertions(+), 3724 deletions(-) rename app/en/{home/auth/how-arcade-helps => get-started/about-arcade}/page.mdx (92%) rename app/en/{home/quickstart => get-started/quickstarts/call-tool-agent}/page.mdx (100%) rename app/en/{home/mcp-gateway-quickstart => get-started/quickstarts/call-tool-client}/page.mdx (100%) rename app/en/{home/custom-mcp-server-quickstart => get-started/quickstarts/mcp-server-quickstart}/page.mdx (100%) rename app/en/{home => get-started/setup}/api-keys/page.mdx (100%) rename app/en/{home/agentic-development => get-started/setup/connect-arcade-docs}/page.mdx (100%) rename app/en/{home => guides/agent-frameworks}/crewai/_meta.tsx (100%) rename app/en/{home => guides/agent-frameworks}/crewai/custom-auth-flow/page.mdx (100%) rename app/en/{home => guides/agent-frameworks}/crewai/use-arcade-tools/page.mdx (100%) rename app/en/{home => guides/agent-frameworks}/google-adk/_meta.tsx (100%) rename app/en/{home => guides/agent-frameworks}/google-adk/overview/page.mdx (100%) rename app/en/{home => guides/agent-frameworks}/google-adk/use-arcade-tools/page.mdx (100%) rename app/en/{home => guides/agent-frameworks}/langchain/_meta.tsx (100%) rename app/en/{home => guides/agent-frameworks}/langchain/auth-langchain-tools/page.mdx (100%) rename app/en/{home => guides/agent-frameworks}/langchain/use-arcade-tools/page.mdx (100%) rename app/en/{home => guides/agent-frameworks}/langchain/use-arcade-with-langchain/page.mdx (100%) rename app/en/{home => guides/agent-frameworks}/langchain/user-auth-interrupts/page.mdx (100%) rename app/en/{home => guides/agent-frameworks}/mastra/_meta.tsx (100%) rename app/en/{home => guides/agent-frameworks}/mastra/overview/page.mdx (100%) rename app/en/{home => guides/agent-frameworks}/mastra/use-arcade-tools/page.mdx (100%) rename app/en/{home => guides/agent-frameworks}/mastra/user-auth-interrupts/page.mdx (100%) rename app/en/{home/oai-agents => guides/agent-frameworks/openai-agents}/_meta.tsx (100%) rename app/en/{home/oai-agents => guides/agent-frameworks/openai-agents}/overview/page.mdx (100%) rename app/en/{home/oai-agents => guides/agent-frameworks/openai-agents}/use-arcade-tools/page.mdx (100%) rename app/en/{home/oai-agents => guides/agent-frameworks/openai-agents}/user-auth-interrupts/page.mdx (100%) rename app/en/{home/agent-frameworks-overview => guides/agent-frameworks}/page.mdx (100%) rename app/en/{home => guides/agent-frameworks}/vercelai/_meta.tsx (100%) rename app/en/{home => guides/agent-frameworks}/vercelai/using-arcade-tools/page.mdx (100%) rename app/en/{home => guides/create-tools/add-tools-to-arcade-catalog}/registry-early-access/page.mdx (100%) rename app/en/{home => guides/create-tools/add-tools-to-arcade-catalog}/registry-early-access/take-survey.tsx (100%) rename app/en/{home/build-tools/migrate-from-toolkits => guides/create-tools/error-handling/migrate-toolkits}/page.mdx (100%) rename app/en/{home/build-tools/retry-tools-with-improved-prompt => guides/create-tools/error-handling/retry-tools}/page.mdx (100%) rename app/en/{home/build-tools/providing-useful-tool-errors => guides/create-tools/error-handling/useful-tool-errors}/page.mdx (100%) rename app/en/{home => guides/create-tools}/evaluate-tools/_meta.tsx (100%) rename app/en/{home/evaluate-tools/create-an-evaluation-suite => guides/create-tools/evaluate-tools/create-evaluation-suite}/page.mdx (100%) rename app/en/{home => guides/create-tools}/evaluate-tools/run-evaluations/page.mdx (100%) rename app/en/{home/evaluate-tools/why-evaluate-tools => guides/create-tools/evaluate-tools/why-evaluate}/page.mdx (100%) rename app/en/{home => guides/create-tools}/mcp-gateways/page.mdx (100%) rename app/en/{home/use-tools => guides/create-tools/performance}/types-of-tools/page.mdx (100%) rename app/en/{home/build-tools/create-a-mcp-server => guides/create-tools/tool-basics/build-mcp-server}/page.mdx (100%) rename app/en/{home/build-tools/call-tools-from-mcp-clients => guides/create-tools/tool-basics/call-tools-mcp}/page.mdx (100%) rename app/en/{home => guides/create-tools/tool-basics}/compare-server-types/page.mdx (100%) rename app/en/{home/build-tools/create-a-tool-with-auth => guides/create-tools/tool-basics/create-tool-auth}/page.mdx (100%) rename app/en/{home/build-tools/create-a-tool-with-secrets => guides/create-tools/tool-basics/create-tool-secrets}/page.mdx (100%) rename app/en/{home/build-tools/organize-mcp-server-tools => guides/create-tools/tool-basics/organize-mcp-tools}/page.mdx (100%) rename app/en/{home/build-tools/tool-context => guides/create-tools/tool-basics/runtime-data-access}/page.mdx (100%) rename app/en/{home/deployment => guides/deployment-hosting}/_meta.tsx (100%) rename app/en/{home/deployment/arcade-cloud-infra => guides/deployment-hosting/arcade-cloud}/page.mdx (100%) rename app/en/{home/serve-tools => guides/deployment-hosting}/arcade-deploy/page.mdx (100%) rename app/en/{home/deployment/engine-configuration => guides/deployment-hosting/configure-engine}/page.mdx (100%) rename app/en/{home/deployment/on-prem-mcp => guides/deployment-hosting/on-prem}/page.mdx (100%) rename app/en/{home/hosting-overview => guides/deployment-hosting}/page.mdx (100%) rename app/en/{home/build-tools => guides/security}/secure-your-mcp-server/page.mdx (100%) rename app/en/{home/serve-tools => guides/security}/securing-arcade-mcp/page.mdx (100%) rename app/en/{home/security => guides/security/security-research-program}/page.mdx (100%) rename app/en/{home/auth => guides/tool-calling}/call-third-party-apis-directly/page.mdx (100%) rename app/en/{home/auth => guides/tool-calling/custom-apps}/auth-tool-calling/page.mdx (100%) rename app/en/{home/use-tools => guides/tool-calling/custom-apps}/get-tool-definitions/page.mdx (100%) rename app/en/{home/auth => guides/tool-calling/custom-apps}/tool-auth-status/page.mdx (100%) rename app/en/{home/use-tools => guides/tool-calling}/error-handling/page.mdx (100%) rename app/en/{home => guides/tool-calling}/mcp-clients/_meta.tsx (100%) rename app/en/{home => guides/tool-calling}/mcp-clients/claude-desktop/page.mdx (100%) rename app/en/{home => guides/tool-calling}/mcp-clients/cursor/page.mdx (100%) rename app/en/{home => guides/tool-calling}/mcp-clients/visual-studio-code/page.mdx (100%) rename app/en/{home/use-tools/tools-overview => guides/tool-calling}/page.mdx (100%) rename app/en/{home/auth => guides/user-facing-agents}/secure-auth-production/page.mdx (100%) delete mode 100644 app/en/home/_meta.tsx delete mode 100644 app/en/home/auth/_meta.tsx delete mode 100644 app/en/home/auth/how-arcade-helps.mdx delete mode 100644 app/en/home/build-tools/_meta.tsx delete mode 100644 app/en/home/serve-tools/_meta.tsx delete mode 100644 app/en/home/use-tools/_meta.tsx rename app/en/{mcp-servers => integrations}/_meta.tsx (100%) rename app/en/{mcp-servers => integrations}/components/coming-soon-modal.tsx (100%) rename app/en/{mcp-servers => integrations}/components/filters-bar.tsx (100%) rename app/en/{mcp-servers => integrations}/components/tool-card.tsx (100%) rename app/en/{mcp-servers => integrations}/components/toolkit-utils.ts (100%) rename app/en/{mcp-servers => integrations}/components/toolkits.tsx (100%) rename app/en/{mcp-servers => integrations}/components/type-config.tsx (100%) rename app/en/{mcp-servers => integrations}/components/use-toolkit-filters.ts (100%) rename app/en/{mcp-servers => integrations}/contribute-a-server/page.mdx (100%) rename app/en/{mcp-servers => integrations}/customer-support/_meta.tsx (100%) rename app/en/{mcp-servers => integrations}/customer-support/customerio-api/page.mdx (100%) rename app/en/{mcp-servers => integrations}/customer-support/customerio-pipelines-api/page.mdx (100%) rename app/en/{mcp-servers => integrations}/customer-support/customerio-track-api/page.mdx (100%) rename app/en/{mcp-servers => integrations}/customer-support/freshservice-api/page.mdx (100%) rename app/en/{mcp-servers => integrations}/customer-support/intercom-api/page.mdx (100%) rename app/en/{mcp-servers => integrations}/customer-support/pagerduty/page.mdx (100%) rename app/en/{mcp-servers => integrations}/customer-support/pylon/page.mdx (100%) rename app/en/{mcp-servers => integrations}/customer-support/zendesk/_meta.tsx (100%) rename app/en/{mcp-servers => integrations}/customer-support/zendesk/page.mdx (100%) rename app/en/{mcp-servers => integrations}/customer-support/zendesk/reference/page.mdx (100%) rename app/en/{mcp-servers => integrations}/databases/_meta.ts (100%) rename app/en/{mcp-servers => integrations}/databases/_meta.tsx (100%) rename app/en/{mcp-servers => integrations}/databases/clickhouse/page.mdx (100%) rename app/en/{mcp-servers => integrations}/databases/mongodb/page.mdx (100%) rename app/en/{mcp-servers => integrations}/databases/postgres/clickhouse.mdx (100%) rename app/en/{mcp-servers => integrations}/databases/postgres/mongodb.mdx (100%) rename app/en/{mcp-servers => integrations}/databases/postgres/page.mdx (100%) rename app/en/{mcp-servers => integrations}/databases/weaviate-api/page.mdx (100%) rename app/en/{mcp-servers => integrations}/development/_meta.tsx (100%) rename app/en/{mcp-servers => integrations}/development/arcade-engine-api/page.mdx (100%) rename app/en/{mcp-servers => integrations}/development/brightdata/page.mdx (100%) rename app/en/{mcp-servers => integrations}/development/cursor-agents-api/page.mdx (100%) rename app/en/{mcp-servers => integrations}/development/datadog-api/page.mdx (100%) rename app/en/{mcp-servers => integrations}/development/e2b/page.mdx (100%) rename app/en/{mcp-servers => integrations}/development/figma/page.mdx (100%) rename app/en/{mcp-servers => integrations}/development/firecrawl/_meta.tsx (100%) rename app/en/{mcp-servers => integrations}/development/firecrawl/page.mdx (100%) rename app/en/{mcp-servers => integrations}/development/firecrawl/reference/page.mdx (100%) rename app/en/{mcp-servers => integrations}/development/github-api/page.mdx (100%) rename app/en/{mcp-servers => integrations}/development/github/page.mdx (100%) rename app/en/{mcp-servers => integrations}/development/pagerduty-api/page.mdx (100%) rename app/en/{mcp-servers => integrations}/development/posthog-api/page.mdx (100%) rename app/en/{mcp-servers => integrations}/development/vercel-api/page.mdx (100%) rename app/en/{mcp-servers => integrations}/development/zoho-creator-api/page.mdx (100%) rename app/en/{mcp-servers => integrations}/entertainment/_meta.tsx (100%) rename app/en/{mcp-servers => integrations}/entertainment/imgflip/page.mdx (100%) rename app/en/{mcp-servers => integrations}/entertainment/spotify/imgflip.mdx (100%) rename app/en/{mcp-servers => integrations}/entertainment/spotify/page.mdx (100%) rename app/en/{mcp-servers => integrations}/entertainment/twitch/page.mdx (100%) rename app/en/{mcp-servers => integrations}/page.mdx (100%) rename app/en/{mcp-servers => integrations}/payments/_meta.tsx (100%) rename app/en/{mcp-servers => integrations}/payments/stripe/page.mdx (100%) rename app/en/{mcp-servers => integrations}/payments/stripe_api/page.mdx (100%) rename app/en/{mcp-servers => integrations}/payments/zoho-books-api/page.mdx (100%) rename app/en/{mcp-servers => integrations}/productivity/_meta.tsx (100%) rename app/en/{mcp-servers => integrations}/productivity/airtable-api/page.mdx (100%) rename app/en/{mcp-servers => integrations}/productivity/asana-api/page.mdx (100%) rename app/en/{mcp-servers => integrations}/productivity/asana/_meta.tsx (100%) rename app/en/{mcp-servers => integrations}/productivity/asana/page.mdx (100%) rename app/en/{mcp-servers => integrations}/productivity/asana/reference/page.mdx (100%) rename app/en/{mcp-servers => integrations}/productivity/ashby-api/page.mdx (100%) rename app/en/{mcp-servers => integrations}/productivity/box-api/page.mdx (100%) rename app/en/{mcp-servers => integrations}/productivity/calendly-api/page.mdx (100%) rename app/en/{mcp-servers => integrations}/productivity/clickup-api/page.mdx (100%) rename app/en/{mcp-servers => integrations}/productivity/clickup/_meta.tsx (100%) rename app/en/{mcp-servers => integrations}/productivity/clickup/page.mdx (100%) rename app/en/{mcp-servers => integrations}/productivity/clickup/reference/page.mdx (100%) rename app/en/{mcp-servers => integrations}/productivity/closeio/page.mdx (100%) rename app/en/{mcp-servers => integrations}/productivity/confluence/page.mdx (100%) rename app/en/{mcp-servers => integrations}/productivity/dropbox/_meta.tsx (100%) rename app/en/{mcp-servers => integrations}/productivity/dropbox/page.mdx (100%) rename app/en/{mcp-servers => integrations}/productivity/dropbox/reference/page.mdx (100%) rename app/en/{mcp-servers => integrations}/productivity/figma-api/page.mdx (100%) rename app/en/{mcp-servers => integrations}/productivity/gmail/_meta.tsx (100%) rename app/en/{mcp-servers => integrations}/productivity/gmail/page.mdx (100%) rename app/en/{mcp-servers => integrations}/productivity/gmail/reference/page.mdx (100%) rename app/en/{mcp-servers => integrations}/productivity/google-calendar/_meta.tsx (100%) rename app/en/{mcp-servers => integrations}/productivity/google-calendar/page.mdx (100%) rename app/en/{mcp-servers => integrations}/productivity/google-calendar/reference/page.mdx (100%) rename app/en/{mcp-servers => integrations}/productivity/google-contacts/page.mdx (100%) rename app/en/{mcp-servers => integrations}/productivity/google-docs/_meta.tsx (100%) rename app/en/{mcp-servers => integrations}/productivity/google-docs/page.mdx (100%) rename app/en/{mcp-servers => integrations}/productivity/google-docs/reference/page.mdx (100%) rename app/en/{mcp-servers => integrations}/productivity/google-drive/_meta.tsx (100%) rename app/en/{mcp-servers => integrations}/productivity/google-drive/page.mdx (100%) rename app/en/{mcp-servers => integrations}/productivity/google-drive/reference/page.mdx (100%) rename app/en/{mcp-servers => integrations}/productivity/google-sheets/_meta.tsx (100%) rename app/en/{mcp-servers => integrations}/productivity/google-sheets/page.mdx (100%) rename app/en/{mcp-servers => integrations}/productivity/google-sheets/reference/page.mdx (100%) rename app/en/{mcp-servers => integrations}/productivity/google-slides/page.mdx (100%) rename app/en/{mcp-servers => integrations}/productivity/jira/_meta.tsx (100%) rename app/en/{mcp-servers => integrations}/productivity/jira/environment-variables/page.mdx (100%) rename app/en/{mcp-servers => integrations}/productivity/jira/page.mdx (100%) rename app/en/{mcp-servers => integrations}/productivity/jira/reference/page.mdx (100%) rename app/en/{mcp-servers => integrations}/productivity/linear/page.mdx (100%) rename app/en/{mcp-servers => integrations}/productivity/luma-api/page.mdx (100%) rename app/en/{mcp-servers => integrations}/productivity/mailchimp-marketing-api/page.mdx (100%) rename app/en/{mcp-servers => integrations}/productivity/miro-api/page.mdx (100%) rename app/en/{mcp-servers => integrations}/productivity/notion/page.mdx (100%) rename app/en/{mcp-servers => integrations}/productivity/obsidian/page.mdx (100%) rename app/en/{mcp-servers => integrations}/productivity/outlook-calendar/page.mdx (100%) rename app/en/{mcp-servers => integrations}/productivity/outlook-mail/_meta.tsx (100%) rename app/en/{mcp-servers => integrations}/productivity/outlook-mail/page.mdx (100%) rename app/en/{mcp-servers => integrations}/productivity/outlook-mail/reference/page.mdx (100%) rename app/en/{mcp-servers => integrations}/productivity/sharepoint/page.mdx (100%) rename app/en/{mcp-servers => integrations}/productivity/squareup-api/page.mdx (100%) rename app/en/{mcp-servers => integrations}/productivity/ticktick-api/page.mdx (100%) rename app/en/{mcp-servers => integrations}/productivity/trello-api/page.mdx (100%) rename app/en/{mcp-servers => integrations}/productivity/xero-api/page.mdx (100%) rename app/en/{mcp-servers => integrations}/sales/_meta.tsx (100%) rename app/en/{mcp-servers => integrations}/sales/hubspot-automation-api/page.mdx (100%) rename app/en/{mcp-servers => integrations}/sales/hubspot-cms-api/page.mdx (100%) rename app/en/{mcp-servers => integrations}/sales/hubspot-conversations-api/page.mdx (100%) rename app/en/{mcp-servers => integrations}/sales/hubspot-crm-api/page.mdx (100%) rename app/en/{mcp-servers => integrations}/sales/hubspot-events-api/page.mdx (100%) rename app/en/{mcp-servers => integrations}/sales/hubspot-marketing-api/page.mdx (100%) rename app/en/{mcp-servers => integrations}/sales/hubspot-meetings-api/page.mdx (100%) rename app/en/{mcp-servers => integrations}/sales/hubspot-users-api/page.mdx (100%) rename app/en/{mcp-servers => integrations}/sales/hubspot/_meta.tsx (100%) rename app/en/{mcp-servers => integrations}/sales/hubspot/page.mdx (100%) rename app/en/{mcp-servers => integrations}/sales/hubspot/reference/page.mdx (100%) rename app/en/{mcp-servers => integrations}/sales/salesforce/page.mdx (100%) rename app/en/{mcp-servers => integrations}/search/_meta.tsx (100%) rename app/en/{mcp-servers => integrations}/search/exa-api/page.mdx (100%) rename app/en/{mcp-servers => integrations}/search/google_finance/page.mdx (100%) rename app/en/{mcp-servers => integrations}/search/google_flights/page.mdx (100%) rename app/en/{mcp-servers => integrations}/search/google_hotels/page.mdx (100%) rename app/en/{mcp-servers => integrations}/search/google_jobs/page.mdx (100%) rename app/en/{mcp-servers => integrations}/search/google_maps/page.mdx (100%) rename app/en/{mcp-servers => integrations}/search/google_news/page.mdx (100%) rename app/en/{mcp-servers => integrations}/search/google_search/page.mdx (100%) rename app/en/{mcp-servers => integrations}/search/google_shopping/page.mdx (100%) rename app/en/{mcp-servers => integrations}/search/walmart/page.mdx (100%) rename app/en/{mcp-servers => integrations}/search/youtube/page.mdx (100%) rename app/en/{mcp-servers => integrations}/social-communication/_meta.tsx (100%) rename app/en/{mcp-servers => integrations}/social-communication/discord/page.mdx (100%) rename app/en/{mcp-servers => integrations}/social-communication/linkedin/page.mdx (100%) rename app/en/{mcp-servers => integrations}/social-communication/microsoft-teams/_meta.tsx (100%) rename app/en/{mcp-servers => integrations}/social-communication/microsoft-teams/page.mdx (100%) rename app/en/{mcp-servers => integrations}/social-communication/microsoft-teams/reference/page.mdx (100%) rename app/en/{mcp-servers => integrations}/social-communication/reddit/page.mdx (100%) rename app/en/{mcp-servers => integrations}/social-communication/slack-api/page.mdx (100%) rename app/en/{mcp-servers => integrations}/social-communication/slack/_meta.tsx (100%) rename app/en/{mcp-servers => integrations}/social-communication/slack/environment-variables/page.mdx (100%) rename app/en/{mcp-servers => integrations}/social-communication/slack/install/page.mdx (100%) rename app/en/{mcp-servers => integrations}/social-communication/slack/install/slack-auth-link.tsx (100%) rename app/en/{mcp-servers => integrations}/social-communication/slack/page.mdx (100%) rename app/en/{mcp-servers => integrations}/social-communication/slack/reference/page.mdx (100%) rename app/en/{mcp-servers => integrations}/social-communication/slack_api.mdx (100%) rename app/en/{mcp-servers => integrations}/social-communication/teams/_meta.tsx (100%) rename app/en/{mcp-servers => integrations}/social-communication/teams/reference/page.mdx (100%) rename app/en/{mcp-servers => integrations}/social-communication/twilio/page.mdx (100%) rename app/en/{mcp-servers => integrations}/social-communication/twilio/reference/page.mdx (100%) rename app/en/{mcp-servers => integrations}/social-communication/x/page.mdx (100%) rename app/en/{mcp-servers => integrations}/social-communication/zoom/_meta.tsx (100%) rename app/en/{mcp-servers => integrations}/social-communication/zoom/install/page.mdx (100%) rename app/en/{mcp-servers => integrations}/social-communication/zoom/install/zoom-auth-link.tsx (100%) rename app/en/{mcp-servers => integrations}/social-communication/zoom/page.mdx (100%) rename app/en/{home => }/landing-page.tsx (100%) rename app/en/{home/build-tools => learn}/server-level-vs-tool-level-auth/page.mdx (100%) rename app/en/{home => }/page.mdx (100%) rename app/en/{home => references}/arcade-cli/page.mdx (100%) rename app/en/{home => references}/auth-providers/_meta.tsx (100%) rename app/en/{home => references}/auth-providers/airtable/page.mdx (100%) rename app/en/{home => references}/auth-providers/asana/page.mdx (100%) rename app/en/{home => references}/auth-providers/atlassian/page.mdx (100%) rename app/en/{home => references}/auth-providers/calendly/page.mdx (100%) rename app/en/{home => references}/auth-providers/clickup/page.mdx (100%) rename app/en/{home => references}/auth-providers/discord/page.mdx (100%) rename app/en/{home => references}/auth-providers/dropbox/page.mdx (100%) rename app/en/{home => references}/auth-providers/figma/page.mdx (100%) rename app/en/{home => references}/auth-providers/github/page.mdx (100%) rename app/en/{home => references}/auth-providers/google/page.mdx (100%) rename app/en/{home => references}/auth-providers/hubspot/page.mdx (100%) rename app/en/{home => references}/auth-providers/linear/page.mdx (100%) rename app/en/{home => references}/auth-providers/linkedin/page.mdx (100%) rename app/en/{home => references}/auth-providers/mailchimp/page.mdx (100%) rename app/en/{home => references}/auth-providers/microsoft/page.mdx (100%) rename app/en/{home => references}/auth-providers/miro/page.mdx (100%) rename app/en/{home => references}/auth-providers/notion/page.mdx (100%) rename app/en/{home => references}/auth-providers/oauth2/page.mdx (100%) rename app/en/{home => references}/auth-providers/page.mdx (100%) rename app/en/{home => references}/auth-providers/pagerduty/page.mdx (100%) rename app/en/{home => references}/auth-providers/reddit/page.mdx (100%) rename app/en/{home => references}/auth-providers/salesforce/page.mdx (100%) rename app/en/{home => references}/auth-providers/slack/page.mdx (100%) rename app/en/{home => references}/auth-providers/spotify/page.mdx (100%) rename app/en/{home => references}/auth-providers/square/page.mdx (100%) rename app/en/{home => references}/auth-providers/ticktick/page.mdx (100%) rename app/en/{home => references}/auth-providers/twitch/page.mdx (100%) rename app/en/{home => references}/auth-providers/x/page.mdx (100%) rename app/en/{home => references}/auth-providers/zendesk/page.mdx (100%) rename app/en/{home => references}/auth-providers/zoho/page.mdx (100%) rename app/en/{home => references}/auth-providers/zoom/page.mdx (100%) rename app/en/{home => resources}/changelog/page.mdx (100%) rename app/en/{home => resources}/contact-us/contact-cards.tsx (100%) rename app/en/{home => resources}/contact-us/page.mdx (100%) rename app/en/{home => resources}/examples/page.mdx (100%) rename app/en/{home => resources}/faq/page.mdx (100%) rename app/en/{home => resources}/glossary/page.mdx (100%) create mode 100644 app/en/resources/tools/page.mdx delete mode 100644 examples/code/guides/agentauth/auth_with_google.js delete mode 100644 examples/code/guides/agentauth/auth_with_google.py delete mode 100644 examples/code/guides/agentauth/use_token_with_google.py delete mode 100644 examples/code/guides/toolsdk/retryable_tool_error_example.py delete mode 100644 examples/code/home/build-tools/create-a-tool/app.ts.fake delete mode 100644 examples/code/home/build-tools/create-a-tool/imports.py delete mode 100644 examples/code/home/build-tools/create-a-tool/schema.sql delete mode 100644 examples/code/home/build-tools/create-a-tool/sql-tool.py delete mode 100644 examples/code/home/configuration/engine/config_template.1.0.yaml delete mode 100644 examples/code/home/configuration/engine/engine.env delete mode 100644 examples/code/home/configuration/engine/full_config.1.0.yaml delete mode 100644 examples/code/home/crewai/custom_auth_flow.py delete mode 100644 examples/code/home/crewai/custom_auth_flow_callback_section.py delete mode 100644 examples/code/home/crewai/use_arcade_tools.py delete mode 100644 examples/code/home/mcp/streamable-http/typescript-client.ts.fake delete mode 100644 examples/code/home/use-tools/call-tools-directly/github_directly.js delete mode 100644 examples/code/home/use-tools/call-tools-directly/github_directly.py delete mode 100644 examples/code/home/use-tools/call-tools-directly/quickstart.mjs delete mode 100644 examples/code/home/use-tools/call-tools-directly/quickstart.py delete mode 100644 examples/code/home/use-tools/get-formatted-tool-definitions/get_openai_formatted_all_tools.js delete mode 100644 examples/code/home/use-tools/get-formatted-tool-definitions/get_openai_formatted_all_tools.py delete mode 100644 examples/code/home/use-tools/get-formatted-tool-definitions/get_openai_formatted_tool.js delete mode 100644 examples/code/home/use-tools/get-formatted-tool-definitions/get_openai_formatted_tool.py delete mode 100644 examples/code/home/use-tools/get-formatted-tool-definitions/get_openai_formatted_tool_output.json delete mode 100644 examples/code/home/use-tools/get-formatted-tool-definitions/get_openai_formatted_toolkit.js delete mode 100644 examples/code/home/use-tools/get-formatted-tool-definitions/get_openai_formatted_toolkit.py delete mode 100644 examples/code/integrations/asana/config_provider.engine.yaml delete mode 100644 examples/code/integrations/asana/custom_auth.js delete mode 100644 examples/code/integrations/asana/custom_auth.py delete mode 100644 examples/code/integrations/asana/custom_tool.py delete mode 100644 examples/code/integrations/asana/custom_tool_call.js delete mode 100644 examples/code/integrations/asana/custom_tool_call.py delete mode 100644 examples/code/integrations/atlassian/config_provider.engine.yaml delete mode 100644 examples/code/integrations/atlassian/custom_auth.js delete mode 100644 examples/code/integrations/atlassian/custom_auth.py delete mode 100644 examples/code/integrations/atlassian/custom_tool.py delete mode 100644 examples/code/integrations/clickup/clickup_custom_auth.js delete mode 100644 examples/code/integrations/clickup/clickup_custom_auth.py delete mode 100644 examples/code/integrations/clickup/clickup_custom_tool.py delete mode 100644 examples/code/integrations/clickup/config_provider.engine.yaml delete mode 100644 examples/code/integrations/discord/config_provider.engine.yaml delete mode 100644 examples/code/integrations/discord/custom_auth.js delete mode 100644 examples/code/integrations/discord/custom_auth.py delete mode 100644 examples/code/integrations/discord/custom_tool.py delete mode 100644 examples/code/integrations/dropbox/config_provider.engine.yaml delete mode 100644 examples/code/integrations/dropbox/custom_auth.js delete mode 100644 examples/code/integrations/dropbox/custom_auth.py delete mode 100644 examples/code/integrations/dropbox/custom_tool.py delete mode 100644 examples/code/integrations/github/config_provider.engine.yaml delete mode 100644 examples/code/integrations/github/custom_auth.js delete mode 100644 examples/code/integrations/github/custom_auth.py delete mode 100644 examples/code/integrations/github/custom_tool.py delete mode 100644 examples/code/integrations/google/config_provider.engine.yaml delete mode 100644 examples/code/integrations/google/custom_auth.js delete mode 100644 examples/code/integrations/google/custom_auth.py delete mode 100644 examples/code/integrations/google/custom_tool.py delete mode 100644 examples/code/integrations/hubspot/config_provider.engine.yaml delete mode 100644 examples/code/integrations/hubspot/custom_auth.js delete mode 100644 examples/code/integrations/hubspot/custom_auth.py delete mode 100644 examples/code/integrations/hubspot/custom_tool.py delete mode 100644 examples/code/integrations/hubspot/custom_tool_call.js delete mode 100644 examples/code/integrations/hubspot/custom_tool_call.py delete mode 100644 examples/code/integrations/linear/config_provider.engine.yaml delete mode 100644 examples/code/integrations/linear/custom_auth.js delete mode 100644 examples/code/integrations/linear/custom_auth.py delete mode 100644 examples/code/integrations/linear/custom_tool.py delete mode 100644 examples/code/integrations/linkedin/config_provider.engine.yaml delete mode 100644 examples/code/integrations/linkedin/custom_auth.js delete mode 100644 examples/code/integrations/linkedin/custom_auth.py delete mode 100644 examples/code/integrations/linkedin/custom_tool.py delete mode 100644 examples/code/integrations/microsoft/config_provider.engine.yaml delete mode 100644 examples/code/integrations/microsoft/custom_auth.js delete mode 100644 examples/code/integrations/microsoft/custom_auth.py delete mode 100644 examples/code/integrations/microsoft/custom_tool.py delete mode 100644 examples/code/integrations/notion/config_provider.engine.yaml delete mode 100644 examples/code/integrations/notion/custom_auth.js delete mode 100644 examples/code/integrations/notion/custom_auth.py delete mode 100644 examples/code/integrations/notion/custom_tool.py delete mode 100644 examples/code/integrations/oauth2/custom_auth.js delete mode 100644 examples/code/integrations/oauth2/custom_auth.py delete mode 100644 examples/code/integrations/oauth2/custom_tool.py delete mode 100644 examples/code/integrations/reddit/config_provider.engine.yaml delete mode 100644 examples/code/integrations/reddit/custom_auth.js delete mode 100644 examples/code/integrations/reddit/custom_auth.py delete mode 100644 examples/code/integrations/reddit/custom_tool.py delete mode 100644 examples/code/integrations/salesforce/config_provider.engine.yaml delete mode 100644 examples/code/integrations/salesforce/custom_auth.js delete mode 100644 examples/code/integrations/salesforce/custom_auth.py delete mode 100644 examples/code/integrations/slack/config_provider.engine.yaml delete mode 100644 examples/code/integrations/slack/custom_auth.js delete mode 100644 examples/code/integrations/slack/custom_auth.py delete mode 100644 examples/code/integrations/slack/custom_tool.py delete mode 100644 examples/code/integrations/spotify/config_provider.engine.yaml delete mode 100644 examples/code/integrations/spotify/custom_auth.js delete mode 100644 examples/code/integrations/spotify/custom_auth.py delete mode 100644 examples/code/integrations/spotify/custom_tool.py delete mode 100644 examples/code/integrations/twitch/config_provider.engine.yaml delete mode 100644 examples/code/integrations/twitch/custom_auth.js delete mode 100644 examples/code/integrations/twitch/custom_auth.py delete mode 100644 examples/code/integrations/twitch/custom_tool.py delete mode 100644 examples/code/integrations/x/config_provider.engine.yaml delete mode 100644 examples/code/integrations/x/custom_auth.js delete mode 100644 examples/code/integrations/x/custom_auth.py delete mode 100644 examples/code/integrations/x/custom_tool.py delete mode 100644 examples/code/integrations/zendesk/config_provider.engine.yaml delete mode 100644 examples/code/integrations/zendesk/custom_auth.js delete mode 100644 examples/code/integrations/zendesk/custom_auth.py delete mode 100644 examples/code/integrations/zendesk/custom_tool.py delete mode 100644 examples/code/integrations/zoom/config_provider.engine.yaml delete mode 100644 examples/code/integrations/zoom/custom_auth.js delete mode 100644 examples/code/integrations/zoom/custom_auth.py delete mode 100644 examples/code/integrations/zoom/custom_tool.py diff --git a/app/en/_meta.tsx b/app/en/_meta.tsx index 691941933..6f0813653 100644 --- a/app/en/_meta.tsx +++ b/app/en/_meta.tsx @@ -1,25 +1,164 @@ +import { BadgeHelp, Globe, Home, Shield } from "lucide-react"; import type { MetaRecord } from "nextra"; -const meta: MetaRecord = { +function TitleWithIcon({ + icon: Icon, + children, +}: { + icon: React.ComponentType<{ className?: string }>; + children: React.ReactNode; +}) { + return ( + + + {children} + + ); +} + +export const meta: MetaRecord = { "*": { theme: { + copyPage: true, + }, + }, + index: { + title: Home, + theme: { + breadcrumb: false, + layout: "full", + toc: false, copyPage: false, }, }, - home: { - type: "page", - title: "Home", - href: "/get-started", + arcade: { + title: Arcade.dev, + href: "https://arcade.dev", + }, + "-- Getting Started": { + type: "separator", + title: "Using Arcade", + }, + quickstart: { + title: "Calling tools in your agent", + }, + "mcp-gateway-quickstart": { + title: "Call a tool in your IDE/MCP Client", + }, + "custom-mcp-server-quickstart": { + title: "Build MCP Server QuickStart", + }, + "api-keys": { + title: "Get an API key", + }, + examples: { + title: "Example agents", + }, + "-- Authoring Tools": { + type: "separator", + title: "Authoring Tools", + }, + "build-tools": { + title: "Build tools", + }, + "evaluate-tools": { + title: "Evaluate tools", + }, + "serve-tools": { + title: "Serve tools", + }, + "-- Agent Frameworks and MCP": { + type: "separator", + title: "Agent Frameworks and MCP", + }, + "agent-frameworks-overview": { + title: "Overview", + }, + "mcp-clients": { + title: "MCP Clients", + }, + langchain: { + title: "LangChain", + }, + crewai: { + title: "CrewAI", + }, + "google-adk": { + title: "Google ADK", + }, + mastra: { + title: "Mastra", + }, + "oai-agents": { + title: "OpenAI Agents", + }, + vercelai: { + title: "Vercel AI", + }, + "-- Core Concepts": { + type: "separator", + title: "Core Concepts", + }, + "use-tools": { + title: "Tool Calling", + }, + auth: { + title: "Authorization", + }, + "mcp-gateways": { + title: "MCP Gateways", + }, + "arcade-cli": { + title: "Arcade CLI", + }, + "-- Hosting options": { + type: "separator", + title: "Hosting options", + }, + "hosting-overview": { + title: "Overview", + }, + deployment: { + title: "Deployment", + }, + "auth-providers": { + title: "Customizing Auth", + }, + "-- Guides": { + type: "separator", + title: "Guides", + }, + glossary: { + title: "Glossary", + }, + faq: { + title: "FAQ", + }, + "compare-server-types": { + title: "Compare Server Types", + }, + "agentic-development": { + title: "Agentic Development", + }, + changelog: { + title: "Changelog", + }, + "-- Registry": { + type: "separator", + title: "Registry", + }, + "registry-early-access": { + title: "Registry Early Access", + }, + "-- Resources": { + type: "separator", + title: "Resources", }, - "mcp-servers": { - type: "page", - title: "MCP Servers", - href: "/mcp-servers", + "contact-us": { + title: Contact us, }, - references: { - type: "page", - title: "API & SDKs", - href: "/references", + security: { + title: Security, }, }; diff --git a/app/en/home/auth/how-arcade-helps/page.mdx b/app/en/get-started/about-arcade/page.mdx similarity index 92% rename from app/en/home/auth/how-arcade-helps/page.mdx rename to app/en/get-started/about-arcade/page.mdx index d6d63cd69..f3fcc3210 100644 --- a/app/en/home/auth/how-arcade-helps/page.mdx +++ b/app/en/get-started/about-arcade/page.mdx @@ -1,14 +1,10 @@ --- -title: "How Arcade helps" +title: "How Arcade helps with Agent Authorization" description: "Learn how Arcade helps with auth and tool calling" --- import { Tabs } from "nextra/components"; -# How Arcade helps with Agent Authorization - -### 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. @@ -17,7 +13,7 @@ Authenticating to retrieve information, however, is not the only challenge. Agen Without auth, AI agents are severely limited in what they can do. -### How Arcade solves this +## 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. @@ -27,7 +23,7 @@ With Arcade, developers can now create agents that can _act as the end users of - Sending or reading email - Answering questions about files in Google Drive. -### Auth permissions and scopes +## Auth permissions and scopes Each tool in Arcade's MCP Servers has a set of required permissions - or, more commonly referred to in OAuth2, **scopes**. For example, the [`Gmail.SendEmail`](/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. @@ -35,11 +31,11 @@ A scope is what the user has authorized someone else (in this case, the AI agent 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 +## 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](/home/auth/auth-tool-calling). -### Tools that don't require authorization +## Tools that don't require authorization Some tools, like [`GoogleSearch.Search`](/mcp-servers/search/google_search#googlesearchsearch), allow AI agents to retrieve information or perform actions without needing user-specific authorization. diff --git a/app/en/home/quickstart/page.mdx b/app/en/get-started/quickstarts/call-tool-agent/page.mdx similarity index 100% rename from app/en/home/quickstart/page.mdx rename to app/en/get-started/quickstarts/call-tool-agent/page.mdx diff --git a/app/en/home/mcp-gateway-quickstart/page.mdx b/app/en/get-started/quickstarts/call-tool-client/page.mdx similarity index 100% rename from app/en/home/mcp-gateway-quickstart/page.mdx rename to app/en/get-started/quickstarts/call-tool-client/page.mdx diff --git a/app/en/home/custom-mcp-server-quickstart/page.mdx b/app/en/get-started/quickstarts/mcp-server-quickstart/page.mdx similarity index 100% rename from app/en/home/custom-mcp-server-quickstart/page.mdx rename to app/en/get-started/quickstarts/mcp-server-quickstart/page.mdx diff --git a/app/en/home/api-keys/page.mdx b/app/en/get-started/setup/api-keys/page.mdx similarity index 100% rename from app/en/home/api-keys/page.mdx rename to app/en/get-started/setup/api-keys/page.mdx diff --git a/app/en/home/agentic-development/page.mdx b/app/en/get-started/setup/connect-arcade-docs/page.mdx similarity index 100% rename from app/en/home/agentic-development/page.mdx rename to app/en/get-started/setup/connect-arcade-docs/page.mdx diff --git a/app/en/home/crewai/_meta.tsx b/app/en/guides/agent-frameworks/crewai/_meta.tsx similarity index 100% rename from app/en/home/crewai/_meta.tsx rename to app/en/guides/agent-frameworks/crewai/_meta.tsx diff --git a/app/en/home/crewai/custom-auth-flow/page.mdx b/app/en/guides/agent-frameworks/crewai/custom-auth-flow/page.mdx similarity index 100% rename from app/en/home/crewai/custom-auth-flow/page.mdx rename to app/en/guides/agent-frameworks/crewai/custom-auth-flow/page.mdx diff --git a/app/en/home/crewai/use-arcade-tools/page.mdx b/app/en/guides/agent-frameworks/crewai/use-arcade-tools/page.mdx similarity index 100% rename from app/en/home/crewai/use-arcade-tools/page.mdx rename to app/en/guides/agent-frameworks/crewai/use-arcade-tools/page.mdx diff --git a/app/en/home/google-adk/_meta.tsx b/app/en/guides/agent-frameworks/google-adk/_meta.tsx similarity index 100% rename from app/en/home/google-adk/_meta.tsx rename to app/en/guides/agent-frameworks/google-adk/_meta.tsx diff --git a/app/en/home/google-adk/overview/page.mdx b/app/en/guides/agent-frameworks/google-adk/overview/page.mdx similarity index 100% rename from app/en/home/google-adk/overview/page.mdx rename to app/en/guides/agent-frameworks/google-adk/overview/page.mdx diff --git a/app/en/home/google-adk/use-arcade-tools/page.mdx b/app/en/guides/agent-frameworks/google-adk/use-arcade-tools/page.mdx similarity index 100% rename from app/en/home/google-adk/use-arcade-tools/page.mdx rename to app/en/guides/agent-frameworks/google-adk/use-arcade-tools/page.mdx diff --git a/app/en/home/langchain/_meta.tsx b/app/en/guides/agent-frameworks/langchain/_meta.tsx similarity index 100% rename from app/en/home/langchain/_meta.tsx rename to app/en/guides/agent-frameworks/langchain/_meta.tsx diff --git a/app/en/home/langchain/auth-langchain-tools/page.mdx b/app/en/guides/agent-frameworks/langchain/auth-langchain-tools/page.mdx similarity index 100% rename from app/en/home/langchain/auth-langchain-tools/page.mdx rename to app/en/guides/agent-frameworks/langchain/auth-langchain-tools/page.mdx diff --git a/app/en/home/langchain/use-arcade-tools/page.mdx b/app/en/guides/agent-frameworks/langchain/use-arcade-tools/page.mdx similarity index 100% rename from app/en/home/langchain/use-arcade-tools/page.mdx rename to app/en/guides/agent-frameworks/langchain/use-arcade-tools/page.mdx diff --git a/app/en/home/langchain/use-arcade-with-langchain/page.mdx b/app/en/guides/agent-frameworks/langchain/use-arcade-with-langchain/page.mdx similarity index 100% rename from app/en/home/langchain/use-arcade-with-langchain/page.mdx rename to app/en/guides/agent-frameworks/langchain/use-arcade-with-langchain/page.mdx diff --git a/app/en/home/langchain/user-auth-interrupts/page.mdx b/app/en/guides/agent-frameworks/langchain/user-auth-interrupts/page.mdx similarity index 100% rename from app/en/home/langchain/user-auth-interrupts/page.mdx rename to app/en/guides/agent-frameworks/langchain/user-auth-interrupts/page.mdx diff --git a/app/en/home/mastra/_meta.tsx b/app/en/guides/agent-frameworks/mastra/_meta.tsx similarity index 100% rename from app/en/home/mastra/_meta.tsx rename to app/en/guides/agent-frameworks/mastra/_meta.tsx diff --git a/app/en/home/mastra/overview/page.mdx b/app/en/guides/agent-frameworks/mastra/overview/page.mdx similarity index 100% rename from app/en/home/mastra/overview/page.mdx rename to app/en/guides/agent-frameworks/mastra/overview/page.mdx diff --git a/app/en/home/mastra/use-arcade-tools/page.mdx b/app/en/guides/agent-frameworks/mastra/use-arcade-tools/page.mdx similarity index 100% rename from app/en/home/mastra/use-arcade-tools/page.mdx rename to app/en/guides/agent-frameworks/mastra/use-arcade-tools/page.mdx diff --git a/app/en/home/mastra/user-auth-interrupts/page.mdx b/app/en/guides/agent-frameworks/mastra/user-auth-interrupts/page.mdx similarity index 100% rename from app/en/home/mastra/user-auth-interrupts/page.mdx rename to app/en/guides/agent-frameworks/mastra/user-auth-interrupts/page.mdx diff --git a/app/en/home/oai-agents/_meta.tsx b/app/en/guides/agent-frameworks/openai-agents/_meta.tsx similarity index 100% rename from app/en/home/oai-agents/_meta.tsx rename to app/en/guides/agent-frameworks/openai-agents/_meta.tsx diff --git a/app/en/home/oai-agents/overview/page.mdx b/app/en/guides/agent-frameworks/openai-agents/overview/page.mdx similarity index 100% rename from app/en/home/oai-agents/overview/page.mdx rename to app/en/guides/agent-frameworks/openai-agents/overview/page.mdx diff --git a/app/en/home/oai-agents/use-arcade-tools/page.mdx b/app/en/guides/agent-frameworks/openai-agents/use-arcade-tools/page.mdx similarity index 100% rename from app/en/home/oai-agents/use-arcade-tools/page.mdx rename to app/en/guides/agent-frameworks/openai-agents/use-arcade-tools/page.mdx diff --git a/app/en/home/oai-agents/user-auth-interrupts/page.mdx b/app/en/guides/agent-frameworks/openai-agents/user-auth-interrupts/page.mdx similarity index 100% rename from app/en/home/oai-agents/user-auth-interrupts/page.mdx rename to app/en/guides/agent-frameworks/openai-agents/user-auth-interrupts/page.mdx diff --git a/app/en/home/agent-frameworks-overview/page.mdx b/app/en/guides/agent-frameworks/page.mdx similarity index 100% rename from app/en/home/agent-frameworks-overview/page.mdx rename to app/en/guides/agent-frameworks/page.mdx diff --git a/app/en/home/vercelai/_meta.tsx b/app/en/guides/agent-frameworks/vercelai/_meta.tsx similarity index 100% rename from app/en/home/vercelai/_meta.tsx rename to app/en/guides/agent-frameworks/vercelai/_meta.tsx diff --git a/app/en/home/vercelai/using-arcade-tools/page.mdx b/app/en/guides/agent-frameworks/vercelai/using-arcade-tools/page.mdx similarity index 100% rename from app/en/home/vercelai/using-arcade-tools/page.mdx rename to app/en/guides/agent-frameworks/vercelai/using-arcade-tools/page.mdx diff --git a/app/en/home/registry-early-access/page.mdx b/app/en/guides/create-tools/add-tools-to-arcade-catalog/registry-early-access/page.mdx similarity index 100% rename from app/en/home/registry-early-access/page.mdx rename to app/en/guides/create-tools/add-tools-to-arcade-catalog/registry-early-access/page.mdx diff --git a/app/en/home/registry-early-access/take-survey.tsx b/app/en/guides/create-tools/add-tools-to-arcade-catalog/registry-early-access/take-survey.tsx similarity index 100% rename from app/en/home/registry-early-access/take-survey.tsx rename to app/en/guides/create-tools/add-tools-to-arcade-catalog/registry-early-access/take-survey.tsx diff --git a/app/en/home/build-tools/migrate-from-toolkits/page.mdx b/app/en/guides/create-tools/error-handling/migrate-toolkits/page.mdx similarity index 100% rename from app/en/home/build-tools/migrate-from-toolkits/page.mdx rename to app/en/guides/create-tools/error-handling/migrate-toolkits/page.mdx diff --git a/app/en/home/build-tools/retry-tools-with-improved-prompt/page.mdx b/app/en/guides/create-tools/error-handling/retry-tools/page.mdx similarity index 100% rename from app/en/home/build-tools/retry-tools-with-improved-prompt/page.mdx rename to app/en/guides/create-tools/error-handling/retry-tools/page.mdx diff --git a/app/en/home/build-tools/providing-useful-tool-errors/page.mdx b/app/en/guides/create-tools/error-handling/useful-tool-errors/page.mdx similarity index 100% rename from app/en/home/build-tools/providing-useful-tool-errors/page.mdx rename to app/en/guides/create-tools/error-handling/useful-tool-errors/page.mdx diff --git a/app/en/home/evaluate-tools/_meta.tsx b/app/en/guides/create-tools/evaluate-tools/_meta.tsx similarity index 100% rename from app/en/home/evaluate-tools/_meta.tsx rename to app/en/guides/create-tools/evaluate-tools/_meta.tsx diff --git a/app/en/home/evaluate-tools/create-an-evaluation-suite/page.mdx b/app/en/guides/create-tools/evaluate-tools/create-evaluation-suite/page.mdx similarity index 100% rename from app/en/home/evaluate-tools/create-an-evaluation-suite/page.mdx rename to app/en/guides/create-tools/evaluate-tools/create-evaluation-suite/page.mdx diff --git a/app/en/home/evaluate-tools/run-evaluations/page.mdx b/app/en/guides/create-tools/evaluate-tools/run-evaluations/page.mdx similarity index 100% rename from app/en/home/evaluate-tools/run-evaluations/page.mdx rename to app/en/guides/create-tools/evaluate-tools/run-evaluations/page.mdx diff --git a/app/en/home/evaluate-tools/why-evaluate-tools/page.mdx b/app/en/guides/create-tools/evaluate-tools/why-evaluate/page.mdx similarity index 100% rename from app/en/home/evaluate-tools/why-evaluate-tools/page.mdx rename to app/en/guides/create-tools/evaluate-tools/why-evaluate/page.mdx diff --git a/app/en/home/mcp-gateways/page.mdx b/app/en/guides/create-tools/mcp-gateways/page.mdx similarity index 100% rename from app/en/home/mcp-gateways/page.mdx rename to app/en/guides/create-tools/mcp-gateways/page.mdx diff --git a/app/en/home/use-tools/types-of-tools/page.mdx b/app/en/guides/create-tools/performance/types-of-tools/page.mdx similarity index 100% rename from app/en/home/use-tools/types-of-tools/page.mdx rename to app/en/guides/create-tools/performance/types-of-tools/page.mdx diff --git a/app/en/home/build-tools/create-a-mcp-server/page.mdx b/app/en/guides/create-tools/tool-basics/build-mcp-server/page.mdx similarity index 100% rename from app/en/home/build-tools/create-a-mcp-server/page.mdx rename to app/en/guides/create-tools/tool-basics/build-mcp-server/page.mdx diff --git a/app/en/home/build-tools/call-tools-from-mcp-clients/page.mdx b/app/en/guides/create-tools/tool-basics/call-tools-mcp/page.mdx similarity index 100% rename from app/en/home/build-tools/call-tools-from-mcp-clients/page.mdx rename to app/en/guides/create-tools/tool-basics/call-tools-mcp/page.mdx diff --git a/app/en/home/compare-server-types/page.mdx b/app/en/guides/create-tools/tool-basics/compare-server-types/page.mdx similarity index 100% rename from app/en/home/compare-server-types/page.mdx rename to app/en/guides/create-tools/tool-basics/compare-server-types/page.mdx diff --git a/app/en/home/build-tools/create-a-tool-with-auth/page.mdx b/app/en/guides/create-tools/tool-basics/create-tool-auth/page.mdx similarity index 100% rename from app/en/home/build-tools/create-a-tool-with-auth/page.mdx rename to app/en/guides/create-tools/tool-basics/create-tool-auth/page.mdx diff --git a/app/en/home/build-tools/create-a-tool-with-secrets/page.mdx b/app/en/guides/create-tools/tool-basics/create-tool-secrets/page.mdx similarity index 100% rename from app/en/home/build-tools/create-a-tool-with-secrets/page.mdx rename to app/en/guides/create-tools/tool-basics/create-tool-secrets/page.mdx diff --git a/app/en/home/build-tools/organize-mcp-server-tools/page.mdx b/app/en/guides/create-tools/tool-basics/organize-mcp-tools/page.mdx similarity index 100% rename from app/en/home/build-tools/organize-mcp-server-tools/page.mdx rename to app/en/guides/create-tools/tool-basics/organize-mcp-tools/page.mdx diff --git a/app/en/home/build-tools/tool-context/page.mdx b/app/en/guides/create-tools/tool-basics/runtime-data-access/page.mdx similarity index 100% rename from app/en/home/build-tools/tool-context/page.mdx rename to app/en/guides/create-tools/tool-basics/runtime-data-access/page.mdx diff --git a/app/en/home/deployment/_meta.tsx b/app/en/guides/deployment-hosting/_meta.tsx similarity index 100% rename from app/en/home/deployment/_meta.tsx rename to app/en/guides/deployment-hosting/_meta.tsx diff --git a/app/en/home/deployment/arcade-cloud-infra/page.mdx b/app/en/guides/deployment-hosting/arcade-cloud/page.mdx similarity index 100% rename from app/en/home/deployment/arcade-cloud-infra/page.mdx rename to app/en/guides/deployment-hosting/arcade-cloud/page.mdx diff --git a/app/en/home/serve-tools/arcade-deploy/page.mdx b/app/en/guides/deployment-hosting/arcade-deploy/page.mdx similarity index 100% rename from app/en/home/serve-tools/arcade-deploy/page.mdx rename to app/en/guides/deployment-hosting/arcade-deploy/page.mdx diff --git a/app/en/home/deployment/engine-configuration/page.mdx b/app/en/guides/deployment-hosting/configure-engine/page.mdx similarity index 100% rename from app/en/home/deployment/engine-configuration/page.mdx rename to app/en/guides/deployment-hosting/configure-engine/page.mdx diff --git a/app/en/home/deployment/on-prem-mcp/page.mdx b/app/en/guides/deployment-hosting/on-prem/page.mdx similarity index 100% rename from app/en/home/deployment/on-prem-mcp/page.mdx rename to app/en/guides/deployment-hosting/on-prem/page.mdx diff --git a/app/en/home/hosting-overview/page.mdx b/app/en/guides/deployment-hosting/page.mdx similarity index 100% rename from app/en/home/hosting-overview/page.mdx rename to app/en/guides/deployment-hosting/page.mdx diff --git a/app/en/home/build-tools/secure-your-mcp-server/page.mdx b/app/en/guides/security/secure-your-mcp-server/page.mdx similarity index 100% rename from app/en/home/build-tools/secure-your-mcp-server/page.mdx rename to app/en/guides/security/secure-your-mcp-server/page.mdx diff --git a/app/en/home/serve-tools/securing-arcade-mcp/page.mdx b/app/en/guides/security/securing-arcade-mcp/page.mdx similarity index 100% rename from app/en/home/serve-tools/securing-arcade-mcp/page.mdx rename to app/en/guides/security/securing-arcade-mcp/page.mdx diff --git a/app/en/home/security/page.mdx b/app/en/guides/security/security-research-program/page.mdx similarity index 100% rename from app/en/home/security/page.mdx rename to app/en/guides/security/security-research-program/page.mdx diff --git a/app/en/home/auth/call-third-party-apis-directly/page.mdx b/app/en/guides/tool-calling/call-third-party-apis-directly/page.mdx similarity index 100% rename from app/en/home/auth/call-third-party-apis-directly/page.mdx rename to app/en/guides/tool-calling/call-third-party-apis-directly/page.mdx diff --git a/app/en/home/auth/auth-tool-calling/page.mdx b/app/en/guides/tool-calling/custom-apps/auth-tool-calling/page.mdx similarity index 100% rename from app/en/home/auth/auth-tool-calling/page.mdx rename to app/en/guides/tool-calling/custom-apps/auth-tool-calling/page.mdx diff --git a/app/en/home/use-tools/get-tool-definitions/page.mdx b/app/en/guides/tool-calling/custom-apps/get-tool-definitions/page.mdx similarity index 100% rename from app/en/home/use-tools/get-tool-definitions/page.mdx rename to app/en/guides/tool-calling/custom-apps/get-tool-definitions/page.mdx diff --git a/app/en/home/auth/tool-auth-status/page.mdx b/app/en/guides/tool-calling/custom-apps/tool-auth-status/page.mdx similarity index 100% rename from app/en/home/auth/tool-auth-status/page.mdx rename to app/en/guides/tool-calling/custom-apps/tool-auth-status/page.mdx diff --git a/app/en/home/use-tools/error-handling/page.mdx b/app/en/guides/tool-calling/error-handling/page.mdx similarity index 100% rename from app/en/home/use-tools/error-handling/page.mdx rename to app/en/guides/tool-calling/error-handling/page.mdx diff --git a/app/en/home/mcp-clients/_meta.tsx b/app/en/guides/tool-calling/mcp-clients/_meta.tsx similarity index 100% rename from app/en/home/mcp-clients/_meta.tsx rename to app/en/guides/tool-calling/mcp-clients/_meta.tsx diff --git a/app/en/home/mcp-clients/claude-desktop/page.mdx b/app/en/guides/tool-calling/mcp-clients/claude-desktop/page.mdx similarity index 100% rename from app/en/home/mcp-clients/claude-desktop/page.mdx rename to app/en/guides/tool-calling/mcp-clients/claude-desktop/page.mdx diff --git a/app/en/home/mcp-clients/cursor/page.mdx b/app/en/guides/tool-calling/mcp-clients/cursor/page.mdx similarity index 100% rename from app/en/home/mcp-clients/cursor/page.mdx rename to app/en/guides/tool-calling/mcp-clients/cursor/page.mdx diff --git a/app/en/home/mcp-clients/visual-studio-code/page.mdx b/app/en/guides/tool-calling/mcp-clients/visual-studio-code/page.mdx similarity index 100% rename from app/en/home/mcp-clients/visual-studio-code/page.mdx rename to app/en/guides/tool-calling/mcp-clients/visual-studio-code/page.mdx diff --git a/app/en/home/use-tools/tools-overview/page.mdx b/app/en/guides/tool-calling/page.mdx similarity index 100% rename from app/en/home/use-tools/tools-overview/page.mdx rename to app/en/guides/tool-calling/page.mdx diff --git a/app/en/home/auth/secure-auth-production/page.mdx b/app/en/guides/user-facing-agents/secure-auth-production/page.mdx similarity index 100% rename from app/en/home/auth/secure-auth-production/page.mdx rename to app/en/guides/user-facing-agents/secure-auth-production/page.mdx diff --git a/app/en/home/_meta.tsx b/app/en/home/_meta.tsx deleted file mode 100644 index 6f0813653..000000000 --- a/app/en/home/_meta.tsx +++ /dev/null @@ -1,165 +0,0 @@ -import { BadgeHelp, Globe, Home, Shield } from "lucide-react"; -import type { MetaRecord } from "nextra"; - -function TitleWithIcon({ - icon: Icon, - children, -}: { - icon: React.ComponentType<{ className?: string }>; - children: React.ReactNode; -}) { - return ( - - - {children} - - ); -} - -export const meta: MetaRecord = { - "*": { - theme: { - copyPage: true, - }, - }, - index: { - title: Home, - theme: { - breadcrumb: false, - layout: "full", - toc: false, - copyPage: false, - }, - }, - arcade: { - title: Arcade.dev, - href: "https://arcade.dev", - }, - "-- Getting Started": { - type: "separator", - title: "Using Arcade", - }, - quickstart: { - title: "Calling tools in your agent", - }, - "mcp-gateway-quickstart": { - title: "Call a tool in your IDE/MCP Client", - }, - "custom-mcp-server-quickstart": { - title: "Build MCP Server QuickStart", - }, - "api-keys": { - title: "Get an API key", - }, - examples: { - title: "Example agents", - }, - "-- Authoring Tools": { - type: "separator", - title: "Authoring Tools", - }, - "build-tools": { - title: "Build tools", - }, - "evaluate-tools": { - title: "Evaluate tools", - }, - "serve-tools": { - title: "Serve tools", - }, - "-- Agent Frameworks and MCP": { - type: "separator", - title: "Agent Frameworks and MCP", - }, - "agent-frameworks-overview": { - title: "Overview", - }, - "mcp-clients": { - title: "MCP Clients", - }, - langchain: { - title: "LangChain", - }, - crewai: { - title: "CrewAI", - }, - "google-adk": { - title: "Google ADK", - }, - mastra: { - title: "Mastra", - }, - "oai-agents": { - title: "OpenAI Agents", - }, - vercelai: { - title: "Vercel AI", - }, - "-- Core Concepts": { - type: "separator", - title: "Core Concepts", - }, - "use-tools": { - title: "Tool Calling", - }, - auth: { - title: "Authorization", - }, - "mcp-gateways": { - title: "MCP Gateways", - }, - "arcade-cli": { - title: "Arcade CLI", - }, - "-- Hosting options": { - type: "separator", - title: "Hosting options", - }, - "hosting-overview": { - title: "Overview", - }, - deployment: { - title: "Deployment", - }, - "auth-providers": { - title: "Customizing Auth", - }, - "-- Guides": { - type: "separator", - title: "Guides", - }, - glossary: { - title: "Glossary", - }, - faq: { - title: "FAQ", - }, - "compare-server-types": { - title: "Compare Server Types", - }, - "agentic-development": { - title: "Agentic Development", - }, - changelog: { - title: "Changelog", - }, - "-- Registry": { - type: "separator", - title: "Registry", - }, - "registry-early-access": { - title: "Registry Early Access", - }, - "-- Resources": { - type: "separator", - title: "Resources", - }, - "contact-us": { - title: Contact us, - }, - security: { - title: Security, - }, -}; - -export default meta; diff --git a/app/en/home/auth/_meta.tsx b/app/en/home/auth/_meta.tsx deleted file mode 100644 index 025a383e3..000000000 --- a/app/en/home/auth/_meta.tsx +++ /dev/null @@ -1,7 +0,0 @@ -export default { - "how-arcade-helps": "How Arcade Helps", - "auth-tool-calling": "Authorized Tool Calling", - "tool-auth-status": "Checking Authorization Status", - "call-third-party-apis-directly": "Direct Third-Party API Call", - "secure-auth-production": "Secure Auth in Production", -}; diff --git a/app/en/home/auth/how-arcade-helps.mdx b/app/en/home/auth/how-arcade-helps.mdx deleted file mode 100644 index 12ea2984f..000000000 --- a/app/en/home/auth/how-arcade-helps.mdx +++ /dev/null @@ -1,78 +0,0 @@ ---- -title: "How Arcade helps" -description: "Learn how Arcade helps with auth and tool calling" ---- - -import { Tabs } from "nextra/components"; - -# How Arcade helps with Agent Authorization - -### 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 - -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 - -Each tool in Arcade's MCP Servers has a set of required permissions - or, more commonly referred to in OAuth2, **scopes**. For example, the [`Gmail.SendEmail`](/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 - -To learn how Arcade allows for actions (tools) to be authorized through OAuth2 and how to implement it, check out [Authorized Tool Calling](/home/auth/auth-tool-calling). - -### Tools that don't require authorization - -Some tools, like [`GoogleSearch.Search`](/mcp-servers/search/google_search#googlesearchsearch), allow AI agents to retrieve information or perform actions without needing user-specific authorization. - - - -```python -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) - -```` - - -```javascript -import { Arcade } from "@arcadeai/arcadejs"; - -const client = new Arcade(api_key="arcade_api_key"); // or set the ARCADE_API_KEY env var - -// Use the GoogleSearch.Search tool to perform a web search -const response = await client.tools.execute({ - tool_name: "GoogleSearch.Search", - input: { query: "Latest AI advancements" }, -}); -console.log(response.output.value); -```` - - - diff --git a/app/en/home/build-tools/_meta.tsx b/app/en/home/build-tools/_meta.tsx deleted file mode 100644 index 74349d63f..000000000 --- a/app/en/home/build-tools/_meta.tsx +++ /dev/null @@ -1,13 +0,0 @@ -export default { - "create-a-mcp-server": "Create an MCP Server", - "create-a-tool-with-auth": "Create a tool with auth", - "create-a-tool-with-secrets": "Create a tool with secrets", - "tool-context": "Tools and Context", - "organize-mcp-server-tools": "Organize MCP server tools", - "providing-useful-tool-errors": "Providing useful tool errors", - "retry-tools-with-improved-prompt": "Retry tools with improved prompt", - "call-tools-from-mcp-clients": "Call tools from MCP clients", - "secure-your-mcp-server": "Secure Your MCP Server with OAuth", - "server-level-vs-tool-level-auth": "Server-Level vs Tool-Level Authorization", - "migrate-from-toolkits": "Migrate from toolkits", -}; diff --git a/app/en/home/serve-tools/_meta.tsx b/app/en/home/serve-tools/_meta.tsx deleted file mode 100644 index c7e61f707..000000000 --- a/app/en/home/serve-tools/_meta.tsx +++ /dev/null @@ -1,4 +0,0 @@ -export default { - "arcade-deploy": "Arcade Deploy", - "securing-arcade-mcp": "Securing Arcade MCP", -}; diff --git a/app/en/home/use-tools/_meta.tsx b/app/en/home/use-tools/_meta.tsx deleted file mode 100644 index 7661d8b0b..000000000 --- a/app/en/home/use-tools/_meta.tsx +++ /dev/null @@ -1,8 +0,0 @@ -import type { MetaRecord } from "nextra"; - -export default { - "tools-overview": "Introduction", - "get-tool-definitions": "Tool formats", - "types-of-tools": "Types of tools", - "error-handling": "Error handling", -} satisfies MetaRecord; diff --git a/app/en/mcp-servers/_meta.tsx b/app/en/integrations/_meta.tsx similarity index 100% rename from app/en/mcp-servers/_meta.tsx rename to app/en/integrations/_meta.tsx diff --git a/app/en/mcp-servers/components/coming-soon-modal.tsx b/app/en/integrations/components/coming-soon-modal.tsx similarity index 100% rename from app/en/mcp-servers/components/coming-soon-modal.tsx rename to app/en/integrations/components/coming-soon-modal.tsx diff --git a/app/en/mcp-servers/components/filters-bar.tsx b/app/en/integrations/components/filters-bar.tsx similarity index 100% rename from app/en/mcp-servers/components/filters-bar.tsx rename to app/en/integrations/components/filters-bar.tsx diff --git a/app/en/mcp-servers/components/tool-card.tsx b/app/en/integrations/components/tool-card.tsx similarity index 100% rename from app/en/mcp-servers/components/tool-card.tsx rename to app/en/integrations/components/tool-card.tsx diff --git a/app/en/mcp-servers/components/toolkit-utils.ts b/app/en/integrations/components/toolkit-utils.ts similarity index 100% rename from app/en/mcp-servers/components/toolkit-utils.ts rename to app/en/integrations/components/toolkit-utils.ts diff --git a/app/en/mcp-servers/components/toolkits.tsx b/app/en/integrations/components/toolkits.tsx similarity index 100% rename from app/en/mcp-servers/components/toolkits.tsx rename to app/en/integrations/components/toolkits.tsx diff --git a/app/en/mcp-servers/components/type-config.tsx b/app/en/integrations/components/type-config.tsx similarity index 100% rename from app/en/mcp-servers/components/type-config.tsx rename to app/en/integrations/components/type-config.tsx diff --git a/app/en/mcp-servers/components/use-toolkit-filters.ts b/app/en/integrations/components/use-toolkit-filters.ts similarity index 100% rename from app/en/mcp-servers/components/use-toolkit-filters.ts rename to app/en/integrations/components/use-toolkit-filters.ts diff --git a/app/en/mcp-servers/contribute-a-server/page.mdx b/app/en/integrations/contribute-a-server/page.mdx similarity index 100% rename from app/en/mcp-servers/contribute-a-server/page.mdx rename to app/en/integrations/contribute-a-server/page.mdx diff --git a/app/en/mcp-servers/customer-support/_meta.tsx b/app/en/integrations/customer-support/_meta.tsx similarity index 100% rename from app/en/mcp-servers/customer-support/_meta.tsx rename to app/en/integrations/customer-support/_meta.tsx diff --git a/app/en/mcp-servers/customer-support/customerio-api/page.mdx b/app/en/integrations/customer-support/customerio-api/page.mdx similarity index 100% rename from app/en/mcp-servers/customer-support/customerio-api/page.mdx rename to app/en/integrations/customer-support/customerio-api/page.mdx diff --git a/app/en/mcp-servers/customer-support/customerio-pipelines-api/page.mdx b/app/en/integrations/customer-support/customerio-pipelines-api/page.mdx similarity index 100% rename from app/en/mcp-servers/customer-support/customerio-pipelines-api/page.mdx rename to app/en/integrations/customer-support/customerio-pipelines-api/page.mdx diff --git a/app/en/mcp-servers/customer-support/customerio-track-api/page.mdx b/app/en/integrations/customer-support/customerio-track-api/page.mdx similarity index 100% rename from app/en/mcp-servers/customer-support/customerio-track-api/page.mdx rename to app/en/integrations/customer-support/customerio-track-api/page.mdx diff --git a/app/en/mcp-servers/customer-support/freshservice-api/page.mdx b/app/en/integrations/customer-support/freshservice-api/page.mdx similarity index 100% rename from app/en/mcp-servers/customer-support/freshservice-api/page.mdx rename to app/en/integrations/customer-support/freshservice-api/page.mdx diff --git a/app/en/mcp-servers/customer-support/intercom-api/page.mdx b/app/en/integrations/customer-support/intercom-api/page.mdx similarity index 100% rename from app/en/mcp-servers/customer-support/intercom-api/page.mdx rename to app/en/integrations/customer-support/intercom-api/page.mdx diff --git a/app/en/mcp-servers/customer-support/pagerduty/page.mdx b/app/en/integrations/customer-support/pagerduty/page.mdx similarity index 100% rename from app/en/mcp-servers/customer-support/pagerduty/page.mdx rename to app/en/integrations/customer-support/pagerduty/page.mdx diff --git a/app/en/mcp-servers/customer-support/pylon/page.mdx b/app/en/integrations/customer-support/pylon/page.mdx similarity index 100% rename from app/en/mcp-servers/customer-support/pylon/page.mdx rename to app/en/integrations/customer-support/pylon/page.mdx diff --git a/app/en/mcp-servers/customer-support/zendesk/_meta.tsx b/app/en/integrations/customer-support/zendesk/_meta.tsx similarity index 100% rename from app/en/mcp-servers/customer-support/zendesk/_meta.tsx rename to app/en/integrations/customer-support/zendesk/_meta.tsx diff --git a/app/en/mcp-servers/customer-support/zendesk/page.mdx b/app/en/integrations/customer-support/zendesk/page.mdx similarity index 100% rename from app/en/mcp-servers/customer-support/zendesk/page.mdx rename to app/en/integrations/customer-support/zendesk/page.mdx diff --git a/app/en/mcp-servers/customer-support/zendesk/reference/page.mdx b/app/en/integrations/customer-support/zendesk/reference/page.mdx similarity index 100% rename from app/en/mcp-servers/customer-support/zendesk/reference/page.mdx rename to app/en/integrations/customer-support/zendesk/reference/page.mdx diff --git a/app/en/mcp-servers/databases/_meta.ts b/app/en/integrations/databases/_meta.ts similarity index 100% rename from app/en/mcp-servers/databases/_meta.ts rename to app/en/integrations/databases/_meta.ts diff --git a/app/en/mcp-servers/databases/_meta.tsx b/app/en/integrations/databases/_meta.tsx similarity index 100% rename from app/en/mcp-servers/databases/_meta.tsx rename to app/en/integrations/databases/_meta.tsx diff --git a/app/en/mcp-servers/databases/clickhouse/page.mdx b/app/en/integrations/databases/clickhouse/page.mdx similarity index 100% rename from app/en/mcp-servers/databases/clickhouse/page.mdx rename to app/en/integrations/databases/clickhouse/page.mdx diff --git a/app/en/mcp-servers/databases/mongodb/page.mdx b/app/en/integrations/databases/mongodb/page.mdx similarity index 100% rename from app/en/mcp-servers/databases/mongodb/page.mdx rename to app/en/integrations/databases/mongodb/page.mdx diff --git a/app/en/mcp-servers/databases/postgres/clickhouse.mdx b/app/en/integrations/databases/postgres/clickhouse.mdx similarity index 100% rename from app/en/mcp-servers/databases/postgres/clickhouse.mdx rename to app/en/integrations/databases/postgres/clickhouse.mdx diff --git a/app/en/mcp-servers/databases/postgres/mongodb.mdx b/app/en/integrations/databases/postgres/mongodb.mdx similarity index 100% rename from app/en/mcp-servers/databases/postgres/mongodb.mdx rename to app/en/integrations/databases/postgres/mongodb.mdx diff --git a/app/en/mcp-servers/databases/postgres/page.mdx b/app/en/integrations/databases/postgres/page.mdx similarity index 100% rename from app/en/mcp-servers/databases/postgres/page.mdx rename to app/en/integrations/databases/postgres/page.mdx diff --git a/app/en/mcp-servers/databases/weaviate-api/page.mdx b/app/en/integrations/databases/weaviate-api/page.mdx similarity index 100% rename from app/en/mcp-servers/databases/weaviate-api/page.mdx rename to app/en/integrations/databases/weaviate-api/page.mdx diff --git a/app/en/mcp-servers/development/_meta.tsx b/app/en/integrations/development/_meta.tsx similarity index 100% rename from app/en/mcp-servers/development/_meta.tsx rename to app/en/integrations/development/_meta.tsx diff --git a/app/en/mcp-servers/development/arcade-engine-api/page.mdx b/app/en/integrations/development/arcade-engine-api/page.mdx similarity index 100% rename from app/en/mcp-servers/development/arcade-engine-api/page.mdx rename to app/en/integrations/development/arcade-engine-api/page.mdx diff --git a/app/en/mcp-servers/development/brightdata/page.mdx b/app/en/integrations/development/brightdata/page.mdx similarity index 100% rename from app/en/mcp-servers/development/brightdata/page.mdx rename to app/en/integrations/development/brightdata/page.mdx diff --git a/app/en/mcp-servers/development/cursor-agents-api/page.mdx b/app/en/integrations/development/cursor-agents-api/page.mdx similarity index 100% rename from app/en/mcp-servers/development/cursor-agents-api/page.mdx rename to app/en/integrations/development/cursor-agents-api/page.mdx diff --git a/app/en/mcp-servers/development/datadog-api/page.mdx b/app/en/integrations/development/datadog-api/page.mdx similarity index 100% rename from app/en/mcp-servers/development/datadog-api/page.mdx rename to app/en/integrations/development/datadog-api/page.mdx diff --git a/app/en/mcp-servers/development/e2b/page.mdx b/app/en/integrations/development/e2b/page.mdx similarity index 100% rename from app/en/mcp-servers/development/e2b/page.mdx rename to app/en/integrations/development/e2b/page.mdx diff --git a/app/en/mcp-servers/development/figma/page.mdx b/app/en/integrations/development/figma/page.mdx similarity index 100% rename from app/en/mcp-servers/development/figma/page.mdx rename to app/en/integrations/development/figma/page.mdx diff --git a/app/en/mcp-servers/development/firecrawl/_meta.tsx b/app/en/integrations/development/firecrawl/_meta.tsx similarity index 100% rename from app/en/mcp-servers/development/firecrawl/_meta.tsx rename to app/en/integrations/development/firecrawl/_meta.tsx diff --git a/app/en/mcp-servers/development/firecrawl/page.mdx b/app/en/integrations/development/firecrawl/page.mdx similarity index 100% rename from app/en/mcp-servers/development/firecrawl/page.mdx rename to app/en/integrations/development/firecrawl/page.mdx diff --git a/app/en/mcp-servers/development/firecrawl/reference/page.mdx b/app/en/integrations/development/firecrawl/reference/page.mdx similarity index 100% rename from app/en/mcp-servers/development/firecrawl/reference/page.mdx rename to app/en/integrations/development/firecrawl/reference/page.mdx diff --git a/app/en/mcp-servers/development/github-api/page.mdx b/app/en/integrations/development/github-api/page.mdx similarity index 100% rename from app/en/mcp-servers/development/github-api/page.mdx rename to app/en/integrations/development/github-api/page.mdx diff --git a/app/en/mcp-servers/development/github/page.mdx b/app/en/integrations/development/github/page.mdx similarity index 100% rename from app/en/mcp-servers/development/github/page.mdx rename to app/en/integrations/development/github/page.mdx diff --git a/app/en/mcp-servers/development/pagerduty-api/page.mdx b/app/en/integrations/development/pagerduty-api/page.mdx similarity index 100% rename from app/en/mcp-servers/development/pagerduty-api/page.mdx rename to app/en/integrations/development/pagerduty-api/page.mdx diff --git a/app/en/mcp-servers/development/posthog-api/page.mdx b/app/en/integrations/development/posthog-api/page.mdx similarity index 100% rename from app/en/mcp-servers/development/posthog-api/page.mdx rename to app/en/integrations/development/posthog-api/page.mdx diff --git a/app/en/mcp-servers/development/vercel-api/page.mdx b/app/en/integrations/development/vercel-api/page.mdx similarity index 100% rename from app/en/mcp-servers/development/vercel-api/page.mdx rename to app/en/integrations/development/vercel-api/page.mdx diff --git a/app/en/mcp-servers/development/zoho-creator-api/page.mdx b/app/en/integrations/development/zoho-creator-api/page.mdx similarity index 100% rename from app/en/mcp-servers/development/zoho-creator-api/page.mdx rename to app/en/integrations/development/zoho-creator-api/page.mdx diff --git a/app/en/mcp-servers/entertainment/_meta.tsx b/app/en/integrations/entertainment/_meta.tsx similarity index 100% rename from app/en/mcp-servers/entertainment/_meta.tsx rename to app/en/integrations/entertainment/_meta.tsx diff --git a/app/en/mcp-servers/entertainment/imgflip/page.mdx b/app/en/integrations/entertainment/imgflip/page.mdx similarity index 100% rename from app/en/mcp-servers/entertainment/imgflip/page.mdx rename to app/en/integrations/entertainment/imgflip/page.mdx diff --git a/app/en/mcp-servers/entertainment/spotify/imgflip.mdx b/app/en/integrations/entertainment/spotify/imgflip.mdx similarity index 100% rename from app/en/mcp-servers/entertainment/spotify/imgflip.mdx rename to app/en/integrations/entertainment/spotify/imgflip.mdx diff --git a/app/en/mcp-servers/entertainment/spotify/page.mdx b/app/en/integrations/entertainment/spotify/page.mdx similarity index 100% rename from app/en/mcp-servers/entertainment/spotify/page.mdx rename to app/en/integrations/entertainment/spotify/page.mdx diff --git a/app/en/mcp-servers/entertainment/twitch/page.mdx b/app/en/integrations/entertainment/twitch/page.mdx similarity index 100% rename from app/en/mcp-servers/entertainment/twitch/page.mdx rename to app/en/integrations/entertainment/twitch/page.mdx diff --git a/app/en/mcp-servers/page.mdx b/app/en/integrations/page.mdx similarity index 100% rename from app/en/mcp-servers/page.mdx rename to app/en/integrations/page.mdx diff --git a/app/en/mcp-servers/payments/_meta.tsx b/app/en/integrations/payments/_meta.tsx similarity index 100% rename from app/en/mcp-servers/payments/_meta.tsx rename to app/en/integrations/payments/_meta.tsx diff --git a/app/en/mcp-servers/payments/stripe/page.mdx b/app/en/integrations/payments/stripe/page.mdx similarity index 100% rename from app/en/mcp-servers/payments/stripe/page.mdx rename to app/en/integrations/payments/stripe/page.mdx diff --git a/app/en/mcp-servers/payments/stripe_api/page.mdx b/app/en/integrations/payments/stripe_api/page.mdx similarity index 100% rename from app/en/mcp-servers/payments/stripe_api/page.mdx rename to app/en/integrations/payments/stripe_api/page.mdx diff --git a/app/en/mcp-servers/payments/zoho-books-api/page.mdx b/app/en/integrations/payments/zoho-books-api/page.mdx similarity index 100% rename from app/en/mcp-servers/payments/zoho-books-api/page.mdx rename to app/en/integrations/payments/zoho-books-api/page.mdx diff --git a/app/en/mcp-servers/productivity/_meta.tsx b/app/en/integrations/productivity/_meta.tsx similarity index 100% rename from app/en/mcp-servers/productivity/_meta.tsx rename to app/en/integrations/productivity/_meta.tsx diff --git a/app/en/mcp-servers/productivity/airtable-api/page.mdx b/app/en/integrations/productivity/airtable-api/page.mdx similarity index 100% rename from app/en/mcp-servers/productivity/airtable-api/page.mdx rename to app/en/integrations/productivity/airtable-api/page.mdx diff --git a/app/en/mcp-servers/productivity/asana-api/page.mdx b/app/en/integrations/productivity/asana-api/page.mdx similarity index 100% rename from app/en/mcp-servers/productivity/asana-api/page.mdx rename to app/en/integrations/productivity/asana-api/page.mdx diff --git a/app/en/mcp-servers/productivity/asana/_meta.tsx b/app/en/integrations/productivity/asana/_meta.tsx similarity index 100% rename from app/en/mcp-servers/productivity/asana/_meta.tsx rename to app/en/integrations/productivity/asana/_meta.tsx diff --git a/app/en/mcp-servers/productivity/asana/page.mdx b/app/en/integrations/productivity/asana/page.mdx similarity index 100% rename from app/en/mcp-servers/productivity/asana/page.mdx rename to app/en/integrations/productivity/asana/page.mdx diff --git a/app/en/mcp-servers/productivity/asana/reference/page.mdx b/app/en/integrations/productivity/asana/reference/page.mdx similarity index 100% rename from app/en/mcp-servers/productivity/asana/reference/page.mdx rename to app/en/integrations/productivity/asana/reference/page.mdx diff --git a/app/en/mcp-servers/productivity/ashby-api/page.mdx b/app/en/integrations/productivity/ashby-api/page.mdx similarity index 100% rename from app/en/mcp-servers/productivity/ashby-api/page.mdx rename to app/en/integrations/productivity/ashby-api/page.mdx diff --git a/app/en/mcp-servers/productivity/box-api/page.mdx b/app/en/integrations/productivity/box-api/page.mdx similarity index 100% rename from app/en/mcp-servers/productivity/box-api/page.mdx rename to app/en/integrations/productivity/box-api/page.mdx diff --git a/app/en/mcp-servers/productivity/calendly-api/page.mdx b/app/en/integrations/productivity/calendly-api/page.mdx similarity index 100% rename from app/en/mcp-servers/productivity/calendly-api/page.mdx rename to app/en/integrations/productivity/calendly-api/page.mdx diff --git a/app/en/mcp-servers/productivity/clickup-api/page.mdx b/app/en/integrations/productivity/clickup-api/page.mdx similarity index 100% rename from app/en/mcp-servers/productivity/clickup-api/page.mdx rename to app/en/integrations/productivity/clickup-api/page.mdx diff --git a/app/en/mcp-servers/productivity/clickup/_meta.tsx b/app/en/integrations/productivity/clickup/_meta.tsx similarity index 100% rename from app/en/mcp-servers/productivity/clickup/_meta.tsx rename to app/en/integrations/productivity/clickup/_meta.tsx diff --git a/app/en/mcp-servers/productivity/clickup/page.mdx b/app/en/integrations/productivity/clickup/page.mdx similarity index 100% rename from app/en/mcp-servers/productivity/clickup/page.mdx rename to app/en/integrations/productivity/clickup/page.mdx diff --git a/app/en/mcp-servers/productivity/clickup/reference/page.mdx b/app/en/integrations/productivity/clickup/reference/page.mdx similarity index 100% rename from app/en/mcp-servers/productivity/clickup/reference/page.mdx rename to app/en/integrations/productivity/clickup/reference/page.mdx diff --git a/app/en/mcp-servers/productivity/closeio/page.mdx b/app/en/integrations/productivity/closeio/page.mdx similarity index 100% rename from app/en/mcp-servers/productivity/closeio/page.mdx rename to app/en/integrations/productivity/closeio/page.mdx diff --git a/app/en/mcp-servers/productivity/confluence/page.mdx b/app/en/integrations/productivity/confluence/page.mdx similarity index 100% rename from app/en/mcp-servers/productivity/confluence/page.mdx rename to app/en/integrations/productivity/confluence/page.mdx diff --git a/app/en/mcp-servers/productivity/dropbox/_meta.tsx b/app/en/integrations/productivity/dropbox/_meta.tsx similarity index 100% rename from app/en/mcp-servers/productivity/dropbox/_meta.tsx rename to app/en/integrations/productivity/dropbox/_meta.tsx diff --git a/app/en/mcp-servers/productivity/dropbox/page.mdx b/app/en/integrations/productivity/dropbox/page.mdx similarity index 100% rename from app/en/mcp-servers/productivity/dropbox/page.mdx rename to app/en/integrations/productivity/dropbox/page.mdx diff --git a/app/en/mcp-servers/productivity/dropbox/reference/page.mdx b/app/en/integrations/productivity/dropbox/reference/page.mdx similarity index 100% rename from app/en/mcp-servers/productivity/dropbox/reference/page.mdx rename to app/en/integrations/productivity/dropbox/reference/page.mdx diff --git a/app/en/mcp-servers/productivity/figma-api/page.mdx b/app/en/integrations/productivity/figma-api/page.mdx similarity index 100% rename from app/en/mcp-servers/productivity/figma-api/page.mdx rename to app/en/integrations/productivity/figma-api/page.mdx diff --git a/app/en/mcp-servers/productivity/gmail/_meta.tsx b/app/en/integrations/productivity/gmail/_meta.tsx similarity index 100% rename from app/en/mcp-servers/productivity/gmail/_meta.tsx rename to app/en/integrations/productivity/gmail/_meta.tsx diff --git a/app/en/mcp-servers/productivity/gmail/page.mdx b/app/en/integrations/productivity/gmail/page.mdx similarity index 100% rename from app/en/mcp-servers/productivity/gmail/page.mdx rename to app/en/integrations/productivity/gmail/page.mdx diff --git a/app/en/mcp-servers/productivity/gmail/reference/page.mdx b/app/en/integrations/productivity/gmail/reference/page.mdx similarity index 100% rename from app/en/mcp-servers/productivity/gmail/reference/page.mdx rename to app/en/integrations/productivity/gmail/reference/page.mdx diff --git a/app/en/mcp-servers/productivity/google-calendar/_meta.tsx b/app/en/integrations/productivity/google-calendar/_meta.tsx similarity index 100% rename from app/en/mcp-servers/productivity/google-calendar/_meta.tsx rename to app/en/integrations/productivity/google-calendar/_meta.tsx diff --git a/app/en/mcp-servers/productivity/google-calendar/page.mdx b/app/en/integrations/productivity/google-calendar/page.mdx similarity index 100% rename from app/en/mcp-servers/productivity/google-calendar/page.mdx rename to app/en/integrations/productivity/google-calendar/page.mdx diff --git a/app/en/mcp-servers/productivity/google-calendar/reference/page.mdx b/app/en/integrations/productivity/google-calendar/reference/page.mdx similarity index 100% rename from app/en/mcp-servers/productivity/google-calendar/reference/page.mdx rename to app/en/integrations/productivity/google-calendar/reference/page.mdx diff --git a/app/en/mcp-servers/productivity/google-contacts/page.mdx b/app/en/integrations/productivity/google-contacts/page.mdx similarity index 100% rename from app/en/mcp-servers/productivity/google-contacts/page.mdx rename to app/en/integrations/productivity/google-contacts/page.mdx diff --git a/app/en/mcp-servers/productivity/google-docs/_meta.tsx b/app/en/integrations/productivity/google-docs/_meta.tsx similarity index 100% rename from app/en/mcp-servers/productivity/google-docs/_meta.tsx rename to app/en/integrations/productivity/google-docs/_meta.tsx diff --git a/app/en/mcp-servers/productivity/google-docs/page.mdx b/app/en/integrations/productivity/google-docs/page.mdx similarity index 100% rename from app/en/mcp-servers/productivity/google-docs/page.mdx rename to app/en/integrations/productivity/google-docs/page.mdx diff --git a/app/en/mcp-servers/productivity/google-docs/reference/page.mdx b/app/en/integrations/productivity/google-docs/reference/page.mdx similarity index 100% rename from app/en/mcp-servers/productivity/google-docs/reference/page.mdx rename to app/en/integrations/productivity/google-docs/reference/page.mdx diff --git a/app/en/mcp-servers/productivity/google-drive/_meta.tsx b/app/en/integrations/productivity/google-drive/_meta.tsx similarity index 100% rename from app/en/mcp-servers/productivity/google-drive/_meta.tsx rename to app/en/integrations/productivity/google-drive/_meta.tsx diff --git a/app/en/mcp-servers/productivity/google-drive/page.mdx b/app/en/integrations/productivity/google-drive/page.mdx similarity index 100% rename from app/en/mcp-servers/productivity/google-drive/page.mdx rename to app/en/integrations/productivity/google-drive/page.mdx diff --git a/app/en/mcp-servers/productivity/google-drive/reference/page.mdx b/app/en/integrations/productivity/google-drive/reference/page.mdx similarity index 100% rename from app/en/mcp-servers/productivity/google-drive/reference/page.mdx rename to app/en/integrations/productivity/google-drive/reference/page.mdx diff --git a/app/en/mcp-servers/productivity/google-sheets/_meta.tsx b/app/en/integrations/productivity/google-sheets/_meta.tsx similarity index 100% rename from app/en/mcp-servers/productivity/google-sheets/_meta.tsx rename to app/en/integrations/productivity/google-sheets/_meta.tsx diff --git a/app/en/mcp-servers/productivity/google-sheets/page.mdx b/app/en/integrations/productivity/google-sheets/page.mdx similarity index 100% rename from app/en/mcp-servers/productivity/google-sheets/page.mdx rename to app/en/integrations/productivity/google-sheets/page.mdx diff --git a/app/en/mcp-servers/productivity/google-sheets/reference/page.mdx b/app/en/integrations/productivity/google-sheets/reference/page.mdx similarity index 100% rename from app/en/mcp-servers/productivity/google-sheets/reference/page.mdx rename to app/en/integrations/productivity/google-sheets/reference/page.mdx diff --git a/app/en/mcp-servers/productivity/google-slides/page.mdx b/app/en/integrations/productivity/google-slides/page.mdx similarity index 100% rename from app/en/mcp-servers/productivity/google-slides/page.mdx rename to app/en/integrations/productivity/google-slides/page.mdx diff --git a/app/en/mcp-servers/productivity/jira/_meta.tsx b/app/en/integrations/productivity/jira/_meta.tsx similarity index 100% rename from app/en/mcp-servers/productivity/jira/_meta.tsx rename to app/en/integrations/productivity/jira/_meta.tsx diff --git a/app/en/mcp-servers/productivity/jira/environment-variables/page.mdx b/app/en/integrations/productivity/jira/environment-variables/page.mdx similarity index 100% rename from app/en/mcp-servers/productivity/jira/environment-variables/page.mdx rename to app/en/integrations/productivity/jira/environment-variables/page.mdx diff --git a/app/en/mcp-servers/productivity/jira/page.mdx b/app/en/integrations/productivity/jira/page.mdx similarity index 100% rename from app/en/mcp-servers/productivity/jira/page.mdx rename to app/en/integrations/productivity/jira/page.mdx diff --git a/app/en/mcp-servers/productivity/jira/reference/page.mdx b/app/en/integrations/productivity/jira/reference/page.mdx similarity index 100% rename from app/en/mcp-servers/productivity/jira/reference/page.mdx rename to app/en/integrations/productivity/jira/reference/page.mdx diff --git a/app/en/mcp-servers/productivity/linear/page.mdx b/app/en/integrations/productivity/linear/page.mdx similarity index 100% rename from app/en/mcp-servers/productivity/linear/page.mdx rename to app/en/integrations/productivity/linear/page.mdx diff --git a/app/en/mcp-servers/productivity/luma-api/page.mdx b/app/en/integrations/productivity/luma-api/page.mdx similarity index 100% rename from app/en/mcp-servers/productivity/luma-api/page.mdx rename to app/en/integrations/productivity/luma-api/page.mdx diff --git a/app/en/mcp-servers/productivity/mailchimp-marketing-api/page.mdx b/app/en/integrations/productivity/mailchimp-marketing-api/page.mdx similarity index 100% rename from app/en/mcp-servers/productivity/mailchimp-marketing-api/page.mdx rename to app/en/integrations/productivity/mailchimp-marketing-api/page.mdx diff --git a/app/en/mcp-servers/productivity/miro-api/page.mdx b/app/en/integrations/productivity/miro-api/page.mdx similarity index 100% rename from app/en/mcp-servers/productivity/miro-api/page.mdx rename to app/en/integrations/productivity/miro-api/page.mdx diff --git a/app/en/mcp-servers/productivity/notion/page.mdx b/app/en/integrations/productivity/notion/page.mdx similarity index 100% rename from app/en/mcp-servers/productivity/notion/page.mdx rename to app/en/integrations/productivity/notion/page.mdx diff --git a/app/en/mcp-servers/productivity/obsidian/page.mdx b/app/en/integrations/productivity/obsidian/page.mdx similarity index 100% rename from app/en/mcp-servers/productivity/obsidian/page.mdx rename to app/en/integrations/productivity/obsidian/page.mdx diff --git a/app/en/mcp-servers/productivity/outlook-calendar/page.mdx b/app/en/integrations/productivity/outlook-calendar/page.mdx similarity index 100% rename from app/en/mcp-servers/productivity/outlook-calendar/page.mdx rename to app/en/integrations/productivity/outlook-calendar/page.mdx diff --git a/app/en/mcp-servers/productivity/outlook-mail/_meta.tsx b/app/en/integrations/productivity/outlook-mail/_meta.tsx similarity index 100% rename from app/en/mcp-servers/productivity/outlook-mail/_meta.tsx rename to app/en/integrations/productivity/outlook-mail/_meta.tsx diff --git a/app/en/mcp-servers/productivity/outlook-mail/page.mdx b/app/en/integrations/productivity/outlook-mail/page.mdx similarity index 100% rename from app/en/mcp-servers/productivity/outlook-mail/page.mdx rename to app/en/integrations/productivity/outlook-mail/page.mdx diff --git a/app/en/mcp-servers/productivity/outlook-mail/reference/page.mdx b/app/en/integrations/productivity/outlook-mail/reference/page.mdx similarity index 100% rename from app/en/mcp-servers/productivity/outlook-mail/reference/page.mdx rename to app/en/integrations/productivity/outlook-mail/reference/page.mdx diff --git a/app/en/mcp-servers/productivity/sharepoint/page.mdx b/app/en/integrations/productivity/sharepoint/page.mdx similarity index 100% rename from app/en/mcp-servers/productivity/sharepoint/page.mdx rename to app/en/integrations/productivity/sharepoint/page.mdx diff --git a/app/en/mcp-servers/productivity/squareup-api/page.mdx b/app/en/integrations/productivity/squareup-api/page.mdx similarity index 100% rename from app/en/mcp-servers/productivity/squareup-api/page.mdx rename to app/en/integrations/productivity/squareup-api/page.mdx diff --git a/app/en/mcp-servers/productivity/ticktick-api/page.mdx b/app/en/integrations/productivity/ticktick-api/page.mdx similarity index 100% rename from app/en/mcp-servers/productivity/ticktick-api/page.mdx rename to app/en/integrations/productivity/ticktick-api/page.mdx diff --git a/app/en/mcp-servers/productivity/trello-api/page.mdx b/app/en/integrations/productivity/trello-api/page.mdx similarity index 100% rename from app/en/mcp-servers/productivity/trello-api/page.mdx rename to app/en/integrations/productivity/trello-api/page.mdx diff --git a/app/en/mcp-servers/productivity/xero-api/page.mdx b/app/en/integrations/productivity/xero-api/page.mdx similarity index 100% rename from app/en/mcp-servers/productivity/xero-api/page.mdx rename to app/en/integrations/productivity/xero-api/page.mdx diff --git a/app/en/mcp-servers/sales/_meta.tsx b/app/en/integrations/sales/_meta.tsx similarity index 100% rename from app/en/mcp-servers/sales/_meta.tsx rename to app/en/integrations/sales/_meta.tsx diff --git a/app/en/mcp-servers/sales/hubspot-automation-api/page.mdx b/app/en/integrations/sales/hubspot-automation-api/page.mdx similarity index 100% rename from app/en/mcp-servers/sales/hubspot-automation-api/page.mdx rename to app/en/integrations/sales/hubspot-automation-api/page.mdx diff --git a/app/en/mcp-servers/sales/hubspot-cms-api/page.mdx b/app/en/integrations/sales/hubspot-cms-api/page.mdx similarity index 100% rename from app/en/mcp-servers/sales/hubspot-cms-api/page.mdx rename to app/en/integrations/sales/hubspot-cms-api/page.mdx diff --git a/app/en/mcp-servers/sales/hubspot-conversations-api/page.mdx b/app/en/integrations/sales/hubspot-conversations-api/page.mdx similarity index 100% rename from app/en/mcp-servers/sales/hubspot-conversations-api/page.mdx rename to app/en/integrations/sales/hubspot-conversations-api/page.mdx diff --git a/app/en/mcp-servers/sales/hubspot-crm-api/page.mdx b/app/en/integrations/sales/hubspot-crm-api/page.mdx similarity index 100% rename from app/en/mcp-servers/sales/hubspot-crm-api/page.mdx rename to app/en/integrations/sales/hubspot-crm-api/page.mdx diff --git a/app/en/mcp-servers/sales/hubspot-events-api/page.mdx b/app/en/integrations/sales/hubspot-events-api/page.mdx similarity index 100% rename from app/en/mcp-servers/sales/hubspot-events-api/page.mdx rename to app/en/integrations/sales/hubspot-events-api/page.mdx diff --git a/app/en/mcp-servers/sales/hubspot-marketing-api/page.mdx b/app/en/integrations/sales/hubspot-marketing-api/page.mdx similarity index 100% rename from app/en/mcp-servers/sales/hubspot-marketing-api/page.mdx rename to app/en/integrations/sales/hubspot-marketing-api/page.mdx diff --git a/app/en/mcp-servers/sales/hubspot-meetings-api/page.mdx b/app/en/integrations/sales/hubspot-meetings-api/page.mdx similarity index 100% rename from app/en/mcp-servers/sales/hubspot-meetings-api/page.mdx rename to app/en/integrations/sales/hubspot-meetings-api/page.mdx diff --git a/app/en/mcp-servers/sales/hubspot-users-api/page.mdx b/app/en/integrations/sales/hubspot-users-api/page.mdx similarity index 100% rename from app/en/mcp-servers/sales/hubspot-users-api/page.mdx rename to app/en/integrations/sales/hubspot-users-api/page.mdx diff --git a/app/en/mcp-servers/sales/hubspot/_meta.tsx b/app/en/integrations/sales/hubspot/_meta.tsx similarity index 100% rename from app/en/mcp-servers/sales/hubspot/_meta.tsx rename to app/en/integrations/sales/hubspot/_meta.tsx diff --git a/app/en/mcp-servers/sales/hubspot/page.mdx b/app/en/integrations/sales/hubspot/page.mdx similarity index 100% rename from app/en/mcp-servers/sales/hubspot/page.mdx rename to app/en/integrations/sales/hubspot/page.mdx diff --git a/app/en/mcp-servers/sales/hubspot/reference/page.mdx b/app/en/integrations/sales/hubspot/reference/page.mdx similarity index 100% rename from app/en/mcp-servers/sales/hubspot/reference/page.mdx rename to app/en/integrations/sales/hubspot/reference/page.mdx diff --git a/app/en/mcp-servers/sales/salesforce/page.mdx b/app/en/integrations/sales/salesforce/page.mdx similarity index 100% rename from app/en/mcp-servers/sales/salesforce/page.mdx rename to app/en/integrations/sales/salesforce/page.mdx diff --git a/app/en/mcp-servers/search/_meta.tsx b/app/en/integrations/search/_meta.tsx similarity index 100% rename from app/en/mcp-servers/search/_meta.tsx rename to app/en/integrations/search/_meta.tsx diff --git a/app/en/mcp-servers/search/exa-api/page.mdx b/app/en/integrations/search/exa-api/page.mdx similarity index 100% rename from app/en/mcp-servers/search/exa-api/page.mdx rename to app/en/integrations/search/exa-api/page.mdx diff --git a/app/en/mcp-servers/search/google_finance/page.mdx b/app/en/integrations/search/google_finance/page.mdx similarity index 100% rename from app/en/mcp-servers/search/google_finance/page.mdx rename to app/en/integrations/search/google_finance/page.mdx diff --git a/app/en/mcp-servers/search/google_flights/page.mdx b/app/en/integrations/search/google_flights/page.mdx similarity index 100% rename from app/en/mcp-servers/search/google_flights/page.mdx rename to app/en/integrations/search/google_flights/page.mdx diff --git a/app/en/mcp-servers/search/google_hotels/page.mdx b/app/en/integrations/search/google_hotels/page.mdx similarity index 100% rename from app/en/mcp-servers/search/google_hotels/page.mdx rename to app/en/integrations/search/google_hotels/page.mdx diff --git a/app/en/mcp-servers/search/google_jobs/page.mdx b/app/en/integrations/search/google_jobs/page.mdx similarity index 100% rename from app/en/mcp-servers/search/google_jobs/page.mdx rename to app/en/integrations/search/google_jobs/page.mdx diff --git a/app/en/mcp-servers/search/google_maps/page.mdx b/app/en/integrations/search/google_maps/page.mdx similarity index 100% rename from app/en/mcp-servers/search/google_maps/page.mdx rename to app/en/integrations/search/google_maps/page.mdx diff --git a/app/en/mcp-servers/search/google_news/page.mdx b/app/en/integrations/search/google_news/page.mdx similarity index 100% rename from app/en/mcp-servers/search/google_news/page.mdx rename to app/en/integrations/search/google_news/page.mdx diff --git a/app/en/mcp-servers/search/google_search/page.mdx b/app/en/integrations/search/google_search/page.mdx similarity index 100% rename from app/en/mcp-servers/search/google_search/page.mdx rename to app/en/integrations/search/google_search/page.mdx diff --git a/app/en/mcp-servers/search/google_shopping/page.mdx b/app/en/integrations/search/google_shopping/page.mdx similarity index 100% rename from app/en/mcp-servers/search/google_shopping/page.mdx rename to app/en/integrations/search/google_shopping/page.mdx diff --git a/app/en/mcp-servers/search/walmart/page.mdx b/app/en/integrations/search/walmart/page.mdx similarity index 100% rename from app/en/mcp-servers/search/walmart/page.mdx rename to app/en/integrations/search/walmart/page.mdx diff --git a/app/en/mcp-servers/search/youtube/page.mdx b/app/en/integrations/search/youtube/page.mdx similarity index 100% rename from app/en/mcp-servers/search/youtube/page.mdx rename to app/en/integrations/search/youtube/page.mdx diff --git a/app/en/mcp-servers/social-communication/_meta.tsx b/app/en/integrations/social-communication/_meta.tsx similarity index 100% rename from app/en/mcp-servers/social-communication/_meta.tsx rename to app/en/integrations/social-communication/_meta.tsx diff --git a/app/en/mcp-servers/social-communication/discord/page.mdx b/app/en/integrations/social-communication/discord/page.mdx similarity index 100% rename from app/en/mcp-servers/social-communication/discord/page.mdx rename to app/en/integrations/social-communication/discord/page.mdx diff --git a/app/en/mcp-servers/social-communication/linkedin/page.mdx b/app/en/integrations/social-communication/linkedin/page.mdx similarity index 100% rename from app/en/mcp-servers/social-communication/linkedin/page.mdx rename to app/en/integrations/social-communication/linkedin/page.mdx diff --git a/app/en/mcp-servers/social-communication/microsoft-teams/_meta.tsx b/app/en/integrations/social-communication/microsoft-teams/_meta.tsx similarity index 100% rename from app/en/mcp-servers/social-communication/microsoft-teams/_meta.tsx rename to app/en/integrations/social-communication/microsoft-teams/_meta.tsx diff --git a/app/en/mcp-servers/social-communication/microsoft-teams/page.mdx b/app/en/integrations/social-communication/microsoft-teams/page.mdx similarity index 100% rename from app/en/mcp-servers/social-communication/microsoft-teams/page.mdx rename to app/en/integrations/social-communication/microsoft-teams/page.mdx diff --git a/app/en/mcp-servers/social-communication/microsoft-teams/reference/page.mdx b/app/en/integrations/social-communication/microsoft-teams/reference/page.mdx similarity index 100% rename from app/en/mcp-servers/social-communication/microsoft-teams/reference/page.mdx rename to app/en/integrations/social-communication/microsoft-teams/reference/page.mdx diff --git a/app/en/mcp-servers/social-communication/reddit/page.mdx b/app/en/integrations/social-communication/reddit/page.mdx similarity index 100% rename from app/en/mcp-servers/social-communication/reddit/page.mdx rename to app/en/integrations/social-communication/reddit/page.mdx diff --git a/app/en/mcp-servers/social-communication/slack-api/page.mdx b/app/en/integrations/social-communication/slack-api/page.mdx similarity index 100% rename from app/en/mcp-servers/social-communication/slack-api/page.mdx rename to app/en/integrations/social-communication/slack-api/page.mdx diff --git a/app/en/mcp-servers/social-communication/slack/_meta.tsx b/app/en/integrations/social-communication/slack/_meta.tsx similarity index 100% rename from app/en/mcp-servers/social-communication/slack/_meta.tsx rename to app/en/integrations/social-communication/slack/_meta.tsx diff --git a/app/en/mcp-servers/social-communication/slack/environment-variables/page.mdx b/app/en/integrations/social-communication/slack/environment-variables/page.mdx similarity index 100% rename from app/en/mcp-servers/social-communication/slack/environment-variables/page.mdx rename to app/en/integrations/social-communication/slack/environment-variables/page.mdx diff --git a/app/en/mcp-servers/social-communication/slack/install/page.mdx b/app/en/integrations/social-communication/slack/install/page.mdx similarity index 100% rename from app/en/mcp-servers/social-communication/slack/install/page.mdx rename to app/en/integrations/social-communication/slack/install/page.mdx diff --git a/app/en/mcp-servers/social-communication/slack/install/slack-auth-link.tsx b/app/en/integrations/social-communication/slack/install/slack-auth-link.tsx similarity index 100% rename from app/en/mcp-servers/social-communication/slack/install/slack-auth-link.tsx rename to app/en/integrations/social-communication/slack/install/slack-auth-link.tsx diff --git a/app/en/mcp-servers/social-communication/slack/page.mdx b/app/en/integrations/social-communication/slack/page.mdx similarity index 100% rename from app/en/mcp-servers/social-communication/slack/page.mdx rename to app/en/integrations/social-communication/slack/page.mdx diff --git a/app/en/mcp-servers/social-communication/slack/reference/page.mdx b/app/en/integrations/social-communication/slack/reference/page.mdx similarity index 100% rename from app/en/mcp-servers/social-communication/slack/reference/page.mdx rename to app/en/integrations/social-communication/slack/reference/page.mdx diff --git a/app/en/mcp-servers/social-communication/slack_api.mdx b/app/en/integrations/social-communication/slack_api.mdx similarity index 100% rename from app/en/mcp-servers/social-communication/slack_api.mdx rename to app/en/integrations/social-communication/slack_api.mdx diff --git a/app/en/mcp-servers/social-communication/teams/_meta.tsx b/app/en/integrations/social-communication/teams/_meta.tsx similarity index 100% rename from app/en/mcp-servers/social-communication/teams/_meta.tsx rename to app/en/integrations/social-communication/teams/_meta.tsx diff --git a/app/en/mcp-servers/social-communication/teams/reference/page.mdx b/app/en/integrations/social-communication/teams/reference/page.mdx similarity index 100% rename from app/en/mcp-servers/social-communication/teams/reference/page.mdx rename to app/en/integrations/social-communication/teams/reference/page.mdx diff --git a/app/en/mcp-servers/social-communication/twilio/page.mdx b/app/en/integrations/social-communication/twilio/page.mdx similarity index 100% rename from app/en/mcp-servers/social-communication/twilio/page.mdx rename to app/en/integrations/social-communication/twilio/page.mdx diff --git a/app/en/mcp-servers/social-communication/twilio/reference/page.mdx b/app/en/integrations/social-communication/twilio/reference/page.mdx similarity index 100% rename from app/en/mcp-servers/social-communication/twilio/reference/page.mdx rename to app/en/integrations/social-communication/twilio/reference/page.mdx diff --git a/app/en/mcp-servers/social-communication/x/page.mdx b/app/en/integrations/social-communication/x/page.mdx similarity index 100% rename from app/en/mcp-servers/social-communication/x/page.mdx rename to app/en/integrations/social-communication/x/page.mdx diff --git a/app/en/mcp-servers/social-communication/zoom/_meta.tsx b/app/en/integrations/social-communication/zoom/_meta.tsx similarity index 100% rename from app/en/mcp-servers/social-communication/zoom/_meta.tsx rename to app/en/integrations/social-communication/zoom/_meta.tsx diff --git a/app/en/mcp-servers/social-communication/zoom/install/page.mdx b/app/en/integrations/social-communication/zoom/install/page.mdx similarity index 100% rename from app/en/mcp-servers/social-communication/zoom/install/page.mdx rename to app/en/integrations/social-communication/zoom/install/page.mdx diff --git a/app/en/mcp-servers/social-communication/zoom/install/zoom-auth-link.tsx b/app/en/integrations/social-communication/zoom/install/zoom-auth-link.tsx similarity index 100% rename from app/en/mcp-servers/social-communication/zoom/install/zoom-auth-link.tsx rename to app/en/integrations/social-communication/zoom/install/zoom-auth-link.tsx diff --git a/app/en/mcp-servers/social-communication/zoom/page.mdx b/app/en/integrations/social-communication/zoom/page.mdx similarity index 100% rename from app/en/mcp-servers/social-communication/zoom/page.mdx rename to app/en/integrations/social-communication/zoom/page.mdx diff --git a/app/en/home/landing-page.tsx b/app/en/landing-page.tsx similarity index 100% rename from app/en/home/landing-page.tsx rename to app/en/landing-page.tsx diff --git a/app/en/home/build-tools/server-level-vs-tool-level-auth/page.mdx b/app/en/learn/server-level-vs-tool-level-auth/page.mdx similarity index 100% rename from app/en/home/build-tools/server-level-vs-tool-level-auth/page.mdx rename to app/en/learn/server-level-vs-tool-level-auth/page.mdx diff --git a/app/en/home/page.mdx b/app/en/page.mdx similarity index 100% rename from app/en/home/page.mdx rename to app/en/page.mdx diff --git a/app/en/home/arcade-cli/page.mdx b/app/en/references/arcade-cli/page.mdx similarity index 100% rename from app/en/home/arcade-cli/page.mdx rename to app/en/references/arcade-cli/page.mdx diff --git a/app/en/home/auth-providers/_meta.tsx b/app/en/references/auth-providers/_meta.tsx similarity index 100% rename from app/en/home/auth-providers/_meta.tsx rename to app/en/references/auth-providers/_meta.tsx diff --git a/app/en/home/auth-providers/airtable/page.mdx b/app/en/references/auth-providers/airtable/page.mdx similarity index 100% rename from app/en/home/auth-providers/airtable/page.mdx rename to app/en/references/auth-providers/airtable/page.mdx diff --git a/app/en/home/auth-providers/asana/page.mdx b/app/en/references/auth-providers/asana/page.mdx similarity index 100% rename from app/en/home/auth-providers/asana/page.mdx rename to app/en/references/auth-providers/asana/page.mdx diff --git a/app/en/home/auth-providers/atlassian/page.mdx b/app/en/references/auth-providers/atlassian/page.mdx similarity index 100% rename from app/en/home/auth-providers/atlassian/page.mdx rename to app/en/references/auth-providers/atlassian/page.mdx diff --git a/app/en/home/auth-providers/calendly/page.mdx b/app/en/references/auth-providers/calendly/page.mdx similarity index 100% rename from app/en/home/auth-providers/calendly/page.mdx rename to app/en/references/auth-providers/calendly/page.mdx diff --git a/app/en/home/auth-providers/clickup/page.mdx b/app/en/references/auth-providers/clickup/page.mdx similarity index 100% rename from app/en/home/auth-providers/clickup/page.mdx rename to app/en/references/auth-providers/clickup/page.mdx diff --git a/app/en/home/auth-providers/discord/page.mdx b/app/en/references/auth-providers/discord/page.mdx similarity index 100% rename from app/en/home/auth-providers/discord/page.mdx rename to app/en/references/auth-providers/discord/page.mdx diff --git a/app/en/home/auth-providers/dropbox/page.mdx b/app/en/references/auth-providers/dropbox/page.mdx similarity index 100% rename from app/en/home/auth-providers/dropbox/page.mdx rename to app/en/references/auth-providers/dropbox/page.mdx diff --git a/app/en/home/auth-providers/figma/page.mdx b/app/en/references/auth-providers/figma/page.mdx similarity index 100% rename from app/en/home/auth-providers/figma/page.mdx rename to app/en/references/auth-providers/figma/page.mdx diff --git a/app/en/home/auth-providers/github/page.mdx b/app/en/references/auth-providers/github/page.mdx similarity index 100% rename from app/en/home/auth-providers/github/page.mdx rename to app/en/references/auth-providers/github/page.mdx diff --git a/app/en/home/auth-providers/google/page.mdx b/app/en/references/auth-providers/google/page.mdx similarity index 100% rename from app/en/home/auth-providers/google/page.mdx rename to app/en/references/auth-providers/google/page.mdx diff --git a/app/en/home/auth-providers/hubspot/page.mdx b/app/en/references/auth-providers/hubspot/page.mdx similarity index 100% rename from app/en/home/auth-providers/hubspot/page.mdx rename to app/en/references/auth-providers/hubspot/page.mdx diff --git a/app/en/home/auth-providers/linear/page.mdx b/app/en/references/auth-providers/linear/page.mdx similarity index 100% rename from app/en/home/auth-providers/linear/page.mdx rename to app/en/references/auth-providers/linear/page.mdx diff --git a/app/en/home/auth-providers/linkedin/page.mdx b/app/en/references/auth-providers/linkedin/page.mdx similarity index 100% rename from app/en/home/auth-providers/linkedin/page.mdx rename to app/en/references/auth-providers/linkedin/page.mdx diff --git a/app/en/home/auth-providers/mailchimp/page.mdx b/app/en/references/auth-providers/mailchimp/page.mdx similarity index 100% rename from app/en/home/auth-providers/mailchimp/page.mdx rename to app/en/references/auth-providers/mailchimp/page.mdx diff --git a/app/en/home/auth-providers/microsoft/page.mdx b/app/en/references/auth-providers/microsoft/page.mdx similarity index 100% rename from app/en/home/auth-providers/microsoft/page.mdx rename to app/en/references/auth-providers/microsoft/page.mdx diff --git a/app/en/home/auth-providers/miro/page.mdx b/app/en/references/auth-providers/miro/page.mdx similarity index 100% rename from app/en/home/auth-providers/miro/page.mdx rename to app/en/references/auth-providers/miro/page.mdx diff --git a/app/en/home/auth-providers/notion/page.mdx b/app/en/references/auth-providers/notion/page.mdx similarity index 100% rename from app/en/home/auth-providers/notion/page.mdx rename to app/en/references/auth-providers/notion/page.mdx diff --git a/app/en/home/auth-providers/oauth2/page.mdx b/app/en/references/auth-providers/oauth2/page.mdx similarity index 100% rename from app/en/home/auth-providers/oauth2/page.mdx rename to app/en/references/auth-providers/oauth2/page.mdx diff --git a/app/en/home/auth-providers/page.mdx b/app/en/references/auth-providers/page.mdx similarity index 100% rename from app/en/home/auth-providers/page.mdx rename to app/en/references/auth-providers/page.mdx diff --git a/app/en/home/auth-providers/pagerduty/page.mdx b/app/en/references/auth-providers/pagerduty/page.mdx similarity index 100% rename from app/en/home/auth-providers/pagerduty/page.mdx rename to app/en/references/auth-providers/pagerduty/page.mdx diff --git a/app/en/home/auth-providers/reddit/page.mdx b/app/en/references/auth-providers/reddit/page.mdx similarity index 100% rename from app/en/home/auth-providers/reddit/page.mdx rename to app/en/references/auth-providers/reddit/page.mdx diff --git a/app/en/home/auth-providers/salesforce/page.mdx b/app/en/references/auth-providers/salesforce/page.mdx similarity index 100% rename from app/en/home/auth-providers/salesforce/page.mdx rename to app/en/references/auth-providers/salesforce/page.mdx diff --git a/app/en/home/auth-providers/slack/page.mdx b/app/en/references/auth-providers/slack/page.mdx similarity index 100% rename from app/en/home/auth-providers/slack/page.mdx rename to app/en/references/auth-providers/slack/page.mdx diff --git a/app/en/home/auth-providers/spotify/page.mdx b/app/en/references/auth-providers/spotify/page.mdx similarity index 100% rename from app/en/home/auth-providers/spotify/page.mdx rename to app/en/references/auth-providers/spotify/page.mdx diff --git a/app/en/home/auth-providers/square/page.mdx b/app/en/references/auth-providers/square/page.mdx similarity index 100% rename from app/en/home/auth-providers/square/page.mdx rename to app/en/references/auth-providers/square/page.mdx diff --git a/app/en/home/auth-providers/ticktick/page.mdx b/app/en/references/auth-providers/ticktick/page.mdx similarity index 100% rename from app/en/home/auth-providers/ticktick/page.mdx rename to app/en/references/auth-providers/ticktick/page.mdx diff --git a/app/en/home/auth-providers/twitch/page.mdx b/app/en/references/auth-providers/twitch/page.mdx similarity index 100% rename from app/en/home/auth-providers/twitch/page.mdx rename to app/en/references/auth-providers/twitch/page.mdx diff --git a/app/en/home/auth-providers/x/page.mdx b/app/en/references/auth-providers/x/page.mdx similarity index 100% rename from app/en/home/auth-providers/x/page.mdx rename to app/en/references/auth-providers/x/page.mdx diff --git a/app/en/home/auth-providers/zendesk/page.mdx b/app/en/references/auth-providers/zendesk/page.mdx similarity index 100% rename from app/en/home/auth-providers/zendesk/page.mdx rename to app/en/references/auth-providers/zendesk/page.mdx diff --git a/app/en/home/auth-providers/zoho/page.mdx b/app/en/references/auth-providers/zoho/page.mdx similarity index 100% rename from app/en/home/auth-providers/zoho/page.mdx rename to app/en/references/auth-providers/zoho/page.mdx diff --git a/app/en/home/auth-providers/zoom/page.mdx b/app/en/references/auth-providers/zoom/page.mdx similarity index 100% rename from app/en/home/auth-providers/zoom/page.mdx rename to app/en/references/auth-providers/zoom/page.mdx diff --git a/app/en/home/changelog/page.mdx b/app/en/resources/changelog/page.mdx similarity index 100% rename from app/en/home/changelog/page.mdx rename to app/en/resources/changelog/page.mdx diff --git a/app/en/home/contact-us/contact-cards.tsx b/app/en/resources/contact-us/contact-cards.tsx similarity index 100% rename from app/en/home/contact-us/contact-cards.tsx rename to app/en/resources/contact-us/contact-cards.tsx diff --git a/app/en/home/contact-us/page.mdx b/app/en/resources/contact-us/page.mdx similarity index 100% rename from app/en/home/contact-us/page.mdx rename to app/en/resources/contact-us/page.mdx diff --git a/app/en/home/examples/page.mdx b/app/en/resources/examples/page.mdx similarity index 100% rename from app/en/home/examples/page.mdx rename to app/en/resources/examples/page.mdx diff --git a/app/en/home/faq/page.mdx b/app/en/resources/faq/page.mdx similarity index 100% rename from app/en/home/faq/page.mdx rename to app/en/resources/faq/page.mdx diff --git a/app/en/home/glossary/page.mdx b/app/en/resources/glossary/page.mdx similarity index 100% rename from app/en/home/glossary/page.mdx rename to app/en/resources/glossary/page.mdx diff --git a/app/en/resources/tools/page.mdx b/app/en/resources/tools/page.mdx new file mode 100644 index 000000000..db1f4ea69 --- /dev/null +++ b/app/en/resources/tools/page.mdx @@ -0,0 +1,35 @@ +# Tools + +Arcade provides a comprehensive ecosystem for AI tools that enable your agents to take real-world actions. Whether you need pre-built integrations or want to create custom functionality, Arcade has you covered. + +## Explore Our Tool Catalog + +Discover hundreds of ready-to-use tools for popular services like Gmail, Slack, GitHub, and more. Our catalog contains production-ready MCP servers that handle authentication, permissions, and API integrations seamlessly. + +[Browse Tool Catalog →](/mcp-servers) + +## Create Your Own Tools + +Build custom tools tailored to your specific needs using our powerful development framework. Create MCP servers, define tool schemas, and deploy them to production with ease. + +[Learn to Build Tools →](/home/creating-tools/tool-basics/build-mcp-server) + +## Contribute to the Catalog + +Share your tools with the Arcade community and help expand our ecosystem. Submit your MCP servers to make them available to developers worldwide. + +[Add Your Tools to the Catalog →](/home/creating-tools/new-functionality/custom-toolkit) + +## Why Choose Arcade Tools? + +- **Authentication Built-in**: OAuth flows and user permissions handled automatically +- **Production Ready**: Tested, documented, and maintained by our team +- **Universal Compatibility**: Works with any LLM or agent framework via MCP +- **Scalable Architecture**: Tools run independently and scale based on demand + +## Getting Started + +1. **Explore**: Browse our catalog to find tools for your use case +2. **Integrate**: Use our client libraries to connect tools to your agents +3. **Customize**: Create your own tools when you need specific functionality +4. **Share**: Contribute back to the community by adding your tools to our catalog \ No newline at end of file diff --git a/examples/code/guides/agentauth/auth_with_google.js b/examples/code/guides/agentauth/auth_with_google.js deleted file mode 100644 index 47ea008e4..000000000 --- a/examples/code/guides/agentauth/auth_with_google.js +++ /dev/null @@ -1,49 +0,0 @@ -import { Arcade } from "@arcadeai/arcadejs"; -import { google } from "googleapis"; - -/* - * In this example, we will use Arcade to authenticate with Google and - * retrieve Gmail messages. - * - * Consider using the Arcade Gmail MCP Server, which simplifies the process for - * retrieving email messages even further! - * - * Below we are just showing how to use Arcade as an auth provider, if you need to directly get a token to use with Google. - */ - -const client = new Arcade(); // Automatically finds the `ARCADE_API_KEY` env variable - -// Your app's internal ID for the user (an email, UUID, etc). -// It's used internally to identify your user in Arcade, not to identify with the Gmail service. -// Use your Arcade account email for testing: -const user_id = "{arcade_user_id}"; - -// Start the authorization process -let auth_response = await client.auth.start(user_id, "google", { - scopes: ["https://www.googleapis.com/auth/gmail.readonly"], -}); - -if (auth_response.status !== "completed") { - console.log("Please complete the authorization challenge in your browser:"); - console.log(auth_response.url); -} - -// Wait for the authorization to complete -auth_response = await client.auth.waitForCompletion(auth_response); - -if (!auth_response.context.token) { - throw new Error("No token found in auth response"); -} - -// Set up Google API client with the token -const auth = new google.auth.OAuth2(); -auth.setCredentials({ access_token: auth_response.context.token }); -const gmail = google.gmail({ version: "v1", auth }); - -// List email messages -const response = await gmail.users.messages.list({ - userId: "me", -}); - -const email_messages = response.data.messages || []; -console.log(email_messages); diff --git a/examples/code/guides/agentauth/auth_with_google.py b/examples/code/guides/agentauth/auth_with_google.py deleted file mode 100644 index 0e28e0aec..000000000 --- a/examples/code/guides/agentauth/auth_with_google.py +++ /dev/null @@ -1,44 +0,0 @@ -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 - -""" -In this example, we will use Arcade to authenticate with Google and -retrieve Gmail messages. - -Consider using the Arcade Gmail MCP Server, which simplifies the process for -retrieving email messages even further! - -Below we are just showing how to use Arcade as an auth provider, if you need to directly get a token to use with Google. -""" - -# 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"], -) - -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") - -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) diff --git a/examples/code/guides/agentauth/use_token_with_google.py b/examples/code/guides/agentauth/use_token_with_google.py deleted file mode 100644 index 43dc8e822..000000000 --- a/examples/code/guides/agentauth/use_token_with_google.py +++ /dev/null @@ -1,11 +0,0 @@ -from google.oauth2.credentials import Credentials -from googleapiclient.discovery import build - -# Use the token from the authorization response -creds = Credentials(auth_response.context.token) -service = build("gmail", "v1", credentials=creds) - -# Now you can use the Google API -results = service.users().labels().list(userId="me").execute() -labels = results.get("labels", []) -print("Labels:", labels) diff --git a/examples/code/guides/toolsdk/retryable_tool_error_example.py b/examples/code/guides/toolsdk/retryable_tool_error_example.py deleted file mode 100644 index f01b48386..000000000 --- a/examples/code/guides/toolsdk/retryable_tool_error_example.py +++ /dev/null @@ -1,57 +0,0 @@ -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" diff --git a/examples/code/home/build-tools/create-a-tool/app.ts.fake b/examples/code/home/build-tools/create-a-tool/app.ts.fake deleted file mode 100644 index a10937099..000000000 --- a/examples/code/home/build-tools/create-a-tool/app.ts.fake +++ /dev/null @@ -1,107 +0,0 @@ -import Arcade from "@arcadeai/arcadejs"; -import OpenAI from 'openai'; - -const ARCADE_API_KEY = process.env.ARCADE_API_KEY; -const OPEN_AI_API_KEY = process.env.OPENAI_API_KEY; -const USER_ID = process.env.USER_ID; -const DB_DIALECT = "POSTGRES"; -const SCHEMA_NAME = "public"; - -const SYSTEM_PROMPT = ` -You are an expert SQL analyst. -For all questions, you will use only the information provided to you to answer the question, and no prior knowledge. -The SQL dialect is "${DB_DIALECT}". -ONLY RESPOND WITH A SQL STATEMENT AND NOTHING ELSE, ALL ON A SINGLE LINE. DO NOT EXPLAIN THE SQL STATEMENT. DO NOT FORMAT THE SQL STATEMENT IN MARKDOWN. DO NOT ADD ANYTHING ELSE TO THE RESPONSE. -`; - -const ArcadeClient = new Arcade({ - apiKey: ARCADE_API_KEY, -}); - -const OpenAIClient = new OpenAI({ - apiKey: OPEN_AI_API_KEY -}); - -const sqlTools = await ArcadeClient.tools.formatted.list({ - format: "openai", - toolkit: "sql", -}); - -console.log("⚙️ Found the following tools:"); -sqlTools.items.forEach((tool) => { - // @ts-ignore - console.log(`${tool.function.name}: ${tool.function.description}`); -}); - -const response = await ArcadeClient.tools.execute({ - tool_name: "Sql.DiscoverTables", - user_id: USER_ID, - input: { - schema_name: SCHEMA_NAME, - }, -}); -const tables = response.output?.value as string[] -console.log(`\r\n[🔍] Discovered the following tables: ${tables.join(', ')}`); - -const schemas: Record = {}; -for (const table of tables) { - const response = await ArcadeClient.tools.execute({ - tool_name: "Sql.GetTableSchema", - user_id: USER_ID, - input: { - schema_name: SCHEMA_NAME, - table_name: table, - }, - }); - const schema = response.output?.value as string; - schemas[table]= schema; - console.log(`[📜] Schema for ${table}: ${schema}`); -} - - -// /* --- EXAMPLES --- */ -await buildQueryAndExecute("Get the first 10 users's IDs and Names", schemas); -await buildQueryAndExecute("Who has sent the most chat messages?", schemas); - -// /* --- UTILITIES --- */ -async function buildQueryAndExecute(q: string, schemas: Record): Promise { - console.log(`\r\n[❓] Asking: ${q}`); - - const SQLQuestion = ` - What would be the best SQL query to answer the following question: - - --- - ${q} - --- - - The database schema is: - ${JSON.stringify(schemas, null, 2)} - `; - - const sql_statement = await OpenAIClient.chat.completions.create({ - model: "gpt-4o", - messages: [ - { - role: "system", - content: SYSTEM_PROMPT, - }, - { - role: "user", - content: SQLQuestion, - } - ]}) - - const sql = sql_statement.choices[0].message.content?.trim(); - console.log(`[📝] SQL statement: ${sql}`); - - const response = await ArcadeClient.tools.execute({ - tool_name: "Sql.ExecuteQuery", - user_id: USER_ID, - input: { - schema_name: SCHEMA_NAME, - query: sql, - }, - }); - - console.log(response.output?.value); -} diff --git a/examples/code/home/build-tools/create-a-tool/imports.py b/examples/code/home/build-tools/create-a-tool/imports.py deleted file mode 100644 index b0b5bc94f..000000000 --- a/examples/code/home/build-tools/create-a-tool/imports.py +++ /dev/null @@ -1,3 +0,0 @@ -from typing import Annotated -from sqlalchemy import create_engine,Engine,inspect,text -from arcade_tdk import tool, ToolContext \ No newline at end of file diff --git a/examples/code/home/build-tools/create-a-tool/schema.sql b/examples/code/home/build-tools/create-a-tool/schema.sql deleted file mode 100644 index e62baaeea..000000000 --- a/examples/code/home/build-tools/create-a-tool/schema.sql +++ /dev/null @@ -1,16 +0,0 @@ -CREATE TABLE "public"."users" ( - "id" serial PRIMARY KEY NOT NULL, - "name" varchar(256) NOT NULL, - "email" text NOT NULL UNIQUE, - "password_hash" text NOT NULL, - "created_at" timestamp DEFAULT now() NOT NULL, - "updated_at" timestamp DEFAULT now() NOT NULL -); - -CREATE TABLE "public"."messages" ( - "id" serial PRIMARY KEY NOT NULL, - "body" text NOT NULL, - "user_id" integer NOT NULL REFERENCES "public"."users" (id), - "created_at" timestamp DEFAULT now() NOT NULL, - "updated_at" timestamp DEFAULT now() NOT NULL -); \ No newline at end of file diff --git a/examples/code/home/build-tools/create-a-tool/sql-tool.py b/examples/code/home/build-tools/create-a-tool/sql-tool.py deleted file mode 100644 index d4cd2df04..000000000 --- a/examples/code/home/build-tools/create-a-tool/sql-tool.py +++ /dev/null @@ -1,48 +0,0 @@ -@tool(requires_secrets=["DATABASE_CONNECTION_STRING"]) -def discover_tables(context: ToolContext, schema_name: Annotated[str, "The database schema to discover tables in"] = "public") -> list[str]: - """Discover all the tables in the database""" - engine = _get_engine(context.get_secret("DATABASE_CONNECTION_STRING")) - tables = _get_tables(engine, schema_name) - return tables - - -@tool(requires_secrets=["DATABASE_CONNECTION_STRING"]) -def get_table_schema(context: ToolContext, schema_name: Annotated[str, "The database schema to get the table schema of"], table_name: Annotated[str, "The table to get the schema of"]) -> list[str]: - """Get the schema of a table""" - engine = _get_engine(context.get_secret("DATABASE_CONNECTION_STRING")) - return _get_table_schema(engine, schema_name, table_name) - - -@tool(requires_secrets=["DATABASE_CONNECTION_STRING"]) -def execute_query(context: ToolContext, query: Annotated[str, "The SQL query to execute"]) -> list[str]: - """Execute a query and return the results""" - engine = _get_engine(context.get_secret("DATABASE_CONNECTION_STRING")) - return _execute_query(engine, query) - - -def _get_engine(connection_string: str) -> Engine: - """Get a connection to the database. Note that we build the engine with an isolation level of READ UNCOMMITTED to prevent all writes.""" - return create_engine(connection_string, isolation_level='READ UNCOMMITTED') - - -def _get_tables(engine: Engine, schema_name: str) -> list[str]: - """Get all the tables in the database""" - inspector = inspect(engine) - schemas = inspector.get_schema_names() - tables = [] - for schema in schemas: - if schema == schema_name: - tables.extend(inspector.get_table_names(schema=schema)) - return tables - -def _get_table_schema(engine: Engine, schema_name: str, table_name: str) -> list[str]: - """Get the schema of a table""" - inspector = inspect(engine) - columns_table = inspector.get_columns(table_name, schema_name) - return [f"{column['name']}: {column['type'].python_type.__name__}" for column in columns_table] - -def _execute_query(engine: Engine, query: str) -> list[str]: - """Execute a query and return the results.""" - with engine.connect() as connection: - result = connection.execute(text(query)) - return [str(row) for row in result.fetchall()] diff --git a/examples/code/home/configuration/engine/config_template.1.0.yaml b/examples/code/home/configuration/engine/config_template.1.0.yaml deleted file mode 100644 index 4a365073f..000000000 --- a/examples/code/home/configuration/engine/config_template.1.0.yaml +++ /dev/null @@ -1,174 +0,0 @@ -# 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} diff --git a/examples/code/home/configuration/engine/engine.env b/examples/code/home/configuration/engine/engine.env deleted file mode 100644 index 483c4c9b5..000000000 --- a/examples/code/home/configuration/engine/engine.env +++ /dev/null @@ -1,77 +0,0 @@ -### 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= diff --git a/examples/code/home/configuration/engine/full_config.1.0.yaml b/examples/code/home/configuration/engine/full_config.1.0.yaml deleted file mode 100644 index 29399f4f5..000000000 --- a/examples/code/home/configuration/engine/full_config.1.0.yaml +++ /dev/null @@ -1,145 +0,0 @@ -# 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: false - host: localhost - port: 9099 - -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: - scope_delimiter: ' ' - pkce: # Optional - enabled: true - code_challenge_method: S256 - authorize_request: - endpoint: 'https://example.com/oauth/authorize' - params: - response_type: code - client_id: '{{client_id}}' - redirect_uri: '{{redirect_uri}}' - scope: '{{scopes}} {{existing_scopes}}' - token_request: - endpoint: 'https://example.com/oauth/token' - auth_method: client_secret_basic # Optional - params: - grant_type: authorization_code - client_id: '{{client_id}}' - client_secret: '{{client_secret}}' - redirect_uri: '{{redirect_uri}}' - response_content_type: application/json # Optional - response_map: # Optional - access_token: '$.access_token' - refresh_token: '$.refresh_token' - expires_in: '$.expires_in' - scope: '$.scope' - token_type: '$.token_type' - refresh_request: # Optional - endpoint: 'https://example.com/oauth/token' - auth_method: client_secret_basic # Optional - params: - grant_type: refresh_token - client_id: '{{client_id}}' - client_secret: '{{client_secret}}' - refresh_token: '{{refresh_token}}' - response_content_type: application/json # Optional - response_map: # Optional - access_token: '$.access_token' - refresh_token: '$.refresh_token' - expires_in: '$.expires_in' - scope: '$.scope' - token_type: '$.token_type' - token_introspection_request: # Optional - endpoint: 'https://example.com/oauth/introspect' - method: POST - params: - token: '{{access_token}}' - auth_method: client_secret_basic # Optional - request_content_type: application/x-www-form-urlencoded # Optional - response_content_type: application/json # Optional - response_map: # Optional - expires_in: '$.data.expires_in' - scope: '$.data.scope' - expiration_format: relative_seconds # or absolute_unix_timestamp - triggers: - on_token_grant: true - on_token_refresh: true - user_info_request: # Optional - endpoint: 'https://example.com/oauth/userinfo' - auth_method: bearer_access_token - response_content_type: application/json - response_map: - custom_property: '$.data.custom_property' - triggers: - on_token_grant: true - on_token_refresh: true - -cache: - api_key_ttl: 10s - redis: - addr: 'localhost:6379' - password: '' - db: 0 - -llm: - models: - - id: primary - openai: - api_key: ${env:OPENAI_API_KEY} - - id: secondary - anthropic: - api_key: ${env:ANTHROPIC_API_KEY} - api_version: '2023-06-01' - -security: - root_keys: - - id: key1 - default: true - value: ${env:ROOT_KEY_1} - - id: key2 - value: ${env:ROOT_KEY_2} - -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: prod - logging: - level: info - encoding: console - -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} diff --git a/examples/code/home/crewai/custom_auth_flow.py b/examples/code/home/crewai/custom_auth_flow.py deleted file mode 100644 index 18c8ba237..000000000 --- a/examples/code/home/crewai/custom_auth_flow.py +++ /dev/null @@ -1,82 +0,0 @@ -from typing import Any - -from crewai import Agent, Crew, Task -from crewai.llm import LLM -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) - - -manager = ArcadeToolManager(executor=tool_manager_callback) - -tools = manager.get_tools(tools=["Gmail.ListEmails"], toolkits=["Slack"]) - -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) diff --git a/examples/code/home/crewai/custom_auth_flow_callback_section.py b/examples/code/home/crewai/custom_auth_flow_callback_section.py deleted file mode 100644 index 550b9ca83..000000000 --- a/examples/code/home/crewai/custom_auth_flow_callback_section.py +++ /dev/null @@ -1,46 +0,0 @@ -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) diff --git a/examples/code/home/crewai/use_arcade_tools.py b/examples/code/home/crewai/use_arcade_tools.py deleted file mode 100644 index 7d143771e..000000000 --- a/examples/code/home/crewai/use_arcade_tools.py +++ /dev/null @@ -1,37 +0,0 @@ -from crewai import Agent, Crew, Task -from crewai.llm import LLM -from crewai_arcade import ArcadeToolManager - -manager = ArcadeToolManager(default_user_id="{arcade_user_id}") - -tools = manager.get_tools(tools=["Gmail.ListEmails"]) - - -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) diff --git a/examples/code/home/mcp/streamable-http/typescript-client.ts.fake b/examples/code/home/mcp/streamable-http/typescript-client.ts.fake deleted file mode 100644 index 813c7af3d..000000000 --- a/examples/code/home/mcp/streamable-http/typescript-client.ts.fake +++ /dev/null @@ -1,129 +0,0 @@ -import { Client } from "@modelcontextprotocol/sdk/client/index.js"; -import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js"; -import { - CallToolRequest, - CallToolResultSchema, - ListToolsRequest, - ListToolsResultSchema, -} from "@modelcontextprotocol/sdk/types.js"; - -// Replace with your actual API key and user ID -const arcadeApiKey = "your_arcade_api_key"; -const userId = "{arcade_user_id}"; -const arcadeURL = "https://api.arcade.dev/v1"; -const serverURL = `${arcadeURL}/mcp`; - -// Exchange API key for user-scoped token -const tokenExchangeResponse = await fetch(`${arcadeURL}/tokens/exchange`, { - method: "POST", - headers: { - Authorization: `Bearer ${arcadeApiKey}`, - "Content-Type": "application/json", - }, - body: JSON.stringify({ user_id: userId }), -}); - -if (!tokenExchangeResponse.ok) { - const errorText = await tokenExchangeResponse.text(); - console.error("Token exchange failed:", errorText); - process.exit(1); -} - -const tokenData = await tokenExchangeResponse.json(); -const authToken = tokenData.token.trim(); - -// Create an MCP client -const client = new Client({ name: "my-mcp-client", version: "1.0.0" }); -client.onerror = (error) => console.error("Client error:", error); - -// Connect to the Arcade MCP server -const transport = new StreamableHTTPClientTransport(new URL(serverURL), { - requestInit: { - headers: { - Authorization: `Bearer ${authToken}`, - }, - }, -}); - -await client.connect(transport); -console.log("Successfully connected to MCP server."); - -// Get available tools from the server -const toolsRequest: ListToolsRequest = { - method: "tools/list", -}; -const toolsResult = await client.request(toolsRequest, ListToolsResultSchema); - -// Display available tools -console.log(`Available tools (${toolsResult.tools.length} tools):`); -for (const tool of toolsResult.tools) { - const firstLineOfDescription = tool.description?.split("\n")[0]; - console.log(` - ${tool.name} (${firstLineOfDescription})`); -} - -try { - // Prepare the tool call request - const callToolRequest: CallToolRequest = { - method: "tools/call", - params: { - name: "Gmail_ListEmails", - arguments: { - n_emails: 5, - }, - }, - }; - console.log("Calling tool..."); - - // Call the tool - async function callTool() { - try { - const result = await client.request( - callToolRequest, - CallToolResultSchema, - ); - - console.log("Tool result:"); - result.content.forEach((item) => { - if (item.type === "text") { - console.log(` ${item.text}`); - } else { - console.log(` ${item.type} content:`, item); - } - }); - } catch (error: any) { - // Check if this is an interaction_required error - if (error.code === -32003 && error.data && error.data.type === "url") { - console.log("\n------------------------------------------"); - console.log(error.data.message.text); - console.log(error.data.url); - console.log("------------------------------------------\n"); - - // Prompt user to press any key after authorization - console.log( - "After completing the authorization flow, press Enter to continue...", - ); - await new Promise((resolve) => { - process.stdin.once("data", () => { - resolve(undefined); - }); - process.stdin.resume(); - }); - - console.log("Retrying tool call after authorization..."); - // Retry the tool call - await callTool(); - } else { - // Re-throw other errors - throw error; - } - } - } - - await callTool(); -} catch (error) { - console.log("Error calling tool:", error); -} - -// Finally, close the connection to the MCP server -await transport.close(); -process.exit(0); diff --git a/examples/code/home/use-tools/call-tools-directly/github_directly.js b/examples/code/home/use-tools/call-tools-directly/github_directly.js deleted file mode 100644 index 1d0267061..000000000 --- a/examples/code/home/use-tools/call-tools-directly/github_directly.js +++ /dev/null @@ -1,17 +0,0 @@ -import Arcade from "@arcadeai/arcadejs"; - -const client = new Arcade(); - -let userId = "{arcade_user_id}"; - -const response = await client.tools.execute({ - tool_name: "GitHub.SetStarred", - input: { - owner: "ArcadeAI", - name: "arcade-ai", - starred: true, - }, - user_id: userId, -}); - -console.log(response.output.value); diff --git a/examples/code/home/use-tools/call-tools-directly/github_directly.py b/examples/code/home/use-tools/call-tools-directly/github_directly.py deleted file mode 100644 index 781b75d58..000000000 --- a/examples/code/home/use-tools/call-tools-directly/github_directly.py +++ /dev/null @@ -1,17 +0,0 @@ -from arcadepy import Arcade - -client = Arcade() - -user_id = "{arcade_user_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) diff --git a/examples/code/home/use-tools/call-tools-directly/quickstart.mjs b/examples/code/home/use-tools/call-tools-directly/quickstart.mjs deleted file mode 100644 index ea8791d3a..000000000 --- a/examples/code/home/use-tools/call-tools-directly/quickstart.mjs +++ /dev/null @@ -1,46 +0,0 @@ -import Arcade from "@arcadeai/arcadejs"; - -// You can also set the `ARCADE_API_KEY` environment variable instead of passing it as a parameter. -const client = new Arcade({ - apiKey: "{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: -let userId = "{arcade_user_id}"; - -// Let's use the `Math.Sqrt` tool from the Arcade Math toolkit to get the square root of a number. -const response_sqrt = await client.tools.execute({ - tool_name: "Math.Sqrt", - input: { a: "625" }, - user_id: userId, -}); - -console.log(response_sqrt.output.value); - -// Now, let's use a tool that requires authentication - -const authResponse = await client.tools.authorize({ - tool_name: "GitHub.SetStarred", - user_id: userId, -}); - -if (authResponse.status !== "completed") { - console.log( - `Click this link to authorize: \`${authResponse.url}\`. The process will continue once you have authorized the app.`, - ); - // Wait for the user to authorize the app - await client.auth.waitForCompletion(authResponse.id); -} - -const response_github = await client.tools.execute({ - tool_name: "GitHub.SetStarred", - input: { - owner: "ArcadeAI", - name: "arcade-ai", - starred: true, - }, - user_id: userId, -}); - -console.log(response_github.output.value); diff --git a/examples/code/home/use-tools/call-tools-directly/quickstart.py b/examples/code/home/use-tools/call-tools-directly/quickstart.py deleted file mode 100644 index 3a9c83073..000000000 --- a/examples/code/home/use-tools/call-tools-directly/quickstart.py +++ /dev/null @@ -1,41 +0,0 @@ -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) - diff --git a/examples/code/home/use-tools/get-formatted-tool-definitions/get_openai_formatted_all_tools.js b/examples/code/home/use-tools/get-formatted-tool-definitions/get_openai_formatted_all_tools.js deleted file mode 100644 index 5995c2adc..000000000 --- a/examples/code/home/use-tools/get-formatted-tool-definitions/get_openai_formatted_all_tools.js +++ /dev/null @@ -1,9 +0,0 @@ -import Arcade from "@arcadeai/arcadejs"; - -const client = new Arcade(); - -// Get all tools formatted for OpenAI -const allTools = await client.tools.formatted.list({ format: "openai" }); - -// Print the number of tools -console.log(allTools.total_count); diff --git a/examples/code/home/use-tools/get-formatted-tool-definitions/get_openai_formatted_all_tools.py b/examples/code/home/use-tools/get-formatted-tool-definitions/get_openai_formatted_all_tools.py deleted file mode 100644 index c62bf7300..000000000 --- a/examples/code/home/use-tools/get-formatted-tool-definitions/get_openai_formatted_all_tools.py +++ /dev/null @@ -1,9 +0,0 @@ -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)) diff --git a/examples/code/home/use-tools/get-formatted-tool-definitions/get_openai_formatted_tool.js b/examples/code/home/use-tools/get-formatted-tool-definitions/get_openai_formatted_tool.js deleted file mode 100644 index 833244d62..000000000 --- a/examples/code/home/use-tools/get-formatted-tool-definitions/get_openai_formatted_tool.js +++ /dev/null @@ -1,10 +0,0 @@ -import Arcade from "@arcadeai/arcadejs"; - -const client = new Arcade(); - -// Get a specific tool formatted for OpenAI -const githubStarRepo = await client.tools.formatted.get("Github.SetStarred", { - format: "openai", -}); - -console.log(githubStarRepo); diff --git a/examples/code/home/use-tools/get-formatted-tool-definitions/get_openai_formatted_tool.py b/examples/code/home/use-tools/get-formatted-tool-definitions/get_openai_formatted_tool.py deleted file mode 100644 index a3ac35a6e..000000000 --- a/examples/code/home/use-tools/get-formatted-tool-definitions/get_openai_formatted_tool.py +++ /dev/null @@ -1,8 +0,0 @@ -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) diff --git a/examples/code/home/use-tools/get-formatted-tool-definitions/get_openai_formatted_tool_output.json b/examples/code/home/use-tools/get-formatted-tool-definitions/get_openai_formatted_tool_output.json deleted file mode 100644 index 2f94cafbb..000000000 --- a/examples/code/home/use-tools/get-formatted-tool-definitions/get_openai_formatted_tool_output.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "type": "function", - "function": { - "name": "Github_SetStarred", - "description": "Star or un-star a GitHub repository.\nFor example, to star microsoft/vscode, you would use:\n```\nset_starred(owner=\"microsoft\", name=\"vscode\", starred=True)\n```", - "parameters": { - "type": "object", - "properties": { - "name": { - "type": "string", - "description": "The name of the repository" - }, - "owner": { - "type": "string", - "description": "The owner of the repository" - }, - "starred": { - "type": "boolean", - "description": "Whether to star the repository or not" - } - }, - "required": ["owner", "name", "starred"] - } - } -} diff --git a/examples/code/home/use-tools/get-formatted-tool-definitions/get_openai_formatted_toolkit.js b/examples/code/home/use-tools/get-formatted-tool-definitions/get_openai_formatted_toolkit.js deleted file mode 100644 index eb9e73ef5..000000000 --- a/examples/code/home/use-tools/get-formatted-tool-definitions/get_openai_formatted_toolkit.js +++ /dev/null @@ -1,12 +0,0 @@ -import Arcade from "@arcadeai/arcadejs"; - -const client = new Arcade(); - -// Get all tools in the Github toolkit formatted for OpenAI -const githubTools = await client.tools.formatted.list({ - format: "openai", - toolkit: "github", -}); - -// Print the number of tools in the Github toolkit -console.log(githubTools.total_count); diff --git a/examples/code/home/use-tools/get-formatted-tool-definitions/get_openai_formatted_toolkit.py b/examples/code/home/use-tools/get-formatted-tool-definitions/get_openai_formatted_toolkit.py deleted file mode 100644 index 32cfc09f4..000000000 --- a/examples/code/home/use-tools/get-formatted-tool-definitions/get_openai_formatted_toolkit.py +++ /dev/null @@ -1,9 +0,0 @@ -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)) diff --git a/examples/code/integrations/asana/config_provider.engine.yaml b/examples/code/integrations/asana/config_provider.engine.yaml deleted file mode 100644 index 02310c400..000000000 --- a/examples/code/integrations/asana/config_provider.engine.yaml +++ /dev/null @@ -1,9 +0,0 @@ -auth: - providers: - - id: asana - description: "Custom Asana provider" - enabled: true - type: oauth2 - client_id: ${env:ASANA_CLIENT_ID} - client_secret: ${env:ASANA_CLIENT_SECRET} - diff --git a/examples/code/integrations/asana/custom_auth.js b/examples/code/integrations/asana/custom_auth.js deleted file mode 100644 index 93d9b7f81..000000000 --- a/examples/code/integrations/asana/custom_auth.js +++ /dev/null @@ -1,21 +0,0 @@ -import { Arcade } from "@arcadeai/arcadejs"; - -const client = new Arcade({ baseURL: "https://api.arcade.dev" }); // Automatically finds the `ARCADE_API_KEY` env variable - -const userId = "{arcade_user_id}"; - -// Start the authorization process -const authResponse = await client.auth.start(userId, "asana", { - scopes: ["default"], -}); - -if (authResponse.status !== "completed") { - console.log("Please complete the authorization challenge in your browser:"); - console.log(authResponse.url); -} - -// Wait for the authorization to complete -const response = await client.auth.waitForCompletion(authResponse); - -// Do something interesting with the token... -const auth_token = response.context.token; diff --git a/examples/code/integrations/asana/custom_auth.py b/examples/code/integrations/asana/custom_auth.py deleted file mode 100644 index cd1c6b958..000000000 --- a/examples/code/integrations/asana/custom_auth.py +++ /dev/null @@ -1,22 +0,0 @@ -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 diff --git a/examples/code/integrations/asana/custom_tool.py b/examples/code/integrations/asana/custom_tool.py deleted file mode 100644 index 102698f01..000000000 --- a/examples/code/integrations/asana/custom_tool.py +++ /dev/null @@ -1,24 +0,0 @@ -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() diff --git a/examples/code/integrations/asana/custom_tool_call.js b/examples/code/integrations/asana/custom_tool_call.js deleted file mode 100644 index f09a9505f..000000000 --- a/examples/code/integrations/asana/custom_tool_call.js +++ /dev/null @@ -1,31 +0,0 @@ -import { Arcade } from "@arcadeai/arcadejs"; - -const client = new Arcade({ baseURL: "https://api.arcade.dev" }); // Automatically finds the `ARCADE_API_KEY` env variable - -const USER_ID = "{arcade_user_id}"; -const TOOL_NAME = "Asana.DeleteTask"; - -// Start the authorization process -const authResponse = await client.tools.authorize({ - tool_name: TOOL_NAME, - user_id: USER_ID, -}); - -if (authResponse.status !== "completed") { - console.log(`Click this link to authorize: ${authResponse.url}`); -} - -// Wait for the authorization to complete -await client.auth.waitForCompletion(authResponse); - -const toolInput = { - task_id: "1234567890", -}; - -const response = await client.tools.execute({ - tool_name: TOOL_NAME, - input: toolInput, - user_id: USER_ID, -}); - -console.log(response.output.value); diff --git a/examples/code/integrations/asana/custom_tool_call.py b/examples/code/integrations/asana/custom_tool_call.py deleted file mode 100644 index ec59bef9b..000000000 --- a/examples/code/integrations/asana/custom_tool_call.py +++ /dev/null @@ -1,25 +0,0 @@ -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) diff --git a/examples/code/integrations/atlassian/config_provider.engine.yaml b/examples/code/integrations/atlassian/config_provider.engine.yaml deleted file mode 100644 index e3153eb7c..000000000 --- a/examples/code/integrations/atlassian/config_provider.engine.yaml +++ /dev/null @@ -1,9 +0,0 @@ -auth: - providers: - - id: default-atlassian - description: "The default Atlassian provider" - enabled: true - type: oauth2 - provider_id: atlassian - client_id: ${env:ATLASSIAN_CLIENT_ID} - client_secret: ${env:ATLASSIAN_CLIENT_SECRET} diff --git a/examples/code/integrations/atlassian/custom_auth.js b/examples/code/integrations/atlassian/custom_auth.js deleted file mode 100644 index 91f479532..000000000 --- a/examples/code/integrations/atlassian/custom_auth.js +++ /dev/null @@ -1,21 +0,0 @@ -import { Arcade } from "@arcadeai/arcadejs"; - -const client = new Arcade(); // Automatically finds the `ARCADE_API_KEY` env variable - -const userId = "{arcade_user_id}"; - -// Start the authorization process -let authResponse = await client.auth.start(userId, "atlassian", { - scopes: ["read:me", "read:jira-user", "read:confluence-user"], -}); - -if (authResponse.status !== "completed") { - console.log("Please complete the authorization challenge in your browser:"); - console.log(authResponse.url); -} - -// Wait for the authorization to complete -authResponse = await client.auth.waitForCompletion(authResponse); - -const token = authResponse.context.token; -// Do something interesting with the token... diff --git a/examples/code/integrations/atlassian/custom_auth.py b/examples/code/integrations/atlassian/custom_auth.py deleted file mode 100644 index a1eb8019c..000000000 --- a/examples/code/integrations/atlassian/custom_auth.py +++ /dev/null @@ -1,22 +0,0 @@ -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... diff --git a/examples/code/integrations/atlassian/custom_tool.py b/examples/code/integrations/atlassian/custom_tool.py deleted file mode 100644 index 63dcaa6e3..000000000 --- a/examples/code/integrations/atlassian/custom_tool.py +++ /dev/null @@ -1,28 +0,0 @@ -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() diff --git a/examples/code/integrations/clickup/clickup_custom_auth.js b/examples/code/integrations/clickup/clickup_custom_auth.js deleted file mode 100644 index 1457bd632..000000000 --- a/examples/code/integrations/clickup/clickup_custom_auth.js +++ /dev/null @@ -1,15 +0,0 @@ -import { Arcade } from "arcade-js"; - -const client = new Arcade(); - -const auth = await client.auth.start({ - provider: "clickup", -}); - -if (auth.status !== "completed") { - console.log("Finish authorization at:", auth.url); - await client.auth.waitForCompletion(auth); -} - -const { token } = auth.context; -// Use the token in ClickUp API requests diff --git a/examples/code/integrations/clickup/clickup_custom_auth.py b/examples/code/integrations/clickup/clickup_custom_auth.py deleted file mode 100644 index 7bc7a293c..000000000 --- a/examples/code/integrations/clickup/clickup_custom_auth.py +++ /dev/null @@ -1,21 +0,0 @@ -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... diff --git a/examples/code/integrations/clickup/clickup_custom_tool.py b/examples/code/integrations/clickup/clickup_custom_tool.py deleted file mode 100644 index b15dfaa01..000000000 --- a/examples/code/integrations/clickup/clickup_custom_tool.py +++ /dev/null @@ -1,31 +0,0 @@ -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}" - } diff --git a/examples/code/integrations/clickup/config_provider.engine.yaml b/examples/code/integrations/clickup/config_provider.engine.yaml deleted file mode 100644 index ebcad54c5..000000000 --- a/examples/code/integrations/clickup/config_provider.engine.yaml +++ /dev/null @@ -1,9 +0,0 @@ -auth: - providers: - - id: default-clickup - description: "The default ClickUp provider" - enabled: true - type: oauth2 - provider_id: clickup - client_id: ${env:CLICKUP_CLIENT_ID} - client_secret: ${env:CLICKUP_CLIENT_SECRET} diff --git a/examples/code/integrations/discord/config_provider.engine.yaml b/examples/code/integrations/discord/config_provider.engine.yaml deleted file mode 100644 index a4583bdeb..000000000 --- a/examples/code/integrations/discord/config_provider.engine.yaml +++ /dev/null @@ -1,9 +0,0 @@ -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} diff --git a/examples/code/integrations/discord/custom_auth.js b/examples/code/integrations/discord/custom_auth.js deleted file mode 100644 index 741066f4d..000000000 --- a/examples/code/integrations/discord/custom_auth.js +++ /dev/null @@ -1,21 +0,0 @@ -import { Arcade } from "@arcadeai/arcadejs"; - -const client = new Arcade(); - -const userId = "{arcade_user_id}"; - -// Start the authorization process -const authResponse = await client.auth.start(userId, "discord", { - scopes: ["identify", "email", "guilds", "guilds.join"], -}); - -if (authResponse.status !== "completed") { - console.log("Please complete the authorization challenge in your browser:"); - console.log(authResponse.url); -} - -// Wait for the authorization to complete -authResponse = await client.auth.waitForCompletion(authResponse); - -const token = authResponse.context.token; -// Do something interesting with the token... diff --git a/examples/code/integrations/discord/custom_auth.py b/examples/code/integrations/discord/custom_auth.py deleted file mode 100644 index 7b7bef6f5..000000000 --- a/examples/code/integrations/discord/custom_auth.py +++ /dev/null @@ -1,22 +0,0 @@ -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... diff --git a/examples/code/integrations/discord/custom_tool.py b/examples/code/integrations/discord/custom_tool.py deleted file mode 100644 index 452d0bc19..000000000 --- a/examples/code/integrations/discord/custom_tool.py +++ /dev/null @@ -1,28 +0,0 @@ -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() diff --git a/examples/code/integrations/dropbox/config_provider.engine.yaml b/examples/code/integrations/dropbox/config_provider.engine.yaml deleted file mode 100644 index ab03d83bb..000000000 --- a/examples/code/integrations/dropbox/config_provider.engine.yaml +++ /dev/null @@ -1,10 +0,0 @@ -auth: - providers: - - id: default-dropbox - description: "The default Dropbox provider" - enabled: true - type: oauth2 - provider_id: dropbox - client_id: ${env:DROPBOX_CLIENT_ID} - client_secret: ${env:DROPBOX_CLIENT_SECRET} - diff --git a/examples/code/integrations/dropbox/custom_auth.js b/examples/code/integrations/dropbox/custom_auth.js deleted file mode 100644 index 44da32446..000000000 --- a/examples/code/integrations/dropbox/custom_auth.js +++ /dev/null @@ -1,21 +0,0 @@ -import { Arcade } from "@arcadeai/arcadejs"; - -const client = new Arcade(); - -const userId = "{arcade_user_id}"; - -// Start the authorization process -const authResponse = await client.auth.start(userId, "dropbox", { - scopes: ["openid", "sharing.read", "files.metadata.read"], -}); - -if (authResponse.status !== "completed") { - console.log("Please complete the authorization challenge in your browser:"); - console.log(authResponse.url); -} - -// Wait for the authorization to complete -authResponse = await client.auth.waitForCompletion(authResponse); - -const token = authResponse.context.token; -// Do something interesting with the token... diff --git a/examples/code/integrations/dropbox/custom_auth.py b/examples/code/integrations/dropbox/custom_auth.py deleted file mode 100644 index 88b941604..000000000 --- a/examples/code/integrations/dropbox/custom_auth.py +++ /dev/null @@ -1,22 +0,0 @@ -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... diff --git a/examples/code/integrations/dropbox/custom_tool.py b/examples/code/integrations/dropbox/custom_tool.py deleted file mode 100644 index 8b9af7900..000000000 --- a/examples/code/integrations/dropbox/custom_tool.py +++ /dev/null @@ -1,28 +0,0 @@ -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() diff --git a/examples/code/integrations/github/config_provider.engine.yaml b/examples/code/integrations/github/config_provider.engine.yaml deleted file mode 100644 index ebbfb2803..000000000 --- a/examples/code/integrations/github/config_provider.engine.yaml +++ /dev/null @@ -1,9 +0,0 @@ -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} diff --git a/examples/code/integrations/github/custom_auth.js b/examples/code/integrations/github/custom_auth.js deleted file mode 100644 index 86694c1fb..000000000 --- a/examples/code/integrations/github/custom_auth.js +++ /dev/null @@ -1,50 +0,0 @@ -import { Arcade } from "@arcadeai/arcadejs"; - -const client = new Arcade(); // Automatically finds the `ARCADE_API_KEY` env variable - -const userId = "{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 -let authResponse = await client.auth.start(userId, "github"); - -if (authResponse.status !== "completed") { - console.log("Please complete the authorization challenge in your browser:"); - console.log(authResponse.url); -} - -// Wait for the authorization to complete -authResponse = await client.auth.waitForCompletion(authResponse); - -if (!authResponse.context.token) { - throw new Error("No token found in auth response"); -} - -const token = authResponse.context.token; - -const owner = "ArcadeAI"; -const name = "arcade-ai"; -const headers = { - Accept: "application/vnd.github+json", - Authorization: `Bearer ${token}`, - "X-GitHub-Api-Version": "2022-11-28", -}; -const url = `https://api.github.com/repos/${owner}/${name}`; - -const response = await fetch(url, { headers }); -if (!response.ok) { - throw new Error(`HTTP error! status: ${response.status}`); -} -const data = await response.json(); -console.log(data.stargazers_count); diff --git a/examples/code/integrations/github/custom_auth.py b/examples/code/integrations/github/custom_auth.py deleted file mode 100644 index 49ed6e780..000000000 --- a/examples/code/integrations/github/custom_auth.py +++ /dev/null @@ -1,50 +0,0 @@ -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")) diff --git a/examples/code/integrations/github/custom_tool.py b/examples/code/integrations/github/custom_tool.py deleted file mode 100644 index 8e55e395f..000000000 --- a/examples/code/integrations/github/custom_tool.py +++ /dev/null @@ -1,28 +0,0 @@ -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) diff --git a/examples/code/integrations/google/config_provider.engine.yaml b/examples/code/integrations/google/config_provider.engine.yaml deleted file mode 100644 index 598749d5f..000000000 --- a/examples/code/integrations/google/config_provider.engine.yaml +++ /dev/null @@ -1,9 +0,0 @@ -auth: - providers: - - id: default-google - description: "The default Google provider" - enabled: true - type: oauth2 - provider_id: google - client_id: ${env:GOOGLE_CLIENT_ID} - client_secret: ${env:GOOGLE_CLIENT_SECRET} diff --git a/examples/code/integrations/google/custom_auth.js b/examples/code/integrations/google/custom_auth.js deleted file mode 100644 index 6d81c732e..000000000 --- a/examples/code/integrations/google/custom_auth.js +++ /dev/null @@ -1,56 +0,0 @@ -import { Arcade } from "@arcadeai/arcadejs"; - -const client = new Arcade(); // Automatically finds the `ARCADE_API_KEY` env variable - -const userId = "{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 -let authResponse = await client.auth.start(userId, "google", { - scopes: ["https://www.googleapis.com/auth/gmail.readonly"], -}); - -if (authResponse.status !== "completed") { - console.log("Please complete the authorization challenge in your browser:"); - console.log(authResponse.url); -} - -// Wait for the authorization to complete -authResponse = await client.auth.waitForCompletion(authResponse); - -if (!authResponse.context.token) { - throw new Error("No token found in auth response"); -} - -const token = authResponse.context.token; - -// Use the Google Gmail API -const response = await fetch( - "https://gmail.googleapis.com/gmail/v1/users/me/messages", - { - headers: { - Authorization: `Bearer ${token}`, - }, - }, -); - -if (!response.ok) { - throw new Error(`HTTP error! status: ${response.status}`); -} - -const data = await response.json(); -const emailMessages = data.messages || []; - -// Return a list of ids and thread ids -console.log(emailMessages); diff --git a/examples/code/integrations/google/custom_auth.py b/examples/code/integrations/google/custom_auth.py deleted file mode 100644 index 125e461d6..000000000 --- a/examples/code/integrations/google/custom_auth.py +++ /dev/null @@ -1,47 +0,0 @@ -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) diff --git a/examples/code/integrations/google/custom_tool.py b/examples/code/integrations/google/custom_tool.py deleted file mode 100644 index 25c1daa0c..000000000 --- a/examples/code/integrations/google/custom_tool.py +++ /dev/null @@ -1,34 +0,0 @@ -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 diff --git a/examples/code/integrations/hubspot/config_provider.engine.yaml b/examples/code/integrations/hubspot/config_provider.engine.yaml deleted file mode 100644 index 5e6f44902..000000000 --- a/examples/code/integrations/hubspot/config_provider.engine.yaml +++ /dev/null @@ -1,8 +0,0 @@ -auth: - providers: - - id: hubspot - description: "Custom Hubspot provider" - enabled: true - type: oauth2 - client_id: ${env:HUBSPOT_CLIENT_ID} - client_secret: ${env:HUBSPOT_CLIENT_SECRET} diff --git a/examples/code/integrations/hubspot/custom_auth.js b/examples/code/integrations/hubspot/custom_auth.js deleted file mode 100644 index 6bbb0d437..000000000 --- a/examples/code/integrations/hubspot/custom_auth.js +++ /dev/null @@ -1,21 +0,0 @@ -import { Arcade } from "@arcadeai/arcadejs"; - -const client = new Arcade({ baseURL: "https://api.arcade.dev" }); // Automatically finds the `ARCADE_API_KEY` env variable - -const userId = "{arcade_user_id}"; - -// Start the authorization process -const authResponse = await client.auth.start(userId, "hubspot", { - scopes: ["oauth", "crm.objects.companies.read"], -}); - -if (authResponse.status !== "completed") { - console.log("Please complete the authorization challenge in your browser:"); - console.log(authResponse.url); -} - -// Wait for the authorization to complete -const response = await client.auth.waitForCompletion(authResponse); - -const token = response.context.token; -// Do something interesting with the token... diff --git a/examples/code/integrations/hubspot/custom_auth.py b/examples/code/integrations/hubspot/custom_auth.py deleted file mode 100644 index 6dce8d9ef..000000000 --- a/examples/code/integrations/hubspot/custom_auth.py +++ /dev/null @@ -1,22 +0,0 @@ -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... diff --git a/examples/code/integrations/hubspot/custom_tool.py b/examples/code/integrations/hubspot/custom_tool.py deleted file mode 100644 index 59bf51d4c..000000000 --- a/examples/code/integrations/hubspot/custom_tool.py +++ /dev/null @@ -1,28 +0,0 @@ -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() diff --git a/examples/code/integrations/hubspot/custom_tool_call.js b/examples/code/integrations/hubspot/custom_tool_call.js deleted file mode 100644 index 5e711d651..000000000 --- a/examples/code/integrations/hubspot/custom_tool_call.js +++ /dev/null @@ -1,31 +0,0 @@ -import { Arcade } from "@arcadeai/arcadejs"; - -const client = new Arcade({ baseURL: "https://api.arcade.dev" }); // Automatically finds the `ARCADE_API_KEY` env variable - -const USER_ID = "{arcade_user_id}"; -const TOOL_NAME = "Hubspot.GetCompanyDetails"; - -// Start the authorization process -const authResponse = await client.tools.authorize({ - tool_name: TOOL_NAME, - user_id: USER_ID, -}); - -if (authResponse.status !== "completed") { - console.log(`Click this link to authorize: ${authResponse.url}`); -} - -// Wait for the authorization to complete -await client.auth.waitForCompletion(authResponse); - -const toolInput = { - company_id: "1234567890", -}; - -const response = await client.tools.execute({ - tool_name: TOOL_NAME, - input: toolInput, - user_id: USER_ID, -}); - -console.log(response.output.value); diff --git a/examples/code/integrations/hubspot/custom_tool_call.py b/examples/code/integrations/hubspot/custom_tool_call.py deleted file mode 100644 index 173476ea4..000000000 --- a/examples/code/integrations/hubspot/custom_tool_call.py +++ /dev/null @@ -1,25 +0,0 @@ -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) diff --git a/examples/code/integrations/linear/config_provider.engine.yaml b/examples/code/integrations/linear/config_provider.engine.yaml deleted file mode 100644 index 02655a568..000000000 --- a/examples/code/integrations/linear/config_provider.engine.yaml +++ /dev/null @@ -1,9 +0,0 @@ -auth: - providers: - - id: default-linear - description: "The default Linear provider" - enabled: true - type: oauth2 - provider_id: linear - client_id: ${env:LINEAR_CLIENT_ID} - client_secret: ${env:LINEAR_CLIENT_SECRET} diff --git a/examples/code/integrations/linear/custom_auth.js b/examples/code/integrations/linear/custom_auth.js deleted file mode 100644 index 0bcf914ed..000000000 --- a/examples/code/integrations/linear/custom_auth.js +++ /dev/null @@ -1,21 +0,0 @@ -import { Arcade } from "@arcadeai/arcadejs"; - -const client = new Arcade(); // Automatically finds the `ARCADE_API_KEY` env variable - -const userId = "{arcade_user_id}"; - -// Start the authorization process -let authResponse = await client.auth.start(userId, "linear", { - scopes: ["read"], -}); - -if (authResponse.status !== "completed") { - console.log("Please complete the authorization challenge in your browser:"); - console.log(authResponse.url); -} - -// Wait for the authorization to complete -authResponse = await client.auth.waitForCompletion(authResponse); - -const token = authResponse.context.token; -// Do something interesting with the token... diff --git a/examples/code/integrations/linear/custom_auth.py b/examples/code/integrations/linear/custom_auth.py deleted file mode 100644 index 1a916a30e..000000000 --- a/examples/code/integrations/linear/custom_auth.py +++ /dev/null @@ -1,24 +0,0 @@ -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... diff --git a/examples/code/integrations/linear/custom_tool.py b/examples/code/integrations/linear/custom_tool.py deleted file mode 100644 index 4573e7ac7..000000000 --- a/examples/code/integrations/linear/custom_tool.py +++ /dev/null @@ -1,37 +0,0 @@ -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 diff --git a/examples/code/integrations/linkedin/config_provider.engine.yaml b/examples/code/integrations/linkedin/config_provider.engine.yaml deleted file mode 100644 index 0d47b58ac..000000000 --- a/examples/code/integrations/linkedin/config_provider.engine.yaml +++ /dev/null @@ -1,9 +0,0 @@ -auth: - providers: - - id: default-linkedin - description: "The default LinkedIn provider" - enabled: true - type: oauth2 - provider_id: linkedin - client_id: ${env:LINKEDIN_CLIENT_ID} - client_secret: ${env:LINKEDIN_CLIENT_SECRET} diff --git a/examples/code/integrations/linkedin/custom_auth.js b/examples/code/integrations/linkedin/custom_auth.js deleted file mode 100644 index 3844f53e5..000000000 --- a/examples/code/integrations/linkedin/custom_auth.js +++ /dev/null @@ -1,72 +0,0 @@ -import { Arcade } from "@arcadeai/arcadejs"; - -const client = new Arcade(); // Automatically finds the `ARCADE_API_KEY` env variable - -const userId = "{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 -let authResponse = await client.auth.start(userId, "linkedin", { - scopes: ["w_member_social"], -}); - -if (authResponse.status !== "completed") { - console.log("Please complete the authorization challenge in your browser:"); - console.log(authResponse.url); -} - -// Wait for the authorization to complete -authResponse = await client.auth.waitForCompletion(authResponse); - -if (!authResponse.context.token) { - throw new Error("No token found in auth response"); -} - -const token = authResponse.context.token; - -const linkedInUserId = authResponse.context.authorization?.user_info?.sub; - -if (!linkedInUserId) { - throw new Error("User ID not found."); -} - -// Prepare the payload data for the LinkedIn API -const message = "Hello, from Arcade.dev!"; -const payload = { - author: `urn:li:person:${linkedInUserId}`, - lifecycleState: "PUBLISHED", - specificContent: { - "com.linkedin.ugc.ShareContent": { - shareCommentary: { text: message }, - shareMediaCategory: "NONE", - }, - }, - visibility: { "com.linkedin.ugc.MemberNetworkVisibility": "PUBLIC" }, -}; - -const response = await fetch("https://api.linkedin.com/v2/ugcPosts", { - method: "POST", - headers: { - Authorization: `Bearer ${token}`, - "Content-Type": "application/json", - }, - body: JSON.stringify(payload), -}); - -if (!response.ok) { - throw new Error(`HTTP error! status: ${response.status}`); -} - -const data = await response.json(); -console.log(data); diff --git a/examples/code/integrations/linkedin/custom_auth.py b/examples/code/integrations/linkedin/custom_auth.py deleted file mode 100644 index 8c6f339df..000000000 --- a/examples/code/integrations/linkedin/custom_auth.py +++ /dev/null @@ -1,70 +0,0 @@ -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()) diff --git a/examples/code/integrations/linkedin/custom_tool.py b/examples/code/integrations/linkedin/custom_tool.py deleted file mode 100644 index 7864cf537..000000000 --- a/examples/code/integrations/linkedin/custom_tool.py +++ /dev/null @@ -1,56 +0,0 @@ -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}/" diff --git a/examples/code/integrations/microsoft/config_provider.engine.yaml b/examples/code/integrations/microsoft/config_provider.engine.yaml deleted file mode 100644 index 03bd3dc73..000000000 --- a/examples/code/integrations/microsoft/config_provider.engine.yaml +++ /dev/null @@ -1,9 +0,0 @@ -auth: - providers: - - id: default-microsoft - description: "The default Microsoft provider" - enabled: true - type: oauth2 - provider_id: microsoft - client_id: ${env:MICROSOFT_CLIENT_ID} - client_secret: ${env:MICROSOFT_CLIENT_SECRET} diff --git a/examples/code/integrations/microsoft/custom_auth.js b/examples/code/integrations/microsoft/custom_auth.js deleted file mode 100644 index bc4caaec7..000000000 --- a/examples/code/integrations/microsoft/custom_auth.js +++ /dev/null @@ -1,21 +0,0 @@ -import { Arcade } from "@arcadeai/arcadejs"; - -const client = new Arcade(); - -const userId = "{arcade_user_id}"; - -// Start the authorization process -let authResponse = await client.auth.start(userId, "microsoft", { - scopes: ["User.Read", "Files.Read"], -}); - -if (authResponse.status !== "completed") { - console.log("Please complete the authorization challenge in your browser:"); - console.log(authResponse.url); -} - -// Wait for the authorization to complete -authResponse = await client.auth.waitForCompletion(authResponse); - -const token = authResponse.context.token; -// TODO: Do something interesting with the token... diff --git a/examples/code/integrations/microsoft/custom_auth.py b/examples/code/integrations/microsoft/custom_auth.py deleted file mode 100644 index 74c76b8ae..000000000 --- a/examples/code/integrations/microsoft/custom_auth.py +++ /dev/null @@ -1,22 +0,0 @@ -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... diff --git a/examples/code/integrations/microsoft/custom_tool.py b/examples/code/integrations/microsoft/custom_tool.py deleted file mode 100644 index 77e9933a8..000000000 --- a/examples/code/integrations/microsoft/custom_tool.py +++ /dev/null @@ -1,28 +0,0 @@ -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() diff --git a/examples/code/integrations/notion/config_provider.engine.yaml b/examples/code/integrations/notion/config_provider.engine.yaml deleted file mode 100644 index cd8497598..000000000 --- a/examples/code/integrations/notion/config_provider.engine.yaml +++ /dev/null @@ -1,9 +0,0 @@ -auth: - providers: - - id: default-notion - description: "The default Notion provider" - enabled: true - type: oauth2 - provider_id: notion - client_id: ${env:NOTION_CLIENT_ID} - client_secret: ${env:NOTION_CLIENT_SECRET} diff --git a/examples/code/integrations/notion/custom_auth.js b/examples/code/integrations/notion/custom_auth.js deleted file mode 100644 index 3bf6fe745..000000000 --- a/examples/code/integrations/notion/custom_auth.js +++ /dev/null @@ -1,19 +0,0 @@ -import { Arcade } from "@arcadeai/arcadejs"; - -const client = new Arcade(); - -const userId = "{arcade_user_id}"; - -// Start the authorization process -const authResponse = await client.auth.start(userId, "notion"); - -if (authResponse.status !== "completed") { - console.log("Please complete the authorization challenge in your browser:"); - console.log(authResponse.url); -} - -// Wait for the authorization to complete -authResponse = await client.auth.waitForCompletion(authResponse); - -const token = authResponse.context.token; -// Do something interesting with the token... diff --git a/examples/code/integrations/notion/custom_auth.py b/examples/code/integrations/notion/custom_auth.py deleted file mode 100644 index 07a43cb0c..000000000 --- a/examples/code/integrations/notion/custom_auth.py +++ /dev/null @@ -1,21 +0,0 @@ -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... diff --git a/examples/code/integrations/notion/custom_tool.py b/examples/code/integrations/notion/custom_tool.py deleted file mode 100644 index fb14b7a76..000000000 --- a/examples/code/integrations/notion/custom_tool.py +++ /dev/null @@ -1,27 +0,0 @@ -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()) diff --git a/examples/code/integrations/oauth2/custom_auth.js b/examples/code/integrations/oauth2/custom_auth.js deleted file mode 100644 index 3d92ce470..000000000 --- a/examples/code/integrations/oauth2/custom_auth.js +++ /dev/null @@ -1,22 +0,0 @@ -import { Arcade } from "@arcadeai/arcadejs"; - -const client = new Arcade(); // Automatically finds the `ARCADE_API_KEY` env variable - -const userId = "{arcade_user_id}"; - -// Start the authorization process -let authResponse = await client.auth.start(userId, "hooli", [ - "scope1", - "scope2", -]); - -if (authResponse.status !== "completed") { - console.log("Please complete the authorization challenge in your browser:"); - console.log(authResponse.url); -} - -// Wait for the authorization to complete -authResponse = await client.auth.waitForCompletion(authResponse); - -const token = authResponse.context.token; -// TODO: Do something interesting with the token... diff --git a/examples/code/integrations/oauth2/custom_auth.py b/examples/code/integrations/oauth2/custom_auth.py deleted file mode 100644 index e7407919d..000000000 --- a/examples/code/integrations/oauth2/custom_auth.py +++ /dev/null @@ -1,23 +0,0 @@ -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... diff --git a/examples/code/integrations/oauth2/custom_tool.py b/examples/code/integrations/oauth2/custom_tool.py deleted file mode 100644 index 82df86e16..000000000 --- a/examples/code/integrations/oauth2/custom_tool.py +++ /dev/null @@ -1,23 +0,0 @@ -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") diff --git a/examples/code/integrations/reddit/config_provider.engine.yaml b/examples/code/integrations/reddit/config_provider.engine.yaml deleted file mode 100644 index f4ec48226..000000000 --- a/examples/code/integrations/reddit/config_provider.engine.yaml +++ /dev/null @@ -1,9 +0,0 @@ -auth: - providers: - - id: default-reddit - description: "The default Reddit provider" - enabled: true - type: oauth2 - provider_id: reddit - client_id: ${env:REDDIT_CLIENT_ID} - client_secret: ${env:REDDIT_CLIENT_SECRET} diff --git a/examples/code/integrations/reddit/custom_auth.js b/examples/code/integrations/reddit/custom_auth.js deleted file mode 100644 index 657042935..000000000 --- a/examples/code/integrations/reddit/custom_auth.js +++ /dev/null @@ -1,21 +0,0 @@ -import { Arcade } from "@arcadeai/arcadejs"; - -const client = new Arcade(); - -const userId = "{arcade_user_id}"; - -// Start the authorization process -const authResponse = await client.auth.start(userId, "reddit", { - scopes: ["identity"], -}); - -if (authResponse.status !== "completed") { - console.log("Please complete the authorization challenge in your browser:"); - console.log(authResponse.url); -} - -// Wait for the authorization to complete -authResponse = await client.auth.waitForCompletion(authResponse); - -const token = authResponse.context.token; -// Do something interesting with the token... diff --git a/examples/code/integrations/reddit/custom_auth.py b/examples/code/integrations/reddit/custom_auth.py deleted file mode 100644 index 3a3d94beb..000000000 --- a/examples/code/integrations/reddit/custom_auth.py +++ /dev/null @@ -1,22 +0,0 @@ -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... diff --git a/examples/code/integrations/reddit/custom_tool.py b/examples/code/integrations/reddit/custom_tool.py deleted file mode 100644 index ad8bef282..000000000 --- a/examples/code/integrations/reddit/custom_tool.py +++ /dev/null @@ -1,27 +0,0 @@ -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() diff --git a/examples/code/integrations/salesforce/config_provider.engine.yaml b/examples/code/integrations/salesforce/config_provider.engine.yaml deleted file mode 100644 index a0c490dc9..000000000 --- a/examples/code/integrations/salesforce/config_provider.engine.yaml +++ /dev/null @@ -1,46 +0,0 @@ -auth: - providers: - - id: salesforce - description: "Custom Salesforce provider" - enabled: true - type: oauth2 - client_id: ${env:SALESFORCE_CLIENT_ID} - client_secret: ${env:SALESFORCE_CLIENT_SECRET} - oauth2: - authorize_request: - endpoint: 'https://salesforce-org-subdomain.my.salesforce.com/services/oauth2/authorize' - params: - client_id: '{{client_id}}' - redirect_uri: '{{redirect_uri}}' - scope: '{{scopes}}' - response_type: code - token_request: - endpoint: 'https://salesforce-org-subdomain.my.salesforce.com/services/oauth2/token' - params: - grant_type: authorization_code - client_id: '{{client_id}}' - client_secret: '{{client_secret}}' - redirect_uri: '{{redirect_uri}}' - refresh_request: - endpoint: 'https://salesforce-org-subdomain.my.salesforce.com/services/oauth2/token' - params: - grant_type: refresh_token - client_id: '{{client_id}}' - client_secret: '{{client_secret}}' - refresh_token: '{{refresh_token}}' - token_introspection_request: - enabled: false - endpoint: 'https://salesforce-org-subdomain.my.salesforce.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 diff --git a/examples/code/integrations/salesforce/custom_auth.js b/examples/code/integrations/salesforce/custom_auth.js deleted file mode 100644 index d7a8296c7..000000000 --- a/examples/code/integrations/salesforce/custom_auth.js +++ /dev/null @@ -1,60 +0,0 @@ -import { Arcade } from "@arcadeai/arcadejs"; - -const client = new Arcade((baseURL = "http://localhost:9099")); // Automatically finds the `ARCADE_API_KEY` env variable - -const salesforceProviderId = "salesforce"; -const salesforceOrgSubdomain = "salesforce-org-subdomain"; -const userId = "{arcade_user_id}"; -const scopes = ["read_account"]; - -// Start the authorization process -let authResponse = await client.auth.start(userId, { - provider: salesforceProviderId, - scopes: scopes, -}); - -if (authResponse.status !== "completed") { - console.log("Please complete the authorization challenge in your browser:"); - console.log(authResponse.url); -} - -// Wait for the authorization to complete -authResponse = await client.auth.waitForCompletion(authResponse); - -if (!authResponse.context.token) { - throw new Error("No token found in auth response"); -} - -const token = authResponse.context.token; - -if (!token) { - throw new Error("No token found in auth response"); -} - -// Use the Salesforce API -const response = await fetch( - `https://${salesforceOrgSubdomain}.my.salesforce.com/services/data/v63.0/parameterizedSearch`, - { - headers: { - Authorization: `Bearer ${token}`, - }, - method: "POST", - body: JSON.stringify({ - q: "acme", - sobjects: [ - { name: "Account", fields: ["Id", "Name", "Website", "Phone"] }, - ], - in: "ALL", - overallLimit: 10, - offset: 0, - }), - }, -); - -if (!response.ok) { - throw new Error( - `HTTP error! status: ${response.status} - ${await response.text()}`, - ); -} - -console.log(await response.json()); diff --git a/examples/code/integrations/salesforce/custom_auth.py b/examples/code/integrations/salesforce/custom_auth.py deleted file mode 100644 index 939b61686..000000000 --- a/examples/code/integrations/salesforce/custom_auth.py +++ /dev/null @@ -1,50 +0,0 @@ -import requests -from arcadepy import Arcade - -client = Arcade(base_url="http://localhost:9099") # Automatically finds the `ARCADE_API_KEY` env variable - -salesforce_provider_id = "salesforce" -salesforce_org_subdomain = "salesforce-org-subdomain" -user_id = "{arcade_user_id}" -scopes = ["read_account"] - -# Start the authorization process -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") - -# Use the Salesforce API -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}" - ) - -print(response.json()) diff --git a/examples/code/integrations/slack/config_provider.engine.yaml b/examples/code/integrations/slack/config_provider.engine.yaml deleted file mode 100644 index 96ff93462..000000000 --- a/examples/code/integrations/slack/config_provider.engine.yaml +++ /dev/null @@ -1,9 +0,0 @@ -auth: - providers: - - id: default-slack - description: "The default Slack provider" - enabled: true - type: oauth2 - provider_id: slack - client_id: ${env:SLACK_CLIENT_ID} - client_secret: ${env:SLACK_CLIENT_SECRET} diff --git a/examples/code/integrations/slack/custom_auth.js b/examples/code/integrations/slack/custom_auth.js deleted file mode 100644 index 128cc4146..000000000 --- a/examples/code/integrations/slack/custom_auth.js +++ /dev/null @@ -1,21 +0,0 @@ -import { Arcade } from "@arcadeai/arcadejs"; - -const client = new Arcade(); // Automatically finds the `ARCADE_API_KEY` env variable - -const userId = "{arcade_user_id}"; - -// Start the authorization process -let authResponse = await client.auth.start(userId, "slack", { - scopes: ["chat:write", "im:write", "users.profile:read", "users:read"], -}); - -if (authResponse.status !== "completed") { - console.log("Please complete the authorization challenge in your browser:"); - console.log(authResponse.url); -} - -// Wait for the authorization to complete -authResponse = await client.auth.waitForCompletion(authResponse); - -const token = authResponse.context.token; -// Do something interesting with the token... diff --git a/examples/code/integrations/slack/custom_auth.py b/examples/code/integrations/slack/custom_auth.py deleted file mode 100644 index d774aebae..000000000 --- a/examples/code/integrations/slack/custom_auth.py +++ /dev/null @@ -1,27 +0,0 @@ -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... diff --git a/examples/code/integrations/slack/custom_tool.py b/examples/code/integrations/slack/custom_tool.py deleted file mode 100644 index 45041c5c5..000000000 --- a/examples/code/integrations/slack/custom_tool.py +++ /dev/null @@ -1,51 +0,0 @@ -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) diff --git a/examples/code/integrations/spotify/config_provider.engine.yaml b/examples/code/integrations/spotify/config_provider.engine.yaml deleted file mode 100644 index 319ff31ee..000000000 --- a/examples/code/integrations/spotify/config_provider.engine.yaml +++ /dev/null @@ -1,9 +0,0 @@ -auth: - providers: - - id: default-spotify - description: "The default Spotify provider" - enabled: true - type: oauth2 - provider_id: spotify - client_id: ${env:SPOTIFY_CLIENT_ID} - client_secret: ${env:SPOTIFY_CLIENT_SECRET} diff --git a/examples/code/integrations/spotify/custom_auth.js b/examples/code/integrations/spotify/custom_auth.js deleted file mode 100644 index dbb5a4813..000000000 --- a/examples/code/integrations/spotify/custom_auth.js +++ /dev/null @@ -1,21 +0,0 @@ -import { Arcade } from "@arcadeai/arcadejs"; - -const client = new Arcade(); // Automatically finds the `ARCADE_API_KEY` env variable - -const userId = "{arcade_user_id}"; - -// Start the authorization process -let authResponse = await client.auth.start(userId, "spotify", [ - "user-read-playback-state", -]); - -if (authResponse.status !== "completed") { - console.log("Please complete the authorization challenge in your browser:"); - console.log(authResponse.url); -} - -// Wait for the authorization to complete -authResponse = await client.auth.waitForCompletion(authResponse); - -const token = authResponse.context.token; -// Do something interesting with the token... diff --git a/examples/code/integrations/spotify/custom_auth.py b/examples/code/integrations/spotify/custom_auth.py deleted file mode 100644 index dda2c5d19..000000000 --- a/examples/code/integrations/spotify/custom_auth.py +++ /dev/null @@ -1,22 +0,0 @@ -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... diff --git a/examples/code/integrations/spotify/custom_tool.py b/examples/code/integrations/spotify/custom_tool.py deleted file mode 100644 index 6896044d4..000000000 --- a/examples/code/integrations/spotify/custom_tool.py +++ /dev/null @@ -1,30 +0,0 @@ -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() diff --git a/examples/code/integrations/twitch/config_provider.engine.yaml b/examples/code/integrations/twitch/config_provider.engine.yaml deleted file mode 100644 index 754bc7ae3..000000000 --- a/examples/code/integrations/twitch/config_provider.engine.yaml +++ /dev/null @@ -1,9 +0,0 @@ -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} diff --git a/examples/code/integrations/twitch/custom_auth.js b/examples/code/integrations/twitch/custom_auth.js deleted file mode 100644 index 1725ac11a..000000000 --- a/examples/code/integrations/twitch/custom_auth.js +++ /dev/null @@ -1,21 +0,0 @@ -import { Arcade } from "@arcadeai/arcadejs"; - -const client = new Arcade(); - -const userId = "{arcade_user_id}"; - -// Start the authorization process -const authResponse = await client.auth.start(userId, "twitch", { - scopes: ["channel:manage:polls"], -}); - -if (authResponse.status !== "completed") { - console.log("Please complete the authorization challenge in your browser:"); - console.log(authResponse.url); -} - -// Wait for the authorization to complete -authResponse = await client.auth.waitForCompletion(authResponse); - -const token = authResponse.context.token; -// Do something interesting with the token... diff --git a/examples/code/integrations/twitch/custom_auth.py b/examples/code/integrations/twitch/custom_auth.py deleted file mode 100644 index dbbdf8679..000000000 --- a/examples/code/integrations/twitch/custom_auth.py +++ /dev/null @@ -1,22 +0,0 @@ -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... diff --git a/examples/code/integrations/twitch/custom_tool.py b/examples/code/integrations/twitch/custom_tool.py deleted file mode 100644 index 7f03cf828..000000000 --- a/examples/code/integrations/twitch/custom_tool.py +++ /dev/null @@ -1,50 +0,0 @@ -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() diff --git a/examples/code/integrations/x/config_provider.engine.yaml b/examples/code/integrations/x/config_provider.engine.yaml deleted file mode 100644 index 9bb8b7363..000000000 --- a/examples/code/integrations/x/config_provider.engine.yaml +++ /dev/null @@ -1,9 +0,0 @@ -auth: - providers: - - id: default-x - description: "The default X provider" - enabled: true - type: oauth2 - provider_id: x - client_id: ${env:X_CLIENT_ID} - client_secret: ${env:X_CLIENT_SECRET} diff --git a/examples/code/integrations/x/custom_auth.js b/examples/code/integrations/x/custom_auth.js deleted file mode 100644 index ea492464b..000000000 --- a/examples/code/integrations/x/custom_auth.js +++ /dev/null @@ -1,23 +0,0 @@ -import { Arcade } from "@arcadeai/arcadejs"; - -const client = new Arcade(); // Automatically finds the `ARCADE_API_KEY` env variable - -const userId = "{arcade_user_id}"; - -// Start the authorization process -let authResponse = await client.auth.start(userId, "x", [ - "tweet.read", - "tweet.write", - "users.read", -]); - -if (authResponse.status !== "completed") { - console.log("Please complete the authorization challenge in your browser:"); - console.log(authResponse.url); -} - -// Wait for the authorization to complete -authResponse = await client.auth.waitForCompletion(authResponse); - -const token = authResponse.context.token; -// Do something interesting with the token... diff --git a/examples/code/integrations/x/custom_auth.py b/examples/code/integrations/x/custom_auth.py deleted file mode 100644 index a3e54ea96..000000000 --- a/examples/code/integrations/x/custom_auth.py +++ /dev/null @@ -1,22 +0,0 @@ -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... diff --git a/examples/code/integrations/x/custom_tool.py b/examples/code/integrations/x/custom_tool.py deleted file mode 100644 index 2c7730d0c..000000000 --- a/examples/code/integrations/x/custom_tool.py +++ /dev/null @@ -1,31 +0,0 @@ -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}" diff --git a/examples/code/integrations/zendesk/config_provider.engine.yaml b/examples/code/integrations/zendesk/config_provider.engine.yaml deleted file mode 100644 index 050fd2971..000000000 --- a/examples/code/integrations/zendesk/config_provider.engine.yaml +++ /dev/null @@ -1,43 +0,0 @@ -auth: - providers: - - id: zendesk - description: "Custom Zendesk provider" - enabled: true - type: oauth2 - client_id: ${env:ZENDESK_CLIENT_ID} - oauth2: - scope_delimiter: ' ' - pkce: - enabled: true - code_challenge_method: S256 - authorize_request: - endpoint: 'https://.zendesk.com/oauth/authorizations/new' - params: - client_id: '{{client_id}}' - redirect_uri: '{{redirect_uri}}' - scope: '{{scopes}} {{existing_scopes}}' - response_type: code - token_request: - endpoint: 'https://.zendesk.com/oauth/tokens' - params: - grant_type: authorization_code - client_id: '{{client_id}}' - redirect_uri: '{{redirect_uri}}' - response_content_type: application/json - response_map: - access_token: '$.access_token' - refresh_token: '$.refresh_token' - expires_in: '$.expires_in' - scope: '$.scope' - refresh_request: - endpoint: 'https://.zendesk.com/oauth/tokens' - params: - grant_type: refresh_token - refresh_token: '{{refresh_token}}' - client_id: '{{client_id}}' - response_content_type: application/json - response_map: - access_token: '$.access_token' - refresh_token: '$.refresh_token' - expires_in: '$.expires_in' - scope: '$.scope' diff --git a/examples/code/integrations/zendesk/custom_auth.js b/examples/code/integrations/zendesk/custom_auth.js deleted file mode 100644 index 2598f78fc..000000000 --- a/examples/code/integrations/zendesk/custom_auth.js +++ /dev/null @@ -1,23 +0,0 @@ -import { Arcade } from "@arcadeai/arcadejs"; - -const client = new Arcade(); // Automatically finds the `ARCADE_API_KEY` env variable - -const userId = "{arcade_user_id}"; - -// Start the authorization process -let authResponse = await client.auth.start(userId, { - provider: "zendesk", - scopes: ["read_account"], -}); - -if (authResponse.status !== "completed") { - console.log("Please complete the authorization challenge in your browser:"); - console.log(authResponse.url); -} - -// Wait for the authorization to complete -authResponse = await client.auth.waitForCompletion(authResponse); - -const token = authResponse.context.token; - -// Do something interesting with the token... diff --git a/examples/code/integrations/zendesk/custom_auth.py b/examples/code/integrations/zendesk/custom_auth.py deleted file mode 100644 index 11939c122..000000000 --- a/examples/code/integrations/zendesk/custom_auth.py +++ /dev/null @@ -1,21 +0,0 @@ -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... diff --git a/examples/code/integrations/zendesk/custom_tool.py b/examples/code/integrations/zendesk/custom_tool.py deleted file mode 100644 index ab5e97fd5..000000000 --- a/examples/code/integrations/zendesk/custom_tool.py +++ /dev/null @@ -1,31 +0,0 @@ -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} diff --git a/examples/code/integrations/zoom/config_provider.engine.yaml b/examples/code/integrations/zoom/config_provider.engine.yaml deleted file mode 100644 index bbb9725c1..000000000 --- a/examples/code/integrations/zoom/config_provider.engine.yaml +++ /dev/null @@ -1,9 +0,0 @@ -auth: - providers: - - id: default-zoom - description: "The default Zoom provider" - enabled: true - type: oauth2 - provider_id: zoom - client_id: ${env:ZOOM_CLIENT_ID} - client_secret: ${env:ZOOM_CLIENT_SECRET} diff --git a/examples/code/integrations/zoom/custom_auth.js b/examples/code/integrations/zoom/custom_auth.js deleted file mode 100644 index 0a1ddfadb..000000000 --- a/examples/code/integrations/zoom/custom_auth.js +++ /dev/null @@ -1,21 +0,0 @@ -import { Arcade } from "@arcadeai/arcadejs"; - -const client = new Arcade(); // Automatically finds the `ARCADE_API_KEY` env variable - -const userId = "{arcade_user_id}"; - -// Start the authorization process -let authResponse = await client.auth.start(userId, "zoom", [ - "meeting:read:list_upcoming_meetings", -]); - -if (authResponse.status !== "completed") { - console.log("Please complete the authorization challenge in your browser:"); - console.log(authResponse.url); -} - -// Wait for the authorization to complete -authResponse = await client.auth.waitForCompletion(authResponse); - -const token = authResponse.context.token; -// Do something interesting with the token... diff --git a/examples/code/integrations/zoom/custom_auth.py b/examples/code/integrations/zoom/custom_auth.py deleted file mode 100644 index 13f748aad..000000000 --- a/examples/code/integrations/zoom/custom_auth.py +++ /dev/null @@ -1,22 +0,0 @@ -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... diff --git a/examples/code/integrations/zoom/custom_tool.py b/examples/code/integrations/zoom/custom_tool.py deleted file mode 100644 index 01cb0edda..000000000 --- a/examples/code/integrations/zoom/custom_tool.py +++ /dev/null @@ -1,28 +0,0 @@ -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() From 0ba0db65d5c9b75b4ad514790f84de5e69183a27 Mon Sep 17 00:00:00 2001 From: Rachel Lee Nabors Date: Tue, 30 Dec 2025 21:13:47 +0000 Subject: [PATCH 02/26] Organize guides and resources. --- .github/scripts/update-example-dates.js | 5 +- .github/workflows/translate-docs.yml | 20 +-- _dictionaries/en.ts | 2 +- app/_components/logo.tsx | 6 +- app/_components/starter-tool-info.tsx | 9 +- app/_components/tool-info.tsx | 4 +- app/en/_meta.tsx | 149 +++--------------- app/en/get-started/_meta.tsx | 9 ++ app/en/get-started/about-arcade/page.mdx | 2 + app/en/get-started/quickstarts/_meta.tsx | 9 ++ app/en/get-started/setup/_meta.tsx | 8 + app/en/get-started/setup/api-keys/page.mdx | 4 +- app/en/guides/_meta.tsx | 24 +++ app/en/guides/agent-frameworks/_meta.tsx | 27 ++++ app/en/guides/agent-frameworks/page.mdx | 39 +---- app/en/guides/create-tools/_meta.tsx | 24 +++ .../registry-early-access/page.mdx | 0 .../registry-early-access/take-survey.tsx | 0 .../create-tools/evaluate-tools/_meta.tsx | 4 +- .../types-of-tools/page.mdx | 0 .../migrate-toolkits/page.mdx | 0 .../guides/create-tools/tool-basics/_meta.tsx | 27 ++++ app/en/guides/deployment-hosting/_meta.tsx | 16 +- app/en/guides/deployment-hosting/page.mdx | 4 +- app/en/guides/tool-calling/_meta.tsx | 18 +++ .../page.mdx | 4 +- .../guides/tool-calling/custom-apps/_meta.tsx | 15 ++ .../page.mdx | 0 app/en/guides/tool-calling/page.mdx | 2 +- app/en/{ => home}/landing-page.tsx | 0 app/en/home/page.mdx | 8 + app/en/page.mdx | 8 - app/en/references/_meta.tsx | 19 +-- app/en/references/auth-providers/_meta.tsx | 10 +- .../changelog/page.mdx | 0 app/en/references/page.mdx | 142 +++++++++++++++++ app/en/references/page.tsx | 144 ----------------- app/en/resources/_meta.tsx | 24 +++ app/en/{ => resources}/integrations/_meta.tsx | 10 +- .../components/coming-soon-modal.tsx | 0 .../integrations/components/filters-bar.tsx | 0 .../integrations/components/tool-card.tsx | 0 .../integrations/components/toolkit-utils.ts | 0 .../integrations/components/toolkits.tsx | 0 .../integrations/components/type-config.tsx | 0 .../components/use-toolkit-filters.ts | 0 .../integrations/contribute-a-server/page.mdx | 0 .../integrations/customer-support/_meta.tsx | 0 .../customer-support/customerio-api/page.mdx | 0 .../customerio-pipelines-api/page.mdx | 0 .../customerio-track-api/page.mdx | 0 .../freshservice-api/page.mdx | 0 .../customer-support/intercom-api/page.mdx | 0 .../customer-support/pagerduty/page.mdx | 0 .../customer-support/pylon/page.mdx | 0 .../customer-support/zendesk/_meta.tsx | 0 .../customer-support/zendesk/page.mdx | 0 .../zendesk/reference/page.mdx | 0 .../integrations/databases/_meta.ts | 0 .../integrations/databases/_meta.tsx | 0 .../databases/clickhouse/page.mdx | 0 .../integrations/databases/mongodb/page.mdx | 0 .../databases/postgres/clickhouse.mdx | 0 .../databases/postgres/mongodb.mdx | 0 .../integrations/databases/postgres/page.mdx | 0 .../databases/weaviate-api/page.mdx | 0 .../integrations/development/_meta.tsx | 0 .../development/arcade-engine-api/page.mdx | 0 .../development/brightdata/page.mdx | 0 .../development/cursor-agents-api/page.mdx | 0 .../development/datadog-api/page.mdx | 0 .../integrations/development/e2b/page.mdx | 0 .../integrations/development/figma/page.mdx | 0 .../development/firecrawl/_meta.tsx | 0 .../development/firecrawl/page.mdx | 0 .../development/firecrawl/reference/page.mdx | 0 .../development/github-api/page.mdx | 0 .../integrations/development/github/page.mdx | 0 .../development/pagerduty-api/page.mdx | 0 .../development/posthog-api/page.mdx | 0 .../development/vercel-api/page.mdx | 0 .../development/zoho-creator-api/page.mdx | 0 .../integrations/entertainment/_meta.tsx | 0 .../entertainment/imgflip/page.mdx | 0 .../entertainment/spotify/imgflip.mdx | 0 .../entertainment/spotify/page.mdx | 0 .../entertainment/twitch/page.mdx | 0 app/en/{ => resources}/integrations/page.mdx | 0 .../integrations/payments/_meta.tsx | 0 .../integrations/payments/stripe/page.mdx | 0 .../integrations/payments/stripe_api/page.mdx | 0 .../payments/zoho-books-api/page.mdx | 0 .../integrations/productivity/_meta.tsx | 0 .../productivity/airtable-api/page.mdx | 0 .../productivity/asana-api/page.mdx | 0 .../integrations/productivity/asana/_meta.tsx | 0 .../integrations/productivity/asana/page.mdx | 0 .../productivity/asana/reference/page.mdx | 0 .../productivity/ashby-api/page.mdx | 0 .../productivity/box-api/page.mdx | 0 .../productivity/calendly-api/page.mdx | 0 .../productivity/clickup-api/page.mdx | 0 .../productivity/clickup/_meta.tsx | 0 .../productivity/clickup/page.mdx | 0 .../productivity/clickup/reference/page.mdx | 0 .../productivity/closeio/page.mdx | 0 .../productivity/confluence/page.mdx | 0 .../productivity/dropbox/_meta.tsx | 0 .../productivity/dropbox/page.mdx | 0 .../productivity/dropbox/reference/page.mdx | 0 .../productivity/figma-api/page.mdx | 0 .../integrations/productivity/gmail/_meta.tsx | 0 .../integrations/productivity/gmail/page.mdx | 0 .../productivity/gmail/reference/page.mdx | 0 .../productivity/google-calendar/_meta.tsx | 0 .../productivity/google-calendar/page.mdx | 0 .../google-calendar/reference/page.mdx | 0 .../productivity/google-contacts/page.mdx | 0 .../productivity/google-docs/_meta.tsx | 0 .../productivity/google-docs/page.mdx | 0 .../google-docs/reference/page.mdx | 0 .../productivity/google-drive/_meta.tsx | 0 .../productivity/google-drive/page.mdx | 0 .../google-drive/reference/page.mdx | 0 .../productivity/google-sheets/_meta.tsx | 0 .../productivity/google-sheets/page.mdx | 0 .../google-sheets/reference/page.mdx | 0 .../productivity/google-slides/page.mdx | 0 .../integrations/productivity/jira/_meta.tsx | 0 .../jira/environment-variables/page.mdx | 0 .../integrations/productivity/jira/page.mdx | 0 .../productivity/jira/reference/page.mdx | 0 .../integrations/productivity/linear/page.mdx | 0 .../productivity/luma-api/page.mdx | 0 .../mailchimp-marketing-api/page.mdx | 0 .../productivity/miro-api/page.mdx | 0 .../integrations/productivity/notion/page.mdx | 0 .../productivity/obsidian/page.mdx | 0 .../productivity/outlook-calendar/page.mdx | 0 .../productivity/outlook-mail/_meta.tsx | 0 .../productivity/outlook-mail/page.mdx | 0 .../outlook-mail/reference/page.mdx | 0 .../productivity/sharepoint/page.mdx | 0 .../productivity/squareup-api/page.mdx | 0 .../productivity/ticktick-api/page.mdx | 0 .../productivity/trello-api/page.mdx | 0 .../productivity/xero-api/page.mdx | 0 .../integrations/sales/_meta.tsx | 0 .../sales/hubspot-automation-api/page.mdx | 0 .../sales/hubspot-cms-api/page.mdx | 0 .../sales/hubspot-conversations-api/page.mdx | 0 .../sales/hubspot-crm-api/page.mdx | 0 .../sales/hubspot-events-api/page.mdx | 0 .../sales/hubspot-marketing-api/page.mdx | 0 .../sales/hubspot-meetings-api/page.mdx | 0 .../sales/hubspot-users-api/page.mdx | 0 .../integrations/sales/hubspot/_meta.tsx | 0 .../integrations/sales/hubspot/page.mdx | 0 .../sales/hubspot/reference/page.mdx | 0 .../integrations/sales/salesforce/page.mdx | 0 .../integrations/search/_meta.tsx | 0 .../integrations/search/exa-api/page.mdx | 0 .../search/google_finance/page.mdx | 0 .../search/google_flights/page.mdx | 0 .../search/google_hotels/page.mdx | 0 .../integrations/search/google_jobs/page.mdx | 0 .../integrations/search/google_maps/page.mdx | 0 .../integrations/search/google_news/page.mdx | 0 .../search/google_search/page.mdx | 0 .../search/google_shopping/page.mdx | 0 .../integrations/search/walmart/page.mdx | 0 .../integrations/search/youtube/page.mdx | 0 .../social-communication/_meta.tsx | 0 .../social-communication/discord/page.mdx | 0 .../social-communication/linkedin/page.mdx | 0 .../microsoft-teams/_meta.tsx | 0 .../microsoft-teams/page.mdx | 0 .../microsoft-teams/reference/page.mdx | 0 .../social-communication/reddit/page.mdx | 0 .../social-communication/slack-api/page.mdx | 0 .../social-communication/slack/_meta.tsx | 0 .../slack/environment-variables/page.mdx | 0 .../slack/install/page.mdx | 0 .../slack/install/slack-auth-link.tsx | 0 .../social-communication/slack/page.mdx | 0 .../slack/reference/page.mdx | 0 .../social-communication/slack_api.mdx | 0 .../social-communication/teams/_meta.tsx | 0 .../teams/reference/page.mdx | 0 .../social-communication/twilio/page.mdx | 0 .../twilio/reference/page.mdx | 0 .../social-communication/x/page.mdx | 0 .../social-communication/zoom/_meta.tsx | 0 .../zoom/install/page.mdx | 0 .../zoom/install/zoom-auth-link.tsx | 0 .../social-communication/zoom/page.mdx | 0 app/layout.tsx | 11 +- app/not-found.tsx | 2 +- next.config.ts | 5 +- tsconfig.json | 5 +- 200 files changed, 442 insertions(+), 377 deletions(-) create mode 100644 app/en/get-started/_meta.tsx create mode 100644 app/en/get-started/quickstarts/_meta.tsx create mode 100644 app/en/get-started/setup/_meta.tsx create mode 100644 app/en/guides/_meta.tsx create mode 100644 app/en/guides/agent-frameworks/_meta.tsx create mode 100644 app/en/guides/create-tools/_meta.tsx rename app/en/guides/create-tools/{add-tools-to-arcade-catalog => contribute}/registry-early-access/page.mdx (100%) rename app/en/guides/create-tools/{add-tools-to-arcade-catalog => contribute}/registry-early-access/take-survey.tsx (100%) rename app/en/guides/create-tools/{performance => improve}/types-of-tools/page.mdx (100%) rename app/en/guides/create-tools/{error-handling => }/migrate-toolkits/page.mdx (100%) create mode 100644 app/en/guides/create-tools/tool-basics/_meta.tsx create mode 100644 app/en/guides/tool-calling/_meta.tsx rename app/en/guides/tool-calling/{call-third-party-apis-directly => call-third-party-apis}/page.mdx (98%) create mode 100644 app/en/guides/tool-calling/custom-apps/_meta.tsx rename app/en/guides/tool-calling/custom-apps/{tool-auth-status => check-auth-status}/page.mdx (100%) rename app/en/{ => home}/landing-page.tsx (100%) create mode 100644 app/en/home/page.mdx delete mode 100644 app/en/page.mdx rename app/en/{resources => references}/changelog/page.mdx (100%) create mode 100644 app/en/references/page.mdx delete mode 100644 app/en/references/page.tsx create mode 100644 app/en/resources/_meta.tsx rename app/en/{ => resources}/integrations/_meta.tsx (88%) rename app/en/{ => resources}/integrations/components/coming-soon-modal.tsx (100%) rename app/en/{ => resources}/integrations/components/filters-bar.tsx (100%) rename app/en/{ => resources}/integrations/components/tool-card.tsx (100%) rename app/en/{ => resources}/integrations/components/toolkit-utils.ts (100%) rename app/en/{ => resources}/integrations/components/toolkits.tsx (100%) rename app/en/{ => resources}/integrations/components/type-config.tsx (100%) rename app/en/{ => resources}/integrations/components/use-toolkit-filters.ts (100%) rename app/en/{ => resources}/integrations/contribute-a-server/page.mdx (100%) rename app/en/{ => resources}/integrations/customer-support/_meta.tsx (100%) rename app/en/{ => resources}/integrations/customer-support/customerio-api/page.mdx (100%) rename app/en/{ => resources}/integrations/customer-support/customerio-pipelines-api/page.mdx (100%) rename app/en/{ => resources}/integrations/customer-support/customerio-track-api/page.mdx (100%) rename app/en/{ => resources}/integrations/customer-support/freshservice-api/page.mdx (100%) rename app/en/{ => resources}/integrations/customer-support/intercom-api/page.mdx (100%) rename app/en/{ => resources}/integrations/customer-support/pagerduty/page.mdx (100%) rename app/en/{ => resources}/integrations/customer-support/pylon/page.mdx (100%) rename app/en/{ => resources}/integrations/customer-support/zendesk/_meta.tsx (100%) rename app/en/{ => resources}/integrations/customer-support/zendesk/page.mdx (100%) rename app/en/{ => resources}/integrations/customer-support/zendesk/reference/page.mdx (100%) rename app/en/{ => resources}/integrations/databases/_meta.ts (100%) rename app/en/{ => resources}/integrations/databases/_meta.tsx (100%) rename app/en/{ => resources}/integrations/databases/clickhouse/page.mdx (100%) rename app/en/{ => resources}/integrations/databases/mongodb/page.mdx (100%) rename app/en/{ => resources}/integrations/databases/postgres/clickhouse.mdx (100%) rename app/en/{ => resources}/integrations/databases/postgres/mongodb.mdx (100%) rename app/en/{ => resources}/integrations/databases/postgres/page.mdx (100%) rename app/en/{ => resources}/integrations/databases/weaviate-api/page.mdx (100%) rename app/en/{ => resources}/integrations/development/_meta.tsx (100%) rename app/en/{ => resources}/integrations/development/arcade-engine-api/page.mdx (100%) rename app/en/{ => resources}/integrations/development/brightdata/page.mdx (100%) rename app/en/{ => resources}/integrations/development/cursor-agents-api/page.mdx (100%) rename app/en/{ => resources}/integrations/development/datadog-api/page.mdx (100%) rename app/en/{ => resources}/integrations/development/e2b/page.mdx (100%) rename app/en/{ => resources}/integrations/development/figma/page.mdx (100%) rename app/en/{ => resources}/integrations/development/firecrawl/_meta.tsx (100%) rename app/en/{ => resources}/integrations/development/firecrawl/page.mdx (100%) rename app/en/{ => resources}/integrations/development/firecrawl/reference/page.mdx (100%) rename app/en/{ => resources}/integrations/development/github-api/page.mdx (100%) rename app/en/{ => resources}/integrations/development/github/page.mdx (100%) rename app/en/{ => resources}/integrations/development/pagerduty-api/page.mdx (100%) rename app/en/{ => resources}/integrations/development/posthog-api/page.mdx (100%) rename app/en/{ => resources}/integrations/development/vercel-api/page.mdx (100%) rename app/en/{ => resources}/integrations/development/zoho-creator-api/page.mdx (100%) rename app/en/{ => resources}/integrations/entertainment/_meta.tsx (100%) rename app/en/{ => resources}/integrations/entertainment/imgflip/page.mdx (100%) rename app/en/{ => resources}/integrations/entertainment/spotify/imgflip.mdx (100%) rename app/en/{ => resources}/integrations/entertainment/spotify/page.mdx (100%) rename app/en/{ => resources}/integrations/entertainment/twitch/page.mdx (100%) rename app/en/{ => resources}/integrations/page.mdx (100%) rename app/en/{ => resources}/integrations/payments/_meta.tsx (100%) rename app/en/{ => resources}/integrations/payments/stripe/page.mdx (100%) rename app/en/{ => resources}/integrations/payments/stripe_api/page.mdx (100%) rename app/en/{ => resources}/integrations/payments/zoho-books-api/page.mdx (100%) rename app/en/{ => resources}/integrations/productivity/_meta.tsx (100%) rename app/en/{ => resources}/integrations/productivity/airtable-api/page.mdx (100%) rename app/en/{ => resources}/integrations/productivity/asana-api/page.mdx (100%) rename app/en/{ => resources}/integrations/productivity/asana/_meta.tsx (100%) rename app/en/{ => resources}/integrations/productivity/asana/page.mdx (100%) rename app/en/{ => resources}/integrations/productivity/asana/reference/page.mdx (100%) rename app/en/{ => resources}/integrations/productivity/ashby-api/page.mdx (100%) rename app/en/{ => resources}/integrations/productivity/box-api/page.mdx (100%) rename app/en/{ => resources}/integrations/productivity/calendly-api/page.mdx (100%) rename app/en/{ => resources}/integrations/productivity/clickup-api/page.mdx (100%) rename app/en/{ => resources}/integrations/productivity/clickup/_meta.tsx (100%) rename app/en/{ => resources}/integrations/productivity/clickup/page.mdx (100%) rename app/en/{ => resources}/integrations/productivity/clickup/reference/page.mdx (100%) rename app/en/{ => resources}/integrations/productivity/closeio/page.mdx (100%) rename app/en/{ => resources}/integrations/productivity/confluence/page.mdx (100%) rename app/en/{ => resources}/integrations/productivity/dropbox/_meta.tsx (100%) rename app/en/{ => resources}/integrations/productivity/dropbox/page.mdx (100%) rename app/en/{ => resources}/integrations/productivity/dropbox/reference/page.mdx (100%) rename app/en/{ => resources}/integrations/productivity/figma-api/page.mdx (100%) rename app/en/{ => resources}/integrations/productivity/gmail/_meta.tsx (100%) rename app/en/{ => resources}/integrations/productivity/gmail/page.mdx (100%) rename app/en/{ => resources}/integrations/productivity/gmail/reference/page.mdx (100%) rename app/en/{ => resources}/integrations/productivity/google-calendar/_meta.tsx (100%) rename app/en/{ => resources}/integrations/productivity/google-calendar/page.mdx (100%) rename app/en/{ => resources}/integrations/productivity/google-calendar/reference/page.mdx (100%) rename app/en/{ => resources}/integrations/productivity/google-contacts/page.mdx (100%) rename app/en/{ => resources}/integrations/productivity/google-docs/_meta.tsx (100%) rename app/en/{ => resources}/integrations/productivity/google-docs/page.mdx (100%) rename app/en/{ => resources}/integrations/productivity/google-docs/reference/page.mdx (100%) rename app/en/{ => resources}/integrations/productivity/google-drive/_meta.tsx (100%) rename app/en/{ => resources}/integrations/productivity/google-drive/page.mdx (100%) rename app/en/{ => resources}/integrations/productivity/google-drive/reference/page.mdx (100%) rename app/en/{ => resources}/integrations/productivity/google-sheets/_meta.tsx (100%) rename app/en/{ => resources}/integrations/productivity/google-sheets/page.mdx (100%) rename app/en/{ => resources}/integrations/productivity/google-sheets/reference/page.mdx (100%) rename app/en/{ => resources}/integrations/productivity/google-slides/page.mdx (100%) rename app/en/{ => resources}/integrations/productivity/jira/_meta.tsx (100%) rename app/en/{ => resources}/integrations/productivity/jira/environment-variables/page.mdx (100%) rename app/en/{ => resources}/integrations/productivity/jira/page.mdx (100%) rename app/en/{ => resources}/integrations/productivity/jira/reference/page.mdx (100%) rename app/en/{ => resources}/integrations/productivity/linear/page.mdx (100%) rename app/en/{ => resources}/integrations/productivity/luma-api/page.mdx (100%) rename app/en/{ => resources}/integrations/productivity/mailchimp-marketing-api/page.mdx (100%) rename app/en/{ => resources}/integrations/productivity/miro-api/page.mdx (100%) rename app/en/{ => resources}/integrations/productivity/notion/page.mdx (100%) rename app/en/{ => resources}/integrations/productivity/obsidian/page.mdx (100%) rename app/en/{ => resources}/integrations/productivity/outlook-calendar/page.mdx (100%) rename app/en/{ => resources}/integrations/productivity/outlook-mail/_meta.tsx (100%) rename app/en/{ => resources}/integrations/productivity/outlook-mail/page.mdx (100%) rename app/en/{ => resources}/integrations/productivity/outlook-mail/reference/page.mdx (100%) rename app/en/{ => resources}/integrations/productivity/sharepoint/page.mdx (100%) rename app/en/{ => resources}/integrations/productivity/squareup-api/page.mdx (100%) rename app/en/{ => resources}/integrations/productivity/ticktick-api/page.mdx (100%) rename app/en/{ => resources}/integrations/productivity/trello-api/page.mdx (100%) rename app/en/{ => resources}/integrations/productivity/xero-api/page.mdx (100%) rename app/en/{ => resources}/integrations/sales/_meta.tsx (100%) rename app/en/{ => resources}/integrations/sales/hubspot-automation-api/page.mdx (100%) rename app/en/{ => resources}/integrations/sales/hubspot-cms-api/page.mdx (100%) rename app/en/{ => resources}/integrations/sales/hubspot-conversations-api/page.mdx (100%) rename app/en/{ => resources}/integrations/sales/hubspot-crm-api/page.mdx (100%) rename app/en/{ => resources}/integrations/sales/hubspot-events-api/page.mdx (100%) rename app/en/{ => resources}/integrations/sales/hubspot-marketing-api/page.mdx (100%) rename app/en/{ => resources}/integrations/sales/hubspot-meetings-api/page.mdx (100%) rename app/en/{ => resources}/integrations/sales/hubspot-users-api/page.mdx (100%) rename app/en/{ => resources}/integrations/sales/hubspot/_meta.tsx (100%) rename app/en/{ => resources}/integrations/sales/hubspot/page.mdx (100%) rename app/en/{ => resources}/integrations/sales/hubspot/reference/page.mdx (100%) rename app/en/{ => resources}/integrations/sales/salesforce/page.mdx (100%) rename app/en/{ => resources}/integrations/search/_meta.tsx (100%) rename app/en/{ => resources}/integrations/search/exa-api/page.mdx (100%) rename app/en/{ => resources}/integrations/search/google_finance/page.mdx (100%) rename app/en/{ => resources}/integrations/search/google_flights/page.mdx (100%) rename app/en/{ => resources}/integrations/search/google_hotels/page.mdx (100%) rename app/en/{ => resources}/integrations/search/google_jobs/page.mdx (100%) rename app/en/{ => resources}/integrations/search/google_maps/page.mdx (100%) rename app/en/{ => resources}/integrations/search/google_news/page.mdx (100%) rename app/en/{ => resources}/integrations/search/google_search/page.mdx (100%) rename app/en/{ => resources}/integrations/search/google_shopping/page.mdx (100%) rename app/en/{ => resources}/integrations/search/walmart/page.mdx (100%) rename app/en/{ => resources}/integrations/search/youtube/page.mdx (100%) rename app/en/{ => resources}/integrations/social-communication/_meta.tsx (100%) rename app/en/{ => resources}/integrations/social-communication/discord/page.mdx (100%) rename app/en/{ => resources}/integrations/social-communication/linkedin/page.mdx (100%) rename app/en/{ => resources}/integrations/social-communication/microsoft-teams/_meta.tsx (100%) rename app/en/{ => resources}/integrations/social-communication/microsoft-teams/page.mdx (100%) rename app/en/{ => resources}/integrations/social-communication/microsoft-teams/reference/page.mdx (100%) rename app/en/{ => resources}/integrations/social-communication/reddit/page.mdx (100%) rename app/en/{ => resources}/integrations/social-communication/slack-api/page.mdx (100%) rename app/en/{ => resources}/integrations/social-communication/slack/_meta.tsx (100%) rename app/en/{ => resources}/integrations/social-communication/slack/environment-variables/page.mdx (100%) rename app/en/{ => resources}/integrations/social-communication/slack/install/page.mdx (100%) rename app/en/{ => resources}/integrations/social-communication/slack/install/slack-auth-link.tsx (100%) rename app/en/{ => resources}/integrations/social-communication/slack/page.mdx (100%) rename app/en/{ => resources}/integrations/social-communication/slack/reference/page.mdx (100%) rename app/en/{ => resources}/integrations/social-communication/slack_api.mdx (100%) rename app/en/{ => resources}/integrations/social-communication/teams/_meta.tsx (100%) rename app/en/{ => resources}/integrations/social-communication/teams/reference/page.mdx (100%) rename app/en/{ => resources}/integrations/social-communication/twilio/page.mdx (100%) rename app/en/{ => resources}/integrations/social-communication/twilio/reference/page.mdx (100%) rename app/en/{ => resources}/integrations/social-communication/x/page.mdx (100%) rename app/en/{ => resources}/integrations/social-communication/zoom/_meta.tsx (100%) rename app/en/{ => resources}/integrations/social-communication/zoom/install/page.mdx (100%) rename app/en/{ => resources}/integrations/social-communication/zoom/install/zoom-auth-link.tsx (100%) rename app/en/{ => resources}/integrations/social-communication/zoom/page.mdx (100%) diff --git a/.github/scripts/update-example-dates.js b/.github/scripts/update-example-dates.js index 4372992f6..a12b6e2ca 100644 --- a/.github/scripts/update-example-dates.js +++ b/.github/scripts/update-example-dates.js @@ -90,7 +90,10 @@ async function updateExampleDates() { console.log("Parsing repositories from MDX file..."); // Read the current MDX file - const mdxPath = path.join(__dirname, "../../app/en/home/examples/page.mdx"); + const mdxPath = path.join( + __dirname, + "../../app/en/resources/examples/page.mdx" + ); let content = fs.readFileSync(mdxPath, "utf8"); // Parse repositories from the MDX file diff --git a/.github/workflows/translate-docs.yml b/.github/workflows/translate-docs.yml index 88eb4bb45..42d545b02 100644 --- a/.github/workflows/translate-docs.yml +++ b/.github/workflows/translate-docs.yml @@ -32,7 +32,7 @@ on: type: boolean single_file: - description: "Single file to translate (relative to app/en, e.g. 'home/page.mdx')" + description: "Single file to translate (relative to app/en, e.g. 'resources/examples/page.mdx')" required: false default: "" type: string @@ -121,14 +121,14 @@ jobs: else echo "Changes detected" echo "has_changes=true" >> $GITHUB_OUTPUT - + # Count changed files CHANGED_FILES=$(git diff --name-only | wc -l) STAGED_FILES=$(git diff --cached --name-only | wc -l) TOTAL_CHANGES=$((CHANGED_FILES + STAGED_FILES)) - + echo "changed_files=$TOTAL_CHANGES" >> $GITHUB_OUTPUT - + # Get list of changed locales CHANGED_LOCALES=$(git diff --name-only | grep -E '^app/(es|pt-BR)/' | cut -d'/' -f2 | sort -u | tr '\n' ',' | sed 's/,$//') if [ -z "$CHANGED_LOCALES" ]; then @@ -213,14 +213,14 @@ jobs: head: '${{ steps.branch_name.outputs.branch_name }}', base: 'main', body: `## 📖 Automated Translation Update - + This PR contains automated translations generated by the GitHub Actions workflow. - + ### 📊 Translation Summary - **Target Locale**: ${{ inputs.target_locale }} - **Files Changed**: ${{ steps.check_changes.outputs.changed_files }} - **Locales Updated**: ${{ steps.check_changes.outputs.changed_locales }} - + ### ⚙️ Configuration Used - **Force Translate**: ${{ inputs.force_translate }} - **Cleanup Deleted Files**: ${{ inputs.cleanup_deleted }} @@ -228,7 +228,7 @@ jobs: - **Single File**: ${{ inputs.single_file || 'None (all files)' }} - **Concurrency**: ${{ inputs.concurrency }} - **Model**: gpt-4o-mini - + ### 🔍 Review Guidelines Please review the translations for: - [ ] Accuracy and context preservation @@ -237,10 +237,10 @@ jobs: - [ ] Code blocks and inline code unchanged - [ ] Markdown formatting preserved - [ ] Brand names (Arcade, Arcade Engine, Control Plane) kept in English - + ### 🚀 Auto-generated This PR was automatically created by the \`translate-docs.yml\` GitHub Action. - + **Triggered by**: @${{ github.actor }} **Workflow Run**: [${{ github.run_id }}](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})`, draft: false diff --git a/_dictionaries/en.ts b/_dictionaries/en.ts index 7fc9453d1..80a45134c 100644 --- a/_dictionaries/en.ts +++ b/_dictionaries/en.ts @@ -9,7 +9,7 @@ export default { lastUpdated: "Last updated on", notFound: "This page could not be found", poweredBy: "Powered by", - editPage: "Edit this page on GitHub →", + editPage: "Edit this page on GitHub", by: "by", banner: { aiTranslation: diff --git a/app/_components/logo.tsx b/app/_components/logo.tsx index ef95b4fac..3fe6c2dbb 100644 --- a/app/_components/logo.tsx +++ b/app/_components/logo.tsx @@ -1,4 +1,4 @@ -import { Arcade, Badge } from "@arcadeai/design-system"; +import { Arcade } from "@arcadeai/design-system"; import ArcadeLogo from "@arcadeai/design-system/assets/images/arcade-logo"; export function Logo() { @@ -6,12 +6,12 @@ export function Logo() { <>
- Docs - + */}
diff --git a/app/_components/starter-tool-info.tsx b/app/_components/starter-tool-info.tsx index fb780f42d..538b7199d 100644 --- a/app/_components/starter-tool-info.tsx +++ b/app/_components/starter-tool-info.tsx @@ -10,7 +10,7 @@ const StarterToolInfo: React.FC = ({ toolkitName }) => (

{toolkitName} is a{" "} - + Starter MCP Server @@ -21,15 +21,16 @@ const StarterToolInfo: React.FC = ({ toolkitName }) => (

Differently from{" "} - + Optimized MCP Servers , 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 tools with your Agents or chatbots before using - it in production. Read more{" "} - about Optimized vs Starter tools. + it in production.{" "} + Read more about + Optimized vs Starter tools.

); diff --git a/app/_components/tool-info.tsx b/app/_components/tool-info.tsx index c0a2020b1..e89ecb3d9 100644 --- a/app/_components/tool-info.tsx +++ b/app/_components/tool-info.tsx @@ -7,8 +7,8 @@ import { } from "@arcadeai/design-system"; import { usePathname } from "next/navigation"; import type React from "react"; -import { findToolkitFromPath } from "../en/mcp-servers/components/toolkit-utils"; -import { TYPE_CONFIG } from "../en/mcp-servers/components/type-config"; +import { findToolkitFromPath } from "../en/resources/integrations/components/toolkit-utils"; +import { TYPE_CONFIG } from "../en/resources/integrations/components/type-config"; type ToolInfoProps = { description: string; diff --git a/app/en/_meta.tsx b/app/en/_meta.tsx index 6f0813653..5c171efd3 100644 --- a/app/en/_meta.tsx +++ b/app/en/_meta.tsx @@ -1,4 +1,11 @@ -import { BadgeHelp, Globe, Home, Shield } from "lucide-react"; +import { + Book, + BookOpen, + GraduationCap, + Home, + Pencil, + Ruler, +} from "lucide-react"; import type { MetaRecord } from "nextra"; function TitleWithIcon({ @@ -9,7 +16,7 @@ function TitleWithIcon({ children: React.ReactNode; }) { return ( - + {children} @@ -22,8 +29,8 @@ export const meta: MetaRecord = { copyPage: true, }, }, - index: { - title: Home, + home: { + title: Docs Home, theme: { breadcrumb: false, layout: "full", @@ -31,134 +38,20 @@ export const meta: MetaRecord = { copyPage: false, }, }, - arcade: { - title: Arcade.dev, - href: "https://arcade.dev", + "get-started": { + title: Get Started, }, - "-- Getting Started": { - type: "separator", - title: "Using Arcade", + resources: { + title: Resources, }, - quickstart: { - title: "Calling tools in your agent", + guides: { + title: Guides, }, - "mcp-gateway-quickstart": { - title: "Call a tool in your IDE/MCP Client", + learn: { + title: Learn, }, - "custom-mcp-server-quickstart": { - title: "Build MCP Server QuickStart", - }, - "api-keys": { - title: "Get an API key", - }, - examples: { - title: "Example agents", - }, - "-- Authoring Tools": { - type: "separator", - title: "Authoring Tools", - }, - "build-tools": { - title: "Build tools", - }, - "evaluate-tools": { - title: "Evaluate tools", - }, - "serve-tools": { - title: "Serve tools", - }, - "-- Agent Frameworks and MCP": { - type: "separator", - title: "Agent Frameworks and MCP", - }, - "agent-frameworks-overview": { - title: "Overview", - }, - "mcp-clients": { - title: "MCP Clients", - }, - langchain: { - title: "LangChain", - }, - crewai: { - title: "CrewAI", - }, - "google-adk": { - title: "Google ADK", - }, - mastra: { - title: "Mastra", - }, - "oai-agents": { - title: "OpenAI Agents", - }, - vercelai: { - title: "Vercel AI", - }, - "-- Core Concepts": { - type: "separator", - title: "Core Concepts", - }, - "use-tools": { - title: "Tool Calling", - }, - auth: { - title: "Authorization", - }, - "mcp-gateways": { - title: "MCP Gateways", - }, - "arcade-cli": { - title: "Arcade CLI", - }, - "-- Hosting options": { - type: "separator", - title: "Hosting options", - }, - "hosting-overview": { - title: "Overview", - }, - deployment: { - title: "Deployment", - }, - "auth-providers": { - title: "Customizing Auth", - }, - "-- Guides": { - type: "separator", - title: "Guides", - }, - glossary: { - title: "Glossary", - }, - faq: { - title: "FAQ", - }, - "compare-server-types": { - title: "Compare Server Types", - }, - "agentic-development": { - title: "Agentic Development", - }, - changelog: { - title: "Changelog", - }, - "-- Registry": { - type: "separator", - title: "Registry", - }, - "registry-early-access": { - title: "Registry Early Access", - }, - "-- Resources": { - type: "separator", - title: "Resources", - }, - "contact-us": { - title: Contact us, - }, - security: { - title: Security, + references: { + title: References, }, }; diff --git a/app/en/get-started/_meta.tsx b/app/en/get-started/_meta.tsx new file mode 100644 index 000000000..e5962ae57 --- /dev/null +++ b/app/en/get-started/_meta.tsx @@ -0,0 +1,9 @@ +import type { MetaRecord } from "nextra"; + +export const meta: MetaRecord = { + "about-arcade": "About Arcade", + setup: "Setup", + quickstarts: "Quickstarts", +}; + +export default meta; diff --git a/app/en/get-started/about-arcade/page.mdx b/app/en/get-started/about-arcade/page.mdx index f3fcc3210..5420436f5 100644 --- a/app/en/get-started/about-arcade/page.mdx +++ b/app/en/get-started/about-arcade/page.mdx @@ -5,6 +5,8 @@ description: "Learn how Arcade helps with auth and tool calling" import { Tabs } from "nextra/components"; +# About Arcade + 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. diff --git a/app/en/get-started/quickstarts/_meta.tsx b/app/en/get-started/quickstarts/_meta.tsx new file mode 100644 index 000000000..d6cf6d833 --- /dev/null +++ b/app/en/get-started/quickstarts/_meta.tsx @@ -0,0 +1,9 @@ +import type { MetaRecord } from "nextra"; + +export const meta: MetaRecord = { + "call-tool-agent": "Call tools in agents", + "call-tool-client": "Call tools in IDE/MCP clients", + "mcp-server-quickstart": "Build an MCP server for custom tools", +}; + +export default meta; diff --git a/app/en/get-started/setup/_meta.tsx b/app/en/get-started/setup/_meta.tsx new file mode 100644 index 000000000..e0ea8f827 --- /dev/null +++ b/app/en/get-started/setup/_meta.tsx @@ -0,0 +1,8 @@ +import type { MetaRecord } from "nextra"; + +export const meta: MetaRecord = { + "api-keys": "Get an API key", + "connect-arcade-docs": "Connect Arcade docs to your IDE", +}; + +export default meta; diff --git a/app/en/get-started/setup/api-keys/page.mdx b/app/en/get-started/setup/api-keys/page.mdx index fc0b263b3..74116da65 100644 --- a/app/en/get-started/setup/api-keys/page.mdx +++ b/app/en/get-started/setup/api-keys/page.mdx @@ -104,5 +104,5 @@ The CLI will automatically: Once you have your API key, you can: -- [Start using tools](/home/quickstart) -- [Create custom tools](/home/build-tools/create-a-mcp-server) +- [Start using tools](/get-started/quickstarts/call-tool-agent) +- [Create custom tools](/guides/create-tools/tool-basics/build-mcp-server) diff --git a/app/en/guides/_meta.tsx b/app/en/guides/_meta.tsx new file mode 100644 index 000000000..bf2e1073b --- /dev/null +++ b/app/en/guides/_meta.tsx @@ -0,0 +1,24 @@ +import type { MetaRecord } from "nextra"; + +export const meta: MetaRecord = { + "tool-calling": { + title: "Call tools", + }, + "create-tools": { + title: "Create tools", + }, + "agent-frameworks": { + title: "Agent frameworks", + }, + "user-facing-agents": { + title: "User-facing agents", + }, + "deployment-hosting": { + title: "Deployment & hosting", + }, + security: { + title: "Security & Compliance", + }, +}; + +export default meta; diff --git a/app/en/guides/agent-frameworks/_meta.tsx b/app/en/guides/agent-frameworks/_meta.tsx new file mode 100644 index 000000000..0781b14df --- /dev/null +++ b/app/en/guides/agent-frameworks/_meta.tsx @@ -0,0 +1,27 @@ +import type { MetaRecord } from "nextra"; + +export const meta: MetaRecord = { + index: { + title: "Overview", + }, + crewai: { + title: "CrewAI", + }, + "google-adk": { + title: "Google ADK", + }, + langchain: { + title: "LangGraph", + }, + mastra: { + title: "Mastra", + }, + "openai-agents": { + title: "OpenAI Agents", + }, + vercelai: { + title: "Vercel AI", + }, +}; + +export default meta; diff --git a/app/en/guides/agent-frameworks/page.mdx b/app/en/guides/agent-frameworks/page.mdx index fd49a55fc..f874a9834 100644 --- a/app/en/guides/agent-frameworks/page.mdx +++ b/app/en/guides/agent-frameworks/page.mdx @@ -13,25 +13,25 @@ Arcade seamlessly integrates with your favorite agent frameworks and MCP clients
@@ -41,50 +41,27 @@ Arcade seamlessly integrates with your favorite agent frameworks and MCP clients - -## MCP Clients - -
- - - -
diff --git a/app/en/guides/create-tools/_meta.tsx b/app/en/guides/create-tools/_meta.tsx new file mode 100644 index 000000000..383a2ed08 --- /dev/null +++ b/app/en/guides/create-tools/_meta.tsx @@ -0,0 +1,24 @@ +import type { MetaRecord } from "nextra"; + +export const meta: MetaRecord = { + "tool-basics": { + title: "Build a tool", + }, + "evaluate-tools": { + title: "Evaluate tools", + }, + improve: { + title: "Improve an existing toolkit", + }, + contribute: { + title: "Contribute to Arcade's tool catalog", + }, + "error-handling": { + title: "Handle errors", + }, + "migrate-toolkits": { + title: "Migrate from toolkits to MCP servers", + }, +}; + +export default meta; diff --git a/app/en/guides/create-tools/add-tools-to-arcade-catalog/registry-early-access/page.mdx b/app/en/guides/create-tools/contribute/registry-early-access/page.mdx similarity index 100% rename from app/en/guides/create-tools/add-tools-to-arcade-catalog/registry-early-access/page.mdx rename to app/en/guides/create-tools/contribute/registry-early-access/page.mdx diff --git a/app/en/guides/create-tools/add-tools-to-arcade-catalog/registry-early-access/take-survey.tsx b/app/en/guides/create-tools/contribute/registry-early-access/take-survey.tsx similarity index 100% rename from app/en/guides/create-tools/add-tools-to-arcade-catalog/registry-early-access/take-survey.tsx rename to app/en/guides/create-tools/contribute/registry-early-access/take-survey.tsx diff --git a/app/en/guides/create-tools/evaluate-tools/_meta.tsx b/app/en/guides/create-tools/evaluate-tools/_meta.tsx index bc4929294..39a1896e7 100644 --- a/app/en/guides/create-tools/evaluate-tools/_meta.tsx +++ b/app/en/guides/create-tools/evaluate-tools/_meta.tsx @@ -1,5 +1,5 @@ export default { - "why-evaluate-tools": "Why evaluate tools?", - "create-an-evaluation-suite": "Create an evaluation suite", + "why-evaluate": "Why evaluate tools?", + "create-evaluation-suite": "Create an evaluation suite", "run-evaluations": "Run evaluations", }; diff --git a/app/en/guides/create-tools/performance/types-of-tools/page.mdx b/app/en/guides/create-tools/improve/types-of-tools/page.mdx similarity index 100% rename from app/en/guides/create-tools/performance/types-of-tools/page.mdx rename to app/en/guides/create-tools/improve/types-of-tools/page.mdx diff --git a/app/en/guides/create-tools/error-handling/migrate-toolkits/page.mdx b/app/en/guides/create-tools/migrate-toolkits/page.mdx similarity index 100% rename from app/en/guides/create-tools/error-handling/migrate-toolkits/page.mdx rename to app/en/guides/create-tools/migrate-toolkits/page.mdx diff --git a/app/en/guides/create-tools/tool-basics/_meta.tsx b/app/en/guides/create-tools/tool-basics/_meta.tsx new file mode 100644 index 000000000..315893266 --- /dev/null +++ b/app/en/guides/create-tools/tool-basics/_meta.tsx @@ -0,0 +1,27 @@ +import type { MetaRecord } from "nextra"; + +export const meta: MetaRecord = { + "compare-server-types": { + title: "Compare MCP server types", + }, + "build-mcp-server": { + title: "Build an MCP Server to write custom tools", + }, + "create-tool-auth": { + title: "Create a tool with auth", + }, + "create-tool-secrets": { + title: "Create a tool with secrets", + }, + "runtime-data-access": { + title: "Access runtime data", + }, + "call-tools-mcp": { + title: "Call tools from MCP clients", + }, + "organize-mcp-tools": { + title: "Organize your MCP server and tools", + }, +}; + +export default meta; diff --git a/app/en/guides/deployment-hosting/_meta.tsx b/app/en/guides/deployment-hosting/_meta.tsx index 33ad997c1..5ba61b455 100644 --- a/app/en/guides/deployment-hosting/_meta.tsx +++ b/app/en/guides/deployment-hosting/_meta.tsx @@ -8,14 +8,20 @@ const meta: MetaRecord = { copyPage: true, }, }, - "arcade-cloud-infra": { - title: "Arcade Cloud Infrastructure", + index: { + title: "Overview", }, - "on-prem-mcp": { + "arcade-cloud": { + title: "Arcade Cloud", + }, + "on-prem": { title: "On-premises MCP servers", }, - "engine-configuration": { - title: "Engine configuration", + "configure-engine": { + title: "Configure Arcade's engine", + }, + "arcade-deploy": { + title: "Arcade Deploy", }, }; diff --git a/app/en/guides/deployment-hosting/page.mdx b/app/en/guides/deployment-hosting/page.mdx index f0d5a05d0..684eca525 100644 --- a/app/en/guides/deployment-hosting/page.mdx +++ b/app/en/guides/deployment-hosting/page.mdx @@ -1,9 +1,9 @@ --- -title: "Hosting Overview" +title: "Overview" description: "Learn about the different ways to host Arcade" --- -# Hosting Options +# Hosting Optoions Overview The easiest and best way to use Arcade is via the Arcade Cloud service - sign up for free at [https://api.arcade.dev](https://api.arcade.dev). However, you might need to connect your tools to local resources (e.g. a local database or filesystem) or keep data within your own infrastructure. Don't worry, Arcade has you covered via either Arcade Cloud or our on-premise deployment options. diff --git a/app/en/guides/tool-calling/_meta.tsx b/app/en/guides/tool-calling/_meta.tsx new file mode 100644 index 000000000..bfef9282b --- /dev/null +++ b/app/en/guides/tool-calling/_meta.tsx @@ -0,0 +1,18 @@ +import type { MetaRecord } from "nextra"; + +export const meta: MetaRecord = { + "error-handling": { + title: "Handling errors", + }, + "call-third-party-apis": { + title: "Call third-party APIs", + }, + "mcp-clients": { + title: "Connect to MCP clients", + }, + "custom-apps": { + title: "In custom applications", + }, +}; + +export default meta; diff --git a/app/en/guides/tool-calling/call-third-party-apis-directly/page.mdx b/app/en/guides/tool-calling/call-third-party-apis/page.mdx similarity index 98% rename from app/en/guides/tool-calling/call-third-party-apis-directly/page.mdx rename to app/en/guides/tool-calling/call-third-party-apis/page.mdx index fbc3d8c23..6a30226c1 100644 --- a/app/en/guides/tool-calling/call-third-party-apis-directly/page.mdx +++ b/app/en/guides/tool-calling/call-third-party-apis/page.mdx @@ -1,12 +1,12 @@ --- -title: "Direct Third-Party API Call" +title: "Directly call third-party APIs" description: "Guide on how to retrieve an authorization token to call third-party APIs directly" --- import { Steps, Tabs, Callout } from "nextra/components"; import { SignupLink } from "@/app/_components/analytics"; -# Direct Third-Party API Call +# Directly call third-party APIs 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: diff --git a/app/en/guides/tool-calling/custom-apps/_meta.tsx b/app/en/guides/tool-calling/custom-apps/_meta.tsx new file mode 100644 index 000000000..46d699feb --- /dev/null +++ b/app/en/guides/tool-calling/custom-apps/_meta.tsx @@ -0,0 +1,15 @@ +import type { MetaRecord } from "nextra"; + +export const meta: MetaRecord = { + "auth-tool-calling": { + title: "Authorize tool calling", + }, + "check-auth-status": { + title: "Check authorization status", + }, + "get-tool-definitions": { + title: "Get formatted tool definitions", + }, +}; + +export default meta; diff --git a/app/en/guides/tool-calling/custom-apps/tool-auth-status/page.mdx b/app/en/guides/tool-calling/custom-apps/check-auth-status/page.mdx similarity index 100% rename from app/en/guides/tool-calling/custom-apps/tool-auth-status/page.mdx rename to app/en/guides/tool-calling/custom-apps/check-auth-status/page.mdx diff --git a/app/en/guides/tool-calling/page.mdx b/app/en/guides/tool-calling/page.mdx index 231f09542..43cd141e0 100644 --- a/app/en/guides/tool-calling/page.mdx +++ b/app/en/guides/tool-calling/page.mdx @@ -1,5 +1,5 @@ --- -title: "What are tools?" +title: "Overview" description: Overview of language model tool calling and how to use tools with Arcade --- diff --git a/app/en/landing-page.tsx b/app/en/home/landing-page.tsx similarity index 100% rename from app/en/landing-page.tsx rename to app/en/home/landing-page.tsx diff --git a/app/en/home/page.mdx b/app/en/home/page.mdx new file mode 100644 index 000000000..aa86f7fa6 --- /dev/null +++ b/app/en/home/page.mdx @@ -0,0 +1,8 @@ +--- +title: "Arcade Docs" +description: "Guides, resources, sample agents, and references for Arcade auth providers and MCP servers for agents and developers." +--- + +import { LandingPage } from "./landing-page"; + + diff --git a/app/en/page.mdx b/app/en/page.mdx deleted file mode 100644 index fc5fdcfda..000000000 --- a/app/en/page.mdx +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: "Arcade Docs" -description: "Welcome to the Arcade Docs! Here you'll find everything you need to know about Arcade." ---- - -import { LandingPage } from "./landing-page"; - - diff --git a/app/en/references/_meta.tsx b/app/en/references/_meta.tsx index 18bfa648f..389b175ef 100644 --- a/app/en/references/_meta.tsx +++ b/app/en/references/_meta.tsx @@ -1,16 +1,11 @@ import type { MetaRecord } from "nextra"; export const meta: MetaRecord = { - "*": { - theme: { - breadcrumb: false, - layout: "full", - toc: false, - copyPage: false, - }, - }, index: { - title: "Reference Index", + title: "Overview", + }, + changelog: { + title: "Changelog", }, api: { title: "API", @@ -18,6 +13,12 @@ export const meta: MetaRecord = { mcp: { title: "Arcade MCP", }, + "arcade-cli": { + title: "Arcade CLI", + }, + "auth-providers": { + title: "Auth Providers", + }, }; export default meta; diff --git a/app/en/references/auth-providers/_meta.tsx b/app/en/references/auth-providers/_meta.tsx index 1f7f920c8..89d0266eb 100644 --- a/app/en/references/auth-providers/_meta.tsx +++ b/app/en/references/auth-providers/_meta.tsx @@ -1,16 +1,12 @@ import type { MetaRecord } from "nextra"; const meta: MetaRecord = { - "*": { - theme: { - breadcrumb: true, - toc: true, - copyPage: true, - }, - }, index: { title: "Overview", }, + oauth2: { + title: "OAuth 2.0", + }, }; export default meta; diff --git a/app/en/resources/changelog/page.mdx b/app/en/references/changelog/page.mdx similarity index 100% rename from app/en/resources/changelog/page.mdx rename to app/en/references/changelog/page.mdx diff --git a/app/en/references/page.mdx b/app/en/references/page.mdx new file mode 100644 index 000000000..5076e7e98 --- /dev/null +++ b/app/en/references/page.mdx @@ -0,0 +1,142 @@ +--- +title: References +description: Complete reference documentation for Arcade's APIs, MCP servers, and available auth providers. +--- + +import { Button } from "@arcadeai/design-system"; +import Link from "next/link"; + +# References + +Complete reference documentation for Arcade's APIs, MCP servers, and available auth providers. + +
+
+ +
+ {/* Engine API Section */} +
+

+ API +

+

+ Arcade's REST API is for orchestrating tools, managing + authentication, and controlling agent workflows at runtime. Use + this API to integrate Arcade's tool execution and permission + management into your agent applications. +

+
+ +
+
+ + {/* MCP Server SDK Section */} +
+

+ Arcade MCP (MCP Server SDK) +

+

+ Arcade MCP, the secure framework for building MCP servers, + provides a FastAPI-like interface for creating custom tools and + exposing them through the standardized MCP protocol. +

+
+ +
+
+ + {/* Arcade Clients Section */} +
+

+ 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 */} +
+

+ Python Client +

+

+ Install with: +

+ + pip install arcadepy + + + Learn more about the Python Client + +
+ + {/* JavaScript / TypeScript Client */} +
+

+ JavaScript / TypeScript Client +

+

+ Install with: +

+ + npm install @arcadeai/arcadejs + + + Learn more about the JavaScript / TypeScript Client + +
+ + {/* Go Client */} +
+

+ Go Client +

+

+ Install with: +

+ + go get -u 'github.com/ArcadeAI/arcade-go' + + + Learn more about the Go Client + +
+
+ +

+ Note: MCP-compatible versions of these clients are in development + and will be documented soon. +

+
+
+
+
diff --git a/app/en/references/page.tsx b/app/en/references/page.tsx deleted file mode 100644 index 8d27f7ae1..000000000 --- a/app/en/references/page.tsx +++ /dev/null @@ -1,144 +0,0 @@ -"use client"; -import { Button } from "@arcadeai/design-system"; -import Link from "next/link"; - -export default function APIReferencePage() { - return ( -
-
-

- API Reference -

-

- Complete reference documentation for Arcade's APIs and SDKs. -

- -
- {/* Engine API Section */} -
-

- API -

-

- Arcade's REST API is for orchestrating tools, managing - authentication, and controlling agent workflows at runtime. Use - this API to integrate Arcade's tool execution and permission - management into your agent applications. -

-
- -
-
- - {/* MCP Server SDK Section */} -
-

- Arcade MCP (MCP Server SDK) -

-

- Arcade MCP, the secure framework for building MCP servers, - provides a FastAPI-like interface for creating custom tools and - exposing them through the standardized MCP protocol. -

-
- -
-
- - {/* Arcade Clients Section */} -
-

- 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 */} -
-

- Python Client -

-

- Install with: -

- - pip install arcadepy - - - Learn more about the Python Client - -
- - {/* JavaScript / TypeScript Client */} -
-

- JavaScript / TypeScript Client -

-

- Install with: -

- - npm install @arcadeai/arcadejs - - - Learn more about the JavaScript / TypeScript Client - -
- - {/* Go Client */} -
-

- Go Client -

-

- Install with: -

- - go get -u 'github.com/ArcadeAI/arcade-go' - - - Learn more about the Go Client - -
-
- -

- Note: MCP-compatible versions of these clients are in development - and will be documented soon. -

-
-
-
-
- ); -} diff --git a/app/en/resources/_meta.tsx b/app/en/resources/_meta.tsx new file mode 100644 index 000000000..51d652ef8 --- /dev/null +++ b/app/en/resources/_meta.tsx @@ -0,0 +1,24 @@ +import type { MetaRecord } from "nextra"; + +export const meta: MetaRecord = { + integrations: { + title: "Integrations", + }, + examples: { + title: "Examples", + }, + tools: { + title: "Tools", + }, + glossary: { + title: "Glossary", + }, + faq: { + title: "FAQ", + }, + "contact-us": { + title: "Contact", + }, +}; + +export default meta; diff --git a/app/en/integrations/_meta.tsx b/app/en/resources/integrations/_meta.tsx similarity index 88% rename from app/en/integrations/_meta.tsx rename to app/en/resources/integrations/_meta.tsx index fa23a3ebe..37a80528c 100644 --- a/app/en/integrations/_meta.tsx +++ b/app/en/resources/integrations/_meta.tsx @@ -11,15 +11,12 @@ const meta: MetaRecord = { index: { title: "Overview", theme: { - breadcrumb: false, - layout: "full", toc: false, copyPage: false, }, }, - "-- Categories": { - type: "separator", - title: "Categories", + "contribute-a-server": { + title: "Contribute a Server", }, productivity: { title: "Productivity & Docs", @@ -52,9 +49,6 @@ const meta: MetaRecord = { type: "separator", title: "Submit your Server", }, - "contribute-a-server": { - title: "Contribute a Server", - }, }; export default meta; diff --git a/app/en/integrations/components/coming-soon-modal.tsx b/app/en/resources/integrations/components/coming-soon-modal.tsx similarity index 100% rename from app/en/integrations/components/coming-soon-modal.tsx rename to app/en/resources/integrations/components/coming-soon-modal.tsx diff --git a/app/en/integrations/components/filters-bar.tsx b/app/en/resources/integrations/components/filters-bar.tsx similarity index 100% rename from app/en/integrations/components/filters-bar.tsx rename to app/en/resources/integrations/components/filters-bar.tsx diff --git a/app/en/integrations/components/tool-card.tsx b/app/en/resources/integrations/components/tool-card.tsx similarity index 100% rename from app/en/integrations/components/tool-card.tsx rename to app/en/resources/integrations/components/tool-card.tsx diff --git a/app/en/integrations/components/toolkit-utils.ts b/app/en/resources/integrations/components/toolkit-utils.ts similarity index 100% rename from app/en/integrations/components/toolkit-utils.ts rename to app/en/resources/integrations/components/toolkit-utils.ts diff --git a/app/en/integrations/components/toolkits.tsx b/app/en/resources/integrations/components/toolkits.tsx similarity index 100% rename from app/en/integrations/components/toolkits.tsx rename to app/en/resources/integrations/components/toolkits.tsx diff --git a/app/en/integrations/components/type-config.tsx b/app/en/resources/integrations/components/type-config.tsx similarity index 100% rename from app/en/integrations/components/type-config.tsx rename to app/en/resources/integrations/components/type-config.tsx diff --git a/app/en/integrations/components/use-toolkit-filters.ts b/app/en/resources/integrations/components/use-toolkit-filters.ts similarity index 100% rename from app/en/integrations/components/use-toolkit-filters.ts rename to app/en/resources/integrations/components/use-toolkit-filters.ts diff --git a/app/en/integrations/contribute-a-server/page.mdx b/app/en/resources/integrations/contribute-a-server/page.mdx similarity index 100% rename from app/en/integrations/contribute-a-server/page.mdx rename to app/en/resources/integrations/contribute-a-server/page.mdx diff --git a/app/en/integrations/customer-support/_meta.tsx b/app/en/resources/integrations/customer-support/_meta.tsx similarity index 100% rename from app/en/integrations/customer-support/_meta.tsx rename to app/en/resources/integrations/customer-support/_meta.tsx diff --git a/app/en/integrations/customer-support/customerio-api/page.mdx b/app/en/resources/integrations/customer-support/customerio-api/page.mdx similarity index 100% rename from app/en/integrations/customer-support/customerio-api/page.mdx rename to app/en/resources/integrations/customer-support/customerio-api/page.mdx diff --git a/app/en/integrations/customer-support/customerio-pipelines-api/page.mdx b/app/en/resources/integrations/customer-support/customerio-pipelines-api/page.mdx similarity index 100% rename from app/en/integrations/customer-support/customerio-pipelines-api/page.mdx rename to app/en/resources/integrations/customer-support/customerio-pipelines-api/page.mdx diff --git a/app/en/integrations/customer-support/customerio-track-api/page.mdx b/app/en/resources/integrations/customer-support/customerio-track-api/page.mdx similarity index 100% rename from app/en/integrations/customer-support/customerio-track-api/page.mdx rename to app/en/resources/integrations/customer-support/customerio-track-api/page.mdx diff --git a/app/en/integrations/customer-support/freshservice-api/page.mdx b/app/en/resources/integrations/customer-support/freshservice-api/page.mdx similarity index 100% rename from app/en/integrations/customer-support/freshservice-api/page.mdx rename to app/en/resources/integrations/customer-support/freshservice-api/page.mdx diff --git a/app/en/integrations/customer-support/intercom-api/page.mdx b/app/en/resources/integrations/customer-support/intercom-api/page.mdx similarity index 100% rename from app/en/integrations/customer-support/intercom-api/page.mdx rename to app/en/resources/integrations/customer-support/intercom-api/page.mdx diff --git a/app/en/integrations/customer-support/pagerduty/page.mdx b/app/en/resources/integrations/customer-support/pagerduty/page.mdx similarity index 100% rename from app/en/integrations/customer-support/pagerduty/page.mdx rename to app/en/resources/integrations/customer-support/pagerduty/page.mdx diff --git a/app/en/integrations/customer-support/pylon/page.mdx b/app/en/resources/integrations/customer-support/pylon/page.mdx similarity index 100% rename from app/en/integrations/customer-support/pylon/page.mdx rename to app/en/resources/integrations/customer-support/pylon/page.mdx diff --git a/app/en/integrations/customer-support/zendesk/_meta.tsx b/app/en/resources/integrations/customer-support/zendesk/_meta.tsx similarity index 100% rename from app/en/integrations/customer-support/zendesk/_meta.tsx rename to app/en/resources/integrations/customer-support/zendesk/_meta.tsx diff --git a/app/en/integrations/customer-support/zendesk/page.mdx b/app/en/resources/integrations/customer-support/zendesk/page.mdx similarity index 100% rename from app/en/integrations/customer-support/zendesk/page.mdx rename to app/en/resources/integrations/customer-support/zendesk/page.mdx diff --git a/app/en/integrations/customer-support/zendesk/reference/page.mdx b/app/en/resources/integrations/customer-support/zendesk/reference/page.mdx similarity index 100% rename from app/en/integrations/customer-support/zendesk/reference/page.mdx rename to app/en/resources/integrations/customer-support/zendesk/reference/page.mdx diff --git a/app/en/integrations/databases/_meta.ts b/app/en/resources/integrations/databases/_meta.ts similarity index 100% rename from app/en/integrations/databases/_meta.ts rename to app/en/resources/integrations/databases/_meta.ts diff --git a/app/en/integrations/databases/_meta.tsx b/app/en/resources/integrations/databases/_meta.tsx similarity index 100% rename from app/en/integrations/databases/_meta.tsx rename to app/en/resources/integrations/databases/_meta.tsx diff --git a/app/en/integrations/databases/clickhouse/page.mdx b/app/en/resources/integrations/databases/clickhouse/page.mdx similarity index 100% rename from app/en/integrations/databases/clickhouse/page.mdx rename to app/en/resources/integrations/databases/clickhouse/page.mdx diff --git a/app/en/integrations/databases/mongodb/page.mdx b/app/en/resources/integrations/databases/mongodb/page.mdx similarity index 100% rename from app/en/integrations/databases/mongodb/page.mdx rename to app/en/resources/integrations/databases/mongodb/page.mdx diff --git a/app/en/integrations/databases/postgres/clickhouse.mdx b/app/en/resources/integrations/databases/postgres/clickhouse.mdx similarity index 100% rename from app/en/integrations/databases/postgres/clickhouse.mdx rename to app/en/resources/integrations/databases/postgres/clickhouse.mdx diff --git a/app/en/integrations/databases/postgres/mongodb.mdx b/app/en/resources/integrations/databases/postgres/mongodb.mdx similarity index 100% rename from app/en/integrations/databases/postgres/mongodb.mdx rename to app/en/resources/integrations/databases/postgres/mongodb.mdx diff --git a/app/en/integrations/databases/postgres/page.mdx b/app/en/resources/integrations/databases/postgres/page.mdx similarity index 100% rename from app/en/integrations/databases/postgres/page.mdx rename to app/en/resources/integrations/databases/postgres/page.mdx diff --git a/app/en/integrations/databases/weaviate-api/page.mdx b/app/en/resources/integrations/databases/weaviate-api/page.mdx similarity index 100% rename from app/en/integrations/databases/weaviate-api/page.mdx rename to app/en/resources/integrations/databases/weaviate-api/page.mdx diff --git a/app/en/integrations/development/_meta.tsx b/app/en/resources/integrations/development/_meta.tsx similarity index 100% rename from app/en/integrations/development/_meta.tsx rename to app/en/resources/integrations/development/_meta.tsx diff --git a/app/en/integrations/development/arcade-engine-api/page.mdx b/app/en/resources/integrations/development/arcade-engine-api/page.mdx similarity index 100% rename from app/en/integrations/development/arcade-engine-api/page.mdx rename to app/en/resources/integrations/development/arcade-engine-api/page.mdx diff --git a/app/en/integrations/development/brightdata/page.mdx b/app/en/resources/integrations/development/brightdata/page.mdx similarity index 100% rename from app/en/integrations/development/brightdata/page.mdx rename to app/en/resources/integrations/development/brightdata/page.mdx diff --git a/app/en/integrations/development/cursor-agents-api/page.mdx b/app/en/resources/integrations/development/cursor-agents-api/page.mdx similarity index 100% rename from app/en/integrations/development/cursor-agents-api/page.mdx rename to app/en/resources/integrations/development/cursor-agents-api/page.mdx diff --git a/app/en/integrations/development/datadog-api/page.mdx b/app/en/resources/integrations/development/datadog-api/page.mdx similarity index 100% rename from app/en/integrations/development/datadog-api/page.mdx rename to app/en/resources/integrations/development/datadog-api/page.mdx diff --git a/app/en/integrations/development/e2b/page.mdx b/app/en/resources/integrations/development/e2b/page.mdx similarity index 100% rename from app/en/integrations/development/e2b/page.mdx rename to app/en/resources/integrations/development/e2b/page.mdx diff --git a/app/en/integrations/development/figma/page.mdx b/app/en/resources/integrations/development/figma/page.mdx similarity index 100% rename from app/en/integrations/development/figma/page.mdx rename to app/en/resources/integrations/development/figma/page.mdx diff --git a/app/en/integrations/development/firecrawl/_meta.tsx b/app/en/resources/integrations/development/firecrawl/_meta.tsx similarity index 100% rename from app/en/integrations/development/firecrawl/_meta.tsx rename to app/en/resources/integrations/development/firecrawl/_meta.tsx diff --git a/app/en/integrations/development/firecrawl/page.mdx b/app/en/resources/integrations/development/firecrawl/page.mdx similarity index 100% rename from app/en/integrations/development/firecrawl/page.mdx rename to app/en/resources/integrations/development/firecrawl/page.mdx diff --git a/app/en/integrations/development/firecrawl/reference/page.mdx b/app/en/resources/integrations/development/firecrawl/reference/page.mdx similarity index 100% rename from app/en/integrations/development/firecrawl/reference/page.mdx rename to app/en/resources/integrations/development/firecrawl/reference/page.mdx diff --git a/app/en/integrations/development/github-api/page.mdx b/app/en/resources/integrations/development/github-api/page.mdx similarity index 100% rename from app/en/integrations/development/github-api/page.mdx rename to app/en/resources/integrations/development/github-api/page.mdx diff --git a/app/en/integrations/development/github/page.mdx b/app/en/resources/integrations/development/github/page.mdx similarity index 100% rename from app/en/integrations/development/github/page.mdx rename to app/en/resources/integrations/development/github/page.mdx diff --git a/app/en/integrations/development/pagerduty-api/page.mdx b/app/en/resources/integrations/development/pagerduty-api/page.mdx similarity index 100% rename from app/en/integrations/development/pagerduty-api/page.mdx rename to app/en/resources/integrations/development/pagerduty-api/page.mdx diff --git a/app/en/integrations/development/posthog-api/page.mdx b/app/en/resources/integrations/development/posthog-api/page.mdx similarity index 100% rename from app/en/integrations/development/posthog-api/page.mdx rename to app/en/resources/integrations/development/posthog-api/page.mdx diff --git a/app/en/integrations/development/vercel-api/page.mdx b/app/en/resources/integrations/development/vercel-api/page.mdx similarity index 100% rename from app/en/integrations/development/vercel-api/page.mdx rename to app/en/resources/integrations/development/vercel-api/page.mdx diff --git a/app/en/integrations/development/zoho-creator-api/page.mdx b/app/en/resources/integrations/development/zoho-creator-api/page.mdx similarity index 100% rename from app/en/integrations/development/zoho-creator-api/page.mdx rename to app/en/resources/integrations/development/zoho-creator-api/page.mdx diff --git a/app/en/integrations/entertainment/_meta.tsx b/app/en/resources/integrations/entertainment/_meta.tsx similarity index 100% rename from app/en/integrations/entertainment/_meta.tsx rename to app/en/resources/integrations/entertainment/_meta.tsx diff --git a/app/en/integrations/entertainment/imgflip/page.mdx b/app/en/resources/integrations/entertainment/imgflip/page.mdx similarity index 100% rename from app/en/integrations/entertainment/imgflip/page.mdx rename to app/en/resources/integrations/entertainment/imgflip/page.mdx diff --git a/app/en/integrations/entertainment/spotify/imgflip.mdx b/app/en/resources/integrations/entertainment/spotify/imgflip.mdx similarity index 100% rename from app/en/integrations/entertainment/spotify/imgflip.mdx rename to app/en/resources/integrations/entertainment/spotify/imgflip.mdx diff --git a/app/en/integrations/entertainment/spotify/page.mdx b/app/en/resources/integrations/entertainment/spotify/page.mdx similarity index 100% rename from app/en/integrations/entertainment/spotify/page.mdx rename to app/en/resources/integrations/entertainment/spotify/page.mdx diff --git a/app/en/integrations/entertainment/twitch/page.mdx b/app/en/resources/integrations/entertainment/twitch/page.mdx similarity index 100% rename from app/en/integrations/entertainment/twitch/page.mdx rename to app/en/resources/integrations/entertainment/twitch/page.mdx diff --git a/app/en/integrations/page.mdx b/app/en/resources/integrations/page.mdx similarity index 100% rename from app/en/integrations/page.mdx rename to app/en/resources/integrations/page.mdx diff --git a/app/en/integrations/payments/_meta.tsx b/app/en/resources/integrations/payments/_meta.tsx similarity index 100% rename from app/en/integrations/payments/_meta.tsx rename to app/en/resources/integrations/payments/_meta.tsx diff --git a/app/en/integrations/payments/stripe/page.mdx b/app/en/resources/integrations/payments/stripe/page.mdx similarity index 100% rename from app/en/integrations/payments/stripe/page.mdx rename to app/en/resources/integrations/payments/stripe/page.mdx diff --git a/app/en/integrations/payments/stripe_api/page.mdx b/app/en/resources/integrations/payments/stripe_api/page.mdx similarity index 100% rename from app/en/integrations/payments/stripe_api/page.mdx rename to app/en/resources/integrations/payments/stripe_api/page.mdx diff --git a/app/en/integrations/payments/zoho-books-api/page.mdx b/app/en/resources/integrations/payments/zoho-books-api/page.mdx similarity index 100% rename from app/en/integrations/payments/zoho-books-api/page.mdx rename to app/en/resources/integrations/payments/zoho-books-api/page.mdx diff --git a/app/en/integrations/productivity/_meta.tsx b/app/en/resources/integrations/productivity/_meta.tsx similarity index 100% rename from app/en/integrations/productivity/_meta.tsx rename to app/en/resources/integrations/productivity/_meta.tsx diff --git a/app/en/integrations/productivity/airtable-api/page.mdx b/app/en/resources/integrations/productivity/airtable-api/page.mdx similarity index 100% rename from app/en/integrations/productivity/airtable-api/page.mdx rename to app/en/resources/integrations/productivity/airtable-api/page.mdx diff --git a/app/en/integrations/productivity/asana-api/page.mdx b/app/en/resources/integrations/productivity/asana-api/page.mdx similarity index 100% rename from app/en/integrations/productivity/asana-api/page.mdx rename to app/en/resources/integrations/productivity/asana-api/page.mdx diff --git a/app/en/integrations/productivity/asana/_meta.tsx b/app/en/resources/integrations/productivity/asana/_meta.tsx similarity index 100% rename from app/en/integrations/productivity/asana/_meta.tsx rename to app/en/resources/integrations/productivity/asana/_meta.tsx diff --git a/app/en/integrations/productivity/asana/page.mdx b/app/en/resources/integrations/productivity/asana/page.mdx similarity index 100% rename from app/en/integrations/productivity/asana/page.mdx rename to app/en/resources/integrations/productivity/asana/page.mdx diff --git a/app/en/integrations/productivity/asana/reference/page.mdx b/app/en/resources/integrations/productivity/asana/reference/page.mdx similarity index 100% rename from app/en/integrations/productivity/asana/reference/page.mdx rename to app/en/resources/integrations/productivity/asana/reference/page.mdx diff --git a/app/en/integrations/productivity/ashby-api/page.mdx b/app/en/resources/integrations/productivity/ashby-api/page.mdx similarity index 100% rename from app/en/integrations/productivity/ashby-api/page.mdx rename to app/en/resources/integrations/productivity/ashby-api/page.mdx diff --git a/app/en/integrations/productivity/box-api/page.mdx b/app/en/resources/integrations/productivity/box-api/page.mdx similarity index 100% rename from app/en/integrations/productivity/box-api/page.mdx rename to app/en/resources/integrations/productivity/box-api/page.mdx diff --git a/app/en/integrations/productivity/calendly-api/page.mdx b/app/en/resources/integrations/productivity/calendly-api/page.mdx similarity index 100% rename from app/en/integrations/productivity/calendly-api/page.mdx rename to app/en/resources/integrations/productivity/calendly-api/page.mdx diff --git a/app/en/integrations/productivity/clickup-api/page.mdx b/app/en/resources/integrations/productivity/clickup-api/page.mdx similarity index 100% rename from app/en/integrations/productivity/clickup-api/page.mdx rename to app/en/resources/integrations/productivity/clickup-api/page.mdx diff --git a/app/en/integrations/productivity/clickup/_meta.tsx b/app/en/resources/integrations/productivity/clickup/_meta.tsx similarity index 100% rename from app/en/integrations/productivity/clickup/_meta.tsx rename to app/en/resources/integrations/productivity/clickup/_meta.tsx diff --git a/app/en/integrations/productivity/clickup/page.mdx b/app/en/resources/integrations/productivity/clickup/page.mdx similarity index 100% rename from app/en/integrations/productivity/clickup/page.mdx rename to app/en/resources/integrations/productivity/clickup/page.mdx diff --git a/app/en/integrations/productivity/clickup/reference/page.mdx b/app/en/resources/integrations/productivity/clickup/reference/page.mdx similarity index 100% rename from app/en/integrations/productivity/clickup/reference/page.mdx rename to app/en/resources/integrations/productivity/clickup/reference/page.mdx diff --git a/app/en/integrations/productivity/closeio/page.mdx b/app/en/resources/integrations/productivity/closeio/page.mdx similarity index 100% rename from app/en/integrations/productivity/closeio/page.mdx rename to app/en/resources/integrations/productivity/closeio/page.mdx diff --git a/app/en/integrations/productivity/confluence/page.mdx b/app/en/resources/integrations/productivity/confluence/page.mdx similarity index 100% rename from app/en/integrations/productivity/confluence/page.mdx rename to app/en/resources/integrations/productivity/confluence/page.mdx diff --git a/app/en/integrations/productivity/dropbox/_meta.tsx b/app/en/resources/integrations/productivity/dropbox/_meta.tsx similarity index 100% rename from app/en/integrations/productivity/dropbox/_meta.tsx rename to app/en/resources/integrations/productivity/dropbox/_meta.tsx diff --git a/app/en/integrations/productivity/dropbox/page.mdx b/app/en/resources/integrations/productivity/dropbox/page.mdx similarity index 100% rename from app/en/integrations/productivity/dropbox/page.mdx rename to app/en/resources/integrations/productivity/dropbox/page.mdx diff --git a/app/en/integrations/productivity/dropbox/reference/page.mdx b/app/en/resources/integrations/productivity/dropbox/reference/page.mdx similarity index 100% rename from app/en/integrations/productivity/dropbox/reference/page.mdx rename to app/en/resources/integrations/productivity/dropbox/reference/page.mdx diff --git a/app/en/integrations/productivity/figma-api/page.mdx b/app/en/resources/integrations/productivity/figma-api/page.mdx similarity index 100% rename from app/en/integrations/productivity/figma-api/page.mdx rename to app/en/resources/integrations/productivity/figma-api/page.mdx diff --git a/app/en/integrations/productivity/gmail/_meta.tsx b/app/en/resources/integrations/productivity/gmail/_meta.tsx similarity index 100% rename from app/en/integrations/productivity/gmail/_meta.tsx rename to app/en/resources/integrations/productivity/gmail/_meta.tsx diff --git a/app/en/integrations/productivity/gmail/page.mdx b/app/en/resources/integrations/productivity/gmail/page.mdx similarity index 100% rename from app/en/integrations/productivity/gmail/page.mdx rename to app/en/resources/integrations/productivity/gmail/page.mdx diff --git a/app/en/integrations/productivity/gmail/reference/page.mdx b/app/en/resources/integrations/productivity/gmail/reference/page.mdx similarity index 100% rename from app/en/integrations/productivity/gmail/reference/page.mdx rename to app/en/resources/integrations/productivity/gmail/reference/page.mdx diff --git a/app/en/integrations/productivity/google-calendar/_meta.tsx b/app/en/resources/integrations/productivity/google-calendar/_meta.tsx similarity index 100% rename from app/en/integrations/productivity/google-calendar/_meta.tsx rename to app/en/resources/integrations/productivity/google-calendar/_meta.tsx diff --git a/app/en/integrations/productivity/google-calendar/page.mdx b/app/en/resources/integrations/productivity/google-calendar/page.mdx similarity index 100% rename from app/en/integrations/productivity/google-calendar/page.mdx rename to app/en/resources/integrations/productivity/google-calendar/page.mdx diff --git a/app/en/integrations/productivity/google-calendar/reference/page.mdx b/app/en/resources/integrations/productivity/google-calendar/reference/page.mdx similarity index 100% rename from app/en/integrations/productivity/google-calendar/reference/page.mdx rename to app/en/resources/integrations/productivity/google-calendar/reference/page.mdx diff --git a/app/en/integrations/productivity/google-contacts/page.mdx b/app/en/resources/integrations/productivity/google-contacts/page.mdx similarity index 100% rename from app/en/integrations/productivity/google-contacts/page.mdx rename to app/en/resources/integrations/productivity/google-contacts/page.mdx diff --git a/app/en/integrations/productivity/google-docs/_meta.tsx b/app/en/resources/integrations/productivity/google-docs/_meta.tsx similarity index 100% rename from app/en/integrations/productivity/google-docs/_meta.tsx rename to app/en/resources/integrations/productivity/google-docs/_meta.tsx diff --git a/app/en/integrations/productivity/google-docs/page.mdx b/app/en/resources/integrations/productivity/google-docs/page.mdx similarity index 100% rename from app/en/integrations/productivity/google-docs/page.mdx rename to app/en/resources/integrations/productivity/google-docs/page.mdx diff --git a/app/en/integrations/productivity/google-docs/reference/page.mdx b/app/en/resources/integrations/productivity/google-docs/reference/page.mdx similarity index 100% rename from app/en/integrations/productivity/google-docs/reference/page.mdx rename to app/en/resources/integrations/productivity/google-docs/reference/page.mdx diff --git a/app/en/integrations/productivity/google-drive/_meta.tsx b/app/en/resources/integrations/productivity/google-drive/_meta.tsx similarity index 100% rename from app/en/integrations/productivity/google-drive/_meta.tsx rename to app/en/resources/integrations/productivity/google-drive/_meta.tsx diff --git a/app/en/integrations/productivity/google-drive/page.mdx b/app/en/resources/integrations/productivity/google-drive/page.mdx similarity index 100% rename from app/en/integrations/productivity/google-drive/page.mdx rename to app/en/resources/integrations/productivity/google-drive/page.mdx diff --git a/app/en/integrations/productivity/google-drive/reference/page.mdx b/app/en/resources/integrations/productivity/google-drive/reference/page.mdx similarity index 100% rename from app/en/integrations/productivity/google-drive/reference/page.mdx rename to app/en/resources/integrations/productivity/google-drive/reference/page.mdx diff --git a/app/en/integrations/productivity/google-sheets/_meta.tsx b/app/en/resources/integrations/productivity/google-sheets/_meta.tsx similarity index 100% rename from app/en/integrations/productivity/google-sheets/_meta.tsx rename to app/en/resources/integrations/productivity/google-sheets/_meta.tsx diff --git a/app/en/integrations/productivity/google-sheets/page.mdx b/app/en/resources/integrations/productivity/google-sheets/page.mdx similarity index 100% rename from app/en/integrations/productivity/google-sheets/page.mdx rename to app/en/resources/integrations/productivity/google-sheets/page.mdx diff --git a/app/en/integrations/productivity/google-sheets/reference/page.mdx b/app/en/resources/integrations/productivity/google-sheets/reference/page.mdx similarity index 100% rename from app/en/integrations/productivity/google-sheets/reference/page.mdx rename to app/en/resources/integrations/productivity/google-sheets/reference/page.mdx diff --git a/app/en/integrations/productivity/google-slides/page.mdx b/app/en/resources/integrations/productivity/google-slides/page.mdx similarity index 100% rename from app/en/integrations/productivity/google-slides/page.mdx rename to app/en/resources/integrations/productivity/google-slides/page.mdx diff --git a/app/en/integrations/productivity/jira/_meta.tsx b/app/en/resources/integrations/productivity/jira/_meta.tsx similarity index 100% rename from app/en/integrations/productivity/jira/_meta.tsx rename to app/en/resources/integrations/productivity/jira/_meta.tsx diff --git a/app/en/integrations/productivity/jira/environment-variables/page.mdx b/app/en/resources/integrations/productivity/jira/environment-variables/page.mdx similarity index 100% rename from app/en/integrations/productivity/jira/environment-variables/page.mdx rename to app/en/resources/integrations/productivity/jira/environment-variables/page.mdx diff --git a/app/en/integrations/productivity/jira/page.mdx b/app/en/resources/integrations/productivity/jira/page.mdx similarity index 100% rename from app/en/integrations/productivity/jira/page.mdx rename to app/en/resources/integrations/productivity/jira/page.mdx diff --git a/app/en/integrations/productivity/jira/reference/page.mdx b/app/en/resources/integrations/productivity/jira/reference/page.mdx similarity index 100% rename from app/en/integrations/productivity/jira/reference/page.mdx rename to app/en/resources/integrations/productivity/jira/reference/page.mdx diff --git a/app/en/integrations/productivity/linear/page.mdx b/app/en/resources/integrations/productivity/linear/page.mdx similarity index 100% rename from app/en/integrations/productivity/linear/page.mdx rename to app/en/resources/integrations/productivity/linear/page.mdx diff --git a/app/en/integrations/productivity/luma-api/page.mdx b/app/en/resources/integrations/productivity/luma-api/page.mdx similarity index 100% rename from app/en/integrations/productivity/luma-api/page.mdx rename to app/en/resources/integrations/productivity/luma-api/page.mdx diff --git a/app/en/integrations/productivity/mailchimp-marketing-api/page.mdx b/app/en/resources/integrations/productivity/mailchimp-marketing-api/page.mdx similarity index 100% rename from app/en/integrations/productivity/mailchimp-marketing-api/page.mdx rename to app/en/resources/integrations/productivity/mailchimp-marketing-api/page.mdx diff --git a/app/en/integrations/productivity/miro-api/page.mdx b/app/en/resources/integrations/productivity/miro-api/page.mdx similarity index 100% rename from app/en/integrations/productivity/miro-api/page.mdx rename to app/en/resources/integrations/productivity/miro-api/page.mdx diff --git a/app/en/integrations/productivity/notion/page.mdx b/app/en/resources/integrations/productivity/notion/page.mdx similarity index 100% rename from app/en/integrations/productivity/notion/page.mdx rename to app/en/resources/integrations/productivity/notion/page.mdx diff --git a/app/en/integrations/productivity/obsidian/page.mdx b/app/en/resources/integrations/productivity/obsidian/page.mdx similarity index 100% rename from app/en/integrations/productivity/obsidian/page.mdx rename to app/en/resources/integrations/productivity/obsidian/page.mdx diff --git a/app/en/integrations/productivity/outlook-calendar/page.mdx b/app/en/resources/integrations/productivity/outlook-calendar/page.mdx similarity index 100% rename from app/en/integrations/productivity/outlook-calendar/page.mdx rename to app/en/resources/integrations/productivity/outlook-calendar/page.mdx diff --git a/app/en/integrations/productivity/outlook-mail/_meta.tsx b/app/en/resources/integrations/productivity/outlook-mail/_meta.tsx similarity index 100% rename from app/en/integrations/productivity/outlook-mail/_meta.tsx rename to app/en/resources/integrations/productivity/outlook-mail/_meta.tsx diff --git a/app/en/integrations/productivity/outlook-mail/page.mdx b/app/en/resources/integrations/productivity/outlook-mail/page.mdx similarity index 100% rename from app/en/integrations/productivity/outlook-mail/page.mdx rename to app/en/resources/integrations/productivity/outlook-mail/page.mdx diff --git a/app/en/integrations/productivity/outlook-mail/reference/page.mdx b/app/en/resources/integrations/productivity/outlook-mail/reference/page.mdx similarity index 100% rename from app/en/integrations/productivity/outlook-mail/reference/page.mdx rename to app/en/resources/integrations/productivity/outlook-mail/reference/page.mdx diff --git a/app/en/integrations/productivity/sharepoint/page.mdx b/app/en/resources/integrations/productivity/sharepoint/page.mdx similarity index 100% rename from app/en/integrations/productivity/sharepoint/page.mdx rename to app/en/resources/integrations/productivity/sharepoint/page.mdx diff --git a/app/en/integrations/productivity/squareup-api/page.mdx b/app/en/resources/integrations/productivity/squareup-api/page.mdx similarity index 100% rename from app/en/integrations/productivity/squareup-api/page.mdx rename to app/en/resources/integrations/productivity/squareup-api/page.mdx diff --git a/app/en/integrations/productivity/ticktick-api/page.mdx b/app/en/resources/integrations/productivity/ticktick-api/page.mdx similarity index 100% rename from app/en/integrations/productivity/ticktick-api/page.mdx rename to app/en/resources/integrations/productivity/ticktick-api/page.mdx diff --git a/app/en/integrations/productivity/trello-api/page.mdx b/app/en/resources/integrations/productivity/trello-api/page.mdx similarity index 100% rename from app/en/integrations/productivity/trello-api/page.mdx rename to app/en/resources/integrations/productivity/trello-api/page.mdx diff --git a/app/en/integrations/productivity/xero-api/page.mdx b/app/en/resources/integrations/productivity/xero-api/page.mdx similarity index 100% rename from app/en/integrations/productivity/xero-api/page.mdx rename to app/en/resources/integrations/productivity/xero-api/page.mdx diff --git a/app/en/integrations/sales/_meta.tsx b/app/en/resources/integrations/sales/_meta.tsx similarity index 100% rename from app/en/integrations/sales/_meta.tsx rename to app/en/resources/integrations/sales/_meta.tsx diff --git a/app/en/integrations/sales/hubspot-automation-api/page.mdx b/app/en/resources/integrations/sales/hubspot-automation-api/page.mdx similarity index 100% rename from app/en/integrations/sales/hubspot-automation-api/page.mdx rename to app/en/resources/integrations/sales/hubspot-automation-api/page.mdx diff --git a/app/en/integrations/sales/hubspot-cms-api/page.mdx b/app/en/resources/integrations/sales/hubspot-cms-api/page.mdx similarity index 100% rename from app/en/integrations/sales/hubspot-cms-api/page.mdx rename to app/en/resources/integrations/sales/hubspot-cms-api/page.mdx diff --git a/app/en/integrations/sales/hubspot-conversations-api/page.mdx b/app/en/resources/integrations/sales/hubspot-conversations-api/page.mdx similarity index 100% rename from app/en/integrations/sales/hubspot-conversations-api/page.mdx rename to app/en/resources/integrations/sales/hubspot-conversations-api/page.mdx diff --git a/app/en/integrations/sales/hubspot-crm-api/page.mdx b/app/en/resources/integrations/sales/hubspot-crm-api/page.mdx similarity index 100% rename from app/en/integrations/sales/hubspot-crm-api/page.mdx rename to app/en/resources/integrations/sales/hubspot-crm-api/page.mdx diff --git a/app/en/integrations/sales/hubspot-events-api/page.mdx b/app/en/resources/integrations/sales/hubspot-events-api/page.mdx similarity index 100% rename from app/en/integrations/sales/hubspot-events-api/page.mdx rename to app/en/resources/integrations/sales/hubspot-events-api/page.mdx diff --git a/app/en/integrations/sales/hubspot-marketing-api/page.mdx b/app/en/resources/integrations/sales/hubspot-marketing-api/page.mdx similarity index 100% rename from app/en/integrations/sales/hubspot-marketing-api/page.mdx rename to app/en/resources/integrations/sales/hubspot-marketing-api/page.mdx diff --git a/app/en/integrations/sales/hubspot-meetings-api/page.mdx b/app/en/resources/integrations/sales/hubspot-meetings-api/page.mdx similarity index 100% rename from app/en/integrations/sales/hubspot-meetings-api/page.mdx rename to app/en/resources/integrations/sales/hubspot-meetings-api/page.mdx diff --git a/app/en/integrations/sales/hubspot-users-api/page.mdx b/app/en/resources/integrations/sales/hubspot-users-api/page.mdx similarity index 100% rename from app/en/integrations/sales/hubspot-users-api/page.mdx rename to app/en/resources/integrations/sales/hubspot-users-api/page.mdx diff --git a/app/en/integrations/sales/hubspot/_meta.tsx b/app/en/resources/integrations/sales/hubspot/_meta.tsx similarity index 100% rename from app/en/integrations/sales/hubspot/_meta.tsx rename to app/en/resources/integrations/sales/hubspot/_meta.tsx diff --git a/app/en/integrations/sales/hubspot/page.mdx b/app/en/resources/integrations/sales/hubspot/page.mdx similarity index 100% rename from app/en/integrations/sales/hubspot/page.mdx rename to app/en/resources/integrations/sales/hubspot/page.mdx diff --git a/app/en/integrations/sales/hubspot/reference/page.mdx b/app/en/resources/integrations/sales/hubspot/reference/page.mdx similarity index 100% rename from app/en/integrations/sales/hubspot/reference/page.mdx rename to app/en/resources/integrations/sales/hubspot/reference/page.mdx diff --git a/app/en/integrations/sales/salesforce/page.mdx b/app/en/resources/integrations/sales/salesforce/page.mdx similarity index 100% rename from app/en/integrations/sales/salesforce/page.mdx rename to app/en/resources/integrations/sales/salesforce/page.mdx diff --git a/app/en/integrations/search/_meta.tsx b/app/en/resources/integrations/search/_meta.tsx similarity index 100% rename from app/en/integrations/search/_meta.tsx rename to app/en/resources/integrations/search/_meta.tsx diff --git a/app/en/integrations/search/exa-api/page.mdx b/app/en/resources/integrations/search/exa-api/page.mdx similarity index 100% rename from app/en/integrations/search/exa-api/page.mdx rename to app/en/resources/integrations/search/exa-api/page.mdx diff --git a/app/en/integrations/search/google_finance/page.mdx b/app/en/resources/integrations/search/google_finance/page.mdx similarity index 100% rename from app/en/integrations/search/google_finance/page.mdx rename to app/en/resources/integrations/search/google_finance/page.mdx diff --git a/app/en/integrations/search/google_flights/page.mdx b/app/en/resources/integrations/search/google_flights/page.mdx similarity index 100% rename from app/en/integrations/search/google_flights/page.mdx rename to app/en/resources/integrations/search/google_flights/page.mdx diff --git a/app/en/integrations/search/google_hotels/page.mdx b/app/en/resources/integrations/search/google_hotels/page.mdx similarity index 100% rename from app/en/integrations/search/google_hotels/page.mdx rename to app/en/resources/integrations/search/google_hotels/page.mdx diff --git a/app/en/integrations/search/google_jobs/page.mdx b/app/en/resources/integrations/search/google_jobs/page.mdx similarity index 100% rename from app/en/integrations/search/google_jobs/page.mdx rename to app/en/resources/integrations/search/google_jobs/page.mdx diff --git a/app/en/integrations/search/google_maps/page.mdx b/app/en/resources/integrations/search/google_maps/page.mdx similarity index 100% rename from app/en/integrations/search/google_maps/page.mdx rename to app/en/resources/integrations/search/google_maps/page.mdx diff --git a/app/en/integrations/search/google_news/page.mdx b/app/en/resources/integrations/search/google_news/page.mdx similarity index 100% rename from app/en/integrations/search/google_news/page.mdx rename to app/en/resources/integrations/search/google_news/page.mdx diff --git a/app/en/integrations/search/google_search/page.mdx b/app/en/resources/integrations/search/google_search/page.mdx similarity index 100% rename from app/en/integrations/search/google_search/page.mdx rename to app/en/resources/integrations/search/google_search/page.mdx diff --git a/app/en/integrations/search/google_shopping/page.mdx b/app/en/resources/integrations/search/google_shopping/page.mdx similarity index 100% rename from app/en/integrations/search/google_shopping/page.mdx rename to app/en/resources/integrations/search/google_shopping/page.mdx diff --git a/app/en/integrations/search/walmart/page.mdx b/app/en/resources/integrations/search/walmart/page.mdx similarity index 100% rename from app/en/integrations/search/walmart/page.mdx rename to app/en/resources/integrations/search/walmart/page.mdx diff --git a/app/en/integrations/search/youtube/page.mdx b/app/en/resources/integrations/search/youtube/page.mdx similarity index 100% rename from app/en/integrations/search/youtube/page.mdx rename to app/en/resources/integrations/search/youtube/page.mdx diff --git a/app/en/integrations/social-communication/_meta.tsx b/app/en/resources/integrations/social-communication/_meta.tsx similarity index 100% rename from app/en/integrations/social-communication/_meta.tsx rename to app/en/resources/integrations/social-communication/_meta.tsx diff --git a/app/en/integrations/social-communication/discord/page.mdx b/app/en/resources/integrations/social-communication/discord/page.mdx similarity index 100% rename from app/en/integrations/social-communication/discord/page.mdx rename to app/en/resources/integrations/social-communication/discord/page.mdx diff --git a/app/en/integrations/social-communication/linkedin/page.mdx b/app/en/resources/integrations/social-communication/linkedin/page.mdx similarity index 100% rename from app/en/integrations/social-communication/linkedin/page.mdx rename to app/en/resources/integrations/social-communication/linkedin/page.mdx diff --git a/app/en/integrations/social-communication/microsoft-teams/_meta.tsx b/app/en/resources/integrations/social-communication/microsoft-teams/_meta.tsx similarity index 100% rename from app/en/integrations/social-communication/microsoft-teams/_meta.tsx rename to app/en/resources/integrations/social-communication/microsoft-teams/_meta.tsx diff --git a/app/en/integrations/social-communication/microsoft-teams/page.mdx b/app/en/resources/integrations/social-communication/microsoft-teams/page.mdx similarity index 100% rename from app/en/integrations/social-communication/microsoft-teams/page.mdx rename to app/en/resources/integrations/social-communication/microsoft-teams/page.mdx diff --git a/app/en/integrations/social-communication/microsoft-teams/reference/page.mdx b/app/en/resources/integrations/social-communication/microsoft-teams/reference/page.mdx similarity index 100% rename from app/en/integrations/social-communication/microsoft-teams/reference/page.mdx rename to app/en/resources/integrations/social-communication/microsoft-teams/reference/page.mdx diff --git a/app/en/integrations/social-communication/reddit/page.mdx b/app/en/resources/integrations/social-communication/reddit/page.mdx similarity index 100% rename from app/en/integrations/social-communication/reddit/page.mdx rename to app/en/resources/integrations/social-communication/reddit/page.mdx diff --git a/app/en/integrations/social-communication/slack-api/page.mdx b/app/en/resources/integrations/social-communication/slack-api/page.mdx similarity index 100% rename from app/en/integrations/social-communication/slack-api/page.mdx rename to app/en/resources/integrations/social-communication/slack-api/page.mdx diff --git a/app/en/integrations/social-communication/slack/_meta.tsx b/app/en/resources/integrations/social-communication/slack/_meta.tsx similarity index 100% rename from app/en/integrations/social-communication/slack/_meta.tsx rename to app/en/resources/integrations/social-communication/slack/_meta.tsx diff --git a/app/en/integrations/social-communication/slack/environment-variables/page.mdx b/app/en/resources/integrations/social-communication/slack/environment-variables/page.mdx similarity index 100% rename from app/en/integrations/social-communication/slack/environment-variables/page.mdx rename to app/en/resources/integrations/social-communication/slack/environment-variables/page.mdx diff --git a/app/en/integrations/social-communication/slack/install/page.mdx b/app/en/resources/integrations/social-communication/slack/install/page.mdx similarity index 100% rename from app/en/integrations/social-communication/slack/install/page.mdx rename to app/en/resources/integrations/social-communication/slack/install/page.mdx diff --git a/app/en/integrations/social-communication/slack/install/slack-auth-link.tsx b/app/en/resources/integrations/social-communication/slack/install/slack-auth-link.tsx similarity index 100% rename from app/en/integrations/social-communication/slack/install/slack-auth-link.tsx rename to app/en/resources/integrations/social-communication/slack/install/slack-auth-link.tsx diff --git a/app/en/integrations/social-communication/slack/page.mdx b/app/en/resources/integrations/social-communication/slack/page.mdx similarity index 100% rename from app/en/integrations/social-communication/slack/page.mdx rename to app/en/resources/integrations/social-communication/slack/page.mdx diff --git a/app/en/integrations/social-communication/slack/reference/page.mdx b/app/en/resources/integrations/social-communication/slack/reference/page.mdx similarity index 100% rename from app/en/integrations/social-communication/slack/reference/page.mdx rename to app/en/resources/integrations/social-communication/slack/reference/page.mdx diff --git a/app/en/integrations/social-communication/slack_api.mdx b/app/en/resources/integrations/social-communication/slack_api.mdx similarity index 100% rename from app/en/integrations/social-communication/slack_api.mdx rename to app/en/resources/integrations/social-communication/slack_api.mdx diff --git a/app/en/integrations/social-communication/teams/_meta.tsx b/app/en/resources/integrations/social-communication/teams/_meta.tsx similarity index 100% rename from app/en/integrations/social-communication/teams/_meta.tsx rename to app/en/resources/integrations/social-communication/teams/_meta.tsx diff --git a/app/en/integrations/social-communication/teams/reference/page.mdx b/app/en/resources/integrations/social-communication/teams/reference/page.mdx similarity index 100% rename from app/en/integrations/social-communication/teams/reference/page.mdx rename to app/en/resources/integrations/social-communication/teams/reference/page.mdx diff --git a/app/en/integrations/social-communication/twilio/page.mdx b/app/en/resources/integrations/social-communication/twilio/page.mdx similarity index 100% rename from app/en/integrations/social-communication/twilio/page.mdx rename to app/en/resources/integrations/social-communication/twilio/page.mdx diff --git a/app/en/integrations/social-communication/twilio/reference/page.mdx b/app/en/resources/integrations/social-communication/twilio/reference/page.mdx similarity index 100% rename from app/en/integrations/social-communication/twilio/reference/page.mdx rename to app/en/resources/integrations/social-communication/twilio/reference/page.mdx diff --git a/app/en/integrations/social-communication/x/page.mdx b/app/en/resources/integrations/social-communication/x/page.mdx similarity index 100% rename from app/en/integrations/social-communication/x/page.mdx rename to app/en/resources/integrations/social-communication/x/page.mdx diff --git a/app/en/integrations/social-communication/zoom/_meta.tsx b/app/en/resources/integrations/social-communication/zoom/_meta.tsx similarity index 100% rename from app/en/integrations/social-communication/zoom/_meta.tsx rename to app/en/resources/integrations/social-communication/zoom/_meta.tsx diff --git a/app/en/integrations/social-communication/zoom/install/page.mdx b/app/en/resources/integrations/social-communication/zoom/install/page.mdx similarity index 100% rename from app/en/integrations/social-communication/zoom/install/page.mdx rename to app/en/resources/integrations/social-communication/zoom/install/page.mdx diff --git a/app/en/integrations/social-communication/zoom/install/zoom-auth-link.tsx b/app/en/resources/integrations/social-communication/zoom/install/zoom-auth-link.tsx similarity index 100% rename from app/en/integrations/social-communication/zoom/install/zoom-auth-link.tsx rename to app/en/resources/integrations/social-communication/zoom/install/zoom-auth-link.tsx diff --git a/app/en/integrations/social-communication/zoom/page.mdx b/app/en/resources/integrations/social-communication/zoom/page.mdx similarity index 100% rename from app/en/integrations/social-communication/zoom/page.mdx rename to app/en/resources/integrations/social-communication/zoom/page.mdx diff --git a/app/layout.tsx b/app/layout.tsx index 4ef92a8c5..814d23f8e 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -114,6 +114,9 @@ export default async function RootLayout({ copyPageButton={true} docsRepositoryBase="https://github.com/ArcadeAI/docs/tree/main/" editLink={dictionary.editPage} + feedback={{ + content: false, + }} footer={