@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,72 @@
1
+ # Microsoft Teams
2
+
3
+ Provider ID `microsoft-teams`; export `microsoftTeamsProvider` from
4
+ `@jskit-ai/connectors-catalog/server/microsoft-teams`.
5
+
6
+ Follow all [Microsoft registration steps](microsoft-oauth.md), selecting
7
+ **Multiple Entra ID tenants**. This module uses the `organizations` authority;
8
+ personal Microsoft accounts are unsupported. Under **API permissions → Microsoft
9
+ Graph → Delegated permissions**, add `Team.ReadBasic.All`, `Channel.ReadBasic.All`, `User.Read` and `offline_access`.
10
+ The form requires team/channel/profile reads. Optional channel send and all-user
11
+ profile read start selected; clear them for listing teams only. Channel-message
12
+ read and chat read/write are also available. The operations below use these permissions separately; `teams.list` itself uses only `Team.ReadBasic.All`.
13
+ The user's organization must provide Teams access and permit consent.
14
+
15
+ `teams.list` verifies access with `GET /v1.0/me/joinedTeams`. Verification input
16
+ is `{}`. This endpoint does not support OData query parameters, so this fragment
17
+ does not offer page size, search or filter controls. It returns the `value`
18
+ array of teams in which the signed-in user has direct membership. Shared-channel
19
+ access does not necessarily imply that the host team appears here. That listing does not itself read/send messages; use the separate operations below. Team creation and membership changes remain unsupported.
20
+ [Joined teams API](https://learn.microsoft.com/en-us/graph/api/user-list-joinedteams?view=graph-rest-1.0).
21
+
22
+ The common continuation input is accepted only for a same-resource provider
23
+ link if one is returned; do not manufacture a Teams paging URL. The fragment
24
+ does not introduce query parameters on its initial request.
25
+
26
+ AI provisioning is **API-capable after authorization** using Graph application
27
+ creation and credential endpoints. Apply the audience and delegated permissions
28
+ above. Administrator consent and tenant restrictions remain provider-controlled.
29
+ The application owner supplies its registration and private Env bindings using
30
+ the common guide. Separate registrations do not remove overlapping tenant/service
31
+ limits.
32
+
33
+ Use the common JSON/file-store pattern from a CLI or backend. Automated tests
34
+ verify the organization endpoint, exact permission, query-free initial request,
35
+ scope denial, cancellation, refresh, isolation and encrypted persistence. Live
36
+ Teams usage and generated applications are excluded.
37
+
38
+ ## Editor credential handoff
39
+
40
+ The inline guide covers Entra registration/audience, exact Web redirect,
41
+ delegated permissions and administrator consent, secret Value versus Secret ID,
42
+ and rotation. Save `env:MICROSOFT_TEAMS_CLIENT_SECRET` and
43
+ `env:MICROSOFT_TEAMS_CALLBACK_URL`, then use **Set credential in Env** and
44
+ **Open Env** for their values. Shared/assistant **Connect account** uses the
45
+ prepared project runtime. Per-user connections belong to authenticated users
46
+ of that app. No Vibe64 gateway or editor-owned provider registration is used.
47
+ Local disconnect does not revoke provider consent.
48
+
49
+ ## Conversations in CLI and generated apps
50
+
51
+ `channels.list({teamId})` requires Channel.ReadBasic.All.
52
+ `messages.list({teamId,channelId,pageSize?})` and
53
+ `replies.list({teamId,channelId,messageId})` require ChannelMessage.Read.All.
54
+ `messages.send({teamId,channelId,text})` and
55
+ `replies.send({teamId,channelId,messageId,text})` require ChannelMessage.Send.
56
+ Existing chats use `chats.list({})`, `chatMessages.list({chatId,pageSize?})` and
57
+ `chatMessages.send({chatId,text})` with Chat.ReadWrite. Retain returned resource IDs
58
+ and same-resource nextLink values. Text sends are bounded to 20,000 characters.
59
+
60
+ App authorization must approve the destination and text; connected permissions
61
+ are not permission to expose an unrestricted send endpoint. Do not blindly retry
62
+ uncertain sends. Sanitize returned HTML before rendering. JSKIT CLI apps call the
63
+ same connection service; other frameworks use Graph and their own Env/grant store.
64
+
65
+ **LIMITATIONS:** No team/chat creation, membership administration, message edit/delete,
66
+ attachments, meeting bot or editor tool attachment. Example: read a channel and
67
+ post a status update, not a Teams client or automatic team administrator. No live
68
+ provider or generated-app proof.
69
+
70
+ [Channel messages](https://learn.microsoft.com/en-us/graph/api/channel-list-messages?view=graph-rest-1.0),
71
+ [channel send](https://learn.microsoft.com/en-us/graph/api/channel-post-messages?view=graph-rest-1.0),
72
+ [chat send](https://learn.microsoft.com/en-us/graph/api/chat-post-messages?view=graph-rest-1.0).
@@ -0,0 +1,119 @@
1
+ # Microsoft Word
2
+
3
+ Provider ID `microsoft-word`; export `microsoftWordProvider` from
4
+ `@jskit-ai/connectors-catalog/server/microsoft-word`. This initial adapter browses
5
+ document files and folders in the connected account's default drive, and reads
6
+ file metadata. It does not read or edit document contents, download files,
7
+ execute macros, create files or change sharing. A filename extension identifies
8
+ a candidate file; it is not a check of the file's actual format.
9
+
10
+ ## Registration and configuration
11
+
12
+ Follow the complete [Microsoft registration steps](microsoft-oauth.md).
13
+ Use **Any Entra ID Tenant + Personal Microsoft accounts** with `common`, or the
14
+ matching organizational, personal-only or single-directory option in that guide.
15
+ For one directory, copy **Directory (tenant) ID** into `settings.tenantId`.
16
+ Under **API permissions → Add a permission → Microsoft Graph → Delegated
17
+ permissions**, select `Files.Read` and `offline_access`. Then configure the
18
+ Web callback, create a client secret and store its Value through the referenced
19
+ Env variable. Use an account with an existing drive; JSKIT does not provision it.
20
+
21
+ ```json
22
+ {
23
+ "schemaVersion": 1,
24
+ "integrations": {
25
+ "files": {
26
+ "provider": "microsoft-word",
27
+ "accountMode": "per-user",
28
+ "scopes": [
29
+ "Files.Read",
30
+ "offline_access"
31
+ ],
32
+ "settings": {
33
+ "tenantId": "common"
34
+ },
35
+ "authentication": {
36
+ "method": "oauth2",
37
+ "registrationRef": "microsoft"
38
+ }
39
+ }
40
+ },
41
+ "registrations": {
42
+ "microsoft": {
43
+ "source": "own",
44
+ "clientId": "YOUR_APPLICATION_CLIENT_ID",
45
+ "clientSecretRef": "env:MICROSOFT_CLIENT_SECRET",
46
+ "callbackUrlRef": "env:MICROSOFT_CALLBACK_URL"
47
+ }
48
+ }
49
+ }
50
+ ```
51
+
52
+ The same values are editable in Vibe64: display name, account ownership, tenant,
53
+ Client ID, secret/callback references and the two permission choices. Saving the
54
+ file does not open provider consent. The [OAuth composition pattern](../patterns/oauth-connection/PATTERN.md)
55
+ uses the library for consent, private encrypted text storage and runtime access.
56
+ A per-user slot uses the app's authenticated subject. A shared slot uses the
57
+ host's membership policy and stable shared subject; it is a shared account.
58
+
59
+ ## Runtime operations
60
+
61
+ - `items.list`: optional `folderId`, `pageSize` (1–100, default 25) and `nextLink`.
62
+ Without `folderId`, reads `/v1.0/me/drive/root/children`; otherwise reads
63
+ `/v1.0/me/drive/items/{folderId}/children`. Keeps folders and files whose
64
+ extensions are doc, docx, docm, dot, dotx, dotm, case-insensitively.
65
+ - `items.get`: required `itemId`, reading `/v1.0/me/drive/items/{itemId}`.
66
+ Returns a matching file's metadata. Other file types and folders produce
67
+ `connector_document_type_invalid`.
68
+
69
+ Both operations require `Files.Read`. IDs must be opaque item IDs, not paths or
70
+ URLs. Selected metadata includes ID, name, size, web URL, file/folder facets,
71
+ parent reference, last modification time and ETag. The adapter does not follow
72
+ returned URLs. [Graph children API](https://learn.microsoft.com/en-us/graph/api/driveitem-list-children?view=graph-rest-1.0),
73
+ [Graph item API](https://learn.microsoft.com/en-us/graph/api/driveitem-get?view=graph-rest-1.0).
74
+
75
+ `items.list` verifies a new connection with input `{}`. Its page size bounds the
76
+ upstream page before local file filtering. A filtered page can be empty and
77
+ still have `@odata.nextLink`: retain that link and pass it with the same folder
78
+ input to continue. It is not a recursive search or an automatic full-drive scan.
79
+ Next links cannot change Graph origin or the selected resource path.
80
+
81
+ ## Application registration and AI provisioning
82
+
83
+ AI provisioning is **API-capable after operator authorization** using the
84
+ application and credential endpoints in the common guide. Registration remains
85
+ separate from account consent and tenant administrator policy.
86
+
87
+ Register the callback served by this application's backend. Store its exact URL
88
+ and client secret in application environment bindings. The same setup works with
89
+ a CLI, installed editor or hosted editor; none supplies a shared registration.
90
+ See the [callback guide](../../connectors-core/docs/oauth-callbacks.md) for domain
91
+ changes and reconnect behavior. Keep the selected Microsoft tenant/audience
92
+ consistent with the provider registration.
93
+
94
+ ## Evidence and limits
95
+
96
+ Focused fixtures cover consent, cancellation, encrypted restart, refresh,
97
+ reduced permissions, owner isolation, tenant changes, folder paging, empty
98
+ filtered pages, metadata validation and controlled provider failures. Provider
99
+ HTTP is simulated. No live account, provider registration or generated app is
100
+ used. Provider-console administration and live account acceptance remain outside
101
+ this fixture evidence.
102
+
103
+ ## Editor credential handoff
104
+
105
+ The inline guide supplies Entra registration, account audience, Web callback,
106
+ delegated permissions, secret Value and expiry steps. Save
107
+ `env:MICROSOFT_WORD_CLIENT_SECRET` and `env:MICROSOFT_WORD_CALLBACK_URL`;
108
+ use **Set credential in Env** and **Open Env** to store the values.
109
+ Shared/assistant **Connect account** invokes the prepared application runtime.
110
+ Per-user connections belong to individual users inside that application.
111
+ No Vibe64 gateway or shared registration is used.
112
+
113
+ ## Existing-scope closeout — 13 September 2026
114
+
115
+ Delegated project-owned OAuth browses default-drive folders and Word candidate filenames and fetches selected file metadata, with bounded paging, tenant/audience configuration and refreshed private grants.
116
+
117
+ No document content reading, creation/editing, upload/download, conversion, macros, sharing, recursive search, arbitrary drive/site selection or document format validation. Filename extension filtering is not content inspection; filtered empty pages can still have a continuation. No app-only/client-credentials or device-code grant, application login or automatic remote consent revocation. The app owns callback routes, account connection UI, authorization and file-picker/pagination behavior. Exact Lovable shared-form fields/scopes remain unverified because the saved shared-form reference is a loading placeholder. To extend: choose supported native document tooling, implement content/file transfers with conflict and format preservation tests; do not invent Graph document-editing endpoints. No live provider account, provider registration, paid request or generated-application execution was tested. No new editor coding-assistant tool attachment is claimed. Other frameworks use the same project configuration and their own native tools; JSKIT is optional.
118
+
119
+ 7 provider-specific source and 7 installed-package cases passed, plus 2 shared Microsoft tenant checks in each 16-test Word/PowerPoint run on September 13. September 12 rendered guidance/form/lifecycle evidence at 496px is retained; no new phone or browser run.
package/docs/miro.md ADDED
@@ -0,0 +1,117 @@
1
+ # Miro assistant MCP
2
+
3
+ Checked against Miro's public documentation and discovery metadata on 9 September
4
+ 2026. This fragment connects an assistant owner's selected Miro team, discovers
5
+ tools and calls explicitly authorized tools. Its fixed HTTP endpoint is
6
+ `https://mcp.miro.com/`, including the trailing slash.
7
+
8
+ ## Registration and consent steps
9
+
10
+ 1. Read [Connecting to Miro MCP](https://developers.miro.com/docs/connecting-to-miro-mcp).
11
+ A user signs into Miro and selects the team containing the intended boards.
12
+ This MCP client registration is separate from creating a REST API application
13
+ in **Your apps**; those credentials are not interchangeable.
14
+ 2. Choose the actual callback served by your assistant backend or CLI host.
15
+ Use HTTPS for a remote host; use a loopback callback only where the provider
16
+ accepts that client setup.
17
+ 3. Invoke `registerMiroClient` once from an authorized setup command. Pass the
18
+ client name, callback and selected scopes. It uses Miro's advertised dynamic
19
+ registration endpoint, requests `client_secret_post`, and returns the client
20
+ ID, secret and any reported secret-expiry timestamp.
21
+ 4. Store the secret in the host's secret/environment facilities. Write the client
22
+ ID, secret reference and callback reference into the portable registration.
23
+ Never put the secret value in the configuration JSON.
24
+ 5. In Vibe64, select **Integrations → Add Miro**. Enter **Client ID**, **Client
25
+ secret reference** and **Callback URL reference**. Keep **Assistant access**.
26
+ **Read boards** starts selected; enable other permissions only as needed.
27
+ The **OAuth client registration** panel supplies the endpoint and raw JSON
28
+ POST body for the current callback/scopes. Send it once from your HTTP client
29
+ or use the helper above. Select **Save configuration**, then **Set credential
30
+ in Env** for `MIRO_CLIENT_SECRET` and **Open Env** for `MIRO_CALLBACK_URL`.
31
+ **Connect account** invokes the prepared application runtime; saving alone
32
+ does not register or authorize an account.
33
+ 6. The host begins authorization and opens the returned URL. Sign in, review the
34
+ requested access, and select the appropriate Miro team. Complete the callback
35
+ under the same authenticated owner. The runtime discovers available tools
36
+ before storing the connection.
37
+ 7. To switch teams, reconnect and choose the new team during provider consent.
38
+ Discovering tools does not prove access to any particular board. Team and
39
+ organization administrators can restrict access even when a client is valid.
40
+
41
+ Miro's connection guide documents the **Connect**, sign-in, team-selection and
42
+ **Continue** flow. A custom host supplies its own equivalent connect action;
43
+ the provider controls its account and team screens.
44
+
45
+ ## Fields and operations
46
+
47
+ | Field | Meaning |
48
+ |---|---|
49
+ | Client ID | Assigned by MCP dynamic registration |
50
+ | Client secret reference | Reference to the confidential registration's secret |
51
+ | Callback URL reference | Reference to the exact backend redirect URI |
52
+ | `boards:read` | Board read permission; selected initially |
53
+ | `boards:write` | Board writes; initially unselected |
54
+ | `openid` | Identity scope; initially unselected |
55
+ | `email` | Email scope; initially unselected |
56
+
57
+ These fields follow the
58
+ [authorization metadata](https://mcp.miro.com/.well-known/oauth-authorization-server)
59
+ and [resource metadata](https://mcp.miro.com/.well-known/oauth-protected-resource).
60
+ The issuer/resource is `https://mcp.miro.com/`; its `/authorize`, `/token` and
61
+ `/register` endpoints belong to the same server. The existing OAuth runtime
62
+ binds the resource to code and refresh requests. Identity scopes do not turn
63
+ this connector into the application's login system.
64
+
65
+ Import `miroProvider` and `registerMiroClient` from
66
+ `@jskit-ai/connectors-catalog/server/miro`, then use the
67
+ [assistant OAuth pattern](../patterns/assistant-mcp-oauth/PATTERN.md):
68
+
69
+ ```js
70
+ const registration = await registerMiroClient({
71
+ clientName: "My board assistant",
72
+ callbackUrl: configuredCallback,
73
+ scopes: ["boards:read"]
74
+ });
75
+ ```
76
+
77
+ The host stores the result privately. `tools.list` returns current tool schemas;
78
+ `tools.call` requires the host's exact name/argument authorization. For example,
79
+ a host can allow the documented `board_search_boards` tool and validate its
80
+ query, then authorize board-specific reads separately. Do not infer write
81
+ approval from granted OAuth scopes or the presence of a tool in discovery.
82
+ Use Miro's current [tool reference](https://developers.miro.com/docs/miro-mcp-tools)
83
+ when composing calls; tool availability evolves, and the library does not pin a
84
+ second copy of the remote tool catalogue. Returned `isError` stays observable.
85
+
86
+ ## Connection ownership and callbacks
87
+
88
+ Register the real callback implemented by the runtime that owns this connection.
89
+ For an application integration, use the application's assigned hosting URL as
90
+ the initial origin and its implemented callback path. Store the exact callback
91
+ in its Env reference and provider registration. A domain change requires updating
92
+ both values if the callback URL changes; retain the application identity and its
93
+ persistent grants when moving hosts. Public Vibe64, Online and CLI users supply
94
+ their own registrations through this same contract.
95
+ See the [callback guide](../../connectors-core/docs/oauth-callbacks.md).
96
+
97
+ The application or explicitly authorized assistant host owns the client secret
98
+ and grants. Each user still selects a team and grants access. Separate client
99
+ IDs do not establish separate team capacity, entitlements or billing limits.
100
+
101
+ ## Automation assessment and proof
102
+
103
+ Miro documents OAuth with dynamic registration in its
104
+ [MCP overview](https://developers.miro.com/docs/miro-mcp). The helper can create
105
+ the registration after a privileged caller authorizes setup; AI can assemble
106
+ configuration, callback handlers and tool policy. Sign-in, consent, team choice
107
+ and any administrator approval remain external actions. The helper never
108
+ retries an ambiguous registration automatically.
109
+
110
+ Focused tests use simulated provider replies and real encrypted files for
111
+ registration, PKCE, refresh after restart, replay, ownership, discovery,
112
+ tool policy, safe HTTP failures and cancellation. No live registration,
113
+ consent, board read/write or sample application was exercised. Managed
114
+ assignments, automatic assistant attachment and application login remain
115
+ outside this fragment.
116
+
117
+ **LIMITATIONS (accepted deferral):** Automatic Vibe64 Codex/OpenCode attachment is deferred. Example: a wired CLI/assistant host may discover and authorize a board read or diagram tool, but connecting here does not make the board available in Vibe64 chat. No embedded board editor. Fixture board/diagram names are controlled test inputs, not claims about current remote tool names. Live board access remains unproven.
package/docs/n8n.md ADDED
@@ -0,0 +1,169 @@
1
+ # n8n assistant MCP connection
2
+
3
+ Import `n8nProvider` from `@jskit-ai/connectors-catalog/server/n8n`. Configure
4
+ `accountMode: "assistant"`, `authentication.method: "api-key"`, an environment
5
+ `secretRef`, empty `scopes`, and `settings.serverUrl`. The shared validator
6
+ requires a final HTTPS endpoint ending `/mcp-server/http`; installation paths
7
+ and explicit ports are retained. Display name is the common integration field.
8
+
9
+ ## Manual setup
10
+
11
+ 1. Open **Settings → Instance-level MCP** as an owner/admin and enable access.
12
+ 2. Open **Connection details → Connect → API key**. Copy **Server URL** and the
13
+ personal token into the URL setting and secret environment respectively.
14
+ Older releases label the token tab **Access Token**.
15
+ 3. Review **Workflows exposed** and enable only the intended workflows.
16
+ 4. Keep `env:N8N_API_KEY` as the reference, select **Save configuration**,
17
+ then **Set credential in Env** for the token. Select **Connect account**
18
+ to verify discovery; the assistant separately authorizes individual tool calls.
19
+ 5. To expose a workflow, choose **Workflows exposed → Enable workflows**,
20
+ select it and **Enable**, or use its **… → Settings → Available in MCP**.
21
+ Check workflow eligibility and user access. Search may return previews of
22
+ other workflows visible to that user; exposure is not isolated per client.
23
+
24
+ Use the [n8n setup guide](https://docs.n8n.io/connect/connect-to-n8n-mcp-server)
25
+ for version-specific screens and token rotation. A REST API key is a different
26
+ credential. Rotating this personal token revokes its predecessor.
27
+
28
+ ## Runtime and ownership
29
+
30
+ `connectApiKey` performs initialization and `tools/list`, never a workflow call.
31
+ `tools.list` accepts an optional opaque `cursor`; `tools.call` requires `name`
32
+ and an `arguments` object. Results retain MCP content, `isError`, tool schemas
33
+ and pagination. Tool errors are data; protocol/HTTP failures use safe connector
34
+ errors. No automatic tool selection or execution occurs.
35
+
36
+ The application policy receives the requested tool and arguments before any
37
+ HTTP request. Apply the assistant's delegated authority there, and treat tool
38
+ descriptions/results as untrusted external content. Every call gets a temporary
39
+ MCP session; cleanup attempts DELETE and closes local streams. Operations have
40
+ the core's 15-second bound. Cancellation does not undo a workflow already
41
+ accepted remotely, and connection discovery does not establish every permission.
42
+
43
+ Private HTTPS instances are intentionally permitted in trusted configuration;
44
+ the runtime host owns outbound-network restrictions. It contacts only the exact
45
+ configured endpoint and never follows redirects, metadata links or returned
46
+ URLs. Changing the URL requires verification again. Tokens and sessions are
47
+ not copied into project source; existing encrypted file storage owns grants.
48
+
49
+ ## Automation and application ownership
50
+
51
+ AI can compose this configuration and runtime wiring once supplied an authorized
52
+ token. This fragment provides no API for enabling MCP or issuing its initial
53
+ token; provisioning remains manual. OAuth client provisioning is available through `registerN8nClient` below;
54
+ instance access policies and actual provider consent still apply.
55
+
56
+ This token mode has no OAuth app ID. The application owner supplies a credential
57
+ for its n8n instance through private Env. Separate credentials give attribution
58
+ and revocation; they do not demonstrate independent capacity on the same instance.
59
+ Independent capacity requires separate instances or appropriate usage limits.
60
+
61
+ ## Proof and limits
62
+
63
+ `test/mcp.test.js` uses the real SDK, JSON/SSE response fixtures and encrypted
64
+ file storage to exercise discovery, tool calls, input policy, restart, rotation,
65
+ changed destinations, isolation, failure handling and cancellation. The editor
66
+ test checks the same URL/reference fields and reload. `test/n8nOAuth.test.js`
67
+ exercises OAuth with controlled discovery, registration and token responses.
68
+ Automatic assistant attachment, stdio, resources/prompts, live n8n and generated
69
+ apps are not tested.
70
+
71
+ ## Remaining authorization parity
72
+
73
+ n8n also supports OAuth. The captured Lovable flow accepts only the server URL
74
+ and offers Add & authorize. The runtime supports personal tokens and
75
+ OAuth. The editor offers explicit discovery and Register client and connect,
76
+ which registers a client, saves configuration and Env, then invokes the
77
+ application-owned connection flow. Manual registration remains available. The token path
78
+ requires no client registration or callback.
79
+
80
+ ## OAuth discovery helper
81
+
82
+ `discoverN8nOAuth({ serverUrl }, { fetchImpl, signal })` is exported from the
83
+ same server entry point. It returns `{ resource, oauth, scopes }` after reading
84
+ the MCP protected-resource and authorization-server metadata through the existing
85
+ SDK. It does not register a client, send credentials or open consent.
86
+
87
+ The exact configured resource must match discovery. A single HTTPS issuer is
88
+ required, but it can use a different hostname and installation path. The helper
89
+ validates n8n's advertised /mcp-oauth endpoints, S256, refresh and confidential
90
+ client_secret_post support. Scopes come from discovery, not a hardcoded universal
91
+ list. Failed discovery requires correcting the instance/URL; it does not guess
92
+ an OAuth authority from the MCP hostname. Trusted callers own outbound-network
93
+ policy, including access to private instances. Requests omit credentials, reject
94
+ redirects and share a 15-second cancellation bound.
95
+
96
+ The editor exposes Discover OAuth settings for n8n. The provider uses saved discovery
97
+ as described below. Focused discovery tests
98
+ cover split hosts and paths, inconsistent metadata, bad inputs and cancellation.
99
+
100
+ ## OAuth client registration helper
101
+
102
+ `registerN8nClient({ serverUrl, clientName, callbackUrl, scopes }, options)`
103
+ validates setup inputs, performs discovery and submits one confidential-client
104
+ registration using the existing MCP registration helper. Select a nonempty
105
+ subset of advertised resource scopes. Unsupported scopes fail before POST;
106
+ ambiguous failures are not retried. The privileged host owns authorization to
107
+ register and private storage of the returned secret.
108
+
109
+ The result includes clientId, clientSecret, optional clientSecretExpiresAt,
110
+ resource, oauth metadata, advertised scopes and the separate requestedScopes.
111
+ Advertised scopes are not consent or the permissions to save automatically.
112
+ Use the selected requestedScopes for the application's intended configuration.
113
+ Never copy the whole result into public JSON: put the secret in Env and retain
114
+ only its reference. Registration does not connect an account. The editor can register and store credentials through its explicit action,
115
+ or display the endpoint and request body for manual registration.
116
+
117
+
118
+ ## Saved OAuth configuration and runtime
119
+
120
+ For OAuth, save only `{ resource, oauth, scopes }` from discovery/registration as
121
+ `integrations.<id>.settings.oauthDiscovery`, alongside `settings.serverUrl`.
122
+ Use the same exact resource URL for `serverUrl`. This is public metadata; never
123
+ save the complete registration response here. The shared schema validates the
124
+ endpoints, protocol capabilities and advertised scope names. OAuth becomes an
125
+ available authentication method when discovery settings are present.
126
+
127
+ Create an ordinary project-owned registration with the returned `clientId`,
128
+ `clientSecretRef: "env:N8N_CLIENT_SECRET"` and
129
+ `callbackUrlRef: "env:N8N_CALLBACK_URL"`. Put the secret and exact registered
130
+ callback in private Env. Choose `authentication.method: "oauth2"`, reference
131
+ that registration, and put only the selected `requestedScopes` into the
132
+ integration's `scopes`. Advertised permissions are choices, not automatic grants.
133
+
134
+ Use `n8nProvider` with the existing `createConnectionService`, project-owned
135
+ store, reference resolver and authorization policy. `beginAuthorization` uses
136
+ the saved authority, selected scopes, S256 and exact resource. Serve the
137
+ callback in the application's backend and call `completeAuthorization` there.
138
+ The common runtime checks consent, stores encrypted grants and refreshes them
139
+ when necessary. It does not rediscover endpoints during token refresh or follow
140
+ metadata advertised by a tool response. A changed server URL requires fresh
141
+ matching discovery before consent. Revoke provider access in n8n separately
142
+ from removing a local connection.
143
+
144
+ The focused OAuth fixture proves consent, callback exchange, tool discovery,
145
+ restart/refresh and rejection of changed resources and malformed saved metadata.
146
+ It makes no live provider requests. CLI applications can use this runtime now;
147
+ the editor can discover settings and register a client explicitly.
148
+ A live n8n deployment and real consent remain untested.
149
+
150
+
151
+ In the editor, enter Server URL and select **Discover OAuth settings**. Choose
152
+ **OAuth** in **Authentication**, then open **Permissions** and select the needed
153
+ scopes. Open **Set up n8n** for the complete steps. Its **OAuth client
154
+ registration** section provides a copyable endpoint and JSON body with the
155
+ current callback and selected scopes. Alternatively choose Register client and connect with a new registration and
156
+ unused Env keys. This action saves the client and Env, then starts the normal
157
+ application-owned connection flow. For manual registration, send the request
158
+ once, enter its returned client ID, save and configure Env yourself.
159
+
160
+ Discovery requires the instance to advertise at least one supported permission.
161
+ Versions without that contract can use the personal-token path. Saved metadata
162
+ contains public endpoints and permission names only. Selecting a new slot,
163
+ changing the URL or editing the draft while discovery runs prevents a stale
164
+ response from replacing the new draft. Discovery does not write a file until
165
+ Save configuration, and it neither reads nor writes Env.
166
+
167
+ ## Accepted limitations
168
+
169
+ 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. Example: an approved host can start an exposed report workflow and receive its result, but saving this connection alone does not let Vibe64 chat start that report. Workflow tools and schemas come from discovery, not a fixed catalogue. Fixture execution is not proof of a live workflow run.
package/docs/notion.md ADDED
@@ -0,0 +1,137 @@
1
+ # Notion
2
+
3
+ Import `notionProvider` from `@jskit-ai/connectors-catalog/server/notion`.
4
+ This adapter accepts an internal connection token using `api-key`, or a
5
+ project-owned public connection using `oauth2`. It pins
6
+ `Notion-Version: 2026-03-11`. Hosted Notion MCP uses a separate connection mode and client registration.
7
+ Its controlled editor journey is verified; live consent remains untested.
8
+
9
+ ## Set up access
10
+
11
+ 1. Open [Notion's Developer portal](https://www.notion.so/profile/integrations)
12
+ with permission to create a connection in the intended workspace.
13
+ 2. In **Build → Internal connections**, choose **Create a new connection**, enter
14
+ a name, and select the installation workspace.
15
+ 3. In **Configuration**, enable **Read content** and copy the **Installation
16
+ access token**. Store the connection token outside application source
17
+ as `NOTION_API_KEY`.
18
+ 4. Use **Content access → Edit access**, or on a page open **••• → Connections →
19
+ + Add connection**. Select the connection and intended content. Parent access
20
+ includes children. An internal connection is workspace-specific.
21
+ 5. In `integrations.json`, select provider `notion`, mode `shared` or `assistant`,
22
+ empty `scopes`, and authentication method `api-key` with secret reference
23
+ `env:NOTION_API_KEY`. No client registration or callback is needed for this mode.
24
+ 6. Verify using `connectApiKey`; it performs a title search. Follow the
25
+ [internal connection guide](https://developers.notion.com/guides/get-started/internal-connections)
26
+ and [content authorization instructions](https://developers.notion.com/guides/get-started/authorization).
27
+
28
+ ## Runtime and AI composition
29
+
30
+ `content.search` accepts `query`, `page_size` (1–100), and `start_cursor` and
31
+ returns the provider's list envelope, including `has_more` and `next_cursor`.
32
+ This is title search over accessible pages/data sources, not arbitrary full-text
33
+ search. `identity.read` returns the token's user; the response may describe a
34
+ bot or a person. See [Search](https://developers.notion.com/reference/post-search)
35
+ and [Token identity](https://developers.notion.com/reference/get-self).
36
+
37
+ Apply the [API-key source pattern](../patterns/api-key-connection/PATTERN.md)
38
+ with this provider. The application owns which callers may search the shared
39
+ workspace. It supplies the same JSON file whether configured by a CLI or UI.
40
+ Page content, product screens and any writes remain separate application work.
41
+
42
+ ## Provisioning automation and capacity
43
+
44
+ An AI can prepare the library wiring and configuration; these ordinary internal
45
+ connection instructions still require a workspace operator to create the token
46
+ and share content. This pass has not verified an administrative API that creates
47
+ equivalent connections across arbitrary workspaces. Do not infer that from
48
+ Notion's content API or use undocumented console endpoints.
49
+
50
+ Each application supplies its intended Notion connection. Check provider limits
51
+ for that connection/workspace; different names do not prove isolated capacity
52
+ or permit one workspace's data to be shared with another. Unrelated app users require the separate public OAuth mode.
53
+
54
+ Fixtures cover version headers, JSON search bodies, cursors, file restart,
55
+ credential rotation, owner isolation, and rejected or malformed responses.
56
+ No Notion workspace was connected during testing.
57
+
58
+ ## Public OAuth connection
59
+
60
+ Use [Notion's public connection guide](https://developers.notion.com/guides/get-started/public-connections)
61
+ and the inline OAuth setup instructions. In the Developer portal choose
62
+ Build → Public connections, create the connection with its installation scope,
63
+ Read content capability and exact application callback, then retrieve the client
64
+ ID and secret from Configuration. Store the secret and callback in Env.
65
+
66
+ The JSON registration uses source `own`, `tokenEndpointAuthMethod`
67
+ `client_secret_basic`, `clientId`, `clientSecretRef` and `callbackUrlRef`.
68
+ The integration uses method `oauth2`, `registrationRef`, empty `scopes` and the
69
+ intended shared/per-user account mode. The app owns its callback route and uses
70
+ `beginAuthorization`, `completeAuthorization`, `invoke` and `disconnect` from
71
+ the common connection service with its authorized owner and configured storage.
72
+ Laravel implements the same provider protocol in its own framework; JSKIT
73
+ contains no PHP runtime. Vibe64 edits this configuration and the project's Env.
74
+
75
+ The adapter sends owner=user and the exact callback at authorization. It uses
76
+ confidential Basic authentication and JSON requests at the token endpoint, per
77
+ [Notion's authorization guide](https://developers.notion.com/guides/get-started/authorization).
78
+ PKCE is disabled for this documented confidential flow; common state checks
79
+ and single-use attempts remain active. API requests include the pinned version.
80
+ The runtime retains rotated refresh tokens and refreshes expiring grants using
81
+ the existing lifecycle. No artificial expiry is invented when the provider
82
+ omits it; that case follows the common runtime's non-expiring-token behavior.
83
+
84
+ The controlled OAuth test covers request encoding/authentication, callback,
85
+ replay rejection, two refresh rotations across storage restart, version headers
86
+ and another app user's denied access. Browser coverage, hosted MCP and live
87
+ Notion consent remain unproven. This is data authorization, not app login.
88
+
89
+ ## Hosted assistant MCP
90
+
91
+ Set `settings.connectionType` to `mcp` (default `rest`). Select account mode
92
+ `assistant`, OAuth with a separate own registration using `client_secret_post`,
93
+ and scope `default`. `registerNotionMcpClient({clientName, callbackUrl}, options)`
94
+ uses the existing bounded registration helper; the caller owns authorization
95
+ and secret storage. Never reuse REST client credentials.
96
+
97
+ Notion's [MCP metadata](https://mcp.notion.com/.well-known/oauth-authorization-server)
98
+ provides the separate authority. The runtime uses S256, form token requests and
99
+ https://mcp.notion.com/mcp. Verification initializes MCP and lists tools;
100
+ `tools.call` requires the host's authorization of the exact name and arguments.
101
+ Use the ordinary connection service in assistant execution mode for assistant
102
+ permission enforcement. This mode exposes no REST operations.
103
+
104
+ The editor's Connection type field switches the credential family and creates
105
+ a new OAuth registration slot. It offers assistant-only ownership and the MCP
106
+ setup instructions, including a manual registration request and Env handoff.
107
+ Controlled tests cover registration, an ambiguous registration failure without
108
+ retry, separate endpoints, PKCE, encoding, refresh after restart and tool
109
+ discovery. Controlled browser verification covers all three modes, their setup links,
110
+ credential separation, failure recovery and reload. Live consent is untested.
111
+
112
+ ## Content operations and native-framework composition
113
+
114
+ The same project-owned connection service now exposes pages.get, databases.get,
115
+ dataSources.get, blocks.list, dataSources.query, pages.create, pages.update and
116
+ blocks.append. Use database.data_sources to select a source, then read its schema.
117
+ Query with id, page_size/start_cursor and optional provider-shaped filter/sorts.
118
+ Read nested blocks separately while has_children; follow has_more/next_cursor.
119
+ Create pages with parentId, parentType (page_id or data_source_id), properties
120
+ and optional children. Update properties by page id; append children by block/page id.
121
+ Documents are bounded to64KiB; append batches1–100 blocks,256KiB total.
122
+ Read content capability is required; Insert content permits creation/append,
123
+ Update content permits property edits. Grant access to the parent pages as well.
124
+ Connection verification still only searches, never writes. Approval and rendering
125
+ belong to the app; an uncertain write is not automatically repeated.
126
+
127
+ CLI JSKIT uses service.invoke with these operations and the same file/Env config.
128
+ Other frameworks implement these documented requests using their native Notion
129
+ client and app-owned credential storage; this library contains no PHP code.
130
+ Example: pages.create can add a meeting note, then blocks.append adds an action.
131
+ **LIMITATIONS:** No embedded Notion editor, database/schema administration, file
132
+ uploads or automatic coding-chat attachment. Nested paging/rendering is app-owned.
133
+ Controlled fixtures, not live workspace or generated-app execution.
134
+
135
+ References: [data sources](https://developers.notion.com/guides/get-started/upgrade-guide-2025-09-03),
136
+ [create page](https://developers.notion.com/reference/post-page),
137
+ [append blocks](https://developers.notion.com/reference/patch-block-children).