@cainmaila/gemini-cli-mcp 1.0.0

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.
@@ -0,0 +1,336 @@
1
+ import { runGeminiCommand } from "./geminiCommandRunner.js";
2
+ const MODEL_PROBE_PROMPT = [
3
+ "List the currently available Gemini CLI capabilities for this session.",
4
+ "Group the answer into built-in tools, extensions, skills, and MCP servers.",
5
+ "Keep it concise and do not invent unavailable tools.",
6
+ ].join(" ");
7
+ function stripStatusLines(text) {
8
+ return text
9
+ .split("\n")
10
+ .map((line) => line.trimEnd())
11
+ .filter((line) => line.trim() !== "")
12
+ .filter((line) => !line.startsWith("Loaded cached credentials."))
13
+ .filter((line) => !line.startsWith("Loading extension:"))
14
+ .filter((line) => !line.startsWith("Server '") &&
15
+ !line.includes("supports tool updates."))
16
+ .filter((line) => !line.startsWith("[ERROR] [IDEClient]"));
17
+ }
18
+ function collectIndentedValues(lines, startIndex) {
19
+ const values = [];
20
+ for (let index = startIndex + 1; index < lines.length; index += 1) {
21
+ const line = lines[index];
22
+ if (!line) {
23
+ break;
24
+ }
25
+ if (!line.startsWith(" ")) {
26
+ break;
27
+ }
28
+ values.push(line.trim());
29
+ }
30
+ return values;
31
+ }
32
+ export function parseGeminiHelpCommands(stdout) {
33
+ const lines = stripStatusLines(stdout);
34
+ const commandsStart = lines.findIndex((line) => line.trim() === "Commands:");
35
+ if (commandsStart === -1) {
36
+ return [];
37
+ }
38
+ const commands = [];
39
+ for (let index = commandsStart + 1; index < lines.length; index += 1) {
40
+ const line = lines[index];
41
+ if (!line) {
42
+ break;
43
+ }
44
+ if (!line.trim()) {
45
+ continue;
46
+ }
47
+ if (!line.startsWith(" ")) {
48
+ break;
49
+ }
50
+ const match = line.trim().match(/^(.*?)\s{2,}(.*)$/);
51
+ if (!match) {
52
+ continue;
53
+ }
54
+ const [, command, description] = match;
55
+ if (!command || !description) {
56
+ continue;
57
+ }
58
+ commands.push({
59
+ command: command.trim(),
60
+ description: description.trim(),
61
+ });
62
+ }
63
+ return commands;
64
+ }
65
+ export function parseGeminiExtensions(stdout) {
66
+ const lines = stripStatusLines(stdout);
67
+ const extensions = [];
68
+ let current;
69
+ for (let index = 0; index < lines.length; index += 1) {
70
+ const line = lines[index];
71
+ if (!line) {
72
+ continue;
73
+ }
74
+ const headerMatch = line.match(/^[✓✗]\s+([^\(]+)\(([^\)]+)\)$/);
75
+ if (headerMatch) {
76
+ const [, name, version] = headerMatch;
77
+ if (!name || !version) {
78
+ continue;
79
+ }
80
+ if (current) {
81
+ extensions.push(current);
82
+ }
83
+ current = {
84
+ name: name.trim(),
85
+ version: version.trim(),
86
+ };
87
+ continue;
88
+ }
89
+ if (!current) {
90
+ continue;
91
+ }
92
+ const trimmed = line.trim();
93
+ if (trimmed.startsWith("Path:")) {
94
+ current.path = trimmed.replace(/^Path:\s*/, "");
95
+ continue;
96
+ }
97
+ if (trimmed.startsWith("Source:")) {
98
+ current.source = trimmed.replace(/^Source:\s*/, "");
99
+ continue;
100
+ }
101
+ if (trimmed.startsWith("Enabled (User):")) {
102
+ current.enabledUser =
103
+ trimmed.replace(/^Enabled \(User\):\s*/, "") === "true";
104
+ continue;
105
+ }
106
+ if (trimmed.startsWith("Enabled (Workspace):")) {
107
+ current.enabledWorkspace =
108
+ trimmed.replace(/^Enabled \(Workspace\):\s*/, "") === "true";
109
+ continue;
110
+ }
111
+ if (trimmed === "MCP servers:") {
112
+ current.mcpServers = collectIndentedValues(lines, index);
113
+ }
114
+ }
115
+ if (current) {
116
+ extensions.push(current);
117
+ }
118
+ return extensions;
119
+ }
120
+ export function parseGeminiSkills(stdout) {
121
+ const lines = stripStatusLines(stdout);
122
+ const startIndex = lines.findIndex((line) => line.includes("Discovered Agent Skills:"));
123
+ if (startIndex === -1) {
124
+ return [];
125
+ }
126
+ const skills = [];
127
+ let current;
128
+ for (let index = startIndex + 1; index < lines.length; index += 1) {
129
+ const line = lines[index];
130
+ if (!line) {
131
+ break;
132
+ }
133
+ if (!line.trim()) {
134
+ continue;
135
+ }
136
+ if (!line.startsWith(" ") && !line.startsWith("\t")) {
137
+ if (current) {
138
+ skills.push(current);
139
+ }
140
+ current = {
141
+ name: line.replace(/\s*\[[^\]]+\]/g, "").trim(),
142
+ enabled: line.includes("[Enabled]"),
143
+ builtIn: line.includes("[Built-in]"),
144
+ };
145
+ continue;
146
+ }
147
+ if (!current) {
148
+ continue;
149
+ }
150
+ const trimmed = line.trim();
151
+ if (trimmed.startsWith("Description:")) {
152
+ current.description = trimmed.replace(/^Description:\s*/, "");
153
+ continue;
154
+ }
155
+ if (trimmed.startsWith("Location:")) {
156
+ current.location = trimmed.replace(/^Location:\s*/, "");
157
+ }
158
+ }
159
+ if (current) {
160
+ skills.push(current);
161
+ }
162
+ return skills;
163
+ }
164
+ export function parseGeminiMcpServers(stdout) {
165
+ const lines = stripStatusLines(stdout);
166
+ const startIndex = lines.findIndex((line) => line.includes("Configured MCP servers:"));
167
+ if (startIndex === -1) {
168
+ return [];
169
+ }
170
+ const servers = [];
171
+ for (let index = startIndex + 1; index < lines.length; index += 1) {
172
+ const line = lines[index];
173
+ if (!line) {
174
+ break;
175
+ }
176
+ const trimmedLine = line.trim();
177
+ if (!trimmedLine) {
178
+ continue;
179
+ }
180
+ const match = trimmedLine.match(/^[✓✗]\s+([^:]+):\s+(.*)\s+\(([^\)]+)\)\s+-\s+(.+)$/);
181
+ if (!match) {
182
+ continue;
183
+ }
184
+ const [, name, target, transport, status] = match;
185
+ if (!name || !target || !transport || !status) {
186
+ continue;
187
+ }
188
+ servers.push({
189
+ name: name.trim(),
190
+ target: target.trim(),
191
+ transport: transport.trim(),
192
+ status: status.trim(),
193
+ });
194
+ }
195
+ return servers;
196
+ }
197
+ function parseModelProbe(stdout) {
198
+ try {
199
+ const payload = JSON.parse(stdout);
200
+ return payload.response?.trim();
201
+ }
202
+ catch {
203
+ return undefined;
204
+ }
205
+ }
206
+ function extractBacktickNames(line) {
207
+ return [...line.matchAll(/`([^`]+)`/g)]
208
+ .map((match) => match[1]?.trim())
209
+ .filter((value) => Boolean(value));
210
+ }
211
+ function extractBoldNames(line) {
212
+ return [...line.matchAll(/\*\*([^*]+)\*\*/g)]
213
+ .map((match) => match[1]?.trim())
214
+ .filter((value) => Boolean(value));
215
+ }
216
+ function unique(values) {
217
+ return [...new Set(values)];
218
+ }
219
+ export function parseModelReportedSummary(text) {
220
+ if (!text?.trim()) {
221
+ return undefined;
222
+ }
223
+ const summary = {
224
+ builtInTools: [],
225
+ extensions: [],
226
+ skills: [],
227
+ mcpServers: [],
228
+ };
229
+ let section;
230
+ for (const rawLine of text.split("\n")) {
231
+ const line = rawLine.trim();
232
+ if (!line) {
233
+ continue;
234
+ }
235
+ if (/內建工具|Built-in Tools/i.test(line)) {
236
+ section = "builtInTools";
237
+ continue;
238
+ }
239
+ if (/擴充功能|Extensions/i.test(line)) {
240
+ section = "extensions";
241
+ continue;
242
+ }
243
+ if (/技能|Skills/i.test(line)) {
244
+ section = "skills";
245
+ continue;
246
+ }
247
+ if (/MCP 伺服器|MCP Servers/i.test(line)) {
248
+ section = "mcpServers";
249
+ continue;
250
+ }
251
+ if (!section) {
252
+ continue;
253
+ }
254
+ if (section === "builtInTools" || section === "skills") {
255
+ summary[section].push(...extractBacktickNames(line));
256
+ continue;
257
+ }
258
+ summary[section].push(...extractBoldNames(line), ...extractBacktickNames(line));
259
+ }
260
+ return {
261
+ builtInTools: unique(summary.builtInTools),
262
+ extensions: unique(summary.extensions),
263
+ skills: unique(summary.skills),
264
+ mcpServers: unique(summary.mcpServers),
265
+ };
266
+ }
267
+ function preferCommandText(result) {
268
+ return result.stdout.trim() ? result.stdout : result.stderr;
269
+ }
270
+ export async function inspectGeminiCli(input = {}, runner = runGeminiCommand, options = {}) {
271
+ const timeoutMs = input.timeoutMs;
272
+ const buildCommandInput = (args) => ({
273
+ args,
274
+ ...(timeoutMs !== undefined ? { timeoutMs } : {}),
275
+ });
276
+ const results = await Promise.all([
277
+ runner(buildCommandInput(["--version"]), options),
278
+ runner(buildCommandInput(["--help"]), options),
279
+ runner(buildCommandInput(["extensions", "list"]), options),
280
+ runner(buildCommandInput(["skills", "list", "--all"]), options),
281
+ runner(buildCommandInput(["mcp", "list"]), options),
282
+ input.includeModelReportedTools !== false
283
+ ? runner(buildCommandInput([
284
+ "-p",
285
+ MODEL_PROBE_PROMPT,
286
+ "--output-format",
287
+ "json",
288
+ ]), options)
289
+ : Promise.resolve(undefined),
290
+ ]);
291
+ const [versionResult, helpResult, extensionsResult, skillsResult, mcpResult, modelProbeResult,] = results;
292
+ const notes = [];
293
+ if (!helpResult.ok) {
294
+ notes.push("Failed to read `gemini --help`; top-level commands may be incomplete.");
295
+ }
296
+ if (!extensionsResult.ok) {
297
+ notes.push("Failed to read `gemini extensions list`; extension details may be incomplete.");
298
+ }
299
+ if (!skillsResult.ok) {
300
+ notes.push("Failed to read `gemini skills list --all`; skill details may be incomplete.");
301
+ }
302
+ if (!mcpResult.ok) {
303
+ notes.push("Failed to read `gemini mcp list`; MCP server details may be incomplete.");
304
+ }
305
+ const modelReportedTools = modelProbeResult
306
+ ? parseModelProbe(preferCommandText(modelProbeResult))
307
+ : undefined;
308
+ const modelReportedSummary = parseModelReportedSummary(modelReportedTools);
309
+ if (input.includeModelReportedTools !== false && !modelReportedTools) {
310
+ notes.push("Model-reported tool summary was unavailable; command-based inspection is still returned.");
311
+ }
312
+ const helpText = preferCommandText(helpResult);
313
+ const extensionsText = preferCommandText(extensionsResult);
314
+ const skillsText = preferCommandText(skillsResult);
315
+ const mcpText = preferCommandText(mcpResult);
316
+ return {
317
+ version: versionResult.finalText,
318
+ commands: parseGeminiHelpCommands(helpText),
319
+ extensions: parseGeminiExtensions(extensionsText),
320
+ skills: parseGeminiSkills(skillsText),
321
+ mcpServers: parseGeminiMcpServers(mcpText),
322
+ notes,
323
+ raw: {
324
+ help: helpText,
325
+ extensions: extensionsText,
326
+ skills: skillsText,
327
+ mcpServers: mcpText,
328
+ ...(modelProbeResult
329
+ ? { modelReportedTools: preferCommandText(modelProbeResult) }
330
+ : {}),
331
+ },
332
+ ...(modelReportedTools ? { modelReportedTools } : {}),
333
+ ...(modelReportedSummary ? { modelReportedSummary } : {}),
334
+ };
335
+ }
336
+ //# sourceMappingURL=geminiInspector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geminiInspector.js","sourceRoot":"","sources":["../../src/cli/geminiInspector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { ExecutePromptInput, GeminiExecutionResult, GeminiRunnerOptions } from "../types.js";
2
+ export declare function runGeminiPrompt(input: ExecutePromptInput, options?: GeminiRunnerOptions): Promise<GeminiExecutionResult>;
@@ -0,0 +1,20 @@
1
+ import { buildGeminiArgs, DEFAULT_MODEL_FLAG, DEFAULT_PROMPT_FLAG, } from "./buildArgs.js";
2
+ import { runGeminiCommand } from "./geminiCommandRunner.js";
3
+ function getFlagOverrides(env) {
4
+ return {
5
+ promptFlag: env?.GEMINI_PROMPT_FLAG ?? DEFAULT_PROMPT_FLAG,
6
+ modelFlag: env?.GEMINI_MODEL_FLAG ?? DEFAULT_MODEL_FLAG,
7
+ };
8
+ }
9
+ export async function runGeminiPrompt(input, options = {}) {
10
+ const args = [
11
+ ...(options.baseArgs ?? []),
12
+ ...buildGeminiArgs(input, getFlagOverrides(options.env)),
13
+ ];
14
+ return await runGeminiCommand({
15
+ args,
16
+ ...(input.cwd ? { cwd: input.cwd } : {}),
17
+ ...(input.timeoutMs !== undefined ? { timeoutMs: input.timeoutMs } : {}),
18
+ }, options);
19
+ }
20
+ //# sourceMappingURL=geminiRunner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geminiRunner.js","sourceRoot":"","sources":["../../src/cli/geminiRunner.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAO5D,SAAS,gBAAgB,CAAC,GAAkC;IAC1D,OAAO;QACL,UAAU,EAAE,GAAG,EAAE,kBAAkB,IAAI,mBAAmB;QAC1D,SAAS,EAAE,GAAG,EAAE,iBAAiB,IAAI,kBAAkB;KACxD,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,KAAyB,EACzB,UAA+B,EAAE;IAEjC,MAAM,IAAI,GAAG;QACX,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;QAC3B,GAAG,eAAe,CAAC,KAAK,EAAE,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;KACzD,CAAC;IAEF,OAAO,MAAM,gBAAgB,CAC3B;QACE,IAAI;QACJ,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxC,GAAG,CAAC,KAAK,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACzE,EACD,OAAO,CACR,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ interface TaskPromptInput {
2
+ task: string;
3
+ context?: string | undefined;
4
+ expectedOutput?: string | undefined;
5
+ }
6
+ export declare function buildTaskPrompt(input: TaskPromptInput): string;
7
+ export {};
@@ -0,0 +1,31 @@
1
+ function formatOptionalSection(title, value) {
2
+ if (!value?.trim()) {
3
+ return "";
4
+ }
5
+ return `${title}:\n${value.trim()}\n\n`;
6
+ }
7
+ export function buildTaskPrompt(input) {
8
+ const expectedOutput = input.expectedOutput?.trim()
9
+ ? input.expectedOutput.trim()
10
+ : "直接提供可交付的最終答案。避免描述你將要做什麼,避免多餘前言,除非任務要求,否則不要解釋推理過程。";
11
+ return [
12
+ "你是另一個 AI 系統委派的任務執行代理。",
13
+ "你的工作是完成任務並只回傳對上游 AI 有用的最終結果。",
14
+ "規則:",
15
+ "1. 直接回答,不要寫像是『我將為您查詢』這類前言。",
16
+ "2. 若資訊具有時效性或不確定性,簡短說明限制或假設。",
17
+ "3. 預設使用繁體中文,除非任務明確要求其他語言。",
18
+ "4. 除非任務要求,不要描述你的工具使用過程。",
19
+ "",
20
+ "任務:",
21
+ input.task.trim(),
22
+ "",
23
+ formatOptionalSection("補充上下文", input.context),
24
+ "期望輸出:",
25
+ expectedOutput,
26
+ ]
27
+ .filter((part) => part !== "")
28
+ .join("\n")
29
+ .trim();
30
+ }
31
+ //# sourceMappingURL=taskPrompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"taskPrompt.js","sourceRoot":"","sources":["../../src/cli/taskPrompt.ts"],"names":[],"mappings":"AAMA,SAAS,qBAAqB,CAAC,KAAa,EAAE,KAAc;IAC1D,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC;QACnB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,GAAG,KAAK,MAAM,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAsB;IACpD,MAAM,cAAc,GAAG,KAAK,CAAC,cAAc,EAAE,IAAI,EAAE;QACjD,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,EAAE;QAC7B,CAAC,CAAC,mDAAmD,CAAC;IAExD,OAAO;QACL,uBAAuB;QACvB,8BAA8B;QAC9B,KAAK;QACL,4BAA4B;QAC5B,6BAA6B;QAC7B,2BAA2B;QAC3B,yBAAyB;QACzB,EAAE;QACF,KAAK;QACL,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE;QACjB,EAAE;QACF,qBAAqB,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC;QAC7C,OAAO;QACP,cAAc;KACf;SACE,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC;SAC7B,IAAI,CAAC,IAAI,CAAC;SACV,IAAI,EAAE,CAAC;AACZ,CAAC"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/build/index.js ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env node
2
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
3
+ import { createServer } from "./server.js";
4
+ async function main() {
5
+ const server = createServer();
6
+ const transport = new StdioServerTransport();
7
+ await server.connect(transport);
8
+ console.error("gemini-cli-mcp running on stdio");
9
+ }
10
+ main().catch((error) => {
11
+ console.error("Fatal error in gemini-cli-mcp:", error);
12
+ process.exit(1);
13
+ });
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;IAC9B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;AACnD,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC;IACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}