google-services-mcp 0.1.0-beta.100
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/LICENSE +21 -0
- package/README.md +303 -0
- package/dist/auth/config.d.ts +43 -0
- package/dist/auth/config.d.ts.map +1 -0
- package/dist/auth/config.js +112 -0
- package/dist/auth/config.js.map +1 -0
- package/dist/auth/manager.d.ts +50 -0
- package/dist/auth/manager.d.ts.map +1 -0
- package/dist/auth/manager.js +141 -0
- package/dist/auth/manager.js.map +1 -0
- package/dist/auth/oauth.d.ts +57 -0
- package/dist/auth/oauth.d.ts.map +1 -0
- package/dist/auth/oauth.js +223 -0
- package/dist/auth/oauth.js.map +1 -0
- package/dist/auth/store.d.ts +18 -0
- package/dist/auth/store.d.ts.map +1 -0
- package/dist/auth/store.js +50 -0
- package/dist/auth/store.js.map +1 -0
- package/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +137 -0
- package/dist/cli.js.map +1 -0
- package/dist/main.d.ts +3 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +21 -0
- package/dist/main.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +28 -0
- package/dist/server.js.map +1 -0
- package/dist/services/calendar.d.ts +77 -0
- package/dist/services/calendar.d.ts.map +1 -0
- package/dist/services/calendar.js +141 -0
- package/dist/services/calendar.js.map +1 -0
- package/dist/services/contacts-tasks.d.ts +61 -0
- package/dist/services/contacts-tasks.d.ts.map +1 -0
- package/dist/services/contacts-tasks.js +106 -0
- package/dist/services/contacts-tasks.js.map +1 -0
- package/dist/services/docs.d.ts +32 -0
- package/dist/services/docs.d.ts.map +1 -0
- package/dist/services/docs.js +58 -0
- package/dist/services/docs.js.map +1 -0
- package/dist/services/drive.d.ts +72 -0
- package/dist/services/drive.d.ts.map +1 -0
- package/dist/services/drive.js +131 -0
- package/dist/services/drive.js.map +1 -0
- package/dist/services/forms.d.ts +30 -0
- package/dist/services/forms.d.ts.map +1 -0
- package/dist/services/forms.js +54 -0
- package/dist/services/forms.js.map +1 -0
- package/dist/services/gmail.d.ts +159 -0
- package/dist/services/gmail.d.ts.map +1 -0
- package/dist/services/gmail.js +499 -0
- package/dist/services/gmail.js.map +1 -0
- package/dist/services/sheets.d.ts +44 -0
- package/dist/services/sheets.d.ts.map +1 -0
- package/dist/services/sheets.js +53 -0
- package/dist/services/sheets.js.map +1 -0
- package/dist/services/slides.d.ts +30 -0
- package/dist/services/slides.d.ts.map +1 -0
- package/dist/services/slides.js +52 -0
- package/dist/services/slides.js.map +1 -0
- package/dist/services/youtube.d.ts +45 -0
- package/dist/services/youtube.d.ts.map +1 -0
- package/dist/services/youtube.js +97 -0
- package/dist/services/youtube.js.map +1 -0
- package/dist/tools/index.d.ts +3 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +953 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/util/result.d.ts +29 -0
- package/dist/util/result.d.ts.map +1 -0
- package/dist/util/result.js +21 -0
- package/dist/util/result.js.map +1 -0
- package/package.json +60 -0
package/dist/cli.js
ADDED
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { authManager } from "./auth/manager.js";
|
|
3
|
+
/**
|
|
4
|
+
* Read the package version at runtime instead of hardcoding it, so
|
|
5
|
+
* `--version` always matches the actually-published version (the publish
|
|
6
|
+
* workflow bumps package.json before packing, so the hardcoded string would
|
|
7
|
+
* drift). Resolves relative to this module — works from src/ (tsx dev) and
|
|
8
|
+
* dist/ (compiled) alike.
|
|
9
|
+
*/
|
|
10
|
+
const VERSION = (() => {
|
|
11
|
+
try {
|
|
12
|
+
const pkg = JSON.parse(readFileSync(new URL("../package.json", import.meta.url), "utf8"));
|
|
13
|
+
return pkg.version ?? "0.0.0";
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return "0.0.0";
|
|
17
|
+
}
|
|
18
|
+
})();
|
|
19
|
+
const HELP = `google-services-mcp — Google services MCP server
|
|
20
|
+
|
|
21
|
+
Usage:
|
|
22
|
+
google-services-mcp Run the MCP server over stdio
|
|
23
|
+
google-services-mcp add <name> [--timeout <seconds>] Add a Google account (opens browser)
|
|
24
|
+
google-services-mcp list List connected accounts
|
|
25
|
+
google-services-mcp remove <name> Remove an account
|
|
26
|
+
google-services-mcp set-default <name> Set the default account
|
|
27
|
+
google-services-mcp status Show config, accounts and token health
|
|
28
|
+
google-services-mcp --version Print version
|
|
29
|
+
google-services-mcp --help Show this help
|
|
30
|
+
`;
|
|
31
|
+
/** Parse an optional `--timeout <seconds>` flag into milliseconds. */
|
|
32
|
+
function parseTimeout(args) {
|
|
33
|
+
const idx = args.indexOf("--timeout");
|
|
34
|
+
if (idx === -1)
|
|
35
|
+
return undefined;
|
|
36
|
+
const seconds = Number(args[idx + 1]);
|
|
37
|
+
return Number.isFinite(seconds) && seconds > 0 ? seconds * 1000 : undefined;
|
|
38
|
+
}
|
|
39
|
+
/** Pure dispatch used by the CLI. Returns exit code + text output. */
|
|
40
|
+
export async function dispatchCommand(args) {
|
|
41
|
+
const [cmd, ...rest] = args;
|
|
42
|
+
switch (cmd) {
|
|
43
|
+
case undefined:
|
|
44
|
+
case "serve":
|
|
45
|
+
throw new Error("serve must be handled by main(); use --help");
|
|
46
|
+
case "-h":
|
|
47
|
+
case "--help":
|
|
48
|
+
case "help":
|
|
49
|
+
return { exitCode: 0, output: HELP };
|
|
50
|
+
case "--version":
|
|
51
|
+
case "-v": {
|
|
52
|
+
return { exitCode: 0, output: `${VERSION}\n` };
|
|
53
|
+
}
|
|
54
|
+
case "add": {
|
|
55
|
+
const name = rest[0];
|
|
56
|
+
if (!name) {
|
|
57
|
+
return {
|
|
58
|
+
exitCode: 1,
|
|
59
|
+
output: "Usage: google-services-mcp add <name> [--timeout <seconds>]\n",
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
try {
|
|
63
|
+
const timeoutMs = parseTimeout(rest);
|
|
64
|
+
const account = await authManager.addAccount(name, ...(timeoutMs ? [{ timeoutMs }] : []));
|
|
65
|
+
return {
|
|
66
|
+
exitCode: 0,
|
|
67
|
+
output: `Added account "${account.name}" for ${account.email}\n`,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
return {
|
|
72
|
+
exitCode: 1,
|
|
73
|
+
output: `Error: ${error instanceof Error ? error.message : String(error)}\n`,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
case "list": {
|
|
78
|
+
const accounts = await authManager.listAccounts();
|
|
79
|
+
if (accounts.length === 0)
|
|
80
|
+
return { exitCode: 0, output: "No accounts configured.\n" };
|
|
81
|
+
const status = await authManager.getStatus();
|
|
82
|
+
const lines = accounts.map((a) => {
|
|
83
|
+
const def = a.name === status.defaultAccount ? " (default)" : "";
|
|
84
|
+
return ` ${a.name}${def} — ${a.email ?? "(no email)"}`;
|
|
85
|
+
});
|
|
86
|
+
return { exitCode: 0, output: `Accounts:\n${lines.join("\n")}\n` };
|
|
87
|
+
}
|
|
88
|
+
case "remove": {
|
|
89
|
+
const name = rest[0];
|
|
90
|
+
if (!name)
|
|
91
|
+
return { exitCode: 1, output: "Usage: google-services-mcp remove <name>\n" };
|
|
92
|
+
const removed = await authManager.removeAccount(name);
|
|
93
|
+
if (!removed)
|
|
94
|
+
return { exitCode: 1, output: `No account named "${name}" was found.\n` };
|
|
95
|
+
return { exitCode: 0, output: `Removed account "${name}".\n` };
|
|
96
|
+
}
|
|
97
|
+
case "set-default": {
|
|
98
|
+
const name = rest[0];
|
|
99
|
+
if (!name)
|
|
100
|
+
return { exitCode: 1, output: "Usage: google-services-mcp set-default <name>\n" };
|
|
101
|
+
try {
|
|
102
|
+
await authManager.setDefaultAccount(name);
|
|
103
|
+
return { exitCode: 0, output: `Default account set to "${name}".\n` };
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
return {
|
|
107
|
+
exitCode: 1,
|
|
108
|
+
output: `Error: ${error instanceof Error ? error.message : String(error)}\n`,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
case "status": {
|
|
113
|
+
const status = await authManager.getStatus();
|
|
114
|
+
const lines = [
|
|
115
|
+
`Credentials configured: ${status.credentialsConfigured ? "yes" : "no"}`,
|
|
116
|
+
`Data directory: ${status.dataDir}`,
|
|
117
|
+
`Default account: ${status.defaultAccount ?? "(none)"}`,
|
|
118
|
+
"",
|
|
119
|
+
"Accounts:",
|
|
120
|
+
];
|
|
121
|
+
if (status.accounts.length === 0) {
|
|
122
|
+
lines.push(" (none)");
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
for (const a of status.accounts) {
|
|
126
|
+
const health = a.tokenHealthy ? "ok" : "expired";
|
|
127
|
+
const email = a.email ? ` — ${a.email}` : "";
|
|
128
|
+
lines.push(` ${a.name}${email} [token ${health}]`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return { exitCode: 0, output: `${lines.join("\n")}\n` };
|
|
132
|
+
}
|
|
133
|
+
default:
|
|
134
|
+
return { exitCode: 1, output: `Unknown command: ${cmd}\n\n${HELP}` };
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/main.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":""}
|
package/dist/main.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
3
|
+
import { dispatchCommand } from "./cli.js";
|
|
4
|
+
import { createServer } from "./server.js";
|
|
5
|
+
async function main() {
|
|
6
|
+
const args = process.argv.slice(2);
|
|
7
|
+
if (args[0] === undefined || args[0] === "serve") {
|
|
8
|
+
const server = createServer();
|
|
9
|
+
const transport = new StdioServerTransport();
|
|
10
|
+
await server.connect(transport);
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
const result = await dispatchCommand(args);
|
|
14
|
+
process.stdout.write(result.output);
|
|
15
|
+
process.exitCode = result.exitCode;
|
|
16
|
+
}
|
|
17
|
+
main().catch((error) => {
|
|
18
|
+
process.stderr.write(`Error: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
19
|
+
process.exit(1);
|
|
20
|
+
});
|
|
21
|
+
//# sourceMappingURL=main.js.map
|
package/dist/main.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEnC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE,CAAC;QACjD,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;QAC9B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;QAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAChC,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;IAC3C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACpC,OAAO,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AACrC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/server.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAqBpE,wBAAgB,YAAY,IAAI,SAAS,CAOxC"}
|
package/dist/server.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
3
|
+
import { registerTools } from "./tools/index.js";
|
|
4
|
+
/**
|
|
5
|
+
* Read the package version at runtime instead of hardcoding it, so the
|
|
6
|
+
* server-info version always matches the actually-published version (the
|
|
7
|
+
* publish workflow bumps package.json before packing, so a hardcoded string
|
|
8
|
+
* would drift). Resolves relative to this module — works from src/ (tsx dev)
|
|
9
|
+
* and dist/ (compiled) alike.
|
|
10
|
+
*/
|
|
11
|
+
const VERSION = (() => {
|
|
12
|
+
try {
|
|
13
|
+
const pkg = JSON.parse(readFileSync(new URL("../package.json", import.meta.url), "utf8"));
|
|
14
|
+
return pkg.version ?? "0.0.0";
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return "0.0.0";
|
|
18
|
+
}
|
|
19
|
+
})();
|
|
20
|
+
export function createServer() {
|
|
21
|
+
const server = new McpServer({
|
|
22
|
+
name: "google-services-mcp",
|
|
23
|
+
version: VERSION,
|
|
24
|
+
});
|
|
25
|
+
registerTools(server);
|
|
26
|
+
return server;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD;;;;;;GAMG;AACH,MAAM,OAAO,GAAG,CAAC,GAAW,EAAE;IAC5B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,iBAAiB,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAEvF,CAAC;QACF,OAAO,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC,CAAC,EAAE,CAAC;AAEL,MAAM,UAAU,YAAY;IAC1B,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,qBAAqB;QAC3B,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IACH,aAAa,CAAC,MAAM,CAAC,CAAC;IACtB,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import type { Auth } from "googleapis";
|
|
2
|
+
export interface ListEventsOptions {
|
|
3
|
+
calendarId?: string;
|
|
4
|
+
timeMin?: string;
|
|
5
|
+
timeMax?: string;
|
|
6
|
+
maxResults?: number;
|
|
7
|
+
q?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface CreateEventOptions {
|
|
10
|
+
calendarId?: string;
|
|
11
|
+
summary: string;
|
|
12
|
+
description?: string;
|
|
13
|
+
location?: string;
|
|
14
|
+
/** RFC3339 datetime, or a plain date (YYYY-MM-DD) for all-day events. */
|
|
15
|
+
start: string;
|
|
16
|
+
/** RFC3339 datetime, or a plain date (YYYY-MM-DD, exclusive) for all-day events. */
|
|
17
|
+
end: string;
|
|
18
|
+
attendees?: string[];
|
|
19
|
+
}
|
|
20
|
+
export interface UpdateEventOptions {
|
|
21
|
+
calendarId?: string;
|
|
22
|
+
eventId: string;
|
|
23
|
+
summary?: string;
|
|
24
|
+
description?: string;
|
|
25
|
+
location?: string;
|
|
26
|
+
start?: string;
|
|
27
|
+
end?: string;
|
|
28
|
+
attendees?: string[];
|
|
29
|
+
}
|
|
30
|
+
export interface GetEventOptions {
|
|
31
|
+
calendarId?: string;
|
|
32
|
+
eventId: string;
|
|
33
|
+
}
|
|
34
|
+
export interface DeleteEventOptions extends GetEventOptions {
|
|
35
|
+
}
|
|
36
|
+
export interface CalendarSummary {
|
|
37
|
+
id: string;
|
|
38
|
+
summary?: string;
|
|
39
|
+
isPrimary?: boolean;
|
|
40
|
+
accessRole?: string;
|
|
41
|
+
}
|
|
42
|
+
export interface EventSummary {
|
|
43
|
+
id: string;
|
|
44
|
+
summary?: string;
|
|
45
|
+
description?: string;
|
|
46
|
+
location?: string;
|
|
47
|
+
start?: {
|
|
48
|
+
dateTime?: string;
|
|
49
|
+
date?: string;
|
|
50
|
+
};
|
|
51
|
+
end?: {
|
|
52
|
+
dateTime?: string;
|
|
53
|
+
date?: string;
|
|
54
|
+
};
|
|
55
|
+
hangoutLink?: string;
|
|
56
|
+
htmlLink?: string;
|
|
57
|
+
attendees?: Array<{
|
|
58
|
+
email: string;
|
|
59
|
+
displayName?: string;
|
|
60
|
+
responseStatus?: string;
|
|
61
|
+
}>;
|
|
62
|
+
}
|
|
63
|
+
/** List the user's calendars. */
|
|
64
|
+
export declare function listCalendars(client: Auth.OAuth2Client): Promise<CalendarSummary[]>;
|
|
65
|
+
/** List events in a calendar, optionally filtered by time range / free-text query. */
|
|
66
|
+
export declare function listEvents(client: Auth.OAuth2Client, opts: ListEventsOptions): Promise<EventSummary[]>;
|
|
67
|
+
/** Create an event. Returns the created event. */
|
|
68
|
+
export declare function createEvent(client: Auth.OAuth2Client, opts: CreateEventOptions): Promise<EventSummary>;
|
|
69
|
+
/** Get a single event. */
|
|
70
|
+
export declare function getEvent(client: Auth.OAuth2Client, opts: GetEventOptions): Promise<EventSummary>;
|
|
71
|
+
/** Update an existing event (partial). */
|
|
72
|
+
export declare function updateEvent(client: Auth.OAuth2Client, opts: UpdateEventOptions): Promise<EventSummary>;
|
|
73
|
+
/** Delete an event. */
|
|
74
|
+
export declare function deleteEvent(client: Auth.OAuth2Client, opts: DeleteEventOptions): Promise<void>;
|
|
75
|
+
/** Create an event with an attached Google Meet conference. Returns the hangout link. */
|
|
76
|
+
export declare function createMeetLink(client: Auth.OAuth2Client, opts: CreateEventOptions): Promise<EventSummary>;
|
|
77
|
+
//# sourceMappingURL=calendar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calendar.d.ts","sourceRoot":"","sources":["../../src/services/calendar.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { google } from "googleapis";
|
|
2
|
+
function isAllDay(dt) {
|
|
3
|
+
return /^\d{4}-\d{2}-\d{2}$/.test(dt);
|
|
4
|
+
}
|
|
5
|
+
function buildStartEnd(start, end) {
|
|
6
|
+
if (isAllDay(start) || isAllDay(end)) {
|
|
7
|
+
return { start: { date: start }, end: { date: end } };
|
|
8
|
+
}
|
|
9
|
+
return { start: { dateTime: start }, end: { dateTime: end } };
|
|
10
|
+
}
|
|
11
|
+
/** List the user's calendars. */
|
|
12
|
+
export async function listCalendars(client) {
|
|
13
|
+
const calendar = google.calendar({ version: "v3", auth: client });
|
|
14
|
+
const res = await calendar.calendarList.list();
|
|
15
|
+
return (res.data.items ?? []).map((c) => ({
|
|
16
|
+
id: c.id,
|
|
17
|
+
summary: c.summary,
|
|
18
|
+
isPrimary: !!c.primary,
|
|
19
|
+
accessRole: c.accessRole,
|
|
20
|
+
}));
|
|
21
|
+
}
|
|
22
|
+
/** List events in a calendar, optionally filtered by time range / free-text query. */
|
|
23
|
+
export async function listEvents(client, opts) {
|
|
24
|
+
const calendar = google.calendar({ version: "v3", auth: client });
|
|
25
|
+
const res = await calendar.events.list({
|
|
26
|
+
calendarId: opts.calendarId ?? "primary",
|
|
27
|
+
timeMin: opts.timeMin,
|
|
28
|
+
timeMax: opts.timeMax,
|
|
29
|
+
maxResults: opts.maxResults ?? 25,
|
|
30
|
+
q: opts.q,
|
|
31
|
+
singleEvents: true,
|
|
32
|
+
orderBy: "startTime",
|
|
33
|
+
});
|
|
34
|
+
return (res.data.items ?? []).map((e) => ({
|
|
35
|
+
id: e.id,
|
|
36
|
+
summary: e.summary,
|
|
37
|
+
description: e.description,
|
|
38
|
+
location: e.location,
|
|
39
|
+
start: e.start,
|
|
40
|
+
end: e.end,
|
|
41
|
+
hangoutLink: e.hangoutLink,
|
|
42
|
+
htmlLink: e.htmlLink,
|
|
43
|
+
}));
|
|
44
|
+
}
|
|
45
|
+
/** Create an event. Returns the created event. */
|
|
46
|
+
export async function createEvent(client, opts) {
|
|
47
|
+
const startMs = Date.parse(opts.start.replace(" ", "T"));
|
|
48
|
+
const endMs = Date.parse(opts.end.replace(" ", "T"));
|
|
49
|
+
if (!Number.isNaN(startMs) && !Number.isNaN(endMs) && endMs <= startMs) {
|
|
50
|
+
throw new Error("Event end must not be before start.");
|
|
51
|
+
}
|
|
52
|
+
const calendar = google.calendar({ version: "v3", auth: client });
|
|
53
|
+
const requestBody = {
|
|
54
|
+
summary: opts.summary,
|
|
55
|
+
description: opts.description,
|
|
56
|
+
location: opts.location,
|
|
57
|
+
...buildStartEnd(opts.start, opts.end),
|
|
58
|
+
attendees: opts.attendees?.map((email) => ({ email })),
|
|
59
|
+
};
|
|
60
|
+
const res = await calendar.events.insert({
|
|
61
|
+
calendarId: opts.calendarId ?? "primary",
|
|
62
|
+
requestBody,
|
|
63
|
+
});
|
|
64
|
+
return mapEvent(res.data);
|
|
65
|
+
}
|
|
66
|
+
/** Get a single event. */
|
|
67
|
+
export async function getEvent(client, opts) {
|
|
68
|
+
const calendar = google.calendar({ version: "v3", auth: client });
|
|
69
|
+
const res = await calendar.events.get({
|
|
70
|
+
calendarId: opts.calendarId ?? "primary",
|
|
71
|
+
eventId: opts.eventId,
|
|
72
|
+
});
|
|
73
|
+
return mapEvent(res.data);
|
|
74
|
+
}
|
|
75
|
+
/** Update an existing event (partial). */
|
|
76
|
+
export async function updateEvent(client, opts) {
|
|
77
|
+
const calendar = google.calendar({ version: "v3", auth: client });
|
|
78
|
+
const requestBody = {};
|
|
79
|
+
if (opts.summary !== undefined)
|
|
80
|
+
requestBody.summary = opts.summary;
|
|
81
|
+
if (opts.description !== undefined)
|
|
82
|
+
requestBody.description = opts.description;
|
|
83
|
+
if (opts.location !== undefined)
|
|
84
|
+
requestBody.location = opts.location;
|
|
85
|
+
if (opts.attendees !== undefined)
|
|
86
|
+
requestBody.attendees = opts.attendees.map((email) => ({ email }));
|
|
87
|
+
if (opts.start !== undefined && opts.end !== undefined) {
|
|
88
|
+
Object.assign(requestBody, buildStartEnd(opts.start, opts.end));
|
|
89
|
+
}
|
|
90
|
+
const res = await calendar.events.update({
|
|
91
|
+
calendarId: opts.calendarId ?? "primary",
|
|
92
|
+
eventId: opts.eventId,
|
|
93
|
+
requestBody,
|
|
94
|
+
});
|
|
95
|
+
return mapEvent(res.data);
|
|
96
|
+
}
|
|
97
|
+
/** Delete an event. */
|
|
98
|
+
export async function deleteEvent(client, opts) {
|
|
99
|
+
const calendar = google.calendar({ version: "v3", auth: client });
|
|
100
|
+
await calendar.events.delete({
|
|
101
|
+
calendarId: opts.calendarId ?? "primary",
|
|
102
|
+
eventId: opts.eventId,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
/** Create an event with an attached Google Meet conference. Returns the hangout link. */
|
|
106
|
+
export async function createMeetLink(client, opts) {
|
|
107
|
+
const calendar = google.calendar({ version: "v3", auth: client });
|
|
108
|
+
const requestBody = {
|
|
109
|
+
summary: opts.summary,
|
|
110
|
+
description: opts.description,
|
|
111
|
+
location: opts.location,
|
|
112
|
+
...buildStartEnd(opts.start, opts.end),
|
|
113
|
+
attendees: opts.attendees?.map((email) => ({ email })),
|
|
114
|
+
conferenceData: {
|
|
115
|
+
createRequest: {
|
|
116
|
+
requestId: `gmcp-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`,
|
|
117
|
+
conferenceSolutionKey: { type: "hangoutsMeet" },
|
|
118
|
+
},
|
|
119
|
+
},
|
|
120
|
+
};
|
|
121
|
+
const res = await calendar.events.insert({
|
|
122
|
+
calendarId: opts.calendarId ?? "primary",
|
|
123
|
+
requestBody,
|
|
124
|
+
conferenceDataVersion: 1,
|
|
125
|
+
});
|
|
126
|
+
return mapEvent(res.data);
|
|
127
|
+
}
|
|
128
|
+
function mapEvent(data) {
|
|
129
|
+
return {
|
|
130
|
+
id: data.id,
|
|
131
|
+
summary: data.summary,
|
|
132
|
+
description: data.description,
|
|
133
|
+
location: data.location,
|
|
134
|
+
start: data.start,
|
|
135
|
+
end: data.end,
|
|
136
|
+
hangoutLink: data.hangoutLink,
|
|
137
|
+
htmlLink: data.htmlLink,
|
|
138
|
+
attendees: data.attendees,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=calendar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calendar.js","sourceRoot":"","sources":["../../src/services/calendar.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { Auth } from "googleapis";
|
|
2
|
+
export interface ListContactsOptions {
|
|
3
|
+
pageSize?: number;
|
|
4
|
+
}
|
|
5
|
+
export interface SearchContactsOptions {
|
|
6
|
+
query: string;
|
|
7
|
+
pageSize?: number;
|
|
8
|
+
}
|
|
9
|
+
export interface CreateContactOptions {
|
|
10
|
+
name: string;
|
|
11
|
+
email?: string;
|
|
12
|
+
phone?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface ListTasksOptions {
|
|
15
|
+
tasklistId?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface CreateTaskOptions {
|
|
18
|
+
tasklistId?: string;
|
|
19
|
+
title: string;
|
|
20
|
+
notes?: string;
|
|
21
|
+
due?: string;
|
|
22
|
+
}
|
|
23
|
+
export interface TaskRefOptions {
|
|
24
|
+
tasklistId?: string;
|
|
25
|
+
taskId: string;
|
|
26
|
+
}
|
|
27
|
+
export interface ContactSummary {
|
|
28
|
+
resourceName: string;
|
|
29
|
+
name?: string;
|
|
30
|
+
emails: string[];
|
|
31
|
+
phones: string[];
|
|
32
|
+
}
|
|
33
|
+
export interface TaskSummary {
|
|
34
|
+
id: string;
|
|
35
|
+
title?: string;
|
|
36
|
+
status?: string;
|
|
37
|
+
notes?: string;
|
|
38
|
+
due?: string;
|
|
39
|
+
}
|
|
40
|
+
/** List the signed-in user's contacts. */
|
|
41
|
+
export declare function listContacts(client: Auth.OAuth2Client, opts: ListContactsOptions): Promise<ContactSummary[]>;
|
|
42
|
+
/** Search all contacts (including not-connected ones) by name/email/phone. */
|
|
43
|
+
export declare function searchContacts(client: Auth.OAuth2Client, opts: SearchContactsOptions): Promise<ContactSummary[]>;
|
|
44
|
+
/** Create a new contact. */
|
|
45
|
+
export declare function createContact(client: Auth.OAuth2Client, opts: CreateContactOptions): Promise<{
|
|
46
|
+
resourceName: string;
|
|
47
|
+
}>;
|
|
48
|
+
/** List the user's task lists. */
|
|
49
|
+
export declare function listTaskLists(client: Auth.OAuth2Client): Promise<Array<{
|
|
50
|
+
id: string;
|
|
51
|
+
title?: string;
|
|
52
|
+
}>>;
|
|
53
|
+
/** List tasks in a task list. */
|
|
54
|
+
export declare function listTasks(client: Auth.OAuth2Client, opts: ListTasksOptions): Promise<TaskSummary[]>;
|
|
55
|
+
/** Create a task. */
|
|
56
|
+
export declare function createTask(client: Auth.OAuth2Client, opts: CreateTaskOptions): Promise<TaskSummary>;
|
|
57
|
+
/** Mark a task as completed. */
|
|
58
|
+
export declare function completeTask(client: Auth.OAuth2Client, opts: TaskRefOptions): Promise<TaskSummary>;
|
|
59
|
+
/** Delete a task. */
|
|
60
|
+
export declare function deleteTask(client: Auth.OAuth2Client, opts: TaskRefOptions): Promise<void>;
|
|
61
|
+
//# sourceMappingURL=contacts-tasks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contacts-tasks.d.ts","sourceRoot":"","sources":["../../src/services/contacts-tasks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAuB,MAAM,YAAY,CAAC;AAG5D,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,0CAA0C;AAC1C,wBAAsB,YAAY,CAChC,MAAM,EAAE,IAAI,CAAC,YAAY,EACzB,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,cAAc,EAAE,CAAC,CAa3B;AAED,8EAA8E;AAC9E,wBAAsB,cAAc,CAClC,MAAM,EAAE,IAAI,CAAC,YAAY,EACzB,IAAI,EAAE,qBAAqB,GAC1B,OAAO,CAAC,cAAc,EAAE,CAAC,CAgB3B;AAED,4BAA4B;AAC5B,wBAAsB,aAAa,CACjC,MAAM,EAAE,IAAI,CAAC,YAAY,EACzB,IAAI,EAAE,oBAAoB,GACzB,OAAO,CAAC;IAAE,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC,CAYnC;AAED,kCAAkC;AAClC,wBAAsB,aAAa,CACjC,MAAM,EAAE,IAAI,CAAC,YAAY,GACxB,OAAO,CAAC,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAOhD;AAED,iCAAiC;AACjC,wBAAsB,SAAS,CAC7B,MAAM,EAAE,IAAI,CAAC,YAAY,EACzB,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,WAAW,EAAE,CAAC,CAUxB;AAED,qBAAqB;AACrB,wBAAsB,UAAU,CAC9B,MAAM,EAAE,IAAI,CAAC,YAAY,EACzB,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC,WAAW,CAAC,CAWtB;AAED,gCAAgC;AAChC,wBAAsB,YAAY,CAChC,MAAM,EAAE,IAAI,CAAC,YAAY,EACzB,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,WAAW,CAAC,CAYtB;AAED,qBAAqB;AACrB,wBAAsB,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAG/F"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { google } from "googleapis";
|
|
2
|
+
/** List the signed-in user's contacts. */
|
|
3
|
+
export async function listContacts(client, opts) {
|
|
4
|
+
const people = google.people({ version: "v1", auth: client });
|
|
5
|
+
const res = await people.people.connections.list({
|
|
6
|
+
resourceName: "people/me",
|
|
7
|
+
personFields: "names,emailAddresses,phoneNumbers",
|
|
8
|
+
pageSize: opts.pageSize ?? 100,
|
|
9
|
+
});
|
|
10
|
+
return (res.data.connections ?? []).map((c) => ({
|
|
11
|
+
resourceName: c.resourceName,
|
|
12
|
+
name: c.names?.[0]?.displayName,
|
|
13
|
+
emails: (c.emailAddresses ?? []).map((e) => e.value),
|
|
14
|
+
phones: (c.phoneNumbers ?? []).map((p) => p.value),
|
|
15
|
+
}));
|
|
16
|
+
}
|
|
17
|
+
/** Search all contacts (including not-connected ones) by name/email/phone. */
|
|
18
|
+
export async function searchContacts(client, opts) {
|
|
19
|
+
const people = google.people({ version: "v1", auth: client });
|
|
20
|
+
const res = await people.otherContacts.search({
|
|
21
|
+
query: opts.query,
|
|
22
|
+
readMask: "names,emailAddresses,phoneNumbers",
|
|
23
|
+
pageSize: opts.pageSize ?? 25,
|
|
24
|
+
});
|
|
25
|
+
return (res.data.results ?? []).map((r) => {
|
|
26
|
+
const c = r.person ?? {};
|
|
27
|
+
return {
|
|
28
|
+
resourceName: (c.resourceName ?? ""),
|
|
29
|
+
name: c.names?.[0]?.displayName,
|
|
30
|
+
emails: (c.emailAddresses ?? []).map((e) => e.value),
|
|
31
|
+
phones: (c.phoneNumbers ?? []).map((p) => p.value),
|
|
32
|
+
};
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
/** Create a new contact. */
|
|
36
|
+
export async function createContact(client, opts) {
|
|
37
|
+
const people = google.people({ version: "v1", auth: client });
|
|
38
|
+
const requestBody = {
|
|
39
|
+
names: [{ displayName: opts.name, givenName: opts.name }],
|
|
40
|
+
};
|
|
41
|
+
if (opts.email)
|
|
42
|
+
requestBody.emailAddresses = [{ value: opts.email }];
|
|
43
|
+
if (opts.phone)
|
|
44
|
+
requestBody.phoneNumbers = [{ value: opts.phone }];
|
|
45
|
+
const res = await people.people.createContact({
|
|
46
|
+
requestBody,
|
|
47
|
+
personFields: "names,emailAddresses,phoneNumbers",
|
|
48
|
+
});
|
|
49
|
+
return { resourceName: res.data.resourceName ?? "" };
|
|
50
|
+
}
|
|
51
|
+
/** List the user's task lists. */
|
|
52
|
+
export async function listTaskLists(client) {
|
|
53
|
+
const tasks = google.tasks({ version: "v1", auth: client });
|
|
54
|
+
const res = await tasks.tasklists.list();
|
|
55
|
+
return (res.data.items ?? []).map((l) => ({
|
|
56
|
+
id: l.id,
|
|
57
|
+
title: l.title,
|
|
58
|
+
}));
|
|
59
|
+
}
|
|
60
|
+
/** List tasks in a task list. */
|
|
61
|
+
export async function listTasks(client, opts) {
|
|
62
|
+
const tasks = google.tasks({ version: "v1", auth: client });
|
|
63
|
+
const res = await tasks.tasks.list({ tasklist: opts.tasklistId ?? "@default" });
|
|
64
|
+
return (res.data.items ?? []).map((t) => ({
|
|
65
|
+
id: t.id,
|
|
66
|
+
title: t.title,
|
|
67
|
+
status: t.status,
|
|
68
|
+
notes: t.notes,
|
|
69
|
+
due: t.due,
|
|
70
|
+
}));
|
|
71
|
+
}
|
|
72
|
+
/** Create a task. */
|
|
73
|
+
export async function createTask(client, opts) {
|
|
74
|
+
const tasks = google.tasks({ version: "v1", auth: client });
|
|
75
|
+
const requestBody = { title: opts.title };
|
|
76
|
+
if (opts.notes)
|
|
77
|
+
requestBody.notes = opts.notes;
|
|
78
|
+
if (opts.due)
|
|
79
|
+
requestBody.due = opts.due;
|
|
80
|
+
const res = await tasks.tasks.insert({ tasklist: opts.tasklistId ?? "@default", requestBody });
|
|
81
|
+
return {
|
|
82
|
+
id: res.data.id,
|
|
83
|
+
title: res.data.title,
|
|
84
|
+
status: res.data.status,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
/** Mark a task as completed. */
|
|
88
|
+
export async function completeTask(client, opts) {
|
|
89
|
+
const tasks = google.tasks({ version: "v1", auth: client });
|
|
90
|
+
const res = await tasks.tasks.patch({
|
|
91
|
+
tasklist: opts.tasklistId ?? "@default",
|
|
92
|
+
task: opts.taskId,
|
|
93
|
+
requestBody: { status: "completed" },
|
|
94
|
+
});
|
|
95
|
+
return {
|
|
96
|
+
id: res.data.id,
|
|
97
|
+
title: res.data.title,
|
|
98
|
+
status: res.data.status,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
/** Delete a task. */
|
|
102
|
+
export async function deleteTask(client, opts) {
|
|
103
|
+
const tasks = google.tasks({ version: "v1", auth: client });
|
|
104
|
+
await tasks.tasks.delete({ tasklist: opts.tasklistId ?? "@default", task: opts.taskId });
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=contacts-tasks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contacts-tasks.js","sourceRoot":"","sources":["../../src/services/contacts-tasks.ts"],"names":[],"mappings":"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"}
|