@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
package/docs/linear.md ADDED
@@ -0,0 +1,137 @@
1
+ # Linear
2
+
3
+ Import `linearProvider` from `@jskit-ai/connectors-catalog/server/linear`.
4
+ This adapter supports a personal API key or project-owned OAuth, with GraphQL reads and Linear MCP tools. Vibe64 edits the project configuration; the generated application owns its runtime and credentials.
5
+
6
+ ## Configure access
7
+
8
+ 1. Select the intended Linear workspace and open **Settings → Account → Security & Access**.
9
+ 2. In the personal API-key section, create a key with a descriptive application
10
+ name. Choose read access and the teams the application needs where these
11
+ controls are offered.
12
+ 3. Enter `env:LINEAR_API_KEY` in API key reference, **Save configuration**, then choose **Set credential in Env** and store the key as `LINEAR_API_KEY`. Return to connect.
13
+ 4. Save provider `linear`, mode `shared` or `assistant`, `scopes: ["read"]`, and
14
+ authentication `{ "method": "api-key", "secretRef": "env:LINEAR_API_KEY" }`.
15
+ 5. Call `connectApiKey` to verify the viewer; manage/revoke the key in the same
16
+ settings section. [Authentication guide](https://linear.app/developers/graphql).
17
+
18
+ ## Runtime and CLI composition
19
+
20
+ The API is `POST https://api.linear.app/graphql`. Personal keys use the raw
21
+ `Authorization` header, without the OAuth Bearer prefix. `profile.read` selects
22
+ `viewer { id name email }`. `issues.list` accepts `first` (1–100, default 50;
23
+ 100 is this fragment's cap) and optional `after`; it returns issue IDs,
24
+ identifiers, titles and `pageInfo`. Continue using `endCursor` only while
25
+ `hasNextPage` is true. [Pagination](https://linear.app/developers/pagination).
26
+
27
+ Both queries are fixed in the provider module. Input values become GraphQL
28
+ variables, never interpolated query text. Responses with GraphQL errors are
29
+ rejected even when HTTP status is 200 and partial data exists. The application
30
+ must not display that partial data as a successful result.
31
+
32
+ Use the [API-key pattern](../patterns/api-key-connection/PATTERN.md). It leaves
33
+ application authorization with the caller and persists connection state in files.
34
+
35
+ ## Automation and application registrations
36
+
37
+ Personal key creation uses the interactive settings flow. For OAuth applications,
38
+ Linear supports a JSON application manifest: an AI can fill display information,
39
+ callback URLs and other supported configuration, then prepopulate the app-creation
40
+ page. A person still reviews and creates the application's own registration.
41
+ No unverified unattended registration API is assumed. [Application manifests](https://linear.app/developers/oauth-app-manifests).
42
+
43
+ Distinct
44
+ names/keys alone do not establish independent organization/user rate limits.
45
+ The application owner supplies the key and controls access to its organization.
46
+ Tests cover fixed queries, variables, pagination, partial errors, persistent
47
+ state, credential changes and isolation without live issue access.
48
+
49
+ ## Project-owned OAuth
50
+
51
+ 1. As a workspace administrator, open **Settings → Administration → API** and
52
+ create an OAuth application. The direct creation page is
53
+ <https://linear.app/settings/api/applications/new>. Register the exact
54
+ **Suggested callback URL** from this project's integration screen.
55
+ 2. Copy its Client ID into the form. Save configuration and use the Env links to
56
+ store `LINEAR_CLIENT_SECRET` and `LINEAR_CALLBACK_URL`. Registering the URL
57
+ does not implement the application's callback handler.
58
+ 3. Keep `read` selected; choose additional permissions only for required features.
59
+ This adapter uses `actor=user`, including in assistant mode. Service-account
60
+ actors and client-credentials grants are outside this adapter's flow.
61
+ 4. Shared/assistant connections start with **Connect account**. Per-user
62
+ connections start in the generated application's authenticated account screen.
63
+ The framework owns login and callback routing; JSKIT supplies the JavaScript
64
+ lifecycle library. Other frameworks use their own OAuth implementation.
65
+ 5. Approve the intended workspace. Verification reads the viewer. Cancel a pending
66
+ attempt locally if you abandon consent; reconnect starts a new attempt.
67
+ 6. Disconnect clears the local grant. For remote revocation, open **Settings →
68
+ Account → Security & Access → Authorized applications**, hover the application
69
+ and choose **Revoke access**. Another workspace uses another connection.
70
+
71
+ Authorization uses comma-separated scopes, S256 PKCE and a project-owned secret
72
+ posted to Linear's token endpoint. Returned space-separated permissions (or
73
+ Linear's documented array form) are normalized before the shared lifecycle stores
74
+ and enforces them. Refresh tokens rotate and remain in the application's encrypted
75
+ connection store. Client secrets and grants are never stored in source.
76
+ [OAuth protocol](https://linear.app/developers/oauth-2-0-authentication),
77
+ [account access controls](https://linear.app/docs/security-and-access).
78
+
79
+ Use the [OAuth pattern](../patterns/oauth-connection/PATTERN.md), with registration
80
+ `source: "own"`, `tokenEndpointAuthMethod: "client_secret_post"`, the Client ID and
81
+ Env references above. Use provider `linear`, a registration reference in
82
+ `authentication`, and `scopes: ["read"]`. `beginAuthorization`,
83
+ `completeAuthorization`, `invoke`, and `disconnect` retain the same ownership
84
+ contract as other OAuth connectors.
85
+
86
+ ## MCP with the same connection
87
+
88
+ `tools.list` and `tools.call` use the fixed Streamable HTTP endpoint
89
+ `https://mcp.linear.app/mcp`. Linear explicitly supports reusing an API key or an
90
+ existing Linear OAuth grant for this endpoint, so this path needs no additional
91
+ MCP registration. The adapter supplies raw key authorization to GraphQL and Bearer
92
+ authorization to MCP; OAuth uses Bearer for both. The captured Lovable interactive
93
+ MCP registration flow is a different registration path, not required for this
94
+ project-owned connection. The deprecated `/sse` endpoint is not used.
95
+
96
+ Tool calls may write when the provider grant allows it. The application must
97
+ approve/authorize the named operation and its arguments; `read` alone cannot
98
+ permit writes at Linear. Discovery does not execute tools. Use `tools.list` to
99
+ obtain available schemas rather than maintaining a second catalogue here.
100
+ [Linear MCP authentication](https://linear.app/docs/mcp).
101
+
102
+ ## Review evidence
103
+
104
+ The focused fixture tests cover OAuth authorization, cancellation/denial, replay,
105
+ refresh rotation after restart, app/user isolation, lost scopes, raw API-key
106
+ GraphQL authorization and Bearer MCP discovery. No real Linear account, issue,
107
+ consent or tool execution was used. Both credential modes passed a controlled public-editor browser review: configuration survives reload, Env links and provider guides resolve to the intended destinations, and simulated connection controls work. The 496px instruction captures were visually inspected; no live provider consent or fresh phone review is claimed.
108
+
109
+ ## Approved project and issue workflows
110
+
111
+ The existing MCP transport can discover and invoke the provider's project/issue
112
+ tools with either connection method. Discover `tools.list` (including returned
113
+ cursors), inspect each current input schema, then authorize the tool name and
114
+ arguments against the requesting app user and selected team/project. Supply write
115
+ permissions only when needed. Do not copy fixture tool names into application code.
116
+
117
+ ```js
118
+ const result = await connections.invoke({
119
+ context: authorizedContext, integrationId: "linear", operation: "tools.call",
120
+ input: { name: approvedTool.name, arguments: approvedTool.arguments }
121
+ });
122
+ if (result.isError) throw new Error("Linear did not complete the requested action.");
123
+ ```
124
+
125
+ `connections`, authenticated context and `approvedTool` are app-owned composition,
126
+ not exported globals. Use the returned project identifier when creating its issue;
127
+ use the returned issue identifier when updating it. The authorization callback
128
+ must enforce the exact target and write approval before transport. Never blindly
129
+ retry an uncertain create. CLI apps use the same library/configuration/Env; other
130
+ frameworks compose their native MCP client and authorization with those values.
131
+
132
+ **LIMITATIONS:** No maintained tool catalogue, project-management UI or automatic
133
+ Vibe64 Codex/OpenCode attachment. Example: an app can explicitly run an approved
134
+ issue update, but saving a Linear connection alone does not teach Vibe64's coding
135
+ chat to update that issue. Provider permissions and available tools determine what
136
+ can run. Fixture workflows prove argument/result transport and local denial, not
137
+ actual Linear tool schemas or live execution.
@@ -0,0 +1,196 @@
1
+ # LinkedIn
2
+
3
+ Import `linkedinProvider` from `@jskit-ai/connectors-catalog/server/linkedin`.
4
+ This adapter reads the connected member's profile through `profile.read` and publishes approved text with `posts.create`.
5
+ Configuration preserves `openid`, `profile`, `email` and `w_member_social`.
6
+ Only OpenID and profile are required and selected by default. Publishing requires the Share on LinkedIn product and a grant with `w_member_social`.
7
+
8
+ ## Register and configure
9
+
10
+ 1. Sign into [LinkedIn Developers](https://www.linkedin.com/developers/apps).
11
+ Choose **My apps → Create app**. Supply the requested name, LinkedIn Page,
12
+ privacy-policy URL and logo; complete Page-owner verification when prompted.
13
+ 2. Open **Products** and request **Sign In with LinkedIn using OpenID Connect**.
14
+ Once approved, check **Auth** for `openid`, `profile` and `email`.
15
+ Email fields may be absent even when profile retrieval succeeds.
16
+ [Product and profile documentation](https://learn.microsoft.com/en-us/linkedin/consumer/integrations/self-serve/sign-in-with-linkedin-v2).
17
+ 3. Open **Auth → OAuth 2.0 settings → Authorized redirect URLs** and add the
18
+ project's exact **Suggested callback URL**, using HTTPS. Copy **Client ID** into the configuration.
19
+ Save **Client Secret** only in backend Env as `LINKEDIN_CLIENT_SECRET`.
20
+ Set `LINKEDIN_CALLBACK_URL` to the registered URL without query or fragment.
21
+ [Confidential authorization flow](https://learn.microsoft.com/en-us/linkedin/shared/authentication/authorization-code-flow).
22
+ 4. For text publishing, request **Share on LinkedIn** under Products and
23
+ confirm `w_member_social` is provisioned in Auth before selecting it.
24
+ [Share product](https://learn.microsoft.com/en-us/linkedin/consumer/integrations/self-serve/share-on-linkedin).
25
+ 5. In Vibe64 choose **Add LinkedIn**, enter display name, ownership, Client ID
26
+ and the two Env references. Open **Permissions** for optional email/publishing.
27
+ Choose **Save configuration**, then **Set credential in Env** to store the
28
+ Client Secret. Use **Open Env** to set the same registered callback. Return
29
+ and choose **Connect account** for shared/assistant access. Each-user access
30
+ starts in the generated application's authenticated account screen. Its
31
+ backend must implement the callback; saving fields does not create that route
32
+ or complete provider consent.
33
+
34
+ ```json
35
+ {
36
+ "schemaVersion": 1,
37
+ "integrations": {
38
+ "linkedin": {
39
+ "provider": "linkedin",
40
+ "displayName": "My LinkedIn profile",
41
+ "accountMode": "per-user",
42
+ "scopes": ["openid", "profile"],
43
+ "authentication": { "method": "oauth2", "registrationRef": "linkedin" }
44
+ }
45
+ },
46
+ "registrations": {
47
+ "linkedin": {
48
+ "source": "own",
49
+ "clientId": "YOUR_LINKEDIN_CLIENT_ID",
50
+ "clientSecretRef": "env:LINKEDIN_CLIENT_SECRET",
51
+ "callbackUrlRef": "env:LINKEDIN_CALLBACK_URL"
52
+ }
53
+ }
54
+ }
55
+ ```
56
+
57
+ ## Runtime and AI composition
58
+
59
+ Use the [OAuth file composition pattern](../patterns/oauth-connection/PATTERN.md)
60
+ with `providers: [linkedinProvider]` and this JSON. Core owns configuration,
61
+ Env resolution, consent attempts, encrypted file storage, refresh and disconnect.
62
+ No generator or editor database is needed.
63
+
64
+ ```js
65
+ import { readFile } from "node:fs/promises";
66
+ import { parseIntegrationConfiguration } from "@jskit-ai/connectors-core/shared/configuration";
67
+ import { createConnectionService, createEnvironmentReferenceResolver } from "@jskit-ai/connectors-core/server";
68
+ import { createFileConnectionStore, createCredentialProtection } from "@jskit-ai/connectors-core/server/file-storage";
69
+ import { linkedinProvider } from "@jskit-ai/connectors-catalog/server/linkedin";
70
+
71
+ const providers = [linkedinProvider];
72
+ const configuration = parseIntegrationConfiguration(await readFile("integrations.json", "utf8"), { providers });
73
+ const protection = createCredentialProtection({
74
+ keys: { current: Buffer.from(process.env.CONNECTOR_STORAGE_KEY, "base64") }, activeKeyId: "current"
75
+ });
76
+ const connections = createConnectionService({
77
+ configuration, providers,
78
+ store: createFileConnectionStore({ directory: process.env.CONNECTOR_STATE_DIRECTORY, protection }),
79
+ resolveReference: createEnvironmentReferenceResolver(), authorize: applicationConnectionPolicy
80
+ });
81
+ ```
82
+
83
+ `applicationConnectionPolicy` derives `{ applicationId, subjectId }` from
84
+ trusted app authentication or a CLI operator and checks each requested operation.
85
+ Per-user mode keeps individual grants; shared mode needs a stable shared subject
86
+ and membership checks. Assistant mode requires explicit host authorization too.
87
+ Keep runtime files outside exported source and preserve the encryption key
88
+ across restarts. No client secret or provider token belongs in project JSON.
89
+
90
+ Call `beginAuthorization({ context, integrationId: "linkedin" })` and open the
91
+ returned URL. Recover the same authenticated owner in the callback, then call
92
+ `completeAuthorization({ context, integrationId: "linkedin", callbackUrl })`.
93
+ Success includes a read-only profile check. Later call
94
+ `invoke({ context, integrationId: "linkedin", operation: "profile.read" })`.
95
+ The operation accepts no input and calls only
96
+ `GET https://api.linkedin.com/v2/userinfo`. It requires a nonempty `sub` and
97
+ accepts absent optional name/email fields. Do not infer a missing email or
98
+ fetch picture URLs automatically.
99
+
100
+ `cancelAuthorization` abandons a pending attempt; failed replacement consent
101
+ preserves the old grant. `disconnect` removes local access and attempts, not
102
+ provider-wide consent. For provider revocation, open **Me → Settings & Privacy → Data privacy → Other
103
+ applications → Permitted services**, choose **Change**, then **Remove** beside
104
+ the application. [LinkedIn's access-removal instructions](https://www.linkedin.com/help/linkedin/answer/a522690/log-in-with-linkedin-credentials?lang=en).
105
+
106
+ The provider normalizes the documented omission of `token_type` to Bearer.
107
+ It discards ID tokens and never uses them as proof of application login.
108
+ The host's existing identity implementation remains responsible for login.
109
+ Core sends state and S256 PKCE parameters with confidential Web OAuth; the Web
110
+ flow documentation does not establish PKCE enforcement. LinkedIn's separate
111
+ native flow needs enablement and a loopback callback. It is not implemented
112
+ here; never embed a client secret in an installed editor or browser. CLI users
113
+ can compose the same server runtime with their registered callback owner.
114
+ [Native flow](https://learn.microsoft.com/en-us/linkedin/shared/authentication/authorization-code-flow-native).
115
+
116
+ ## Expiry, failures and verification
117
+
118
+ Ordinary grants may have no refresh token. Expiry then requires reconnect.
119
+ If LinkedIn enables programmatic refresh and supplies a refresh token, core
120
+ serializes refresh under the file lock and retains rotation. Reduced permissions
121
+ never expand during refresh. Approval is provider-controlled; refresh expiry
122
+ or revocation can still require consent again.
123
+ [Refresh availability and protocol](https://learn.microsoft.com/en-us/linkedin/shared/authentication/programmatic-refresh-tokens).
124
+
125
+ Missing required permissions, invalid responses and failed profile checks prevent
126
+ Connected. API 401 requires reconnect; 403 means permission denied; 429 means
127
+ rate limited. Errors omit provider text. Changing the OAuth client ID invalidates
128
+ access through the previous client. Requests are bounded and cancellable.
129
+ Organization access, analytics and application login are outside this adapter. Focused tests use controlled HTTP and encrypted temporary files,
130
+ including this exact JSON. Editor checks use file-backed browser fixtures.
131
+ No live consent, provider token issuance or generated application is proven.
132
+
133
+ ## Automation and application registrations
134
+
135
+ An AI can prepare JSON, Env names, callback handlers and runtime wiring. This
136
+ pass established no supported public API for creating developer apps or granting
137
+ product access. Registration, Page verification and approval remain operator
138
+ steps. Do not promise unattended provisioning from a client ID alone.
139
+
140
+ Each application owns its provider registration, callback route, credentials
141
+ and grants. Hosted and installed editors configure the same app-owned setup;
142
+ neither supplies a shared Vibe64 registration or token gateway. Use the app's
143
+ assigned public URL as the initial callback origin, append the route the backend
144
+ actually implements, and register the exact URL with the provider. Keep the
145
+ client secret and callback binding in the application's Env.
146
+
147
+ A custom-domain or hosting move that changes the callback requires updating both
148
+ the provider registration and the app's Env. Preserve the application's identity
149
+ and private connection store, validate callback state and initiator, and allow
150
+ only application-approved return destinations. The editor's address is not the
151
+ provider callback. See the [callback contract](../../connectors-core/docs/oauth-callbacks.md)
152
+ and [setup command](../../connectors-core/docs/setup-command.md).
153
+
154
+ Separate client IDs do not establish independent quotas or permission to serve
155
+ unrelated applications. Register and obtain product approval for the actual app.
156
+ Managed assignments are invalid configuration in this runtime.
157
+
158
+
159
+ ## Credential guidance review (2026-09-12)
160
+
161
+ The inline setup steps now name the developer portal, product approval, exact
162
+ callback registration and project Env handoff before connection. Current OIDC,
163
+ authorization-code and refresh documentation were checked. The existing adapter
164
+ was retained; no provider-login or publishing implementation was added. Ten
165
+ focused runtime fixtures pass, including expiry without refresh, approved
166
+ refresh, cancellation/replay, encryption, missing permissions and host isolation.
167
+ The cancellation test now expects the callback URL exposed by connection status,
168
+ while retaining the complete assertion that declined replacement consent keeps
169
+ the previous grant. Rendered guidance passed the controlled public-editor journey: saved Client ID/callback, Env links, reload, simulated consent/cancellation/reconnect and disconnect. All six steps were visually reviewed at 496px width. No live provider consent or fresh phone review is claimed.
170
+
171
+ ## Text publishing acceptance — 2026-09-13
172
+
173
+ Use `posts.create` with `{ text, visibility: "PUBLIC" }` or `"CONNECTIONS"` after
174
+ app authorization of the exact message and audience. Text is locally limited to
175
+ 1–3000 characters. The operation reads the connected member identity, constructs
176
+ the Person URN itself and posts once to `/v2/ugcPosts`. Callers cannot choose a
177
+ different author. The result contains the post URN from the confirmed 201 response.
178
+ [Provider sharing contract](https://learn.microsoft.com/en-us/linkedin/consumer/integrations/self-serve/share-on-linkedin).
179
+
180
+ ```js
181
+ const post = await connections.invoke({ context: authorizedContext,
182
+ integrationId: "linkedin", operation: "posts.create",
183
+ input: { text: approvedText, visibility: approvedVisibility } });
184
+ ```
185
+
186
+ The app supplies these variables and its approval policy. CLI uses the same config,
187
+ Env and library; other frameworks can implement the same provider request with
188
+ their native HTTP/OAuth tools. Add the provider product, select Publish posts in
189
+ configuration and reconnect before invoking it. No publishing occurs during
190
+ connection verification. Check LinkedIn before manually repeating an uncertain
191
+ request; a timeout does not prove the post was never created.
192
+
193
+ **LIMITATIONS:** Text only. No images/video, organization posts, scheduling, post
194
+ editing/deletion, analytics or editor-assistant attachment. Example: publish an
195
+ approved announcement, but not a photo campaign. Prior September12 review above
196
+ is historical. Current tests use simulated provider responses, not live publishing.
@@ -0,0 +1,152 @@
1
+ # Logo.dev
2
+
3
+ Import `createLogoDevImageUrl` from
4
+ `@jskit-ai/connectors-catalog/client/logo-dev`. This is a library implementation
5
+ for public image URLs, usable in a browser or Node process. The shared catalogue
6
+ exports `logoDevDefinition` for configuration and UI metadata.
7
+
8
+ ## Manual provider setup
9
+
10
+ 1. Sign into [Logo.dev API Keys](https://www.logo.dev/dashboard/api-keys).
11
+ Copy the publishable `pk_` key.
12
+ 2. In Vibe64, add Logo.dev and enter `env:LOGO_DEV_PUBLISHABLE_KEY` in
13
+ **Publishable key reference**. Choose **Save configuration**, then **Set
14
+ credential in Env**, and store the actual `pk_` value as
15
+ `LOGO_DEV_PUBLISHABLE_KEY`. Return after saving Env. The application resolves
16
+ that one reference for its image rendering code.
17
+ 3. For restrictions, turn on **Allowed Domains Only**, enter the domains that
18
+ load images, one per line, then choose **Save Changes**.
19
+ 4. Ensure image requests send an origin referrer. Include development/preview
20
+ domains deliberately; restrictions also reject requests without a referrer.
21
+ 5. Save the source configuration. Key rotation is documented as a support
22
+ request; replace the environment binding after obtaining the new key.
23
+
24
+ Publishable keys work on the image CDN. Private `sk_` keys belong to other APIs
25
+ and must not appear in browser image URLs.
26
+ [Key types, restrictions and rotation](https://www.logo.dev/docs/platform/api-keys).
27
+
28
+ ## Portable source and library usage
29
+
30
+ ```json
31
+ {
32
+ "schemaVersion": 1,
33
+ "registrations": {},
34
+ "integrations": {
35
+ "logos": {
36
+ "provider": "logo-dev",
37
+ "displayName": "Company logos",
38
+ "accountMode": "shared",
39
+ "scopes": [],
40
+ "authentication": { "method": "api-key", "secretRef": "env:LOGO_DEV_PUBLISHABLE_KEY" }
41
+ }
42
+ }
43
+ }
44
+ ```
45
+
46
+ An application build step, backend or CLI resolves this one configured reference
47
+ using its environment resolver. It then deliberately publishes the `pk_` value
48
+ as browser configuration or includes it in a returned image URL. Keep the
49
+ portable source file reference-only, exactly as the editor writes it. Do not
50
+ dump the environment or substitute a private key.
51
+
52
+ ```js
53
+ import { createLogoDevImageUrl } from "@jskit-ai/connectors-catalog/client/logo-dev";
54
+
55
+ const imageUrl = createLogoDevImageUrl({
56
+ publishableKey: publicConfiguration.logoDevKey,
57
+ domain: "example.com",
58
+ size: 128,
59
+ theme: "dark",
60
+ fallback: "404"
61
+ });
62
+ ```
63
+
64
+ Assign this URL to an image element's `src`, supply meaningful `alt` text and
65
+ an origin-compatible referrer policy, and handle its `error` event with the
66
+ application's own fallback. `createLogoDevImageUrl` performs no HTTP request,
67
+ records no grant and cannot establish Connected. Its metadata explicitly marks
68
+ the runtime as `public-resource`; use the
69
+ [public-image source pattern](../patterns/public-image/PATTERN.md), not the
70
+ server connection-verification API. The browser's load/error events provide
71
+ delivery evidence. They are distinct from saving configuration.
72
+
73
+ The library validates an ASCII domain (including punycode), the publishable-key
74
+ prefix and image options, then returns a URL on `https://img.logo.dev`. It rejects
75
+ caller destinations, private keys, path/query injection and unsupported fields.
76
+ Inputs are not mutated. Local defaults are size 128, PNG, automatic theme,
77
+ greyscale off, retina off and monogram fallback. Options include JPG/WebP/SVG,
78
+ light/dark/auto themes, sizes 1–800, retina, greyscale and `404` fallback.
79
+ SVG availability depends on the provider plan; URL construction does not
80
+ confirm that entitlement. Width/height overrides, brand-name and crypto lookups are outside this function.
81
+ [Image parameters](https://www.logo.dev/docs/logo-images/get).
82
+
83
+ The provider can return a monogram with HTTP 200 when a brand logo is missing.
84
+ Use `fallback: "404"` when the application needs to distinguish missing images.
85
+ A URL or successful image load does not prove that a specific brand logo exists.
86
+ [Missing-logo behavior](https://www.logo.dev/docs/logo-images/introduction).
87
+
88
+ The key is intentionally visible in image requests. Apply the provider's
89
+ attribution and usage requirements in the product; the URL helper does not add
90
+ attribution or authorize image redistribution.
91
+ [Attribution](https://www.logo.dev/docs/platform/attribution),
92
+ [usage policy](https://www.logo.dev/docs/platform/fair-use).
93
+
94
+ ## API provisioning and application ownership
95
+
96
+ No public account/key provisioning API was verified in the linked documentation.
97
+ An AI can prepare source configuration, rendering and domain instructions;
98
+ dashboard access and support-assisted rotation remain operator work. Do not
99
+ guess internal dashboard endpoints or use a secret key to make the image flow
100
+ look like an authenticated JSON service.
101
+
102
+ The application owner supplies its provider key and arranges the capacity it
103
+ needs. Configuration labels do not create independent quotas. Customer-owned
104
+ keys remain owned by the customer when exporting or moving an app. This image
105
+ flow creates no OAuth app, user login or per-user mailbox-style grant.
106
+
107
+ Allowed domains should identify the actual browser app: for example, its
108
+ hosting subdomain, custom domain and intended preview origin. The editor's VM
109
+ domain matters only if it itself loads the images. That differs from an OAuth
110
+ redirect allowlist. Changing application domains can require provider-side
111
+ restriction updates even though the portable reference is unchanged.
112
+
113
+ ## Focused evidence
114
+
115
+ Node tests cover options, encoding boundaries, private-key rejection, portable
116
+ configuration and the absence of false server verification. The ordinary
117
+ source pattern is checked with a supplied resolver. Editor/browser tests cover
118
+ save/reload, reference validation, actual image loading from a simulated CDN
119
+ and a simulated missing-image failure. No live provider use or generated sample
120
+ application is needed.
121
+
122
+
123
+ ## Credential guidance review (2026-09-12)
124
+
125
+ Current provider key and image documentation were checked against the captured
126
+ publishable-key field. The inline instructions now give the direct dashboard
127
+ URL, exact reference and Env handoff, public/private distinction, domain patterns,
128
+ referrer behavior and support-assisted rotation. The existing image library and
129
+ public-image composition pattern remain the owners of URL generation and wiring.
130
+ The first rendered review exposed an account-connect button because the editor
131
+ consumes configurationOnly metadata rather than runtimeKind. Logo.dev now sets
132
+ that existing flag: the editor omits account controls and the server refuses
133
+ setup commands before Env preparation or application execution. Two targeted
134
+ public-editor tests cover this rule for Logo.dev and Google Analytics.
135
+ All four focused library tests passed, including private-key rejection, fixed-origin URL
136
+ construction, portable configuration and selective reference resolution. Rendered guidance and simulated image delivery passed: the actual editor persists the reference through reload, links to Env and the provider guide, and offers no account-connect controls. Browser image load/error and origin-referrer behavior were checked with a simulated CDN. All five steps were visually reviewed at 496px width; no live provider or generated-app claim.
137
+
138
+ ## Lookup coverage — 2026-09-13
139
+
140
+ Supply exactly one of `domain`, `ticker` or `email` to the same URL helper.
141
+ `{ ticker: "SHEL.L" }` uses the provider's ticker endpoint with an exchange suffix;
142
+ `{ email: "person@example.com" }` extracts `example.com` locally and uses domain
143
+ lookup. The personal part of the email never enters the URL. These are ordinary
144
+ per-image application inputs, not project credential settings. The same source
145
+ pattern resolves the publishable key; other frameworks can construct equivalent
146
+ URLs without a Node runtime or Vibe64 service.
147
+ [Ticker endpoint](https://www.logo.dev/docs/logo-images/ticker).
148
+
149
+ **LIMITATIONS:** No private brand search/enrichment, crypto or ISIN lookup, avatar
150
+ identification or automatic attribution badge. Example: an address at gmail.com
151
+ returns the email provider logo, not the person's business. Apply plan attribution
152
+ in the app and distinguish image success from real brand-logo availability.
@@ -0,0 +1,153 @@
1
+ # Mailgun
2
+
3
+ Import `mailgunProvider` from `@jskit-ai/connectors-catalog/server/mailgun`.
4
+ The adapter verifies an account API key, sends transactional messages, creates
5
+ and verifies sending domains, returns their DNS records, and queries delivery logs.
6
+ DNS records are installed at the domain owner’s DNS host, not at Vibe64.
7
+
8
+ ## Configure access
9
+
10
+ 1. Sign into the intended Mailgun account as an administrator. Open the profile
11
+ menu at the top right, then **API Security → Add new key**.
12
+ 2. Enter a description and select **Developer** for sending and domain management. Select **Analyst**
13
+ only for a deliberately read-only connection. Click **Create Key** and copy the secret while it is visible.
14
+ Free/Basic accounts expose Admin only; that restriction comes from Mailgun.
15
+ Existing key roles cannot be edited: create a replacement to change roles.
16
+ [Key roles and dashboard steps](https://help.mailgun.com/hc/en-us/articles/26016288026907-API-Key-Roles).
17
+ 3. Enter `env:MAILGUN_API_KEY` in **API key reference**. Domain Sending
18
+ Keys and SMTP passwords do not provide this account domain-listing access.
19
+ [Credential types](https://help.mailgun.com/hc/en-us/articles/203380100-Where-can-I-find-my-API-keys-and-SMTP-credentials).
20
+ 4. Save provider `mailgun`, mode `shared` or `assistant`, `scopes: []`, and
21
+ authentication `{ "method": "api-key", "secretRef": "env:MAILGUN_API_KEY" }`.
22
+ Choose `settings.region: "us"` (default) or `"eu"`, corresponding to the
23
+ intended domains. The editor calls this **API region**.
24
+ 5. Choose **Save configuration**, then **Set credential in Env**. Store the real
25
+ account key as `MAILGUN_API_KEY`, return, and choose **Connect account**.
26
+ CLI apps call `connectApiKey`. Requests use HTTP Basic authentication with username
27
+ `api` and the resolved key as password. US requests go to
28
+ `https://api.mailgun.net`; EU requests go to `https://api.eu.mailgun.net`.
29
+ Changing region requires verification again.
30
+ [Authentication](https://documentation.mailgun.com/docs/mailgun/api-reference/authentication/).
31
+
32
+ ## Runtime and AI composition
33
+
34
+ `domains.list` reads `GET /v4/domains`. It accepts `limit` (1–1000, default
35
+ 100), `skip` (default 0), optional `state` (`active`, `unverified`, `disabled`),
36
+ `sort` (`name`, `name:asc`, `name:desc`), `search`, and `include_subaccounts`
37
+ (default false). Results contain `items` and `total_count`. Advance `skip` by
38
+ the number of received items to retrieve another page.
39
+ [Domain listing](https://documentation.mailgun.com/docs/mailgun/api-reference/send/mailgun/domains/get-v4-domains).
40
+
41
+ Use the [API-key pattern](../patterns/api-key-connection/PATTERN.md) with the file
42
+ store. Application code can use the operations below with the same configured connection. Local disconnect does not revoke the account key. Replace
43
+ the Env value when rotating credentials, and delete obsolete keys in Mailgun.
44
+ Tests cover both regional origins, HTTP Basic headers, pagination, re-verification,
45
+ file restart and rejected responses without accessing a real mailbox or account.
46
+
47
+ ## Automation and application ownership
48
+
49
+ After administrator credential bootstrap, an AI can automate key creation
50
+ through `POST /v1/keys` using multipart form fields: `kind=user`, a required
51
+ `role` (`basic` is the API value for Analyst), a `description`, and optionally
52
+ positive `expiration` seconds. Persist the returned `key.secret` directly in
53
+ secret storage. The runtime fragment does not expose this administrative
54
+ operation. [Key creation API](https://documentation.mailgun.com/docs/mailgun/api-reference/send/mailgun/keys/post-v1-keys).
55
+
56
+ Each application supplies credentials for its intended Mailgun account. Keys
57
+ within one account may share capacity and billing. The application operator
58
+ owns account selection and budgets; key names alone do not isolate quotas.
59
+
60
+
61
+ ## Credential guidance review (2026-09-12)
62
+
63
+ Current provider key-role, credential-type and domain-list documentation were
64
+ checked against the captured private key and US/EU fields. Inline setup now
65
+ explains the exact dashboard flow, admin requirement, Analyst where available,
66
+ one-time secret display, account-key distinction, region and named Env handoff.
67
+ Verification remains a domain-list read; it sends no email and changes no DNS.
68
+ Three focused test cases passed (1.15s), including the shared regional-destination
69
+ regression: changing region requires verification before credentials reach the
70
+ new allowed origin. No runtime change was needed. The controlled browser review passed: the EU region and MAILGUN_API_KEY reference persist after reload, Env and provider guide links are present, and simulated connect/verify/disconnect work. All six steps were visually inspected at 496px width. No live account, email sending or generated application was exercised.
71
+
72
+ ## Sending and domain setup
73
+
74
+ 1. In Mailgun, open **Send → Sending → Domains → Add new domain**. Enter a
75
+ domain you control, commonly a dedicated subdomain such as `mail.example.com`,
76
+ and select its region. Alternatively call `domains.create` with `{ domain }`.
77
+ 2. Open the domain's **Domain Verification & DNS** page. At your DNS host, add
78
+ the exact sending records shown by Mailgun. `domains.get` returns the same
79
+ sending/receiving record sets for application-owned setup screens. Do not
80
+ invent SPF/DKIM values. Some hosts append your root domain automatically.
81
+ Receiving MX records are separate from outbound sending: do not replace
82
+ existing business-mail MX records just to send through Mailgun.
83
+ 3. Check DNS status in Mailgun or call `domains.verify` with `{ domain }`.
84
+ A successful HTTP response can still contain `domain.state: "unverified"`;
85
+ display each DNS record's status and allow the operator to retry after DNS
86
+ propagation. A successful key check alone does not prove DNS readiness.
87
+ 4. Choose a sender address at that domain in your application's mail settings.
88
+ Keep recipient selection behind the application's authorization/business rules.
89
+ Sandbox domains can send only to authorized recipients; use a verified custom
90
+ domain for production.
91
+
92
+ [Domain setup](https://documentation.mailgun.com/docs/mailgun/user-manual/domains/domains-custom)
93
+ [DNS verification](https://documentation.mailgun.com/docs/mailgun/user-manual/domains/domains-verify)
94
+ [Domain API](https://documentation.mailgun.com/docs/mailgun/api-reference/send/mailgun/domains)
95
+
96
+ The runtime operations accept `{ domain }` for `domains.create`, `domains.get`,
97
+ and `domains.verify`. Creation and verification are explicit mutations; connecting
98
+ never performs them. Developer keys support these operations; Analyst keys do not.
99
+ [Current role matrix](https://documentation.mailgun.com/docs/mailgun/user-manual/api-key-mgmt/rbac-mgmt).
100
+
101
+ ```js
102
+ const queued = await connections.invoke({
103
+ context, integrationId: "mail", operation: "messages.send",
104
+ input: {
105
+ domain: "mail.example.com", from: "Support <support@mail.example.com>",
106
+ to: ["customer@example.com"], subject: "Your receipt",
107
+ text: "Thank you for your purchase.", html: "<p>Thank you for your purchase.</p>"
108
+ }
109
+ });
110
+ ```
111
+
112
+ `messages.send` requires `domain`, `from`, `to`, `subject`, and plain `text`;
113
+ HTML is optional. It sends multipart data to the configured US/EU region and
114
+ returns Mailgun's queued message ID. It does not claim inbox delivery. This
115
+ operation does not support attachments or templates yet. A timeout after sending
116
+ has an uncertain outcome: do not blindly retry or fabricate an idempotency header.
117
+ Keep the queued ID with your application's delivery record when available.
118
+ [Send API](https://documentation.mailgun.com/docs/mailgun/api-reference/send/mailgun/messages/post-v3--domain-name--messages).
119
+
120
+ ## Delivery logs and failures
121
+
122
+ Call `logs.list` with `{ domain, duration: "1d", limit: 50 }`. It queries the
123
+ current `/v1/analytics/logs` API (the older Events API is deprecated). Results
124
+ preserve event type, recipient, severity and delivery status. Pass the returned
125
+ `pagination.next` as `token` to fetch another page. For stable traversal, supply
126
+ an RFC 2822 `end` timestamp on the first request and reuse it for subsequent
127
+ pages. Poll with a bounded schedule owned by your app; retain event IDs to avoid
128
+ processing overlapping results twice. The domain filter is mandatory and
129
+ subaccount aggregation is disabled. A sending key is not sufficient for this
130
+ account-level connector; it requires an account API key.
131
+
132
+ A queued/accepted event differs from delivered; a temporary failure differs from
133
+ a permanent rejection. Surface the provider's status instead of marking every
134
+ queued message delivered. Log retention and available results depend on the
135
+ Mailgun account. No automatic resend is performed. HTTP 401 requires reconnecting
136
+ with corrected credentials; HTTP 429 should be surfaced for application-managed
137
+ backoff. [Logs API](https://documentation.mailgun.com/docs/mailgun/api-reference/send/mailgun/logs).
138
+
139
+ ## Repair proof and remaining acceptance
140
+
141
+ `test/mailgun.test.js` exercises the actual connection service with controlled HTTP:
142
+ US/EU multipart sends, repeated recipients, domain creation/read/verification,
143
+ DNS status preservation, delivery failures, pagination, app isolation, denied
144
+ operations, invalid inputs, 401/429 and uncertain writes. Three tests pass.
145
+ No Mailgun account or actual email delivery was used. The inline credential guide
146
+ must be reviewed in the public editor before provider acceptance is closed.
147
+
148
+ **LIMITATIONS:** No attachments, stored templates, campaign/mailing-list UI, inbound
149
+ routes, webhook receiver or editor-assistant attachment. Example: send and track
150
+ a receipt email, but not attach its PDF through this adapter. Application-native
151
+ mail settings/business rules own sender and recipient authorization, content,
152
+ polling and duplicate prevention. CLI apps use the same configuration and Env;
153
+ other frameworks compose these requests with their own HTTP/mail tools.