@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.
Files changed (137) hide show
  1. package/CHANGELOG.md +1722 -0
  2. package/README.md +11 -0
  3. package/locales/en.json +3139 -0
  4. package/package.json +7 -6
  5. package/src/server/ai.js +4 -4
  6. package/src/server/amazon-redshift.js +5 -5
  7. package/src/server/apify.js +1 -1
  8. package/src/server/apollo-io.js +1 -1
  9. package/src/server/asana.js +3 -3
  10. package/src/server/ashby.js +3 -3
  11. package/src/server/attention.js +2 -2
  12. package/src/server/aws-athena.js +3 -3
  13. package/src/server/aws-s3.js +1 -1
  14. package/src/server/awsTransport.js +9 -9
  15. package/src/server/brevo.js +3 -3
  16. package/src/server/calendly.js +2 -2
  17. package/src/server/chargebee.js +1 -1
  18. package/src/server/databricks.js +2 -2
  19. package/src/server/dbt-semantic-layer.js +8 -8
  20. package/src/server/elevenlabs.js +4 -4
  21. package/src/server/firebase-cloud-messaging.js +8 -8
  22. package/src/server/firecrawl.js +2 -2
  23. package/src/server/gatewayapi.js +4 -4
  24. package/src/server/github-api.js +3 -3
  25. package/src/server/gitlab-api.js +1 -1
  26. package/src/server/gmail.js +1 -1
  27. package/src/server/gong.js +4 -4
  28. package/src/server/google-ads-search.js +16 -16
  29. package/src/server/google-ads.js +7 -7
  30. package/src/server/google-drive.js +8 -6
  31. package/src/server/google-maps-platform.js +5 -5
  32. package/src/server/google-search-console.js +1 -1
  33. package/src/server/google-sheets.js +3 -2
  34. package/src/server/google.js +3 -2
  35. package/src/server/granola.js +5 -5
  36. package/src/server/hubspot.js +5 -3
  37. package/src/server/inngest.js +4 -4
  38. package/src/server/klipy.js +1 -1
  39. package/src/server/lightspeed.js +4 -4
  40. package/src/server/linear.js +2 -2
  41. package/src/server/linkedin.js +6 -6
  42. package/src/server/mapbox.js +1 -1
  43. package/src/server/mcpRegistration.js +3 -2
  44. package/src/server/mcpTransport.js +1 -1
  45. package/src/server/microsoft-fabric.js +3 -3
  46. package/src/server/microsoft-onedrive.js +1 -1
  47. package/src/server/microsoft-onenote.js +1 -1
  48. package/src/server/microsoft-outlook.js +1 -1
  49. package/src/server/microsoft.js +4 -3
  50. package/src/server/n8n.js +4 -4
  51. package/src/server/oura.js +1 -1
  52. package/src/server/paddle.js +1 -1
  53. package/src/server/pipedrive.js +4 -4
  54. package/src/server/posthog.js +3 -3
  55. package/src/server/salesforce.js +8 -8
  56. package/src/server/semrush.js +25 -25
  57. package/src/server/shopify.js +6 -6
  58. package/src/server/slack.js +10 -10
  59. package/src/server/snowflake.js +5 -5
  60. package/src/server/tally.js +1 -1
  61. package/src/server/telegram.js +1 -1
  62. package/src/server/tiktok.js +14 -14
  63. package/src/server/twilio.js +3 -3
  64. package/src/server/twitch.js +22 -21
  65. package/src/server/wave.js +34 -34
  66. package/src/server/wix.js +73 -73
  67. package/src/server/wiz.js +18 -18
  68. package/src/server/woocommerce.js +23 -23
  69. package/src/server/wordpress-com.js +3 -3
  70. package/src/server/wordpress-self-hosted.js +2 -2
  71. package/src/server/workday.js +3 -3
  72. package/src/server/x-twitter.js +6 -6
  73. package/src/server/xero.js +15 -15
  74. package/src/server/zoho-books.js +8 -8
  75. package/src/server/zoho-crm.js +5 -5
  76. package/src/server/zohoOAuth.js +1 -1
  77. package/src/shared/ai.js +24 -13
  78. package/src/shared/algolia.js +4 -4
  79. package/src/shared/amazon-redshift.js +16 -16
  80. package/src/shared/amplitude.js +6 -6
  81. package/src/shared/atlassian.js +19 -19
  82. package/src/shared/aws.js +18 -18
  83. package/src/shared/canva.js +18 -18
  84. package/src/shared/chargebee.js +3 -3
  85. package/src/shared/clickhouse.js +9 -9
  86. package/src/shared/confidence.js +6 -6
  87. package/src/shared/databricks.js +8 -8
  88. package/src/shared/dbt-semantic-layer.js +7 -7
  89. package/src/shared/english-ai.js +6 -0
  90. package/src/shared/english-definitions.js +34 -0
  91. package/src/shared/english-texts.js +7 -0
  92. package/src/shared/figma.js +2 -2
  93. package/src/shared/firebase-cloud-messaging.js +11 -11
  94. package/src/shared/firecrawl.js +1 -1
  95. package/src/shared/gemini-enterprise.js +7 -7
  96. package/src/shared/gong.js +5 -5
  97. package/src/shared/google-ads.js +5 -5
  98. package/src/shared/google-maps-platform.js +7 -7
  99. package/src/shared/google.js +40 -40
  100. package/src/shared/granola.js +5 -5
  101. package/src/shared/hex.js +7 -7
  102. package/src/shared/inngest.js +8 -8
  103. package/src/shared/lightspeed.js +52 -52
  104. package/src/shared/linkedin.js +6 -6
  105. package/src/shared/logo-dev.js +3 -3
  106. package/src/shared/mapbox.js +6 -6
  107. package/src/shared/mcp.js +9 -9
  108. package/src/shared/microsoft-fabric.js +9 -9
  109. package/src/shared/microsoft.js +52 -52
  110. package/src/shared/miro.js +5 -5
  111. package/src/shared/oura.js +5 -5
  112. package/src/shared/posthog.js +9 -9
  113. package/src/shared/prestashop.js +5 -5
  114. package/src/shared/resend.js +1 -1
  115. package/src/shared/salesforce.js +8 -8
  116. package/src/shared/semrush.js +6 -6
  117. package/src/shared/shopify.js +26 -26
  118. package/src/shared/slack.js +61 -61
  119. package/src/shared/snowflake.js +15 -15
  120. package/src/shared/tiktok.js +7 -7
  121. package/src/shared/tokens.js +126 -126
  122. package/src/shared/twilio.js +7 -7
  123. package/src/shared/twitch.js +24 -24
  124. package/src/shared/wave.js +33 -33
  125. package/src/shared/wix.js +5 -5
  126. package/src/shared/wiz.js +14 -14
  127. package/src/shared/wordpress-com.js +9 -9
  128. package/src/shared/wordpress.js +11 -11
  129. package/src/shared/workday.js +8 -8
  130. package/src/shared/x-twitter.js +5 -5
  131. package/src/shared/xero.js +25 -25
  132. package/src/shared/zoho-books.js +10 -10
  133. package/src/shared/zoho-crm.js +16 -16
  134. package/src/shared/zoho-regions.js +8 -8
  135. package/test/englishDefinitions.test.js +37 -0
  136. package/test/i18nCatalog.test.js +16 -0
  137. package/test/shopify.test.js +3 -1
@@ -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: "Discover advertising accounts, prepare reviewed Search campaigns and read Google Ads reports.",
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: "Manager customer ID (optional)", placeholder: "1234567890",
13
- hint: "Use the manager through which this app accesses client accounts, without hyphens. Direct account access can leave this blank." }
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: "Access Google Ads accounts", recommended: true }],
16
- permissionsHint: "This Google permission can authorize campaign changes. Search management uses separate reviewed operations; your application must authorize each account and spending decision. This is not application login.",
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: "Geocode addresses, find places, compute routes and configure browser maps.",
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: "Server API key reference",
8
- verificationFields: [{ name: "address", required: true, label: "Verification address",
9
- hint: "Enter an address or plus code. Connecting performs one geocoding request and can incur provider usage charges." }],
10
- apiKeyReferenceHint: "Reference a server key authorized for Geocoding API. Verification performs one geocoding request using an address you supply and can incur provider usage charges.",
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: "Map ID (optional)", hint: "Public JavaScript map ID for advanced markers. Create it in Google Maps Platform > Map management. DEMO_MAP_ID is only for development." }, { name: "browserKeyRef", label: "Browser API key reference (optional)", placeholder: "env:GOOGLE_MAPS_BROWSER_KEY",
13
- hint: "A separate key for browser maps. Restrict it to the actual application websites and APIs. Backend verification does not verify this key." }],
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: [
@@ -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", "Read and search mail, manage drafts and labels, and explicitly send messages.", ["gmail.readonly", "gmail.send", "gmail.compose", "gmail.modify"], [
27
- ["gmail.readonly", "Read messages", true], ["gmail.send", "Send messages"], ["gmail.compose", "Manage drafts and send messages"],
28
- ["gmail.modify", "Read and modify messages"], ["gmail.labels", "Manage labels"], ["gmail.metadata", "Read message headers and labels"],
29
- ["gmail.insert", "Insert messages"], ["gmail.settings.basic", "Manage basic mail settings"], ["gmail.settings.sharing", "Manage sharing settings"],
30
- ["https://mail.google.com/", "Full mailbox access including permanent deletion"],
31
- ["gmail.addons.current.message.readonly", "Read the current add-on message"], ["gmail.addons.current.message.action", "Act on the current add-on message"],
32
- ["gmail.addons.current.message.metadata", "Read the current add-on message headers"], ["gmail.addons.current.action.compose", "Compose from an add-on"]
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", "Find files, upload and download content, and manage basic file metadata.", ["drive.file", "drive.appdata", "drive.appfolder", "drive.readonly"], [
40
- ["drive.metadata.readonly", "Read file metadata"], ["drive.file", "Manage files selected for this application", true], ["drive.readonly", "Read and download files"],
41
- ["drive", "Manage all Drive files"], ["drive.metadata", "Manage file metadata"], ["drive.appdata", "Manage application data"],
42
- ["drive.appfolder", "Manage this application’s Drive folder data"],
43
- ["drive.apps.readonly", "Read installed Drive apps"], ["drive.meet.readonly", "Read Meet-created files"],
44
- ["drive.photos.readonly", "Read photos"], ["drive.scripts", "Manage Apps Script files"],
45
- ["drive.activity", "Read and add file activity"], ["drive.activity.readonly", "Read file 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", "Access files selected for this application"], ["drive.readonly", "Read Drive files"], ["drive", "Manage Drive files"]];
53
- const googleSheetsDefinition = definition("google-sheets", "Google Sheets", "Google Sheets API", "Create spreadsheets, read and write ranges, and apply native batch updates.", "drive.file", [
54
- ["spreadsheets.readonly", "Read spreadsheets"], ["spreadsheets", "Manage spreadsheets"],
55
- ["drive.metadata.readonly", "Read Drive file metadata (does not grant spreadsheet content access)"], ...drivePermissions
56
- ], [{ name: "spreadsheetId", required: false, label: "Spreadsheet ID (optional)", hint: "Leave blank for create-first access with drive.file and Drive API enabled. Otherwise copy the ID between /spreadsheets/d/ and /edit, not the gid tab number; the account and app must have access." }], [
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", "Create documents, read tabs and edit content with native batch requests.", "drive.file", [
63
- ["documents.readonly", "Read documents"], ["documents", "Manage documents"], ...drivePermissions
64
- ], [{ name: "documentId", required: false, label: "Document ID (optional)", hint: "Leave blank for create-first access with drive.file and Drive API enabled. To verify an existing document, copy its ID between /document/d/ and /edit; the account and this app must have access." }], [
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", "Create and edit presentations, read pages and obtain preview thumbnails.", "drive.file", [
71
- ["presentations.readonly", "Read presentations"], ["presentations", "Manage presentations"],
72
- ["spreadsheets.readonly", "Read linked spreadsheets"], ["spreadsheets", "Manage linked spreadsheets"], ...drivePermissions
73
- ], [{ name: "presentationId", required: false, label: "Presentation ID (optional)", hint: "Leave blank for create-first access with drive.file and Drive API enabled. Otherwise copy the ID between /presentation/d/ and /edit; this is not a slide object ID. The account and app must have access." }], [
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", "Query search performance, inspect indexed URLs and manage sitemaps.", "webmasters.readonly", [
80
- ["webmasters.readonly", "Read Search Console properties"], ["webmasters", "Manage Search Console properties"],
81
- ["siteverification", "Manage website ownership through Site Verification"],
82
- ["siteverification.verify_only", "Verify new website ownership through Site Verification"]
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: "Configure website tracking with your public GA4 Measurement ID.",
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: "Public configuration · no credentials" },
95
- authenticationHint: "Your application loads the Google tag. This does not grant access to Analytics reports.",
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: "Measurement ID", required: true,
101
- hint: "Public: this value will be visible in your deployed application. Copy it from your GA4 web stream." }],
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", "Configure the query project, run queries and retrieve results.", "bigquery", [
117
- ["bigquery.readonly", "Read BigQuery data and metadata"], ["bigquery", "Manage BigQuery data"],
118
- ["cloud-platform.read-only", "Read Google Cloud resources"], ["cloud-platform", "Manage Google Cloud resources"]
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: "Google Cloud project ID", required: true,
130
- hint: "The project that runs and is billed for queries. It can differ from the project containing your datasets. The initial connection check only lists accessible projects." }]
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 };
@@ -1,10 +1,10 @@
1
1
  const granolaDefinition = Object.freeze({
2
- id: "granola", name: "Granola", description: "Read meeting notes with an API key or connect the assistant owner through Granola MCP OAuth.",
2
+ id: "granola", name: "Granola", description: "jskit.connectors.granola.description",
3
3
  accountModes: ["shared", "assistant"], authenticationMethods: ["api-key", "oauth2"], scopes: [
4
- { value: "openid", label: "Identify the connected Granola account", recommended: true, authenticationMethods: ["oauth2"] },
5
- { value: "profile", label: "Read account profile", recommended: true, authenticationMethods: ["oauth2"] },
6
- { value: "email", label: "Read account email", recommended: true, authenticationMethods: ["oauth2"] },
7
- { value: "offline_access", label: "Refresh access without repeating sign-in", recommended: true, authenticationMethods: ["oauth2"] }
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: "Search projects and use Hex Threads through the assistant owner's MCP connection.",
6
+ id: "hex", name: "Hex", description: "jskit.connectors.hex.description",
7
7
  accountModes: ["assistant"], authenticationMethods: ["oauth2"],
8
8
  scopes: [
9
- { value: "openid", label: "Identify the connected Hex account", recommended: true },
10
- { value: "profile", label: "Read account profile", recommended: true },
11
- { value: "email", label: "Read account email", recommended: true },
12
- { value: "offline_access", label: "Refresh access without repeating sign-in", recommended: true }
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: "Hex workspace endpoint", hint: "Use the endpoint where your Hex workspace lives; register the OAuth client at that endpoint.",
16
- items: [{ value: "standard", title: "Standard (app.hex.tech)" }, { value: "eu", title: "Europe (eu.hex.tech)" }, { value: "hipaa", title: "HIPAA (hc.hex.tech)" }] }],
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.",
@@ -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: "Send events to background workflows and inspect registered apps.",
5
+ id: "inngest", name: "Inngest", description: "jskit.connectors.inngest.description",
6
6
  accountModes: ["shared", "assistant"], authenticationMethods: ["api-key"], scopes: [],
7
- apiKeyReferenceLabel: "Signing Key reference",
8
- apiKeyReferenceHint: "Reference the Signing Key for the intended Inngest environment. Verification reads app metadata; it does not verify the Event Key or run a workflow.",
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: "Event Key reference", placeholder: "env:INNGEST_EVENT_KEY",
16
- environmentCredential: { label: "Inngest Event Key", public: false },
17
- hint: "The Event Key sends events. Keep it separate from the Signing Key, and use keys from the same intended environment." },
18
- { name: "branchEnvironment", label: "Branch environment (optional)", placeholder: "feature/my-branch",
19
- hint: "Routes event delivery to this branch. App metadata reads follow the Signing Key's environment." }
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",
@@ -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: "Read products, inventory, sales, customers and outlets from a Lightspeed Retail X-Series store.",
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: "Domain prefix", placeholder: "your-store",
12
- hint: "The store prefix from https://your-store.retail.lightspeed.app. Use the store you intend to authorize." }],
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: "Read retailer settings", recommended: true },
15
- { value: "outlets:read", label: "Read outlets", recommended: true },
16
- { value: "registers:read", label: "Read registers", recommended: true },
17
- { value: "payment_types:read", label: "Read payment types", recommended: true },
18
- { value: "products:read", label: "Read products", recommended: true },
19
- { value: "products:read:price_books", label: "Read price books", recommended: true },
20
- { value: "inventory:read", label: "Read inventory", recommended: true },
21
- { value: "customers:read", label: "Read customers", recommended: true },
22
- { value: "sales:read", label: "Read sales", recommended: true },
23
- { value: "fulfillments:read", label: "Read fulfillments", recommended: true },
24
- { value: "promotions:read", label: "Read promotions", recommended: true },
25
- { value: "gift_cards:read", label: "Read gift cards", recommended: true },
26
- { value: "store_credits:read", label: "Read store credits", recommended: true },
27
- { value: "suppliers:read", label: "Read suppliers", recommended: true },
28
- { value: "taxes:read", label: "Read taxes", recommended: true },
29
- { value: "users:read", label: "Read users", recommended: true },
30
- { value: "audit:read", label: "Read audit events" },
31
- { value: "business_rules:read", label: "Read business rules" },
32
- { value: "business_rules:write", label: "Edit business rules" },
33
- { value: "channels:read", label: "Read channels" },
34
- { value: "consignments:read", label: "Read consignments" },
35
- { value: "consignments:write:inventory_count", label: "Perform inventory counts" },
36
- { value: "consignments:write:stock_order", label: "Process stock orders" },
37
- { value: "consignments:write:stock_transfer", label: "Transfer stock" },
38
- { value: "customers:write", label: "Edit customers" },
39
- { value: "custom_fields:read", label: "Read custom fields" },
40
- { value: "custom_fields:write", label: "Edit custom fields" },
41
- { value: "fulfillments:write", label: "Edit fulfillments" },
42
- { value: "gift_cards:write:issue", label: "Issue gift cards" },
43
- { value: "gift_cards:write:redeem", label: "Redeem gift cards" },
44
- { value: "inventory:write", label: "Edit inventory" },
45
- { value: "payments:read", label: "Read payments" },
46
- { value: "products:write", label: "Edit products" },
47
- { value: "products:write:price_books", label: "Edit price books" },
48
- { value: "promotions:write", label: "Edit promotions" },
49
- { value: "register:close", label: "Close registers" },
50
- { value: "register:open", label: "Open registers" },
51
- { value: "remote_rules:read", label: "Read remote rules" },
52
- { value: "remote_rules:write", label: "Edit remote rules" },
53
- { value: "sales:write", label: "Edit sales" },
54
- { value: "serial_numbers:read", label: "Read serial numbers" },
55
- { value: "serial_numbers:write", label: "Edit serial numbers" },
56
- { value: "services:read", label: "Read services" },
57
- { value: "services:write", label: "Edit services" },
58
- { value: "store_credits:write:issue", label: "Issue store credits" },
59
- { value: "suppliers:write", label: "Edit suppliers" },
60
- { value: "taxes:write", label: "Edit taxes" },
61
- { value: "users:write", label: "Edit users" },
62
- { value: "webhooks", label: "Manage application webhooks" }
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.",
@@ -1,13 +1,13 @@
1
1
  const linkedinDefinition = Object.freeze({
2
- id: "linkedin", name: "LinkedIn", description: "Connect a member's LinkedIn account to read their permitted profile information and publish approved text posts.",
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: "OpenID (required)", required: true, recommended: true },
6
- { value: "profile", label: "Read basic profile (required)", required: true, recommended: true },
7
- { value: "email", label: "Read primary email address" },
8
- { value: "w_member_social", label: "Publish posts" }
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: "OpenID and profile are required for profile verification. Email is optional. Publish posts needs LinkedIn's Share on LinkedIn product; select it and reconnect before publishing text posts.",
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: [
@@ -1,9 +1,9 @@
1
1
  const logoDevDefinition = Object.freeze({
2
- id: "logo-dev", name: "Logo.dev", description: "Display company logos using a publishable image-service key.",
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: "Publishable key reference",
6
- apiKeyReferenceHint: "Reference a pk_ key. Your application exposes its value in image URLs. A private sk_ key cannot be used for this image flow.",
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: [
@@ -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: "Validate a backend access token and look up places or coordinates.",
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: "Backend access token reference",
10
- apiKeyReferenceHint: "Use a reference to a token for backend requests. It may be a public (pk.) or secret (sk.) token; browser URL restrictions can block backend geocoding.",
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: "Mapbox usage", credentialScope: value => value,
16
- items: [{ title: "Backend geocoding and optional browser maps", value: "backend" }, { title: "Browser maps only", value: "browser" }] }, { name: "publicTokenRef", environmentCredential: { label: "Public browser token", public: true }, label: "Public browser token reference", placeholder: "env:MAPBOX_PUBLIC_TOKEN",
17
- hint: "Required for browser-only mode; optional with backend geocoding. Separate pk. token for Mapbox in your browser. The application may expose this value; backend verification does not verify its restrictions." }],
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: "Discover and use your n8n instance's MCP tools from an assistant.",
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: "MCP access token reference",
32
- apiKeyReferenceHint: "Use the personal token from Instance-level MCP, not an n8n REST API key. The assistant host must authorize individual tool calls.",
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: "Server URL", placeholder: "https://automation.example.com/mcp-server/http",
39
- hint: "Copy the full Server URL from n8n's MCP connection details. Keep any reverse-proxy subdirectory." }],
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: "Discover and use Sanity's hosted MCP tools from an assistant.",
68
+ id: "sanity", name: "Sanity", description: "jskit.connectors.sanity.description",
69
69
  accountModes: ["assistant"], authenticationMethods: ["oauth2", "api-key"],
70
- scopes: [{ value: "global", label: "Sanity MCP account access", recommended: true }],
71
- apiKeyReferenceLabel: "MCP API token reference",
72
- apiKeyReferenceHint: "Store a Sanity token in Env. Its role controls tool access at https://mcp.sanity.io; the assistant host must authorize individual calls.",
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: "Execute GraphQL queries and mutations as the user", recommended: true },
10
- { value: "offline_access", label: "Keep user access between visits", recommended: true },
11
- { value: serviceScope, label: "Use the service account's Fabric permissions", recommended: true }
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: "Access one Fabric GraphQL API using user consent or a service principal.",
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: "User consent needs a Web callback and delegated GraphQL permission. Service account needs a service principal with Fabric access, without a callback.",
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: "Microsoft Entra Tenant ID", placeholder: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", hint: "The directory containing the Fabric resource and permitted users or service principal." },
29
- { name: "graphqlEndpoint", label: "Fabric GraphQL Endpoint", placeholder: "https://api.fabric.microsoft.com/v1/workspaces/<workspace-id>/graphqlapis/<api-id>/graphql",
30
- hint: "Open your API for GraphQL in Fabric and select Copy endpoint. Custom proxies and sovereign-cloud addresses are not supported by this fragment." }
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: "Fabric Execute access permits queries and mutations. Your application must authorize the documents it executes. Data-source access is separate; this does not sign users into your application.",
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.",