@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/gmail.md
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
# Gmail setup and runtime
|
|
2
|
+
|
|
3
|
+
Documentation checked: 8 September 2026. Automated tests use simulated provider
|
|
4
|
+
responses and real private JSON state; live provider use is outside this delivery.
|
|
5
|
+
|
|
6
|
+
## Registration and manual setup
|
|
7
|
+
|
|
8
|
+
Follow all numbered steps in [Google registration setup](google-oauth.md).
|
|
9
|
+
For this connector, choose **Gmail API** in APIs & Services → Library and enable
|
|
10
|
+
`gmail.googleapis.com` in the selected Cloud project. Create a Web application client
|
|
11
|
+
with the exact backend callback URI. Set the client ID, secret reference and
|
|
12
|
+
callback URL reference in the same registration fields used by the CLI.
|
|
13
|
+
|
|
14
|
+
In Google Auth Platform → Data Access, select
|
|
15
|
+
`https://www.googleapis.com/auth/gmail.readonly` (required by this connector).
|
|
16
|
+
The captured defaults also select `gmail.send`, `gmail.compose` and `gmail.modify`.
|
|
17
|
+
Remove optional permissions your application does not need; verification only reads the profile; writes require explicit app operations.
|
|
18
|
+
The UI exposes additional documented scopes for applications that need them;
|
|
19
|
+
those scopes do not add operations to this fragment. Use External plus explicit
|
|
20
|
+
test users while testing outside an eligible internal Workspace audience.
|
|
21
|
+
|
|
22
|
+
## Fields and useful fragment
|
|
23
|
+
|
|
24
|
+
Provider ID: `gmail`. Import its provider from
|
|
25
|
+
`@jskit-ai/connectors-catalog/server/gmail`. Display name, scopes, account mode,
|
|
26
|
+
Client ID/secret and callback references follow the shared field mapping.
|
|
27
|
+
Membership and project access are enforced by the host/application policy,
|
|
28
|
+
not by storing untrusted people IDs in application source.
|
|
29
|
+
|
|
30
|
+
Operations include profile, message/search/attachment reads, drafts, explicit send, labels and reversible mailbox actions listed below.
|
|
31
|
+
Verification input: `{}`.
|
|
32
|
+
|
|
33
|
+
The profile read returns the authenticated mailbox address and message count. Message listing accepts maxResults (1–500), pageToken and repeated labelIds; pass nextPageToken to continue. Message get reads headers using format=metadata and requires a message id. Use messages.read for full/raw content, attachments.get for external MIME parts and messages.search for q. These operations exclude gmail.metadata, which cannot authorize bodies or search.
|
|
34
|
+
|
|
35
|
+
The first read must succeed before Connected is returned. Invalid resource
|
|
36
|
+
identifiers fail before opening consent. Denied scopes, wrong account context,
|
|
37
|
+
replayed callbacks and provider rate limits are covered by the automated tests.
|
|
38
|
+
See the [official operation reference](https://developers.google.com/workspace/gmail/api/reference/rest/v1/users/getProfile) for the response and resource
|
|
39
|
+
permission requirements; the implementation also checks Google's public API
|
|
40
|
+
discovery document for request paths and supported scope strings.
|
|
41
|
+
|
|
42
|
+
## Automation and application setup
|
|
43
|
+
|
|
44
|
+
Classification: **assisted**, as detailed in the common Google guide. An
|
|
45
|
+
operator-authorized AI can check/create the Cloud project and enable
|
|
46
|
+
`gmail.googleapis.com` with Service Usage or gcloud. It can prepare this connector's
|
|
47
|
+
JSON and callback/scope values. Web-client creation, branding, audience,
|
|
48
|
+
provider review and account consent remain the documented console/operator
|
|
49
|
+
steps; this adapter does not invent an API for them.
|
|
50
|
+
|
|
51
|
+
The application owns the Cloud project selection, registration, callback and
|
|
52
|
+
private secret bindings. It uses the same setup from a CLI or either editor.
|
|
53
|
+
Follow the common guide for rotation, revocation, domain changes and recovery.
|
|
54
|
+
Provider quotas belong to the selected Cloud project and resources; editor
|
|
55
|
+
subscription level does not allocate a shared registration.
|
|
56
|
+
|
|
57
|
+
## AI/CLI wiring
|
|
58
|
+
|
|
59
|
+
Use the file-store composition from the [connection pattern](../patterns/api-key-connection/PATTERN.md),
|
|
60
|
+
replace the API-key authentication with `oauth2` plus a registrationRef, and
|
|
61
|
+
register this provider. Use beginAuthorization / completeAuthorization instead
|
|
62
|
+
of connectApiKey, with the verification input above. The existing application
|
|
63
|
+
owns authenticated callback routes and its permission policy. Configuration,
|
|
64
|
+
OAuth, refresh, provider requests and storage remain library imports.
|
|
65
|
+
|
|
66
|
+
## Mailbox workflows and permission boundaries
|
|
67
|
+
|
|
68
|
+
| Operations | Inputs and required permission alternatives |
|
|
69
|
+
|---|---|
|
|
70
|
+
| `messages.read` | `id`, optional full/raw `format`; readonly, modify or full-mail |
|
|
71
|
+
| `messages.search` | `q`, maxResults/pageToken/labelIds/includeSpamTrash; same body-read permissions |
|
|
72
|
+
| `attachments.get` | `messageId`, attachment `id` from a MIME part; same body-read permissions |
|
|
73
|
+
| `messages.send` | base64url MIME `raw`, optional `threadId`; send, compose, modify or full-mail |
|
|
74
|
+
| `messages.modify` | `id`, addLabelIds/removeLabelIds (up to 100 each); modify or full-mail |
|
|
75
|
+
| `messages.trash`, `messages.untrash` | `id`; modify or full-mail |
|
|
76
|
+
| `drafts.list`, `drafts.get` | Pagination or draft `id`; readonly, compose, modify or full-mail |
|
|
77
|
+
| `drafts.create`, `drafts.update` | `raw`, optional threadId; update also draft `id`; compose, modify or full-mail |
|
|
78
|
+
| `drafts.send`, `drafts.delete` | draft `id`; compose, modify or full-mail |
|
|
79
|
+
| `labels.list` | No input; readonly, metadata, labels, modify or full-mail |
|
|
80
|
+
| `labels.create`, `labels.update`, `labels.delete` | `name`, id+name, or id; labels, modify or full-mail |
|
|
81
|
+
|
|
82
|
+
The runtime checks both configured and actually granted OAuth scopes before
|
|
83
|
+
sending an operation. Adding a scope in configuration requires a new consent.
|
|
84
|
+
An app user's connection uses `users/me`: the app cannot select another mailbox
|
|
85
|
+
by passing an email address. Shared connections still require app authorization
|
|
86
|
+
before exposing mail to visitors.
|
|
87
|
+
|
|
88
|
+
Read the returned MIME tree recursively. Inline body parts and attachment
|
|
89
|
+
responses carry base64url data; attachments may be separate parts. The app's
|
|
90
|
+
framework should parse MIME, sanitize HTML, control remote images and supply
|
|
91
|
+
safe download filenames. The connector does not render email or write files.
|
|
92
|
+
`messages.get` remains the explicitly metadata-only operation; `messages.read`
|
|
93
|
+
returns full/raw content. Listing and search return IDs, followed by reads as
|
|
94
|
+
needed; follow nextPageToken, not resultSizeEstimate, for pagination.
|
|
95
|
+
|
|
96
|
+
```js
|
|
97
|
+
const page = await connections.invoke({ context, integrationId: "gmail",
|
|
98
|
+
operation: "messages.search", input: { q: "in:inbox is:unread", maxResults: 20 } });
|
|
99
|
+
const message = await connections.invoke({ context, integrationId: "gmail",
|
|
100
|
+
operation: "messages.read", input: { id: page.messages[0].id } });
|
|
101
|
+
// After explicit app authorization, mark read and archive:
|
|
102
|
+
await connections.invoke({ context, integrationId: "gmail",
|
|
103
|
+
operation: "messages.modify", input: { id: message.id,
|
|
104
|
+
removeLabelIds: ["UNREAD", "INBOX"] } });
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
Handle an empty messages array before choosing an item. Build outgoing MIME
|
|
108
|
+
using your framework's mail library, then encode it as base64url in `raw`.
|
|
109
|
+
This adapter bounds raw input to 14 million characters; use a framework-native
|
|
110
|
+
upload flow for larger messages. The From address must be authorized for the
|
|
111
|
+
connected mailbox. Replies need valid In-Reply-To/References headers, matching
|
|
112
|
+
subject and threadId; setting threadId alone does not guarantee threading.
|
|
113
|
+
Draft updates replace the draft's message. Deleting a draft or label is explicit;
|
|
114
|
+
label deletion removes that label, not its messages. Trash is reversible here;
|
|
115
|
+
permanent message deletion is not implemented.
|
|
116
|
+
|
|
117
|
+
A send response identifies an accepted message, not final delivery. Do not
|
|
118
|
+
blindly retry an uncertain send: inspect Sent and reconcile using your app's
|
|
119
|
+
record first. The app owns duplicate prevention and any delivery/bounce handling.
|
|
120
|
+
|
|
121
|
+
CLI users use the same JSON and private Env with optional JSKIT libraries.
|
|
122
|
+
Other frameworks use their native OAuth and MIME tools with the same settings
|
|
123
|
+
and [Gmail REST methods](https://developers.google.com/workspace/gmail/api/reference/rest).
|
|
124
|
+
An AI can wire those operations using the provider schema and this guide without
|
|
125
|
+
Vibe64 running. There is no shared Vibe64 mailbox or Google registration.
|
|
126
|
+
|
|
127
|
+
**LIMITATIONS:** no background/history sync, push watch service, mail-client UI,
|
|
128
|
+
permanent message deletion or mailbox-settings administration. MIME composition
|
|
129
|
+
and rendering belong to the framework; editor assistant attachment is deferred.
|
|
130
|
+
Example: a booking app can read a customer's message, draft a reply, explicitly
|
|
131
|
+
send it and archive the thread's selected message; installing the connector does
|
|
132
|
+
not build the inbox UI or keep a local mailbox synchronized. Google approval,
|
|
133
|
+
real delivery and live mailbox permissions remain untested.
|
package/docs/gong.md
ADDED
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
# Gong
|
|
2
|
+
|
|
3
|
+
Import `gongProvider` from `@jskit-ai/connectors-catalog/server/gong`.
|
|
4
|
+
This provider verifies a company API key and reads users, calls, transcripts and statistics. It
|
|
5
|
+
implements the access-key form, including the optional company API URL.
|
|
6
|
+
OAuth, MCP and write operations remain outside this provider.
|
|
7
|
+
|
|
8
|
+
## Create credentials manually
|
|
9
|
+
|
|
10
|
+
1. Sign into Gong as a technical administrator. Open **Admin center → Settings**,
|
|
11
|
+
then **API** in the **Ecosystem** area.
|
|
12
|
+
2. Choose **+ Get API key**, name it, and optionally set its lifetime and allowed
|
|
13
|
+
IP addresses. Use the backend's outbound IPs when restricting network access.
|
|
14
|
+
3. Choose **Get API key**. Copy the access-key identifier into the editor and
|
|
15
|
+
store its one-time secret as `GONG_ACCESS_SECRET` in the application
|
|
16
|
+
environment. Enter `env:GONG_ACCESS_SECRET` in the secret-reference field.
|
|
17
|
+
In the editor, **Save configuration**, then **Set credential in Env**;
|
|
18
|
+
paste the secret as `GONG_ACCESS_SECRET` and save there. Finish with **Done**
|
|
19
|
+
in Gong only after preserving the secret. Return and choose **Connect account**.
|
|
20
|
+
The secret cannot be retrieved after closing.
|
|
21
|
+
4. For later changes, use the key row's actions menu and **Edit**, then save.
|
|
22
|
+
Revocation is available there through **Delete**, its acknowledgement and
|
|
23
|
+
**Delete API**. Local connector disconnect does not revoke Gong's key.
|
|
24
|
+
These controls were updated in August 2026, so older accounts may differ.
|
|
25
|
+
[Key management](https://help.gong.io/docs/receive-access-to-the-api).
|
|
26
|
+
|
|
27
|
+
The identifier and secret form an HTTP Basic credential. A secret alone, an
|
|
28
|
+
OAuth client secret or an OAuth bearer token is not this credential type.
|
|
29
|
+
[API authentication](https://help.gong.io/apidocs/introduction-2).
|
|
30
|
+
|
|
31
|
+
## Portable file and UI fields
|
|
32
|
+
|
|
33
|
+
```json
|
|
34
|
+
{
|
|
35
|
+
"schemaVersion": 1,
|
|
36
|
+
"registrations": {},
|
|
37
|
+
"integrations": {
|
|
38
|
+
"sales": {
|
|
39
|
+
"provider": "gong",
|
|
40
|
+
"displayName": "Sales team directory",
|
|
41
|
+
"accountMode": "shared",
|
|
42
|
+
"scopes": [],
|
|
43
|
+
"authentication": {
|
|
44
|
+
"method": "api-key",
|
|
45
|
+
"secretRef": "env:GONG_ACCESS_SECRET"
|
|
46
|
+
},
|
|
47
|
+
"settings": {
|
|
48
|
+
"accessKey": "YOUR_ACCESS_KEY_IDENTIFIER",
|
|
49
|
+
"apiBaseUrl": "https://api.gong.io"
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Replace the identifier with the value from Gong. The shared fields expose
|
|
57
|
+
**Access key**, **Access key secret reference** and **API base URL (optional)**.
|
|
58
|
+
CLI and editor use the same settings schema. The key identifier is required;
|
|
59
|
+
the secret remains outside source. Whitespace around pasted settings is trimmed.
|
|
60
|
+
Embedded whitespace, control characters and colons are rejected in the identifier.
|
|
61
|
+
The local identifier limit is 512 characters, not a claim about Gong's issued
|
|
62
|
+
key length.
|
|
63
|
+
|
|
64
|
+
Omit or clear the base-URL field to save the default `https://api.gong.io`.
|
|
65
|
+
This is the origin in Gong's Basic-authentication example.
|
|
66
|
+
[Directory example](https://help.gong.io/docs/uploading-calls-from-a-non-integrated-telephony-system).
|
|
67
|
+
When the API settings provide a company URL, use that value, for example
|
|
68
|
+
`https://company-17.api.gong.io`. Gong also documents customer-specific API
|
|
69
|
+
origins in its OAuth integration guide. The adapter accepts the default host or
|
|
70
|
+
one DNS label before `.api.gong.io`, using HTTPS, optionally ending with `/`.
|
|
71
|
+
Paths, queries, fragments, ports, embedded credentials and unrelated domains
|
|
72
|
+
are rejected. This is an explicit fragment boundary; it does not support
|
|
73
|
+
arbitrary proxies. Changing the key identifier or host requires verification
|
|
74
|
+
again. Requests never fall back to another customer or the default origin.
|
|
75
|
+
|
|
76
|
+
## Library and AI wiring
|
|
77
|
+
|
|
78
|
+
Use the [API-key composition pattern](../patterns/api-key-connection/PATTERN.md)
|
|
79
|
+
with `providers: [gongProvider]`, the file connection store, an environment
|
|
80
|
+
reference resolver and the application's authorization policy. Both
|
|
81
|
+
configuration and runtime state can remain text files; the CLI needs no editor
|
|
82
|
+
or database process.
|
|
83
|
+
|
|
84
|
+
```js
|
|
85
|
+
await connections.connectApiKey({ context, integrationId: "sales" });
|
|
86
|
+
const directory = await connections.invoke({
|
|
87
|
+
context, integrationId: "sales", operation: "users.list",
|
|
88
|
+
input: { includeAvatars: false }
|
|
89
|
+
});
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
`users.list` performs `GET /v2/users`. Its optional `includeAvatars` flag defaults
|
|
93
|
+
to false, excluding Gong's synthetic employee/support users. It accepts an
|
|
94
|
+
opaque `cursor` of 1–8192 characters. Pass `records.cursor` from the previous
|
|
95
|
+
response to request another page. The runtime preserves users, record counts
|
|
96
|
+
and cursor metadata, returns one page at a time, and does not auto-page or
|
|
97
|
+
accept a destination URL in operation input. An empty user list is valid.
|
|
98
|
+
The endpoint documents `api:users:read` for OAuth; this fragment uses a company
|
|
99
|
+
API key and does not present OAuth scope controls.
|
|
100
|
+
[User API](https://help.gong.io/apidocs/list-all-users-v2users).
|
|
101
|
+
|
|
102
|
+
Default published API limits are company-wide: three requests per second and
|
|
103
|
+
10,000 per day. A 429 response indicates throttling. The fragment surfaces a
|
|
104
|
+
rate-limit error and does not implement automatic retries or budget allocation.
|
|
105
|
+
[API limits](https://help.gong.io/apidocs/introduction-2).
|
|
106
|
+
The application's user-directory policy must decide who may invoke this shared
|
|
107
|
+
connection; a company API key is not an individual employee's login identity.
|
|
108
|
+
|
|
109
|
+
## Provisioning feasibility and application registrations
|
|
110
|
+
|
|
111
|
+
An AI can prepare this JSON, its reference bindings, request code and validation
|
|
112
|
+
without accessing Gong. Initial API-key creation remains a technical-admin UI
|
|
113
|
+
step: the reviewed public documentation does not establish an API for creating
|
|
114
|
+
keys or customer companies. Do not invent such an endpoint. Browser-assisted
|
|
115
|
+
setup requires the operator's existing account and any required approvals.
|
|
116
|
+
|
|
117
|
+
For a future shared OAuth service, Gong's documented registration path is:
|
|
118
|
+
|
|
119
|
+
1. Request a developer instance through the form linked in its app guide.
|
|
120
|
+
2. Open **Admin center → Settings → Ecosystem → API → INTEGRATIONS** and choose
|
|
121
|
+
**Create Integration**.
|
|
122
|
+
3. Supply the name, long/short descriptions, two logo sizes and required scopes.
|
|
123
|
+
Supply the callback, privacy, terms, help and authorization-start URLs, plus
|
|
124
|
+
contact emails and organization domains. For directory access choose
|
|
125
|
+
`api:users:read`; leave frontend embedding disabled unless needed.
|
|
126
|
+
4. Save and retain the issued client ID and secret for this application. Keep
|
|
127
|
+
the secret in the application backend's private Env.
|
|
128
|
+
|
|
129
|
+
Gong's OAuth consent is company-wide and does not support user-level grants.
|
|
130
|
+
The token response identifies a customer API origin that a future OAuth adapter
|
|
131
|
+
must retain with that customer's connection. These registration steps do not
|
|
132
|
+
make the current API-key adapter OAuth-capable.
|
|
133
|
+
[App registration](https://help.gong.io/docs/create-an-app-for-gong).
|
|
134
|
+
|
|
135
|
+
Two keys or client registrations do not override company-wide request limits.
|
|
136
|
+
The application owns its credential selection and usage policy. Independent
|
|
137
|
+
provider capacity requires an
|
|
138
|
+
appropriate Gong account arrangement, rather than just a different app name.
|
|
139
|
+
Do not supply one operator's company key as a universal connection to other
|
|
140
|
+
customers' Gong data. Each company owns its grant and API destination.
|
|
141
|
+
|
|
142
|
+
This implemented key flow has no callback registration. A separate OAuth
|
|
143
|
+
implementation must use the application's actual registered callback and own
|
|
144
|
+
its grants. It is not implemented by this key adapter.
|
|
145
|
+
|
|
146
|
+
## Focused evidence
|
|
147
|
+
|
|
148
|
+
Seven tests use simulated Gong responses and real temporary encrypted JSON state.
|
|
149
|
+
They cover default/customer origins, Basic credentials, file restart, rotation,
|
|
150
|
+
ownership, disconnect, host/key changes, unsafe URL rejection, cursor encoding,
|
|
151
|
+
avatar selection and failures. The public editor check verifies required keys,
|
|
152
|
+
secret references, company URL validation, reload and default restoration.
|
|
153
|
+
No live Gong access, account creation or example application execution is used.
|
|
154
|
+
|
|
155
|
+
## Call analysis and linked deal context
|
|
156
|
+
|
|
157
|
+
`calls.extensive` returns metadata, participants, available call summaries/topics,
|
|
158
|
+
interaction statistics and CRM context at call time and now. Supply `callIds`
|
|
159
|
+
(1–100 strings), or an ordered `fromDateTime`/`toDateTime` range with timezone;
|
|
160
|
+
optional `workspaceId` narrows the workspace. Preserve every digit of Gong IDs:
|
|
161
|
+
use strings, never JavaScript numbers. Pass `records.cursor` back as `cursor`
|
|
162
|
+
while retaining the same filters. No automatic paging or media fetch occurs.
|
|
163
|
+
|
|
164
|
+
`calls.transcripts` uses the same call/date/workspace selection. Join each
|
|
165
|
+
monologue's speakerId to parties in the extensive call data; retain sentence
|
|
166
|
+
start/end timing. Transcripts or analysis may be absent, processing, deleted or
|
|
167
|
+
restricted. An empty result does not prove the account has no calls.
|
|
168
|
+
|
|
169
|
+
`stats.interaction` takes `fromDate`, `toDate` in YYYY-MM-DD and optional `userIds`.
|
|
170
|
+
Dates use Gong's company timezone; the end is exclusive and cannot exceed the
|
|
171
|
+
provider's current day. Results apply to calls with Whisper enabled. Missing
|
|
172
|
+
metrics are unavailable, not zero. Cursor paging follows the same pattern.
|
|
173
|
+
|
|
174
|
+
```js
|
|
175
|
+
const result = await connections.invoke({ context, integrationId: "sales",
|
|
176
|
+
operation: "calls.extensive", input: { callIds: ["7782342274025937895"] } });
|
|
177
|
+
const transcript = await connections.invoke({ context, integrationId: "sales",
|
|
178
|
+
operation: "calls.transcripts", input: { callIds: [result.calls[0].metaData.id] } });
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
Check for empty results before selecting a call. Linked CRM objects/fields are
|
|
182
|
+
Gong's existing context; the app can associate a call with its opportunity and
|
|
183
|
+
show available deal changes. This does not establish a CRM connection or provide
|
|
184
|
+
a standalone all-deal timeline. The app owns joins, reporting and call/CRM access
|
|
185
|
+
rules. Company keys must never grant arbitrary visitors company-wide recordings.
|
|
186
|
+
|
|
187
|
+
`includeMedia: true` explicitly asks Gong for media URLs; default is false.
|
|
188
|
+
These URLs expire after eight hours and require corresponding provider access.
|
|
189
|
+
Treat them as private capabilities. Never attach the Gong Basic credential when
|
|
190
|
+
using a returned media URL. The adapter does not download or archive recordings.
|
|
191
|
+
|
|
192
|
+
The technical administrator supplies company API access; account verification
|
|
193
|
+
only checks users and does not prove call, transcript, media or statistics access.
|
|
194
|
+
CLI consumers use the same config and private Env. Other frameworks use native
|
|
195
|
+
HTTP Basic against the selected company host and the official
|
|
196
|
+
[call-data](https://help.gong.io/apidocs/retrieve-detailed-call-data-by-various-filters-v2callsextensive-2),
|
|
197
|
+
[transcript](https://help.gong.io/apidocs/retrieve-transcripts-of-calls-by-date-or-callids-v2callstranscript-2)
|
|
198
|
+
and [interaction-statistics](https://help.gong.io/apidocs/retrieve-interaction-stats-for-applicable-users-by-date-v2statsinteraction)
|
|
199
|
+
APIs. No Vibe64 runtime or AI service is involved.
|
|
200
|
+
|
|
201
|
+
**LIMITATIONS:** no CRM synchronization, standalone deal timeline, recording
|
|
202
|
+
uploads, media archive, OAuth or editor assistant attachment. Example: an app
|
|
203
|
+
can show renewal-call transcripts and the opportunity context already in Gong;
|
|
204
|
+
it cannot connect Salesforce for the customer or create missing CRM history.
|
|
205
|
+
Real company permissions, transcript availability and media downloads are untested.
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
# Google Ads
|
|
2
|
+
|
|
3
|
+
The fragment uses Google user OAuth and REST v25 to list accessible accounts,
|
|
4
|
+
read account hierarchies and run paged reports. Campaign changes, service-account
|
|
5
|
+
grants and application login are outside this fragment.
|
|
6
|
+
|
|
7
|
+
## Set up Google Cloud access
|
|
8
|
+
|
|
9
|
+
Google retired developer tokens on September 9, 2026. API access now belongs to
|
|
10
|
+
the Cloud project owning the OAuth client. Remove `apiAccess` and
|
|
11
|
+
`developerTokenRef` from pre-release configuration; there is no compatibility
|
|
12
|
+
reader. The editor no longer asks for a token or pilot selection.
|
|
13
|
+
[Google migration notice](https://developers.google.com/google-ads/api/docs/api-policy/developer-token).
|
|
14
|
+
|
|
15
|
+
1. Select or create the application's Google Cloud project. Enable **Google Ads
|
|
16
|
+
API** through **APIs & Services → Library**.
|
|
17
|
+
2. Open its **Google Ads API Overview** page. Check the access level. If it is
|
|
18
|
+
Test, expand **Upgrade access level** and apply for Explorer to use production
|
|
19
|
+
accounts. Higher access has its own approval requirements.
|
|
20
|
+
[Current setup](https://developers.google.com/google-ads/api/docs/get-started/make-first-call).
|
|
21
|
+
3. In **Google Auth Platform**, configure **Branding**, **Audience** and **Data
|
|
22
|
+
Access**. Add test users while testing and the
|
|
23
|
+
`https://www.googleapis.com/auth/adwords` scope. Complete applicable consent
|
|
24
|
+
publishing and verification before public use.
|
|
25
|
+
4. In **Clients**, create a **Web application** client. Add this project's exact
|
|
26
|
+
**Suggested callback URL** under **Authorized redirect URIs**. Copy Client ID
|
|
27
|
+
into the connector form. Save configuration, then use the Env links to store
|
|
28
|
+
the client secret and identical callback URL under their referenced names.
|
|
29
|
+
[Web OAuth setup](https://developers.google.com/identity/protocols/oauth2/web-server).
|
|
30
|
+
5. When accessing customers through a manager, enter its ten-digit customer ID
|
|
31
|
+
without hyphens. Direct account access can leave this blank. The consenting
|
|
32
|
+
person must have the intended Ads account access. Target customer IDs remain
|
|
33
|
+
operation inputs, separately authorized by the application.
|
|
34
|
+
6. The application's backend implements the callback and connection lifecycle.
|
|
35
|
+
Use **Connect account** for a shared account; individual app users connect in
|
|
36
|
+
the application's own account screen. Initial verification lists directly
|
|
37
|
+
accessible accounts, not every inherited child account. Disconnect removes
|
|
38
|
+
local state; revoke Google consent separately when intended.
|
|
39
|
+
|
|
40
|
+
## Portable configuration
|
|
41
|
+
|
|
42
|
+
```json
|
|
43
|
+
{
|
|
44
|
+
"schemaVersion": 1,
|
|
45
|
+
"integrations": {
|
|
46
|
+
"ads": {
|
|
47
|
+
"provider": "google-ads",
|
|
48
|
+
"displayName": "Advertising reports",
|
|
49
|
+
"accountMode": "per-user",
|
|
50
|
+
"scopes": ["https://www.googleapis.com/auth/adwords"],
|
|
51
|
+
"settings": { "loginCustomerId": "1234567890" },
|
|
52
|
+
"authentication": { "method": "oauth2", "registrationRef": "ads-client" }
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
"registrations": {
|
|
56
|
+
"ads-client": {
|
|
57
|
+
"source": "own",
|
|
58
|
+
"clientId": "replace-with-web-client.apps.googleusercontent.com",
|
|
59
|
+
"clientSecretRef": "env:GOOGLE_ADS_CLIENT_SECRET",
|
|
60
|
+
"callbackUrlRef": "env:GOOGLE_ADS_CALLBACK_URL"
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Replace the placeholders with project-owned resources. Secrets and grants stay
|
|
67
|
+
with the application. CLI, public Vibe64 and Online use the same configuration;
|
|
68
|
+
Laravel implements it with its own framework. Host/domain changes require the
|
|
69
|
+
provider registration and callback Env value to match the application's new
|
|
70
|
+
callback. Keep persistent grants and application identity when moving hosts.
|
|
71
|
+
|
|
72
|
+
An authorized AI can prepare configuration and enable APIs using Google Cloud's
|
|
73
|
+
normal tooling. OAuth client creation, consent verification and access approval
|
|
74
|
+
require the actual owner's permissions and provider processes. There is no
|
|
75
|
+
universal Vibe64 credential or automatic approval. API quotas follow the Cloud
|
|
76
|
+
project and account limits; a second OAuth client does not imply independent
|
|
77
|
+
capacity. The adwords permission can authorize writes even though this fragment
|
|
78
|
+
only implements reads.
|
|
79
|
+
|
|
80
|
+
## Runtime composition and limits
|
|
81
|
+
|
|
82
|
+
Import `googleAdsProvider` from
|
|
83
|
+
`@jskit-ai/connectors-catalog/server/google-ads`. Register it with the existing
|
|
84
|
+
`createConnectionService`, configuration reader, reference resolver, owner policy
|
|
85
|
+
and encrypted file store. The OAuth source pattern provides composition without
|
|
86
|
+
an editor or database. The app owns its login and each reporting action's policy.
|
|
87
|
+
|
|
88
|
+
| Operation | Input and result |
|
|
89
|
+
|---|---|
|
|
90
|
+
| `customers.listAccessible` | No input; returns Google's `resourceNames`. Missing repeated fields can mean an empty result. This is the connection check. |
|
|
91
|
+
| `customers.listClients` | `customerId`, optional `pageToken`; a fixed `customer_client` query returns hierarchy metadata and levels. It does not recurse automatically. |
|
|
92
|
+
| `reports.search` | `customerId`, `query`, optional `pageToken`; one GAQL Search page, with original result field names and metadata. |
|
|
93
|
+
|
|
94
|
+
The runtime sends only fixed Google token/API destinations. Search uses POST
|
|
95
|
+
JSON but is a read operation. Its page size is Google's fixed 10,000 rows; the
|
|
96
|
+
caller cannot send `pageSize`, arbitrary headers, destinations or a different
|
|
97
|
+
manager ID. Queries are single-line SELECT text, at most 16,000 characters and
|
|
98
|
+
32,000 UTF-8 bytes. Use GAQL `LIMIT` and approved date ranges to bound reports.
|
|
99
|
+
Keep page tokens with the original query, customer and owner; request each page
|
|
100
|
+
explicitly. 64-bit values stay strings, including money in micros. Preserve that
|
|
101
|
+
precision when displaying or aggregating them. No SQL/GAQL parser or query-cost
|
|
102
|
+
estimator is implied. [REST Search and pagination](https://developers.google.com/google-ads/api/rest/common/search).
|
|
103
|
+
|
|
104
|
+
The application must authorize account IDs, fields, filters and query inputs
|
|
105
|
+
before invoking the library. Configuration ownership and the manager header do
|
|
106
|
+
not make an arbitrary report endpoint safe for every app user. The host policy
|
|
107
|
+
receives an input snapshot; its mutation cannot change the request. The API scope
|
|
108
|
+
does not replace your application's authorization.
|
|
109
|
+
|
|
110
|
+
OAuth grants refresh through the shared locked file implementation. Changed
|
|
111
|
+
client identity/settings require reconnecting. Missing OAuth bindings produce `connector_binding_missing`; project approval failures use
|
|
112
|
+
`connector_api_access_invalid` without discarding the user's valid OAuth grant.
|
|
113
|
+
Quota, permission, scope, query and reconnect failures remain distinct. Raw
|
|
114
|
+
provider error bodies and query echoes are not exposed. Requests respect abort
|
|
115
|
+
signals/timeouts and are not replayed automatically. Disconnect removes local
|
|
116
|
+
access; Google account revocation is a separate owner action.
|
|
117
|
+
|
|
118
|
+
## Verification boundary
|
|
119
|
+
|
|
120
|
+
Focused tests use controlled OAuth and Ads HTTP responses with the real shared
|
|
121
|
+
validator and encrypted file store. They cover Cloud-project configuration, OAuth/header
|
|
122
|
+
separation, query/page bounds, int64 preservation, empty/malformed results,
|
|
123
|
+
restart, concurrent refresh/rotation, ownership, policy, denied consent, errors
|
|
124
|
+
and interruption. No live accounts, Cloud-project approvals, reports,
|
|
125
|
+
campaign actions or generated applications are used. Provider approval and live
|
|
126
|
+
consent remain separate acceptance work.
|
|
127
|
+
|
|
128
|
+
## Existing-account Search campaign service
|
|
129
|
+
|
|
130
|
+
`@jskit-ai/connectors-catalog/server/google-ads-search` exports
|
|
131
|
+
`createGoogleAdsSearchService({ connections, configuration, context, integrationId })`.
|
|
132
|
+
Its reusable operations discover accounts/website conversion goals and targeting,
|
|
133
|
+
validate a saved plan with Google, atomically create a paused Search campaign,
|
|
134
|
+
inspect a current campaign, separately launch/pause it and report last-30-days
|
|
135
|
+
metrics. The application owns the authenticated administrator and connection
|
|
136
|
+
service; CLI apps use this without Vibe64.
|
|
137
|
+
|
|
138
|
+
Store plans at `extensions.googleAdsSearch[integrationId]`, outside OAuth settings.
|
|
139
|
+
Use `validateGoogleAdsSearchPlan` from the shared `google-ads-search` export. Read
|
|
140
|
+
`patterns/google-ads-search/PATTERN.md` for command composition and boundaries.
|
|
141
|
+
The public editor has preparation/review controls; another framework uses the same
|
|
142
|
+
JSON/Env contract with native Google APIs, not a JSKIT sidecar.
|
|
143
|
+
|
|
144
|
+
In Google Ads, select an existing active client account, then Goals → Conversions
|
|
145
|
+
→ Summary to select or create a website lead goal. Tag setup gives the global tag
|
|
146
|
+
and successful-lead event; integrate with existing consent/tag management, avoid
|
|
147
|
+
duplicate tags and verify using Tag Assistant. This service can create a website
|
|
148
|
+
lead goal and return snippets; it does not install them automatically. Confirm
|
|
149
|
+
billing/advertiser readiness separately before launching. Creation stays paused;
|
|
150
|
+
a lost write response must be investigated in Google Ads before retrying.
|
|
151
|
+
|
|
152
|
+
LIMITATIONS: no advertiser account provisioning, Performance Max, Demand Gen or
|
|
153
|
+
live coding-assistant tool attachment. For example, asking chat to create a new
|
|
154
|
+
Ads account and autonomously optimize a PMax campaign remains unsupported. The
|
|
155
|
+
current editor command uses development Env and may affect a real Ads account.
|
|
156
|
+
Fixtures prove composition and request/approval behavior, not Google live approval.
|