@commandable/integration-data 0.0.5 → 0.0.7
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.
- package/dist/credentials-index.d.ts.map +1 -1
- package/dist/credentials-index.js +183 -0
- package/dist/credentials-index.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/loader.d.ts +33 -0
- package/dist/loader.d.ts.map +1 -1
- package/dist/loader.js +36 -4
- package/dist/loader.js.map +1 -1
- package/integrations/__tests__/liveHarness.ts +16 -3
- package/integrations/airtable/.env.test +9 -0
- package/integrations/airtable/.env.test.example +11 -0
- package/integrations/airtable/README.md +27 -0
- package/integrations/airtable/__tests__/get_handlers.test.ts +43 -5
- package/integrations/confluence/.env.test +25 -0
- package/integrations/confluence/.env.test.example +36 -0
- package/integrations/confluence/README.md +28 -0
- package/integrations/confluence/__tests__/get_handlers.test.ts +121 -0
- package/integrations/confluence/__tests__/usage_parity.test.ts +14 -0
- package/integrations/confluence/__tests__/write_handlers.test.ts +131 -0
- package/integrations/confluence/credentials.json +39 -0
- package/integrations/confluence/credentials_hint.md +4 -0
- package/integrations/confluence/credentials_hint_api_token.md +9 -0
- package/integrations/confluence/credentials_hint_oauth_token.md +8 -0
- package/integrations/confluence/handlers/add_comment.js +19 -0
- package/integrations/confluence/handlers/add_label.js +16 -0
- package/integrations/confluence/handlers/create_page.js +22 -0
- package/integrations/confluence/handlers/delete_page.js +17 -0
- package/integrations/confluence/handlers/get_comments.js +33 -0
- package/integrations/confluence/handlers/get_page_children.js +30 -0
- package/integrations/confluence/handlers/get_space.js +22 -0
- package/integrations/confluence/handlers/list_spaces.js +39 -0
- package/integrations/confluence/handlers/read_page.js +49 -0
- package/integrations/confluence/handlers/search_pages.js +42 -0
- package/integrations/confluence/handlers/update_page.js +42 -0
- package/integrations/confluence/manifest.json +85 -0
- package/integrations/confluence/prompt.md +55 -0
- package/integrations/confluence/schemas/add_comment.json +22 -0
- package/integrations/confluence/schemas/add_label.json +19 -0
- package/integrations/confluence/schemas/create_page.json +33 -0
- package/integrations/confluence/schemas/delete_page.json +23 -0
- package/integrations/confluence/schemas/empty.json +6 -0
- package/integrations/confluence/schemas/get_comments.json +24 -0
- package/integrations/confluence/schemas/get_page_children.json +28 -0
- package/integrations/confluence/schemas/get_space.json +18 -0
- package/integrations/confluence/schemas/list_spaces.json +36 -0
- package/integrations/confluence/schemas/read_page.json +28 -0
- package/integrations/confluence/schemas/search_pages.json +26 -0
- package/integrations/confluence/schemas/update_page.json +31 -0
- package/integrations/github/.env.test +16 -0
- package/integrations/github/.env.test.example +17 -0
- package/integrations/github/README.md +75 -0
- package/integrations/github/__tests__/get_handlers.test.ts +207 -12
- package/integrations/github/__tests__/write_handlers.test.ts +323 -55
- package/integrations/github/handlers/create_commit.js +10 -2
- package/integrations/github/handlers/create_file.js +46 -0
- package/integrations/github/handlers/create_pull_request_review.js +10 -0
- package/integrations/github/handlers/create_release.js +14 -0
- package/integrations/github/handlers/delete_branch.js +8 -0
- package/integrations/github/handlers/delete_file.js +22 -0
- package/integrations/github/handlers/edit_file.js +52 -0
- package/integrations/github/handlers/edit_files.js +107 -0
- package/integrations/github/handlers/fork_repo.js +10 -0
- package/integrations/github/handlers/get_commit.js +8 -0
- package/integrations/github/handlers/get_file_contents.js +21 -0
- package/integrations/github/handlers/get_job_logs.js +6 -0
- package/integrations/github/handlers/get_latest_release.js +4 -0
- package/integrations/github/handlers/get_me.js +4 -0
- package/integrations/github/handlers/get_pull_request.js +4 -0
- package/integrations/github/handlers/get_pull_request_diff.js +8 -0
- package/integrations/github/handlers/get_repo_tree.js +12 -0
- package/integrations/github/handlers/get_workflow_run.js +4 -0
- package/integrations/github/handlers/list_branches.js +6 -1
- package/integrations/github/handlers/list_commits.js +5 -6
- package/integrations/github/handlers/list_issue_comments.js +8 -0
- package/integrations/github/handlers/list_issues.js +5 -6
- package/integrations/github/handlers/list_labels.js +8 -0
- package/integrations/github/handlers/list_pull_request_comments.js +8 -0
- package/integrations/github/handlers/list_pull_request_files.js +8 -0
- package/integrations/github/handlers/list_pull_requests.js +7 -2
- package/integrations/github/handlers/list_releases.js +8 -0
- package/integrations/github/handlers/list_tags.js +8 -0
- package/integrations/github/handlers/list_workflow_runs.js +11 -0
- package/integrations/github/handlers/request_pull_request_reviewers.js +10 -0
- package/integrations/github/handlers/search_code.js +8 -0
- package/integrations/github/handlers/search_issues.js +8 -0
- package/integrations/github/handlers/search_pull_requests.js +8 -0
- package/integrations/github/handlers/search_repos.js +10 -0
- package/integrations/github/handlers/update_pull_request.js +13 -0
- package/integrations/github/manifest.json +86 -21
- package/integrations/github/prompt.md +36 -0
- package/integrations/github/schemas/create_file.json +13 -0
- package/integrations/github/schemas/create_pull_request_review.json +17 -0
- package/integrations/github/schemas/create_release.json +16 -0
- package/integrations/github/schemas/delete_branch.json +10 -0
- package/integrations/github/schemas/delete_file.json +13 -0
- package/integrations/github/schemas/edit_file.json +26 -0
- package/integrations/github/schemas/edit_files.json +39 -0
- package/integrations/github/schemas/fork_repo.json +11 -0
- package/integrations/github/schemas/get_commit.json +12 -0
- package/integrations/github/schemas/get_file_contents.json +11 -0
- package/integrations/github/schemas/get_job_logs.json +10 -0
- package/integrations/github/schemas/get_pull_request.json +10 -0
- package/integrations/github/schemas/get_pull_request_diff.json +10 -0
- package/integrations/github/schemas/get_repo_tree.json +12 -0
- package/integrations/github/schemas/get_workflow_run.json +10 -0
- package/integrations/github/schemas/list_branches.json +12 -0
- package/integrations/github/schemas/list_commits.json +5 -3
- package/integrations/github/schemas/list_issue_comments.json +12 -0
- package/integrations/github/schemas/list_issues.json +4 -2
- package/integrations/github/schemas/list_labels.json +11 -0
- package/integrations/github/schemas/list_pull_request_comments.json +12 -0
- package/integrations/github/schemas/list_pull_request_files.json +12 -0
- package/integrations/github/schemas/list_pull_requests.json +7 -1
- package/integrations/github/schemas/list_releases.json +11 -0
- package/integrations/github/schemas/list_tags.json +11 -0
- package/integrations/github/schemas/list_workflow_runs.json +18 -0
- package/integrations/github/schemas/request_pull_request_reviewers.json +20 -0
- package/integrations/github/schemas/search_code.json +10 -0
- package/integrations/github/schemas/search_issues.json +10 -0
- package/integrations/github/schemas/search_pull_requests.json +10 -0
- package/integrations/github/schemas/search_repos.json +12 -0
- package/integrations/github/schemas/update_pull_request.json +15 -0
- package/integrations/google-calendar/.env.test.example +11 -0
- package/integrations/google-calendar/README.md +41 -0
- package/integrations/google-calendar/__tests__/write_and_admin_handlers.test.ts +7 -20
- package/integrations/google-calendar/handlers/get_event.js +5 -1
- package/integrations/google-calendar/handlers/list_events.js +2 -0
- package/integrations/google-calendar/manifest.json +27 -18
- package/integrations/google-calendar/prompt.md +68 -0
- package/integrations/google-calendar/schemas/id_calendar_event.json +4 -2
- package/integrations/google-calendar/schemas/list_events.json +10 -8
- package/integrations/google-docs/README.md +30 -0
- package/integrations/google-docs/__tests__/get_handlers.test.ts +4 -19
- package/integrations/google-docs/__tests__/write_handlers.test.ts +31 -48
- package/integrations/google-docs/handlers/read_document.js +189 -0
- package/integrations/google-docs/manifest.json +16 -31
- package/integrations/google-docs/prompt.md +49 -0
- package/integrations/google-docs/schemas/{get_document_text.json → read_document.json} +5 -2
- package/integrations/google-docs/todo.md +18 -0
- package/integrations/google-drive/README.md +26 -0
- package/integrations/google-drive/__tests__/handlers.test.ts +43 -0
- package/integrations/google-drive/__tests__/usage_parity.test.ts +9 -0
- package/integrations/google-drive/handlers/get_file.js +2 -4
- package/integrations/google-drive/handlers/get_file_content.js +41 -0
- package/integrations/google-drive/handlers/list_files.js +15 -0
- package/integrations/google-drive/handlers/search_files.js +20 -0
- package/integrations/google-drive/handlers/share_file.js +20 -0
- package/integrations/google-drive/manifest.json +37 -10
- package/integrations/google-drive/prompt.md +59 -0
- package/integrations/google-drive/schemas/get_file.json +2 -2
- package/integrations/google-drive/schemas/get_file_content.json +11 -0
- package/integrations/google-drive/schemas/list_files.json +12 -0
- package/integrations/google-drive/schemas/search_files.json +14 -0
- package/integrations/google-drive/schemas/share_file.json +23 -0
- package/integrations/google-gmail/.env.test.example +11 -0
- package/integrations/google-gmail/README.md +49 -0
- package/integrations/google-gmail/__tests__/get_handlers.test.ts +134 -0
- package/integrations/google-gmail/__tests__/usage_parity.test.ts +9 -0
- package/integrations/google-gmail/__tests__/write_and_admin_handlers.test.ts +211 -0
- package/integrations/google-gmail/credentials.json +57 -0
- package/integrations/google-gmail/credentials_hint_oauth_token.md +8 -0
- package/integrations/google-gmail/credentials_hint_service_account.md +10 -0
- package/integrations/google-gmail/handlers/create_draft_email.js +27 -0
- package/integrations/google-gmail/handlers/create_label.js +12 -0
- package/integrations/google-gmail/handlers/delete_draft.js +13 -0
- package/integrations/google-gmail/handlers/delete_label.js +13 -0
- package/integrations/google-gmail/handlers/delete_message.js +13 -0
- package/integrations/google-gmail/handlers/delete_thread.js +13 -0
- package/integrations/google-gmail/handlers/get_draft.js +6 -0
- package/integrations/google-gmail/handlers/get_label.js +6 -0
- package/integrations/google-gmail/handlers/get_message.js +14 -0
- package/integrations/google-gmail/handlers/get_profile.js +5 -0
- package/integrations/google-gmail/handlers/get_thread.js +14 -0
- package/integrations/google-gmail/handlers/list_drafts.js +15 -0
- package/integrations/google-gmail/handlers/list_labels.js +5 -0
- package/integrations/google-gmail/handlers/list_messages.js +19 -0
- package/integrations/google-gmail/handlers/list_threads.js +19 -0
- package/integrations/google-gmail/handlers/modify_message.js +11 -0
- package/integrations/google-gmail/handlers/modify_thread.js +11 -0
- package/integrations/google-gmail/handlers/read_email.js +56 -0
- package/integrations/google-gmail/handlers/send_draft.js +15 -0
- package/integrations/google-gmail/handlers/send_email.js +22 -0
- package/integrations/google-gmail/handlers/trash_message.js +6 -0
- package/integrations/google-gmail/handlers/trash_thread.js +6 -0
- package/integrations/google-gmail/handlers/untrash_message.js +6 -0
- package/integrations/google-gmail/handlers/untrash_thread.js +6 -0
- package/integrations/google-gmail/handlers/update_label.js +15 -0
- package/integrations/google-gmail/manifest.json +44 -0
- package/integrations/google-gmail/prompt.md +52 -0
- package/integrations/google-gmail/schemas/create_draft_email.json +16 -0
- package/integrations/google-gmail/schemas/create_label.json +26 -0
- package/integrations/google-gmail/schemas/get_message.json +20 -0
- package/integrations/{google-docs/schemas/get_document_structured.json → google-gmail/schemas/get_profile.json} +4 -2
- package/integrations/google-gmail/schemas/get_thread.json +20 -0
- package/integrations/google-gmail/schemas/id_draft.json +16 -0
- package/integrations/google-gmail/schemas/id_label.json +16 -0
- package/integrations/google-gmail/schemas/id_message.json +16 -0
- package/integrations/google-gmail/schemas/id_thread.json +16 -0
- package/integrations/google-gmail/schemas/list_drafts.json +30 -0
- package/integrations/{google-sheet/schemas/get_developer_metadata.json → google-gmail/schemas/list_labels.json} +4 -3
- package/integrations/google-gmail/schemas/list_messages.json +35 -0
- package/integrations/google-gmail/schemas/list_threads.json +35 -0
- package/integrations/google-gmail/schemas/modify_message.json +24 -0
- package/integrations/google-gmail/schemas/modify_thread.json +24 -0
- package/integrations/google-gmail/schemas/read_email.json +10 -0
- package/integrations/google-gmail/schemas/send_draft.json +29 -0
- package/integrations/google-gmail/schemas/send_email.json +17 -0
- package/integrations/google-gmail/schemas/update_label.json +33 -0
- package/integrations/google-sheet/README.md +27 -0
- package/integrations/google-sheet/__tests__/get_handlers.test.ts +6 -52
- package/integrations/google-sheet/__tests__/write_handlers.test.ts +0 -20
- package/integrations/google-sheet/handlers/get_spreadsheet.js +2 -0
- package/integrations/google-sheet/handlers/read_sheet.js +75 -0
- package/integrations/google-sheet/manifest.json +13 -62
- package/integrations/google-sheet/prompt.md +49 -0
- package/integrations/google-sheet/schemas/get_spreadsheet.json +5 -4
- package/integrations/google-sheet/schemas/read_sheet.json +21 -0
- package/integrations/google-slides/README.md +28 -0
- package/integrations/google-slides/__tests__/get_handlers.test.ts +12 -9
- package/integrations/google-slides/handlers/read_presentation.js +51 -0
- package/integrations/google-slides/manifest.json +13 -13
- package/integrations/google-slides/prompt.md +56 -0
- package/integrations/hubspot/.env.test.example +20 -0
- package/integrations/hubspot/README.md +48 -0
- package/integrations/hubspot/__tests__/get_handlers.test.ts +151 -0
- package/integrations/hubspot/__tests__/usage_parity.test.ts +10 -0
- package/integrations/hubspot/__tests__/write_handlers.test.ts +244 -0
- package/integrations/hubspot/credentials.json +48 -0
- package/integrations/hubspot/credentials_hint.md +20 -0
- package/integrations/hubspot/credentials_hint_oauth_token.md +16 -0
- package/integrations/hubspot/handlers/archive_company.js +13 -0
- package/integrations/hubspot/handlers/archive_contact.js +13 -0
- package/integrations/hubspot/handlers/archive_deal.js +13 -0
- package/integrations/hubspot/handlers/archive_ticket.js +13 -0
- package/integrations/hubspot/handlers/create_association.js +18 -0
- package/integrations/hubspot/handlers/create_company.js +13 -0
- package/integrations/hubspot/handlers/create_contact.js +14 -0
- package/integrations/hubspot/handlers/create_deal.js +16 -0
- package/integrations/hubspot/handlers/create_note.js +44 -0
- package/integrations/hubspot/handlers/create_task.js +48 -0
- package/integrations/hubspot/handlers/create_ticket.js +15 -0
- package/integrations/hubspot/handlers/get_associations.js +14 -0
- package/integrations/hubspot/handlers/get_company.js +18 -0
- package/integrations/hubspot/handlers/get_contact.js +18 -0
- package/integrations/hubspot/handlers/get_deal.js +18 -0
- package/integrations/hubspot/handlers/get_ticket.js +20 -0
- package/integrations/hubspot/handlers/list_owners.js +12 -0
- package/integrations/hubspot/handlers/list_pipelines.js +5 -0
- package/integrations/hubspot/handlers/list_properties.js +11 -0
- package/integrations/hubspot/handlers/remove_association.js +22 -0
- package/integrations/hubspot/handlers/search_companies.js +43 -0
- package/integrations/hubspot/handlers/search_contacts.js +43 -0
- package/integrations/hubspot/handlers/search_deals.js +43 -0
- package/integrations/hubspot/handlers/search_notes.js +43 -0
- package/integrations/hubspot/handlers/search_tasks.js +43 -0
- package/integrations/hubspot/handlers/search_tickets.js +43 -0
- package/integrations/hubspot/handlers/update_company.js +13 -0
- package/integrations/hubspot/handlers/update_contact.js +14 -0
- package/integrations/hubspot/handlers/update_deal.js +16 -0
- package/integrations/hubspot/handlers/update_task.js +17 -0
- package/integrations/hubspot/handlers/update_ticket.js +15 -0
- package/integrations/hubspot/manifest.json +230 -0
- package/integrations/hubspot/prompt.md +69 -0
- package/integrations/hubspot/schemas/archive_company.json +13 -0
- package/integrations/hubspot/schemas/archive_contact.json +13 -0
- package/integrations/hubspot/schemas/archive_deal.json +9 -0
- package/integrations/hubspot/schemas/archive_ticket.json +9 -0
- package/integrations/hubspot/schemas/create_association.json +24 -0
- package/integrations/hubspot/schemas/create_company.json +14 -0
- package/integrations/hubspot/schemas/create_contact.json +15 -0
- package/integrations/hubspot/schemas/create_deal.json +20 -0
- package/integrations/hubspot/schemas/create_note.json +37 -0
- package/integrations/hubspot/schemas/create_task.json +51 -0
- package/integrations/hubspot/schemas/create_ticket.json +16 -0
- package/integrations/hubspot/schemas/empty.json +6 -0
- package/integrations/hubspot/schemas/get_associations.json +30 -0
- package/integrations/hubspot/schemas/get_company.json +27 -0
- package/integrations/hubspot/schemas/get_contact.json +27 -0
- package/integrations/hubspot/schemas/get_deal.json +20 -0
- package/integrations/hubspot/schemas/get_ticket.json +20 -0
- package/integrations/hubspot/schemas/list_owners.json +25 -0
- package/integrations/hubspot/schemas/list_pipelines.json +13 -0
- package/integrations/hubspot/schemas/list_properties.json +17 -0
- package/integrations/hubspot/schemas/remove_association.json +24 -0
- package/integrations/hubspot/schemas/search_companies.json +56 -0
- package/integrations/hubspot/schemas/search_contacts.json +56 -0
- package/integrations/hubspot/schemas/search_deals.json +43 -0
- package/integrations/hubspot/schemas/search_notes.json +43 -0
- package/integrations/hubspot/schemas/search_tasks.json +43 -0
- package/integrations/hubspot/schemas/search_tickets.json +43 -0
- package/integrations/hubspot/schemas/update_company.json +20 -0
- package/integrations/hubspot/schemas/update_contact.json +21 -0
- package/integrations/hubspot/schemas/update_deal.json +19 -0
- package/integrations/hubspot/schemas/update_task.json +31 -0
- package/integrations/hubspot/schemas/update_ticket.json +18 -0
- package/integrations/jira/.env.test +46 -0
- package/integrations/jira/.env.test.example +41 -0
- package/integrations/jira/README.md +46 -0
- package/integrations/jira/__tests__/get_handlers.test.ts +193 -0
- package/integrations/jira/__tests__/usage_parity.test.ts +14 -0
- package/integrations/jira/__tests__/write_handlers.test.ts +157 -0
- package/integrations/jira/credentials.json +39 -0
- package/integrations/jira/credentials_hint.md +4 -0
- package/integrations/jira/credentials_hint_api_token.md +6 -0
- package/integrations/jira/credentials_hint_oauth_token.md +6 -0
- package/integrations/jira/handlers/add_comment.js +9 -0
- package/integrations/jira/handlers/assign_issue.js +11 -0
- package/integrations/jira/handlers/create_issue.js +37 -0
- package/integrations/jira/handlers/create_sprint.js +19 -0
- package/integrations/jira/handlers/delete_issue.js +10 -0
- package/integrations/jira/handlers/get_backlog_issues.js +13 -0
- package/integrations/jira/handlers/get_board.js +6 -0
- package/integrations/jira/handlers/get_issue.js +63 -0
- package/integrations/jira/handlers/get_issue_comments.js +31 -0
- package/integrations/jira/handlers/get_myself.js +14 -0
- package/integrations/jira/handlers/get_project.js +28 -0
- package/integrations/jira/handlers/get_sprint.js +5 -0
- package/integrations/jira/handlers/get_sprint_issues.js +13 -0
- package/integrations/jira/handlers/get_transitions.js +23 -0
- package/integrations/jira/handlers/list_boards.js +34 -0
- package/integrations/jira/handlers/list_projects.js +29 -0
- package/integrations/jira/handlers/list_sprints.js +29 -0
- package/integrations/jira/handlers/move_issues_to_sprint.js +11 -0
- package/integrations/jira/handlers/search_issues.js +43 -0
- package/integrations/jira/handlers/search_users.js +21 -0
- package/integrations/jira/handlers/transition_issue.js +44 -0
- package/integrations/jira/handlers/update_issue.js +40 -0
- package/integrations/jira/handlers/update_sprint.js +20 -0
- package/integrations/jira/manifest.json +204 -0
- package/integrations/jira/prompt.md +80 -0
- package/integrations/jira/schemas/add_comment.json +16 -0
- package/integrations/jira/schemas/assign_issue.json +16 -0
- package/integrations/jira/schemas/create_issue.json +49 -0
- package/integrations/jira/schemas/create_sprint.json +29 -0
- package/integrations/jira/schemas/delete_issue.json +12 -0
- package/integrations/jira/schemas/empty.json +6 -0
- package/integrations/jira/schemas/get_backlog_issues.json +33 -0
- package/integrations/jira/schemas/get_board.json +13 -0
- package/integrations/jira/schemas/get_issue.json +23 -0
- package/integrations/jira/schemas/get_issue_comments.json +23 -0
- package/integrations/jira/schemas/get_project.json +17 -0
- package/integrations/jira/schemas/get_sprint.json +13 -0
- package/integrations/jira/schemas/get_sprint_issues.json +33 -0
- package/integrations/jira/schemas/get_transitions.json +12 -0
- package/integrations/jira/schemas/list_boards.json +27 -0
- package/integrations/jira/schemas/list_projects.json +22 -0
- package/integrations/jira/schemas/list_sprints.json +29 -0
- package/integrations/jira/schemas/move_issues_to_sprint.json +19 -0
- package/integrations/jira/schemas/search_issues.json +28 -0
- package/integrations/jira/schemas/search_users.json +18 -0
- package/integrations/jira/schemas/transition_issue.json +38 -0
- package/integrations/jira/schemas/update_issue.json +47 -0
- package/integrations/jira/schemas/update_sprint.json +33 -0
- package/integrations/new_integration_prompt.md +177 -2
- package/integrations/notion/.env.test +10 -0
- package/integrations/notion/.env.test.example +13 -0
- package/integrations/notion/README.md +42 -0
- package/integrations/notion/manifest.json +64 -35
- package/integrations/trello/.env.test +6 -0
- package/integrations/trello/.env.test.example +9 -0
- package/integrations/trello/README.md +50 -0
- package/package.json +7 -3
- package/integrations/google-calendar/handlers/update_event.js +0 -5
- package/integrations/google-calendar/schemas/update_event.json +0 -10
- package/integrations/google-docs/handlers/get_document.js +0 -12
- package/integrations/google-docs/handlers/get_document_structured.js +0 -6
- package/integrations/google-docs/handlers/get_document_text.js +0 -17
- package/integrations/google-docs/schemas/get_document.json +0 -11
- package/integrations/google-sheet/handlers/batch_clear_values_by_data_filter.js +0 -6
- package/integrations/google-sheet/handlers/batch_get_values.js +0 -16
- package/integrations/google-sheet/handlers/batch_update_values_by_data_filter.js +0 -16
- package/integrations/google-sheet/handlers/get_developer_metadata.js +0 -6
- package/integrations/google-sheet/handlers/get_spreadsheet_by_data_filter.js +0 -10
- package/integrations/google-sheet/handlers/get_values.js +0 -14
- package/integrations/google-sheet/handlers/get_values_by_data_filter.js +0 -14
- package/integrations/google-sheet/handlers/search_developer_metadata.js +0 -7
- package/integrations/google-sheet/schemas/batch_clear_values_by_data_filter.json +0 -10
- package/integrations/google-sheet/schemas/batch_get_values.json +0 -13
- package/integrations/google-sheet/schemas/batch_update_values_by_data_filter.json +0 -25
- package/integrations/google-sheet/schemas/get_spreadsheet_by_data_filter.json +0 -11
- package/integrations/google-sheet/schemas/get_values.json +0 -13
- package/integrations/google-sheet/schemas/get_values_by_data_filter.json +0 -17
- package/integrations/google-sheet/schemas/search_developer_metadata.json +0 -14
- package/integrations/google-slides/handlers/get_presentation.js +0 -6
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
async (input) => {
|
|
2
|
+
const MONO_FONTS = new Set([
|
|
3
|
+
'Courier',
|
|
4
|
+
'Courier New',
|
|
5
|
+
'Consolas',
|
|
6
|
+
'Menlo',
|
|
7
|
+
'Monaco',
|
|
8
|
+
'Roboto Mono',
|
|
9
|
+
'Source Code Pro',
|
|
10
|
+
])
|
|
11
|
+
|
|
12
|
+
const HEADING_MAP = {
|
|
13
|
+
TITLE: '#',
|
|
14
|
+
SUBTITLE: '##',
|
|
15
|
+
HEADING_1: '#',
|
|
16
|
+
HEADING_2: '##',
|
|
17
|
+
HEADING_3: '###',
|
|
18
|
+
HEADING_4: '####',
|
|
19
|
+
HEADING_5: '#####',
|
|
20
|
+
HEADING_6: '######',
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const BULLET_GLYPHS = new Set([
|
|
24
|
+
'BULLET_DISC_CIRCLE_SQUARE',
|
|
25
|
+
'BULLET_DIAMONDX_ARROW3D_SQUARE',
|
|
26
|
+
'BULLET_CHECKBOX',
|
|
27
|
+
'BULLET_ARROW_DIAMOND_DISC',
|
|
28
|
+
'BULLET_STAR_CIRCLE_SQUARE',
|
|
29
|
+
])
|
|
30
|
+
|
|
31
|
+
const LIST_NUMBER_GLYPHS = new Set([
|
|
32
|
+
'DECIMAL',
|
|
33
|
+
'ZERO_DECIMAL',
|
|
34
|
+
'UPPER_ALPHA',
|
|
35
|
+
'ALPHA',
|
|
36
|
+
'UPPER_ROMAN',
|
|
37
|
+
'ROMAN',
|
|
38
|
+
])
|
|
39
|
+
|
|
40
|
+
const trimEndWhitespace = (value) => (value || '').replace(/[ \t]+$/g, '')
|
|
41
|
+
|
|
42
|
+
const escapeCell = (value) =>
|
|
43
|
+
String(value ?? '')
|
|
44
|
+
.replace(/\|/g, '\\|')
|
|
45
|
+
.replace(/\r?\n/g, '<br>')
|
|
46
|
+
|
|
47
|
+
const extractPlainTextFromParagraph = (paragraph) => {
|
|
48
|
+
let text = ''
|
|
49
|
+
for (const element of paragraph?.elements || []) {
|
|
50
|
+
text += element?.textRun?.content || ''
|
|
51
|
+
}
|
|
52
|
+
return trimEndWhitespace(text)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const applyTextStyle = (text, textStyle = {}) => {
|
|
56
|
+
const raw = (text || '').replace(/\n/g, '')
|
|
57
|
+
if (!raw) return ''
|
|
58
|
+
|
|
59
|
+
let out = raw
|
|
60
|
+
if (textStyle.link?.url) out = `[${out}](${textStyle.link.url})`
|
|
61
|
+
|
|
62
|
+
const fontFamily = textStyle.weightedFontFamily?.fontFamily || ''
|
|
63
|
+
const isMono = textStyle.smallCaps || MONO_FONTS.has(fontFamily)
|
|
64
|
+
|
|
65
|
+
if (isMono) out = `\`${out}\``
|
|
66
|
+
if (textStyle.bold) out = `**${out}**`
|
|
67
|
+
if (textStyle.italic) out = `*${out}*`
|
|
68
|
+
if (textStyle.strikethrough) out = `~~${out}~~`
|
|
69
|
+
|
|
70
|
+
return out
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const paragraphToMarkdown = (paragraph, docLists) => {
|
|
74
|
+
const styleType = paragraph?.paragraphStyle?.namedStyleType
|
|
75
|
+
const headingPrefix = HEADING_MAP[styleType] || ''
|
|
76
|
+
|
|
77
|
+
let line = ''
|
|
78
|
+
for (const element of paragraph?.elements || []) {
|
|
79
|
+
line += applyTextStyle(element?.textRun?.content || '', element?.textRun?.textStyle || {})
|
|
80
|
+
}
|
|
81
|
+
line = trimEndWhitespace(line)
|
|
82
|
+
|
|
83
|
+
if (!line) return ''
|
|
84
|
+
|
|
85
|
+
const bullet = paragraph?.bullet
|
|
86
|
+
if (bullet) {
|
|
87
|
+
const nestingLevel = bullet.nestingLevel || 0
|
|
88
|
+
const listMeta = docLists?.[bullet.listId]
|
|
89
|
+
const nesting = listMeta?.listProperties?.nestingLevels?.[nestingLevel]
|
|
90
|
+
const glyphType = nesting?.glyphType || ''
|
|
91
|
+
const isNumbered = LIST_NUMBER_GLYPHS.has(glyphType) && !BULLET_GLYPHS.has(glyphType)
|
|
92
|
+
const indent = ' '.repeat(Math.max(0, nestingLevel))
|
|
93
|
+
return `${indent}${isNumbered ? '1.' : '-'} ${line}`
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
if (headingPrefix) return `${headingPrefix} ${line}`
|
|
97
|
+
return line
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const tableToMarkdown = (table, docLists) => {
|
|
101
|
+
const rows = table?.tableRows || []
|
|
102
|
+
if (!rows.length) return ''
|
|
103
|
+
|
|
104
|
+
const normalized = rows.map((row) =>
|
|
105
|
+
(row?.tableCells || []).map((cell) => {
|
|
106
|
+
const parts = []
|
|
107
|
+
for (const c of cell?.content || []) {
|
|
108
|
+
if (c?.paragraph) {
|
|
109
|
+
const p = paragraphToMarkdown(c.paragraph, docLists)
|
|
110
|
+
if (p) parts.push(p)
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return escapeCell(parts.join('<br>'))
|
|
114
|
+
}),
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
const width = Math.max(...normalized.map((r) => r.length), 1)
|
|
118
|
+
const padded = normalized.map((r) => [...r, ...Array(width - r.length).fill('')])
|
|
119
|
+
const header = padded[0] || Array(width).fill('')
|
|
120
|
+
const separator = Array(width).fill('---')
|
|
121
|
+
const body = padded.slice(1)
|
|
122
|
+
|
|
123
|
+
const lines = [
|
|
124
|
+
`| ${header.join(' | ')} |`,
|
|
125
|
+
`| ${separator.join(' | ')} |`,
|
|
126
|
+
...body.map((r) => `| ${r.join(' | ')} |`),
|
|
127
|
+
]
|
|
128
|
+
return lines.join('\n')
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
const docToPlainText = (docBodyContent) => {
|
|
132
|
+
const lines = []
|
|
133
|
+
for (const item of docBodyContent || []) {
|
|
134
|
+
if (item?.paragraph) {
|
|
135
|
+
const text = extractPlainTextFromParagraph(item.paragraph)
|
|
136
|
+
if (text) lines.push(text)
|
|
137
|
+
} else if (item?.table) {
|
|
138
|
+
for (const row of item.table.tableRows || []) {
|
|
139
|
+
const cells = (row.tableCells || []).map((cell) => {
|
|
140
|
+
const pieces = []
|
|
141
|
+
for (const contentItem of cell.content || []) {
|
|
142
|
+
if (contentItem?.paragraph) {
|
|
143
|
+
const text = extractPlainTextFromParagraph(contentItem.paragraph)
|
|
144
|
+
if (text) pieces.push(text)
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return pieces.join(' ')
|
|
148
|
+
})
|
|
149
|
+
if (cells.some(Boolean)) lines.push(cells.join(' | '))
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return lines.join('\n\n').trim()
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
const { documentId } = input
|
|
157
|
+
const res = await integration.fetch(`/documents/${encodeURIComponent(documentId)}`)
|
|
158
|
+
const doc = await res.json()
|
|
159
|
+
|
|
160
|
+
const content = doc?.body?.content || []
|
|
161
|
+
const lists = doc?.lists || {}
|
|
162
|
+
|
|
163
|
+
const blocks = []
|
|
164
|
+
for (const item of content) {
|
|
165
|
+
if (item?.paragraph) {
|
|
166
|
+
const line = paragraphToMarkdown(item.paragraph, lists)
|
|
167
|
+
if (line) blocks.push(line)
|
|
168
|
+
} else if (item?.table) {
|
|
169
|
+
const table = tableToMarkdown(item.table, lists)
|
|
170
|
+
if (table) blocks.push(table)
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
const markdown = blocks.join('\n\n').trim()
|
|
175
|
+
if (markdown) {
|
|
176
|
+
return {
|
|
177
|
+
documentId: doc?.documentId || documentId,
|
|
178
|
+
title: doc?.title || '',
|
|
179
|
+
markdown,
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// Escape hatch: return plain text if markdown conversion produced nothing.
|
|
184
|
+
return {
|
|
185
|
+
documentId: doc?.documentId || documentId,
|
|
186
|
+
title: doc?.title || '',
|
|
187
|
+
markdown: docToPlainText(content),
|
|
188
|
+
}
|
|
189
|
+
}
|
|
@@ -3,53 +3,38 @@
|
|
|
3
3
|
"version": "0.1.0",
|
|
4
4
|
"tools": [
|
|
5
5
|
{
|
|
6
|
-
"name": "
|
|
7
|
-
"description": "
|
|
8
|
-
"inputSchema": "schemas/
|
|
9
|
-
"handler": "handlers/
|
|
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",
|
|
6
|
+
"name": "read_document",
|
|
7
|
+
"description": "Read a Google Doc and return its content as clean Markdown. Preserves headings, bold, italic, strikethrough, links, code spans, ordered/unordered lists with nesting, and tables. This is the standard way to read document content. For editing, use append_text, replace_all_text, first-match tools, or batch_update.",
|
|
8
|
+
"inputSchema": "schemas/read_document.json",
|
|
9
|
+
"handler": "handlers/read_document.js",
|
|
24
10
|
"scope": "read"
|
|
25
11
|
},
|
|
26
12
|
{
|
|
27
13
|
"name": "create_document",
|
|
28
|
-
"description": "Create a new Google Doc.",
|
|
14
|
+
"description": "Create a new empty Google Doc with the given title. Returns the created document's metadata including its documentId, which is needed for all subsequent operations on the document.",
|
|
29
15
|
"inputSchema": "schemas/create_document.json",
|
|
30
16
|
"handler": "handlers/create_document.js",
|
|
31
17
|
"scope": "write"
|
|
32
18
|
},
|
|
33
19
|
{
|
|
34
20
|
"name": "batch_update",
|
|
35
|
-
"description": "Send a documents.batchUpdate request to modify a
|
|
21
|
+
"description": "Send a documents.batchUpdate request to modify a document with one or more structured requests. Supports insertText, deleteContentRange, replaceAllText, createNamedRange, updateTextStyle, updateParagraphStyle, insertTable, insertInlineImage, and more. For common operations, prefer the higher-level tools: append_text, replace_all_text, and the first-match tools. Use batch_update for operations not covered by those helpers.",
|
|
36
22
|
"inputSchema": "schemas/batch_update.json",
|
|
37
23
|
"handler": "handlers/batch_update.js",
|
|
38
24
|
"scope": "write"
|
|
39
25
|
},
|
|
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
|
|
42
|
-
|
|
43
|
-
{ "name": "
|
|
44
|
-
{ "name": "
|
|
45
|
-
{ "name": "
|
|
46
|
-
{ "name": "
|
|
47
|
-
{ "name": "
|
|
48
|
-
{ "name": "
|
|
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" },
|
|
26
|
+
{ "name": "append_text", "description": "Append plain text to the end of a Google Doc. Automatically fetches the document to find the correct end index and inserts the text there. Use this for adding content to the end of a document without needing to know the document structure.", "inputSchema": "schemas/append_text.json", "handler": "handlers/append_text.js", "scope": "write" },
|
|
27
|
+
{ "name": "replace_all_text", "description": "Replace all occurrences of a text string in a Google Doc with new text. Case-sensitive by default. More efficient than the first-match tools when you need to replace every occurrence. Returns the number of occurrences replaced.", "inputSchema": "schemas/replace_all_text.json", "handler": "handlers/replace_all_text.js", "scope": "write" },
|
|
28
|
+
{ "name": "style_first_match", "description": "Find the first occurrence of text in a document and apply a TextStyle to it (bold, italic, fontSize, foregroundColor, etc.). Uses a marker-based approach: replaces the text with a unique marker, locates the marker's position, applies the style, then restores the original text. Returns {applied: true/false}.", "inputSchema": "schemas/style_first_match.json", "handler": "handlers/style_first_match.js", "scope": "write" },
|
|
29
|
+
{ "name": "insert_text_after_first_match", "description": "Find the first occurrence of text and insert new text immediately before or after it. Useful for inserting content at a specific anchor point in the document without knowing exact character indices. Returns {applied: true/false}.", "inputSchema": "schemas/insert_text_after_first_match.json", "handler": "handlers/insert_text_after_first_match.js", "scope": "write" },
|
|
30
|
+
{ "name": "insert_table_after_first_match", "description": "Find the first occurrence of text and insert a table with the specified number of rows and columns nearby. Returns {applied: true/false}.", "inputSchema": "schemas/insert_table_after_first_match.json", "handler": "handlers/insert_table_after_first_match.js", "scope": "write" },
|
|
31
|
+
{ "name": "insert_page_break_after_first_match", "description": "Find the first occurrence of text and insert a page break nearby. Useful for structuring long documents. Returns {applied: true/false}.", "inputSchema": "schemas/insert_page_break_after_first_match.json", "handler": "handlers/insert_page_break_after_first_match.js", "scope": "write" },
|
|
32
|
+
{ "name": "insert_inline_image_after_first_match", "description": "Find the first occurrence of text and insert an inline image nearby, referenced by URL. Returns {applied: true/false}.", "inputSchema": "schemas/insert_inline_image_after_first_match.json", "handler": "handlers/insert_inline_image_after_first_match.js", "scope": "write" },
|
|
33
|
+
{ "name": "delete_first_match", "description": "Find the first occurrence of text in the document and delete it. Only the first match is removed. Use replace_all_text with an empty string to remove all occurrences. Returns {applied: true/false}.", "inputSchema": "schemas/delete_first_match.json", "handler": "handlers/delete_first_match.js", "scope": "write" },
|
|
34
|
+
{ "name": "update_paragraph_style_for_first_match", "description": "Find the first occurrence of text and update the paragraph style for the paragraph containing it. Use to apply heading levels (HEADING_1 through HEADING_6), NORMAL_TEXT, or adjust spacing, alignment, and indentation. Returns {applied: true/false}.", "inputSchema": "schemas/update_paragraph_style_for_first_match.json", "handler": "handlers/update_paragraph_style_for_first_match.js", "scope": "write" },
|
|
50
35
|
{
|
|
51
36
|
"name": "update_document_style",
|
|
52
|
-
"description": "Update
|
|
37
|
+
"description": "Update document-level style properties such as page size (pageSize.width, pageSize.height in pt), margins (marginTop, marginBottom, marginLeft, marginRight in pt), and page orientation. Does not affect individual paragraph or text styles.",
|
|
53
38
|
"inputSchema": "schemas/update_document_style.json",
|
|
54
39
|
"handler": "handlers/update_document_style.js",
|
|
55
40
|
"scope": "write"
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
## Reading documents
|
|
2
|
+
|
|
3
|
+
Use `read_document` as the standard read tool. It returns clean markdown with headings, lists, links, inline code, and tables preserved as much as possible.
|
|
4
|
+
|
|
5
|
+
`read_document` includes an escape hatch: if markdown conversion fails to produce useful content, it falls back to plain-text extraction so you still get readable output.
|
|
6
|
+
|
|
7
|
+
For editing workflows, read with `read_document` first, then use `append_text`, `replace_all_text`, first-match tools, or `batch_update`.
|
|
8
|
+
|
|
9
|
+
## Editing documents
|
|
10
|
+
|
|
11
|
+
The Google Docs API uses character-index-based editing, but the high-level tools handle index resolution automatically:
|
|
12
|
+
|
|
13
|
+
- **`append_text`** — adds text to the end of the document (no index needed)
|
|
14
|
+
- **`replace_all_text`** — replaces every occurrence of a string (no index needed)
|
|
15
|
+
- **First-match tools** (`style_first_match`, `insert_text_after_first_match`, etc.) — locate text by content, then act on the first match
|
|
16
|
+
|
|
17
|
+
Only use `batch_update` with raw index operations when the higher-level tools don't cover your use case.
|
|
18
|
+
|
|
19
|
+
## First-match pattern
|
|
20
|
+
|
|
21
|
+
The `*_first_match` tools use a 3-step marker approach:
|
|
22
|
+
1. Replace all occurrences of `findText` with a unique marker (`__CMD_MARK_...`)
|
|
23
|
+
2. Fetch the document to find the marker's exact character indices
|
|
24
|
+
3. Apply the operation at those indices, then restore the original text
|
|
25
|
+
|
|
26
|
+
This means each first-match operation makes 3 API calls. They return `{applied: true}` on success or `{applied: false}` if the text was not found.
|
|
27
|
+
|
|
28
|
+
## Common batch_update operations
|
|
29
|
+
|
|
30
|
+
```json
|
|
31
|
+
{ "requests": [
|
|
32
|
+
{ "insertText": { "text": "Hello", "location": { "index": 1 } } },
|
|
33
|
+
{ "deleteContentRange": { "range": { "startIndex": 5, "endIndex": 10 } } },
|
|
34
|
+
{ "updateTextStyle": {
|
|
35
|
+
"range": { "startIndex": 1, "endIndex": 6 },
|
|
36
|
+
"textStyle": { "bold": true },
|
|
37
|
+
"fields": "bold"
|
|
38
|
+
}},
|
|
39
|
+
{ "updateParagraphStyle": {
|
|
40
|
+
"range": { "startIndex": 1, "endIndex": 2 },
|
|
41
|
+
"paragraphStyle": { "namedStyleType": "HEADING_1" },
|
|
42
|
+
"fields": "namedStyleType"
|
|
43
|
+
}}
|
|
44
|
+
]}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Document IDs
|
|
48
|
+
|
|
49
|
+
The documentId appears in the Google Docs URL: `https://docs.google.com/document/d/{documentId}/edit`
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
3
3
|
"type": "object",
|
|
4
|
+
"required": ["documentId"],
|
|
4
5
|
"properties": {
|
|
5
|
-
"documentId": {
|
|
6
|
+
"documentId": {
|
|
7
|
+
"type": "string",
|
|
8
|
+
"description": "Google Doc documentId from URL: https://docs.google.com/document/d/{documentId}/edit"
|
|
9
|
+
}
|
|
6
10
|
},
|
|
7
|
-
"required": ["documentId"],
|
|
8
11
|
"additionalProperties": false
|
|
9
12
|
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
## Future: Native markdown export via Drive API
|
|
2
|
+
|
|
3
|
+
Google Drive `files.export` now supports `text/markdown` as an export MIME type for Google Docs (added July 2024). This could replace the custom Docs API -> markdown conversion in `read_document` with a single API call:
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
GET https://www.googleapis.com/drive/v3/files/{fileId}/export?mimeType=text/markdown
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
### Why we're not using it yet
|
|
10
|
+
|
|
11
|
+
- The `google-docs` integration's base URL points to `docs.googleapis.com/v1`, not the Drive API. Calling Drive export would require either a proxy enhancement to allow cross-API calls or hardcoding the Drive URL in the handler.
|
|
12
|
+
- The custom conversion (ported from taylorwilsdon's approach) keeps the integration self-contained within the Docs API.
|
|
13
|
+
|
|
14
|
+
### When to revisit
|
|
15
|
+
|
|
16
|
+
- If we add cross-provider fetch support to the proxy/handler runtime.
|
|
17
|
+
- If the custom markdown conversion proves unreliable or hard to maintain.
|
|
18
|
+
- The Drive export requires `drive.readonly` scope (already included in the docs credential config).
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Google Drive
|
|
2
|
+
|
|
3
|
+
**9 tools**
|
|
4
|
+
|
|
5
|
+

|
|
6
|
+
|
|
7
|
+
## Credential variants
|
|
8
|
+
|
|
9
|
+
| Variant | Label |
|
|
10
|
+
|---|---|
|
|
11
|
+
| `service_account` | Service Account (recommended) _(default)_ |
|
|
12
|
+
| `oauth_token` | OAuth Access Token (short-lived) |
|
|
13
|
+
|
|
14
|
+
## Tools
|
|
15
|
+
|
|
16
|
+
| Tool | Scope | Description |
|
|
17
|
+
|---|---|---|
|
|
18
|
+
| `list_files` | read | List files in a Google Drive folder or across all of Drive. Returns id, name, mimeType, m… |
|
|
19
|
+
| `search_files` | read | Search Google Drive for files by name, MIME type, or raw Drive query syntax. Use the 'nam… |
|
|
20
|
+
| `get_file` | read | Get metadata for a Drive file or folder by ID. Returns id, name, mimeType, modifiedTime, … |
|
|
21
|
+
| `get_file_content` | read | Read the text content of a Drive file. For Google Workspace files (Docs, Sheets, Slides),… |
|
|
22
|
+
| `create_folder` | write | Create a new folder in Google Drive. Optionally nest it inside a parent folder using pare… |
|
|
23
|
+
| `create_file` | write | Create a new Drive file (metadata only -- no content upload). To create a Google Workspac… |
|
|
24
|
+
| `move_file` | write | Move a file or folder to a different parent folder by updating its parents. Provide the d… |
|
|
25
|
+
| `share_file` | write | Share a Drive file or folder with a specific user, group, domain, or make it publicly acc… |
|
|
26
|
+
| `delete_file` | write | Permanently and immediately delete a Drive file or folder by ID. This bypasses Trash and … |
|
|
@@ -65,6 +65,25 @@ suiteOrSkip('google-drive handlers (live)', () => {
|
|
|
65
65
|
await safeCleanup(async () => ctx.destFolderId ? drive.write('delete_file')({ fileId: ctx.destFolderId }) : Promise.resolve())
|
|
66
66
|
}, 60000)
|
|
67
67
|
|
|
68
|
+
it('list_files returns files in folder', async () => {
|
|
69
|
+
if (!ctx.folderId)
|
|
70
|
+
return expect(true).toBe(true)
|
|
71
|
+
const result = await drive.read('list_files')({ folderId: ctx.folderId })
|
|
72
|
+
expect(Array.isArray(result?.files)).toBe(true)
|
|
73
|
+
expect(result?.files.some((f: any) => f?.id === ctx.fileId)).toBe(true)
|
|
74
|
+
}, 30000)
|
|
75
|
+
|
|
76
|
+
it('search_files finds file by name', async () => {
|
|
77
|
+
if (!ctx.fileId)
|
|
78
|
+
return expect(true).toBe(true)
|
|
79
|
+
const meta = await drive.read('get_file')({ fileId: ctx.fileId })
|
|
80
|
+
const name = meta?.name
|
|
81
|
+
if (!name)
|
|
82
|
+
return expect(true).toBe(true)
|
|
83
|
+
const result = await drive.read('search_files')({ name: name.slice(0, 10) })
|
|
84
|
+
expect(Array.isArray(result?.files)).toBe(true)
|
|
85
|
+
}, 30000)
|
|
86
|
+
|
|
68
87
|
it('get_file returns file metadata', async () => {
|
|
69
88
|
if (!ctx.fileId)
|
|
70
89
|
return expect(true).toBe(true)
|
|
@@ -74,6 +93,30 @@ suiteOrSkip('google-drive handlers (live)', () => {
|
|
|
74
93
|
expect(typeof result?.mimeType).toBe('string')
|
|
75
94
|
}, 30000)
|
|
76
95
|
|
|
96
|
+
it('get_file_content exports a Google Doc as text', async () => {
|
|
97
|
+
if (!ctx.fileId)
|
|
98
|
+
return expect(true).toBe(true)
|
|
99
|
+
const result = await drive.read('get_file_content')({
|
|
100
|
+
fileId: ctx.fileId,
|
|
101
|
+
mimeType: 'application/vnd.google-apps.document',
|
|
102
|
+
})
|
|
103
|
+
expect(result?.fileId).toBe(ctx.fileId)
|
|
104
|
+
// A newly created empty doc may have empty content -- just verify the shape
|
|
105
|
+
expect(result?.content !== undefined || result?.message !== undefined).toBe(true)
|
|
106
|
+
}, 30000)
|
|
107
|
+
|
|
108
|
+
it('share_file shares a file with anyone reader', async () => {
|
|
109
|
+
if (!ctx.fileId)
|
|
110
|
+
return expect(true).toBe(true)
|
|
111
|
+
const result = await drive.write('share_file')({
|
|
112
|
+
fileId: ctx.fileId,
|
|
113
|
+
role: 'reader',
|
|
114
|
+
type: 'anyone',
|
|
115
|
+
sendNotificationEmail: false,
|
|
116
|
+
})
|
|
117
|
+
expect(result?.id || result?.role).toBeTruthy()
|
|
118
|
+
}, 30000)
|
|
119
|
+
|
|
77
120
|
it('move_file moves the file to a different folder', async () => {
|
|
78
121
|
if (!ctx.fileId || !ctx.destFolderId || !ctx.folderId)
|
|
79
122
|
return expect(true).toBe(true)
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest'
|
|
2
|
+
import { getMissingToolUsages } from '../../__tests__/usageParity.js'
|
|
3
|
+
|
|
4
|
+
describe('google-drive static usage parity', () => {
|
|
5
|
+
it('every manifest tool is referenced in tests', () => {
|
|
6
|
+
const missing = getMissingToolUsages({ integrationName: 'google-drive', importMetaUrl: import.meta.url })
|
|
7
|
+
expect(missing, `Missing handler usages in tests: ${missing.join(', ')}`).toEqual([])
|
|
8
|
+
})
|
|
9
|
+
})
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
async (input) => {
|
|
2
|
-
const
|
|
3
|
-
|
|
4
|
-
})
|
|
2
|
+
const fields = input.fields || 'id,name,mimeType,modifiedTime,createdTime,size,parents,trashed,webViewLink'
|
|
3
|
+
const res = await integration.fetch(`/files/${encodeURIComponent(input.fileId)}?fields=${encodeURIComponent(fields)}`)
|
|
5
4
|
return await res.json()
|
|
6
5
|
}
|
|
7
|
-
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
async (input) => {
|
|
2
|
+
const fileId = encodeURIComponent(input.fileId)
|
|
3
|
+
const googleExportMap = {
|
|
4
|
+
'application/vnd.google-apps.document': 'text/plain',
|
|
5
|
+
'application/vnd.google-apps.spreadsheet': 'text/csv',
|
|
6
|
+
'application/vnd.google-apps.presentation': 'text/plain',
|
|
7
|
+
'application/vnd.google-apps.drawing': 'image/svg+xml',
|
|
8
|
+
'application/vnd.google-apps.script': 'application/vnd.google-apps.script+json',
|
|
9
|
+
}
|
|
10
|
+
const exportMimeType = input.exportMimeType
|
|
11
|
+
|| (input.mimeType ? googleExportMap[input.mimeType] : null)
|
|
12
|
+
|| null
|
|
13
|
+
|
|
14
|
+
let res
|
|
15
|
+
if (exportMimeType) {
|
|
16
|
+
res = await integration.fetch(`/files/${fileId}/export?mimeType=${encodeURIComponent(exportMimeType)}`)
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
res = await integration.fetch(`/files/${fileId}?alt=media`)
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const contentType = res.headers?.get?.('content-type') || ''
|
|
23
|
+
const isText = contentType.startsWith('text/')
|
|
24
|
+
|| contentType.includes('json')
|
|
25
|
+
|| contentType.includes('csv')
|
|
26
|
+
|| contentType.includes('xml')
|
|
27
|
+
|| contentType.includes('javascript')
|
|
28
|
+
|
|
29
|
+
if (isText) {
|
|
30
|
+
const content = await res.text()
|
|
31
|
+
return { fileId: input.fileId, mimeType: contentType, content }
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Binary content: inform the agent it needs a text export
|
|
35
|
+
return {
|
|
36
|
+
fileId: input.fileId,
|
|
37
|
+
mimeType: contentType,
|
|
38
|
+
content: null,
|
|
39
|
+
message: `Binary content (${contentType}). To get readable text, provide exportMimeType='text/plain' for documents, 'text/csv' for spreadsheets, or 'text/html'. For PDFs and images this is not possible via export.`,
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
async (input) => {
|
|
2
|
+
const params = new URLSearchParams()
|
|
3
|
+
const qParts = ['trashed = false']
|
|
4
|
+
if (input.folderId)
|
|
5
|
+
qParts.push(`'${input.folderId}' in parents`)
|
|
6
|
+
params.set('q', qParts.join(' and '))
|
|
7
|
+
params.set('fields', input.fields || 'nextPageToken,files(id,name,mimeType,modifiedTime,size,parents)')
|
|
8
|
+
params.set('pageSize', String(input.pageSize || 50))
|
|
9
|
+
if (input.pageToken)
|
|
10
|
+
params.set('pageToken', input.pageToken)
|
|
11
|
+
if (input.orderBy)
|
|
12
|
+
params.set('orderBy', input.orderBy)
|
|
13
|
+
const res = await integration.fetch(`/files?${params.toString()}`)
|
|
14
|
+
return await res.json()
|
|
15
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
async (input) => {
|
|
2
|
+
const params = new URLSearchParams()
|
|
3
|
+
const qParts = []
|
|
4
|
+
if (input.query)
|
|
5
|
+
qParts.push(input.query)
|
|
6
|
+
if (input.name)
|
|
7
|
+
qParts.push(`name contains '${input.name.replace(/\\/g, '\\\\').replace(/'/g, "\\'")}'`)
|
|
8
|
+
if (input.mimeType)
|
|
9
|
+
qParts.push(`mimeType = '${input.mimeType}'`)
|
|
10
|
+
if (!input.includeTrashed)
|
|
11
|
+
qParts.push('trashed = false')
|
|
12
|
+
if (qParts.length > 0)
|
|
13
|
+
params.set('q', qParts.join(' and '))
|
|
14
|
+
params.set('fields', input.fields || 'nextPageToken,files(id,name,mimeType,modifiedTime,size,parents)')
|
|
15
|
+
params.set('pageSize', String(input.pageSize || 20))
|
|
16
|
+
if (input.pageToken)
|
|
17
|
+
params.set('pageToken', input.pageToken)
|
|
18
|
+
const res = await integration.fetch(`/files?${params.toString()}`)
|
|
19
|
+
return await res.json()
|
|
20
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
async (input) => {
|
|
2
|
+
const fileId = encodeURIComponent(input.fileId)
|
|
3
|
+
const params = new URLSearchParams()
|
|
4
|
+
if (input.sendNotificationEmail !== undefined)
|
|
5
|
+
params.set('sendNotificationEmail', String(input.sendNotificationEmail))
|
|
6
|
+
if (input.emailMessage)
|
|
7
|
+
params.set('emailMessage', input.emailMessage)
|
|
8
|
+
const body = {
|
|
9
|
+
role: input.role,
|
|
10
|
+
type: input.type,
|
|
11
|
+
}
|
|
12
|
+
if (input.emailAddress) body.emailAddress = input.emailAddress
|
|
13
|
+
if (input.domain) body.domain = input.domain
|
|
14
|
+
const qs = params.toString()
|
|
15
|
+
const res = await integration.fetch(`/files/${fileId}/permissions${qs ? `?${qs}` : ''}`, {
|
|
16
|
+
method: 'POST',
|
|
17
|
+
body,
|
|
18
|
+
})
|
|
19
|
+
return await res.json()
|
|
20
|
+
}
|
|
@@ -2,41 +2,68 @@
|
|
|
2
2
|
"name": "google-drive",
|
|
3
3
|
"version": "0.1.0",
|
|
4
4
|
"tools": [
|
|
5
|
+
{
|
|
6
|
+
"name": "list_files",
|
|
7
|
+
"description": "List files in a Google Drive folder or across all of Drive. Returns id, name, mimeType, modifiedTime, size, and parents for each file. Excludes trashed files by default. Use folderId to scope to a specific folder. For name- or type-based search, use search_files instead. Defaults to 50 results per page; use pageToken from the response for the next page.",
|
|
8
|
+
"inputSchema": "schemas/list_files.json",
|
|
9
|
+
"handler": "handlers/list_files.js",
|
|
10
|
+
"scope": "read"
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"name": "search_files",
|
|
14
|
+
"description": "Search Google Drive for files by name, MIME type, or raw Drive query syntax. Use the 'name' shorthand for simple name searches (e.g. name='quarterly report'). Use 'mimeType' to filter by type. Use 'query' for advanced Drive search expressions (e.g. \"modifiedTime > '2024-01-01'\" or \"'folderId' in parents and mimeType='application/pdf'\"). All provided filters are combined with AND. Defaults to 20 results per page.",
|
|
15
|
+
"inputSchema": "schemas/search_files.json",
|
|
16
|
+
"handler": "handlers/search_files.js",
|
|
17
|
+
"scope": "read"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"name": "get_file",
|
|
21
|
+
"description": "Get metadata for a Drive file or folder by ID. Returns id, name, mimeType, modifiedTime, createdTime, size, parents, trashed status, and webViewLink by default. To read the actual file contents, use get_file_content. To find a file by name, use search_files.",
|
|
22
|
+
"inputSchema": "schemas/get_file.json",
|
|
23
|
+
"handler": "handlers/get_file.js",
|
|
24
|
+
"scope": "read"
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"name": "get_file_content",
|
|
28
|
+
"description": "Read the text content of a Drive file. For Google Workspace files (Docs, Sheets, Slides), automatically exports to text/plain or text/csv. Pass the 'mimeType' from get_file or search_files results to enable automatic export format detection. Use 'exportMimeType' to override the format (e.g. 'text/html' for formatted HTML, 'text/csv' for Sheets data). Returns {fileId, mimeType, content} for text files. Binary files (PDFs, images) return a message suggesting an export format.",
|
|
29
|
+
"inputSchema": "schemas/get_file_content.json",
|
|
30
|
+
"handler": "handlers/get_file_content.js",
|
|
31
|
+
"scope": "read"
|
|
32
|
+
},
|
|
5
33
|
{
|
|
6
34
|
"name": "create_folder",
|
|
7
|
-
"description": "Create a folder in Google Drive.",
|
|
35
|
+
"description": "Create a new folder in Google Drive. Optionally nest it inside a parent folder using parentId. Returns the created folder's metadata including its ID, which can be used as a parentId for subsequent file creation.",
|
|
8
36
|
"inputSchema": "schemas/create_folder.json",
|
|
9
37
|
"handler": "handlers/create_folder.js",
|
|
10
38
|
"scope": "write"
|
|
11
39
|
},
|
|
12
40
|
{
|
|
13
41
|
"name": "create_file",
|
|
14
|
-
"description": "Create a Drive file (
|
|
42
|
+
"description": "Create a new Drive file (metadata only -- no content upload). To create a Google Workspace file, use the appropriate mimeType: 'application/vnd.google-apps.document' for Docs, 'application/vnd.google-apps.spreadsheet' for Sheets, 'application/vnd.google-apps.presentation' for Slides. Optionally place it in a folder with parentId. Returns the created file's metadata including its ID.",
|
|
15
43
|
"inputSchema": "schemas/create_file.json",
|
|
16
44
|
"handler": "handlers/create_file.js",
|
|
17
45
|
"scope": "write"
|
|
18
46
|
},
|
|
19
47
|
{
|
|
20
48
|
"name": "move_file",
|
|
21
|
-
"description": "Move a file to a different parent folder (
|
|
49
|
+
"description": "Move a file or folder to a different parent folder by updating its parents. Provide the destination folder ID as addParents and optionally the current parent ID as removeParents (to remove it from the old location). Get the current parents from get_file.",
|
|
22
50
|
"inputSchema": "schemas/move_file.json",
|
|
23
51
|
"handler": "handlers/move_file.js",
|
|
24
52
|
"scope": "write"
|
|
25
53
|
},
|
|
26
54
|
{
|
|
27
|
-
"name": "
|
|
28
|
-
"description": "
|
|
29
|
-
"inputSchema": "schemas/
|
|
30
|
-
"handler": "handlers/
|
|
31
|
-
"scope": "
|
|
55
|
+
"name": "share_file",
|
|
56
|
+
"description": "Share a Drive file or folder with a specific user, group, domain, or make it publicly accessible. Use type='user' with emailAddress for individual sharing. Use type='anyone' with role='reader' to create a public view link. Use type='domain' with domain for organization-wide sharing. Returns the created permission resource.",
|
|
57
|
+
"inputSchema": "schemas/share_file.json",
|
|
58
|
+
"handler": "handlers/share_file.js",
|
|
59
|
+
"scope": "write"
|
|
32
60
|
},
|
|
33
61
|
{
|
|
34
62
|
"name": "delete_file",
|
|
35
|
-
"description": "Permanently delete a Drive file or folder by
|
|
63
|
+
"description": "Permanently and immediately delete a Drive file or folder by ID. This bypasses Trash and cannot be undone. To move to Trash instead, use the Google Drive UI or modify file properties. Use search_files or list_files to find file IDs.",
|
|
36
64
|
"inputSchema": "schemas/delete_file.json",
|
|
37
65
|
"handler": "handlers/delete_file.js",
|
|
38
66
|
"scope": "write"
|
|
39
67
|
}
|
|
40
68
|
]
|
|
41
69
|
}
|
|
42
|
-
|