@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/algolia.md
ADDED
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
# Algolia
|
|
2
|
+
|
|
3
|
+
Import `algoliaProvider` from `@jskit-ai/connectors-catalog/server/algolia`.
|
|
4
|
+
This adapter verifies a backend key, searches indices, maintains records and checks indexing tasks.
|
|
5
|
+
The portable configuration also carries the optional frontend key reference;
|
|
6
|
+
the backend runtime neither resolves nor publishes that optional key.
|
|
7
|
+
|
|
8
|
+
## Create the application and keys
|
|
9
|
+
|
|
10
|
+
1. Sign into the Algolia dashboard. Open **Settings → Applications → Create
|
|
11
|
+
Application**. Choose the application name, plan and cluster region; supply
|
|
12
|
+
billing details when the selected plan requires them. Select the new
|
|
13
|
+
application before creating its keys.
|
|
14
|
+
[Application creation](https://support.algolia.com/hc/en-us/articles/4406975239441-How-do-I-create-an-application).
|
|
15
|
+
2. Open **API Keys** and copy the **Application ID**. Under **All API Keys**,
|
|
16
|
+
choose **New API Key**. Name it for this application's backend, enable
|
|
17
|
+
`listIndexes` and `search`. Add `addObject` for indexing and task status,
|
|
18
|
+
and `deleteObject` for deletion when needed. Restrict it to the intended indices. Create
|
|
19
|
+
the key and store it in the backend environment as `ALGOLIA_API_KEY`.
|
|
20
|
+
The runtime does not require the Admin key.
|
|
21
|
+
[Key creation](https://support.algolia.com/hc/en-us/articles/9438531643665-How-do-I-generate-keys).
|
|
22
|
+
3. If the frontend will query Algolia directly, create a separate key with only
|
|
23
|
+
`search`, restricted to indices containing data that those clients may read.
|
|
24
|
+
Store that value as `ALGOLIA_SEARCH_KEY`. The predefined Search-only key can
|
|
25
|
+
search all application indices, so do not assume it isolates private data.
|
|
26
|
+
[Key types](https://www.algolia.com/doc/guides/security/api-keys).
|
|
27
|
+
4. Set appropriate validity, index and request restrictions when creating keys.
|
|
28
|
+
Referrer restrictions alone are not authorization. Replace or delete keys in
|
|
29
|
+
**API Keys → All API Keys** when access should end at Algolia. Local connector
|
|
30
|
+
disconnect only removes the local connection.
|
|
31
|
+
[Key restrictions](https://www.algolia.com/doc/guides/security/api-keys/in-depth/api-key-restrictions).
|
|
32
|
+
|
|
33
|
+
## File and field ownership
|
|
34
|
+
|
|
35
|
+
The editor and a manually composed CLI edit the same `integrations.json`:
|
|
36
|
+
|
|
37
|
+
```json
|
|
38
|
+
{
|
|
39
|
+
"schemaVersion": 1,
|
|
40
|
+
"registrations": {},
|
|
41
|
+
"integrations": {
|
|
42
|
+
"search": {
|
|
43
|
+
"provider": "algolia",
|
|
44
|
+
"displayName": "Product search",
|
|
45
|
+
"accountMode": "shared",
|
|
46
|
+
"scopes": [],
|
|
47
|
+
"authentication": {
|
|
48
|
+
"method": "api-key",
|
|
49
|
+
"secretRef": "env:ALGOLIA_API_KEY"
|
|
50
|
+
},
|
|
51
|
+
"settings": {
|
|
52
|
+
"applicationId": "YOURAPPLICATIONID",
|
|
53
|
+
"publicApiKeyRef": "env:ALGOLIA_SEARCH_KEY"
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
The application ID is public configuration. The two key values stay outside
|
|
61
|
+
source. Omit `publicApiKeyRef` when all searches go through the backend. The
|
|
62
|
+
reference validator accepts the same `env:NAME` format as other connectors.
|
|
63
|
+
The shared UI provides an Application ID text field, optional public-key
|
|
64
|
+
reference and the primary API-key reference. Vibe64 provides a separate Env
|
|
65
|
+
shortcut for each configured key, including a notice that the frontend key may
|
|
66
|
+
be published. Clearing its reference removes the shortcut, not the Env value.
|
|
67
|
+
Sharing grants remain a separate host responsibility.
|
|
68
|
+
|
|
69
|
+
The app ID must be 1–63 alphanumeric characters in this fragment so it forms
|
|
70
|
+
one DNS label. This is a runtime validation boundary, not a claim that Algolia
|
|
71
|
+
issues IDs of every such length. Settings changes require verification again.
|
|
72
|
+
The destination is fixed to `https://<application-id>.algolia.net`; arbitrary
|
|
73
|
+
hosts and another application's host cannot receive this connection's key.
|
|
74
|
+
|
|
75
|
+
## Runtime and AI composition
|
|
76
|
+
|
|
77
|
+
Use the [API-key source pattern](../patterns/api-key-connection/PATTERN.md) with
|
|
78
|
+
`providers: [algoliaProvider]`, the file connection store, the application's
|
|
79
|
+
reference resolver and its authorization policy. Both configuration and runtime
|
|
80
|
+
state are text files. No database, editor process or managed service is required.
|
|
81
|
+
|
|
82
|
+
```js
|
|
83
|
+
await connections.connectApiKey({ context, integrationId: "search" });
|
|
84
|
+
const indices = await connections.invoke({
|
|
85
|
+
context, integrationId: "search", operation: "indices.list",
|
|
86
|
+
input: { page: 0, hitsPerPage: 100 }
|
|
87
|
+
});
|
|
88
|
+
const results = await connections.invoke({
|
|
89
|
+
context, integrationId: "search", operation: "index.search",
|
|
90
|
+
input: { indexName: "products", query: "phone", page: 0, hitsPerPage: 20 }
|
|
91
|
+
});
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
`indices.list` performs `GET /1/indexes`; verification invokes its default page
|
|
95
|
+
zero, with 100 entries requested. `listIndexes` permission is required, and the
|
|
96
|
+
response's `items` and optional `nbPages` remain intact. Empty indices still
|
|
97
|
+
allow verification. This does not prove that `search` is granted on a particular
|
|
98
|
+
index. [List indices](https://www.algolia.com/doc/rest-api/search/list-indices).
|
|
99
|
+
|
|
100
|
+
`index.search` performs `POST /1/indexes/{indexName}/query`, with JSON query,
|
|
101
|
+
page and page-size values. It requires `search`, preserves hits and pagination,
|
|
102
|
+
and defaults to an empty query, page zero and 20 hits. Index names are encoded
|
|
103
|
+
as one path component, limited to 255 characters and cannot be `.` or `..`.
|
|
104
|
+
Both operations accept pages from zero to 2147483647 and page sizes 1–1000 as
|
|
105
|
+
local fragment bounds; provider index/key limits may be tighter. Search does not
|
|
106
|
+
bypass Algolia's retrieval limits or automatically browse the full dataset.
|
|
107
|
+
[Single-index search](https://www.algolia.com/doc/rest-api/search/search-single-index).
|
|
108
|
+
Queries must fit 512 UTF-8 bytes; the validator checks bytes as well as string
|
|
109
|
+
length. [Query limits](https://www.algolia.com/doc/api-reference/api-parameters/query).
|
|
110
|
+
|
|
111
|
+
For direct frontend search, the application may deliberately resolve and expose
|
|
112
|
+
only `publicApiKeyRef` plus `applicationId` after configuring a suitable
|
|
113
|
+
search-only key. Never serialize `authentication.secretRef`'s resolved value to
|
|
114
|
+
the browser. This runtime does not inspect the frontend key's ACL or install a
|
|
115
|
+
search widget. Index settings, secured-key generation,
|
|
116
|
+
recommendations and host failover are outside the fragment.
|
|
117
|
+
|
|
118
|
+
## Automation and application ownership
|
|
119
|
+
|
|
120
|
+
AI-assisted provisioning can use Algolia's CLI after a human completes
|
|
121
|
+
`algolia auth login`; that creates a dashboard OAuth session. This is a separate
|
|
122
|
+
operator bootstrap, not the API-key connection above.
|
|
123
|
+
[CLI authentication](https://www.algolia.com/doc/tools/cli/authentication).
|
|
124
|
+
Current CLI documentation exposes `algolia application create`, with name,
|
|
125
|
+
region, plan and dry-run options. For example, review each request first:
|
|
126
|
+
|
|
127
|
+
```sh
|
|
128
|
+
algolia application create --name dogandgroom-search --region EU --plan free --dry-run
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
Actual creation requires the chosen plan's terms and, for paid plans, a payment
|
|
132
|
+
method. An AI can prepare the requests; the operator owns those choices.
|
|
133
|
+
[Create command](https://www.algolia.com/doc/tools/cli/commands/application/create).
|
|
134
|
+
The older application-management guide says no programmatic management API
|
|
135
|
+
exists; the July 2026 CLI documentation explicitly supports creation through the
|
|
136
|
+
Dashboard API. Use the supported CLI rather than guessing private endpoints.
|
|
137
|
+
|
|
138
|
+
With an explicitly supplied Admin key, the Search API can create restricted
|
|
139
|
+
keys through `POST /1/keys`, including `acl`, `indexes`, description, validity
|
|
140
|
+
and rate limits. Keep that bootstrap key out of the running connector and issue
|
|
141
|
+
a lesser backend key for its required operations.
|
|
142
|
+
[Key provisioning](https://www.algolia.com/doc/rest-api/search/add-api-key).
|
|
143
|
+
|
|
144
|
+
The application owner creates its Algolia application and supplies a scoped key
|
|
145
|
+
through private Env. Two keys in one Algolia application do not establish
|
|
146
|
+
independent application capacity. Separate applications have their own plans;
|
|
147
|
+
dedicated server isolation is a separate provider offering.
|
|
148
|
+
[Application isolation](https://www.algolia.com/doc/guides/sending-and-managing-data/manage-indices-and-apps/manage-your-apps).
|
|
149
|
+
This flow needs no OAuth callback, so editor VM and custom application domains
|
|
150
|
+
do not add provider redirect registrations. This is search access, not user login.
|
|
151
|
+
|
|
152
|
+
## Proof
|
|
153
|
+
|
|
154
|
+
Focused tests use simulated provider responses and real temporary encrypted JSON
|
|
155
|
+
state. They cover endpoint/header binding, public-key separation, rotation,
|
|
156
|
+
restart, ownership, configuration changes, encoded index paths, UTF-8 query
|
|
157
|
+
limits, paging, malformed responses and failures. Browser tests cover validated
|
|
158
|
+
text inputs, optional-reference clearing, CLI import and save/reload. Live
|
|
159
|
+
provider use, real account creation and generated sample apps are untested.
|
|
160
|
+
|
|
161
|
+
## Maintain the search index
|
|
162
|
+
|
|
163
|
+
Use `records.replace` with `{ indexName, objectID, attributes }` to create or
|
|
164
|
+
fully replace a record. Pick a stable ID from the application's source record;
|
|
165
|
+
omitted attributes are removed on replacement. Use `records.update` with the
|
|
166
|
+
same inputs to update only specified attributes; this explicitly sets
|
|
167
|
+
`createIfNotExists=false`. Both require `addObject`. Supply a nonempty attributes
|
|
168
|
+
object and keep the record ID in `objectID`, not inside attributes.
|
|
169
|
+
[Replace a record](https://www.algolia.com/doc/rest-api/search/add-or-update-object),
|
|
170
|
+
[partial update](https://www.algolia.com/doc/rest-api/search/partial-update-object).
|
|
171
|
+
|
|
172
|
+
`records.delete` takes `{ indexName, objectID }` and requires `deleteObject`.
|
|
173
|
+
Each mutation returns a task ID, not evidence that search results already reflect
|
|
174
|
+
the change. Call `tasks.get` with `{ indexName, taskID }`; keep the application
|
|
175
|
+
work item pending for `notPublished` and complete it only for `published`.
|
|
176
|
+
Task checks require `addObject`. Use a bounded application-owned polling schedule
|
|
177
|
+
and retain task IDs for later recovery rather than blocking requests indefinitely.
|
|
178
|
+
[Delete a record](https://www.algolia.com/doc/rest-api/search/delete-object),
|
|
179
|
+
[task status](https://www.algolia.com/doc/rest-api/search/get-task).
|
|
180
|
+
|
|
181
|
+
Keep ingestion behind application authorization. Publish only deliberately
|
|
182
|
+
searchable data to frontend-accessible indices, and never publish the backend
|
|
183
|
+
write key. Do not grant write ACLs to the public search key. A timeout does not
|
|
184
|
+
prove a write failed; reconcile the known record/task before retrying, especially
|
|
185
|
+
for partial update operators such as increments. No automatic retries are added.
|
|
186
|
+
|
|
187
|
+
`test/algolia.test.js` now includes replacement, partial update, deletion and
|
|
188
|
+
pending/published task progression through the real connection service. It
|
|
189
|
+
retains existing search, key-separation, restart and failure tests. Six tests
|
|
190
|
+
passed with controlled HTTP, without live indexing or account credentials.
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
# Amazon Redshift
|
|
2
|
+
|
|
3
|
+
Import `amazonRedshiftProvider` from
|
|
4
|
+
`@jskit-ai/connectors-catalog/server/amazon-redshift`. The runtime uses the official
|
|
5
|
+
AWS Redshift Data SDK and explicit AWS credential references. It supports shared
|
|
6
|
+
and assistant connections to a serverless workgroup or provisioned cluster.
|
|
7
|
+
Per-user Identity Center federation is still unfinished; this shared connection
|
|
8
|
+
must not be presented as each application user's independent AWS identity.
|
|
9
|
+
|
|
10
|
+
## Portable configuration
|
|
11
|
+
|
|
12
|
+
```json
|
|
13
|
+
{
|
|
14
|
+
"schemaVersion": 1,
|
|
15
|
+
"registrations": {},
|
|
16
|
+
"integrations": {
|
|
17
|
+
"warehouse": {
|
|
18
|
+
"provider": "amazon-redshift",
|
|
19
|
+
"displayName": "Reporting warehouse",
|
|
20
|
+
"accountMode": "shared",
|
|
21
|
+
"scopes": [],
|
|
22
|
+
"authentication": {
|
|
23
|
+
"method": "api-key",
|
|
24
|
+
"secretRef": "env:AWS_SECRET_ACCESS_KEY"
|
|
25
|
+
},
|
|
26
|
+
"settings": {
|
|
27
|
+
"deploymentType": "serverless",
|
|
28
|
+
"region": "us-east-1",
|
|
29
|
+
"accessKeyIdRef": "env:AWS_ACCESS_KEY_ID",
|
|
30
|
+
"workgroup": "analytics",
|
|
31
|
+
"database": "dev"
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
For a provisioned cluster, set `deploymentType` to `provisioned`, replace
|
|
39
|
+
`workgroup` with `clusterIdentifier`, and optionally add `databaseUser`. For
|
|
40
|
+
temporary AWS credentials add `sessionTokenRef`; the host renews the complete
|
|
41
|
+
credential set. The default type is `serverless` and default region is
|
|
42
|
+
`us-east-1`. Explicitly select the warehouse's real region. The form lists 34
|
|
43
|
+
commercial regions; that list does not guarantee that every account/deployment
|
|
44
|
+
supports every region. Noncommercial partitions and arbitrary endpoints are not
|
|
45
|
+
accepted. This fragment takes a workgroup **name**, not an ARN.
|
|
46
|
+
|
|
47
|
+
The shared schema selects the correct fields. Serverless requires `workgroup`;
|
|
48
|
+
provisioned requires `clusterIdentifier` and accepts optional `databaseUser`.
|
|
49
|
+
Both require `database` and AWS key references. CLI mixed-mode fields fail
|
|
50
|
+
validation. Switching type in the shared form removes the other type's fields;
|
|
51
|
+
it preserves credentials, region, database, other slots and extension data.
|
|
52
|
+
Database identifiers retain their exact spelling and whitespace.
|
|
53
|
+
|
|
54
|
+
## Administrator setup
|
|
55
|
+
|
|
56
|
+
Use an existing warehouse when one is available. For a new serverless warehouse:
|
|
57
|
+
|
|
58
|
+
1. In the AWS console, select the intended account and region and open Amazon
|
|
59
|
+
Redshift. Choose **Serverless dashboard > Create workgroup**.
|
|
60
|
+
2. Enter the workgroup name and select the IP mode, VPC, subnets and security
|
|
61
|
+
groups for that workload. Choose capacity suitable for the account's budget.
|
|
62
|
+
3. Create a namespace or select an existing namespace. For a new namespace,
|
|
63
|
+
supply its database name and configure administrator credentials, encryption
|
|
64
|
+
and logging. A warehouse's associated IAM role for data access is separate
|
|
65
|
+
from the identity that calls this connector.
|
|
66
|
+
4. Review the selections and save. Once available, copy the workgroup name and
|
|
67
|
+
database name into the configuration.
|
|
68
|
+
|
|
69
|
+
These console steps follow [Create a workgroup with a namespace](https://docs.aws.amazon.com/redshift/latest/mgmt/serverless-console-workgroups-create-workgroup-wizard.html).
|
|
70
|
+
|
|
71
|
+
For a provisioned warehouse:
|
|
72
|
+
|
|
73
|
+
1. In Amazon Redshift, choose **Clusters** and select the intended cluster.
|
|
74
|
+
To create one, choose **Create cluster** and supply its identifier, node
|
|
75
|
+
configuration and administrator credential method.
|
|
76
|
+
2. Review database, VPC/subnet, security group, encryption and maintenance
|
|
77
|
+
settings before creating it. Copy its identifier and database name.
|
|
78
|
+
3. Choose whether calls should use an IAM-derived database user or a specific
|
|
79
|
+
existing database user. Only the latter needs `databaseUser` in this file.
|
|
80
|
+
|
|
81
|
+
See [Create a cluster](https://docs.aws.amazon.com/redshift/latest/mgmt/create-cluster.html).
|
|
82
|
+
|
|
83
|
+
For either deployment type:
|
|
84
|
+
|
|
85
|
+
1. Follow [AWS credential setup](aws-credentials.md). Grant the caller only the
|
|
86
|
+
needed `redshift-data` actions: `ListDatabases`, `ListSchemas`, `ListTables`, `DescribeTable`,
|
|
87
|
+
`ExecuteStatement`, `DescribeStatement`, `GetStatementResult` and
|
|
88
|
+
`CancelStatement` for the operations the application exposes.
|
|
89
|
+
2. Grant the matching database credential action: serverless needs
|
|
90
|
+
`redshift-serverless:GetCredentials`; provisioned IAM-derived users need
|
|
91
|
+
`redshift:GetClusterCredentialsWithIAM`; provisioned explicit database users
|
|
92
|
+
need `redshift:GetClusterCredentials`. Restrict resource access in IAM.
|
|
93
|
+
3. Have the database administrator grant access to the intended schemas/tables
|
|
94
|
+
to the resulting database identity. Use database permissions to enforce
|
|
95
|
+
read-only access where required; accepting SQL does not make it SELECT-only.
|
|
96
|
+
4. Store the access key ID, secret key and any session token in the application's
|
|
97
|
+
secret environment. Enter references through Vibe64 or edit the JSON file.
|
|
98
|
+
5. Save, then explicitly call `connectApiKey`. It lists one metadata page in the
|
|
99
|
+
configured database. An empty table list can still be a successful connection;
|
|
100
|
+
it does not prove permission to read every table or execute every statement.
|
|
101
|
+
|
|
102
|
+
The credential combinations are specified by [ExecuteStatement](https://docs.aws.amazon.com/redshift-data/latest/APIReference/API_ExecuteStatement.html).
|
|
103
|
+
The adapter does not use a host profile, instance metadata, database passwords
|
|
104
|
+
or a Secrets Manager ARN as an implicit fallback.
|
|
105
|
+
|
|
106
|
+
## Runtime contract
|
|
107
|
+
|
|
108
|
+
| Operation | Input | Output |
|
|
109
|
+
|---|---|---|
|
|
110
|
+
| `databases.list` | Optional `maxResults` 1–1000 (default 100), opaque `nextToken` | `Databases` name page and optional `NextToken` |
|
|
111
|
+
| `schemas.list` | Optional `schemaPattern`, `maxResults` 1–1000, `nextToken` | `Schemas` name page and optional `NextToken` |
|
|
112
|
+
| `tables.list` | Optional `schemaPattern`, `tablePattern`, `maxResults` 1–1000 (default 100), opaque `nextToken` | `Tables` metadata page and optional `NextToken` |
|
|
113
|
+
| `table.describe` | `table`; optional `schema`, `maxResults` 1–1000, `nextToken` | `ColumnList`, `TableName` and optional cursor |
|
|
114
|
+
| `query.start` | Exact `sql`, required `clientToken` 1–64 characters; optional `parameters: [{name, value}]` | `Id` and submission metadata |
|
|
115
|
+
| `query.status` | `statementId` | AWS statement status and execution metadata |
|
|
116
|
+
| `query.results` | `statementId`; optional `nextToken` | One JSON result page with typed cells and column metadata |
|
|
117
|
+
| `query.cancel` | `statementId` | AWS boolean `Status` acknowledgement |
|
|
118
|
+
|
|
119
|
+
Database discovery uses the configured database to authenticate and can return
|
|
120
|
+
other visible database names. It does not grant access to them or change this
|
|
121
|
+
connection's target. Schema and table discovery remain in the configured database;
|
|
122
|
+
use another explicitly configured connection to work in another database.
|
|
123
|
+
The application authorizes metadata visibility as well as SQL. Names and opaque
|
|
124
|
+
cursors remain unchanged; an absent or empty cursor ends pagination.
|
|
125
|
+
See [ListDatabases](https://docs.aws.amazon.com/redshift-data/latest/APIReference/API_ListDatabases.html)
|
|
126
|
+
and [ListSchemas](https://docs.aws.amazon.com/redshift-data/latest/APIReference/API_ListSchemas.html).
|
|
127
|
+
Native framework consumers use those same SDK operations and project credentials.
|
|
128
|
+
|
|
129
|
+
Table filters retain SQL metadata wildcards `%` and `_`; names and cursors are
|
|
130
|
+
passed unchanged. See [ListTables](https://docs.aws.amazon.com/redshift-data/latest/APIReference/API_ListTables.html)
|
|
131
|
+
and [DescribeTable](https://docs.aws.amazon.com/redshift-data/latest/APIReference/API_DescribeTable.html).
|
|
132
|
+
|
|
133
|
+
SQL is preserved and locally capped at 200000 UTF-8 bytes. Parameter names are
|
|
134
|
+
unique alphanumeric/underscore strings; values are nonempty strings, including
|
|
135
|
+
exact decimal/large-integer text. The fragment permits 1–100 parameters, values
|
|
136
|
+
up to 65536 characters. Omit the array for statements without parameters.
|
|
137
|
+
These are local bounds; AWS validates SQL and converts parameter values.
|
|
138
|
+
Use parameters for values rather than concatenating user input into SQL.
|
|
139
|
+
See [SqlParameter](https://docs.aws.amazon.com/redshift-data/latest/APIReference/API_SqlParameter.html).
|
|
140
|
+
|
|
141
|
+
The host authorizes the exact SQL, target and logical request before starting.
|
|
142
|
+
Persist `clientToken` and the returned `Id` with application ownership in
|
|
143
|
+
application-owned state; files work. AWS deduplication tokens have a limited
|
|
144
|
+
retention window, so an ambiguous submission is not permission to issue a new
|
|
145
|
+
token. AWS currently documents an eight-hour token window and 24-hour result
|
|
146
|
+
retention in [Data API considerations](https://docs.aws.amazon.com/redshift/latest/mgmt/data-api.html).
|
|
147
|
+
The runtime performs no automatic retries, polling, session reuse or batch SQL.
|
|
148
|
+
|
|
149
|
+
Status/results/cancel first describe the statement and check its ID, database,
|
|
150
|
+
workgroup or cluster, and explicit database user when configured. Matching a
|
|
151
|
+
warehouse is not application-user ownership. The host must enforce ownership
|
|
152
|
+
within a shared warehouse. Status metadata can contain SQL and database errors;
|
|
153
|
+
return it only to an authorized caller. See [DescribeStatement](https://docs.aws.amazon.com/redshift-data/latest/APIReference/API_DescribeStatement.html).
|
|
154
|
+
|
|
155
|
+
Results require `FINISHED` and `HasResultSet`. Preserve AWS column metadata and
|
|
156
|
+
typed cells, including null, empty string, boolean, number and binary values.
|
|
157
|
+
Binary fields are SDK `Uint8Array` values; encode them explicitly if your own
|
|
158
|
+
transport sends JSON. Integers outside JavaScript's safe range are rejected;
|
|
159
|
+
cast exact large integers to VARCHAR in SQL when they must be returned as text.
|
|
160
|
+
No row-size parameter is invented for this endpoint: request another page only
|
|
161
|
+
with AWS's cursor and use an authorized SQL limit when appropriate. See
|
|
162
|
+
[GetStatementResult](https://docs.aws.amazon.com/redshift-data/latest/APIReference/API_GetStatementResult.html).
|
|
163
|
+
|
|
164
|
+
Local abort, timeout or disconnect does not stop a remote query. Explicit
|
|
165
|
+
`query.cancel` requests cancellation; inspect status separately if the final
|
|
166
|
+
outcome is needed. A boolean acknowledgement is not proof of rollback. See
|
|
167
|
+
[CancelStatement](https://docs.aws.amazon.com/redshift-data/latest/APIReference/API_CancelStatement.html).
|
|
168
|
+
HTTP failures are redacted; credential renewal, IAM denial, throttling,
|
|
169
|
+
configuration errors and missing resources are distinct outcomes.
|
|
170
|
+
|
|
171
|
+
## Automation and application ownership
|
|
172
|
+
|
|
173
|
+
An already authorized AI can create/configure resources using AWS APIs. The
|
|
174
|
+
Serverless APIs expose `CreateNamespace`, `CreateWorkgroup` and their update/read
|
|
175
|
+
operations; see [Workgroups and namespaces](https://docs.aws.amazon.com/redshift/latest/mgmt/serverless-workgroup-namespace.html).
|
|
176
|
+
Provisioned creation uses [CreateCluster](https://docs.aws.amazon.com/redshift/latest/APIReference/API_CreateCluster.html).
|
|
177
|
+
IAM policies, resource creation, database grants, billing choices and credential
|
|
178
|
+
renewal require the corresponding administrator authority. This connector runs
|
|
179
|
+
Data API operations; it does not provision accounts or warehouses.
|
|
180
|
+
|
|
181
|
+
There is **no OAuth callback URL** for the implemented credential mode. Online,
|
|
182
|
+
desktop and independent CLI can all use the same JSON and runtime. A customer's
|
|
183
|
+
VPS or custom domain does not change the AWS API endpoint or credential binding.
|
|
184
|
+
The application owner supplies AWS credentials through private Env or its
|
|
185
|
+
credential store. Resource names and editable `env:` references do not grant
|
|
186
|
+
AWS permissions. Separate IAM keys alone do not promise isolated service quotas. See [AWS ownership](aws-credentials.md#online-public-editor-and-independent-cli).
|
|
187
|
+
|
|
188
|
+
## Per-user federation still to deliver
|
|
189
|
+
|
|
190
|
+
The per-user design requires an organizational identity provider and IAM
|
|
191
|
+
Identity Center trusted identity propagation. It is not implemented by this
|
|
192
|
+
adapter's API-key mode. AWS describes the database integration and identity-bound
|
|
193
|
+
statement access in [Data API trusted identity propagation](https://docs.aws.amazon.com/redshift/latest/mgmt/data-api-trusted-identity-propagation.html).
|
|
194
|
+
|
|
195
|
+
The remaining configuration must capture the **identity provider issuer URL,
|
|
196
|
+
OAuth client ID and secret reference, AWS region, Identity Center application
|
|
197
|
+
ARN, bootstrap role ARN, and access role ARN**. The provider registration needs
|
|
198
|
+
the application's explicitly configured callback, whether hosted by Vibe64 or
|
|
199
|
+
operated independently. Start from the project's actual public address and
|
|
200
|
+
register the exact callback implemented by the application. No production
|
|
201
|
+
Redshift federation callback implementation is shipped yet.
|
|
202
|
+
|
|
203
|
+
Remaining runtime work includes OIDC discovery and token verification, the
|
|
204
|
+
bootstrap web-identity role exchange, IAM Identity Center token exchange,
|
|
205
|
+
identity-enhanced access-role credentials, renewal and individual connection
|
|
206
|
+
ownership. Each step must preserve issuer, audience, application and user
|
|
207
|
+
boundaries. Detailed federation setup screens and controlled exchange tests
|
|
208
|
+
remain planned. Do not substitute the builder's AWS credentials for this mode.
|
|
209
|
+
|
|
210
|
+
## Focused verification
|
|
211
|
+
|
|
212
|
+
`test/amazon-redshift.test.js` uses the real AWS SDK against controlled HTTP
|
|
213
|
+
responses and protected temporary files. It covers both target types, explicit
|
|
214
|
+
DB users, conditional CLI validation, metadata pages, SQL parameters, query
|
|
215
|
+
states, results, target isolation, credentials, errors and cancellation.
|
|
216
|
+
Shared-form browser checks pass at 390, 820 and 1440 pixels, including CLI
|
|
217
|
+
imports, invalid fields, deployment changes and configuration export. Public
|
|
218
|
+
editor phone/desktop checks pass for region selection, credential references,
|
|
219
|
+
both target types, invalid-save rejection, inactive-field removal and reload.
|
|
220
|
+
No live AWS registration, warehouse, SQL, generated app or federation flow has
|
|
221
|
+
been exercised.
|
|
222
|
+
|
|
223
|
+
## Existing-scope closeout — 13 September 2026
|
|
224
|
+
|
|
225
|
+
Shared project-owned AWS credentials support serverless/provisioned targets, databases/schemas/tables discovery, table description, parameterized SQL submission, status, typed result pages and cancellation.
|
|
226
|
+
|
|
227
|
+
No per-user Identity Center/OIDC federation or trusted identity propagation; no role-exchange/automatic credential renewal, default host credential chain, database password or Secrets Manager ARN mode, noncommercial partitions, custom endpoints, warehouse/IAM provisioning, batch SQL, automatic polling/retries or application job-ownership registry. SQL is not SELECT-only: database grants and application authorization enforce allowed work. The host stores request/statement ownership, handles uncertain submission and explicitly cancels remote jobs; local timeout/disconnect cannot do that. Unsafe JavaScript integer results are rejected; cast exact values to text. To extend: implement the already documented federation inputs/exchanges and tests, optional authentication modes and desired orchestration separately. No live provider account, provider registration, paid request or generated-application execution was tested. No new editor coding-assistant tool attachment is claimed. Other frameworks use the same project configuration and their own native tools; JSKIT is optional.
|
|
228
|
+
|
|
229
|
+
16 source and 16 installed-package tests passed on September 13 using the actual AWS SDK with controlled HTTP and private files. September 12 compact/expanded form/lifecycle evidence is retained; no new UI run.
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
# Amplitude assistant MCP
|
|
2
|
+
|
|
3
|
+
Import `amplitudeProvider` and the explicit setup helper
|
|
4
|
+
`registerAmplitudeClient` from `@jskit-ai/connectors-catalog/server/amplitude`.
|
|
5
|
+
This is an assistant-owner OAuth connection. It exposes MCP tool discovery and
|
|
6
|
+
authorized calls for analytics/content work, not event ingestion or app login.
|
|
7
|
+
Amplitude's [client guide](https://amplitude.com/docs/amplitude-ai/amplitude-mcp/other-clients)
|
|
8
|
+
requires remote HTTP MCP with OAuth; an API key cannot replace this flow.
|
|
9
|
+
|
|
10
|
+
## Manual setup and account controls
|
|
11
|
+
|
|
12
|
+
1. Sign into the intended Amplitude account and identify its US or EU residency.
|
|
13
|
+
Use that same region in the editor and client registration.
|
|
14
|
+
2. If MCP access is blocked, an organization administrator opens **Settings →
|
|
15
|
+
Content Access → MCP** and reviews the organization-level setting.
|
|
16
|
+
3. For project-specific access, the administrator opens **Org Settings → Role
|
|
17
|
+
Management**, creates/edits the role, and selects **AI Features → Use MCP
|
|
18
|
+
(read)** and, when needed, **Use MCP (write)**. Assign the role to the intended
|
|
19
|
+
user/group/service account and projects.
|
|
20
|
+
4. In Vibe64, leave the new Client ID empty, set the Suggested callback URL and
|
|
21
|
+
choose **Register client and connect**. The workspace owner can register once
|
|
22
|
+
at the selected regional authority; Vibe64 saves the client ID in configuration
|
|
23
|
+
and its secret, callback and recovery client ID in development Env before
|
|
24
|
+
starting the application’s connection command. Existing Env values are not
|
|
25
|
+
overwritten. If local saving fails, recover the client from Env/provider state
|
|
26
|
+
before trying again. CLI users can use the setup operation below. The reviewed
|
|
27
|
+
documentation establishes dynamic registration, not a manual developer-app
|
|
28
|
+
creation screen; do not search for an invented console form.
|
|
29
|
+
5. Enter the returned **Client ID** in Vibe64. Store its secret and the exact
|
|
30
|
+
callback URL through Env, then fill **Client secret reference** and
|
|
31
|
+
**Callback URL reference**. Keep secrets outside `integrations.json`.
|
|
32
|
+
6. Save. Through the runtime's authorization flow, open the returned URL, sign
|
|
33
|
+
into Amplitude, review requested permissions and complete consent. The
|
|
34
|
+
callback must recover the same authenticated assistant owner.
|
|
35
|
+
|
|
36
|
+
[Amplitude organization and role controls](https://amplitude.com/docs/amplitude-ai/amplitude-mcp#admin-controls).
|
|
37
|
+
Tool discovery remains visible even where project-level calls are forbidden;
|
|
38
|
+
discovery is not proof of access to every project or write operation.
|
|
39
|
+
|
|
40
|
+
## Registration automation
|
|
41
|
+
|
|
42
|
+
The US server's public
|
|
43
|
+
[authorization metadata](https://mcp.amplitude.com/.well-known/oauth-authorization-server)
|
|
44
|
+
advertises `/register`, code grants, refresh tokens, S256 PKCE, and
|
|
45
|
+
`client_secret_post`/`none` authentication. Its
|
|
46
|
+
[resource metadata](https://mcp.amplitude.com/.well-known/oauth-protected-resource)
|
|
47
|
+
identifies `https://mcp.amplitude.com` as the OAuth resource. Equivalent EU
|
|
48
|
+
metadata is served at `https://mcp.eu.amplitude.com`. These public metadata
|
|
49
|
+
documents were read on 9 September 2026; no client or user account was created.
|
|
50
|
+
|
|
51
|
+
After the operator authorizes registration, a setup script can call:
|
|
52
|
+
|
|
53
|
+
```js
|
|
54
|
+
import { registerAmplitudeClient } from "@jskit-ai/connectors-catalog/server/amplitude";
|
|
55
|
+
|
|
56
|
+
const client = await registerAmplitudeClient({
|
|
57
|
+
region: "us",
|
|
58
|
+
clientName: "My assistant",
|
|
59
|
+
callbackUrl: "https://assistant.example/connections/amplitude/callback",
|
|
60
|
+
scopes: ["mcp:read", "offline_access"]
|
|
61
|
+
});
|
|
62
|
+
// Securely store client.clientSecret in the host's existing secret owner.
|
|
63
|
+
// Put client.clientId in the portable registration; never log this object.
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
The helper uses the official MCP SDK to POST confidential-client metadata to
|
|
67
|
+
the fixed regional registration endpoint. It requests one exact redirect URI,
|
|
68
|
+
code/refresh grants and `client_secret_post`, and validates the returned client
|
|
69
|
+
and redirect metadata. It returns `clientId`, `clientSecret` and any
|
|
70
|
+
`clientSecretExpiresAt` value. This is a privileged setup result, never an
|
|
71
|
+
ordinary connection-status response. The host must authorize invoking it and
|
|
72
|
+
store its secret before exposing the nonsecret configuration.
|
|
73
|
+
|
|
74
|
+
HTTPS callbacks and HTTP loopback callbacks are supported; credentials, query
|
|
75
|
+
strings and fragments are rejected. The helper does not follow redirects,
|
|
76
|
+
automatically retry, create an Amplitude account or complete consent. If
|
|
77
|
+
registration times out, inspect the provider before retrying: a client might
|
|
78
|
+
already exist. Registration metadata does not prove live issuance will succeed
|
|
79
|
+
for every account or client policy; that acceptance check remains unperformed.
|
|
80
|
+
|
|
81
|
+
For manual registration, use an HTTP client on your own machine:
|
|
82
|
+
|
|
83
|
+
In Vibe64, expand **Set up Amplitude → OAuth client registration**. Set the
|
|
84
|
+
region, permissions and **Suggested callback URL** first. **Copy registration
|
|
85
|
+
endpoint** and **Copy registration request** provide the values for this
|
|
86
|
+
project without requiring a Client ID. Copying sends no request. The example
|
|
87
|
+
below is for CLI users or an HTTP client configured by hand.
|
|
88
|
+
|
|
89
|
+
1. Create a **POST** request to `https://mcp.amplitude.com/register` for US,
|
|
90
|
+
or `https://mcp.eu.amplitude.com/register` for EU. Do not send it to the
|
|
91
|
+
`/mcp`, `/authorize` or `/token` endpoint.
|
|
92
|
+
2. Set the request header `Content-Type: application/json`. Set the body to
|
|
93
|
+
raw JSON using the example below. Replace the example name and callback
|
|
94
|
+
with the owning application's name and exact callback shown in Vibe64.
|
|
95
|
+
The application must implement that route before user consent can finish.
|
|
96
|
+
3. Match `scope` to the permissions selected in Vibe64. The example uses the
|
|
97
|
+
default read and refresh permissions; add `mcp:write` only when needed.
|
|
98
|
+
4. Send once. On a successful response, copy `client_id` into **Client ID**.
|
|
99
|
+
Store `client_secret` as `AMPLITUDE_CLIENT_SECRET` through the project's
|
|
100
|
+
Env editor; enter `env:AMPLITUDE_CLIENT_SECRET` in **Client secret reference**.
|
|
101
|
+
Store the exact registered callback as `AMPLITUDE_CALLBACK_URL`; enter
|
|
102
|
+
`env:AMPLITUDE_CALLBACK_URL` in **Callback URL reference**.
|
|
103
|
+
5. Do not save an error response, missing credentials or a different returned
|
|
104
|
+
redirect URI as a valid registration. Treat the response as secret material;
|
|
105
|
+
do not paste it into source, chat or a shared HTTP-client collection.
|
|
106
|
+
|
|
107
|
+
```json
|
|
108
|
+
{
|
|
109
|
+
"client_name": "My assistant",
|
|
110
|
+
"redirect_uris": ["https://assistant.example/connections/amplitude/callback"],
|
|
111
|
+
"token_endpoint_auth_method": "client_secret_post",
|
|
112
|
+
"grant_types": ["authorization_code", "refresh_token"],
|
|
113
|
+
"response_types": ["code"],
|
|
114
|
+
"scope": "mcp:read offline_access"
|
|
115
|
+
}
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
The HTTP response uses `client_id` and `client_secret`; the JavaScript helper
|
|
119
|
+
returns `clientId` and `clientSecret`. The helper also validates the response,
|
|
120
|
+
so Node applications should reuse it. Other frameworks implement this same
|
|
121
|
+
provider protocol using their own HTTP and secret-storage tools.
|
|
122
|
+
|
|
123
|
+
## Portable configuration and runtime
|
|
124
|
+
|
|
125
|
+
```json
|
|
126
|
+
{
|
|
127
|
+
"schemaVersion": 1,
|
|
128
|
+
"registrations": {
|
|
129
|
+
"amplitude": {
|
|
130
|
+
"source": "own",
|
|
131
|
+
"clientId": "assigned-client-id",
|
|
132
|
+
"clientSecretRef": "env:AMPLITUDE_CLIENT_SECRET",
|
|
133
|
+
"callbackUrlRef": "env:AMPLITUDE_CALLBACK_URL"
|
|
134
|
+
}
|
|
135
|
+
},
|
|
136
|
+
"integrations": {
|
|
137
|
+
"analytics": {
|
|
138
|
+
"provider": "amplitude",
|
|
139
|
+
"accountMode": "assistant",
|
|
140
|
+
"scopes": ["mcp:read", "offline_access"],
|
|
141
|
+
"authentication": { "method": "oauth2", "registrationRef": "amplitude" },
|
|
142
|
+
"settings": { "region": "us" }
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
The UI and CLI use the same parser and JSON. Region defaults to US. Read access
|
|
149
|
+
and refresh access default on; content writes default off. `tools.list` and
|
|
150
|
+
`tools.call` require a granted read permission. Amplitude additionally enforces
|
|
151
|
+
write/project permissions at call time. The host's authorization callback must
|
|
152
|
+
validate each requested tool name and its argument ownership before execution.
|
|
153
|
+
|
|
154
|
+
Use the ordinary [OAuth file pattern](../patterns/oauth-connection/PATTERN.md)
|
|
155
|
+
with `providers: [amplitudeProvider]`, and the
|
|
156
|
+
[assistant OAuth pattern](../patterns/assistant-mcp-oauth/PATTERN.md) for tool policy.
|
|
157
|
+
`beginAuthorization` creates a state/PKCE attempt. `completeAuthorization`
|
|
158
|
+
exchanges the code, initializes MCP and lists tools before persisting the grant.
|
|
159
|
+
Consent, code exchange and refresh all target the selected regional origin;
|
|
160
|
+
authorization and both token grants include its OAuth resource identifier.
|
|
161
|
+
Changing region invalidates pending/connected grants. Runtime state remains
|
|
162
|
+
encrypted text files using the existing file-store owner.
|
|
163
|
+
|
|
164
|
+
`tools.list` takes an optional opaque cursor. `tools.call` takes a tool `name`
|
|
165
|
+
and `arguments` object. The provider uses the standard `/mcp` endpoint and the
|
|
166
|
+
existing MCP transport; it does not automatically execute tools, attach them
|
|
167
|
+
to an assistant, follow returned URLs or grant sampling/elicitation capabilities.
|
|
168
|
+
Tool-level `isError` results remain data for the host to handle. Cancellation
|
|
169
|
+
stops local work and attempts session cleanup; it cannot undo accepted writes.
|
|
170
|
+
Disconnect removes local state without revoking all provider access.
|
|
171
|
+
|
|
172
|
+
## Connection ownership and callbacks
|
|
173
|
+
|
|
174
|
+
This fragment is for an explicitly configured assistant host. That host owns its
|
|
175
|
+
client registration, callback, private credentials and grants; it may be an
|
|
176
|
+
application-owned assistant or an opt-in editor tool. Merely adding the provider
|
|
177
|
+
to a project does not authorize the editor's coding assistant. It does not supply
|
|
178
|
+
published app-user login. The host's callback may differ from the published app's
|
|
179
|
+
domain, but it must match that host's real route and registered redirect URI.
|
|
180
|
+
|
|
181
|
+
AI can automate client registration and prepare configuration after authorized
|
|
182
|
+
setup inputs are supplied. Register the host's actual callback with the selected
|
|
183
|
+
US or EU endpoint, then retain the returned credentials in that host's private
|
|
184
|
+
Env. User sign-in/consent and organization permission changes remain owner/admin
|
|
185
|
+
actions. Separate client IDs do not prove independent Amplitude quotas for users
|
|
186
|
+
of the same organization. If the callback changes, update the client registration
|
|
187
|
+
and callback Env; a new hostname does not change the connection owner.
|
|
188
|
+
|
|
189
|
+
This adapter does not implement native public-client authentication, the
|
|
190
|
+
production event API, progressive-discovery UI, Amplitude service-account setup
|
|
191
|
+
or app-user OAuth.
|
|
192
|
+
|
|
193
|
+
## Focused proof
|
|
194
|
+
|
|
195
|
+
Eight tests cover US/EU registration metadata and code/refresh resource binding,
|
|
196
|
+
PKCE, file restart, credential encryption, region changes, owner isolation,
|
|
197
|
+
exact tool policy, declined/insufficient consent, malformed discovery, provider
|
|
198
|
+
failures, cancellation and no automatic registration replay. Editor proof
|
|
199
|
+
covers region, permission choices, secret references and persistence. Provider
|
|
200
|
+
signup, live registration/consent, live tool calls and generated apps are excluded.
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
## LIMITATIONS
|
|
204
|
+
|
|
205
|
+
Editor coding-assistant tool attachment is deferred. For example, this runtime
|
|
206
|
+
can call an authorized Amplitude analytics tool from an explicitly composed
|
|
207
|
+
application-owned assistant, but configuring it in Vibe64 does not let Codex or
|
|
208
|
+
OpenCode answer “where are customers dropping out of my funnel?” from your live
|
|
209
|
+
Amplitude data. Registration and consent do not attach tools to editor chat.
|
|
210
|
+
No live Amplitude registration, consent or generated application was exercised.
|