@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/linear.md
ADDED
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
# Linear
|
|
2
|
+
|
|
3
|
+
Import `linearProvider` from `@jskit-ai/connectors-catalog/server/linear`.
|
|
4
|
+
This adapter supports a personal API key or project-owned OAuth, with GraphQL reads and Linear MCP tools. Vibe64 edits the project configuration; the generated application owns its runtime and credentials.
|
|
5
|
+
|
|
6
|
+
## Configure access
|
|
7
|
+
|
|
8
|
+
1. Select the intended Linear workspace and open **Settings → Account → Security & Access**.
|
|
9
|
+
2. In the personal API-key section, create a key with a descriptive application
|
|
10
|
+
name. Choose read access and the teams the application needs where these
|
|
11
|
+
controls are offered.
|
|
12
|
+
3. Enter `env:LINEAR_API_KEY` in API key reference, **Save configuration**, then choose **Set credential in Env** and store the key as `LINEAR_API_KEY`. Return to connect.
|
|
13
|
+
4. Save provider `linear`, mode `shared` or `assistant`, `scopes: ["read"]`, and
|
|
14
|
+
authentication `{ "method": "api-key", "secretRef": "env:LINEAR_API_KEY" }`.
|
|
15
|
+
5. Call `connectApiKey` to verify the viewer; manage/revoke the key in the same
|
|
16
|
+
settings section. [Authentication guide](https://linear.app/developers/graphql).
|
|
17
|
+
|
|
18
|
+
## Runtime and CLI composition
|
|
19
|
+
|
|
20
|
+
The API is `POST https://api.linear.app/graphql`. Personal keys use the raw
|
|
21
|
+
`Authorization` header, without the OAuth Bearer prefix. `profile.read` selects
|
|
22
|
+
`viewer { id name email }`. `issues.list` accepts `first` (1–100, default 50;
|
|
23
|
+
100 is this fragment's cap) and optional `after`; it returns issue IDs,
|
|
24
|
+
identifiers, titles and `pageInfo`. Continue using `endCursor` only while
|
|
25
|
+
`hasNextPage` is true. [Pagination](https://linear.app/developers/pagination).
|
|
26
|
+
|
|
27
|
+
Both queries are fixed in the provider module. Input values become GraphQL
|
|
28
|
+
variables, never interpolated query text. Responses with GraphQL errors are
|
|
29
|
+
rejected even when HTTP status is 200 and partial data exists. The application
|
|
30
|
+
must not display that partial data as a successful result.
|
|
31
|
+
|
|
32
|
+
Use the [API-key pattern](../patterns/api-key-connection/PATTERN.md). It leaves
|
|
33
|
+
application authorization with the caller and persists connection state in files.
|
|
34
|
+
|
|
35
|
+
## Automation and application registrations
|
|
36
|
+
|
|
37
|
+
Personal key creation uses the interactive settings flow. For OAuth applications,
|
|
38
|
+
Linear supports a JSON application manifest: an AI can fill display information,
|
|
39
|
+
callback URLs and other supported configuration, then prepopulate the app-creation
|
|
40
|
+
page. A person still reviews and creates the application's own registration.
|
|
41
|
+
No unverified unattended registration API is assumed. [Application manifests](https://linear.app/developers/oauth-app-manifests).
|
|
42
|
+
|
|
43
|
+
Distinct
|
|
44
|
+
names/keys alone do not establish independent organization/user rate limits.
|
|
45
|
+
The application owner supplies the key and controls access to its organization.
|
|
46
|
+
Tests cover fixed queries, variables, pagination, partial errors, persistent
|
|
47
|
+
state, credential changes and isolation without live issue access.
|
|
48
|
+
|
|
49
|
+
## Project-owned OAuth
|
|
50
|
+
|
|
51
|
+
1. As a workspace administrator, open **Settings → Administration → API** and
|
|
52
|
+
create an OAuth application. The direct creation page is
|
|
53
|
+
<https://linear.app/settings/api/applications/new>. Register the exact
|
|
54
|
+
**Suggested callback URL** from this project's integration screen.
|
|
55
|
+
2. Copy its Client ID into the form. Save configuration and use the Env links to
|
|
56
|
+
store `LINEAR_CLIENT_SECRET` and `LINEAR_CALLBACK_URL`. Registering the URL
|
|
57
|
+
does not implement the application's callback handler.
|
|
58
|
+
3. Keep `read` selected; choose additional permissions only for required features.
|
|
59
|
+
This adapter uses `actor=user`, including in assistant mode. Service-account
|
|
60
|
+
actors and client-credentials grants are outside this adapter's flow.
|
|
61
|
+
4. Shared/assistant connections start with **Connect account**. Per-user
|
|
62
|
+
connections start in the generated application's authenticated account screen.
|
|
63
|
+
The framework owns login and callback routing; JSKIT supplies the JavaScript
|
|
64
|
+
lifecycle library. Other frameworks use their own OAuth implementation.
|
|
65
|
+
5. Approve the intended workspace. Verification reads the viewer. Cancel a pending
|
|
66
|
+
attempt locally if you abandon consent; reconnect starts a new attempt.
|
|
67
|
+
6. Disconnect clears the local grant. For remote revocation, open **Settings →
|
|
68
|
+
Account → Security & Access → Authorized applications**, hover the application
|
|
69
|
+
and choose **Revoke access**. Another workspace uses another connection.
|
|
70
|
+
|
|
71
|
+
Authorization uses comma-separated scopes, S256 PKCE and a project-owned secret
|
|
72
|
+
posted to Linear's token endpoint. Returned space-separated permissions (or
|
|
73
|
+
Linear's documented array form) are normalized before the shared lifecycle stores
|
|
74
|
+
and enforces them. Refresh tokens rotate and remain in the application's encrypted
|
|
75
|
+
connection store. Client secrets and grants are never stored in source.
|
|
76
|
+
[OAuth protocol](https://linear.app/developers/oauth-2-0-authentication),
|
|
77
|
+
[account access controls](https://linear.app/docs/security-and-access).
|
|
78
|
+
|
|
79
|
+
Use the [OAuth pattern](../patterns/oauth-connection/PATTERN.md), with registration
|
|
80
|
+
`source: "own"`, `tokenEndpointAuthMethod: "client_secret_post"`, the Client ID and
|
|
81
|
+
Env references above. Use provider `linear`, a registration reference in
|
|
82
|
+
`authentication`, and `scopes: ["read"]`. `beginAuthorization`,
|
|
83
|
+
`completeAuthorization`, `invoke`, and `disconnect` retain the same ownership
|
|
84
|
+
contract as other OAuth connectors.
|
|
85
|
+
|
|
86
|
+
## MCP with the same connection
|
|
87
|
+
|
|
88
|
+
`tools.list` and `tools.call` use the fixed Streamable HTTP endpoint
|
|
89
|
+
`https://mcp.linear.app/mcp`. Linear explicitly supports reusing an API key or an
|
|
90
|
+
existing Linear OAuth grant for this endpoint, so this path needs no additional
|
|
91
|
+
MCP registration. The adapter supplies raw key authorization to GraphQL and Bearer
|
|
92
|
+
authorization to MCP; OAuth uses Bearer for both. The captured Lovable interactive
|
|
93
|
+
MCP registration flow is a different registration path, not required for this
|
|
94
|
+
project-owned connection. The deprecated `/sse` endpoint is not used.
|
|
95
|
+
|
|
96
|
+
Tool calls may write when the provider grant allows it. The application must
|
|
97
|
+
approve/authorize the named operation and its arguments; `read` alone cannot
|
|
98
|
+
permit writes at Linear. Discovery does not execute tools. Use `tools.list` to
|
|
99
|
+
obtain available schemas rather than maintaining a second catalogue here.
|
|
100
|
+
[Linear MCP authentication](https://linear.app/docs/mcp).
|
|
101
|
+
|
|
102
|
+
## Review evidence
|
|
103
|
+
|
|
104
|
+
The focused fixture tests cover OAuth authorization, cancellation/denial, replay,
|
|
105
|
+
refresh rotation after restart, app/user isolation, lost scopes, raw API-key
|
|
106
|
+
GraphQL authorization and Bearer MCP discovery. No real Linear account, issue,
|
|
107
|
+
consent or tool execution was used. Both credential modes passed a controlled public-editor browser review: configuration survives reload, Env links and provider guides resolve to the intended destinations, and simulated connection controls work. The 496px instruction captures were visually inspected; no live provider consent or fresh phone review is claimed.
|
|
108
|
+
|
|
109
|
+
## Approved project and issue workflows
|
|
110
|
+
|
|
111
|
+
The existing MCP transport can discover and invoke the provider's project/issue
|
|
112
|
+
tools with either connection method. Discover `tools.list` (including returned
|
|
113
|
+
cursors), inspect each current input schema, then authorize the tool name and
|
|
114
|
+
arguments against the requesting app user and selected team/project. Supply write
|
|
115
|
+
permissions only when needed. Do not copy fixture tool names into application code.
|
|
116
|
+
|
|
117
|
+
```js
|
|
118
|
+
const result = await connections.invoke({
|
|
119
|
+
context: authorizedContext, integrationId: "linear", operation: "tools.call",
|
|
120
|
+
input: { name: approvedTool.name, arguments: approvedTool.arguments }
|
|
121
|
+
});
|
|
122
|
+
if (result.isError) throw new Error("Linear did not complete the requested action.");
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
`connections`, authenticated context and `approvedTool` are app-owned composition,
|
|
126
|
+
not exported globals. Use the returned project identifier when creating its issue;
|
|
127
|
+
use the returned issue identifier when updating it. The authorization callback
|
|
128
|
+
must enforce the exact target and write approval before transport. Never blindly
|
|
129
|
+
retry an uncertain create. CLI apps use the same library/configuration/Env; other
|
|
130
|
+
frameworks compose their native MCP client and authorization with those values.
|
|
131
|
+
|
|
132
|
+
**LIMITATIONS:** No maintained tool catalogue, project-management UI or automatic
|
|
133
|
+
Vibe64 Codex/OpenCode attachment. Example: an app can explicitly run an approved
|
|
134
|
+
issue update, but saving a Linear connection alone does not teach Vibe64's coding
|
|
135
|
+
chat to update that issue. Provider permissions and available tools determine what
|
|
136
|
+
can run. Fixture workflows prove argument/result transport and local denial, not
|
|
137
|
+
actual Linear tool schemas or live execution.
|
package/docs/linkedin.md
ADDED
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
# LinkedIn
|
|
2
|
+
|
|
3
|
+
Import `linkedinProvider` from `@jskit-ai/connectors-catalog/server/linkedin`.
|
|
4
|
+
This adapter reads the connected member's profile through `profile.read` and publishes approved text with `posts.create`.
|
|
5
|
+
Configuration preserves `openid`, `profile`, `email` and `w_member_social`.
|
|
6
|
+
Only OpenID and profile are required and selected by default. Publishing requires the Share on LinkedIn product and a grant with `w_member_social`.
|
|
7
|
+
|
|
8
|
+
## Register and configure
|
|
9
|
+
|
|
10
|
+
1. Sign into [LinkedIn Developers](https://www.linkedin.com/developers/apps).
|
|
11
|
+
Choose **My apps → Create app**. Supply the requested name, LinkedIn Page,
|
|
12
|
+
privacy-policy URL and logo; complete Page-owner verification when prompted.
|
|
13
|
+
2. Open **Products** and request **Sign In with LinkedIn using OpenID Connect**.
|
|
14
|
+
Once approved, check **Auth** for `openid`, `profile` and `email`.
|
|
15
|
+
Email fields may be absent even when profile retrieval succeeds.
|
|
16
|
+
[Product and profile documentation](https://learn.microsoft.com/en-us/linkedin/consumer/integrations/self-serve/sign-in-with-linkedin-v2).
|
|
17
|
+
3. Open **Auth → OAuth 2.0 settings → Authorized redirect URLs** and add the
|
|
18
|
+
project's exact **Suggested callback URL**, using HTTPS. Copy **Client ID** into the configuration.
|
|
19
|
+
Save **Client Secret** only in backend Env as `LINKEDIN_CLIENT_SECRET`.
|
|
20
|
+
Set `LINKEDIN_CALLBACK_URL` to the registered URL without query or fragment.
|
|
21
|
+
[Confidential authorization flow](https://learn.microsoft.com/en-us/linkedin/shared/authentication/authorization-code-flow).
|
|
22
|
+
4. For text publishing, request **Share on LinkedIn** under Products and
|
|
23
|
+
confirm `w_member_social` is provisioned in Auth before selecting it.
|
|
24
|
+
[Share product](https://learn.microsoft.com/en-us/linkedin/consumer/integrations/self-serve/share-on-linkedin).
|
|
25
|
+
5. In Vibe64 choose **Add LinkedIn**, enter display name, ownership, Client ID
|
|
26
|
+
and the two Env references. Open **Permissions** for optional email/publishing.
|
|
27
|
+
Choose **Save configuration**, then **Set credential in Env** to store the
|
|
28
|
+
Client Secret. Use **Open Env** to set the same registered callback. Return
|
|
29
|
+
and choose **Connect account** for shared/assistant access. Each-user access
|
|
30
|
+
starts in the generated application's authenticated account screen. Its
|
|
31
|
+
backend must implement the callback; saving fields does not create that route
|
|
32
|
+
or complete provider consent.
|
|
33
|
+
|
|
34
|
+
```json
|
|
35
|
+
{
|
|
36
|
+
"schemaVersion": 1,
|
|
37
|
+
"integrations": {
|
|
38
|
+
"linkedin": {
|
|
39
|
+
"provider": "linkedin",
|
|
40
|
+
"displayName": "My LinkedIn profile",
|
|
41
|
+
"accountMode": "per-user",
|
|
42
|
+
"scopes": ["openid", "profile"],
|
|
43
|
+
"authentication": { "method": "oauth2", "registrationRef": "linkedin" }
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
"registrations": {
|
|
47
|
+
"linkedin": {
|
|
48
|
+
"source": "own",
|
|
49
|
+
"clientId": "YOUR_LINKEDIN_CLIENT_ID",
|
|
50
|
+
"clientSecretRef": "env:LINKEDIN_CLIENT_SECRET",
|
|
51
|
+
"callbackUrlRef": "env:LINKEDIN_CALLBACK_URL"
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Runtime and AI composition
|
|
58
|
+
|
|
59
|
+
Use the [OAuth file composition pattern](../patterns/oauth-connection/PATTERN.md)
|
|
60
|
+
with `providers: [linkedinProvider]` and this JSON. Core owns configuration,
|
|
61
|
+
Env resolution, consent attempts, encrypted file storage, refresh and disconnect.
|
|
62
|
+
No generator or editor database is needed.
|
|
63
|
+
|
|
64
|
+
```js
|
|
65
|
+
import { readFile } from "node:fs/promises";
|
|
66
|
+
import { parseIntegrationConfiguration } from "@jskit-ai/connectors-core/shared/configuration";
|
|
67
|
+
import { createConnectionService, createEnvironmentReferenceResolver } from "@jskit-ai/connectors-core/server";
|
|
68
|
+
import { createFileConnectionStore, createCredentialProtection } from "@jskit-ai/connectors-core/server/file-storage";
|
|
69
|
+
import { linkedinProvider } from "@jskit-ai/connectors-catalog/server/linkedin";
|
|
70
|
+
|
|
71
|
+
const providers = [linkedinProvider];
|
|
72
|
+
const configuration = parseIntegrationConfiguration(await readFile("integrations.json", "utf8"), { providers });
|
|
73
|
+
const protection = createCredentialProtection({
|
|
74
|
+
keys: { current: Buffer.from(process.env.CONNECTOR_STORAGE_KEY, "base64") }, activeKeyId: "current"
|
|
75
|
+
});
|
|
76
|
+
const connections = createConnectionService({
|
|
77
|
+
configuration, providers,
|
|
78
|
+
store: createFileConnectionStore({ directory: process.env.CONNECTOR_STATE_DIRECTORY, protection }),
|
|
79
|
+
resolveReference: createEnvironmentReferenceResolver(), authorize: applicationConnectionPolicy
|
|
80
|
+
});
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
`applicationConnectionPolicy` derives `{ applicationId, subjectId }` from
|
|
84
|
+
trusted app authentication or a CLI operator and checks each requested operation.
|
|
85
|
+
Per-user mode keeps individual grants; shared mode needs a stable shared subject
|
|
86
|
+
and membership checks. Assistant mode requires explicit host authorization too.
|
|
87
|
+
Keep runtime files outside exported source and preserve the encryption key
|
|
88
|
+
across restarts. No client secret or provider token belongs in project JSON.
|
|
89
|
+
|
|
90
|
+
Call `beginAuthorization({ context, integrationId: "linkedin" })` and open the
|
|
91
|
+
returned URL. Recover the same authenticated owner in the callback, then call
|
|
92
|
+
`completeAuthorization({ context, integrationId: "linkedin", callbackUrl })`.
|
|
93
|
+
Success includes a read-only profile check. Later call
|
|
94
|
+
`invoke({ context, integrationId: "linkedin", operation: "profile.read" })`.
|
|
95
|
+
The operation accepts no input and calls only
|
|
96
|
+
`GET https://api.linkedin.com/v2/userinfo`. It requires a nonempty `sub` and
|
|
97
|
+
accepts absent optional name/email fields. Do not infer a missing email or
|
|
98
|
+
fetch picture URLs automatically.
|
|
99
|
+
|
|
100
|
+
`cancelAuthorization` abandons a pending attempt; failed replacement consent
|
|
101
|
+
preserves the old grant. `disconnect` removes local access and attempts, not
|
|
102
|
+
provider-wide consent. For provider revocation, open **Me → Settings & Privacy → Data privacy → Other
|
|
103
|
+
applications → Permitted services**, choose **Change**, then **Remove** beside
|
|
104
|
+
the application. [LinkedIn's access-removal instructions](https://www.linkedin.com/help/linkedin/answer/a522690/log-in-with-linkedin-credentials?lang=en).
|
|
105
|
+
|
|
106
|
+
The provider normalizes the documented omission of `token_type` to Bearer.
|
|
107
|
+
It discards ID tokens and never uses them as proof of application login.
|
|
108
|
+
The host's existing identity implementation remains responsible for login.
|
|
109
|
+
Core sends state and S256 PKCE parameters with confidential Web OAuth; the Web
|
|
110
|
+
flow documentation does not establish PKCE enforcement. LinkedIn's separate
|
|
111
|
+
native flow needs enablement and a loopback callback. It is not implemented
|
|
112
|
+
here; never embed a client secret in an installed editor or browser. CLI users
|
|
113
|
+
can compose the same server runtime with their registered callback owner.
|
|
114
|
+
[Native flow](https://learn.microsoft.com/en-us/linkedin/shared/authentication/authorization-code-flow-native).
|
|
115
|
+
|
|
116
|
+
## Expiry, failures and verification
|
|
117
|
+
|
|
118
|
+
Ordinary grants may have no refresh token. Expiry then requires reconnect.
|
|
119
|
+
If LinkedIn enables programmatic refresh and supplies a refresh token, core
|
|
120
|
+
serializes refresh under the file lock and retains rotation. Reduced permissions
|
|
121
|
+
never expand during refresh. Approval is provider-controlled; refresh expiry
|
|
122
|
+
or revocation can still require consent again.
|
|
123
|
+
[Refresh availability and protocol](https://learn.microsoft.com/en-us/linkedin/shared/authentication/programmatic-refresh-tokens).
|
|
124
|
+
|
|
125
|
+
Missing required permissions, invalid responses and failed profile checks prevent
|
|
126
|
+
Connected. API 401 requires reconnect; 403 means permission denied; 429 means
|
|
127
|
+
rate limited. Errors omit provider text. Changing the OAuth client ID invalidates
|
|
128
|
+
access through the previous client. Requests are bounded and cancellable.
|
|
129
|
+
Organization access, analytics and application login are outside this adapter. Focused tests use controlled HTTP and encrypted temporary files,
|
|
130
|
+
including this exact JSON. Editor checks use file-backed browser fixtures.
|
|
131
|
+
No live consent, provider token issuance or generated application is proven.
|
|
132
|
+
|
|
133
|
+
## Automation and application registrations
|
|
134
|
+
|
|
135
|
+
An AI can prepare JSON, Env names, callback handlers and runtime wiring. This
|
|
136
|
+
pass established no supported public API for creating developer apps or granting
|
|
137
|
+
product access. Registration, Page verification and approval remain operator
|
|
138
|
+
steps. Do not promise unattended provisioning from a client ID alone.
|
|
139
|
+
|
|
140
|
+
Each application owns its provider registration, callback route, credentials
|
|
141
|
+
and grants. Hosted and installed editors configure the same app-owned setup;
|
|
142
|
+
neither supplies a shared Vibe64 registration or token gateway. Use the app's
|
|
143
|
+
assigned public URL as the initial callback origin, append the route the backend
|
|
144
|
+
actually implements, and register the exact URL with the provider. Keep the
|
|
145
|
+
client secret and callback binding in the application's Env.
|
|
146
|
+
|
|
147
|
+
A custom-domain or hosting move that changes the callback requires updating both
|
|
148
|
+
the provider registration and the app's Env. Preserve the application's identity
|
|
149
|
+
and private connection store, validate callback state and initiator, and allow
|
|
150
|
+
only application-approved return destinations. The editor's address is not the
|
|
151
|
+
provider callback. See the [callback contract](../../connectors-core/docs/oauth-callbacks.md)
|
|
152
|
+
and [setup command](../../connectors-core/docs/setup-command.md).
|
|
153
|
+
|
|
154
|
+
Separate client IDs do not establish independent quotas or permission to serve
|
|
155
|
+
unrelated applications. Register and obtain product approval for the actual app.
|
|
156
|
+
Managed assignments are invalid configuration in this runtime.
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
## Credential guidance review (2026-09-12)
|
|
160
|
+
|
|
161
|
+
The inline setup steps now name the developer portal, product approval, exact
|
|
162
|
+
callback registration and project Env handoff before connection. Current OIDC,
|
|
163
|
+
authorization-code and refresh documentation were checked. The existing adapter
|
|
164
|
+
was retained; no provider-login or publishing implementation was added. Ten
|
|
165
|
+
focused runtime fixtures pass, including expiry without refresh, approved
|
|
166
|
+
refresh, cancellation/replay, encryption, missing permissions and host isolation.
|
|
167
|
+
The cancellation test now expects the callback URL exposed by connection status,
|
|
168
|
+
while retaining the complete assertion that declined replacement consent keeps
|
|
169
|
+
the previous grant. Rendered guidance passed the controlled public-editor journey: saved Client ID/callback, Env links, reload, simulated consent/cancellation/reconnect and disconnect. All six steps were visually reviewed at 496px width. No live provider consent or fresh phone review is claimed.
|
|
170
|
+
|
|
171
|
+
## Text publishing acceptance — 2026-09-13
|
|
172
|
+
|
|
173
|
+
Use `posts.create` with `{ text, visibility: "PUBLIC" }` or `"CONNECTIONS"` after
|
|
174
|
+
app authorization of the exact message and audience. Text is locally limited to
|
|
175
|
+
1–3000 characters. The operation reads the connected member identity, constructs
|
|
176
|
+
the Person URN itself and posts once to `/v2/ugcPosts`. Callers cannot choose a
|
|
177
|
+
different author. The result contains the post URN from the confirmed 201 response.
|
|
178
|
+
[Provider sharing contract](https://learn.microsoft.com/en-us/linkedin/consumer/integrations/self-serve/share-on-linkedin).
|
|
179
|
+
|
|
180
|
+
```js
|
|
181
|
+
const post = await connections.invoke({ context: authorizedContext,
|
|
182
|
+
integrationId: "linkedin", operation: "posts.create",
|
|
183
|
+
input: { text: approvedText, visibility: approvedVisibility } });
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
The app supplies these variables and its approval policy. CLI uses the same config,
|
|
187
|
+
Env and library; other frameworks can implement the same provider request with
|
|
188
|
+
their native HTTP/OAuth tools. Add the provider product, select Publish posts in
|
|
189
|
+
configuration and reconnect before invoking it. No publishing occurs during
|
|
190
|
+
connection verification. Check LinkedIn before manually repeating an uncertain
|
|
191
|
+
request; a timeout does not prove the post was never created.
|
|
192
|
+
|
|
193
|
+
**LIMITATIONS:** Text only. No images/video, organization posts, scheduling, post
|
|
194
|
+
editing/deletion, analytics or editor-assistant attachment. Example: publish an
|
|
195
|
+
approved announcement, but not a photo campaign. Prior September12 review above
|
|
196
|
+
is historical. Current tests use simulated provider responses, not live publishing.
|
package/docs/logo-dev.md
ADDED
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
# Logo.dev
|
|
2
|
+
|
|
3
|
+
Import `createLogoDevImageUrl` from
|
|
4
|
+
`@jskit-ai/connectors-catalog/client/logo-dev`. This is a library implementation
|
|
5
|
+
for public image URLs, usable in a browser or Node process. The shared catalogue
|
|
6
|
+
exports `logoDevDefinition` for configuration and UI metadata.
|
|
7
|
+
|
|
8
|
+
## Manual provider setup
|
|
9
|
+
|
|
10
|
+
1. Sign into [Logo.dev API Keys](https://www.logo.dev/dashboard/api-keys).
|
|
11
|
+
Copy the publishable `pk_` key.
|
|
12
|
+
2. In Vibe64, add Logo.dev and enter `env:LOGO_DEV_PUBLISHABLE_KEY` in
|
|
13
|
+
**Publishable key reference**. Choose **Save configuration**, then **Set
|
|
14
|
+
credential in Env**, and store the actual `pk_` value as
|
|
15
|
+
`LOGO_DEV_PUBLISHABLE_KEY`. Return after saving Env. The application resolves
|
|
16
|
+
that one reference for its image rendering code.
|
|
17
|
+
3. For restrictions, turn on **Allowed Domains Only**, enter the domains that
|
|
18
|
+
load images, one per line, then choose **Save Changes**.
|
|
19
|
+
4. Ensure image requests send an origin referrer. Include development/preview
|
|
20
|
+
domains deliberately; restrictions also reject requests without a referrer.
|
|
21
|
+
5. Save the source configuration. Key rotation is documented as a support
|
|
22
|
+
request; replace the environment binding after obtaining the new key.
|
|
23
|
+
|
|
24
|
+
Publishable keys work on the image CDN. Private `sk_` keys belong to other APIs
|
|
25
|
+
and must not appear in browser image URLs.
|
|
26
|
+
[Key types, restrictions and rotation](https://www.logo.dev/docs/platform/api-keys).
|
|
27
|
+
|
|
28
|
+
## Portable source and library usage
|
|
29
|
+
|
|
30
|
+
```json
|
|
31
|
+
{
|
|
32
|
+
"schemaVersion": 1,
|
|
33
|
+
"registrations": {},
|
|
34
|
+
"integrations": {
|
|
35
|
+
"logos": {
|
|
36
|
+
"provider": "logo-dev",
|
|
37
|
+
"displayName": "Company logos",
|
|
38
|
+
"accountMode": "shared",
|
|
39
|
+
"scopes": [],
|
|
40
|
+
"authentication": { "method": "api-key", "secretRef": "env:LOGO_DEV_PUBLISHABLE_KEY" }
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
An application build step, backend or CLI resolves this one configured reference
|
|
47
|
+
using its environment resolver. It then deliberately publishes the `pk_` value
|
|
48
|
+
as browser configuration or includes it in a returned image URL. Keep the
|
|
49
|
+
portable source file reference-only, exactly as the editor writes it. Do not
|
|
50
|
+
dump the environment or substitute a private key.
|
|
51
|
+
|
|
52
|
+
```js
|
|
53
|
+
import { createLogoDevImageUrl } from "@jskit-ai/connectors-catalog/client/logo-dev";
|
|
54
|
+
|
|
55
|
+
const imageUrl = createLogoDevImageUrl({
|
|
56
|
+
publishableKey: publicConfiguration.logoDevKey,
|
|
57
|
+
domain: "example.com",
|
|
58
|
+
size: 128,
|
|
59
|
+
theme: "dark",
|
|
60
|
+
fallback: "404"
|
|
61
|
+
});
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Assign this URL to an image element's `src`, supply meaningful `alt` text and
|
|
65
|
+
an origin-compatible referrer policy, and handle its `error` event with the
|
|
66
|
+
application's own fallback. `createLogoDevImageUrl` performs no HTTP request,
|
|
67
|
+
records no grant and cannot establish Connected. Its metadata explicitly marks
|
|
68
|
+
the runtime as `public-resource`; use the
|
|
69
|
+
[public-image source pattern](../patterns/public-image/PATTERN.md), not the
|
|
70
|
+
server connection-verification API. The browser's load/error events provide
|
|
71
|
+
delivery evidence. They are distinct from saving configuration.
|
|
72
|
+
|
|
73
|
+
The library validates an ASCII domain (including punycode), the publishable-key
|
|
74
|
+
prefix and image options, then returns a URL on `https://img.logo.dev`. It rejects
|
|
75
|
+
caller destinations, private keys, path/query injection and unsupported fields.
|
|
76
|
+
Inputs are not mutated. Local defaults are size 128, PNG, automatic theme,
|
|
77
|
+
greyscale off, retina off and monogram fallback. Options include JPG/WebP/SVG,
|
|
78
|
+
light/dark/auto themes, sizes 1–800, retina, greyscale and `404` fallback.
|
|
79
|
+
SVG availability depends on the provider plan; URL construction does not
|
|
80
|
+
confirm that entitlement. Width/height overrides, brand-name and crypto lookups are outside this function.
|
|
81
|
+
[Image parameters](https://www.logo.dev/docs/logo-images/get).
|
|
82
|
+
|
|
83
|
+
The provider can return a monogram with HTTP 200 when a brand logo is missing.
|
|
84
|
+
Use `fallback: "404"` when the application needs to distinguish missing images.
|
|
85
|
+
A URL or successful image load does not prove that a specific brand logo exists.
|
|
86
|
+
[Missing-logo behavior](https://www.logo.dev/docs/logo-images/introduction).
|
|
87
|
+
|
|
88
|
+
The key is intentionally visible in image requests. Apply the provider's
|
|
89
|
+
attribution and usage requirements in the product; the URL helper does not add
|
|
90
|
+
attribution or authorize image redistribution.
|
|
91
|
+
[Attribution](https://www.logo.dev/docs/platform/attribution),
|
|
92
|
+
[usage policy](https://www.logo.dev/docs/platform/fair-use).
|
|
93
|
+
|
|
94
|
+
## API provisioning and application ownership
|
|
95
|
+
|
|
96
|
+
No public account/key provisioning API was verified in the linked documentation.
|
|
97
|
+
An AI can prepare source configuration, rendering and domain instructions;
|
|
98
|
+
dashboard access and support-assisted rotation remain operator work. Do not
|
|
99
|
+
guess internal dashboard endpoints or use a secret key to make the image flow
|
|
100
|
+
look like an authenticated JSON service.
|
|
101
|
+
|
|
102
|
+
The application owner supplies its provider key and arranges the capacity it
|
|
103
|
+
needs. Configuration labels do not create independent quotas. Customer-owned
|
|
104
|
+
keys remain owned by the customer when exporting or moving an app. This image
|
|
105
|
+
flow creates no OAuth app, user login or per-user mailbox-style grant.
|
|
106
|
+
|
|
107
|
+
Allowed domains should identify the actual browser app: for example, its
|
|
108
|
+
hosting subdomain, custom domain and intended preview origin. The editor's VM
|
|
109
|
+
domain matters only if it itself loads the images. That differs from an OAuth
|
|
110
|
+
redirect allowlist. Changing application domains can require provider-side
|
|
111
|
+
restriction updates even though the portable reference is unchanged.
|
|
112
|
+
|
|
113
|
+
## Focused evidence
|
|
114
|
+
|
|
115
|
+
Node tests cover options, encoding boundaries, private-key rejection, portable
|
|
116
|
+
configuration and the absence of false server verification. The ordinary
|
|
117
|
+
source pattern is checked with a supplied resolver. Editor/browser tests cover
|
|
118
|
+
save/reload, reference validation, actual image loading from a simulated CDN
|
|
119
|
+
and a simulated missing-image failure. No live provider use or generated sample
|
|
120
|
+
application is needed.
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
## Credential guidance review (2026-09-12)
|
|
124
|
+
|
|
125
|
+
Current provider key and image documentation were checked against the captured
|
|
126
|
+
publishable-key field. The inline instructions now give the direct dashboard
|
|
127
|
+
URL, exact reference and Env handoff, public/private distinction, domain patterns,
|
|
128
|
+
referrer behavior and support-assisted rotation. The existing image library and
|
|
129
|
+
public-image composition pattern remain the owners of URL generation and wiring.
|
|
130
|
+
The first rendered review exposed an account-connect button because the editor
|
|
131
|
+
consumes configurationOnly metadata rather than runtimeKind. Logo.dev now sets
|
|
132
|
+
that existing flag: the editor omits account controls and the server refuses
|
|
133
|
+
setup commands before Env preparation or application execution. Two targeted
|
|
134
|
+
public-editor tests cover this rule for Logo.dev and Google Analytics.
|
|
135
|
+
All four focused library tests passed, including private-key rejection, fixed-origin URL
|
|
136
|
+
construction, portable configuration and selective reference resolution. Rendered guidance and simulated image delivery passed: the actual editor persists the reference through reload, links to Env and the provider guide, and offers no account-connect controls. Browser image load/error and origin-referrer behavior were checked with a simulated CDN. All five steps were visually reviewed at 496px width; no live provider or generated-app claim.
|
|
137
|
+
|
|
138
|
+
## Lookup coverage — 2026-09-13
|
|
139
|
+
|
|
140
|
+
Supply exactly one of `domain`, `ticker` or `email` to the same URL helper.
|
|
141
|
+
`{ ticker: "SHEL.L" }` uses the provider's ticker endpoint with an exchange suffix;
|
|
142
|
+
`{ email: "person@example.com" }` extracts `example.com` locally and uses domain
|
|
143
|
+
lookup. The personal part of the email never enters the URL. These are ordinary
|
|
144
|
+
per-image application inputs, not project credential settings. The same source
|
|
145
|
+
pattern resolves the publishable key; other frameworks can construct equivalent
|
|
146
|
+
URLs without a Node runtime or Vibe64 service.
|
|
147
|
+
[Ticker endpoint](https://www.logo.dev/docs/logo-images/ticker).
|
|
148
|
+
|
|
149
|
+
**LIMITATIONS:** No private brand search/enrichment, crypto or ISIN lookup, avatar
|
|
150
|
+
identification or automatic attribution badge. Example: an address at gmail.com
|
|
151
|
+
returns the email provider logo, not the person's business. Apply plan attribution
|
|
152
|
+
in the app and distinguish image success from real brand-logo availability.
|
package/docs/mailgun.md
ADDED
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
# Mailgun
|
|
2
|
+
|
|
3
|
+
Import `mailgunProvider` from `@jskit-ai/connectors-catalog/server/mailgun`.
|
|
4
|
+
The adapter verifies an account API key, sends transactional messages, creates
|
|
5
|
+
and verifies sending domains, returns their DNS records, and queries delivery logs.
|
|
6
|
+
DNS records are installed at the domain owner’s DNS host, not at Vibe64.
|
|
7
|
+
|
|
8
|
+
## Configure access
|
|
9
|
+
|
|
10
|
+
1. Sign into the intended Mailgun account as an administrator. Open the profile
|
|
11
|
+
menu at the top right, then **API Security → Add new key**.
|
|
12
|
+
2. Enter a description and select **Developer** for sending and domain management. Select **Analyst**
|
|
13
|
+
only for a deliberately read-only connection. Click **Create Key** and copy the secret while it is visible.
|
|
14
|
+
Free/Basic accounts expose Admin only; that restriction comes from Mailgun.
|
|
15
|
+
Existing key roles cannot be edited: create a replacement to change roles.
|
|
16
|
+
[Key roles and dashboard steps](https://help.mailgun.com/hc/en-us/articles/26016288026907-API-Key-Roles).
|
|
17
|
+
3. Enter `env:MAILGUN_API_KEY` in **API key reference**. Domain Sending
|
|
18
|
+
Keys and SMTP passwords do not provide this account domain-listing access.
|
|
19
|
+
[Credential types](https://help.mailgun.com/hc/en-us/articles/203380100-Where-can-I-find-my-API-keys-and-SMTP-credentials).
|
|
20
|
+
4. Save provider `mailgun`, mode `shared` or `assistant`, `scopes: []`, and
|
|
21
|
+
authentication `{ "method": "api-key", "secretRef": "env:MAILGUN_API_KEY" }`.
|
|
22
|
+
Choose `settings.region: "us"` (default) or `"eu"`, corresponding to the
|
|
23
|
+
intended domains. The editor calls this **API region**.
|
|
24
|
+
5. Choose **Save configuration**, then **Set credential in Env**. Store the real
|
|
25
|
+
account key as `MAILGUN_API_KEY`, return, and choose **Connect account**.
|
|
26
|
+
CLI apps call `connectApiKey`. Requests use HTTP Basic authentication with username
|
|
27
|
+
`api` and the resolved key as password. US requests go to
|
|
28
|
+
`https://api.mailgun.net`; EU requests go to `https://api.eu.mailgun.net`.
|
|
29
|
+
Changing region requires verification again.
|
|
30
|
+
[Authentication](https://documentation.mailgun.com/docs/mailgun/api-reference/authentication/).
|
|
31
|
+
|
|
32
|
+
## Runtime and AI composition
|
|
33
|
+
|
|
34
|
+
`domains.list` reads `GET /v4/domains`. It accepts `limit` (1–1000, default
|
|
35
|
+
100), `skip` (default 0), optional `state` (`active`, `unverified`, `disabled`),
|
|
36
|
+
`sort` (`name`, `name:asc`, `name:desc`), `search`, and `include_subaccounts`
|
|
37
|
+
(default false). Results contain `items` and `total_count`. Advance `skip` by
|
|
38
|
+
the number of received items to retrieve another page.
|
|
39
|
+
[Domain listing](https://documentation.mailgun.com/docs/mailgun/api-reference/send/mailgun/domains/get-v4-domains).
|
|
40
|
+
|
|
41
|
+
Use the [API-key pattern](../patterns/api-key-connection/PATTERN.md) with the file
|
|
42
|
+
store. Application code can use the operations below with the same configured connection. Local disconnect does not revoke the account key. Replace
|
|
43
|
+
the Env value when rotating credentials, and delete obsolete keys in Mailgun.
|
|
44
|
+
Tests cover both regional origins, HTTP Basic headers, pagination, re-verification,
|
|
45
|
+
file restart and rejected responses without accessing a real mailbox or account.
|
|
46
|
+
|
|
47
|
+
## Automation and application ownership
|
|
48
|
+
|
|
49
|
+
After administrator credential bootstrap, an AI can automate key creation
|
|
50
|
+
through `POST /v1/keys` using multipart form fields: `kind=user`, a required
|
|
51
|
+
`role` (`basic` is the API value for Analyst), a `description`, and optionally
|
|
52
|
+
positive `expiration` seconds. Persist the returned `key.secret` directly in
|
|
53
|
+
secret storage. The runtime fragment does not expose this administrative
|
|
54
|
+
operation. [Key creation API](https://documentation.mailgun.com/docs/mailgun/api-reference/send/mailgun/keys/post-v1-keys).
|
|
55
|
+
|
|
56
|
+
Each application supplies credentials for its intended Mailgun account. Keys
|
|
57
|
+
within one account may share capacity and billing. The application operator
|
|
58
|
+
owns account selection and budgets; key names alone do not isolate quotas.
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
## Credential guidance review (2026-09-12)
|
|
62
|
+
|
|
63
|
+
Current provider key-role, credential-type and domain-list documentation were
|
|
64
|
+
checked against the captured private key and US/EU fields. Inline setup now
|
|
65
|
+
explains the exact dashboard flow, admin requirement, Analyst where available,
|
|
66
|
+
one-time secret display, account-key distinction, region and named Env handoff.
|
|
67
|
+
Verification remains a domain-list read; it sends no email and changes no DNS.
|
|
68
|
+
Three focused test cases passed (1.15s), including the shared regional-destination
|
|
69
|
+
regression: changing region requires verification before credentials reach the
|
|
70
|
+
new allowed origin. No runtime change was needed. The controlled browser review passed: the EU region and MAILGUN_API_KEY reference persist after reload, Env and provider guide links are present, and simulated connect/verify/disconnect work. All six steps were visually inspected at 496px width. No live account, email sending or generated application was exercised.
|
|
71
|
+
|
|
72
|
+
## Sending and domain setup
|
|
73
|
+
|
|
74
|
+
1. In Mailgun, open **Send → Sending → Domains → Add new domain**. Enter a
|
|
75
|
+
domain you control, commonly a dedicated subdomain such as `mail.example.com`,
|
|
76
|
+
and select its region. Alternatively call `domains.create` with `{ domain }`.
|
|
77
|
+
2. Open the domain's **Domain Verification & DNS** page. At your DNS host, add
|
|
78
|
+
the exact sending records shown by Mailgun. `domains.get` returns the same
|
|
79
|
+
sending/receiving record sets for application-owned setup screens. Do not
|
|
80
|
+
invent SPF/DKIM values. Some hosts append your root domain automatically.
|
|
81
|
+
Receiving MX records are separate from outbound sending: do not replace
|
|
82
|
+
existing business-mail MX records just to send through Mailgun.
|
|
83
|
+
3. Check DNS status in Mailgun or call `domains.verify` with `{ domain }`.
|
|
84
|
+
A successful HTTP response can still contain `domain.state: "unverified"`;
|
|
85
|
+
display each DNS record's status and allow the operator to retry after DNS
|
|
86
|
+
propagation. A successful key check alone does not prove DNS readiness.
|
|
87
|
+
4. Choose a sender address at that domain in your application's mail settings.
|
|
88
|
+
Keep recipient selection behind the application's authorization/business rules.
|
|
89
|
+
Sandbox domains can send only to authorized recipients; use a verified custom
|
|
90
|
+
domain for production.
|
|
91
|
+
|
|
92
|
+
[Domain setup](https://documentation.mailgun.com/docs/mailgun/user-manual/domains/domains-custom)
|
|
93
|
+
[DNS verification](https://documentation.mailgun.com/docs/mailgun/user-manual/domains/domains-verify)
|
|
94
|
+
[Domain API](https://documentation.mailgun.com/docs/mailgun/api-reference/send/mailgun/domains)
|
|
95
|
+
|
|
96
|
+
The runtime operations accept `{ domain }` for `domains.create`, `domains.get`,
|
|
97
|
+
and `domains.verify`. Creation and verification are explicit mutations; connecting
|
|
98
|
+
never performs them. Developer keys support these operations; Analyst keys do not.
|
|
99
|
+
[Current role matrix](https://documentation.mailgun.com/docs/mailgun/user-manual/api-key-mgmt/rbac-mgmt).
|
|
100
|
+
|
|
101
|
+
```js
|
|
102
|
+
const queued = await connections.invoke({
|
|
103
|
+
context, integrationId: "mail", operation: "messages.send",
|
|
104
|
+
input: {
|
|
105
|
+
domain: "mail.example.com", from: "Support <support@mail.example.com>",
|
|
106
|
+
to: ["customer@example.com"], subject: "Your receipt",
|
|
107
|
+
text: "Thank you for your purchase.", html: "<p>Thank you for your purchase.</p>"
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
`messages.send` requires `domain`, `from`, `to`, `subject`, and plain `text`;
|
|
113
|
+
HTML is optional. It sends multipart data to the configured US/EU region and
|
|
114
|
+
returns Mailgun's queued message ID. It does not claim inbox delivery. This
|
|
115
|
+
operation does not support attachments or templates yet. A timeout after sending
|
|
116
|
+
has an uncertain outcome: do not blindly retry or fabricate an idempotency header.
|
|
117
|
+
Keep the queued ID with your application's delivery record when available.
|
|
118
|
+
[Send API](https://documentation.mailgun.com/docs/mailgun/api-reference/send/mailgun/messages/post-v3--domain-name--messages).
|
|
119
|
+
|
|
120
|
+
## Delivery logs and failures
|
|
121
|
+
|
|
122
|
+
Call `logs.list` with `{ domain, duration: "1d", limit: 50 }`. It queries the
|
|
123
|
+
current `/v1/analytics/logs` API (the older Events API is deprecated). Results
|
|
124
|
+
preserve event type, recipient, severity and delivery status. Pass the returned
|
|
125
|
+
`pagination.next` as `token` to fetch another page. For stable traversal, supply
|
|
126
|
+
an RFC 2822 `end` timestamp on the first request and reuse it for subsequent
|
|
127
|
+
pages. Poll with a bounded schedule owned by your app; retain event IDs to avoid
|
|
128
|
+
processing overlapping results twice. The domain filter is mandatory and
|
|
129
|
+
subaccount aggregation is disabled. A sending key is not sufficient for this
|
|
130
|
+
account-level connector; it requires an account API key.
|
|
131
|
+
|
|
132
|
+
A queued/accepted event differs from delivered; a temporary failure differs from
|
|
133
|
+
a permanent rejection. Surface the provider's status instead of marking every
|
|
134
|
+
queued message delivered. Log retention and available results depend on the
|
|
135
|
+
Mailgun account. No automatic resend is performed. HTTP 401 requires reconnecting
|
|
136
|
+
with corrected credentials; HTTP 429 should be surfaced for application-managed
|
|
137
|
+
backoff. [Logs API](https://documentation.mailgun.com/docs/mailgun/api-reference/send/mailgun/logs).
|
|
138
|
+
|
|
139
|
+
## Repair proof and remaining acceptance
|
|
140
|
+
|
|
141
|
+
`test/mailgun.test.js` exercises the actual connection service with controlled HTTP:
|
|
142
|
+
US/EU multipart sends, repeated recipients, domain creation/read/verification,
|
|
143
|
+
DNS status preservation, delivery failures, pagination, app isolation, denied
|
|
144
|
+
operations, invalid inputs, 401/429 and uncertain writes. Three tests pass.
|
|
145
|
+
No Mailgun account or actual email delivery was used. The inline credential guide
|
|
146
|
+
must be reviewed in the public editor before provider acceptance is closed.
|
|
147
|
+
|
|
148
|
+
**LIMITATIONS:** No attachments, stored templates, campaign/mailing-list UI, inbound
|
|
149
|
+
routes, webhook receiver or editor-assistant attachment. Example: send and track
|
|
150
|
+
a receipt email, but not attach its PDF through this adapter. Application-native
|
|
151
|
+
mail settings/business rules own sender and recipient authorization, content,
|
|
152
|
+
polling and duplicate prevention. CLI apps use the same configuration and Env;
|
|
153
|
+
other frameworks compose these requests with their own HTTP/mail tools.
|