@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,35 @@
1
+ import { createSchema } from "json-rest-schema";
2
+ import { secretReference } from "@jskit-ai/connectors-core/shared/configuration";
3
+
4
+ const inngestDefinition = Object.freeze({
5
+ id: "inngest", name: "Inngest", description: "Send events to background workflows and inspect registered apps.",
6
+ accountModes: ["shared", "assistant"], authenticationMethods: ["api-key"], scopes: [],
7
+ apiKeyReferenceLabel: "Signing Key reference",
8
+ apiKeyReferenceHint: "Reference the Signing Key for the intended Inngest environment. Verification reads app metadata; it does not verify the Event Key or run a workflow.",
9
+ settingsSchema: createSchema({
10
+ eventKeyRef: { ...secretReference, required: true },
11
+ branchEnvironment: { type: "string", minLength: 1, maxLength: 255,
12
+ validator: (value) => /^[\x21-\x7e]+$/u.test(value) || "Use an ASCII branch environment without spaces or control characters." }
13
+ }),
14
+ settingsFields: [
15
+ { name: "eventKeyRef", label: "Event Key reference", placeholder: "env:INNGEST_EVENT_KEY",
16
+ environmentCredential: { label: "Inngest Event Key", public: false },
17
+ hint: "The Event Key sends events. Keep it separate from the Signing Key, and use keys from the same intended environment." },
18
+ { name: "branchEnvironment", label: "Branch environment (optional)", placeholder: "feature/my-branch",
19
+ hint: "Routes event delivery to this branch. App metadata reads follow the Signing Key's environment." }
20
+ ],
21
+ setup: {
22
+ url: "https://www.inngest.com/docs/events/creating-an-event-key",
23
+ steps: [
24
+ "Open Inngest Cloud and choose the intended environment. Next to the environment selector, click the key icon > Event keys > + Create Event Key. Give it a descriptive name, choose Save changes, then Copy. Configure event-name or IP restrictions for your application if needed.",
25
+ "Enter env:INNGEST_EVENT_KEY in Event Key reference. In the same environment's Signing Key tab, copy the Signing Key separately and enter env:INNGEST_SIGNING_KEY in Signing Key reference. The Event Key sends events; the Signing Key verifies metadata access.",
26
+ "Save configuration. Choose Set credential in Env to save INNGEST_SIGNING_KEY. Under Inngest Event Key, choose Set credential in Env to save INNGEST_EVENT_KEY with the copied Event Key value. Save both values in backend Env and return here; the configuration file stores only references, never the keys.",
27
+ "Leave Branch environment empty for ordinary delivery. For branch delivery, enter its exact identifier. It only changes event routing; metadata reads still use the Signing Key's environment. Save changes before connecting.",
28
+ "Choose Connect account. Verification reads registered app metadata without sending an event. It does not check the Event Key, prove that both keys match, or prove that a workflow exists. An empty app list can still verify successfully. No OAuth app registration or callback is needed.",
29
+ "Implement the application's functions with the native Inngest SDK: event triggers receive submitted events, cron triggers schedule work, and step.run provides durable steps. Serve them at the deployed app's /api/inngest route with the same environment Signing Key. In Inngest Cloud select the environment > Apps > Sync App or Sync New App, paste the full deployed serve URL and choose Sync App. After changing functions or domains, open that app > Resync; use Override for a changed URL and retain the same app ID. An event receipt only confirms acceptance, not workflow success. Disconnect removes the local connection; it does not revoke keys or cancel accepted runs. Coordinate signing-key rotation with the application's SDK and update Env before verifying again."
30
+
31
+ ]
32
+ }
33
+ });
34
+
35
+ export { inngestDefinition };
@@ -0,0 +1,75 @@
1
+ import { createSchema } from "json-rest-schema";
2
+
3
+ const lightspeedDefinition = Object.freeze({
4
+ id: "lightspeed", name: "Lightspeed", description: "Read products, inventory, sales, customers and outlets from a Lightspeed Retail X-Series store.",
5
+ accountModes: ["shared", "per-user", "assistant"], authenticationMethods: ["oauth2"],
6
+ oauthClientAuthenticationMethods: ["client_secret_post"],
7
+ settingsSchema: createSchema({
8
+ domainPrefix: { type: "string", required: true, minLength: 1, maxLength: 63,
9
+ validator: (value) => /^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/u.test(value) || "Enter the lowercase store prefix without a URL, dots or spaces." }
10
+ }),
11
+ settingsFields: [{ name: "domainPrefix", label: "Domain prefix", placeholder: "your-store",
12
+ hint: "The store prefix from https://your-store.retail.lightspeed.app. Use the store you intend to authorize." }],
13
+ scopes: [
14
+ { value: "retailer:read", label: "Read retailer settings", recommended: true },
15
+ { value: "outlets:read", label: "Read outlets", recommended: true },
16
+ { value: "registers:read", label: "Read registers", recommended: true },
17
+ { value: "payment_types:read", label: "Read payment types", recommended: true },
18
+ { value: "products:read", label: "Read products", recommended: true },
19
+ { value: "products:read:price_books", label: "Read price books", recommended: true },
20
+ { value: "inventory:read", label: "Read inventory", recommended: true },
21
+ { value: "customers:read", label: "Read customers", recommended: true },
22
+ { value: "sales:read", label: "Read sales", recommended: true },
23
+ { value: "fulfillments:read", label: "Read fulfillments", recommended: true },
24
+ { value: "promotions:read", label: "Read promotions", recommended: true },
25
+ { value: "gift_cards:read", label: "Read gift cards", recommended: true },
26
+ { value: "store_credits:read", label: "Read store credits", recommended: true },
27
+ { value: "suppliers:read", label: "Read suppliers", recommended: true },
28
+ { value: "taxes:read", label: "Read taxes", recommended: true },
29
+ { value: "users:read", label: "Read users", recommended: true },
30
+ { value: "audit:read", label: "Read audit events" },
31
+ { value: "business_rules:read", label: "Read business rules" },
32
+ { value: "business_rules:write", label: "Edit business rules" },
33
+ { value: "channels:read", label: "Read channels" },
34
+ { value: "consignments:read", label: "Read consignments" },
35
+ { value: "consignments:write:inventory_count", label: "Perform inventory counts" },
36
+ { value: "consignments:write:stock_order", label: "Process stock orders" },
37
+ { value: "consignments:write:stock_transfer", label: "Transfer stock" },
38
+ { value: "customers:write", label: "Edit customers" },
39
+ { value: "custom_fields:read", label: "Read custom fields" },
40
+ { value: "custom_fields:write", label: "Edit custom fields" },
41
+ { value: "fulfillments:write", label: "Edit fulfillments" },
42
+ { value: "gift_cards:write:issue", label: "Issue gift cards" },
43
+ { value: "gift_cards:write:redeem", label: "Redeem gift cards" },
44
+ { value: "inventory:write", label: "Edit inventory" },
45
+ { value: "payments:read", label: "Read payments" },
46
+ { value: "products:write", label: "Edit products" },
47
+ { value: "products:write:price_books", label: "Edit price books" },
48
+ { value: "promotions:write", label: "Edit promotions" },
49
+ { value: "register:close", label: "Close registers" },
50
+ { value: "register:open", label: "Open registers" },
51
+ { value: "remote_rules:read", label: "Read remote rules" },
52
+ { value: "remote_rules:write", label: "Edit remote rules" },
53
+ { value: "sales:write", label: "Edit sales" },
54
+ { value: "serial_numbers:read", label: "Read serial numbers" },
55
+ { value: "serial_numbers:write", label: "Edit serial numbers" },
56
+ { value: "services:read", label: "Read services" },
57
+ { value: "services:write", label: "Edit services" },
58
+ { value: "store_credits:write:issue", label: "Issue store credits" },
59
+ { value: "suppliers:write", label: "Edit suppliers" },
60
+ { value: "taxes:write", label: "Edit taxes" },
61
+ { value: "users:write", label: "Edit users" },
62
+ { value: "webhooks", label: "Manage application webhooks" }
63
+ ],
64
+ setup: { url: "https://x-series-api.lightspeedhq.com/docs/authorization", steps: [
65
+ "Open developers.retail.lightspeed.app and register a developer account; your retail-store login is separate. Open Applications > Create and register this application's exact Suggested callback URL as its redirect URI.",
66
+ "Copy Client ID here and Save configuration. Choose Set credential in Env to store Client Secret under the displayed reference. Choose Set callback in Env and save the exact registered URL. Your application backend must implement that callback.",
67
+ "From https://your-store.retail.lightspeed.app, enter only your-store in Domain prefix. This slot connects that store; a callback from another store cannot change the credential destination. Use a separate configuration slot for another store.",
68
+ "Keep products:read for verification and select only the other permissions your application needs. Extra permissions do not add runtime operations. Save configuration, then Connect account for shared access. Each-user access connects from the generated application's account screen after its own login.",
69
+ "Approve the intended retailer in Lightspeed. Verification reads a product page without changing stock or customer data. If declined consent leaves the screen waiting, choose Cancel connection before trying again. Disconnect removes the local grant, not provider authorization.",
70
+ "Select inventory:read to read stock and sales:read for sales pages, then reconnect if permissions changed. Inventory returns flat rows with current_inventory_level and quantity_to_procure; the app must interpret those separately rather than treating procure quantity as negative stock. Use explicit version pages; no automatic stock sync is installed.",
71
+ "The app can build a low-stock or sales dashboard from these reads. Customer/product edits, stock adjustments, sale/payment writes, gift-card/store-credit workflows, webhook processing and editor-assistant attachment are not implemented here. Selecting an advanced write scope alone does not add those operations.",
72
+ "Unapproved registrations can connect up to 30 stores; production-ready public applications require Lightspeed approval. This connector is Retail X-Series only. R-Series, K-Series and personal-token setup are not supported here. Changing the callback, client or store can require reconnection."
73
+ ] }
74
+ });
75
+ export { lightspeedDefinition };
@@ -0,0 +1,27 @@
1
+ const linkedinDefinition = Object.freeze({
2
+ id: "linkedin", name: "LinkedIn", description: "Connect a member's LinkedIn account to read their permitted profile information and publish approved text posts.",
3
+ accountModes: ["shared", "per-user", "assistant"], authenticationMethods: ["oauth2"],
4
+ scopes: [
5
+ { value: "openid", label: "OpenID (required)", required: true, recommended: true },
6
+ { value: "profile", label: "Read basic profile (required)", required: true, recommended: true },
7
+ { value: "email", label: "Read primary email address" },
8
+ { value: "w_member_social", label: "Publish posts" }
9
+ ],
10
+ permissionsHint: "OpenID and profile are required for profile verification. Email is optional. Publish posts needs LinkedIn's Share on LinkedIn product; select it and reconnect before publishing text posts.",
11
+ setup: {
12
+ url: "https://learn.microsoft.com/en-us/linkedin/consumer/integrations/self-serve/sign-in-with-linkedin-v2",
13
+ steps: [
14
+ "Open https://www.linkedin.com/developers/apps, choose My apps > Create app, and supply the application name, LinkedIn Page, privacy-policy URL and logo. Complete the requested Page-owner verification. This registration belongs to your application.",
15
+ "Open Products and request Sign In with LinkedIn using OpenID Connect. Wait until the product is available and Auth lists openid and profile. Email is optional. For text publishing, request Share on LinkedIn, wait until Auth lists w_member_social, select Publish posts here, save and reconnect.",
16
+ "In Auth > OAuth 2.0 settings > Authorized redirect URLs, add the exact Suggested callback URL shown here. Use an absolute HTTPS URL without query or fragment. Copy Client ID from Auth into this form. Your application backend must implement the callback route.",
17
+ "Save configuration, then choose Set credential in Env to store Client Secret as LINKEDIN_CLIENT_SECRET. Use Open Env to store the registered callback as LINKEDIN_CALLBACK_URL, or the alternate names you entered in the references. Return to this connection when both values are set.",
18
+ "For shared or assistant access, choose Connect account and authorize the intended LinkedIn member. For Each user, connection starts from the generated application's account screen after signing in. Verification reads the member's profile; it does not publish or create an application login. Email may be absent even when requested.",
19
+ "Your application must approve the exact post text and visibility (PUBLIC or CONNECTIONS) before posts.create. The adapter derives the author from the connected member; it cannot publish as an arbitrary person. A timeout may occur after a post was created: check LinkedIn before manually repeating it.",
20
+ "LIMITATIONS: text posts only, with no image/video upload, organization posts, scheduling, post editing/deletion or analytics. Example: publish an approved announcement, but not a photo campaign. Saving this connection does not attach LinkedIn tools to Vibe64 coding chat.",
21
+ "Reconnect repeats consent. Ordinary access expiry requires connecting again unless LinkedIn has enabled programmatic refresh for your registration and supplied a refresh token. Disconnect removes the local grant; remove provider access separately through LinkedIn's permitted-services settings. A new app registration or callback may require consent again."
22
+
23
+ ]
24
+ }
25
+ });
26
+
27
+ export { linkedinDefinition };
@@ -0,0 +1,21 @@
1
+ const logoDevDefinition = Object.freeze({
2
+ id: "logo-dev", name: "Logo.dev", description: "Display company logos using a publishable image-service key.",
3
+ accountModes: ["shared", "assistant"], authenticationMethods: ["api-key"], scopes: [],
4
+ runtimeKind: "public-resource", configurationOnly: true,
5
+ apiKeyReferenceLabel: "Publishable key reference",
6
+ apiKeyReferenceHint: "Reference a pk_ key. Your application publishes its value in image URLs. A private sk_ key cannot be used for this image flow.",
7
+ setup: {
8
+ url: "https://www.logo.dev/docs/platform/api-keys",
9
+ steps: [
10
+ "Sign into https://www.logo.dev/dashboard/api-keys and copy the publishable key beginning pk_. Do not copy the private sk_ key: this integration displays images, and its pk_ value will be visible in the published application's image URLs.",
11
+ "Enter env:LOGO_DEV_PUBLISHABLE_KEY in Publishable key reference, then Save configuration. Choose Set credential in Env and store the actual pk_ value as LOGO_DEV_PUBLISHABLE_KEY. Return after saving Env. Your application must resolve this reference and expose only this publishable value to its image code.",
12
+ "In Logo.dev API Keys, enable Allowed Domains Only, enter allowed domains one per line, then Save Changes. Include the application's actual hosting/custom domain and intended preview domains. example.com matches that domain; *.example.com matches its subdomains. Add localhost explicitly if needed for local development.",
13
+ "Before enabling restrictions, ensure image requests send an origin referrer. Use referrerpolicy=origin on the image or an equivalent application policy; no-referrer and same-origin policies block cross-site referrers. Unlisted domains or missing referrers cause image failures.",
14
+ "Application image code can look up a domain, stock ticker such as AAPL or SHEL.L, or an email domain. Email lookup strips the part before @ locally; it displays the company logo, not a personal avatar. Supply exactly one lookup value and use meaningful alternative text and a missing-image fallback.",
15
+ "LIMITATIONS: no brand search, private enrichment API, crypto or ISIN lookup in this helper. Example: a gmail.com address resolves the email provider logo, not the person's business. Your app must add any attribution required by your provider plan; saving does not add an attribution badge.",
16
+ "This setup creates image configuration, not an OAuth grant. The application's image load/error events report delivery; saving cannot verify the key. A missing logo may return a monogram unless the application selects the 404 fallback. To rotate keys, contact Logo.dev support, then replace the Env value."
17
+
18
+ ]
19
+ }
20
+ });
21
+ export { logoDevDefinition };
@@ -0,0 +1,38 @@
1
+ import { createSchema } from "json-rest-schema";
2
+ import { secretReference } from "@jskit-ai/connectors-core/shared/configuration";
3
+
4
+ const mapboxDefinition = Object.freeze({
5
+ id: "mapbox", name: "Mapbox", description: "Validate a backend access token and look up places or coordinates.",
6
+ accountModes: ["shared", "assistant"], authenticationMethods: ["api-key", "none"], scopes: [],
7
+ authenticationMethodsForSettings: settings => settings?.usage === "browser" ? ["none"] : ["api-key"],
8
+ configurationOnlyForSettings: settings => settings?.usage === "browser",
9
+ apiKeyReferenceLabel: "Backend access token reference",
10
+ apiKeyReferenceHint: "Use a reference to a token for backend requests. It may be a public (pk.) or secret (sk.) token; browser URL restrictions can block backend geocoding.",
11
+ settingsSchema: settings => createSchema({
12
+ usage: { type: "string", enum: ["backend", "browser"], defaultTo: "backend" },
13
+ publicTokenRef: { ...secretReference, required: settings?.usage === "browser" }
14
+ }),
15
+ settingsFields: [{ name: "usage", label: "Mapbox usage", credentialScope: value => value,
16
+ items: [{ title: "Backend geocoding and optional browser maps", value: "backend" }, { title: "Browser maps only", value: "browser" }] }, { name: "publicTokenRef", environmentCredential: { label: "Public browser token", public: true }, label: "Public browser token reference", placeholder: "env:MAPBOX_PUBLIC_TOKEN",
17
+ hint: "Required for browser-only mode; optional with backend geocoding. Separate pk. token for Mapbox in your browser. The application may publish this value; backend verification does not verify its restrictions." }],
18
+ setup: {
19
+ url: "https://docs.mapbox.com/accounts/guides/tokens/",
20
+ stepsForSettings(settings) { return settings?.usage === "browser" ? [
21
+ "In Mapbox Developer Console > Access Tokens > Create a token, create a public pk. token with styles:read and fonts:read for your map. Never use a secret sk. token in browser code.",
22
+ "Choose Browser maps only here, enter env:MAPBOX_PUBLIC_TOKEN in Public browser token reference and Save configuration. Store that pk. value in project Env. Your app deliberately exposes only this public token to its map SDK. No backend token, account verification or OAuth callback is needed.",
23
+ "Restrict the token to the actual app hosting/custom and preview URLs. Include localhost only for development. Default public tokens cannot be URL-restricted; create a new token. Wildcards and missing Referer headers do not work with these restrictions.",
24
+ "Use the framework's Mapbox GL JS integration, import its CSS, give the map container a height and preserve attribution. Set accessToken from this public Env binding; handle SDK errors and call map.remove when the view closes. Saving configuration does not install the SDK or test the token's domain restrictions.",
25
+ "LIMITATIONS: no map editor, turn-by-turn navigation UI, offline tiles or automatic SDK installation. Example: your app can display a map using its native SDK, but saving this form does not create a map page. Rotate the token in Mapbox and update/redeploy the public configuration."
26
+ ] : this.steps; },
27
+ steps: [
28
+ "Sign into Mapbox Developer Console → Access Tokens → Create a token. Name it for this application and environment. Select only the scopes your APIs need; geocoding can use a public pk. token. Copy a secret sk. token immediately: it is shown only once.",
29
+ "For backend geocoding, enter env:MAPBOX_BACKEND_TOKEN in Backend access token reference. Use a token without browser URL restrictions: backend requests have no browser referrer. Never publish a secret sk. token in browser code.",
30
+ "For browser maps, create a separate public pk. token with the SDK’s map scopes, including styles:read and fonts:read. Enter env:MAPBOX_PUBLIC_TOKEN in Public browser token reference. The application must deliberately load this public value; this connector does not render a map.",
31
+ "Restrict the browser token to the deployed application URLs, adding preview, custom domains and localhost when needed. Create a new token rather than using the default public token, which cannot be URL-restricted. Wildcards are unsupported; blocking the Referer header can cause 403 errors.",
32
+ "Save configuration, then use Set credential in Env for MAPBOX_BACKEND_TOKEN and Open Env for MAPBOX_PUBLIC_TOKEN if supplied. Store token values there, not in reference fields. Connect account verifies only the backend token’s validity; it does not test geocoding entitlement or the optional browser token. No OAuth app or callback URL is needed.",
33
+ "For routes, directions.get accepts driving, driving-traffic, walking or cycling with 2–25 longitude/latitude waypoints. It returns GeoJSON, metres and seconds. Handle NoRoute/NoSegment as unavailable routes and draw successful geometry using your app's native map SDK. No map editor, offline tiles, navigation UI or automatic SDK installation is included.",
34
+ "To rotate, create a replacement token, update its Env value and verify again before deleting the old token in Mapbox. Update and redeploy browser configuration when its public token changes. Disconnect removes the local connection; it does not delete either Mapbox token."
35
+ ]
36
+ }
37
+ });
38
+ export { mapboxDefinition };
@@ -0,0 +1,92 @@
1
+ import { createSchema } from "json-rest-schema";
2
+
3
+ function validN8nServerUrl(value) {
4
+ if (!/^https:\/\//iu.test(value) || /[\s\\?#]/u.test(value) || /\/(?:\.|%2e){1,2}(?:\/|$)/iu.test(value)) return false;
5
+ try {
6
+ const url = new URL(value);
7
+ return !url.username && !url.password && url.pathname.endsWith("/mcp-server/http");
8
+ } catch { return false; }
9
+ }
10
+
11
+ function validN8nOAuthDiscovery(value) {
12
+ try {
13
+ if (!validN8nServerUrl(value.resource)) return false;
14
+ const metadata = value.oauth;
15
+ const issuer = new URL(metadata.issuer);
16
+ if (issuer.protocol !== "https:" || issuer.username || issuer.password || issuer.search || issuer.hash) return false;
17
+ const base = issuer.href.replace(/\/$/u, "");
18
+ const includes = (values, item) => Array.isArray(values) && values.includes(item);
19
+ return metadata.authorization_endpoint === `${base}/mcp-oauth/authorize` &&
20
+ metadata.token_endpoint === `${base}/mcp-oauth/token` && metadata.registration_endpoint === `${base}/mcp-oauth/register` &&
21
+ includes(metadata.response_types_supported, "code") && includes(metadata.grant_types_supported, "authorization_code") &&
22
+ includes(metadata.grant_types_supported, "refresh_token") && includes(metadata.token_endpoint_auth_methods_supported, "client_secret_post") &&
23
+ includes(metadata.code_challenge_methods_supported, "S256") && Array.isArray(value.scopes) && value.scopes.length > 0 &&
24
+ new Set(value.scopes).size === value.scopes.length && value.scopes.every((scope) =>
25
+ typeof scope === "string" && /^[\x21\x23-\x5B\x5D-\x7E]{1,200}$/u.test(scope) && includes(metadata.scopes_supported, scope));
26
+ } catch { return false; }
27
+ }
28
+
29
+ const n8nDefinition = Object.freeze({
30
+ id: "n8n", name: "n8n", description: "Discover and use your n8n instance's MCP tools from an assistant.",
31
+ accountModes: ["assistant"], authenticationMethods: ["api-key"], scopes: [],
32
+ authenticationMethodsForSettings: (settings) => settings.oauthDiscovery ? ["oauth2", "api-key"] : ["api-key"],
33
+ scopesForSettings: (settings) => (settings.oauthDiscovery?.scopes || []).map((value) => ({ value, label: value })),
34
+ apiKeyReferenceLabel: "MCP access token reference",
35
+ apiKeyReferenceHint: "Use the personal token from Instance-level MCP, not an n8n REST API key. The assistant host must authorize individual tool calls.",
36
+ settingsSchema: createSchema({ serverUrl: { type: "string", required: true, minLength: 1, maxLength: 2048,
37
+ validator: (value) => validN8nServerUrl(value) || "Use the HTTPS MCP server URL ending /mcp-server/http, without credentials, query or fragment." },
38
+ oauthDiscovery: { type: "object", additionalProperties: true,
39
+ validator: (value) => validN8nOAuthDiscovery(value) || "Discover a supported n8n OAuth authority and permissions before connecting." }
40
+ }),
41
+ settingsFields: [{ name: "serverUrl", label: "Server URL", placeholder: "https://automation.example.com/mcp-server/http",
42
+ hint: "Copy the full Server URL from n8n's MCP connection details. Keep any reverse-proxy subdirectory." }],
43
+ setup: {
44
+ url: "https://docs.n8n.io/connect/connect-to-n8n-mcp-server",
45
+ clientRegistrationEndpoint: (settings) => settings.oauthDiscovery?.resource === settings.serverUrl
46
+ ? settings.oauthDiscovery.oauth.registration_endpoint : undefined,
47
+ stepsByAuthentication: { oauth2: [
48
+ "LIMITATIONS: Automatic Vibe64 coding-chat attachment is deferred. A separately wired CLI or assistant host can discover and invoke exposed workflows through MCP after approving the exact tool and arguments; connecting alone does not attach chat tools. This connector is not the n8n REST API or a workflow designer.",
49
+ "In n8n, open Settings → Instance-level MCP and enable access as an instance owner or admin. Copy its full Server URL. In this editor, Discover OAuth settings reads the instance's public authority and permissions. CLI users can call discoverN8nOAuth. A server without advertised OAuth permissions is not supported by this path; use its personal API key method instead.",
50
+ "Select OAuth and the smallest set of advertised permissions your application needs. Keep Assistant access. Enter the Suggested callback URL your application will actually serve; use the application address, not the editor dashboard. If n8n restricts Allowed callback URLs, ask its owner/admin to allow that exact URL before registration.",
51
+ "In this editor, choose Register client and connect. This saves the client ID in configuration and the secret, callback and recovery client ID in development Env, then starts your application’s consent flow. It requires unused Env keys and an application-owned callback/setup command. Alternatively, use OAuth client registration below to send the displayed JSON in one POST with Content-Type: application/json, or call registerN8nClient from the CLI. A timeout may still have created a client; investigate before repeating registration.",
52
+ "For manual registration only, copy client_id from the successful response into Client ID. Keep client_secret private and note any expiry. Keep env:N8N_CLIENT_SECRET and env:N8N_CALLBACK_URL (or this slot's displayed names) as references. Save configuration, use Set credential in Env for the secret, and Set callback in Env for the exact registered callback. Do not paste the complete registration response into configuration or chat.",
53
+ "Return and click Connect account. Sign into the intended n8n account, review the requested permissions and approve access. Your application's callback completes consent. Verification initializes MCP and lists tools; it does not run a workflow. A successful client registration alone does not connect an account.",
54
+ "In Instance-level MCP → Workflows exposed, choose Enable workflows, select the intended workflow and Enable. The account must have access. Search can reveal previews of other workflows visible to that account; exposure is not isolated per client. The assistant host must authorize each tool and its exact arguments.",
55
+ "Use Reconnect for fresh consent. Disconnect here removes the local grant. Review and remove provider access separately in n8n's Instance-level MCP → Connected clients. Changing the Server URL requires discovery again; a new callback or client registration may also require fresh consent. Your application owns tokens and refresh outside the editor."
56
+ ] },
57
+ steps: [
58
+ "LIMITATIONS: Automatic Vibe64 coding-chat attachment is deferred. A separately wired CLI or assistant host can discover and invoke exposed workflows through MCP after approving the exact tool and arguments; connecting alone does not attach chat tools. This connector is not the n8n REST API or a workflow designer.",
59
+ "In n8n, open Settings → Instance-level MCP. An instance owner or admin selects Enable MCP access. This setup uses the personal-token method; n8n's OAuth tab is a different connection path.",
60
+ "Under Connection details, select Connect → API key. On first opening, n8n generates a personal token for your account. Copy the Server URL and token now: after leaving, the token is redacted. Older versions call this tab Access Token. Do not use a REST API key or a workflow's MCP Server Trigger URL.",
61
+ "Paste the full HTTPS Server URL ending /mcp-server/http here, keeping any installation subdirectory or port. Keep env:N8N_API_KEY as the token reference. Save configuration, then select Set credential in Env to store the token value. No OAuth app ID or callback is needed for this token method.",
62
+ "Under Instance-level MCP → Workflows exposed, select Enable workflows, find the intended workflow and Enable. Alternatively open the workflow's top-right menu → Settings → Available in MCP. Check that the workflow is eligible and that the token owner has access. Search tools may reveal previews of other workflows this user can view; exposure is not isolated per client.",
63
+ "Click Connect account after Env is configured. Verification initializes MCP and lists tools without running a workflow. The assistant host must approve each tool and its exact arguments; discovery alone does not establish permission to execute every workflow or attach tools to chat.",
64
+ "To replace a lost token, return to Connection details → Connect → API key and generate a new token beside the redacted value. This revokes the old token: update Env for every client using it, then reconnect. Disconnect here removes local grants and does not revoke the n8n token."
65
+
66
+ ]
67
+ }
68
+ });
69
+
70
+ const sanityDefinition = Object.freeze({
71
+ id: "sanity", name: "Sanity", description: "Discover and use Sanity's hosted MCP tools from an assistant.",
72
+ accountModes: ["assistant"], authenticationMethods: ["oauth2", "api-key"],
73
+ scopes: [{ value: "global", label: "Sanity MCP account access", recommended: true }],
74
+ apiKeyReferenceLabel: "MCP API token reference",
75
+ apiKeyReferenceHint: "Store a Sanity token in Env. Its role controls tool access at https://mcp.sanity.io; the assistant host must authorize individual calls.",
76
+ setup: {
77
+ url: "https://www.sanity.io/docs/ai/mcp-server",
78
+ clientRegistrationEndpoint: "https://mcp.sanity.io/register",
79
+ steps: [
80
+ "Choose OAuth for Sanity account consent, or API key for a project-scoped token. This is builder/assistant context, not generated-app login. The editor coding-assistant attachment is deferred; saving alone does not make those tools available in chat.",
81
+ "For OAuth, use the exact Suggested callback URL served by your backend. Click Register client and connect to create your client and save its credentials in development Env. For manual setup, POST the shown OAuth client registration JSON once to https://mcp.sanity.io/register, or use registerSanityClient from a CLI, then save client_id and the secret reference. Register only callbacks your backend serves.",
82
+ "Save the client and callback references, set their values in Env, then connect and approve Sanity account access. The global scope is the provider's MCP scope, not a per-dataset permission selector. Authorize specific project, dataset and tool arguments in your assistant host.",
83
+ "For API key authentication instead, select API key in Authentication. Open sanity.io/manage, select the intended project, then Settings, API, Tokens and Add new token.",
84
+ "Give the token a distinct name, choose the smallest role the intended tools need and set an expiry if appropriate. Copy the token once shown.",
85
+ "Store the token in Env and enter its reference here. The runtime uses Sanity's fixed HTTPS MCP endpoint.",
86
+ "A project token cannot grant account-wide administration. Choose token ownership for the actual tools; successful discovery does not prove every tool is allowed.",
87
+ "Save configuration. Connecting will check tool discovery; each tool call still needs the assistant's permission."
88
+ ]
89
+ }
90
+ });
91
+
92
+ export { n8nDefinition, sanityDefinition, validN8nOAuthDiscovery };
@@ -0,0 +1,47 @@
1
+ import { createSchema } from "json-rest-schema";
2
+
3
+ const delegatedScope = "https://analysis.windows.net/powerbi/api/GraphQLApi.Execute.All";
4
+ const serviceScope = "https://api.fabric.microsoft.com/.default";
5
+ const guid = "[a-fA-F0-9]{8}-(?:[a-fA-F0-9]{4}-){3}[a-fA-F0-9]{12}";
6
+ const guidPattern = new RegExp(`^${guid}$`, "u");
7
+ const endpointPattern = new RegExp(`^https://api\\.fabric\\.microsoft\\.com/v1/workspaces/${guid}/(?:graphqlapis|graphQLApis|GraphQLApis)/${guid}/graphql$`, "u");
8
+ const scopes = [
9
+ { value: delegatedScope, label: "Execute GraphQL queries and mutations as the user", recommended: true },
10
+ { value: "offline_access", label: "Keep user access between visits", recommended: true },
11
+ { value: serviceScope, label: "Use the service account's Fabric permissions", recommended: true }
12
+ ];
13
+
14
+ const microsoftFabricDefinition = Object.freeze({
15
+ id: "microsoft-fabric", name: "Microsoft Fabric", categories: ["Microsoft", "Productivity"],
16
+ description: "Access one Fabric GraphQL API using user consent or a service principal.",
17
+ accountModes: ["shared", "per-user", "assistant"], authenticationMethods: ["oauth2"],
18
+ oauthGrantTypes: ["authorization_code", "client_credentials"], oauthClientAuthenticationMethods: ["client_secret_post"],
19
+ validateClientId: (value) => guidPattern.test(value) || "Enter the Application (client) ID as a GUID.",
20
+ oauthGrantHint: "User consent needs a Web callback and delegated GraphQL permission. Service account needs a service principal with Fabric access, without a callback.",
21
+ settingsSchema: createSchema({
22
+ tenantId: { type: "string", required: true, maxLength: 36,
23
+ validator: (value) => guidPattern.test(value) || "Enter the Directory (tenant) ID as a GUID, not common or a client ID." },
24
+ graphqlEndpoint: { type: "string", required: true, maxLength: 256,
25
+ validator: (value) => endpointPattern.test(value) || "Copy the Fabric GraphQL API endpoint with workspace and API IDs, without a query string or fragment." }
26
+ }),
27
+ settingsFields: [
28
+ { name: "tenantId", label: "Microsoft Entra Tenant ID", placeholder: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", hint: "The directory containing the Fabric resource and permitted users or service principal." },
29
+ { name: "graphqlEndpoint", label: "Fabric GraphQL Endpoint", placeholder: "https://api.fabric.microsoft.com/v1/workspaces/<workspace-id>/graphqlapis/<api-id>/graphql",
30
+ hint: "Open your API for GraphQL in Fabric and select Copy endpoint. Custom proxies and sovereign-cloud addresses are not supported by this fragment." }
31
+ ],
32
+ scopes, scopesForGrantType: (grantType) => scopes.filter((scope) => grantType === "client_credentials" ? scope.value === serviceScope : scope.value !== serviceScope),
33
+ permissionsHint: "Fabric Execute access permits queries and mutations. Your application must authorize the documents it executes. Data-source access is separate; this does not sign users into your application.",
34
+ setup: { url: "https://learn.microsoft.com/en-us/fabric/data-engineering/connect-apps-api-graphql", steps: [
35
+ "You need an existing Fabric API for GraphQL and permission to register an application in its Microsoft Entra directory. In Entra admin center → Entra ID → App registrations → New registration, name the app, choose the intended directory audience and Register. Copy Application (client) ID and Directory (tenant) ID from Overview into their separate fields; use the tenant GUID, not common.",
36
+ "Open Certificates & secrets → Client secrets → New client secret. Add a description and expiry, then Add. Copy Value immediately, not Secret ID. Keep env:MICROSOFT_FABRIC_CLIENT_SECRET as the secret reference; store the secret value in Env after saving.",
37
+ "For User consent, open Authentication → Redirect URI configuration → Add Redirect URI → Web, paste this project's exact Suggested callback URL and Configure. Under API permissions → Add a permission → Power BI Service → Delegated permissions, select GraphQLApi.Execute.All. Allow offline access for refresh and complete any administrator consent required by the directory.",
38
+ "For Service account, no callback or delegated permission is needed. A Fabric tenant administrator opens Admin portal → Tenant settings → Developer settings, enables Service principals can use Fabric APIs and selects Apply. In the API item's … → Manage permissions → Add user, find the app registration, select Run Queries and Mutations and Grant.",
39
+ "Open the existing API for GraphQL and select Copy endpoint. Paste the complete URL into Fabric GraphQL Endpoint. The signed-in user or service principal needs API Execute access; the caller or saved connection also needs underlying data-source permissions. These are separate grants.",
40
+ "Save configuration, then use Set credential in Env for the secret. User consent also needs Open Env to store the exact registered URL as MICROSOFT_FABRIC_CALLBACK_URL. Connect account uses the selected shared identity; per-user connections happen inside the generated app. Service account connects without a browser consent window.",
41
+ "Use graphql.execute with an app-approved query, JSON variables and optional operationName. It accepts mutations too: authorize the exact document and inputs on your backend. Partial GraphQL errors fail the call and may follow a successful change; inspect data before retrying.",
42
+ "LIMITATIONS: no automatic table browser, schema-specific client, pagination, subscriptions or Vibe64 assistant attachment. Example: query your inventory with its actual schema, but do not expect a generated inventory dashboard or an unrestricted query console.",
43
+ "Verification reads only the root type name; it does not test your business queries or mutate data. For optional schema discovery, a workspace administrator enables Introspection in the API settings. Rotate expiring secrets in Env before deleting old ones. Disconnect removes local access, not Fabric permissions or Microsoft consent."
44
+ ] }
45
+ });
46
+
47
+ export { microsoftFabricDefinition, delegatedScope, serviceScope };