@alanse/mcp-server-google-workspace 1.0.0 → 1.0.2

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 (155) hide show
  1. package/README.md +146 -17
  2. package/dist/auth.js +5 -0
  3. package/dist/lib/calendar-helpers.js +197 -0
  4. package/dist/lib/drive-helpers.js +263 -0
  5. package/dist/lib/gmail-helpers.js +204 -0
  6. package/dist/tools/calendar/acl/calendar_acl_insert.js +80 -0
  7. package/dist/tools/calendar/acl/calendar_acl_list.js +82 -0
  8. package/dist/tools/calendar/basic/calendar_create_event.js +113 -0
  9. package/dist/tools/calendar/basic/calendar_delete_event.js +52 -0
  10. package/dist/tools/calendar/basic/calendar_get_event.js +52 -0
  11. package/dist/tools/calendar/basic/calendar_list_events.js +86 -0
  12. package/dist/tools/calendar/basic/calendar_update_event.js +116 -0
  13. package/dist/tools/calendar/calendarlist/calendar_calendarlist_get.js +73 -0
  14. package/dist/tools/calendar/calendarlist/calendar_calendarlist_list.js +87 -0
  15. package/dist/tools/calendar/calendars/calendar_calendars_get.js +52 -0
  16. package/dist/tools/calendar/calendars/calendar_calendars_insert.js +66 -0
  17. package/dist/tools/calendar/calendars/calendar_calendars_update.js +85 -0
  18. package/dist/tools/calendar/colors/calendar_colors_get.js +46 -0
  19. package/dist/tools/calendar/events_advanced/calendar_events_instances.js +81 -0
  20. package/dist/tools/calendar/events_advanced/calendar_events_move.js +63 -0
  21. package/dist/tools/calendar/events_advanced/calendar_events_quickadd.js +52 -0
  22. package/dist/tools/calendar/freebusy/calendar_freebusy_query.js +69 -0
  23. package/dist/tools/calendar/settings/calendar_settings_list.js +81 -0
  24. package/dist/tools/drive/advanced/drive_empty_trash.js +56 -0
  25. package/dist/tools/drive/advanced/drive_export_file.js +158 -0
  26. package/dist/tools/drive/advanced/drive_list_revisions.js +80 -0
  27. package/dist/tools/drive/basic/drive_get_metadata.js +49 -0
  28. package/dist/tools/drive/basic/drive_list_files.js +76 -0
  29. package/dist/tools/drive/file/drive_copy_file.js +79 -0
  30. package/dist/tools/drive/file/drive_create_file.js +72 -0
  31. package/dist/tools/drive/file/drive_delete_file.js +48 -0
  32. package/dist/tools/drive/file/drive_move_file.js +79 -0
  33. package/dist/tools/drive/file/drive_rename_file.js +58 -0
  34. package/dist/tools/drive/file/drive_update_file.js +106 -0
  35. package/dist/tools/drive/file/drive_upload_file.js +80 -0
  36. package/dist/tools/drive/folder/drive_create_folder.js +67 -0
  37. package/dist/tools/drive/folder/drive_list_folder_contents.js +68 -0
  38. package/dist/tools/drive/folder/drive_move_to_folder.js +59 -0
  39. package/dist/tools/drive/permissions/drive_list_permissions.js +115 -0
  40. package/dist/tools/drive/permissions/drive_remove_permission.js +71 -0
  41. package/dist/tools/drive/permissions/drive_share_file.js +116 -0
  42. package/dist/tools/drive/permissions/drive_update_permission.js +79 -0
  43. package/dist/tools/gmail/basic/gmail_get_message.js +95 -0
  44. package/dist/tools/gmail/basic/gmail_get_thread.js +46 -0
  45. package/dist/tools/gmail/basic/gmail_list_labels.js +54 -0
  46. package/dist/tools/gmail/basic/gmail_search_messages.js +59 -0
  47. package/dist/tools/gmail/batch/gmail_batch_modify_labels.js +74 -0
  48. package/dist/tools/gmail/batch/gmail_get_messages_batch.js +120 -0
  49. package/dist/tools/gmail/batch/gmail_get_threads_batch.js +102 -0
  50. package/dist/tools/gmail/labels/gmail_manage_label.js +131 -0
  51. package/dist/tools/gmail/labels/gmail_modify_labels.js +65 -0
  52. package/dist/tools/gmail/send/gmail_draft_message.js +117 -0
  53. package/dist/tools/gmail/send/gmail_send_message.js +109 -0
  54. package/dist/tools/index.js +267 -3
  55. package/package.json +8 -3
  56. package/dist/tools/basic/gsheets_add_sheet.js +0 -65
  57. package/dist/tools/basic/gsheets_copy_sheet.js +0 -56
  58. package/dist/tools/basic/gsheets_copy_to.js +0 -113
  59. package/dist/tools/basic/gsheets_create_spreadsheet.js +0 -88
  60. package/dist/tools/basic/gsheets_delete_columns.js +0 -69
  61. package/dist/tools/basic/gsheets_delete_rows.js +0 -69
  62. package/dist/tools/basic/gsheets_delete_sheet.js +0 -56
  63. package/dist/tools/basic/gsheets_duplicate_sheet.js +0 -72
  64. package/dist/tools/basic/gsheets_insert_columns.js +0 -69
  65. package/dist/tools/basic/gsheets_insert_rows.js +0 -69
  66. package/dist/tools/basic/gsheets_list_sheets.js +0 -53
  67. package/dist/tools/basic/gsheets_read.js +0 -120
  68. package/dist/tools/basic/gsheets_rename_sheet.js +0 -64
  69. package/dist/tools/charts/gsheets_add_bubble.js +0 -176
  70. package/dist/tools/charts/gsheets_add_candlestick.js +0 -192
  71. package/dist/tools/charts/gsheets_add_chart.js +0 -162
  72. package/dist/tools/charts/gsheets_add_combo.js +0 -169
  73. package/dist/tools/charts/gsheets_add_histogram.js +0 -143
  74. package/dist/tools/charts/gsheets_add_org_chart.js +0 -160
  75. package/dist/tools/charts/gsheets_add_treemap.js +0 -177
  76. package/dist/tools/charts/gsheets_add_waterfall.js +0 -155
  77. package/dist/tools/charts/gsheets_delete_chart.js +0 -56
  78. package/dist/tools/charts/gsheets_update_chart.js +0 -118
  79. package/dist/tools/data/gsheets_append_data.js +0 -68
  80. package/dist/tools/data/gsheets_batch_clear.js +0 -53
  81. package/dist/tools/data/gsheets_batch_update.js +0 -81
  82. package/dist/tools/data/gsheets_clear_data.js +0 -53
  83. package/dist/tools/data/gsheets_create_filter.js +0 -81
  84. package/dist/tools/data/gsheets_find_replace.js +0 -124
  85. package/dist/tools/data/gsheets_set_data_validation.js +0 -153
  86. package/dist/tools/data/gsheets_sort_range.js +0 -102
  87. package/dist/tools/data/gsheets_update_cell.js +0 -44
  88. package/dist/tools/formatting/gsheets_auto_resize.js +0 -75
  89. package/dist/tools/formatting/gsheets_format_cells.js +0 -161
  90. package/dist/tools/formatting/gsheets_freeze_columns.js +0 -67
  91. package/dist/tools/formatting/gsheets_freeze_rows.js +0 -67
  92. package/dist/tools/formatting/gsheets_merge_cells.js +0 -85
  93. package/dist/tools/formatting/gsheets_set_number_format.js +0 -116
  94. package/dist/tools/formatting/gsheets_unmerge_cells.js +0 -79
  95. package/dist/tools/formatting/gsheets_update_borders.js +0 -212
  96. package/dist/tools/gdrive/gdrive_read_file.js +0 -77
  97. package/dist/tools/gdrive/gdrive_search.js +0 -71
  98. package/dist/tools/gdrive_read_file.js +0 -77
  99. package/dist/tools/gdrive_search.js +0 -71
  100. package/dist/tools/gsheets_add_bubble.js +0 -176
  101. package/dist/tools/gsheets_add_candlestick.js +0 -192
  102. package/dist/tools/gsheets_add_chart.js +0 -162
  103. package/dist/tools/gsheets_add_combo.js +0 -169
  104. package/dist/tools/gsheets_add_conditional_format.js +0 -175
  105. package/dist/tools/gsheets_add_histogram.js +0 -143
  106. package/dist/tools/gsheets_add_named_range.js +0 -87
  107. package/dist/tools/gsheets_add_org_chart.js +0 -160
  108. package/dist/tools/gsheets_add_protected_range.js +0 -127
  109. package/dist/tools/gsheets_add_sheet.js +0 -65
  110. package/dist/tools/gsheets_add_treemap.js +0 -177
  111. package/dist/tools/gsheets_add_waterfall.js +0 -155
  112. package/dist/tools/gsheets_append_data.js +0 -68
  113. package/dist/tools/gsheets_auto_resize.js +0 -75
  114. package/dist/tools/gsheets_batch_clear.js +0 -53
  115. package/dist/tools/gsheets_batch_update.js +0 -81
  116. package/dist/tools/gsheets_clear_data.js +0 -53
  117. package/dist/tools/gsheets_copy_sheet.js +0 -56
  118. package/dist/tools/gsheets_copy_to.js +0 -113
  119. package/dist/tools/gsheets_create_filter.js +0 -81
  120. package/dist/tools/gsheets_create_spreadsheet.js +0 -88
  121. package/dist/tools/gsheets_delete_chart.js +0 -56
  122. package/dist/tools/gsheets_delete_columns.js +0 -69
  123. package/dist/tools/gsheets_delete_named_range.js +0 -56
  124. package/dist/tools/gsheets_delete_protected_range.js +0 -56
  125. package/dist/tools/gsheets_delete_rows.js +0 -69
  126. package/dist/tools/gsheets_delete_sheet.js +0 -56
  127. package/dist/tools/gsheets_duplicate_sheet.js +0 -72
  128. package/dist/tools/gsheets_find_replace.js +0 -124
  129. package/dist/tools/gsheets_format_cells.js +0 -161
  130. package/dist/tools/gsheets_freeze_columns.js +0 -67
  131. package/dist/tools/gsheets_freeze_rows.js +0 -67
  132. package/dist/tools/gsheets_insert_columns.js +0 -69
  133. package/dist/tools/gsheets_insert_rows.js +0 -69
  134. package/dist/tools/gsheets_list_sheets.js +0 -53
  135. package/dist/tools/gsheets_merge_cells.js +0 -85
  136. package/dist/tools/gsheets_read.js +0 -120
  137. package/dist/tools/gsheets_rename_sheet.js +0 -64
  138. package/dist/tools/gsheets_set_data_validation.js +0 -153
  139. package/dist/tools/gsheets_set_number_format.js +0 -116
  140. package/dist/tools/gsheets_sort_range.js +0 -102
  141. package/dist/tools/gsheets_unmerge_cells.js +0 -79
  142. package/dist/tools/gsheets_update_borders.js +0 -212
  143. package/dist/tools/gsheets_update_cell.js +0 -44
  144. package/dist/tools/gsheets_update_chart.js +0 -118
  145. package/dist/tools/gsheets_update_named_range.js +0 -112
  146. package/dist/tools/gsheets_update_protected_range.js +0 -110
  147. package/dist/tools/protection/gsheets_add_conditional_format.js +0 -175
  148. package/dist/tools/protection/gsheets_add_named_range.js +0 -87
  149. package/dist/tools/protection/gsheets_add_protected_range.js +0 -127
  150. package/dist/tools/protection/gsheets_delete_named_range.js +0 -56
  151. package/dist/tools/protection/gsheets_delete_protected_range.js +0 -56
  152. package/dist/tools/protection/gsheets_update_named_range.js +0 -112
  153. package/dist/tools/protection/gsheets_update_protected_range.js +0 -110
  154. /package/dist/tools/drive/{drive_read_file.js → basic/drive_read_file.js} +0 -0
  155. /package/dist/tools/drive/{drive_search.js → basic/drive_search.js} +0 -0
@@ -1,162 +0,0 @@
1
- import { google } from "googleapis";
2
- export const schema = {
3
- name: "gsheets_add_chart",
4
- description: "Add a chart to a spreadsheet",
5
- inputSchema: {
6
- type: "object",
7
- properties: {
8
- spreadsheetId: {
9
- type: "string",
10
- description: "The ID of the spreadsheet",
11
- },
12
- sheetId: {
13
- type: "number",
14
- description: "The ID of the sheet where the chart will be placed",
15
- },
16
- chartType: {
17
- type: "string",
18
- enum: ["COLUMN", "BAR", "LINE", "AREA", "PIE", "SCATTER"],
19
- description: "The type of chart to create",
20
- },
21
- title: {
22
- type: "string",
23
- description: "Chart title (optional)",
24
- },
25
- dataSheetId: {
26
- type: "number",
27
- description: "The sheet ID containing the data",
28
- },
29
- dataStartRow: {
30
- type: "number",
31
- description: "Starting row of data range (0-based)",
32
- },
33
- dataEndRow: {
34
- type: "number",
35
- description: "Ending row of data range (exclusive, 0-based)",
36
- },
37
- dataStartColumn: {
38
- type: "number",
39
- description: "Starting column of data range (0-based)",
40
- },
41
- dataEndColumn: {
42
- type: "number",
43
- description: "Ending column of data range (exclusive, 0-based)",
44
- },
45
- position: {
46
- type: "object",
47
- properties: {
48
- overlayRow: {
49
- type: "number",
50
- description: "Row position for chart overlay (0-based)",
51
- },
52
- overlayColumn: {
53
- type: "number",
54
- description: "Column position for chart overlay (0-based)",
55
- },
56
- },
57
- description: "Chart position (optional, defaults to top-left)",
58
- },
59
- },
60
- required: ["spreadsheetId", "sheetId", "chartType", "dataSheetId", "dataStartRow", "dataEndRow", "dataStartColumn", "dataEndColumn"],
61
- },
62
- };
63
- export async function addChart(args) {
64
- try {
65
- const sheets = google.sheets("v4");
66
- const chartSpec = {
67
- title: args.title || "Chart",
68
- basicChart: {
69
- chartType: args.chartType,
70
- legendPosition: "BOTTOM_LEGEND",
71
- axis: [
72
- {
73
- position: "BOTTOM_AXIS",
74
- },
75
- {
76
- position: "LEFT_AXIS",
77
- },
78
- ],
79
- domains: [
80
- {
81
- domain: {
82
- sourceRange: {
83
- sources: [
84
- {
85
- sheetId: args.dataSheetId,
86
- startRowIndex: args.dataStartRow,
87
- endRowIndex: args.dataEndRow,
88
- startColumnIndex: args.dataStartColumn,
89
- endColumnIndex: args.dataStartColumn + 1,
90
- },
91
- ],
92
- },
93
- },
94
- },
95
- ],
96
- series: [
97
- {
98
- series: {
99
- sourceRange: {
100
- sources: [
101
- {
102
- sheetId: args.dataSheetId,
103
- startRowIndex: args.dataStartRow,
104
- endRowIndex: args.dataEndRow,
105
- startColumnIndex: args.dataStartColumn + 1,
106
- endColumnIndex: args.dataEndColumn,
107
- },
108
- ],
109
- },
110
- },
111
- },
112
- ],
113
- headerCount: 1,
114
- },
115
- };
116
- const position = {
117
- overlayPosition: {
118
- anchorCell: {
119
- sheetId: args.sheetId,
120
- rowIndex: args.position?.overlayRow || 0,
121
- columnIndex: args.position?.overlayColumn || 0,
122
- },
123
- },
124
- };
125
- const response = await sheets.spreadsheets.batchUpdate({
126
- spreadsheetId: args.spreadsheetId,
127
- requestBody: {
128
- requests: [
129
- {
130
- addChart: {
131
- chart: {
132
- spec: chartSpec,
133
- position,
134
- },
135
- },
136
- },
137
- ],
138
- },
139
- });
140
- const chartId = response.data.replies?.[0]?.addChart?.chart?.chartId;
141
- return {
142
- content: [
143
- {
144
- type: "text",
145
- text: `Successfully created ${args.chartType} chart. Chart ID: ${chartId}`,
146
- },
147
- ],
148
- isError: false,
149
- };
150
- }
151
- catch (error) {
152
- return {
153
- content: [
154
- {
155
- type: "text",
156
- text: `Error creating chart: ${error.message}`,
157
- },
158
- ],
159
- isError: true,
160
- };
161
- }
162
- }
@@ -1,169 +0,0 @@
1
- import { google } from "googleapis";
2
- export const schema = {
3
- name: "gsheets_add_combo",
4
- description: "Add a combo chart to a spreadsheet (combines multiple chart types like column and line)",
5
- inputSchema: {
6
- type: "object",
7
- properties: {
8
- spreadsheetId: {
9
- type: "string",
10
- description: "The ID of the spreadsheet",
11
- },
12
- sheetId: {
13
- type: "number",
14
- description: "The ID of the sheet where the chart will be placed",
15
- },
16
- title: {
17
- type: "string",
18
- description: "Chart title (optional)",
19
- },
20
- dataSheetId: {
21
- type: "number",
22
- description: "The sheet ID containing the data",
23
- },
24
- dataStartRow: {
25
- type: "number",
26
- description: "Starting row of data range (0-based)",
27
- },
28
- dataEndRow: {
29
- type: "number",
30
- description: "Ending row of data range (exclusive, 0-based)",
31
- },
32
- dataStartColumn: {
33
- type: "number",
34
- description: "Starting column of data range (0-based)",
35
- },
36
- dataEndColumn: {
37
- type: "number",
38
- description: "Ending column of data range (exclusive, 0-based)",
39
- },
40
- seriesTypes: {
41
- type: "array",
42
- items: {
43
- type: "string",
44
- enum: ["COLUMN", "BAR", "LINE", "AREA"],
45
- },
46
- description: "Array of chart types for each series (optional, defaults to COLUMN for all)",
47
- },
48
- position: {
49
- type: "object",
50
- properties: {
51
- overlayRow: {
52
- type: "number",
53
- description: "Row position for chart overlay (0-based)",
54
- },
55
- overlayColumn: {
56
- type: "number",
57
- description: "Column position for chart overlay (0-based)",
58
- },
59
- },
60
- description: "Chart position (optional)",
61
- },
62
- },
63
- required: ["spreadsheetId", "sheetId", "dataSheetId", "dataStartRow", "dataEndRow", "dataStartColumn", "dataEndColumn"],
64
- },
65
- };
66
- export async function addCombo(args) {
67
- try {
68
- const sheets = google.sheets("v4");
69
- const series = [];
70
- const numSeries = args.dataEndColumn - args.dataStartColumn - 1;
71
- for (let i = 0; i < numSeries; i++) {
72
- const seriesSpec = {
73
- series: {
74
- sourceRange: {
75
- sources: [
76
- {
77
- sheetId: args.dataSheetId,
78
- startRowIndex: args.dataStartRow,
79
- endRowIndex: args.dataEndRow,
80
- startColumnIndex: args.dataStartColumn + 1 + i,
81
- endColumnIndex: args.dataStartColumn + 2 + i,
82
- },
83
- ],
84
- },
85
- },
86
- };
87
- if (args.seriesTypes && args.seriesTypes[i]) {
88
- seriesSpec.type = args.seriesTypes[i];
89
- }
90
- series.push(seriesSpec);
91
- }
92
- const basicChart = {
93
- chartType: "COMBO",
94
- legendPosition: "BOTTOM_LEGEND",
95
- axis: [
96
- { position: "BOTTOM_AXIS" },
97
- { position: "LEFT_AXIS" },
98
- ],
99
- domains: [
100
- {
101
- domain: {
102
- sourceRange: {
103
- sources: [
104
- {
105
- sheetId: args.dataSheetId,
106
- startRowIndex: args.dataStartRow,
107
- endRowIndex: args.dataEndRow,
108
- startColumnIndex: args.dataStartColumn,
109
- endColumnIndex: args.dataStartColumn + 1,
110
- },
111
- ],
112
- },
113
- },
114
- },
115
- ],
116
- series,
117
- headerCount: 1,
118
- };
119
- const chartSpec = {
120
- title: args.title || "Combo Chart",
121
- basicChart,
122
- };
123
- const position = {
124
- overlayPosition: {
125
- anchorCell: {
126
- sheetId: args.sheetId,
127
- rowIndex: args.position?.overlayRow || 0,
128
- columnIndex: args.position?.overlayColumn || 0,
129
- },
130
- },
131
- };
132
- const response = await sheets.spreadsheets.batchUpdate({
133
- spreadsheetId: args.spreadsheetId,
134
- requestBody: {
135
- requests: [
136
- {
137
- addChart: {
138
- chart: {
139
- spec: chartSpec,
140
- position,
141
- },
142
- },
143
- },
144
- ],
145
- },
146
- });
147
- const chartId = response.data.replies?.[0]?.addChart?.chart?.chartId;
148
- return {
149
- content: [
150
- {
151
- type: "text",
152
- text: `Successfully created combo chart. Chart ID: ${chartId}`,
153
- },
154
- ],
155
- isError: false,
156
- };
157
- }
158
- catch (error) {
159
- return {
160
- content: [
161
- {
162
- type: "text",
163
- text: `Error creating combo chart: ${error.message}`,
164
- },
165
- ],
166
- isError: true,
167
- };
168
- }
169
- }
@@ -1,175 +0,0 @@
1
- import { google } from "googleapis";
2
- export const schema = {
3
- name: "gsheets_add_conditional_format",
4
- description: "Add conditional formatting rules to cells",
5
- inputSchema: {
6
- type: "object",
7
- properties: {
8
- spreadsheetId: {
9
- type: "string",
10
- description: "The ID of the spreadsheet",
11
- },
12
- sheetId: {
13
- type: "number",
14
- description: "The ID of the sheet",
15
- },
16
- startRow: {
17
- type: "number",
18
- description: "Starting row index (0-based)",
19
- },
20
- endRow: {
21
- type: "number",
22
- description: "Ending row index (exclusive, 0-based)",
23
- },
24
- startColumn: {
25
- type: "number",
26
- description: "Starting column index (0-based)",
27
- },
28
- endColumn: {
29
- type: "number",
30
- description: "Ending column index (exclusive, 0-based)",
31
- },
32
- rule: {
33
- type: "object",
34
- properties: {
35
- type: {
36
- type: "string",
37
- enum: ["NUMBER_GREATER", "NUMBER_LESS", "NUMBER_BETWEEN", "TEXT_CONTAINS", "TEXT_NOT_CONTAINS", "CUSTOM_FORMULA"],
38
- description: "The condition type",
39
- },
40
- value: {
41
- type: "string",
42
- description: "Value for comparison (for single value conditions)",
43
- },
44
- minValue: {
45
- type: "string",
46
- description: "Minimum value (for BETWEEN conditions)",
47
- },
48
- maxValue: {
49
- type: "string",
50
- description: "Maximum value (for BETWEEN conditions)",
51
- },
52
- formula: {
53
- type: "string",
54
- description: "Custom formula (for CUSTOM_FORMULA)",
55
- },
56
- backgroundColor: {
57
- type: "object",
58
- properties: {
59
- red: { type: "number", minimum: 0, maximum: 1 },
60
- green: { type: "number", minimum: 0, maximum: 1 },
61
- blue: { type: "number", minimum: 0, maximum: 1 },
62
- },
63
- description: "Background color to apply when condition is true",
64
- },
65
- textColor: {
66
- type: "object",
67
- properties: {
68
- red: { type: "number", minimum: 0, maximum: 1 },
69
- green: { type: "number", minimum: 0, maximum: 1 },
70
- blue: { type: "number", minimum: 0, maximum: 1 },
71
- },
72
- description: "Text color to apply when condition is true",
73
- },
74
- bold: {
75
- type: "boolean",
76
- description: "Make text bold when condition is true",
77
- },
78
- italic: {
79
- type: "boolean",
80
- description: "Make text italic when condition is true",
81
- },
82
- },
83
- required: ["type"],
84
- description: "Conditional formatting rule",
85
- },
86
- },
87
- required: ["spreadsheetId", "sheetId", "startRow", "endRow", "startColumn", "endColumn", "rule"],
88
- },
89
- };
90
- export async function addConditionalFormat(args) {
91
- try {
92
- const sheets = google.sheets("v4");
93
- const booleanCondition = {
94
- type: args.rule.type,
95
- };
96
- // Set condition values based on type
97
- if (args.rule.type === "NUMBER_BETWEEN") {
98
- booleanCondition.values = [
99
- { userEnteredValue: args.rule.minValue },
100
- { userEnteredValue: args.rule.maxValue },
101
- ];
102
- }
103
- else if (args.rule.type === "CUSTOM_FORMULA") {
104
- booleanCondition.values = [{ userEnteredValue: args.rule.formula }];
105
- }
106
- else if (args.rule.value) {
107
- booleanCondition.values = [{ userEnteredValue: args.rule.value }];
108
- }
109
- // Build format to apply
110
- const format = {};
111
- if (args.rule.backgroundColor) {
112
- format.backgroundColor = args.rule.backgroundColor;
113
- }
114
- if (args.rule.textColor || args.rule.bold || args.rule.italic) {
115
- format.textFormat = {};
116
- if (args.rule.textColor) {
117
- format.textFormat.foregroundColor = args.rule.textColor;
118
- }
119
- if (args.rule.bold !== undefined) {
120
- format.textFormat.bold = args.rule.bold;
121
- }
122
- if (args.rule.italic !== undefined) {
123
- format.textFormat.italic = args.rule.italic;
124
- }
125
- }
126
- await sheets.spreadsheets.batchUpdate({
127
- spreadsheetId: args.spreadsheetId,
128
- requestBody: {
129
- requests: [
130
- {
131
- addConditionalFormatRule: {
132
- rule: {
133
- ranges: [
134
- {
135
- sheetId: args.sheetId,
136
- startRowIndex: args.startRow,
137
- endRowIndex: args.endRow,
138
- startColumnIndex: args.startColumn,
139
- endColumnIndex: args.endColumn,
140
- },
141
- ],
142
- booleanRule: {
143
- condition: booleanCondition,
144
- format,
145
- },
146
- },
147
- index: 0,
148
- },
149
- },
150
- ],
151
- },
152
- });
153
- const rangeStr = `R${args.startRow}C${args.startColumn}:R${args.endRow - 1}C${args.endColumn - 1}`;
154
- return {
155
- content: [
156
- {
157
- type: "text",
158
- text: `Successfully added conditional formatting rule (${args.rule.type}) for range ${rangeStr}`,
159
- },
160
- ],
161
- isError: false,
162
- };
163
- }
164
- catch (error) {
165
- return {
166
- content: [
167
- {
168
- type: "text",
169
- text: `Error adding conditional format: ${error.message}`,
170
- },
171
- ],
172
- isError: true,
173
- };
174
- }
175
- }
@@ -1,143 +0,0 @@
1
- import { google } from "googleapis";
2
- export const schema = {
3
- name: "gsheets_add_histogram",
4
- description: "Add a histogram chart to a spreadsheet",
5
- inputSchema: {
6
- type: "object",
7
- properties: {
8
- spreadsheetId: {
9
- type: "string",
10
- description: "The ID of the spreadsheet",
11
- },
12
- sheetId: {
13
- type: "number",
14
- description: "The ID of the sheet where the chart will be placed",
15
- },
16
- title: {
17
- type: "string",
18
- description: "Chart title (optional)",
19
- },
20
- dataSheetId: {
21
- type: "number",
22
- description: "The sheet ID containing the data",
23
- },
24
- dataStartRow: {
25
- type: "number",
26
- description: "Starting row of data range (0-based)",
27
- },
28
- dataEndRow: {
29
- type: "number",
30
- description: "Ending row of data range (exclusive, 0-based)",
31
- },
32
- dataStartColumn: {
33
- type: "number",
34
- description: "Starting column of data range (0-based)",
35
- },
36
- dataEndColumn: {
37
- type: "number",
38
- description: "Ending column of data range (exclusive, 0-based)",
39
- },
40
- bucketSize: {
41
- type: "number",
42
- description: "The size of histogram buckets (optional)",
43
- },
44
- outlierPercentile: {
45
- type: "number",
46
- description: "Percentile to use for outlier detection (optional, 0-1)",
47
- },
48
- position: {
49
- type: "object",
50
- properties: {
51
- overlayRow: {
52
- type: "number",
53
- description: "Row position for chart overlay (0-based)",
54
- },
55
- overlayColumn: {
56
- type: "number",
57
- description: "Column position for chart overlay (0-based)",
58
- },
59
- },
60
- description: "Chart position (optional)",
61
- },
62
- },
63
- required: ["spreadsheetId", "sheetId", "dataSheetId", "dataStartRow", "dataEndRow", "dataStartColumn", "dataEndColumn"],
64
- },
65
- };
66
- export async function addHistogram(args) {
67
- try {
68
- const sheets = google.sheets("v4");
69
- const histogramChart = {
70
- legendPosition: "BOTTOM_LEGEND",
71
- series: [
72
- {
73
- sourceRange: {
74
- sources: [
75
- {
76
- sheetId: args.dataSheetId,
77
- startRowIndex: args.dataStartRow,
78
- endRowIndex: args.dataEndRow,
79
- startColumnIndex: args.dataStartColumn,
80
- endColumnIndex: args.dataEndColumn,
81
- },
82
- ],
83
- },
84
- },
85
- ],
86
- };
87
- if (args.bucketSize !== undefined) {
88
- histogramChart.bucketSize = args.bucketSize;
89
- }
90
- if (args.outlierPercentile !== undefined) {
91
- histogramChart.outlierPercentile = args.outlierPercentile;
92
- }
93
- const chartSpec = {
94
- title: args.title || "Histogram",
95
- histogramChart,
96
- };
97
- const position = {
98
- overlayPosition: {
99
- anchorCell: {
100
- sheetId: args.sheetId,
101
- rowIndex: args.position?.overlayRow || 0,
102
- columnIndex: args.position?.overlayColumn || 0,
103
- },
104
- },
105
- };
106
- const response = await sheets.spreadsheets.batchUpdate({
107
- spreadsheetId: args.spreadsheetId,
108
- requestBody: {
109
- requests: [
110
- {
111
- addChart: {
112
- chart: {
113
- spec: chartSpec,
114
- position,
115
- },
116
- },
117
- },
118
- ],
119
- },
120
- });
121
- const chartId = response.data.replies?.[0]?.addChart?.chart?.chartId;
122
- return {
123
- content: [
124
- {
125
- type: "text",
126
- text: `Successfully created histogram chart. Chart ID: ${chartId}`,
127
- },
128
- ],
129
- isError: false,
130
- };
131
- }
132
- catch (error) {
133
- return {
134
- content: [
135
- {
136
- type: "text",
137
- text: `Error creating histogram: ${error.message}`,
138
- },
139
- ],
140
- isError: true,
141
- };
142
- }
143
- }