diff --git a/.github/workflows/generate-toolkit-docs.yml b/.github/workflows/generate-toolkit-docs.yml index ce92dc5c0..185d89286 100644 --- a/.github/workflows/generate-toolkit-docs.yml +++ b/.github/workflows/generate-toolkit-docs.yml @@ -62,7 +62,7 @@ jobs: OPENAI_MODEL: ${{ secrets.OPENAI_MODEL || 'gpt-4o-mini' }} - name: Sync toolkit sidebar navigation - run: pnpm dlx tsx toolkit-docs-generator/scripts/sync-toolkit-sidebar.ts + run: pnpm dlx tsx toolkit-docs-generator/scripts/sync-toolkit-sidebar.ts --prune --verbose - name: Check for changes id: check-changes diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 000000000..b09bc8fbe --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,59 @@ +# Arcade Docs + +Arcade documentation site built with Next.js + Nextra (App Router), using pnpm as the package manager. Content is authored in MDX with custom React components. Check `package.json` for current framework versions. + +## Commands + +```bash +pnpm dev # Local dev server (port 3000) +pnpm build # Full production build (toolkit-markdown → next build → pagefind) +pnpm lint # Lint with Ultracite (Biome-based) +pnpm format # Auto-format with Ultracite +pnpm test # Run all Vitest tests +pnpm test:watch # Watch mode +pnpm vale:check # Check docs against style rules +``` + +Run a single test: +```bash +pnpm vitest run tests/broken-link-check.test.ts +``` + +## Architecture + +- **`app/en/`** — English docs content (MDX pages). Nextra file-based routing with `_meta.tsx` for navigation order. i18n handled via `middleware.ts`. +- **`app/_components/`** — Shared React components (tabbed code blocks, toolkit docs, callouts, etc.). +- **`app/_lib/`** — Data-fetching utilities (toolkit catalog, slug generation, static params). +- **`app/api/`** — API routes (markdown export, toolkit-data, glossary). +- **`toolkit-docs-generator/`** — Generates MCP toolkit documentation from server metadata JSON files in `toolkit-docs-generator/data/toolkits/`. +- **`scripts/`** — Build/CI scripts (clean markdown export, Vale style fixes, redirect checking, pagefind indexing, i18n sync). +- **`tests/`** — Vitest tests (broken links, internal link validation, sitemap, smoke tests). +- **`lib/`** — Next.js utilities (glossary remark plugin, llmstxt plugin). +- **`next.config.ts`** — Contains ~138 redirect rules. + +## Content Authoring + +Follow **STYLEGUIDE.md** for writing standards and **AUTHORING.md** for formatting conventions. Key points: + +- Sentence case for headings. Active voice. Direct tone. +- Product is always "Arcade" (never abbreviated, never "Arcade AI"). +- Use "Arcade Engine" (capitalized), "MCP server" (lowercase server), "tool" (lowercase), "auth provider". +- Code snippets: 4 spaces for Python, 2 spaces for other languages. +- Run `pnpm vale:check` before submitting docs changes. + +## Pre-commit Hooks + +Husky runs on commit: Vale style checks on `.md/.mdx`, `_meta.tsx` key validation, redirect checking for deleted/renamed pages, internal link updates, and Ultracite formatting. You MUST fix any issues surfaced by the pre-commit hooks. NEVER bypass hooks with `--no-verify` or similar flags. + +## Key Config Files + +- `biome.jsonc` — Linter/formatter rules (Biome via Ultracite) +- `.vale.ini` — Vale style checker config (Google style base + Arcade vocabulary) +- `.nvmrc` — Required Node version +- `tsconfig.json` — TypeScript compiler configuration +- `components.json` — shadcn/ui component config +- `postcss.config.mjs` — PostCSS/Tailwind config + +## Code Quality + +NEVER add suppression comments (`// @ts-ignore`, `// @ts-expect-error`, `// biome-ignore`, `eslint-disable`, `{/* prettier-ignore */}`, etc.) to bypass TypeScript or linter errors. Fix the underlying issue instead. diff --git a/app/_components/agent-framework-tabs.tsx b/app/_components/agent-framework-tabs.tsx index a26eec9d0..dd022c53c 100644 --- a/app/_components/agent-framework-tabs.tsx +++ b/app/_components/agent-framework-tabs.tsx @@ -7,35 +7,35 @@ export function AgentFrameworkTabs() {
@@ -44,27 +44,27 @@ export function AgentFrameworkTabs() { diff --git a/app/en/references/auth-providers/figma/page.mdx b/app/en/references/auth-providers/figma/page.mdx index 5b84f4a5f..1bc6d233d 100644 --- a/app/en/references/auth-providers/figma/page.mdx +++ b/app/en/references/auth-providers/figma/page.mdx @@ -6,7 +6,7 @@ The Figma auth provider enables tools and agents to call [Figma APIs](https://de Want to quickly get started with Figma in your agent or AI app? The pre-built - [Arcade Figma MCP Server](/resources/integrations/others/figma) is what you + [Arcade Figma MCP Server](/resources/integrations/development/figma) is what you want! @@ -16,13 +16,13 @@ This page describes how to use and configure Figma auth with Arcade. This auth provider is used by: -- The [Arcade Figma MCP Server](/resources/integrations/others/figma), which provides pre-built tools for interacting with Figma +- The [Arcade Figma MCP Server](/resources/integrations/development/figma), which provides pre-built tools for interacting with Figma - Your [app code](#using-figma-auth-in-app-code) that needs to call the Figma API - Or, your [custom tools](#using-figma-auth-in-custom-tools) that need to call the Figma API ### Required scopes for the Figma MCP Server -If you're using the [Arcade Figma MCP Server](/resources/integrations/others/figma), you'll need to configure these scopes based on which tools you plan to use: +If you're using the [Arcade Figma MCP Server](/resources/integrations/development/figma), you'll need to configure these scopes based on which tools you plan to use: - `file_content:read` - File structure, pages, nodes, and image exports - `library_content:read` - Published components, styles, and component sets from files @@ -288,7 +288,7 @@ const token = authResponse.context.token; ## Using Figma auth in custom tools -You can use the pre-built [Arcade Figma MCP Server](/resources/integrations/others/figma) to quickly build agents and AI apps that interact with Figma. +You can use the pre-built [Arcade Figma MCP Server](/resources/integrations/development/figma) to quickly build agents and AI apps that interact with Figma. If the pre-built tools in the Figma MCP Server don't meet your needs, you can author your own [custom tools](/guides/create-tools/tool-basics/build-mcp-server) that interact with the Figma API. diff --git a/app/en/resources/integrations/_meta.tsx b/app/en/resources/integrations/_meta.tsx index 9fe6b8071..32201d550 100644 --- a/app/en/resources/integrations/_meta.tsx +++ b/app/en/resources/integrations/_meta.tsx @@ -39,9 +39,6 @@ const meta: MetaRecord = { "customer-support": { title: "Customer Support", }, - others: { - title: "Others", - }, "-- Submit your Server": { type: "separator", title: "Submit your server", diff --git a/app/en/resources/integrations/others/[toolkitId]/_meta.tsx b/app/en/resources/integrations/others/[toolkitId]/_meta.tsx deleted file mode 100644 index ce7f0efde..000000000 --- a/app/en/resources/integrations/others/[toolkitId]/_meta.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import type { MetaRecord } from "nextra"; - -const meta: MetaRecord = { - "*": { - theme: { - breadcrumb: false, - toc: false, - copyPage: false, - }, - }, -}; - -export default meta; diff --git a/app/en/resources/integrations/others/[toolkitId]/page-impl.tsx b/app/en/resources/integrations/others/[toolkitId]/page-impl.tsx deleted file mode 100644 index e37332a5d..000000000 --- a/app/en/resources/integrations/others/[toolkitId]/page-impl.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { createToolkitDocsPage } from "@/app/en/resources/integrations/_lib/toolkit-docs-page"; - -export const dynamicParams = false; - -const { Page, generateMetadata, generateStaticParams } = - createToolkitDocsPage("others"); - -export { generateMetadata, generateStaticParams }; - -export default Page; diff --git a/app/en/resources/integrations/others/[toolkitId]/page.mdx b/app/en/resources/integrations/others/[toolkitId]/page.mdx deleted file mode 100644 index ca97c319f..000000000 --- a/app/en/resources/integrations/others/[toolkitId]/page.mdx +++ /dev/null @@ -1,14 +0,0 @@ ---- -title: "MCP server" -description: "Generated MCP server documentation." ---- - -import Page, { - dynamicParams, - generateMetadata, - generateStaticParams, -} from "./page-impl"; - -export { dynamicParams, generateMetadata, generateStaticParams }; - -export default Page; diff --git a/app/en/resources/integrations/others/_meta.tsx b/app/en/resources/integrations/others/_meta.tsx deleted file mode 100644 index 232a6b2c1..000000000 --- a/app/en/resources/integrations/others/_meta.tsx +++ /dev/null @@ -1,78 +0,0 @@ -import type { MetaRecord } from "nextra"; - -const meta: MetaRecord = { - "-- Optimized": { - type: "separator", - title: "Optimized", - }, - codesandbox: { - title: "Codesandbox", - href: "/en/resources/integrations/others/codesandbox", - }, - complextools: { - title: "ComplexTools", - href: "/en/resources/integrations/others/complextools", - }, - deepwiki: { - title: "Deepwiki", - href: "/en/resources/integrations/others/deepwiki", - }, - figma: { - title: "Figma", - href: "/en/resources/integrations/others/figma", - }, - google: { - title: "Google", - href: "/en/resources/integrations/others/google", - }, - math: { - title: "Math", - href: "/en/resources/integrations/others/math", - }, - microsoft: { - title: "Microsoft", - href: "/en/resources/integrations/others/microsoft", - }, - notiontoolkit: { - title: "Notion", - href: "/en/resources/integrations/others/notiontoolkit", - }, - pagerduty: { - title: "Pagerduty", - href: "/en/resources/integrations/others/pagerduty", - }, - pylon: { - title: "Pylon", - href: "/en/resources/integrations/others/pylon", - }, - search: { - title: "Search", - href: "/en/resources/integrations/others/search", - }, - test2: { - title: "Test2", - href: "/en/resources/integrations/others/test2", - }, - web: { - title: "Web", - href: "/en/resources/integrations/others/web", - }, - "-- Starter": { - type: "separator", - title: "Starter", - }, - upclickapi: { - title: "ClickUp API", - href: "/en/resources/integrations/others/upclickapi", - }, - mailchimpmarketingapi: { - title: "Mailchimp API", - href: "/en/resources/integrations/others/mailchimpmarketingapi", - }, - pylonapi: { - title: "PylonApi", - href: "/en/resources/integrations/others/pylonapi", - }, -}; - -export default meta; diff --git a/middleware.ts b/middleware.ts index 7314a86d4..7cd936828 100644 --- a/middleware.ts +++ b/middleware.ts @@ -58,40 +58,27 @@ function isAIAgent(request: NextRequest): boolean { return AI_AGENT_PATTERNS.some((pattern) => pattern.test(userAgent)); } -function parseAcceptLanguageHeader(acceptLanguage: string): string[] { - return acceptLanguage - .split(",") - .map((lang) => lang.split(";")[0].trim()) - .map((lang) => { - if (lang.startsWith("es")) { - return "es"; - } - if (lang.startsWith("pt")) { - return "pt-BR"; - } - return lang; - }); +function getPreferredLocale(_request: NextRequest): string { + // We don't currently support other translations, so always use English. + return "en"; } -function getPreferredLocale(request: NextRequest): string { - const cookieLocale = request.cookies.get("NEXT_LOCALE")?.value; +function getEnglishLocaleRedirectPath(pathname: string): string | null { + for (const locale of SUPPORTED_LOCALES) { + if (locale === "en") { + continue; + } - if (cookieLocale && SUPPORTED_LOCALES.includes(cookieLocale)) { - return cookieLocale; - } + if (pathname === `/${locale}` || pathname === `/${locale}/`) { + return "/en/home"; + } - const acceptLanguage = request.headers.get("accept-language"); - if (acceptLanguage) { - const languages = parseAcceptLanguageHeader(acceptLanguage); - const preferredLocale = languages.find((lang) => - SUPPORTED_LOCALES.includes(lang) - ); - if (preferredLocale) { - return preferredLocale; + if (pathname.startsWith(`/${locale}/`)) { + return `/en${pathname.slice(locale.length + 1)}`; } } - return "en"; + return null; } function pathnameIsMissingLocale(pathname: string): boolean { @@ -181,6 +168,13 @@ function handleContentNegotiation( export function middleware(request: NextRequest) { const pathname = request.nextUrl.pathname; + const englishLocaleRedirectPath = getEnglishLocaleRedirectPath(pathname); + if (englishLocaleRedirectPath) { + const url = request.nextUrl.clone(); + url.pathname = englishLocaleRedirectPath; + return NextResponse.redirect(url); + } + const contentNegotiationResponse = handleContentNegotiation( request, pathname diff --git a/next.config.ts b/next.config.ts index 8e6ee6de6..87682462a 100644 --- a/next.config.ts +++ b/next.config.ts @@ -23,6 +23,12 @@ const nextConfig: NextConfig = withLlmsTxt({ withNextra({ async redirects() { return [ + // "others" category removed — toolkits moved to proper categories + { + source: "/:locale/resources/integrations/others/:path*", + destination: "/:locale/resources/integrations", + permanent: false, + }, // Google ADK tutorial consolidation - redirect old URL to new { source: diff --git a/public/_markdown/en/references/auth-providers/figma.md b/public/_markdown/en/references/auth-providers/figma.md index 2a2f11753..148ccd8ba 100644 --- a/public/_markdown/en/references/auth-providers/figma.md +++ b/public/_markdown/en/references/auth-providers/figma.md @@ -9,7 +9,7 @@ Figma The Figma enables tools and to call [Figma APIs](https://developers.figma.com/docs/rest-api/)  on behalf of a using OAuth 2.0 authentication. -Want to quickly get started with Figma in your or AI app? The pre-built [Arcade Figma MCP Server](/resources/integrations/others/figma.md) is what you want! +Want to quickly get started with Figma in your or AI app? The pre-built [Arcade Figma MCP Server](/resources/integrations/development/figma.md) is what you want! ### What’s documented here @@ -17,7 +17,7 @@ This page describes how to use and configure Figma auth with Arcade. This is used by: -- The [Arcade Figma MCP Server](/resources/integrations/others/figma.md) +- The [Arcade Figma MCP Server](/resources/integrations/development/figma.md) , which provides pre-built for interacting with Figma - Your [app code](#using-figma-auth-in-app-code) that needs to call the Figma API @@ -26,7 +26,7 @@ This is used by: ### Required scopes for the Figma MCP Server -If you’re using the [Arcade Figma MCP Server](/resources/integrations/others/figma.md), you’ll need to configure these scopes based on which you plan to use: +If you’re using the [Arcade Figma MCP Server](/resources/integrations/development/figma.md), you’ll need to configure these scopes based on which you plan to use: - `file_content:read` - File structure, pages, nodes, and image exports - `library_content:read` - Published components, styles, and component sets from files @@ -248,7 +248,7 @@ const token = authResponse.context.token; ## Using Figma auth in custom tools -You can use the pre-built [Arcade Figma MCP Server](/resources/integrations/others/figma.md) to quickly build and AI apps that interact with Figma. +You can use the pre-built [Arcade Figma MCP Server](/resources/integrations/development/figma.md) to quickly build and AI apps that interact with Figma. If the pre-built tools in the Figma Server don’t meet your needs, you can author your own [custom tools](/guides/create-tools/tool-basics/build-mcp-server.md) that interact with the Figma API. @@ -283,7 +283,7 @@ async def get_figma_file( For a complete list of available Figma OAuth scopes and their descriptions, refer to the [Figma OAuth Scopes documentation](https://developers.figma.com/docs/rest-api/scopes/) . -Last updated on January 30, 2026 +Last updated on February 10, 2026 [Dropbox](/en/references/auth-providers/dropbox.md) [GitHub](/en/references/auth-providers/github.md) diff --git a/tests/external-url-check.test.ts b/tests/external-url-check.test.ts index ba468f74d..44c2e4ec6 100644 --- a/tests/external-url-check.test.ts +++ b/tests/external-url-check.test.ts @@ -26,6 +26,7 @@ const SKIP_PATTERNS: RegExp[] = [ /reddit\.com/, /platform\.openai\.com/, /support\.google\.com/, + /developers\.google\.com/, /developer\.squareup\.com/, /developer\.ticktick\.com/, /api-console\.zoho\.com/, diff --git a/toolkit-docs-generator/data/toolkits/hubspot.json b/toolkit-docs-generator/data/toolkits/hubspot.json index bff510c65..bee406051 100644 --- a/toolkit-docs-generator/data/toolkits/hubspot.json +++ b/toolkit-docs-generator/data/toolkits/hubspot.json @@ -15,7 +15,7 @@ }, "auth": { "type": "oauth2", - "providerId": null, + "providerId": "hubspot", "allScopes": [ "crm.objects.companies.read", "crm.objects.companies.write", @@ -61,7 +61,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "oauth", @@ -123,7 +123,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "oauth", @@ -246,7 +246,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["oauth", "crm.objects.contacts.write"] }, @@ -377,7 +377,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["oauth", "crm.objects.contacts.write"] }, @@ -498,7 +498,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["oauth", "crm.objects.companies.write"] }, @@ -621,7 +621,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["oauth", "crm.objects.contacts.write"] }, @@ -755,7 +755,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["oauth", "crm.objects.deals.write"] }, @@ -965,7 +965,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["oauth", "crm.objects.contacts.write"] }, @@ -1155,7 +1155,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["oauth", "crm.objects.contacts.write"] }, @@ -1267,7 +1267,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["oauth", "crm.objects.contacts.write"] }, @@ -1318,7 +1318,7 @@ "description": "Get all users/owners in the HubSpot portal.\n\nThis tool retrieves a list of all users (owners) in your HubSpot portal,\nUseful for user management and assignment operations.\n\nUse this tool when needing information about ALL users in the HubSpot portal.", "parameters": [], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["oauth", "crm.objects.owners.read"] }, @@ -1343,7 +1343,7 @@ "description": "Get all available industry types for HubSpot companies.\n\nReturns a sorted list of valid industry type values that can be used\nwhen creating companies.", "parameters": [], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["oauth"] }, @@ -1409,7 +1409,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "oauth", @@ -1506,7 +1506,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "oauth", @@ -1595,7 +1595,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "oauth", @@ -1680,7 +1680,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "oauth", @@ -1749,7 +1749,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "oauth", @@ -1824,7 +1824,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "oauth", @@ -1885,7 +1885,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["oauth", "crm.objects.deals.read"] }, @@ -1925,7 +1925,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["oauth", "crm.objects.deals.read"] }, @@ -1997,7 +1997,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "oauth", @@ -2094,7 +2094,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "oauth", @@ -2191,7 +2191,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "oauth", @@ -2288,7 +2288,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "oauth", @@ -2353,7 +2353,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["oauth", "crm.objects.owners.read"] }, @@ -2417,7 +2417,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "oauth", @@ -2518,7 +2518,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "oauth", @@ -2629,7 +2629,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "oauth", @@ -2793,7 +2793,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "oauth", @@ -2928,7 +2928,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "oauth", @@ -3077,7 +3077,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "oauth", @@ -3235,7 +3235,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "oauth", @@ -3399,7 +3399,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["oauth", "crm.objects.deals.read", "crm.objects.deals.write"] }, @@ -3505,7 +3505,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "oauth", @@ -3594,7 +3594,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "oauth", @@ -3725,7 +3725,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "oauth", @@ -3879,7 +3879,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "oauth", @@ -3995,7 +3995,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "oauth", @@ -4050,7 +4050,7 @@ "description": "Get current user information from HubSpot.\n\nThis is typically the first tool called to understand the current user context.\n\nUse this tool when needing information about the current user basic HubSpot information.\nand the associated HubSpot portal.", "parameters": [], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["oauth", "crm.objects.owners.read"] }, diff --git a/toolkit-docs-generator/data/toolkits/hubspotautomationapi.json b/toolkit-docs-generator/data/toolkits/hubspotautomationapi.json index 29736d5bb..048cf9aff 100644 --- a/toolkit-docs-generator/data/toolkits/hubspotautomationapi.json +++ b/toolkit-docs-generator/data/toolkits/hubspotautomationapi.json @@ -15,7 +15,7 @@ }, "auth": { "type": "oauth2", - "providerId": null, + "providerId": "hubspot", "allScopes": [ "automation", "automation.sequences.enrollments.write", @@ -39,7 +39,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["automation.sequences.read"] }, @@ -95,7 +95,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["automation"] }, @@ -153,7 +153,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["automation"] }, @@ -222,7 +222,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["automation.sequences.enrollments.write"] }, @@ -302,7 +302,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["automation"] }, @@ -357,7 +357,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["automation.sequences.read"] }, @@ -388,7 +388,7 @@ "description": "Retrieve a list of sequences for a specific user.\n\nUse this tool to get sequences associated with a user in HubSpot. Useful for tracking user-specific automated processes.", "parameters": [], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["automation.sequences.read"] }, @@ -430,7 +430,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["automation"] }, @@ -483,7 +483,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["automation"] }, diff --git a/toolkit-docs-generator/data/toolkits/hubspotcmsapi.json b/toolkit-docs-generator/data/toolkits/hubspotcmsapi.json index 58cd4c1de..45f7a7eab 100644 --- a/toolkit-docs-generator/data/toolkits/hubspotcmsapi.json +++ b/toolkit-docs-generator/data/toolkits/hubspotcmsapi.json @@ -15,7 +15,7 @@ }, "auth": { "type": "oauth2", - "providerId": null, + "providerId": "hubspot", "allScopes": [ "cms.domains.read", "cms.domains.write", @@ -59,7 +59,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["hubdb"] }, @@ -110,7 +110,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -150,7 +150,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["hubdb"] }, @@ -214,7 +214,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -293,7 +293,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -372,7 +372,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -451,7 +451,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -530,7 +530,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -609,7 +609,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -680,7 +680,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["hubdb"] }, @@ -730,7 +730,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -778,7 +778,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -839,7 +839,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["hubdb"] }, @@ -905,7 +905,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["hubdb"] }, @@ -987,7 +987,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["hubdb"] }, @@ -1055,7 +1055,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -1108,7 +1108,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -1161,7 +1161,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -1214,7 +1214,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["media_bridge.write"] }, @@ -1267,7 +1267,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -1320,7 +1320,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -1373,7 +1373,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -1426,7 +1426,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -1495,7 +1495,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -1558,7 +1558,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -1651,7 +1651,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -1745,7 +1745,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -1808,7 +1808,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -1869,7 +1869,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["hubdb"] }, @@ -1927,7 +1927,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["hubdb"] }, @@ -1980,7 +1980,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -2073,7 +2073,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -2151,7 +2151,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -2204,7 +2204,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -2265,7 +2265,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -2323,7 +2323,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["media_bridge.write"] }, @@ -2384,7 +2384,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -2442,7 +2442,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -2495,7 +2495,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -2612,7 +2612,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -2705,7 +2705,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -2751,7 +2751,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -2792,7 +2792,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -2840,7 +2840,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -2886,7 +2886,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -2934,7 +2934,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["hubdb"] }, @@ -2987,7 +2987,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -3040,7 +3040,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -3093,7 +3093,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -3139,7 +3139,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -3180,7 +3180,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -3228,7 +3228,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -3281,7 +3281,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["hubdb"] }, @@ -3326,7 +3326,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -3366,7 +3366,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -3406,7 +3406,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -3446,7 +3446,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -3486,7 +3486,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -3526,7 +3526,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -3566,7 +3566,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -3614,7 +3614,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -3667,7 +3667,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -3720,7 +3720,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -3773,7 +3773,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["hubdb"] }, @@ -3826,7 +3826,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["hubdb"] }, @@ -3871,7 +3871,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -3961,7 +3961,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["hubdb"] }, @@ -4104,7 +4104,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -4278,7 +4278,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["hubdb"] }, @@ -4462,7 +4462,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["hubdb"] }, @@ -4573,7 +4573,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -4704,7 +4704,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -4794,7 +4794,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -4858,7 +4858,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -4913,7 +4913,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -5034,7 +5034,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -5124,7 +5124,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "cms.knowledge_base.settings.read", @@ -5220,7 +5220,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["hubdb"] }, @@ -5314,7 +5314,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["hubdb"] }, @@ -5385,7 +5385,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["hubdb"] }, @@ -5508,7 +5508,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "cms.knowledge_base.settings.read", @@ -5615,7 +5615,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -5674,7 +5674,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["hubdb"] }, @@ -5743,7 +5743,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["hubdb"] }, @@ -5814,7 +5814,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -5864,7 +5864,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -5920,7 +5920,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -6051,7 +6051,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -6165,7 +6165,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -6301,7 +6301,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -6415,7 +6415,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -6494,7 +6494,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -6573,7 +6573,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -6628,7 +6628,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -6749,7 +6749,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -6855,7 +6855,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["hubdb"] }, @@ -6905,7 +6905,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -6953,7 +6953,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -7006,7 +7006,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -7060,7 +7060,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["hubdb"] }, @@ -7105,7 +7105,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -7145,7 +7145,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -7185,7 +7185,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -7233,7 +7233,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["hubdb"] }, @@ -7287,7 +7287,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["hubdb"] }, @@ -7340,7 +7340,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -7409,7 +7409,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["hubdb"] }, @@ -7480,7 +7480,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["hubdb"] }, @@ -7538,7 +7538,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -7583,7 +7583,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -7631,7 +7631,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["hubdb"] }, @@ -7676,7 +7676,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -7716,7 +7716,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -7764,7 +7764,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -7817,7 +7817,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -7870,7 +7870,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -7923,7 +7923,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -7976,7 +7976,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -8029,7 +8029,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -8082,7 +8082,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -8135,7 +8135,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -8241,7 +8241,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -8325,7 +8325,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -8386,7 +8386,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -8517,7 +8517,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -8616,7 +8616,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -8669,7 +8669,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -8787,7 +8787,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -8888,7 +8888,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -8947,7 +8947,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -9000,7 +9000,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -9053,7 +9053,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -9107,7 +9107,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -9160,7 +9160,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -9213,7 +9213,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -9266,7 +9266,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -9327,7 +9327,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -9386,7 +9386,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -9439,7 +9439,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -9492,7 +9492,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -9545,7 +9545,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -9723,7 +9723,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -9843,7 +9843,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -9883,7 +9883,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -9923,7 +9923,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -9963,7 +9963,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -10003,7 +10003,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -10043,7 +10043,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -10091,7 +10091,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["media_bridge.write"] }, @@ -10144,7 +10144,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["hubdb"] }, @@ -10213,7 +10213,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -10276,7 +10276,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -10337,7 +10337,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -10395,7 +10395,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -10464,7 +10464,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -10535,7 +10535,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -10593,7 +10593,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -10654,7 +10654,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -10768,7 +10768,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -10856,7 +10856,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -10917,7 +10917,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -10976,7 +10976,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -11061,7 +11061,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["hubdb"] }, @@ -11150,7 +11150,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["hubdb"] }, @@ -11229,7 +11229,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -11300,7 +11300,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -11414,7 +11414,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -11510,7 +11510,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -11568,7 +11568,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -11629,7 +11629,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -11703,7 +11703,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -11774,7 +11774,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -11832,7 +11832,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -11893,7 +11893,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -11959,7 +11959,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, diff --git a/toolkit-docs-generator/data/toolkits/hubspotconversationsapi.json b/toolkit-docs-generator/data/toolkits/hubspotconversationsapi.json index 1fb161f7e..b533fdccc 100644 --- a/toolkit-docs-generator/data/toolkits/hubspotconversationsapi.json +++ b/toolkit-docs-generator/data/toolkits/hubspotconversationsapi.json @@ -15,7 +15,7 @@ }, "auth": { "type": "oauth2", - "providerId": null, + "providerId": "hubspot", "allScopes": [ "conversations.custom_channels.read", "conversations.custom_channels.write", @@ -40,7 +40,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["conversations.write"] }, @@ -120,7 +120,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "conversations.custom_channels.write", @@ -188,7 +188,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["conversations.read"] }, @@ -228,7 +228,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "conversations.custom_channels.write", @@ -279,7 +279,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["conversations.custom_channels.read"] }, @@ -324,7 +324,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["conversations.read"] }, @@ -364,7 +364,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["conversations.read"] }, @@ -395,7 +395,7 @@ "description": "Retrieve a list of conversation channels from Hubspot.\n\nUse this tool to get a list of conversation channels from Hubspot, applying optional filters and sorting if needed.", "parameters": [], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["conversations.read"] }, @@ -420,7 +420,7 @@ "description": "Retrieve a list of conversation inboxes.\n\nThis tool fetches a list of conversation inboxes, allowing for optional filters and sorting to customize the results.", "parameters": [], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["conversations.read"] }, @@ -470,7 +470,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["conversations.custom_channels.write"] }, @@ -521,7 +521,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["conversations.read"] }, @@ -561,7 +561,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["conversations.read"] }, @@ -609,7 +609,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "conversations.custom_channels.write", @@ -648,7 +648,7 @@ "description": "Retrieve a list of channel accounts from Hubspot.\n\nThis tool calls the Hubspot Conversations API to retrieve a list of channel accounts. It supports optional filters and sorting to refine the results.", "parameters": [], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["conversations.read"] }, @@ -682,7 +682,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["conversations.read"] }, @@ -713,7 +713,7 @@ "description": "Retrieve conversation threads from Hubspot Conversations.\n\nUse this tool to fetch a list of conversation threads from Hubspot Conversations. You can apply optional filters and sorting to tailor the results.", "parameters": [], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["conversations.read"] }, @@ -755,7 +755,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["conversations.read"] }, @@ -800,7 +800,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["conversations.read"] }, @@ -848,7 +848,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["conversations.read"] }, @@ -909,7 +909,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["conversations.write"] }, @@ -983,7 +983,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "conversations.custom_channels.write", @@ -1073,7 +1073,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "conversations.custom_channels.write", @@ -1152,7 +1152,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["conversations.write"] }, @@ -1226,7 +1226,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["conversations.custom_channels.write"] }, diff --git a/toolkit-docs-generator/data/toolkits/hubspotcrmapi.json b/toolkit-docs-generator/data/toolkits/hubspotcrmapi.json index c4dc175ae..60471d725 100644 --- a/toolkit-docs-generator/data/toolkits/hubspotcrmapi.json +++ b/toolkit-docs-generator/data/toolkits/hubspotcrmapi.json @@ -15,7 +15,7 @@ }, "auth": { "type": "oauth2", - "providerId": null, + "providerId": "hubspot", "allScopes": [ "automation", "cms.membership.access_groups.write", @@ -152,7 +152,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.lists.write", @@ -210,7 +210,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.lists.write", @@ -259,7 +259,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.write"] }, @@ -307,7 +307,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.write"] }, @@ -360,7 +360,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.carts.write"] }, @@ -413,7 +413,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.commercepayments.write"] }, @@ -458,7 +458,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.write"] }, @@ -506,7 +506,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.write"] }, @@ -559,7 +559,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.courses.write"] }, @@ -620,7 +620,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.schemas.carts.write", @@ -692,7 +692,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.deals.write"] }, @@ -740,7 +740,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.line_items.write"] }, @@ -793,7 +793,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.write"] }, @@ -846,7 +846,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.line_items.write"] }, @@ -899,7 +899,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.goals.write"] }, @@ -944,7 +944,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.leads.write"] }, @@ -1000,7 +1000,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -1125,7 +1125,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.write"] }, @@ -1178,7 +1178,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.invoices.write"] }, @@ -1231,7 +1231,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.leads.write"] }, @@ -1284,7 +1284,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.line_items.write"] }, @@ -1337,7 +1337,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.write"] }, @@ -1398,7 +1398,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -1523,7 +1523,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.deals.write"] }, @@ -1576,7 +1576,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.listings.write"] }, @@ -1629,7 +1629,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.write"] }, @@ -1682,7 +1682,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.orders.write"] }, @@ -1727,7 +1727,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.write"] }, @@ -1775,7 +1775,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.write"] }, @@ -1828,7 +1828,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.products.write"] }, @@ -1873,7 +1873,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.quotes.write"] }, @@ -1921,7 +1921,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.quotes.write"] }, @@ -1974,7 +1974,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.services.write"] }, @@ -2027,7 +2027,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -2147,7 +2147,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.line_items.write"] }, @@ -2200,7 +2200,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.users.write"] }, @@ -2269,7 +2269,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.partner-clients.write"] }, @@ -2348,7 +2348,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.partner-services.write"] }, @@ -2411,7 +2411,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.schemas.deals.write", @@ -2497,7 +2497,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -2634,7 +2634,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.read"] }, @@ -2700,7 +2700,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.partner-clients.read"] }, @@ -2774,7 +2774,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -2904,7 +2904,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.write"] }, @@ -2957,7 +2957,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.courses.write"] }, @@ -3018,7 +3018,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -3159,7 +3159,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -3288,7 +3288,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.commercepayments.write"] }, @@ -3341,7 +3341,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.write"] }, @@ -3394,7 +3394,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.line_items.write"] }, @@ -3447,7 +3447,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.line_items.write"] }, @@ -3500,7 +3500,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.write"] }, @@ -3553,7 +3553,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.write"] }, @@ -3606,7 +3606,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.carts.write"] }, @@ -3659,7 +3659,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.companies.write"] }, @@ -3712,7 +3712,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.courses.write"] }, @@ -3765,7 +3765,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.write"] }, @@ -3818,7 +3818,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.invoices.write"] }, @@ -3871,7 +3871,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.write"] }, @@ -3924,7 +3924,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.products.write"] }, @@ -3977,7 +3977,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.quotes.write"] }, @@ -4030,7 +4030,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.services.write"] }, @@ -4083,7 +4083,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.orders.write"] }, @@ -4144,7 +4144,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.schemas.carts.write", @@ -4224,7 +4224,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -4344,7 +4344,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.write"] }, @@ -4397,7 +4397,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["tickets"] }, @@ -4450,7 +4450,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.carts.write"] }, @@ -4503,7 +4503,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.commercepayments.write"] }, @@ -4556,7 +4556,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.companies.write"] }, @@ -4617,7 +4617,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -4750,7 +4750,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -4891,7 +4891,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.schemas.custom.write"] }, @@ -4954,7 +4954,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.schemas.custom.write"] }, @@ -5015,7 +5015,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.schemas.carts.write", @@ -5095,7 +5095,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.users.write"] }, @@ -5148,7 +5148,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.line_items.write"] }, @@ -5201,7 +5201,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.line_items.write"] }, @@ -5254,7 +5254,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.lists.write", @@ -5311,7 +5311,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.goals.write"] }, @@ -5364,7 +5364,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.goals.write"] }, @@ -5417,7 +5417,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.write"] }, @@ -5470,7 +5470,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.write"] }, @@ -5523,7 +5523,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.write"] }, @@ -5576,7 +5576,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.courses.write"] }, @@ -5637,7 +5637,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.schemas.carts.write", @@ -5717,7 +5717,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.deals.write"] }, @@ -5770,7 +5770,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.write"] }, @@ -5823,7 +5823,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.invoices.write"] }, @@ -5876,7 +5876,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.line_items.write"] }, @@ -5929,7 +5929,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.listings.write"] }, @@ -5982,7 +5982,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.write"] }, @@ -6035,7 +6035,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.write"] }, @@ -6096,7 +6096,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -6221,7 +6221,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.orders.write"] }, @@ -6274,7 +6274,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.quotes.write"] }, @@ -6327,7 +6327,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.line_items.write"] }, @@ -6380,7 +6380,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.leads.write"] }, @@ -6433,7 +6433,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.leads.write"] }, @@ -6486,7 +6486,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.line_items.write"] }, @@ -6539,7 +6539,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.deals.write"] }, @@ -6592,7 +6592,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.listings.write"] }, @@ -6645,7 +6645,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.write"] }, @@ -6722,7 +6722,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -6857,7 +6857,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.listings.write"] }, @@ -6910,7 +6910,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.companies.write"] }, @@ -6963,7 +6963,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.write"] }, @@ -7016,7 +7016,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.deals.write"] }, @@ -7069,7 +7069,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.quotes.write"] }, @@ -7122,7 +7122,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.line_items.write"] }, @@ -7191,7 +7191,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.schemas.carts.write", @@ -7276,7 +7276,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.write"] }, @@ -7329,7 +7329,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.write"] }, @@ -7382,7 +7382,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.products.write"] }, @@ -7451,7 +7451,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.schemas.carts.write", @@ -7536,7 +7536,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.services.write"] }, @@ -7589,7 +7589,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -7709,7 +7709,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.write"] }, @@ -7762,7 +7762,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.line_items.write"] }, @@ -7815,7 +7815,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["tickets"] }, @@ -7868,7 +7868,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.users.write"] }, @@ -7921,7 +7921,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.write"] }, @@ -7966,7 +7966,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.extensions_calling_transcripts.write"] }, @@ -8006,7 +8006,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.commercepayments.write"] }, @@ -8054,7 +8054,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.companies.write"] }, @@ -8099,7 +8099,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.companies.write"] }, @@ -8139,7 +8139,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.write"] }, @@ -8179,7 +8179,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.courses.write"] }, @@ -8227,7 +8227,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.schemas.custom.write"] }, @@ -8272,7 +8272,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.lists.write", @@ -8324,7 +8324,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -8444,7 +8444,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.schemas.custom.write"] }, @@ -8489,7 +8489,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.line_items.write"] }, @@ -8529,7 +8529,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.write"] }, @@ -8569,7 +8569,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.line_items.write"] }, @@ -8609,7 +8609,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.goals.write"] }, @@ -8657,7 +8657,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["tickets"] }, @@ -8702,7 +8702,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.invoices.write"] }, @@ -8742,7 +8742,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.line_items.write"] }, @@ -8782,7 +8782,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.lists.write", @@ -8826,7 +8826,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.write"] }, @@ -8866,7 +8866,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.write"] }, @@ -8906,7 +8906,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.services.write"] }, @@ -8946,7 +8946,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.orders.write"] }, @@ -9010,7 +9010,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.schemas.carts.write", @@ -9103,7 +9103,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.schemas.carts.write", @@ -9183,7 +9183,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.schemas.carts.write", @@ -9258,7 +9258,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.schemas.carts.write", @@ -9325,7 +9325,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.lists.write", @@ -9369,7 +9369,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.carts.write"] }, @@ -9409,7 +9409,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -9516,7 +9516,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.write"] }, @@ -9556,7 +9556,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.line_items.write"] }, @@ -9596,7 +9596,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["tickets"] }, @@ -9636,7 +9636,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.users.write"] }, @@ -9700,7 +9700,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.services.write"] }, @@ -9755,7 +9755,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -9861,7 +9861,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -9958,7 +9958,7 @@ "description": "Fetch enablement data from HubSpot CRM.\n\nUse this tool to obtain enablement information from the HubSpot CRM. It should be called when detailed enablement data is required for CRM-related operations or analyses.", "parameters": [], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -10066,7 +10066,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.lists.read"] }, @@ -10135,7 +10135,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.lists.read"] }, @@ -10241,7 +10241,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -10394,7 +10394,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.services.read"] }, @@ -10460,7 +10460,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.listings.read"] }, @@ -10526,7 +10526,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.lists.read"] }, @@ -10600,7 +10600,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.lists.read"] }, @@ -10663,7 +10663,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -10830,7 +10830,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["tickets"] }, @@ -10903,7 +10903,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.write"] }, @@ -10964,7 +10964,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -11081,7 +11081,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -11251,7 +11251,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -11396,7 +11396,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -11547,7 +11547,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -11687,7 +11687,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -11789,7 +11789,7 @@ "description": "Get limits and usage for calculated properties in HubSpot CRM.\n\nCall this tool to retrieve overall limits and per object usage for calculated properties in HubSpot CRM.", "parameters": [], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -11932,7 +11932,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.read"] }, @@ -12040,7 +12040,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.read"] }, @@ -12148,7 +12148,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.carts.read"] }, @@ -12256,7 +12256,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.commercepayments.read"] }, @@ -12364,7 +12364,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.read"] }, @@ -12472,7 +12472,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.read"] }, @@ -12580,7 +12580,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.read"] }, @@ -12688,7 +12688,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.courses.read"] }, @@ -12796,7 +12796,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.courses.read"] }, @@ -12904,7 +12904,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.line_items.read"] }, @@ -12969,7 +12969,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.custom.highly_sensitive.read.v2", @@ -13022,7 +13022,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -13124,7 +13124,7 @@ "description": "Retrieve limits and usage for HubSpot custom object schemas.\n\nThis tool is used to get the limits and usage data for custom object schemas in HubSpot CRM. It's useful for monitoring and managing custom object types and understanding their current usage.", "parameters": [], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.custom.sensitive.write.v2", @@ -13158,7 +13158,7 @@ "description": "Retrieve limits and usage for custom properties per object.\n\nUse this tool to access the limits and usage statistics for custom properties categorized by object in HubSpot CRM.", "parameters": [], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -13301,7 +13301,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.deals.read"] }, @@ -13409,7 +13409,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.contacts.read", @@ -13520,7 +13520,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.contacts.read", @@ -13631,7 +13631,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.line_items.read"] }, @@ -13739,7 +13739,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.goals.read"] }, @@ -13847,7 +13847,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.goals.read"] }, @@ -13903,7 +13903,7 @@ "description": "Retrieve limits and usage for records in HubSpot CRM.\n\nUse this tool to obtain detailed information about the limits and current usage of various objects within the HubSpot CRM records.", "parameters": [], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -14003,7 +14003,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.custom.highly_sensitive.read.v2", @@ -14091,7 +14091,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.deals.read"] }, @@ -14199,7 +14199,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.line_items.read"] }, @@ -14307,7 +14307,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.leads.read"] }, @@ -14415,7 +14415,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.services.read"] }, @@ -14531,7 +14531,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -14711,7 +14711,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.invoices.read"] }, @@ -14819,7 +14819,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.leads.read"] }, @@ -14927,7 +14927,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.line_items.read"] }, @@ -15035,7 +15035,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.listings.read"] }, @@ -15143,7 +15143,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.read"] }, @@ -15251,7 +15251,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.read"] }, @@ -15332,7 +15332,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.read"] }, @@ -15425,7 +15425,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.read"] }, @@ -15533,7 +15533,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.orders.read"] }, @@ -15641,7 +15641,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.orders.read"] }, @@ -15749,7 +15749,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.partner-clients.read"] }, @@ -15857,7 +15857,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.partner-clients.read"] }, @@ -15965,7 +15965,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.partner-services.read"] }, @@ -16073,7 +16073,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.partner-services.read"] }, @@ -16181,7 +16181,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [] }, @@ -16289,7 +16289,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [] }, @@ -16362,7 +16362,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -16494,7 +16494,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -16634,7 +16634,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -16779,7 +16779,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -16916,7 +16916,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -17083,7 +17083,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.read"] }, @@ -17191,7 +17191,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.read"] }, @@ -17299,7 +17299,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.products.read"] }, @@ -17407,7 +17407,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.products.read"] }, @@ -17472,7 +17472,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -17634,7 +17634,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.quotes.read"] }, @@ -17742,7 +17742,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.quotes.read"] }, @@ -17815,7 +17815,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.lists.read"] }, @@ -17903,7 +17903,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.subscriptions.read"] }, @@ -18011,7 +18011,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.subscriptions.read"] }, @@ -18119,7 +18119,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.read"] }, @@ -18227,7 +18227,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.read"] }, @@ -18335,7 +18335,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.line_items.read"] }, @@ -18443,7 +18443,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.line_items.read"] }, @@ -18551,7 +18551,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["tickets"] }, @@ -18616,7 +18616,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.extensions_calling_transcripts.read"] }, @@ -18699,7 +18699,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.users.read"] }, @@ -18807,7 +18807,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.users.read"] }, @@ -18896,7 +18896,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -19025,7 +19025,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.courses.read"] }, @@ -19078,7 +19078,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.services.write"] }, @@ -19131,7 +19131,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.services.read"] }, @@ -19200,7 +19200,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.listings.write"] }, @@ -19298,7 +19298,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.listings.read"] }, @@ -19395,7 +19395,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.partner-clients.read"] }, @@ -19487,7 +19487,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.partner-services.read"] }, @@ -19555,7 +19555,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.dealsplits.read_write"] }, @@ -19608,7 +19608,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.companies.write"] }, @@ -19661,7 +19661,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.write"] }, @@ -19714,7 +19714,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.deals.write"] }, @@ -19775,7 +19775,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -19908,7 +19908,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -20033,7 +20033,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["tickets"] }, @@ -20110,7 +20110,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -20245,7 +20245,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.lists.write", @@ -20294,7 +20294,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.listings.write"] }, @@ -20342,7 +20342,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.lists.write", @@ -20399,7 +20399,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -20502,7 +20502,7 @@ "description": "Retrieve limits and usage for HubSpot CRM pipelines.\n\nCall this tool to obtain information about the limits and current usage of pipelines in HubSpot CRM. Useful for understanding capacity and utilization of your CRM pipelines.", "parameters": [], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -20610,7 +20610,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.dealsplits.read_write"] }, @@ -20671,7 +20671,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [] }, @@ -20737,7 +20737,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -20909,7 +20909,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.read"] }, @@ -20998,7 +20998,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -21140,7 +21140,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -21307,7 +21307,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.services.read"] }, @@ -21372,7 +21372,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.lists.write", @@ -21448,7 +21448,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -21599,7 +21599,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.partner-clients.write"] }, @@ -21678,7 +21678,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.partner-services.write"] }, @@ -21733,7 +21733,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.products.write"] }, @@ -21782,7 +21782,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.lists.write", @@ -21839,7 +21839,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.lists.write", @@ -21928,7 +21928,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.schemas.carts.write", @@ -22047,7 +22047,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.schemas.carts.write", @@ -22129,7 +22129,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.lists.write", @@ -22216,7 +22216,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.companies.read"] }, @@ -22297,7 +22297,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.read"] }, @@ -22363,7 +22363,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.companies.read"] }, @@ -22429,7 +22429,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.line_items.read"] }, @@ -22495,7 +22495,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.read"] }, @@ -22588,7 +22588,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.carts.read"] }, @@ -22669,7 +22669,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.carts.read"] }, @@ -22762,7 +22762,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.commercepayments.read"] }, @@ -22843,7 +22843,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.commercepayments.read"] }, @@ -22936,7 +22936,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.companies.read"] }, @@ -23001,7 +23001,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.lists.read"] }, @@ -23092,7 +23092,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -23245,7 +23245,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.deals.read"] }, @@ -23338,7 +23338,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.line_items.read"] }, @@ -23419,7 +23419,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.line_items.read"] }, @@ -23512,7 +23512,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.read"] }, @@ -23593,7 +23593,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.read"] }, @@ -23686,7 +23686,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.read"] }, @@ -23759,7 +23759,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.companies.highly_sensitive.read.v2", @@ -23829,7 +23829,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.companies.highly_sensitive.read.v2", @@ -23907,7 +23907,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.contacts.read", @@ -23976,7 +23976,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.line_items.read"] }, @@ -24026,7 +24026,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.lists.read"] }, @@ -24082,7 +24082,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.goals.read"] }, @@ -24156,7 +24156,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -24294,7 +24294,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.orders.read"] }, @@ -24360,7 +24360,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.products.read"] }, @@ -24426,7 +24426,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -24555,7 +24555,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -24690,7 +24690,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.courses.read"] }, @@ -24756,7 +24756,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.read"] }, @@ -24822,7 +24822,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.users.read"] }, @@ -24888,7 +24888,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.invoices.read"] }, @@ -24981,7 +24981,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.invoices.read"] }, @@ -25062,7 +25062,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.leads.read"] }, @@ -25103,7 +25103,7 @@ "description": "Retrieve objects nearing or at HubSpot CRM association limits.\n\nThis tool is called to get objects from HubSpot CRM that have records close to or at their association limits. It helps in monitoring and managing association constraints.", "parameters": [], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -25246,7 +25246,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.line_items.read"] }, @@ -25327,7 +25327,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.read"] }, @@ -25420,7 +25420,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.read"] }, @@ -25501,7 +25501,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.read"] }, @@ -25567,7 +25567,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.owners.read"] }, @@ -25641,7 +25641,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.owners.read"] }, @@ -25712,7 +25712,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.partner-services.read"] }, @@ -25778,7 +25778,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.quotes.read"] }, @@ -25844,7 +25844,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.subscriptions.read"] }, @@ -25910,7 +25910,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.line_items.read"] }, @@ -25976,7 +25976,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [] }, @@ -26042,7 +26042,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.lists.write", @@ -26112,7 +26112,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -26237,7 +26237,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.read"] }, @@ -26290,7 +26290,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.commercepayments.read"] }, @@ -26343,7 +26343,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.companies.read"] }, @@ -26396,7 +26396,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.read"] }, @@ -26449,7 +26449,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.leads.read"] }, @@ -26502,7 +26502,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.read"] }, @@ -26555,7 +26555,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.users.read"] }, @@ -26608,7 +26608,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.deals.read"] }, @@ -26661,7 +26661,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.line_items.read"] }, @@ -26714,7 +26714,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.read"] }, @@ -26767,7 +26767,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.contacts.read", @@ -26823,7 +26823,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.line_items.read"] }, @@ -26876,7 +26876,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.goals.read"] }, @@ -26929,7 +26929,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.carts.read"] }, @@ -26982,7 +26982,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.listings.read"] }, @@ -27078,7 +27078,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.lists.read"] }, @@ -27156,7 +27156,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.read"] }, @@ -27209,7 +27209,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.read"] }, @@ -27270,7 +27270,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -27395,7 +27395,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [] }, @@ -27448,7 +27448,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.products.read"] }, @@ -27501,7 +27501,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.subscriptions.read"] }, @@ -27554,7 +27554,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.read"] }, @@ -27607,7 +27607,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.invoices.read"] }, @@ -27660,7 +27660,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.line_items.read"] }, @@ -27713,7 +27713,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.orders.read"] }, @@ -27766,7 +27766,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.partner-clients.read"] }, @@ -27819,7 +27819,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.partner-services.read"] }, @@ -27872,7 +27872,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.read"] }, @@ -27925,7 +27925,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.quotes.read"] }, @@ -27978,7 +27978,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.line_items.read"] }, @@ -28031,7 +28031,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["tickets"] }, @@ -28084,7 +28084,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.schemas.deals.write", @@ -28147,7 +28147,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.lists.read"] }, @@ -28198,7 +28198,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.lists.read"] }, @@ -28246,7 +28246,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.write"] }, @@ -28299,7 +28299,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.write"] }, @@ -28352,7 +28352,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.write"] }, @@ -28405,7 +28405,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.line_items.write"] }, @@ -28458,7 +28458,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.goals.write"] }, @@ -28511,7 +28511,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.companies.write"] }, @@ -28564,7 +28564,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.write"] }, @@ -28617,7 +28617,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.line_items.write"] }, @@ -28686,7 +28686,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.write"] }, @@ -28765,7 +28765,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.carts.write"] }, @@ -28828,7 +28828,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.carts.write"] }, @@ -28897,7 +28897,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.commercepayments.write"] }, @@ -28960,7 +28960,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.commercepayments.write"] }, @@ -29029,7 +29029,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.write"] }, @@ -29108,7 +29108,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.write"] }, @@ -29171,7 +29171,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.courses.write"] }, @@ -29291,7 +29291,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.schemas.custom.write"] }, @@ -29400,7 +29400,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.line_items.write"] }, @@ -29463,7 +29463,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.line_items.write"] }, @@ -29532,7 +29532,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.write"] }, @@ -29611,7 +29611,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.line_items.write"] }, @@ -29690,7 +29690,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.goals.write"] }, @@ -29769,7 +29769,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.companies.write"] }, @@ -29848,7 +29848,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.courses.write"] }, @@ -29927,7 +29927,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.deals.write"] }, @@ -30006,7 +30006,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.write"] }, @@ -30085,7 +30085,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.write"] }, @@ -30172,7 +30172,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -30315,7 +30315,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -30440,7 +30440,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.orders.write"] }, @@ -30493,7 +30493,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.products.write"] }, @@ -30562,7 +30562,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.write"] }, @@ -30641,7 +30641,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.users.write"] }, @@ -30720,7 +30720,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.invoices.write"] }, @@ -30783,7 +30783,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.invoices.write"] }, @@ -30852,7 +30852,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.leads.write"] }, @@ -30915,7 +30915,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.leads.write"] }, @@ -30984,7 +30984,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.line_items.write"] }, @@ -31047,7 +31047,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.line_items.write"] }, @@ -31110,7 +31110,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.lists.write", @@ -31180,7 +31180,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.lists.write", @@ -31242,7 +31242,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.write"] }, @@ -31295,7 +31295,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.write"] }, @@ -31348,7 +31348,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.listings.write"] }, @@ -31401,7 +31401,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.deals.write"] }, @@ -31462,7 +31462,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -31587,7 +31587,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.write"] }, @@ -31640,7 +31640,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.users.write"] }, @@ -31701,7 +31701,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -31842,7 +31842,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.orders.write"] }, @@ -31921,7 +31921,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.partner-clients.write"] }, @@ -31984,7 +31984,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.partner-clients.write"] }, @@ -32053,7 +32053,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.partner-services.write"] }, @@ -32116,7 +32116,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.partner-services.write"] }, @@ -32209,7 +32209,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.schemas.carts.write", @@ -32333,7 +32333,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.schemas.carts.write", @@ -32439,7 +32439,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.write"] }, @@ -32518,7 +32518,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.products.write"] }, @@ -32597,7 +32597,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.schemas.carts.write", @@ -32698,7 +32698,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.schemas.carts.write", @@ -32783,7 +32783,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.quotes.write"] }, @@ -32852,7 +32852,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.quotes.write"] }, @@ -32915,7 +32915,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.services.write"] }, @@ -32984,7 +32984,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -33114,7 +33114,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -33250,7 +33250,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.line_items.write"] }, @@ -33313,7 +33313,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["tickets"] }, @@ -33382,7 +33382,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["tickets"] }, @@ -33445,7 +33445,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.extensions_calling_transcripts.write"] }, @@ -33498,7 +33498,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.write"] }, @@ -33551,7 +33551,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.carts.write"] }, @@ -33604,7 +33604,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.commercepayments.write"] }, @@ -33657,7 +33657,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.write"] }, @@ -33710,7 +33710,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.write"] }, @@ -33763,7 +33763,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["tickets"] }, @@ -33816,7 +33816,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.line_items.write"] }, @@ -33869,7 +33869,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.goals.write"] }, @@ -33922,7 +33922,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.line_items.write"] }, @@ -33975,7 +33975,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.invoices.write"] }, @@ -34028,7 +34028,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.products.write"] }, @@ -34089,7 +34089,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", @@ -34214,7 +34214,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.write"] }, @@ -34267,7 +34267,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.users.write"] }, @@ -34320,7 +34320,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.line_items.write"] }, @@ -34373,7 +34373,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.write"] }, @@ -34426,7 +34426,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.write"] }, @@ -34479,7 +34479,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.orders.write"] }, @@ -34532,7 +34532,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.contacts.write"] }, @@ -34585,7 +34585,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.carts.read", diff --git a/toolkit-docs-generator/data/toolkits/hubspoteventsapi.json b/toolkit-docs-generator/data/toolkits/hubspoteventsapi.json index 721bce113..7ce5f3bc5 100644 --- a/toolkit-docs-generator/data/toolkits/hubspoteventsapi.json +++ b/toolkit-docs-generator/data/toolkits/hubspoteventsapi.json @@ -15,7 +15,7 @@ }, "auth": { "type": "oauth2", - "providerId": null, + "providerId": "hubspot", "allScopes": ["behavioral_events.event_definitions.read_write", "oauth"] }, "tools": [ @@ -35,7 +35,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["behavioral_events.event_definitions.read_write"] }, @@ -83,7 +83,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["behavioral_events.event_definitions.read_write"] }, @@ -128,7 +128,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["behavioral_events.event_definitions.read_write"] }, @@ -159,7 +159,7 @@ "description": "Retrieve a list of visible event type names.\n\nThis tool retrieves a list of event type names that are visible to the user, which can be used to query specific event instances.", "parameters": [], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["oauth"] }, @@ -225,7 +225,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["behavioral_events.event_definitions.read_write"] }, @@ -301,7 +301,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["behavioral_events.event_definitions.read_write"] }, diff --git a/toolkit-docs-generator/data/toolkits/hubspotmarketingapi.json b/toolkit-docs-generator/data/toolkits/hubspotmarketingapi.json index 2f8e80acf..bb46930af 100644 --- a/toolkit-docs-generator/data/toolkits/hubspotmarketingapi.json +++ b/toolkit-docs-generator/data/toolkits/hubspotmarketingapi.json @@ -15,7 +15,7 @@ }, "auth": { "type": "oauth2", - "providerId": null, + "providerId": "hubspot", "allScopes": [ "content", "crm.objects.marketing_events.read", @@ -77,7 +77,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["marketing.campaigns.write"] }, @@ -145,7 +145,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["marketing.campaigns.write"] }, @@ -190,7 +190,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["forms"] }, @@ -246,7 +246,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["marketing.campaigns.write"] }, @@ -304,7 +304,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.marketing_events.write"] }, @@ -357,7 +357,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.marketing_events.write"] }, @@ -418,7 +418,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -476,7 +476,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -553,7 +553,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["marketing.campaigns.write"] }, @@ -621,7 +621,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["marketing.campaigns.write"] }, @@ -674,7 +674,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["marketing.campaigns.write"] }, @@ -727,7 +727,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -780,7 +780,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.marketing_events.write"] }, @@ -833,7 +833,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["forms"] }, @@ -886,7 +886,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["transactional-email"] }, @@ -939,7 +939,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["marketing.campaigns.write"] }, @@ -984,7 +984,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["marketing.campaigns.write"] }, @@ -1024,7 +1024,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -1072,7 +1072,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.marketing_events.write"] }, @@ -1125,7 +1125,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.marketing_events.write"] }, @@ -1170,7 +1170,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["transactional-email"] }, @@ -1226,7 +1226,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["marketing.campaigns.write"] }, @@ -1284,7 +1284,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.marketing_events.write"] }, @@ -1345,7 +1345,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.marketing_events.write"] }, @@ -1435,7 +1435,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["marketing.campaigns.read"] }, @@ -1491,7 +1491,7 @@ "description": "Fetch aggregated email statistics in specified intervals.\n\nThis tool retrieves aggregated email statistics over specified time intervals, providing insights into email performance during each period.", "parameters": [], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -1525,7 +1525,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.marketing_events.read"] }, @@ -1598,7 +1598,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["marketing.campaigns.read"] }, @@ -1658,7 +1658,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.marketing_events.read"] }, @@ -1706,7 +1706,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.marketing_events.read"] }, @@ -1767,7 +1767,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["marketing.campaigns.read"] }, @@ -1825,7 +1825,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["marketing.campaigns.read"] }, @@ -1870,7 +1870,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["marketing.campaigns.read"] }, @@ -1935,7 +1935,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["marketing.campaigns.read"] }, @@ -2014,7 +2014,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["marketing.campaigns.revenue.read"] }, @@ -2077,7 +2077,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["marketing.campaigns.read"] }, @@ -2146,7 +2146,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.marketing_events.read"] }, @@ -2201,7 +2201,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -2241,7 +2241,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -2272,7 +2272,7 @@ "description": "Get aggregated email statistics in a specified time span.\n\nUse this tool to obtain aggregated statistics for emails sent within a specific time period. It also provides a list of all emails sent during that period.", "parameters": [], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -2314,7 +2314,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.marketing_events.read"] }, @@ -2367,7 +2367,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["forms"] }, @@ -2445,7 +2445,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["marketing.campaigns.read"] }, @@ -2505,7 +2505,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -2553,7 +2553,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -2606,7 +2606,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.marketing_events.write"] }, @@ -2659,7 +2659,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.marketing_events.read"] }, @@ -2704,7 +2704,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.marketing_events.write"] }, @@ -2784,7 +2784,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.marketing_events.read"] }, @@ -2849,7 +2849,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.marketing_events.read"] }, @@ -2921,7 +2921,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.marketing_events.read"] }, @@ -2981,7 +2981,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["transactional-email"] }, @@ -3012,7 +3012,7 @@ "description": "Retrieve and filter HubSpot marketing emails.\n\nUse this tool to retrieve and filter marketing emails from HubSpot. It allows you to apply various filters to find specific sets of emails based on your criteria.", "parameters": [], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -3062,7 +3062,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.marketing_events.write"] }, @@ -3152,7 +3152,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["marketing.campaigns.read"] }, @@ -3242,7 +3242,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["forms"] }, @@ -3321,7 +3321,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.marketing_events.write"] }, @@ -3392,7 +3392,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.marketing_events.write"] }, @@ -3442,7 +3442,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["marketing-email", "transactional-email"] }, @@ -3506,7 +3506,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["transactional-email"] }, @@ -3585,7 +3585,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.marketing_events.write"] }, @@ -3672,7 +3672,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.marketing_events.write"] }, @@ -3764,7 +3764,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.marketing_events.write"] }, @@ -3856,7 +3856,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.marketing_events.write"] }, @@ -3948,7 +3948,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.marketing_events.write"] }, @@ -4032,7 +4032,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.marketing_events.write"] }, @@ -4095,7 +4095,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["marketing.campaigns.write"] }, @@ -4140,7 +4140,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.marketing_events.write"] }, @@ -4188,7 +4188,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.marketing_events.write"] }, @@ -4233,7 +4233,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -4273,7 +4273,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["transactional-email"] }, @@ -4321,7 +4321,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -4374,7 +4374,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -4419,7 +4419,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -4459,7 +4459,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.marketing_events.read"] }, @@ -4507,7 +4507,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["marketing-email", "transactional-email"] }, @@ -4560,7 +4560,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["transactional-email"] }, @@ -4605,7 +4605,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["marketing-email", "transactional-email"] }, @@ -4653,7 +4653,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["marketing.campaigns.write"] }, @@ -4738,7 +4738,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["marketing.campaigns.write"] }, @@ -4819,7 +4819,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["marketing.campaigns.write"] }, @@ -4909,7 +4909,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["marketing.campaigns.write"] }, @@ -4990,7 +4990,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -5056,7 +5056,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["forms"] }, @@ -5122,7 +5122,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["forms"] }, @@ -5188,7 +5188,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["content"] }, @@ -5262,7 +5262,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.marketing_events.write"] }, @@ -5325,7 +5325,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.marketing_events.write"] }, @@ -5386,7 +5386,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.marketing_events.write"] }, @@ -5444,7 +5444,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.marketing_events.write"] }, diff --git a/toolkit-docs-generator/data/toolkits/hubspotmeetingsapi.json b/toolkit-docs-generator/data/toolkits/hubspotmeetingsapi.json index a15d579c2..8c1010b2a 100644 --- a/toolkit-docs-generator/data/toolkits/hubspotmeetingsapi.json +++ b/toolkit-docs-generator/data/toolkits/hubspotmeetingsapi.json @@ -15,7 +15,7 @@ }, "auth": { "type": "oauth2", - "providerId": null, + "providerId": "hubspot", "allScopes": [ "crm.objects.appointments.sensitive.write.v2", "crm.objects.appointments.write", @@ -66,7 +66,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.listings.write", @@ -133,7 +133,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["scheduler.meetings.meeting-link.read"] }, @@ -173,7 +173,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["scheduler.meetings.meeting-link.read"] }, @@ -204,7 +204,7 @@ "description": "Retrieve a paged list of meeting scheduling links.\n\nUse this tool to get a paged list of meeting scheduling pages from Hubspot. It is useful when you need to see or manage the scheduling links available.", "parameters": [], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["scheduler.meetings.meeting-link.read"] }, @@ -246,7 +246,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": [ "crm.objects.listings.write", diff --git a/toolkit-docs-generator/data/toolkits/hubspotusersapi.json b/toolkit-docs-generator/data/toolkits/hubspotusersapi.json index 34647e283..440989c7b 100644 --- a/toolkit-docs-generator/data/toolkits/hubspotusersapi.json +++ b/toolkit-docs-generator/data/toolkits/hubspotusersapi.json @@ -15,7 +15,7 @@ }, "auth": { "type": "oauth2", - "providerId": null, + "providerId": "hubspot", "allScopes": [ "crm.objects.users.read", "crm.objects.users.write", @@ -90,7 +90,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.users.write", "settings.users.write"] }, @@ -168,7 +168,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.users.read", "settings.users.read"] }, @@ -204,7 +204,7 @@ "description": "Retrieve all user roles from an account.\n\nThis tool is called to fetch and list all the roles available on a specific account from Hubspot.", "parameters": [], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.users.read", "settings.users.read"] }, @@ -246,7 +246,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.users.write", "settings.users.write"] }, @@ -299,7 +299,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.users.read", "settings.users.read"] }, @@ -393,7 +393,7 @@ } ], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["crm.objects.users.write", "settings.users.write"] }, @@ -454,7 +454,7 @@ "description": "Retrieve all teams for the account.\n\nCall this tool to view all teams associated with a specific account in Hubspot. Useful for managing or reviewing team structures.", "parameters": [], "auth": { - "providerId": null, + "providerId": "hubspot", "providerType": "oauth2", "scopes": ["settings.users.teams.read"] }, diff --git a/toolkit-docs-generator/data/toolkits/salesforce.json b/toolkit-docs-generator/data/toolkits/salesforce.json index 4cf3a6d4b..44633b862 100644 --- a/toolkit-docs-generator/data/toolkits/salesforce.json +++ b/toolkit-docs-generator/data/toolkits/salesforce.json @@ -15,7 +15,7 @@ }, "auth": { "type": "oauth2", - "providerId": null, + "providerId": "salesforce", "allScopes": [ "read_account", "read_contact", @@ -107,7 +107,7 @@ } ], "auth": { - "providerId": null, + "providerId": "salesforce", "providerType": "oauth2", "scopes": ["write_contact"] }, @@ -199,7 +199,7 @@ } ], "auth": { - "providerId": null, + "providerId": "salesforce", "providerType": "oauth2", "scopes": [ "read_account", @@ -274,7 +274,7 @@ } ], "auth": { - "providerId": null, + "providerId": "salesforce", "providerType": "oauth2", "scopes": [ "read_account", diff --git a/toolkit-docs-generator/data/toolkits/ticktickapi.json b/toolkit-docs-generator/data/toolkits/ticktickapi.json index 98cb71160..fc7b8af35 100644 --- a/toolkit-docs-generator/data/toolkits/ticktickapi.json +++ b/toolkit-docs-generator/data/toolkits/ticktickapi.json @@ -15,7 +15,7 @@ }, "auth": { "type": "oauth2", - "providerId": null, + "providerId": "ticktick", "allScopes": ["tasks:read", "tasks:write"] }, "tools": [ @@ -67,7 +67,7 @@ } ], "auth": { - "providerId": null, + "providerId": "ticktick", "providerType": "oauth2", "scopes": ["tasks:write"] }, @@ -135,7 +135,7 @@ } ], "auth": { - "providerId": null, + "providerId": "ticktick", "providerType": "oauth2", "scopes": ["tasks:write"] }, @@ -188,7 +188,7 @@ } ], "auth": { - "providerId": null, + "providerId": "ticktick", "providerType": "oauth2", "scopes": ["tasks:write"] }, @@ -233,7 +233,7 @@ } ], "auth": { - "providerId": null, + "providerId": "ticktick", "providerType": "oauth2", "scopes": ["tasks:write"] }, @@ -273,7 +273,7 @@ } ], "auth": { - "providerId": null, + "providerId": "ticktick", "providerType": "oauth2", "scopes": ["tasks:read"] }, @@ -304,7 +304,7 @@ "description": "Retrieve all user-accessible projects from Ticktick.\n\nThis tool fetches a list of all projects that the authenticated user has access to in Ticktick. It should be called when a user wants to view or manage their projects within the platform.", "parameters": [], "auth": { - "providerId": null, + "providerId": "ticktick", "providerType": "oauth2", "scopes": ["tasks:read"] }, @@ -346,7 +346,7 @@ } ], "auth": { - "providerId": null, + "providerId": "ticktick", "providerType": "oauth2", "scopes": ["tasks:write"] }, @@ -391,7 +391,7 @@ } ], "auth": { - "providerId": null, + "providerId": "ticktick", "providerType": "oauth2", "scopes": ["tasks:read"] }, @@ -439,7 +439,7 @@ } ], "auth": { - "providerId": null, + "providerId": "ticktick", "providerType": "oauth2", "scopes": ["tasks:read"] }, @@ -524,7 +524,7 @@ } ], "auth": { - "providerId": null, + "providerId": "ticktick", "providerType": "oauth2", "scopes": ["tasks:write"] }, @@ -605,7 +605,7 @@ } ], "auth": { - "providerId": null, + "providerId": "ticktick", "providerType": "oauth2", "scopes": ["tasks:write"] }, diff --git a/toolkit-docs-generator/data/toolkits/zendesk.json b/toolkit-docs-generator/data/toolkits/zendesk.json index 69caa9bd7..82ed0185e 100644 --- a/toolkit-docs-generator/data/toolkits/zendesk.json +++ b/toolkit-docs-generator/data/toolkits/zendesk.json @@ -15,7 +15,7 @@ }, "auth": { "type": "oauth2", - "providerId": null, + "providerId": "zendesk", "allScopes": ["read", "tickets:write"] }, "tools": [ @@ -51,7 +51,7 @@ } ], "auth": { - "providerId": null, + "providerId": "zendesk", "providerType": "oauth2", "scopes": ["tickets:write"] }, @@ -106,7 +106,7 @@ } ], "auth": { - "providerId": null, + "providerId": "zendesk", "providerType": "oauth2", "scopes": ["read"] }, @@ -175,7 +175,7 @@ } ], "auth": { - "providerId": null, + "providerId": "zendesk", "providerType": "oauth2", "scopes": ["read"] }, @@ -251,7 +251,7 @@ } ], "auth": { - "providerId": null, + "providerId": "zendesk", "providerType": "oauth2", "scopes": ["tickets:write"] }, @@ -387,7 +387,7 @@ } ], "auth": { - "providerId": null, + "providerId": "zendesk", "providerType": "oauth2", "scopes": ["read"] }, @@ -473,7 +473,7 @@ "description": "Get comprehensive user profile and Zendesk account information.\n\nThis tool provides detailed information about the authenticated user including\ntheir name, email, role, organization details, and Zendesk account context.", "parameters": [], "auth": { - "providerId": null, + "providerId": "zendesk", "providerType": "oauth2", "scopes": ["read"] }, diff --git a/toolkit-docs-generator/scripts/sync-toolkit-sidebar.ts b/toolkit-docs-generator/scripts/sync-toolkit-sidebar.ts index 9baa3d812..a8e517eda 100644 --- a/toolkit-docs-generator/scripts/sync-toolkit-sidebar.ts +++ b/toolkit-docs-generator/scripts/sync-toolkit-sidebar.ts @@ -467,7 +467,7 @@ export default meta; export function syncToolkitSidebar( options: { dryRun?: boolean; verbose?: boolean; prune?: boolean } = {} ): SyncResult { - const { dryRun = false, verbose = false, prune = false } = options; + const { dryRun = false, verbose = false } = options; const result: SyncResult = { categoriesUpdated: [], @@ -548,17 +548,19 @@ export function syncToolkitSidebar( } } - // Remove empty categories (optional; off by default for safety). - if (prune) { - for (const existingDir of existingDirs) { - if (!activeCategories.includes(existingDir)) { - const categoryDir = join(CONFIG.integrationsDir, existingDir); - log(`Removing empty category: ${existingDir}`); - if (!dryRun) { - rmSync(categoryDir, { recursive: true }); - } - result.categoriesRemoved.push(existingDir); + // Remove category directories that no longer have any toolkits. + // This handles the case where toolkits move between categories (e.g. from + // "others" to "development") and the old category becomes empty. + // The --prune flag is accepted for backward compatibility but cleanup + // always runs to prevent stale sidebar entries and orphaned routes. + for (const existingDir of existingDirs) { + if (!activeCategories.includes(existingDir)) { + const categoryDir = join(CONFIG.integrationsDir, existingDir); + log(`Removing empty category: ${existingDir}`); + if (!dryRun) { + rmSync(categoryDir, { recursive: true }); } + result.categoriesRemoved.push(existingDir); } } diff --git a/toolkit-docs-generator/src/cli/index.ts b/toolkit-docs-generator/src/cli/index.ts index 1bdfb6b1b..19dfa7768 100644 --- a/toolkit-docs-generator/src/cli/index.ts +++ b/toolkit-docs-generator/src/cli/index.ts @@ -42,6 +42,7 @@ import { createCustomSectionsFileSource } from "../sources/custom-sections-file. import { createDesignSystemMetadataSource } from "../sources/design-system-metadata.js"; import { createEmptyCustomSectionsSource } from "../sources/in-memory.js"; import { createMockMetadataSource } from "../sources/mock-metadata.js"; +import { createDesignSystemProviderIdResolver } from "../sources/oauth-provider-resolver.js"; import { createOverviewInstructionsFileSource } from "../sources/overview-instructions-file.js"; import { createArcadeToolkitDataSource, @@ -839,7 +840,6 @@ program .option("--skip-examples", "Skip LLM example generation", false) .option("--skip-summary", "Skip LLM summary generation", false) .option("--skip-overview", "Skip LLM overview generation", false) - .option("--skip-overview", "Skip LLM overview generation", false) .option("--no-verify-output", "Skip output verification") .option("--custom-sections ", "Path to custom sections JSON") .option( @@ -1059,6 +1059,10 @@ program allowMissing: true, }); + // Build provider ID resolver from design system OAuth catalogue + const resolveProviderId = + (await createDesignSystemProviderIdResolver()) ?? undefined; + spinner.succeed("Data sources initialized"); // Create generator (needed early for resume check) @@ -1202,6 +1206,7 @@ program ...(runAll ? { onToolkitProgress } : {}), ...(skipToolkitIds.size > 0 ? { skipToolkitIds } : {}), ...(onToolkitComplete ? { onToolkitComplete } : {}), + ...(resolveProviderId ? { resolveProviderId } : {}), }); // Process toolkits @@ -1284,6 +1289,7 @@ program onToolkitProgress, ...(skipToolkitIds.size > 0 ? { skipToolkitIds } : {}), ...(onToolkitComplete ? { onToolkitComplete } : {}), + ...(resolveProviderId ? { resolveProviderId } : {}), }); spinner.start(progressTracker.getProgressString()); @@ -1687,6 +1693,10 @@ program allowMissing: true, }); + // Build provider ID resolver from design system OAuth catalogue + const resolveProviderId = + (await createDesignSystemProviderIdResolver()) ?? undefined; + spinner.succeed("Data sources initialized"); // Create generator (needed early for resume check) @@ -1799,6 +1809,7 @@ program onToolkitProgress, ...(skipToolkitIds.size > 0 ? { skipToolkitIds } : {}), ...(onToolkitComplete ? { onToolkitComplete } : {}), + ...(resolveProviderId ? { resolveProviderId } : {}), }); spinner.start(progressTracker.getProgressString()); diff --git a/toolkit-docs-generator/src/merger/data-merger.ts b/toolkit-docs-generator/src/merger/data-merger.ts index 416c3c257..e1cad0517 100644 --- a/toolkit-docs-generator/src/merger/data-merger.ts +++ b/toolkit-docs-generator/src/merger/data-merger.ts @@ -15,7 +15,10 @@ import type { ICustomSectionsSource, IOverviewInstructionsSource, } from "../sources/interfaces.js"; -import type { IToolkitDataSource } from "../sources/toolkit-data-source.js"; +import type { + IToolkitDataSource, + ToolkitData, +} from "../sources/toolkit-data-source.js"; import type { CustomSections, DocumentationChunk, @@ -29,6 +32,10 @@ import type { ToolkitMetadata, } from "../types/index.js"; import { mapWithConcurrency } from "../utils/concurrency.js"; +import { + detectMetadataChanges, + formatFreshnessWarnings, +} from "./metadata-freshness.js"; // ============================================================================ // Merger Configuration @@ -59,6 +66,8 @@ export interface DataMergerConfig { onToolkitComplete?: ((result: MergeResult) => Promise) | undefined; /** Set of toolkit IDs to skip (for resume support) */ skipToolkitIds?: ReadonlySet | undefined; + /** Fallback resolver: toolkit ID → OAuth provider ID (design system) */ + resolveProviderId?: ((toolkitId: string) => string | null) | undefined; } export interface FailedTool { @@ -94,6 +103,8 @@ interface MergeToolkitOptions { overviewGenerator?: ToolkitOverviewGenerator; overviewInstructions?: ToolkitOverviewInstructions | null; skipOverview?: boolean; + /** Fallback resolver: toolkit ID → OAuth provider ID (design system) */ + resolveProviderId?: (toolkitId: string) => string | null; } // ============================================================================ @@ -702,7 +713,40 @@ export const mergeToolkit = async ( const description = getToolkitDescription(tools); - const auth = buildToolkitAuth(tools); + // Fallback: resolve OAuth provider IDs from the design system when Engine API returns null. + // We apply this at the tool level (so examples/signatures stay consistent) and then at the + // toolkit level (as a final guard). + const resolvedProviderId = + options.resolveProviderId && + tools.some( + (tool) => + tool.auth?.providerType === "oauth2" && tool.auth.providerId == null + ) + ? options.resolveProviderId(toolkitId) + : null; + + const toolsWithResolvedProviderId = + resolvedProviderId !== null + ? tools.map((tool) => { + if ( + tool.auth?.providerType === "oauth2" && + tool.auth.providerId == null + ) { + return { + ...tool, + auth: { ...tool.auth, providerId: resolvedProviderId }, + }; + } + return tool; + }) + : tools; + + let auth = buildToolkitAuth(toolsWithResolvedProviderId); + + // Fallback: resolve provider ID from design system when Engine API returns null + if (auth && !auth.providerId && resolvedProviderId) { + auth = { ...auth, providerId: resolvedProviderId }; + } const toolChunks = (customSections?.toolChunks ?? {}) as { [key: string]: DocumentationChunk[]; @@ -712,7 +756,7 @@ export const mergeToolkit = async ( options.previousToolkit ); const mergedTools = await buildMergedTools({ - tools, + tools: toolsWithResolvedProviderId, toolChunks, toolExampleGenerator, warnings, @@ -732,6 +776,17 @@ export const mergeToolkit = async ( previousToolkit: options.previousToolkit, }); + // Modular step: detect design system metadata drifts + const freshnessResult = detectMetadataChanges( + toolkitId, + toolkit.metadata, + toolkit.label, + options.previousToolkit + ); + if (freshnessResult) { + warnings.push(...formatFreshnessWarnings(freshnessResult)); + } + await applyOverviewIfNeeded({ toolkit, toolkitId, @@ -773,6 +828,9 @@ export class DataMerger { | ((result: MergeResult) => Promise) | undefined; private readonly skipToolkitIds: ReadonlySet; + private readonly resolveProviderId: + | ((toolkitId: string) => string | null) + | undefined; constructor(config: DataMergerConfig) { this.toolkitDataSource = config.toolkitDataSource; @@ -790,6 +848,7 @@ export class DataMerger { this.onToolkitProgress = config.onToolkitProgress; this.onToolkitComplete = config.onToolkitComplete; this.skipToolkitIds = config.skipToolkitIds ?? new Set(); + this.resolveProviderId = config.resolveProviderId; } private getPreviousToolkit(toolkitId: string): MergedToolkit | undefined { @@ -803,6 +862,84 @@ export class DataMerger { ); } + private buildMergeErrorResult( + toolkitId: string, + message: string + ): MergeResult { + return { + toolkit: { + id: toolkitId, + label: toolkitId, + version: "0.0.0", + description: null, + metadata: { + category: "development", + iconUrl: "", + isBYOC: false, + isPro: false, + type: isStarterToolkitId(toolkitId) ? "arcade_starter" : "arcade", + docsLink: "", + isComingSoon: false, + isHidden: false, + }, + auth: null, + tools: [], + documentationChunks: [], + customImports: [], + subPages: [], + generatedAt: new Date().toISOString(), + }, + warnings: [`Error processing toolkit: ${message}`], + failedTools: [], + }; + } + + private async mergeToolkitEntry( + toolkitId: string, + toolkitData: ToolkitData + ): Promise { + try { + const customSections = + await this.customSectionsSource.getCustomSections(toolkitId); + const overviewInstructions = + await this.overviewInstructionsSource.getOverviewInstructions( + toolkitId + ); + + const previousToolkit = this.getPreviousToolkit(toolkitId); + const result = await mergeToolkit( + toolkitId, + toolkitData.tools, + toolkitData.metadata, + customSections, + this.toolExampleGenerator, + { + ...(previousToolkit ? { previousToolkit } : {}), + llmConcurrency: this.llmConcurrency, + ...(this.overviewGenerator + ? { overviewGenerator: this.overviewGenerator } + : {}), + overviewInstructions, + skipOverview: this.skipOverview, + ...(this.resolveProviderId + ? { resolveProviderId: this.resolveProviderId } + : {}), + } + ); + await this.maybeGenerateSummary(result, previousToolkit); + + // Write immediately if callback provided (incremental mode) + if (this.onToolkitComplete) { + await this.onToolkitComplete(result); + } + + return result; + } catch (error) { + const message = error instanceof Error ? error.message : String(error); + return this.buildMergeErrorResult(toolkitId, message); + } + } + private async maybeGenerateSummary( result: MergeResult, previousToolkit?: MergedToolkit @@ -865,9 +1002,14 @@ export class DataMerger { { ...(previousToolkit ? { previousToolkit } : {}), llmConcurrency: this.llmConcurrency, - overviewGenerator: this.overviewGenerator, + ...(this.overviewGenerator + ? { overviewGenerator: this.overviewGenerator } + : {}), overviewInstructions, skipOverview: this.skipOverview, + ...(this.resolveProviderId + ? { resolveProviderId: this.resolveProviderId } + : {}), } ); await this.maybeGenerateSummary(result, previousToolkit); @@ -893,80 +1035,15 @@ export class DataMerger { async ([toolkitId, toolkitData]) => { this.onToolkitProgress?.(toolkitId, "start"); - try { - const customSections = - await this.customSectionsSource.getCustomSections(toolkitId); - const overviewInstructions = - await this.overviewInstructionsSource.getOverviewInstructions( - toolkitId - ); - - const previousToolkit = this.getPreviousToolkit(toolkitId); - const result = await mergeToolkit( - toolkitId, - toolkitData.tools, - toolkitData.metadata, - customSections, - this.toolExampleGenerator, - { - ...(previousToolkit ? { previousToolkit } : {}), - llmConcurrency: this.llmConcurrency, - overviewGenerator: this.overviewGenerator, - overviewInstructions, - skipOverview: this.skipOverview, - } - ); - await this.maybeGenerateSummary(result, previousToolkit); - - // Write immediately if callback provided (incremental mode) - if (this.onToolkitComplete) { - await this.onToolkitComplete(result); - } + const result = await this.mergeToolkitEntry(toolkitId, toolkitData); - this.onToolkitProgress?.( - toolkitId, - "done", - result.toolkit.tools.length - ); - - return result; - } catch (error) { - // Report error but don't stop processing other toolkits - const message = - error instanceof Error ? error.message : String(error); - const errorResult: MergeResult = { - toolkit: { - id: toolkitId, - label: toolkitId, - version: "0.0.0", - description: null, - metadata: { - category: "development", - iconUrl: "", - isBYOC: false, - isPro: false, - type: isStarterToolkitId(toolkitId) - ? "arcade_starter" - : "arcade", - docsLink: "", - isComingSoon: false, - isHidden: false, - }, - auth: null, - tools: [], - documentationChunks: [], - customImports: [], - subPages: [], - generatedAt: new Date().toISOString(), - }, - warnings: [`Error processing toolkit: ${message}`], - failedTools: [], - }; - - this.onToolkitProgress?.(toolkitId, "done", 0); - - return errorResult; - } + this.onToolkitProgress?.( + toolkitId, + "done", + result.toolkit.tools.length + ); + + return result; }, this.toolkitConcurrency ); diff --git a/toolkit-docs-generator/src/merger/index.ts b/toolkit-docs-generator/src/merger/index.ts index 86f15c8fe..64bcd7804 100644 --- a/toolkit-docs-generator/src/merger/index.ts +++ b/toolkit-docs-generator/src/merger/index.ts @@ -2,3 +2,4 @@ * Merger module exports */ export * from "./data-merger.js"; +export * from "./metadata-freshness.js"; diff --git a/toolkit-docs-generator/src/merger/metadata-freshness.ts b/toolkit-docs-generator/src/merger/metadata-freshness.ts new file mode 100644 index 000000000..9528a243b --- /dev/null +++ b/toolkit-docs-generator/src/merger/metadata-freshness.ts @@ -0,0 +1,162 @@ +/** + * Metadata Freshness Check + * + * Compares the previously generated toolkit metadata with the current + * design system metadata and reports field-level drifts. + * + * This is a modular, pure step that can run as part of the merge pipeline + * or independently (e.g. in a CI check). + */ +import type { MergedToolkit, MergedToolkitMetadata } from "../types/index.js"; + +// ============================================================================ +// Types +// ============================================================================ + +/** A single field that differs between previous and current metadata. */ +export interface MetadataFieldChange { + readonly field: string; + readonly previous: unknown; + readonly current: unknown; +} + +/** Full result of a metadata freshness check for one toolkit. */ +export interface MetadataFreshnessResult { + readonly toolkitId: string; + /** True when the toolkit transitioned from default metadata to real DS data. */ + readonly gainedDesignSystemMetadata: boolean; + /** True when the toolkit label changed. */ + readonly labelChanged: boolean; + readonly previousLabel: string | null; + readonly currentLabel: string | null; + /** Individual field diffs inside MergedToolkitMetadata. */ + readonly fieldChanges: readonly MetadataFieldChange[]; + /** True if there are any changes at all. */ + readonly hasChanges: boolean; +} + +// ============================================================================ +// Helpers +// ============================================================================ + +/** Fields inside MergedToolkitMetadata we compare. */ +const METADATA_FIELDS: ReadonlyArray = [ + "category", + "iconUrl", + "isBYOC", + "isPro", + "type", + "docsLink", + "isComingSoon", + "isHidden", +]; + +/** + * Heuristic: metadata was built from defaults if the iconUrl follows the + * default pattern AND category is "development" (the hardcoded default). + */ +const looksLikeDefaultMetadata = ( + toolkitId: string, + metadata: MergedToolkitMetadata +): boolean => { + const normalized = toolkitId.toLowerCase().replace(/[^a-z0-9]/g, ""); + const expectedDefaultIcon = `https://design-system.arcade.dev/icons/${ + normalized.endsWith("api") ? normalized.slice(0, -3) : normalized + }.svg`; + + return ( + metadata.iconUrl === expectedDefaultIcon && + metadata.category === "development" + ); +}; + +// ============================================================================ +// Core detection (pure) +// ============================================================================ + +/** + * Detect metadata drifts between a previously generated toolkit and the + * current design system metadata. + * + * Returns null when there is no previous toolkit to compare against + * (nothing to check on a brand-new toolkit). + */ +export const detectMetadataChanges = ( + toolkitId: string, + currentMetadata: MergedToolkitMetadata, + currentLabel: string, + previousToolkit: MergedToolkit | undefined +): MetadataFreshnessResult | null => { + if (!previousToolkit) { + return null; + } + + const prev = previousToolkit.metadata; + const fieldChanges: MetadataFieldChange[] = []; + + for (const field of METADATA_FIELDS) { + const prevValue = prev[field]; + const currValue = currentMetadata[field]; + if (prevValue !== currValue) { + fieldChanges.push({ field, previous: prevValue, current: currValue }); + } + } + + const labelChanged = previousToolkit.label !== currentLabel; + + const gainedDesignSystemMetadata = + looksLikeDefaultMetadata(toolkitId, prev) && + !looksLikeDefaultMetadata(toolkitId, currentMetadata); + + const hasChanges = + fieldChanges.length > 0 || labelChanged || gainedDesignSystemMetadata; + + return { + toolkitId, + gainedDesignSystemMetadata, + labelChanged, + previousLabel: previousToolkit.label, + currentLabel, + fieldChanges, + hasChanges, + }; +}; + +// ============================================================================ +// Warning formatter (for merge pipeline integration) +// ============================================================================ + +/** + * Convert a freshness result into human-readable warning strings + * suitable for the merge pipeline's `warnings` array. + */ +export const formatFreshnessWarnings = ( + result: MetadataFreshnessResult +): string[] => { + if (!result.hasChanges) { + return []; + } + + const warnings: string[] = []; + const prefix = `[metadata-freshness] ${result.toolkitId}`; + + if (result.gainedDesignSystemMetadata) { + warnings.push( + `${prefix}: now has design system metadata (was using defaults)` + ); + } + + if (result.labelChanged) { + warnings.push( + `${prefix}: label changed "${result.previousLabel}" → "${result.currentLabel}"` + ); + } + + for (const change of result.fieldChanges) { + warnings.push( + `${prefix}: ${change.field} changed ${JSON.stringify(change.previous)} → ${JSON.stringify(change.current)}` + ); + } + + return warnings; +}; diff --git a/toolkit-docs-generator/src/sources/engine-api.ts b/toolkit-docs-generator/src/sources/engine-api.ts index 47e83df64..eb5efee15 100644 --- a/toolkit-docs-generator/src/sources/engine-api.ts +++ b/toolkit-docs-generator/src/sources/engine-api.ts @@ -87,11 +87,12 @@ export class EngineApiSource implements IToolDataSource { const url = new URL(this.endpoint); url.searchParams.set("limit", String(this.pageSize)); url.searchParams.set("offset", String(offset)); + // latest_only defaults to true on the server; set to false when we need all versions const includeAllVersions = options?.version ? true : this.includeAllVersions; if (includeAllVersions) { - url.searchParams.set("include_all_versions", "true"); + url.searchParams.set("latest_only", "false"); } if (options?.toolkitId) { @@ -101,7 +102,7 @@ export class EngineApiSource implements IToolDataSource { url.searchParams.set("version", options.version); } if (options?.providerId) { - url.searchParams.set("provider_id", options.providerId); + url.searchParams.set("auth_provider", options.providerId); } const response = await this.fetchFn(url.toString(), { diff --git a/toolkit-docs-generator/src/sources/index.ts b/toolkit-docs-generator/src/sources/index.ts index 015b7664f..9091c565d 100644 --- a/toolkit-docs-generator/src/sources/index.ts +++ b/toolkit-docs-generator/src/sources/index.ts @@ -11,6 +11,7 @@ export * from "./in-memory.js"; export * from "./interfaces.js"; export * from "./mock-engine-api.js"; export * from "./mock-metadata.js"; +export * from "./oauth-provider-resolver.js"; export * from "./overview-instructions-file.js"; export * from "./toolkit-data-source.js"; diff --git a/toolkit-docs-generator/src/sources/oauth-provider-resolver.ts b/toolkit-docs-generator/src/sources/oauth-provider-resolver.ts new file mode 100644 index 000000000..10f82ea95 --- /dev/null +++ b/toolkit-docs-generator/src/sources/oauth-provider-resolver.ts @@ -0,0 +1,117 @@ +/** + * OAuth Provider ID Resolver + * + * Resolves toolkit IDs to OAuth provider IDs using the design system's + * OAUTH_PROVIDER_CATALOGUE. This provides a fallback when the Engine API + * returns provider_id: null for toolkits that have known OAuth providers. + * + * Resolution strategy: + * 1. Exact match (normalized toolkit ID against catalogue keys) + * 2. Strip "api" suffix and try again + * 3. Longest-prefix match (e.g. "hubspotcrm" → "hubspot") + */ + +// ============================================================================ +// Types +// ============================================================================ + +/** Callback that resolves a toolkit ID to an OAuth provider ID, or null. */ +export type ProviderIdResolver = (toolkitId: string) => string | null; + +// ============================================================================ +// Helpers +// ============================================================================ + +const NORMALIZER = /[^a-z0-9]/g; + +/** + * Minimum provider ID length for prefix matching. + * Prevents false positives like "xero" matching "x" (X/Twitter). + */ +const MIN_PREFIX_LENGTH = 3; + +/** Lowercase and strip non-alphanumeric characters. */ +export const normalizeLookup = (value: string): string => + value.toLowerCase().replace(NORMALIZER, ""); + +// ============================================================================ +// Core resolver builder (pure, no external dependencies) +// ============================================================================ + +/** + * Build a provider ID resolver from a set of known provider IDs. + * + * The returned function maps a toolkit ID (e.g. "HubspotCrmApi") to the best + * matching provider ID (e.g. "hubspot"), or null if no match is found. + */ +export function buildProviderIdResolver( + knownProviderIds: ReadonlySet +): ProviderIdResolver { + // Pre-sort by length descending so the longest prefix wins. + const sortedByLength = [...knownProviderIds].sort( + (a, b) => b.length - a.length + ); + + return (toolkitId: string): string | null => { + const normalized = normalizeLookup(toolkitId); + + // 1. Exact match + if (knownProviderIds.has(normalized)) { + return normalized; + } + + // 2. Strip "api" suffix + if (normalized.endsWith("api")) { + const base = normalized.slice(0, -3); + + if (knownProviderIds.has(base)) { + return base; + } + + // 3. Longest-prefix match on the base (e.g. "hubspotcrm" → "hubspot") + // Require the prefix to be at least 3 chars to avoid false positives + // (e.g. "xero" should NOT match "x"). + for (const providerId of sortedByLength) { + if ( + providerId.length >= MIN_PREFIX_LENGTH && + base.startsWith(providerId) && + base !== providerId + ) { + return providerId; + } + } + } + + return null; + }; +} + +// ============================================================================ +// Design System factory (dynamic import) +// ============================================================================ + +/** + * Create a provider ID resolver from the design system's OAUTH_PROVIDER_CATALOGUE. + * + * Uses a dynamic import so the generator can still run in environments where + * `@arcadeai/design-system` is not installed (returns null in that case). + */ +export async function createDesignSystemProviderIdResolver(): Promise { + try { + const designSystem = await import("@arcadeai/design-system"); + const catalogue = ( + designSystem as { + OAUTH_PROVIDER_CATALOGUE?: Record; + } + ).OAUTH_PROVIDER_CATALOGUE; + + if (!catalogue || typeof catalogue !== "object") { + return null; + } + + const knownIds = new Set(Object.keys(catalogue)); + return buildProviderIdResolver(knownIds); + } catch { + return null; + } +} diff --git a/toolkit-docs-generator/src/sources/tool-metadata-schema.ts b/toolkit-docs-generator/src/sources/tool-metadata-schema.ts index 79b7d115b..996b476a8 100644 --- a/toolkit-docs-generator/src/sources/tool-metadata-schema.ts +++ b/toolkit-docs-generator/src/sources/tool-metadata-schema.ts @@ -49,7 +49,10 @@ const ToolMetadataSecretSchema = z.union([ const ToolMetadataRequirementsSchema = z .object({ - authorization: ToolMetadataAuthorizationSchema.optional(), + authorization: z + .array(ToolMetadataAuthorizationSchema) + .nullable() + .optional(), secrets: z.array(ToolMetadataSecretSchema).nullable().optional(), }) .nullable() @@ -68,6 +71,9 @@ const ToolMetadataItemSchema = z.object({ export const ToolMetadataResponseSchema = z.object({ items: z.array(ToolMetadataItemSchema), + limit: z.number().optional(), + offset: z.number().optional(), + page_count: z.number().optional(), total_count: z.number(), }); @@ -135,29 +141,33 @@ const normalizeSecrets = ( export const transformToolMetadataItem = ( apiTool: ToolMetadataItem -): ToolDefinition => ({ - name: apiTool.name, - qualifiedName: apiTool.qualified_name, - fullyQualifiedName: apiTool.fully_qualified_name, - description: apiTool.description, - toolkitDescription: apiTool.toolkit.description, - parameters: apiTool.input.parameters.map(transformParameter), - auth: apiTool.requirements?.authorization - ? { - providerId: apiTool.requirements.authorization.provider_id ?? null, - providerType: - apiTool.requirements.authorization.provider_type ?? "unknown", - scopes: apiTool.requirements.authorization.scopes ?? [], - } - : null, - secrets: normalizeSecrets(apiTool.requirements?.secrets), - output: apiTool.output - ? { - type: apiTool.output.value_schema?.val_type ?? "unknown", - description: apiTool.output.description ?? null, - } - : null, -}); +): ToolDefinition => { + // authorization is now an array; pick the first entry (most tools have 0 or 1) + const authEntry = apiTool.requirements?.authorization?.[0] ?? null; + + return { + name: apiTool.name, + qualifiedName: apiTool.qualified_name, + fullyQualifiedName: apiTool.fully_qualified_name, + description: apiTool.description, + toolkitDescription: apiTool.toolkit.description, + parameters: apiTool.input.parameters.map(transformParameter), + auth: authEntry + ? { + providerId: authEntry.provider_id ?? null, + providerType: authEntry.provider_type ?? "unknown", + scopes: authEntry.scopes ?? [], + } + : null, + secrets: normalizeSecrets(apiTool.requirements?.secrets), + output: apiTool.output + ? { + type: apiTool.output.value_schema?.val_type ?? "unknown", + description: apiTool.output.description ?? null, + } + : null, + }; +}; export const parseToolMetadataResponse = ( payload: unknown diff --git a/toolkit-docs-generator/tests/fixtures/engine-api-response.json b/toolkit-docs-generator/tests/fixtures/engine-api-response.json index 8161a95dc..f6db674ef 100644 --- a/toolkit-docs-generator/tests/fixtures/engine-api-response.json +++ b/toolkit-docs-generator/tests/fixtures/engine-api-response.json @@ -79,13 +79,15 @@ } }, "requirements": { - "authorization": { - "id": "github_oauth", - "provider_id": "github", - "provider_type": "oauth2", - "scopes": ["repo"] - }, - "secrets": null + "authorization": [ + { + "id": "github_oauth", + "provider_id": "github", + "provider_type": "oauth2", + "scopes": ["repo"] + } + ], + "secrets": [] } }, { @@ -145,13 +147,15 @@ } }, "requirements": { - "authorization": { - "id": "github_oauth", - "provider_id": "github", - "provider_type": "oauth2", - "scopes": ["public_repo"] - }, - "secrets": null + "authorization": [ + { + "id": "github_oauth", + "provider_id": "github", + "provider_type": "oauth2", + "scopes": ["public_repo"] + } + ], + "secrets": [] } }, { @@ -222,13 +226,15 @@ } }, "requirements": { - "authorization": { - "id": "github_oauth", - "provider_id": "github", - "provider_type": "oauth2", - "scopes": ["repo"] - }, - "secrets": null + "authorization": [ + { + "id": "github_oauth", + "provider_id": "github", + "provider_type": "oauth2", + "scopes": ["repo"] + } + ], + "secrets": [] } }, { @@ -277,13 +283,15 @@ } }, "requirements": { - "authorization": { - "id": "slack_oauth", - "provider_id": "slack", - "provider_type": "oauth2", - "scopes": ["chat:write"] - }, - "secrets": null + "authorization": [ + { + "id": "slack_oauth", + "provider_id": "slack", + "provider_type": "oauth2", + "scopes": ["chat:write"] + } + ], + "secrets": [] } }, { @@ -321,15 +329,20 @@ } }, "requirements": { - "authorization": { - "id": "slack_oauth", - "provider_id": "slack", - "provider_type": "oauth2", - "scopes": ["channels:read"] - }, - "secrets": null + "authorization": [ + { + "id": "slack_oauth", + "provider_id": "slack", + "provider_type": "oauth2", + "scopes": ["channels:read"] + } + ], + "secrets": [] } } ], + "limit": 25, + "offset": 0, + "page_count": 5, "total_count": 5 } diff --git a/toolkit-docs-generator/tests/merger/data-merger.test.ts b/toolkit-docs-generator/tests/merger/data-merger.test.ts index 0b418253c..cf71a3358 100644 --- a/toolkit-docs-generator/tests/merger/data-merger.test.ts +++ b/toolkit-docs-generator/tests/merger/data-merger.test.ts @@ -724,6 +724,141 @@ describe("mergeToolkit", () => { }); }); +// ============================================================================ +// mergeToolkit provider ID fallback tests +// ============================================================================ + +describe("mergeToolkit resolveProviderId fallback", () => { + it("uses resolveProviderId when tools have null providerId", async () => { + const tools = [ + createTool({ + name: "ReadAccount", + qualifiedName: "Salesforce.ReadAccount", + fullyQualifiedName: "Salesforce.ReadAccount@2.0.1", + auth: { providerId: null, providerType: "oauth2", scopes: ["read"] }, + }), + ]; + + const result = await mergeToolkit( + "Salesforce", + tools, + createMetadata({ id: "Salesforce", label: "Salesforce" }), + null, + undefined, + { + resolveProviderId: (toolkitId) => + toolkitId === "Salesforce" ? "salesforce" : null, + } + ); + + expect(result.toolkit.auth?.providerId).toBe("salesforce"); + expect(result.toolkit.tools[0]?.auth?.providerId).toBe("salesforce"); + }); + + it("does NOT override an existing non-null providerId from tools", async () => { + const tools = [ + createTool({ + name: "CreateIssue", + qualifiedName: "Github.CreateIssue", + fullyQualifiedName: "Github.CreateIssue@2.0.1", + auth: { + providerId: "github", + providerType: "oauth2", + scopes: ["repo"], + }, + }), + ]; + + const result = await mergeToolkit( + "Github", + tools, + createMetadata({ id: "Github", label: "GitHub" }), + null, + undefined, + { + resolveProviderId: () => "should-not-be-used", + } + ); + + expect(result.toolkit.auth?.providerId).toBe("github"); + }); + + it("does NOT call resolver when tools have no auth at all", async () => { + let resolverCalled = false; + const tools = [ + createTool({ + name: "PublicTool", + qualifiedName: "NoAuth.PublicTool", + fullyQualifiedName: "NoAuth.PublicTool@1.0.0", + auth: null, + secrets: [], + }), + ]; + + const result = await mergeToolkit( + "NoAuth", + tools, + createMetadata({ id: "NoAuth", label: "No Auth" }), + null, + undefined, + { + resolveProviderId: () => { + resolverCalled = true; + return "unexpected"; + }, + } + ); + + expect(result.toolkit.auth).toBeNull(); + expect(resolverCalled).toBe(false); + }); + + it("leaves providerId null when resolver returns null", async () => { + const tools = [ + createTool({ + name: "SomeTool", + qualifiedName: "Unknown.SomeTool", + fullyQualifiedName: "Unknown.SomeTool@1.0.0", + auth: { providerId: null, providerType: "oauth2", scopes: [] }, + }), + ]; + + const result = await mergeToolkit( + "Unknown", + tools, + createMetadata({ id: "Unknown", label: "Unknown" }), + null, + undefined, + { + resolveProviderId: () => null, + } + ); + + expect(result.toolkit.auth?.providerId).toBeNull(); + }); + + it("leaves providerId null when no resolver is provided", async () => { + const tools = [ + createTool({ + name: "SomeTool", + qualifiedName: "Unknown.SomeTool", + fullyQualifiedName: "Unknown.SomeTool@1.0.0", + auth: { providerId: null, providerType: "oauth2", scopes: [] }, + }), + ]; + + const result = await mergeToolkit( + "Unknown", + tools, + createMetadata({ id: "Unknown", label: "Unknown" }), + null, + undefined + ); + + expect(result.toolkit.auth?.providerId).toBeNull(); + }); +}); + describe("mergeToolkit overview handling", () => { it("replaces existing overview when instructions are present", async () => { const tool = createTool(); diff --git a/toolkit-docs-generator/tests/merger/metadata-freshness.test.ts b/toolkit-docs-generator/tests/merger/metadata-freshness.test.ts new file mode 100644 index 000000000..4973bf9e5 --- /dev/null +++ b/toolkit-docs-generator/tests/merger/metadata-freshness.test.ts @@ -0,0 +1,493 @@ +/** + * Tests for the Metadata Freshness Check module. + * + * Validates detection of design system metadata drifts between + * previously generated toolkits and the current design system state. + */ +import { describe, expect, it } from "vitest"; +import { + detectMetadataChanges, + formatFreshnessWarnings, + type MetadataFreshnessResult, +} from "../../src/merger/metadata-freshness.js"; +import type { + MergedToolkit, + MergedToolkitMetadata, +} from "../../src/types/index.js"; + +// ============================================================================ +// Fixtures +// ============================================================================ + +const createMetadata = ( + overrides: Partial = {} +): MergedToolkitMetadata => ({ + category: "development", + iconUrl: "https://design-system.arcade.dev/icons/github.svg", + isBYOC: false, + isPro: false, + type: "arcade", + docsLink: "https://docs.arcade.dev/en/mcp-servers/development/github", + isComingSoon: false, + isHidden: false, + ...overrides, +}); + +const createPreviousToolkit = ( + overrides: Partial & { + metadata?: Partial; + label?: string; + } = {} +): MergedToolkit => { + const { metadata: metaOverrides, ...rest } = overrides; + return { + id: "Github", + label: "GitHub", + version: "2.0.1", + description: "Test toolkit", + metadata: createMetadata(metaOverrides), + auth: null, + tools: [], + documentationChunks: [], + customImports: [], + subPages: [], + generatedAt: new Date().toISOString(), + ...rest, + }; +}; + +const assertNonNull = (value: T | null): T => { + if (value === null) { + throw new Error("Expected value to be non-null"); + } + return value; +}; + +// ============================================================================ +// detectMetadataChanges +// ============================================================================ + +describe("detectMetadataChanges", () => { + it("returns null when there is no previous toolkit", () => { + const result = detectMetadataChanges( + "Github", + createMetadata(), + "GitHub", + undefined + ); + + expect(result).toBeNull(); + }); + + it("reports no changes when metadata is identical", () => { + const previous = createPreviousToolkit(); + const result = assertNonNull( + detectMetadataChanges("Github", createMetadata(), "GitHub", previous) + ); + + expect(result.hasChanges).toBe(false); + expect(result.fieldChanges).toHaveLength(0); + expect(result.labelChanged).toBe(false); + expect(result.gainedDesignSystemMetadata).toBe(false); + }); + + it("detects a single field change (iconUrl)", () => { + const previous = createPreviousToolkit({ + metadata: { iconUrl: "https://old-cdn.example.com/github.svg" }, + }); + + const result = assertNonNull( + detectMetadataChanges("Github", createMetadata(), "GitHub", previous) + ); + + expect(result.hasChanges).toBe(true); + expect(result.fieldChanges).toHaveLength(1); + expect(result.fieldChanges[0]).toEqual({ + field: "iconUrl", + previous: "https://old-cdn.example.com/github.svg", + current: "https://design-system.arcade.dev/icons/github.svg", + }); + }); + + it("detects multiple field changes", () => { + const previous = createPreviousToolkit({ + metadata: { + category: "social", + isPro: true, + isHidden: true, + }, + }); + + const current = createMetadata({ + category: "development", + isPro: false, + isHidden: false, + }); + + const result = assertNonNull( + detectMetadataChanges("Github", current, "GitHub", previous) + ); + + expect(result.hasChanges).toBe(true); + expect(result.fieldChanges).toHaveLength(3); + + const changedFields = result.fieldChanges.map((c) => c.field); + expect(changedFields).toContain("category"); + expect(changedFields).toContain("isPro"); + expect(changedFields).toContain("isHidden"); + }); + + it("detects label change", () => { + const previous = createPreviousToolkit({ label: "Github" }); + + const result = assertNonNull( + detectMetadataChanges("Github", createMetadata(), "GitHub", previous) + ); + + expect(result.hasChanges).toBe(true); + expect(result.labelChanged).toBe(true); + expect(result.previousLabel).toBe("Github"); + expect(result.currentLabel).toBe("GitHub"); + expect(result.fieldChanges).toHaveLength(0); + }); + + it("detects transition from default metadata to real DS metadata", () => { + // Previous used defaults: development category + default icon URL pattern + const previous = createPreviousToolkit({ + id: "Pylon", + label: "Pylon", + metadata: { + category: "development", + iconUrl: "https://design-system.arcade.dev/icons/pylon.svg", + docsLink: "https://docs.arcade.dev/en/mcp-servers/development/pylon", + }, + }); + + // Now has real DS metadata with correct category and icon + const current = createMetadata({ + category: "customer-support", + iconUrl: "https://design-system.arcade.dev/icons/pylon.svg", + docsLink: "https://docs.arcade.dev/en/mcp-servers/customer-support/pylon", + }); + + const result = assertNonNull( + detectMetadataChanges("Pylon", current, "Pylon", previous) + ); + + expect(result.hasChanges).toBe(true); + expect(result.gainedDesignSystemMetadata).toBe(true); + // Also reports individual field diffs + const changedFields = result.fieldChanges.map((c) => c.field); + expect(changedFields).toContain("category"); + expect(changedFields).toContain("docsLink"); + }); + + it("does NOT flag gainedDesignSystemMetadata for non-default previous", () => { + // Previous already had real DS metadata (category is "sales", not default) + const previous = createPreviousToolkit({ + id: "Salesforce", + label: "Salesforce", + metadata: { + category: "sales", + iconUrl: "https://design-system.arcade.dev/icons/salesforce.svg", + }, + }); + + const current = createMetadata({ + category: "sales", + iconUrl: "https://design-system.arcade.dev/icons/salesforce-new.svg", + }); + + const result = detectMetadataChanges( + "Salesforce", + current, + "Salesforce", + previous + ); + + const nonNullResult = assertNonNull(result); + + expect(nonNullResult.gainedDesignSystemMetadata).toBe(false); + // But still detects the iconUrl change + expect(nonNullResult.hasChanges).toBe(true); + expect(nonNullResult.fieldChanges).toHaveLength(1); + expect(nonNullResult.fieldChanges[0]?.field).toBe("iconUrl"); + }); + + it("handles *Api toolkit default detection correctly", () => { + // PylonApi defaults: icon is "pylon.svg" (api stripped), category is "development" + const previous = createPreviousToolkit({ + id: "PylonApi", + label: "PylonApi", + metadata: { + category: "development", + iconUrl: "https://design-system.arcade.dev/icons/pylon.svg", + }, + }); + + const current = createMetadata({ + category: "customer-support", + iconUrl: "https://design-system.arcade.dev/icons/pylon.svg", + }); + + const result = detectMetadataChanges( + "PylonApi", + current, + "Pylon API", + previous + ); + + const nonNullResult = assertNonNull(result); + expect(nonNullResult.gainedDesignSystemMetadata).toBe(true); + expect(nonNullResult.labelChanged).toBe(true); + }); +}); + +// ============================================================================ +// formatFreshnessWarnings +// ============================================================================ + +describe("formatFreshnessWarnings", () => { + it("returns empty array when there are no changes", () => { + const result: MetadataFreshnessResult = { + toolkitId: "Github", + gainedDesignSystemMetadata: false, + labelChanged: false, + previousLabel: "GitHub", + currentLabel: "GitHub", + fieldChanges: [], + hasChanges: false, + }; + + expect(formatFreshnessWarnings(result)).toEqual([]); + }); + + it("formats gained DS metadata warning", () => { + const result: MetadataFreshnessResult = { + toolkitId: "Pylon", + gainedDesignSystemMetadata: true, + labelChanged: false, + previousLabel: "Pylon", + currentLabel: "Pylon", + fieldChanges: [], + hasChanges: true, + }; + + const warnings = formatFreshnessWarnings(result); + expect(warnings).toHaveLength(1); + expect(warnings[0]).toContain("[metadata-freshness]"); + expect(warnings[0]).toContain("Pylon"); + expect(warnings[0]).toContain("design system metadata"); + }); + + it("formats label change warning", () => { + const result: MetadataFreshnessResult = { + toolkitId: "Github", + gainedDesignSystemMetadata: false, + labelChanged: true, + previousLabel: "Github", + currentLabel: "GitHub", + fieldChanges: [], + hasChanges: true, + }; + + const warnings = formatFreshnessWarnings(result); + expect(warnings).toHaveLength(1); + expect(warnings[0]).toContain('label changed "Github" → "GitHub"'); + }); + + it("formats field change warnings", () => { + const result: MetadataFreshnessResult = { + toolkitId: "Salesforce", + gainedDesignSystemMetadata: false, + labelChanged: false, + previousLabel: "Salesforce", + currentLabel: "Salesforce", + fieldChanges: [ + { field: "iconUrl", previous: "old.svg", current: "new.svg" }, + { field: "category", previous: "development", current: "sales" }, + ], + hasChanges: true, + }; + + const warnings = formatFreshnessWarnings(result); + expect(warnings).toHaveLength(2); + expect(warnings[0]).toContain("iconUrl changed"); + expect(warnings[1]).toContain("category changed"); + }); + + it("combines all warning types", () => { + const result: MetadataFreshnessResult = { + toolkitId: "Pylon", + gainedDesignSystemMetadata: true, + labelChanged: true, + previousLabel: "Pylon", + currentLabel: "Pylon Support", + fieldChanges: [ + { + field: "category", + previous: "development", + current: "customer-support", + }, + ], + hasChanges: true, + }; + + const warnings = formatFreshnessWarnings(result); + // 1 gained DS + 1 label + 1 field = 3 + expect(warnings).toHaveLength(3); + }); +}); + +// ============================================================================ +// Integration with mergeToolkit (via data-merger.test.ts) +// ============================================================================ + +describe("mergeToolkit metadata freshness integration", () => { + // These tests import mergeToolkit to verify the step runs end-to-end + // We reuse a minimal import here since data-merger.test.ts already + // covers the happy path extensively. + + it("emits warnings when previous toolkit metadata differs", async () => { + const { mergeToolkit } = await import("../../src/merger/data-merger.js"); + + const tool = { + name: "TestTool", + qualifiedName: "TestKit.TestTool", + fullyQualifiedName: "TestKit.TestTool@1.0.0", + description: "A test tool", + toolkitDescription: "Toolkit", + parameters: [], + auth: null, + secrets: [], + output: null, + }; + + const metadata = { + id: "TestKit", + label: "Test Kit", + category: "sales" as const, + iconUrl: "https://design-system.arcade.dev/icons/testkit.svg", + isBYOC: false, + isPro: false, + type: "arcade" as const, + docsLink: "https://docs.arcade.dev/en/mcp-servers/sales/testkit", + isComingSoon: false, + isHidden: false, + }; + + // Previous toolkit had category "development" + const previousToolkit = { + id: "TestKit", + label: "Test Kit", + version: "1.0.0", + description: "Old", + metadata: { + category: "development" as const, + iconUrl: "https://design-system.arcade.dev/icons/testkit.svg", + isBYOC: false, + isPro: false, + type: "arcade" as const, + docsLink: "https://docs.arcade.dev/en/mcp-servers/development/testkit", + isComingSoon: false, + isHidden: false, + }, + auth: null, + tools: [], + documentationChunks: [], + customImports: [], + subPages: [], + generatedAt: new Date().toISOString(), + }; + + const result = await mergeToolkit( + "TestKit", + [tool], + metadata, + null, + undefined, + { + previousToolkit, + } + ); + + const freshnessWarnings = result.warnings.filter((w) => + w.includes("[metadata-freshness]") + ); + expect(freshnessWarnings.length).toBeGreaterThan(0); + expect(freshnessWarnings.some((w) => w.includes("category changed"))).toBe( + true + ); + expect(freshnessWarnings.some((w) => w.includes("docsLink changed"))).toBe( + true + ); + }); + + it("emits no freshness warnings when metadata is unchanged", async () => { + const { mergeToolkit } = await import("../../src/merger/data-merger.js"); + + const tool = { + name: "TestTool", + qualifiedName: "TestKit.TestTool", + fullyQualifiedName: "TestKit.TestTool@1.0.0", + description: "A test tool", + toolkitDescription: "Toolkit", + parameters: [], + auth: null, + secrets: [], + output: null, + }; + + const metadata = { + id: "TestKit", + label: "Test Kit", + category: "development" as const, + iconUrl: "https://design-system.arcade.dev/icons/testkit.svg", + isBYOC: false, + isPro: false, + type: "arcade" as const, + docsLink: "https://docs.arcade.dev/en/mcp-servers/development/testkit", + isComingSoon: false, + isHidden: false, + }; + + const previousToolkit = { + id: "TestKit", + label: "Test Kit", + version: "1.0.0", + description: "Same", + metadata: { + category: "development" as const, + iconUrl: "https://design-system.arcade.dev/icons/testkit.svg", + isBYOC: false, + isPro: false, + type: "arcade" as const, + docsLink: "https://docs.arcade.dev/en/mcp-servers/development/testkit", + isComingSoon: false, + isHidden: false, + }, + auth: null, + tools: [], + documentationChunks: [], + customImports: [], + subPages: [], + generatedAt: new Date().toISOString(), + }; + + const result = await mergeToolkit( + "TestKit", + [tool], + metadata, + null, + undefined, + { + previousToolkit, + } + ); + + const freshnessWarnings = result.warnings.filter((w) => + w.includes("[metadata-freshness]") + ); + expect(freshnessWarnings).toHaveLength(0); + }); +}); diff --git a/toolkit-docs-generator/tests/scripts/sync-toolkit-sidebar.test.ts b/toolkit-docs-generator/tests/scripts/sync-toolkit-sidebar.test.ts index 1ad50c6f3..8c6b466f6 100644 --- a/toolkit-docs-generator/tests/scripts/sync-toolkit-sidebar.test.ts +++ b/toolkit-docs-generator/tests/scripts/sync-toolkit-sidebar.test.ts @@ -532,3 +532,131 @@ describe("syncToolkitSidebar", () => { }); }); }); + +// ============================================================================ +// Category move / cleanup logic +// ============================================================================ + +describe("category move cleanup logic", () => { + it("toolkit moved to a new category is removed from the old one", () => { + // Simulate: Pylon was in "others", now design system says "development" + const toolkits: ToolkitInfo[] = [ + { + id: "Pylon", + slug: "pylon", + label: "Pylon", + category: "development", + navGroup: "optimized", + }, + { + id: "Github", + slug: "github", + label: "GitHub", + category: "development", + navGroup: "optimized", + }, + ]; + + const grouped = groupByCategory(toolkits); + const activeCategories = Array.from(grouped.keys()); + + // "others" is no longer an active category + expect(activeCategories).not.toContain("others"); + expect(activeCategories).toContain("development"); + + // The development category contains Pylon + const devToolkits = grouped.get("development"); + expect(devToolkits?.some((t) => t.id === "Pylon")).toBe(true); + }); + + it("old category directory is identified for removal when empty", () => { + const toolkits: ToolkitInfo[] = [ + { + id: "Pylon", + slug: "pylon", + label: "Pylon", + category: "development", + navGroup: "optimized", + }, + ]; + + const grouped = groupByCategory(toolkits); + const activeCategories = Array.from(grouped.keys()); + + // Simulate existing directories on disk + const existingDirs = ["development", "others", "productivity"]; + + // Directories not in activeCategories should be removed + const toRemove = existingDirs.filter( + (dir) => !activeCategories.includes(dir) + ); + + expect(toRemove).toContain("others"); + expect(toRemove).toContain("productivity"); + expect(toRemove).not.toContain("development"); + }); + + it("category with remaining toolkits is NOT removed when one toolkit moves out", () => { + // "others" still has CustomTool, even though Pylon moved to "development" + const toolkits: ToolkitInfo[] = [ + { + id: "Pylon", + slug: "pylon", + label: "Pylon", + category: "development", + navGroup: "optimized", + }, + { + id: "CustomTool", + slug: "custom-tool", + label: "Custom Tool", + category: "others", + navGroup: "optimized", + }, + ]; + + const grouped = groupByCategory(toolkits); + const activeCategories = Array.from(grouped.keys()); + + expect(activeCategories).toContain("others"); + expect(activeCategories).toContain("development"); + + // "others" still has one toolkit so it won't be pruned + expect(grouped.get("others")).toHaveLength(1); + + // But Pylon is NOT in "others" anymore + const othersToolkits = grouped.get("others"); + expect(othersToolkits?.some((t) => t.id === "Pylon")).toBe(false); + }); + + it("generateCategoryMeta only includes current toolkits (not stale ones)", () => { + // After Pylon moves, the "others" _meta.tsx should only contain remaining toolkits + const othersToolkits: ToolkitInfo[] = [ + { + id: "CustomTool", + slug: "custom-tool", + label: "Custom Tool", + category: "others", + navGroup: "optimized", + }, + ]; + + const meta = generateCategoryMeta( + othersToolkits, + "others", + "/en/resources/integrations" + ); + + expect(meta).toContain("custom-tool"); + expect(meta).not.toContain("pylon"); + }); + + it("main _meta.tsx excludes categories with zero toolkits", () => { + const activeCategories = ["development", "productivity"]; + const mainMeta = generateMainMeta(activeCategories); + + expect(mainMeta).toContain("development:"); + expect(mainMeta).toContain("productivity:"); + expect(mainMeta).not.toContain("others:"); + }); +}); diff --git a/toolkit-docs-generator/tests/sources/engine-api.test.ts b/toolkit-docs-generator/tests/sources/engine-api.test.ts index a51fb3e44..3936eef5f 100644 --- a/toolkit-docs-generator/tests/sources/engine-api.test.ts +++ b/toolkit-docs-generator/tests/sources/engine-api.test.ts @@ -34,13 +34,13 @@ type ToolMetadataItem = { } | null; } | null; requirements?: { - authorization: { + authorization: Array<{ id?: string | null; provider_id: string | null; provider_type: string | null; scopes: string[]; - } | null; - secrets: Array<{ key: string }> | null; + }>; + secrets: Array<{ key: string }>; } | null; }; @@ -58,11 +58,13 @@ const createItems = (): ToolMetadataItem[] => [ input: { parameters: [] }, output: null, requirements: { - authorization: { - provider_id: "github", - provider_type: "oauth2", - scopes: ["repo"], - }, + authorization: [ + { + provider_id: "github", + provider_type: "oauth2", + scopes: ["repo"], + }, + ], secrets: [{ key: "GITHUB_API_KEY" }], }, }, @@ -82,12 +84,14 @@ const createItems = (): ToolMetadataItem[] => [ value_schema: null, }, requirements: { - authorization: { - provider_id: null, - provider_type: "oauth2", - scopes: ["chat:write"], - }, - secrets: null, + authorization: [ + { + provider_id: null, + provider_type: "oauth2", + scopes: ["chat:write"], + }, + ], + secrets: [], }, }, ]; @@ -103,16 +107,18 @@ const createFetchStub = const limit = Number(url.searchParams.get("limit") ?? items.length); const offset = Number(url.searchParams.get("offset") ?? 0); const toolkit = url.searchParams.get("toolkit"); - const providerId = url.searchParams.get("provider_id"); + const authProvider = url.searchParams.get("auth_provider"); const version = url.searchParams.get("version"); let filtered = items; if (toolkit) { filtered = filtered.filter((item) => item.toolkit.name === toolkit); } - if (providerId) { - filtered = filtered.filter( - (item) => item.requirements?.authorization?.provider_id === providerId + if (authProvider) { + filtered = filtered.filter((item) => + item.requirements?.authorization?.some( + (auth) => auth.provider_id === authProvider + ) ); } if (version) { @@ -253,12 +259,12 @@ describe("EngineApiSource", () => { await source.fetchAllTools(); }); - it("forces include_all_versions when filtering by version", async () => { + it("sets latest_only=false when filtering by version", async () => { const source = new EngineApiSource({ baseUrl: "https://api.arcade.dev", apiKey: "test", fetchFn: createInspectFetchStub((params) => { - expect(params.get("include_all_versions")).toBe("true"); + expect(params.get("latest_only")).toBe("false"); expect(params.get("version")).toBe("0.1.3"); }), }); diff --git a/toolkit-docs-generator/tests/sources/oauth-provider-resolver.test.ts b/toolkit-docs-generator/tests/sources/oauth-provider-resolver.test.ts new file mode 100644 index 000000000..d25695e55 --- /dev/null +++ b/toolkit-docs-generator/tests/sources/oauth-provider-resolver.test.ts @@ -0,0 +1,159 @@ +/** + * Tests for OAuth Provider ID Resolver + * + * Validates the resolution strategy: + * 1. Exact match + * 2. Strip "api" suffix + * 3. Longest-prefix match (with minimum length guard) + */ +import { describe, expect, it } from "vitest"; +import { + buildProviderIdResolver, + normalizeLookup, +} from "../../src/sources/oauth-provider-resolver.js"; + +// ============================================================================ +// Fixtures +// ============================================================================ + +/** Realistic set of known provider IDs (matches design system catalogue) */ +const KNOWN_PROVIDERS = new Set([ + "airtable", + "github", + "google", + "hubspot", + "salesforce", + "slack", + "ticktick", + "x", + "zendesk", + "zoho", + "squareup", +]); + +// ============================================================================ +// normalizeLookup +// ============================================================================ + +describe("normalizeLookup", () => { + it("lowercases and strips non-alphanumeric characters", () => { + expect(normalizeLookup("HubSpot")).toBe("hubspot"); + expect(normalizeLookup("GitHub-Api")).toBe("githubapi"); + expect(normalizeLookup("Tick_Tick_API")).toBe("ticktickapi"); + expect(normalizeLookup("SALESFORCE")).toBe("salesforce"); + }); + + it("handles already-normalized input", () => { + expect(normalizeLookup("salesforce")).toBe("salesforce"); + }); +}); + +// ============================================================================ +// buildProviderIdResolver +// ============================================================================ + +describe("buildProviderIdResolver", () => { + const resolve = buildProviderIdResolver(KNOWN_PROVIDERS); + + // ---------- 1. Exact match ---------- + + describe("exact match", () => { + it("resolves toolkit IDs that match a provider ID directly", () => { + expect(resolve("Salesforce")).toBe("salesforce"); + expect(resolve("Zendesk")).toBe("zendesk"); + expect(resolve("Hubspot")).toBe("hubspot"); + expect(resolve("Github")).toBe("github"); + }); + + it("is case-insensitive", () => { + expect(resolve("SALESFORCE")).toBe("salesforce"); + expect(resolve("salesforce")).toBe("salesforce"); + }); + }); + + // ---------- 2. Strip "api" suffix ---------- + + describe("strip api suffix", () => { + it("resolves *Api toolkit IDs by stripping the suffix", () => { + expect(resolve("TicktickApi")).toBe("ticktick"); + expect(resolve("AirtableApi")).toBe("airtable"); + expect(resolve("ZohoApi")).toBe("zoho"); + }); + + it("handles mixed casing of Api suffix", () => { + expect(resolve("SlackAPI")).toBe("slack"); + expect(resolve("GithubApi")).toBe("github"); + }); + }); + + // ---------- 3. Longest-prefix match ---------- + + describe("longest-prefix match", () => { + it("resolves HubSpot sub-toolkit IDs to hubspot", () => { + expect(resolve("HubspotCrmApi")).toBe("hubspot"); + expect(resolve("HubspotMarketingApi")).toBe("hubspot"); + expect(resolve("HubspotAutomationApi")).toBe("hubspot"); + expect(resolve("HubspotConversationsApi")).toBe("hubspot"); + }); + + it("picks the longest matching prefix", () => { + // Add a more specific provider to test longest-prefix + const providers = new Set(["hub", "hubspot"]); + const resolveCustom = buildProviderIdResolver(providers); + expect(resolveCustom("HubspotCrmApi")).toBe("hubspot"); + }); + }); + + // ---------- 4. Minimum prefix length guard ---------- + + describe("minimum prefix length", () => { + it("does NOT match short provider IDs as prefixes", () => { + // "xero" should NOT resolve to "x" (X/Twitter) + expect(resolve("XeroApi")).toBeNull(); + }); + + it("exact match still works for short IDs", () => { + // "X" as an exact toolkit ID should resolve to "x" + expect(resolve("X")).toBe("x"); + }); + + it("strip-api still works for short IDs", () => { + // This would need "x" + "api" = "xapi" which isn't a real case, + // but tests the direct strip path + const providers = new Set(["ab"]); + const resolveCustom = buildProviderIdResolver(providers); + expect(resolveCustom("AbApi")).toBe("ab"); + }); + }); + + // ---------- 5. No match ---------- + + describe("no match", () => { + it("returns null for unknown toolkit IDs", () => { + expect(resolve("UnknownToolkit")).toBeNull(); + expect(resolve("RandomApi")).toBeNull(); + }); + + it("returns null for empty string", () => { + expect(resolve("")).toBeNull(); + }); + }); + + // ---------- Edge cases ---------- + + describe("edge cases", () => { + it("handles toolkit ID that equals provider ID + api exactly", () => { + expect(resolve("GithubApi")).toBe("github"); + }); + + it("handles providers set with no entries", () => { + const empty = buildProviderIdResolver(new Set()); + expect(empty("Salesforce")).toBeNull(); + }); + + it("does not match when base is exactly the provider ID (strip path)", () => { + // "salesforceapi" -> base "salesforce" -> exact match in known set + expect(resolve("SalesforceApi")).toBe("salesforce"); + }); + }); +});