@jini-ai/agent-plugins 0.6.17 → 0.6.19

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 (335) hide show
  1. package/CHANGELOG.md +29 -1
  2. package/NOTICE +14 -0
  3. package/README.md +35 -14
  4. package/charts-echarts/plugin.json +39 -0
  5. package/charts-echarts/skills/charts-echarts/SKILL.md +110 -0
  6. package/charts-recharts/plugin.json +32 -0
  7. package/charts-recharts/skills/charts-recharts/SKILL.md +108 -0
  8. package/cloudflare/NOTES.md +16 -0
  9. package/cloudflare/form-destinations/cloudflare-d1.mjs +9 -0
  10. package/cloudflare/lib/api.mjs +96 -0
  11. package/cloudflare/lib/assets.mjs +65 -0
  12. package/cloudflare/lib/dns.mjs +32 -0
  13. package/cloudflare/lib/domain-inventory.mjs +61 -0
  14. package/cloudflare/lib/domain-status.mjs +48 -0
  15. package/cloudflare/lib/domains.mjs +95 -0
  16. package/cloudflare/lib/forms.mjs +254 -0
  17. package/cloudflare/lib/pages-upload.mjs +51 -0
  18. package/cloudflare/lib/target.mjs +165 -0
  19. package/cloudflare/lib/workers-upload.mjs +48 -0
  20. package/cloudflare/lib/zones.mjs +25 -0
  21. package/cloudflare/mcp.json +4 -0
  22. package/cloudflare/plugin.json +96 -0
  23. package/cloudflare/skills/cloudflare/SKILL.md +57 -0
  24. package/cloudflare/skills/cloudflare/references/domains.md +31 -0
  25. package/cloudflare/skills/cloudflare/references/pages.md +18 -0
  26. package/cloudflare/skills/cloudflare/references/permissions.md +29 -0
  27. package/cloudflare/skills/cloudflare/references/troubleshooting.md +20 -0
  28. package/cloudflare/skills/cloudflare/references/workers.md +42 -0
  29. package/cloudflare/targets/cloudflare-pages.mjs +12 -0
  30. package/cloudflare/targets/cloudflare-workers.mjs +17 -0
  31. package/cloudflare/tovu-consent.json +6 -0
  32. package/cloudflare/tovu-deploy-targets.json +630 -0
  33. package/cloudflare/tovu-form-destinations.json +12 -0
  34. package/cloudflare/worker/forms-receiver.mjs +249 -0
  35. package/composio/mcp.json +10 -0
  36. package/composio/plugin.json +68 -0
  37. package/composio/skills/composio/SKILL.md +85 -0
  38. package/dist/core/identity-namespace.d.ts +12 -0
  39. package/dist/core/identity-namespace.js +20 -0
  40. package/dist/folder-zip-node.js +29 -7
  41. package/dist/lifecycle/bundled-digests.js +4 -3
  42. package/dist/lifecycle/install.d.ts +7 -0
  43. package/dist/lifecycle/install.js +45 -3
  44. package/dist/lifecycle/manifest.d.ts +2 -2
  45. package/dist/lifecycle/manifest.js +5 -3
  46. package/dist/lifecycle/node.js +2 -0
  47. package/dist/lifecycle/persistent-state.js +1 -1
  48. package/dist/lifecycle/ports.d.ts +8 -0
  49. package/dist/lifecycle/seed-bundled.js +4 -1
  50. package/dist/manifest.d.ts +1 -1
  51. package/dist/manifest.js +3 -2
  52. package/fly/deploy-configs/fly.mjs +115 -0
  53. package/fly/deploy-ops/fly.mjs +102 -0
  54. package/fly/mcp.json +4 -0
  55. package/fly/plugin.json +81 -0
  56. package/fly/scripts/render-deploy-workflow.mjs +150 -0
  57. package/fly/skills/fly/SKILL.md +43 -0
  58. package/fly/skills/fly/references/fly-deploy.template.yml +117 -0
  59. package/fly/skills/fly/references/fly.template.toml +81 -0
  60. package/fly/tovu-credential-schemes.json +11 -0
  61. package/fly/tovu-deploy-configs.json +21 -0
  62. package/fly/tovu-deploy-ops.json +14 -0
  63. package/github/deploy-ops/github-actions.mjs +164 -0
  64. package/github/deployments/github.mjs +415 -0
  65. package/github/mcp.json +4 -0
  66. package/github/plugin.json +105 -0
  67. package/github/skills/github/SKILL.md +249 -0
  68. package/github/skills/github/references/actions.md +224 -0
  69. package/github/skills/github/references/auth-and-tokens.md +140 -0
  70. package/github/skills/github/references/repo-files.md +135 -0
  71. package/github/skills/github/references/site-backup.md +159 -0
  72. package/github/skills/github/references/source-control.md +123 -0
  73. package/github/source-control/backup-push.mjs +242 -0
  74. package/github/source-control/commit-site.mjs +459 -0
  75. package/github/source-control/github.mjs +93 -0
  76. package/github/source-control/write-files.mjs +468 -0
  77. package/github/tovu-deploy-ops.json +13 -0
  78. package/github/tovu-source-control.json +117 -0
  79. package/github-pages/NOTES.md +19 -0
  80. package/github-pages/mcp.json +4 -0
  81. package/github-pages/plugin.json +48 -0
  82. package/github-pages/skills/github-pages/SKILL.md +44 -0
  83. package/github-pages/targets/github-pages.mjs +543 -0
  84. package/github-pages/tovu-deploy-targets.json +327 -0
  85. package/google-login/exports/google-g.svg +1 -0
  86. package/google-login/exports/sign-in-button.css +68 -0
  87. package/google-login/exports/sign-in-button.html +4 -0
  88. package/google-login/mcp.json +4 -0
  89. package/google-login/plugin.json +59 -0
  90. package/google-login/skills/google-login/SKILL.md +96 -0
  91. package/google-login/tovu-login-providers.json +21 -0
  92. package/google-workspace/README.md +132 -0
  93. package/google-workspace/form-destinations/README.md +87 -0
  94. package/google-workspace/form-destinations/dedupe.mjs +43 -0
  95. package/google-workspace/form-destinations/delivery-result.mjs +69 -0
  96. package/google-workspace/form-destinations/mapping.mjs +152 -0
  97. package/google-workspace/form-destinations/sheets.mjs +202 -0
  98. package/google-workspace/lib/auth.mjs +81 -0
  99. package/google-workspace/lib/drive-files.mjs +54 -0
  100. package/google-workspace/lib/form-destination-settings.mjs +72 -0
  101. package/google-workspace/lib/http.mjs +168 -0
  102. package/google-workspace/lib/picker-flow.mjs +171 -0
  103. package/google-workspace/lib/picker-selection.mjs +107 -0
  104. package/google-workspace/lib/product-state.mjs +93 -0
  105. package/google-workspace/lib/request-policy.mjs +163 -0
  106. package/google-workspace/lib/sheets-a1.mjs +79 -0
  107. package/google-workspace/lib/sheets-admin-csv.mjs +82 -0
  108. package/google-workspace/lib/sheets-admin-request-kinds.mjs +183 -0
  109. package/google-workspace/lib/sheets-client.mjs +286 -0
  110. package/google-workspace/lib/surface-actions.mjs +107 -0
  111. package/google-workspace/mcp.json +4 -0
  112. package/google-workspace/plugin.json +77 -0
  113. package/google-workspace/products.json +12 -0
  114. package/google-workspace/skills/google-workspace/SKILL.md +82 -0
  115. package/google-workspace/skills/google-workspace/references/connection.md +102 -0
  116. package/google-workspace/skills/google-workspace/references/form-delivery.md +50 -0
  117. package/google-workspace/skills/google-workspace/references/sheets.md +149 -0
  118. package/google-workspace/skills/google-workspace/references/troubleshooting.md +31 -0
  119. package/google-workspace/tools/account-info.mjs +18 -0
  120. package/google-workspace/tools/sheets/README.md +54 -0
  121. package/google-workspace/tools/sheets/copy-tab.mjs +23 -0
  122. package/google-workspace/tools/sheets/copy.mjs +23 -0
  123. package/google-workspace/tools/sheets/create.mjs +35 -0
  124. package/google-workspace/tools/sheets/find-replace.mjs +38 -0
  125. package/google-workspace/tools/sheets/find.mjs +52 -0
  126. package/google-workspace/tools/sheets/get-by-data-filter.mjs +23 -0
  127. package/google-workspace/tools/sheets/get.mjs +22 -0
  128. package/google-workspace/tools/sheets/values-append.mjs +27 -0
  129. package/google-workspace/tools/sheets/values-batch-clear.mjs +20 -0
  130. package/google-workspace/tools/sheets/values-batch-get.mjs +20 -0
  131. package/google-workspace/tools/sheets/values-batch-update.mjs +29 -0
  132. package/google-workspace/tools/sheets/values-by-data-filter.mjs +62 -0
  133. package/google-workspace/tools/sheets/values-clear.mjs +20 -0
  134. package/google-workspace/tools/sheets/values-get.mjs +21 -0
  135. package/google-workspace/tools/sheets/values-update.mjs +26 -0
  136. package/google-workspace/tools/sheets-admin/README.md +45 -0
  137. package/google-workspace/tools/sheets-admin/basic-filter.mjs +32 -0
  138. package/google-workspace/tools/sheets-admin/batch-update.mjs +25 -0
  139. package/google-workspace/tools/sheets-admin/developer-metadata.mjs +28 -0
  140. package/google-workspace/tools/sheets-admin/export-csv.mjs +67 -0
  141. package/google-workspace/tools/sheets-admin/filter-views.mjs +38 -0
  142. package/google-workspace/tools/sheets-admin/format.mjs +70 -0
  143. package/google-workspace/tools/sheets-admin/named-ranges.mjs +42 -0
  144. package/google-workspace/tools/sheets-admin/open-existing.mjs +34 -0
  145. package/google-workspace/tools/sheets-admin/protected-ranges-get.mjs +18 -0
  146. package/google-workspace/tools/sheets-admin/sort.mjs +18 -0
  147. package/google-workspace/tools/sheets-admin/tab-modify.mjs +36 -0
  148. package/google-workspace/tovu-admin-surfaces.json +63 -0
  149. package/google-workspace/tovu-agent-tools.json +1178 -0
  150. package/google-workspace/tovu-connections.json +35 -0
  151. package/google-workspace/tovu-form-destinations.json +10 -0
  152. package/google-workspace/ui/README.md +73 -0
  153. package/google-workspace/ui/connection-panel.handler.mjs +167 -0
  154. package/google-workspace/ui/connection-panel.html +17 -0
  155. package/google-workspace/ui/connection-panel.mjs +189 -0
  156. package/google-workspace/ui/connection-view.mjs +120 -0
  157. package/google-workspace/ui/destination-panel.handler.mjs +106 -0
  158. package/google-workspace/ui/destination-panel.html +17 -0
  159. package/google-workspace/ui/destination-panel.mjs +150 -0
  160. package/google-workspace/ui/dom.mjs +140 -0
  161. package/google-workspace/ui/panel.css +170 -0
  162. package/google-workspace/ui/picker-flow.mjs +87 -0
  163. package/google-workspace/ui/picker-view.mjs +44 -0
  164. package/google-workspace/ui/picker.handler.mjs +56 -0
  165. package/google-workspace/ui/picker.html +17 -0
  166. package/google-workspace/ui/picker.mjs +88 -0
  167. package/google-workspace/ui/surface-client.mjs +227 -0
  168. package/higgsfield-media/mcp.json +9 -0
  169. package/higgsfield-media/plugin.json +109 -0
  170. package/higgsfield-media/skills/higgsfield-media/SKILL.md +325 -0
  171. package/higgsfield-media/skills/higgsfield-media/references/failure-modes.md +116 -0
  172. package/higgsfield-media/skills/higgsfield-media/references/models-and-plan-gates.md +142 -0
  173. package/jev/mcp.json +4 -0
  174. package/jev/plugin.json +44 -0
  175. package/jev/skills/jev/SKILL.md +308 -0
  176. package/jev/skills/jev/references/cookbooks.md +197 -0
  177. package/jev/skills/jev/references/jaggedness.md +135 -0
  178. package/jev/skills/jev/references/javascript-sdk.md +146 -0
  179. package/jev/skills/jev/references/patterns.md +123 -0
  180. package/jev/skills/jev/references/primitives-reference.md +187 -0
  181. package/langfuse/plugin.json +22 -0
  182. package/meilisearch/mcp.json +4 -0
  183. package/meilisearch/plugin.json +54 -0
  184. package/meilisearch/providers/meilisearch.mjs +651 -0
  185. package/meilisearch/skills/meilisearch/SKILL.md +43 -0
  186. package/meilisearch/tovu-search-providers.json +10 -0
  187. package/netlify/NOTES.md +13 -0
  188. package/netlify/mcp.json +4 -0
  189. package/netlify/plugin.json +47 -0
  190. package/netlify/skills/netlify/SKILL.md +39 -0
  191. package/netlify/targets/netlify.mjs +384 -0
  192. package/netlify/tovu-consent.json +6 -0
  193. package/netlify/tovu-deploy-targets.json +163 -0
  194. package/opentelemetry/mcp.json +4 -0
  195. package/opentelemetry/plugin.json +52 -0
  196. package/opentelemetry/skills/opentelemetry/SKILL.md +39 -0
  197. package/package.json +161 -6
  198. package/posthog/mcp.json +4 -0
  199. package/posthog/plugin.json +46 -0
  200. package/posthog/skills/posthog/SKILL.md +36 -0
  201. package/railway/deploy-configs/railway.mjs +135 -0
  202. package/railway/deploy-ops/railway.mjs +167 -0
  203. package/railway/mcp.json +4 -0
  204. package/railway/plugin.json +45 -0
  205. package/railway/skills/railway/SKILL.md +66 -0
  206. package/railway/tovu-deploy-configs.json +16 -0
  207. package/railway/tovu-deploy-ops.json +11 -0
  208. package/render/deploy-configs/render.mjs +141 -0
  209. package/render/deploy-ops/render.mjs +152 -0
  210. package/render/mcp.json +4 -0
  211. package/render/plugin.json +47 -0
  212. package/render/skills/render/SKILL.md +63 -0
  213. package/render/tovu-deploy-configs.json +16 -0
  214. package/render/tovu-deploy-ops.json +11 -0
  215. package/resend/NOTES.md +52 -0
  216. package/resend/adapters/resend.mjs +161 -0
  217. package/resend/lib/domains.mjs +137 -0
  218. package/resend/lib/errors.mjs +25 -0
  219. package/resend/lib/feedback.mjs +118 -0
  220. package/resend/mcp.json +13 -0
  221. package/resend/plugin.json +192 -0
  222. package/resend/skills/resend/SKILL.md +107 -0
  223. package/resend/tovu-mail-adapters.json +22 -0
  224. package/s3-compatible/NOTES.md +11 -0
  225. package/s3-compatible/mcp.json +4 -0
  226. package/s3-compatible/object-stores/s3-compatible.mjs +287 -0
  227. package/s3-compatible/plugin.json +56 -0
  228. package/s3-compatible/skills/s3-compatible/SKILL.md +39 -0
  229. package/s3-compatible/targets/s3-compatible.mjs +1054 -0
  230. package/s3-compatible/tovu-deploy-targets.json +432 -0
  231. package/s3-compatible/tovu-object-stores.json +29 -0
  232. package/sentry/mcp.json +4 -0
  233. package/sentry/plugin.json +49 -0
  234. package/sentry/skills/sentry/SKILL.md +34 -0
  235. package/shopify/mcp.json +4 -0
  236. package/shopify/plugin.json +22 -0
  237. package/shopify/skills/shopify/SKILL.md +103 -0
  238. package/shopify/skills/shopify/references/catalog-sync.md +74 -0
  239. package/shopify/skills/shopify/references/domains.md +26 -0
  240. package/shopify/skills/shopify/references/live-storefront.md +34 -0
  241. package/shopify/skills/shopify/references/storefront-snippets.md +21 -0
  242. package/site-compliance/mcp.json +4 -0
  243. package/site-compliance/plugin.json +34 -0
  244. package/site-compliance/skills/site-compliance/SKILL.md +220 -0
  245. package/site-compliance/skills/site-compliance/references/ccpa-cpra.md +115 -0
  246. package/site-compliance/skills/site-compliance/references/gdpr-eu-uk.md +143 -0
  247. package/site-compliance/skills/site-compliance/references/wcag-2-2.md +129 -0
  248. package/site-import/mcp.json +4 -0
  249. package/site-import/plugin.json +41 -0
  250. package/site-import/skills/site-import/SKILL.md +232 -0
  251. package/site-import/skills/site-import/references/content-mapping.md +166 -0
  252. package/site-import/skills/site-import/references/discovery-and-classification.md +117 -0
  253. package/site-import/skills/site-import/references/theme-extraction.md +34 -0
  254. package/slide-design/com.anthropic.claude-code/hooks/hooks.json +4 -0
  255. package/slide-design/mcp.json +4 -0
  256. package/slide-design/plugin.json +26 -0
  257. package/slide-design/skills/slide-design/SKILL.md +103 -0
  258. package/slide-design/skills/slide-design/references/charts-and-exhibits.md +100 -0
  259. package/slide-design/skills/slide-design/references/html-deck.md +175 -0
  260. package/slide-design/skills/slide-design/references/layout-and-style.md +131 -0
  261. package/slide-design/skills/slide-design/references/review.md +93 -0
  262. package/slide-design/skills/slide-design/references/storyline.md +118 -0
  263. package/stripe/plugin.json +22 -0
  264. package/supabase/mcp.json +26 -0
  265. package/supabase/plugin.json +78 -0
  266. package/supabase/skills/supabase/SKILL.md +169 -0
  267. package/supabase/skills/supabase/references/failure-modes.md +101 -0
  268. package/ui-ux-design/CHANGELOG.md +28 -0
  269. package/ui-ux-design/LICENSE +201 -0
  270. package/ui-ux-design/NOTICE +14 -0
  271. package/ui-ux-design/README.md +62 -0
  272. package/ui-ux-design/com.anthropic.claude-code/hooks/hooks.json +4 -0
  273. package/ui-ux-design/mcp.json +4 -0
  274. package/ui-ux-design/plugin.json +26 -0
  275. package/ui-ux-design/skills/frontend-accessibility/SKILL.md +60 -0
  276. package/ui-ux-design/skills/gstack-design/SKILL.md +53 -0
  277. package/ui-ux-design/skills/gstack-design/references/consultation.md +30 -0
  278. package/ui-ux-design/skills/gstack-design/references/html.md +29 -0
  279. package/ui-ux-design/skills/gstack-design/references/review.md +28 -0
  280. package/ui-ux-design/skills/gstack-design/references/shotgun.md +33 -0
  281. package/ui-ux-design/skills/gstack-design/references/upstream-notes.md +23 -0
  282. package/ui-ux-design/skills/interface-design/ORIGINAL.md +16 -0
  283. package/ui-ux-design/skills/interface-design/SKILL.md +41 -0
  284. package/ui-ux-design/skills/interface-design/references/commands/audit.md +40 -0
  285. package/ui-ux-design/skills/interface-design/references/commands/critique.md +21 -0
  286. package/ui-ux-design/skills/interface-design/references/commands/extract.md +34 -0
  287. package/ui-ux-design/skills/interface-design/references/commands/init.md +31 -0
  288. package/ui-ux-design/skills/interface-design/references/commands/status.md +22 -0
  289. package/ui-ux-design/skills/interface-design/references/examples/system-precision.md +29 -0
  290. package/ui-ux-design/skills/interface-design/references/examples/system-warmth.md +29 -0
  291. package/ui-ux-design/skills/interface-design/references/system-template.md +57 -0
  292. package/ui-ux-design/skills/shadcn-ui/README.md +244 -0
  293. package/ui-ux-design/skills/shadcn-ui/SKILL.md +333 -0
  294. package/ui-ux-design/skills/shadcn-ui/examples/auth-layout.tsx +177 -0
  295. package/ui-ux-design/skills/shadcn-ui/examples/data-table.tsx +313 -0
  296. package/ui-ux-design/skills/shadcn-ui/examples/form-pattern.tsx +177 -0
  297. package/ui-ux-design/skills/shadcn-ui/resources/component-catalog.md +481 -0
  298. package/ui-ux-design/skills/shadcn-ui/resources/customization-guide.md +516 -0
  299. package/ui-ux-design/skills/shadcn-ui/resources/migration-guide.md +463 -0
  300. package/ui-ux-design/skills/shadcn-ui/resources/setup-guide.md +412 -0
  301. package/ui-ux-design/skills/shadcn-ui/scripts/verify-setup.sh +134 -0
  302. package/ui-ux-design/skills/ui-ux-design/SKILL.md +171 -0
  303. package/ui-ux-design/skills/ui-ux-design/references/brand-and-voice.md +78 -0
  304. package/ui-ux-design/skills/ui-ux-design/references/chrome-mobile-test-matrix.md +137 -0
  305. package/ui-ux-design/skills/ui-ux-design/references/components-and-states.md +112 -0
  306. package/ui-ux-design/skills/ui-ux-design/references/delight-and-motion.md +54 -0
  307. package/ui-ux-design/skills/ui-ux-design/references/foundations.md +145 -0
  308. package/ui-ux-design/skills/ui-ux-design/references/inclusive-ai-imagery.md +57 -0
  309. package/ui-ux-design/skills/ui-ux-design/references/kole-jain-uiux-concepts.md +104 -0
  310. package/ui-ux-design/skills/ui-ux-design/references/kuinetic-reference.md +184 -0
  311. package/ui-ux-design/skills/ui-ux-design/references/openai-frontend-skill.md +139 -0
  312. package/ui-ux-design/skills/ui-ux-design/references/premium-ui.md +55 -0
  313. package/ui-ux-design/skills/ui-ux-design/references/research-and-validation.md +88 -0
  314. package/ui-ux-design/skills/ui-ux-design/references/sam-crawford-premium-websites.md +103 -0
  315. package/ui-ux-design/skills/ui-ux-design/references/self-made-web-designer-core-skills.md +119 -0
  316. package/ui-ux-design/skills/ui-ux-design/references/ui-animation.md +173 -0
  317. package/ui-ux-design/skills/ui-ux-design/references/ui-loop.md +234 -0
  318. package/ui-ux-design/skills/ui-ux-design/references/visual-storytelling.md +54 -0
  319. package/ui-ux-design/skills/vercel-web-design-guidelines/SKILL.md +39 -0
  320. package/ui-ux-design/skills/web-compliance/SKILL.md +134 -0
  321. package/ui-ux-design/skills/web-compliance/references/audit-evidence.md +59 -0
  322. package/vercel/NOTES.md +23 -0
  323. package/vercel/mcp.json +4 -0
  324. package/vercel/object-stores/vercel-blob.mjs +147 -0
  325. package/vercel/plugin.json +47 -0
  326. package/vercel/skills/vercel/SKILL.md +48 -0
  327. package/vercel/targets/vercel.mjs +586 -0
  328. package/vercel/tovu-consent.json +6 -0
  329. package/vercel/tovu-deploy-targets.json +219 -0
  330. package/vercel/tovu-object-stores.json +10 -0
  331. package/wordpress/NOTES.md +33 -0
  332. package/wordpress/plugin.json +30 -0
  333. package/wordpress/skills/wordpress/SKILL.md +43 -0
  334. package/wordpress/skills/wordpress/references/free-site-redirect.md +46 -0
  335. package/wordpress/skills/wordpress/references/subdomain.md +66 -0
@@ -0,0 +1,1178 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "tools": [
4
+ {
5
+ "name": "account_info",
6
+ "description": "Show which Google account a Google Workspace connection is signed in as. Pass the connectionRef from the connection status. Returns the account label only, never a token.",
7
+ "effect": "read",
8
+ "module": "tools/account-info.mjs",
9
+ "inputSchema": {
10
+ "type": "object",
11
+ "required": ["connectionRef"],
12
+ "additionalProperties": false,
13
+ "properties": { "connectionRef": { "type": "string", "minLength": 1, "maxLength": 512 } }
14
+ }
15
+ },
16
+ {
17
+ "name": "sheets_get",
18
+ "description": "Get a spreadsheet's title, URL and tabs (tab ids, sizes, frozen rows). Cell data only with includeGridData and explicit ranges; results over 64 KiB are refused, so ask for less.",
19
+ "effect": "read",
20
+ "module": "tools/sheets/get.mjs",
21
+ "inputSchema": {
22
+ "type": "object",
23
+ "required": ["connectionRef", "spreadsheetId"],
24
+ "additionalProperties": false,
25
+ "properties": {
26
+ "connectionRef": {
27
+ "type": "string",
28
+ "minLength": 1,
29
+ "maxLength": 512,
30
+ "description": "The connectionRef from the Google Workspace connection status."
31
+ },
32
+ "spreadsheetId": {
33
+ "type": "string",
34
+ "pattern": "^[A-Za-z0-9_-]{10,200}$",
35
+ "description": "Spreadsheet id (the file must be one Tovu created or the person picked)."
36
+ },
37
+ "ranges": {
38
+ "type": "array",
39
+ "minItems": 1,
40
+ "maxItems": 20,
41
+ "items": {
42
+ "type": "string",
43
+ "minLength": 1,
44
+ "maxLength": 256,
45
+ "description": "A1 range, for example 'Leads'!A1:D50 or Sheet1."
46
+ }
47
+ },
48
+ "includeGridData": { "type": "boolean" },
49
+ "fields": {
50
+ "type": "string",
51
+ "minLength": 1,
52
+ "maxLength": 1024,
53
+ "pattern": "^[A-Za-z0-9_.,()/*]+$",
54
+ "description": "Optional Google field mask; the default returns title, URL and tabs."
55
+ }
56
+ }
57
+ }
58
+ },
59
+ {
60
+ "name": "sheets_get_by_data_filter",
61
+ "description": "Get spreadsheet metadata (and optionally cell data) for the parts matching data filters: A1 ranges, grid ranges or developer-metadata lookups. Results over 64 KiB are refused.",
62
+ "effect": "read",
63
+ "module": "tools/sheets/get-by-data-filter.mjs",
64
+ "inputSchema": {
65
+ "type": "object",
66
+ "required": ["connectionRef", "spreadsheetId", "dataFilters"],
67
+ "additionalProperties": false,
68
+ "properties": {
69
+ "connectionRef": {
70
+ "type": "string",
71
+ "minLength": 1,
72
+ "maxLength": 512,
73
+ "description": "The connectionRef from the Google Workspace connection status."
74
+ },
75
+ "spreadsheetId": {
76
+ "type": "string",
77
+ "pattern": "^[A-Za-z0-9_-]{10,200}$",
78
+ "description": "Spreadsheet id (the file must be one Tovu created or the person picked)."
79
+ },
80
+ "dataFilters": {
81
+ "type": "array",
82
+ "minItems": 1,
83
+ "maxItems": 20,
84
+ "items": {
85
+ "type": "object",
86
+ "additionalProperties": false,
87
+ "minProperties": 1,
88
+ "maxProperties": 1,
89
+ "properties": {
90
+ "a1Range": {
91
+ "type": "string",
92
+ "minLength": 1,
93
+ "maxLength": 256,
94
+ "description": "A1 range, for example 'Leads'!A1:D50 or Sheet1."
95
+ },
96
+ "gridRange": {
97
+ "type": "object",
98
+ "additionalProperties": false,
99
+ "required": ["sheetId"],
100
+ "properties": {
101
+ "sheetId": {
102
+ "type": "integer",
103
+ "minimum": 0,
104
+ "maximum": 2147483647,
105
+ "description": "Numeric tab id (from sheets_get)."
106
+ },
107
+ "startRowIndex": { "type": "integer", "minimum": 0, "maximum": 10000000 },
108
+ "endRowIndex": { "type": "integer", "minimum": 0, "maximum": 10000000 },
109
+ "startColumnIndex": { "type": "integer", "minimum": 0, "maximum": 10000000 },
110
+ "endColumnIndex": { "type": "integer", "minimum": 0, "maximum": 10000000 }
111
+ }
112
+ },
113
+ "developerMetadataLookup": {
114
+ "type": "object",
115
+ "additionalProperties": false,
116
+ "minProperties": 1,
117
+ "properties": {
118
+ "metadataId": { "type": "integer", "minimum": 0 },
119
+ "metadataKey": { "type": "string", "maxLength": 256 },
120
+ "metadataValue": { "type": "string", "maxLength": 256 },
121
+ "locationType": { "enum": ["ROW", "COLUMN", "SHEET", "SPREADSHEET"] },
122
+ "locationMatchingStrategy": { "enum": ["EXACT_LOCATION", "INTERSECTING_LOCATION"] },
123
+ "visibility": { "enum": ["DOCUMENT", "PROJECT"] },
124
+ "metadataLocation": { "type": "object", "maxProperties": 4 }
125
+ }
126
+ }
127
+ }
128
+ }
129
+ },
130
+ "includeGridData": { "type": "boolean" },
131
+ "fields": {
132
+ "type": "string",
133
+ "minLength": 1,
134
+ "maxLength": 1024,
135
+ "pattern": "^[A-Za-z0-9_.,()/*]+$",
136
+ "description": "Optional Google field mask; the default returns title, URL and tabs."
137
+ }
138
+ }
139
+ }
140
+ },
141
+ {
142
+ "name": "sheets_create",
143
+ "description": "Create a new spreadsheet in the connected Google Drive, optionally with named tabs. Returns its id, URL and tab ids. Asks the person to confirm. If the answer is lost the outcome is unknown: check Drive before creating again.",
144
+ "effect": "write",
145
+ "module": "tools/sheets/create.mjs",
146
+ "inputSchema": {
147
+ "type": "object",
148
+ "required": ["connectionRef", "title"],
149
+ "additionalProperties": false,
150
+ "properties": {
151
+ "connectionRef": {
152
+ "type": "string",
153
+ "minLength": 1,
154
+ "maxLength": 512,
155
+ "description": "The connectionRef from the Google Workspace connection status."
156
+ },
157
+ "title": { "type": "string", "minLength": 1, "maxLength": 200 },
158
+ "tabs": {
159
+ "type": "array",
160
+ "minItems": 1,
161
+ "maxItems": 50,
162
+ "items": { "type": "string", "minLength": 1, "maxLength": 100 }
163
+ },
164
+ "locale": { "type": "string", "maxLength": 16 },
165
+ "timeZone": { "type": "string", "maxLength": 64 }
166
+ }
167
+ }
168
+ },
169
+ {
170
+ "name": "sheets_copy",
171
+ "description": "Copy a whole spreadsheet to a new file with the given title, optionally into a folder the connection can open. Returns the new id and URL. Asks the person to confirm; never repeat it after an unknown outcome.",
172
+ "effect": "write",
173
+ "module": "tools/sheets/copy.mjs",
174
+ "inputSchema": {
175
+ "type": "object",
176
+ "required": ["connectionRef", "spreadsheetId", "title"],
177
+ "additionalProperties": false,
178
+ "properties": {
179
+ "connectionRef": {
180
+ "type": "string",
181
+ "minLength": 1,
182
+ "maxLength": 512,
183
+ "description": "The connectionRef from the Google Workspace connection status."
184
+ },
185
+ "spreadsheetId": {
186
+ "type": "string",
187
+ "pattern": "^[A-Za-z0-9_-]{10,200}$",
188
+ "description": "Spreadsheet id (the file must be one Tovu created or the person picked)."
189
+ },
190
+ "title": { "type": "string", "minLength": 1, "maxLength": 200 },
191
+ "parentFolderId": { "type": "string", "pattern": "^[A-Za-z0-9_-]{1,256}$" }
192
+ }
193
+ }
194
+ },
195
+ {
196
+ "name": "sheets_copy_tab",
197
+ "description": "Copy one tab (by numeric sheetId) into another spreadsheet the connection can open. Returns the new tab's id, title and position. Asks the person to confirm.",
198
+ "effect": "write",
199
+ "module": "tools/sheets/copy-tab.mjs",
200
+ "inputSchema": {
201
+ "type": "object",
202
+ "required": ["connectionRef", "spreadsheetId", "sheetId", "destinationSpreadsheetId"],
203
+ "additionalProperties": false,
204
+ "properties": {
205
+ "connectionRef": {
206
+ "type": "string",
207
+ "minLength": 1,
208
+ "maxLength": 512,
209
+ "description": "The connectionRef from the Google Workspace connection status."
210
+ },
211
+ "spreadsheetId": {
212
+ "type": "string",
213
+ "pattern": "^[A-Za-z0-9_-]{10,200}$",
214
+ "description": "Spreadsheet id (the file must be one Tovu created or the person picked)."
215
+ },
216
+ "sheetId": {
217
+ "type": "integer",
218
+ "minimum": 0,
219
+ "maximum": 2147483647,
220
+ "description": "Numeric tab id (from sheets_get)."
221
+ },
222
+ "destinationSpreadsheetId": {
223
+ "type": "string",
224
+ "pattern": "^[A-Za-z0-9_-]{10,200}$",
225
+ "description": "Spreadsheet id (the file must be one Tovu created or the person picked)."
226
+ }
227
+ }
228
+ }
229
+ },
230
+ {
231
+ "name": "sheets_values_get",
232
+ "description": "Read the values of one explicit A1 range. Returns at most 500 rows / 5,000 cells / 64 KiB; when there is more, `continuation` is the exact range to read next.",
233
+ "effect": "read",
234
+ "module": "tools/sheets/values-get.mjs",
235
+ "inputSchema": {
236
+ "type": "object",
237
+ "required": ["connectionRef", "spreadsheetId", "range"],
238
+ "additionalProperties": false,
239
+ "properties": {
240
+ "connectionRef": {
241
+ "type": "string",
242
+ "minLength": 1,
243
+ "maxLength": 512,
244
+ "description": "The connectionRef from the Google Workspace connection status."
245
+ },
246
+ "spreadsheetId": {
247
+ "type": "string",
248
+ "pattern": "^[A-Za-z0-9_-]{10,200}$",
249
+ "description": "Spreadsheet id (the file must be one Tovu created or the person picked)."
250
+ },
251
+ "range": {
252
+ "type": "string",
253
+ "minLength": 1,
254
+ "maxLength": 256,
255
+ "description": "A1 range, for example 'Leads'!A1:D50 or Sheet1."
256
+ },
257
+ "valueRenderOption": { "enum": ["FORMATTED_VALUE", "UNFORMATTED_VALUE", "FORMULA"] },
258
+ "dateTimeRenderOption": { "enum": ["SERIAL_NUMBER", "FORMATTED_STRING"] }
259
+ }
260
+ }
261
+ },
262
+ {
263
+ "name": "sheets_values_batch_get",
264
+ "description": "Read up to 20 explicit A1 ranges at once. All ranges share one bound (500 rows / 5,000 cells / 64 KiB); each cut range has its own `continuation`.",
265
+ "effect": "read",
266
+ "module": "tools/sheets/values-batch-get.mjs",
267
+ "inputSchema": {
268
+ "type": "object",
269
+ "required": ["connectionRef", "spreadsheetId", "ranges"],
270
+ "additionalProperties": false,
271
+ "properties": {
272
+ "connectionRef": {
273
+ "type": "string",
274
+ "minLength": 1,
275
+ "maxLength": 512,
276
+ "description": "The connectionRef from the Google Workspace connection status."
277
+ },
278
+ "spreadsheetId": {
279
+ "type": "string",
280
+ "pattern": "^[A-Za-z0-9_-]{10,200}$",
281
+ "description": "Spreadsheet id (the file must be one Tovu created or the person picked)."
282
+ },
283
+ "ranges": {
284
+ "type": "array",
285
+ "minItems": 1,
286
+ "maxItems": 20,
287
+ "items": {
288
+ "type": "string",
289
+ "minLength": 1,
290
+ "maxLength": 256,
291
+ "description": "A1 range, for example 'Leads'!A1:D50 or Sheet1."
292
+ }
293
+ },
294
+ "valueRenderOption": { "enum": ["FORMATTED_VALUE", "UNFORMATTED_VALUE", "FORMULA"] },
295
+ "dateTimeRenderOption": { "enum": ["SERIAL_NUMBER", "FORMATTED_STRING"] }
296
+ }
297
+ }
298
+ },
299
+ {
300
+ "name": "sheets_values_append",
301
+ "description": "Append rows after the table in a tab or range; new rows are inserted, nothing below is overwritten. Values are stored as plain text (RAW) unless valueInputOption is USER_ENTERED. Asks the person to confirm. Never repeat an append whose outcome is unknown.",
302
+ "effect": "write",
303
+ "module": "tools/sheets/values-append.mjs",
304
+ "inputSchema": {
305
+ "type": "object",
306
+ "required": ["connectionRef", "spreadsheetId", "range", "values"],
307
+ "additionalProperties": false,
308
+ "properties": {
309
+ "connectionRef": {
310
+ "type": "string",
311
+ "minLength": 1,
312
+ "maxLength": 512,
313
+ "description": "The connectionRef from the Google Workspace connection status."
314
+ },
315
+ "spreadsheetId": {
316
+ "type": "string",
317
+ "pattern": "^[A-Za-z0-9_-]{10,200}$",
318
+ "description": "Spreadsheet id (the file must be one Tovu created or the person picked)."
319
+ },
320
+ "range": {
321
+ "type": "string",
322
+ "minLength": 1,
323
+ "maxLength": 256,
324
+ "description": "A1 range, for example 'Leads'!A1:D50 or Sheet1."
325
+ },
326
+ "values": {
327
+ "type": "array",
328
+ "minItems": 1,
329
+ "maxItems": 10000,
330
+ "items": {
331
+ "type": "array",
332
+ "maxItems": 18278,
333
+ "items": { "type": ["string", "number", "boolean", "null"], "maxLength": 50000 }
334
+ },
335
+ "description": "Rows of cell values."
336
+ },
337
+ "valueInputOption": {
338
+ "enum": ["RAW", "USER_ENTERED"],
339
+ "description": "RAW (default) stores text exactly as given; USER_ENTERED parses it like typing into Sheets (formulas included). Use USER_ENTERED only when the person asks for it."
340
+ },
341
+ "insertDataOption": { "enum": ["INSERT_ROWS", "OVERWRITE"] }
342
+ }
343
+ }
344
+ },
345
+ {
346
+ "name": "sheets_values_update",
347
+ "description": "Overwrite one explicit A1 range with the given rows (RAW unless valueInputOption is USER_ENTERED). Replaces current values; asks the person to confirm. Body at most 1 MiB.",
348
+ "effect": "destructive",
349
+ "module": "tools/sheets/values-update.mjs",
350
+ "inputSchema": {
351
+ "type": "object",
352
+ "required": ["connectionRef", "spreadsheetId", "range", "values"],
353
+ "additionalProperties": false,
354
+ "properties": {
355
+ "connectionRef": {
356
+ "type": "string",
357
+ "minLength": 1,
358
+ "maxLength": 512,
359
+ "description": "The connectionRef from the Google Workspace connection status."
360
+ },
361
+ "spreadsheetId": {
362
+ "type": "string",
363
+ "pattern": "^[A-Za-z0-9_-]{10,200}$",
364
+ "description": "Spreadsheet id (the file must be one Tovu created or the person picked)."
365
+ },
366
+ "range": {
367
+ "type": "string",
368
+ "minLength": 1,
369
+ "maxLength": 256,
370
+ "description": "A1 range, for example 'Leads'!A1:D50 or Sheet1."
371
+ },
372
+ "values": {
373
+ "type": "array",
374
+ "minItems": 1,
375
+ "maxItems": 10000,
376
+ "items": {
377
+ "type": "array",
378
+ "maxItems": 18278,
379
+ "items": { "type": ["string", "number", "boolean", "null"], "maxLength": 50000 }
380
+ },
381
+ "description": "Rows of cell values."
382
+ },
383
+ "valueInputOption": {
384
+ "enum": ["RAW", "USER_ENTERED"],
385
+ "description": "RAW (default) stores text exactly as given; USER_ENTERED parses it like typing into Sheets (formulas included). Use USER_ENTERED only when the person asks for it."
386
+ }
387
+ }
388
+ }
389
+ },
390
+ {
391
+ "name": "sheets_values_batch_update",
392
+ "description": "Overwrite up to 100 explicit A1 ranges in one request (RAW unless valueInputOption is USER_ENTERED). Replaces current values; asks the person to confirm. Body at most 1 MiB.",
393
+ "effect": "destructive",
394
+ "module": "tools/sheets/values-batch-update.mjs",
395
+ "inputSchema": {
396
+ "type": "object",
397
+ "required": ["connectionRef", "spreadsheetId", "data"],
398
+ "additionalProperties": false,
399
+ "properties": {
400
+ "connectionRef": {
401
+ "type": "string",
402
+ "minLength": 1,
403
+ "maxLength": 512,
404
+ "description": "The connectionRef from the Google Workspace connection status."
405
+ },
406
+ "spreadsheetId": {
407
+ "type": "string",
408
+ "pattern": "^[A-Za-z0-9_-]{10,200}$",
409
+ "description": "Spreadsheet id (the file must be one Tovu created or the person picked)."
410
+ },
411
+ "data": {
412
+ "type": "array",
413
+ "minItems": 1,
414
+ "maxItems": 100,
415
+ "items": {
416
+ "type": "object",
417
+ "required": ["range", "values"],
418
+ "additionalProperties": false,
419
+ "properties": {
420
+ "range": {
421
+ "type": "string",
422
+ "minLength": 1,
423
+ "maxLength": 256,
424
+ "description": "A1 range, for example 'Leads'!A1:D50 or Sheet1."
425
+ },
426
+ "values": {
427
+ "type": "array",
428
+ "minItems": 1,
429
+ "maxItems": 10000,
430
+ "items": {
431
+ "type": "array",
432
+ "maxItems": 18278,
433
+ "items": { "type": ["string", "number", "boolean", "null"], "maxLength": 50000 }
434
+ },
435
+ "description": "Rows of cell values."
436
+ }
437
+ }
438
+ }
439
+ },
440
+ "valueInputOption": {
441
+ "enum": ["RAW", "USER_ENTERED"],
442
+ "description": "RAW (default) stores text exactly as given; USER_ENTERED parses it like typing into Sheets (formulas included). Use USER_ENTERED only when the person asks for it."
443
+ }
444
+ }
445
+ }
446
+ },
447
+ {
448
+ "name": "sheets_values_clear",
449
+ "description": "Clear every value in one explicit A1 range (formatting stays). Asks the person to confirm; cannot be undone from Tovu.",
450
+ "effect": "destructive",
451
+ "module": "tools/sheets/values-clear.mjs",
452
+ "inputSchema": {
453
+ "type": "object",
454
+ "required": ["connectionRef", "spreadsheetId", "range"],
455
+ "additionalProperties": false,
456
+ "properties": {
457
+ "connectionRef": {
458
+ "type": "string",
459
+ "minLength": 1,
460
+ "maxLength": 512,
461
+ "description": "The connectionRef from the Google Workspace connection status."
462
+ },
463
+ "spreadsheetId": {
464
+ "type": "string",
465
+ "pattern": "^[A-Za-z0-9_-]{10,200}$",
466
+ "description": "Spreadsheet id (the file must be one Tovu created or the person picked)."
467
+ },
468
+ "range": {
469
+ "type": "string",
470
+ "minLength": 1,
471
+ "maxLength": 256,
472
+ "description": "A1 range, for example 'Leads'!A1:D50 or Sheet1."
473
+ }
474
+ }
475
+ }
476
+ },
477
+ {
478
+ "name": "sheets_values_batch_clear",
479
+ "description": "Clear every value in up to 100 explicit A1 ranges. Asks the person to confirm; cannot be undone from Tovu.",
480
+ "effect": "destructive",
481
+ "module": "tools/sheets/values-batch-clear.mjs",
482
+ "inputSchema": {
483
+ "type": "object",
484
+ "required": ["connectionRef", "spreadsheetId", "ranges"],
485
+ "additionalProperties": false,
486
+ "properties": {
487
+ "connectionRef": {
488
+ "type": "string",
489
+ "minLength": 1,
490
+ "maxLength": 512,
491
+ "description": "The connectionRef from the Google Workspace connection status."
492
+ },
493
+ "spreadsheetId": {
494
+ "type": "string",
495
+ "pattern": "^[A-Za-z0-9_-]{10,200}$",
496
+ "description": "Spreadsheet id (the file must be one Tovu created or the person picked)."
497
+ },
498
+ "ranges": {
499
+ "type": "array",
500
+ "minItems": 1,
501
+ "maxItems": 100,
502
+ "items": {
503
+ "type": "string",
504
+ "minLength": 1,
505
+ "maxLength": 256,
506
+ "description": "A1 range, for example 'Leads'!A1:D50 or Sheet1."
507
+ }
508
+ }
509
+ }
510
+ }
511
+ },
512
+ {
513
+ "name": "sheets_values_by_data_filter",
514
+ "description": "Read (action get), overwrite (action update) or clear (action clear) the values matching data filters. Always asks the person to confirm, even for get. get/clear take dataFilters; update takes data entries of { dataFilter, values } (RAW unless valueInputOption is USER_ENTERED).",
515
+ "effect": "destructive",
516
+ "module": "tools/sheets/values-by-data-filter.mjs",
517
+ "inputSchema": {
518
+ "type": "object",
519
+ "required": ["connectionRef", "spreadsheetId", "action"],
520
+ "additionalProperties": false,
521
+ "properties": {
522
+ "connectionRef": {
523
+ "type": "string",
524
+ "minLength": 1,
525
+ "maxLength": 512,
526
+ "description": "The connectionRef from the Google Workspace connection status."
527
+ },
528
+ "spreadsheetId": {
529
+ "type": "string",
530
+ "pattern": "^[A-Za-z0-9_-]{10,200}$",
531
+ "description": "Spreadsheet id (the file must be one Tovu created or the person picked)."
532
+ },
533
+ "action": { "enum": ["get", "update", "clear"] },
534
+ "dataFilters": {
535
+ "type": "array",
536
+ "minItems": 1,
537
+ "maxItems": 20,
538
+ "items": {
539
+ "type": "object",
540
+ "additionalProperties": false,
541
+ "minProperties": 1,
542
+ "maxProperties": 1,
543
+ "properties": {
544
+ "a1Range": {
545
+ "type": "string",
546
+ "minLength": 1,
547
+ "maxLength": 256,
548
+ "description": "A1 range, for example 'Leads'!A1:D50 or Sheet1."
549
+ },
550
+ "gridRange": {
551
+ "type": "object",
552
+ "additionalProperties": false,
553
+ "required": ["sheetId"],
554
+ "properties": {
555
+ "sheetId": {
556
+ "type": "integer",
557
+ "minimum": 0,
558
+ "maximum": 2147483647,
559
+ "description": "Numeric tab id (from sheets_get)."
560
+ },
561
+ "startRowIndex": { "type": "integer", "minimum": 0, "maximum": 10000000 },
562
+ "endRowIndex": { "type": "integer", "minimum": 0, "maximum": 10000000 },
563
+ "startColumnIndex": { "type": "integer", "minimum": 0, "maximum": 10000000 },
564
+ "endColumnIndex": { "type": "integer", "minimum": 0, "maximum": 10000000 }
565
+ }
566
+ },
567
+ "developerMetadataLookup": {
568
+ "type": "object",
569
+ "additionalProperties": false,
570
+ "minProperties": 1,
571
+ "properties": {
572
+ "metadataId": { "type": "integer", "minimum": 0 },
573
+ "metadataKey": { "type": "string", "maxLength": 256 },
574
+ "metadataValue": { "type": "string", "maxLength": 256 },
575
+ "locationType": { "enum": ["ROW", "COLUMN", "SHEET", "SPREADSHEET"] },
576
+ "locationMatchingStrategy": { "enum": ["EXACT_LOCATION", "INTERSECTING_LOCATION"] },
577
+ "visibility": { "enum": ["DOCUMENT", "PROJECT"] },
578
+ "metadataLocation": { "type": "object", "maxProperties": 4 }
579
+ }
580
+ }
581
+ }
582
+ }
583
+ },
584
+ "data": {
585
+ "type": "array",
586
+ "minItems": 1,
587
+ "maxItems": 100,
588
+ "items": {
589
+ "type": "object",
590
+ "required": ["dataFilter", "values"],
591
+ "additionalProperties": false,
592
+ "properties": {
593
+ "dataFilter": {
594
+ "type": "object",
595
+ "additionalProperties": false,
596
+ "minProperties": 1,
597
+ "maxProperties": 1,
598
+ "properties": {
599
+ "a1Range": {
600
+ "type": "string",
601
+ "minLength": 1,
602
+ "maxLength": 256,
603
+ "description": "A1 range, for example 'Leads'!A1:D50 or Sheet1."
604
+ },
605
+ "gridRange": {
606
+ "type": "object",
607
+ "additionalProperties": false,
608
+ "required": ["sheetId"],
609
+ "properties": {
610
+ "sheetId": {
611
+ "type": "integer",
612
+ "minimum": 0,
613
+ "maximum": 2147483647,
614
+ "description": "Numeric tab id (from sheets_get)."
615
+ },
616
+ "startRowIndex": { "type": "integer", "minimum": 0, "maximum": 10000000 },
617
+ "endRowIndex": { "type": "integer", "minimum": 0, "maximum": 10000000 },
618
+ "startColumnIndex": { "type": "integer", "minimum": 0, "maximum": 10000000 },
619
+ "endColumnIndex": { "type": "integer", "minimum": 0, "maximum": 10000000 }
620
+ }
621
+ },
622
+ "developerMetadataLookup": {
623
+ "type": "object",
624
+ "additionalProperties": false,
625
+ "minProperties": 1,
626
+ "properties": {
627
+ "metadataId": { "type": "integer", "minimum": 0 },
628
+ "metadataKey": { "type": "string", "maxLength": 256 },
629
+ "metadataValue": { "type": "string", "maxLength": 256 },
630
+ "locationType": { "enum": ["ROW", "COLUMN", "SHEET", "SPREADSHEET"] },
631
+ "locationMatchingStrategy": { "enum": ["EXACT_LOCATION", "INTERSECTING_LOCATION"] },
632
+ "visibility": { "enum": ["DOCUMENT", "PROJECT"] },
633
+ "metadataLocation": { "type": "object", "maxProperties": 4 }
634
+ }
635
+ }
636
+ }
637
+ },
638
+ "values": {
639
+ "type": "array",
640
+ "minItems": 1,
641
+ "maxItems": 10000,
642
+ "items": {
643
+ "type": "array",
644
+ "maxItems": 18278,
645
+ "items": { "type": ["string", "number", "boolean", "null"], "maxLength": 50000 }
646
+ },
647
+ "description": "Rows of cell values."
648
+ }
649
+ }
650
+ }
651
+ },
652
+ "valueInputOption": {
653
+ "enum": ["RAW", "USER_ENTERED"],
654
+ "description": "RAW (default) stores text exactly as given; USER_ENTERED parses it like typing into Sheets (formulas included). Use USER_ENTERED only when the person asks for it."
655
+ },
656
+ "valueRenderOption": { "enum": ["FORMATTED_VALUE", "UNFORMATTED_VALUE", "FORMULA"] },
657
+ "dateTimeRenderOption": { "enum": ["SERIAL_NUMBER", "FORMATTED_STRING"] }
658
+ },
659
+ "oneOf": [
660
+ {
661
+ "properties": { "action": { "enum": ["get", "clear"] } },
662
+ "required": ["dataFilters"],
663
+ "not": { "required": ["data"] }
664
+ },
665
+ {
666
+ "properties": { "action": { "const": "update" } },
667
+ "required": ["data"],
668
+ "not": { "required": ["dataFilters"] }
669
+ }
670
+ ]
671
+ }
672
+ },
673
+ {
674
+ "name": "sheets_find",
675
+ "description": "Find cells whose text contains (or, with matchEntireCell, equals) a text in up to 20 explicit ranges. Plain text, no regular expressions. Returns up to 100 cell references with short excerpts (`truncated` when there are more); scanning more than 50,000 cells is refused.",
676
+ "effect": "read",
677
+ "module": "tools/sheets/find.mjs",
678
+ "inputSchema": {
679
+ "type": "object",
680
+ "required": ["connectionRef", "spreadsheetId", "ranges", "text"],
681
+ "additionalProperties": false,
682
+ "properties": {
683
+ "connectionRef": {
684
+ "type": "string",
685
+ "minLength": 1,
686
+ "maxLength": 512,
687
+ "description": "The connectionRef from the Google Workspace connection status."
688
+ },
689
+ "spreadsheetId": {
690
+ "type": "string",
691
+ "pattern": "^[A-Za-z0-9_-]{10,200}$",
692
+ "description": "Spreadsheet id (the file must be one Tovu created or the person picked)."
693
+ },
694
+ "ranges": {
695
+ "type": "array",
696
+ "minItems": 1,
697
+ "maxItems": 20,
698
+ "items": {
699
+ "type": "string",
700
+ "minLength": 1,
701
+ "maxLength": 256,
702
+ "description": "A1 range, for example 'Leads'!A1:D50 or Sheet1."
703
+ }
704
+ },
705
+ "text": { "type": "string", "minLength": 1, "maxLength": 1000 },
706
+ "matchCase": { "type": "boolean" },
707
+ "matchEntireCell": { "type": "boolean" },
708
+ "valueRenderOption": { "enum": ["FORMATTED_VALUE", "UNFORMATTED_VALUE", "FORMULA"] }
709
+ }
710
+ }
711
+ },
712
+ {
713
+ "name": "sheets_find_replace",
714
+ "description": "Replace every match of a text on one tab (sheetId) or on every tab (allSheets: true). Overwrites matched cells; asks the person to confirm. Never repeat it after an unknown outcome.",
715
+ "effect": "destructive",
716
+ "module": "tools/sheets/find-replace.mjs",
717
+ "inputSchema": {
718
+ "type": "object",
719
+ "required": ["connectionRef", "spreadsheetId", "find", "replacement"],
720
+ "additionalProperties": false,
721
+ "properties": {
722
+ "connectionRef": {
723
+ "type": "string",
724
+ "minLength": 1,
725
+ "maxLength": 512,
726
+ "description": "The connectionRef from the Google Workspace connection status."
727
+ },
728
+ "spreadsheetId": {
729
+ "type": "string",
730
+ "pattern": "^[A-Za-z0-9_-]{10,200}$",
731
+ "description": "Spreadsheet id (the file must be one Tovu created or the person picked)."
732
+ },
733
+ "find": { "type": "string", "minLength": 1, "maxLength": 1000 },
734
+ "replacement": { "type": "string", "maxLength": 1000 },
735
+ "sheetId": {
736
+ "type": "integer",
737
+ "minimum": 0,
738
+ "maximum": 2147483647,
739
+ "description": "Numeric tab id (from sheets_get)."
740
+ },
741
+ "allSheets": { "const": true },
742
+ "matchCase": { "type": "boolean" },
743
+ "matchEntireCell": { "type": "boolean" },
744
+ "searchByRegex": { "type": "boolean" },
745
+ "includeFormulas": { "type": "boolean" }
746
+ },
747
+ "oneOf": [{ "required": ["sheetId"] }, { "required": ["allSheets"] }]
748
+ }
749
+ },
750
+ {
751
+ "name": "sheets_tab_modify",
752
+ "description": "Pass the connectionRef from the connection status and the spreadsheetId of a spreadsheet the person picked or Tovu created. Add, rename, delete, duplicate or move one tab (sheetId is the tab's numeric id). add needs title; rename needs sheetId and title; delete and duplicate need sheetId (duplicate may set title and index); move needs sheetId and index. Deleting a tab deletes its data. The person confirms on a card before anything changes; remote changes cannot be undone from Tovu.",
753
+ "effect": "destructive",
754
+ "module": "tools/sheets-admin/tab-modify.mjs",
755
+ "inputSchema": {
756
+ "type": "object",
757
+ "required": ["connectionRef", "spreadsheetId", "action"],
758
+ "additionalProperties": false,
759
+ "properties": {
760
+ "connectionRef": {"type": "string", "minLength": 1, "maxLength": 512},
761
+ "spreadsheetId": {"type": "string", "pattern": "^[A-Za-z0-9_-]{10,200}$"},
762
+ "action": {"enum": ["add", "rename", "delete", "duplicate", "move"]},
763
+ "sheetId": {"type": "integer", "minimum": 0},
764
+ "title": {"type": "string", "minLength": 1, "maxLength": 100},
765
+ "index": {"type": "integer", "minimum": 0}
766
+ },
767
+ "allOf": [
768
+ {
769
+ "if": {"properties": {"action": {"const": "add"}}, "required": ["action"]},
770
+ "then": {"required": ["title"]}
771
+ },
772
+ {
773
+ "if": {"properties": {"action": {"const": "rename"}}, "required": ["action"]},
774
+ "then": {"required": ["sheetId", "title"]}
775
+ },
776
+ {
777
+ "if": {"properties": {"action": {"const": "delete"}}, "required": ["action"]},
778
+ "then": {"required": ["sheetId"]}
779
+ },
780
+ {
781
+ "if": {"properties": {"action": {"const": "duplicate"}}, "required": ["action"]},
782
+ "then": {"required": ["sheetId"]}
783
+ },
784
+ {
785
+ "if": {"properties": {"action": {"const": "move"}}, "required": ["action"]},
786
+ "then": {"required": ["sheetId", "index"]}
787
+ }
788
+ ]
789
+ }
790
+ },
791
+ {
792
+ "name": "sheets_sort",
793
+ "description": "Pass the connectionRef from the connection status and the spreadsheetId of a spreadsheet the person picked or Tovu created. Physically reorder the rows of a grid range (zero-based, end-exclusive indices) by up to 10 columns; dimensionIndex is the zero-based column. The old row order is not kept. The person confirms on a card before anything changes; remote changes cannot be undone from Tovu.",
794
+ "effect": "destructive",
795
+ "module": "tools/sheets-admin/sort.mjs",
796
+ "inputSchema": {
797
+ "type": "object",
798
+ "required": ["connectionRef", "spreadsheetId", "range", "sortSpecs"],
799
+ "additionalProperties": false,
800
+ "properties": {
801
+ "connectionRef": {"type": "string", "minLength": 1, "maxLength": 512},
802
+ "spreadsheetId": {"type": "string", "pattern": "^[A-Za-z0-9_-]{10,200}$"},
803
+ "range": {
804
+ "type": "object",
805
+ "required": ["sheetId"],
806
+ "additionalProperties": false,
807
+ "properties": {
808
+ "sheetId": {"type": "integer", "minimum": 0},
809
+ "startRowIndex": {"type": "integer", "minimum": 0},
810
+ "endRowIndex": {"type": "integer", "minimum": 0},
811
+ "startColumnIndex": {"type": "integer", "minimum": 0},
812
+ "endColumnIndex": {"type": "integer", "minimum": 0}
813
+ }
814
+ },
815
+ "sortSpecs": {
816
+ "type": "array",
817
+ "minItems": 1,
818
+ "maxItems": 10,
819
+ "items": {
820
+ "type": "object",
821
+ "required": ["dimensionIndex"],
822
+ "additionalProperties": false,
823
+ "properties": {
824
+ "dimensionIndex": {"type": "integer", "minimum": 0},
825
+ "sortOrder": {"enum": ["ASCENDING", "DESCENDING"]}
826
+ }
827
+ }
828
+ }
829
+ }
830
+ }
831
+ },
832
+ {
833
+ "name": "sheets_basic_filter",
834
+ "description": "Pass the connectionRef from the connection status and the spreadsheetId of a spreadsheet the person picked or Tovu created. Set or clear the basic filter of a tab. clear needs sheetId; set needs range and may give filterSpecs (Sheets FilterSpec objects). To read a tab's filter without a confirmation, call sheets_get with fields \"sheets(properties(sheetId),basicFilter)\". A filter hides rows; it never deletes or reorders data (to sort rows, use sheets_sort). The person confirms on a card before anything changes; remote changes cannot be undone from Tovu.",
835
+ "effect": "write",
836
+ "module": "tools/sheets-admin/basic-filter.mjs",
837
+ "inputSchema": {
838
+ "type": "object",
839
+ "required": ["connectionRef", "spreadsheetId", "action"],
840
+ "additionalProperties": false,
841
+ "properties": {
842
+ "connectionRef": {"type": "string", "minLength": 1, "maxLength": 512},
843
+ "spreadsheetId": {"type": "string", "pattern": "^[A-Za-z0-9_-]{10,200}$"},
844
+ "action": {"enum": ["set", "clear"]},
845
+ "sheetId": {"type": "integer", "minimum": 0},
846
+ "range": {
847
+ "type": "object",
848
+ "required": ["sheetId"],
849
+ "additionalProperties": false,
850
+ "properties": {
851
+ "sheetId": {"type": "integer", "minimum": 0},
852
+ "startRowIndex": {"type": "integer", "minimum": 0},
853
+ "endRowIndex": {"type": "integer", "minimum": 0},
854
+ "startColumnIndex": {"type": "integer", "minimum": 0},
855
+ "endColumnIndex": {"type": "integer", "minimum": 0}
856
+ }
857
+ },
858
+ "filterSpecs": {"type": "array", "maxItems": 50, "items": {"type": "object"}}
859
+ },
860
+ "allOf": [
861
+ {
862
+ "if": {"properties": {"action": {"const": "set"}}, "required": ["action"]},
863
+ "then": {"required": ["range"]}
864
+ },
865
+ {
866
+ "if": {"properties": {"action": {"const": "clear"}}, "required": ["action"]},
867
+ "then": {"required": ["sheetId"]}
868
+ }
869
+ ]
870
+ }
871
+ },
872
+ {
873
+ "name": "sheets_filter_views",
874
+ "description": "Pass the connectionRef from the connection status and the spreadsheetId of a spreadsheet the person picked or Tovu created. List, add, update, duplicate or delete saved filter views. list may narrow to one sheetId; add needs filter (with range); update needs filterViewId, filter and fields (the filter properties to change); duplicate and delete need filterViewId. The person confirms on a card before anything changes; remote changes cannot be undone from Tovu.",
875
+ "effect": "destructive",
876
+ "module": "tools/sheets-admin/filter-views.mjs",
877
+ "inputSchema": {
878
+ "type": "object",
879
+ "required": ["connectionRef", "spreadsheetId", "action"],
880
+ "additionalProperties": false,
881
+ "properties": {
882
+ "connectionRef": {"type": "string", "minLength": 1, "maxLength": 512},
883
+ "spreadsheetId": {"type": "string", "pattern": "^[A-Za-z0-9_-]{10,200}$"},
884
+ "action": {"enum": ["list", "add", "update", "duplicate", "delete"]},
885
+ "sheetId": {"type": "integer", "minimum": 0},
886
+ "filterViewId": {"type": "integer", "minimum": 0},
887
+ "filter": {
888
+ "type": "object",
889
+ "additionalProperties": false,
890
+ "properties": {
891
+ "title": {"type": "string", "minLength": 1, "maxLength": 100},
892
+ "range": {
893
+ "type": "object",
894
+ "required": ["sheetId"],
895
+ "additionalProperties": false,
896
+ "properties": {
897
+ "sheetId": {"type": "integer", "minimum": 0},
898
+ "startRowIndex": {"type": "integer", "minimum": 0},
899
+ "endRowIndex": {"type": "integer", "minimum": 0},
900
+ "startColumnIndex": {"type": "integer", "minimum": 0},
901
+ "endColumnIndex": {"type": "integer", "minimum": 0}
902
+ }
903
+ },
904
+ "namedRangeId": {"type": "string", "minLength": 1, "maxLength": 128},
905
+ "sortSpecs": {
906
+ "type": "array",
907
+ "minItems": 1,
908
+ "maxItems": 10,
909
+ "items": {
910
+ "type": "object",
911
+ "required": ["dimensionIndex"],
912
+ "additionalProperties": false,
913
+ "properties": {
914
+ "dimensionIndex": {"type": "integer", "minimum": 0},
915
+ "sortOrder": {"enum": ["ASCENDING", "DESCENDING"]}
916
+ }
917
+ }
918
+ },
919
+ "filterSpecs": {"type": "array", "maxItems": 50, "items": {"type": "object"}}
920
+ }
921
+ },
922
+ "fields": {
923
+ "type": "array",
924
+ "minItems": 1,
925
+ "maxItems": 5,
926
+ "uniqueItems": true,
927
+ "items": {"enum": ["title", "range", "namedRangeId", "sortSpecs", "filterSpecs"]}
928
+ }
929
+ },
930
+ "allOf": [
931
+ {
932
+ "if": {"properties": {"action": {"const": "add"}}, "required": ["action"]},
933
+ "then": {"required": ["filter"]}
934
+ },
935
+ {
936
+ "if": {"properties": {"action": {"const": "update"}}, "required": ["action"]},
937
+ "then": {"required": ["filterViewId", "filter", "fields"]}
938
+ },
939
+ {
940
+ "if": {"properties": {"action": {"const": "duplicate"}}, "required": ["action"]},
941
+ "then": {"required": ["filterViewId"]}
942
+ },
943
+ {
944
+ "if": {"properties": {"action": {"const": "delete"}}, "required": ["action"]},
945
+ "then": {"required": ["filterViewId"]}
946
+ }
947
+ ]
948
+ }
949
+ },
950
+ {
951
+ "name": "sheets_format",
952
+ "description": "Pass the connectionRef from the connection status and the spreadsheetId of a spreadsheet the person picked or Tovu created. Format a grid range: cellFormat (a Sheets CellFormat: numberFormat, textFormat, backgroundColor, horizontalAlignment, wrapStrategy and so on) with fields naming exactly which format properties to set (for example [\"textFormat.bold\", \"numberFormat\"]); borders (top, bottom, left, right, innerHorizontal, innerVertical); frozenRowCount and frozenColumnCount for the range's tab; columnWidth in pixels for the range's columns. Never changes cell values. The person confirms on a card before anything changes; remote changes cannot be undone from Tovu.",
953
+ "effect": "write",
954
+ "module": "tools/sheets-admin/format.mjs",
955
+ "inputSchema": {
956
+ "type": "object",
957
+ "required": ["connectionRef", "spreadsheetId", "range"],
958
+ "additionalProperties": false,
959
+ "properties": {
960
+ "connectionRef": {"type": "string", "minLength": 1, "maxLength": 512},
961
+ "spreadsheetId": {"type": "string", "pattern": "^[A-Za-z0-9_-]{10,200}$"},
962
+ "range": {
963
+ "type": "object",
964
+ "required": ["sheetId"],
965
+ "additionalProperties": false,
966
+ "properties": {
967
+ "sheetId": {"type": "integer", "minimum": 0},
968
+ "startRowIndex": {"type": "integer", "minimum": 0},
969
+ "endRowIndex": {"type": "integer", "minimum": 0},
970
+ "startColumnIndex": {"type": "integer", "minimum": 0},
971
+ "endColumnIndex": {"type": "integer", "minimum": 0}
972
+ }
973
+ },
974
+ "cellFormat": {
975
+ "type": "object",
976
+ "minProperties": 1,
977
+ "additionalProperties": false,
978
+ "properties": {
979
+ "numberFormat": {},
980
+ "backgroundColor": {},
981
+ "backgroundColorStyle": {},
982
+ "borders": {},
983
+ "padding": {},
984
+ "horizontalAlignment": {},
985
+ "verticalAlignment": {},
986
+ "wrapStrategy": {},
987
+ "textDirection": {},
988
+ "textFormat": {},
989
+ "hyperlinkDisplayType": {},
990
+ "textRotation": {}
991
+ }
992
+ },
993
+ "fields": {
994
+ "type": "array",
995
+ "minItems": 1,
996
+ "maxItems": 20,
997
+ "uniqueItems": true,
998
+ "items": {
999
+ "type": "string",
1000
+ "maxLength": 100,
1001
+ "pattern": "^(numberFormat|backgroundColor|backgroundColorStyle|borders|padding|horizontalAlignment|verticalAlignment|wrapStrategy|textDirection|textFormat|hyperlinkDisplayType|textRotation)(\\.[A-Za-z]+)*$"
1002
+ }
1003
+ },
1004
+ "borders": {
1005
+ "type": "object",
1006
+ "minProperties": 1,
1007
+ "additionalProperties": false,
1008
+ "properties": {
1009
+ "top": {"type": "object"},
1010
+ "bottom": {"type": "object"},
1011
+ "left": {"type": "object"},
1012
+ "right": {"type": "object"},
1013
+ "innerHorizontal": {"type": "object"},
1014
+ "innerVertical": {"type": "object"}
1015
+ }
1016
+ },
1017
+ "frozenRowCount": {"type": "integer", "minimum": 0, "maximum": 1000},
1018
+ "frozenColumnCount": {"type": "integer", "minimum": 0, "maximum": 100},
1019
+ "columnWidth": {"type": "integer", "minimum": 1, "maximum": 2000}
1020
+ },
1021
+ "dependentRequired": {"cellFormat": ["fields"], "fields": ["cellFormat"]},
1022
+ "anyOf": [
1023
+ {"required": ["cellFormat"]},
1024
+ {"required": ["borders"]},
1025
+ {"required": ["frozenRowCount"]},
1026
+ {"required": ["frozenColumnCount"]},
1027
+ {"required": ["columnWidth"]}
1028
+ ]
1029
+ }
1030
+ },
1031
+ {
1032
+ "name": "sheets_named_ranges",
1033
+ "description": "Pass the connectionRef from the connection status and the spreadsheetId of a spreadsheet the person picked or Tovu created. List, add, update or delete named ranges. add needs name and range; update needs namedRangeId and a new name or range; delete needs namedRangeId. Formulas that use a deleted or moved name change with it. The person confirms on a card before anything changes; remote changes cannot be undone from Tovu.",
1034
+ "effect": "destructive",
1035
+ "module": "tools/sheets-admin/named-ranges.mjs",
1036
+ "inputSchema": {
1037
+ "type": "object",
1038
+ "required": ["connectionRef", "spreadsheetId", "action"],
1039
+ "additionalProperties": false,
1040
+ "properties": {
1041
+ "connectionRef": {"type": "string", "minLength": 1, "maxLength": 512},
1042
+ "spreadsheetId": {"type": "string", "pattern": "^[A-Za-z0-9_-]{10,200}$"},
1043
+ "action": {"enum": ["list", "add", "update", "delete"]},
1044
+ "namedRangeId": {"type": "string", "minLength": 1, "maxLength": 128},
1045
+ "name": {"type": "string", "pattern": "^[A-Za-z_][A-Za-z0-9_.]{0,99}$"},
1046
+ "range": {
1047
+ "type": "object",
1048
+ "required": ["sheetId"],
1049
+ "additionalProperties": false,
1050
+ "properties": {
1051
+ "sheetId": {"type": "integer", "minimum": 0},
1052
+ "startRowIndex": {"type": "integer", "minimum": 0},
1053
+ "endRowIndex": {"type": "integer", "minimum": 0},
1054
+ "startColumnIndex": {"type": "integer", "minimum": 0},
1055
+ "endColumnIndex": {"type": "integer", "minimum": 0}
1056
+ }
1057
+ }
1058
+ },
1059
+ "allOf": [
1060
+ {
1061
+ "if": {"properties": {"action": {"const": "add"}}, "required": ["action"]},
1062
+ "then": {"required": ["name", "range"]}
1063
+ },
1064
+ {
1065
+ "if": {"properties": {"action": {"const": "update"}}, "required": ["action"]},
1066
+ "then": {"required": ["namedRangeId"]}
1067
+ },
1068
+ {
1069
+ "if": {"properties": {"action": {"const": "delete"}}, "required": ["action"]},
1070
+ "then": {"required": ["namedRangeId"]}
1071
+ },
1072
+ {
1073
+ "if": {"properties": {"action": {"const": "update"}}, "required": ["action"]},
1074
+ "then": {"anyOf": [{"required": ["name"]}, {"required": ["range"]}]}
1075
+ }
1076
+ ]
1077
+ }
1078
+ },
1079
+ {
1080
+ "name": "sheets_protected_ranges_get",
1081
+ "description": "Pass the connectionRef from the connection status and the spreadsheetId of a spreadsheet the person picked or Tovu created. Which ranges are protected, who may edit them, and whether the connected account can (requestingUserCanEdit). Optionally only one tab (sheetId). Changing protection goes through sheets_batch_update.",
1082
+ "effect": "read",
1083
+ "module": "tools/sheets-admin/protected-ranges-get.mjs",
1084
+ "inputSchema": {
1085
+ "type": "object",
1086
+ "required": ["connectionRef", "spreadsheetId"],
1087
+ "additionalProperties": false,
1088
+ "properties": {
1089
+ "connectionRef": {"type": "string", "minLength": 1, "maxLength": 512},
1090
+ "spreadsheetId": {"type": "string", "pattern": "^[A-Za-z0-9_-]{10,200}$"},
1091
+ "sheetId": {"type": "integer", "minimum": 0}
1092
+ }
1093
+ }
1094
+ },
1095
+ {
1096
+ "name": "sheets_developer_metadata",
1097
+ "description": "Pass the connectionRef from the connection status and the spreadsheetId of a spreadsheet the person picked or Tovu created. Read developer metadata: get one entry by metadataId, or search with up to 20 Sheets DataFilter objects. Creating, changing or deleting metadata goes through sheets_batch_update.",
1098
+ "effect": "read",
1099
+ "module": "tools/sheets-admin/developer-metadata.mjs",
1100
+ "inputSchema": {
1101
+ "type": "object",
1102
+ "required": ["connectionRef", "spreadsheetId", "action"],
1103
+ "additionalProperties": false,
1104
+ "properties": {
1105
+ "connectionRef": {"type": "string", "minLength": 1, "maxLength": 512},
1106
+ "spreadsheetId": {"type": "string", "pattern": "^[A-Za-z0-9_-]{10,200}$"},
1107
+ "action": {"enum": ["get", "search"]},
1108
+ "metadataId": {"type": "integer", "minimum": 0},
1109
+ "dataFilters": {"type": "array", "minItems": 1, "maxItems": 20, "items": {"type": "object"}}
1110
+ },
1111
+ "allOf": [
1112
+ {
1113
+ "if": {"properties": {"action": {"const": "get"}}, "required": ["action"]},
1114
+ "then": {"required": ["metadataId"]}
1115
+ },
1116
+ {
1117
+ "if": {"properties": {"action": {"const": "search"}}, "required": ["action"]},
1118
+ "then": {"required": ["dataFilters"]}
1119
+ }
1120
+ ]
1121
+ }
1122
+ },
1123
+ {
1124
+ "name": "sheets_batch_update",
1125
+ "description": "Pass the connectionRef from the connection status and the spreadsheetId of a spreadsheet the person picked or Tovu created. Send up to 100 Sheets batchUpdate request objects (each names exactly one request kind, for example {\"insertDimension\": {...}}) in one atomic call, at most 1 MiB. Only reviewed, generally available request kinds are accepted (see the Sheets reference of this plugin); any other kind is refused before anything is sent. Field masks must be explicit, never *. The card lists every request kind. The person confirms on a card before anything changes; remote changes cannot be undone from Tovu.",
1126
+ "effect": "destructive",
1127
+ "module": "tools/sheets-admin/batch-update.mjs",
1128
+ "inputSchema": {
1129
+ "type": "object",
1130
+ "required": ["connectionRef", "spreadsheetId", "requests"],
1131
+ "additionalProperties": false,
1132
+ "properties": {
1133
+ "connectionRef": {"type": "string", "minLength": 1, "maxLength": 512},
1134
+ "spreadsheetId": {"type": "string", "pattern": "^[A-Za-z0-9_-]{10,200}$"},
1135
+ "requests": {
1136
+ "type": "array",
1137
+ "minItems": 1,
1138
+ "maxItems": 100,
1139
+ "items": {"type": "object", "minProperties": 1, "maxProperties": 1}
1140
+ }
1141
+ }
1142
+ }
1143
+ },
1144
+ {
1145
+ "name": "sheets_export_csv",
1146
+ "description": "Pass the connectionRef from the connection status and the spreadsheetId of a spreadsheet the person picked or Tovu created. Export one tab (sheetId), or an A1 range of it such as A1:F500, as a CSV file the person can download. At most 20,000 rows and 100,000 cells; a larger export is refused, never cut short. valueRenderOption FORMATTED_VALUE (default, as displayed) or UNFORMATTED_VALUE. Returns the file reference and its size, not the data.",
1147
+ "effect": "read",
1148
+ "module": "tools/sheets-admin/export-csv.mjs",
1149
+ "inputSchema": {
1150
+ "type": "object",
1151
+ "required": ["connectionRef", "spreadsheetId", "sheetId"],
1152
+ "additionalProperties": false,
1153
+ "properties": {
1154
+ "connectionRef": {"type": "string", "minLength": 1, "maxLength": 512},
1155
+ "spreadsheetId": {"type": "string", "pattern": "^[A-Za-z0-9_-]{10,200}$"},
1156
+ "sheetId": {"type": "integer", "minimum": 0},
1157
+ "range": {"type": "string", "pattern": "^[A-Z]{1,3}[1-9][0-9]{0,6}:[A-Z]{1,3}[1-9][0-9]{0,6}$"},
1158
+ "valueRenderOption": {"enum": ["FORMATTED_VALUE", "UNFORMATTED_VALUE"]}
1159
+ }
1160
+ }
1161
+ },
1162
+ {
1163
+ "name": "sheets_open_existing",
1164
+ "description": "Work with a spreadsheet the person already has. Pass the connectionRef. Without spreadsheetId it answers waiting: the person chooses the file with Google's file picker in the Google Workspace plugin (a pasted link grants nothing). With the spreadsheetId of a picked file it checks that Tovu can open it and that it is a spreadsheet, and returns its id, title and link.",
1165
+ "effect": "read",
1166
+ "module": "tools/sheets-admin/open-existing.mjs",
1167
+ "inputSchema": {
1168
+ "type": "object",
1169
+ "required": ["connectionRef"],
1170
+ "additionalProperties": false,
1171
+ "properties": {
1172
+ "connectionRef": {"type": "string", "minLength": 1, "maxLength": 512},
1173
+ "spreadsheetId": {"type": "string", "pattern": "^[A-Za-z0-9_-]{10,200}$"}
1174
+ }
1175
+ }
1176
+ }
1177
+ ]
1178
+ }