@sena-ai/tools-slack 0.0.9 → 0.0.11
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/dist/mcp-server.d.ts +1 -0
- package/dist/mcp-server.js +99 -204
- package/dist/mcp-server.js.map +1 -1
- package/package.json +9 -7
package/dist/mcp-server.d.ts
CHANGED
package/dist/mcp-server.js
CHANGED
|
@@ -1,216 +1,111 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
3
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
1
4
|
import { WebClient } from '@slack/web-api';
|
|
2
|
-
import {
|
|
5
|
+
import { z } from 'zod';
|
|
3
6
|
const SLACK_BOT_TOKEN = process.env.SLACK_BOT_TOKEN;
|
|
4
7
|
if (!SLACK_BOT_TOKEN) {
|
|
5
8
|
console.error('SLACK_BOT_TOKEN is required');
|
|
6
9
|
process.exit(1);
|
|
7
10
|
}
|
|
8
11
|
const slack = new WebClient(SLACK_BOT_TOKEN);
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
{
|
|
25
|
-
name: 'slack_post_message',
|
|
26
|
-
description: 'Post a message to a Slack channel or thread',
|
|
27
|
-
inputSchema: {
|
|
28
|
-
type: 'object',
|
|
29
|
-
properties: {
|
|
30
|
-
channelId: { type: 'string', description: 'Channel ID' },
|
|
31
|
-
text: { type: 'string', description: 'Message text' },
|
|
32
|
-
threadTs: { type: 'string', description: 'Thread timestamp (optional, for replying in thread)' },
|
|
33
|
-
},
|
|
34
|
-
required: ['channelId', 'text'],
|
|
35
|
-
},
|
|
36
|
-
},
|
|
37
|
-
{
|
|
38
|
-
name: 'slack_list_channels',
|
|
39
|
-
description: 'List accessible Slack channels',
|
|
40
|
-
inputSchema: {
|
|
41
|
-
type: 'object',
|
|
42
|
-
properties: {
|
|
43
|
-
limit: { type: 'number', description: 'Max channels to return (default 100)' },
|
|
44
|
-
types: { type: 'string', description: 'Channel types (default "public_channel,private_channel")' },
|
|
45
|
-
},
|
|
46
|
-
},
|
|
47
|
-
},
|
|
48
|
-
{
|
|
49
|
-
name: 'slack_upload_file',
|
|
50
|
-
description: 'Upload content as a file to a Slack channel',
|
|
51
|
-
inputSchema: {
|
|
52
|
-
type: 'object',
|
|
53
|
-
properties: {
|
|
54
|
-
channelId: { type: 'string', description: 'Channel ID' },
|
|
55
|
-
content: { type: 'string', description: 'File content' },
|
|
56
|
-
filename: { type: 'string', description: 'Filename' },
|
|
57
|
-
title: { type: 'string', description: 'File title (optional)' },
|
|
58
|
-
},
|
|
59
|
-
required: ['channelId', 'content', 'filename'],
|
|
60
|
-
},
|
|
61
|
-
},
|
|
62
|
-
{
|
|
63
|
-
name: 'slack_download_file',
|
|
64
|
-
description: 'Download a file from Slack by file ID',
|
|
65
|
-
inputSchema: {
|
|
66
|
-
type: 'object',
|
|
67
|
-
properties: {
|
|
68
|
-
fileId: { type: 'string', description: 'Slack file ID' },
|
|
69
|
-
},
|
|
70
|
-
required: ['fileId'],
|
|
71
|
-
},
|
|
72
|
-
},
|
|
73
|
-
];
|
|
74
|
-
// === Tool implementations ===
|
|
75
|
-
async function executeTool(name, args) {
|
|
76
|
-
switch (name) {
|
|
77
|
-
case 'slack_get_messages': {
|
|
78
|
-
const { channelId, threadTs, limit = 20 } = args;
|
|
79
|
-
const params = { channel: channelId, limit };
|
|
80
|
-
let result;
|
|
81
|
-
if (threadTs) {
|
|
82
|
-
params.ts = threadTs;
|
|
83
|
-
result = await slack.conversations.replies(params);
|
|
84
|
-
}
|
|
85
|
-
else {
|
|
86
|
-
result = await slack.conversations.history(params);
|
|
87
|
-
}
|
|
88
|
-
const messages = (result.messages ?? []).map((m) => ({
|
|
89
|
-
user: m.user,
|
|
90
|
-
text: m.text,
|
|
91
|
-
ts: m.ts,
|
|
92
|
-
thread_ts: m.thread_ts,
|
|
93
|
-
}));
|
|
94
|
-
return JSON.stringify(messages, null, 2);
|
|
95
|
-
}
|
|
96
|
-
case 'slack_post_message': {
|
|
97
|
-
const { channelId, text, threadTs } = args;
|
|
98
|
-
const params = { channel: channelId, text };
|
|
99
|
-
if (threadTs)
|
|
100
|
-
params.thread_ts = threadTs;
|
|
101
|
-
const result = await slack.chat.postMessage(params);
|
|
102
|
-
return JSON.stringify({ ok: result.ok, ts: result.ts });
|
|
103
|
-
}
|
|
104
|
-
case 'slack_list_channels': {
|
|
105
|
-
const { limit = 100, types = 'public_channel,private_channel' } = args;
|
|
106
|
-
const result = await slack.conversations.list({ limit, types });
|
|
107
|
-
const channels = (result.channels ?? []).map((c) => ({
|
|
108
|
-
id: c.id,
|
|
109
|
-
name: c.name,
|
|
110
|
-
is_private: c.is_private,
|
|
111
|
-
num_members: c.num_members,
|
|
112
|
-
}));
|
|
113
|
-
return JSON.stringify(channels, null, 2);
|
|
114
|
-
}
|
|
115
|
-
case 'slack_upload_file': {
|
|
116
|
-
const { channelId, content, filename, title } = args;
|
|
117
|
-
const result = await slack.filesUploadV2({
|
|
118
|
-
channel_id: channelId,
|
|
119
|
-
content,
|
|
120
|
-
filename,
|
|
121
|
-
title: title ?? filename,
|
|
122
|
-
});
|
|
123
|
-
return JSON.stringify({ ok: true, file_id: result.file?.id });
|
|
124
|
-
}
|
|
125
|
-
case 'slack_download_file': {
|
|
126
|
-
const { fileId } = args;
|
|
127
|
-
const info = await slack.files.info({ file: fileId });
|
|
128
|
-
const file = info.file;
|
|
129
|
-
if (!file?.url_private) {
|
|
130
|
-
return JSON.stringify({ error: 'File URL not available' });
|
|
131
|
-
}
|
|
132
|
-
// Fetch the file content using the bot token
|
|
133
|
-
const response = await fetch(file.url_private, {
|
|
134
|
-
headers: { Authorization: `Bearer ${SLACK_BOT_TOKEN}` },
|
|
135
|
-
});
|
|
136
|
-
const text = await response.text();
|
|
137
|
-
return JSON.stringify({
|
|
138
|
-
name: file.name,
|
|
139
|
-
mimetype: file.mimetype,
|
|
140
|
-
size: file.size,
|
|
141
|
-
content: text.length > 50000 ? text.slice(0, 50000) + '\n...(truncated)' : text,
|
|
142
|
-
});
|
|
143
|
-
}
|
|
144
|
-
default:
|
|
145
|
-
throw new Error(`Unknown tool: ${name}`);
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
// === JSON-RPC server ===
|
|
149
|
-
function send(msg) {
|
|
150
|
-
process.stdout.write(JSON.stringify(msg) + '\n');
|
|
151
|
-
}
|
|
152
|
-
function handleRequest(id, method, params) {
|
|
153
|
-
switch (method) {
|
|
154
|
-
case 'initialize':
|
|
155
|
-
send({
|
|
156
|
-
jsonrpc: '2.0',
|
|
157
|
-
id,
|
|
158
|
-
result: {
|
|
159
|
-
protocolVersion: '2024-11-05',
|
|
160
|
-
capabilities: { tools: {} },
|
|
161
|
-
serverInfo: { name: 'sena-slack-mcp', version: '0.0.1' },
|
|
162
|
-
},
|
|
163
|
-
});
|
|
164
|
-
break;
|
|
165
|
-
case 'tools/list':
|
|
166
|
-
send({
|
|
167
|
-
jsonrpc: '2.0',
|
|
168
|
-
id,
|
|
169
|
-
result: { tools },
|
|
170
|
-
});
|
|
171
|
-
break;
|
|
172
|
-
case 'tools/call':
|
|
173
|
-
executeTool(params.name, params.arguments ?? {})
|
|
174
|
-
.then((text) => {
|
|
175
|
-
send({
|
|
176
|
-
jsonrpc: '2.0',
|
|
177
|
-
id,
|
|
178
|
-
result: { content: [{ type: 'text', text }] },
|
|
179
|
-
});
|
|
180
|
-
})
|
|
181
|
-
.catch((err) => {
|
|
182
|
-
send({
|
|
183
|
-
jsonrpc: '2.0',
|
|
184
|
-
id,
|
|
185
|
-
result: {
|
|
186
|
-
content: [{ type: 'text', text: `Error: ${err.message}` }],
|
|
187
|
-
isError: true,
|
|
188
|
-
},
|
|
189
|
-
});
|
|
190
|
-
});
|
|
191
|
-
break;
|
|
192
|
-
default:
|
|
193
|
-
send({
|
|
194
|
-
jsonrpc: '2.0',
|
|
195
|
-
id,
|
|
196
|
-
error: { code: -32601, message: `Method not found: ${method}` },
|
|
197
|
-
});
|
|
12
|
+
const server = new McpServer({
|
|
13
|
+
name: 'sena-slack-mcp',
|
|
14
|
+
version: '0.0.11',
|
|
15
|
+
});
|
|
16
|
+
// === Tools ===
|
|
17
|
+
server.tool('slack_get_messages', 'Get messages from a Slack channel or thread', {
|
|
18
|
+
channelId: z.string().describe('Channel ID'),
|
|
19
|
+
threadTs: z.string().optional().describe('Thread timestamp (optional)'),
|
|
20
|
+
limit: z.number().optional().default(20).describe('Max messages to return'),
|
|
21
|
+
}, async ({ channelId, threadTs, limit }) => {
|
|
22
|
+
const params = { channel: channelId, limit };
|
|
23
|
+
let result;
|
|
24
|
+
if (threadTs) {
|
|
25
|
+
params.ts = threadTs;
|
|
26
|
+
result = await slack.conversations.replies(params);
|
|
198
27
|
}
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
const rl = createInterface({ input: process.stdin });
|
|
202
|
-
rl.on('line', (line) => {
|
|
203
|
-
if (!line.trim())
|
|
204
|
-
return;
|
|
205
|
-
try {
|
|
206
|
-
const msg = JSON.parse(line);
|
|
207
|
-
if (msg.method && msg.id !== undefined) {
|
|
208
|
-
handleRequest(msg.id, msg.method, msg.params);
|
|
209
|
-
}
|
|
210
|
-
// Notifications (no id) — just ignore
|
|
28
|
+
else {
|
|
29
|
+
result = await slack.conversations.history(params);
|
|
211
30
|
}
|
|
212
|
-
|
|
213
|
-
|
|
31
|
+
const messages = (result.messages ?? []).map((m) => ({
|
|
32
|
+
user: m.user,
|
|
33
|
+
text: m.text,
|
|
34
|
+
ts: m.ts,
|
|
35
|
+
thread_ts: m.thread_ts,
|
|
36
|
+
}));
|
|
37
|
+
return { content: [{ type: 'text', text: JSON.stringify(messages, null, 2) }] };
|
|
38
|
+
});
|
|
39
|
+
server.tool('slack_post_message', 'Post a message to a Slack channel or thread', {
|
|
40
|
+
channelId: z.string().describe('Channel ID'),
|
|
41
|
+
text: z.string().describe('Message text'),
|
|
42
|
+
threadTs: z.string().optional().describe('Thread timestamp (optional, for replying in thread)'),
|
|
43
|
+
}, async ({ channelId, text, threadTs }) => {
|
|
44
|
+
const params = { channel: channelId, text };
|
|
45
|
+
if (threadTs)
|
|
46
|
+
params.thread_ts = threadTs;
|
|
47
|
+
const result = await slack.chat.postMessage(params);
|
|
48
|
+
return { content: [{ type: 'text', text: JSON.stringify({ ok: result.ok, ts: result.ts }) }] };
|
|
49
|
+
});
|
|
50
|
+
server.tool('slack_list_channels', 'List accessible Slack channels', {
|
|
51
|
+
limit: z.number().optional().default(100).describe('Max channels to return'),
|
|
52
|
+
types: z.string().optional().default('public_channel,private_channel').describe('Channel types'),
|
|
53
|
+
}, async ({ limit, types }) => {
|
|
54
|
+
const result = await slack.conversations.list({ limit, types });
|
|
55
|
+
const channels = (result.channels ?? []).map((c) => ({
|
|
56
|
+
id: c.id,
|
|
57
|
+
name: c.name,
|
|
58
|
+
is_private: c.is_private,
|
|
59
|
+
num_members: c.num_members,
|
|
60
|
+
}));
|
|
61
|
+
return { content: [{ type: 'text', text: JSON.stringify(channels, null, 2) }] };
|
|
62
|
+
});
|
|
63
|
+
server.tool('slack_upload_file', 'Upload content as a file to a Slack channel', {
|
|
64
|
+
channelId: z.string().describe('Channel ID'),
|
|
65
|
+
content: z.string().describe('File content'),
|
|
66
|
+
filename: z.string().describe('Filename'),
|
|
67
|
+
title: z.string().optional().describe('File title'),
|
|
68
|
+
}, async ({ channelId, content, filename, title }) => {
|
|
69
|
+
const result = await slack.filesUploadV2({
|
|
70
|
+
channel_id: channelId,
|
|
71
|
+
content,
|
|
72
|
+
filename,
|
|
73
|
+
title: title ?? filename,
|
|
74
|
+
});
|
|
75
|
+
return { content: [{ type: 'text', text: JSON.stringify({ ok: true, file_id: result.file?.id }) }] };
|
|
76
|
+
});
|
|
77
|
+
server.tool('slack_download_file', 'Download a file from Slack by file ID', {
|
|
78
|
+
fileId: z.string().describe('Slack file ID'),
|
|
79
|
+
}, async ({ fileId }) => {
|
|
80
|
+
const info = await slack.files.info({ file: fileId });
|
|
81
|
+
const file = info.file;
|
|
82
|
+
if (!file?.url_private) {
|
|
83
|
+
return { content: [{ type: 'text', text: JSON.stringify({ error: 'File URL not available' }) }] };
|
|
214
84
|
}
|
|
85
|
+
const response = await fetch(file.url_private, {
|
|
86
|
+
headers: { Authorization: `Bearer ${SLACK_BOT_TOKEN}` },
|
|
87
|
+
});
|
|
88
|
+
const text = await response.text();
|
|
89
|
+
return {
|
|
90
|
+
content: [{
|
|
91
|
+
type: 'text',
|
|
92
|
+
text: JSON.stringify({
|
|
93
|
+
name: file.name,
|
|
94
|
+
mimetype: file.mimetype,
|
|
95
|
+
size: file.size,
|
|
96
|
+
content: text.length > 50000 ? text.slice(0, 50000) + '\n...(truncated)' : text,
|
|
97
|
+
}),
|
|
98
|
+
}],
|
|
99
|
+
};
|
|
100
|
+
});
|
|
101
|
+
// === Start ===
|
|
102
|
+
async function main() {
|
|
103
|
+
const transport = new StdioServerTransport();
|
|
104
|
+
await server.connect(transport);
|
|
105
|
+
console.error('[sena-slack-mcp] running on stdio');
|
|
106
|
+
}
|
|
107
|
+
main().catch((err) => {
|
|
108
|
+
console.error('[sena-slack-mcp] fatal:', err);
|
|
109
|
+
process.exit(1);
|
|
215
110
|
});
|
|
216
111
|
//# sourceMappingURL=mcp-server.js.map
|
package/dist/mcp-server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sena-ai/tools-slack",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.11",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": {
|
|
@@ -15,15 +15,17 @@
|
|
|
15
15
|
"bin": {
|
|
16
16
|
"sena-slack-mcp": "./dist/mcp-server.js"
|
|
17
17
|
},
|
|
18
|
+
"scripts": {
|
|
19
|
+
"build": "tsc -b",
|
|
20
|
+
"dev": "tsc -b --watch"
|
|
21
|
+
},
|
|
18
22
|
"dependencies": {
|
|
23
|
+
"@modelcontextprotocol/sdk": "^1.27.1",
|
|
19
24
|
"@sena-ai/core": "^0.0.1",
|
|
20
|
-
"@slack/web-api": "^7.0.0"
|
|
25
|
+
"@slack/web-api": "^7.0.0",
|
|
26
|
+
"zod": "^4.3.6"
|
|
21
27
|
},
|
|
22
28
|
"devDependencies": {
|
|
23
29
|
"typescript": "^5.8.0"
|
|
24
|
-
},
|
|
25
|
-
"scripts": {
|
|
26
|
-
"build": "tsc -b",
|
|
27
|
-
"dev": "tsc -b --watch"
|
|
28
30
|
}
|
|
29
|
-
}
|
|
31
|
+
}
|