@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.
- package/Dockerfile +10 -0
- package/LICENSE +21 -0
- package/README.md +166 -0
- package/dist/gmail-client.d.ts +161 -0
- package/dist/gmail-client.d.ts.map +1 -0
- package/dist/gmail-client.js +365 -0
- package/dist/gmail-client.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +167 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +13 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +307 -0
- package/dist/server.js.map +1 -0
- package/dist/tools.d.ts +6 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +468 -0
- package/dist/tools.js.map +1 -0
- package/dist/types.d.ts +184 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/worker.d.ts +8 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +69 -0
- package/dist/worker.js.map +1 -0
- package/docker-compose.yml +9 -0
- package/package.json +51 -0
- package/smithery-config.json +18 -0
- package/src/gmail-client.ts +507 -0
- package/src/index.ts +184 -0
- package/src/server.ts +353 -0
- package/src/tools.ts +474 -0
- package/src/types.ts +238 -0
- package/src/worker.ts +88 -0
- package/tsconfig.json +18 -0
- package/wrangler.toml +14 -0
package/Dockerfile
ADDED
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Node2Flow
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
# @node2flow/gmail-mcp
|
|
2
|
+
|
|
3
|
+
[](https://smithery.ai/server/node2flow/gmail)
|
|
4
|
+
[](https://www.npmjs.com/package/@node2flow/gmail-mcp)
|
|
5
|
+
[](https://opensource.org/licenses/MIT)
|
|
6
|
+
|
|
7
|
+
MCP server for **Gmail** — send, search, read, organize emails and manage labels through 28 tools via the Model Context Protocol.
|
|
8
|
+
|
|
9
|
+
## Quick Start
|
|
10
|
+
|
|
11
|
+
### Claude Desktop / Cursor
|
|
12
|
+
|
|
13
|
+
Add to your MCP config:
|
|
14
|
+
|
|
15
|
+
```json
|
|
16
|
+
{
|
|
17
|
+
"mcpServers": {
|
|
18
|
+
"gmail": {
|
|
19
|
+
"command": "npx",
|
|
20
|
+
"args": ["-y", "@node2flow/gmail-mcp"],
|
|
21
|
+
"env": {
|
|
22
|
+
"GOOGLE_CLIENT_ID": "your-client-id",
|
|
23
|
+
"GOOGLE_CLIENT_SECRET": "your-client-secret",
|
|
24
|
+
"GOOGLE_REFRESH_TOKEN": "your-refresh-token"
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### HTTP Mode
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
GOOGLE_CLIENT_ID=xxx GOOGLE_CLIENT_SECRET=xxx GOOGLE_REFRESH_TOKEN=xxx npx @node2flow/gmail-mcp --http
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
MCP endpoint: `http://localhost:3000/mcp`
|
|
38
|
+
|
|
39
|
+
### Cloudflare Worker
|
|
40
|
+
|
|
41
|
+
Available at: `https://gmail-mcp-community.node2flow.net/mcp`
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
POST https://gmail-mcp-community.node2flow.net/mcp?GOOGLE_CLIENT_ID=xxx&GOOGLE_CLIENT_SECRET=xxx&GOOGLE_REFRESH_TOKEN=xxx
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## Tools (28)
|
|
50
|
+
|
|
51
|
+
### Messages (10)
|
|
52
|
+
|
|
53
|
+
| Tool | Description |
|
|
54
|
+
|------|-------------|
|
|
55
|
+
| `gmail_list_messages` | List messages with Gmail search syntax |
|
|
56
|
+
| `gmail_get_message` | Get message content (full/metadata/minimal/raw) |
|
|
57
|
+
| `gmail_send_message` | Send email with to, cc, bcc, subject, body, HTML |
|
|
58
|
+
| `gmail_delete_message` | Permanently delete a message |
|
|
59
|
+
| `gmail_trash_message` | Move message to trash |
|
|
60
|
+
| `gmail_untrash_message` | Remove message from trash |
|
|
61
|
+
| `gmail_modify_message` | Add/remove labels on a message |
|
|
62
|
+
| `gmail_batch_delete` | Delete multiple messages (up to 1000) |
|
|
63
|
+
| `gmail_batch_modify` | Modify labels on multiple messages |
|
|
64
|
+
| `gmail_get_attachment` | Get attachment data (base64) |
|
|
65
|
+
|
|
66
|
+
### Drafts (6)
|
|
67
|
+
|
|
68
|
+
| Tool | Description |
|
|
69
|
+
|------|-------------|
|
|
70
|
+
| `gmail_list_drafts` | List all drafts |
|
|
71
|
+
| `gmail_get_draft` | Get draft content |
|
|
72
|
+
| `gmail_create_draft` | Create a new draft |
|
|
73
|
+
| `gmail_update_draft` | Update an existing draft |
|
|
74
|
+
| `gmail_delete_draft` | Delete a draft |
|
|
75
|
+
| `gmail_send_draft` | Send an existing draft |
|
|
76
|
+
|
|
77
|
+
### Labels (5)
|
|
78
|
+
|
|
79
|
+
| Tool | Description |
|
|
80
|
+
|------|-------------|
|
|
81
|
+
| `gmail_list_labels` | List all labels (system + user) |
|
|
82
|
+
| `gmail_get_label` | Get label details with counts |
|
|
83
|
+
| `gmail_create_label` | Create a new label with color |
|
|
84
|
+
| `gmail_update_label` | Update label name/visibility/color |
|
|
85
|
+
| `gmail_delete_label` | Delete a user-created label |
|
|
86
|
+
|
|
87
|
+
### Threads (5)
|
|
88
|
+
|
|
89
|
+
| Tool | Description |
|
|
90
|
+
|------|-------------|
|
|
91
|
+
| `gmail_list_threads` | List threads with search query |
|
|
92
|
+
| `gmail_get_thread` | Get all messages in a thread |
|
|
93
|
+
| `gmail_modify_thread` | Add/remove labels on a thread |
|
|
94
|
+
| `gmail_trash_thread` | Move thread to trash |
|
|
95
|
+
| `gmail_untrash_thread` | Remove thread from trash |
|
|
96
|
+
|
|
97
|
+
### Settings (2)
|
|
98
|
+
|
|
99
|
+
| Tool | Description |
|
|
100
|
+
|------|-------------|
|
|
101
|
+
| `gmail_get_profile` | Get email address, message/thread counts |
|
|
102
|
+
| `gmail_update_vacation` | Enable/disable vacation auto-reply |
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## Search Query Syntax
|
|
107
|
+
|
|
108
|
+
The `q` parameter in `gmail_list_messages` and `gmail_list_threads` supports Gmail search operators:
|
|
109
|
+
|
|
110
|
+
```
|
|
111
|
+
from:user@example.com — Messages from a sender
|
|
112
|
+
to:user@example.com — Messages to a recipient
|
|
113
|
+
subject:"meeting notes" — Subject contains text
|
|
114
|
+
has:attachment — Has attachments
|
|
115
|
+
filename:pdf — Attachment by type
|
|
116
|
+
is:unread / is:starred — Message state
|
|
117
|
+
label:custom-label — By label
|
|
118
|
+
after:2026/01/01 — After date
|
|
119
|
+
newer_than:2d / older_than:1y — Relative date
|
|
120
|
+
in:inbox / in:sent / in:trash — By location
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Combine operators: `from:boss@company.com has:attachment is:unread after:2026/01/01`
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## Configuration
|
|
128
|
+
|
|
129
|
+
| Parameter | Required | Description |
|
|
130
|
+
|-----------|----------|-------------|
|
|
131
|
+
| `GOOGLE_CLIENT_ID` | Yes | OAuth 2.0 Client ID from Google Cloud Console |
|
|
132
|
+
| `GOOGLE_CLIENT_SECRET` | Yes | OAuth 2.0 Client Secret |
|
|
133
|
+
| `GOOGLE_REFRESH_TOKEN` | Yes | Refresh token (obtained via OAuth consent flow) |
|
|
134
|
+
|
|
135
|
+
### Getting Your Credentials
|
|
136
|
+
|
|
137
|
+
1. Go to [Google Cloud Console](https://console.cloud.google.com/)
|
|
138
|
+
2. Create a project → Enable **Gmail API**
|
|
139
|
+
3. Create **OAuth 2.0 Client ID** (Desktop app type)
|
|
140
|
+
4. Use the [OAuth Playground](https://developers.google.com/oauthplayground/) or your app to get a refresh token with the Gmail scope
|
|
141
|
+
|
|
142
|
+
### OAuth Scopes
|
|
143
|
+
|
|
144
|
+
| Scope | Access |
|
|
145
|
+
|-------|--------|
|
|
146
|
+
| `gmail.modify` | Read, send, delete, and manage (recommended) |
|
|
147
|
+
| `gmail.readonly` | Read-only access |
|
|
148
|
+
| `gmail.send` | Send only |
|
|
149
|
+
| `gmail.compose` | Create and send drafts |
|
|
150
|
+
| `gmail.labels` | Manage labels only |
|
|
151
|
+
| `mail.google.com` | Full access including permanent delete |
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
## License
|
|
156
|
+
|
|
157
|
+
MIT License - see [LICENSE](LICENSE)
|
|
158
|
+
|
|
159
|
+
Copyright (c) 2026 [Node2Flow](https://node2flow.net)
|
|
160
|
+
|
|
161
|
+
## Links
|
|
162
|
+
|
|
163
|
+
- [npm Package](https://www.npmjs.com/package/@node2flow/gmail-mcp)
|
|
164
|
+
- [Gmail API](https://developers.google.com/gmail/api)
|
|
165
|
+
- [MCP Protocol](https://modelcontextprotocol.io/)
|
|
166
|
+
- [Node2Flow](https://node2flow.net)
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gmail API v1 Client — OAuth 2.0 refresh token pattern
|
|
3
|
+
*/
|
|
4
|
+
import type { Message, MessageList, Thread, ThreadList, Label, LabelList, Draft, DraftList, Profile, VacationSettings, Attachment } from './types.js';
|
|
5
|
+
export interface GmailClientConfig {
|
|
6
|
+
clientId: string;
|
|
7
|
+
clientSecret: string;
|
|
8
|
+
refreshToken: string;
|
|
9
|
+
}
|
|
10
|
+
export declare class GmailClient {
|
|
11
|
+
private config;
|
|
12
|
+
private accessToken;
|
|
13
|
+
private tokenExpiry;
|
|
14
|
+
private static readonly BASE;
|
|
15
|
+
private static readonly TOKEN_URL;
|
|
16
|
+
constructor(config: GmailClientConfig);
|
|
17
|
+
private getAccessToken;
|
|
18
|
+
private request;
|
|
19
|
+
private buildRawMessage;
|
|
20
|
+
private base64Encode;
|
|
21
|
+
private base64UrlEncode;
|
|
22
|
+
listMessages(opts: {
|
|
23
|
+
q?: string;
|
|
24
|
+
labelIds?: string[];
|
|
25
|
+
maxResults?: number;
|
|
26
|
+
pageToken?: string;
|
|
27
|
+
includeSpamTrash?: boolean;
|
|
28
|
+
}): Promise<MessageList>;
|
|
29
|
+
getMessage(opts: {
|
|
30
|
+
id: string;
|
|
31
|
+
format?: string;
|
|
32
|
+
metadataHeaders?: string[];
|
|
33
|
+
}): Promise<Message>;
|
|
34
|
+
sendMessage(opts: {
|
|
35
|
+
to: string;
|
|
36
|
+
subject: string;
|
|
37
|
+
body: string;
|
|
38
|
+
cc?: string;
|
|
39
|
+
bcc?: string;
|
|
40
|
+
html?: string;
|
|
41
|
+
in_reply_to?: string;
|
|
42
|
+
references?: string;
|
|
43
|
+
thread_id?: string;
|
|
44
|
+
}): Promise<Message>;
|
|
45
|
+
deleteMessage(opts: {
|
|
46
|
+
id: string;
|
|
47
|
+
}): Promise<void>;
|
|
48
|
+
trashMessage(opts: {
|
|
49
|
+
id: string;
|
|
50
|
+
}): Promise<Message>;
|
|
51
|
+
untrashMessage(opts: {
|
|
52
|
+
id: string;
|
|
53
|
+
}): Promise<Message>;
|
|
54
|
+
modifyMessage(opts: {
|
|
55
|
+
id: string;
|
|
56
|
+
addLabelIds?: string[];
|
|
57
|
+
removeLabelIds?: string[];
|
|
58
|
+
}): Promise<Message>;
|
|
59
|
+
batchDeleteMessages(opts: {
|
|
60
|
+
ids: string[];
|
|
61
|
+
}): Promise<void>;
|
|
62
|
+
batchModifyMessages(opts: {
|
|
63
|
+
ids: string[];
|
|
64
|
+
addLabelIds?: string[];
|
|
65
|
+
removeLabelIds?: string[];
|
|
66
|
+
}): Promise<void>;
|
|
67
|
+
getAttachment(opts: {
|
|
68
|
+
messageId: string;
|
|
69
|
+
attachmentId: string;
|
|
70
|
+
}): Promise<Attachment>;
|
|
71
|
+
listDrafts(opts: {
|
|
72
|
+
maxResults?: number;
|
|
73
|
+
pageToken?: string;
|
|
74
|
+
q?: string;
|
|
75
|
+
}): Promise<DraftList>;
|
|
76
|
+
getDraft(opts: {
|
|
77
|
+
id: string;
|
|
78
|
+
format?: string;
|
|
79
|
+
}): Promise<Draft>;
|
|
80
|
+
createDraft(opts: {
|
|
81
|
+
to: string;
|
|
82
|
+
subject: string;
|
|
83
|
+
body: string;
|
|
84
|
+
cc?: string;
|
|
85
|
+
bcc?: string;
|
|
86
|
+
html?: string;
|
|
87
|
+
thread_id?: string;
|
|
88
|
+
}): Promise<Draft>;
|
|
89
|
+
updateDraft(opts: {
|
|
90
|
+
id: string;
|
|
91
|
+
to: string;
|
|
92
|
+
subject: string;
|
|
93
|
+
body: string;
|
|
94
|
+
cc?: string;
|
|
95
|
+
bcc?: string;
|
|
96
|
+
html?: string;
|
|
97
|
+
thread_id?: string;
|
|
98
|
+
}): Promise<Draft>;
|
|
99
|
+
deleteDraft(opts: {
|
|
100
|
+
id: string;
|
|
101
|
+
}): Promise<void>;
|
|
102
|
+
sendDraft(opts: {
|
|
103
|
+
id: string;
|
|
104
|
+
}): Promise<Message>;
|
|
105
|
+
listLabels(): Promise<LabelList>;
|
|
106
|
+
getLabel(opts: {
|
|
107
|
+
id: string;
|
|
108
|
+
}): Promise<Label>;
|
|
109
|
+
createLabel(opts: {
|
|
110
|
+
name: string;
|
|
111
|
+
messageListVisibility?: string;
|
|
112
|
+
labelListVisibility?: string;
|
|
113
|
+
backgroundColor?: string;
|
|
114
|
+
textColor?: string;
|
|
115
|
+
}): Promise<Label>;
|
|
116
|
+
updateLabel(opts: {
|
|
117
|
+
id: string;
|
|
118
|
+
name?: string;
|
|
119
|
+
messageListVisibility?: string;
|
|
120
|
+
labelListVisibility?: string;
|
|
121
|
+
backgroundColor?: string;
|
|
122
|
+
textColor?: string;
|
|
123
|
+
}): Promise<Label>;
|
|
124
|
+
deleteLabel(opts: {
|
|
125
|
+
id: string;
|
|
126
|
+
}): Promise<void>;
|
|
127
|
+
listThreads(opts: {
|
|
128
|
+
q?: string;
|
|
129
|
+
labelIds?: string[];
|
|
130
|
+
maxResults?: number;
|
|
131
|
+
pageToken?: string;
|
|
132
|
+
includeSpamTrash?: boolean;
|
|
133
|
+
}): Promise<ThreadList>;
|
|
134
|
+
getThread(opts: {
|
|
135
|
+
id: string;
|
|
136
|
+
format?: string;
|
|
137
|
+
}): Promise<Thread>;
|
|
138
|
+
modifyThread(opts: {
|
|
139
|
+
id: string;
|
|
140
|
+
addLabelIds?: string[];
|
|
141
|
+
removeLabelIds?: string[];
|
|
142
|
+
}): Promise<Thread>;
|
|
143
|
+
trashThread(opts: {
|
|
144
|
+
id: string;
|
|
145
|
+
}): Promise<Thread>;
|
|
146
|
+
untrashThread(opts: {
|
|
147
|
+
id: string;
|
|
148
|
+
}): Promise<Thread>;
|
|
149
|
+
getProfile(): Promise<Profile>;
|
|
150
|
+
updateVacation(opts: {
|
|
151
|
+
enableAutoReply: boolean;
|
|
152
|
+
responseSubject?: string;
|
|
153
|
+
responseBodyPlainText?: string;
|
|
154
|
+
responseBodyHtml?: string;
|
|
155
|
+
restrictToContacts?: boolean;
|
|
156
|
+
restrictToDomain?: boolean;
|
|
157
|
+
startTime?: string;
|
|
158
|
+
endTime?: string;
|
|
159
|
+
}): Promise<VacationSettings>;
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=gmail-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gmail-client.d.ts","sourceRoot":"","sources":["../src/gmail-client.ts"],"names":[],"mappings":"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"}
|