terra-mcp-google 0.1.11

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 (51) hide show
  1. package/README.md +57 -0
  2. package/dist/cli.d.ts +2 -0
  3. package/dist/cli.js +94 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/config/constants.d.ts +43 -0
  6. package/dist/config/constants.js +54 -0
  7. package/dist/config/constants.js.map +1 -0
  8. package/dist/core/local-file.d.ts +3 -0
  9. package/dist/core/local-file.js +50 -0
  10. package/dist/core/local-file.js.map +1 -0
  11. package/dist/core/result.d.ts +44 -0
  12. package/dist/core/result.js +104 -0
  13. package/dist/core/result.js.map +1 -0
  14. package/dist/core/tool.d.ts +61 -0
  15. package/dist/core/tool.js +63 -0
  16. package/dist/core/tool.js.map +1 -0
  17. package/dist/google/auth.d.ts +47 -0
  18. package/dist/google/auth.js +256 -0
  19. package/dist/google/auth.js.map +1 -0
  20. package/dist/google/client.d.ts +11 -0
  21. package/dist/google/client.js +14 -0
  22. package/dist/google/client.js.map +1 -0
  23. package/dist/google/generated/oauth-client.d.ts +5 -0
  24. package/dist/google/generated/oauth-client.js +2 -0
  25. package/dist/google/generated/oauth-client.js.map +1 -0
  26. package/dist/index.d.ts +2 -0
  27. package/dist/index.js +24 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/services/auth/tools.d.ts +2 -0
  30. package/dist/services/auth/tools.js +34 -0
  31. package/dist/services/auth/tools.js.map +1 -0
  32. package/dist/services/drive/adapter.d.ts +56 -0
  33. package/dist/services/drive/adapter.js +168 -0
  34. package/dist/services/drive/adapter.js.map +1 -0
  35. package/dist/services/drive/tools.d.ts +65 -0
  36. package/dist/services/drive/tools.js +324 -0
  37. package/dist/services/drive/tools.js.map +1 -0
  38. package/dist/services/registry.d.ts +24 -0
  39. package/dist/services/registry.js +57 -0
  40. package/dist/services/registry.js.map +1 -0
  41. package/dist/services/sheets/adapter.d.ts +112 -0
  42. package/dist/services/sheets/adapter.js +174 -0
  43. package/dist/services/sheets/adapter.js.map +1 -0
  44. package/dist/services/sheets/tools.d.ts +118 -0
  45. package/dist/services/sheets/tools.js +547 -0
  46. package/dist/services/sheets/tools.js.map +1 -0
  47. package/dist/setup/setup.d.ts +31 -0
  48. package/dist/setup/setup.js +179 -0
  49. package/dist/setup/setup.js.map +1 -0
  50. package/package.json +61 -0
  51. package/scripts/install.sh +16 -0
@@ -0,0 +1,179 @@
1
+ import { access, mkdir, readFile, stat } from "node:fs/promises";
2
+ import { createInterface } from "node:readline/promises";
3
+ import { stdin as input, stderr as output } from "node:process";
4
+ import { CLIENT_SECRET_PATH, CONFIG_DIR } from "../config/constants.js";
5
+ import { getAuthStatus } from "../google/auth.js";
6
+ import { EMBEDDED_OAUTH_CLIENT } from "../google/generated/oauth-client.js";
7
+ import { DANGEROUS_TOOL_NAMES, READ_ONLY_TOOL_NAMES } from "../services/registry.js";
8
+ const SERVER_KEY = "kozocom-google";
9
+ const PACKAGE_NAME = "terra-mcp-google";
10
+ async function exists(path) {
11
+ try {
12
+ await access(path);
13
+ return true;
14
+ }
15
+ catch {
16
+ return false;
17
+ }
18
+ }
19
+ async function isFile(path) {
20
+ try {
21
+ return (await stat(path)).isFile();
22
+ }
23
+ catch {
24
+ return false;
25
+ }
26
+ }
27
+ function shellQuote(value) {
28
+ return `'${value.replaceAll("'", "'\\''")}'`;
29
+ }
30
+ /** Render a TOML string array one item per line (trailing comma — valid TOML). */
31
+ function tomlStringArray(items) {
32
+ if (!items.length)
33
+ return "[]";
34
+ return `[\n${items.map((item) => ` ${JSON.stringify(item)},`).join("\n")}\n]`;
35
+ }
36
+ function codexSnippet(command, args, credentialsPath, safeMode) {
37
+ const lines = [
38
+ `[mcp_servers.${SERVER_KEY}]`,
39
+ `command = ${JSON.stringify(command)}`,
40
+ `args = ${JSON.stringify(args)}`,
41
+ ];
42
+ if (credentialsPath) {
43
+ lines.push(`env = { GOOGLE_OAUTH_CREDENTIALS = ${JSON.stringify(credentialsPath)} }`);
44
+ }
45
+ if (safeMode) {
46
+ // Codex gates tools natively via enabled_tools / disabled_tools.
47
+ lines.push(`enabled_tools = ${tomlStringArray(READ_ONLY_TOOL_NAMES)}`);
48
+ lines.push(`disabled_tools = ${tomlStringArray(DANGEROUS_TOOL_NAMES)}`);
49
+ }
50
+ return lines.join("\n");
51
+ }
52
+ function claudeSnippet(command, args, credentialsPath, safeMode) {
53
+ const env = credentialsPath ? `--env GOOGLE_OAUTH_CREDENTIALS=${shellQuote(credentialsPath)} ` : "";
54
+ const add = `claude mcp add ${SERVER_KEY} ${env}-- ${[command, ...args].map(shellQuote).join(" ")}`;
55
+ if (!safeMode)
56
+ return add;
57
+ // Claude Code gates MCP tools via permission rules in .claude/settings.json.
58
+ const deny = JSON.stringify({ permissions: { deny: DANGEROUS_TOOL_NAMES.map((name) => `mcp__${SERVER_KEY}__${name}`) } }, null, 2);
59
+ return `${add}\n\nThen deny the dangerous tools in .claude/settings.json:\n\n${deny}`;
60
+ }
61
+ function copilotSnippet(command, args, credentialsPath, safeMode) {
62
+ return JSON.stringify({
63
+ servers: {
64
+ [SERVER_KEY]: {
65
+ type: "stdio",
66
+ command,
67
+ args,
68
+ ...(credentialsPath ? { env: { GOOGLE_OAUTH_CREDENTIALS: credentialsPath } } : {}),
69
+ // VS Code has no per-tool config key, so the read-only set is named
70
+ // here for clarity; toggle the rest off in the Copilot tools picker.
71
+ ...(safeMode ? { tools: [...READ_ONLY_TOOL_NAMES] } : {}),
72
+ },
73
+ },
74
+ }, null, 2);
75
+ }
76
+ function kiroSnippet(command, args, credentialsPath, safeMode) {
77
+ return JSON.stringify({
78
+ mcpServers: {
79
+ [SERVER_KEY]: {
80
+ command,
81
+ args,
82
+ ...(credentialsPath ? { env: { GOOGLE_OAUTH_CREDENTIALS: credentialsPath } } : {}),
83
+ disabled: false,
84
+ // Kiro has no per-tool disable key, so auto-approve only the read-only
85
+ // tools; the dangerous ones still require an explicit confirmation.
86
+ autoApprove: safeMode ? [...READ_ONLY_TOOL_NAMES] : [],
87
+ },
88
+ },
89
+ }, null, 2);
90
+ }
91
+ export function mcpConfigSnippet({ client, command = "npx", args = ["-y", "-p", PACKAGE_NAME, "terra-mcp"], credentialsPath = null, safeMode = false, }) {
92
+ const codex = codexSnippet(command, args, credentialsPath, safeMode);
93
+ const claude = claudeSnippet(command, args, credentialsPath, safeMode);
94
+ const copilot = copilotSnippet(command, args, credentialsPath, safeMode);
95
+ const kiro = kiroSnippet(command, args, credentialsPath, safeMode);
96
+ const codexSection = `Codex (~/.codex/config.toml):\n\n${codex}`;
97
+ const claudeSection = `Claude Code:\n\n${claude}`;
98
+ const copilotSection = `GitHub Copilot / VS Code (.vscode/mcp.json or global mcp.json):\n\n${copilot}`;
99
+ const kiroSection = `Kiro CLI (~/.kiro/settings/mcp.json or <project>/.kiro/settings/mcp.json):\n\n${kiro}`;
100
+ const sections = {
101
+ codex: codexSection,
102
+ claude: claudeSection,
103
+ copilot: copilotSection,
104
+ kiro: kiroSection,
105
+ all: [codexSection, claudeSection, copilotSection, kiroSection].join("\n\n"),
106
+ };
107
+ return sections[client];
108
+ }
109
+ /**
110
+ * The full text printed by the `config` command: the MCP snippet plus, in safe
111
+ * mode, a note listing the read-only tools that stay enabled and the dangerous
112
+ * tools that are disabled.
113
+ */
114
+ export function configReport({ client, safeMode = true }) {
115
+ const snippet = mcpConfigSnippet({ client, safeMode });
116
+ if (!safeMode)
117
+ return snippet;
118
+ return `${snippet}\n\nEnabled (read-only) tools:\n${bulletList(READ_ONLY_TOOL_NAMES)}\n\nDisabled (dangerous) tools:\n${bulletList(DANGEROUS_TOOL_NAMES)}`;
119
+ }
120
+ function bulletList(names) {
121
+ return names.map((name) => ` - ${name}`).join("\n");
122
+ }
123
+ export function parseClient(value) {
124
+ if (!value)
125
+ return undefined;
126
+ if (value === "codex" || value === "claude" || value === "copilot" || value === "kiro" || value === "all")
127
+ return value;
128
+ throw new Error(`Unknown client "${value}". Use codex, claude, copilot, kiro, or all.`);
129
+ }
130
+ async function prompt(question, fallback) {
131
+ const rl = createInterface({ input, output });
132
+ try {
133
+ const answer = await rl.question(`${question} [${fallback}]: `);
134
+ return answer.trim() || fallback;
135
+ }
136
+ finally {
137
+ rl.close();
138
+ }
139
+ }
140
+ async function chooseClient(defaultClient, yes) {
141
+ if (yes)
142
+ return defaultClient;
143
+ const answer = await prompt("Which MCP client? codex, claude, copilot, kiro, or all", defaultClient);
144
+ return parseClient(answer) ?? defaultClient;
145
+ }
146
+ export async function runSetup(options = {}) {
147
+ await mkdir(CONFIG_DIR, { recursive: true });
148
+ const explicitCredentialsPath = process.env.GOOGLE_OAUTH_CREDENTIALS !== undefined;
149
+ console.error(`Config directory: ${CONFIG_DIR}`);
150
+ console.error(`OAuth client config: ${CLIENT_SECRET_PATH}`);
151
+ if (!explicitCredentialsPath && EMBEDDED_OAUTH_CLIENT) {
152
+ console.error("OAuth client config: using embedded OAuth client.");
153
+ }
154
+ else {
155
+ if (!(await exists(CLIENT_SECRET_PATH))) {
156
+ console.error("\nNo OAuth client config was found. Install a package built with the embedded OAuth client, or save a Google OAuth client JSON here:");
157
+ console.error(` ${CLIENT_SECRET_PATH}`);
158
+ }
159
+ else if (!(await isFile(CLIENT_SECRET_PATH))) {
160
+ throw new Error(`OAuth client config path exists but is not a file: ${CLIENT_SECRET_PATH}`);
161
+ }
162
+ else {
163
+ const secret = await readFile(CLIENT_SECRET_PATH, "utf8");
164
+ JSON.parse(secret);
165
+ console.error("OAuth client config found.");
166
+ }
167
+ }
168
+ const status = await getAuthStatus();
169
+ if (status.authenticated) {
170
+ console.error(`Google auth: signed in${status.email ? ` as ${status.email}` : ""}.`);
171
+ }
172
+ else {
173
+ console.error("Google auth: not signed in. Run `terra-mcp auth login` to sign in.");
174
+ }
175
+ const client = options.client ?? (await chooseClient("all", options.yes ?? false));
176
+ console.error("\nAdd this MCP configuration:\n");
177
+ console.error(mcpConfigSnippet({ client }));
178
+ }
179
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/setup/setup.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,61 @@
1
+ {
2
+ "name": "terra-mcp-google",
3
+ "version": "0.1.11",
4
+ "description": "Kozocom MCP server",
5
+ "type": "module",
6
+ "packageManager": "pnpm@11.5.2",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+ssh://git@github.com/quangtd-kozocom/quang-mcp-google.git"
10
+ },
11
+ "publishConfig": {
12
+ "access": "public"
13
+ },
14
+ "bin": {
15
+ "terra-mcp": "dist/cli.js",
16
+ "terra-mcp-server": "dist/index.js"
17
+ },
18
+ "files": [
19
+ "dist",
20
+ "scripts/install.sh"
21
+ ],
22
+ "scripts": {
23
+ "build": "tsc -p tsconfig.build.json && node scripts/embed-oauth-client.mjs",
24
+ "dev": "tsx watch src/index.ts",
25
+ "start": "node dist/cli.js",
26
+ "login": "node dist/cli.js auth login",
27
+ "logout": "node dist/cli.js auth logout",
28
+ "auth:status": "node dist/cli.js auth status",
29
+ "setup": "node dist/cli.js setup",
30
+ "client": "node dist/cli.js client",
31
+ "login:dev": "tsx src/cli.ts auth login",
32
+ "logout:dev": "tsx src/cli.ts auth logout",
33
+ "auth:status:dev": "tsx src/cli.ts auth status",
34
+ "setup:dev": "tsx src/cli.ts setup",
35
+ "client:dev": "tsx src/cli.ts client",
36
+ "release": "bash scripts/release.sh",
37
+ "test": "vitest run",
38
+ "test:watch": "vitest",
39
+ "lint": "oxlint",
40
+ "typecheck": "tsc --noEmit"
41
+ },
42
+ "keywords": [
43
+ "mcp",
44
+ "modelcontextprotocol"
45
+ ],
46
+ "license": "MIT",
47
+ "dependencies": {
48
+ "@modelcontextprotocol/sdk": "^1.29.0",
49
+ "commander": "^15.0.0",
50
+ "googleapis": "^144.0.0",
51
+ "open": "^10.1.0",
52
+ "zod": "^4.4.3"
53
+ },
54
+ "devDependencies": {
55
+ "@types/node": "^25.9.2",
56
+ "oxlint": "^1.68.0",
57
+ "tsx": "^4.22.4",
58
+ "typescript": "^6.0.3",
59
+ "vitest": "^4.1.8"
60
+ }
61
+ }
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env sh
2
+ set -eu
3
+
4
+ PACKAGE_SPEC="${PACKAGE_SPEC:-quang-mcp-google}"
5
+
6
+ if ! command -v npm >/dev/null 2>&1; then
7
+ echo "npm is required. Install Node.js first: https://nodejs.org/" >&2
8
+ exit 1
9
+ fi
10
+
11
+ echo "Installing ${PACKAGE_SPEC} globally..." >&2
12
+ npm install -g "${PACKAGE_SPEC}"
13
+
14
+ echo >&2
15
+ echo "Running setup..." >&2
16
+ quang-mcp setup "$@"