@mcp-z/mcp-gmail 1.1.1 → 1.1.3
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/README.md +9 -10
- package/dist/cjs/setup/http.js +27 -16
- package/dist/cjs/setup/http.js.map +1 -1
- package/dist/esm/setup/http.js +21 -10
- package/dist/esm/setup/http.js.map +1 -1
- package/package.json +2 -8
package/README.md
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
# @mcp-z/mcp-gmail
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
Gmail MCP server for searching, reading, and sending mail over MCP.
|
|
3
|
+
MCP server for Gmail integration with OAuth authentication, message search, batch operations, and Google Sheets export
|
|
5
4
|
|
|
6
5
|
## Common uses
|
|
7
6
|
|
|
@@ -104,8 +103,7 @@ Example (http) - Create .mcp.json:
|
|
|
104
103
|
}
|
|
105
104
|
```
|
|
106
105
|
|
|
107
|
-
Local (default): omit REDIRECT_URI → ephemeral loopback.
|
|
108
|
-
Cloud: set REDIRECT_URI to your public /oauth/callback and expose the service publicly.
|
|
106
|
+
Local (default): omit REDIRECT_URI → ephemeral loopback. Cloud: set REDIRECT_URI to your public /oauth/callback and expose the service publicly.
|
|
109
107
|
|
|
110
108
|
Note: start block is a helper in "npx @mcp-z/cli up" for starting an http server from your .mpc.json. See [@mcp-z/cli](https://github.com/mcp-z/cli) for details.
|
|
111
109
|
|
|
@@ -136,8 +134,7 @@ Example:
|
|
|
136
134
|
|
|
137
135
|
### DCR (self-hosted)
|
|
138
136
|
|
|
139
|
-
HTTP only. Requires a public base URL.
|
|
140
|
-
CSV export and `/files` are disabled in DCR mode; `resourceStoreUri` is ignored.
|
|
137
|
+
HTTP only. Requires a public base URL. CSV export and `/files` are disabled in DCR mode; `resourceStoreUri` is ignored.
|
|
141
138
|
|
|
142
139
|
```json
|
|
143
140
|
{
|
|
@@ -199,13 +196,11 @@ See `server.json` for all supported environment variables, CLI arguments, and de
|
|
|
199
196
|
|
|
200
197
|
## Storage backends
|
|
201
198
|
|
|
202
|
-
OAuth tokens (`TOKEN_STORE_URI`) and DCR registrations (`DCR_STORE_URI`) are stored through
|
|
203
|
-
[keyv-registry](https://www.npmjs.com/package/keyv-registry), which picks an adapter from the URI protocol.
|
|
199
|
+
OAuth tokens (`TOKEN_STORE_URI`) and DCR registrations (`DCR_STORE_URI`) are stored through [keyv-registry](https://www.npmjs.com/package/keyv-registry), which picks an adapter from the URI protocol.
|
|
204
200
|
|
|
205
201
|
`file://` (the default, under `~/.mcp-z/`) and `memory://` work with no extra setup.
|
|
206
202
|
|
|
207
|
-
Any other backend needs its adapter installed alongside this server. Adapters are resolved with
|
|
208
|
-
`require()`, so a globally installed server finds a globally installed adapter:
|
|
203
|
+
Any other backend needs its adapter installed alongside this server. Adapters are resolved with `require()`, so a globally installed server finds a globally installed adapter:
|
|
209
204
|
|
|
210
205
|
```bash
|
|
211
206
|
npm install -g @mcp-z/mcp-gmail @keyv/redis
|
|
@@ -214,3 +209,7 @@ TOKEN_STORE_URI=redis://localhost:6379 mcp-gmail
|
|
|
214
209
|
```
|
|
215
210
|
|
|
216
211
|
A protocol whose adapter is missing fails at startup naming the package to install.
|
|
212
|
+
|
|
213
|
+
### Documentation
|
|
214
|
+
|
|
215
|
+
[API Docs](https://mcp-z.github.io/mcp-gmail)
|
package/dist/cjs/setup/http.js
CHANGED
|
@@ -172,7 +172,7 @@ function _unsupported_iterable_to_array(o, minLen) {
|
|
|
172
172
|
}
|
|
173
173
|
function createHTTPServer(config, overrides) {
|
|
174
174
|
return _async_to_generator(function() {
|
|
175
|
-
var runtime, modules, layers, composed, logger, port, tools, filteredTools, prompts, mcpServer, app,
|
|
175
|
+
var runtime, modules, layers, composed, logger, port, tools, filteredTools, prompts, mcpServer, app, publicUrl, _ref, close, httpServer, fileRouter;
|
|
176
176
|
return _ts_generator(this, function(_state) {
|
|
177
177
|
switch(_state.label){
|
|
178
178
|
case 0:
|
|
@@ -204,12 +204,34 @@ function createHTTPServer(config, overrides) {
|
|
|
204
204
|
(0, _server.registerResources)(mcpServer, composed.resources);
|
|
205
205
|
(0, _server.registerPrompts)(mcpServer, prompts);
|
|
206
206
|
app = (0, _express.default)();
|
|
207
|
-
app.use((0, _cors.default)());
|
|
208
207
|
app.use(_express.default.json({
|
|
209
208
|
limit: '10mb'
|
|
210
209
|
}));
|
|
210
|
+
// Must mount '/mcp' before any permissive app-level cors(), or that layer answers its
|
|
211
|
+
// preflight first; pass baseUrl's origin/host below or a public deployment 403s itself.
|
|
212
|
+
publicUrl = config.baseUrl ? new URL(config.baseUrl) : undefined;
|
|
213
|
+
logger.info("Starting ".concat(config.name, " MCP server (http)"));
|
|
214
|
+
return [
|
|
215
|
+
4,
|
|
216
|
+
(0, _server.connectHttp)(mcpServer, {
|
|
217
|
+
logger: logger,
|
|
218
|
+
app: app,
|
|
219
|
+
port: port,
|
|
220
|
+
allowedOrigins: publicUrl ? [
|
|
221
|
+
publicUrl.origin
|
|
222
|
+
] : undefined,
|
|
223
|
+
allowedHosts: publicUrl ? [
|
|
224
|
+
publicUrl.host
|
|
225
|
+
] : undefined
|
|
226
|
+
})
|
|
227
|
+
];
|
|
228
|
+
case 2:
|
|
229
|
+
_ref = _state.sent(), close = _ref.close, httpServer = _ref.httpServer;
|
|
230
|
+
// The loopback OAuth callback, the file-export download, and the DCR discovery/
|
|
231
|
+
// registration endpoints are all meant to be reached from a browser on another
|
|
232
|
+
// origin. Keep cors() for them, scoped to their own routes - never in front of '/mcp'.
|
|
211
233
|
if (runtime.deps.oauthAdapters.loopbackRouter) {
|
|
212
|
-
app.use('/', runtime.deps.oauthAdapters.loopbackRouter);
|
|
234
|
+
app.use('/', (0, _cors.default)(), runtime.deps.oauthAdapters.loopbackRouter);
|
|
213
235
|
logger.info('Mounted loopback OAuth callback router');
|
|
214
236
|
}
|
|
215
237
|
if (config.auth !== 'dcr') {
|
|
@@ -219,23 +241,12 @@ function createHTTPServer(config, overrides) {
|
|
|
219
241
|
contentType: 'text/csv',
|
|
220
242
|
contentDisposition: 'attachment'
|
|
221
243
|
});
|
|
222
|
-
app.use('/files', fileRouter);
|
|
244
|
+
app.use('/files', (0, _cors.default)(), fileRouter);
|
|
223
245
|
}
|
|
224
246
|
if (runtime.deps.oauthAdapters.dcrRouter) {
|
|
225
|
-
app.use('/', runtime.deps.oauthAdapters.dcrRouter);
|
|
247
|
+
app.use('/', (0, _cors.default)(), runtime.deps.oauthAdapters.dcrRouter);
|
|
226
248
|
logger.info('Mounted DCR router with OAuth endpoints');
|
|
227
249
|
}
|
|
228
|
-
logger.info("Starting ".concat(config.name, " MCP server (http)"));
|
|
229
|
-
return [
|
|
230
|
-
4,
|
|
231
|
-
(0, _server.connectHttp)(mcpServer, {
|
|
232
|
-
logger: logger,
|
|
233
|
-
app: app,
|
|
234
|
-
port: port
|
|
235
|
-
})
|
|
236
|
-
];
|
|
237
|
-
case 2:
|
|
238
|
-
_ref = _state.sent(), close = _ref.close, httpServer = _ref.httpServer;
|
|
239
250
|
logger.info('http transport ready');
|
|
240
251
|
return [
|
|
241
252
|
2,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-gmail/src/setup/http.ts"],"sourcesContent":["import { composeMiddleware, connectHttp, createFileServingRouter, registerPrompts, registerResources, registerTools } from '@mcp-z/server';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport cors from 'cors';\nimport express from 'express';\nimport type { RuntimeOverrides, ServerConfig } from '../types.ts';\nimport { createDefaultRuntime } from './runtime.ts';\n\nexport async function createHTTPServer(config: ServerConfig, overrides?: RuntimeOverrides) {\n const runtime = await createDefaultRuntime(config, overrides);\n const modules = runtime.createDomainModules();\n const layers = runtime.middlewareFactories.map((factory) => factory(runtime.deps));\n const composed = composeMiddleware(modules, layers);\n const logger = runtime.deps.logger;\n const port = config.transport.port;\n if (!port) throw new Error('Port is required for HTTP transport');\n\n const tools = [...composed.tools, ...runtime.deps.oauthAdapters.accountTools];\n const filteredTools =\n config.auth === 'dcr'\n ? tools.filter((tool) => tool.name !== 'messages-export-csv') // No file storage in DCR (public cloud responsibility)\n : tools;\n const prompts = [...composed.prompts, ...runtime.deps.oauthAdapters.accountPrompts];\n\n const mcpServer = new McpServer({ name: config.name, version: config.version });\n registerTools(mcpServer, filteredTools);\n registerResources(mcpServer, composed.resources);\n registerPrompts(mcpServer, prompts);\n\n const app = express();\n app.use(
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-gmail/src/setup/http.ts"],"sourcesContent":["import { composeMiddleware, connectHttp, createFileServingRouter, registerPrompts, registerResources, registerTools } from '@mcp-z/server';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport cors from 'cors';\nimport express from 'express';\nimport type { RuntimeOverrides, ServerConfig } from '../types.ts';\nimport { createDefaultRuntime } from './runtime.ts';\n\nexport async function createHTTPServer(config: ServerConfig, overrides?: RuntimeOverrides) {\n const runtime = await createDefaultRuntime(config, overrides);\n const modules = runtime.createDomainModules();\n const layers = runtime.middlewareFactories.map((factory) => factory(runtime.deps));\n const composed = composeMiddleware(modules, layers);\n const logger = runtime.deps.logger;\n const port = config.transport.port;\n if (!port) throw new Error('Port is required for HTTP transport');\n\n const tools = [...composed.tools, ...runtime.deps.oauthAdapters.accountTools];\n const filteredTools =\n config.auth === 'dcr'\n ? tools.filter((tool) => tool.name !== 'messages-export-csv') // No file storage in DCR (public cloud responsibility)\n : tools;\n const prompts = [...composed.prompts, ...runtime.deps.oauthAdapters.accountPrompts];\n\n const mcpServer = new McpServer({ name: config.name, version: config.version });\n registerTools(mcpServer, filteredTools);\n registerResources(mcpServer, composed.resources);\n registerPrompts(mcpServer, prompts);\n\n const app = express();\n app.use(express.json({ limit: '10mb' }));\n\n // Must mount '/mcp' before any permissive app-level cors(), or that layer answers its\n // preflight first; pass baseUrl's origin/host below or a public deployment 403s itself.\n const publicUrl = config.baseUrl ? new URL(config.baseUrl) : undefined;\n logger.info(`Starting ${config.name} MCP server (http)`);\n const { close, httpServer } = await connectHttp(mcpServer, {\n logger,\n app,\n port,\n allowedOrigins: publicUrl ? [publicUrl.origin] : undefined,\n allowedHosts: publicUrl ? [publicUrl.host] : undefined,\n });\n\n // The loopback OAuth callback, the file-export download, and the DCR discovery/\n // registration endpoints are all meant to be reached from a browser on another\n // origin. Keep cors() for them, scoped to their own routes - never in front of '/mcp'.\n if (runtime.deps.oauthAdapters.loopbackRouter) {\n app.use('/', cors(), runtime.deps.oauthAdapters.loopbackRouter);\n logger.info('Mounted loopback OAuth callback router');\n }\n\n if (config.auth !== 'dcr') {\n const fileRouter = createFileServingRouter({ resourceStoreUri: config.resourceStoreUri }, { contentType: 'text/csv', contentDisposition: 'attachment' });\n app.use('/files', cors(), fileRouter);\n }\n\n if (runtime.deps.oauthAdapters.dcrRouter) {\n app.use('/', cors(), runtime.deps.oauthAdapters.dcrRouter);\n logger.info('Mounted DCR router with OAuth endpoints');\n }\n\n logger.info('http transport ready');\n\n return {\n httpServer,\n mcpServer,\n logger,\n close: async () => {\n await close();\n await runtime.close();\n },\n };\n}\n"],"names":["createHTTPServer","config","overrides","runtime","modules","layers","composed","logger","port","tools","filteredTools","prompts","mcpServer","app","publicUrl","close","httpServer","fileRouter","createDefaultRuntime","createDomainModules","middlewareFactories","map","factory","deps","composeMiddleware","transport","Error","oauthAdapters","accountTools","auth","filter","tool","name","accountPrompts","McpServer","version","registerTools","registerResources","resources","registerPrompts","express","use","json","limit","baseUrl","URL","undefined","info","connectHttp","allowedOrigins","origin","allowedHosts","host","loopbackRouter","cors","createFileServingRouter","resourceStoreUri","contentType","contentDisposition","dcrRouter"],"mappings":"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"}
|
package/dist/esm/setup/http.js
CHANGED
|
@@ -29,12 +29,29 @@ export async function createHTTPServer(config, overrides) {
|
|
|
29
29
|
registerResources(mcpServer, composed.resources);
|
|
30
30
|
registerPrompts(mcpServer, prompts);
|
|
31
31
|
const app = express();
|
|
32
|
-
app.use(cors());
|
|
33
32
|
app.use(express.json({
|
|
34
33
|
limit: '10mb'
|
|
35
34
|
}));
|
|
35
|
+
// Must mount '/mcp' before any permissive app-level cors(), or that layer answers its
|
|
36
|
+
// preflight first; pass baseUrl's origin/host below or a public deployment 403s itself.
|
|
37
|
+
const publicUrl = config.baseUrl ? new URL(config.baseUrl) : undefined;
|
|
38
|
+
logger.info(`Starting ${config.name} MCP server (http)`);
|
|
39
|
+
const { close, httpServer } = await connectHttp(mcpServer, {
|
|
40
|
+
logger,
|
|
41
|
+
app,
|
|
42
|
+
port,
|
|
43
|
+
allowedOrigins: publicUrl ? [
|
|
44
|
+
publicUrl.origin
|
|
45
|
+
] : undefined,
|
|
46
|
+
allowedHosts: publicUrl ? [
|
|
47
|
+
publicUrl.host
|
|
48
|
+
] : undefined
|
|
49
|
+
});
|
|
50
|
+
// The loopback OAuth callback, the file-export download, and the DCR discovery/
|
|
51
|
+
// registration endpoints are all meant to be reached from a browser on another
|
|
52
|
+
// origin. Keep cors() for them, scoped to their own routes - never in front of '/mcp'.
|
|
36
53
|
if (runtime.deps.oauthAdapters.loopbackRouter) {
|
|
37
|
-
app.use('/', runtime.deps.oauthAdapters.loopbackRouter);
|
|
54
|
+
app.use('/', cors(), runtime.deps.oauthAdapters.loopbackRouter);
|
|
38
55
|
logger.info('Mounted loopback OAuth callback router');
|
|
39
56
|
}
|
|
40
57
|
if (config.auth !== 'dcr') {
|
|
@@ -44,18 +61,12 @@ export async function createHTTPServer(config, overrides) {
|
|
|
44
61
|
contentType: 'text/csv',
|
|
45
62
|
contentDisposition: 'attachment'
|
|
46
63
|
});
|
|
47
|
-
app.use('/files', fileRouter);
|
|
64
|
+
app.use('/files', cors(), fileRouter);
|
|
48
65
|
}
|
|
49
66
|
if (runtime.deps.oauthAdapters.dcrRouter) {
|
|
50
|
-
app.use('/', runtime.deps.oauthAdapters.dcrRouter);
|
|
67
|
+
app.use('/', cors(), runtime.deps.oauthAdapters.dcrRouter);
|
|
51
68
|
logger.info('Mounted DCR router with OAuth endpoints');
|
|
52
69
|
}
|
|
53
|
-
logger.info(`Starting ${config.name} MCP server (http)`);
|
|
54
|
-
const { close, httpServer } = await connectHttp(mcpServer, {
|
|
55
|
-
logger,
|
|
56
|
-
app,
|
|
57
|
-
port
|
|
58
|
-
});
|
|
59
70
|
logger.info('http transport ready');
|
|
60
71
|
return {
|
|
61
72
|
httpServer,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-gmail/src/setup/http.ts"],"sourcesContent":["import { composeMiddleware, connectHttp, createFileServingRouter, registerPrompts, registerResources, registerTools } from '@mcp-z/server';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport cors from 'cors';\nimport express from 'express';\nimport type { RuntimeOverrides, ServerConfig } from '../types.ts';\nimport { createDefaultRuntime } from './runtime.ts';\n\nexport async function createHTTPServer(config: ServerConfig, overrides?: RuntimeOverrides) {\n const runtime = await createDefaultRuntime(config, overrides);\n const modules = runtime.createDomainModules();\n const layers = runtime.middlewareFactories.map((factory) => factory(runtime.deps));\n const composed = composeMiddleware(modules, layers);\n const logger = runtime.deps.logger;\n const port = config.transport.port;\n if (!port) throw new Error('Port is required for HTTP transport');\n\n const tools = [...composed.tools, ...runtime.deps.oauthAdapters.accountTools];\n const filteredTools =\n config.auth === 'dcr'\n ? tools.filter((tool) => tool.name !== 'messages-export-csv') // No file storage in DCR (public cloud responsibility)\n : tools;\n const prompts = [...composed.prompts, ...runtime.deps.oauthAdapters.accountPrompts];\n\n const mcpServer = new McpServer({ name: config.name, version: config.version });\n registerTools(mcpServer, filteredTools);\n registerResources(mcpServer, composed.resources);\n registerPrompts(mcpServer, prompts);\n\n const app = express();\n app.use(
|
|
1
|
+
{"version":3,"sources":["/Users/kevin/Dev/OpenSource/ai/mcp-z/mcp-gmail/src/setup/http.ts"],"sourcesContent":["import { composeMiddleware, connectHttp, createFileServingRouter, registerPrompts, registerResources, registerTools } from '@mcp-z/server';\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport cors from 'cors';\nimport express from 'express';\nimport type { RuntimeOverrides, ServerConfig } from '../types.ts';\nimport { createDefaultRuntime } from './runtime.ts';\n\nexport async function createHTTPServer(config: ServerConfig, overrides?: RuntimeOverrides) {\n const runtime = await createDefaultRuntime(config, overrides);\n const modules = runtime.createDomainModules();\n const layers = runtime.middlewareFactories.map((factory) => factory(runtime.deps));\n const composed = composeMiddleware(modules, layers);\n const logger = runtime.deps.logger;\n const port = config.transport.port;\n if (!port) throw new Error('Port is required for HTTP transport');\n\n const tools = [...composed.tools, ...runtime.deps.oauthAdapters.accountTools];\n const filteredTools =\n config.auth === 'dcr'\n ? tools.filter((tool) => tool.name !== 'messages-export-csv') // No file storage in DCR (public cloud responsibility)\n : tools;\n const prompts = [...composed.prompts, ...runtime.deps.oauthAdapters.accountPrompts];\n\n const mcpServer = new McpServer({ name: config.name, version: config.version });\n registerTools(mcpServer, filteredTools);\n registerResources(mcpServer, composed.resources);\n registerPrompts(mcpServer, prompts);\n\n const app = express();\n app.use(express.json({ limit: '10mb' }));\n\n // Must mount '/mcp' before any permissive app-level cors(), or that layer answers its\n // preflight first; pass baseUrl's origin/host below or a public deployment 403s itself.\n const publicUrl = config.baseUrl ? new URL(config.baseUrl) : undefined;\n logger.info(`Starting ${config.name} MCP server (http)`);\n const { close, httpServer } = await connectHttp(mcpServer, {\n logger,\n app,\n port,\n allowedOrigins: publicUrl ? [publicUrl.origin] : undefined,\n allowedHosts: publicUrl ? [publicUrl.host] : undefined,\n });\n\n // The loopback OAuth callback, the file-export download, and the DCR discovery/\n // registration endpoints are all meant to be reached from a browser on another\n // origin. Keep cors() for them, scoped to their own routes - never in front of '/mcp'.\n if (runtime.deps.oauthAdapters.loopbackRouter) {\n app.use('/', cors(), runtime.deps.oauthAdapters.loopbackRouter);\n logger.info('Mounted loopback OAuth callback router');\n }\n\n if (config.auth !== 'dcr') {\n const fileRouter = createFileServingRouter({ resourceStoreUri: config.resourceStoreUri }, { contentType: 'text/csv', contentDisposition: 'attachment' });\n app.use('/files', cors(), fileRouter);\n }\n\n if (runtime.deps.oauthAdapters.dcrRouter) {\n app.use('/', cors(), runtime.deps.oauthAdapters.dcrRouter);\n logger.info('Mounted DCR router with OAuth endpoints');\n }\n\n logger.info('http transport ready');\n\n return {\n httpServer,\n mcpServer,\n logger,\n close: async () => {\n await close();\n await runtime.close();\n },\n };\n}\n"],"names":["composeMiddleware","connectHttp","createFileServingRouter","registerPrompts","registerResources","registerTools","McpServer","cors","express","createDefaultRuntime","createHTTPServer","config","overrides","runtime","modules","createDomainModules","layers","middlewareFactories","map","factory","deps","composed","logger","port","transport","Error","tools","oauthAdapters","accountTools","filteredTools","auth","filter","tool","name","prompts","accountPrompts","mcpServer","version","resources","app","use","json","limit","publicUrl","baseUrl","URL","undefined","info","close","httpServer","allowedOrigins","origin","allowedHosts","host","loopbackRouter","fileRouter","resourceStoreUri","contentType","contentDisposition","dcrRouter"],"mappings":"AAAA,SAASA,iBAAiB,EAAEC,WAAW,EAAEC,uBAAuB,EAAEC,eAAe,EAAEC,iBAAiB,EAAEC,aAAa,QAAQ,gBAAgB;AAC3I,SAASC,SAAS,QAAQ,0CAA0C;AACpE,OAAOC,UAAU,OAAO;AACxB,OAAOC,aAAa,UAAU;AAE9B,SAASC,oBAAoB,QAAQ,eAAe;AAEpD,OAAO,eAAeC,iBAAiBC,MAAoB,EAAEC,SAA4B;IACvF,MAAMC,UAAU,MAAMJ,qBAAqBE,QAAQC;IACnD,MAAME,UAAUD,QAAQE,mBAAmB;IAC3C,MAAMC,SAASH,QAAQI,mBAAmB,CAACC,GAAG,CAAC,CAACC,UAAYA,QAAQN,QAAQO,IAAI;IAChF,MAAMC,WAAWrB,kBAAkBc,SAASE;IAC5C,MAAMM,SAAST,QAAQO,IAAI,CAACE,MAAM;IAClC,MAAMC,OAAOZ,OAAOa,SAAS,CAACD,IAAI;IAClC,IAAI,CAACA,MAAM,MAAM,IAAIE,MAAM;IAE3B,MAAMC,QAAQ;WAAIL,SAASK,KAAK;WAAKb,QAAQO,IAAI,CAACO,aAAa,CAACC,YAAY;KAAC;IAC7E,MAAMC,gBACJlB,OAAOmB,IAAI,KAAK,QACZJ,MAAMK,MAAM,CAAC,CAACC,OAASA,KAAKC,IAAI,KAAK,uBAAuB,uDAAuD;OACnHP;IACN,MAAMQ,UAAU;WAAIb,SAASa,OAAO;WAAKrB,QAAQO,IAAI,CAACO,aAAa,CAACQ,cAAc;KAAC;IAEnF,MAAMC,YAAY,IAAI9B,UAAU;QAAE2B,MAAMtB,OAAOsB,IAAI;QAAEI,SAAS1B,OAAO0B,OAAO;IAAC;IAC7EhC,cAAc+B,WAAWP;IACzBzB,kBAAkBgC,WAAWf,SAASiB,SAAS;IAC/CnC,gBAAgBiC,WAAWF;IAE3B,MAAMK,MAAM/B;IACZ+B,IAAIC,GAAG,CAAChC,QAAQiC,IAAI,CAAC;QAAEC,OAAO;IAAO;IAErC,sFAAsF;IACtF,wFAAwF;IACxF,MAAMC,YAAYhC,OAAOiC,OAAO,GAAG,IAAIC,IAAIlC,OAAOiC,OAAO,IAAIE;IAC7DxB,OAAOyB,IAAI,CAAC,CAAC,SAAS,EAAEpC,OAAOsB,IAAI,CAAC,kBAAkB,CAAC;IACvD,MAAM,EAAEe,KAAK,EAAEC,UAAU,EAAE,GAAG,MAAMhD,YAAYmC,WAAW;QACzDd;QACAiB;QACAhB;QACA2B,gBAAgBP,YAAY;YAACA,UAAUQ,MAAM;SAAC,GAAGL;QACjDM,cAAcT,YAAY;YAACA,UAAUU,IAAI;SAAC,GAAGP;IAC/C;IAEA,gFAAgF;IAChF,+EAA+E;IAC/E,uFAAuF;IACvF,IAAIjC,QAAQO,IAAI,CAACO,aAAa,CAAC2B,cAAc,EAAE;QAC7Cf,IAAIC,GAAG,CAAC,KAAKjC,QAAQM,QAAQO,IAAI,CAACO,aAAa,CAAC2B,cAAc;QAC9DhC,OAAOyB,IAAI,CAAC;IACd;IAEA,IAAIpC,OAAOmB,IAAI,KAAK,OAAO;QACzB,MAAMyB,aAAarD,wBAAwB;YAAEsD,kBAAkB7C,OAAO6C,gBAAgB;QAAC,GAAG;YAAEC,aAAa;YAAYC,oBAAoB;QAAa;QACtJnB,IAAIC,GAAG,CAAC,UAAUjC,QAAQgD;IAC5B;IAEA,IAAI1C,QAAQO,IAAI,CAACO,aAAa,CAACgC,SAAS,EAAE;QACxCpB,IAAIC,GAAG,CAAC,KAAKjC,QAAQM,QAAQO,IAAI,CAACO,aAAa,CAACgC,SAAS;QACzDrC,OAAOyB,IAAI,CAAC;IACd;IAEAzB,OAAOyB,IAAI,CAAC;IAEZ,OAAO;QACLE;QACAb;QACAd;QACA0B,OAAO;YACL,MAAMA;YACN,MAAMnC,QAAQmC,KAAK;QACrB;IACF;AACF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mcp-z/mcp-gmail",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.3",
|
|
4
4
|
"description": "MCP server for Gmail integration with OAuth authentication, message search, batch operations, and Google Sheets export",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"gmail",
|
|
@@ -70,7 +70,7 @@
|
|
|
70
70
|
"@mcp-z/email": "^1.0.0",
|
|
71
71
|
"@mcp-z/oauth": "^1.0.5",
|
|
72
72
|
"@mcp-z/oauth-google": "^1.1.3",
|
|
73
|
-
"@mcp-z/server": "^1.
|
|
73
|
+
"@mcp-z/server": "^1.2.0",
|
|
74
74
|
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
75
75
|
"cors": "^2.0.0",
|
|
76
76
|
"csv-stringify": "^6.0.0",
|
|
@@ -100,12 +100,6 @@
|
|
|
100
100
|
"engines": {
|
|
101
101
|
"node": ">=20"
|
|
102
102
|
},
|
|
103
|
-
"allowScripts": {
|
|
104
|
-
"node-filename-to-dist-paths": true,
|
|
105
|
-
"node-semvers": true,
|
|
106
|
-
"node-version-use": true,
|
|
107
|
-
"thread-sleep-compat": true
|
|
108
|
-
},
|
|
109
103
|
"mcpName": "io.github.mcp-z/mcp-gmail",
|
|
110
104
|
"tsds": {
|
|
111
105
|
"source": "src/index.ts"
|