@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
@@ -1,7 +1,9 @@
1
1
  import { s } from "../../core/json-schema.js";
2
2
  import { defineProviderAction } from "../../core/provider-definition.js";
3
+ import { keepaDealAttributeNames } from "./deal-attributes.js";
3
4
  const service = "keepa";
4
5
  export const keepaMarketplaces = ["US", "GB", "DE", "FR", "JP", "CA", "IT", "ES", "IN", "MX", "BR"];
6
+ const keepaStandardMarketplaces = keepaMarketplaces.filter((marketplace) => marketplace !== "BR");
5
7
  export const keepaHistoryTypes = [
6
8
  "AMAZON",
7
9
  "NEW",
@@ -51,29 +53,55 @@ export const keepaDealPriceTypes = [
51
53
  "LIGHTNING_DEAL",
52
54
  "WAREHOUSE",
53
55
  "NEW_FBA",
56
+ "BUY_BOX_SHIPPING",
54
57
  "USED_NEW_SHIPPING",
55
58
  "USED_VERY_GOOD_SHIPPING",
56
59
  "USED_GOOD_SHIPPING",
57
60
  "USED_ACCEPTABLE_SHIPPING",
58
- "COLLECTIBLE_NEW_SHIPPING",
59
- "COLLECTIBLE_VERY_GOOD_SHIPPING",
60
- "COLLECTIBLE_GOOD_SHIPPING",
61
- "COLLECTIBLE_ACCEPTABLE_SHIPPING",
62
61
  "REFURBISHED_SHIPPING",
63
62
  "BUY_BOX_USED_SHIPPING",
64
63
  "PRIME_EXCL",
65
64
  ];
66
65
  const marketplaceSchema = s.stringEnum("Amazon marketplace code using Keepa's official AmazonLocale names.", keepaMarketplaces);
67
- const asinSchema = s.stringPattern("^[A-Za-z0-9]{10}$", {
68
- description: "A 10-character Amazon ASIN containing only ASCII letters or digits.",
66
+ const standardMarketplaceSchema = s.stringEnum("Amazon marketplace supported by this Keepa endpoint (Brazil is unavailable).", keepaStandardMarketplaces);
67
+ const asinSchema = s.string("A 10-character Amazon ASIN.", {
68
+ minLength: 10,
69
+ maxLength: 10,
70
+ pattern: "^[A-Za-z0-9]{10}$",
69
71
  });
70
72
  const asinsSchema = s.array("Amazon ASINs to request.", asinSchema, {
71
73
  minItems: 1,
72
74
  maxItems: 100,
73
75
  });
76
+ const codesSchema = s.array("UPC, EAN, GTIN, or ISBN-13 codes; keep leading zeroes.", s.string("One numeric product code, kept as a string.", { pattern: "^[0-9]{8,14}$" }), { minItems: 1, maxItems: 100 });
77
+ const statsRangeSchema = s.requiredObject("UTC statistics interval.", {
78
+ start: s.anyOf("Interval start, as ISO 8601 UTC text or Unix milliseconds.", [
79
+ s.dateTime("ISO 8601 UTC start time."),
80
+ s.nonNegativeInteger("Unix milliseconds at interval start."),
81
+ ]),
82
+ end: s.anyOf("Interval end, as ISO 8601 UTC text or Unix milliseconds.", [
83
+ s.dateTime("ISO 8601 UTC end time."),
84
+ s.nonNegativeInteger("Unix milliseconds at interval end."),
85
+ ]),
86
+ });
87
+ const windowInputFields = {
88
+ offset: s.nonNegativeInteger("Zero-based offset into this response's full upstream list."),
89
+ limit: s.nullable(s.positiveInteger("Maximum entries returned; null returns all remaining entries.")),
90
+ };
91
+ const windowOutputFields = {
92
+ totalAvailable: s.nonNegativeInteger("Number of entries in this upstream response."),
93
+ returnedCount: s.nonNegativeInteger("Number of entries in this response window."),
94
+ hasMore: s.boolean("Whether this upstream response contains more entries after the window."),
95
+ nextOffset: s.nullable(s.nonNegativeInteger("Next local offset, when more entries exist.")),
96
+ };
74
97
  const productRequestOptionalFields = {
98
+ codes: codesSchema,
99
+ codeLimit: s.positiveInteger("Maximum products returned for each product code."),
75
100
  statsDays: s.positiveInteger("Number of recent days used for Keepa summary statistics at no additional token cost."),
76
- updateHours: s.nonNegativeInteger("Refresh data when Keepa's stored product data is older than this many hours; zero may consume an extra token per product."),
101
+ statsRange: statsRangeSchema,
102
+ updateHours: s.integer("Refresh when older than these hours; zero forces refresh and -1 disables refresh.", {
103
+ minimum: -1,
104
+ }),
77
105
  offers: s.integer("Number of marketplace offers to include; values from 20 through 100 may increase token cost and limit the request to 20 ASINs.", {
78
106
  minimum: 20,
79
107
  maximum: 100,
@@ -81,18 +109,24 @@ const productRequestOptionalFields = {
81
109
  onlyLiveOffers: s.boolean("Whether to omit historical offers when offers are requested, reducing response size."),
82
110
  includeBuyBox: s.boolean("Whether to include Keepa buy box data; this may consume two additional tokens per product when offers are not requested."),
83
111
  includeRating: s.boolean("Whether to include existing rating and review-count history in the product payload."),
112
+ includeVideos: s.boolean("Whether to include existing product video metadata."),
113
+ includeAPlus: s.boolean("Whether to include existing A+ content."),
114
+ includeStock: s.boolean("Whether to include stock history with requested offers; may cost extra tokens."),
115
+ includeHistoricalVariations: s.boolean("Whether to include historical and out-of-stock variations; may cost extra tokens."),
84
116
  };
85
- const responseMetaSchema = s.object("Keepa request and token-budget metadata.", {
86
- timestamp: s.nullableInteger("Keepa server response time in Unix epoch milliseconds."),
87
- tokensLeft: s.nullableInteger("Tokens remaining after this request."),
88
- refillInMs: s.nullableInteger("Milliseconds until Keepa next refills tokens."),
89
- refillRatePerMinute: s.nullableInteger("Number of Keepa tokens refilled per minute."),
90
- tokensConsumed: s.nullableInteger("Tokens consumed by this request."),
91
- processingTimeMs: s.nullableInteger("Server-side processing time in milliseconds."),
117
+ const responseMetaSchema = s.requiredObject("Keepa request and token-budget metadata.", {
118
+ timestamp: s.nullable(s.integer("Keepa server response time in Unix epoch milliseconds.")),
119
+ tokensLeft: s.nullable(s.integer("Tokens remaining after this request.")),
120
+ refillInMs: s.nullable(s.integer("Milliseconds until Keepa next refills tokens.")),
121
+ refillRatePerMinute: s.nullable(s.integer("Number of Keepa tokens refilled per minute.")),
122
+ tokensConsumed: s.nullable(s.integer("Tokens consumed by this request.")),
123
+ processingTimeMs: s.nullable(s.integer("Server-side processing time in milliseconds.")),
92
124
  });
125
+ const nullableStringSchema = (description) => s.nullable(s.string(description));
126
+ const nullableIntegerSchema = (description) => s.nullable(s.integer(description));
93
127
  const namedIntegerValuesSchema = s.record("Values keyed by official Keepa Product.CsvType name.", s.nullable(s.integer("A Keepa price, rank, count, rating, or metadata value; price values use the marketplace's smallest currency unit.")));
94
128
  const namedBooleanValuesSchema = s.record("Boolean values keyed by official Keepa Product.CsvType name.", s.boolean("A Keepa statistic flag."));
95
- const productStatsSchema = s.object("Named Keepa product statistics.", {
129
+ const productStatsSchema = s.requiredObject("Named Keepa product statistics.", {
96
130
  current: namedIntegerValuesSchema,
97
131
  average: namedIntegerValuesSchema,
98
132
  average30Days: namedIntegerValuesSchema,
@@ -104,37 +138,37 @@ const productStatsSchema = s.object("Named Keepa product statistics.", {
104
138
  isLowest90Days: namedBooleanValuesSchema,
105
139
  raw: s.looseObject("The complete Keepa stats object."),
106
140
  });
107
- const productSnapshotSchema = s.object("A normalized Keepa product snapshot.", {
141
+ const productSnapshotSchema = s.requiredObject("A normalized Keepa product snapshot.", {
108
142
  asin: s.string("Amazon ASIN."),
109
- domainId: s.nullableInteger("Keepa Amazon locale identifier."),
110
- title: s.nullableString("Amazon product title."),
111
- brand: s.nullableString("Product brand."),
112
- manufacturer: s.nullableString("Product manufacturer."),
113
- productGroup: s.nullableString("Amazon product group."),
114
- parentAsin: s.nullableString("Parent ASIN when this product is a variation."),
115
- rootCategory: s.nullableInteger("Root Amazon category node identifier."),
143
+ domainId: nullableIntegerSchema("Keepa Amazon locale identifier."),
144
+ title: nullableStringSchema("Amazon product title."),
145
+ brand: nullableStringSchema("Product brand."),
146
+ manufacturer: nullableStringSchema("Product manufacturer."),
147
+ productGroup: nullableStringSchema("Amazon product group."),
148
+ parentAsin: nullableStringSchema("Parent ASIN when this product is a variation."),
149
+ rootCategory: nullableIntegerSchema("Root Amazon category node identifier."),
116
150
  categories: s.array("Amazon category node identifiers assigned to the product.", s.integer("One Amazon category node identifier.")),
117
151
  imageUrls: s.array("Resolved Amazon image URLs derived from Keepa image metadata.", s.string("One Amazon media image URL.")),
118
- monthlySold: s.nullableInteger("Estimated monthly sold count when available."),
119
- lastUpdate: s.nullableInteger("Last product update in Keepa Time minutes."),
152
+ monthlySold: nullableIntegerSchema("Estimated monthly sold count when available."),
153
+ lastUpdate: nullableIntegerSchema("Last product update in Keepa Time minutes."),
120
154
  stats: s.nullable(productStatsSchema),
121
155
  raw: s.looseObject("The complete Keepa product object."),
122
156
  });
123
- const productSnapshotOutputSchema = s.actionOutput({
157
+ const productSnapshotOutputSchema = s.requiredObject("Keepa product snapshot response.", {
124
158
  marketplace: marketplaceSchema,
125
159
  priceValuesUseMinorUnits: s.literal(true, {
126
160
  description: "Whether price integers remain in the marketplace's smallest currency unit.",
127
161
  }),
128
162
  products: s.array("Products returned by Keepa.", productSnapshotSchema),
129
163
  meta: responseMetaSchema,
130
- }, "Keepa product snapshot response.");
131
- const historyPointSchema = s.object("One normalized Keepa history data point.", {
164
+ });
165
+ const historyPointSchema = s.requiredObject("One normalized Keepa history data point.", {
132
166
  keepaTime: s.integer("Original Keepa Time value in minutes."),
133
167
  timestamp: s.dateTime("UTC timestamp converted from Keepa Time."),
134
168
  value: s.integer("History value; price values use the marketplace's smallest currency unit and -1 represents no offer."),
135
- shipping: s.nullableInteger("Shipping amount in the marketplace's smallest currency unit when this history type records it separately."),
169
+ shipping: s.nullable(s.integer("Shipping amount in the marketplace's smallest currency unit when this history type records it separately.")),
136
170
  });
137
- const historySeriesSchema = s.object("One named Keepa product history series.", {
171
+ const historySeriesSchema = s.requiredObject("One named Keepa product history series.", {
138
172
  type: s.stringEnum("Official Keepa Product.CsvType name.", keepaHistoryTypes),
139
173
  index: s.integer("Official Keepa Product.CsvType array index."),
140
174
  unit: s.stringEnum("Unit interpretation for values in this series; lower sales-rank values indicate better rank.", [
@@ -147,57 +181,47 @@ const historySeriesSchema = s.object("One named Keepa product history series.",
147
181
  includesShipping: s.boolean("Whether each raw point contains a separate shipping value after the main value."),
148
182
  points: s.array("Chronological history points.", historyPointSchema),
149
183
  });
150
- const monthlySoldHistoryPointSchema = s.object("One historical Amazon bought-in-past-month value.", {
184
+ const monthlySoldHistoryPointSchema = s.requiredObject("One historical Amazon bought-in-past-month value.", {
151
185
  keepaTime: s.integer("Original Keepa Time value in minutes."),
152
186
  timestamp: s.dateTime("UTC timestamp converted from Keepa Time."),
153
187
  value: s.integer("Amazon's bought-in-past-month value observed by Keepa; this is not a sales estimate."),
154
188
  });
155
- const couponHistoryPointSchema = s.object("One historical Keepa coupon observation.", {
189
+ const couponHistoryPointSchema = s.requiredObject("One historical Keepa coupon observation.", {
156
190
  keepaTime: s.integer("Original Keepa Time value in minutes."),
157
191
  timestamp: s.dateTime("UTC timestamp converted from Keepa Time."),
158
192
  oneTimeCoupon: s.integer("One-time coupon discount: zero means unavailable, positive values use the marketplace's smallest currency unit, and negative values are percentage discounts."),
159
193
  subscribeAndSaveCoupon: s.integer("Subscribe-and-Save coupon discount: zero means unavailable, positive values use the marketplace's smallest currency unit, and negative values are percentage discounts."),
160
194
  });
161
- const salesRankHistorySchema = s.object("One Amazon subcategory sales-rank history.", {
195
+ const salesRankHistorySchema = s.requiredObject("One Amazon subcategory sales-rank history.", {
162
196
  categoryId: s.integer("Amazon subcategory node ID."),
163
- points: s.array("Chronological sales-rank observations; lower values indicate better rank.", s.object("One historical sales-rank observation.", {
197
+ points: s.array("Chronological sales-rank observations; lower values indicate better rank.", s.requiredObject("One historical sales-rank observation.", {
164
198
  keepaTime: s.integer("Original Keepa Time value in minutes."),
165
199
  timestamp: s.dateTime("UTC timestamp converted from Keepa Time."),
166
200
  value: s.integer("Amazon sales rank; lower values indicate better rank."),
167
201
  })),
168
202
  });
169
- const productHistorySchema = s.object("Normalized Keepa history for one product.", {
203
+ const productHistorySchema = s.requiredObject("Normalized Keepa history for one product.", {
170
204
  asin: s.string("Amazon ASIN."),
171
- title: s.nullableString("Amazon product title."),
172
- brand: s.nullableString("Product brand."),
205
+ title: nullableStringSchema("Amazon product title."),
206
+ brand: nullableStringSchema("Product brand."),
173
207
  series: s.array("Named Keepa history series.", historySeriesSchema),
174
208
  monthlySoldHistory: s.array("Historical Amazon bought-in-past-month values returned by Keepa.", monthlySoldHistoryPointSchema),
175
209
  couponHistory: s.array("Historical coupon observations returned by Keepa.", couponHistoryPointSchema),
176
210
  salesRankHistory: s.array("Sales-rank histories grouped by Amazon subcategory.", salesRankHistorySchema),
177
211
  raw: s.looseObject("The complete Keepa product object including raw history arrays."),
178
212
  });
179
- const productHistoryOutputSchema = s.actionOutput({
213
+ const productHistoryOutputSchema = s.requiredObject("Keepa product history response.", {
180
214
  marketplace: marketplaceSchema,
181
215
  priceValuesUseMinorUnits: s.literal(true, {
182
216
  description: "Whether price integers remain in the marketplace's smallest currency unit.",
183
217
  }),
184
218
  products: s.array("Products and normalized histories returned by Keepa.", productHistorySchema),
185
219
  meta: responseMetaSchema,
186
- }, "Keepa product history response.");
187
- const productFinderSortRuleSchema = {
188
- type: "array",
189
- prefixItems: [
190
- s.nonEmptyString("Official Product Finder field name used for sorting."),
191
- s.stringEnum("Sort direction.", ["asc", "desc"]),
192
- ],
193
- items: false,
194
- minItems: 2,
195
- maxItems: 2,
196
- description: "One official Keepa Product Finder sort rule.",
197
- };
198
- const productFinderSortSchema = s.array("Product Finder sort rules in priority order.", productFinderSortRuleSchema, {
199
- minItems: 1,
200
220
  });
221
+ const productFinderSortSchema = s.array("Product Finder sort rules in priority order.", s.tuple([
222
+ s.nonEmptyString("Official Product Finder field name used for sorting."),
223
+ s.stringEnum("Sort direction.", ["asc", "desc"]),
224
+ ], { description: "One official Keepa Product Finder sort rule." }), { minItems: 1 });
201
225
  const productFinderFiltersSchema = s.looseObject("Official Keepa ProductFinderRequest fields. Unknown official fields are preserved for forward compatibility.", {
202
226
  title: s.nonEmptyString("Case-insensitive product title search text."),
203
227
  brand: s.stringArray("Brands to include.", {
@@ -248,50 +272,46 @@ const productFinderFiltersSchema = s.looseObject("Official Keepa ProductFinderRe
248
272
  hasMainVideo: s.boolean("Whether products must include a main video."),
249
273
  sort: productFinderSortSchema,
250
274
  page: s.nonNegativeInteger("Zero-based Product Finder result page."),
251
- perPage: s.integer("Number of ASINs requested per Product Finder page.", {
252
- minimum: 1,
275
+ perPage: s.integer("Number of ASINs requested per Product Finder page, from 50 to 10000.", {
276
+ minimum: 50,
277
+ maximum: 10_000,
253
278
  }),
254
279
  });
255
280
  const categorySchema = s.looseObject("One category object returned by Keepa.", {
256
- catId: s.nullableInteger("Amazon category node identifier."),
257
- domainId: s.nullableInteger("Keepa Amazon locale identifier."),
258
- name: s.nullableString("Amazon category name."),
259
- parent: s.nullableInteger("Parent category node identifier."),
281
+ catId: nullableIntegerSchema("Amazon category node identifier."),
282
+ domainId: nullableIntegerSchema("Keepa Amazon locale identifier."),
283
+ name: nullableStringSchema("Amazon category name."),
284
+ parent: nullableIntegerSchema("Parent category node identifier."),
260
285
  children: s.nullable(s.array("Child category node identifiers.", s.integer("One child category node identifier."))),
261
- productCount: s.nullableInteger("Estimated product count."),
262
- sellerCount: s.nullableInteger("Estimated distinct seller count."),
263
- });
264
- const dealRangeSchema = {
265
- type: "array",
266
- prefixItems: [
267
- s.integer("Range lower bound."),
268
- s.integer("Range upper bound; some Keepa ranges accept -1 as an open upper bound."),
269
- ],
270
- items: false,
271
- minItems: 2,
272
- maxItems: 2,
273
- description: "Inclusive two-value range.",
274
- };
286
+ productCount: nullableIntegerSchema("Estimated product count."),
287
+ sellerCount: nullableIntegerSchema("Estimated distinct seller count."),
288
+ });
289
+ const dealRangeSchema = s.tuple([
290
+ s.integer("Range lower bound."),
291
+ s.integer("Range upper bound; some Keepa ranges accept -1 as an open upper bound."),
292
+ ], { description: "Inclusive two-value range." });
275
293
  const getTokenStatusAction = defineProviderAction(service, {
276
294
  name: "get_token_status",
277
295
  operationType: "read",
278
296
  description: "Retrieve Keepa token availability and refill information without consuming tokens.",
279
297
  requiredScopes: [],
280
- inputSchema: s.actionInput({}, [], "Input for retrieving Keepa token status."),
281
- outputSchema: s.actionOutput({
298
+ inputSchema: s.requiredObject("Input for retrieving Keepa token status.", {}),
299
+ outputSchema: s.requiredObject("Current Keepa token status.", {
282
300
  meta: responseMetaSchema,
283
- }, "Current Keepa token status."),
301
+ }),
284
302
  });
285
303
  const getProductSnapshotAction = defineProviderAction(service, {
286
304
  name: "get_product_snapshot",
287
305
  operationType: "read",
288
306
  description: "Retrieve current Keepa product metadata and named statistics for one or more Amazon ASINs.",
289
307
  requiredScopes: [],
290
- inputSchema: withProductRequestRules(s.actionInput({
308
+ inputSchema: s.object("Input for retrieving Keepa product snapshots.", {
291
309
  marketplace: marketplaceSchema,
292
310
  asins: asinsSchema,
293
311
  ...productRequestOptionalFields,
294
- }, ["marketplace", "asins"], "Input for retrieving Keepa product snapshots.")),
312
+ }, {
313
+ optional: ["asins", ...Object.keys(productRequestOptionalFields)],
314
+ }),
295
315
  outputSchema: productSnapshotOutputSchema,
296
316
  });
297
317
  const getProductHistoryAction = defineProviderAction(service, {
@@ -299,13 +319,15 @@ const getProductHistoryAction = defineProviderAction(service, {
299
319
  operationType: "read",
300
320
  description: "Retrieve named Keepa price, rank, offer-count, rating, review, monthly-sales, and coupon history for Amazon ASINs.",
301
321
  requiredScopes: [],
302
- inputSchema: withProductRequestRules(s.actionInput({
322
+ inputSchema: s.object("Input for retrieving Keepa product history.", {
303
323
  marketplace: marketplaceSchema,
304
324
  asins: asinsSchema,
305
325
  days: s.positiveInteger("Limit all returned history to the most recent number of 24-hour periods."),
306
326
  historyTypes: s.array("Keepa CSV history series to include in `series`; this does not suppress monthlySoldHistory, couponHistory, or salesRankHistory when Keepa returns them.", s.stringEnum("One official Keepa Product.CsvType name.", keepaHistoryTypes), { minItems: 1 }),
307
327
  ...productRequestOptionalFields,
308
- }, ["marketplace", "asins"], "Input for retrieving Keepa product history.")),
328
+ }, {
329
+ optional: ["asins", "days", "historyTypes", ...Object.keys(productRequestOptionalFields)],
330
+ }),
309
331
  outputSchema: productHistoryOutputSchema,
310
332
  });
311
333
  const findProductsAction = defineProviderAction(service, {
@@ -313,62 +335,79 @@ const findProductsAction = defineProviderAction(service, {
313
335
  operationType: "read",
314
336
  description: "Find Amazon ASINs with Keepa Product Finder filters using official ProductFinderRequest field names.",
315
337
  requiredScopes: [],
316
- inputSchema: s.actionInput({
338
+ inputSchema: s.object("Input for finding products in the Keepa catalog.", {
317
339
  marketplace: marketplaceSchema,
318
340
  filters: productFinderFiltersSchema,
319
- }, ["marketplace", "filters"], "Input for finding products in the Keepa catalog."),
320
- outputSchema: s.actionOutput({
341
+ includeSearchInsights: s.boolean("Include charged, query-wide Search Insights statistics."),
342
+ }, { optional: ["includeSearchInsights"] }),
343
+ outputSchema: s.requiredObject("Keepa Product Finder results.", {
321
344
  marketplace: marketplaceSchema,
322
345
  asins: s.array("Matching Amazon ASINs.", s.string("One Amazon ASIN.")),
323
- totalResults: s.nullableInteger("Estimated total number of matching products."),
346
+ totalResults: s.nullable(s.integer("Estimated total number of matching products.")),
347
+ searchInsights: s.nullable(s.looseObject("Query-wide Search Insights returned when requested.")),
324
348
  meta: responseMetaSchema,
325
- }, "Keepa Product Finder results."),
349
+ }),
326
350
  });
327
351
  const searchCategoriesAction = defineProviderAction(service, {
328
352
  name: "search_categories",
329
353
  operationType: "read",
330
354
  description: "Search Keepa Amazon categories by name so category IDs can be used in product and best-seller queries.",
331
355
  requiredScopes: [],
332
- inputSchema: s.actionInput({
333
- marketplace: marketplaceSchema,
356
+ inputSchema: s.object("Input for searching Keepa categories.", {
357
+ marketplace: standardMarketplaceSchema,
334
358
  term: s.nonEmptyString("Space-separated category keywords; each keyword must contain at least three characters."),
335
359
  includeParents: s.boolean("Whether Keepa should include the parent tree for each category."),
336
- }, ["marketplace", "term"], "Input for searching Keepa categories."),
337
- outputSchema: s.actionOutput({
338
- marketplace: marketplaceSchema,
360
+ }, { optional: ["includeParents"] }),
361
+ outputSchema: s.requiredObject("Keepa category search results.", {
362
+ marketplace: standardMarketplaceSchema,
339
363
  categories: s.array("Matching categories.", categorySchema),
340
364
  categoryParents: s.array("Parent categories returned when requested.", categorySchema),
341
365
  meta: responseMetaSchema,
342
- }, "Keepa category search results."),
366
+ }),
343
367
  });
344
368
  const getBestSellersAction = defineProviderAction(service, {
345
369
  name: "get_best_sellers",
346
370
  operationType: "read",
347
371
  description: "Retrieve Keepa's ordered Amazon best-seller ASIN list for a category node or website display group.",
348
372
  requiredScopes: [],
349
- inputSchema: s.actionInput({
350
- marketplace: marketplaceSchema,
373
+ inputSchema: s.object("Input for retrieving Keepa best sellers.", {
374
+ marketplace: standardMarketplaceSchema,
351
375
  category: s.anyOf("Amazon category node ID or Keepa website display group name.", [
352
376
  s.nonNegativeInteger("Amazon category node ID."),
353
377
  s.nonEmptyString("Keepa website display group name."),
354
378
  ]),
355
- }, ["marketplace", "category"], "Input for retrieving Keepa best sellers."),
356
- outputSchema: s.actionOutput({
357
- marketplace: marketplaceSchema,
358
- categoryId: s.nullableInteger("Amazon category node ID resolved by Keepa."),
359
- lastUpdate: s.nullableInteger("Best-seller list update time in Keepa Time minutes."),
379
+ range: s.anyOf("Sales-rank averaging interval: 0, 30, 90 or 180 days.", [
380
+ s.literal(0, { description: "Current rank." }),
381
+ s.literal(30, { description: "30-day average rank." }),
382
+ s.literal(90, { description: "90-day average rank." }),
383
+ s.literal(180, { description: "180-day average rank." }),
384
+ ]),
385
+ month: s.integer("Historical month from 1 to 12; requires year.", {
386
+ minimum: 1,
387
+ maximum: 12,
388
+ }),
389
+ year: s.integer("Four-digit year for a historical month; requires month."),
390
+ variations: s.boolean("Return all variations instead of one representative."),
391
+ sublist: s.boolean("Use subcategory rank instead of primary rank."),
392
+ ...windowInputFields,
393
+ }, { optional: ["range", "month", "year", "variations", "sublist", "offset", "limit"] }),
394
+ outputSchema: s.requiredObject("Keepa best-seller results.", {
395
+ marketplace: standardMarketplaceSchema,
396
+ categoryId: s.nullable(s.integer("Amazon category node ID resolved by Keepa.")),
397
+ lastUpdate: s.nullable(s.integer("Best-seller list update time in Keepa Time minutes.")),
360
398
  asins: s.array("Ordered Amazon ASINs, starting with the product having the lowest sales rank.", s.string("One Amazon ASIN.")),
361
- raw: s.looseObject("The complete Keepa bestSellersList object."),
399
+ ...windowOutputFields,
400
+ raw: s.looseObject("Keepa bestSellersList metadata without the full ASIN list."),
362
401
  meta: responseMetaSchema,
363
- }, "Keepa best-seller results."),
402
+ }),
364
403
  });
365
404
  const findDealsAction = defineProviderAction(service, {
366
405
  name: "find_deals",
367
406
  operationType: "read",
368
407
  description: "Find recently changed Amazon products with Keepa deal filters and bounded pagination.",
369
408
  requiredScopes: [],
370
- inputSchema: s.actionInput({
371
- marketplace: marketplaceSchema,
409
+ inputSchema: s.object("Input for finding Keepa deals.", {
410
+ marketplace: standardMarketplaceSchema,
372
411
  priceType: s.stringEnum("Keepa price or rank type whose change defines the deal.", keepaDealPriceTypes),
373
412
  page: s.nonNegativeInteger("Zero-based deal result page; each page contains at most 150 deals."),
374
413
  dateRange: s.integer("Change interval: 0 for one day, 1 for one week, 2 for one month, or 3 for 90 days.", {
@@ -385,6 +424,7 @@ const findDealsAction = defineProviderAction(service, {
385
424
  deltaRange: dealRangeSchema,
386
425
  deltaPercentRange: dealRangeSchema,
387
426
  salesRankRange: dealRangeSchema,
427
+ deltaLastRange: dealRangeSchema,
388
428
  titleSearch: s.nonEmptyString("Case-insensitive title keywords that must all appear in the product title."),
389
429
  minimumRating: s.integer("Minimum product rating multiplied by 10.", {
390
430
  minimum: 0,
@@ -401,45 +441,252 @@ const findDealsAction = defineProviderAction(service, {
401
441
  isPrimeExclusive: s.boolean("Whether to include only Prime Exclusive products."),
402
442
  mustHaveAmazonOffer: s.boolean("Whether products must have an offer sold and fulfilled by Amazon."),
403
443
  mustNotHaveAmazonOffer: s.boolean("Whether products must not have an offer sold and fulfilled by Amazon."),
404
- }, ["marketplace", "priceType"], "Input for finding Keepa deals."),
405
- outputSchema: s.actionOutput({
406
- marketplace: marketplaceSchema,
444
+ isHighest: s.boolean("Whether the selected value must be the highest since tracking began."),
445
+ singleVariation: s.boolean("Return one randomly chosen variation per matching family."),
446
+ isRisers: s.boolean("Include only products whose price rose in the selected interval."),
447
+ filterErotic: s.boolean("Exclude adult items when true."),
448
+ warehouseConditions: s.array("Amazon Warehouse condition codes.", s.integer("One condition code.")),
449
+ ...Object.fromEntries(keepaDealAttributeNames.map((name) => [
450
+ name,
451
+ s.stringArray(`Values for the official ${name} deal attribute filter.`, {
452
+ itemDescription: `One ${name} value.`,
453
+ }),
454
+ ])),
455
+ }, {
456
+ optional: [
457
+ "page",
458
+ "dateRange",
459
+ "includeCategories",
460
+ "excludeCategories",
461
+ "currentRange",
462
+ "deltaRange",
463
+ "deltaPercentRange",
464
+ "salesRankRange",
465
+ "deltaLastRange",
466
+ "titleSearch",
467
+ "minimumRating",
468
+ "sortBy",
469
+ "invertSort",
470
+ "isLowestEver",
471
+ "isLowest90Days",
472
+ "isLowestOffer",
473
+ "isBackInStock",
474
+ "isOutOfStock",
475
+ "hasReviews",
476
+ "isPrimeExclusive",
477
+ "mustHaveAmazonOffer",
478
+ "mustNotHaveAmazonOffer",
479
+ "isHighest",
480
+ "singleVariation",
481
+ "isRisers",
482
+ "filterErotic",
483
+ "warehouseConditions",
484
+ ...keepaDealAttributeNames,
485
+ ],
486
+ }),
487
+ outputSchema: s.requiredObject("Keepa deal search results.", {
488
+ marketplace: standardMarketplaceSchema,
407
489
  deals: s.array("Deal records returned by Keepa.", s.looseObject("One Keepa deal record.", {
408
- asin: s.nullableString("Amazon ASIN."),
409
- title: s.nullableString("Amazon product title."),
490
+ asin: nullableStringSchema("Amazon ASIN."),
491
+ title: nullableStringSchema("Amazon product title."),
410
492
  })),
411
493
  categoryIds: s.array("Root category IDs represented in the results.", s.integer("One root category ID.")),
412
494
  categoryNames: s.array("Root category names represented in the results.", s.string("One root category name.")),
413
495
  categoryCount: s.array("Deal counts aligned with categoryIds and categoryNames.", s.integer("Deal count for one root category.")),
414
496
  raw: s.looseObject("The complete Keepa deals response object."),
415
497
  meta: responseMetaSchema,
416
- }, "Keepa deal search results."),
498
+ }),
417
499
  });
418
500
  const getSellerSnapshotAction = defineProviderAction(service, {
419
501
  name: "get_seller_snapshot",
420
502
  operationType: "read",
421
503
  description: "Retrieve compact Keepa marketplace seller profiles, ratings, category statistics, brands, and competitors.",
422
504
  requiredScopes: [],
423
- inputSchema: s.actionInput({
424
- marketplace: marketplaceSchema,
505
+ inputSchema: s.requiredObject("Input for retrieving Keepa seller snapshots.", {
506
+ marketplace: standardMarketplaceSchema,
425
507
  sellerIds: s.array("Amazon marketplace seller IDs.", s.nonEmptyString("One Amazon seller ID."), {
426
508
  minItems: 1,
427
509
  maxItems: 100,
428
510
  }),
429
- }, ["marketplace", "sellerIds"], "Input for retrieving Keepa seller snapshots."),
430
- outputSchema: s.actionOutput({
431
- marketplace: marketplaceSchema,
511
+ }),
512
+ outputSchema: s.requiredObject("Keepa seller snapshot results.", {
513
+ marketplace: standardMarketplaceSchema,
432
514
  sellers: s.array("Seller profiles returned by Keepa.", s.looseObject("One normalized Keepa seller profile.", {
433
515
  sellerId: s.string("Amazon seller ID."),
434
- sellerName: s.nullableString("Amazon seller display name."),
435
- currentRating: s.nullableInteger("Current seller rating percentage."),
516
+ sellerName: nullableStringSchema("Amazon seller display name."),
517
+ currentRating: nullableIntegerSchema("Current seller rating percentage."),
436
518
  ratingCount: s.nullable(s.array("Rating counts for the last 30, 90, and 365 days and lifetime.", s.integer("One seller rating count."))),
437
- hasFba: s.nullableBoolean("Whether Keepa has observed current FBA listings."),
438
- shipsFromChina: s.nullableBoolean("Whether Keepa identifies the seller as shipping from China."),
519
+ hasFba: s.nullable(s.boolean("Whether Keepa has observed current FBA listings.")),
520
+ shipsFromChina: s.nullable(s.boolean("Whether Keepa identifies the seller as shipping from China.")),
439
521
  raw: s.looseObject("The complete Keepa seller object."),
440
522
  })),
441
523
  meta: responseMetaSchema,
442
- }, "Keepa seller snapshot results."),
524
+ }),
525
+ });
526
+ const lightningStateSchema = s.stringEnum("Official Keepa lightning deal state.", [
527
+ "AVAILABLE",
528
+ "WAITLIST",
529
+ "SOLDOUT",
530
+ "WAITLISTFULL",
531
+ "EXPIRED",
532
+ "SUPPRESSED",
533
+ ]);
534
+ const sellerFinderFiltersSchema = s.looseObject("Official Seller Finder selection fields; other official filters are preserved.", {
535
+ search: s.nonEmptyString("Text query for seller discovery."),
536
+ sellerName: s.nonEmptyString("Seller display name to match."),
537
+ businessName: s.nonEmptyString("Registered business name to match."),
538
+ addressCountry: s.stringArray("Seller business country codes.", {
539
+ itemDescription: "One country code.",
540
+ }),
541
+ currentRating_gte: s.integer("Minimum current seller rating percentage."),
542
+ currentRatingCount_gte: s.integer("Minimum current seller rating count."),
543
+ totalStorefrontAsins_gte: s.integer("Minimum observed storefront ASIN count."),
544
+ brands: s.stringArray("Brands sold by the merchant.", { itemDescription: "One brand." }),
545
+ rootCategories_include: s.array("Root category IDs to include.", s.integer("One root category ID.")),
546
+ competitorSellerIds: s.stringArray("Seller IDs whose listing competitors should be found.", {
547
+ itemDescription: "One seller ID.",
548
+ }),
549
+ page: s.nonNegativeInteger("Zero-based seller result page."),
550
+ perPage: s.anyOf("Seller IDs per page; zero means 100, otherwise from 50 to 10000.", [
551
+ s.literal(0, { description: "Use Keepa's 100-seller page shortcut." }),
552
+ s.integer("Seller IDs requested per page.", { minimum: 50, maximum: 10_000 }),
553
+ ]),
554
+ sort: s.array("Up to three seller sort rules.", s.tuple([
555
+ s.nonEmptyString("Official Seller Finder field name."),
556
+ s.stringEnum("Ascending or descending order.", ["asc", "desc"]),
557
+ ], { description: "One seller sort rule." }), { maxItems: 3 }),
558
+ });
559
+ const searchProductsAction = defineProviderAction(service, {
560
+ name: "search_products",
561
+ operationType: "read",
562
+ description: "Search Amazon products by keyword in Amazon result order, without fetching more details.",
563
+ requiredScopes: [],
564
+ inputSchema: s.object("Input for Keepa keyword product search.", {
565
+ marketplace: standardMarketplaceSchema,
566
+ term: s.nonEmptyString("Amazon product search terms."),
567
+ asinsOnly: s.boolean("Return only ordered ASINs instead of product objects."),
568
+ statsDays: s.positiveInteger("Recent days for free product statistics."),
569
+ statsRange: statsRangeSchema,
570
+ updateHours: s.integer("Refresh threshold in hours; zero can cost extra tokens.", {
571
+ minimum: 0,
572
+ }),
573
+ includeHistory: s.boolean("Include available product price history."),
574
+ includeRating: s.boolean("Include existing rating and review history, possibly at extra cost."),
575
+ }, {
576
+ optional: ["asinsOnly", "statsDays", "statsRange", "updateHours", "includeHistory", "includeRating"],
577
+ }),
578
+ outputSchema: s.requiredObject("Ordered Keepa keyword search results.", {
579
+ marketplace: standardMarketplaceSchema,
580
+ asins: s.array("Ordered matching ASINs.", s.string("One ASIN.")),
581
+ products: s.array("Product objects when ASIN-only mode is disabled.", productSnapshotSchema),
582
+ meta: responseMetaSchema,
583
+ }),
584
+ });
585
+ const lookupCategoriesAction = defineProviderAction(service, {
586
+ name: "lookup_categories",
587
+ operationType: "read",
588
+ description: "Look up up to ten Amazon category IDs and optionally their parent tree; ID zero lists roots.",
589
+ requiredScopes: [],
590
+ inputSchema: s.object("Input for Keepa category lookup.", {
591
+ marketplace: standardMarketplaceSchema,
592
+ categoryIds: s.array("Category IDs, or a sole zero to list roots.", s.nonNegativeInteger("One category ID."), {
593
+ minItems: 1,
594
+ maxItems: 10,
595
+ }),
596
+ includeParents: s.boolean("Include parent categories up to the root."),
597
+ }, { optional: ["includeParents"] }),
598
+ outputSchema: s.requiredObject("Keepa category lookup results.", {
599
+ marketplace: standardMarketplaceSchema,
600
+ categories: s.array("Matched categories.", categorySchema),
601
+ categoryParents: s.array("Parent categories when requested.", categorySchema),
602
+ meta: responseMetaSchema,
603
+ }),
604
+ });
605
+ const findSellersAction = defineProviderAction(service, {
606
+ name: "find_sellers",
607
+ operationType: "read",
608
+ description: "Find seller IDs by official Seller Finder criteria without fetching seller profiles.",
609
+ requiredScopes: [],
610
+ inputSchema: s.requiredObject("Input for Keepa Seller Finder.", {
611
+ marketplace: standardMarketplaceSchema,
612
+ filters: sellerFinderFiltersSchema,
613
+ }),
614
+ outputSchema: s.requiredObject("Keepa Seller Finder results.", {
615
+ marketplace: standardMarketplaceSchema,
616
+ sellerIds: s.array("Ordered seller IDs in this upstream result page.", s.string("One seller ID.")),
617
+ totalResults: s.nullable(s.integer("Total sellers matched across pages.")),
618
+ meta: responseMetaSchema,
619
+ }),
620
+ });
621
+ const getMostRatedSellersAction = defineProviderAction(service, {
622
+ name: "get_most_rated_sellers",
623
+ operationType: "read",
624
+ description: "Get seller IDs ordered by rating count, with a local result window; each window fetches and pays for the full upstream list.",
625
+ requiredScopes: [],
626
+ inputSchema: s.object("Input for most rated sellers.", {
627
+ marketplace: standardMarketplaceSchema,
628
+ ...windowInputFields,
629
+ }, { optional: ["offset", "limit"] }),
630
+ outputSchema: s.requiredObject("Most rated sellers result window.", {
631
+ marketplace: standardMarketplaceSchema,
632
+ sellerIds: s.array("Seller IDs ordered by rating count.", s.string("One seller ID.")),
633
+ ...windowOutputFields,
634
+ meta: responseMetaSchema,
635
+ }),
636
+ });
637
+ const getSellerStorefrontAction = defineProviderAction(service, {
638
+ name: "get_seller_storefront",
639
+ operationType: "read",
640
+ description: "Inspect one seller's observed storefront ASINs and aligned last-seen times; the list can be incomplete.",
641
+ requiredScopes: [],
642
+ inputSchema: s.object("Input for one seller storefront.", {
643
+ marketplace: standardMarketplaceSchema,
644
+ sellerId: s.nonEmptyString("One Amazon seller ID that does not contain commas.", { pattern: "^[^,]+$" }),
645
+ ...windowInputFields,
646
+ }, { optional: ["offset", "limit"] }),
647
+ outputSchema: s.requiredObject("Observed seller storefront window.", {
648
+ marketplace: standardMarketplaceSchema,
649
+ seller: s.nullable(s.looseObject("Seller profile without full storefront arrays.")),
650
+ items: s.array("Observed ASIN and last-seen pairs.", s.requiredObject("One storefront listing observation.", {
651
+ asin: s.string("Amazon ASIN."),
652
+ lastSeen: s.nullable(s.integer("Last observed Keepa Time minute.")),
653
+ })),
654
+ ...windowOutputFields,
655
+ meta: responseMetaSchema,
656
+ }),
657
+ });
658
+ const getLightningDealAction = defineProviderAction(service, {
659
+ name: "get_lightning_deal",
660
+ operationType: "read",
661
+ description: "Get lightning deals for a required ASIN, avoiding the costly full-list request.",
662
+ requiredScopes: [],
663
+ inputSchema: s.object("Input for one product's lightning deal.", {
664
+ marketplace: standardMarketplaceSchema,
665
+ asin: asinSchema,
666
+ state: lightningStateSchema,
667
+ }, { optional: ["state"] }),
668
+ outputSchema: s.requiredObject("Lightning deals for one ASIN.", {
669
+ marketplace: standardMarketplaceSchema,
670
+ lightningDeals: s.array("Lightning deal objects.", s.looseObject("One upstream lightning deal.")),
671
+ meta: responseMetaSchema,
672
+ }),
673
+ });
674
+ const listLightningDealsAction = defineProviderAction(service, {
675
+ name: "list_lightning_deals",
676
+ operationType: "read",
677
+ description: "List lightning deals with a local result window; Keepa charges 500 tokens for each full upstream request, regardless of window size.",
678
+ requiredScopes: [],
679
+ inputSchema: s.object("Input for the full Keepa lightning deal list.", {
680
+ marketplace: standardMarketplaceSchema,
681
+ state: lightningStateSchema,
682
+ ...windowInputFields,
683
+ }, { optional: ["state", "offset", "limit"] }),
684
+ outputSchema: s.requiredObject("Lightning deal result window.", {
685
+ marketplace: standardMarketplaceSchema,
686
+ lightningDeals: s.array("Lightning deals in this local window.", s.looseObject("One upstream lightning deal.")),
687
+ ...windowOutputFields,
688
+ meta: responseMetaSchema,
689
+ }),
443
690
  });
444
691
  export const keepaActions = [
445
692
  getTokenStatusAction,
@@ -450,36 +697,11 @@ export const keepaActions = [
450
697
  getBestSellersAction,
451
698
  findDealsAction,
452
699
  getSellerSnapshotAction,
700
+ searchProductsAction,
701
+ lookupCategoriesAction,
702
+ findSellersAction,
703
+ getMostRatedSellersAction,
704
+ getSellerStorefrontAction,
705
+ getLightningDealAction,
706
+ listLightningDealsAction,
453
707
  ];
454
- function withProductRequestRules(schema) {
455
- return {
456
- ...schema,
457
- allOf: [
458
- {
459
- if: {
460
- required: ["offers"],
461
- },
462
- then: {
463
- properties: {
464
- asins: {
465
- maxItems: 20,
466
- },
467
- },
468
- },
469
- },
470
- {
471
- if: {
472
- required: ["onlyLiveOffers"],
473
- properties: {
474
- onlyLiveOffers: {
475
- const: true,
476
- },
477
- },
478
- },
479
- then: {
480
- required: ["offers"],
481
- },
482
- },
483
- ],
484
- };
485
- }