@houtini/gemini-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.
- package/.env.example +10 -0
- package/LICENSE +21 -0
- package/README.md +442 -0
- package/claude_desktop_config_example.json +12 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +22 -0
- package/dist/cli.js.map +1 -0
- package/dist/config/index.d.ts +4 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +81 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/types.d.ts +24 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +3 -0
- package/dist/config/types.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +154 -0
- package/dist/index.js.map +1 -0
- package/dist/services/base-service.d.ts +8 -0
- package/dist/services/base-service.d.ts.map +1 -0
- package/dist/services/base-service.js +30 -0
- package/dist/services/base-service.js.map +1 -0
- package/dist/services/gemini/index.d.ts +15 -0
- package/dist/services/gemini/index.d.ts.map +1 -0
- package/dist/services/gemini/index.js +182 -0
- package/dist/services/gemini/index.js.map +1 -0
- package/dist/services/gemini/types.d.ts +29 -0
- package/dist/services/gemini/types.d.ts.map +1 -0
- package/dist/services/gemini/types.js +3 -0
- package/dist/services/gemini/types.js.map +1 -0
- package/dist/tools/gemini-chat.d.ts +9 -0
- package/dist/tools/gemini-chat.d.ts.map +1 -0
- package/dist/tools/gemini-chat.js +82 -0
- package/dist/tools/gemini-chat.js.map +1 -0
- package/dist/tools/gemini-list-models.d.ts +9 -0
- package/dist/tools/gemini-list-models.d.ts.map +1 -0
- package/dist/tools/gemini-list-models.js +42 -0
- package/dist/tools/gemini-list-models.js.map +1 -0
- package/dist/utils/error-handler.d.ts +17 -0
- package/dist/utils/error-handler.d.ts.map +1 -0
- package/dist/utils/error-handler.js +61 -0
- package/dist/utils/error-handler.js.map +1 -0
- package/dist/utils/logger.d.ts +4 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +59 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +94 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-handler.d.ts","sourceRoot":"","sources":["../../src/utils/error-handler.ts"],"names":[],"mappings":"AAEA,qBAAa,QAAS,SAAQ,KAAK;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;gBAEd,OAAO,EAAE,MAAM,EAAE,IAAI,SAAkB,EAAE,UAAU,SAAM;CAOtE;AAED,qBAAa,WAAY,SAAQ,QAAQ;gBAC3B,OAAO,EAAE,MAAM,EAAE,IAAI,SAAiB;CAInD;AAED,qBAAa,kBAAmB,SAAQ,QAAQ;gBAClC,OAAO,EAAE,MAAM;CAI5B;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,QAAQ,CAsBpE;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK;;;IAOhF"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ConfigurationError = exports.GeminiError = exports.McpError = void 0;
|
|
7
|
+
exports.handleError = handleError;
|
|
8
|
+
exports.createToolResult = createToolResult;
|
|
9
|
+
const logger_1 = __importDefault(require("./logger"));
|
|
10
|
+
class McpError extends Error {
|
|
11
|
+
code;
|
|
12
|
+
statusCode;
|
|
13
|
+
constructor(message, code = 'UNKNOWN_ERROR', statusCode = 500) {
|
|
14
|
+
super(message);
|
|
15
|
+
this.name = 'McpError';
|
|
16
|
+
this.code = code;
|
|
17
|
+
this.statusCode = statusCode;
|
|
18
|
+
Error.captureStackTrace(this, this.constructor);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
exports.McpError = McpError;
|
|
22
|
+
class GeminiError extends McpError {
|
|
23
|
+
constructor(message, code = 'GEMINI_ERROR') {
|
|
24
|
+
super(message, code, 500);
|
|
25
|
+
this.name = 'GeminiError';
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
exports.GeminiError = GeminiError;
|
|
29
|
+
class ConfigurationError extends McpError {
|
|
30
|
+
constructor(message) {
|
|
31
|
+
super(message, 'CONFIGURATION_ERROR', 500);
|
|
32
|
+
this.name = 'ConfigurationError';
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
exports.ConfigurationError = ConfigurationError;
|
|
36
|
+
function handleError(error, context) {
|
|
37
|
+
const contextMessage = context ? `[${context}] ` : '';
|
|
38
|
+
const fullMessage = `${contextMessage}${error.message}`;
|
|
39
|
+
logger_1.default.error(fullMessage, {
|
|
40
|
+
error: error.stack,
|
|
41
|
+
context
|
|
42
|
+
});
|
|
43
|
+
if (error instanceof McpError) {
|
|
44
|
+
return error;
|
|
45
|
+
}
|
|
46
|
+
if (error.message.includes('API key')) {
|
|
47
|
+
return new ConfigurationError(fullMessage);
|
|
48
|
+
}
|
|
49
|
+
if (error.message.includes('Gemini') || error.message.includes('generative')) {
|
|
50
|
+
return new GeminiError(fullMessage);
|
|
51
|
+
}
|
|
52
|
+
return new McpError(fullMessage);
|
|
53
|
+
}
|
|
54
|
+
function createToolResult(success, content, error) {
|
|
55
|
+
if (success) {
|
|
56
|
+
return [{ type: 'text', text: content }];
|
|
57
|
+
}
|
|
58
|
+
const errorMessage = error ? handleError(error).message : content;
|
|
59
|
+
return [{ type: 'text', text: `Error: ${errorMessage}` }];
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=error-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../../src/utils/error-handler.ts"],"names":[],"mappings":";;;;;;AA6BA,kCAsBC;AAED,4CAOC;AA5DD,sDAA8B;AAE9B,MAAa,QAAS,SAAQ,KAAK;IAC1B,IAAI,CAAS;IACb,UAAU,CAAS;IAE1B,YAAY,OAAe,EAAE,IAAI,GAAG,eAAe,EAAE,UAAU,GAAG,GAAG;QACnE,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAClD,CAAC;CACF;AAXD,4BAWC;AAED,MAAa,WAAY,SAAQ,QAAQ;IACvC,YAAY,OAAe,EAAE,IAAI,GAAG,cAAc;QAChD,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC5B,CAAC;CACF;AALD,kCAKC;AAED,MAAa,kBAAmB,SAAQ,QAAQ;IAC9C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,EAAE,qBAAqB,EAAE,GAAG,CAAC,CAAC;QAC3C,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AALD,gDAKC;AAED,SAAgB,WAAW,CAAC,KAAY,EAAE,OAAgB;IACxD,MAAM,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IACtD,MAAM,WAAW,GAAG,GAAG,cAAc,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;IAExD,gBAAM,CAAC,KAAK,CAAC,WAAW,EAAE;QACxB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,OAAO;KACR,CAAC,CAAC;IAEH,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACtC,OAAO,IAAI,kBAAkB,CAAC,WAAW,CAAC,CAAC;IAC7C,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7E,OAAO,IAAI,WAAW,CAAC,WAAW,CAAC,CAAC;IACtC,CAAC;IAED,OAAO,IAAI,QAAQ,CAAC,WAAW,CAAC,CAAC;AACnC,CAAC;AAED,SAAgB,gBAAgB,CAAC,OAAgB,EAAE,OAAe,EAAE,KAAa;IAC/E,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;IAClE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,YAAY,EAAE,EAAE,CAAC,CAAC;AACrE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AAkBnC,QAAA,MAAM,MAAM,gBAWV,CAAC;AAEH,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
const winston = __importStar(require("winston"));
|
|
37
|
+
const config_1 = require("../config");
|
|
38
|
+
const transports = [
|
|
39
|
+
new winston.transports.File({
|
|
40
|
+
filename: 'logs/error.log',
|
|
41
|
+
level: 'error'
|
|
42
|
+
}),
|
|
43
|
+
new winston.transports.File({
|
|
44
|
+
filename: 'logs/combined.log'
|
|
45
|
+
})
|
|
46
|
+
];
|
|
47
|
+
// Only add console logging if not running as MCP server (stdout must be clean)
|
|
48
|
+
if (process.env.NODE_ENV === 'development' || process.env.DEBUG_MCP === 'true') {
|
|
49
|
+
transports.push(new winston.transports.Console());
|
|
50
|
+
}
|
|
51
|
+
const logger = winston.createLogger({
|
|
52
|
+
level: config_1.config.logging.level,
|
|
53
|
+
format: winston.format.combine(winston.format.timestamp(), winston.format.errors({ stack: true }), winston.format.colorize(), winston.format.printf(({ timestamp, level, message, stack }) => {
|
|
54
|
+
return `${timestamp} [${level}]: ${message}${stack ? '\n' + stack : ''}`;
|
|
55
|
+
})),
|
|
56
|
+
transports
|
|
57
|
+
});
|
|
58
|
+
exports.default = logger;
|
|
59
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iDAAmC;AACnC,sCAAmC;AAEnC,MAAM,UAAU,GAAwB;IACtC,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;QAC1B,QAAQ,EAAE,gBAAgB;QAC1B,KAAK,EAAE,OAAO;KACf,CAAC;IACF,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;QAC1B,QAAQ,EAAE,mBAAmB;KAC9B,CAAC;CACH,CAAC;AAEF,+EAA+E;AAC/E,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,KAAK,MAAM,EAAE,CAAC;IAC/E,UAAU,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAClC,KAAK,EAAE,eAAM,CAAC,OAAO,CAAC,KAAK;IAC3B,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAC5B,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,EAC1B,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EACtC,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,EACzB,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE;QAC7D,OAAO,GAAG,SAAS,KAAK,KAAK,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IAC3E,CAAC,CAAC,CACH;IACD,UAAU;CACX,CAAC,CAAC;AAEH,kBAAe,MAAM,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@houtini/gemini-mcp",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Professional Model Context Protocol server for Google Gemini AI models with enterprise-grade features",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"bin": {
|
|
8
|
+
"gemini-mcp": "dist/cli.js"
|
|
9
|
+
},
|
|
10
|
+
"exports": {
|
|
11
|
+
".": {
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"require": "./dist/index.js",
|
|
14
|
+
"import": "./dist/index.js"
|
|
15
|
+
},
|
|
16
|
+
"./package.json": "./package.json"
|
|
17
|
+
},
|
|
18
|
+
"scripts": {
|
|
19
|
+
"build": "tsc",
|
|
20
|
+
"dev": "tsx src/index.ts",
|
|
21
|
+
"start": "node dist/index.js",
|
|
22
|
+
"test": "jest",
|
|
23
|
+
"test:watch": "jest --watch",
|
|
24
|
+
"test:coverage": "jest --coverage",
|
|
25
|
+
"lint": "eslint src/**/*.ts",
|
|
26
|
+
"lint:fix": "eslint src/**/*.ts --fix",
|
|
27
|
+
"prepublishOnly": "npm run build",
|
|
28
|
+
"prepack": "npm run build",
|
|
29
|
+
"clean": "rm -rf dist",
|
|
30
|
+
"type-check": "tsc --noEmit"
|
|
31
|
+
},
|
|
32
|
+
"keywords": [
|
|
33
|
+
"mcp",
|
|
34
|
+
"model-context-protocol",
|
|
35
|
+
"gemini",
|
|
36
|
+
"google",
|
|
37
|
+
"ai",
|
|
38
|
+
"llm",
|
|
39
|
+
"chatbot",
|
|
40
|
+
"typescript",
|
|
41
|
+
"nodejs",
|
|
42
|
+
"claude",
|
|
43
|
+
"anthropic",
|
|
44
|
+
"generative-ai",
|
|
45
|
+
"machine-learning",
|
|
46
|
+
"artificial-intelligence"
|
|
47
|
+
],
|
|
48
|
+
"author": "Houtini",
|
|
49
|
+
"license": "MIT",
|
|
50
|
+
"homepage": "https://github.com/houtini-ai/gemini-mcp#readme",
|
|
51
|
+
"repository": {
|
|
52
|
+
"type": "git",
|
|
53
|
+
"url": "git+https://github.com/houtini-ai/gemini-mcp.git"
|
|
54
|
+
},
|
|
55
|
+
"bugs": {
|
|
56
|
+
"url": "https://github.com/houtini-ai/gemini-mcp/issues"
|
|
57
|
+
},
|
|
58
|
+
"dependencies": {
|
|
59
|
+
"@google/generative-ai": "^0.21.0",
|
|
60
|
+
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
61
|
+
"dotenv": "^16.4.5",
|
|
62
|
+
"winston": "^3.14.0"
|
|
63
|
+
},
|
|
64
|
+
"devDependencies": {
|
|
65
|
+
"@types/node": "^22.0.0",
|
|
66
|
+
"@typescript-eslint/eslint-plugin": "^8.0.0",
|
|
67
|
+
"@typescript-eslint/parser": "^8.0.0",
|
|
68
|
+
"eslint": "^8.57.0",
|
|
69
|
+
"jest": "^29.7.0",
|
|
70
|
+
"@types/jest": "^29.5.0",
|
|
71
|
+
"ts-jest": "^29.1.0",
|
|
72
|
+
"tsx": "^4.16.0",
|
|
73
|
+
"typescript": "^5.5.0"
|
|
74
|
+
},
|
|
75
|
+
"engines": {
|
|
76
|
+
"node": ">=18.0.0",
|
|
77
|
+
"npm": ">=8.0.0"
|
|
78
|
+
},
|
|
79
|
+
"files": [
|
|
80
|
+
"dist/**/*",
|
|
81
|
+
"README.md",
|
|
82
|
+
"LICENSE",
|
|
83
|
+
".env.example",
|
|
84
|
+
"claude_desktop_config_example.json"
|
|
85
|
+
],
|
|
86
|
+
"publishConfig": {
|
|
87
|
+
"access": "public",
|
|
88
|
+
"registry": "https://registry.npmjs.org/"
|
|
89
|
+
},
|
|
90
|
+
"funding": {
|
|
91
|
+
"type": "github",
|
|
92
|
+
"url": "https://github.com/sponsors/houtini-ai"
|
|
93
|
+
}
|
|
94
|
+
}
|