@jskit-ai/connectors-catalog 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (399) hide show
  1. package/README.md +192 -0
  2. package/docs/ai-upstream-notices.md +51 -0
  3. package/docs/ai.md +191 -0
  4. package/docs/airtable.md +130 -0
  5. package/docs/algolia.md +190 -0
  6. package/docs/amazon-redshift.md +229 -0
  7. package/docs/amplitude.md +210 -0
  8. package/docs/apify.md +162 -0
  9. package/docs/apollo-io.md +200 -0
  10. package/docs/asana.md +126 -0
  11. package/docs/ashby.md +188 -0
  12. package/docs/atlassian.md +224 -0
  13. package/docs/attention.md +162 -0
  14. package/docs/aws-athena.md +150 -0
  15. package/docs/aws-credentials.md +75 -0
  16. package/docs/aws-s3.md +193 -0
  17. package/docs/bigquery.md +146 -0
  18. package/docs/brevo.md +122 -0
  19. package/docs/calendly.md +158 -0
  20. package/docs/canva.md +191 -0
  21. package/docs/chargebee.md +192 -0
  22. package/docs/clay.md +194 -0
  23. package/docs/clickhouse.md +242 -0
  24. package/docs/confidence-exp.md +74 -0
  25. package/docs/confidence-flags.md +75 -0
  26. package/docs/confidence-oauth.md +137 -0
  27. package/docs/contentful.md +123 -0
  28. package/docs/databricks.md +180 -0
  29. package/docs/dbt-semantic-layer.md +175 -0
  30. package/docs/elevenlabs.md +102 -0
  31. package/docs/figma.md +132 -0
  32. package/docs/firebase-cloud-messaging.md +262 -0
  33. package/docs/firecrawl.md +137 -0
  34. package/docs/fireflies.md +95 -0
  35. package/docs/fireworks-ai.md +53 -0
  36. package/docs/gatewayapi.md +113 -0
  37. package/docs/gemini-enterprise.md +224 -0
  38. package/docs/github-api.md +133 -0
  39. package/docs/gitlab-api.md +138 -0
  40. package/docs/gmail.md +133 -0
  41. package/docs/gong.md +205 -0
  42. package/docs/google-ads.md +156 -0
  43. package/docs/google-analytics.md +202 -0
  44. package/docs/google-docs.md +105 -0
  45. package/docs/google-drive.md +108 -0
  46. package/docs/google-maps-platform.md +208 -0
  47. package/docs/google-oauth.md +123 -0
  48. package/docs/google-search-console.md +124 -0
  49. package/docs/google-sheets.md +94 -0
  50. package/docs/google-slides.md +95 -0
  51. package/docs/granola.md +178 -0
  52. package/docs/hex.md +161 -0
  53. package/docs/heygen.md +124 -0
  54. package/docs/hubspot.md +142 -0
  55. package/docs/incident-io.md +118 -0
  56. package/docs/inngest.md +178 -0
  57. package/docs/klipy.md +149 -0
  58. package/docs/lexware.md +144 -0
  59. package/docs/lightspeed.md +193 -0
  60. package/docs/linear.md +137 -0
  61. package/docs/linkedin.md +196 -0
  62. package/docs/logo-dev.md +152 -0
  63. package/docs/mailgun.md +153 -0
  64. package/docs/mapbox.md +174 -0
  65. package/docs/microsoft-excel.md +97 -0
  66. package/docs/microsoft-fabric.md +249 -0
  67. package/docs/microsoft-oauth.md +143 -0
  68. package/docs/microsoft-onedrive.md +76 -0
  69. package/docs/microsoft-onenote.md +75 -0
  70. package/docs/microsoft-outlook.md +90 -0
  71. package/docs/microsoft-powerpoint.md +119 -0
  72. package/docs/microsoft-sharepoint.md +75 -0
  73. package/docs/microsoft-teams.md +72 -0
  74. package/docs/microsoft-word.md +119 -0
  75. package/docs/miro.md +117 -0
  76. package/docs/n8n.md +169 -0
  77. package/docs/notion.md +137 -0
  78. package/docs/oura.md +161 -0
  79. package/docs/paddle.md +168 -0
  80. package/docs/perplexity.md +85 -0
  81. package/docs/pipedrive.md +120 -0
  82. package/docs/polar.md +63 -0
  83. package/docs/posthog.md +227 -0
  84. package/docs/prestashop.md +151 -0
  85. package/docs/replicate.md +60 -0
  86. package/docs/resend.md +153 -0
  87. package/docs/salesforce.md +234 -0
  88. package/docs/sanity.md +122 -0
  89. package/docs/semrush.md +276 -0
  90. package/docs/sentry.md +112 -0
  91. package/docs/sevdesk.md +107 -0
  92. package/docs/shopify.md +206 -0
  93. package/docs/slack.md +257 -0
  94. package/docs/snowflake.md +271 -0
  95. package/docs/storyblok.md +130 -0
  96. package/docs/stripe.md +77 -0
  97. package/docs/supabase.md +51 -0
  98. package/docs/tally.md +105 -0
  99. package/docs/telegram.md +165 -0
  100. package/docs/tiktok.md +201 -0
  101. package/docs/twilio.md +284 -0
  102. package/docs/twitch.md +428 -0
  103. package/docs/wave.md +440 -0
  104. package/docs/wix.md +1249 -0
  105. package/docs/wiz.md +177 -0
  106. package/docs/woocommerce.md +400 -0
  107. package/docs/wordpress-com.md +358 -0
  108. package/docs/wordpress-self-hosted.md +252 -0
  109. package/docs/workday.md +292 -0
  110. package/docs/x-twitter.md +188 -0
  111. package/docs/xero.md +429 -0
  112. package/docs/zoho-books.md +214 -0
  113. package/docs/zoho-crm.md +192 -0
  114. package/package.json +153 -0
  115. package/patterns/ai-connections/PATTERN.md +84 -0
  116. package/patterns/ai-connections/example/ai-model.js +11 -0
  117. package/patterns/ai-connections/example/perplexity-answer.js +29 -0
  118. package/patterns/api-key-connection/PATTERN.md +368 -0
  119. package/patterns/api-key-connection/example/connections.js +18 -0
  120. package/patterns/api-key-connection/example/integrations.json +19 -0
  121. package/patterns/assistant-mcp/PATTERN.md +110 -0
  122. package/patterns/assistant-mcp/example/integrations.json +13 -0
  123. package/patterns/assistant-mcp-oauth/PATTERN.md +235 -0
  124. package/patterns/assistant-mcp-oauth/example/integrations.json +102 -0
  125. package/patterns/aws-storage-queries/PATTERN.md +169 -0
  126. package/patterns/aws-storage-queries/example/formats/data-formats.js +35 -0
  127. package/patterns/aws-storage-queries/example/formats/package-lock.json +49 -0
  128. package/patterns/aws-storage-queries/example/formats/package.json +12 -0
  129. package/patterns/aws-storage-queries/example/formats/verify-formats.mjs +37 -0
  130. package/patterns/aws-storage-queries/example/integrations.json +38 -0
  131. package/patterns/aws-storage-queries/example/s3-transfer.js +34 -0
  132. package/patterns/event-delivery/PATTERN.md +151 -0
  133. package/patterns/event-delivery/example/integrations.json +17 -0
  134. package/patterns/firebase-messaging/PATTERN.md +156 -0
  135. package/patterns/firebase-messaging/example/server/notifications.js +23 -0
  136. package/patterns/google-ads-search/PATTERN.md +92 -0
  137. package/patterns/google-ads-search/example/ads-setup.js +25 -0
  138. package/patterns/oauth-connection/PATTERN.md +724 -0
  139. package/patterns/oauth-connection/example/integrations.json +20 -0
  140. package/patterns/paddle-catalogue/PATTERN.md +78 -0
  141. package/patterns/paddle-catalogue/example/create-products.js +38 -0
  142. package/patterns/public-image/PATTERN.md +84 -0
  143. package/patterns/public-image/example/integrations.json +13 -0
  144. package/patterns/public-image/example/logo-url.js +16 -0
  145. package/patterns/redshift-queries/PATTERN.md +150 -0
  146. package/patterns/redshift-queries/example/integrations.json +33 -0
  147. package/patterns/source-scanning/PATTERN.md +83 -0
  148. package/patterns/source-scanning/example/source-scanner.js +13 -0
  149. package/src/client/firebase-cloud-messaging.js +10 -0
  150. package/src/client/google-analytics.js +72 -0
  151. package/src/client/google-maps-platform.js +39 -0
  152. package/src/client/logo-dev.js +36 -0
  153. package/src/server/ai.js +46 -0
  154. package/src/server/airtable.js +67 -0
  155. package/src/server/algolia.js +63 -0
  156. package/src/server/amazon-redshift.js +96 -0
  157. package/src/server/amplitude.js +31 -0
  158. package/src/server/apify.js +68 -0
  159. package/src/server/apollo-io.js +85 -0
  160. package/src/server/asana.js +64 -0
  161. package/src/server/ashby.js +61 -0
  162. package/src/server/atlassian.js +32 -0
  163. package/src/server/attention.js +93 -0
  164. package/src/server/aws-athena.js +82 -0
  165. package/src/server/aws-s3.js +49 -0
  166. package/src/server/awsTransport.js +75 -0
  167. package/src/server/bigquery.js +97 -0
  168. package/src/server/brevo.js +97 -0
  169. package/src/server/calendly.js +77 -0
  170. package/src/server/canva.js +13 -0
  171. package/src/server/chargebee.js +88 -0
  172. package/src/server/clay.js +78 -0
  173. package/src/server/clickhouse.js +66 -0
  174. package/src/server/confidence.js +29 -0
  175. package/src/server/contentful.js +40 -0
  176. package/src/server/databricks.js +55 -0
  177. package/src/server/dbt-semantic-layer.js +95 -0
  178. package/src/server/elevenlabs.js +81 -0
  179. package/src/server/figma.js +24 -0
  180. package/src/server/firebase-cloud-messaging.js +111 -0
  181. package/src/server/firecrawl.js +70 -0
  182. package/src/server/fireflies.js +31 -0
  183. package/src/server/fireworks-ai.js +16 -0
  184. package/src/server/gatewayapi.js +48 -0
  185. package/src/server/gemini-enterprise.js +47 -0
  186. package/src/server/github-api.js +90 -0
  187. package/src/server/gitlab-api.js +67 -0
  188. package/src/server/gmail.js +60 -0
  189. package/src/server/gong.js +52 -0
  190. package/src/server/google-ads-search.js +134 -0
  191. package/src/server/google-ads.js +80 -0
  192. package/src/server/google-docs.js +36 -0
  193. package/src/server/google-drive.js +71 -0
  194. package/src/server/google-maps-platform.js +90 -0
  195. package/src/server/google-search-console.js +31 -0
  196. package/src/server/google-sheets.js +60 -0
  197. package/src/server/google-slides.js +36 -0
  198. package/src/server/google.js +61 -0
  199. package/src/server/granola.js +115 -0
  200. package/src/server/graphqlOperation.js +15 -0
  201. package/src/server/hex.js +29 -0
  202. package/src/server/heygen.js +54 -0
  203. package/src/server/hubspot.js +85 -0
  204. package/src/server/incident-io.js +68 -0
  205. package/src/server/inngest.js +86 -0
  206. package/src/server/jsonOperation.js +34 -0
  207. package/src/server/klipy.js +34 -0
  208. package/src/server/lexware.js +59 -0
  209. package/src/server/lightspeed.js +82 -0
  210. package/src/server/linear.js +52 -0
  211. package/src/server/linkedin.js +74 -0
  212. package/src/server/mailgun.js +76 -0
  213. package/src/server/mapbox.js +46 -0
  214. package/src/server/mcpRegistration.js +41 -0
  215. package/src/server/mcpTransport.js +60 -0
  216. package/src/server/microsoft-excel.js +67 -0
  217. package/src/server/microsoft-fabric.js +81 -0
  218. package/src/server/microsoft-onedrive.js +58 -0
  219. package/src/server/microsoft-onenote.js +52 -0
  220. package/src/server/microsoft-outlook.js +58 -0
  221. package/src/server/microsoft-powerpoint.js +5 -0
  222. package/src/server/microsoft-sharepoint.js +46 -0
  223. package/src/server/microsoft-teams.js +29 -0
  224. package/src/server/microsoft-word.js +5 -0
  225. package/src/server/microsoft.js +88 -0
  226. package/src/server/miro.js +29 -0
  227. package/src/server/n8n.js +78 -0
  228. package/src/server/notion.js +76 -0
  229. package/src/server/oura.js +48 -0
  230. package/src/server/paddle.js +83 -0
  231. package/src/server/perplexity.js +15 -0
  232. package/src/server/pipedrive.js +95 -0
  233. package/src/server/polar.js +20 -0
  234. package/src/server/posthog.js +44 -0
  235. package/src/server/prestashop.js +42 -0
  236. package/src/server/replicate.js +42 -0
  237. package/src/server/resend.js +93 -0
  238. package/src/server/salesforce.js +84 -0
  239. package/src/server/sanity.js +31 -0
  240. package/src/server/semrush.js +359 -0
  241. package/src/server/sentry.js +30 -0
  242. package/src/server/sevdesk.js +20 -0
  243. package/src/server/shopify.js +99 -0
  244. package/src/server/slack.js +143 -0
  245. package/src/server/snowflake.js +139 -0
  246. package/src/server/storyblok.js +49 -0
  247. package/src/server/stripe.js +13 -0
  248. package/src/server/supabase.js +13 -0
  249. package/src/server/tally.js +78 -0
  250. package/src/server/telegram.js +55 -0
  251. package/src/server/tiktok.js +86 -0
  252. package/src/server/twilio.js +90 -0
  253. package/src/server/twitch.js +409 -0
  254. package/src/server/wave.js +520 -0
  255. package/src/server/wix.js +1048 -0
  256. package/src/server/wiz.js +117 -0
  257. package/src/server/woocommerce.js +412 -0
  258. package/src/server/wordpress-com.js +236 -0
  259. package/src/server/wordpress-self-hosted.js +134 -0
  260. package/src/server/workday.js +136 -0
  261. package/src/server/x-twitter.js +110 -0
  262. package/src/server/xero.js +397 -0
  263. package/src/server/zoho-books.js +90 -0
  264. package/src/server/zoho-crm.js +89 -0
  265. package/src/server/zohoOAuth.js +21 -0
  266. package/src/shared/ai-models.json +8049 -0
  267. package/src/shared/ai.js +63 -0
  268. package/src/shared/algolia.js +29 -0
  269. package/src/shared/amazon-redshift.js +51 -0
  270. package/src/shared/amplitude.js +28 -0
  271. package/src/shared/atlassian.js +43 -0
  272. package/src/shared/aws.js +72 -0
  273. package/src/shared/canva.js +66 -0
  274. package/src/shared/chargebee.js +26 -0
  275. package/src/shared/clickhouse.js +38 -0
  276. package/src/shared/confidence.js +28 -0
  277. package/src/shared/databricks.js +33 -0
  278. package/src/shared/dbt-semantic-layer.js +32 -0
  279. package/src/shared/definitions.js +140 -0
  280. package/src/shared/figma.js +21 -0
  281. package/src/shared/firebase-cloud-messaging.js +45 -0
  282. package/src/shared/gemini-enterprise.js +33 -0
  283. package/src/shared/gong.js +33 -0
  284. package/src/shared/google-ads-search.js +31 -0
  285. package/src/shared/google-ads.js +28 -0
  286. package/src/shared/google-maps-platform.js +28 -0
  287. package/src/shared/google.js +133 -0
  288. package/src/shared/granola.js +25 -0
  289. package/src/shared/hex.js +28 -0
  290. package/src/shared/inngest.js +35 -0
  291. package/src/shared/lightspeed.js +75 -0
  292. package/src/shared/linkedin.js +27 -0
  293. package/src/shared/logo-dev.js +21 -0
  294. package/src/shared/mapbox.js +38 -0
  295. package/src/shared/mcp.js +92 -0
  296. package/src/shared/microsoft-fabric.js +47 -0
  297. package/src/shared/microsoft.js +231 -0
  298. package/src/shared/miro.js +27 -0
  299. package/src/shared/oura.js +23 -0
  300. package/src/shared/posthog.js +33 -0
  301. package/src/shared/prestashop.js +23 -0
  302. package/src/shared/salesforce.js +36 -0
  303. package/src/shared/semrush.js +24 -0
  304. package/src/shared/shopify.js +51 -0
  305. package/src/shared/siteUrl.js +12 -0
  306. package/src/shared/slack.js +88 -0
  307. package/src/shared/snowflake.js +55 -0
  308. package/src/shared/tiktok.js +22 -0
  309. package/src/shared/tokens.js +747 -0
  310. package/src/shared/twilio.js +41 -0
  311. package/src/shared/twitch.js +49 -0
  312. package/src/shared/wave.js +52 -0
  313. package/src/shared/wix.js +40 -0
  314. package/src/shared/wiz.js +41 -0
  315. package/src/shared/wordpress-com.js +30 -0
  316. package/src/shared/wordpress.js +69 -0
  317. package/src/shared/workday.js +50 -0
  318. package/src/shared/x-twitter.js +19 -0
  319. package/src/shared/xero.js +46 -0
  320. package/src/shared/zoho-books.js +39 -0
  321. package/src/shared/zoho-crm.js +43 -0
  322. package/src/shared/zoho-regions.js +12 -0
  323. package/test/ai.test.js +136 -0
  324. package/test/airtable.test.js +125 -0
  325. package/test/algolia.test.js +207 -0
  326. package/test/amazon-redshift.test.js +272 -0
  327. package/test/amplitude.test.js +239 -0
  328. package/test/apify.test.js +93 -0
  329. package/test/apollo-io.test.js +125 -0
  330. package/test/asana.test.js +99 -0
  331. package/test/ashby.test.js +97 -0
  332. package/test/atlassian.test.js +249 -0
  333. package/test/attention.test.js +79 -0
  334. package/test/aws.test.js +405 -0
  335. package/test/brevo.test.js +71 -0
  336. package/test/calendly.test.js +136 -0
  337. package/test/canva.test.js +258 -0
  338. package/test/chargebee.test.js +195 -0
  339. package/test/clickhouse.test.js +278 -0
  340. package/test/confidence.test.js +205 -0
  341. package/test/databricks.test.js +253 -0
  342. package/test/dbt-semantic-layer.test.js +221 -0
  343. package/test/designMcp.test.js +336 -0
  344. package/test/elevenlabs.test.js +52 -0
  345. package/test/firebase-cloud-messaging.test.js +242 -0
  346. package/test/firecrawl.test.js +66 -0
  347. package/test/gemini-enterprise.test.js +218 -0
  348. package/test/github-api.test.js +167 -0
  349. package/test/gitlab-api.test.js +160 -0
  350. package/test/gong.test.js +192 -0
  351. package/test/google-ads.test.js +350 -0
  352. package/test/google-maps-platform.test.js +191 -0
  353. package/test/google.test.js +710 -0
  354. package/test/granola.test.js +240 -0
  355. package/test/hex.test.js +253 -0
  356. package/test/heygen.test.js +121 -0
  357. package/test/hubspot.test.js +103 -0
  358. package/test/inngest.test.js +219 -0
  359. package/test/lightspeed.test.js +250 -0
  360. package/test/linear.test.js +146 -0
  361. package/test/linkedin.test.js +243 -0
  362. package/test/logo-dev.test.js +79 -0
  363. package/test/mailgun.test.js +107 -0
  364. package/test/mapbox.test.js +181 -0
  365. package/test/mcp.test.js +227 -0
  366. package/test/microsoft-fabric.test.js +258 -0
  367. package/test/microsoft.test.js +554 -0
  368. package/test/n8nOAuth.test.js +188 -0
  369. package/test/notionOAuth.test.js +183 -0
  370. package/test/oura.test.js +211 -0
  371. package/test/paddleCatalogue.test.js +51 -0
  372. package/test/paddlePermissions.test.js +101 -0
  373. package/test/perplexityComposition.test.js +39 -0
  374. package/test/pipedriveOAuth.test.js +140 -0
  375. package/test/posthog.test.js +200 -0
  376. package/test/prestashop.test.js +207 -0
  377. package/test/resend.test.js +163 -0
  378. package/test/salesforce.test.js +276 -0
  379. package/test/semrush.test.js +479 -0
  380. package/test/sentry.test.js +35 -0
  381. package/test/shopify.test.js +247 -0
  382. package/test/slack.test.js +320 -0
  383. package/test/snowflake.test.js +391 -0
  384. package/test/tally.test.js +75 -0
  385. package/test/telegram.test.js +58 -0
  386. package/test/tiktok.test.js +243 -0
  387. package/test/tokens.test.js +1079 -0
  388. package/test/twilio.test.js +221 -0
  389. package/test/twitch.test.js +573 -0
  390. package/test/wave.test.js +678 -0
  391. package/test/wix.test.js +1099 -0
  392. package/test/wiz.test.js +185 -0
  393. package/test/wordpress-com.test.js +469 -0
  394. package/test/wordpress.test.js +660 -0
  395. package/test/workday.test.js +314 -0
  396. package/test/x-twitter.test.js +256 -0
  397. package/test/xero.test.js +700 -0
  398. package/test/zoho-books.test.js +253 -0
  399. package/test/zoho-crm.test.js +223 -0
@@ -0,0 +1,63 @@
1
+ import { createSchema } from "json-rest-schema";
2
+ import snapshot from "./ai-models.json" with { type: "json" };
3
+
4
+ const DEFAULT_AI_MODEL = "opencode/big-pickle";
5
+ const aiAccessLabels = Object.freeze({
6
+ "free-no-setup": "Free · no account or key",
7
+ "free-with-connection": "Free · connection required",
8
+ paid: "Paid · connection required",
9
+ unknown: "Pricing unknown · check provider"
10
+ });
11
+ // These direct API-key routes need no coding subscription or cloud identity
12
+ // exchange. Other upstream entries remain available as framework metadata.
13
+ const directProviders = new Set(["opencode", "zai", "openai", "anthropic", "deepseek", "google", "openrouter",
14
+ "groq", "mistral", "xai", "cerebras", "togetherai", "perplexity"]);
15
+ const aiCatalogue = Object.freeze({ ...snapshot, providers: Object.freeze(snapshot.providers.map((provider) => Object.freeze({
16
+ ...provider, connection: directProviders.has(provider.id) ? "api-key" : "framework",
17
+ models: Object.freeze(provider.models.map((model) => Object.freeze({ ...model, key: `${provider.id}/${model.id}`, providerId: provider.id })))
18
+ }))) });
19
+ const models = new Map(aiCatalogue.providers.flatMap((provider) => provider.models.map((model) => [model.key, model])));
20
+
21
+ function getAiModel(key) { return models.get(key); }
22
+
23
+ function listAiModels({ providerId, access, includeDeprecated = false, configurableOnly = false } = {}) {
24
+ const order = ["free-no-setup", "free-with-connection", "paid", "unknown"];
25
+ return aiCatalogue.providers.filter((provider) => (!providerId || provider.id === providerId) &&
26
+ (!configurableOnly || provider.connection === "api-key"))
27
+ .flatMap((provider) => provider.models).filter((model) =>
28
+ (includeDeprecated || model.status !== "deprecated") && (!access || model.access === access))
29
+ .sort((a, b) => a.key === DEFAULT_AI_MODEL ? -1 : b.key === DEFAULT_AI_MODEL ? 1 :
30
+ order.indexOf(a.access) - order.indexOf(b.access) || a.key.localeCompare(b.key));
31
+ }
32
+
33
+ const modelItems = Object.freeze(listAiModels({ configurableOnly: true }).map((model) => Object.freeze({
34
+ value: model.key, title: `${model.name} (${model.providerId})`, props: { subtitle: aiAccessLabels[model.access] }
35
+ })));
36
+ const aiDefinition = Object.freeze({
37
+ id: "ai", name: "AI", description: "Choose an app AI model and whose account pays. Big Pickle starts without an account or key.",
38
+ accountModes: ["shared", "per-user"], authenticationMethods: ["none", "api-key"], scopes: [],
39
+ authenticationMethodsForSettings: (settings = {}) => getAiModel(settings.model ?? DEFAULT_AI_MODEL)?.access === "free-no-setup"
40
+ ? ["none", "api-key"] : ["api-key"],
41
+ authenticationLabels: { none: "Free access · no account or key", "api-key": "Use a provider API key" },
42
+ authenticationHint: "Your app calls the provider directly. A shared account belongs to the app administrator; individual accounts belong to each signed-in app user.",
43
+ settingsSchema: createSchema({ model: { type: "string", defaultTo: DEFAULT_AI_MODEL,
44
+ enum: modelItems.map((item) => item.value) } }),
45
+ settingsFields: [{ name: "model", label: "AI model", searchable: true, items: modelItems,
46
+ credentialScope: (key) => getAiModel(key)?.providerId,
47
+ hint: (settings = {}) => {
48
+ const model = getAiModel(settings.model ?? DEFAULT_AI_MODEL);
49
+ return `${model ? `${model.name}: ${aiAccessLabels[model.access]}. ` : ""}Search by provider or model. Catalogue dated 10 September 2026; availability can change. No automatic paid fallback.`;
50
+ } }],
51
+ apiKeyReferenceHint: "Use an environment reference for an administrator key. For individual accounts, use a private reference your app resolves for the authenticated user. Never put a key in this file.",
52
+ setup: {
53
+ url: "https://opencode.ai/docs/zen/",
54
+ steps: [
55
+ "Big Pickle and other choices labelled no account or key need no registration. Save and use this model through your application's AI library.",
56
+ "For a connected model, create a regular API key in that provider's dashboard. Z.AI's GLM-4.7-Flash uses a regular Z.AI key; its Coding Plan is a different product.",
57
+ "For a shared account, store the administrator's key in Env. For individual accounts, your application must provide private key entry, storage and disconnect controls for each authenticated user.",
58
+ "Saving selects configuration; it does not verify a provider account or install an AI library into your application. Follow the AI connection guide for the selected framework."
59
+ ]
60
+ }
61
+ });
62
+
63
+ export { aiCatalogue, aiAccessLabels, aiDefinition, DEFAULT_AI_MODEL, getAiModel, listAiModels };
@@ -0,0 +1,29 @@
1
+ import { createSchema } from "json-rest-schema";
2
+ import { secretReference } from "@jskit-ai/connectors-core/shared/configuration";
3
+
4
+ const algoliaDefinition = Object.freeze({
5
+ id: "algolia", name: "Algolia", description: "Search and maintain index records, and check indexing completion.",
6
+ accountModes: ["shared", "assistant"], authenticationMethods: ["api-key"], scopes: [],
7
+ settingsSchema: createSchema({
8
+ applicationId: { type: "string", required: true, minLength: 1, maxLength: 63,
9
+ validator: (value) => /^[a-z0-9]+$/iu.test(value) || "Enter the application ID using letters and digits." },
10
+ publicApiKeyRef: { ...secretReference, required: false }
11
+ }),
12
+ settingsFields: [
13
+ { name: "applicationId", label: "Application ID", hint: "Copy the ID from your Algolia application's API Keys page. This ID can be public." },
14
+ { name: "publicApiKeyRef", environmentCredential: { label: "Public frontend API key", public: true }, label: "Public API key reference (optional)", placeholder: "env:ALGOLIA_SEARCH_KEY",
15
+ hint: "Optional search-only key for your frontend. Enter its reference; your app decides whether to publish its value." }
16
+ ],
17
+ setup: {
18
+ url: "https://www.algolia.com/doc/guides/security/api-keys",
19
+ steps: [
20
+ "Select the intended Algolia application, open API Keys and copy its Application ID into Application ID here.",
21
+ "Open All API Keys, then New API Key. Give the key a description, select List indices (listIndexes) and Search (search), add Add records (addObject) for indexing/task status and Delete records (deleteObject) for deletion only when needed. Restrict Indices to those this application needs, and choose Create. These operations do not require the Admin API key.",
22
+ "Copy the new backend key. Enter env:ALGOLIA_API_KEY in API key reference here and save. Choose Set credential in Env for ALGOLIA_API_KEY, paste its value and save it there.",
23
+ "If the frontend will search Algolia directly, create a separate key with Search (search) access restricted to indices safe for those users to read. Enter env:ALGOLIA_SEARCH_KEY in Public API key reference (optional), save, then use its Set credential in Env link to store that key value.",
24
+ "Return here and choose Connect account (or Verify again for an existing connection). Check connection only reads the application’s saved status. No OAuth registration or callback URL is needed. Verification lists indices with the backend key; it does not validate the optional frontend key.",
25
+ "If access fails, check the Application ID, selected indices, permissions and key expiry. Your framework owns publishing the optional frontend key; keep the backend key server-side."
26
+ ]
27
+ }
28
+ });
29
+ export { algoliaDefinition };
@@ -0,0 +1,51 @@
1
+ import { createSchema } from "json-rest-schema";
2
+ import { awsSettings, awsFields, awsCredentials } from "./aws.js";
3
+
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"]
14
+ ];
15
+ const databaseName = { type: "string", required: true, noTrim: true, minLength: 1, maxLength: 127,
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." };
17
+ const common = { ...awsSettings,
18
+ deploymentType: { type: "string", enum: ["serverless", "provisioned"], defaultTo: "serverless" },
19
+ region: { ...awsSettings.region, enum: regions.map(([value]) => value) },
20
+ database: databaseName
21
+ };
22
+ const serverlessSchema = createSchema({ ...common,
23
+ workgroup: { type: "string", required: true, minLength: 3, maxLength: 63, pattern: "^[a-z0-9-]+$" }
24
+ });
25
+ const provisionedSchema = createSchema({ ...common,
26
+ clusterIdentifier: { type: "string", required: true, minLength: 1, maxLength: 63, pattern: "^[a-z][a-z0-9]*(-[a-z0-9]+)*$" },
27
+ databaseUser: { ...databaseName, required: false }
28
+ });
29
+
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.",
32
+ ...awsCredentials, scopes: [],
33
+ settingsSchema: (settings = {}) => settings.deploymentType === "provisioned" ? provisionedSchema : serverlessSchema,
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." },
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." }
42
+ ],
43
+ setup: { url: "https://docs.aws.amazon.com/redshift/latest/mgmt/data-api.html", steps: [
44
+ "Select the warehouse's account and region in Amazon Redshift, then copy its serverless workgroup name or provisioned cluster identifier and database name.",
45
+ "Grant only the Data API actions your app uses: ListDatabases, ListSchemas, ListTables, DescribeTable, ExecuteStatement, DescribeStatement, GetStatementResult and CancelStatement. Serverless also needs redshift-serverless:GetCredentials; provisioned IAM users need redshift:GetClusterCredentialsWithIAM, or redshift:GetClusterCredentials for an explicit database user. Database grants control which SQL it can execute.",
46
+ "Save the configuration, then use Set credential in Env for the access key ID, secret key and any session token. Return and choose Connect account. No OAuth app or callback is needed for this shared mode. Renew temporary credential values together.",
47
+ "Connecting lists tables in the configured database. Starting SQL requires a separate application authorization decision."
48
+ ] }
49
+ });
50
+
51
+ export { amazonRedshiftDefinition };
@@ -0,0 +1,28 @@
1
+ import { createSchema } from "json-rest-schema";
2
+
3
+ const amplitudeDefinition = Object.freeze({
4
+ id: "amplitude", name: "Amplitude", description: "Query and manage Amplitude content through an authorized assistant MCP connection.",
5
+ accountModes: ["assistant"], authenticationMethods: ["oauth2"],
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 }
10
+ ],
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" }] }],
14
+ setup: {
15
+ clientRegistrationEndpoint: (settings = {}) => settings.region === "eu"
16
+ ? "https://mcp.eu.amplitude.com/register" : "https://mcp.amplitude.com/register",
17
+ url: "https://amplitude.com/docs/amplitude-ai/amplitude-mcp/other-clients",
18
+ steps: [
19
+ "Select the account's US or EU region and the permissions needed. Set the Suggested callback URL to the route your application actually serves. With a new Client ID, choose Register client and connect: Vibe64 saves the returned client ID in configuration and the secret and callback in development Env. There is no developer-console app form in this flow.",
20
+ "For an existing client, enter its Client ID and store its secret and exact registered callback in the referenced Env variables. The manual registration request below remains available for CLI users. If registration fails, inspect the provider and Env before retrying; a client may already exist.",
21
+ "Keep Read Amplitude content selected so registration and verification can succeed. Save configuration, begin consent and sign into Amplitude. If access is blocked, an administrator opens Settings → Content Access → MCP to check organization access, then Org Settings → Role Management → AI Features to grant Use MCP (read) and, only when needed, Use MCP (write) to the intended user and projects.",
22
+ "The runtime verifies tool discovery without calling a tool. The assistant host must authorize each tool name and its arguments separately.",
23
+ "This connects the assistant owner's account. It does not send analytics events, attach tools automatically or implement app-user login."
24
+ ]
25
+ }
26
+ });
27
+
28
+ export { amplitudeDefinition };
@@ -0,0 +1,43 @@
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.",
3
+ accountModes: ["assistant"], authenticationMethods: ["oauth2"],
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" },
21
+ ...["goals", "projects", "bitbucket", "loom", "talent", "teams", "artifacts", "focus"].flatMap((product) => {
22
+ const name = product[0].toUpperCase() + product.slice(1);
23
+ return [
24
+ { value: `read:${product}:agent-interface`, label: `Read ${name} content` },
25
+ { value: `write:${product}:agent-interface`, label: `Create and edit ${name} content` }
26
+ ];
27
+ })
28
+ ],
29
+ setup: {
30
+ clientRegistrationEndpoint: "https://auth.atlassian.com/VCeDsk8ZHncYF1g234fKtc4lNipbBhu3/dcr/register",
31
+ url: "https://support.atlassian.com/atlassian-ai-gateway/docs/configure-oauth-2-1/",
32
+ steps: [
33
+ "Choose permissions and the Suggested callback URL, then select Register client and connect to create this application's Rovo MCP v2 client and save credentials in development Env. Manual registration is also available below. Use your assistant host's exact callback URL; old v1 clients and tokens do not carry over.",
34
+ "For an existing or manually registered client, enter its Client ID. Store its Client Secret and callback URL through Env, then enter their references here.",
35
+ "Choose only the products and permissions your assistant needs. Content writes, deletes and administration start disabled.",
36
+ "Save and select Connect account, sign into Atlassian and review the product and site permissions on its consent screen.",
37
+ "The runtime lists available tools without executing them. Your host must authorize the exact tool and arguments, including the destination site or project.",
38
+ "This connects the assistant owner's account; it does not configure app-user login or attach tools automatically."
39
+ ]
40
+ }
41
+ });
42
+
43
+ export { atlassianDefinition };
@@ -0,0 +1,72 @@
1
+ import { createSchema } from "json-rest-schema";
2
+ import { secretReference } from "@jskit-ai/connectors-core/shared/configuration";
3
+
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"]
10
+ ];
11
+ const awsSettings = {
12
+ region: { type: "string", enum: regions.map(([value]) => value), defaultTo: "us-east-1" },
13
+ accessKeyIdRef: secretReference,
14
+ sessionTokenRef: { ...secretReference, required: false }
15
+ };
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." }
20
+ ];
21
+ const awsCredentials = {
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."
25
+ };
26
+ const bucketName = {
27
+ type: "string", required: true, minLength: 3, maxLength: 63,
28
+ validator: (value) => (/^[a-z0-9][a-z0-9.-]*[a-z0-9]$/u.test(value) && !value.includes("..") &&
29
+ !/^\d+\.\d+\.\d+\.\d+$/u.test(value) && !/^(xn--|sthree-|amzn-s3-demo-)/u.test(value) &&
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
+ };
32
+ const awsS3Definition = Object.freeze({
33
+ id: "aws-s3", name: "AWS S3", description: "List bucket objects and create short-lived download or upload URLs.",
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.",
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 }
39
+ ],
40
+ settingsSchema: createSchema({ ...awsSettings, bucket: bucketName }),
41
+ settingsFields: [{ name: "bucket", label: "Bucket name", placeholder: "my-app-files" }, ...awsFields],
42
+ setup: { url: "https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-presigned-url.html", steps: [
43
+ "In Amazon S3, select a general purpose bucket and copy its name and region. Keep public access blocked.",
44
+ "Use an IAM identity limited to this bucket: ListBucket and GetObject, plus PutObject only for uploads. Additional encryption permissions may be required.",
45
+ "For an IAM-user key, sign in as that user, open the account menu > Security credentials > Access keys > Create access key. Review the alternatives, then choose Other > Next > Create access key. Copy the ID and secret before closing; the secret is shown only once. For temporary role credentials, obtain all three values from your deployment administrator.",
46
+ "Enter env:AWS_ACCESS_KEY_ID as the access key ID reference and env:AWS_SECRET_ACCESS_KEY as the secret reference. For temporary credentials also enter env:AWS_SESSION_TOKEN; otherwise leave the session-token reference empty. Save configuration, then use each Set credential in Env link to save its actual value in this project's Env. Return here and choose Connect. No OAuth app or callback URL is needed.",
47
+ "For browser downloads or uploads, open Amazon S3 > General purpose buckets > your bucket > Permissions > Cross-origin resource sharing (CORS) > Edit. Allow your app's exact origin, GET for downloads and PUT for uploads, and any request headers your app sends. Save changes. Add the custom-domain origin when it changes; do not make the bucket public to fix a CORS error.",
48
+ "Connecting checks one listing page, not every object's permissions. URLs are temporary bearer credentials. If Connect fails, check bucket, region, IAM permissions and Env values; renew all three temporary credential values together when they expire, then reconnect."
49
+ ] }
50
+ });
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.",
53
+ ...awsCredentials, scopes: [],
54
+ settingsSchema: createSchema({ ...awsSettings,
55
+ workgroup: { type: "string", minLength: 1, maxLength: 128, defaultTo: "primary", pattern: "^[a-zA-Z0-9._-]+$" },
56
+ resultLocation: { type: "string", minLength: 1, maxLength: 1024, validator: (value) =>
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
+ }),
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." }
62
+ ],
63
+ setup: { url: "https://docs.aws.amazon.com/athena/latest/ug/creating-workgroups.html", steps: [
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.",
65
+ "For S3-backed results, set Location of query result to an existing s3://bucket/prefix/ path. Configure encryption and query scan limits; select Override client-side settings if the workgroup must enforce its settings, then Create workgroup or save your edits. Grant the backend identity athena:GetWorkGroup, athena:StartQueryExecution, athena:GetQueryExecution, athena:GetQueryResults and athena:StopQueryExecution for this workgroup, plus the necessary source-data, S3 result and encryption permissions. For browsing, also grant athena:ListDataCatalogs, athena:ListDatabases and athena:ListTableMetadata with the appropriate catalog access; Glue-backed catalogs require glue:GetDatabase, glue:GetDatabases, glue:GetTable and glue:GetTables on the allowed catalog/database/table resources.",
66
+ "For an IAM-user key, sign in as that user, open the account menu > Security credentials > Access keys > Create access key. Review the alternatives, then choose Other > Next > Create access key. Copy the ID and secret before closing; the secret is shown only once. For temporary role credentials, obtain all three values from your deployment administrator.",
67
+ "Enter env:AWS_ACCESS_KEY_ID as Access key ID reference and env:AWS_SECRET_ACCESS_KEY as Secret access key reference. For temporary credentials also enter env:AWS_SESSION_TOKEN. Save configuration, then use each Set credential in Env link to save the actual value in this project. Return here and choose Connect account. No OAuth app or callback URL is needed.",
68
+ "Connecting reads workgroup metadata without running SQL. It does not prove table or result access. If connection fails, check the region, workgroup, IAM policy and Env values; renew all three temporary credential values together when expired and reconnect. Running SQL is a separate, billable operation that your application must authorize. Query failures can require catalog, source-data, result-bucket or encryption permissions even when connection succeeds."
69
+ ] }
70
+ });
71
+
72
+ export { awsS3Definition, awsAthenaDefinition, awsSettings, awsFields, awsCredentials };
@@ -0,0 +1,66 @@
1
+ import { createSchema } from "json-rest-schema";
2
+ import { validateSchemaPayload } from "@jskit-ai/kernel/shared/validators";
3
+
4
+ function validateCanvaClientId(value) {
5
+ try {
6
+ const url = new URL(value);
7
+ if (url.protocol === "https:" && url.pathname !== "/" && !url.username && !url.password && !url.search && !url.hash && url.href === value) return true;
8
+ } catch { /* Report a field error below. */ }
9
+ return "Use the exact HTTPS URL of your client metadata JSON, including its path, without credentials, query or fragment.";
10
+ }
11
+
12
+ const canvaDefinition = Object.freeze({
13
+ id: "canva", name: "Canva", description: "Discover and use Canva design tools through each assistant owner's account.",
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.",
16
+ validateClientId: validateCanvaClientId,
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" }
34
+ ],
35
+ setup: {
36
+ url: "https://www.canva.dev/docs/mcp/",
37
+ createClientMetadata: createCanvaClientMetadata,
38
+ steps: [
39
+ "Open the Canva MCP guide and follow Register your redirect URI to its Waitlist form. Apply with the exact callback URL and wait for Canva's approval.",
40
+ "Choose a public HTTPS document URL owned by your application, including a path such as /oauth/canva.json. Enter it in Client metadata URL and confirm the suggested callback above. Copy the client metadata JSON below and serve it at that exact document URL with Content-Type application/json and no login requirement. CLI users can use createCanvaClientMetadata.",
41
+ "Save configuration, then use Set callback in Env to save the exact approved callback under the displayed Callback URL reference. The metadata URL and callback are different addresses. This client has no secret.",
42
+ "Choose the design and content permissions the assistant needs, then save. Each assistant owner must sign in to Canva and approve access through the runtime's authorization flow.",
43
+ "Verification lists tools; the assistant host must authorize individual calls and content ownership. Saving does not publish metadata, grant approval or attach tools."
44
+ ]
45
+ }
46
+ });
47
+
48
+ const metadataSchema = createSchema({
49
+ clientId: { type: "string", required: true, maxLength: 2048, validator: validateCanvaClientId },
50
+ clientName: { type: "string", required: true, minLength: 1, maxLength: 200 },
51
+ callbackUrl: { type: "string", required: true, validator(value) {
52
+ try {
53
+ const url = new URL(value);
54
+ return (url.protocol === "https:" || url.protocol === "http:" && ["localhost", "127.0.0.1", "[::1]"].includes(url.hostname)) &&
55
+ !url.username && !url.password && !url.search && !url.hash || "Use an HTTPS or loopback callback without credentials, query or fragment.";
56
+ } catch { return "Enter the callback URL served by the assistant host."; }
57
+ } }
58
+ });
59
+
60
+ function createCanvaClientMetadata(input) {
61
+ const { clientId, clientName, callbackUrl } = validateSchemaPayload({ schema: metadataSchema, mode: "replace" }, input, { statusCode: 422 });
62
+ return { client_id: clientId, client_name: clientName, redirect_uris: [new URL(callbackUrl).href],
63
+ grant_types: ["authorization_code", "refresh_token"], response_types: ["code"], token_endpoint_auth_method: "none" };
64
+ }
65
+
66
+ export { canvaDefinition, createCanvaClientMetadata };
@@ -0,0 +1,26 @@
1
+ import { createSchema } from "json-rest-schema";
2
+
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.",
5
+ accountModes: ["shared", "assistant"], authenticationMethods: ["api-key"], scopes: [],
6
+ settingsSchema: createSchema({
7
+ siteName: { type: "string", required: true, minLength: 1, maxLength: 63,
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
+ }),
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." }],
12
+ setup: {
13
+ url: "https://www.chargebee.com/docs/billing/2.0/site-configuration/api_keys",
14
+ steps: [
15
+ "Sign into the intended test or live Chargebee site as an owner or administrator. Copy its site name without .chargebee.com.",
16
+ "Open Settings > Configure Chargebee > API Keys and Events (called API Keys and Webhooks in some views), then API keys.",
17
+ "Choose Add API Key. For reading only, select Read-Only Key with transactional-data and product-catalog reads, or Read-only: All. For customer changes, subscriptions, hosted checkout or portal sessions, choose Full-Access Key with Write access. Name it and click Create Key.",
18
+ "Copy the issued key. Enter the site name here and env:CHARGEBEE_API_KEY in API key reference, then save. Choose Set credential in Env, paste the key as CHARGEBEE_API_KEY and save it there. A publishable or product-catalog-only key cannot read customers.",
19
+ "Return here and choose Connect account or Verify again. Check connection only reads saved status. Verification lists customers without changing billing data. No OAuth registration or callback URL is needed.",
20
+ "This adapter uses Product Catalog 2.0 item prices. Prepare the product and recurring price in Chargebee first, then let the app choose that item_price_id; the first checkout item must be a plan. Test and live catalogue IDs are separate.",
21
+ "Creating a hosted checkout URL does not prove payment or an active subscription. The app must retrieve the hosted page and verify its customer, subscription and invoice state before granting access. Portal URLs grant access to a customer’s billing account and must be issued only after authenticating that customer.",
22
+ "If access fails, check that the site and key belong to the same test or live environment and that the key allows transactional-data reads. To rotate, create a replacement key and update Env before revoking the old key in Chargebee. Disconnect only removes the application connection; it does not revoke the provider key."
23
+ ]
24
+ }
25
+ });
26
+ export { chargebeeDefinition };
@@ -0,0 +1,38 @@
1
+ import { createSchema } from "json-rest-schema";
2
+ import { httpsSiteUrlField } from "./siteUrl.js";
3
+
4
+ const clickhouseDefinition = Object.freeze({
5
+ id: "clickhouse", name: "ClickHouse", description: "Explore tables and run bounded, parameterized analytical reads on your ClickHouse database.",
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.",
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.",
12
+ settingsSchema: createSchema({
13
+ httpUrl: httpsSiteUrlField,
14
+ username: { type: "string", minLength: 1, maxLength: 256,
15
+ validator: (value) => !/[:\p{Cc}]/u.test(value) || "Enter a username without colons or control characters." }
16
+ }),
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." }
22
+ ],
23
+ setup: {
24
+ url: "https://clickhouse.com/docs/products/cloud/guides/sql-console/connection-details",
25
+ steps: [
26
+ "Select the ClickHouse Cloud service and open Connect. Copy its HTTPS interface address and port into HTTP Interface URL, or obtain your self-hosted HTTPS query endpoint from its administrator. Native TCP addresses do not work here.",
27
+ "Ask your database administrator for a dedicated application username and password with SELECT access to the intended tables. These are database credentials, not your Cloud console login or management API key.",
28
+ "Choose Username and password, enter the database username, and enter env:CLICKHOUSE_PASSWORD in Password reference (optional). Save configuration, choose Set credential in Env, paste the password as CLICKHOUSE_PASSWORD and save it there. Leave the reference blank only for a database user deliberately configured with an empty password; an omitted username uses default.",
29
+ "For a server deliberately allowing access without credentials, choose No credentials instead. This sends no authentication header and uses the server's default access. No password or Env reference is needed in this mode.",
30
+ "For ClickHouse Cloud, open the service's Settings > Security > IP access list > Add IPs. Allow the application backend's source IP or CIDR and save. The browser's domain is not that source address; update the allowlist if the backend moves.",
31
+ "Return here and choose Connect account or Verify again. Check connection only refreshes local status. Verification runs SELECT 1 and reads the database username; it does not prove permission to read every table. No OAuth registration or callback URL is needed.",
32
+ "Analytical reads support SELECT/WITH queries with typed parameters, capped at 100 returned rows and 10 seconds. Use a dedicated read-only user with table grants and enforced scan, memory and network restrictions. An application must authorize the query and its tenant filters; accepting SQL text is not a sandbox. HTTP URLs and query parameters may appear in proxy logs, so configure log redaction.",
33
+ "If verification fails, check the HTTPS endpoint, database credentials, network allowlist and the user's query-setting permissions described in the provider guide. To rotate access, update the database password and its Env value. Disconnect removes local connection state; it does not revoke the database user."
34
+ ]
35
+ }
36
+ });
37
+
38
+ export { clickhouseDefinition };
@@ -0,0 +1,28 @@
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 }
6
+ ];
7
+
8
+ function definition(id, name, description) {
9
+ return Object.freeze({
10
+ id, name, description, accountModes: ["assistant"], authenticationMethods: ["oauth2"], scopes: confidenceScopes,
11
+ setup: { url: "https://confidence.spotify.com/docs/sdks/mcp-servers", clientRegistrationEndpoint: "https://mcp.confidence.dev/register", steps: [
12
+ "Use a Confidence account with access to the intended organisation. This assistant connection uses browser OAuth, not a flag client secret or management API token.",
13
+ "Confirm the suggested callback is the route your application will serve. Choose Register client and connect to create a project-owned client and save its ID, secret and callback through project Env. Existing Env values are preserved. Manual users can send the displayed registration JSON with Content-Type application/json; CLI users can call registerConfidenceClient.",
14
+ "If registering manually, copy client_id into Client ID and store client_secret with Set credential in Env; use Set callback in Env for the exact registered callback. Automatic registration starts connection; after manual registration, choose Connect account. Sign into Confidence and approve the intended organisation. Your app must implement its callback and setup command.",
15
+ "Verification only lists tools. The host must authorize each tool and its arguments; identity scopes do not limit calls to reads.",
16
+ id === "confidence-flags"
17
+ ? "Flag creation, variants, schema changes and targeting rules require explicit host approval of the exact change. Inspect the resulting flag and use testResolveFlag for the intended test entity. This configures management access, not production flag evaluation; wire the native Confidence/OpenFeature client separately."
18
+ : "Retrieve experiment details and results through the host's approved tools. Preserve confidence intervals, sample sizes, significance and status messages: a positive effect estimate alone is not a winning experiment. Confidence performs the statistical analysis.",
19
+ "Flags and experiments keep separate configured connections even though they share an OAuth service. Do not reuse a grant by changing its provider ID.",
20
+ "If client_secret_expires_at is returned, plan replacement before expiry. A failed or interrupted registration is not proof that no client was created; investigate before retrying. Saving alone does not register a client or attach tools. Automatic Vibe64 coding-assistant attachment is deferred; an explicitly wired host can use these tools. Disconnect removes the local grant; it does not undo flag changes or revoke all provider access."
21
+ ] }
22
+ });
23
+ }
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.");
27
+
28
+ export { confidenceFlagsDefinition, confidenceExpDefinition };
@@ -0,0 +1,33 @@
1
+ import { createSchema } from "json-rest-schema";
2
+
3
+ function validWorkspaceUrl(value) {
4
+ // Use a per-workspace origin. Account consoles, regional URLs and proxy hosts are different contracts.
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
+ }
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" }
11
+ ];
12
+ const databricksDefinition = Object.freeze({
13
+ id: "databricks", name: "Databricks", description: "Read workspace jobs through user consent or a service principal.",
14
+ accountModes: ["shared", "per-user", "assistant"], authenticationMethods: ["oauth2"],
15
+ oauthGrantTypes: ["authorization_code", "client_credentials"],
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.",
18
+ settingsSchema: createSchema({ workspaceUrl: { type: "string", required: true, maxLength: 253,
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." }],
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.",
24
+ setup: { url: "https://docs.databricks.com/aws/en/integrations/enable-disable-oauth", steps: [
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
+ "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.",
27
+ "For Service account, an admin opens workspace user menu > Settings > Identity and access > Service principals > Manage. Select an assigned principal, open Secrets > Generate secret, set lifetime and the jobs scope, then Generate. Copy the displayed client ID and secret. Grant the principal workspace access and visibility of the required jobs. No callback is needed.",
28
+ "Enter Client ID, save configuration, then use Set credential in Env to store the secret under the displayed Client secret reference. For User consent also use Set callback in Env to save the exact registered URL and keep offline access selected. For Service account choose permissions matching the secret; use jobs without all-apis for a jobs-scoped secret.",
29
+ "Return here and check the connection. User consent opens Databricks authorization; service credentials need no browser consent. Verification reads a jobs page without running jobs or SQL. Empty results do not prove visibility of a particular job.",
30
+ "A personal access token, login password or cloud-provider secret is not a Databricks OAuth secret. Check workspace assignment, job permissions, secret expiry and matching scopes if access fails. Rotate secrets in Env before retiring the old credential. Disconnect removes local state; it does not delete the principal or globally revoke the OAuth app."
31
+ ] }
32
+ });
33
+ export { databricksDefinition };
@@ -0,0 +1,32 @@
1
+ import { createSchema } from "json-rest-schema";
2
+
3
+ const label = "[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?";
4
+ const hostPattern = new RegExp(`^(?:semantic-layer\\.${label}\\.(?:getdbt|dbt)\\.com|${label}\\.semantic-layer\\.${label}\\.dbt\\.com)$`, "u");
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.",
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.",
10
+ settingsSchema: createSchema({
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
+ environmentId: { type: "string", required: true, noTrim: true, maxLength: 38,
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
+ }),
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." }
20
+ ],
21
+ setup: { url: "https://docs.getdbt.com/docs/use-dbt-semantic-layer/setup-sl", steps: [
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.",
23
+ "Under Credentials & service tokens, add a Semantic Layer credential with the required warehouse access.",
24
+ "Choose Map new service token, name it for this application, select Semantic Layer Only and Metadata Only permissions, then Save. Copy the one-time token. If token creation is unavailable, ask your dbt administrator to create and link it.",
25
+ "Return to Project details and copy the GraphQL hostname and Environment ID from the Semantic Layer connection details. Enter them here, preserving every ID digit. Enter env:DBT_SERVICE_TOKEN in Service token reference and save configuration. Choose Set credential in Env, paste the token as DBT_SERVICE_TOKEN and save it there.",
26
+ "Return here and choose Connect account / Verify again. Check connection only reads saved status. Verification reads environment metadata; an explicitly wired application can then create metric queries and request their status and JSON result pages. If denied, check the host, environment, linked warehouse credential and token permissions. Replace the token through Env when rotating it; local Disconnect does not revoke it in dbt.",
27
+ "Query execution uses your warehouse capacity. The app owns permitted metrics, trusted dimension/time filters and bounded polling. JSON results suit small tables; use dbt’s native Arrow tooling for large production workloads. Do not retry an uncertain query submission automatically. Configuring this connection does not attach dbt to Vibe64’s coding assistant.",
28
+ "This token flow has no OAuth callback or app-user login. Public and Online need the customer's own account, permissions and capacity."
29
+ ] }
30
+ });
31
+
32
+ export { dbtSemanticLayerDefinition };