@pilat/mcp-notify 1.0.0 → 1.0.1
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/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/mentions/resolver.d.ts +0 -7
- package/dist/mentions/resolver.d.ts.map +1 -1
- package/dist/mentions/resolver.js +4 -0
- package/dist/mentions/resolver.js.map +1 -1
- package/dist/server.d.ts +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +2 -1
- package/dist/server.js.map +1 -1
- package/dist/slack/send.d.ts.map +1 -1
- package/dist/slack/send.js +40 -30
- package/dist/slack/send.js.map +1 -1
- package/package.json +3 -3
package/dist/index.js
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { runServer } from './server.js';
|
|
3
3
|
import { closeDb } from './cache/db.js';
|
|
4
|
+
let server = null;
|
|
4
5
|
function shutdown() {
|
|
6
|
+
try {
|
|
7
|
+
server?.close();
|
|
8
|
+
}
|
|
9
|
+
catch { /* ignore */ }
|
|
5
10
|
try {
|
|
6
11
|
closeDb();
|
|
7
12
|
}
|
|
@@ -11,7 +16,7 @@ function shutdown() {
|
|
|
11
16
|
async function main() {
|
|
12
17
|
process.on('SIGINT', shutdown);
|
|
13
18
|
process.on('SIGTERM', shutdown);
|
|
14
|
-
await runServer();
|
|
19
|
+
server = await runServer();
|
|
15
20
|
}
|
|
16
21
|
main().catch((error) => {
|
|
17
22
|
try {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,SAAS,QAAQ;IACf,IAAI,CAAC;QAAC,OAAO,EAAE,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAEhC,MAAM,SAAS,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,IAAI,MAAM,GAAiD,IAAI,CAAC;AAEhE,SAAS,QAAQ;IACf,IAAI,CAAC;QAAC,MAAM,EAAE,KAAK,EAAE,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IAC/C,IAAI,CAAC;QAAC,OAAO,EAAE,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IACzC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAEhC,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;AAC7B,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IAC9B,IAAI,CAAC;QAAC,OAAO,EAAE,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IACzC,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACtF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -1,10 +1,3 @@
|
|
|
1
1
|
import type { WebClient } from '@slack/web-api';
|
|
2
|
-
/**
|
|
3
|
-
* Convert @mentions in message text to Slack format.
|
|
4
|
-
*
|
|
5
|
-
* - @grouphandle → <!subteam^ID> (groups take priority)
|
|
6
|
-
* - @username → <@ID>
|
|
7
|
-
* - Unknown mentions are left as-is.
|
|
8
|
-
*/
|
|
9
2
|
export declare function convertMentions(message: string, client: WebClient): Promise<string>;
|
|
10
3
|
//# sourceMappingURL=resolver.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/mentions/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/mentions/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAYhD,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAsCzF"}
|
|
@@ -6,6 +6,7 @@ import { resolveUserGroup, resolveUser } from '../cache/users.js';
|
|
|
6
6
|
* - @username → <@ID>
|
|
7
7
|
* - Unknown mentions are left as-is.
|
|
8
8
|
*/
|
|
9
|
+
const SLACK_BROADCAST_MENTIONS = new Set(['here', 'channel', 'everyone']);
|
|
9
10
|
export async function convertMentions(message, client) {
|
|
10
11
|
if (!message.includes('@'))
|
|
11
12
|
return message;
|
|
@@ -20,6 +21,9 @@ export async function convertMentions(message, client) {
|
|
|
20
21
|
return message;
|
|
21
22
|
// Resolve all mentions in parallel
|
|
22
23
|
const entries = await Promise.all([...names].map(async (name) => {
|
|
24
|
+
// Slack broadcast mentions: @here, @channel, @everyone
|
|
25
|
+
if (SLACK_BROADCAST_MENTIONS.has(name))
|
|
26
|
+
return [name, `<!${name}>`];
|
|
23
27
|
const groupId = await resolveUserGroup(name, client);
|
|
24
28
|
if (groupId)
|
|
25
29
|
return [name, `<!subteam^${groupId}>`];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/mentions/resolver.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAElE;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAe,EAAE,MAAiB;IACtE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,OAAO,CAAC;IAE3C,MAAM,KAAK,GAAG,sBAAsB,CAAC;IACrC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,IAAI,KAAK,CAAC;IACV,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC9C,IAAI,KAAK,CAAC,CAAC,CAAC;YAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACpC,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC;IAErC,mCAAmC;IACnC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAoC,EAAE;QAC9D,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACrD,IAAI,OAAO;YAAE,OAAO,CAAC,IAAI,EAAE,aAAa,OAAO,GAAG,CAAC,CAAC;QAEpD,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC/C,IAAI,MAAM;YAAE,OAAO,CAAC,IAAI,EAAE,KAAK,MAAM,GAAG,CAAC,CAAC;QAE1C,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACtB,CAAC,CAAC,CACH,CAAC;IAEF,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC/C,KAAK,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,OAAO,EAAE,CAAC;QAC1C,IAAI,WAAW;YAAE,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IACvD,CAAC;IAED,IAAI,YAAY,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC;IAE5C,OAAO,OAAO,CAAC,OAAO,CAAC,sBAAsB,EAAE,CAAC,IAAI,EAAE,IAAY,EAAE,EAAE;QACpE,OAAO,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
1
|
+
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/mentions/resolver.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAElE;;;;;;GAMG;AACH,MAAM,wBAAwB,GAAwB,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;AAE/F,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAe,EAAE,MAAiB;IACtE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,OAAO,CAAC;IAE3C,MAAM,KAAK,GAAG,sBAAsB,CAAC;IACrC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,IAAI,KAAK,CAAC;IACV,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC9C,IAAI,KAAK,CAAC,CAAC,CAAC;YAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACpC,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC;IAErC,mCAAmC;IACnC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAoC,EAAE;QAC9D,uDAAuD;QACvD,IAAI,wBAAwB,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,OAAO,CAAC,IAAI,EAAE,KAAK,IAAI,GAAG,CAAC,CAAC;QAEpE,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACrD,IAAI,OAAO;YAAE,OAAO,CAAC,IAAI,EAAE,aAAa,OAAO,GAAG,CAAC,CAAC;QAEpD,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC/C,IAAI,MAAM;YAAE,OAAO,CAAC,IAAI,EAAE,KAAK,MAAM,GAAG,CAAC,CAAC;QAE1C,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACtB,CAAC,CAAC,CACH,CAAC;IAEF,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC/C,KAAK,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,OAAO,EAAE,CAAC;QAC1C,IAAI,WAAW;YAAE,YAAY,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IACvD,CAAC;IAED,IAAI,YAAY,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC;IAE5C,OAAO,OAAO,CAAC,OAAO,CAAC,sBAAsB,EAAE,CAAC,IAAI,EAAE,IAAY,EAAE,EAAE;QACpE,OAAO,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/server.d.ts
CHANGED
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAUnE,wBAAgB,YAAY,IAAI,MAAM,CAoGrC;AAED,wBAAsB,SAAS,IAAI,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAUnE,wBAAgB,YAAY,IAAI,MAAM,CAoGrC;AAED,wBAAsB,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAKjD"}
|
package/dist/server.js
CHANGED
|
@@ -95,7 +95,7 @@ NEVER use: **bold**, [link](url), # headers, tables, ---, ![images]. These rende
|
|
|
95
95
|
if (error instanceof Error) {
|
|
96
96
|
throw error;
|
|
97
97
|
}
|
|
98
|
-
throw new Error(String(error));
|
|
98
|
+
throw new Error(String(error), { cause: error });
|
|
99
99
|
}
|
|
100
100
|
});
|
|
101
101
|
return server;
|
|
@@ -104,5 +104,6 @@ export async function runServer() {
|
|
|
104
104
|
const server = createServer();
|
|
105
105
|
const transport = new StdioServerTransport();
|
|
106
106
|
await server.connect(transport);
|
|
107
|
+
return server;
|
|
107
108
|
}
|
|
108
109
|
//# sourceMappingURL=server.js.map
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/dist/slack/send.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"send.d.ts","sourceRoot":"","sources":["../../src/slack/send.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"send.d.ts","sourceRoot":"","sources":["../../src/slack/send.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AASxE,wBAAsB,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA2EvF"}
|
package/dist/slack/send.js
CHANGED
|
@@ -2,8 +2,14 @@ import { SlackMcpError, ErrorCode } from '../utils/errors.js';
|
|
|
2
2
|
import { getSlackClient } from './client.js';
|
|
3
3
|
import { getChannelId } from '../cache/channels.js';
|
|
4
4
|
import { convertMentions } from '../mentions/resolver.js';
|
|
5
|
+
const THREAD_TS_RE = /^\d+\.\d{6}$/;
|
|
6
|
+
const BLOCK_KIT_TEXT_LIMIT = 3000;
|
|
5
7
|
export async function sendMessage(params) {
|
|
6
8
|
const client = getSlackClient();
|
|
9
|
+
// Validate thread_ts format
|
|
10
|
+
if (params.thread_ts && !THREAD_TS_RE.test(params.thread_ts)) {
|
|
11
|
+
throw new SlackMcpError(ErrorCode.SEND_FAILED, `Invalid thread_ts format "${params.thread_ts}". Expected format: "1234567890.123456".`);
|
|
12
|
+
}
|
|
7
13
|
// Resolve mentions
|
|
8
14
|
const convertedMessage = await convertMentions(params.message, client);
|
|
9
15
|
// Resolve channel
|
|
@@ -11,6 +17,25 @@ export async function sendMessage(params) {
|
|
|
11
17
|
if (!channelId) {
|
|
12
18
|
throw new SlackMcpError(ErrorCode.CHANNEL_NOT_FOUND, `Channel "#${params.channel_name}" not found. Check the channel name and ensure you have access.`);
|
|
13
19
|
}
|
|
20
|
+
const baseArgs = {
|
|
21
|
+
channel: channelId,
|
|
22
|
+
unfurl_links: false,
|
|
23
|
+
unfurl_media: false,
|
|
24
|
+
...(params.thread_ts ? { thread_ts: params.thread_ts } : {}),
|
|
25
|
+
};
|
|
26
|
+
const makeResult = (ts, fallback) => ({
|
|
27
|
+
status: 'success',
|
|
28
|
+
message: fallback ? 'Message sent successfully (plain text fallback)' : 'Message sent successfully',
|
|
29
|
+
channel_name: params.channel_name,
|
|
30
|
+
channel_id: channelId,
|
|
31
|
+
message_ts: ts,
|
|
32
|
+
sent_message: convertedMessage,
|
|
33
|
+
thread_ts: params.thread_ts,
|
|
34
|
+
});
|
|
35
|
+
// Skip Block Kit if message exceeds the 3000-char section limit
|
|
36
|
+
if (convertedMessage.length > BLOCK_KIT_TEXT_LIMIT) {
|
|
37
|
+
return sendPlainText(client, baseArgs, convertedMessage, params.channel_name, makeResult);
|
|
38
|
+
}
|
|
14
39
|
// Build Block Kit blocks
|
|
15
40
|
const blocks = [
|
|
16
41
|
{
|
|
@@ -24,53 +49,38 @@ export async function sendMessage(params) {
|
|
|
24
49
|
],
|
|
25
50
|
},
|
|
26
51
|
];
|
|
27
|
-
const baseArgs = {
|
|
28
|
-
channel: channelId,
|
|
29
|
-
unfurl_links: false,
|
|
30
|
-
unfurl_media: false,
|
|
31
|
-
...(params.thread_ts ? { thread_ts: params.thread_ts } : {}),
|
|
32
|
-
};
|
|
33
52
|
try {
|
|
34
|
-
// Try with Block Kit first
|
|
35
53
|
const result = await client.chat.postMessage({
|
|
36
54
|
...baseArgs,
|
|
37
55
|
text: convertedMessage,
|
|
38
56
|
blocks,
|
|
39
57
|
});
|
|
40
|
-
return
|
|
41
|
-
status: 'success',
|
|
42
|
-
message: 'Message sent successfully',
|
|
43
|
-
channel_name: params.channel_name,
|
|
44
|
-
channel_id: channelId,
|
|
45
|
-
message_ts: result.ts,
|
|
46
|
-
sent_message: convertedMessage,
|
|
47
|
-
thread_ts: params.thread_ts,
|
|
48
|
-
};
|
|
58
|
+
return makeResult(result.ts, false);
|
|
49
59
|
}
|
|
50
60
|
catch (blockKitError) {
|
|
51
61
|
// Fallback to plain text without blocks
|
|
52
62
|
try {
|
|
53
|
-
|
|
54
|
-
...baseArgs,
|
|
55
|
-
text: `:robot_face: ${convertedMessage}`,
|
|
56
|
-
});
|
|
57
|
-
return {
|
|
58
|
-
status: 'success',
|
|
59
|
-
message: 'Message sent successfully (plain text fallback)',
|
|
60
|
-
channel_name: params.channel_name,
|
|
61
|
-
channel_id: channelId,
|
|
62
|
-
message_ts: result.ts,
|
|
63
|
-
sent_message: convertedMessage,
|
|
64
|
-
thread_ts: params.thread_ts,
|
|
65
|
-
};
|
|
63
|
+
return await sendPlainText(client, baseArgs, convertedMessage, params.channel_name, makeResult);
|
|
66
64
|
}
|
|
67
65
|
catch {
|
|
68
|
-
// Both failed — report the original Block Kit error with specifics
|
|
69
66
|
const err = blockKitError instanceof Error ? blockKitError : new Error(String(blockKitError));
|
|
70
67
|
throw mapSlackError(err, params.channel_name);
|
|
71
68
|
}
|
|
72
69
|
}
|
|
73
70
|
}
|
|
71
|
+
async function sendPlainText(client, baseArgs, message, channelName, makeResult) {
|
|
72
|
+
try {
|
|
73
|
+
const result = await client.chat.postMessage({
|
|
74
|
+
...baseArgs,
|
|
75
|
+
text: `:robot_face: ${message}`,
|
|
76
|
+
});
|
|
77
|
+
return makeResult(result.ts, true);
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
const err = error instanceof Error ? error : new Error(String(error), { cause: error });
|
|
81
|
+
throw mapSlackError(err, channelName);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
74
84
|
function mapSlackError(error, channelName) {
|
|
75
85
|
const msg = error.message;
|
|
76
86
|
if (msg.includes('channel_not_found')) {
|
package/dist/slack/send.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"send.js","sourceRoot":"","sources":["../../src/slack/send.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE1D,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAAyB;IACzD,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC;IAEhC,mBAAmB;IACnB,MAAM,gBAAgB,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAEvE,kBAAkB;IAClB,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAClE,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,aAAa,CACrB,SAAS,CAAC,iBAAiB,EAC3B,aAAa,MAAM,CAAC,YAAY,iEAAiE,CAClG,CAAC;IACJ,CAAC;IAED,
|
|
1
|
+
{"version":3,"file":"send.js","sourceRoot":"","sources":["../../src/slack/send.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pilat/mcp-notify",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"description": "MCP server for sending Slack messages as user (xoxc + cookie auth)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -43,10 +43,10 @@
|
|
|
43
43
|
"better-sqlite3": "^12.6.0"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
|
-
"@eslint/js": "^
|
|
46
|
+
"@eslint/js": "^10.0.1",
|
|
47
47
|
"@types/better-sqlite3": "^7.6.0",
|
|
48
48
|
"@types/node": "^22.0.0",
|
|
49
|
-
"eslint": "^
|
|
49
|
+
"eslint": "^10.0.0",
|
|
50
50
|
"typescript": "^5.3.0",
|
|
51
51
|
"typescript-eslint": "^8.51.0",
|
|
52
52
|
"vitest": "^4.0.17"
|