@commandable/mcp 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (397) hide show
  1. package/LICENSE +10 -0
  2. package/README.md +34 -0
  3. package/dist/cli/bin.d.ts +3 -0
  4. package/dist/cli/bin.d.ts.map +1 -0
  5. package/dist/cli/bin.js +7 -0
  6. package/dist/cli/bin.js.map +1 -0
  7. package/dist/cli/credentialManager.d.ts +19 -0
  8. package/dist/cli/credentialManager.d.ts.map +1 -0
  9. package/dist/cli/credentialManager.js +81 -0
  10. package/dist/cli/credentialManager.js.map +1 -0
  11. package/dist/cli/index.d.ts +2 -0
  12. package/dist/cli/index.d.ts.map +1 -0
  13. package/dist/cli/index.js +77 -0
  14. package/dist/cli/index.js.map +1 -0
  15. package/dist/cli/setup.d.ts +3 -0
  16. package/dist/cli/setup.d.ts.map +1 -0
  17. package/dist/cli/setup.js +194 -0
  18. package/dist/cli/setup.js.map +1 -0
  19. package/dist/crypto/encryption.d.ts +3 -0
  20. package/dist/crypto/encryption.d.ts.map +1 -0
  21. package/dist/crypto/encryption.js +29 -0
  22. package/dist/crypto/encryption.js.map +1 -0
  23. package/dist/db/client.d.ts +22 -0
  24. package/dist/db/client.d.ts.map +1 -0
  25. package/dist/db/client.js +43 -0
  26. package/dist/db/client.js.map +1 -0
  27. package/dist/db/credentialStore.d.ts +13 -0
  28. package/dist/db/credentialStore.d.ts.map +1 -0
  29. package/dist/db/credentialStore.js +57 -0
  30. package/dist/db/credentialStore.js.map +1 -0
  31. package/dist/db/integrationStore.d.ts +5 -0
  32. package/dist/db/integrationStore.d.ts.map +1 -0
  33. package/dist/db/integrationStore.js +65 -0
  34. package/dist/db/integrationStore.js.map +1 -0
  35. package/dist/db/migrate.d.ts +3 -0
  36. package/dist/db/migrate.d.ts.map +1 -0
  37. package/dist/db/migrate.js +88 -0
  38. package/dist/db/migrate.js.map +1 -0
  39. package/dist/db/schema.d.ts +911 -0
  40. package/dist/db/schema.d.ts.map +1 -0
  41. package/dist/db/schema.js +73 -0
  42. package/dist/db/schema.js.map +1 -0
  43. package/dist/errors/httpError.d.ts +6 -0
  44. package/dist/errors/httpError.d.ts.map +1 -0
  45. package/dist/errors/httpError.js +11 -0
  46. package/dist/errors/httpError.js.map +1 -0
  47. package/dist/index.d.ts +21 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +21 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/integrations/actionsFactory.d.ts +12 -0
  52. package/dist/integrations/actionsFactory.d.ts.map +1 -0
  53. package/dist/integrations/actionsFactory.js +68 -0
  54. package/dist/integrations/actionsFactory.js.map +1 -0
  55. package/dist/integrations/catalog.d.ts +9 -0
  56. package/dist/integrations/catalog.d.ts.map +1 -0
  57. package/dist/integrations/catalog.js +80 -0
  58. package/dist/integrations/catalog.js.map +1 -0
  59. package/dist/integrations/dataLoader.d.ts +47 -0
  60. package/dist/integrations/dataLoader.d.ts.map +1 -0
  61. package/dist/integrations/dataLoader.js +126 -0
  62. package/dist/integrations/dataLoader.js.map +1 -0
  63. package/dist/integrations/getIntegration.d.ts +11 -0
  64. package/dist/integrations/getIntegration.d.ts.map +1 -0
  65. package/dist/integrations/getIntegration.js +22 -0
  66. package/dist/integrations/getIntegration.js.map +1 -0
  67. package/dist/integrations/googleServiceAccount.d.ts +6 -0
  68. package/dist/integrations/googleServiceAccount.d.ts.map +1 -0
  69. package/dist/integrations/googleServiceAccount.js +54 -0
  70. package/dist/integrations/googleServiceAccount.js.map +1 -0
  71. package/dist/integrations/providerRegistry.d.ts +2 -0
  72. package/dist/integrations/providerRegistry.d.ts.map +1 -0
  73. package/dist/integrations/providerRegistry.js +50 -0
  74. package/dist/integrations/providerRegistry.js.map +1 -0
  75. package/dist/integrations/proxy.d.ts +16 -0
  76. package/dist/integrations/proxy.d.ts.map +1 -0
  77. package/dist/integrations/proxy.js +331 -0
  78. package/dist/integrations/proxy.js.map +1 -0
  79. package/dist/integrations/sandbox.d.ts +7 -0
  80. package/dist/integrations/sandbox.d.ts.map +1 -0
  81. package/dist/integrations/sandbox.js +210 -0
  82. package/dist/integrations/sandbox.js.map +1 -0
  83. package/dist/integrations/tools.d.ts +3 -0
  84. package/dist/integrations/tools.d.ts.map +1 -0
  85. package/dist/integrations/tools.js +70 -0
  86. package/dist/integrations/tools.js.map +1 -0
  87. package/dist/mcp/server.d.ts +15 -0
  88. package/dist/mcp/server.d.ts.map +1 -0
  89. package/dist/mcp/server.js +50 -0
  90. package/dist/mcp/server.js.map +1 -0
  91. package/dist/mcp/toolAdapter.d.ts +17 -0
  92. package/dist/mcp/toolAdapter.d.ts.map +1 -0
  93. package/dist/mcp/toolAdapter.js +18 -0
  94. package/dist/mcp/toolAdapter.js.map +1 -0
  95. package/dist/types.d.ts +34 -0
  96. package/dist/types.d.ts.map +1 -0
  97. package/dist/types.js +2 -0
  98. package/dist/types.js.map +1 -0
  99. package/integration-data/README.md +52 -0
  100. package/integration-data/airtable/credentials.json +20 -0
  101. package/integration-data/airtable/credentials_hint.md +4 -0
  102. package/integration-data/airtable/handlers/create_record.js +12 -0
  103. package/integration-data/airtable/handlers/delete_record.js +7 -0
  104. package/integration-data/airtable/handlers/get_record.js +4 -0
  105. package/integration-data/airtable/handlers/get_table_schema.js +6 -0
  106. package/integration-data/airtable/handlers/list_bases.js +4 -0
  107. package/integration-data/airtable/handlers/list_records.js +25 -0
  108. package/integration-data/airtable/handlers/list_table_fields.js +6 -0
  109. package/integration-data/airtable/handlers/list_tables.js +4 -0
  110. package/integration-data/airtable/handlers/list_views.js +6 -0
  111. package/integration-data/airtable/handlers/search_records.js +6 -0
  112. package/integration-data/airtable/handlers/update_record.js +11 -0
  113. package/integration-data/airtable/manifest.json +83 -0
  114. package/integration-data/airtable/schemas/create_record.json +12 -0
  115. package/integration-data/airtable/schemas/delete_record.json +11 -0
  116. package/integration-data/airtable/schemas/empty.json +6 -0
  117. package/integration-data/airtable/schemas/get_record.json +11 -0
  118. package/integration-data/airtable/schemas/id_base.json +9 -0
  119. package/integration-data/airtable/schemas/id_base_table.json +10 -0
  120. package/integration-data/airtable/schemas/list_records.json +26 -0
  121. package/integration-data/airtable/schemas/search_records.json +12 -0
  122. package/integration-data/airtable/schemas/update_record.json +13 -0
  123. package/integration-data/github/credentials.json +20 -0
  124. package/integration-data/github/credentials_hint.md +7 -0
  125. package/integration-data/github/handlers/add_labels_to_issue.js +12 -0
  126. package/integration-data/github/handlers/close_issue.js +5 -0
  127. package/integration-data/github/handlers/comment_on_issue.js +5 -0
  128. package/integration-data/github/handlers/create_branch.js +33 -0
  129. package/integration-data/github/handlers/create_commit.js +91 -0
  130. package/integration-data/github/handlers/create_issue.js +10 -0
  131. package/integration-data/github/handlers/create_or_update_file.js +21 -0
  132. package/integration-data/github/handlers/create_pull_request.js +16 -0
  133. package/integration-data/github/handlers/create_repo.js +11 -0
  134. package/integration-data/github/handlers/delete_repo.js +6 -0
  135. package/integration-data/github/handlers/get_issue.js +4 -0
  136. package/integration-data/github/handlers/get_repo.js +4 -0
  137. package/integration-data/github/handlers/list_branches.js +4 -0
  138. package/integration-data/github/handlers/list_commits.js +12 -0
  139. package/integration-data/github/handlers/list_issues.js +12 -0
  140. package/integration-data/github/handlers/list_pull_requests.js +8 -0
  141. package/integration-data/github/handlers/list_repos_install.js +4 -0
  142. package/integration-data/github/handlers/list_repos_user.js +4 -0
  143. package/integration-data/github/handlers/merge_pull_request.js +14 -0
  144. package/integration-data/github/handlers/update_issue.js +15 -0
  145. package/integration-data/github/manifest.json +26 -0
  146. package/integration-data/github/schemas/add_labels_to_issue.json +12 -0
  147. package/integration-data/github/schemas/close_issue.json +10 -0
  148. package/integration-data/github/schemas/comment_on_issue.json +11 -0
  149. package/integration-data/github/schemas/create_branch.json +12 -0
  150. package/integration-data/github/schemas/create_commit.json +25 -0
  151. package/integration-data/github/schemas/create_issue.json +13 -0
  152. package/integration-data/github/schemas/create_or_update_file.json +15 -0
  153. package/integration-data/github/schemas/create_pull_request.json +15 -0
  154. package/integration-data/github/schemas/create_repo.json +12 -0
  155. package/integration-data/github/schemas/delete_repo.json +10 -0
  156. package/integration-data/github/schemas/empty.json +5 -0
  157. package/integration-data/github/schemas/get_issue.json +10 -0
  158. package/integration-data/github/schemas/get_repo.json +9 -0
  159. package/integration-data/github/schemas/list_commits.json +12 -0
  160. package/integration-data/github/schemas/list_issues.json +12 -0
  161. package/integration-data/github/schemas/list_pull_requests.json +10 -0
  162. package/integration-data/github/schemas/merge_pull_request.json +14 -0
  163. package/integration-data/github/schemas/owner_repo.json +9 -0
  164. package/integration-data/github/schemas/update_issue.json +15 -0
  165. package/integration-data/google-calendar/credentials.json +36 -0
  166. package/integration-data/google-calendar/credentials_hint.md +9 -0
  167. package/integration-data/google-calendar/handlers/create_event.js +6 -0
  168. package/integration-data/google-calendar/handlers/delete_acl.js +6 -0
  169. package/integration-data/google-calendar/handlers/delete_event.js +7 -0
  170. package/integration-data/google-calendar/handlers/freebusy_query.js +4 -0
  171. package/integration-data/google-calendar/handlers/get_acl.js +5 -0
  172. package/integration-data/google-calendar/handlers/get_calendar.js +4 -0
  173. package/integration-data/google-calendar/handlers/get_event.js +5 -0
  174. package/integration-data/google-calendar/handlers/insert_acl.js +6 -0
  175. package/integration-data/google-calendar/handlers/list_acl.js +5 -0
  176. package/integration-data/google-calendar/handlers/list_calendars.js +4 -0
  177. package/integration-data/google-calendar/handlers/list_colors.js +4 -0
  178. package/integration-data/google-calendar/handlers/list_events.js +21 -0
  179. package/integration-data/google-calendar/handlers/list_settings.js +4 -0
  180. package/integration-data/google-calendar/handlers/move_event.js +6 -0
  181. package/integration-data/google-calendar/handlers/patch_event.js +5 -0
  182. package/integration-data/google-calendar/handlers/quick_add.js +6 -0
  183. package/integration-data/google-calendar/handlers/update_acl.js +7 -0
  184. package/integration-data/google-calendar/handlers/update_event.js +5 -0
  185. package/integration-data/google-calendar/manifest.json +26 -0
  186. package/integration-data/google-calendar/schemas/create_event.json +34 -0
  187. package/integration-data/google-calendar/schemas/delete_acl.json +9 -0
  188. package/integration-data/google-calendar/schemas/empty.json +1 -0
  189. package/integration-data/google-calendar/schemas/freebusy_query.json +13 -0
  190. package/integration-data/google-calendar/schemas/get_acl.json +9 -0
  191. package/integration-data/google-calendar/schemas/id_calendar.json +8 -0
  192. package/integration-data/google-calendar/schemas/id_calendar_event.json +9 -0
  193. package/integration-data/google-calendar/schemas/insert_acl.json +18 -0
  194. package/integration-data/google-calendar/schemas/list_events.json +15 -0
  195. package/integration-data/google-calendar/schemas/move_event.json +10 -0
  196. package/integration-data/google-calendar/schemas/patch_event.json +10 -0
  197. package/integration-data/google-calendar/schemas/quick_add.json +9 -0
  198. package/integration-data/google-calendar/schemas/update_acl.json +10 -0
  199. package/integration-data/google-calendar/schemas/update_event.json +10 -0
  200. package/integration-data/google-docs/credentials.json +36 -0
  201. package/integration-data/google-docs/credentials_hint.md +9 -0
  202. package/integration-data/google-docs/handlers/append_text.js +12 -0
  203. package/integration-data/google-docs/handlers/batch_update.js +13 -0
  204. package/integration-data/google-docs/handlers/create_document.js +9 -0
  205. package/integration-data/google-docs/handlers/delete_first_match.js +50 -0
  206. package/integration-data/google-docs/handlers/get_document.js +12 -0
  207. package/integration-data/google-docs/handlers/get_document_structured.js +6 -0
  208. package/integration-data/google-docs/handlers/get_document_text.js +17 -0
  209. package/integration-data/google-docs/handlers/insert_inline_image_after_first_match.js +41 -0
  210. package/integration-data/google-docs/handlers/insert_page_break_after_first_match.js +49 -0
  211. package/integration-data/google-docs/handlers/insert_table_after_first_match.js +49 -0
  212. package/integration-data/google-docs/handlers/insert_text_after_first_match.js +51 -0
  213. package/integration-data/google-docs/handlers/replace_all_text.js +8 -0
  214. package/integration-data/google-docs/handlers/style_first_match.js +42 -0
  215. package/integration-data/google-docs/handlers/update_document_style.js +8 -0
  216. package/integration-data/google-docs/handlers/update_paragraph_style_for_first_match.js +48 -0
  217. package/integration-data/google-docs/manifest.json +58 -0
  218. package/integration-data/google-docs/schemas/append_text.json +10 -0
  219. package/integration-data/google-docs/schemas/apply_text_style.json +13 -0
  220. package/integration-data/google-docs/schemas/batch_update.json +16 -0
  221. package/integration-data/google-docs/schemas/create_document.json +8 -0
  222. package/integration-data/google-docs/schemas/delete_content_range.json +11 -0
  223. package/integration-data/google-docs/schemas/delete_first_match.json +10 -0
  224. package/integration-data/google-docs/schemas/get_document.json +11 -0
  225. package/integration-data/google-docs/schemas/get_document_structured.json +9 -0
  226. package/integration-data/google-docs/schemas/get_document_text.json +9 -0
  227. package/integration-data/google-docs/schemas/insert_inline_image.json +12 -0
  228. package/integration-data/google-docs/schemas/insert_inline_image_after_first_match.json +13 -0
  229. package/integration-data/google-docs/schemas/insert_page_break.json +10 -0
  230. package/integration-data/google-docs/schemas/insert_page_break_after_first_match.json +11 -0
  231. package/integration-data/google-docs/schemas/insert_table.json +12 -0
  232. package/integration-data/google-docs/schemas/insert_table_after_first_match.json +13 -0
  233. package/integration-data/google-docs/schemas/insert_text_after_first_match.json +12 -0
  234. package/integration-data/google-docs/schemas/insert_text_at.json +11 -0
  235. package/integration-data/google-docs/schemas/replace_all_text.json +12 -0
  236. package/integration-data/google-docs/schemas/style_first_match.json +12 -0
  237. package/integration-data/google-docs/schemas/update_document_style.json +11 -0
  238. package/integration-data/google-docs/schemas/update_paragraph_style.json +13 -0
  239. package/integration-data/google-docs/schemas/update_paragraph_style_for_first_match.json +12 -0
  240. package/integration-data/google-sheet/credentials.json +36 -0
  241. package/integration-data/google-sheet/credentials_hint.md +9 -0
  242. package/integration-data/google-sheet/handlers/append_values.js +18 -0
  243. package/integration-data/google-sheet/handlers/batch_clear_values.js +6 -0
  244. package/integration-data/google-sheet/handlers/batch_clear_values_by_data_filter.js +6 -0
  245. package/integration-data/google-sheet/handlers/batch_get_values.js +16 -0
  246. package/integration-data/google-sheet/handlers/batch_update.js +14 -0
  247. package/integration-data/google-sheet/handlers/batch_update_values.js +16 -0
  248. package/integration-data/google-sheet/handlers/batch_update_values_by_data_filter.js +16 -0
  249. package/integration-data/google-sheet/handlers/clear_values.js +6 -0
  250. package/integration-data/google-sheet/handlers/copy_to_spreadsheet.js +6 -0
  251. package/integration-data/google-sheet/handlers/create_spreadsheet.js +5 -0
  252. package/integration-data/google-sheet/handlers/get_developer_metadata.js +6 -0
  253. package/integration-data/google-sheet/handlers/get_spreadsheet.js +12 -0
  254. package/integration-data/google-sheet/handlers/get_spreadsheet_by_data_filter.js +10 -0
  255. package/integration-data/google-sheet/handlers/get_values.js +14 -0
  256. package/integration-data/google-sheet/handlers/get_values_by_data_filter.js +14 -0
  257. package/integration-data/google-sheet/handlers/search_developer_metadata.js +7 -0
  258. package/integration-data/google-sheet/handlers/update_values.js +16 -0
  259. package/integration-data/google-sheet/manifest.json +125 -0
  260. package/integration-data/google-sheet/schemas/append_values.json +16 -0
  261. package/integration-data/google-sheet/schemas/batch_clear_values.json +10 -0
  262. package/integration-data/google-sheet/schemas/batch_clear_values_by_data_filter.json +10 -0
  263. package/integration-data/google-sheet/schemas/batch_get_values.json +13 -0
  264. package/integration-data/google-sheet/schemas/batch_update.json +13 -0
  265. package/integration-data/google-sheet/schemas/batch_update_values.json +25 -0
  266. package/integration-data/google-sheet/schemas/batch_update_values_by_data_filter.json +25 -0
  267. package/integration-data/google-sheet/schemas/clear_values.json +10 -0
  268. package/integration-data/google-sheet/schemas/copy_to_spreadsheet.json +11 -0
  269. package/integration-data/google-sheet/schemas/create_spreadsheet.json +11 -0
  270. package/integration-data/google-sheet/schemas/get_developer_metadata.json +10 -0
  271. package/integration-data/google-sheet/schemas/get_spreadsheet.json +15 -0
  272. package/integration-data/google-sheet/schemas/get_spreadsheet_by_data_filter.json +11 -0
  273. package/integration-data/google-sheet/schemas/get_values.json +13 -0
  274. package/integration-data/google-sheet/schemas/get_values_by_data_filter.json +17 -0
  275. package/integration-data/google-sheet/schemas/search_developer_metadata.json +14 -0
  276. package/integration-data/google-sheet/schemas/update_values.json +15 -0
  277. package/integration-data/google-slides/credentials.json +36 -0
  278. package/integration-data/google-slides/credentials_hint.md +9 -0
  279. package/integration-data/google-slides/handlers/append_text_to_title_of_first_slide.js +17 -0
  280. package/integration-data/google-slides/handlers/batch_update.js +15 -0
  281. package/integration-data/google-slides/handlers/create_presentation.js +8 -0
  282. package/integration-data/google-slides/handlers/create_slide_after_first_match.js +20 -0
  283. package/integration-data/google-slides/handlers/get_page_thumbnail.js +12 -0
  284. package/integration-data/google-slides/handlers/get_presentation.js +6 -0
  285. package/integration-data/google-slides/handlers/insert_image_after_first_match.js +19 -0
  286. package/integration-data/google-slides/handlers/insert_shape_after_first_match.js +21 -0
  287. package/integration-data/google-slides/handlers/replace_text_first_match.js +9 -0
  288. package/integration-data/google-slides/handlers/set_background_color_for_slide_index.js +15 -0
  289. package/integration-data/google-slides/handlers/style_text_first_match.js +48 -0
  290. package/integration-data/google-slides/manifest.json +41 -0
  291. package/integration-data/google-slides/schemas/append_text_to_title_of_first_slide.json +11 -0
  292. package/integration-data/google-slides/schemas/batch_update.json +13 -0
  293. package/integration-data/google-slides/schemas/create_presentation.json +8 -0
  294. package/integration-data/google-slides/schemas/create_slide_after_first_match.json +11 -0
  295. package/integration-data/google-slides/schemas/get_page_thumbnail.json +12 -0
  296. package/integration-data/google-slides/schemas/get_presentation.json +9 -0
  297. package/integration-data/google-slides/schemas/insert_image_after_first_match.json +13 -0
  298. package/integration-data/google-slides/schemas/insert_shape_after_first_match.json +13 -0
  299. package/integration-data/google-slides/schemas/replace_text_first_match.json +12 -0
  300. package/integration-data/google-slides/schemas/set_background_color_for_slide_index.json +11 -0
  301. package/integration-data/google-slides/schemas/style_text_first_match.json +12 -0
  302. package/integration-data/new_integration_prompt.md +41 -0
  303. package/integration-data/notion/credentials.json +21 -0
  304. package/integration-data/notion/credentials_hint.md +5 -0
  305. package/integration-data/notion/handlers/append_block_children.js +7 -0
  306. package/integration-data/notion/handlers/create_comment.js +10 -0
  307. package/integration-data/notion/handlers/create_database.js +11 -0
  308. package/integration-data/notion/handlers/create_page.js +13 -0
  309. package/integration-data/notion/handlers/delete_block.js +8 -0
  310. package/integration-data/notion/handlers/get_me.js +4 -0
  311. package/integration-data/notion/handlers/list_block_children.js +10 -0
  312. package/integration-data/notion/handlers/list_comments.js +14 -0
  313. package/integration-data/notion/handlers/list_users.js +10 -0
  314. package/integration-data/notion/handlers/query_database.js +10 -0
  315. package/integration-data/notion/handlers/retrieve_block.js +4 -0
  316. package/integration-data/notion/handlers/retrieve_database.js +4 -0
  317. package/integration-data/notion/handlers/retrieve_page.js +4 -0
  318. package/integration-data/notion/handlers/retrieve_page_property_item.js +10 -0
  319. package/integration-data/notion/handlers/retrieve_user.js +4 -0
  320. package/integration-data/notion/handlers/search.js +11 -0
  321. package/integration-data/notion/handlers/update_block.js +7 -0
  322. package/integration-data/notion/handlers/update_database.js +10 -0
  323. package/integration-data/notion/handlers/update_page_properties.js +10 -0
  324. package/integration-data/notion/manifest.json +139 -0
  325. package/integration-data/notion/prompt.md +26 -0
  326. package/integration-data/notion/schemas/append_block_children.json +10 -0
  327. package/integration-data/notion/schemas/create_comment.json +18 -0
  328. package/integration-data/notion/schemas/create_database.json +18 -0
  329. package/integration-data/notion/schemas/create_page.json +22 -0
  330. package/integration-data/notion/schemas/delete_block.json +9 -0
  331. package/integration-data/notion/schemas/empty.json +6 -0
  332. package/integration-data/notion/schemas/id_block.json +9 -0
  333. package/integration-data/notion/schemas/id_database.json +9 -0
  334. package/integration-data/notion/schemas/id_page.json +9 -0
  335. package/integration-data/notion/schemas/id_user.json +9 -0
  336. package/integration-data/notion/schemas/list_block_children.json +11 -0
  337. package/integration-data/notion/schemas/list_comments.json +15 -0
  338. package/integration-data/notion/schemas/list_users.json +9 -0
  339. package/integration-data/notion/schemas/query_database.json +13 -0
  340. package/integration-data/notion/schemas/retrieve_page_property_item.json +12 -0
  341. package/integration-data/notion/schemas/search.json +27 -0
  342. package/integration-data/notion/schemas/update_block.json +10 -0
  343. package/integration-data/notion/schemas/update_database.json +13 -0
  344. package/integration-data/notion/schemas/update_page_properties.json +13 -0
  345. package/integration-data/trello/credentials.json +26 -0
  346. package/integration-data/trello/credentials_hint.md +4 -0
  347. package/integration-data/trello/handlers/add_checklist_to_card.js +5 -0
  348. package/integration-data/trello/handlers/add_member_to_card.js +5 -0
  349. package/integration-data/trello/handlers/archive_list.js +5 -0
  350. package/integration-data/trello/handlers/create_card.js +13 -0
  351. package/integration-data/trello/handlers/create_list.js +7 -0
  352. package/integration-data/trello/handlers/delete_card.js +9 -0
  353. package/integration-data/trello/handlers/get_board.js +4 -0
  354. package/integration-data/trello/handlers/get_board_cards.js +4 -0
  355. package/integration-data/trello/handlers/get_board_custom_fields.js +4 -0
  356. package/integration-data/trello/handlers/get_board_labels.js +4 -0
  357. package/integration-data/trello/handlers/get_board_lists.js +4 -0
  358. package/integration-data/trello/handlers/get_board_members.js +4 -0
  359. package/integration-data/trello/handlers/get_board_memberships.js +4 -0
  360. package/integration-data/trello/handlers/get_card.js +4 -0
  361. package/integration-data/trello/handlers/get_card_actions.js +4 -0
  362. package/integration-data/trello/handlers/get_card_attachments.js +4 -0
  363. package/integration-data/trello/handlers/get_card_checklists.js +4 -0
  364. package/integration-data/trello/handlers/get_card_custom_field_items.js +4 -0
  365. package/integration-data/trello/handlers/get_card_members.js +4 -0
  366. package/integration-data/trello/handlers/get_list.js +4 -0
  367. package/integration-data/trello/handlers/get_list_cards.js +4 -0
  368. package/integration-data/trello/handlers/get_member.js +4 -0
  369. package/integration-data/trello/handlers/get_member_boards.js +4 -0
  370. package/integration-data/trello/handlers/get_member_organizations.js +4 -0
  371. package/integration-data/trello/handlers/get_organization.js +4 -0
  372. package/integration-data/trello/handlers/get_organization_boards.js +4 -0
  373. package/integration-data/trello/handlers/move_card_to_list.js +5 -0
  374. package/integration-data/trello/handlers/remove_member_from_card.js +9 -0
  375. package/integration-data/trello/handlers/search.js +5 -0
  376. package/integration-data/trello/handlers/update_card.js +19 -0
  377. package/integration-data/trello/handlers/update_list.js +11 -0
  378. package/integration-data/trello/manifest.json +231 -0
  379. package/integration-data/trello/schemas/add_checklist_to_card.json +10 -0
  380. package/integration-data/trello/schemas/add_member_to_card.json +10 -0
  381. package/integration-data/trello/schemas/archive_list.json +9 -0
  382. package/integration-data/trello/schemas/create_card.json +13 -0
  383. package/integration-data/trello/schemas/create_list.json +11 -0
  384. package/integration-data/trello/schemas/delete_card.json +9 -0
  385. package/integration-data/trello/schemas/display_trello_cards.json +45 -0
  386. package/integration-data/trello/schemas/empty.json +5 -0
  387. package/integration-data/trello/schemas/get_member.json +5 -0
  388. package/integration-data/trello/schemas/id_board.json +8 -0
  389. package/integration-data/trello/schemas/id_card.json +8 -0
  390. package/integration-data/trello/schemas/id_list.json +8 -0
  391. package/integration-data/trello/schemas/id_org.json +8 -0
  392. package/integration-data/trello/schemas/move_card_to_list.json +10 -0
  393. package/integration-data/trello/schemas/remove_member_from_card.json +10 -0
  394. package/integration-data/trello/schemas/search.json +8 -0
  395. package/integration-data/trello/schemas/update_card.json +16 -0
  396. package/integration-data/trello/schemas/update_list.json +12 -0
  397. package/package.json +61 -0
@@ -0,0 +1,9 @@
1
+ {
2
+ "type": "object",
3
+ "properties": {
4
+ "calendarId": { "type": "string" },
5
+ "text": { "type": "string", "description": "Natural language event text" }
6
+ },
7
+ "required": ["calendarId", "text"],
8
+ "additionalProperties": false
9
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "type": "object",
3
+ "properties": {
4
+ "calendarId": { "type": "string" },
5
+ "ruleId": { "type": "string" },
6
+ "role": { "type": "string", "enum": ["none", "freeBusyReader", "reader", "writer", "owner"] }
7
+ },
8
+ "required": ["calendarId", "ruleId", "role"],
9
+ "additionalProperties": false
10
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "type": "object",
3
+ "properties": {
4
+ "calendarId": { "type": "string" },
5
+ "eventId": { "type": "string" },
6
+ "body": { "type": "object" }
7
+ },
8
+ "required": ["calendarId", "eventId", "body"],
9
+ "additionalProperties": false
10
+ }
@@ -0,0 +1,36 @@
1
+ {
2
+ "schema": {
3
+ "type": "object",
4
+ "properties": {
5
+ "token": {
6
+ "type": "string",
7
+ "title": "OAuth Access Token (optional)",
8
+ "description": "Google OAuth access token to use as a Bearer token (typically short-lived)."
9
+ },
10
+ "serviceAccountJson": {
11
+ "type": "string",
12
+ "title": "Service Account JSON (recommended)",
13
+ "description": "Full service account key JSON (contents of the downloaded JSON file)."
14
+ },
15
+ "subject": {
16
+ "type": "string",
17
+ "title": "Subject / impersonated user (optional)",
18
+ "description": "Optional user email to impersonate when using Google Workspace domain-wide delegation."
19
+ },
20
+ "scopes": {
21
+ "type": "array",
22
+ "title": "OAuth scopes (optional)",
23
+ "description": "Optional override for OAuth scopes.",
24
+ "items": { "type": "string" }
25
+ }
26
+ },
27
+ "required": [],
28
+ "additionalProperties": false
29
+ },
30
+ "injection": {
31
+ "headers": {
32
+ "Authorization": "Bearer {{token}}"
33
+ }
34
+ }
35
+ }
36
+
@@ -0,0 +1,9 @@
1
+ Recommended: use a Google service account.
2
+
3
+ - Create a service account in Google Cloud
4
+ - Download a JSON key
5
+ - Paste the JSON into `serviceAccountJson` (or use `env:GOOGLE_SERVICE_ACCOUNT_JSON`)
6
+ - Share your test document with the service account `client_email`
7
+
8
+ You can also paste a short-lived OAuth access token into `token`, but it will expire.
9
+
@@ -0,0 +1,12 @@
1
+ async (input) => {
2
+ const { documentId, text } = input
3
+ // Get doc to find end index
4
+ const metaRes = await integration.fetch(`/documents/${encodeURIComponent(documentId)}`)
5
+ const meta = await metaRes.json()
6
+ const endIndex = meta?.body?.content?.[meta.body.content.length - 1]?.endIndex || 1
7
+ const res = await integration.fetch(`/documents/${encodeURIComponent(documentId)}:batchUpdate`, {
8
+ method: 'POST',
9
+ body: { requests: [{ insertText: { text, location: { index: endIndex - 1 } } }] },
10
+ })
11
+ return await res.json()
12
+ }
@@ -0,0 +1,13 @@
1
+ async (input) => {
2
+ const { documentId, requests, writeControl, includeTabStops } = input
3
+ const params = new URLSearchParams()
4
+ if (includeTabStops !== undefined)
5
+ params.set('includeTabStops', String(includeTabStops))
6
+ const qs = params.toString()
7
+ const path = `/documents/${encodeURIComponent(documentId)}:batchUpdate${qs ? `?${qs}` : ''}`
8
+ const body = { requests }
9
+ if (writeControl)
10
+ body.writeControl = writeControl
11
+ const res = await integration.fetch(path, { method: 'POST', body })
12
+ return await res.json()
13
+ }
@@ -0,0 +1,9 @@
1
+ async (input) => {
2
+ const { title, ...rest } = input
3
+ const body = {}
4
+ if (title !== undefined)
5
+ body.title = title
6
+ Object.assign(body, rest)
7
+ const res = await integration.fetch(`/documents`, { method: 'POST', body })
8
+ return await res.json()
9
+ }
@@ -0,0 +1,50 @@
1
+ async (input) => {
2
+ const { documentId, findText } = input
3
+ const marker = `__CMD_MARK_${Date.now()}__`
4
+ const replaceRes = await integration.fetch(`/documents/${encodeURIComponent(documentId)}:batchUpdate`, {
5
+ method: 'POST',
6
+ body: { requests: [{ replaceAllText: { containsText: { text: findText, matchCase: false }, replaceText: marker } }] },
7
+ })
8
+ await replaceRes.json()
9
+
10
+ const getRes = await integration.fetch(`/documents/${encodeURIComponent(documentId)}`)
11
+ const doc = await getRes.json()
12
+ let startIndex = -1
13
+ let endIndex = -1
14
+ for (const el of (doc?.body?.content || [])) {
15
+ const p = el.paragraph
16
+ if (!p)
17
+ continue
18
+ for (const e of (p.elements || [])) {
19
+ const t = e?.textRun?.content
20
+ if (!t)
21
+ continue
22
+ const idx = t.indexOf(marker)
23
+ if (idx >= 0) {
24
+ const elStart = e.startIndex || 1
25
+ startIndex = elStart + idx
26
+ endIndex = startIndex + marker.length
27
+ break
28
+ }
29
+ }
30
+ if (startIndex >= 0)
31
+ break
32
+ }
33
+ if (startIndex < 0) {
34
+ const confirm = await integration.fetch(`/documents/${encodeURIComponent(documentId)}`)
35
+ const got = await confirm.json()
36
+ return { documentId: got?.documentId || documentId, applied: false, replies: [] }
37
+ }
38
+
39
+ const requests = []
40
+ requests.push({ deleteContentRange: { range: { startIndex, endIndex } } })
41
+ // also clean any remaining markers
42
+ requests.push({ replaceAllText: { containsText: { text: marker, matchCase: true }, replaceText: '' } })
43
+ const res = await integration.fetch(`/documents/${encodeURIComponent(documentId)}:batchUpdate`, { method: 'POST', body: { requests } })
44
+ const out = await res.json()
45
+ if (out?.documentId || Array.isArray(out?.replies))
46
+ return { ...out, applied: true }
47
+ const confirm = await integration.fetch(`/documents/${encodeURIComponent(documentId)}`)
48
+ const got = await confirm.json()
49
+ return { documentId: got?.documentId || documentId, applied: true, replies: Array.isArray(out?.replies) ? out.replies : [] }
50
+ }
@@ -0,0 +1,12 @@
1
+ async (input) => {
2
+ const { documentId, suggestionsViewMode, includeTabsAndSpaces } = input
3
+ const params = new URLSearchParams()
4
+ if (suggestionsViewMode)
5
+ params.set('suggestionsViewMode', String(suggestionsViewMode))
6
+ if (includeTabsAndSpaces !== undefined)
7
+ params.set('includeTabsAndSpaces', String(includeTabsAndSpaces))
8
+ const qs = params.toString()
9
+ const path = `/documents/${encodeURIComponent(documentId)}${qs ? `?${qs}` : ''}`
10
+ const res = await integration.fetch(path)
11
+ return await res.json()
12
+ }
@@ -0,0 +1,6 @@
1
+ async (input) => {
2
+ const { documentId } = input
3
+ const res = await integration.fetch(`/documents/${encodeURIComponent(documentId)}`)
4
+ const doc = await res.json()
5
+ return { documentId: doc?.documentId || documentId, body: doc?.body }
6
+ }
@@ -0,0 +1,17 @@
1
+ async (input) => {
2
+ const { documentId } = input
3
+ const res = await integration.fetch(`/documents/${encodeURIComponent(documentId)}`)
4
+ const doc = await res.json()
5
+ const content = doc?.body?.content || []
6
+ let text = ''
7
+ for (const el of content) {
8
+ const paragraphs = el.paragraph ? [el.paragraph] : []
9
+ for (const p of paragraphs) {
10
+ for (const e of p.elements || []) {
11
+ text += e.textRun?.content || ''
12
+ }
13
+ text += '\n'
14
+ }
15
+ }
16
+ return { documentId: doc?.documentId || documentId, text }
17
+ }
@@ -0,0 +1,41 @@
1
+ async (input) => {
2
+ const { documentId, findText, uri, altText, position } = input
3
+ const marker = `__CMD_MARK_${Date.now()}__`
4
+ const replaceRes = await integration.fetch(`/documents/${encodeURIComponent(documentId)}:batchUpdate`, {
5
+ method: 'POST',
6
+ body: { requests: [{ replaceAllText: { containsText: { text: findText, matchCase: false }, replaceText: marker } }] },
7
+ })
8
+ await replaceRes.json()
9
+
10
+ const getRes = await integration.fetch(`/documents/${encodeURIComponent(documentId)}`)
11
+ const doc = await getRes.json()
12
+ let baseIndex = -1
13
+ for (const el of (doc?.body?.content || [])) {
14
+ const p = el.paragraph
15
+ if (!p)
16
+ continue
17
+ for (const e of (p.elements || [])) {
18
+ const t = e?.textRun?.content
19
+ if (!t)
20
+ continue
21
+ const idx = t.indexOf(marker)
22
+ if (idx >= 0) {
23
+ const elStart = e.startIndex || 1
24
+ const startIndex = elStart + idx
25
+ const endIndex = startIndex + marker.length
26
+ baseIndex = position === 'before' ? startIndex : endIndex
27
+ break
28
+ }
29
+ }
30
+ if (baseIndex >= 0)
31
+ break
32
+ }
33
+ if (baseIndex < 0)
34
+ return { ok: true }
35
+
36
+ const requests = []
37
+ requests.push({ insertInlineImage: { location: { index: baseIndex }, uri, altTextTitle: altText } })
38
+ requests.push({ replaceAllText: { containsText: { text: marker, matchCase: true }, replaceText: findText } })
39
+ const res = await integration.fetch(`/documents/${encodeURIComponent(documentId)}:batchUpdate`, { method: 'POST', body: { requests } })
40
+ return await res.json()
41
+ }
@@ -0,0 +1,49 @@
1
+ async (input) => {
2
+ const { documentId, findText, position } = input
3
+ const marker = `__CMD_MARK_${Date.now()}__`
4
+ const replaceRes = await integration.fetch(`/documents/${encodeURIComponent(documentId)}:batchUpdate`, {
5
+ method: 'POST',
6
+ body: { requests: [{ replaceAllText: { containsText: { text: findText, matchCase: false }, replaceText: marker } }] },
7
+ })
8
+ await replaceRes.json()
9
+
10
+ const getRes = await integration.fetch(`/documents/${encodeURIComponent(documentId)}`)
11
+ const doc = await getRes.json()
12
+ let baseIndex = -1
13
+ for (const el of (doc?.body?.content || [])) {
14
+ const p = el.paragraph
15
+ if (!p)
16
+ continue
17
+ for (const e of (p.elements || [])) {
18
+ const t = e?.textRun?.content
19
+ if (!t)
20
+ continue
21
+ const idx = t.indexOf(marker)
22
+ if (idx >= 0) {
23
+ const elStart = e.startIndex || 1
24
+ const startIndex = elStart + idx
25
+ const endIndex = startIndex + marker.length
26
+ baseIndex = position === 'before' ? startIndex : endIndex
27
+ break
28
+ }
29
+ }
30
+ if (baseIndex >= 0)
31
+ break
32
+ }
33
+ if (baseIndex < 0) {
34
+ const confirm = await integration.fetch(`/documents/${encodeURIComponent(documentId)}`)
35
+ const got = await confirm.json()
36
+ return { documentId: got?.documentId || documentId, applied: false, replies: [] }
37
+ }
38
+
39
+ const requests = []
40
+ requests.push({ insertPageBreak: { location: { index: baseIndex } } })
41
+ requests.push({ replaceAllText: { containsText: { text: marker, matchCase: true }, replaceText: findText } })
42
+ const res = await integration.fetch(`/documents/${encodeURIComponent(documentId)}:batchUpdate`, { method: 'POST', body: { requests } })
43
+ const out = await res.json()
44
+ if (out?.documentId || Array.isArray(out?.replies))
45
+ return { ...out, applied: true }
46
+ const confirm = await integration.fetch(`/documents/${encodeURIComponent(documentId)}`)
47
+ const got = await confirm.json()
48
+ return { documentId: got?.documentId || documentId, applied: true, replies: Array.isArray(out?.replies) ? out.replies : [] }
49
+ }
@@ -0,0 +1,49 @@
1
+ async (input) => {
2
+ const { documentId, findText, rows, columns, position } = input
3
+ const marker = `__CMD_MARK_${Date.now()}__`
4
+ const replaceRes = await integration.fetch(`/documents/${encodeURIComponent(documentId)}:batchUpdate`, {
5
+ method: 'POST',
6
+ body: { requests: [{ replaceAllText: { containsText: { text: findText, matchCase: false }, replaceText: marker } }] },
7
+ })
8
+ await replaceRes.json()
9
+
10
+ const getRes = await integration.fetch(`/documents/${encodeURIComponent(documentId)}`)
11
+ const doc = await getRes.json()
12
+ let baseIndex = -1
13
+ for (const el of (doc?.body?.content || [])) {
14
+ const p = el.paragraph
15
+ if (!p)
16
+ continue
17
+ for (const e of (p.elements || [])) {
18
+ const t = e?.textRun?.content
19
+ if (!t)
20
+ continue
21
+ const idx = t.indexOf(marker)
22
+ if (idx >= 0) {
23
+ const elStart = e.startIndex || 1
24
+ const startIndex = elStart + idx
25
+ const endIndex = startIndex + marker.length
26
+ baseIndex = position === 'before' ? startIndex : endIndex
27
+ break
28
+ }
29
+ }
30
+ if (baseIndex >= 0)
31
+ break
32
+ }
33
+ if (baseIndex < 0) {
34
+ const confirm = await integration.fetch(`/documents/${encodeURIComponent(documentId)}`)
35
+ const got = await confirm.json()
36
+ return { documentId: got?.documentId || documentId, applied: false, replies: [] }
37
+ }
38
+
39
+ const requests = []
40
+ requests.push({ insertTable: { location: { index: baseIndex }, rows, columns } })
41
+ requests.push({ replaceAllText: { containsText: { text: marker, matchCase: true }, replaceText: findText } })
42
+ const res = await integration.fetch(`/documents/${encodeURIComponent(documentId)}:batchUpdate`, { method: 'POST', body: { requests } })
43
+ const out = await res.json()
44
+ if (out?.documentId || Array.isArray(out?.replies))
45
+ return { ...out, applied: true }
46
+ const confirm = await integration.fetch(`/documents/${encodeURIComponent(documentId)}`)
47
+ const got = await confirm.json()
48
+ return { documentId: got?.documentId || documentId, applied: true, replies: Array.isArray(out?.replies) ? out.replies : [] }
49
+ }
@@ -0,0 +1,51 @@
1
+ async (input) => {
2
+ const { documentId, findText, insertText, position } = input
3
+ const marker = `__CMD_MARK_${Date.now()}__`
4
+ // Replace first occurrence by marker only (simulate single by replacing all, then revert later to first span)
5
+ const replaceRes = await integration.fetch(`/documents/${encodeURIComponent(documentId)}:batchUpdate`, {
6
+ method: 'POST',
7
+ body: { requests: [{ replaceAllText: { containsText: { text: findText, matchCase: false }, replaceText: marker } }] },
8
+ })
9
+ await replaceRes.json()
10
+
11
+ const getRes = await integration.fetch(`/documents/${encodeURIComponent(documentId)}`)
12
+ const doc = await getRes.json()
13
+ let insertIndex = -1
14
+ for (const el of (doc?.body?.content || [])) {
15
+ const p = el.paragraph
16
+ if (!p)
17
+ continue
18
+ for (const e of (p.elements || [])) {
19
+ const t = e?.textRun?.content
20
+ if (!t)
21
+ continue
22
+ const idx = t.indexOf(marker)
23
+ if (idx >= 0) {
24
+ const elStart = e.startIndex || 1
25
+ const startIndex = elStart + idx
26
+ const endIndex = startIndex + marker.length
27
+ insertIndex = position === 'before' ? startIndex : endIndex
28
+ break
29
+ }
30
+ }
31
+ if (insertIndex >= 0)
32
+ break
33
+ }
34
+ if (insertIndex < 0) {
35
+ const confirm = await integration.fetch(`/documents/${encodeURIComponent(documentId)}`)
36
+ const got = await confirm.json()
37
+ return { documentId: got?.documentId || documentId, applied: false, replies: [] }
38
+ }
39
+
40
+ const requests = []
41
+ requests.push({ insertText: { text: insertText, location: { index: insertIndex } } })
42
+ // restore marker back to original findText everywhere
43
+ requests.push({ replaceAllText: { containsText: { text: marker, matchCase: true }, replaceText: findText } })
44
+ const res = await integration.fetch(`/documents/${encodeURIComponent(documentId)}:batchUpdate`, { method: 'POST', body: { requests } })
45
+ const out = await res.json()
46
+ if (out?.documentId || Array.isArray(out?.replies))
47
+ return { ...out, applied: true }
48
+ const confirm = await integration.fetch(`/documents/${encodeURIComponent(documentId)}`)
49
+ const got = await confirm.json()
50
+ return { documentId: got?.documentId || documentId, applied: true, replies: Array.isArray(out?.replies) ? out.replies : [] }
51
+ }
@@ -0,0 +1,8 @@
1
+ async (input) => {
2
+ const { documentId, findText, replaceText, matchCase } = input
3
+ const res = await integration.fetch(`/documents/${encodeURIComponent(documentId)}:batchUpdate`, {
4
+ method: 'POST',
5
+ body: { requests: [{ replaceAllText: { containsText: { text: findText, matchCase: Boolean(matchCase) }, replaceText } }] },
6
+ })
7
+ return await res.json()
8
+ }
@@ -0,0 +1,42 @@
1
+ async (input) => {
2
+ const { documentId, findText, textStyle, fields } = input
3
+ // 1) Find first match via replaceAllText with unique marker
4
+ const marker = `__CMD_MARK_${Date.now()}__`
5
+ const replaceRes = await integration.fetch(`/documents/${encodeURIComponent(documentId)}:batchUpdate`, {
6
+ method: 'POST',
7
+ body: { requests: [{ replaceAllText: { containsText: { text: findText, matchCase: false }, replaceText: marker } }] },
8
+ })
9
+ const rep = await replaceRes.json()
10
+ // 2) Get doc, locate marker, compute indices
11
+ const getRes = await integration.fetch(`/documents/${encodeURIComponent(documentId)}`)
12
+ const doc = await getRes.json()
13
+ let startIndex = -1
14
+ let endIndex = -1
15
+ for (const el of (doc?.body?.content || [])) {
16
+ const p = el.paragraph
17
+ if (!p)
18
+ continue
19
+ for (const e of (p.elements || [])) {
20
+ const t = e?.textRun?.content
21
+ if (!t)
22
+ continue
23
+ const idx = t.indexOf(marker)
24
+ if (idx >= 0) {
25
+ const elStart = e.startIndex || 1
26
+ startIndex = elStart + idx
27
+ endIndex = startIndex + marker.length
28
+ break
29
+ }
30
+ }
31
+ if (startIndex >= 0)
32
+ break
33
+ }
34
+ if (startIndex < 0)
35
+ return rep
36
+ // 3) Apply style and restore original text
37
+ const requests = []
38
+ requests.push({ updateTextStyle: { range: { startIndex, endIndex }, textStyle, fields: fields || Object.keys(textStyle || {}).join(',') } })
39
+ requests.push({ replaceAllText: { containsText: { text: marker, matchCase: true }, replaceText: findText } })
40
+ const res = await integration.fetch(`/documents/${encodeURIComponent(documentId)}:batchUpdate`, { method: 'POST', body: { requests } })
41
+ return await res.json()
42
+ }
@@ -0,0 +1,8 @@
1
+ async (input) => {
2
+ const { documentId, documentStyle, fields } = input
3
+ const res = await integration.fetch(`/documents/${encodeURIComponent(documentId)}:batchUpdate`, {
4
+ method: 'POST',
5
+ body: { requests: [{ updateDocumentStyle: { documentStyle, fields: fields || Object.keys(documentStyle || {}).join(',') } }] },
6
+ })
7
+ return await res.json()
8
+ }
@@ -0,0 +1,48 @@
1
+ async (input) => {
2
+ const { documentId, findText, paragraphStyle, fields } = input
3
+ const marker = `__CMD_MARK_${Date.now()}__`
4
+ const replaceRes = await integration.fetch(`/documents/${encodeURIComponent(documentId)}:batchUpdate`, {
5
+ method: 'POST',
6
+ body: { requests: [{ replaceAllText: { containsText: { text: findText, matchCase: false }, replaceText: marker } }] },
7
+ })
8
+ await replaceRes.json()
9
+
10
+ const getRes = await integration.fetch(`/documents/${encodeURIComponent(documentId)}`)
11
+ const doc = await getRes.json()
12
+ let paragraphStart = -1
13
+ let paragraphEnd = -1
14
+ for (const el of (doc?.body?.content || [])) {
15
+ const p = el.paragraph
16
+ if (!p)
17
+ continue
18
+ for (const e of (p.elements || [])) {
19
+ const t = e?.textRun?.content
20
+ if (!t)
21
+ continue
22
+ const idx = t.indexOf(marker)
23
+ if (idx >= 0) {
24
+ paragraphStart = p.elements?.[0]?.startIndex || e.startIndex || 1
25
+ paragraphEnd = (p.elements?.[p.elements.length - 1]?.endIndex) || (e.endIndex) || (paragraphStart + marker.length)
26
+ break
27
+ }
28
+ }
29
+ if (paragraphStart >= 0)
30
+ break
31
+ }
32
+ if (paragraphStart < 0) {
33
+ const confirm = await integration.fetch(`/documents/${encodeURIComponent(documentId)}`)
34
+ const got = await confirm.json()
35
+ return { documentId: got?.documentId || documentId, applied: false, replies: [] }
36
+ }
37
+
38
+ const requests = []
39
+ requests.push({ updateParagraphStyle: { range: { startIndex: paragraphStart, endIndex: paragraphEnd }, paragraphStyle, fields: fields || Object.keys(paragraphStyle || {}).join(',') } })
40
+ requests.push({ replaceAllText: { containsText: { text: marker, matchCase: true }, replaceText: findText } })
41
+ const res = await integration.fetch(`/documents/${encodeURIComponent(documentId)}:batchUpdate`, { method: 'POST', body: { requests } })
42
+ const out = await res.json()
43
+ if (out?.documentId || Array.isArray(out?.replies))
44
+ return { ...out, applied: true }
45
+ const confirm = await integration.fetch(`/documents/${encodeURIComponent(documentId)}`)
46
+ const got = await confirm.json()
47
+ return { documentId: got?.documentId || documentId, applied: true, replies: Array.isArray(out?.replies) ? out.replies : [] }
48
+ }
@@ -0,0 +1,58 @@
1
+ {
2
+ "name": "google-docs",
3
+ "version": "0.1.0",
4
+ "tools": [
5
+ {
6
+ "name": "get_document",
7
+ "description": "Retrieve Google Doc content and metadata.",
8
+ "inputSchema": "schemas/get_document.json",
9
+ "handler": "handlers/get_document.js",
10
+ "scope": "read"
11
+ },
12
+ {
13
+ "name": "get_document_text",
14
+ "description": "Retrieve the document's plain text content.",
15
+ "inputSchema": "schemas/get_document_text.json",
16
+ "handler": "handlers/get_document_text.js",
17
+ "scope": "read"
18
+ },
19
+ {
20
+ "name": "get_document_structured",
21
+ "description": "Retrieve the structured body JSON (body.content).",
22
+ "inputSchema": "schemas/get_document_structured.json",
23
+ "handler": "handlers/get_document_structured.js",
24
+ "scope": "read"
25
+ },
26
+ {
27
+ "name": "create_document",
28
+ "description": "Create a new Google Doc.",
29
+ "inputSchema": "schemas/create_document.json",
30
+ "handler": "handlers/create_document.js",
31
+ "scope": "write"
32
+ },
33
+ {
34
+ "name": "batch_update",
35
+ "description": "Send a documents.batchUpdate request to modify a Doc (insertText, replaceAllText, structural updates, etc).",
36
+ "inputSchema": "schemas/batch_update.json",
37
+ "handler": "handlers/batch_update.js",
38
+ "scope": "write"
39
+ },
40
+ { "name": "append_text", "description": "Append plain text to the end of the document.", "inputSchema": "schemas/append_text.json", "handler": "handlers/append_text.js", "scope": "write" },
41
+ { "name": "replace_all_text", "description": "Replace all occurrences of text matching a query.", "inputSchema": "schemas/replace_all_text.json", "handler": "handlers/replace_all_text.js", "scope": "write" },
42
+
43
+ { "name": "style_first_match", "description": "Find the first occurrence of text and apply a TextStyle to it.", "inputSchema": "schemas/style_first_match.json", "handler": "handlers/style_first_match.js", "scope": "write" },
44
+ { "name": "insert_text_after_first_match", "description": "Find the first occurrence of text and insert new text after or before it.", "inputSchema": "schemas/insert_text_after_first_match.json", "handler": "handlers/insert_text_after_first_match.js", "scope": "write" },
45
+ { "name": "insert_table_after_first_match", "description": "Find the first occurrence of text and insert a table nearby.", "inputSchema": "schemas/insert_table_after_first_match.json", "handler": "handlers/insert_table_after_first_match.js", "scope": "write" },
46
+ { "name": "insert_page_break_after_first_match", "description": "Find the first occurrence of text and insert a page break nearby.", "inputSchema": "schemas/insert_page_break_after_first_match.json", "handler": "handlers/insert_page_break_after_first_match.js", "scope": "write" },
47
+ { "name": "insert_inline_image_after_first_match", "description": "Find the first occurrence of text and insert an inline image nearby.", "inputSchema": "schemas/insert_inline_image_after_first_match.json", "handler": "handlers/insert_inline_image_after_first_match.js", "scope": "write" },
48
+ { "name": "delete_first_match", "description": "Find the first occurrence of text and delete it.", "inputSchema": "schemas/delete_first_match.json", "handler": "handlers/delete_first_match.js", "scope": "write" },
49
+ { "name": "update_paragraph_style_for_first_match", "description": "Find the first occurrence of text and update the paragraph style for that paragraph.", "inputSchema": "schemas/update_paragraph_style_for_first_match.json", "handler": "handlers/update_paragraph_style_for_first_match.js", "scope": "write" },
50
+ {
51
+ "name": "update_document_style",
52
+ "description": "Update the document style (e.g., page size, margins).",
53
+ "inputSchema": "schemas/update_document_style.json",
54
+ "handler": "handlers/update_document_style.js",
55
+ "scope": "write"
56
+ }
57
+ ]
58
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "type": "object",
4
+ "properties": {
5
+ "documentId": { "type": "string" },
6
+ "text": { "type": "string" }
7
+ },
8
+ "required": ["documentId", "text"],
9
+ "additionalProperties": false
10
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "type": "object",
4
+ "properties": {
5
+ "documentId": { "type": "string" },
6
+ "startIndex": { "type": "number", "minimum": 1 },
7
+ "endIndex": { "type": "number", "minimum": 1 },
8
+ "textStyle": { "type": "object", "description": "Docs API TextStyle object, e.g., { bold: true }" },
9
+ "fields": { "type": "string", "description": "Fields mask for update, e.g., 'bold,italic'" }
10
+ },
11
+ "required": ["documentId", "startIndex", "endIndex", "textStyle"],
12
+ "additionalProperties": false
13
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "type": "object",
4
+ "properties": {
5
+ "documentId": { "type": "string", "description": "The document ID of the Google Doc." },
6
+ "requests": {
7
+ "type": "array",
8
+ "description": "Array of Docs API requests (insertText, updateParagraphStyle, replaceAllText, etc).",
9
+ "items": { "type": "object" }
10
+ },
11
+ "writeControl": { "type": "object", "description": "Write control to ensure idempotency (requiredRevisionId, targetRevisionId)." },
12
+ "includeTabStops": { "type": "boolean", "description": "Include tab stops in responses where applicable." }
13
+ },
14
+ "required": ["documentId", "requests"],
15
+ "additionalProperties": true
16
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "type": "object",
4
+ "properties": {
5
+ "title": { "type": "string", "description": "Title for the new document." }
6
+ },
7
+ "additionalProperties": true
8
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "type": "object",
4
+ "properties": {
5
+ "documentId": { "type": "string" },
6
+ "startIndex": { "type": "number", "minimum": 1 },
7
+ "endIndex": { "type": "number", "minimum": 1 }
8
+ },
9
+ "required": ["documentId", "startIndex", "endIndex"],
10
+ "additionalProperties": false
11
+ }