@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
package/docs/brevo.md
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
# Brevo
|
|
2
|
+
|
|
3
|
+
Import `brevoProvider` from `@jskit-ai/connectors-catalog/server/brevo`.
|
|
4
|
+
The adapter uses an ordinary Brevo API key for contacts, transactional email/SMS,
|
|
5
|
+
marketing campaigns, sender/domain setup and automation events.
|
|
6
|
+
|
|
7
|
+
## Set up access
|
|
8
|
+
|
|
9
|
+
1. Sign in to the intended Brevo account with API-key management permission.
|
|
10
|
+
2. Open the account dropdown and choose **Settings → SMTP & API → API Keys & MCP**.
|
|
11
|
+
3. Generate a new API key and give it a name identifying the application and
|
|
12
|
+
environment. Copy the full value while it is shown.
|
|
13
|
+
4. Store it outside source, for example as `BREVO_API_KEY` in the backend's
|
|
14
|
+
environment. An SMTP key is a different credential.
|
|
15
|
+
5. In `integrations.json`, choose provider `brevo`, mode `shared` or `assistant`,
|
|
16
|
+
empty `scopes`, and `authentication: { "method": "api-key", "secretRef":
|
|
17
|
+
"env:BREVO_API_KEY" }`. This slot needs no OAuth registration.
|
|
18
|
+
6. In Vibe64 save configuration, choose **Set credential in Env**, save the key,
|
|
19
|
+
return and choose **Connect account** or **Verify again**. **Check connection**
|
|
20
|
+
reloads status only. CLI apps call `connectApiKey`. Manage/revoke keys through
|
|
21
|
+
the same console; disconnect only removes the local runtime grant.
|
|
22
|
+
See [Brevo key management](https://help.brevo.com/hc/en-us/articles/209467485-Create-and-manage-your-API-keys).
|
|
23
|
+
|
|
24
|
+
## Runtime and AI composition
|
|
25
|
+
|
|
26
|
+
`contacts.list` calls `GET /v3/contacts` with the `api-key` header. Inputs are
|
|
27
|
+
`limit` (1–1000, default 50), `offset` (nonnegative, default 0), and `sort`
|
|
28
|
+
(`asc`/`desc`, default `desc`). The result keeps `contacts` and `count`; advance
|
|
29
|
+
the offset in application code when another page is needed. The verifier uses
|
|
30
|
+
this operation, avoiding an account-details response that may contain unrelated
|
|
31
|
+
provider credentials. See [Get contacts](https://developers.brevo.com/reference/get-contacts).
|
|
32
|
+
|
|
33
|
+
Use the [API-key source pattern](../patterns/api-key-connection/PATTERN.md).
|
|
34
|
+
The application owns access to contact information and sending
|
|
35
|
+
workflows. A CLI and Vibe64 configure the same slot and reference; connection
|
|
36
|
+
metadata lives in the chosen runtime file directory.
|
|
37
|
+
|
|
38
|
+
## Provisioning automation and capacity
|
|
39
|
+
|
|
40
|
+
An AI can wire the adapter and read contacts after an operator supplies a key.
|
|
41
|
+
No API for ordinary-account key creation was verified in this pass. Enterprise
|
|
42
|
+
subaccount provisioning must not be assumed available to normal accounts.
|
|
43
|
+
Operator setup therefore follows the console steps above.
|
|
44
|
+
|
|
45
|
+
Each application supplies its own account credentials. Two API keys under
|
|
46
|
+
one account do not establish separate sending credits or capacity. Reading contacts does not prove sending readiness; authenticate the sender
|
|
47
|
+
domain and complete the account/sender requirements before sending.
|
|
48
|
+
|
|
49
|
+
Fixtures verify headers, pagination, invalid inputs, storage restart, key
|
|
50
|
+
rotation, isolation, disconnect and provider failures. No contacts were read
|
|
51
|
+
from a real account.
|
|
52
|
+
|
|
53
|
+
## Sender and delivery setup
|
|
54
|
+
|
|
55
|
+
For email, open **Settings → Senders, Domains, IPs → Domains → Add a domain**.
|
|
56
|
+
Add the sending domain you control. Use automatic authentication when offered,
|
|
57
|
+
or copy every displayed DNS record into that domain's DNS provider. Keep the
|
|
58
|
+
exact host, type and value: DKIM may use TXT or multiple CNAME records. Return
|
|
59
|
+
and choose **Authenticate this email domain** after manual setup. DNS propagation
|
|
60
|
+
may take time; recheck status. Never replace an existing DMARC policy blindly.
|
|
61
|
+
[Domain setup](https://help.brevo.com/hc/en-us/articles/12163873383186-Authenticate-your-domain-with-Brevo-Brevo-code-DKIM-DMARC).
|
|
62
|
+
|
|
63
|
+
Then open **Settings → Senders, Domains, IPs → Senders → Add a sender**, enter
|
|
64
|
+
From name/email and Save. If prompted, enter the six-digit code emailed to that
|
|
65
|
+
address and choose **Verify sender**. The adapter can create/read sender/domain
|
|
66
|
+
records, but it does not edit DNS or approve your account.
|
|
67
|
+
[Sender setup](https://help.brevo.com/hc/en-us/articles/208836149-Create-a-new-sender-From-name-and-From-email).
|
|
68
|
+
|
|
69
|
+
For SMS, inspect your account's recipient-country sender requirements. The
|
|
70
|
+
registration UI, when available for your account, is **Settings → Campaigns →
|
|
71
|
+
SMS Sender ID → Configure → Request Sender ID**. Choose the country, provide
|
|
72
|
+
company/Sender ID and message details, submit and wait for approval. Check SMS
|
|
73
|
+
credits before enabling sending. The API key alone does not establish readiness.
|
|
74
|
+
[Country Sender ID setup](https://help.brevo.com/hc/en-us/articles/28255350696466-Register-a-Sender-ID-to-send-SMS-messages).
|
|
75
|
+
|
|
76
|
+
## App operations
|
|
77
|
+
|
|
78
|
+
The [official API description](https://api.brevo.com/v3/swagger_definition_v3.yml)
|
|
79
|
+
was inspected on 12 September 2026. Paths below are relative to
|
|
80
|
+
`https://api.brevo.com/v3`; all requests use the backend's `api-key` header.
|
|
81
|
+
|
|
82
|
+
| Operations | Path / behavior |
|
|
83
|
+
|---|---|
|
|
84
|
+
| email.send | POST /smtp/email. sender, to, and either templateId/params or subject plus htmlContent/textContent. Returns messageId, not proof of delivery. |
|
|
85
|
+
| sms.send | POST /transactionalSMS/sms. Explicit sender, recipient with country code, type transactional/marketing, and content or templateId/params. Long/Unicode content can consume multiple credits. |
|
|
86
|
+
| contacts.get/create/update | GET/PUT /contacts/{email}, POST /contacts. Existing defined attributes, list membership, email/SMS blacklist flags. Create defaults updateEnabled false; no automatic force merge or unsubscription reset. |
|
|
87
|
+
| folders.list; lists.list/create | GET /contacts/folders, GET/POST /contacts/lists. Creating a list needs its parent folderId. |
|
|
88
|
+
| lists.addContacts/removeContacts | POST /contacts/lists/{id}/contacts/add or remove; 1–150 email addresses. Preserve successes and failures separately. Removing list membership does not erase or unsubscribe a contact. |
|
|
89
|
+
| senders.list/create | GET/POST /senders. Creation takes name/email; retain returned SPF/DKIM error flags and complete provider verification. |
|
|
90
|
+
| domains.create/get/authenticate | POST /senders/domains, GET /senders/domains/{domain}, PUT /senders/domains/{domain}/authenticate. Preserve DNS records and actual verified/authenticated flags. Authentication request is followed by a status read. |
|
|
91
|
+
| campaigns.list/get/create | GET/POST /emailCampaigns, GET /emailCampaigns/{id}. Create a draft with name, sender, content/template and explicit recipient lists; exclusions supported. No automatic send/schedule. |
|
|
92
|
+
| campaigns.sendTest/sendNow | POST /emailCampaigns/{id}/sendTest with emailTo, or /sendNow. The app must authorize either send explicitly; test recipients may need to be configured in Brevo. |
|
|
93
|
+
| email.events / sms.events | GET /smtp/statistics/events or /transactionalSMS/statistics/events. Offset pagination, days and messageId/email or phoneNumber filters. Preserve bounce/rejection details. |
|
|
94
|
+
| events.create | POST /events. event_name, identifiers.email_id and optional event/contact properties/date. Events can trigger existing active automations; they do not create a workflow. |
|
|
95
|
+
|
|
96
|
+
Call path IDs are passed as `resource` (number for lists/campaigns; email for
|
|
97
|
+
contacts; bare domain for domains). The same key and configuration are used
|
|
98
|
+
from CLI through the [API-key pattern](../patterns/api-key-connection/PATTERN.md).
|
|
99
|
+
Other frameworks use their native HTTP, Env and app authorization with these
|
|
100
|
+
contracts; Vibe64 and a Node service are not required at runtime.
|
|
101
|
+
|
|
102
|
+
For an appointment reminder, confirm sender readiness, authorize the recipient,
|
|
103
|
+
call email.send, save messageId and read email.events later. For a newsletter,
|
|
104
|
+
maintain consenting contacts/lists, create a draft, review a test, then explicitly
|
|
105
|
+
sendNow. For automation, configure and activate the matching event-triggered
|
|
106
|
+
workflow in Brevo before sending events.create from the application. The app owns
|
|
107
|
+
scheduling, consent/unsubscribe UI, delivery reporting and duplicate-send prevention.
|
|
108
|
+
No ambiguous send or creation request is automatically retried.
|
|
109
|
+
|
|
110
|
+
## LIMITATIONS
|
|
111
|
+
|
|
112
|
+
Editor coding-assistant attachment is deferred. For example, the app can send a
|
|
113
|
+
booking email and show its bounce status, but Vibe64's Codex/OpenCode cannot inspect
|
|
114
|
+
Brevo merely because this connector is configured. The app owns message content,
|
|
115
|
+
recipient authorization and scheduling. This does not supply a template/automation
|
|
116
|
+
visual designer, webhook receiver, SMTP service, WhatsApp integration or account
|
|
117
|
+
approval. Advanced batch sends and attachments use native provider wiring.
|
|
118
|
+
No real messages, domain changes, purchased credits or generated apps were tested.
|
|
119
|
+
|
|
120
|
+
Focused fixtures cover sends, draft/test/sendNow separation, contacts/list results,
|
|
121
|
+
DNS pending state, delivery failures, organization policy denial and no replay after
|
|
122
|
+
an uncertain send, alongside existing file restart/rotation/disconnect tests.
|
package/docs/calendly.md
ADDED
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
# Calendly
|
|
2
|
+
|
|
3
|
+
Import `calendlyProvider` from `@jskit-ai/connectors-catalog/server/calendly`.
|
|
4
|
+
This adapter uses an owner's personal token or project-owned web OAuth registration
|
|
5
|
+
to read schedules and invitees, create links, book and cancel appointments.
|
|
6
|
+
It does not implement application login. Shared and assistant connections are supported.
|
|
7
|
+
|
|
8
|
+
## Configure access
|
|
9
|
+
|
|
10
|
+
1. Sign in to the intended Calendly account. Open **Integrations → API & Webhooks**.
|
|
11
|
+
2. Under **Personal Access Tokens**, choose **Get a token now** or
|
|
12
|
+
**Generate new token** if tokens already exist.
|
|
13
|
+
3. Name the token for this application. Grant `users:read` and
|
|
14
|
+
`event_types:read`; newly scoped tokens require explicit permissions.
|
|
15
|
+
4. Create and copy the token while it is displayed. Store it in backend Env
|
|
16
|
+
as `CALENDLY_API_KEY`.
|
|
17
|
+
5. Save a slot with provider `calendly`, mode `shared` or `assistant`,
|
|
18
|
+
`scopes: ["users:read", "event_types:read"]`, and authentication `{ "method": "api-key", "secretRef":
|
|
19
|
+
"env:CALENDLY_API_KEY" }`. No registration entry is needed for a personal token.
|
|
20
|
+
6. Verify using `connectApiKey`. Manage tokens on the same provider page.
|
|
21
|
+
[Token setup](https://developer.calendly.com/how-to-authenticate-with-personal-access-tokens),
|
|
22
|
+
[provider scope requirements](https://developer.calendly.com/docs/authentication/scopes).
|
|
23
|
+
|
|
24
|
+
## Runtime and CLI composition
|
|
25
|
+
|
|
26
|
+
`profile.read` calls `GET https://api.calendly.com/users/me`; its `resource.uri`
|
|
27
|
+
is the required `user` input for `eventTypes.list`. The latter calls
|
|
28
|
+
`GET /event_types`, accepting `count` (1–100, default 20), `page_token` and
|
|
29
|
+
optional `active`. Omit `active` to include both active and inactive types.
|
|
30
|
+
Pass `pagination.next_page_token` to request another page; do not follow a
|
|
31
|
+
returned URL with credentials. Results retain the provider envelope.
|
|
32
|
+
[Profile API](https://developer.calendly.com/api-docs/calendly-api/users/get-current-user),
|
|
33
|
+
[event-type API](https://developer.calendly.com/api-docs/calendly-api/event-types/list-event-types).
|
|
34
|
+
|
|
35
|
+
Use the [API-key pattern](../patterns/api-key-connection/PATTERN.md) with this
|
|
36
|
+
provider. Configuration and encrypted connection state remain separate files.
|
|
37
|
+
Provider-side token grants determine access; the configuration scope list
|
|
38
|
+
does not grant provider permissions. For pre-release configurations created
|
|
39
|
+
before OAuth support, replace Calendly’s empty scope list with users:read and
|
|
40
|
+
event_types:read; no compatibility reader is provided.
|
|
41
|
+
|
|
42
|
+
## Automation and application registrations
|
|
43
|
+
|
|
44
|
+
An AI can prepare configuration and requests after token creation. The verified
|
|
45
|
+
personal-token creation flow is interactive. A public integration instead needs
|
|
46
|
+
a developer account and OAuth application: sign into the developer portal,
|
|
47
|
+
create an OAuth app, and set its name, client type and authorized callback.
|
|
48
|
+
The generated application owns that registration and its callback. Hosted and
|
|
49
|
+
installed editors do not supply shared Vibe64 registrations. These OAuth
|
|
50
|
+
credentials are consumed by the web OAuth mode described below.
|
|
51
|
+
[OAuth app setup](https://developer.calendly.com/docs/authentication/creating-an-oauth-app).
|
|
52
|
+
|
|
53
|
+
Use the application's own account token and respect its provider rate limits;
|
|
54
|
+
do not share one person's token across unrelated applications.
|
|
55
|
+
Automated fixtures cover headers, required inputs, pagination, storage restart,
|
|
56
|
+
rotation, isolation and failure handling. No live scheduling data was accessed.
|
|
57
|
+
|
|
58
|
+
## Web OAuth setup and delivery status
|
|
59
|
+
|
|
60
|
+
The captured connection experience uses OAuth scopes. Personal tokens above
|
|
61
|
+
are a separate setup choice. OAuth uses the existing connection service and
|
|
62
|
+
the project-owned registration; it needs no Vibe64 authentication gateway.
|
|
63
|
+
|
|
64
|
+
Provider setup, checked against the official guide on 12 September 2026:
|
|
65
|
+
|
|
66
|
+
1. Open the [developer portal](https://developer.calendly.com/docs/authentication/creating-an-oauth-app)
|
|
67
|
+
and sign in or create a developer account. This is separate from the normal
|
|
68
|
+
Calendly user account.
|
|
69
|
+
2. Create an OAuth application. Supply its name, select **web**, and choose
|
|
70
|
+
**Sandbox** for development or **Production** for production. Calendly
|
|
71
|
+
recommends separate applications for those environments.
|
|
72
|
+
3. Copy the generated application's exact callback URL from Vibe64 into
|
|
73
|
+
**Redirect URI**. Production requires HTTPS. Sandbox permits HTTP localhost;
|
|
74
|
+
a hosted development URL should still use its actual HTTPS address.
|
|
75
|
+
4. Select **users:read** for the profile check and **event_types:read** for
|
|
76
|
+
event-type listing. Add scheduled_events:read for meetings/invitees, availability:read for slots,
|
|
77
|
+
scheduling_links:write for single-use links, and scheduled_events:write for
|
|
78
|
+
booking/cancellation/no-shows. Grant the same scopes on personal tokens.
|
|
79
|
+
Selecting a scope grants no app-user authorization; the app must enforce that.
|
|
80
|
+
5. Continue and copy the Client ID, Client Secret and Webhook signing key.
|
|
81
|
+
The secret and signing key are shown only at creation. Save the Client ID
|
|
82
|
+
in project registration configuration and the Client Secret in private Env.
|
|
83
|
+
The current fragment has no webhook receiver; its signing key must not be
|
|
84
|
+
confused with the OAuth Client Secret.
|
|
85
|
+
6. Configure the registration with `tokenEndpointAuthMethod: client_secret_basic`
|
|
86
|
+
for a web client. Its secret belongs to the generated app's backend, never
|
|
87
|
+
the browser or Vibe64's platform account. The shared provider metadata selects Basic authentication for web OAuth.
|
|
88
|
+
7. Register a changed custom-domain callback in the provider application before
|
|
89
|
+
reconnecting. The provider application's menu offers **Edit**, including
|
|
90
|
+
Redirect URI, followed by **Save**.
|
|
91
|
+
|
|
92
|
+
Runtime endpoints: authorization at `https://auth.calendly.com/oauth/authorize`
|
|
93
|
+
and token exchange at `https://auth.calendly.com/oauth/token`. Use the existing
|
|
94
|
+
state and S256 PKCE lifecycle. Web token requests authenticate the client with
|
|
95
|
+
HTTP Basic; native clients have a different contract and are not covered by
|
|
96
|
+
these web-application instructions. Persist each replacement refresh token
|
|
97
|
+
under the existing grant lock rather than replaying a consumed refresh token.
|
|
98
|
+
The profile and event-type operations retain their current fixed API origin.
|
|
99
|
+
|
|
100
|
+
Required focused proof before marking this provider complete: OAuth configuration
|
|
101
|
+
and captured scope choices, Basic authentication on code exchange and refresh,
|
|
102
|
+
PKCE/state checks, rotated-token persistence, denial/cancel/reconnect/disconnect,
|
|
103
|
+
and the existing personal-token flow. Live consent and scheduling remain outside
|
|
104
|
+
the controlled-test scope.
|
|
105
|
+
|
|
106
|
+
Sources: [OAuth app creation](https://developer.calendly.com/docs/authentication/creating-an-oauth-app),
|
|
107
|
+
[token endpoint](https://developer.calendly.com/api-docs/calendly-o-auth/o-auth/post-oauth-refresh-token).
|
|
108
|
+
|
|
109
|
+
The focused `test/calendly.test.js` fixture passes Basic code exchange, S256
|
|
110
|
+
PKCE, concurrent refresh serialization, replacement refresh persistence across
|
|
111
|
+
a new service instance, personal-token connection and local disconnect. This does not establish live Calendly consent or token issuance.
|
|
112
|
+
|
|
113
|
+
## Scheduling operations and application ownership
|
|
114
|
+
|
|
115
|
+
Both authentication methods use these same operations through `service.invoke`.
|
|
116
|
+
A CLI Node app installs the provider and composes the normal file connection service;
|
|
117
|
+
Vibe64 is not required. Other frameworks use their native HTTP/OAuth library and the
|
|
118
|
+
same project configuration, Env references and callback contract.
|
|
119
|
+
|
|
120
|
+
| Operations | Input / useful result | Scope |
|
|
121
|
+
| --- | --- | --- |
|
|
122
|
+
| `eventTypes.get`, `eventTypes.list` | Type UUID / profile user URI; scheduling URLs and type details | event_types:read |
|
|
123
|
+
| `availability.list` | Event-type URI, UTC start/end within 31 days; available times | availability:read |
|
|
124
|
+
| `events.list`, `events.get` | User/organization/group URI or event UUID; meeting status, times, pagination | scheduled_events:read |
|
|
125
|
+
| `invitees.list`, `invitees.get` | Event UUID and optional invitee UUID; answers, status, cancellation/reschedule URLs | scheduled_events:read |
|
|
126
|
+
| `schedulingLinks.create` | Event-type URI as `owner`; single-use booking URL, fixed max_event_count=1 | scheduling_links:write |
|
|
127
|
+
| `invitees.create` | Event-type URI, UTC start time, invitee email/name/IANA timezone; optional answers and guests | scheduled_events:write |
|
|
128
|
+
| `events.cancel` | Event UUID, optional reason; cancellation confirmation | scheduled_events:write |
|
|
129
|
+
| `noShows.create`, `noShows.get`, `noShows.delete` | Full invitee URI / no-show UUID; mark/read/undo no-show | scheduled_events:read or write |
|
|
130
|
+
|
|
131
|
+
Example: DogAndGroom reads its owner profile, lists active event types, then creates
|
|
132
|
+
one link for its grooming event type and sends that URL to the customer. The customer
|
|
133
|
+
selects and confirms the time on Calendly. A created link is not a scheduled event.
|
|
134
|
+
For an app-owned booking form, fetch future availability then submit `invitees.create`;
|
|
135
|
+
this requires Calendly Standard or higher. Slots may disappear between these calls;
|
|
136
|
+
handle the provider rejection and offer fresh availability. Booking triggers the event
|
|
137
|
+
type's normal confirmations and workflows. Do not automatically retry uncertain writes.
|
|
138
|
+
|
|
139
|
+
Pass pagination tokens back to the same operation. Do not fetch returned links with
|
|
140
|
+
an Authorization header. Organization/group access still depends on the owner's role.
|
|
141
|
+
Cancelling an event cancels the entire event, including a group event; it is not an individual group-invitee cancellation. Use the invitee’s hosted cancellation URL when appropriate.
|
|
142
|
+
The application owns who can read whose invitee data, booking confirmation, timezone
|
|
143
|
+
display, cancellations, persistence and polling. Reschedule using the invitee's returned
|
|
144
|
+
`reschedule_url`; this adapter does not invent a reschedule API.
|
|
145
|
+
|
|
146
|
+
**LIMITATIONS:** Public Vibe64 coding-assistant attachment is deferred. For example,
|
|
147
|
+
connecting Calendly does not let the editor's assistant inspect tomorrow's appointments;
|
|
148
|
+
the generated app's backend can use the scheduling operations above. Webhook receivers,
|
|
149
|
+
organization administration and advanced location/routing/customized event-type creation
|
|
150
|
+
are not supplied here. For example, a custom meeting-location booking form must use
|
|
151
|
+
native provider API handling, or send the customer through the hosted booking link.
|
|
152
|
+
No live consent, token issuance, booking or notification has been exercised.
|
|
153
|
+
|
|
154
|
+
Sources checked 12 September 2026:
|
|
155
|
+
[booking API](https://developer.calendly.com/api-docs/calendly-api/scheduled-events/create-event-invitee),
|
|
156
|
+
[scheduled events](https://developer.calendly.com/api-docs/calendly-api/scheduled-events/list-scheduled-events),
|
|
157
|
+
[no-show deletion](https://developer.calendly.com/api-docs/calendly-api/scheduled-events/delete-invitee-no-show),
|
|
158
|
+
[scopes](https://developer.calendly.com/docs/authentication/scopes).
|
package/docs/canva.md
ADDED
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
# Canva assistant MCP
|
|
2
|
+
|
|
3
|
+
Import `canvaProvider` from `@jskit-ai/connectors-catalog/server/canva` and
|
|
4
|
+
`createCanvaClientMetadata` from `@jskit-ai/connectors-catalog/shared`. This
|
|
5
|
+
fragment uses Canva's recommended Client ID Metadata Document (CIMD) flow.
|
|
6
|
+
The client identifier is a hosted JSON URL; this client has no secret.
|
|
7
|
+
|
|
8
|
+
## Manual setup and approval
|
|
9
|
+
|
|
10
|
+
1. Open the [Canva MCP guide](https://www.canva.dev/docs/mcp/), find **Getting
|
|
11
|
+
started → Register your redirect URI**, and open **Waitlist form**.
|
|
12
|
+
2. Supply the company/integration details and exact callback URL requested by
|
|
13
|
+
the form. Wait for Canva's eligibility decision and callback allowlisting.
|
|
14
|
+
This is a real provider prerequisite. Publishing metadata or entering a URL
|
|
15
|
+
in Vibe64 does not grant access, and JSKIT cannot approve an application.
|
|
16
|
+
3. Choose a public HTTPS URL that your assistant host controls, including a
|
|
17
|
+
document path, such as `https://assistant.example/oauth/canva.json`.
|
|
18
|
+
4. Generate the client metadata with the library helper below, or fill the metadata
|
|
19
|
+
URL and suggested callback in Vibe64 and choose **Copy client metadata** in
|
|
20
|
+
the setup section. Serve that JSON
|
|
21
|
+
at exactly the chosen URL with `Content-Type: application/json`, without
|
|
22
|
+
authentication. The document contains public client information only.
|
|
23
|
+
5. In Vibe64 open **Integrations → Add Canva → Credentials**. Enter **Client
|
|
24
|
+
metadata URL** and the **Callback URL reference**, for example
|
|
25
|
+
`env:CANVA_CALLBACK_URL`. Store the actual callback through Env. No Client
|
|
26
|
+
secret input is shown. **Display name** can supply the name used when
|
|
27
|
+
generating your metadata.
|
|
28
|
+
6. Open **Permissions**. Profile, design information/content and folder reads
|
|
29
|
+
start selected. Select further content permissions only when needed; all
|
|
30
|
+
writes start unselected. Save configuration.
|
|
31
|
+
7. The assistant host opens the URL returned by `beginAuthorization`. The owner
|
|
32
|
+
signs into Canva and approves access. Complete the callback under that same
|
|
33
|
+
authenticated owner with `completeAuthorization`. The runtime initializes
|
|
34
|
+
MCP and lists tools before storing its grant. Consent screens were not
|
|
35
|
+
exercised here, so their precise controls are not represented as verified.
|
|
36
|
+
|
|
37
|
+
Canva documents individual authentication and content permissions in its
|
|
38
|
+
[troubleshooting guide](https://www.canva.dev/docs/mcp/troubleshooting/).
|
|
39
|
+
Each person connects their own account; this does not turn one person's Canva
|
|
40
|
+
account into a workspace service account.
|
|
41
|
+
|
|
42
|
+
## Metadata builder and automation
|
|
43
|
+
|
|
44
|
+
```js
|
|
45
|
+
const document = createCanvaClientMetadata({
|
|
46
|
+
clientId: "https://assistant.example/oauth/canva.json",
|
|
47
|
+
clientName: "Design assistant",
|
|
48
|
+
callbackUrl: "https://assistant.example/connections/canva/callback"
|
|
49
|
+
});
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
The helper validates the URL/name/callback and returns ordinary serializable
|
|
53
|
+
JSON containing `client_id`, `client_name`, one `redirect_uris` entry, code and
|
|
54
|
+
refresh grants, code response type and `token_endpoint_auth_method: "none"`.
|
|
55
|
+
The identifier matches the document URL exactly. It performs no network call,
|
|
56
|
+
file write, registration, deployment or consent. The host owns where the
|
|
57
|
+
returned document is served and must regenerate it when its registration
|
|
58
|
+
configuration changes. Derive the identifier, display name and resolved
|
|
59
|
+
callback from the same portable configuration; do not keep competing copies.
|
|
60
|
+
|
|
61
|
+
The [MCP authorization specification](https://modelcontextprotocol.io/specification/2025-11-25/basic/authorization#client-id-metadata-documents)
|
|
62
|
+
explains metadata URL identities and matching callbacks. Canva's public
|
|
63
|
+
[authorization metadata](https://mcp.canva.com/.well-known/oauth-authorization-server)
|
|
64
|
+
advertises metadata documents, S256 and clients without secrets. Its
|
|
65
|
+
[resource metadata](https://mcp.canva.com/.well-known/oauth-protected-resource)
|
|
66
|
+
advertises 16 supported scopes and resource `https://mcp.canva.com`. Public
|
|
67
|
+
metadata was inspected on 9 September 2026 without creating a client or account.
|
|
68
|
+
|
|
69
|
+
AI can prepare and validate metadata/configuration and wire the host's existing
|
|
70
|
+
static response. Publishing that response, submitting the approval application
|
|
71
|
+
and approving account consent require their respective owners. The initial
|
|
72
|
+
fragment does not automate the approval form. Canva still documents dynamic
|
|
73
|
+
registration as a deprecated compatibility route; this implementation follows
|
|
74
|
+
its recommended metadata-document path instead.
|
|
75
|
+
|
|
76
|
+
## Portable configuration
|
|
77
|
+
|
|
78
|
+
```json
|
|
79
|
+
{
|
|
80
|
+
"schemaVersion": 1,
|
|
81
|
+
"registrations": {
|
|
82
|
+
"canva": {
|
|
83
|
+
"source": "own",
|
|
84
|
+
"clientId": "https://assistant.example/oauth/canva.json",
|
|
85
|
+
"tokenEndpointAuthMethod": "none",
|
|
86
|
+
"callbackUrlRef": "env:CANVA_CALLBACK_URL"
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
"integrations": {
|
|
90
|
+
"design": {
|
|
91
|
+
"provider": "canva",
|
|
92
|
+
"displayName": "Design assistant",
|
|
93
|
+
"accountMode": "assistant",
|
|
94
|
+
"scopes": ["profile:read", "design:meta:read", "design:content:read", "folder:read"],
|
|
95
|
+
"authentication": { "method": "oauth2", "registrationRef": "canva" }
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
CLI and UI use the same schema. `tokenEndpointAuthMethod: "none"` must be
|
|
102
|
+
explicit, the provider must declare support, and `clientSecretRef` is forbidden
|
|
103
|
+
for this client. Existing confidential registrations retain `client_secret_post`
|
|
104
|
+
when the field is omitted. Switching client authentication invalidates pending
|
|
105
|
+
attempts and requires reconnection for existing grants.
|
|
106
|
+
|
|
107
|
+
Compose the [OAuth file pattern](../patterns/oauth-connection/PATTERN.md) with
|
|
108
|
+
`providers: [canvaProvider]` and the
|
|
109
|
+
[assistant OAuth pattern](../patterns/assistant-mcp-oauth/PATTERN.md).
|
|
110
|
+
Code exchange and refresh send the metadata URL as `client_id`, without a client
|
|
111
|
+
secret. Authorization/code/refresh include Canva's resource identifier; tokens
|
|
112
|
+
and pending PKCE attempts remain encrypted text files under the existing owner.
|
|
113
|
+
The runtime does not download metadata from arbitrary client URLs: Canva's
|
|
114
|
+
authorization server validates the hosted document and approved callback.
|
|
115
|
+
|
|
116
|
+
`tools.list` accepts a cursor; `tools.call` accepts `name` and `arguments`.
|
|
117
|
+
Calls target only `https://mcp.canva.com/mcp`. The host must authorize exact tool
|
|
118
|
+
names and design/content ownership, handle tool `isError`, and decide which
|
|
119
|
+
returned content to display. Discovery does not establish every tool or plan
|
|
120
|
+
permission. No tool is executed by saving or verifying the configuration.
|
|
121
|
+
The provider has a 60-second request budget, matching Canva's documented advice
|
|
122
|
+
for design generation; OAuth requests retain the core's 15-second budget.
|
|
123
|
+
Cancellation stops waiting and attempts MCP session cleanup; it does not undo
|
|
124
|
+
accepted edits. Local disconnect does not revoke every Canva authorization.
|
|
125
|
+
|
|
126
|
+
## Connection ownership and callbacks
|
|
127
|
+
|
|
128
|
+
This fragment is for an explicitly configured assistant host. That host owns its
|
|
129
|
+
client registration, callback, private credentials and grants; it may be an
|
|
130
|
+
application-owned assistant or an opt-in editor tool. Merely adding the provider
|
|
131
|
+
to a project does not authorize the editor's coding assistant. It does not supply
|
|
132
|
+
published app-user login. The host's callback may differ from the published app's
|
|
133
|
+
domain, but it must match that host's real route and registered redirect URI.
|
|
134
|
+
|
|
135
|
+
Host a publicly reachable client metadata document owned by this runtime, with
|
|
136
|
+
its actual callback in `redirect_uris`. The metadata URL is the client identity;
|
|
137
|
+
it is distinct from the callback URL. There is no provider client secret in this
|
|
138
|
+
mode. Separate metadata URLs do not split user/team quotas or upgrade Canva
|
|
139
|
+
features. Canva approval decides which callback URLs are accepted, including
|
|
140
|
+
any loopback development URL. If the callback changes, update the metadata and
|
|
141
|
+
obtain the required approval before starting consent again.
|
|
142
|
+
|
|
143
|
+
This fragment does not implement automatic metadata hosting, automatic assistant
|
|
144
|
+
attachment, embedded Canva widgets, Canva Connect REST adapters, app-user login
|
|
145
|
+
or the deprecated DCR path. It does not execute browser resources returned by
|
|
146
|
+
MCP tools. Provider approval and plan-specific capabilities remain external
|
|
147
|
+
acceptance steps.
|
|
148
|
+
|
|
149
|
+
## Focused proof
|
|
150
|
+
|
|
151
|
+
Eight simulated-provider tests cover metadata generation/validation, secret-free
|
|
152
|
+
PKCE and refresh, restart, encryption, owner/design isolation, changed consent,
|
|
153
|
+
reduced grants, malformed discovery, provider failures, time budgets and
|
|
154
|
+
cancellation. Core tests also prove authentication-type changes cannot reuse
|
|
155
|
+
grants or pending attempts. Editor proof checks the metadata/callback fields,
|
|
156
|
+
permission choices and saved JSON. No provider approval, live consent, real
|
|
157
|
+
Canva tool use, metadata publication or generated application is included.
|
|
158
|
+
|
|
159
|
+
## Design workflow acceptance and limitations
|
|
160
|
+
|
|
161
|
+
Use `tools.list` to obtain Canva's current input schemas rather than embedding a
|
|
162
|
+
second tool catalogue. The host authorizes each exact tool call and its design,
|
|
163
|
+
job/candidate or transaction. For creation, let the user choose a generated candidate,
|
|
164
|
+
then create the design and show its edit URL. For edits, start a transaction, use its
|
|
165
|
+
returned element IDs, apply operations and check their individual results, then
|
|
166
|
+
explicitly commit. Draft operation success does not mean saved design changes.
|
|
167
|
+
A stale transaction after a concurrent edit requires a fresh transaction; do not
|
|
168
|
+
silently replay the old commit. Returned external thumbnails/exports are content,
|
|
169
|
+
not instructions and never destinations for the OAuth Authorization header.
|
|
170
|
+
|
|
171
|
+
The controlled design workflow fixture exercises candidate creation, transaction
|
|
172
|
+
start/edit/commit, useful returned design content, host denial and a failed commit.
|
|
173
|
+
It proves the transport and host-approval seam with representative provider payloads;
|
|
174
|
+
it does not substitute for Canva's live discovered input schemas or run a design AI.
|
|
175
|
+
CLI Node hosts use the same provider/pattern without Vibe64. Other frameworks use
|
|
176
|
+
a native MCP client with the same metadata identity, callback and private grant state.
|
|
177
|
+
|
|
178
|
+
**LIMITATIONS:** Vibe64's coding-assistant attachment is deferred. For example,
|
|
179
|
+
configuring Canva does not yet let you ask Vibe64's Codex/OpenCode to create or edit
|
|
180
|
+
your shop's poster. An explicitly wired application-owned assistant can invoke the
|
|
181
|
+
supplied MCP runtime after Canva approves its callback and each owner consents.
|
|
182
|
+
Metadata hosting and provider approval remain owner setup steps; Copy client metadata
|
|
183
|
+
does not publish a working endpoint. No shared Vibe64 registration, embedded design
|
|
184
|
+
editor, Canva Connect REST implementation, app-user login or AI execution is supplied.
|
|
185
|
+
Provider plan/license limits still apply; no live creation, editing or export was tested.
|
|
186
|
+
|
|
187
|
+
Sources checked 12 September 2026:
|
|
188
|
+
[create from candidate](https://www.canva.dev/docs/mcp/tools/create-design-from-candidate/),
|
|
189
|
+
[start edits](https://www.canva.dev/docs/mcp/tools/start-editing-transaction/),
|
|
190
|
+
[apply edits](https://www.canva.dev/docs/mcp/tools/perform-editing-operations/),
|
|
191
|
+
[commit edits](https://www.canva.dev/docs/mcp/tools/commit-editing-transaction/).
|