@jskit-ai/connectors-catalog 0.1.67 → 0.2.0
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/CHANGELOG.md +1722 -0
- package/README.md +11 -0
- package/locales/en.json +3139 -0
- package/package.json +7 -6
- package/src/server/ai.js +4 -4
- package/src/server/amazon-redshift.js +5 -5
- package/src/server/apify.js +1 -1
- package/src/server/apollo-io.js +1 -1
- package/src/server/asana.js +3 -3
- package/src/server/ashby.js +3 -3
- package/src/server/attention.js +2 -2
- package/src/server/aws-athena.js +3 -3
- package/src/server/aws-s3.js +1 -1
- package/src/server/awsTransport.js +9 -9
- package/src/server/brevo.js +3 -3
- package/src/server/calendly.js +2 -2
- package/src/server/chargebee.js +1 -1
- package/src/server/databricks.js +2 -2
- package/src/server/dbt-semantic-layer.js +8 -8
- package/src/server/elevenlabs.js +4 -4
- package/src/server/firebase-cloud-messaging.js +8 -8
- package/src/server/firecrawl.js +2 -2
- package/src/server/gatewayapi.js +4 -4
- package/src/server/github-api.js +3 -3
- package/src/server/gitlab-api.js +1 -1
- package/src/server/gmail.js +1 -1
- package/src/server/gong.js +4 -4
- package/src/server/google-ads-search.js +16 -16
- package/src/server/google-ads.js +7 -7
- package/src/server/google-drive.js +8 -6
- package/src/server/google-maps-platform.js +5 -5
- package/src/server/google-search-console.js +1 -1
- package/src/server/google-sheets.js +3 -2
- package/src/server/google.js +3 -2
- package/src/server/granola.js +5 -5
- package/src/server/hubspot.js +5 -3
- package/src/server/inngest.js +4 -4
- package/src/server/klipy.js +1 -1
- package/src/server/lightspeed.js +4 -4
- package/src/server/linear.js +2 -2
- package/src/server/linkedin.js +6 -6
- package/src/server/mapbox.js +1 -1
- package/src/server/mcpRegistration.js +3 -2
- package/src/server/mcpTransport.js +1 -1
- package/src/server/microsoft-fabric.js +3 -3
- package/src/server/microsoft-onedrive.js +1 -1
- package/src/server/microsoft-onenote.js +1 -1
- package/src/server/microsoft-outlook.js +1 -1
- package/src/server/microsoft.js +4 -3
- package/src/server/n8n.js +4 -4
- package/src/server/oura.js +1 -1
- package/src/server/paddle.js +1 -1
- package/src/server/pipedrive.js +4 -4
- package/src/server/posthog.js +3 -3
- package/src/server/salesforce.js +8 -8
- package/src/server/semrush.js +25 -25
- package/src/server/shopify.js +6 -6
- package/src/server/slack.js +10 -10
- package/src/server/snowflake.js +5 -5
- package/src/server/tally.js +1 -1
- package/src/server/telegram.js +1 -1
- package/src/server/tiktok.js +14 -14
- package/src/server/twilio.js +3 -3
- package/src/server/twitch.js +22 -21
- package/src/server/wave.js +34 -34
- package/src/server/wix.js +73 -73
- package/src/server/wiz.js +18 -18
- package/src/server/woocommerce.js +23 -23
- package/src/server/wordpress-com.js +3 -3
- package/src/server/wordpress-self-hosted.js +2 -2
- package/src/server/workday.js +3 -3
- package/src/server/x-twitter.js +6 -6
- package/src/server/xero.js +15 -15
- package/src/server/zoho-books.js +8 -8
- package/src/server/zoho-crm.js +5 -5
- package/src/server/zohoOAuth.js +1 -1
- package/src/shared/ai.js +24 -13
- package/src/shared/algolia.js +4 -4
- package/src/shared/amazon-redshift.js +16 -16
- package/src/shared/amplitude.js +6 -6
- package/src/shared/atlassian.js +19 -19
- package/src/shared/aws.js +18 -18
- package/src/shared/canva.js +18 -18
- package/src/shared/chargebee.js +3 -3
- package/src/shared/clickhouse.js +9 -9
- package/src/shared/confidence.js +6 -6
- package/src/shared/databricks.js +8 -8
- package/src/shared/dbt-semantic-layer.js +7 -7
- package/src/shared/english-ai.js +6 -0
- package/src/shared/english-definitions.js +34 -0
- package/src/shared/english-texts.js +7 -0
- package/src/shared/figma.js +2 -2
- package/src/shared/firebase-cloud-messaging.js +11 -11
- package/src/shared/firecrawl.js +1 -1
- package/src/shared/gemini-enterprise.js +7 -7
- package/src/shared/gong.js +5 -5
- package/src/shared/google-ads.js +5 -5
- package/src/shared/google-maps-platform.js +7 -7
- package/src/shared/google.js +40 -40
- package/src/shared/granola.js +5 -5
- package/src/shared/hex.js +7 -7
- package/src/shared/inngest.js +8 -8
- package/src/shared/lightspeed.js +52 -52
- package/src/shared/linkedin.js +6 -6
- package/src/shared/logo-dev.js +3 -3
- package/src/shared/mapbox.js +6 -6
- package/src/shared/mcp.js +9 -9
- package/src/shared/microsoft-fabric.js +9 -9
- package/src/shared/microsoft.js +52 -52
- package/src/shared/miro.js +5 -5
- package/src/shared/oura.js +5 -5
- package/src/shared/posthog.js +9 -9
- package/src/shared/prestashop.js +5 -5
- package/src/shared/resend.js +1 -1
- package/src/shared/salesforce.js +8 -8
- package/src/shared/semrush.js +6 -6
- package/src/shared/shopify.js +26 -26
- package/src/shared/slack.js +61 -61
- package/src/shared/snowflake.js +15 -15
- package/src/shared/tiktok.js +7 -7
- package/src/shared/tokens.js +126 -126
- package/src/shared/twilio.js +7 -7
- package/src/shared/twitch.js +24 -24
- package/src/shared/wave.js +33 -33
- package/src/shared/wix.js +5 -5
- package/src/shared/wiz.js +14 -14
- package/src/shared/wordpress-com.js +9 -9
- package/src/shared/wordpress.js +11 -11
- package/src/shared/workday.js +8 -8
- package/src/shared/x-twitter.js +5 -5
- package/src/shared/xero.js +25 -25
- package/src/shared/zoho-books.js +10 -10
- package/src/shared/zoho-crm.js +16 -16
- package/src/shared/zoho-regions.js +8 -8
- package/test/englishDefinitions.test.js +37 -0
- package/test/i18nCatalog.test.js +16 -0
- package/test/shopify.test.js +3 -1
package/src/shared/google-ads.js
CHANGED
|
@@ -5,15 +5,15 @@ const common = {
|
|
|
5
5
|
validator: (value) => /^[0-9]{10}$/u.test(value) || "Enter the manager's 10-digit customer ID without hyphens." }
|
|
6
6
|
};
|
|
7
7
|
const googleAdsDefinition = Object.freeze({
|
|
8
|
-
id: "google-ads", name: "Google Ads", description: "
|
|
8
|
+
id: "google-ads", name: "Google Ads", description: "jskit.connectors.googleAds.description",
|
|
9
9
|
accountModes: ["shared", "per-user", "assistant"], authenticationMethods: ["oauth2"],
|
|
10
10
|
settingsSchema: createSchema(common),
|
|
11
11
|
settingsFields: [
|
|
12
|
-
{ name: "loginCustomerId", label: "
|
|
13
|
-
hint: "
|
|
12
|
+
{ name: "loginCustomerId", label: "jskit.connectors.googleAds.fields.loginCustomerId.label", placeholder: "1234567890",
|
|
13
|
+
hint: "jskit.connectors.googleAds.fields.loginCustomerId.hint" }
|
|
14
14
|
],
|
|
15
|
-
scopes: [{ value: "https://www.googleapis.com/auth/adwords", label: "
|
|
16
|
-
permissionsHint: "
|
|
15
|
+
scopes: [{ value: "https://www.googleapis.com/auth/adwords", label: "jskit.connectors.googleAds.scopes.httpsWwwGoogleapisComAuthAdwords.label", recommended: true }],
|
|
16
|
+
permissionsHint: "jskit.connectors.googleAds.permissionsHint",
|
|
17
17
|
setup: { url: "https://developers.google.com/google-ads/api/docs/get-started/make-first-call", steps: [
|
|
18
18
|
"Select your Google Cloud project, open APIs & Services > Library and enable Google Ads API. Open its Overview page and review API access level. Test access only permits test accounts; use Upgrade access level to apply for production access.",
|
|
19
19
|
"In Google Auth Platform, configure Branding and Audience, adding test users while testing. In Data Access add https://www.googleapis.com/auth/adwords. Complete the applicable consent publishing and verification requirements.",
|
|
@@ -2,15 +2,15 @@ import { createSchema } from "json-rest-schema";
|
|
|
2
2
|
import { secretReference } from "@jskit-ai/connectors-core/shared/configuration";
|
|
3
3
|
|
|
4
4
|
const googleMapsPlatformDefinition = Object.freeze({
|
|
5
|
-
id: "google-maps-platform", name: "Google Maps Platform", description: "
|
|
5
|
+
id: "google-maps-platform", name: "Google Maps Platform", description: "jskit.connectors.googleMapsPlatform.description",
|
|
6
6
|
accountModes: ["shared", "assistant"], authenticationMethods: ["api-key"], scopes: [],
|
|
7
|
-
apiKeyReferenceLabel: "
|
|
8
|
-
verificationFields: [{ name: "address", required: true, label: "
|
|
9
|
-
hint: "
|
|
10
|
-
apiKeyReferenceHint: "
|
|
7
|
+
apiKeyReferenceLabel: "jskit.connectors.googleMapsPlatform.apiKeyReferenceLabel",
|
|
8
|
+
verificationFields: [{ name: "address", required: true, label: "jskit.connectors.googleMapsPlatform.verificationFields.address.label",
|
|
9
|
+
hint: "jskit.connectors.googleMapsPlatform.verificationFields.address.hint" }],
|
|
10
|
+
apiKeyReferenceHint: "jskit.connectors.googleMapsPlatform.apiKeyReferenceHint",
|
|
11
11
|
settingsSchema: createSchema({ browserKeyRef: { ...secretReference, required: false }, mapId: { type: "string", maxLength: 100, validator: value => /^[A-Za-z0-9_-]+$/.test(value) || "Use the map ID from Google Cloud." } }),
|
|
12
|
-
settingsFields: [{ name: "mapId", label: "
|
|
13
|
-
hint: "
|
|
12
|
+
settingsFields: [{ name: "mapId", label: "jskit.connectors.googleMapsPlatform.fields.mapId.label", hint: "jskit.connectors.googleMapsPlatform.fields.mapId.hint" }, { name: "browserKeyRef", label: "jskit.connectors.googleMapsPlatform.fields.browserKeyRef.label", placeholder: "env:GOOGLE_MAPS_BROWSER_KEY",
|
|
13
|
+
hint: "jskit.connectors.googleMapsPlatform.fields.browserKeyRef.hint" }],
|
|
14
14
|
setup: {
|
|
15
15
|
url: "https://developers.google.com/maps/documentation/geocoding/guides-v3/get-api-key",
|
|
16
16
|
steps: [
|
package/src/shared/google.js
CHANGED
|
@@ -23,63 +23,63 @@ function definition(id, name, api, description, recommended, permissions, verifi
|
|
|
23
23
|
});
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
-
const gmailDefinition = definition("gmail", "Gmail", "Gmail API", "
|
|
27
|
-
["gmail.readonly", "
|
|
28
|
-
["gmail.modify", "
|
|
29
|
-
["gmail.insert", "
|
|
30
|
-
["https://mail.google.com/", "
|
|
31
|
-
["gmail.addons.current.message.readonly", "
|
|
32
|
-
["gmail.addons.current.message.metadata", "
|
|
26
|
+
const gmailDefinition = definition("gmail", "Gmail", "Gmail API", "jskit.connectors.gmail.description", ["gmail.readonly", "gmail.send", "gmail.compose", "gmail.modify"], [
|
|
27
|
+
["gmail.readonly", "jskit.connectors.gmail.scopes.gmailReadonly.label", true], ["gmail.send", "jskit.connectors.gmail.scopes.gmailSend.label"], ["gmail.compose", "jskit.connectors.gmail.scopes.gmailCompose.label"],
|
|
28
|
+
["gmail.modify", "jskit.connectors.gmail.scopes.gmailModify.label"], ["gmail.labels", "jskit.connectors.gmail.scopes.gmailLabels.label"], ["gmail.metadata", "jskit.connectors.gmail.scopes.gmailMetadata.label"],
|
|
29
|
+
["gmail.insert", "jskit.connectors.gmail.scopes.gmailInsert.label"], ["gmail.settings.basic", "jskit.connectors.gmail.scopes.gmailSettingsBasic.label"], ["gmail.settings.sharing", "jskit.connectors.gmail.scopes.gmailSettingsSharing.label"],
|
|
30
|
+
["https://mail.google.com/", "jskit.connectors.gmail.scopes.httpsMailGoogleCom.label"],
|
|
31
|
+
["gmail.addons.current.message.readonly", "jskit.connectors.gmail.scopes.gmailAddonsCurrentMessageReadonly.label"], ["gmail.addons.current.message.action", "jskit.connectors.gmail.scopes.gmailAddonsCurrentMessageAction.label"],
|
|
32
|
+
["gmail.addons.current.message.metadata", "jskit.connectors.gmail.scopes.gmailAddonsCurrentMessageMetadata.label"], ["gmail.addons.current.action.compose", "jskit.connectors.gmail.scopes.gmailAddonsCurrentActionCompose.label"]
|
|
33
33
|
], [], [
|
|
34
34
|
"For inbox reading, retain Read messages (gmail.readonly) and deselect optional sending or editing permissions your application does not use. Gmail read access is restricted: check Google's restricted-scope review and server-data security assessment requirements before public release.",
|
|
35
35
|
"Read messages gives full bodies, search and attachments. Send messages permits sending; Manage drafts and send messages permits drafts; Read and modify messages permits marking read, archiving and moving mail to trash. Adding permission requires reconnecting. Connect only reads the mailbox profile and never sends or edits mail.",
|
|
36
36
|
"The app builds MIME messages with its framework, renders mail safely and authorizes each mailbox user. A send receipt is not proof of delivery. No automatic retry occurs after an uncertain send; check Sent before retrying. No background sync or permanent-delete operation is supplied.",
|
|
37
37
|
"Leave Manage sharing settings unselected: its operations require a Workspace service account with domain-wide delegation, which this Web application connection does not configure. Add-on permissions apply only to an actual Gmail add-on; they do not replace mailbox permissions."
|
|
38
38
|
]);
|
|
39
|
-
const googleDriveDefinition = definition("google-drive", "Google Drive", "Google Drive API", "
|
|
40
|
-
["drive.metadata.readonly", "
|
|
41
|
-
["drive", "
|
|
42
|
-
["drive.appfolder", "
|
|
43
|
-
["drive.apps.readonly", "
|
|
44
|
-
["drive.photos.readonly", "
|
|
45
|
-
["drive.activity", "
|
|
39
|
+
const googleDriveDefinition = definition("google-drive", "Google Drive", "Google Drive API", "jskit.connectors.googleDrive.description", ["drive.file", "drive.appdata", "drive.appfolder", "drive.readonly"], [
|
|
40
|
+
["drive.metadata.readonly", "jskit.connectors.googleDrive.scopes.driveMetadataReadonly.label"], ["drive.file", "jskit.connectors.googleDrive.scopes.driveFile.label", true], ["drive.readonly", "jskit.connectors.googleDrive.scopes.driveReadonly.label"],
|
|
41
|
+
["drive", "jskit.connectors.googleDrive.scopes.drive.label"], ["drive.metadata", "jskit.connectors.googleDrive.scopes.driveMetadata.label"], ["drive.appdata", "jskit.connectors.googleDrive.scopes.driveAppdata.label"],
|
|
42
|
+
["drive.appfolder", "jskit.connectors.googleDrive.scopes.driveAppfolder.label"],
|
|
43
|
+
["drive.apps.readonly", "jskit.connectors.googleDrive.scopes.driveAppsReadonly.label"], ["drive.meet.readonly", "jskit.connectors.googleDrive.scopes.driveMeetReadonly.label"],
|
|
44
|
+
["drive.photos.readonly", "jskit.connectors.googleDrive.scopes.drivePhotosReadonly.label"], ["drive.scripts", "jskit.connectors.googleDrive.scopes.driveScripts.label"],
|
|
45
|
+
["drive.activity", "jskit.connectors.googleDrive.scopes.driveActivity.label"], ["drive.activity.readonly", "jskit.connectors.googleDrive.scopes.driveActivityReadonly.label"]
|
|
46
46
|
], [], [
|
|
47
47
|
"Select only the file access your application needs. With drive.file, users must select or open files through your application's file-picker flow, or the application must create them. Pasting an existing file ID alone does not grant access. App-data permissions do not grant access to ordinary Drive files.",
|
|
48
48
|
"The app can upload files up to 5 MB and download/export up to 8 MiB with this adapter. Google Docs/Sheets/Slides require export to a supported MIME type; ordinary stored files use download. Larger or resumable transfers need the framework's native client.",
|
|
49
49
|
"Use file capabilities and sharing access before offering writes. Uploading with an existing file ID replaces its content and name; moving a file to trash is an explicit metadata update. The app owns file selection, safe rendering and ambiguous-transfer reconciliation. No sync service or embedded Google Picker is installed.",
|
|
50
50
|
"Broad Drive read or management permissions are restricted scopes. Review Google's verification and server-data security assessment requirements before public release. An empty file list with drive.file can mean no files have yet been shared with this application."
|
|
51
51
|
]);
|
|
52
|
-
const drivePermissions = [["drive.file", "
|
|
53
|
-
const googleSheetsDefinition = definition("google-sheets", "Google Sheets", "Google Sheets API", "
|
|
54
|
-
["spreadsheets.readonly", "
|
|
55
|
-
["drive.metadata.readonly", "
|
|
56
|
-
], [{ name: "spreadsheetId", required: false, label: "
|
|
52
|
+
const drivePermissions = [["drive.file", "jskit.connectors.google.scopes.driveFile.label"], ["drive.readonly", "jskit.connectors.google.scopes.driveReadonly.label"], ["drive", "jskit.connectors.google.scopes.drive.label"]];
|
|
53
|
+
const googleSheetsDefinition = definition("google-sheets", "Google Sheets", "Google Sheets API", "jskit.connectors.googleSheets.description", "drive.file", [
|
|
54
|
+
["spreadsheets.readonly", "jskit.connectors.googleSheets.scopes.spreadsheetsReadonly.label"], ["spreadsheets", "jskit.connectors.googleSheets.scopes.spreadsheets.label"],
|
|
55
|
+
["drive.metadata.readonly", "jskit.connectors.googleSheets.scopes.driveMetadataReadonly.label"], ...drivePermissions
|
|
56
|
+
], [{ name: "spreadsheetId", required: false, label: "jskit.connectors.googleSheets.verificationFields.spreadsheetId.label", hint: "jskit.connectors.googleSheets.verificationFields.spreadsheetId.hint" }], [
|
|
57
57
|
"For create-first access, retain Access files selected for this application (drive.file) and also enable Google Drive API in APIs & Services > Library. Leave Spreadsheet ID blank: verification reads accessible Drive metadata and accepts an empty list. It does not create a spreadsheet or prove Sheets API is enabled.",
|
|
58
58
|
"With drive.file, the app can create and edit its own spreadsheets. An existing file needs Google Picker or an app-open grant; pasting an ID alone does not grant access. For spreadsheets.readonly-only or spreadsheets-only access, supply an accessible Spreadsheet ID. Adding write permissions requires reconnecting.",
|
|
59
59
|
"Value writes default to RAW so untrusted strings are not interpreted as formulas. Choose USER_ENTERED explicitly for formulas and locale-dependent parsing. Ranges use A1 notation; quote sheet titles with spaces. Appending finds the next row in the table, not necessarily the requested start cell; uncertain writes are never automatically retried.",
|
|
60
60
|
"The app can create spreadsheets, update or append rows, clear values, and send bounded native batch requests for sheets and formatting. Clear preserves formatting. The app owns conflict handling, file selection and its data UI; this form installs neither a spreadsheet editor nor editor-assistant tools."
|
|
61
61
|
]);
|
|
62
|
-
const googleDocsDefinition = definition("google-docs", "Google Docs", "Google Docs API", "
|
|
63
|
-
["documents.readonly", "
|
|
64
|
-
], [{ name: "documentId", required: false, label: "
|
|
62
|
+
const googleDocsDefinition = definition("google-docs", "Google Docs", "Google Docs API", "jskit.connectors.googleDocs.description", "drive.file", [
|
|
63
|
+
["documents.readonly", "jskit.connectors.googleDocs.scopes.documentsReadonly.label"], ["documents", "jskit.connectors.googleDocs.scopes.documents.label"], ...drivePermissions
|
|
64
|
+
], [{ name: "documentId", required: false, label: "jskit.connectors.googleDocs.verificationFields.documentId.label", hint: "jskit.connectors.googleDocs.verificationFields.documentId.hint" }], [
|
|
65
65
|
"For create-first access, retain Access files selected for this application (drive.file) and also enable Google Drive API in APIs & Services > Library. Leave Document ID blank: connection checks accessible Drive metadata and accepts an empty list; it does not create a document or prove Docs API is enabled.",
|
|
66
66
|
"With drive.file the app can create and edit its own documents. For existing files, use Google Picker or an app-open flow to grant this application access; pasting an ID alone does not grant access. Picker wiring belongs to the app.",
|
|
67
67
|
"For documents.readonly-only or documents-only access, supply an accessible Document ID for verification. Manage documents enables writing documents accessible to the account; adding permissions requires reconnecting. Broad Drive permissions can require restricted-scope review.",
|
|
68
68
|
"Create a blank document, then insert content with documents.batchUpdate. The app owns tab IDs, UTF-16 text indices, formatting requests and revision conflict handling. No editor-assistant attachment or visual document editor is installed by this form."
|
|
69
69
|
]);
|
|
70
|
-
const googleSlidesDefinition = definition("google-slides", "Google Slides", "Google Slides API", "
|
|
71
|
-
["presentations.readonly", "
|
|
72
|
-
["spreadsheets.readonly", "
|
|
73
|
-
], [{ name: "presentationId", required: false, label: "
|
|
70
|
+
const googleSlidesDefinition = definition("google-slides", "Google Slides", "Google Slides API", "jskit.connectors.googleSlides.description", "drive.file", [
|
|
71
|
+
["presentations.readonly", "jskit.connectors.googleSlides.scopes.presentationsReadonly.label"], ["presentations", "jskit.connectors.googleSlides.scopes.presentations.label"],
|
|
72
|
+
["spreadsheets.readonly", "jskit.connectors.googleSlides.scopes.spreadsheetsReadonly.label"], ["spreadsheets", "jskit.connectors.googleSlides.scopes.spreadsheets.label"], ...drivePermissions
|
|
73
|
+
], [{ name: "presentationId", required: false, label: "jskit.connectors.googleSlides.verificationFields.presentationId.label", hint: "jskit.connectors.googleSlides.verificationFields.presentationId.hint" }], [
|
|
74
74
|
"For create-first access, retain Access files selected for this application (drive.file) and enable Google Drive API as well as Google Slides API in APIs & Services > Library. Leave Presentation ID blank: verification reads Drive metadata and accepts an empty list; it neither creates a deck nor proves Slides API is enabled.",
|
|
75
75
|
"The app can create and edit its own decks with drive.file. Existing decks need an app-open or Google Picker grant; a pasted ID alone is insufficient. For presentations.readonly-only or presentations-only access, supply an accessible Presentation ID. Additional permissions require reconnecting; spreadsheet permissions alone do not grant deck access.",
|
|
76
76
|
"Create a blank presentation, then use native batch requests to add slides, text, images or formatting. The app owns object IDs, positions, linked-chart access and revision conflict handling. Images must be reachable by Google; thumbnails return temporary URLs that should not be logged or stored as permanent public assets.",
|
|
77
77
|
"No slide designer, template catalogue, embedded Picker or editor-assistant attachment is installed. Copying, sharing, exporting or deleting the whole deck uses the separate Drive API. An uncertain create or edit is not automatically retried."
|
|
78
78
|
]);
|
|
79
|
-
const googleSearchConsoleDefinition = definition("google-search-console", "Google Search Console", "Google Search Console API", "
|
|
80
|
-
["webmasters.readonly", "
|
|
81
|
-
["siteverification", "
|
|
82
|
-
["siteverification.verify_only", "
|
|
79
|
+
const googleSearchConsoleDefinition = definition("google-search-console", "Google Search Console", "Google Search Console API", "jskit.connectors.googleSearchConsole.description", "webmasters.readonly", [
|
|
80
|
+
["webmasters.readonly", "jskit.connectors.googleSearchConsole.scopes.webmastersReadonly.label"], ["webmasters", "jskit.connectors.googleSearchConsole.scopes.webmasters.label"],
|
|
81
|
+
["siteverification", "jskit.connectors.googleSearchConsole.scopes.siteverification.label"],
|
|
82
|
+
["siteverification.verify_only", "jskit.connectors.googleSearchConsole.scopes.siteverificationVerifyOnly.label"]
|
|
83
83
|
], [], [
|
|
84
84
|
"The connecting Google account needs access to the intended Search Console property. A property owner can open that property, choose Settings > Users and permissions > Add user, enter the account email, choose the appropriate role and save.",
|
|
85
85
|
"To add a property, open Search Console > property selector > Add property. Domain properties require your DNS provider's TXT record; URL-prefix properties offer verification methods such as an HTML file or tag. Follow Google's displayed instructions and Verify, or have an existing owner add this account. An OAuth grant does not verify domain ownership.",
|
|
@@ -88,17 +88,17 @@ const googleSearchConsoleDefinition = definition("google-search-console", "Googl
|
|
|
88
88
|
"Keep Read Search Console properties for the initial check, which lists accessible properties. Site Verification permissions alone do not authorize that check or create property access. An empty result can mean this Google account has no properties."
|
|
89
89
|
]);
|
|
90
90
|
const googleAnalyticsDefinition = Object.freeze({
|
|
91
|
-
id: "google-analytics", name: "Google Analytics", description: "
|
|
91
|
+
id: "google-analytics", name: "Google Analytics", description: "jskit.connectors.googleAnalytics.description",
|
|
92
92
|
configurationOnly: true,
|
|
93
93
|
accountModes: ["shared"], authenticationMethods: ["none"], scopes: [],
|
|
94
|
-
authenticationLabels: { none: "
|
|
95
|
-
authenticationHint: "
|
|
94
|
+
authenticationLabels: { none: "jskit.connectors.googleAnalytics.authenticationLabels.none" },
|
|
95
|
+
authenticationHint: "jskit.connectors.googleAnalytics.authenticationHint",
|
|
96
96
|
settingsSchema: createSchema({ measurementId: {
|
|
97
97
|
type: "string", required: true, minLength: 3, maxLength: 64,
|
|
98
98
|
validator: (value) => /^G-[A-Z0-9]+$/u.test(value) || "Enter the GA4 web stream Measurement ID beginning G-."
|
|
99
99
|
} }),
|
|
100
|
-
settingsFields: [{ name: "measurementId", label: "
|
|
101
|
-
hint: "
|
|
100
|
+
settingsFields: [{ name: "measurementId", label: "jskit.connectors.googleAnalytics.fields.measurementId.label", required: true,
|
|
101
|
+
hint: "jskit.connectors.googleAnalytics.fields.measurementId.hint" }],
|
|
102
102
|
setup: {
|
|
103
103
|
url: "https://support.google.com/analytics/answer/9304153",
|
|
104
104
|
steps: [
|
|
@@ -113,9 +113,9 @@ const googleAnalyticsDefinition = Object.freeze({
|
|
|
113
113
|
]
|
|
114
114
|
}
|
|
115
115
|
});
|
|
116
|
-
const bigqueryDefinition = Object.freeze({ ...definition("bigquery", "BigQuery", "BigQuery API", "
|
|
117
|
-
["bigquery.readonly", "
|
|
118
|
-
["cloud-platform.read-only", "
|
|
116
|
+
const bigqueryDefinition = Object.freeze({ ...definition("bigquery", "BigQuery", "BigQuery API", "jskit.connectors.bigquery.description", "bigquery", [
|
|
117
|
+
["bigquery.readonly", "jskit.connectors.bigquery.scopes.bigqueryReadonly.label"], ["bigquery", "jskit.connectors.bigquery.scopes.bigquery.label"],
|
|
118
|
+
["cloud-platform.read-only", "jskit.connectors.bigquery.scopes.cloudPlatformReadOnly.label"], ["cloud-platform", "jskit.connectors.bigquery.scopes.cloudPlatform.label"]
|
|
119
119
|
], [], [
|
|
120
120
|
"In the project that will run queries, open IAM & Admin > IAM > Grant access. Add the connecting Google account and grant BigQuery Job User when it must create query jobs. OAuth consent alone does not grant project or dataset access.",
|
|
121
121
|
"In BigQuery Studio, select the intended dataset in Explorer, choose Sharing > Permissions > Add principal, and grant only the needed dataset role, such as BigQuery Data Viewer for reading data and metadata. A dataset administrator must make this grant. Repeat for any source dataset the authorized queries use.",
|
|
@@ -126,8 +126,8 @@ const bigqueryDefinition = Object.freeze({ ...definition("bigquery", "BigQuery",
|
|
|
126
126
|
type: "string", required: true, minLength: 6, maxLength: 30,
|
|
127
127
|
validator: (value) => /^[a-z][a-z0-9-]{4,28}[a-z0-9]$/u.test(value) || "Enter the Google Cloud project ID, not its number or URL."
|
|
128
128
|
} }),
|
|
129
|
-
settingsFields: [{ name: "projectId", label: "
|
|
130
|
-
hint: "
|
|
129
|
+
settingsFields: [{ name: "projectId", label: "jskit.connectors.bigquery.fields.projectId.label", required: true,
|
|
130
|
+
hint: "jskit.connectors.bigquery.fields.projectId.hint" }]
|
|
131
131
|
});
|
|
132
132
|
const googleDefinitions = Object.freeze([gmailDefinition, googleDriveDefinition, googleSheetsDefinition, googleDocsDefinition, googleSlidesDefinition, googleSearchConsoleDefinition, googleAnalyticsDefinition, bigqueryDefinition]);
|
|
133
133
|
export { gmailDefinition, googleDriveDefinition, googleSheetsDefinition, googleDocsDefinition, googleSlidesDefinition, googleSearchConsoleDefinition, googleAnalyticsDefinition, bigqueryDefinition, googleDefinitions };
|
package/src/shared/granola.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
const granolaDefinition = Object.freeze({
|
|
2
|
-
id: "granola", name: "Granola", description: "
|
|
2
|
+
id: "granola", name: "Granola", description: "jskit.connectors.granola.description",
|
|
3
3
|
accountModes: ["shared", "assistant"], authenticationMethods: ["api-key", "oauth2"], scopes: [
|
|
4
|
-
{ value: "openid", label: "
|
|
5
|
-
{ value: "profile", label: "
|
|
6
|
-
{ value: "email", label: "
|
|
7
|
-
{ value: "offline_access", label: "
|
|
4
|
+
{ value: "openid", label: "jskit.connectors.granola.scopes.openid.label", recommended: true, authenticationMethods: ["oauth2"] },
|
|
5
|
+
{ value: "profile", label: "jskit.connectors.granola.scopes.profile.label", recommended: true, authenticationMethods: ["oauth2"] },
|
|
6
|
+
{ value: "email", label: "jskit.connectors.granola.scopes.email.label", recommended: true, authenticationMethods: ["oauth2"] },
|
|
7
|
+
{ value: "offline_access", label: "jskit.connectors.granola.scopes.offlineAccess.label", recommended: true, authenticationMethods: ["oauth2"] }
|
|
8
8
|
],
|
|
9
9
|
setup: { urlByAuthentication: { oauth2: "https://docs.granola.ai/help-center/sharing/integrations/mcp" }, clientRegistrationEndpoint: "https://mcp-auth.granola.ai/oauth2/register", url: "https://docs.granola.ai/help-center/sharing/integrations/granola-api", steps: [
|
|
10
10
|
"API key: In the Granola desktop app, open Settings, Connectors, API keys, then Create new key. Choose the note access scopes and Generate API Key.",
|
package/src/shared/hex.js
CHANGED
|
@@ -3,17 +3,17 @@ import { createSchema } from "json-rest-schema";
|
|
|
3
3
|
const hexHosts = Object.freeze({ standard: "app.hex.tech", eu: "eu.hex.tech", hipaa: "hc.hex.tech" });
|
|
4
4
|
const hexEndpointField = { type: "string", enum: Object.keys(hexHosts), defaultTo: "standard" };
|
|
5
5
|
const hexDefinition = Object.freeze({
|
|
6
|
-
id: "hex", name: "Hex", description: "
|
|
6
|
+
id: "hex", name: "Hex", description: "jskit.connectors.hex.description",
|
|
7
7
|
accountModes: ["assistant"], authenticationMethods: ["oauth2"],
|
|
8
8
|
scopes: [
|
|
9
|
-
{ value: "openid", label: "
|
|
10
|
-
{ value: "profile", label: "
|
|
11
|
-
{ value: "email", label: "
|
|
12
|
-
{ value: "offline_access", label: "
|
|
9
|
+
{ value: "openid", label: "jskit.connectors.hex.scopes.openid.label", recommended: true },
|
|
10
|
+
{ value: "profile", label: "jskit.connectors.hex.scopes.profile.label", recommended: true },
|
|
11
|
+
{ value: "email", label: "jskit.connectors.hex.scopes.email.label", recommended: true },
|
|
12
|
+
{ value: "offline_access", label: "jskit.connectors.hex.scopes.offlineAccess.label", recommended: true }
|
|
13
13
|
],
|
|
14
14
|
settingsSchema: createSchema({ endpoint: hexEndpointField }),
|
|
15
|
-
settingsFields: [{ name: "endpoint", label: "
|
|
16
|
-
items: [{ value: "standard", title: "
|
|
15
|
+
settingsFields: [{ name: "endpoint", label: "jskit.connectors.hex.fields.endpoint.label", hint: "jskit.connectors.hex.fields.endpoint.hint",
|
|
16
|
+
items: [{ value: "standard", title: "jskit.connectors.hex.fields.endpoint.items.standard.title" }, { value: "eu", title: "jskit.connectors.hex.fields.endpoint.items.eu.title" }, { value: "hipaa", title: "jskit.connectors.hex.fields.endpoint.items.hipaa.title" }] }],
|
|
17
17
|
setup: { clientRegistrationEndpoint: (settings) => `https://auth.${hexHosts[settings.endpoint || "standard"]}/oauth2/register`, url: "https://learn.hex.tech/docs/api-integrations/mcp-server", steps: [
|
|
18
18
|
"Confirm your Hex workspace has MCP access and your role is Explorer or higher. Hex currently requires a Team or Enterprise plan.",
|
|
19
19
|
"Choose Standard, Europe or HIPAA in Hex workspace endpoint to match where you sign into Hex. Confirm the Suggested callback URL is the exact route your assistant host will serve. Keep the identity, profile, email and refresh permissions selected.",
|
package/src/shared/inngest.js
CHANGED
|
@@ -2,21 +2,21 @@ import { createSchema } from "json-rest-schema";
|
|
|
2
2
|
import { secretReference } from "@jskit-ai/connectors-core/shared/configuration";
|
|
3
3
|
|
|
4
4
|
const inngestDefinition = Object.freeze({
|
|
5
|
-
id: "inngest", name: "Inngest", description: "
|
|
5
|
+
id: "inngest", name: "Inngest", description: "jskit.connectors.inngest.description",
|
|
6
6
|
accountModes: ["shared", "assistant"], authenticationMethods: ["api-key"], scopes: [],
|
|
7
|
-
apiKeyReferenceLabel: "
|
|
8
|
-
apiKeyReferenceHint: "
|
|
7
|
+
apiKeyReferenceLabel: "jskit.connectors.inngest.apiKeyReferenceLabel",
|
|
8
|
+
apiKeyReferenceHint: "jskit.connectors.inngest.apiKeyReferenceHint",
|
|
9
9
|
settingsSchema: createSchema({
|
|
10
10
|
eventKeyRef: { ...secretReference, required: true },
|
|
11
11
|
branchEnvironment: { type: "string", minLength: 1, maxLength: 255,
|
|
12
12
|
validator: (value) => /^[\x21-\x7e]+$/u.test(value) || "Use an ASCII branch environment without spaces or control characters." }
|
|
13
13
|
}),
|
|
14
14
|
settingsFields: [
|
|
15
|
-
{ name: "eventKeyRef", label: "
|
|
16
|
-
environmentCredential: { label: "
|
|
17
|
-
hint: "
|
|
18
|
-
{ name: "branchEnvironment", label: "
|
|
19
|
-
hint: "
|
|
15
|
+
{ name: "eventKeyRef", label: "jskit.connectors.inngest.fields.eventKeyRef.label", placeholder: "env:INNGEST_EVENT_KEY",
|
|
16
|
+
environmentCredential: { label: "jskit.connectors.inngest.fields.eventKeyRef.environmentCredential.label", public: false },
|
|
17
|
+
hint: "jskit.connectors.inngest.fields.eventKeyRef.hint" },
|
|
18
|
+
{ name: "branchEnvironment", label: "jskit.connectors.inngest.fields.branchEnvironment.label", placeholder: "feature/my-branch",
|
|
19
|
+
hint: "jskit.connectors.inngest.fields.branchEnvironment.hint" }
|
|
20
20
|
],
|
|
21
21
|
setup: {
|
|
22
22
|
url: "https://www.inngest.com/docs/events/creating-an-event-key",
|
package/src/shared/lightspeed.js
CHANGED
|
@@ -1,65 +1,65 @@
|
|
|
1
1
|
import { createSchema } from "json-rest-schema";
|
|
2
2
|
|
|
3
3
|
const lightspeedDefinition = Object.freeze({
|
|
4
|
-
id: "lightspeed", name: "Lightspeed", description: "
|
|
4
|
+
id: "lightspeed", name: "Lightspeed", description: "jskit.connectors.lightspeed.description",
|
|
5
5
|
accountModes: ["shared", "per-user", "assistant"], authenticationMethods: ["oauth2"],
|
|
6
6
|
oauthClientAuthenticationMethods: ["client_secret_post"],
|
|
7
7
|
settingsSchema: createSchema({
|
|
8
8
|
domainPrefix: { type: "string", required: true, minLength: 1, maxLength: 63,
|
|
9
9
|
validator: (value) => /^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/u.test(value) || "Enter the lowercase store prefix without a URL, dots or spaces." }
|
|
10
10
|
}),
|
|
11
|
-
settingsFields: [{ name: "domainPrefix", label: "
|
|
12
|
-
hint: "
|
|
11
|
+
settingsFields: [{ name: "domainPrefix", label: "jskit.connectors.lightspeed.fields.domainPrefix.label", placeholder: "your-store",
|
|
12
|
+
hint: "jskit.connectors.lightspeed.fields.domainPrefix.hint" }],
|
|
13
13
|
scopes: [
|
|
14
|
-
{ value: "retailer:read", label: "
|
|
15
|
-
{ value: "outlets:read", label: "
|
|
16
|
-
{ value: "registers:read", label: "
|
|
17
|
-
{ value: "payment_types:read", label: "
|
|
18
|
-
{ value: "products:read", label: "
|
|
19
|
-
{ value: "products:read:price_books", label: "
|
|
20
|
-
{ value: "inventory:read", label: "
|
|
21
|
-
{ value: "customers:read", label: "
|
|
22
|
-
{ value: "sales:read", label: "
|
|
23
|
-
{ value: "fulfillments:read", label: "
|
|
24
|
-
{ value: "promotions:read", label: "
|
|
25
|
-
{ value: "gift_cards:read", label: "
|
|
26
|
-
{ value: "store_credits:read", label: "
|
|
27
|
-
{ value: "suppliers:read", label: "
|
|
28
|
-
{ value: "taxes:read", label: "
|
|
29
|
-
{ value: "users:read", label: "
|
|
30
|
-
{ value: "audit:read", label: "
|
|
31
|
-
{ value: "business_rules:read", label: "
|
|
32
|
-
{ value: "business_rules:write", label: "
|
|
33
|
-
{ value: "channels:read", label: "
|
|
34
|
-
{ value: "consignments:read", label: "
|
|
35
|
-
{ value: "consignments:write:inventory_count", label: "
|
|
36
|
-
{ value: "consignments:write:stock_order", label: "
|
|
37
|
-
{ value: "consignments:write:stock_transfer", label: "
|
|
38
|
-
{ value: "customers:write", label: "
|
|
39
|
-
{ value: "custom_fields:read", label: "
|
|
40
|
-
{ value: "custom_fields:write", label: "
|
|
41
|
-
{ value: "fulfillments:write", label: "
|
|
42
|
-
{ value: "gift_cards:write:issue", label: "
|
|
43
|
-
{ value: "gift_cards:write:redeem", label: "
|
|
44
|
-
{ value: "inventory:write", label: "
|
|
45
|
-
{ value: "payments:read", label: "
|
|
46
|
-
{ value: "products:write", label: "
|
|
47
|
-
{ value: "products:write:price_books", label: "
|
|
48
|
-
{ value: "promotions:write", label: "
|
|
49
|
-
{ value: "register:close", label: "
|
|
50
|
-
{ value: "register:open", label: "
|
|
51
|
-
{ value: "remote_rules:read", label: "
|
|
52
|
-
{ value: "remote_rules:write", label: "
|
|
53
|
-
{ value: "sales:write", label: "
|
|
54
|
-
{ value: "serial_numbers:read", label: "
|
|
55
|
-
{ value: "serial_numbers:write", label: "
|
|
56
|
-
{ value: "services:read", label: "
|
|
57
|
-
{ value: "services:write", label: "
|
|
58
|
-
{ value: "store_credits:write:issue", label: "
|
|
59
|
-
{ value: "suppliers:write", label: "
|
|
60
|
-
{ value: "taxes:write", label: "
|
|
61
|
-
{ value: "users:write", label: "
|
|
62
|
-
{ value: "webhooks", label: "
|
|
14
|
+
{ value: "retailer:read", label: "jskit.connectors.lightspeed.scopes.retailerRead.label", recommended: true },
|
|
15
|
+
{ value: "outlets:read", label: "jskit.connectors.lightspeed.scopes.outletsRead.label", recommended: true },
|
|
16
|
+
{ value: "registers:read", label: "jskit.connectors.lightspeed.scopes.registersRead.label", recommended: true },
|
|
17
|
+
{ value: "payment_types:read", label: "jskit.connectors.lightspeed.scopes.paymentTypesRead.label", recommended: true },
|
|
18
|
+
{ value: "products:read", label: "jskit.connectors.lightspeed.scopes.productsRead.label", recommended: true },
|
|
19
|
+
{ value: "products:read:price_books", label: "jskit.connectors.lightspeed.scopes.productsReadPriceBooks.label", recommended: true },
|
|
20
|
+
{ value: "inventory:read", label: "jskit.connectors.lightspeed.scopes.inventoryRead.label", recommended: true },
|
|
21
|
+
{ value: "customers:read", label: "jskit.connectors.lightspeed.scopes.customersRead.label", recommended: true },
|
|
22
|
+
{ value: "sales:read", label: "jskit.connectors.lightspeed.scopes.salesRead.label", recommended: true },
|
|
23
|
+
{ value: "fulfillments:read", label: "jskit.connectors.lightspeed.scopes.fulfillmentsRead.label", recommended: true },
|
|
24
|
+
{ value: "promotions:read", label: "jskit.connectors.lightspeed.scopes.promotionsRead.label", recommended: true },
|
|
25
|
+
{ value: "gift_cards:read", label: "jskit.connectors.lightspeed.scopes.giftCardsRead.label", recommended: true },
|
|
26
|
+
{ value: "store_credits:read", label: "jskit.connectors.lightspeed.scopes.storeCreditsRead.label", recommended: true },
|
|
27
|
+
{ value: "suppliers:read", label: "jskit.connectors.lightspeed.scopes.suppliersRead.label", recommended: true },
|
|
28
|
+
{ value: "taxes:read", label: "jskit.connectors.lightspeed.scopes.taxesRead.label", recommended: true },
|
|
29
|
+
{ value: "users:read", label: "jskit.connectors.lightspeed.scopes.usersRead.label", recommended: true },
|
|
30
|
+
{ value: "audit:read", label: "jskit.connectors.lightspeed.scopes.auditRead.label" },
|
|
31
|
+
{ value: "business_rules:read", label: "jskit.connectors.lightspeed.scopes.businessRulesRead.label" },
|
|
32
|
+
{ value: "business_rules:write", label: "jskit.connectors.lightspeed.scopes.businessRulesWrite.label" },
|
|
33
|
+
{ value: "channels:read", label: "jskit.connectors.lightspeed.scopes.channelsRead.label" },
|
|
34
|
+
{ value: "consignments:read", label: "jskit.connectors.lightspeed.scopes.consignmentsRead.label" },
|
|
35
|
+
{ value: "consignments:write:inventory_count", label: "jskit.connectors.lightspeed.scopes.consignmentsWriteInventoryCount.label" },
|
|
36
|
+
{ value: "consignments:write:stock_order", label: "jskit.connectors.lightspeed.scopes.consignmentsWriteStockOrder.label" },
|
|
37
|
+
{ value: "consignments:write:stock_transfer", label: "jskit.connectors.lightspeed.scopes.consignmentsWriteStockTransfer.label" },
|
|
38
|
+
{ value: "customers:write", label: "jskit.connectors.lightspeed.scopes.customersWrite.label" },
|
|
39
|
+
{ value: "custom_fields:read", label: "jskit.connectors.lightspeed.scopes.customFieldsRead.label" },
|
|
40
|
+
{ value: "custom_fields:write", label: "jskit.connectors.lightspeed.scopes.customFieldsWrite.label" },
|
|
41
|
+
{ value: "fulfillments:write", label: "jskit.connectors.lightspeed.scopes.fulfillmentsWrite.label" },
|
|
42
|
+
{ value: "gift_cards:write:issue", label: "jskit.connectors.lightspeed.scopes.giftCardsWriteIssue.label" },
|
|
43
|
+
{ value: "gift_cards:write:redeem", label: "jskit.connectors.lightspeed.scopes.giftCardsWriteRedeem.label" },
|
|
44
|
+
{ value: "inventory:write", label: "jskit.connectors.lightspeed.scopes.inventoryWrite.label" },
|
|
45
|
+
{ value: "payments:read", label: "jskit.connectors.lightspeed.scopes.paymentsRead.label" },
|
|
46
|
+
{ value: "products:write", label: "jskit.connectors.lightspeed.scopes.productsWrite.label" },
|
|
47
|
+
{ value: "products:write:price_books", label: "jskit.connectors.lightspeed.scopes.productsWritePriceBooks.label" },
|
|
48
|
+
{ value: "promotions:write", label: "jskit.connectors.lightspeed.scopes.promotionsWrite.label" },
|
|
49
|
+
{ value: "register:close", label: "jskit.connectors.lightspeed.scopes.registerClose.label" },
|
|
50
|
+
{ value: "register:open", label: "jskit.connectors.lightspeed.scopes.registerOpen.label" },
|
|
51
|
+
{ value: "remote_rules:read", label: "jskit.connectors.lightspeed.scopes.remoteRulesRead.label" },
|
|
52
|
+
{ value: "remote_rules:write", label: "jskit.connectors.lightspeed.scopes.remoteRulesWrite.label" },
|
|
53
|
+
{ value: "sales:write", label: "jskit.connectors.lightspeed.scopes.salesWrite.label" },
|
|
54
|
+
{ value: "serial_numbers:read", label: "jskit.connectors.lightspeed.scopes.serialNumbersRead.label" },
|
|
55
|
+
{ value: "serial_numbers:write", label: "jskit.connectors.lightspeed.scopes.serialNumbersWrite.label" },
|
|
56
|
+
{ value: "services:read", label: "jskit.connectors.lightspeed.scopes.servicesRead.label" },
|
|
57
|
+
{ value: "services:write", label: "jskit.connectors.lightspeed.scopes.servicesWrite.label" },
|
|
58
|
+
{ value: "store_credits:write:issue", label: "jskit.connectors.lightspeed.scopes.storeCreditsWriteIssue.label" },
|
|
59
|
+
{ value: "suppliers:write", label: "jskit.connectors.lightspeed.scopes.suppliersWrite.label" },
|
|
60
|
+
{ value: "taxes:write", label: "jskit.connectors.lightspeed.scopes.taxesWrite.label" },
|
|
61
|
+
{ value: "users:write", label: "jskit.connectors.lightspeed.scopes.usersWrite.label" },
|
|
62
|
+
{ value: "webhooks", label: "jskit.connectors.lightspeed.scopes.webhooks.label" }
|
|
63
63
|
],
|
|
64
64
|
setup: { url: "https://x-series-api.lightspeedhq.com/docs/authorization", steps: [
|
|
65
65
|
"Open developers.retail.lightspeed.app and register a developer account; your retail-store login is separate. Open Applications > Create and register this application's exact Suggested callback URL as its redirect URI.",
|
package/src/shared/linkedin.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
const linkedinDefinition = Object.freeze({
|
|
2
|
-
id: "linkedin", name: "LinkedIn", description: "
|
|
2
|
+
id: "linkedin", name: "LinkedIn", description: "jskit.connectors.linkedin.description",
|
|
3
3
|
accountModes: ["shared", "per-user", "assistant"], authenticationMethods: ["oauth2"],
|
|
4
4
|
scopes: [
|
|
5
|
-
{ value: "openid", label: "
|
|
6
|
-
{ value: "profile", label: "
|
|
7
|
-
{ value: "email", label: "
|
|
8
|
-
{ value: "w_member_social", label: "
|
|
5
|
+
{ value: "openid", label: "jskit.connectors.linkedin.scopes.openid.label", required: true, recommended: true },
|
|
6
|
+
{ value: "profile", label: "jskit.connectors.linkedin.scopes.profile.label", required: true, recommended: true },
|
|
7
|
+
{ value: "email", label: "jskit.connectors.linkedin.scopes.email.label" },
|
|
8
|
+
{ value: "w_member_social", label: "jskit.connectors.linkedin.scopes.wMemberSocial.label" }
|
|
9
9
|
],
|
|
10
|
-
permissionsHint: "
|
|
10
|
+
permissionsHint: "jskit.connectors.linkedin.permissionsHint",
|
|
11
11
|
setup: {
|
|
12
12
|
url: "https://learn.microsoft.com/en-us/linkedin/consumer/integrations/self-serve/sign-in-with-linkedin-v2",
|
|
13
13
|
steps: [
|
package/src/shared/logo-dev.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
const logoDevDefinition = Object.freeze({
|
|
2
|
-
id: "logo-dev", name: "Logo.dev", description: "
|
|
2
|
+
id: "logo-dev", name: "Logo.dev", description: "jskit.connectors.logoDev.description",
|
|
3
3
|
accountModes: ["shared", "assistant"], authenticationMethods: ["api-key"], scopes: [],
|
|
4
4
|
configurationOnly: true,
|
|
5
|
-
apiKeyReferenceLabel: "
|
|
6
|
-
apiKeyReferenceHint: "
|
|
5
|
+
apiKeyReferenceLabel: "jskit.connectors.logoDev.apiKeyReferenceLabel",
|
|
6
|
+
apiKeyReferenceHint: "jskit.connectors.logoDev.apiKeyReferenceHint",
|
|
7
7
|
setup: {
|
|
8
8
|
url: "https://www.logo.dev/docs/platform/api-keys",
|
|
9
9
|
steps: [
|
package/src/shared/mapbox.js
CHANGED
|
@@ -2,19 +2,19 @@ import { createSchema } from "json-rest-schema";
|
|
|
2
2
|
import { secretReference } from "@jskit-ai/connectors-core/shared/configuration";
|
|
3
3
|
|
|
4
4
|
const mapboxDefinition = Object.freeze({
|
|
5
|
-
id: "mapbox", name: "Mapbox", description: "
|
|
5
|
+
id: "mapbox", name: "Mapbox", description: "jskit.connectors.mapbox.description",
|
|
6
6
|
accountModes: ["shared", "assistant"], authenticationMethods: ["api-key", "none"], scopes: [],
|
|
7
7
|
authenticationMethodsForSettings: settings => settings?.usage === "browser" ? ["none"] : ["api-key"],
|
|
8
8
|
configurationOnlyForSettings: settings => settings?.usage === "browser",
|
|
9
|
-
apiKeyReferenceLabel: "
|
|
10
|
-
apiKeyReferenceHint: "
|
|
9
|
+
apiKeyReferenceLabel: "jskit.connectors.mapbox.apiKeyReferenceLabel",
|
|
10
|
+
apiKeyReferenceHint: "jskit.connectors.mapbox.apiKeyReferenceHint",
|
|
11
11
|
settingsSchema: settings => createSchema({
|
|
12
12
|
usage: { type: "string", enum: ["backend", "browser"], defaultTo: "backend" },
|
|
13
13
|
publicTokenRef: { ...secretReference, required: settings?.usage === "browser" }
|
|
14
14
|
}),
|
|
15
|
-
settingsFields: [{ name: "usage", label: "
|
|
16
|
-
items: [{ title: "
|
|
17
|
-
hint: "
|
|
15
|
+
settingsFields: [{ name: "usage", label: "jskit.connectors.mapbox.fields.usage.label", credentialScope: value => value,
|
|
16
|
+
items: [{ title: "jskit.connectors.mapbox.fields.usage.items.backend.title", value: "backend" }, { title: "jskit.connectors.mapbox.fields.usage.items.browser.title", value: "browser" }] }, { name: "publicTokenRef", environmentCredential: { label: "jskit.connectors.mapbox.fields.publicTokenRef.environmentCredential.label", public: true }, label: "jskit.connectors.mapbox.fields.publicTokenRef.label", placeholder: "env:MAPBOX_PUBLIC_TOKEN",
|
|
17
|
+
hint: "jskit.connectors.mapbox.fields.publicTokenRef.hint" }],
|
|
18
18
|
setup: {
|
|
19
19
|
url: "https://docs.mapbox.com/accounts/guides/tokens/",
|
|
20
20
|
stepsForSettings: settings => settings?.usage === "browser" ? [
|
package/src/shared/mcp.js
CHANGED
|
@@ -24,19 +24,19 @@ function validN8nOAuthDiscovery(value) {
|
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
const n8nDefinition = Object.freeze({
|
|
27
|
-
id: "n8n", name: "n8n", description: "
|
|
27
|
+
id: "n8n", name: "n8n", description: "jskit.connectors.n8n.description",
|
|
28
28
|
accountModes: ["assistant"], authenticationMethods: ["api-key"], scopes: [],
|
|
29
29
|
authenticationMethodsForSettings: (settings) => settings.oauthDiscovery ? ["oauth2", "api-key"] : ["api-key"],
|
|
30
30
|
scopesForSettings: (settings) => (settings.oauthDiscovery?.scopes || []).map((value) => ({ value, label: value })),
|
|
31
|
-
apiKeyReferenceLabel: "
|
|
32
|
-
apiKeyReferenceHint: "
|
|
31
|
+
apiKeyReferenceLabel: "jskit.connectors.n8n.apiKeyReferenceLabel",
|
|
32
|
+
apiKeyReferenceHint: "jskit.connectors.n8n.apiKeyReferenceHint",
|
|
33
33
|
settingsSchema: createSchema({ serverUrl: { type: "string", required: true, minLength: 1, maxLength: 2048,
|
|
34
34
|
validator: (value) => validN8nServerUrl(value) || "Use the HTTPS MCP server URL ending /mcp-server/http, without credentials, query or fragment." },
|
|
35
35
|
oauthDiscovery: { type: "object", additionalProperties: true,
|
|
36
36
|
validator: (value) => validN8nOAuthDiscovery(value) || "Discover a supported n8n OAuth authority and permissions before connecting." }
|
|
37
37
|
}),
|
|
38
|
-
settingsFields: [{ name: "serverUrl", label: "
|
|
39
|
-
hint: "
|
|
38
|
+
settingsFields: [{ name: "serverUrl", label: "jskit.connectors.n8n.fields.serverUrl.label", placeholder: "https://automation.example.com/mcp-server/http",
|
|
39
|
+
hint: "jskit.connectors.n8n.fields.serverUrl.hint" }],
|
|
40
40
|
setup: {
|
|
41
41
|
url: "https://docs.n8n.io/connect/connect-to-n8n-mcp-server",
|
|
42
42
|
clientRegistrationEndpoint: (settings) => settings.oauthDiscovery?.resource === settings.serverUrl
|
|
@@ -65,11 +65,11 @@ const n8nDefinition = Object.freeze({
|
|
|
65
65
|
});
|
|
66
66
|
|
|
67
67
|
const sanityDefinition = Object.freeze({
|
|
68
|
-
id: "sanity", name: "Sanity", description: "
|
|
68
|
+
id: "sanity", name: "Sanity", description: "jskit.connectors.sanity.description",
|
|
69
69
|
accountModes: ["assistant"], authenticationMethods: ["oauth2", "api-key"],
|
|
70
|
-
scopes: [{ value: "global", label: "
|
|
71
|
-
apiKeyReferenceLabel: "
|
|
72
|
-
apiKeyReferenceHint: "
|
|
70
|
+
scopes: [{ value: "global", label: "jskit.connectors.sanity.scopes.global.label", recommended: true }],
|
|
71
|
+
apiKeyReferenceLabel: "jskit.connectors.sanity.apiKeyReferenceLabel",
|
|
72
|
+
apiKeyReferenceHint: "jskit.connectors.sanity.apiKeyReferenceHint",
|
|
73
73
|
setup: {
|
|
74
74
|
url: "https://www.sanity.io/docs/ai/mcp-server",
|
|
75
75
|
clientRegistrationEndpoint: "https://mcp.sanity.io/register",
|
|
@@ -6,18 +6,18 @@ const guid = "[a-fA-F0-9]{8}-(?:[a-fA-F0-9]{4}-){3}[a-fA-F0-9]{12}";
|
|
|
6
6
|
const guidPattern = new RegExp(`^${guid}$`, "u");
|
|
7
7
|
const endpointPattern = new RegExp(`^https://api\\.fabric\\.microsoft\\.com/v1/workspaces/${guid}/(?:graphqlapis|graphQLApis|GraphQLApis)/${guid}/graphql$`, "u");
|
|
8
8
|
const scopes = [
|
|
9
|
-
{ value: delegatedScope, label: "
|
|
10
|
-
{ value: "offline_access", label: "
|
|
11
|
-
{ value: serviceScope, label: "
|
|
9
|
+
{ value: delegatedScope, label: "jskit.connectors.microsoftFabric.scopes.delegatedScope.label", recommended: true },
|
|
10
|
+
{ value: "offline_access", label: "jskit.connectors.microsoftFabric.scopes.offlineAccess.label", recommended: true },
|
|
11
|
+
{ value: serviceScope, label: "jskit.connectors.microsoftFabric.scopes.serviceScope.label", recommended: true }
|
|
12
12
|
];
|
|
13
13
|
|
|
14
14
|
const microsoftFabricDefinition = Object.freeze({
|
|
15
15
|
id: "microsoft-fabric", name: "Microsoft Fabric",
|
|
16
|
-
description: "
|
|
16
|
+
description: "jskit.connectors.microsoftFabric.description",
|
|
17
17
|
accountModes: ["shared", "per-user", "assistant"], authenticationMethods: ["oauth2"],
|
|
18
18
|
oauthGrantTypes: ["authorization_code", "client_credentials"], oauthClientAuthenticationMethods: ["client_secret_post"],
|
|
19
19
|
validateClientId: (value) => guidPattern.test(value) || "Enter the Application (client) ID as a GUID.",
|
|
20
|
-
oauthGrantHint: "
|
|
20
|
+
oauthGrantHint: "jskit.connectors.microsoftFabric.oauthGrantHint",
|
|
21
21
|
settingsSchema: createSchema({
|
|
22
22
|
tenantId: { type: "string", required: true, maxLength: 36,
|
|
23
23
|
validator: (value) => guidPattern.test(value) || "Enter the Directory (tenant) ID as a GUID, not common or a client ID." },
|
|
@@ -25,12 +25,12 @@ const microsoftFabricDefinition = Object.freeze({
|
|
|
25
25
|
validator: (value) => endpointPattern.test(value) || "Copy the Fabric GraphQL API endpoint with workspace and API IDs, without a query string or fragment." }
|
|
26
26
|
}),
|
|
27
27
|
settingsFields: [
|
|
28
|
-
{ name: "tenantId", label: "
|
|
29
|
-
{ name: "graphqlEndpoint", label: "
|
|
30
|
-
hint: "
|
|
28
|
+
{ name: "tenantId", label: "jskit.connectors.microsoftFabric.fields.tenantId.label", placeholder: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", hint: "jskit.connectors.microsoftFabric.fields.tenantId.hint" },
|
|
29
|
+
{ name: "graphqlEndpoint", label: "jskit.connectors.microsoftFabric.fields.graphqlEndpoint.label", placeholder: "https://api.fabric.microsoft.com/v1/workspaces/<workspace-id>/graphqlapis/<api-id>/graphql",
|
|
30
|
+
hint: "jskit.connectors.microsoftFabric.fields.graphqlEndpoint.hint" }
|
|
31
31
|
],
|
|
32
32
|
scopes, scopesForGrantType: (grantType) => scopes.filter((scope) => grantType === "client_credentials" ? scope.value === serviceScope : scope.value !== serviceScope),
|
|
33
|
-
permissionsHint: "
|
|
33
|
+
permissionsHint: "jskit.connectors.microsoftFabric.permissionsHint",
|
|
34
34
|
setup: { url: "https://learn.microsoft.com/en-us/fabric/data-engineering/connect-apps-api-graphql", steps: [
|
|
35
35
|
"You need an existing Fabric API for GraphQL and permission to register an application in its Microsoft Entra directory. In Entra admin center → Entra ID → App registrations → New registration, name the app, choose the intended directory audience and Register. Copy Application (client) ID and Directory (tenant) ID from Overview into their separate fields; use the tenant GUID, not common.",
|
|
36
36
|
"Open Certificates & secrets → Client secrets → New client secret. Add a description and expiry, then Add. Copy Value immediately, not Secret ID. Keep env:MICROSOFT_FABRIC_CLIENT_SECRET as the secret reference; store the secret value in Env after saving.",
|