@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.
Files changed (49) hide show
  1. package/.env.example +10 -0
  2. package/LICENSE +21 -0
  3. package/README.md +442 -0
  4. package/claude_desktop_config_example.json +12 -0
  5. package/dist/cli.d.ts +3 -0
  6. package/dist/cli.d.ts.map +1 -0
  7. package/dist/cli.js +22 -0
  8. package/dist/cli.js.map +1 -0
  9. package/dist/config/index.d.ts +4 -0
  10. package/dist/config/index.d.ts.map +1 -0
  11. package/dist/config/index.js +81 -0
  12. package/dist/config/index.js.map +1 -0
  13. package/dist/config/types.d.ts +24 -0
  14. package/dist/config/types.d.ts.map +1 -0
  15. package/dist/config/types.js +3 -0
  16. package/dist/config/types.js.map +1 -0
  17. package/dist/index.d.ts +12 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +154 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/services/base-service.d.ts +8 -0
  22. package/dist/services/base-service.d.ts.map +1 -0
  23. package/dist/services/base-service.js +30 -0
  24. package/dist/services/base-service.js.map +1 -0
  25. package/dist/services/gemini/index.d.ts +15 -0
  26. package/dist/services/gemini/index.d.ts.map +1 -0
  27. package/dist/services/gemini/index.js +182 -0
  28. package/dist/services/gemini/index.js.map +1 -0
  29. package/dist/services/gemini/types.d.ts +29 -0
  30. package/dist/services/gemini/types.d.ts.map +1 -0
  31. package/dist/services/gemini/types.js +3 -0
  32. package/dist/services/gemini/types.js.map +1 -0
  33. package/dist/tools/gemini-chat.d.ts +9 -0
  34. package/dist/tools/gemini-chat.d.ts.map +1 -0
  35. package/dist/tools/gemini-chat.js +82 -0
  36. package/dist/tools/gemini-chat.js.map +1 -0
  37. package/dist/tools/gemini-list-models.d.ts +9 -0
  38. package/dist/tools/gemini-list-models.d.ts.map +1 -0
  39. package/dist/tools/gemini-list-models.js +42 -0
  40. package/dist/tools/gemini-list-models.js.map +1 -0
  41. package/dist/utils/error-handler.d.ts +17 -0
  42. package/dist/utils/error-handler.d.ts.map +1 -0
  43. package/dist/utils/error-handler.js +61 -0
  44. package/dist/utils/error-handler.js.map +1 -0
  45. package/dist/utils/logger.d.ts +4 -0
  46. package/dist/utils/logger.d.ts.map +1 -0
  47. package/dist/utils/logger.js +59 -0
  48. package/dist/utils/logger.js.map +1 -0
  49. 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,4 @@
1
+ import * as winston from 'winston';
2
+ declare const logger: winston.Logger;
3
+ export default logger;
4
+ //# sourceMappingURL=logger.d.ts.map
@@ -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
+ }