@oomol-lab/open-connector 1.6.5 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (495) hide show
  1. package/README.md +4 -0
  2. package/assets/open-connector/catalog/apps/airtable.json +134 -0
  3. package/assets/open-connector/catalog/apps/aisa.json +6985 -319
  4. package/assets/open-connector/catalog/apps/baizhi_mcp.json +135 -0
  5. package/assets/open-connector/catalog/apps/cal.json +24 -6
  6. package/assets/open-connector/catalog/apps/discordbot.json +2888 -248
  7. package/assets/open-connector/catalog/apps/drawio_mcp.json +192 -0
  8. package/assets/open-connector/catalog/apps/enormail.json +411 -0
  9. package/assets/open-connector/catalog/apps/feishu_app_bot.json +158 -0
  10. package/assets/open-connector/catalog/apps/firecrawl.json +176 -32
  11. package/assets/open-connector/catalog/apps/framejet.json +273 -0
  12. package/assets/open-connector/catalog/apps/futunn.json +2967 -0
  13. package/assets/open-connector/catalog/apps/github.json +275 -0
  14. package/assets/open-connector/catalog/apps/gitlab.json +125 -0
  15. package/assets/open-connector/catalog/apps/gmail.json +376 -0
  16. package/assets/open-connector/catalog/apps/google_analytics.json +4 -1
  17. package/assets/open-connector/catalog/apps/google_bigquery.json +4 -1
  18. package/assets/open-connector/catalog/apps/google_search_console.json +4 -1
  19. package/assets/open-connector/catalog/apps/googlecalendar.json +210 -1
  20. package/assets/open-connector/catalog/apps/googlechat.json +694 -7
  21. package/assets/open-connector/catalog/apps/googledocs.json +4 -1
  22. package/assets/open-connector/catalog/apps/googledrive.json +479 -0
  23. package/assets/open-connector/catalog/apps/googlesheets.json +148 -1
  24. package/assets/open-connector/catalog/apps/granola.json +23 -0
  25. package/assets/open-connector/catalog/apps/hithink_finance.json +6 -3
  26. package/assets/open-connector/catalog/apps/indexed.json +1115 -0
  27. package/assets/open-connector/catalog/apps/keepa.json +3534 -987
  28. package/assets/open-connector/catalog/apps/linear.json +133 -0
  29. package/assets/open-connector/catalog/apps/linear_mcp.json +510 -0
  30. package/assets/open-connector/catalog/apps/moneyforward_mcp.json +1432 -0
  31. package/assets/open-connector/catalog/apps/notion.json +588 -1
  32. package/assets/open-connector/catalog/apps/notion_mcp.json +490 -0
  33. package/assets/open-connector/catalog/apps/odoo.json +619 -0
  34. package/assets/open-connector/catalog/apps/one_drive.json +185 -0
  35. package/assets/open-connector/catalog/apps/outlook.json +212 -8
  36. package/assets/open-connector/catalog/apps/outlook_calendar.json +23 -2
  37. package/assets/open-connector/catalog/apps/postiz.json +334 -0
  38. package/assets/open-connector/catalog/apps/proworkflow.json +529 -0
  39. package/assets/open-connector/catalog/apps/sellersprite_mcp.json +2 -1
  40. package/assets/open-connector/catalog/apps/shopify.json +282 -0
  41. package/assets/open-connector/catalog/apps/slack.json +405 -0
  42. package/assets/open-connector/catalog/apps/slackbot.json +214 -0
  43. package/assets/open-connector/catalog/apps/spotify.json +46 -43
  44. package/assets/open-connector/catalog/apps/stripe.json +96 -0
  45. package/assets/open-connector/catalog/apps/telegram.json +138 -0
  46. package/assets/open-connector/catalog/apps/tencent_docs.json +3 -0
  47. package/assets/open-connector/catalog/apps/weixin_store.json +543 -2
  48. package/assets/open-connector/catalog/apps/wisburg.json +1528 -0
  49. package/assets/open-connector/catalog/apps/woocommerce.json +127 -0
  50. package/assets/open-connector/catalog/apps/youtube.json +4 -1
  51. package/assets/open-connector/catalog/apps/zendesk.json +152 -0
  52. package/assets/open-connector/catalog/apps/zerotier.json +3319 -0
  53. package/assets/open-connector/catalog/apps-index.json +1 -1
  54. package/assets/open-connector/migrations/0014_saas_project.sql +55 -0
  55. package/assets/open-connector/migrations/0015_saas_cleanup_runtime.sql +8 -0
  56. package/assets/open-connector/migrations/0016_trigger_policy.sql +1 -0
  57. package/assets/open-connector/migrations/0017_trigger_subscriptions.sql +17 -0
  58. package/assets/open-connector/migrations/postgresql/0014_saas_project.sql +55 -0
  59. package/assets/open-connector/migrations/postgresql/0015_saas_cleanup_runtime.sql +8 -0
  60. package/assets/open-connector/migrations/postgresql/0016_trigger_policy.sql +1 -0
  61. package/assets/open-connector/migrations/postgresql/0017_trigger_subscriptions.sql +17 -0
  62. package/package.json +2 -2
  63. package/src/connection-service.d.ts +40 -7
  64. package/src/connection-service.js +60 -18
  65. package/src/core/action-policy.d.ts +8 -1
  66. package/src/core/action-policy.js +51 -0
  67. package/src/core/cast.d.ts +13 -0
  68. package/src/core/cast.js +18 -1
  69. package/src/core/guarded-fetch.d.ts +11 -3
  70. package/src/core/guarded-fetch.js +19 -7
  71. package/src/core/provider-scenarios.js +67 -13
  72. package/src/core/remote-http.d.ts +33 -0
  73. package/src/core/remote-http.js +104 -0
  74. package/src/core/request.d.ts +1 -0
  75. package/src/core/request.js +11 -1
  76. package/src/core/types.d.ts +5 -1
  77. package/src/marketplace/marketplace-service.d.ts +0 -1
  78. package/src/marketplace/marketplace-service.js +80 -92
  79. package/src/mcp.js +26 -9
  80. package/src/oauth/oauth-client-config-service.d.ts +16 -1
  81. package/src/oauth/oauth-client-config-service.js +59 -3
  82. package/src/oauth/oauth-flow-service.d.ts +14 -1
  83. package/src/oauth/oauth-flow-service.js +14 -6
  84. package/src/providers/17track/runtime.js +1 -1
  85. package/src/providers/action-contracts.generated.d.ts +20 -6
  86. package/src/providers/aifinmarket/runtime.js +1 -1
  87. package/src/providers/airtable/executors.d.ts +3 -0
  88. package/src/providers/airtable/executors.js +2 -0
  89. package/src/providers/airtable/trigger-on-record-changed.d.ts +2 -0
  90. package/src/providers/airtable/trigger-on-record-changed.definition.d.ts +4 -0
  91. package/src/providers/airtable/trigger-on-record-changed.definition.js +54 -0
  92. package/src/providers/airtable/trigger-on-record-changed.js +235 -0
  93. package/src/providers/aisa/executors.js +912 -50
  94. package/src/providers/aliyun_ack/runtime.js +1 -1
  95. package/src/providers/aliyun_sls/runtime.js +1 -1
  96. package/src/providers/app_store_server/runtime-helpers.js +1 -1
  97. package/src/providers/baizhi_mcp/actions.d.ts +2 -0
  98. package/src/providers/baizhi_mcp/actions.js +40 -0
  99. package/src/providers/baizhi_mcp/executors.d.ts +3 -0
  100. package/src/providers/baizhi_mcp/executors.js +102 -0
  101. package/src/providers/bazhuayu/runtime.js +2 -2
  102. package/src/providers/bilibili/runtime.js +2 -4
  103. package/src/providers/bilibili/upload.js +9 -7
  104. package/src/providers/cal/actions.js +5 -1
  105. package/src/providers/cloudflare_browser_rendering/executors.js +1 -1
  106. package/src/providers/cloudflare_dns/executors.js +1 -1
  107. package/src/providers/{cloudflare-current-user.js → cloudflare_dns/runtime-user.js} +2 -2
  108. package/src/providers/cloudflare_dns/runtime.d.ts +1 -1
  109. package/src/providers/cloudflare_dns/runtime.js +1 -1
  110. package/src/providers/cloudflare_r2/executors.js +1 -1
  111. package/src/providers/cloudflare_r2/runtime.d.ts +1 -1
  112. package/src/providers/cloudflare_r2/runtime.js +1 -1
  113. package/src/providers/cloudflare_worker/executors.js +1 -1
  114. package/src/providers/cloudflare_worker/runtime.d.ts +1 -1
  115. package/src/providers/cloudflare_worker/runtime.js +1 -1
  116. package/src/providers/dingtalk_mcp/runtime.js +1 -1
  117. package/src/providers/discordbot/executors.d.ts +0 -9
  118. package/src/providers/discordbot/executors.js +9 -101
  119. package/src/providers/discordbot/runtime-guilds.d.ts +3 -0
  120. package/src/providers/discordbot/runtime-guilds.js +464 -0
  121. package/src/providers/discordbot/runtime.d.ts +42 -0
  122. package/src/providers/discordbot/runtime.js +124 -0
  123. package/src/providers/drawio_mcp/executors.d.ts +3 -0
  124. package/src/providers/drawio_mcp/executors.js +19 -0
  125. package/src/providers/drawio_mcp/runtime.d.ts +8 -0
  126. package/src/providers/drawio_mcp/runtime.js +175 -0
  127. package/src/providers/enormail/executors.d.ts +4 -0
  128. package/src/providers/enormail/executors.js +97 -0
  129. package/src/providers/fastmoss_mcp/executors.js +2 -2
  130. package/src/providers/feishu_app_bot/executors.d.ts +3 -0
  131. package/src/providers/feishu_app_bot/executors.js +2 -0
  132. package/src/providers/feishu_app_bot/trigger-config.d.ts +1 -0
  133. package/src/providers/feishu_app_bot/trigger-config.js +10 -0
  134. package/src/providers/feishu_app_bot/trigger-on-event.d.ts +2 -0
  135. package/src/providers/feishu_app_bot/trigger-on-event.definition.d.ts +4 -0
  136. package/src/providers/feishu_app_bot/trigger-on-event.definition.js +63 -0
  137. package/src/providers/feishu_app_bot/trigger-on-event.js +29 -0
  138. package/src/providers/feishu_app_bot/trigger-subscriptions.d.ts +5 -0
  139. package/src/providers/feishu_app_bot/trigger-subscriptions.js +70 -0
  140. package/src/providers/finchina/executors.js +1 -1
  141. package/src/providers/framejet/executors.d.ts +4 -0
  142. package/src/providers/framejet/executors.js +19 -0
  143. package/src/providers/framejet/runtime.d.ts +16 -0
  144. package/src/providers/framejet/runtime.js +148 -0
  145. package/src/providers/futunn/actions.d.ts +2 -0
  146. package/src/providers/futunn/actions.js +152 -0
  147. package/src/providers/futunn/actions.research.d.ts +2 -0
  148. package/src/providers/futunn/actions.research.js +423 -0
  149. package/src/providers/futunn/actions.trading.d.ts +2 -0
  150. package/src/providers/futunn/actions.trading.js +204 -0
  151. package/src/providers/futunn/executors.d.ts +3 -0
  152. package/src/providers/futunn/executors.js +24 -0
  153. package/src/providers/futunn/runtime-research.d.ts +3 -0
  154. package/src/providers/futunn/runtime-research.js +133 -0
  155. package/src/providers/futunn/runtime-trading.d.ts +3 -0
  156. package/src/providers/futunn/runtime-trading.js +39 -0
  157. package/src/providers/futunn/runtime.d.ts +2 -0
  158. package/src/providers/futunn/runtime.js +50 -0
  159. package/src/providers/futunn/transport.d.ts +11 -0
  160. package/src/providers/futunn/transport.js +76 -0
  161. package/src/providers/gildata/executors.js +1 -1
  162. package/src/providers/github/executors.d.ts +3 -0
  163. package/src/providers/github/executors.js +6 -0
  164. package/src/providers/github/trigger-on-repo-event.d.ts +2 -0
  165. package/src/providers/github/trigger-on-repo-event.definition.d.ts +4 -0
  166. package/src/providers/github/trigger-on-repo-event.definition.js +94 -0
  167. package/src/providers/github/trigger-on-repo-event.js +168 -0
  168. package/src/providers/github/trigger-watch-pull-request.d.ts +2 -0
  169. package/src/providers/github/trigger-watch-pull-request.definition.d.ts +4 -0
  170. package/src/providers/github/trigger-watch-pull-request.definition.js +49 -0
  171. package/src/providers/github/trigger-watch-pull-request.js +106 -0
  172. package/src/providers/gitlab/executors.d.ts +3 -0
  173. package/src/providers/gitlab/executors.js +2 -0
  174. package/src/providers/gitlab/trigger-on-project-event.d.ts +2 -0
  175. package/src/providers/gitlab/trigger-on-project-event.definition.d.ts +5 -0
  176. package/src/providers/gitlab/trigger-on-project-event.definition.js +63 -0
  177. package/src/providers/gitlab/trigger-on-project-event.js +186 -0
  178. package/src/providers/gmail/executors.d.ts +3 -0
  179. package/src/providers/gmail/executors.js +5 -3
  180. package/src/providers/gmail/message.d.ts +6 -8
  181. package/src/providers/gmail/message.js +4 -0
  182. package/src/providers/gmail/scopes.d.ts +32 -0
  183. package/src/providers/gmail/scopes.js +37 -0
  184. package/src/providers/gmail/trigger-on-message-received.d.ts +2 -0
  185. package/src/providers/gmail/trigger-on-message-received.definition.d.ts +4 -0
  186. package/src/providers/gmail/trigger-on-message-received.definition.js +74 -0
  187. package/src/providers/gmail/trigger-on-message-received.js +232 -0
  188. package/src/providers/google_analytics/executors.js +2 -2
  189. package/src/providers/google_analytics/scopes.js +6 -1
  190. package/src/providers/google_bigquery/executors.js +2 -2
  191. package/src/providers/google_bigquery/scopes.js +2 -0
  192. package/src/providers/google_search_console/executors.js +2 -2
  193. package/src/providers/google_search_console/scopes.js +2 -0
  194. package/src/providers/googleads/executors.js +1 -1
  195. package/src/providers/googleads/scopes.d.ts +1 -3
  196. package/src/providers/googleads/scopes.js +2 -4
  197. package/src/providers/googlecalendar/executors.d.ts +3 -0
  198. package/src/providers/googlecalendar/executors.js +3 -1
  199. package/src/providers/googlecalendar/runtime-shared.js +2 -2
  200. package/src/providers/googlecalendar/scopes.js +2 -0
  201. package/src/providers/googlecalendar/trigger-on-event-changed.d.ts +2 -0
  202. package/src/providers/googlecalendar/trigger-on-event-changed.definition.d.ts +4 -0
  203. package/src/providers/googlecalendar/trigger-on-event-changed.definition.js +74 -0
  204. package/src/providers/googlecalendar/trigger-on-event-changed.js +233 -0
  205. package/src/providers/googlechat/executors.d.ts +1 -3
  206. package/src/providers/googlechat/executors.js +219 -28
  207. package/src/providers/googlechat/members.d.ts +55 -0
  208. package/src/providers/googlechat/members.js +293 -0
  209. package/src/providers/googlechat/runtime.d.ts +16 -0
  210. package/src/providers/googlechat/runtime.js +25 -0
  211. package/src/providers/googlechat/scopes.d.ts +22 -3
  212. package/src/providers/googlechat/scopes.js +30 -7
  213. package/src/providers/googledocs/executors.js +1 -1
  214. package/src/providers/googledrive/executors.d.ts +3 -0
  215. package/src/providers/googledrive/executors.js +9 -2
  216. package/src/providers/{google-auth.d.ts → googledrive/runtime-auth.d.ts} +2 -2
  217. package/src/providers/{google-auth.js → googledrive/runtime-auth.js} +3 -3
  218. package/src/providers/googledrive/runtime-collaboration.js +1 -1
  219. package/src/providers/{google-runtime.d.ts → googledrive/runtime-request.d.ts} +1 -1
  220. package/src/providers/{google-runtime.js → googledrive/runtime-request.js} +2 -2
  221. package/src/providers/googledrive/trigger-changes.d.ts +12 -0
  222. package/src/providers/googledrive/trigger-changes.definition.d.ts +7 -0
  223. package/src/providers/googledrive/trigger-changes.definition.js +101 -0
  224. package/src/providers/googledrive/trigger-changes.js +452 -0
  225. package/src/providers/googledrive/trigger-on-file-change.d.ts +2 -0
  226. package/src/providers/googledrive/trigger-on-file-change.definition.d.ts +4 -0
  227. package/src/providers/googledrive/trigger-on-file-change.definition.js +77 -0
  228. package/src/providers/googledrive/trigger-on-file-change.js +258 -0
  229. package/src/providers/googleforms/executors.js +2 -2
  230. package/src/providers/googleforms/scopes.d.ts +0 -3
  231. package/src/providers/googleforms/scopes.js +2 -6
  232. package/src/providers/googlemeet/executors.js +2 -2
  233. package/src/providers/googlemeet/scopes.d.ts +0 -3
  234. package/src/providers/googlemeet/scopes.js +2 -6
  235. package/src/providers/googlesheets/executors.d.ts +3 -0
  236. package/src/providers/googlesheets/executors.js +3 -1
  237. package/src/providers/googlesheets/scopes.js +2 -0
  238. package/src/providers/googlesheets/trigger-on-row-added.d.ts +2 -0
  239. package/src/providers/googlesheets/trigger-on-row-added.definition.d.ts +4 -0
  240. package/src/providers/googlesheets/trigger-on-row-added.definition.js +54 -0
  241. package/src/providers/googlesheets/trigger-on-row-added.js +234 -0
  242. package/src/providers/googleslides/executors.js +2 -2
  243. package/src/providers/googleslides/scopes.d.ts +0 -3
  244. package/src/providers/googleslides/scopes.js +2 -6
  245. package/src/providers/googletasks/executors.js +2 -2
  246. package/src/providers/googletasks/scopes.d.ts +0 -3
  247. package/src/providers/googletasks/scopes.js +2 -6
  248. package/src/providers/granola/actions.js +2 -0
  249. package/src/providers/granola/runtime-mcp.js +2 -0
  250. package/src/providers/granola/runtime.js +2 -2
  251. package/src/providers/hithink_finance/runtime.js +1 -1
  252. package/src/providers/indexed/executors.d.ts +4 -0
  253. package/src/providers/indexed/executors.js +16 -0
  254. package/src/providers/indexed/runtime.d.ts +26 -0
  255. package/src/providers/indexed/runtime.js +129 -0
  256. package/src/providers/indiegogo/executors.js +1 -1
  257. package/src/providers/investoday_mcp/executors.js +2 -2
  258. package/src/providers/iyunbiao/runtime.js +2 -2
  259. package/src/providers/keepa/actions.d.ts +1 -1
  260. package/src/providers/keepa/actions.js +371 -149
  261. package/src/providers/keepa/deal-attributes.d.ts +1 -0
  262. package/src/providers/keepa/deal-attributes.js +26 -0
  263. package/src/providers/keepa/runtime.js +212 -18
  264. package/src/providers/kingdee/executors.js +1 -1
  265. package/src/providers/kingdee/runtime.js +2 -2
  266. package/src/providers/kuaidi100/runtime.js +1 -1
  267. package/src/providers/linear/executors.d.ts +3 -0
  268. package/src/providers/linear/executors.js +14 -9
  269. package/src/providers/linear/trigger-on-issue-changed.d.ts +2 -0
  270. package/src/providers/linear/trigger-on-issue-changed.definition.d.ts +5 -0
  271. package/src/providers/linear/trigger-on-issue-changed.definition.js +43 -0
  272. package/src/providers/linear/trigger-on-issue-changed.js +215 -0
  273. package/src/providers/linear_mcp/actions.d.ts +47 -0
  274. package/src/providers/linear_mcp/actions.js +102 -0
  275. package/src/providers/linear_mcp/endpoints.d.ts +3 -0
  276. package/src/providers/linear_mcp/endpoints.js +3 -0
  277. package/src/providers/linear_mcp/executors.d.ts +3 -0
  278. package/src/providers/linear_mcp/executors.js +9 -0
  279. package/src/providers/linear_mcp/runtime-mcp.d.ts +15 -0
  280. package/src/providers/linear_mcp/runtime-mcp.js +238 -0
  281. package/src/providers/lingxing_mcp/runtime.js +1 -1
  282. package/src/providers/mcdonalds_cn_mcp/runtime.js +1 -1
  283. package/src/providers/metabase/mcp-runtime.js +1 -1
  284. package/src/providers/moneyforward_mcp/executors.d.ts +3 -0
  285. package/src/providers/moneyforward_mcp/executors.js +11 -0
  286. package/src/providers/moneyforward_mcp/manifest.d.ts +31 -0
  287. package/src/providers/moneyforward_mcp/manifest.js +204 -0
  288. package/src/providers/moneyforward_mcp/runtime.d.ts +18 -0
  289. package/src/providers/moneyforward_mcp/runtime.js +296 -0
  290. package/src/providers/notion/executors.d.ts +3 -0
  291. package/src/providers/notion/executors.js +41 -3
  292. package/src/providers/notion/trigger-on-database-page-event.d.ts +2 -0
  293. package/src/providers/notion/trigger-on-database-page-event.definition.d.ts +4 -0
  294. package/src/providers/notion/trigger-on-database-page-event.definition.js +63 -0
  295. package/src/providers/notion/trigger-on-database-page-event.js +293 -0
  296. package/src/providers/notion_mcp/endpoints.d.ts +3 -0
  297. package/src/providers/notion_mcp/endpoints.js +3 -0
  298. package/src/providers/notion_mcp/executors.d.ts +3 -0
  299. package/src/providers/notion_mcp/executors.js +176 -0
  300. package/src/providers/notion_mcp/mcp-response.d.ts +86 -0
  301. package/src/providers/notion_mcp/mcp-response.js +314 -0
  302. package/src/providers/odoo/executors.d.ts +3 -0
  303. package/src/providers/odoo/executors.js +32 -0
  304. package/src/providers/odoo/runtime.d.ts +16 -0
  305. package/src/providers/odoo/runtime.js +140 -0
  306. package/src/providers/one_drive/executors.d.ts +3 -0
  307. package/src/providers/one_drive/executors.js +2 -0
  308. package/src/providers/one_drive/trigger-on-item-changed.d.ts +2 -0
  309. package/src/providers/one_drive/trigger-on-item-changed.definition.d.ts +4 -0
  310. package/src/providers/one_drive/trigger-on-item-changed.definition.js +63 -0
  311. package/src/providers/one_drive/trigger-on-item-changed.js +214 -0
  312. package/src/providers/outlook/executors.d.ts +3 -0
  313. package/src/providers/outlook/executors.js +29 -6
  314. package/src/providers/outlook/microsoft-graph.js +17 -6
  315. package/src/providers/outlook/trigger-on-message-received.d.ts +2 -0
  316. package/src/providers/outlook/trigger-on-message-received.definition.d.ts +4 -0
  317. package/src/providers/outlook/trigger-on-message-received.definition.js +93 -0
  318. package/src/providers/outlook/trigger-on-message-received.js +226 -0
  319. package/src/providers/outlook_calendar/executors.js +30 -7
  320. package/src/providers/patsnap_mcp/executors.js +2 -2
  321. package/src/providers/postiz/executors.d.ts +4 -0
  322. package/src/providers/postiz/executors.js +83 -0
  323. package/src/providers/provider-loader.d.ts +5 -0
  324. package/src/providers/provider-loader.js +4 -0
  325. package/src/providers/provider-runtime.d.ts +15 -0
  326. package/src/providers/provider-runtime.js +57 -4
  327. package/src/providers/proworkflow/executors.d.ts +4 -0
  328. package/src/providers/proworkflow/executors.js +135 -0
  329. package/src/providers/registry.generated.js +14 -0
  330. package/src/providers/scrape_creators/catalog.js +1 -1
  331. package/src/providers/scrape_creators/runtime.js +1 -1
  332. package/src/providers/sellersprite_mcp/executors.js +2 -2
  333. package/src/providers/sellersprite_mcp/official-actions.js +3 -2
  334. package/src/providers/sentry/runtime.js +6 -7
  335. package/src/providers/shopify/executors.d.ts +3 -0
  336. package/src/providers/shopify/executors.js +2 -0
  337. package/src/providers/shopify/trigger-on-shop-event.d.ts +2 -0
  338. package/src/providers/shopify/trigger-on-shop-event.definition.d.ts +4 -0
  339. package/src/providers/shopify/trigger-on-shop-event.definition.js +214 -0
  340. package/src/providers/shopify/trigger-on-shop-event.js +165 -0
  341. package/src/providers/slack/actions.js +52 -3
  342. package/src/providers/slack/executors.d.ts +3 -0
  343. package/src/providers/slack/executors.js +2 -0
  344. package/src/providers/slack/runtime.js +58 -21
  345. package/src/providers/slack/trigger-on-message-posted.d.ts +2 -0
  346. package/src/providers/slack/trigger-on-message-posted.definition.d.ts +4 -0
  347. package/src/providers/slack/trigger-on-message-posted.definition.js +80 -0
  348. package/src/providers/slack/trigger-on-message-posted.js +176 -0
  349. package/src/providers/slickdeals/runtime.js +1 -1
  350. package/src/providers/sorftime_mcp/executors.js +2 -2
  351. package/src/providers/spotify/runtime.js +15 -4
  352. package/src/providers/stripe/executors.d.ts +3 -0
  353. package/src/providers/stripe/executors.js +2 -0
  354. package/src/providers/stripe/trigger-on-event.d.ts +2 -0
  355. package/src/providers/stripe/trigger-on-event.definition.d.ts +4 -0
  356. package/src/providers/stripe/trigger-on-event.definition.js +43 -0
  357. package/src/providers/stripe/trigger-on-event.js +212 -0
  358. package/src/providers/telegram/executors.d.ts +3 -0
  359. package/src/providers/telegram/executors.js +2 -0
  360. package/src/providers/telegram/trigger-on-update.d.ts +2 -0
  361. package/src/providers/telegram/trigger-on-update.definition.d.ts +5 -0
  362. package/src/providers/telegram/trigger-on-update.definition.js +78 -0
  363. package/src/providers/telegram/trigger-on-update.js +141 -0
  364. package/src/providers/tikhub/bounded-response.d.ts +1 -1
  365. package/src/providers/tikhub/bounded-response.js +8 -34
  366. package/src/providers/tikhub/endpoint-catalog.js +1 -1
  367. package/src/providers/tikhub/runtime.js +2 -2
  368. package/src/providers/tongdaxin/executors.js +79 -15
  369. package/src/providers/uspto/executors.js +1 -1
  370. package/src/providers/waffo/executors.js +1 -1
  371. package/src/providers/waffo/runtime.js +1 -1
  372. package/src/providers/wecom_mcp/runtime.js +1 -1
  373. package/src/providers/weixin_store/access-token.d.ts +2 -1
  374. package/src/providers/weixin_store/access-token.js +15 -4
  375. package/src/providers/weixin_store/executors.js +97 -12
  376. package/src/providers/wisburg/executors.d.ts +4 -0
  377. package/src/providers/wisburg/executors.js +13 -0
  378. package/src/providers/wisburg/runtime.d.ts +12 -0
  379. package/src/providers/wisburg/runtime.js +133 -0
  380. package/src/providers/woocommerce/executors.d.ts +3 -0
  381. package/src/providers/woocommerce/executors.js +2 -0
  382. package/src/providers/woocommerce/trigger-on-store-event.d.ts +2 -0
  383. package/src/providers/woocommerce/trigger-on-store-event.definition.d.ts +4 -0
  384. package/src/providers/woocommerce/trigger-on-store-event.definition.js +55 -0
  385. package/src/providers/woocommerce/trigger-on-store-event.js +179 -0
  386. package/src/providers/xydc_mcp/executors.js +2 -2
  387. package/src/providers/youtube/executors.js +1 -1
  388. package/src/providers/youtube/runtime.js +1 -1
  389. package/src/providers/zendesk/executors.d.ts +3 -0
  390. package/src/providers/zendesk/executors.js +2 -0
  391. package/src/providers/zendesk/trigger-on-event.d.ts +2 -0
  392. package/src/providers/zendesk/trigger-on-event.definition.d.ts +5 -0
  393. package/src/providers/zendesk/trigger-on-event.definition.js +101 -0
  394. package/src/providers/zendesk/trigger-on-event.js +188 -0
  395. package/src/providers/zerotier/executors.d.ts +9 -0
  396. package/src/providers/zerotier/executors.js +629 -0
  397. package/src/providers/zerotier/runtime.d.ts +54 -0
  398. package/src/providers/zerotier/runtime.js +207 -0
  399. package/src/saas/saas-cleanup-service.d.ts +26 -0
  400. package/src/saas/saas-cleanup-service.js +124 -0
  401. package/src/saas/saas-client.d.ts +86 -0
  402. package/src/saas/saas-client.js +369 -0
  403. package/src/saas/saas-execution-service.d.ts +15 -0
  404. package/src/saas/saas-execution-service.js +21 -0
  405. package/src/saas/saas-oauth-service.d.ts +25 -0
  406. package/src/saas/saas-oauth-service.js +197 -0
  407. package/src/saas/saas-project-service.d.ts +61 -0
  408. package/src/saas/saas-project-service.js +211 -0
  409. package/src/server/actions/action-idempotency.d.ts +1 -0
  410. package/src/server/actions/action-idempotency.js +1 -0
  411. package/src/server/actions/action-runner.d.ts +7 -0
  412. package/src/server/actions/action-runner.js +43 -7
  413. package/src/server/actions/run-log-summary.js +9 -0
  414. package/src/server/api/auth.d.ts +1 -0
  415. package/src/server/api/auth.js +13 -2
  416. package/src/server/api/cache-policy.js +4 -1
  417. package/src/server/api/connection-input.d.ts +7 -1
  418. package/src/server/api/connection-input.js +7 -1
  419. package/src/server/api/connection-routes.d.ts +3 -1
  420. package/src/server/api/connection-routes.js +21 -3
  421. package/src/server/api/http-utils.d.ts +4 -3
  422. package/src/server/api/oauth-completion-page.d.ts +124 -0
  423. package/src/server/api/oauth-completion-page.js +113 -18
  424. package/src/server/api/openapi.js +123 -15
  425. package/src/server/api/policy-input.js +6 -0
  426. package/src/server/api/runtime-api.d.ts +18 -3
  427. package/src/server/api/runtime-api.js +36 -5
  428. package/src/server/api/saas-completion-page.d.ts +2 -0
  429. package/src/server/api/saas-completion-page.js +103 -0
  430. package/src/server/connect-app.d.ts +5 -0
  431. package/src/server/connect-app.js +50 -0
  432. package/src/server/connect-server.d.ts +12 -0
  433. package/src/server/connect-server.js +157 -15
  434. package/src/server/connector-runtime.d.ts +3 -1
  435. package/src/server/connector-runtime.js +5 -2
  436. package/src/server/files/transit-files.js +16 -7
  437. package/src/server/proxy/proxy-runner.d.ts +5 -1
  438. package/src/server/proxy/proxy-runner.js +72 -26
  439. package/src/server/storage/connection-request-store.d.ts +41 -1
  440. package/src/server/storage/connection-request-store.js +245 -20
  441. package/src/server/storage/connection-store.d.ts +16 -0
  442. package/src/server/storage/connection-store.js +119 -0
  443. package/src/server/storage/node-runtime-database.js +3 -3
  444. package/src/server/storage/{postgres-migrations.d.ts → postgres/migrations.d.ts} +2 -2
  445. package/src/server/storage/{postgres-migrations.js → postgres/migrations.js} +1 -1
  446. package/src/server/storage/postgres/runtime-store.d.ts +43 -0
  447. package/src/server/storage/{postgres-runtime-store.js → postgres/runtime-store.js} +59 -94
  448. package/src/server/storage/runtime-database.d.ts +4 -0
  449. package/src/server/storage/runtime-sql.d.ts +1 -1
  450. package/src/server/storage/runtime-sql.js +2 -1
  451. package/src/server/storage/runtime-store.d.ts +1 -0
  452. package/src/server/storage/runtime-token-service.d.ts +2 -0
  453. package/src/server/storage/runtime-token-service.js +3 -0
  454. package/src/server/storage/saas-project-store.d.ts +77 -0
  455. package/src/server/storage/saas-project-store.js +273 -0
  456. package/src/server/storage/{sqlite-runtime-store.d.ts → sqlite/runtime-store.d.ts} +21 -25
  457. package/src/server/storage/{sqlite-runtime-store.js → sqlite/runtime-store.js} +100 -115
  458. package/src/server/storage/trigger-store.d.ts +16 -0
  459. package/src/server/storage/trigger-store.js +96 -0
  460. package/src/triggers/common/config.d.ts +2 -0
  461. package/src/triggers/common/config.js +17 -0
  462. package/src/triggers/common/configOptions.d.ts +13 -0
  463. package/src/triggers/common/configOptions.js +1 -0
  464. package/src/triggers/common/encoding.d.ts +3 -0
  465. package/src/triggers/common/encoding.js +19 -0
  466. package/src/triggers/common/integration.d.ts +115 -0
  467. package/src/triggers/common/integration.js +31 -0
  468. package/src/triggers/common/json.d.ts +6 -0
  469. package/src/triggers/common/json.js +91 -0
  470. package/src/triggers/common/poll.d.ts +41 -0
  471. package/src/triggers/common/poll.js +15 -0
  472. package/src/triggers/common/proxy.d.ts +14 -0
  473. package/src/triggers/common/proxy.js +1 -0
  474. package/src/triggers/common/types.d.ts +42 -0
  475. package/src/triggers/common/types.js +1 -0
  476. package/src/triggers/maintenance.d.ts +40 -0
  477. package/src/triggers/maintenance.js +120 -0
  478. package/src/triggers/metadata.d.ts +8 -0
  479. package/src/triggers/metadata.js +1 -0
  480. package/src/triggers/request.d.ts +33 -0
  481. package/src/triggers/request.js +52 -0
  482. package/src/triggers/resources.d.ts +12 -0
  483. package/src/triggers/resources.js +121 -0
  484. package/src/triggers/signature.d.ts +4 -0
  485. package/src/triggers/signature.js +48 -0
  486. package/src/triggers/store.d.ts +29 -0
  487. package/src/triggers/store.js +1 -0
  488. package/src/triggers/subscriptions.d.ts +22 -0
  489. package/src/triggers/subscriptions.js +220 -0
  490. package/src/triggers/trigger-runner.d.ts +34 -0
  491. package/src/triggers/trigger-runner.js +169 -0
  492. package/src/providers/sentry/scopes.d.ts +0 -1
  493. package/src/providers/sentry/scopes.js +0 -7
  494. package/src/server/storage/postgres-runtime-store.d.ts +0 -39
  495. /package/src/providers/{cloudflare-current-user.d.ts → cloudflare_dns/runtime-user.d.ts} +0 -0
@@ -12,7 +12,7 @@ export async function runMetabaseMcp(context, run) {
12
12
  endpoint: new URL(`${context.apiBaseUrl}/metabase-mcp`),
13
13
  transport: "streamable_http",
14
14
  headers: { "x-api-key": context.apiKey, "user-agent": providerUserAgent },
15
- redirect: "error",
15
+ redirect: "manual",
16
16
  fetcher: context.fetcher,
17
17
  signal,
18
18
  mapError(error) {
@@ -0,0 +1,3 @@
1
+ import type { CredentialValidators, ProviderExecutors } from "../../core/types.ts";
2
+ export declare const executors: ProviderExecutors;
3
+ export declare const credentialValidators: CredentialValidators;
@@ -0,0 +1,11 @@
1
+ import { createProviderFetch, defineApiKeyProviderExecutors } from "../provider-runtime.js";
2
+ import { moneyforwardService } from "./manifest.js";
3
+ import { moneyforwardMcpActionHandlers, validateMoneyforwardMcpCredential } from "./runtime.js";
4
+ // No proxy on purpose: a raw proxy could send any tools/call to Money Forward and bypass the
5
+ // office check, schema check and write-outcome handling the actions enforce.
6
+ export const executors = defineApiKeyProviderExecutors(moneyforwardService, moneyforwardMcpActionHandlers);
7
+ export const credentialValidators = {
8
+ apiKey(input, { fetcher, signal }) {
9
+ return validateMoneyforwardMcpCredential(input.apiKey, createProviderFetch({ fetch: fetcher }), signal);
10
+ },
11
+ };
@@ -0,0 +1,31 @@
1
+ export declare const moneyforwardService = "moneyforward_mcp";
2
+ export declare const moneyforwardMcpEndpoint = "https://beta.mcp.developers.biz.moneyforward.com/mcp/ca/v3";
3
+ export declare const officeCodePattern = "^[0-9]{4}-[0-9]{4}$";
4
+ export declare const currentOfficeToolName = "mfc_ca_currentOffice";
5
+ /** One Money Forward MCP tool and the action that wraps it. */
6
+ export interface MoneyforwardToolEntry {
7
+ actionName: string;
8
+ toolName: string;
9
+ isWrite: boolean;
10
+ requiresOfficeCode: boolean;
11
+ /**
12
+ * SHA-256 of the RFC 8785 canonical form of the tool's input schema as the server published it
13
+ * when this provider was written. Only the hash is kept; a write is refused when the live schema
14
+ * hashes differently, so any server-side change is reviewed before writes resume.
15
+ */
16
+ schemaDigest: string;
17
+ }
18
+ export declare const moneyforwardTools: readonly MoneyforwardToolEntry[];
19
+ /**
20
+ * SHA-256 of the RFC 8785 canonical form of the whole schema. Nothing is stripped: every stripping
21
+ * rule considered had a counterexample (fields named `description`, data inside `const`/`enum`),
22
+ * so a wording change on the server also blocks writes until reviewed.
23
+ */
24
+ export declare function schemaDigest(schema: unknown): string;
25
+ /** RFC 8785 JSON Canonicalization for the JSON values a tool schema can hold. */
26
+ export declare function canonicalJson(value: unknown): string;
27
+ /**
28
+ * Normalize an office name for the write guard: NFKC, drop all whitespace, and expand the explicit
29
+ * legal-form abbreviations. No fuzzy matching: a name that differs otherwise is refused.
30
+ */
31
+ export declare function canonicalOfficeName(name: string): string;
@@ -0,0 +1,204 @@
1
+ import { sha256Hex } from "../../core/aws-sigv4.js";
2
+ export const moneyforwardService = "moneyforward_mcp";
3
+ export const moneyforwardMcpEndpoint = "https://beta.mcp.developers.biz.moneyforward.com/mcp/ca/v3";
4
+ export const officeCodePattern = "^[0-9]{4}-[0-9]{4}$";
5
+ export const currentOfficeToolName = "mfc_ca_currentOffice";
6
+ export const moneyforwardTools = [
7
+ {
8
+ actionName: "current_office",
9
+ toolName: "mfc_ca_currentOffice",
10
+ isWrite: false,
11
+ requiresOfficeCode: true,
12
+ schemaDigest: "2bbfa71baa94a486be83265529c2f9a39071b5b0518ff5fea1c4c3f2488029be",
13
+ },
14
+ {
15
+ actionName: "en_ja_dictionary",
16
+ toolName: "mfc_ca_en_ja_dictionary",
17
+ isWrite: false,
18
+ requiresOfficeCode: false,
19
+ schemaDigest: "efddc7bd8bbcef73a14eb1ace1ffdaec81e518ef1e13c1e9271d0b8acb694a49",
20
+ },
21
+ {
22
+ actionName: "get_accessible_offices",
23
+ toolName: "mfc_ca_getAccessibleOffices",
24
+ isWrite: false,
25
+ requiresOfficeCode: false,
26
+ schemaDigest: "efddc7bd8bbcef73a14eb1ace1ffdaec81e518ef1e13c1e9271d0b8acb694a49",
27
+ },
28
+ {
29
+ actionName: "get_accounts",
30
+ toolName: "mfc_ca_getAccounts",
31
+ isWrite: false,
32
+ requiresOfficeCode: true,
33
+ schemaDigest: "66ffd56141dc57fdaf68ca9be911ce5db97a7929f68e1ffe79b9cddb019fa69f",
34
+ },
35
+ {
36
+ actionName: "get_connected_accounts",
37
+ toolName: "mfc_ca_getConnectedAccounts",
38
+ isWrite: false,
39
+ requiresOfficeCode: true,
40
+ schemaDigest: "2bbfa71baa94a486be83265529c2f9a39071b5b0518ff5fea1c4c3f2488029be",
41
+ },
42
+ {
43
+ actionName: "get_departments",
44
+ toolName: "mfc_ca_getDepartments",
45
+ isWrite: false,
46
+ requiresOfficeCode: true,
47
+ schemaDigest: "2bbfa71baa94a486be83265529c2f9a39071b5b0518ff5fea1c4c3f2488029be",
48
+ },
49
+ {
50
+ actionName: "get_journal_by_id",
51
+ toolName: "mfc_ca_getJournalById",
52
+ isWrite: false,
53
+ requiresOfficeCode: true,
54
+ schemaDigest: "c290ddfd2081cef2c119d8ee37ce8207e1dbda4407437870868c5c3c046e321d",
55
+ },
56
+ {
57
+ actionName: "get_journals",
58
+ toolName: "mfc_ca_getJournals",
59
+ isWrite: false,
60
+ requiresOfficeCode: true,
61
+ schemaDigest: "9f3dbbc4efcf6e6783677ac737a293bd7d4ccea768be8d50f783a4a706b60821",
62
+ },
63
+ {
64
+ actionName: "get_reports_transition_balance_sheet",
65
+ toolName: "mfc_ca_getReportsTransitionBalanceSheet",
66
+ isWrite: false,
67
+ requiresOfficeCode: true,
68
+ schemaDigest: "171c891292cc5f0e8c9300654a9977d3eeed0067f630076708274c6eb4b4aa5f",
69
+ },
70
+ {
71
+ actionName: "get_reports_transition_profit_loss",
72
+ toolName: "mfc_ca_getReportsTransitionProfitLoss",
73
+ isWrite: false,
74
+ requiresOfficeCode: true,
75
+ schemaDigest: "171c891292cc5f0e8c9300654a9977d3eeed0067f630076708274c6eb4b4aa5f",
76
+ },
77
+ {
78
+ actionName: "get_reports_trial_balance_balance_sheet",
79
+ toolName: "mfc_ca_getReportsTrialBalanceBalanceSheet",
80
+ isWrite: false,
81
+ requiresOfficeCode: true,
82
+ schemaDigest: "23e330f0fac53ef01afbbc34f04c8017f6974859bde7d28c0b941f6c177fdda9",
83
+ },
84
+ {
85
+ actionName: "get_reports_trial_balance_profit_loss",
86
+ toolName: "mfc_ca_getReportsTrialBalanceProfitLoss",
87
+ isWrite: false,
88
+ requiresOfficeCode: true,
89
+ schemaDigest: "23e330f0fac53ef01afbbc34f04c8017f6974859bde7d28c0b941f6c177fdda9",
90
+ },
91
+ {
92
+ actionName: "get_sub_accounts",
93
+ toolName: "mfc_ca_getSubAccounts",
94
+ isWrite: false,
95
+ requiresOfficeCode: true,
96
+ schemaDigest: "6f55eb15f3ad3d127bbc272cc4a93ebcad9834cc871539df38809a4dc73bf3b2",
97
+ },
98
+ {
99
+ actionName: "get_taxes",
100
+ toolName: "mfc_ca_getTaxes",
101
+ isWrite: false,
102
+ requiresOfficeCode: true,
103
+ schemaDigest: "66ffd56141dc57fdaf68ca9be911ce5db97a7929f68e1ffe79b9cddb019fa69f",
104
+ },
105
+ {
106
+ actionName: "get_term_settings",
107
+ toolName: "mfc_ca_getTermSettings",
108
+ isWrite: false,
109
+ requiresOfficeCode: true,
110
+ schemaDigest: "2bbfa71baa94a486be83265529c2f9a39071b5b0518ff5fea1c4c3f2488029be",
111
+ },
112
+ {
113
+ actionName: "get_trade_partners",
114
+ toolName: "mfc_ca_getTradePartners",
115
+ isWrite: false,
116
+ requiresOfficeCode: true,
117
+ schemaDigest: "66ffd56141dc57fdaf68ca9be911ce5db97a7929f68e1ffe79b9cddb019fa69f",
118
+ },
119
+ {
120
+ actionName: "get_transactions",
121
+ toolName: "mfc_ca_getTransactions",
122
+ isWrite: false,
123
+ requiresOfficeCode: true,
124
+ schemaDigest: "84ee966ac02851949650f79293e46b2355fe907305f1ed1a4376fa42ad4808c5",
125
+ },
126
+ {
127
+ actionName: "post_journals",
128
+ toolName: "mfc_ca_postJournals",
129
+ isWrite: true,
130
+ requiresOfficeCode: true,
131
+ schemaDigest: "1fefc534d2dc71eba534851b611783618d9587c2dac33110480df2175326cf36",
132
+ },
133
+ {
134
+ actionName: "post_trade_partners",
135
+ toolName: "mfc_ca_postTradePartners",
136
+ isWrite: true,
137
+ requiresOfficeCode: true,
138
+ schemaDigest: "1f9466a7f72dd6dc7c84c657e533165462f899cc0dd1050c8a061729b3a3fcec",
139
+ },
140
+ {
141
+ actionName: "post_transaction_journalize",
142
+ toolName: "mfc_ca_postTransactionJournalize",
143
+ isWrite: true,
144
+ requiresOfficeCode: true,
145
+ schemaDigest: "139d06e6030ec46fee2eaf3f59a9f8f9e0b3e543f490b8469e9b8018454ff3b0",
146
+ },
147
+ {
148
+ actionName: "post_transactions",
149
+ toolName: "mfc_ca_postTransactions",
150
+ isWrite: true,
151
+ requiresOfficeCode: true,
152
+ schemaDigest: "0fd32a246c8478db7cb475fa2bb66d01ea076d8fa484c174ca3ebc311805bb48",
153
+ },
154
+ {
155
+ actionName: "put_journals",
156
+ toolName: "mfc_ca_putJournals",
157
+ isWrite: true,
158
+ requiresOfficeCode: true,
159
+ schemaDigest: "cb4219b165eac7d685122a203d501d9c50223b1c522f2549ae3a98d0ff7c369f",
160
+ },
161
+ ];
162
+ /**
163
+ * SHA-256 of the RFC 8785 canonical form of the whole schema. Nothing is stripped: every stripping
164
+ * rule considered had a counterexample (fields named `description`, data inside `const`/`enum`),
165
+ * so a wording change on the server also blocks writes until reviewed.
166
+ */
167
+ export function schemaDigest(schema) {
168
+ return sha256Hex(canonicalJson(schema));
169
+ }
170
+ /** RFC 8785 JSON Canonicalization for the JSON values a tool schema can hold. */
171
+ export function canonicalJson(value) {
172
+ if (Array.isArray(value))
173
+ return `[${value.map(canonicalJson).join(",")}]`;
174
+ if (value !== null && typeof value === "object") {
175
+ const record = value;
176
+ const members = Object.keys(record)
177
+ .filter((key) => record[key] !== undefined)
178
+ .sort(compareUtf16)
179
+ .map((key) => `${JSON.stringify(key)}:${canonicalJson(record[key])}`);
180
+ return `{${members.join(",")}}`;
181
+ }
182
+ return JSON.stringify(value);
183
+ }
184
+ // Legal-form abbreviations Money Forward and users write interchangeably. NFKC has already
185
+ // folded full-width brackets and the enclosed forms into these half-width spellings.
186
+ const legalFormAbbreviations = [
187
+ ["(株)", "株式会社"],
188
+ ["(有)", "有限会社"],
189
+ ["(同)", "合同会社"],
190
+ ];
191
+ /**
192
+ * Normalize an office name for the write guard: NFKC, drop all whitespace, and expand the explicit
193
+ * legal-form abbreviations. No fuzzy matching: a name that differs otherwise is refused.
194
+ */
195
+ export function canonicalOfficeName(name) {
196
+ const folded = name.normalize("NFKC").replace(/\s/gu, "");
197
+ return legalFormAbbreviations.reduce((text, [short, full]) => text.split(short).join(full), folded);
198
+ }
199
+ // RFC 8785 orders member names by UTF-16 code units, which is what `<` on JS strings compares.
200
+ function compareUtf16(left, right) {
201
+ if (left === right)
202
+ return 0;
203
+ return left < right ? -1 : 1;
204
+ }
@@ -0,0 +1,18 @@
1
+ import type { CredentialValidationResult } from "../../core/types.ts";
2
+ import type { ApiKeyProviderContext, ProviderFetch, ProviderRuntimeHandler } from "../provider-runtime.ts";
3
+ export interface MoneyforwardRuntimeOptions {
4
+ /** One budget for the whole action: office check, tools/list and the tool call share it. */
5
+ deadlineMs: number;
6
+ /** Extra wait past the deadline before giving up on an SDK cleanup that never settles. */
7
+ closeGraceMs: number;
8
+ /** Write actions allowed per key per rolling minute, so a looping agent cannot flood the ledger. */
9
+ writesPerMinute?: number;
10
+ /** Expected input-schema digests by tool name, replacing the manifest's (tests use synthetic schemas). */
11
+ schemaDigests?: Readonly<Record<string, string>>;
12
+ }
13
+ type Handler = ProviderRuntimeHandler<ApiKeyProviderContext>;
14
+ export declare function createMoneyforwardMcpHandlers(timing?: MoneyforwardRuntimeOptions): Record<string, Handler>;
15
+ export declare const moneyforwardMcpActionHandlers: Record<string, Handler>;
16
+ /** Accept the key when the server exposes every captured tool; report schema drift without refusing. */
17
+ export declare function validateMoneyforwardMcpCredential(apiKey: string, fetcher: ProviderFetch, signal?: AbortSignal, schemaDigests?: Readonly<Record<string, string>>): Promise<CredentialValidationResult>;
18
+ export {};
@@ -0,0 +1,296 @@
1
+ import { sha256Hex } from "../../core/aws-sigv4.js";
2
+ import { compactObject, looseArray, optionalNumber, optionalRecord, optionalString } from "../../core/cast.js";
3
+ import { callMcpTool, listMcpTools } from "../mcp-tools.js";
4
+ import { createProviderTimeout, ProviderRequestError, providerInputError, providerResponseError, } from "../provider-runtime.js";
5
+ import { canonicalOfficeName, currentOfficeToolName, moneyforwardMcpEndpoint, moneyforwardService, moneyforwardTools, officeCodePattern, schemaDigest, } from "./manifest.js";
6
+ const defaultOptions = { deadlineMs: 90_000, closeGraceMs: 5_000 };
7
+ const defaultWritesPerMinute = 30;
8
+ const rateWindowMs = 60_000;
9
+ const maxResponseBytes = 8 * 1024 * 1024;
10
+ const officeCodeRegExp = new RegExp(officeCodePattern, "u");
11
+ // A Money Forward API 4xx relayed by the MCP server. Enough to call a read invalid input, but not
12
+ // proof that a write did nothing: batch writes can fail part-way and retries can hide a success.
13
+ const apiClientErrorPattern = /^API request failed: client error\b/u;
14
+ // The only answers that prove the tool handler never ran: the arguments failed the tool's input
15
+ // schema, or the tool does not exist. Output validation runs after the handler, so it is excluded.
16
+ const notExecutedPattern = /^(?:MCP error -32602: )?Input validation error\b|^MCP error -32601\b/u;
17
+ export function createMoneyforwardMcpHandlers(timing = defaultOptions) {
18
+ const takeWriteSlot = createWriteLimiter(timing.writesPerMinute ?? defaultWritesPerMinute);
19
+ const toolHandlers = moneyforwardTools.map((entry) => [
20
+ entry.actionName,
21
+ entry.isWrite
22
+ ? async (input, context) => {
23
+ takeWriteSlot(context.apiKey);
24
+ return runWrite(entry, input, context, timing);
25
+ }
26
+ : (input, context) => runRead(entry, input, context, timing),
27
+ ]);
28
+ const listTools = (_input, context) => withDeadline(context.signal, timing, async (signal) => ({
29
+ tools: await listMcpTools(toolOptions(context, signal, timing), { includeAnnotations: true }),
30
+ }));
31
+ return Object.fromEntries([...toolHandlers, ["list_tools", listTools]]);
32
+ }
33
+ export const moneyforwardMcpActionHandlers = createMoneyforwardMcpHandlers();
34
+ /** Accept the key when the server exposes every captured tool; report schema drift without refusing. */
35
+ export async function validateMoneyforwardMcpCredential(apiKey, fetcher, signal, schemaDigests) {
36
+ const tools = await withDeadline(signal, defaultOptions, (deadlineSignal) => listMcpTools(toolOptions({ apiKey, fetcher }, deadlineSignal, defaultOptions)));
37
+ const byName = new Map(tools.map((tool) => [tool.name, tool]));
38
+ const missing = moneyforwardTools.filter((entry) => !byName.has(entry.toolName)).map((entry) => entry.toolName);
39
+ if (missing.length > 0) {
40
+ throw providerInputError(`Money Forward MCP does not expose these tools for this key: ${missing.join(", ")}`);
41
+ }
42
+ const schemaDrift = moneyforwardTools
43
+ .filter((entry) => schemaDigest(byName.get(entry.toolName)?.inputSchema) !== expectedDigest(entry, schemaDigests))
44
+ .map((entry) => entry.toolName);
45
+ const keyHash = sha256Hex(apiKey).slice(0, 16);
46
+ return {
47
+ profile: {
48
+ accountId: `${moneyforwardService}:${keyHash}`,
49
+ displayName: `Money Forward MCP · ${keyHash.slice(-6)}`,
50
+ },
51
+ grantedScopes: [],
52
+ metadata: { mcpEndpoint: moneyforwardMcpEndpoint, schemaDrift },
53
+ };
54
+ }
55
+ async function runRead(entry, input, context, timing) {
56
+ const args = toolArguments(entry, input);
57
+ return withDeadline(context.signal, timing, async (signal) => {
58
+ const result = await callToolWithoutWaitingForClose({
59
+ ...toolOptions(context, signal, timing),
60
+ toolName: entry.toolName,
61
+ arguments: args,
62
+ });
63
+ return readPayload(entry.toolName, result);
64
+ });
65
+ }
66
+ async function runWrite(entry, input, context, timing) {
67
+ const args = toolArguments(entry, input);
68
+ const expectedName = optionalString(input.expected_office_name);
69
+ if (!expectedName)
70
+ throw writeError(providerInputError("expected_office_name is required"), "definitely_not_sent");
71
+ // Flipped by the authorizeTool hook, the last step before callMcpTool sends tools/call.
72
+ const phase = { dispatched: false };
73
+ try {
74
+ return await withDeadline(context.signal, timing, async (signal) => {
75
+ const options = toolOptions(context, signal, timing);
76
+ await confirmOffice(String(args.office_code), expectedName, options);
77
+ const result = await callToolWithoutWaitingForClose({
78
+ ...options,
79
+ toolName: entry.toolName,
80
+ arguments: args,
81
+ authorizeTool(tool) {
82
+ // A late tools/list must not dispatch after the backstop has already reported definitely_not_sent.
83
+ if (signal.aborted) {
84
+ throw providerResponseError("The Money Forward write was cancelled before it was sent; nothing was written.");
85
+ }
86
+ assertSchemaUnchanged(entry, tool, expectedDigest(entry, timing.schemaDigests));
87
+ phase.dispatched = true;
88
+ },
89
+ });
90
+ return readPayload(entry.toolName, result);
91
+ });
92
+ }
93
+ catch (error) {
94
+ throw classifyWriteFailure(entry, args, phase.dispatched, error);
95
+ }
96
+ }
97
+ async function confirmOffice(officeCode, expectedName, options) {
98
+ const office = await callToolWithoutWaitingForClose({
99
+ ...options,
100
+ toolName: currentOfficeToolName,
101
+ arguments: { office_code: officeCode },
102
+ });
103
+ const payload = optionalRecord(readPayload(currentOfficeToolName, office));
104
+ const actualName = optionalString(payload?.name);
105
+ if (payload?.code !== officeCode || !actualName) {
106
+ throw providerInputError(`Money Forward did not confirm office ${officeCode}; nothing was written.`);
107
+ }
108
+ if (canonicalOfficeName(actualName) !== canonicalOfficeName(expectedName)) {
109
+ throw providerInputError(`Office ${officeCode} is "${actualName}" in Money Forward, not "${expectedName}"; nothing was written.`);
110
+ }
111
+ }
112
+ function expectedDigest(entry, overrides) {
113
+ return overrides?.[entry.toolName] ?? entry.schemaDigest;
114
+ }
115
+ function assertSchemaUnchanged(entry, tool, expected) {
116
+ if (!tool) {
117
+ throw providerResponseError(`Money Forward MCP no longer exposes ${entry.toolName}; nothing was written.`);
118
+ }
119
+ if (schemaDigest(tool.inputSchema) !== expected) {
120
+ throw providerResponseError(`Money Forward changed the ${entry.toolName} input schema; writes stay blocked until the change is reviewed and the provider is updated. Nothing was written.`);
121
+ }
122
+ }
123
+ function classifyWriteFailure(entry, args, dispatched, error) {
124
+ const cause = error instanceof ProviderRequestError ? error : providerResponseError("Money Forward request failed");
125
+ if (readWriteOutcome(cause) !== undefined)
126
+ return cause;
127
+ if (!dispatched)
128
+ return writeError(cause, "definitely_not_sent");
129
+ const submitted = summarizeSubmission(entry, args);
130
+ if (optionalRecord(cause.details)?.notExecuted === true) {
131
+ // The pattern proves the MCP layer refused the call; a batch is still worth checking by hand.
132
+ const batchNote = Object.values(args).some(Array.isArray)
133
+ ? " This was a batch write: confirm that no item was applied before resubmitting."
134
+ : "";
135
+ const rejected = new ProviderRequestError(cause.status, `${cause.message}${batchNote}`, cause.details, cause.code);
136
+ return writeError(rejected, "rejected", submitted);
137
+ }
138
+ return new ProviderRequestError(502, `OUTCOME UNKNOWN: ${entry.toolName} may have been applied. Check the ledger with get_journals / get_transactions for the submitted content before retrying. Cause: ${cause.message}`, { writeOutcome: "outcome_unknown", submitted }, "provider_error");
139
+ }
140
+ function writeError(error, outcome, submitted) {
141
+ const details = { ...optionalRecord(error.details), writeOutcome: outcome, submitted };
142
+ return new ProviderRequestError(error.status, error.message, details, error.code);
143
+ }
144
+ /** What was submitted, so an unknown outcome can be reconciled by hand. Never includes credentials. */
145
+ function summarizeSubmission(entry, args) {
146
+ const journal = optionalRecord(args.journal);
147
+ const branches = Array.isArray(journal?.branches) ? journal.branches : undefined;
148
+ const arrayCounts = Object.fromEntries(Object.entries(args)
149
+ .filter(([, value]) => Array.isArray(value))
150
+ .map(([key, value]) => [`${key}_count`, value.length]));
151
+ return compactObject({
152
+ tool: entry.toolName,
153
+ office_code: args.office_code,
154
+ id: args.id,
155
+ transaction_id: args.transaction_id,
156
+ transaction_date: journal?.transaction_date,
157
+ branch_count: branches?.length,
158
+ debit_total: branches ? sumDebits(branches) : undefined,
159
+ ...arrayCounts,
160
+ });
161
+ }
162
+ function sumDebits(branches) {
163
+ return branches.reduce((total, branch) => total + (optionalNumber(optionalRecord(optionalRecord(branch)?.debitor)?.value) ?? 0), 0);
164
+ }
165
+ /**
166
+ * Validate office_code and drop the guard-only field before it reaches Money Forward. The action
167
+ * schema already requires both, but executors can be invoked without schema validation (tests, direct
168
+ * loader callers), and these checks are what keep a write from going to an unnamed office.
169
+ */
170
+ function toolArguments(entry, input) {
171
+ const { expected_office_name: _guard, ...args } = input;
172
+ if (entry.requiresOfficeCode && !(typeof args.office_code === "string" && officeCodeRegExp.test(args.office_code))) {
173
+ throw entry.isWrite
174
+ ? writeError(providerInputError("office_code is required in the form XXXX-XXXX"), "definitely_not_sent")
175
+ : providerInputError("office_code is required in the form XXXX-XXXX");
176
+ }
177
+ return args;
178
+ }
179
+ /**
180
+ * Rolling one-minute write budget per key (hashed, so the map never holds the key itself). Best-effort:
181
+ * it counts within one process, so separate processes or isolates each keep their own budget.
182
+ */
183
+ function createWriteLimiter(writesPerMinute) {
184
+ const recent = new Map();
185
+ return (apiKey) => {
186
+ const now = Date.now();
187
+ // Timestamps are appended in order, so a bucket is idle once its newest one has aged out.
188
+ for (const [key, times] of recent) {
189
+ if (now - (times.at(-1) ?? 0) >= rateWindowMs)
190
+ recent.delete(key);
191
+ }
192
+ const bucket = sha256Hex(apiKey);
193
+ const inWindow = (recent.get(bucket) ?? []).filter((at) => now - at < rateWindowMs);
194
+ if (inWindow.length >= writesPerMinute) {
195
+ throw new ProviderRequestError(429, `More than ${writesPerMinute} Money Forward writes in a minute; nothing was written. Wait and confirm with the user before continuing.`, { writeOutcome: "definitely_not_sent" }, "rate_limited");
196
+ }
197
+ recent.set(bucket, [...inWindow, now]);
198
+ };
199
+ }
200
+ // protocolVersion is deliberately left unset (legacy): in modern mode the SDK re-sends tools/call
201
+ // on a SEP-2243 header mismatch, which would be a silent write retry.
202
+ function toolOptions(context, signal, timing) {
203
+ return {
204
+ endpoint: moneyforwardMcpEndpoint,
205
+ service: "Money Forward",
206
+ fetcher: context.fetcher,
207
+ headers: { "mf-api-key": context.apiKey },
208
+ // Never follow a redirect: a cross-origin hop drops the key but would replay the ledger payload.
209
+ redirect: "manual",
210
+ signal,
211
+ terminateSession: true,
212
+ requestTimeoutMs: timing.deadlineMs,
213
+ maxResponseBytes,
214
+ toolListMaxBytes: 1024 * 1024,
215
+ toolListMaxPages: 5,
216
+ toolListMaxTools: 200,
217
+ };
218
+ }
219
+ /**
220
+ * Resolve as soon as the tool result arrives instead of after the SDK closes the session:
221
+ * the upstream cleanup awaits close() without a timeout, and a finished write must not be
222
+ * reported as unknown because a DELETE hung. Later cleanup errors are ignored.
223
+ */
224
+ function callToolWithoutWaitingForClose(input) {
225
+ return new Promise((resolve, reject) => {
226
+ callMcpTool({
227
+ ...input,
228
+ transformToolResult(result) {
229
+ resolve(result);
230
+ return result;
231
+ },
232
+ }).then(() => undefined, (error) => reject(error));
233
+ });
234
+ }
235
+ function readPayload(toolName, result) {
236
+ const text = readText(result);
237
+ if ("isError" in result && result.isError) {
238
+ const notExecuted = notExecutedPattern.test(text);
239
+ const isClientError = notExecuted || apiClientErrorPattern.test(text);
240
+ throw new ProviderRequestError(isClientError ? 400 : 502, `Money Forward ${toolName} failed: ${text.slice(0, 500)}`, { notExecuted }, isClientError ? "invalid_input" : "provider_error");
241
+ }
242
+ if ("structuredContent" in result && result.structuredContent !== undefined)
243
+ return result.structuredContent;
244
+ try {
245
+ return JSON.parse(text);
246
+ }
247
+ catch {
248
+ return { text };
249
+ }
250
+ }
251
+ function readText(result) {
252
+ return looseArray(optionalRecord(result)?.content)
253
+ .map((item) => {
254
+ const content = optionalRecord(item);
255
+ return content?.type === "text" && typeof content.text === "string" ? content.text : "";
256
+ })
257
+ .join("")
258
+ .trim();
259
+ }
260
+ /**
261
+ * Run with one deadline shared by every step. The grace timer is a backstop for SDK cleanup
262
+ * that ignores the abort; the losing promise is caught so it cannot become an unhandled rejection.
263
+ * Every Money Forward call goes through here, so auth failures are normalized in this one place.
264
+ */
265
+ async function withDeadline(parentSignal, timing, run) {
266
+ if (parentSignal?.aborted) {
267
+ throw new ProviderRequestError(504, "The Money Forward request was cancelled before it was sent", undefined, "provider_error");
268
+ }
269
+ const deadline = createProviderTimeout(parentSignal, timing.deadlineMs);
270
+ let grace;
271
+ const work = run(deadline.signal);
272
+ work.catch(() => undefined);
273
+ const backstop = new Promise((_resolve, reject) => {
274
+ grace = setTimeout(() => reject(new ProviderRequestError(504, "The Money Forward request timed out", undefined, "provider_error")), timing.deadlineMs + timing.closeGraceMs);
275
+ });
276
+ try {
277
+ return await Promise.race([work, backstop]);
278
+ }
279
+ catch (error) {
280
+ throw withAuthorizationCode(error);
281
+ }
282
+ finally {
283
+ deadline.cleanup();
284
+ clearTimeout(grace);
285
+ }
286
+ }
287
+ // The shared MCP error mapper reports 401/403 as provider_error; surface them as auth failures.
288
+ function withAuthorizationCode(error) {
289
+ if (error instanceof ProviderRequestError && (error.status === 401 || error.status === 403)) {
290
+ return new ProviderRequestError(error.status, error.message, error.details, "authorization_failed");
291
+ }
292
+ return error;
293
+ }
294
+ function readWriteOutcome(error) {
295
+ return optionalRecord(error.details)?.writeOutcome;
296
+ }
@@ -1,4 +1,6 @@
1
1
  import type { CredentialValidators, ProviderExecutors, ProviderProxyExecutor } from "../../core/types.ts";
2
+ import type { IntegrationDefinition } from "../../triggers/common/integration.ts";
3
+ import type { PollDefinition } from "../../triggers/common/poll.ts";
2
4
  import type { ProviderActionHandlers } from "../provider-runtime.ts";
3
5
  interface NotionActionContext {
4
6
  accessToken: string;
@@ -18,4 +20,5 @@ export declare const notionActionHandlers: ProviderActionHandlers<"notion", Noti
18
20
  export declare const executors: ProviderExecutors;
19
21
  export declare const proxy: ProviderProxyExecutor;
20
22
  export declare const credentialValidators: CredentialValidators;
23
+ export declare const triggers: readonly (IntegrationDefinition | PollDefinition)[];
21
24
  export {};
@@ -1,5 +1,6 @@
1
1
  import { compactObject } from "../../core/cast.js";
2
- import { createProviderFetch, createProviderProxyUrl, defineProviderExecutors, normalizeProviderProxyHeaders, ProviderRequestError, providerUserAgent, readProviderProxyErrorMessage, readProviderProxyResponse, requireBearerCredential, toProviderProxyError, } from "../provider-runtime.js";
2
+ import { createProviderFetch, createProviderProxyUrl, defineProviderExecutors, normalizeProviderProxyHeaders, providerInputError, ProviderRequestError, providerUserAgent, readProviderProxyErrorMessage, readProviderProxyResponse, requireBearerCredential, toProviderProxyError, withRetryAfterSeconds, } from "../provider-runtime.js";
3
+ import { notionDatabasePageEvent } from "./trigger-on-database-page-event.js";
3
4
  const service = "notion";
4
5
  const notionApiBaseUrl = "https://api.notion.com/v1";
5
6
  const notionFetch = createProviderFetch({ skipDnsValidation: true });
@@ -83,6 +84,12 @@ export const notionActionHandlers = {
83
84
  list_data_source_templates(input, context) {
84
85
  return notionListDataSourceTemplates(input, context.accessToken, context.fetcher);
85
86
  },
87
+ list_comments(input, context) {
88
+ return notionListComments(input, context.accessToken, context.fetcher);
89
+ },
90
+ create_comment(input, context) {
91
+ return notionCreateComment(input, context.accessToken, context.fetcher);
92
+ },
86
93
  };
87
94
  export const executors = defineProviderExecutors({
88
95
  service,
@@ -121,7 +128,7 @@ export const proxy = async (input, context) => {
121
128
  const response = await notionFetch(url, init);
122
129
  if (!response.ok) {
123
130
  const text = await readProviderProxyErrorMessage(response, "");
124
- throw new ProviderRequestError(response.status, text || `Notion request failed with HTTP ${response.status}`);
131
+ throw new ProviderRequestError(response.status, text || `Notion request failed with HTTP ${response.status}`, withRetryAfterSeconds(response));
125
132
  }
126
133
  return { ok: true, response: await readProviderProxyResponse(response) };
127
134
  }
@@ -595,6 +602,36 @@ async function notionListDataSourceTemplates(input, accessToken, fetcher) {
595
602
  }, fetcher);
596
603
  return payload ?? {};
597
604
  }
605
+ async function notionListComments(input, accessToken, fetcher) {
606
+ const payload = await notionRequest(accessToken, {
607
+ path: "/comments",
608
+ query: compactQuery({
609
+ block_id: String(input.blockId),
610
+ page_size: asNumber(input.pageSize),
611
+ start_cursor: asNonEmptyString(input.startCursor),
612
+ }),
613
+ }, fetcher);
614
+ return payload ?? {};
615
+ }
616
+ async function notionCreateComment(input, accessToken, fetcher) {
617
+ const parent = asObject(input.parent);
618
+ const discussionId = asNonEmptyString(input.discussion_id);
619
+ if (!parent === !discussionId) {
620
+ throw providerInputError("exactly one of parent or discussion_id is required");
621
+ }
622
+ const payload = await notionRequest(accessToken, {
623
+ method: "POST",
624
+ path: "/comments",
625
+ body: compactObject({
626
+ parent,
627
+ discussion_id: discussionId,
628
+ rich_text: Array.isArray(input.rich_text) ? input.rich_text : [],
629
+ attachments: Array.isArray(input.attachments) ? input.attachments : undefined,
630
+ display_name: asObject(input.display_name),
631
+ }),
632
+ }, fetcher);
633
+ return payload ?? {};
634
+ }
598
635
  async function notionRequest(accessToken, input, fetcher) {
599
636
  const url = new URL(`https://api.notion.com/v1${input.path}`);
600
637
  for (const [key, value] of Object.entries(input.query ?? {})) {
@@ -653,7 +690,7 @@ async function assertNotionResponse(response) {
653
690
  throw new ProviderRequestError(403, message);
654
691
  }
655
692
  if (response.status === 429) {
656
- throw new ProviderRequestError(429, message);
693
+ throw new ProviderRequestError(429, message, withRetryAfterSeconds(response));
657
694
  }
658
695
  throw new ProviderRequestError(response.status, message);
659
696
  }
@@ -769,3 +806,4 @@ function asNumber(value) {
769
806
  function asNonEmptyString(value) {
770
807
  return typeof value === "string" && value.length > 0 ? value : undefined;
771
808
  }
809
+ export const triggers = [notionDatabasePageEvent];