@node2flow/gmail-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,184 @@
1
+ /**
2
+ * Gmail API v1 Types
3
+ */
4
+ export interface Message {
5
+ id: string;
6
+ threadId: string;
7
+ labelIds?: string[];
8
+ snippet?: string;
9
+ historyId?: string;
10
+ internalDate?: string;
11
+ payload?: MessagePart;
12
+ sizeEstimate?: number;
13
+ raw?: string;
14
+ }
15
+ export interface MessagePart {
16
+ partId?: string;
17
+ mimeType?: string;
18
+ filename?: string;
19
+ headers?: MessagePartHeader[];
20
+ body?: MessagePartBody;
21
+ parts?: MessagePart[];
22
+ }
23
+ export interface MessagePartHeader {
24
+ name: string;
25
+ value: string;
26
+ }
27
+ export interface MessagePartBody {
28
+ attachmentId?: string;
29
+ size?: number;
30
+ data?: string;
31
+ }
32
+ export interface MessageList {
33
+ messages?: MessageRef[];
34
+ nextPageToken?: string;
35
+ resultSizeEstimate?: number;
36
+ }
37
+ export interface MessageRef {
38
+ id: string;
39
+ threadId: string;
40
+ }
41
+ export interface Thread {
42
+ id: string;
43
+ historyId?: string;
44
+ messages?: Message[];
45
+ snippet?: string;
46
+ }
47
+ export interface ThreadList {
48
+ threads?: ThreadRef[];
49
+ nextPageToken?: string;
50
+ resultSizeEstimate?: number;
51
+ }
52
+ export interface ThreadRef {
53
+ id: string;
54
+ historyId?: string;
55
+ snippet?: string;
56
+ }
57
+ export interface Label {
58
+ id: string;
59
+ name: string;
60
+ messageListVisibility?: 'show' | 'hide';
61
+ labelListVisibility?: 'labelShow' | 'labelShowIfUnread' | 'labelHide';
62
+ type?: 'system' | 'user';
63
+ messagesTotal?: number;
64
+ messagesUnread?: number;
65
+ threadsTotal?: number;
66
+ threadsUnread?: number;
67
+ color?: LabelColor;
68
+ }
69
+ export interface LabelColor {
70
+ textColor?: string;
71
+ backgroundColor?: string;
72
+ }
73
+ export interface LabelList {
74
+ labels: Label[];
75
+ }
76
+ export interface Draft {
77
+ id: string;
78
+ message?: Message;
79
+ }
80
+ export interface DraftList {
81
+ drafts?: DraftRef[];
82
+ nextPageToken?: string;
83
+ resultSizeEstimate?: number;
84
+ }
85
+ export interface DraftRef {
86
+ id: string;
87
+ message?: MessageRef;
88
+ }
89
+ export interface Profile {
90
+ emailAddress: string;
91
+ messagesTotal: number;
92
+ threadsTotal: number;
93
+ historyId: string;
94
+ }
95
+ export interface VacationSettings {
96
+ enableAutoReply: boolean;
97
+ responseSubject?: string;
98
+ responseBodyPlainText?: string;
99
+ responseBodyHtml?: string;
100
+ restrictToContacts?: boolean;
101
+ restrictToDomain?: boolean;
102
+ startTime?: string;
103
+ endTime?: string;
104
+ }
105
+ export interface HistoryList {
106
+ history?: HistoryRecord[];
107
+ nextPageToken?: string;
108
+ historyId: string;
109
+ }
110
+ export interface HistoryRecord {
111
+ id: string;
112
+ messages?: Message[];
113
+ messagesAdded?: MessageAdded[];
114
+ messagesDeleted?: MessageDeleted[];
115
+ labelsAdded?: LabelModification[];
116
+ labelsRemoved?: LabelModification[];
117
+ }
118
+ export interface MessageAdded {
119
+ message: Message;
120
+ }
121
+ export interface MessageDeleted {
122
+ message: Message;
123
+ }
124
+ export interface LabelModification {
125
+ message: Message;
126
+ labelIds: string[];
127
+ }
128
+ export interface Filter {
129
+ id: string;
130
+ criteria?: FilterCriteria;
131
+ action?: FilterAction;
132
+ }
133
+ export interface FilterCriteria {
134
+ from?: string;
135
+ to?: string;
136
+ subject?: string;
137
+ query?: string;
138
+ negatedQuery?: string;
139
+ hasAttachment?: boolean;
140
+ excludeChats?: boolean;
141
+ size?: number;
142
+ sizeComparison?: 'larger' | 'smaller';
143
+ }
144
+ export interface FilterAction {
145
+ addLabelIds?: string[];
146
+ removeLabelIds?: string[];
147
+ forward?: string;
148
+ }
149
+ export interface FilterList {
150
+ filter: Filter[];
151
+ }
152
+ export interface Attachment {
153
+ size: number;
154
+ data: string;
155
+ }
156
+ export interface ModifyRequest {
157
+ addLabelIds?: string[];
158
+ removeLabelIds?: string[];
159
+ }
160
+ export interface BatchDeleteRequest {
161
+ ids: string[];
162
+ }
163
+ export interface BatchModifyRequest {
164
+ ids: string[];
165
+ addLabelIds?: string[];
166
+ removeLabelIds?: string[];
167
+ }
168
+ export interface MCPToolDefinition {
169
+ name: string;
170
+ description: string;
171
+ inputSchema: {
172
+ type: 'object';
173
+ properties: Record<string, unknown>;
174
+ required?: string[];
175
+ };
176
+ annotations?: {
177
+ title?: string;
178
+ readOnlyHint?: boolean;
179
+ destructiveHint?: boolean;
180
+ idempotentHint?: boolean;
181
+ openWorldHint?: boolean;
182
+ };
183
+ }
184
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Gmail API v1 Types
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Cloudflare Worker entry — Stateless Streamable HTTP MCP
3
+ */
4
+ declare const _default: {
5
+ fetch(request: Request): Promise<Response>;
6
+ };
7
+ export default _default;
8
+ //# sourceMappingURL=worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"AAAA;;GAEG;;mBA+BoB,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC;;AADlD,wBAuDE"}
package/dist/worker.js ADDED
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Cloudflare Worker entry — Stateless Streamable HTTP MCP
3
+ */
4
+ import { WebStandardStreamableHTTPServerTransport, } from '@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js';
5
+ import { createServer } from './server.js';
6
+ import { TOOLS } from './tools.js';
7
+ function corsHeaders() {
8
+ return {
9
+ 'Access-Control-Allow-Origin': '*',
10
+ 'Access-Control-Allow-Methods': 'GET, POST, DELETE, OPTIONS',
11
+ 'Access-Control-Allow-Headers': 'Content-Type, mcp-session-id, Accept, mcp-protocol-version',
12
+ 'Access-Control-Expose-Headers': 'mcp-session-id',
13
+ };
14
+ }
15
+ function addCors(response) {
16
+ const headers = new Headers(response.headers);
17
+ for (const [key, value] of Object.entries(corsHeaders())) {
18
+ headers.set(key, value);
19
+ }
20
+ return new Response(response.body, {
21
+ status: response.status,
22
+ statusText: response.statusText,
23
+ headers,
24
+ });
25
+ }
26
+ export default {
27
+ async fetch(request) {
28
+ const url = new URL(request.url);
29
+ if (request.method === 'OPTIONS') {
30
+ return new Response(null, { status: 204, headers: corsHeaders() });
31
+ }
32
+ if (url.pathname === '/' && request.method === 'GET') {
33
+ return addCors(Response.json({
34
+ name: 'gmail-mcp',
35
+ version: '1.0.0',
36
+ status: 'ok',
37
+ tools: TOOLS.length,
38
+ transport: 'streamable-http',
39
+ endpoints: { mcp: '/mcp' },
40
+ }));
41
+ }
42
+ if (url.pathname !== '/mcp') {
43
+ return addCors(new Response('Not Found', { status: 404 }));
44
+ }
45
+ if (request.method !== 'POST') {
46
+ return addCors(Response.json({ jsonrpc: '2.0', error: { code: -32000, message: 'Method not allowed. Use POST.' }, id: null }, { status: 405 }));
47
+ }
48
+ const clientId = url.searchParams.get('GOOGLE_CLIENT_ID') || '';
49
+ const clientSecret = url.searchParams.get('GOOGLE_CLIENT_SECRET') || '';
50
+ const refreshToken = url.searchParams.get('GOOGLE_REFRESH_TOKEN') || '';
51
+ const config = clientId && clientSecret && refreshToken
52
+ ? { clientId, clientSecret, refreshToken }
53
+ : undefined;
54
+ try {
55
+ const transport = new WebStandardStreamableHTTPServerTransport({
56
+ sessionIdGenerator: undefined,
57
+ enableJsonResponse: true,
58
+ });
59
+ const server = createServer(config);
60
+ await server.connect(transport);
61
+ const response = await transport.handleRequest(request);
62
+ return addCors(response);
63
+ }
64
+ catch (error) {
65
+ return addCors(Response.json({ jsonrpc: '2.0', error: { code: -32603, message: error.message || 'Internal server error' }, id: null }, { status: 500 }));
66
+ }
67
+ },
68
+ };
69
+ //# sourceMappingURL=worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ services:
2
+ gmail-mcp-community:
3
+ build: .
4
+ container_name: gmail-mcp-community
5
+ restart: unless-stopped
6
+ ports:
7
+ - "127.0.0.1:3034:3000"
8
+ mem_limit: 512m
9
+ mem_reservation: 256m
package/package.json ADDED
@@ -0,0 +1,51 @@
1
+ {
2
+ "name": "@node2flow/gmail-mcp",
3
+ "version": "1.0.0",
4
+ "description": "MCP server for Gmail — send, search, read, organize emails and manage labels through 28 tools",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "bin": {
9
+ "gmail-mcp": "dist/index.js"
10
+ },
11
+ "scripts": {
12
+ "build": "tsc",
13
+ "start": "node dist/index.js",
14
+ "dev": "tsx src/index.ts",
15
+ "deploy": "wrangler deploy",
16
+ "prepublishOnly": "npm run build"
17
+ },
18
+ "keywords": [
19
+ "gmail",
20
+ "google",
21
+ "email",
22
+ "mail",
23
+ "mcp",
24
+ "model-context-protocol",
25
+ "ai",
26
+ "claude",
27
+ "cursor"
28
+ ],
29
+ "author": "Node2Flow <node2flow@gmail.com>",
30
+ "license": "MIT",
31
+ "homepage": "https://github.com/node2flow-th/gmail-mcp-community",
32
+ "repository": {
33
+ "type": "git",
34
+ "url": "git+https://github.com/node2flow-th/gmail-mcp-community.git"
35
+ },
36
+ "bugs": {
37
+ "url": "https://github.com/node2flow-th/gmail-mcp-community/issues"
38
+ },
39
+ "engines": {
40
+ "node": ">=18"
41
+ },
42
+ "dependencies": {
43
+ "@modelcontextprotocol/sdk": "^1.26.0"
44
+ },
45
+ "devDependencies": {
46
+ "@types/node": "^22.0.0",
47
+ "tsx": "^4.19.0",
48
+ "typescript": "^5.7.0",
49
+ "wrangler": "^4.0.0"
50
+ }
51
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "type": "object",
3
+ "properties": {
4
+ "GOOGLE_CLIENT_ID": {
5
+ "type": "string",
6
+ "description": "OAuth 2.0 Client ID from Google Cloud Console"
7
+ },
8
+ "GOOGLE_CLIENT_SECRET": {
9
+ "type": "string",
10
+ "description": "OAuth 2.0 Client Secret"
11
+ },
12
+ "GOOGLE_REFRESH_TOKEN": {
13
+ "type": "string",
14
+ "description": "Refresh token with Gmail scope (from OAuth consent flow or OAuth Playground)"
15
+ }
16
+ },
17
+ "required": ["GOOGLE_CLIENT_ID", "GOOGLE_CLIENT_SECRET", "GOOGLE_REFRESH_TOKEN"]
18
+ }