@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
@@ -2,15 +2,15 @@ import { createSchema } from "json-rest-schema";
2
2
  import { awsSettings, awsFields, awsCredentials } from "./aws.js";
3
3
 
4
4
  const regions = [
5
- ["us-east-1", "N. Virginia"], ["us-east-2", "Ohio"], ["us-west-1", "N. California"], ["us-west-2", "Oregon"],
6
- ["ca-central-1", "Canada Central"], ["ca-west-1", "Calgary"], ["mx-central-1", "Mexico Central"], ["sa-east-1", "São Paulo"],
7
- ["eu-west-1", "Ireland"], ["eu-west-2", "London"], ["eu-west-3", "Paris"], ["eu-central-1", "Frankfurt"],
8
- ["eu-central-2", "Zurich"], ["eu-north-1", "Stockholm"], ["eu-south-1", "Milan"], ["eu-south-2", "Spain"],
9
- ["il-central-1", "Tel Aviv"], ["me-south-1", "Bahrain"], ["me-central-1", "UAE"], ["af-south-1", "Cape Town"],
10
- ["ap-east-1", "Hong Kong"], ["ap-east-2", "Taipei"], ["ap-south-1", "Mumbai"], ["ap-south-2", "Hyderabad"],
11
- ["ap-southeast-1", "Singapore"], ["ap-southeast-2", "Sydney"], ["ap-southeast-3", "Jakarta"], ["ap-southeast-4", "Melbourne"],
12
- ["ap-southeast-5", "Malaysia"], ["ap-southeast-6", "New Zealand"], ["ap-southeast-7", "Thailand"],
13
- ["ap-northeast-1", "Tokyo"], ["ap-northeast-2", "Seoul"], ["ap-northeast-3", "Osaka"]
5
+ ["us-east-1", "jskit.connectors.aws.regions.usEast1"], ["us-east-2", "jskit.connectors.aws.regions.usEast2"], ["us-west-1", "jskit.connectors.aws.regions.usWest1"], ["us-west-2", "jskit.connectors.aws.regions.usWest2"],
6
+ ["ca-central-1", "jskit.connectors.aws.regions.caCentral1"], ["ca-west-1", "jskit.connectors.aws.regions.caWest1"], ["mx-central-1", "jskit.connectors.aws.regions.mxCentral1"], ["sa-east-1", "jskit.connectors.aws.regions.saEast1"],
7
+ ["eu-west-1", "jskit.connectors.aws.regions.euWest1"], ["eu-west-2", "jskit.connectors.aws.regions.euWest2"], ["eu-west-3", "jskit.connectors.aws.regions.euWest3"], ["eu-central-1", "jskit.connectors.aws.regions.euCentral1"],
8
+ ["eu-central-2", "jskit.connectors.aws.regions.euCentral2"], ["eu-north-1", "jskit.connectors.aws.regions.euNorth1"], ["eu-south-1", "jskit.connectors.aws.regions.euSouth1"], ["eu-south-2", "jskit.connectors.aws.regions.euSouth2"],
9
+ ["il-central-1", "jskit.connectors.aws.regions.ilCentral1"], ["me-south-1", "jskit.connectors.aws.regions.meSouth1"], ["me-central-1", "jskit.connectors.aws.regions.meCentral1"], ["af-south-1", "jskit.connectors.aws.regions.afSouth1"],
10
+ ["ap-east-1", "jskit.connectors.aws.regions.apEast1"], ["ap-east-2", "jskit.connectors.aws.regions.apEast2"], ["ap-south-1", "jskit.connectors.aws.regions.apSouth1"], ["ap-south-2", "jskit.connectors.aws.regions.apSouth2"],
11
+ ["ap-southeast-1", "jskit.connectors.aws.regions.apSoutheast1"], ["ap-southeast-2", "jskit.connectors.aws.regions.apSoutheast2"], ["ap-southeast-3", "jskit.connectors.aws.regions.apSoutheast3"], ["ap-southeast-4", "jskit.connectors.aws.regions.apSoutheast4"],
12
+ ["ap-southeast-5", "jskit.connectors.aws.regions.apSoutheast5"], ["ap-southeast-6", "jskit.connectors.aws.regions.apSoutheast6"], ["ap-southeast-7", "jskit.connectors.aws.regions.apSoutheast7"],
13
+ ["ap-northeast-1", "jskit.connectors.aws.regions.apNortheast1"], ["ap-northeast-2", "jskit.connectors.aws.regions.apNortheast2"], ["ap-northeast-3", "jskit.connectors.aws.regions.apNortheast3"]
14
14
  ];
15
15
  const databaseName = { type: "string", required: true, noTrim: true, minLength: 1, maxLength: 127,
16
16
  validator: (value) => (![...value].some((char) => char.charCodeAt(0) < 32 || char.charCodeAt(0) === 127) && value.trim().length > 0 && new TextEncoder().encode(value).length <= 127) || "Enter a database identifier of at most 127 UTF-8 bytes." };
@@ -28,17 +28,17 @@ const provisionedSchema = createSchema({ ...common,
28
28
  });
29
29
 
30
30
  const amazonRedshiftDefinition = Object.freeze({
31
- id: "amazon-redshift", name: "Amazon Redshift", description: "Inspect tables and run queries in a serverless workgroup or provisioned cluster.",
31
+ id: "amazon-redshift", name: "Amazon Redshift", description: "jskit.connectors.amazonRedshift.description",
32
32
  ...awsCredentials, scopes: [],
33
33
  settingsSchema: (settings = {}) => settings.deploymentType === "provisioned" ? provisionedSchema : serverlessSchema,
34
34
  settingsFields: [
35
- { name: "deploymentType", label: "Deployment type", items: [{ value: "serverless", title: "Serverless" }, { value: "provisioned", title: "Provisioned cluster" }] },
36
- { name: "region", label: "AWS Region", items: regions.map(([value, title]) => ({ value, title: `${title} (${value})` })), hint: "Use the warehouse's region. Availability depends on your AWS account and deployment type." },
35
+ { name: "deploymentType", label: "jskit.connectors.amazonRedshift.fields.deploymentType.label", items: [{ value: "serverless", title: "jskit.connectors.amazonRedshift.fields.deploymentType.items.serverless.title" }, { value: "provisioned", title: "jskit.connectors.amazonRedshift.fields.deploymentType.items.provisioned.title" }] },
36
+ { name: "region", label: "jskit.connectors.amazonRedshift.fields.region.label", items: regions.map(([value, key]) => ({ value, title: { key, params: { region: value } } })), hint: "jskit.connectors.amazonRedshift.fields.region.hint" },
37
37
  ...awsFields.filter((field) => field.name !== "region"),
38
- { name: "workgroup", label: "Workgroup name", placeholder: "analytics", hint: "The serverless workgroup name, without an ARN or URL." },
39
- { name: "clusterIdentifier", label: "Cluster identifier", placeholder: "analytics-cluster" },
40
- { name: "database", label: "Database", placeholder: "dev" },
41
- { name: "databaseUser", label: "Database user (optional)", placeholder: "report_reader", hint: "Leave blank to use the database identity derived from IAM." }
38
+ { name: "workgroup", label: "jskit.connectors.amazonRedshift.fields.workgroup.label", placeholder: "analytics", hint: "jskit.connectors.amazonRedshift.fields.workgroup.hint" },
39
+ { name: "clusterIdentifier", label: "jskit.connectors.amazonRedshift.fields.clusterIdentifier.label", placeholder: "analytics-cluster" },
40
+ { name: "database", label: "jskit.connectors.amazonRedshift.fields.database.label", placeholder: "dev" },
41
+ { name: "databaseUser", label: "jskit.connectors.amazonRedshift.fields.databaseUser.label", placeholder: "report_reader", hint: "jskit.connectors.amazonRedshift.fields.databaseUser.hint" }
42
42
  ],
43
43
  setup: { url: "https://docs.aws.amazon.com/redshift/latest/mgmt/data-api.html", steps: [
44
44
  "Select the warehouse's account and region in Amazon Redshift, then copy its serverless workgroup name or provisioned cluster identifier and database name.",
@@ -1,16 +1,16 @@
1
1
  import { createSchema } from "json-rest-schema";
2
2
 
3
3
  const amplitudeDefinition = Object.freeze({
4
- id: "amplitude", name: "Amplitude", description: "Query and manage Amplitude content through an authorized assistant MCP connection.",
4
+ id: "amplitude", name: "Amplitude", description: "jskit.connectors.amplitude.description",
5
5
  accountModes: ["assistant"], authenticationMethods: ["oauth2"],
6
6
  scopes: [
7
- { value: "mcp:read", label: "Read Amplitude content (required for verification)", recommended: true },
8
- { value: "mcp:write", label: "Create and edit Amplitude content" },
9
- { value: "offline_access", label: "Refresh access without repeating sign-in", recommended: true }
7
+ { value: "mcp:read", label: "jskit.connectors.amplitude.scopes.mcpRead.label", recommended: true },
8
+ { value: "mcp:write", label: "jskit.connectors.amplitude.scopes.mcpWrite.label" },
9
+ { value: "offline_access", label: "jskit.connectors.amplitude.scopes.offlineAccess.label", recommended: true }
10
10
  ],
11
11
  settingsSchema: createSchema({ region: { type: "string", enum: ["us", "eu"], defaultTo: "us" } }),
12
- settingsFields: [{ name: "region", label: "Region", hint: "Choose the region containing your Amplitude account and register the client there.",
13
- items: [{ value: "us", title: "United States" }, { value: "eu", title: "European Union" }] }],
12
+ settingsFields: [{ name: "region", label: "jskit.connectors.amplitude.fields.region.label", hint: "jskit.connectors.amplitude.fields.region.hint",
13
+ items: [{ value: "us", title: "jskit.connectors.amplitude.fields.region.items.us.title" }, { value: "eu", title: "jskit.connectors.amplitude.fields.region.items.eu.title" }] }],
14
14
  setup: {
15
15
  clientRegistrationEndpoint: (settings = {}) => settings.region === "eu"
16
16
  ? "https://mcp.eu.amplitude.com/register" : "https://mcp.amplitude.com/register",
@@ -1,28 +1,28 @@
1
1
  const atlassianDefinition = Object.freeze({
2
- id: "atlassian", name: "Atlassian", description: "Use Jira, Confluence and other Atlassian tools through the assistant owner's Rovo MCP connection.",
2
+ id: "atlassian", name: "Atlassian", description: "jskit.connectors.atlassian.description",
3
3
  accountModes: ["assistant"], authenticationMethods: ["oauth2"],
4
4
  scopes: [
5
- { value: "read:me", label: "Read your profile", recommended: true },
6
- { value: "read:account", label: "Read your account", recommended: true },
7
- { value: "offline_access", label: "Refresh access without repeating sign-in", recommended: true },
8
- { value: "email", label: "Read your email address" },
9
- { value: "read:jira:agent-interface", label: "Read Jira content", recommended: true },
10
- { value: "write:jira:agent-interface", label: "Create and edit Jira content" },
11
- { value: "search:jira:agent-interface", label: "Search Jira", recommended: true },
12
- { value: "delete:jira:agent-interface", label: "Delete Jira content" },
13
- { value: "manage:jira:agent-interface", label: "Manage Jira" },
14
- { value: "read:confluence:agent-interface", label: "Read Confluence content", recommended: true },
15
- { value: "write:confluence:agent-interface", label: "Create and edit Confluence content" },
16
- { value: "search:confluence:agent-interface", label: "Search Confluence", recommended: true },
17
- { value: "search:rovo:agent-interface", label: "Search with Rovo" },
18
- { value: "search:code:agent-interface", label: "Search code" },
19
- { value: "read:all:twg", label: "Read Teamwork Graph content" },
20
- { value: "write:all:twg", label: "Write Teamwork Graph content" },
5
+ { value: "read:me", label: "jskit.connectors.atlassian.scopes.readMe.label", recommended: true },
6
+ { value: "read:account", label: "jskit.connectors.atlassian.scopes.readAccount.label", recommended: true },
7
+ { value: "offline_access", label: "jskit.connectors.atlassian.scopes.offlineAccess.label", recommended: true },
8
+ { value: "email", label: "jskit.connectors.atlassian.scopes.email.label" },
9
+ { value: "read:jira:agent-interface", label: "jskit.connectors.atlassian.scopes.readJiraAgentInterface.label", recommended: true },
10
+ { value: "write:jira:agent-interface", label: "jskit.connectors.atlassian.scopes.writeJiraAgentInterface.label" },
11
+ { value: "search:jira:agent-interface", label: "jskit.connectors.atlassian.scopes.searchJiraAgentInterface.label", recommended: true },
12
+ { value: "delete:jira:agent-interface", label: "jskit.connectors.atlassian.scopes.deleteJiraAgentInterface.label" },
13
+ { value: "manage:jira:agent-interface", label: "jskit.connectors.atlassian.scopes.manageJiraAgentInterface.label" },
14
+ { value: "read:confluence:agent-interface", label: "jskit.connectors.atlassian.scopes.readConfluenceAgentInterface.label", recommended: true },
15
+ { value: "write:confluence:agent-interface", label: "jskit.connectors.atlassian.scopes.writeConfluenceAgentInterface.label" },
16
+ { value: "search:confluence:agent-interface", label: "jskit.connectors.atlassian.scopes.searchConfluenceAgentInterface.label", recommended: true },
17
+ { value: "search:rovo:agent-interface", label: "jskit.connectors.atlassian.scopes.searchRovoAgentInterface.label" },
18
+ { value: "search:code:agent-interface", label: "jskit.connectors.atlassian.scopes.searchCodeAgentInterface.label" },
19
+ { value: "read:all:twg", label: "jskit.connectors.atlassian.scopes.readAllTwg.label" },
20
+ { value: "write:all:twg", label: "jskit.connectors.atlassian.scopes.writeAllTwg.label" },
21
21
  ...["goals", "projects", "bitbucket", "loom", "talent", "teams", "artifacts", "focus"].flatMap((product) => {
22
22
  const name = product[0].toUpperCase() + product.slice(1);
23
23
  return [
24
- { value: `read:${product}:agent-interface`, label: `Read ${name} content` },
25
- { value: `write:${product}:agent-interface`, label: `Create and edit ${name} content` }
24
+ { value: `read:${product}:agent-interface`, label: { key: "jskit.connectors.atlassian.scopes.readProduct.label", params: { product: name } } },
25
+ { value: `write:${product}:agent-interface`, label: { key: "jskit.connectors.atlassian.scopes.writeProduct.label", params: { product: name } } }
26
26
  ];
27
27
  })
28
28
  ],
package/src/shared/aws.js CHANGED
@@ -2,11 +2,11 @@ import { createSchema } from "json-rest-schema";
2
2
  import { secretReference } from "@jskit-ai/connectors-core/shared/configuration";
3
3
 
4
4
  const regions = [
5
- ["us-east-1", "N. Virginia"], ["us-east-2", "Ohio"], ["us-west-1", "N. California"], ["us-west-2", "Oregon"],
6
- ["eu-west-1", "Ireland"], ["eu-west-2", "London"], ["eu-west-3", "Paris"], ["eu-central-1", "Frankfurt"],
7
- ["eu-north-1", "Stockholm"], ["ap-southeast-1", "Singapore"], ["ap-southeast-2", "Sydney"],
8
- ["ap-northeast-1", "Tokyo"], ["ap-northeast-2", "Seoul"], ["ap-south-1", "Mumbai"],
9
- ["sa-east-1", "São Paulo"], ["ca-central-1", "Canada Central"], ["me-south-1", "Bahrain"], ["af-south-1", "Cape Town"]
5
+ ["us-east-1", "jskit.connectors.aws.regions.usEast1"], ["us-east-2", "jskit.connectors.aws.regions.usEast2"], ["us-west-1", "jskit.connectors.aws.regions.usWest1"], ["us-west-2", "jskit.connectors.aws.regions.usWest2"],
6
+ ["eu-west-1", "jskit.connectors.aws.regions.euWest1"], ["eu-west-2", "jskit.connectors.aws.regions.euWest2"], ["eu-west-3", "jskit.connectors.aws.regions.euWest3"], ["eu-central-1", "jskit.connectors.aws.regions.euCentral1"],
7
+ ["eu-north-1", "jskit.connectors.aws.regions.euNorth1"], ["ap-southeast-1", "jskit.connectors.aws.regions.apSoutheast1"], ["ap-southeast-2", "jskit.connectors.aws.regions.apSoutheast2"],
8
+ ["ap-northeast-1", "jskit.connectors.aws.regions.apNortheast1"], ["ap-northeast-2", "jskit.connectors.aws.regions.apNortheast2"], ["ap-south-1", "jskit.connectors.aws.regions.apSouth1"],
9
+ ["sa-east-1", "jskit.connectors.aws.regions.saEast1"], ["ca-central-1", "jskit.connectors.aws.regions.caCentral1"], ["me-south-1", "jskit.connectors.aws.regions.meSouth1"], ["af-south-1", "jskit.connectors.aws.regions.afSouth1"]
10
10
  ];
11
11
  const awsSettings = {
12
12
  region: { type: "string", enum: regions.map(([value]) => value), defaultTo: "us-east-1" },
@@ -14,14 +14,14 @@ const awsSettings = {
14
14
  sessionTokenRef: { ...secretReference, required: false }
15
15
  };
16
16
  const awsFields = [
17
- { name: "region", label: "AWS Region", items: regions.map(([value, title]) => ({ value, title: `${title} (${value})` })) },
18
- { name: "accessKeyIdRef", environmentCredential: { label: "AWS access key ID", public: false }, label: "Access key ID reference", placeholder: "env:AWS_ACCESS_KEY_ID", hint: "Store the access key ID in Env and enter its reference." },
19
- { name: "sessionTokenRef", environmentCredential: { label: "AWS session token", public: false }, label: "Session token reference (optional)", placeholder: "env:AWS_SESSION_TOKEN", hint: "Required with temporary STS credentials. The host must renew all three credential bindings before they expire." }
17
+ { name: "region", label: "jskit.connectors.aws.fields.region.label", items: regions.map(([value, key]) => ({ value, title: { key, params: { region: value } } })) },
18
+ { name: "accessKeyIdRef", environmentCredential: { label: "jskit.connectors.aws.fields.accessKeyIdRef.environmentCredential.label", public: false }, label: "jskit.connectors.aws.fields.accessKeyIdRef.label", placeholder: "env:AWS_ACCESS_KEY_ID", hint: "jskit.connectors.aws.fields.accessKeyIdRef.hint" },
19
+ { name: "sessionTokenRef", environmentCredential: { label: "jskit.connectors.aws.fields.sessionTokenRef.environmentCredential.label", public: false }, label: "jskit.connectors.aws.fields.sessionTokenRef.label", placeholder: "env:AWS_SESSION_TOKEN", hint: "jskit.connectors.aws.fields.sessionTokenRef.hint" }
20
20
  ];
21
21
  const awsCredentials = {
22
22
  accountModes: ["shared", "assistant"], authenticationMethods: ["api-key"],
23
- apiKeyReferenceLabel: "Secret access key reference",
24
- apiKeyReferenceHint: "Use a reference such as env:AWS_SECRET_ACCESS_KEY. Credentials belong to the configured AWS account; host defaults are never used."
23
+ apiKeyReferenceLabel: "jskit.connectors.aws.credentials.apiKeyReferenceLabel",
24
+ apiKeyReferenceHint: "jskit.connectors.aws.credentials.apiKeyReferenceHint"
25
25
  };
26
26
  const bucketName = {
27
27
  type: "string", required: true, minLength: 3, maxLength: 63,
@@ -30,15 +30,15 @@ const bucketName = {
30
30
  !/(-s3alias|--ol-s3|\.mrap|--x-s3|--table-s3|-an)$/u.test(value)) || "Enter a general purpose S3 bucket name, not an ARN, URL or directory bucket."
31
31
  };
32
32
  const awsS3Definition = Object.freeze({
33
- id: "aws-s3", name: "AWS S3", description: "List bucket objects and create short-lived download or upload URLs.",
33
+ id: "aws-s3", name: "AWS S3", description: "jskit.connectors.awsS3.description",
34
34
  ...awsCredentials,
35
- permissionsHint: "These choices limit the application's operations. AWS IAM and bucket policies decide actual access; selecting a permission does not grant it in AWS.",
35
+ permissionsHint: "jskit.connectors.awsS3.permissionsHint",
36
36
  scopes: [
37
- { value: "read", label: "List and download objects from bucket", required: true, recommended: true },
38
- { value: "write", label: "Also upload objects via pre-signed URLs", recommended: true }
37
+ { value: "read", label: "jskit.connectors.awsS3.scopes.read.label", required: true, recommended: true },
38
+ { value: "write", label: "jskit.connectors.awsS3.scopes.write.label", recommended: true }
39
39
  ],
40
40
  settingsSchema: createSchema({ ...awsSettings, bucket: bucketName }),
41
- settingsFields: [{ name: "bucket", label: "Bucket name", placeholder: "my-app-files" }, ...awsFields],
41
+ settingsFields: [{ name: "bucket", label: "jskit.connectors.awsS3.fields.bucket.label", placeholder: "my-app-files" }, ...awsFields],
42
42
  setup: { url: "https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-presigned-url.html", steps: [
43
43
  "In Amazon S3, select a general purpose bucket and copy its name and region. Keep public access blocked.",
44
44
  "Use an IAM identity limited to this bucket: ListBucket and GetObject, plus PutObject only for uploads. Additional encryption permissions may be required.",
@@ -49,7 +49,7 @@ const awsS3Definition = Object.freeze({
49
49
  ] }
50
50
  });
51
51
  const awsAthenaDefinition = Object.freeze({
52
- id: "aws-athena", name: "AWS Athena", description: "Browse data catalogs and schemas; start, inspect, page through and cancel queries in a configured workgroup.",
52
+ id: "aws-athena", name: "AWS Athena", description: "jskit.connectors.awsAthena.description",
53
53
  ...awsCredentials, scopes: [],
54
54
  settingsSchema: createSchema({ ...awsSettings,
55
55
  workgroup: { type: "string", minLength: 1, maxLength: 128, defaultTo: "primary", pattern: "^[a-zA-Z0-9._-]+$" },
@@ -57,8 +57,8 @@ const awsAthenaDefinition = Object.freeze({
57
57
  /^s3:\/\/[a-z0-9][a-z0-9.-]{1,61}[a-z0-9]\/(?:[^\s?#\\]*)$/u.test(value) || "Enter an s3://bucket/prefix/ location without query parameters or fragments." }
58
58
  }),
59
59
  settingsFields: [...awsFields,
60
- { name: "workgroup", label: "Workgroup (optional)", placeholder: "primary", hint: "Defaults to primary. Query access is restricted to this workgroup." },
61
- { name: "resultLocation", label: "Query result location (optional)", placeholder: "s3://my-query-results/athena/", hint: "Leave blank when the workgroup supplies its own result storage. Enforced workgroup settings take precedence." }
60
+ { name: "workgroup", label: "jskit.connectors.awsAthena.fields.workgroup.label", placeholder: "primary", hint: "jskit.connectors.awsAthena.fields.workgroup.hint" },
61
+ { name: "resultLocation", label: "jskit.connectors.awsAthena.fields.resultLocation.label", placeholder: "s3://my-query-results/athena/", hint: "jskit.connectors.awsAthena.fields.resultLocation.hint" }
62
62
  ],
63
63
  setup: { url: "https://docs.aws.amazon.com/athena/latest/ug/creating-workgroups.html", steps: [
64
64
  "In the Athena console, select the region and open Workgroups in the navigation pane. Select an existing SQL workgroup, or choose Create workgroup, enter its name, choose Athena SQL and AWS Identity and Access Management (IAM) authentication. This connector does not use Spark or IAM Identity Center workgroups.",
@@ -10,27 +10,27 @@ function validateCanvaClientId(value) {
10
10
  }
11
11
 
12
12
  const canvaDefinition = Object.freeze({
13
- id: "canva", name: "Canva", description: "Discover and use Canva design tools through each assistant owner's account.",
13
+ id: "canva", name: "Canva", description: "jskit.connectors.canva.description",
14
14
  accountModes: ["assistant"], authenticationMethods: ["oauth2"], oauthClientAuthenticationMethods: ["none"],
15
- clientIdLabel: "Client metadata URL", clientIdHint: "Serve your client metadata JSON at this HTTPS URL. Canva must approve the callback; this setup uses no client secret.",
15
+ clientIdLabel: "jskit.connectors.canva.clientIdLabel", clientIdHint: "jskit.connectors.canva.clientIdHint",
16
16
  validateClientId: validateCanvaClientId,
17
17
  scopes: [
18
- { value: "profile:read", label: "Read your profile", recommended: true },
19
- { value: "design:meta:read", label: "Read design information", recommended: true },
20
- { value: "design:content:write", label: "Create and edit designs" },
21
- { value: "design:content:read", label: "Read design content", recommended: true },
22
- { value: "folder:read", label: "Read folders", recommended: true },
23
- { value: "folder:write", label: "Create and edit folders" },
24
- { value: "brandtemplate:content:read", label: "Read brand template content" },
25
- { value: "brandtemplate:meta:read", label: "Read brand template information" },
26
- { value: "brandtemplate:content:write", label: "Create and edit brand templates" },
27
- { value: "comment:write", label: "Write comments" },
28
- { value: "comment:read", label: "Read comments" },
29
- { value: "asset:read", label: "Read assets" },
30
- { value: "asset:write", label: "Upload and edit assets" },
31
- { value: "brandkit:read", label: "Read brand kits" },
32
- { value: "help:answers:read", label: "Read help answers" },
33
- { value: "help:answers:write", label: "Write help answers" }
18
+ { value: "profile:read", label: "jskit.connectors.canva.scopes.profileRead.label", recommended: true },
19
+ { value: "design:meta:read", label: "jskit.connectors.canva.scopes.designMetaRead.label", recommended: true },
20
+ { value: "design:content:write", label: "jskit.connectors.canva.scopes.designContentWrite.label" },
21
+ { value: "design:content:read", label: "jskit.connectors.canva.scopes.designContentRead.label", recommended: true },
22
+ { value: "folder:read", label: "jskit.connectors.canva.scopes.folderRead.label", recommended: true },
23
+ { value: "folder:write", label: "jskit.connectors.canva.scopes.folderWrite.label" },
24
+ { value: "brandtemplate:content:read", label: "jskit.connectors.canva.scopes.brandtemplateContentRead.label" },
25
+ { value: "brandtemplate:meta:read", label: "jskit.connectors.canva.scopes.brandtemplateMetaRead.label" },
26
+ { value: "brandtemplate:content:write", label: "jskit.connectors.canva.scopes.brandtemplateContentWrite.label" },
27
+ { value: "comment:write", label: "jskit.connectors.canva.scopes.commentWrite.label" },
28
+ { value: "comment:read", label: "jskit.connectors.canva.scopes.commentRead.label" },
29
+ { value: "asset:read", label: "jskit.connectors.canva.scopes.assetRead.label" },
30
+ { value: "asset:write", label: "jskit.connectors.canva.scopes.assetWrite.label" },
31
+ { value: "brandkit:read", label: "jskit.connectors.canva.scopes.brandkitRead.label" },
32
+ { value: "help:answers:read", label: "jskit.connectors.canva.scopes.helpAnswersRead.label" },
33
+ { value: "help:answers:write", label: "jskit.connectors.canva.scopes.helpAnswersWrite.label" }
34
34
  ],
35
35
  setup: {
36
36
  url: "https://www.canva.dev/docs/mcp/",
@@ -1,14 +1,14 @@
1
1
  import { createSchema } from "json-rest-schema";
2
2
 
3
3
  const chargebeeDefinition = Object.freeze({
4
- id: "chargebee", name: "Chargebee", description: "Manage customers and subscriptions, read invoices and launch hosted checkout for a Chargebee site.",
4
+ id: "chargebee", name: "Chargebee", description: "jskit.connectors.chargebee.description",
5
5
  accountModes: ["shared", "assistant"], authenticationMethods: ["api-key"], scopes: [],
6
6
  settingsSchema: createSchema({
7
7
  siteName: { type: "string", required: true, minLength: 1, maxLength: 63,
8
8
  validator: (value) => /^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/iu.test(value) || "Enter the site name without .chargebee.com, a URL or spaces." }
9
9
  }),
10
- settingsFields: [{ name: "siteName", label: "Site name", placeholder: "acme-test",
11
- hint: "Your Chargebee site name, without .chargebee.com. Test and live sites use different keys." }],
10
+ settingsFields: [{ name: "siteName", label: "jskit.connectors.chargebee.fields.siteName.label", placeholder: "acme-test",
11
+ hint: "jskit.connectors.chargebee.fields.siteName.hint" }],
12
12
  setup: {
13
13
  url: "https://www.chargebee.com/docs/billing/2.0/site-configuration/api_keys",
14
14
  steps: [
@@ -2,23 +2,23 @@ import { createSchema } from "json-rest-schema";
2
2
  import { httpsSiteUrlField } from "./siteUrl.js";
3
3
 
4
4
  const clickhouseDefinition = Object.freeze({
5
- id: "clickhouse", name: "ClickHouse", description: "Explore tables and run bounded, parameterized analytical reads on your ClickHouse database.",
5
+ id: "clickhouse", name: "ClickHouse", description: "jskit.connectors.clickhouse.description",
6
6
  accountModes: ["shared", "assistant"], authenticationMethods: ["api-key", "none"], scopes: [],
7
- authenticationLabels: { "api-key": "Username and password", none: "No credentials" },
8
- authenticationHint: "No credentials uses the server's default user. Choose it only for a server configured to allow that access.",
7
+ authenticationLabels: { "api-key": "jskit.connectors.clickhouse.authenticationLabels.apiKey", none: "jskit.connectors.clickhouse.authenticationLabels.none" },
8
+ authenticationHint: "jskit.connectors.clickhouse.authenticationHint",
9
9
  apiKeySecretOptional: true,
10
- apiKeyReferenceLabel: "Password reference (optional)",
11
- apiKeyReferenceHint: "Use a reference such as env:CLICKHOUSE_PASSWORD. Leave blank only if this database user has an empty password.",
10
+ apiKeyReferenceLabel: "jskit.connectors.clickhouse.apiKeyReferenceLabel",
11
+ apiKeyReferenceHint: "jskit.connectors.clickhouse.apiKeyReferenceHint",
12
12
  settingsSchema: createSchema({
13
13
  httpUrl: httpsSiteUrlField,
14
14
  username: { type: "string", minLength: 1, maxLength: 256,
15
15
  validator: (value) => !/[:\p{Cc}]/u.test(value) || "Enter a username without colons or control characters." }
16
16
  }),
17
17
  settingsFields: [
18
- { name: "httpUrl", label: "HTTP Interface URL", placeholder: "https://service.example.clickhouse.cloud:8443",
19
- hint: "Use the HTTPS query endpoint, including its port and any proxy path. Native TCP addresses do not work here." },
20
- { name: "username", label: "Username (optional)", placeholder: "default", authenticationMethods: ["api-key"],
21
- hint: "The database user, not your Cloud console login. Leave blank to use default." }
18
+ { name: "httpUrl", label: "jskit.connectors.clickhouse.fields.httpUrl.label", placeholder: "https://service.example.clickhouse.cloud:8443",
19
+ hint: "jskit.connectors.clickhouse.fields.httpUrl.hint" },
20
+ { name: "username", label: "jskit.connectors.clickhouse.fields.username.label", placeholder: "default", authenticationMethods: ["api-key"],
21
+ hint: "jskit.connectors.clickhouse.fields.username.hint" }
22
22
  ],
23
23
  setup: {
24
24
  url: "https://clickhouse.com/docs/products/cloud/guides/sql-console/connection-details",
@@ -1,8 +1,8 @@
1
1
  const confidenceScopes = [
2
- { value: "openid", label: "Identify the connected Confidence account", recommended: true },
3
- { value: "profile", label: "Read account profile", recommended: true },
4
- { value: "email", label: "Read account email", recommended: true },
5
- { value: "offline_access", label: "Refresh access without repeating sign-in", recommended: true }
2
+ { value: "openid", label: "jskit.connectors.confidence.scopes.openid.label", recommended: true },
3
+ { value: "profile", label: "jskit.connectors.confidence.scopes.profile.label", recommended: true },
4
+ { value: "email", label: "jskit.connectors.confidence.scopes.email.label", recommended: true },
5
+ { value: "offline_access", label: "jskit.connectors.confidence.scopes.offlineAccess.label", recommended: true }
6
6
  ];
7
7
 
8
8
  function definition(id, name, description) {
@@ -22,7 +22,7 @@ function definition(id, name, description) {
22
22
  });
23
23
  }
24
24
 
25
- const confidenceFlagsDefinition = definition("confidence-flags", "Confidence Flags", "Manage Confidence flags through the assistant owner's MCP connection.");
26
- const confidenceExpDefinition = definition("confidence-exp", "Confidence Exp", "Read Confidence experiments and results through the assistant owner's MCP connection.");
25
+ const confidenceFlagsDefinition = definition("confidence-flags", "Confidence Flags", "jskit.connectors.confidenceFlags.description");
26
+ const confidenceExpDefinition = definition("confidence-exp", "Confidence Exp", "jskit.connectors.confidenceExp.description");
27
27
 
28
28
  export { confidenceFlagsDefinition, confidenceExpDefinition };
@@ -5,22 +5,22 @@ function validWorkspaceUrl(value) {
5
5
  return /^https:\/\/(?:dbc-[a-z0-9]+(?:-[a-z0-9]+)*\.cloud\.databricks\.com|adb-[0-9]+\.[0-9]+\.azuredatabricks\.net|[0-9]+\.[0-9]+\.gcp\.databricks\.com)\/?$/u.test(value);
6
6
  }
7
7
  const scopes = [
8
- { value: "all-apis", label: "APIs allowed by the connected account", recommended: true },
9
- { value: "offline_access", label: "Keep user access between visits", recommended: true },
10
- { value: "jobs", label: "Jobs API access for the service account" }
8
+ { value: "all-apis", label: "jskit.connectors.databricks.scopes.allApis.label", recommended: true },
9
+ { value: "offline_access", label: "jskit.connectors.databricks.scopes.offlineAccess.label", recommended: true },
10
+ { value: "jobs", label: "jskit.connectors.databricks.scopes.jobs.label" }
11
11
  ];
12
12
  const databricksDefinition = Object.freeze({
13
- id: "databricks", name: "Databricks", description: "Read workspace jobs through user consent or a service principal.",
13
+ id: "databricks", name: "Databricks", description: "jskit.connectors.databricks.description",
14
14
  accountModes: ["shared", "per-user", "assistant"], authenticationMethods: ["oauth2"],
15
15
  oauthGrantTypes: ["authorization_code", "client_credentials"],
16
16
  oauthClientAuthenticationMethods: (grantType) => grantType === "client_credentials" ? ["client_secret_basic"] : ["client_secret_post"],
17
- oauthGrantHint: "User consent needs a custom OAuth application. Service account needs a service principal's client ID and OAuth secret, without a callback.",
17
+ oauthGrantHint: "jskit.connectors.databricks.oauthGrantHint",
18
18
  settingsSchema: createSchema({ workspaceUrl: { type: "string", required: true, maxLength: 253,
19
19
  validator: (value) => validWorkspaceUrl(value) || "Enter the HTTPS per-workspace URL for Databricks on AWS, Azure or Google Cloud, without a path or query." } }),
20
- settingsFields: [{ name: "workspaceUrl", label: "Workspace URL", placeholder: "https://dbc-abc123.cloud.databricks.com",
21
- hint: "Use the workspace's own address. Omit browser paths, query strings and account-console URLs." }],
20
+ settingsFields: [{ name: "workspaceUrl", label: "jskit.connectors.databricks.fields.workspaceUrl.label", placeholder: "https://dbc-abc123.cloud.databricks.com",
21
+ hint: "jskit.connectors.databricks.fields.workspaceUrl.hint" }],
22
22
  scopes, scopesForGrantType: (grantType) => scopes.filter((scope) => grantType === "client_credentials" ? scope.value !== "offline_access" : scope.value !== "jobs"),
23
- permissionsHint: "Permissions also depend on workspace membership and resource access. The jobs fragment only reads metadata; these OAuth scopes can permit more in other clients.",
23
+ permissionsHint: "jskit.connectors.databricks.permissionsHint",
24
24
  setup: { url: "https://docs.databricks.com/aws/en/integrations/enable-disable-oauth", steps: [
25
25
  "Enter the intended workspace's HTTPS origin in Workspace URL. Choose User consent for a custom OAuth application, or Service account for a service principal; these require different credentials.",
26
26
  "For User consent, an account admin opens account console > Settings > App connections > Add connection. Enter the app name and exact suggested callback, choose All APIs, generate a confidential client secret, set token lifetimes and add the connection. Copy the client ID and one-time secret. Activation can take 30 minutes.",
@@ -3,20 +3,20 @@ import { createSchema } from "json-rest-schema";
3
3
  const label = "[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?";
4
4
  const hostPattern = new RegExp(`^(?:semantic-layer\\.${label}\\.(?:getdbt|dbt)\\.com|${label}\\.semantic-layer\\.${label}\\.dbt\\.com)$`, "u");
5
5
  const dbtSemanticLayerDefinition = Object.freeze({
6
- id: "dbt-semantic-layer", name: "dbt Semantic Layer", description: "Discover metrics and query their values in a dbt Semantic Layer environment.",
6
+ id: "dbt-semantic-layer", name: "dbt Semantic Layer", description: "jskit.connectors.dbtSemanticLayer.description",
7
7
  accountModes: ["shared", "assistant"], authenticationMethods: ["api-key"], scopes: [],
8
- apiKeyReferenceLabel: "Service token reference",
9
- apiKeyReferenceHint: "Store the dbt service token in Env. It needs Semantic Layer Only and Metadata Only permissions and a linked warehouse credential.",
8
+ apiKeyReferenceLabel: "jskit.connectors.dbtSemanticLayer.apiKeyReferenceLabel",
9
+ apiKeyReferenceHint: "jskit.connectors.dbtSemanticLayer.apiKeyReferenceHint",
10
10
  settingsSchema: createSchema({
11
11
  host: { type: "string", required: true, maxLength: 253, validator: (value) => hostPattern.test(value) || "Enter the lowercase dbt Semantic Layer hostname without a URL, path or port." },
12
12
  environmentId: { type: "string", required: true, noTrim: true, maxLength: 38,
13
13
  validator: (value, object, context) => (typeof context.valueBeforeCast === "string" && /^[1-9][0-9]*$/u.test(value)) || "Enter a positive decimal Environment ID as text, without spaces or leading zeros." }
14
14
  }),
15
15
  settingsFields: [
16
- { name: "host", label: "Semantic Layer host", placeholder: "semantic-layer.cloud.getdbt.com",
17
- hint: "Copy the GraphQL hostname from dbt's Semantic Layer settings. Regional, single-tenant and multi-cell dbt hosts are supported." },
18
- { name: "environmentId", label: "Environment ID", placeholder: "70506183142324",
19
- hint: "The deployment environment containing your metrics. Keep the full ID as text to avoid rounding." }
16
+ { name: "host", label: "jskit.connectors.dbtSemanticLayer.fields.host.label", placeholder: "semantic-layer.cloud.getdbt.com",
17
+ hint: "jskit.connectors.dbtSemanticLayer.fields.host.hint" },
18
+ { name: "environmentId", label: "jskit.connectors.dbtSemanticLayer.fields.environmentId.label", placeholder: "70506183142324",
19
+ hint: "jskit.connectors.dbtSemanticLayer.fields.environmentId.hint" }
20
20
  ],
21
21
  setup: { url: "https://docs.getdbt.com/docs/use-dbt-semantic-layer/setup-sl", steps: [
22
22
  "Open Account settings > Settings > Projects and select the project. In Project details, choose Semantic Layer > Configure Semantic Layer, select the deployment environment and Save. Metrics, a successful deployment run and a supported data platform must already exist.",
@@ -0,0 +1,6 @@
1
+ // "@jskit-ai/connectors-catalog/shared/ai" in English; the keyed texts are in ai.js.
2
+ import { aiAccessLabels as keyedAccessLabels, aiDefinition as keyedDefinition } from "./ai.js";
3
+ import { englishTexts } from "./english-texts.js";
4
+
5
+ export { aiCatalogue, getAiModel, listAiModels } from "./ai.js";
6
+ export const { aiAccessLabels, aiDefinition } = englishTexts({ aiAccessLabels: keyedAccessLabels, aiDefinition: keyedDefinition });
@@ -0,0 +1,34 @@
1
+ // The browser-safe catalog ("@jskit-ai/connectors-catalog/shared") in English; the
2
+ // keyed definitions are in definitions.js (see connectors-core createEnglishProviderTexts).
3
+ import * as keyedDefinitions from "./definitions.js";
4
+ import { englishTexts } from "./english-texts.js";
5
+
6
+ export { createCanvaClientMetadata, validN8nOAuthDiscovery } from "./definitions.js";
7
+ export const {
8
+ aiDefinition, airtableDefinition, algoliaDefinition, amazonRedshiftDefinition, apifyDefinition,
9
+ apolloIoDefinition, asanaDefinition, ashbyDefinition, atlassianDefinition, attentionDefinition,
10
+ awsAthenaDefinition, awsS3Definition, bigqueryDefinition, brevoDefinition, calendlyDefinition,
11
+ canvaDefinition, chargebeeDefinition, clayDefinition, clickhouseDefinition,
12
+ confidenceExpDefinition, confidenceFlagsDefinition, connectorDefinitions, contentfulDefinition,
13
+ databricksDefinition, dbtSemanticLayerDefinition, elevenlabsDefinition, figmaDefinition,
14
+ firebaseCloudMessagingDefinition, firecrawlDefinition, firefliesDefinition,
15
+ fireworksAiDefinition, gatewayApiDefinition, geminiEnterpriseDefinition, githubApiDefinition,
16
+ gitlabApiDefinition, gmailDefinition, gongDefinition, googleAdsDefinition,
17
+ googleAnalyticsDefinition, googleDefinitions, googleDocsDefinition, googleDriveDefinition,
18
+ googleMapsPlatformDefinition, googleSearchConsoleDefinition, googleSheetsDefinition,
19
+ googleSlidesDefinition, granolaDefinition, hexDefinition, heygenDefinition, hubspotDefinition,
20
+ incidentIoDefinition, inngestDefinition, klipyDefinition, lexwareDefinition,
21
+ lightspeedDefinition, linearDefinition, linkedinDefinition, logoDevDefinition, mailgunDefinition,
22
+ mapboxDefinition, microsoftDefinitions, microsoftExcelDefinition, microsoftOneDriveDefinition,
23
+ microsoftOneNoteDefinition, microsoftOutlookDefinition, microsoftPowerPointDefinition,
24
+ microsoftSharePointDefinition, microsoftTeamsDefinition, microsoftWordDefinition, miroDefinition,
25
+ n8nDefinition, notionDefinition, ouraDefinition, paddleDefinition, perplexityDefinition,
26
+ pipedriveDefinition, polarDefinition, posthogDefinition, prestashopDefinition,
27
+ replicateDefinition, resendDefinition, salesforceDefinition, sanityDefinition, semrushDefinition,
28
+ sentryDefinition, sevdeskDefinition, shopifyDefinition, slackDefinition, snowflakeDefinition,
29
+ storyblokDefinition, stripeDefinition, supabaseDefinition, tallyDefinition, telegramDefinition,
30
+ tiktokDefinition, tokenDefinitions, twilioDefinition, twitchDefinition, waveDefinition,
31
+ wixDefinition, wizDefinition, woocommerceDefinition, wordpressComDefinition,
32
+ wordpressSelfHostedDefinition, workdayDefinition, xTwitterDefinition, xeroDefinition,
33
+ zohoBooksDefinition, zohoCrmDefinition
34
+ } = englishTexts({ ...keyedDefinitions });
@@ -0,0 +1,7 @@
1
+ import { createEnglishProviderTexts } from "@jskit-ai/connectors-core/shared/configuration";
2
+ import en from "../../locales/en.json" with { type: "json" };
3
+
4
+ // One renderer for both English entries, so an English definition is the same object in each.
5
+ const englishTexts = createEnglishProviderTexts(en);
6
+
7
+ export { englishTexts };
@@ -1,7 +1,7 @@
1
1
  const figmaDefinition = Object.freeze({
2
- id: "figma", name: "Figma", description: "Discover and call Figma's remote design tools through the assistant owner's account.",
2
+ id: "figma", name: "Figma", description: "jskit.connectors.figma.description",
3
3
  accountModes: ["assistant"], authenticationMethods: ["oauth2"],
4
- scopes: [{ value: "mcp:connect", label: "Use Figma MCP tools", recommended: true }],
4
+ scopes: [{ value: "mcp:connect", label: "jskit.connectors.figma.scopes.mcpConnect.label", recommended: true }],
5
5
  setup: {
6
6
  url: "https://developers.figma.com/docs/figma-mcp-server/",
7
7
  clientRegistrationEndpoint: "https://api.figma.com/v1/oauth/mcp/register",
@@ -15,20 +15,20 @@ const webSettings = createSchema({ ...common,
15
15
  validator: (value) => /^B[A-Za-z0-9_-]{85}[AEIMQUYcgkosw048]$/u.test(value) || "Enter the public Web Push certificate key from Firebase, not a private key." }
16
16
  });
17
17
  const firebaseCloudMessagingDefinition = Object.freeze({
18
- id: "firebase-cloud-messaging", name: "Firebase Cloud Messaging", description: "Send notifications to mobile and browser installations, tokens or topics.",
18
+ id: "firebase-cloud-messaging", name: "Firebase Cloud Messaging", description: "jskit.connectors.firebaseCloudMessaging.description",
19
19
  accountModes: ["shared", "assistant"], authenticationMethods: ["service-account"],
20
- serviceAccountReferenceLabel: "Service-account JSON reference",
21
- serviceAccountReferenceHint: "Store the complete service-account JSON in Env, then enter its reference. It stays on the server and is never included in the browser configuration.",
22
- scopes: [{ value: firebaseMessagingScope, label: "Validate and send Firebase messages", recommended: true }],
23
- permissionsHint: "Firebase IAM controls which projects this service account can send to. Sending to an audience also requires your application's authorization.",
20
+ serviceAccountReferenceLabel: "jskit.connectors.firebaseCloudMessaging.serviceAccountReferenceLabel",
21
+ serviceAccountReferenceHint: "jskit.connectors.firebaseCloudMessaging.serviceAccountReferenceHint",
22
+ scopes: [{ value: firebaseMessagingScope, label: "jskit.connectors.firebaseCloudMessaging.scopes.firebaseMessagingScope.label", recommended: true }],
23
+ permissionsHint: "jskit.connectors.firebaseCloudMessaging.permissionsHint",
24
24
  settingsSchema: (settings = {}) => settings.clientMode === "web" ? webSettings : serverSettings,
25
25
  settingsFields: [
26
- { name: "projectId", label: "Firebase project ID", placeholder: "my-notifications-app", hint: "The project receiving messages. Usually project_id in your JSON; cross-project access requires an IAM grant on this target project." },
27
- { name: "clientMode", label: "Client setup", items: [{ value: "server", title: "Server or native only" }, { value: "web", title: "Include web push" }],
28
- hint: "Existing mobile/browser targets need server credentials. Include web push to configure browser registration too." },
29
- { name: "apiKey", label: "Firebase API key", placeholder: "AIzaSyXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", hint: "Public API key from the Firebase web app configuration. This value is visible in your deployed app." },
30
- { name: "appId", label: "Firebase App ID", placeholder: "1:123456789012:web:abcdef1234567890", hint: "Public appId from the same Firebase project and web app." },
31
- { name: "vapidKey", label: "Web Push VAPID key", placeholder: "BEl62...", hint: "Public key from Project settings > Cloud Messaging > Web Push certificates. Never paste the private VAPID key." }
26
+ { name: "projectId", label: "jskit.connectors.firebaseCloudMessaging.fields.projectId.label", placeholder: "my-notifications-app", hint: "jskit.connectors.firebaseCloudMessaging.fields.projectId.hint" },
27
+ { name: "clientMode", label: "jskit.connectors.firebaseCloudMessaging.fields.clientMode.label", items: [{ value: "server", title: "jskit.connectors.firebaseCloudMessaging.fields.clientMode.items.server.title" }, { value: "web", title: "jskit.connectors.firebaseCloudMessaging.fields.clientMode.items.web.title" }],
28
+ hint: "jskit.connectors.firebaseCloudMessaging.fields.clientMode.hint" },
29
+ { name: "apiKey", label: "jskit.connectors.firebaseCloudMessaging.fields.apiKey.label", placeholder: "AIzaSyXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", hint: "jskit.connectors.firebaseCloudMessaging.fields.apiKey.hint" },
30
+ { name: "appId", label: "jskit.connectors.firebaseCloudMessaging.fields.appId.label", placeholder: "1:123456789012:web:abcdef1234567890", hint: "jskit.connectors.firebaseCloudMessaging.fields.appId.hint" },
31
+ { name: "vapidKey", label: "jskit.connectors.firebaseCloudMessaging.fields.vapidKey.label", placeholder: "BEl62...", hint: "jskit.connectors.firebaseCloudMessaging.fields.vapidKey.hint" }
32
32
  ],
33
33
  setup: { url: "https://firebase.google.com/docs/cloud-messaging/send/v1-api", steps: [
34
34
  "Open the target Firebase project. In Project settings > General, copy its project ID. Enable Firebase Cloud Messaging API (HTTP v1) if disabled.",
@@ -1,5 +1,5 @@
1
1
  const firecrawlDefinition = Object.freeze({
2
- id: "firecrawl", name: "Firecrawl", description: "Search, map, scrape and extract web content; run bounded site crawls.",
2
+ id: "firecrawl", name: "Firecrawl", description: "jskit.connectors.firecrawl.description",
3
3
  accountModes: ["shared", "assistant"], authenticationMethods: ["api-key"], scopes: [],
4
4
  setup: {
5
5
  url: "https://docs.firecrawl.dev/introduction",
@@ -3,7 +3,7 @@ import { createSchema } from "json-rest-schema";
3
3
  const geminiEnterpriseScope = "https://www.googleapis.com/auth/cloud-platform";
4
4
  const geminiEnterpriseDefinition = Object.freeze({
5
5
  id: "gemini-enterprise", name: "Gemini Enterprise",
6
- description: "Search documents in a configured Gemini Enterprise engine.",
6
+ description: "jskit.connectors.geminiEnterprise.description",
7
7
  accountModes: ["shared", "assistant"], authenticationMethods: ["oauth2"],
8
8
  oauthClientAuthenticationMethods: ["client_secret_post", "client_secret_basic"],
9
9
  settingsSchema: createSchema({
@@ -14,13 +14,13 @@ const geminiEnterpriseDefinition = Object.freeze({
14
14
  validator: (value) => /^[a-z0-9][a-z0-9_-]*$/u.test(value) || "Enter the engine ID, starting with a lowercase letter or digit and using only lowercase letters, digits, hyphens or underscores." }
15
15
  }),
16
16
  settingsFields: [
17
- { name: "projectId", label: "GCP project ID", placeholder: "my-gcp-project", hint: "The Google Cloud project where the Gemini Enterprise app lives." },
18
- { name: "location", label: "Location", items: [{ value: "global", title: "Global" }, { value: "us", title: "United States" }, { value: "eu", title: "European Union" }],
19
- hint: "Match the engine's location. The runtime uses the corresponding Google API endpoint." },
20
- { name: "engineId", label: "Engine ID", placeholder: "my-search-engine", hint: "The existing search app identifier in default_collection, not its display name or full resource path." }
17
+ { name: "projectId", label: "jskit.connectors.geminiEnterprise.fields.projectId.label", placeholder: "my-gcp-project", hint: "jskit.connectors.geminiEnterprise.fields.projectId.hint" },
18
+ { name: "location", label: "jskit.connectors.geminiEnterprise.fields.location.label", items: [{ value: "global", title: "jskit.connectors.geminiEnterprise.fields.location.items.global.title" }, { value: "us", title: "jskit.connectors.geminiEnterprise.fields.location.items.us.title" }, { value: "eu", title: "jskit.connectors.geminiEnterprise.fields.location.items.eu.title" }],
19
+ hint: "jskit.connectors.geminiEnterprise.fields.location.hint" },
20
+ { name: "engineId", label: "jskit.connectors.geminiEnterprise.fields.engineId.label", placeholder: "my-search-engine", hint: "jskit.connectors.geminiEnterprise.fields.engineId.hint" }
21
21
  ],
22
- scopes: [{ value: geminiEnterpriseScope, label: "Cloud Platform (full access)", recommended: true }],
23
- permissionsHint: "Google IAM and source permissions apply to the connected Google account. Shared access uses that same account for every authorized caller; it does not provide each app user's own search identity.",
22
+ scopes: [{ value: geminiEnterpriseScope, label: "jskit.connectors.geminiEnterprise.scopes.geminiEnterpriseScope.label", recommended: true }],
23
+ permissionsHint: "jskit.connectors.geminiEnterprise.permissionsHint",
24
24
  setup: { url: "https://docs.cloud.google.com/gemini/enterprise/docs/authentication", steps: [
25
25
  "In Google Cloud, select the project, enable the Discovery Engine API and create or select a Gemini Enterprise search app. Copy its project ID, location and engine ID.",
26
26
  "Grant the connecting Google account discoveryengine.engines.get and discoveryengine.servingConfigs.search on the target resources. Configure source access and any required Gemini Enterprise license separately.",
@@ -1,9 +1,9 @@
1
1
  import { createSchema } from "json-rest-schema";
2
2
 
3
3
  const gongDefinition = Object.freeze({
4
- id: "gong", name: "Gong", description: "Read company calls, transcripts, conversation statistics and linked CRM context.",
4
+ id: "gong", name: "Gong", description: "jskit.connectors.gong.description",
5
5
  accountModes: ["shared", "assistant"], authenticationMethods: ["api-key"], scopes: [],
6
- apiKeyReferenceLabel: "Access key secret reference",
6
+ apiKeyReferenceLabel: "jskit.connectors.gong.apiKeyReferenceLabel",
7
7
  settingsSchema: createSchema({
8
8
  accessKey: { type: "string", required: true, minLength: 1, maxLength: 512,
9
9
  validator: (value) => !/[:\s\p{Cc}]/u.test(value) || "Enter the access key without spaces, control characters or colons." },
@@ -12,9 +12,9 @@ const gongDefinition = Object.freeze({
12
12
  "Use https://api.gong.io or your company's https://<company>.api.gong.io address, without a path or query." }
13
13
  }),
14
14
  settingsFields: [
15
- { name: "accessKey", label: "Access key", hint: "Copy the access key identifier from Gong's API settings. Store its secret separately." },
16
- { name: "apiBaseUrl", label: "API base URL (optional)", placeholder: "https://api.gong.io",
17
- hint: "Copy the API base URL from Gong's API settings. Leave empty to use https://api.gong.io." }
15
+ { name: "accessKey", label: "jskit.connectors.gong.fields.accessKey.label", hint: "jskit.connectors.gong.fields.accessKey.hint" },
16
+ { name: "apiBaseUrl", label: "jskit.connectors.gong.fields.apiBaseUrl.label", placeholder: "https://api.gong.io",
17
+ hint: "jskit.connectors.gong.fields.apiBaseUrl.hint" }
18
18
  ],
19
19
  setup: {
20
20
  url: "https://help.gong.io/docs/receive-access-to-the-api",