google-services-mcp 0.1.16 → 0.1.18
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/README.md +10 -9
- package/dist/auth/config.d.ts.map +1 -1
- package/dist/auth/config.js +1 -1
- package/dist/auth/config.js.map +1 -1
- package/dist/auth/manager.d.ts +1 -1
- package/dist/auth/manager.d.ts.map +1 -1
- package/dist/auth/manager.js +3 -3
- package/dist/auth/manager.js.map +1 -1
- package/dist/auth/oauth.d.ts.map +1 -1
- package/dist/auth/oauth.js +1 -1
- package/dist/auth/oauth.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +13 -4
- package/dist/cli.js.map +1 -1
- package/dist/main.js +1 -1
- package/dist/main.js.map +1 -1
- package/dist/server.js.map +1 -1
- package/dist/services/calendar.d.ts.map +1 -1
- package/dist/services/calendar.js.map +1 -1
- package/dist/services/contacts-tasks.d.ts.map +1 -1
- package/dist/services/contacts-tasks.js +4 -1
- package/dist/services/contacts-tasks.js.map +1 -1
- package/dist/services/docs.d.ts +7 -5
- package/dist/services/docs.d.ts.map +1 -1
- package/dist/services/docs.js +1 -3
- package/dist/services/docs.js.map +1 -1
- package/dist/services/drive.d.ts.map +1 -1
- package/dist/services/drive.js +13 -8
- package/dist/services/drive.js.map +1 -1
- package/dist/services/forms.d.ts +7 -5
- package/dist/services/forms.d.ts.map +1 -1
- package/dist/services/forms.js +2 -2
- package/dist/services/forms.js.map +1 -1
- package/dist/services/gmail.d.ts +11 -0
- package/dist/services/gmail.d.ts.map +1 -1
- package/dist/services/gmail.js +202 -24
- package/dist/services/gmail.js.map +1 -1
- package/dist/services/sheets.d.ts +5 -5
- package/dist/services/sheets.d.ts.map +1 -1
- package/dist/services/sheets.js.map +1 -1
- package/dist/services/slides.d.ts +9 -7
- package/dist/services/slides.d.ts.map +1 -1
- package/dist/services/slides.js +1 -3
- package/dist/services/slides.js.map +1 -1
- package/dist/services/youtube.d.ts +13 -8
- package/dist/services/youtube.d.ts.map +1 -1
- package/dist/services/youtube.js +8 -2
- package/dist/services/youtube.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +143 -38
- package/dist/tools/index.js.map +1 -1
- package/package.json +6 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Auth } from "googleapis";
|
|
1
|
+
import type { Auth, youtube_v3 } from "googleapis";
|
|
2
2
|
export interface SearchVideosArgs {
|
|
3
3
|
query: string;
|
|
4
4
|
maxResults?: number;
|
|
@@ -12,25 +12,30 @@ export declare function searchVideos(client: Auth.OAuth2Client, { query, maxResu
|
|
|
12
12
|
title?: string;
|
|
13
13
|
channelTitle?: string;
|
|
14
14
|
}>>;
|
|
15
|
-
export declare function getVideo(client: Auth.OAuth2Client, { videoId }: GetVideoArgs): Promise<
|
|
15
|
+
export declare function getVideo(client: Auth.OAuth2Client, { videoId }: GetVideoArgs): Promise<youtube_v3.Schema$Video | null>;
|
|
16
16
|
export declare function getMyVideos(client: Auth.OAuth2Client, { maxResults }: {
|
|
17
17
|
maxResults?: number;
|
|
18
|
-
}): Promise<
|
|
18
|
+
}): Promise<{
|
|
19
|
+
uploadsPlaylistId: string | null;
|
|
20
|
+
videos: youtube_v3.Schema$PlaylistItem[];
|
|
21
|
+
}>;
|
|
19
22
|
export declare function listPlaylists(client: Auth.OAuth2Client, { maxResults }: {
|
|
20
23
|
maxResults?: number;
|
|
21
|
-
}): Promise<
|
|
22
|
-
export declare function createPlaylist(client: Auth.OAuth2Client, { title, description, privacyStatus }: {
|
|
24
|
+
}): Promise<youtube_v3.Schema$Playlist[]>;
|
|
25
|
+
export declare function createPlaylist(client: Auth.OAuth2Client, { title, description, privacyStatus, }: {
|
|
23
26
|
title: string;
|
|
24
27
|
description?: string;
|
|
25
28
|
privacyStatus?: string;
|
|
26
|
-
}): Promise<
|
|
29
|
+
}): Promise<youtube_v3.Schema$Playlist>;
|
|
27
30
|
export declare function deletePlaylist(client: Auth.OAuth2Client, { playlistId }: {
|
|
28
31
|
playlistId: string;
|
|
29
|
-
}): Promise<
|
|
32
|
+
}): Promise<{
|
|
33
|
+
deleted: boolean;
|
|
34
|
+
}>;
|
|
30
35
|
export declare function addVideoToPlaylist(client: Auth.OAuth2Client, { playlistId, videoId }: {
|
|
31
36
|
playlistId: string;
|
|
32
37
|
videoId: string;
|
|
33
|
-
}): Promise<
|
|
38
|
+
}): Promise<youtube_v3.Schema$PlaylistItem>;
|
|
34
39
|
export declare function listSubscriptions(client: Auth.OAuth2Client, { maxResults }: {
|
|
35
40
|
maxResults?: number;
|
|
36
41
|
}): Promise<Array<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"youtube.d.ts","sourceRoot":"","sources":["../../src/services/youtube.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"youtube.d.ts","sourceRoot":"","sources":["../../src/services/youtube.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGnD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,IAAI,CAAC,YAAY,EACzB,EAAE,KAAK,EAAE,UAAe,EAAE,EAAE,gBAAgB,GAC3C,OAAO,CAAC,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAoBrF;AAED,wBAAsB,QAAQ,CAC5B,MAAM,EAAE,IAAI,CAAC,YAAY,EACzB,EAAE,OAAO,EAAE,EAAE,YAAY,GACxB,OAAO,CAAC,UAAU,CAAC,YAAY,GAAG,IAAI,CAAC,CAOzC;AAED,wBAAsB,WAAW,CAC/B,MAAM,EAAE,IAAI,CAAC,YAAY,EACzB,EAAE,UAAe,EAAE,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3C,OAAO,CAAC;IAAE,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,MAAM,EAAE,UAAU,CAAC,mBAAmB,EAAE,CAAA;CAAE,CAAC,CAoBzF;AAED,wBAAsB,aAAa,CACjC,MAAM,EAAE,IAAI,CAAC,YAAY,EACzB,EAAE,UAAe,EAAE,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3C,OAAO,CAAC,UAAU,CAAC,eAAe,EAAE,CAAC,CAQvC;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,IAAI,CAAC,YAAY,EACzB,EACE,KAAK,EACL,WAAW,EACX,aAAkC,GACnC,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,GACjE,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,CAUrC;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,IAAI,CAAC,YAAY,EACzB,EAAE,UAAU,EAAE,EAAE;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,GACrC,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAI/B;AAED,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,IAAI,CAAC,YAAY,EACzB,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC/D,OAAO,CAAC,UAAU,CAAC,mBAAmB,CAAC,CASzC;AAED,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,IAAI,CAAC,YAAY,EACzB,EAAE,UAAe,EAAE,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3C,OAAO,CAAC,KAAK,CAAC;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAWxD"}
|
package/dist/services/youtube.js
CHANGED
|
@@ -9,7 +9,13 @@ export async function searchVideos(client, { query, maxResults = 10 }) {
|
|
|
9
9
|
});
|
|
10
10
|
return (res.data.items ?? []).map((item) => ({
|
|
11
11
|
id: item.id?.videoId ?? item.id?.channelId ?? item.id?.playlistId ?? "",
|
|
12
|
-
type: item.id?.videoId
|
|
12
|
+
type: item.id?.videoId
|
|
13
|
+
? "video"
|
|
14
|
+
: item.id?.channelId
|
|
15
|
+
? "channel"
|
|
16
|
+
: item.id?.playlistId
|
|
17
|
+
? "playlist"
|
|
18
|
+
: "unknown",
|
|
13
19
|
title: item.snippet?.title ?? undefined,
|
|
14
20
|
channelTitle: item.snippet?.channelTitle ?? undefined,
|
|
15
21
|
}));
|
|
@@ -50,7 +56,7 @@ export async function listPlaylists(client, { maxResults = 25 }) {
|
|
|
50
56
|
});
|
|
51
57
|
return res.data.items ?? [];
|
|
52
58
|
}
|
|
53
|
-
export async function createPlaylist(client, { title, description, privacyStatus = "private" }) {
|
|
59
|
+
export async function createPlaylist(client, { title, description, privacyStatus = "private", }) {
|
|
54
60
|
const yt = google.youtube({ version: "v3", auth: client });
|
|
55
61
|
const res = await yt.playlists.insert({
|
|
56
62
|
part: ["snippet", "status"],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"youtube.js","sourceRoot":"","sources":["../../src/services/youtube.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAWpC,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,MAAyB,EACzB,EAAE,KAAK,EAAE,UAAU,GAAG,EAAE,EAAoB;IAE5C,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3D,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC;QAC/B,IAAI,EAAE,CAAC,SAAS,CAAC;QACjB,CAAC,EAAE,KAAK;QACR,IAAI,EAAE,CAAC,OAAO,CAAC;QACf,UAAU;KACX,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC3C,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,IAAI,IAAI,CAAC,EAAE,EAAE,SAAS,IAAI,IAAI,CAAC,EAAE,EAAE,UAAU,IAAI,EAAE;QACvE,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"youtube.js","sourceRoot":"","sources":["../../src/services/youtube.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA0GzE,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA85CrD"}
|
package/dist/tools/index.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
|
-
import { ok, err } from "../util/result.js";
|
|
3
2
|
import { authManager } from "../auth/manager.js";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
3
|
+
import { createEvent, createMeetLink, deleteEvent, getEvent, listCalendars, listEvents, updateEvent, } from "../services/calendar.js";
|
|
4
|
+
import { completeTask, createContact, createTask, deleteTask, listContacts, listTaskLists, listTasks, searchContacts, } from "../services/contacts-tasks.js";
|
|
5
|
+
import { batchUpdateDocument, createDocument, getDocument, getDocumentText, insertText, replaceAllText, } from "../services/docs.js";
|
|
6
|
+
import { copyDriveFile, createDriveFolder, deleteDriveFile, downloadDriveFile, exportDriveFile, getDriveFile, listDriveFiles, shareDriveFile, updateDriveFile, uploadDriveFile, } from "../services/drive.js";
|
|
7
|
+
import { addQuestion, createForm, getForm, getFormResponses } from "../services/forms.js";
|
|
8
|
+
import { createGmailDraft, createGmailLabel, deleteGmailDraft, deleteGmailLabel, deleteGmailMessage, getGmailAttachment, getGmailDraft, getGmailMessage, listGmailAttachments, listGmailDrafts, listGmailLabels, listGmailMessages, modifyGmailMessage, replyGmail, sendGmail, sendGmailDraft, trashGmailMessage, untrashGmailMessage, } from "../services/gmail.js";
|
|
9
|
+
import { appendSheetRange, batchUpdateSheet, createSpreadsheet, getSpreadsheet, readSheetRange, writeSheetRange, } from "../services/sheets.js";
|
|
10
|
+
import { batchUpdatePresentation, createPresentation, createSlide, deleteSlide, getPresentation, getSlidePage, replaceAllText as replaceSlidesText, } from "../services/slides.js";
|
|
11
|
+
import { addVideoToPlaylist, createPlaylist, deletePlaylist, getMyVideos, getVideo, listPlaylists, listSubscriptions, searchVideos, } from "../services/youtube.js";
|
|
12
|
+
import { err, ok } from "../util/result.js";
|
|
13
13
|
/** Wrap a service call that resolves its own auth client. */
|
|
14
14
|
async function withClient(account, fn) {
|
|
15
15
|
try {
|
|
@@ -27,7 +27,10 @@ export function registerTools(server) {
|
|
|
27
27
|
description: "Start the OAuth consent flow to connect a new Google account. Opens a browser for sign-in.",
|
|
28
28
|
inputSchema: {
|
|
29
29
|
name: z.string().describe("Nickname for the account (e.g. personal, work)."),
|
|
30
|
-
openBrowser: z
|
|
30
|
+
openBrowser: z
|
|
31
|
+
.boolean()
|
|
32
|
+
.optional()
|
|
33
|
+
.describe("Open a browser automatically (default true)."),
|
|
31
34
|
},
|
|
32
35
|
}, async ({ name, openBrowser }) => {
|
|
33
36
|
try {
|
|
@@ -105,12 +108,32 @@ export function registerTools(server) {
|
|
|
105
108
|
to: z.union([z.string(), z.array(z.string())]).describe("Recipient email(s)."),
|
|
106
109
|
subject: z.string().describe("Subject line."),
|
|
107
110
|
body: z.string().describe("Message body."),
|
|
108
|
-
cc: z
|
|
109
|
-
|
|
111
|
+
cc: z
|
|
112
|
+
.union([z.string(), z.array(z.string())])
|
|
113
|
+
.optional()
|
|
114
|
+
.describe("CC recipient(s)."),
|
|
115
|
+
bcc: z
|
|
116
|
+
.union([z.string(), z.array(z.string())])
|
|
117
|
+
.optional()
|
|
118
|
+
.describe("BCC recipient(s)."),
|
|
110
119
|
bodyType: z.enum(["text", "html"]).optional().describe("Body format (default text)."),
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
120
|
+
attachments: z
|
|
121
|
+
.array(z.object({
|
|
122
|
+
path: z.string().describe("Local filesystem path of the file to attach."),
|
|
123
|
+
filename: z
|
|
124
|
+
.string()
|
|
125
|
+
.optional()
|
|
126
|
+
.describe("Attachment filename shown to recipients (defaults to the basename of path)."),
|
|
127
|
+
mimeType: z
|
|
128
|
+
.string()
|
|
129
|
+
.optional()
|
|
130
|
+
.describe("MIME type override (defaults to a guess from the filename)."),
|
|
131
|
+
}))
|
|
132
|
+
.optional()
|
|
133
|
+
.describe("Local files to attach to the email."),
|
|
134
|
+
account: z.string().optional().describe("Account nickname to use."),
|
|
135
|
+
},
|
|
136
|
+
}, async ({ to, subject, body, cc, bcc, bodyType, attachments, account }) => withClient(account, (client) => sendGmail(client, { to, subject, body, cc, bcc, bodyType, attachments })));
|
|
114
137
|
server.registerTool("google_gmail_list", {
|
|
115
138
|
title: "List emails",
|
|
116
139
|
description: "List messages from the inbox, newest first, with an optional Gmail search query.",
|
|
@@ -133,7 +156,10 @@ export function registerTools(server) {
|
|
|
133
156
|
description: "Add or remove labels on a message (e.g. mark read/unread, star, archive).",
|
|
134
157
|
inputSchema: {
|
|
135
158
|
id: z.string().describe("Message ID."),
|
|
136
|
-
addLabels: z
|
|
159
|
+
addLabels: z
|
|
160
|
+
.array(z.string())
|
|
161
|
+
.optional()
|
|
162
|
+
.describe("Labels to add (e.g. STARRED, INBOX, TRASH)."),
|
|
137
163
|
removeLabels: z.array(z.string()).optional().describe("Labels to remove (e.g. UNREAD)."),
|
|
138
164
|
account: z.string().optional().describe("Account nickname to use."),
|
|
139
165
|
},
|
|
@@ -146,9 +172,23 @@ export function registerTools(server) {
|
|
|
146
172
|
messageId: z.string().describe("ID of the message being replied to."),
|
|
147
173
|
body: z.string().describe("Reply body."),
|
|
148
174
|
bodyType: z.enum(["text", "html"]).optional().describe("Body format (default text)."),
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
175
|
+
attachments: z
|
|
176
|
+
.array(z.object({
|
|
177
|
+
path: z.string().describe("Local filesystem path of the file to attach."),
|
|
178
|
+
filename: z
|
|
179
|
+
.string()
|
|
180
|
+
.optional()
|
|
181
|
+
.describe("Attachment filename shown to recipients (defaults to the basename of path)."),
|
|
182
|
+
mimeType: z
|
|
183
|
+
.string()
|
|
184
|
+
.optional()
|
|
185
|
+
.describe("MIME type override (defaults to a guess from the filename)."),
|
|
186
|
+
}))
|
|
187
|
+
.optional()
|
|
188
|
+
.describe("Local files to attach to the reply."),
|
|
189
|
+
account: z.string().optional().describe("Account nickname to use."),
|
|
190
|
+
},
|
|
191
|
+
}, async ({ threadId, messageId, body, bodyType, attachments, account }) => withClient(account, (client) => replyGmail(client, { threadId, messageId, body, bodyType, attachments })));
|
|
152
192
|
server.registerTool("google_gmail_list_attachments", {
|
|
153
193
|
title: "List email attachments",
|
|
154
194
|
description: "List attachments on a message (metadata only, no bytes).",
|
|
@@ -163,7 +203,10 @@ export function registerTools(server) {
|
|
|
163
203
|
inputSchema: {
|
|
164
204
|
id: z.string().describe("Message ID."),
|
|
165
205
|
attachmentId: z.string().describe("Attachment ID (from list_attachments)."),
|
|
166
|
-
partId: z
|
|
206
|
+
partId: z
|
|
207
|
+
.string()
|
|
208
|
+
.optional()
|
|
209
|
+
.describe("Stable part ID (from list_attachments); preferred over attachmentId for lookup."),
|
|
167
210
|
account: z.string().optional().describe("Account nickname to use."),
|
|
168
211
|
},
|
|
169
212
|
}, async ({ id, attachmentId, partId, account }) => withClient(account, (client) => getGmailAttachment(client, { id, attachmentId, partId })));
|
|
@@ -174,12 +217,32 @@ export function registerTools(server) {
|
|
|
174
217
|
to: z.union([z.string(), z.array(z.string())]).describe("Recipient email(s)."),
|
|
175
218
|
subject: z.string().describe("Subject line."),
|
|
176
219
|
body: z.string().describe("Message body."),
|
|
177
|
-
cc: z
|
|
178
|
-
|
|
220
|
+
cc: z
|
|
221
|
+
.union([z.string(), z.array(z.string())])
|
|
222
|
+
.optional()
|
|
223
|
+
.describe("CC recipient(s)."),
|
|
224
|
+
bcc: z
|
|
225
|
+
.union([z.string(), z.array(z.string())])
|
|
226
|
+
.optional()
|
|
227
|
+
.describe("BCC recipient(s)."),
|
|
179
228
|
bodyType: z.enum(["text", "html"]).optional().describe("Body format (default text)."),
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
229
|
+
attachments: z
|
|
230
|
+
.array(z.object({
|
|
231
|
+
path: z.string().describe("Local filesystem path of the file to attach."),
|
|
232
|
+
filename: z
|
|
233
|
+
.string()
|
|
234
|
+
.optional()
|
|
235
|
+
.describe("Attachment filename shown to recipients (defaults to the basename of path)."),
|
|
236
|
+
mimeType: z
|
|
237
|
+
.string()
|
|
238
|
+
.optional()
|
|
239
|
+
.describe("MIME type override (defaults to a guess from the filename)."),
|
|
240
|
+
}))
|
|
241
|
+
.optional()
|
|
242
|
+
.describe("Local files to attach to the draft."),
|
|
243
|
+
account: z.string().optional().describe("Account nickname to use."),
|
|
244
|
+
},
|
|
245
|
+
}, async ({ to, subject, body, cc, bcc, bodyType, attachments, account }) => withClient(account, (client) => createGmailDraft(client, { to, subject, body, cc, bcc, bodyType, attachments })));
|
|
183
246
|
server.registerTool("google_gmail_drafts_list", {
|
|
184
247
|
title: "List email drafts",
|
|
185
248
|
description: "List draft emails.",
|
|
@@ -355,7 +418,16 @@ export function registerTools(server) {
|
|
|
355
418
|
calendarId: z.string().optional().describe("Calendar ID (default primary)."),
|
|
356
419
|
account: z.string().optional().describe("Account nickname to use."),
|
|
357
420
|
},
|
|
358
|
-
}, async ({ eventId, summary, description, location, start, end, attendees, calendarId, account }) => withClient(account, (client) => updateEvent(client, {
|
|
421
|
+
}, async ({ eventId, summary, description, location, start, end, attendees, calendarId, account, }) => withClient(account, (client) => updateEvent(client, {
|
|
422
|
+
eventId,
|
|
423
|
+
summary,
|
|
424
|
+
description,
|
|
425
|
+
location,
|
|
426
|
+
start,
|
|
427
|
+
end,
|
|
428
|
+
attendees,
|
|
429
|
+
calendarId,
|
|
430
|
+
})));
|
|
359
431
|
server.registerTool("google_calendar_delete_event", {
|
|
360
432
|
title: "Delete calendar event",
|
|
361
433
|
description: "Delete an event by ID.",
|
|
@@ -397,7 +469,9 @@ export function registerTools(server) {
|
|
|
397
469
|
description: "Create a file in Drive, optionally with text content (blank Google-native file if omitted).",
|
|
398
470
|
inputSchema: {
|
|
399
471
|
name: z.string().describe("File name."),
|
|
400
|
-
mimeType: z
|
|
472
|
+
mimeType: z
|
|
473
|
+
.string()
|
|
474
|
+
.describe("MIME type (e.g. text/plain, application/vnd.google-apps.document)."),
|
|
401
475
|
content: z.string().optional().describe("Text content to upload."),
|
|
402
476
|
parentFolderId: z.string().optional().describe("Parent folder ID."),
|
|
403
477
|
account: z.string().optional().describe("Account nickname to use."),
|
|
@@ -438,7 +512,10 @@ export function registerTools(server) {
|
|
|
438
512
|
fileId: z.string().describe("Drive file ID."),
|
|
439
513
|
email: z.string().email().describe("Recipient email."),
|
|
440
514
|
role: z.enum(["reader", "writer", "commenter"]).describe("Access role."),
|
|
441
|
-
sendNotificationEmail: z
|
|
515
|
+
sendNotificationEmail: z
|
|
516
|
+
.boolean()
|
|
517
|
+
.optional()
|
|
518
|
+
.describe("Email the recipient (default true)."),
|
|
442
519
|
account: z.string().optional().describe("Account nickname to use."),
|
|
443
520
|
},
|
|
444
521
|
}, async ({ fileId, email, role, sendNotificationEmail, account }) => withClient(account, (client) => shareDriveFile(client, { fileId, email, role, sendNotificationEmail })));
|
|
@@ -564,7 +641,10 @@ export function registerTools(server) {
|
|
|
564
641
|
description: "Get spreadsheet metadata and optionally cell values from a range.",
|
|
565
642
|
inputSchema: {
|
|
566
643
|
spreadsheetId: z.string().describe("Spreadsheet ID (from the URL)."),
|
|
567
|
-
range: z
|
|
644
|
+
range: z
|
|
645
|
+
.string()
|
|
646
|
+
.optional()
|
|
647
|
+
.describe("A1 range to also read values from, e.g. Sheet1!A1:B5."),
|
|
568
648
|
account: z.string().optional().describe("Account nickname to use."),
|
|
569
649
|
},
|
|
570
650
|
}, async ({ spreadsheetId, range, account }) => withClient(account, (client) => getSpreadsheet(client, { spreadsheetId, range })));
|
|
@@ -574,7 +654,10 @@ export function registerTools(server) {
|
|
|
574
654
|
inputSchema: {
|
|
575
655
|
spreadsheetId: z.string().describe("Spreadsheet ID."),
|
|
576
656
|
range: z.string().describe("A1 notation, e.g. Sheet1!A1:C10."),
|
|
577
|
-
majorDimension: z
|
|
657
|
+
majorDimension: z
|
|
658
|
+
.enum(["ROWS", "COLUMNS"])
|
|
659
|
+
.optional()
|
|
660
|
+
.describe("Read direction (default ROWS)."),
|
|
578
661
|
account: z.string().optional().describe("Account nickname to use."),
|
|
579
662
|
},
|
|
580
663
|
}, async ({ spreadsheetId, range, majorDimension, account }) => withClient(account, (client) => readSheetRange(client, { spreadsheetId, range, majorDimension })));
|
|
@@ -585,7 +668,10 @@ export function registerTools(server) {
|
|
|
585
668
|
spreadsheetId: z.string().describe("Spreadsheet ID."),
|
|
586
669
|
range: z.string().describe("A1 notation of the top-left cell, e.g. Sheet1!A1."),
|
|
587
670
|
values: z.array(z.array(z.string())).describe("Rows of values to write."),
|
|
588
|
-
valueInputOption: z
|
|
671
|
+
valueInputOption: z
|
|
672
|
+
.enum(["RAW", "USER_ENTERED"])
|
|
673
|
+
.optional()
|
|
674
|
+
.describe("How to interpret values (default USER_ENTERED)."),
|
|
589
675
|
account: z.string().optional().describe("Account nickname to use."),
|
|
590
676
|
},
|
|
591
677
|
}, async ({ spreadsheetId, range, values, valueInputOption, account }) => withClient(account, (client) => writeSheetRange(client, { spreadsheetId, range, values, valueInputOption })));
|
|
@@ -596,7 +682,10 @@ export function registerTools(server) {
|
|
|
596
682
|
spreadsheetId: z.string().describe("Spreadsheet ID."),
|
|
597
683
|
range: z.string().describe("A1 range of the table to append to, e.g. Sheet1!A1."),
|
|
598
684
|
values: z.array(z.array(z.string())).describe("Rows of values to append."),
|
|
599
|
-
valueInputOption: z
|
|
685
|
+
valueInputOption: z
|
|
686
|
+
.enum(["RAW", "USER_ENTERED"])
|
|
687
|
+
.optional()
|
|
688
|
+
.describe("How to interpret values (default USER_ENTERED)."),
|
|
600
689
|
account: z.string().optional().describe("Account nickname to use."),
|
|
601
690
|
},
|
|
602
691
|
}, async ({ spreadsheetId, range, values, valueInputOption, account }) => withClient(account, (client) => appendSheetRange(client, { spreadsheetId, range, values, valueInputOption })));
|
|
@@ -614,7 +703,9 @@ export function registerTools(server) {
|
|
|
614
703
|
description: "Send raw Sheets batchUpdate requests (add/delete sheets, formatting, etc.).",
|
|
615
704
|
inputSchema: {
|
|
616
705
|
spreadsheetId: z.string().describe("Spreadsheet ID."),
|
|
617
|
-
requests: z
|
|
706
|
+
requests: z
|
|
707
|
+
.array(z.record(z.string(), z.any()))
|
|
708
|
+
.describe("Sheets API batchUpdate requests."),
|
|
618
709
|
account: z.string().optional().describe("Account nickname to use."),
|
|
619
710
|
},
|
|
620
711
|
}, async ({ spreadsheetId, requests, account }) => withClient(account, (client) => batchUpdateSheet(client, { spreadsheetId, requests })));
|
|
@@ -649,7 +740,12 @@ export function registerTools(server) {
|
|
|
649
740
|
inputSchema: {
|
|
650
741
|
documentId: z.string().describe("Document ID."),
|
|
651
742
|
text: z.string().describe("Text to insert."),
|
|
652
|
-
index: z
|
|
743
|
+
index: z
|
|
744
|
+
.number()
|
|
745
|
+
.int()
|
|
746
|
+
.min(0)
|
|
747
|
+
.optional()
|
|
748
|
+
.describe("Character index to insert at (default end of document)."),
|
|
653
749
|
account: z.string().optional().describe("Account nickname to use."),
|
|
654
750
|
},
|
|
655
751
|
}, async ({ documentId, text, index, account }) => withClient(account, (client) => insertText(client, { documentId, text, index })));
|
|
@@ -776,7 +872,10 @@ export function registerTools(server) {
|
|
|
776
872
|
inputSchema: {
|
|
777
873
|
title: z.string().describe("Playlist title."),
|
|
778
874
|
description: z.string().optional().describe("Playlist description."),
|
|
779
|
-
privacyStatus: z
|
|
875
|
+
privacyStatus: z
|
|
876
|
+
.enum(["private", "public", "unlisted"])
|
|
877
|
+
.optional()
|
|
878
|
+
.describe("Privacy (default private)."),
|
|
780
879
|
account: z.string().optional().describe("Account nickname to use."),
|
|
781
880
|
},
|
|
782
881
|
}, async ({ title, description, privacyStatus, account }) => withClient(account, (client) => createPlaylist(client, { title, description, privacyStatus })));
|
|
@@ -838,9 +937,15 @@ export function registerTools(server) {
|
|
|
838
937
|
formId: z.string().describe("Form ID."),
|
|
839
938
|
title: z.string().describe("Question text."),
|
|
840
939
|
description: z.string().optional().describe("Optional help text."),
|
|
841
|
-
type: z
|
|
940
|
+
type: z
|
|
941
|
+
.enum(["text", "multiple_choice"])
|
|
942
|
+
.optional()
|
|
943
|
+
.describe("Question type (default text)."),
|
|
842
944
|
options: z.array(z.string()).optional().describe("Choices for multiple_choice."),
|
|
843
|
-
required: z
|
|
945
|
+
required: z
|
|
946
|
+
.boolean()
|
|
947
|
+
.optional()
|
|
948
|
+
.describe("Whether the question is required (default false)."),
|
|
844
949
|
account: z.string().optional().describe("Account nickname to use."),
|
|
845
950
|
},
|
|
846
951
|
}, async ({ formId, title, description, type, options, required, account }) => withClient(account, (client) => addQuestion(client, { formId, title, description, type, options, required })));
|