@jskit-ai/connectors-catalog 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +192 -0
- package/docs/ai-upstream-notices.md +51 -0
- package/docs/ai.md +191 -0
- package/docs/airtable.md +130 -0
- package/docs/algolia.md +190 -0
- package/docs/amazon-redshift.md +229 -0
- package/docs/amplitude.md +210 -0
- package/docs/apify.md +162 -0
- package/docs/apollo-io.md +200 -0
- package/docs/asana.md +126 -0
- package/docs/ashby.md +188 -0
- package/docs/atlassian.md +224 -0
- package/docs/attention.md +162 -0
- package/docs/aws-athena.md +150 -0
- package/docs/aws-credentials.md +75 -0
- package/docs/aws-s3.md +193 -0
- package/docs/bigquery.md +146 -0
- package/docs/brevo.md +122 -0
- package/docs/calendly.md +158 -0
- package/docs/canva.md +191 -0
- package/docs/chargebee.md +192 -0
- package/docs/clay.md +194 -0
- package/docs/clickhouse.md +242 -0
- package/docs/confidence-exp.md +74 -0
- package/docs/confidence-flags.md +75 -0
- package/docs/confidence-oauth.md +137 -0
- package/docs/contentful.md +123 -0
- package/docs/databricks.md +180 -0
- package/docs/dbt-semantic-layer.md +175 -0
- package/docs/elevenlabs.md +102 -0
- package/docs/figma.md +132 -0
- package/docs/firebase-cloud-messaging.md +262 -0
- package/docs/firecrawl.md +137 -0
- package/docs/fireflies.md +95 -0
- package/docs/fireworks-ai.md +53 -0
- package/docs/gatewayapi.md +113 -0
- package/docs/gemini-enterprise.md +224 -0
- package/docs/github-api.md +133 -0
- package/docs/gitlab-api.md +138 -0
- package/docs/gmail.md +133 -0
- package/docs/gong.md +205 -0
- package/docs/google-ads.md +156 -0
- package/docs/google-analytics.md +202 -0
- package/docs/google-docs.md +105 -0
- package/docs/google-drive.md +108 -0
- package/docs/google-maps-platform.md +208 -0
- package/docs/google-oauth.md +123 -0
- package/docs/google-search-console.md +124 -0
- package/docs/google-sheets.md +94 -0
- package/docs/google-slides.md +95 -0
- package/docs/granola.md +178 -0
- package/docs/hex.md +161 -0
- package/docs/heygen.md +124 -0
- package/docs/hubspot.md +142 -0
- package/docs/incident-io.md +118 -0
- package/docs/inngest.md +178 -0
- package/docs/klipy.md +149 -0
- package/docs/lexware.md +144 -0
- package/docs/lightspeed.md +193 -0
- package/docs/linear.md +137 -0
- package/docs/linkedin.md +196 -0
- package/docs/logo-dev.md +152 -0
- package/docs/mailgun.md +153 -0
- package/docs/mapbox.md +174 -0
- package/docs/microsoft-excel.md +97 -0
- package/docs/microsoft-fabric.md +249 -0
- package/docs/microsoft-oauth.md +143 -0
- package/docs/microsoft-onedrive.md +76 -0
- package/docs/microsoft-onenote.md +75 -0
- package/docs/microsoft-outlook.md +90 -0
- package/docs/microsoft-powerpoint.md +119 -0
- package/docs/microsoft-sharepoint.md +75 -0
- package/docs/microsoft-teams.md +72 -0
- package/docs/microsoft-word.md +119 -0
- package/docs/miro.md +117 -0
- package/docs/n8n.md +169 -0
- package/docs/notion.md +137 -0
- package/docs/oura.md +161 -0
- package/docs/paddle.md +168 -0
- package/docs/perplexity.md +85 -0
- package/docs/pipedrive.md +120 -0
- package/docs/polar.md +63 -0
- package/docs/posthog.md +227 -0
- package/docs/prestashop.md +151 -0
- package/docs/replicate.md +60 -0
- package/docs/resend.md +153 -0
- package/docs/salesforce.md +234 -0
- package/docs/sanity.md +122 -0
- package/docs/semrush.md +276 -0
- package/docs/sentry.md +112 -0
- package/docs/sevdesk.md +107 -0
- package/docs/shopify.md +206 -0
- package/docs/slack.md +257 -0
- package/docs/snowflake.md +271 -0
- package/docs/storyblok.md +130 -0
- package/docs/stripe.md +77 -0
- package/docs/supabase.md +51 -0
- package/docs/tally.md +105 -0
- package/docs/telegram.md +165 -0
- package/docs/tiktok.md +201 -0
- package/docs/twilio.md +284 -0
- package/docs/twitch.md +428 -0
- package/docs/wave.md +440 -0
- package/docs/wix.md +1249 -0
- package/docs/wiz.md +177 -0
- package/docs/woocommerce.md +400 -0
- package/docs/wordpress-com.md +358 -0
- package/docs/wordpress-self-hosted.md +252 -0
- package/docs/workday.md +292 -0
- package/docs/x-twitter.md +188 -0
- package/docs/xero.md +429 -0
- package/docs/zoho-books.md +214 -0
- package/docs/zoho-crm.md +192 -0
- package/package.json +153 -0
- package/patterns/ai-connections/PATTERN.md +84 -0
- package/patterns/ai-connections/example/ai-model.js +11 -0
- package/patterns/ai-connections/example/perplexity-answer.js +29 -0
- package/patterns/api-key-connection/PATTERN.md +368 -0
- package/patterns/api-key-connection/example/connections.js +18 -0
- package/patterns/api-key-connection/example/integrations.json +19 -0
- package/patterns/assistant-mcp/PATTERN.md +110 -0
- package/patterns/assistant-mcp/example/integrations.json +13 -0
- package/patterns/assistant-mcp-oauth/PATTERN.md +235 -0
- package/patterns/assistant-mcp-oauth/example/integrations.json +102 -0
- package/patterns/aws-storage-queries/PATTERN.md +169 -0
- package/patterns/aws-storage-queries/example/formats/data-formats.js +35 -0
- package/patterns/aws-storage-queries/example/formats/package-lock.json +49 -0
- package/patterns/aws-storage-queries/example/formats/package.json +12 -0
- package/patterns/aws-storage-queries/example/formats/verify-formats.mjs +37 -0
- package/patterns/aws-storage-queries/example/integrations.json +38 -0
- package/patterns/aws-storage-queries/example/s3-transfer.js +34 -0
- package/patterns/event-delivery/PATTERN.md +151 -0
- package/patterns/event-delivery/example/integrations.json +17 -0
- package/patterns/firebase-messaging/PATTERN.md +156 -0
- package/patterns/firebase-messaging/example/server/notifications.js +23 -0
- package/patterns/google-ads-search/PATTERN.md +92 -0
- package/patterns/google-ads-search/example/ads-setup.js +25 -0
- package/patterns/oauth-connection/PATTERN.md +724 -0
- package/patterns/oauth-connection/example/integrations.json +20 -0
- package/patterns/paddle-catalogue/PATTERN.md +78 -0
- package/patterns/paddle-catalogue/example/create-products.js +38 -0
- package/patterns/public-image/PATTERN.md +84 -0
- package/patterns/public-image/example/integrations.json +13 -0
- package/patterns/public-image/example/logo-url.js +16 -0
- package/patterns/redshift-queries/PATTERN.md +150 -0
- package/patterns/redshift-queries/example/integrations.json +33 -0
- package/patterns/source-scanning/PATTERN.md +83 -0
- package/patterns/source-scanning/example/source-scanner.js +13 -0
- package/src/client/firebase-cloud-messaging.js +10 -0
- package/src/client/google-analytics.js +72 -0
- package/src/client/google-maps-platform.js +39 -0
- package/src/client/logo-dev.js +36 -0
- package/src/server/ai.js +46 -0
- package/src/server/airtable.js +67 -0
- package/src/server/algolia.js +63 -0
- package/src/server/amazon-redshift.js +96 -0
- package/src/server/amplitude.js +31 -0
- package/src/server/apify.js +68 -0
- package/src/server/apollo-io.js +85 -0
- package/src/server/asana.js +64 -0
- package/src/server/ashby.js +61 -0
- package/src/server/atlassian.js +32 -0
- package/src/server/attention.js +93 -0
- package/src/server/aws-athena.js +82 -0
- package/src/server/aws-s3.js +49 -0
- package/src/server/awsTransport.js +75 -0
- package/src/server/bigquery.js +97 -0
- package/src/server/brevo.js +97 -0
- package/src/server/calendly.js +77 -0
- package/src/server/canva.js +13 -0
- package/src/server/chargebee.js +88 -0
- package/src/server/clay.js +78 -0
- package/src/server/clickhouse.js +66 -0
- package/src/server/confidence.js +29 -0
- package/src/server/contentful.js +40 -0
- package/src/server/databricks.js +55 -0
- package/src/server/dbt-semantic-layer.js +95 -0
- package/src/server/elevenlabs.js +81 -0
- package/src/server/figma.js +24 -0
- package/src/server/firebase-cloud-messaging.js +111 -0
- package/src/server/firecrawl.js +70 -0
- package/src/server/fireflies.js +31 -0
- package/src/server/fireworks-ai.js +16 -0
- package/src/server/gatewayapi.js +48 -0
- package/src/server/gemini-enterprise.js +47 -0
- package/src/server/github-api.js +90 -0
- package/src/server/gitlab-api.js +67 -0
- package/src/server/gmail.js +60 -0
- package/src/server/gong.js +52 -0
- package/src/server/google-ads-search.js +134 -0
- package/src/server/google-ads.js +80 -0
- package/src/server/google-docs.js +36 -0
- package/src/server/google-drive.js +71 -0
- package/src/server/google-maps-platform.js +90 -0
- package/src/server/google-search-console.js +31 -0
- package/src/server/google-sheets.js +60 -0
- package/src/server/google-slides.js +36 -0
- package/src/server/google.js +61 -0
- package/src/server/granola.js +115 -0
- package/src/server/graphqlOperation.js +15 -0
- package/src/server/hex.js +29 -0
- package/src/server/heygen.js +54 -0
- package/src/server/hubspot.js +85 -0
- package/src/server/incident-io.js +68 -0
- package/src/server/inngest.js +86 -0
- package/src/server/jsonOperation.js +34 -0
- package/src/server/klipy.js +34 -0
- package/src/server/lexware.js +59 -0
- package/src/server/lightspeed.js +82 -0
- package/src/server/linear.js +52 -0
- package/src/server/linkedin.js +74 -0
- package/src/server/mailgun.js +76 -0
- package/src/server/mapbox.js +46 -0
- package/src/server/mcpRegistration.js +41 -0
- package/src/server/mcpTransport.js +60 -0
- package/src/server/microsoft-excel.js +67 -0
- package/src/server/microsoft-fabric.js +81 -0
- package/src/server/microsoft-onedrive.js +58 -0
- package/src/server/microsoft-onenote.js +52 -0
- package/src/server/microsoft-outlook.js +58 -0
- package/src/server/microsoft-powerpoint.js +5 -0
- package/src/server/microsoft-sharepoint.js +46 -0
- package/src/server/microsoft-teams.js +29 -0
- package/src/server/microsoft-word.js +5 -0
- package/src/server/microsoft.js +88 -0
- package/src/server/miro.js +29 -0
- package/src/server/n8n.js +78 -0
- package/src/server/notion.js +76 -0
- package/src/server/oura.js +48 -0
- package/src/server/paddle.js +83 -0
- package/src/server/perplexity.js +15 -0
- package/src/server/pipedrive.js +95 -0
- package/src/server/polar.js +20 -0
- package/src/server/posthog.js +44 -0
- package/src/server/prestashop.js +42 -0
- package/src/server/replicate.js +42 -0
- package/src/server/resend.js +93 -0
- package/src/server/salesforce.js +84 -0
- package/src/server/sanity.js +31 -0
- package/src/server/semrush.js +359 -0
- package/src/server/sentry.js +30 -0
- package/src/server/sevdesk.js +20 -0
- package/src/server/shopify.js +99 -0
- package/src/server/slack.js +143 -0
- package/src/server/snowflake.js +139 -0
- package/src/server/storyblok.js +49 -0
- package/src/server/stripe.js +13 -0
- package/src/server/supabase.js +13 -0
- package/src/server/tally.js +78 -0
- package/src/server/telegram.js +55 -0
- package/src/server/tiktok.js +86 -0
- package/src/server/twilio.js +90 -0
- package/src/server/twitch.js +409 -0
- package/src/server/wave.js +520 -0
- package/src/server/wix.js +1048 -0
- package/src/server/wiz.js +117 -0
- package/src/server/woocommerce.js +412 -0
- package/src/server/wordpress-com.js +236 -0
- package/src/server/wordpress-self-hosted.js +134 -0
- package/src/server/workday.js +136 -0
- package/src/server/x-twitter.js +110 -0
- package/src/server/xero.js +397 -0
- package/src/server/zoho-books.js +90 -0
- package/src/server/zoho-crm.js +89 -0
- package/src/server/zohoOAuth.js +21 -0
- package/src/shared/ai-models.json +8049 -0
- package/src/shared/ai.js +63 -0
- package/src/shared/algolia.js +29 -0
- package/src/shared/amazon-redshift.js +51 -0
- package/src/shared/amplitude.js +28 -0
- package/src/shared/atlassian.js +43 -0
- package/src/shared/aws.js +72 -0
- package/src/shared/canva.js +66 -0
- package/src/shared/chargebee.js +26 -0
- package/src/shared/clickhouse.js +38 -0
- package/src/shared/confidence.js +28 -0
- package/src/shared/databricks.js +33 -0
- package/src/shared/dbt-semantic-layer.js +32 -0
- package/src/shared/definitions.js +140 -0
- package/src/shared/figma.js +21 -0
- package/src/shared/firebase-cloud-messaging.js +45 -0
- package/src/shared/gemini-enterprise.js +33 -0
- package/src/shared/gong.js +33 -0
- package/src/shared/google-ads-search.js +31 -0
- package/src/shared/google-ads.js +28 -0
- package/src/shared/google-maps-platform.js +28 -0
- package/src/shared/google.js +133 -0
- package/src/shared/granola.js +25 -0
- package/src/shared/hex.js +28 -0
- package/src/shared/inngest.js +35 -0
- package/src/shared/lightspeed.js +75 -0
- package/src/shared/linkedin.js +27 -0
- package/src/shared/logo-dev.js +21 -0
- package/src/shared/mapbox.js +38 -0
- package/src/shared/mcp.js +92 -0
- package/src/shared/microsoft-fabric.js +47 -0
- package/src/shared/microsoft.js +231 -0
- package/src/shared/miro.js +27 -0
- package/src/shared/oura.js +23 -0
- package/src/shared/posthog.js +33 -0
- package/src/shared/prestashop.js +23 -0
- package/src/shared/salesforce.js +36 -0
- package/src/shared/semrush.js +24 -0
- package/src/shared/shopify.js +51 -0
- package/src/shared/siteUrl.js +12 -0
- package/src/shared/slack.js +88 -0
- package/src/shared/snowflake.js +55 -0
- package/src/shared/tiktok.js +22 -0
- package/src/shared/tokens.js +747 -0
- package/src/shared/twilio.js +41 -0
- package/src/shared/twitch.js +49 -0
- package/src/shared/wave.js +52 -0
- package/src/shared/wix.js +40 -0
- package/src/shared/wiz.js +41 -0
- package/src/shared/wordpress-com.js +30 -0
- package/src/shared/wordpress.js +69 -0
- package/src/shared/workday.js +50 -0
- package/src/shared/x-twitter.js +19 -0
- package/src/shared/xero.js +46 -0
- package/src/shared/zoho-books.js +39 -0
- package/src/shared/zoho-crm.js +43 -0
- package/src/shared/zoho-regions.js +12 -0
- package/test/ai.test.js +136 -0
- package/test/airtable.test.js +125 -0
- package/test/algolia.test.js +207 -0
- package/test/amazon-redshift.test.js +272 -0
- package/test/amplitude.test.js +239 -0
- package/test/apify.test.js +93 -0
- package/test/apollo-io.test.js +125 -0
- package/test/asana.test.js +99 -0
- package/test/ashby.test.js +97 -0
- package/test/atlassian.test.js +249 -0
- package/test/attention.test.js +79 -0
- package/test/aws.test.js +405 -0
- package/test/brevo.test.js +71 -0
- package/test/calendly.test.js +136 -0
- package/test/canva.test.js +258 -0
- package/test/chargebee.test.js +195 -0
- package/test/clickhouse.test.js +278 -0
- package/test/confidence.test.js +205 -0
- package/test/databricks.test.js +253 -0
- package/test/dbt-semantic-layer.test.js +221 -0
- package/test/designMcp.test.js +336 -0
- package/test/elevenlabs.test.js +52 -0
- package/test/firebase-cloud-messaging.test.js +242 -0
- package/test/firecrawl.test.js +66 -0
- package/test/gemini-enterprise.test.js +218 -0
- package/test/github-api.test.js +167 -0
- package/test/gitlab-api.test.js +160 -0
- package/test/gong.test.js +192 -0
- package/test/google-ads.test.js +350 -0
- package/test/google-maps-platform.test.js +191 -0
- package/test/google.test.js +710 -0
- package/test/granola.test.js +240 -0
- package/test/hex.test.js +253 -0
- package/test/heygen.test.js +121 -0
- package/test/hubspot.test.js +103 -0
- package/test/inngest.test.js +219 -0
- package/test/lightspeed.test.js +250 -0
- package/test/linear.test.js +146 -0
- package/test/linkedin.test.js +243 -0
- package/test/logo-dev.test.js +79 -0
- package/test/mailgun.test.js +107 -0
- package/test/mapbox.test.js +181 -0
- package/test/mcp.test.js +227 -0
- package/test/microsoft-fabric.test.js +258 -0
- package/test/microsoft.test.js +554 -0
- package/test/n8nOAuth.test.js +188 -0
- package/test/notionOAuth.test.js +183 -0
- package/test/oura.test.js +211 -0
- package/test/paddleCatalogue.test.js +51 -0
- package/test/paddlePermissions.test.js +101 -0
- package/test/perplexityComposition.test.js +39 -0
- package/test/pipedriveOAuth.test.js +140 -0
- package/test/posthog.test.js +200 -0
- package/test/prestashop.test.js +207 -0
- package/test/resend.test.js +163 -0
- package/test/salesforce.test.js +276 -0
- package/test/semrush.test.js +479 -0
- package/test/sentry.test.js +35 -0
- package/test/shopify.test.js +247 -0
- package/test/slack.test.js +320 -0
- package/test/snowflake.test.js +391 -0
- package/test/tally.test.js +75 -0
- package/test/telegram.test.js +58 -0
- package/test/tiktok.test.js +243 -0
- package/test/tokens.test.js +1079 -0
- package/test/twilio.test.js +221 -0
- package/test/twitch.test.js +573 -0
- package/test/wave.test.js +678 -0
- package/test/wix.test.js +1099 -0
- package/test/wiz.test.js +185 -0
- package/test/wordpress-com.test.js +469 -0
- package/test/wordpress.test.js +660 -0
- package/test/workday.test.js +314 -0
- package/test/x-twitter.test.js +256 -0
- package/test/xero.test.js +700 -0
- package/test/zoho-books.test.js +253 -0
- package/test/zoho-crm.test.js +223 -0
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import { createSchema } from "json-rest-schema";
|
|
2
|
+
|
|
3
|
+
function definition(id, name, description, permission, label, organizationOnly = false, verificationFields = []) {
|
|
4
|
+
const authority = organizationOnly ? "organizations" : "common";
|
|
5
|
+
const audiences = organizationOnly ? ["organizations"] : ["common", "organizations", "consumers"];
|
|
6
|
+
return Object.freeze({
|
|
7
|
+
id, name, description, verificationFields, categories: ["Microsoft", "Productivity"],
|
|
8
|
+
accountModes: ["shared", "per-user", "assistant"], authenticationMethods: ["oauth2"],
|
|
9
|
+
scopes: [
|
|
10
|
+
{ value: permission, label, recommended: true },
|
|
11
|
+
{ value: "offline_access", label: "Keep access when you are away", recommended: true }
|
|
12
|
+
],
|
|
13
|
+
settingsSchema: createSchema({
|
|
14
|
+
tenantId: { type: "string", maxLength: 36, defaultTo: authority,
|
|
15
|
+
validator: (value) => audiences.includes(value) || /^[a-f0-9]{8}-(?:[a-f0-9]{4}-){3}[a-f0-9]{12}$/iu.test(value) ||
|
|
16
|
+
`Use ${audiences.join(", ")} or your Directory (tenant) ID as a GUID.` }
|
|
17
|
+
}),
|
|
18
|
+
settingsFields: [{ name: "tenantId", label: "Directory (tenant) ID", placeholder: authority,
|
|
19
|
+
hint: `Use ${authority} for the default audience, or the directory GUID for a single-tenant app. This is not the Application (client) ID.` }],
|
|
20
|
+
setup: {
|
|
21
|
+
url: "https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app",
|
|
22
|
+
steps: [
|
|
23
|
+
"In Microsoft Entra admin center, select the directory that owns your app. Open Entra ID > App registrations > New registration.",
|
|
24
|
+
organizationOnly
|
|
25
|
+
? "Choose Multiple Entra ID tenants. This connector requires a work or school account."
|
|
26
|
+
: "Choose Any Entra ID Tenant + Personal Microsoft accounts for this connector's common sign-in endpoint.",
|
|
27
|
+
"For a single-tenant registration, choose Single tenant only and copy Directory (tenant) ID into this form. The selected audience must match your app registration.",
|
|
28
|
+
"Register the app. Under Authentication, add a Web platform with the exact callback URL served by your backend.",
|
|
29
|
+
`Under API permissions, add Microsoft Graph delegated ${permission} and offline_access permissions. Tenant policy may require administrator consent.`,
|
|
30
|
+
"Copy Application (client) ID into this form. Under Certificates & secrets, create a client secret and store its Value in the referenced Env variable.",
|
|
31
|
+
"Store the callback URL in its Env variable, then save configuration. The runtime requests consent and verifies the selected operation."
|
|
32
|
+
]
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const microsoftOutlookDefinition = Object.freeze({
|
|
38
|
+
...definition("microsoft-outlook", "Microsoft Outlook", "Read messages and files, send text mail, manage read/folder state and calendar appointments.", "Mail.Read", "Read your mail"),
|
|
39
|
+
scopes: [
|
|
40
|
+
{ value: "Mail.Read", label: "Read your mail", required: true, recommended: true },
|
|
41
|
+
{ value: "Mail.ReadWrite", label: "Read and write your mail", recommended: true },
|
|
42
|
+
{ value: "Mail.Send", label: "Send mail as you", recommended: true },
|
|
43
|
+
{ value: "Mail.ReadBasic", label: "Read basic mail properties" },
|
|
44
|
+
{ value: "Calendars.Read", label: "Read your calendars" },
|
|
45
|
+
{ value: "Calendars.ReadWrite", label: "Read and write your calendars", recommended: true },
|
|
46
|
+
{ value: "offline_access", label: "Keep access when you are away", recommended: true }
|
|
47
|
+
],
|
|
48
|
+
setup: {
|
|
49
|
+
url: "https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app",
|
|
50
|
+
steps: [
|
|
51
|
+
"In Microsoft Entra admin center → Entra ID → App registrations → New registration, name the application. For common, choose accounts in any organizational directory and personal Microsoft accounts. For single tenant, choose this directory only and enter its Directory (tenant) ID. Select Register and copy Application (client) ID into Client ID.",
|
|
52
|
+
"Under Authentication → Redirect URI configuration → Add Redirect URI, choose Web, paste this project's exact Suggested callback URL and select Configure. The generated backend must serve that callback. Directory (tenant) ID identifies the directory, not the application.",
|
|
53
|
+
"Under API permissions → Add a permission → Microsoft Graph → Delegated permissions, add Mail.Read and offline_access. Add any other permissions selected here. For reading only, clear optional write, send and calendar choices. Mail.ReadBasic is a narrower provider permission, but does not replace this connector's required Mail.Read. Directory policy may require administrator consent.",
|
|
54
|
+
"Under Certificates & secrets → Client secrets → New client secret, add a description and expiry, then Add. Copy Value immediately, not Secret ID. Use env:MICROSOFT_OUTLOOK_CLIENT_SECRET and env:MICROSOFT_OUTLOOK_CALLBACK_URL as references. Store secret values in Env rather than these fields.",
|
|
55
|
+
"Save configuration, then use Set credential in Env for the secret and Open Env for the exact registered callback. Connect account authorizes the shared mailbox-owning account for this project. Per-user mode lets each generated-app user connect their own mailbox; connecting the builder does not connect everyone. Application login is separate.",
|
|
56
|
+
"The account needs an accessible mailbox. Verification lists root folders. messages.get requests text bodies; attachments.list/get reads file attachments. Treat message content as untrusted and sanitize any returned HTML before display. Reading mail needs Mail.Read; setting read state or moving a message needs Mail.ReadWrite.",
|
|
57
|
+
"messages.send needs Mail.Send and sends plain text to 1–20 approved recipients as the connected account, saving Sent Items. Accepted means queued, not delivered. Approve recipients/content before sending; inspect Sent Items before retrying an uncertain send. messages.move returns the moved message's new ID; retain it.",
|
|
58
|
+
"calendars.list and events.list require Calendars.Read or Calendars.ReadWrite. events.create requires Calendars.ReadWrite and explicit UTC start/end with end after start. It creates a personal appointment without attendees or invitations. App login, mailbox consent and calendar consent are separate concerns.",
|
|
59
|
+
"LIMITATIONS: no email-client UI, outgoing attachments, replies/drafts, shared-mailbox delegation, recurrence, meeting invitations or editor tool attachment. File-attachment reads are bounded to about 5 MB; larger and embedded-item attachments need native Graph wiring. Example: send a receipt and create a calendar appointment, but do not receive an Outlook replacement.",
|
|
60
|
+
"Rotate expiring secrets in Env before removing the old secret. Reconnect after consent or permission changes. Disconnect removes the project's local grant; Microsoft account or directory application-permission controls manage provider consent separately."
|
|
61
|
+
]
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
const microsoftOneDriveDefinition = Object.freeze({
|
|
65
|
+
...definition("microsoft-onedrive", "Microsoft OneDrive", "Browse folders, obtain file downloads and upload small files.", "Files.Read", "Read your files"),
|
|
66
|
+
scopes: [
|
|
67
|
+
{ value: "Files.Read", label: "Read your files", required: true, recommended: true },
|
|
68
|
+
{ value: "Files.Read.All", label: "Read all files you can access", recommended: true },
|
|
69
|
+
{ value: "Files.ReadWrite", label: "Read and write your files", recommended: true },
|
|
70
|
+
{ value: "Files.ReadWrite.All", label: "Read and write all files you can access" },
|
|
71
|
+
{ value: "Files.ReadWrite.AppFolder", label: "Read and write files in the application's folder" },
|
|
72
|
+
{ value: "offline_access", label: "Keep access when you are away", recommended: true }
|
|
73
|
+
],
|
|
74
|
+
setup: {
|
|
75
|
+
url: "https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app",
|
|
76
|
+
steps: [
|
|
77
|
+
"In Microsoft Entra admin center → Entra ID → App registrations → New registration, name the application. For common, select accounts in any organizational directory and personal Microsoft accounts. For single tenant, select this directory only and use its Directory (tenant) ID instead. Select Register.",
|
|
78
|
+
"Copy Application (client) ID from Overview into Client ID. Directory (tenant) ID identifies the directory, not the app. Under Authentication → Redirect URI configuration → Add Redirect URI, choose Web, paste this project's exact Suggested callback URL and select Configure. The generated backend must serve that callback.",
|
|
79
|
+
"Under API permissions → Add a permission → Microsoft Graph → Delegated permissions, add Files.Read and offline_access. Match any additional selected permissions. All permissions cover files the user can access beyond their own files; write permissions allow changes. For listing only, clear the optional read-all and write choices. Directory policy may require administrator consent.",
|
|
80
|
+
"Under Certificates & secrets → Client secrets → New client secret, add a description and expiry, then Add. Copy Value immediately, not Secret ID. Use env:MICROSOFT_ONEDRIVE_CLIENT_SECRET as the secret reference and env:MICROSOFT_ONEDRIVE_CALLBACK_URL as the callback reference. Secret values belong in Env, not these reference fields.",
|
|
81
|
+
"Save configuration, then use Set credential in Env for the secret and Open Env for the exact registered callback URL. Connect account authorizes the shared account for this project; each app user connects inside the generated app in per-user mode. This connector does not establish application login.",
|
|
82
|
+
"Use an account with OneDrive already provisioned. Verification only lists its drive root. Browse folders with items.list(folderId), then items.get for metadata and a short-lived download URL. That URL grants file access: send it only to the authorized app user, never log/cache it, and download without forwarding the Microsoft Authorization header. Folder metadata has no download URL.",
|
|
83
|
+
"files.upload needs Files.ReadWrite, a parent folder ID, file name and Base64 content up to 5 MB. Its conflict behavior defaults to fail; explicitly approve replace before overwriting. Do not retry uncertain uploads automatically: inspect the folder first.",
|
|
84
|
+
"LIMITATIONS: larger/resumable transfers use your framework's native Graph upload-session client. No file manager, sharing editor, app-folder automation or Vibe64 tool attachment is supplied. Example: upload a small report and provide its download link; a multi-gigabyte video needs native transfer wiring.",
|
|
85
|
+
"Replace expiring client secrets in Env before removing the old secret. Reconnect after consent or permission changes. Disconnect removes the project's local grant; remove Microsoft consent separately through the account or directory's application-permission controls."
|
|
86
|
+
]
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
const microsoftExcelDefinition = Object.freeze({
|
|
90
|
+
...definition("microsoft-excel", "Microsoft Excel", "Browse workbooks and read or update bounded cell ranges with explicit sessions.", "Files.Read", "Read your files"),
|
|
91
|
+
scopes: [
|
|
92
|
+
{ value: "Files.Read", label: "Read your files", required: true, recommended: true },
|
|
93
|
+
{ value: "Files.ReadWrite", label: "Read and write your files (required by Excel worksheets)", recommended: true },
|
|
94
|
+
{ value: "Files.Read.All", label: "Read all files you can access" },
|
|
95
|
+
{ value: "Files.ReadWrite.All", label: "Read and write all files you can access" },
|
|
96
|
+
{ value: "offline_access", label: "Keep access when you are away", recommended: true }
|
|
97
|
+
],
|
|
98
|
+
setup: {
|
|
99
|
+
url: "https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app",
|
|
100
|
+
steps: [
|
|
101
|
+
"Sign into Microsoft Entra admin center → Entra ID → App registrations → New registration. Name your application. For common, choose accounts in any organizational directory and personal Microsoft accounts; for a single directory, choose single tenant and use its Directory (tenant) ID instead.",
|
|
102
|
+
"Select Register. Copy Application (client) ID from Overview into Client ID. Under Authentication → Redirect URI configuration → Add Redirect URI, choose Web, paste this project's exact Suggested callback URL and select Configure. The generated application's backend must serve that address.",
|
|
103
|
+
"Under API permissions → Add a permission → Microsoft Graph → Delegated permissions, add Files.Read and offline_access. Add Files.ReadWrite for worksheet access, even when only reading worksheets. The optional All permissions cover broader file access; select them only when needed. Directory policy may require an administrator's consent.",
|
|
104
|
+
"Under Certificates & secrets → Client secrets → New client secret, choose a description and expiry, then Add. Copy Value immediately, not Secret ID. Use env:MICROSOFT_EXCEL_CLIENT_SECRET as the secret reference and env:MICROSOFT_EXCEL_CALLBACK_URL as the callback reference; never paste the secret into the reference field.",
|
|
105
|
+
"Save configuration. Use Set credential in Env to store the secret and Open Env to store the same callback URL you registered. For a shared connection, Connect account authorizes the account this project will use; for per-user access, each application user connects inside the generated app. This does not create your application's login session.",
|
|
106
|
+
"Verification lists the signed-in user's drive root without requiring a workbook ID or changing files. Your app can browse folders using items.list and pass a workbook's returned id to worksheets.list. Worksheet access needs Files.ReadWrite and a supported accessible workbook; successful connection alone does not prove either.",
|
|
107
|
+
"After selecting a workbook and worksheet, ranges.get reads a bounded A1 address such as A1:B2. ranges.update writes an exactly matching matrix of values OR formulas, up to 10,000 cells. A null cell leaves its existing value unchanged. Your app must approve the target and content before writing; the form itself never edits cells.",
|
|
108
|
+
"For repeated operations, sessions.create requires an explicit persistChanges choice: true saves edits, false uses a temporary copy. Pass the returned sessionId to each range call and close it with sessions.close. Use a work or school account for sessions; Microsoft does not support personal accounts for session close. Without a session, edits persist. Do not automatically repeat a write after a timeout; inspect the workbook first.",
|
|
109
|
+
"LIMITATIONS: no workbook creation, charts, pivot tables, formatting editor or asynchronous session polling. Example: update a budget range and formula, but do not receive a spreadsheet designer. Application login and Vibe64 assistant tool attachment remain separate.",
|
|
110
|
+
"Replace expiring client secrets in Env before deleting the old secret. Reconnect when consent expires or permissions change. Disconnect removes the project's local grant; Microsoft consent remains until removed through the account or directory's application-permission controls."
|
|
111
|
+
]
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
const microsoftTeamsDefinition = Object.freeze({
|
|
115
|
+
...definition("microsoft-teams", "Microsoft Teams", "Browse teams/channels and read or send channel and existing-chat messages.", "Team.ReadBasic.All", "List joined teams", true),
|
|
116
|
+
scopes: [
|
|
117
|
+
{ value: "Team.ReadBasic.All", label: "List joined teams", required: true, recommended: true },
|
|
118
|
+
{ value: "Channel.ReadBasic.All", label: "List channels in teams", required: true, recommended: true },
|
|
119
|
+
{ value: "User.Read", label: "Read user profile", required: true, recommended: true },
|
|
120
|
+
{ value: "ChannelMessage.Send", label: "Send messages to channels", recommended: true },
|
|
121
|
+
{ value: "ChannelMessage.Read.All", label: "Read channel messages" },
|
|
122
|
+
{ value: "Chat.ReadWrite", label: "Read and send chat messages" },
|
|
123
|
+
{ value: "User.Read.All", label: "Read all users' full profiles", recommended: true },
|
|
124
|
+
{ value: "offline_access", label: "Keep access when you are away", recommended: true }
|
|
125
|
+
],
|
|
126
|
+
setup: {
|
|
127
|
+
url: "https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app",
|
|
128
|
+
steps: [
|
|
129
|
+
"In Microsoft Entra admin center → Entra ID → App registrations → New registration, name the application and choose accounts in any organizational directory. Select Register and copy Application (client) ID into Client ID. Keep organizations as tenant, or choose single tenant and enter its Directory (tenant) ID. This connector requires a work or school account with Teams access; personal Microsoft accounts are unsupported.",
|
|
130
|
+
"Under Authentication → Redirect URI configuration → Add Redirect URI, choose Web, paste this project's exact Suggested callback URL and select Configure. The generated backend must serve this callback. Directory (tenant) ID identifies the directory, not the application.",
|
|
131
|
+
"Open API permissions → Add a permission → Microsoft Graph → Delegated permissions. Add Team.ReadBasic.All, Channel.ReadBasic.All, User.Read and offline_access, plus any optional permissions selected here. For listing teams only, clear optional channel-send and all-user-profile access. The form retains channel/profile read choices; the current teams.list operation uses only Team.ReadBasic.All. Tenant policy and some permissions require administrator consent.",
|
|
132
|
+
"Open Certificates & secrets → Client secrets → New client secret, enter a description and expiry, then Add. Copy Value immediately, not Secret ID. Keep env:MICROSOFT_TEAMS_CLIENT_SECRET and env:MICROSOFT_TEAMS_CALLBACK_URL as references; store their actual values in Env.",
|
|
133
|
+
"Save configuration, then use Set credential in Env for the secret and Open Env for the registered callback. Connect account authorizes the shared account for this project. In per-user mode, each generated-app user connects separately. Connecting the builder does not connect everyone; application login is separate.",
|
|
134
|
+
"Verification lists teams where the signed-in account is a direct member. An empty list can be valid, and access to a shared channel does not necessarily include its host team. Use channels.list for a selected team. Reading messages/replies needs ChannelMessage.Read.All; sending needs ChannelMessage.Send. Enable the chosen permission in Entra and this form, obtain any administrator consent, then reconnect.",
|
|
135
|
+
"messages.list and replies.list read channel conversations; messages.send and replies.send send plain text to the explicitly selected channel/thread. Existing chats use chats.list, chatMessages.list and chatMessages.send with Chat.ReadWrite. The app must approve each destination and message; do not retry uncertain sends automatically. Sanitize returned HTML before display.",
|
|
136
|
+
"LIMITATIONS: no team/chat creation, membership changes, message edits/deletion, attachments, meeting bot or Vibe64 tool attachment. Example: read a channel and post an approved status update, but do not receive a Teams client or automatic team administration. Profile-read consent does not create a user-directory feature.",
|
|
137
|
+
"Rotate expiring secrets in Env before deleting the old secret. Reconnect after consent or permission changes. Disconnect removes local grants; Microsoft account or directory application-permission controls manage provider consent separately."
|
|
138
|
+
]
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
const microsoftOneNoteDefinition = Object.freeze({
|
|
142
|
+
...definition("microsoft-onenote", "Microsoft OneNote", "Browse notebooks and pages, read content, and create or append text notes.", "Notes.Read", "Read your notebooks"),
|
|
143
|
+
scopes: [
|
|
144
|
+
{ value: "Notes.Read", label: "Read your notebooks", required: true, recommended: true },
|
|
145
|
+
{ value: "Notes.Read.All", label: "Read notebooks you can access in your organization", recommended: true },
|
|
146
|
+
{ value: "Notes.ReadWrite.All", label: "Read and modify notebooks you can access in your organization", recommended: true },
|
|
147
|
+
{ value: "Notes.Create", label: "Create pages in OneNote notebooks", recommended: true },
|
|
148
|
+
{ value: "Notes.ReadWrite", label: "Read and modify your notebooks", recommended: true },
|
|
149
|
+
{ value: "offline_access", label: "Keep access when you are away", recommended: true }
|
|
150
|
+
],
|
|
151
|
+
setup: {
|
|
152
|
+
url: "https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app",
|
|
153
|
+
steps: [
|
|
154
|
+
"In Microsoft Entra admin center → Entra ID → App registrations → New registration, name your application. For common, choose accounts in any organizational directory and personal Microsoft accounts. For single tenant, choose this directory only and use its Directory (tenant) ID. Select Register and copy Application (client) ID into Client ID.",
|
|
155
|
+
"Under Authentication → Redirect URI configuration → Add Redirect URI, choose Web, paste this project's exact Suggested callback URL and select Configure. The generated application's backend must serve that address. Directory (tenant) ID is the directory identifier, not the Application (client) ID.",
|
|
156
|
+
"Under API permissions → Add a permission → Microsoft Graph → Delegated permissions, add Notes.Read and offline_access. Match any optional permissions selected here. For listing only, clear all optional notebook permissions. Personal Microsoft accounts must clear both organization-wide All permissions; those require work or school accounts. Tenant policy may require administrator consent.",
|
|
157
|
+
"Open Certificates & secrets → Client secrets → New client secret, enter a description and expiry, then Add. Copy Value immediately, not Secret ID. Keep env:MICROSOFT_ONENOTE_CLIENT_SECRET and env:MICROSOFT_ONENOTE_CALLBACK_URL as references; put the actual secret and registered callback in Env.",
|
|
158
|
+
"Save configuration, then use Set credential in Env for the secret and Open Env for the callback. Connect account authorizes the shared account this project will use. In per-user mode, each user connects inside the generated application. OneNote authorization does not create your application's login session.",
|
|
159
|
+
"Verification lists the signed-in user's notebooks without creating a notebook or changing pages. Browse notebooks, sections and pages with notebooks.list, sections.list and pages.list; pages.content returns HTML up to 1 MiB. The app must sanitize HTML before rendering it, or show it as plain text. Use an account with access to the notebooks your application needs.",
|
|
160
|
+
"To create a note, add Notes.Create (or Notes.ReadWrite), reconnect, then call pages.create with a section ID, title and plain text. To append text to an existing page, add Notes.ReadWrite and call pages.append with its page ID and text. Text is escaped, not treated as HTML. Approve the destination and content before writes; inspect the page before retrying an uncertain result.",
|
|
161
|
+
"LIMITATIONS: no rich-text editor, binary attachments, page replacement/deletion, nested section-group traversal or Vibe64 tool attachment. Example: create meeting notes and append an action item, but do not expect an embedded OneNote designer or image upload.",
|
|
162
|
+
"Rotate expiring client secrets in Env before deleting the old secret. Reconnect after consent or permission changes. Disconnect removes the project's local grant; Microsoft account or directory application-permission controls manage provider consent separately."
|
|
163
|
+
]
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
const microsoftSharePointDefinition = Object.freeze({
|
|
167
|
+
...definition("microsoft-sharepoint", "Microsoft SharePoint", "Browse sites/libraries, transfer small files and edit list items.", "Sites.Read.All", "Read items in all site collections", true, [
|
|
168
|
+
{ name: "search", required: true, label: "Site search", hint: "Enter a search term for accessible SharePoint sites. Verification performs this search without changing a site." }
|
|
169
|
+
]),
|
|
170
|
+
scopes: [
|
|
171
|
+
{ value: "Sites.Read.All", label: "Read items in all site collections", required: true, recommended: true },
|
|
172
|
+
{ value: "User.Read", label: "Read user profile", required: true, recommended: true },
|
|
173
|
+
{ value: "Sites.ReadWrite.All", label: "Edit or delete items in all site collections", recommended: true },
|
|
174
|
+
{ value: "Sites.Manage.All", label: "Create, edit, and delete items and lists in all site collections" },
|
|
175
|
+
{ value: "Sites.FullControl.All", label: "Have full control of all site collections" },
|
|
176
|
+
{ value: "Files.Read.All", label: "Read all files that user can access", recommended: true },
|
|
177
|
+
{ value: "Files.ReadWrite.All", label: "Read and write all files that user can access" },
|
|
178
|
+
{ value: "offline_access", label: "Keep access when you are away", recommended: true }
|
|
179
|
+
],
|
|
180
|
+
setup: {
|
|
181
|
+
url: "https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app",
|
|
182
|
+
steps: [
|
|
183
|
+
"In Microsoft Entra admin center → Entra ID → App registrations → New registration, name the application and choose accounts in any organizational directory. Select Register and copy Application (client) ID into Client ID. Keep organizations as tenant, or choose single tenant and enter that Directory (tenant) ID. SharePoint site search requires a work or school account; personal Microsoft accounts are unsupported.",
|
|
184
|
+
"Open Authentication → Redirect URI configuration → Add Redirect URI, choose Web, paste this project's exact Suggested callback URL, then Configure. The generated backend must serve this callback. The tenant ID identifies the directory, not the application.",
|
|
185
|
+
"Under API permissions → Add a permission → Microsoft Graph → Delegated permissions, add Sites.Read.All, User.Read and offline_access, plus any optional permissions selected here. For site search only, clear optional site-write and file permissions. The form retains User.Read for profile access; site search itself requires Sites.Read.All. Tenant policy may require administrator consent. Add Sites.ReadWrite.All for list-item edits or file uploads; reconnect after changing consent.",
|
|
186
|
+
"Open Certificates & secrets → Client secrets → New client secret, enter a description and expiry, then Add. Copy Value immediately, not Secret ID. Keep env:MICROSOFT_SHAREPOINT_CLIENT_SECRET and env:MICROSOFT_SHAREPOINT_CALLBACK_URL as references; actual values belong in Env.",
|
|
187
|
+
"Save configuration, then use Set credential in Env for the secret and Open Env for the registered callback. Enter a Site search term before Connect account. This verifies the shared account for this project; per-user mode requires each generated-app user to connect separately. Application login is separate.",
|
|
188
|
+
"Use an account with access to the intended SharePoint sites. Verification searches site names and other indexed properties without changing a site. Empty results can be a successful search. It does not crawl documents, edit lists or grant access to additional sites. Sites.Selected application permissions are not supported by this search operation.",
|
|
189
|
+
"After sites.search, use the returned site ID with libraries.list or lists.list. files.list browses a selected drive and folder; files.get supplies metadata/private short-lived download links. Never log these links or forward the Microsoft bearer token to them. files.upload supports up to 5 MB and defaults to fail on an existing name; approve replace explicitly.",
|
|
190
|
+
"listItems.list returns fields and ETags. listItems.create/update accepts internal column names and scalar values. Updates require the current eTag; if Microsoft returns 412, reload and review the conflicting edit rather than overwriting. Approve the site, list and values in your app before writing.",
|
|
191
|
+
"LIMITATIONS: no site-collection creation, SharePoint admin UI, complex field editors, sharing/permissions editor or Vibe64 tool attachment. Large/resumable file transfers need native Graph wiring. Example: update a project-status list and upload a report, but do not receive a SharePoint site builder.",
|
|
192
|
+
"Rotate expiring secrets in Env before removing the old secret. Reconnect after consent or permission changes. Disconnect removes local grants; use Microsoft account or directory application-permission controls to manage provider consent separately."
|
|
193
|
+
]
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
const microsoftWordDefinition = Object.freeze({
|
|
197
|
+
...definition("microsoft-word", "Microsoft Word", "Browse Word files and folders in your drive and read document metadata.", "Files.Read", "Read your files"),
|
|
198
|
+
setup: {
|
|
199
|
+
url: "https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app",
|
|
200
|
+
steps: [
|
|
201
|
+
"In Microsoft Entra admin center → Entra ID → App registrations → New registration, name the application. For common, choose accounts in any organizational directory and personal Microsoft accounts. For single tenant, choose this directory only and enter its Directory (tenant) ID. Select Register and copy Application (client) ID into Client ID.",
|
|
202
|
+
"Under Authentication → Redirect URI configuration → Add Redirect URI, choose Web, paste this project's exact Suggested callback URL and select Configure. The generated backend must serve that callback. Directory (tenant) ID identifies the directory, not the app.",
|
|
203
|
+
"Under API permissions → Add a permission → Microsoft Graph → Delegated permissions, add Files.Read and offline_access. These authorize file reads and ongoing access; the fragment requires no write permission. Directory policy may require administrator consent. Use an account with an existing OneDrive and access to the documents you need.",
|
|
204
|
+
"Open Certificates & secrets → Client secrets → New client secret, enter a description and expiry, then Add. Copy Value immediately, not Secret ID. Keep env:MICROSOFT_WORD_CLIENT_SECRET and env:MICROSOFT_WORD_CALLBACK_URL as references; actual values go in Env.",
|
|
205
|
+
"Save configuration, then use Set credential in Env for the secret and Open Env for the exact registered callback. Connect account authorizes the shared account for this project. Per-user mode requires each generated-app user to connect separately; application login is a separate concern.",
|
|
206
|
+
"Verification lists drive-root folders and document filenames. The app can browse folders and read a selected file's metadata using its returned item ID. It does not read document contents, edit or download documents, execute macros or scan the whole drive. An empty filtered page can still have another page to fetch.",
|
|
207
|
+
"Rotate expiring secrets in Env before deleting the old secret. Reconnect after consent or permission changes. Disconnect removes local grants; Microsoft account or directory application-permission controls manage provider consent separately."
|
|
208
|
+
]
|
|
209
|
+
}
|
|
210
|
+
});
|
|
211
|
+
const microsoftPowerPointDefinition = Object.freeze({
|
|
212
|
+
...definition("microsoft-powerpoint", "Microsoft PowerPoint", "Browse PowerPoint files and folders in your drive and read presentation metadata.", "Files.Read", "Read your files"),
|
|
213
|
+
setup: {
|
|
214
|
+
url: "https://learn.microsoft.com/en-us/entra/identity-platform/quickstart-register-app",
|
|
215
|
+
steps: [
|
|
216
|
+
"In Microsoft Entra admin center → Entra ID → App registrations → New registration, name the application. For common, choose accounts in any organizational directory and personal Microsoft accounts. For single tenant, choose this directory only and enter its Directory (tenant) ID. Select Register and copy Application (client) ID into Client ID.",
|
|
217
|
+
"Under Authentication → Redirect URI configuration → Add Redirect URI, choose Web, paste this project's exact Suggested callback URL and select Configure. The generated backend must serve that callback. Directory (tenant) ID identifies the directory, not the app.",
|
|
218
|
+
"Under API permissions → Add a permission → Microsoft Graph → Delegated permissions, add Files.Read and offline_access. These authorize file reads and ongoing access; the fragment requires no write permission. Directory policy may require administrator consent. Use an account with an existing OneDrive and access to the presentations you need.",
|
|
219
|
+
"Open Certificates & secrets → Client secrets → New client secret, enter a description and expiry, then Add. Copy Value immediately, not Secret ID. Keep env:MICROSOFT_POWERPOINT_CLIENT_SECRET and env:MICROSOFT_POWERPOINT_CALLBACK_URL as references; actual values go in Env.",
|
|
220
|
+
"Save configuration, then use Set credential in Env for the secret and Open Env for the exact registered callback. Connect account authorizes the shared account for this project. Per-user mode requires each generated-app user to connect separately; application login is a separate concern.",
|
|
221
|
+
"Verification lists drive-root folders and presentation filenames. The app can browse folders and read a selected file's metadata using its returned item ID. It does not read slides, edit or download presentations, execute macros or scan the whole drive. An empty filtered page can still have another page to fetch.",
|
|
222
|
+
"Rotate expiring secrets in Env before deleting the old secret. Reconnect after consent or permission changes. Disconnect removes local grants; Microsoft account or directory application-permission controls manage provider consent separately."
|
|
223
|
+
]
|
|
224
|
+
}
|
|
225
|
+
});
|
|
226
|
+
const microsoftDefinitions = Object.freeze([
|
|
227
|
+
microsoftOutlookDefinition, microsoftOneDriveDefinition, microsoftExcelDefinition,
|
|
228
|
+
microsoftTeamsDefinition, microsoftOneNoteDefinition, microsoftSharePointDefinition,
|
|
229
|
+
microsoftWordDefinition, microsoftPowerPointDefinition
|
|
230
|
+
]);
|
|
231
|
+
export { microsoftOutlookDefinition, microsoftOneDriveDefinition, microsoftExcelDefinition, microsoftTeamsDefinition, microsoftOneNoteDefinition, microsoftSharePointDefinition, microsoftWordDefinition, microsoftPowerPointDefinition, microsoftDefinitions };
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
const miroDefinition = Object.freeze({
|
|
2
|
+
id: "miro", name: "Miro", description: "Use Miro board tools through the assistant owner's selected team.",
|
|
3
|
+
accountModes: ["assistant"], authenticationMethods: ["oauth2"],
|
|
4
|
+
scopes: [
|
|
5
|
+
{ value: "boards:read", label: "Read boards", recommended: true },
|
|
6
|
+
{ value: "boards:write", label: "Create and edit boards" },
|
|
7
|
+
{ value: "openid", label: "Include account identity" },
|
|
8
|
+
{ value: "email", label: "Read your email address" }
|
|
9
|
+
],
|
|
10
|
+
setup: {
|
|
11
|
+
url: "https://developers.miro.com/docs/connecting-to-miro-mcp",
|
|
12
|
+
clientRegistrationEndpoint: "https://mcp.miro.com/register",
|
|
13
|
+
steps: [
|
|
14
|
+
"This is a Miro MCP assistant connection. Credentials from Miro's REST API Your apps screen cannot be substituted. Keep Assistant access and start with Read boards; select writes or identity access only when the host needs them.",
|
|
15
|
+
"Enter the exact Suggested callback URL served by your application's backend. Open OAuth client registration below: copy the Registration endpoint and Registration request body into your HTTP client's POST request with Content-Type: application/json. The request includes the current callback and selected permissions. CLI/Node users can instead call registerMiroClient once with those same values.",
|
|
16
|
+
"Send the registration request once. Copy client_id from the successful response into Client ID. Keep client_secret private and note any reported expiry. A timeout may still have created a client; investigate before retrying. This registers an MCP client and does not connect a Miro account.",
|
|
17
|
+
"Keep env:MIRO_CLIENT_SECRET and env:MIRO_CALLBACK_URL as references. Save configuration, then use Set credential in Env for the returned secret and Open Env for the exact registered callback. Changing this form does not update an already registered client.",
|
|
18
|
+
"Click Connect account, sign into Miro and select the team containing the boards you want. Review access and Continue back to your host. Reconnect and choose the correct team if board access fails. Team and organization policies still apply.",
|
|
19
|
+
"Verification discovers available tools without executing them. The assistant host must authorize each tool and its exact board arguments before use. Discovery does not prove access to a particular board. Identity scopes do not configure app login, and this connection does not attach tools to chat automatically.",
|
|
20
|
+
"LIMITATIONS: connecting does not attach Miro tools to Vibe64 coding chat. Example: an explicitly wired CLI/assistant host can read a board or request a diagram through discovered tools, but Vibe64 will not automatically see that board in your conversation. This shared attachment feature is deferred. No embedded board editor is provided.",
|
|
21
|
+
"Reconnect to change teams or consent. Disconnect removes local grants; manage provider access separately in Miro. Keep registration secrets in Env and replace expiring credentials through the provider's supported setup before they expire."
|
|
22
|
+
|
|
23
|
+
]
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
export { miroDefinition };
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
const ouraDefinition = Object.freeze({
|
|
2
|
+
id: "oura", name: "Oura", description: "Connect an individual's Oura account to read sleep, readiness, activity, heart-rate and permitted profile data.",
|
|
3
|
+
accountModes: ["per-user"], authenticationMethods: ["oauth2"],
|
|
4
|
+
scopes: [
|
|
5
|
+
{ value: "daily", label: "Read daily sleep, activity and readiness summaries", required: true },
|
|
6
|
+
{ value: "heartrate", label: "Read heart-rate samples" },
|
|
7
|
+
{ value: "personal", label: "Read personal profile information" },
|
|
8
|
+
{ value: "email", label: "Read the account email address" }
|
|
9
|
+
],
|
|
10
|
+
setup: {
|
|
11
|
+
url: "https://support.ouraring.com/hc/en-us/articles/4415266939155-The-Oura-API",
|
|
12
|
+
steps: [
|
|
13
|
+
"Use dailySleep.list, sleep.list, dailyReadiness.list and dailyActivity.list with start_date/end_date, and heartRate.list with start_datetime/end_datetime including timezone. Follow next_token explicitly. LIMITATIONS: no live synchronization, health dashboard, workout/tag/session/SpO2 operations or automatic coding-chat attachment. For example, your app can show a user’s sleep/readiness and heart-rate history; it must build the chart and refresh schedule itself.",
|
|
14
|
+
"For a new registration, open https://developer.ouraring.com and sign in with the Oura account that will own this application. Create an API application there. To edit an existing registration, Oura still provides My Applications at https://cloud.ouraring.com/oauth/applications. Personal access tokens are retired; use OAuth.",
|
|
15
|
+
"Provide the application name and website describing your integration. Add the exact Suggested callback URL from this screen to the registration's allowed redirect URIs, including scheme and path. Your application's backend must serve that callback. The hosting URL suggested here is the starting point; update the provider and Env together if your app moves to a custom domain.",
|
|
16
|
+
"Copy the assigned Client ID here. Keep env:OURA_CLIENT_SECRET and env:OURA_CALLBACK_URL as references and Save configuration. Use Set credential in Env to store the Client Secret as OURA_CLIENT_SECRET, and Set callback in Env to store the registered URL as OURA_CALLBACK_URL. Keep the actual secret out of configuration JSON and chat.",
|
|
17
|
+
"Keep daily permission selected: verification reads daily sleep summaries. Select heartrate only for heart-rate samples; personal or email only if your application needs those profile fields. Each app user connects their own account and may decline individual permissions; declining daily prevents this connection from being verified. This grants Oura data access, not application login.",
|
|
18
|
+
"In Vibe64, choose Prepare app user connection request to prepare the application wiring. Once implemented, each user opens the application's own account screen, connects Oura and approves access. Oura documents a ten-user limit before application approval; request review from the application's page for wider use. Gen3 and later users need an active Oura Membership for API data. If verification is forbidden, check membership and granted permissions; an empty sleep list can mean there is no synced data yet.",
|
|
19
|
+
"In the application, reconnect starts consent again and disconnect removes that user's local grant; manage the application's authorization in Oura separately. The application owns stored grants and single-use refresh tokens, including after leaving Vibe64. Preserve its private connection store when moving hosts."
|
|
20
|
+
]
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
export { ouraDefinition };
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { createSchema } from "json-rest-schema";
|
|
2
|
+
|
|
3
|
+
const posthogDefinition = Object.freeze({
|
|
4
|
+
id: "posthog", name: "PostHog", description: "Capture events and evaluate flags with a public project token.",
|
|
5
|
+
accountModes: ["shared", "assistant"], authenticationMethods: ["api-key"], scopes: [],
|
|
6
|
+
apiKeyReferenceLabel: "Project token reference",
|
|
7
|
+
verificationFields: [{ name: "distinct_id", required: true, label: "Verification user ID",
|
|
8
|
+
hint: "Enter the identity whose feature flags should be evaluated. This check does not submit an analytics event." }],
|
|
9
|
+
apiKeyReferenceHint: "Use an environment reference for the project's public token (phc_). Your app may expose that token in its frontend. It cannot read private analytics.",
|
|
10
|
+
settingsSchema: createSchema({
|
|
11
|
+
region: { type: "string", enum: ["eu", "us"], defaultTo: "eu" },
|
|
12
|
+
projectId: { type: "string", required: true, minLength: 1, maxLength: 20,
|
|
13
|
+
validator: (value) => /^[1-9][0-9]*$/u.test(value) || "Enter the numeric project ID from PostHog project settings." }
|
|
14
|
+
}),
|
|
15
|
+
settingsFields: [
|
|
16
|
+
{ name: "region", label: "Region", hint: "Choose the PostHog Cloud region containing this project.", items: [
|
|
17
|
+
{ value: "eu", title: "Europe (eu.i.posthog.com)" }, { value: "us", title: "United States (us.i.posthog.com)" }
|
|
18
|
+
] },
|
|
19
|
+
{ name: "projectId", label: "Project ID", placeholder: "12345",
|
|
20
|
+
hint: "Public numeric ID from project settings. Public API requests use the token to select the project; verification does not match this ID to the token." }
|
|
21
|
+
],
|
|
22
|
+
setup: {
|
|
23
|
+
url: "https://posthog.com/docs/settings/projects",
|
|
24
|
+
steps: [
|
|
25
|
+
"Sign into the intended PostHog Cloud region. Use the project switcher to create or select the project's analytics destination.",
|
|
26
|
+
"Open Project settings and copy its numeric project ID and public project token (phc_). Keep that project's region selected here.",
|
|
27
|
+
"Store the project token in Env and enter its reference. This is a publishable token, not a personal, project-secret or OAuth API key.",
|
|
28
|
+
"Save the configuration. The application runtime verifies token acceptance by evaluating flags for an explicitly supplied user identifier.",
|
|
29
|
+
"Event capture is a separate operation. Verification does not submit an analytics event or prove final event ingestion."
|
|
30
|
+
]
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
export { posthogDefinition };
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { createSchema } from "json-rest-schema";
|
|
2
|
+
import { httpsSiteUrlField } from "./siteUrl.js";
|
|
3
|
+
|
|
4
|
+
const prestashopDefinition = Object.freeze({
|
|
5
|
+
id: "prestashop", name: "PrestaShop", description: "Read products and orders from your PrestaShop store.",
|
|
6
|
+
accountModes: ["shared", "assistant"], authenticationMethods: ["api-key"], scopes: [],
|
|
7
|
+
apiKeyReferenceLabel: "Webservice API key reference",
|
|
8
|
+
apiKeyReferenceHint: "Store the Webservice key outside source. Grant GET for products, and for orders if the application needs order reads.",
|
|
9
|
+
settingsSchema: createSchema({ siteUrl: httpsSiteUrlField }),
|
|
10
|
+
settingsFields: [{ name: "siteUrl", label: "Store URL", placeholder: "https://shop.example.com",
|
|
11
|
+
hint: "Use the HTTPS store address before /api, keeping any installation subdirectory." }],
|
|
12
|
+
setup: {
|
|
13
|
+
url: "https://devdocs.prestashop-project.org/9/webservice/tutorials/creating-access/",
|
|
14
|
+
steps: [
|
|
15
|
+
"Open Advanced Parameters, Webservice in your store's back office. Enable PrestaShop Webservice and save.",
|
|
16
|
+
"Choose Add new webservice key, Generate, enter a description and enable the key. Grant GET for products and any required orders access.",
|
|
17
|
+
"In multistore mode select the intended shop association, then save. Store the key in Env and enter its reference here.",
|
|
18
|
+
"Use the final HTTPS store URL. The runtime verifies a product read; it does not verify order permissions or modify store data."
|
|
19
|
+
]
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
export { prestashopDefinition };
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { createSchema } from "json-rest-schema";
|
|
2
|
+
|
|
3
|
+
const label = "[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?";
|
|
4
|
+
const production = new RegExp(`^https://${label}(?:\\.develop)?\\.my\\.salesforce\\.com/?$`, "u");
|
|
5
|
+
const sandbox = new RegExp(`^https://${label}\\.sandbox\\.my\\.salesforce\\.com/?$`, "u");
|
|
6
|
+
const salesforceDefinition = Object.freeze({
|
|
7
|
+
id: "salesforce", name: "Salesforce", description: "Explore Salesforce objects and read records with your organisation's API permissions.",
|
|
8
|
+
accountModes: ["shared", "per-user", "assistant"], authenticationMethods: ["oauth2"],
|
|
9
|
+
oauthClientAuthenticationMethods: ["client_secret_post"],
|
|
10
|
+
settingsSchema: createSchema({
|
|
11
|
+
environment: { type: "string", enum: ["production", "sandbox"], defaultTo: "production" },
|
|
12
|
+
accountUrl: { type: "string", required: true, noTrim: true, maxLength: 253, validator: (value, object) =>
|
|
13
|
+
(object.environment === "sandbox" ? sandbox : production).test(value) || "Enter a lowercase HTTPS My Domain URL matching the selected environment, without a path, query or port." }
|
|
14
|
+
}),
|
|
15
|
+
settingsFields: [
|
|
16
|
+
{ name: "environment", label: "Environment", items: [{ value: "production", title: "Production" }, { value: "sandbox", title: "Sandbox" }],
|
|
17
|
+
hint: "Production includes Developer Edition. Sandbox uses the org's .sandbox.my.salesforce.com domain." },
|
|
18
|
+
{ name: "accountUrl", label: "Account URL", placeholder: "https://acme.my.salesforce.com",
|
|
19
|
+
hint: "Copy My Domain from Salesforce Setup. The same org receives authorization and API requests." }
|
|
20
|
+
],
|
|
21
|
+
scopes: [
|
|
22
|
+
{ value: "api", label: "Access Salesforce APIs with this user's permissions", recommended: true },
|
|
23
|
+
{ value: "refresh_token", label: "Keep access when the user is away", recommended: true }
|
|
24
|
+
],
|
|
25
|
+
permissionsHint: "Salesforce's api permission can allow writes. This runtime exposes reads; your app still authorizes each query. Connecting an account does not sign the person into your application.",
|
|
26
|
+
setup: { url: "https://help.salesforce.com/s/articleView?id=sf.external_client_apps.htm&type=5", steps: [
|
|
27
|
+
"In Salesforce Setup, open My Domain and copy the org's login URL. Select Production for production/Developer Edition or Sandbox for a sandbox org.",
|
|
28
|
+
"Open External Client App Manager and create an External Client App. Enter its name, API name and contact email; use Local for an app used only by this org.",
|
|
29
|
+
"Enable OAuth, register the exact backend callback, and select api plus refresh_token/offline_access. Keep PKCE enabled and require the secret for Web Server and Refresh Token flows.",
|
|
30
|
+
"Open the app's Settings, then Consumer Key and Secret. Copy the key as Client ID; put the secret and callback in Env and save their references here.",
|
|
31
|
+
"An administrator grants API access and authorizes the app/users through its policies and permission sets. Save configuration, then start consent from your application's connection flow.",
|
|
32
|
+
"Public/Online registrations need separate provisioning and distribution decisions. Local apps cannot serve unrelated customer orgs; packaged apps require installation and subscriber policies. Org API quotas remain shared."
|
|
33
|
+
] }
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
export { salesforceDefinition };
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { createSchema } from "json-rest-schema";
|
|
2
|
+
import { secretReference } from "@jskit-ai/connectors-core/shared/configuration";
|
|
3
|
+
|
|
4
|
+
const semrushDefinition = Object.freeze({
|
|
5
|
+
id: "semrush", name: "Semrush", description: "Read keyword and backlink reports and manage Semrush projects using a V4 API key.",
|
|
6
|
+
accountModes: ["shared", "assistant"], authenticationMethods: ["api-key"], scopes: [],
|
|
7
|
+
settingsSchema: createSchema({ v3ApiKeyRef: { ...secretReference, required: false } }),
|
|
8
|
+
settingsFields: [{ name: "v3ApiKeyRef", label: "V3 API key reference (optional)", placeholder: "env:SEMRUSH_V3_KEY",
|
|
9
|
+
environmentCredential: { label: "Semrush V3 API key", public: false },
|
|
10
|
+
hint: "For domain overview and domain/URL/subfolder keyword reports and position tracking: My profile > API Keys > copy your Version 3 key into this project's Env. Leave empty if only using V4 reports/projects." }],
|
|
11
|
+
apiKeyReferenceLabel: "V4 API key reference",
|
|
12
|
+
apiKeyReferenceHint: "Use a new Semrush V4 key: Read-only for reports and project reads, Read and write for creating, renaming or deleting projects. V3 keys and OAuth tokens are different credentials.",
|
|
13
|
+
setup: { url: "https://developer.semrush.com/api/v4/get-started/quick-start/", steps: [
|
|
14
|
+
"Open the profile icon in Semrush, then My profile > API Keys > + Create API key.",
|
|
15
|
+
"Create a V4 key for this application. Select Read-only for reports and project reads, or Read and write if the app creates, renames or deletes projects; choose an expiry. Projects access requires SEO Business and available API units.",
|
|
16
|
+
"Copy the key into Env when it is shown and save only its reference here. This flow needs no Client ID, secret or callback URL.",
|
|
17
|
+
"The runtime verifies project access. OWN is the default list scope; ALL, SHARED and CORPORATE are explicit operation inputs.",
|
|
18
|
+
"Keyword metrics and backlink overview, links, referring domains and anchors use this V4 key. These Early Access reports consume account API units only when the app requests them; connecting verifies projects, not every report entitlement.",
|
|
19
|
+
"Project deletion permanently removes the project, tools, settings and history. The generated app must confirm and authorize this action. Disconnecting here only removes local connection state.",
|
|
20
|
+
"For domain overview and organic/paid keyword reports for domains, URLs and subfolders, open My profile > API Keys and copy the autogenerated Version 3 key into Env using the optional V3 reference. It is sent only to Semrush for V3 reports. Do not paste it into the V4 field. Position tracking uses this V3 key too: discover campaigns from the project ID, then use the returned campaign ID for dates and ranking reports. Existing campaigns and harvested data are required. OAuth remains unimplemented.",
|
|
21
|
+
"Separate keys on one account share account capacity. This initial runtime does not implement the captured OAuth connection or individual app-user login."
|
|
22
|
+
] }
|
|
23
|
+
});
|
|
24
|
+
export { semrushDefinition };
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { createSchema } from "json-rest-schema";
|
|
2
|
+
|
|
3
|
+
const shopifyDefinition = Object.freeze({
|
|
4
|
+
id: "shopify", name: "Shopify", description: "Connect a Shopify store and control what the assistant may change.",
|
|
5
|
+
accountModes: ["shared", "assistant"], authenticationMethods: ["oauth2", "api-key"],
|
|
6
|
+
oauthGrantTypes: ["client_credentials"], oauthClientAuthenticationMethods: ["client_secret_post"],
|
|
7
|
+
authenticationLabels: { oauth2: "App in your Shopify organization", "api-key": "Existing Admin API access token" },
|
|
8
|
+
authenticationHint: "Client credentials require the app and store in the same Shopify organization. Connecting another merchant requires a separate Shopify installation flow.",
|
|
9
|
+
apiKeyReferenceLabel: "Admin API access token reference",
|
|
10
|
+
apiKeyReferenceHint: "Use env:SHOPIFY_ADMIN_TOKEN. A Storefront token, client secret or App Automation Token cannot be used here.",
|
|
11
|
+
settingsSchema: createSchema({
|
|
12
|
+
shopDomain: { type: "string", required: true, noTrim: true, maxLength: 77,
|
|
13
|
+
validator: (value) => /^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.myshopify\.com$/u.test(value) ||
|
|
14
|
+
"Enter the store's permanent name.myshopify.com domain without a protocol, path or port." }
|
|
15
|
+
}),
|
|
16
|
+
settingsFields: [{ name: "shopDomain", label: "Shopify store domain", placeholder: "your-store.myshopify.com",
|
|
17
|
+
hint: "Use the permanent myshopify.com address, including when your storefront uses a custom domain." }],
|
|
18
|
+
scopes: [
|
|
19
|
+
{ value: "read_products", label: "Read products", recommended: true },
|
|
20
|
+
{ value: "write_products", label: "Create, update and delete products" }
|
|
21
|
+
],
|
|
22
|
+
permissionsHint: "Match the scopes approved for the installed Shopify app. Write access includes reads. Assistant permission choices do not grant Shopify scopes or staff permissions.",
|
|
23
|
+
assistantActions: [
|
|
24
|
+
{ value: "enable", label: "Enable Shopify" },
|
|
25
|
+
{ value: "connect", label: "Connect your Shopify store" },
|
|
26
|
+
{ value: "claim", label: "Claim your store" },
|
|
27
|
+
{ value: "products.list", label: "Read products" },
|
|
28
|
+
{ value: "products.create", label: "Create product" },
|
|
29
|
+
{ value: "products.update", label: "Update product" },
|
|
30
|
+
{ value: "products.delete", label: "Delete product" },
|
|
31
|
+
{ value: "variants.create", label: "Add product variant" },
|
|
32
|
+
{ value: "variants.update", label: "Update product variant" },
|
|
33
|
+
{ value: "variants.delete", label: "Delete product variant" },
|
|
34
|
+
{ value: "discountCodes.create", label: "Create discount code" },
|
|
35
|
+
{ value: "discountCodes.update", label: "Update discount code" },
|
|
36
|
+
{ value: "discountCodes.delete", label: "Delete discount code" },
|
|
37
|
+
{ value: "priceRules.create", label: "Create price rule" },
|
|
38
|
+
{ value: "priceRules.update", label: "Update price rule" },
|
|
39
|
+
{ value: "priceRules.delete", label: "Delete price rule" }
|
|
40
|
+
],
|
|
41
|
+
setup: { url: "https://shopify.dev/docs/apps/build/authentication-authorization/client-credentials-grant", steps: [
|
|
42
|
+
"Open the Shopify Dev Dashboard, choose your organization, open Apps and create an app for your store.",
|
|
43
|
+
"Create and release an app version with read_products; add write_products only for product changes. Install the app on the store.",
|
|
44
|
+
"Open the app's Settings and copy its Client ID. Put the Client Secret in Env and enter its reference here.",
|
|
45
|
+
"Use the store's permanent myshopify.com domain. The client-credentials mode requires both app and store to belong to the same Shopify organization.",
|
|
46
|
+
"An existing Admin API token can be supplied through Env instead. It grants access as the installed app, not as each shopper or staff member.",
|
|
47
|
+
"Assistant permissions govern requests made through an assistant runtime. Store creation, claiming, additional merchant consent, variants and discounts require the remaining Shopify flows."
|
|
48
|
+
] }
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
export { shopifyDefinition };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
function validSiteUrl(value) {
|
|
2
|
+
if (!/^https:\/\//iu.test(value) || /[\s\\?#]/u.test(value) || /\/(?:\.|%2e){1,2}(?:\/|$)/iu.test(value)) return false;
|
|
3
|
+
try {
|
|
4
|
+
const url = new URL(value);
|
|
5
|
+
return url.protocol === "https:" && Boolean(url.hostname) && !url.username && !url.password && !url.search && !url.hash;
|
|
6
|
+
} catch { return false; }
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
const httpsSiteUrlField = { type: "string", required: true, minLength: 1, maxLength: 2048,
|
|
10
|
+
validator: (value) => validSiteUrl(value) || "Use an HTTPS site URL without credentials, a query, fragment or parent-path segments." };
|
|
11
|
+
|
|
12
|
+
export { httpsSiteUrlField };
|