@unclick/mcp-server 0.1.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/README.md +139 -0
- package/dist/amazon-tool.d.ts +5 -0
- package/dist/amazon-tool.d.ts.map +1 -0
- package/dist/amazon-tool.js +307 -0
- package/dist/amazon-tool.js.map +1 -0
- package/dist/bluesky-tool.d.ts +2 -0
- package/dist/bluesky-tool.d.ts.map +1 -0
- package/dist/bluesky-tool.js +368 -0
- package/dist/bluesky-tool.js.map +1 -0
- package/dist/catalog.d.ts +28 -0
- package/dist/catalog.d.ts.map +1 -0
- package/dist/catalog.js +1865 -0
- package/dist/catalog.js.map +1 -0
- package/dist/client.d.ts +12 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +73 -0
- package/dist/client.js.map +1 -0
- package/dist/converter-tools.d.ts +50 -0
- package/dist/converter-tools.d.ts.map +1 -0
- package/dist/converter-tools.js +137 -0
- package/dist/converter-tools.js.map +1 -0
- package/dist/csuite-tool.d.ts +35 -0
- package/dist/csuite-tool.d.ts.map +1 -0
- package/dist/csuite-tool.js +791 -0
- package/dist/csuite-tool.js.map +1 -0
- package/dist/discord-tool.d.ts +8 -0
- package/dist/discord-tool.d.ts.map +1 -0
- package/dist/discord-tool.js +195 -0
- package/dist/discord-tool.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/local-tools.d.ts +72 -0
- package/dist/local-tools.d.ts.map +1 -0
- package/dist/local-tools.js +563 -0
- package/dist/local-tools.js.map +1 -0
- package/dist/mastodon-tool.d.ts +2 -0
- package/dist/mastodon-tool.d.ts.map +1 -0
- package/dist/mastodon-tool.js +372 -0
- package/dist/mastodon-tool.js.map +1 -0
- package/dist/reddit-tool.d.ts +59 -0
- package/dist/reddit-tool.d.ts.map +1 -0
- package/dist/reddit-tool.js +348 -0
- package/dist/reddit-tool.js.map +1 -0
- package/dist/server.d.ts +4 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +2337 -0
- package/dist/server.js.map +1 -0
- package/dist/shopify-tool.d.ts +8 -0
- package/dist/shopify-tool.d.ts.map +1 -0
- package/dist/shopify-tool.js +305 -0
- package/dist/shopify-tool.js.map +1 -0
- package/dist/slack-tool.d.ts +2 -0
- package/dist/slack-tool.d.ts.map +1 -0
- package/dist/slack-tool.js +316 -0
- package/dist/slack-tool.js.map +1 -0
- package/dist/telegram-tool.d.ts +7 -0
- package/dist/telegram-tool.d.ts.map +1 -0
- package/dist/telegram-tool.js +297 -0
- package/dist/telegram-tool.js.map +1 -0
- package/dist/vault-tool.d.ts +2 -0
- package/dist/vault-tool.d.ts.map +1 -0
- package/dist/vault-tool.js +395 -0
- package/dist/vault-tool.js.map +1 -0
- package/dist/xero-tool.d.ts +9 -0
- package/dist/xero-tool.d.ts.map +1 -0
- package/dist/xero-tool.js +330 -0
- package/dist/xero-tool.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
// ── Slack Web API tool ─────────────────────────────────────────────────────────
|
|
2
|
+
// Calls the official Slack Web API over HTTPS using fetch (no SDK needed).
|
|
3
|
+
// All actions require a Bot Token (xoxb-...) with the appropriate OAuth scopes.
|
|
4
|
+
//
|
|
5
|
+
// Required scopes per action:
|
|
6
|
+
// slack_send - chat:write
|
|
7
|
+
// slack_read - channels:history, groups:history, im:history, mpim:history
|
|
8
|
+
// slack_search - search:read
|
|
9
|
+
// slack_thread_reply - chat:write
|
|
10
|
+
// slack_channels - channels:read, groups:read, im:read, mpim:read
|
|
11
|
+
// slack_react - reactions:write
|
|
12
|
+
// slack_upload - files:write
|
|
13
|
+
const SLACK_API = "https://slack.com/api";
|
|
14
|
+
// ── HTTP helpers ───────────────────────────────────────────────────────────────
|
|
15
|
+
async function slackGet(token, method, params) {
|
|
16
|
+
const qs = new URLSearchParams();
|
|
17
|
+
for (const [k, v] of Object.entries(params)) {
|
|
18
|
+
qs.set(k, String(v));
|
|
19
|
+
}
|
|
20
|
+
const res = await fetch(`${SLACK_API}/${method}?${qs}`, {
|
|
21
|
+
headers: { Authorization: `Bearer ${token}` },
|
|
22
|
+
});
|
|
23
|
+
if (!res.ok) {
|
|
24
|
+
throw new Error(`Slack HTTP ${res.status}: ${res.statusText}`);
|
|
25
|
+
}
|
|
26
|
+
return res.json();
|
|
27
|
+
}
|
|
28
|
+
async function slackPost(token, method, body) {
|
|
29
|
+
const res = await fetch(`${SLACK_API}/${method}`, {
|
|
30
|
+
method: "POST",
|
|
31
|
+
headers: {
|
|
32
|
+
Authorization: `Bearer ${token}`,
|
|
33
|
+
"Content-Type": "application/json; charset=utf-8",
|
|
34
|
+
},
|
|
35
|
+
body: JSON.stringify(body),
|
|
36
|
+
});
|
|
37
|
+
if (!res.ok) {
|
|
38
|
+
throw new Error(`Slack HTTP ${res.status}: ${res.statusText}`);
|
|
39
|
+
}
|
|
40
|
+
return res.json();
|
|
41
|
+
}
|
|
42
|
+
// ── Slack error translator ─────────────────────────────────────────────────────
|
|
43
|
+
function translateError(code) {
|
|
44
|
+
const known = {
|
|
45
|
+
channel_not_found: "Channel not found. Check the channel ID or name.",
|
|
46
|
+
not_in_channel: "Bot is not in that channel. Invite it first: /invite @bot.",
|
|
47
|
+
is_archived: "Channel is archived and cannot receive messages.",
|
|
48
|
+
msg_too_long: "Message exceeds Slack's 40,000 character limit.",
|
|
49
|
+
no_text: "Message text is required.",
|
|
50
|
+
not_authed: "Missing or invalid bot token (xoxb-...).",
|
|
51
|
+
invalid_auth: "Bot token is invalid or revoked.",
|
|
52
|
+
account_inactive: "Bot account has been deactivated.",
|
|
53
|
+
token_revoked: "Bot token has been revoked.",
|
|
54
|
+
token_expired: "Bot token has expired.",
|
|
55
|
+
missing_scope: "Bot token is missing a required OAuth scope.",
|
|
56
|
+
cant_invite_self: "Cannot invite the bot to a channel it already occupies.",
|
|
57
|
+
message_not_found: "Message not found. Verify the channel and timestamp (ts).",
|
|
58
|
+
invalid_timestamp: "Invalid message timestamp. Use the exact ts value from Slack.",
|
|
59
|
+
already_reacted: "Bot has already added that reaction to this message.",
|
|
60
|
+
invalid_name: "Invalid emoji name. Use a standard Slack emoji name without colons.",
|
|
61
|
+
too_many_reactions: "Message has reached the reaction limit.",
|
|
62
|
+
file_not_found: "File not found.",
|
|
63
|
+
posting_to_general_channel_denied: "Workspace settings block posting to #general.",
|
|
64
|
+
ratelimited: "Rate limited by Slack. Wait a moment and retry.",
|
|
65
|
+
};
|
|
66
|
+
return known[code] ?? `Slack error: ${code}`;
|
|
67
|
+
}
|
|
68
|
+
function handleSlackResponse(data) {
|
|
69
|
+
if (!data.ok) {
|
|
70
|
+
const code = String(data.error ?? "unknown_error");
|
|
71
|
+
return { error: translateError(code), slack_error: code };
|
|
72
|
+
}
|
|
73
|
+
return data;
|
|
74
|
+
}
|
|
75
|
+
// ── Action implementations ─────────────────────────────────────────────────────
|
|
76
|
+
async function actionSend(token, args) {
|
|
77
|
+
const channel = String(args.channel ?? "").trim();
|
|
78
|
+
if (!channel)
|
|
79
|
+
return { error: "channel is required." };
|
|
80
|
+
const text = String(args.text ?? "").trim();
|
|
81
|
+
if (!text && !args.blocks)
|
|
82
|
+
return { error: "text or blocks is required." };
|
|
83
|
+
const body = { channel };
|
|
84
|
+
if (text)
|
|
85
|
+
body.text = text;
|
|
86
|
+
if (args.blocks)
|
|
87
|
+
body.blocks = args.blocks;
|
|
88
|
+
if (args.thread_ts)
|
|
89
|
+
body.thread_ts = String(args.thread_ts);
|
|
90
|
+
if (args.username)
|
|
91
|
+
body.username = String(args.username);
|
|
92
|
+
const data = await slackPost(token, "chat.postMessage", body);
|
|
93
|
+
const result = handleSlackResponse(data);
|
|
94
|
+
if (result.error)
|
|
95
|
+
return result;
|
|
96
|
+
return {
|
|
97
|
+
ok: true,
|
|
98
|
+
channel: data.channel,
|
|
99
|
+
ts: data.ts,
|
|
100
|
+
message: data.message?.text ?? text,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
async function actionRead(token, args) {
|
|
104
|
+
const channel = String(args.channel ?? "").trim();
|
|
105
|
+
if (!channel)
|
|
106
|
+
return { error: "channel is required." };
|
|
107
|
+
const limit = Math.min(200, Math.max(1, Number(args.limit ?? 20)));
|
|
108
|
+
const params = { channel, limit };
|
|
109
|
+
if (args.oldest)
|
|
110
|
+
params.oldest = String(args.oldest);
|
|
111
|
+
if (args.latest)
|
|
112
|
+
params.latest = String(args.latest);
|
|
113
|
+
const data = await slackGet(token, "conversations.history", params);
|
|
114
|
+
const result = handleSlackResponse(data);
|
|
115
|
+
if (result.error)
|
|
116
|
+
return result;
|
|
117
|
+
const messages = data.messages.map((m) => ({
|
|
118
|
+
ts: m.ts,
|
|
119
|
+
user: m.user,
|
|
120
|
+
bot_id: m.bot_id,
|
|
121
|
+
text: m.text,
|
|
122
|
+
type: m.type,
|
|
123
|
+
thread_ts: m.thread_ts,
|
|
124
|
+
reply_count: m.reply_count,
|
|
125
|
+
}));
|
|
126
|
+
return {
|
|
127
|
+
ok: true,
|
|
128
|
+
channel,
|
|
129
|
+
count: messages.length,
|
|
130
|
+
has_more: data.has_more,
|
|
131
|
+
messages,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
async function actionSearch(token, args) {
|
|
135
|
+
const query = String(args.query ?? "").trim();
|
|
136
|
+
if (!query)
|
|
137
|
+
return { error: "query is required." };
|
|
138
|
+
const count = Math.min(100, Math.max(1, Number(args.count ?? 20)));
|
|
139
|
+
const params = {
|
|
140
|
+
query,
|
|
141
|
+
count,
|
|
142
|
+
sort: String(args.sort ?? "timestamp"),
|
|
143
|
+
sort_dir: String(args.sort_dir ?? "desc"),
|
|
144
|
+
};
|
|
145
|
+
const data = await slackGet(token, "search.messages", params);
|
|
146
|
+
const result = handleSlackResponse(data);
|
|
147
|
+
if (result.error)
|
|
148
|
+
return result;
|
|
149
|
+
const matches = data.messages;
|
|
150
|
+
const items = (matches.matches ?? []).map((m) => ({
|
|
151
|
+
ts: m.ts,
|
|
152
|
+
channel: m.channel?.id,
|
|
153
|
+
channel_name: m.channel?.name,
|
|
154
|
+
user: m.username,
|
|
155
|
+
text: m.text,
|
|
156
|
+
permalink: m.permalink,
|
|
157
|
+
}));
|
|
158
|
+
return {
|
|
159
|
+
ok: true,
|
|
160
|
+
query,
|
|
161
|
+
total: matches.total ?? items.length,
|
|
162
|
+
count: items.length,
|
|
163
|
+
messages: items,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
async function actionThreadReply(token, args) {
|
|
167
|
+
const channel = String(args.channel ?? "").trim();
|
|
168
|
+
const thread_ts = String(args.thread_ts ?? "").trim();
|
|
169
|
+
const text = String(args.text ?? "").trim();
|
|
170
|
+
if (!channel)
|
|
171
|
+
return { error: "channel is required." };
|
|
172
|
+
if (!thread_ts)
|
|
173
|
+
return { error: "thread_ts is required." };
|
|
174
|
+
if (!text && !args.blocks)
|
|
175
|
+
return { error: "text or blocks is required." };
|
|
176
|
+
const body = { channel, thread_ts };
|
|
177
|
+
if (text)
|
|
178
|
+
body.text = text;
|
|
179
|
+
if (args.blocks)
|
|
180
|
+
body.blocks = args.blocks;
|
|
181
|
+
const data = await slackPost(token, "chat.postMessage", body);
|
|
182
|
+
const result = handleSlackResponse(data);
|
|
183
|
+
if (result.error)
|
|
184
|
+
return result;
|
|
185
|
+
return {
|
|
186
|
+
ok: true,
|
|
187
|
+
channel: data.channel,
|
|
188
|
+
ts: data.ts,
|
|
189
|
+
thread_ts: data.message?.thread_ts ?? thread_ts,
|
|
190
|
+
text,
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
async function actionChannels(token, args) {
|
|
194
|
+
const types = String(args.types ?? "public_channel");
|
|
195
|
+
const limit = Math.min(1000, Math.max(1, Number(args.limit ?? 100)));
|
|
196
|
+
const params = {
|
|
197
|
+
types,
|
|
198
|
+
limit,
|
|
199
|
+
exclude_archived: args.exclude_archived !== false,
|
|
200
|
+
};
|
|
201
|
+
const data = await slackGet(token, "conversations.list", params);
|
|
202
|
+
const result = handleSlackResponse(data);
|
|
203
|
+
if (result.error)
|
|
204
|
+
return result;
|
|
205
|
+
const channels = data.channels.map((c) => ({
|
|
206
|
+
id: c.id,
|
|
207
|
+
name: c.name,
|
|
208
|
+
is_private: c.is_private,
|
|
209
|
+
is_archived: c.is_archived,
|
|
210
|
+
is_member: c.is_member,
|
|
211
|
+
num_members: c.num_members,
|
|
212
|
+
topic: c.topic?.value,
|
|
213
|
+
purpose: c.purpose?.value,
|
|
214
|
+
}));
|
|
215
|
+
return {
|
|
216
|
+
ok: true,
|
|
217
|
+
types,
|
|
218
|
+
count: channels.length,
|
|
219
|
+
channels,
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
async function actionReact(token, args) {
|
|
223
|
+
const channel = String(args.channel ?? "").trim();
|
|
224
|
+
const ts = String(args.timestamp ?? "").trim();
|
|
225
|
+
const name = String(args.emoji ?? "").trim().replace(/^:|:$/g, "");
|
|
226
|
+
if (!channel)
|
|
227
|
+
return { error: "channel is required." };
|
|
228
|
+
if (!ts)
|
|
229
|
+
return { error: "timestamp is required." };
|
|
230
|
+
if (!name)
|
|
231
|
+
return { error: "emoji is required." };
|
|
232
|
+
const data = await slackPost(token, "reactions.add", { channel, timestamp: ts, name });
|
|
233
|
+
const result = handleSlackResponse(data);
|
|
234
|
+
if (result.error)
|
|
235
|
+
return result;
|
|
236
|
+
return { ok: true, channel, timestamp: ts, emoji: name };
|
|
237
|
+
}
|
|
238
|
+
async function actionUpload(token, args) {
|
|
239
|
+
const channels = String(args.channels ?? "").trim();
|
|
240
|
+
const filename = String(args.filename ?? "file.txt").trim();
|
|
241
|
+
const content = String(args.content ?? "").trim();
|
|
242
|
+
if (!channels)
|
|
243
|
+
return { error: "channels is required (channel ID or comma-separated IDs)." };
|
|
244
|
+
if (!content)
|
|
245
|
+
return { error: "content is required." };
|
|
246
|
+
// Use the v2 upload flow: get upload URL, upload, then finalize.
|
|
247
|
+
// Step 1: request an upload URL
|
|
248
|
+
const urlRes = await slackGet(token, "files.getUploadURLExternal", {
|
|
249
|
+
filename,
|
|
250
|
+
length: Buffer.byteLength(content, "utf8"),
|
|
251
|
+
});
|
|
252
|
+
const urlResult = handleSlackResponse(urlRes);
|
|
253
|
+
if (urlResult.error)
|
|
254
|
+
return urlResult;
|
|
255
|
+
const uploadUrl = String(urlRes.upload_url ?? "");
|
|
256
|
+
const fileId = String(urlRes.file_id ?? "");
|
|
257
|
+
// Step 2: POST the file content to the upload URL
|
|
258
|
+
const uploadRes = await fetch(uploadUrl, {
|
|
259
|
+
method: "POST",
|
|
260
|
+
headers: { "Content-Type": "application/octet-stream" },
|
|
261
|
+
body: content,
|
|
262
|
+
});
|
|
263
|
+
if (!uploadRes.ok) {
|
|
264
|
+
return { error: `File upload to Slack storage failed: HTTP ${uploadRes.status}` };
|
|
265
|
+
}
|
|
266
|
+
// Step 3: finalize and share to the channel(s)
|
|
267
|
+
const finalBody = {
|
|
268
|
+
files: [{ id: fileId }],
|
|
269
|
+
channel_id: channels.split(",")[0].trim(),
|
|
270
|
+
};
|
|
271
|
+
if (args.initial_comment)
|
|
272
|
+
finalBody.initial_comment = String(args.initial_comment);
|
|
273
|
+
const finalRes = await slackPost(token, "files.completeUploadExternal", finalBody);
|
|
274
|
+
const finalResult = handleSlackResponse(finalRes);
|
|
275
|
+
if (finalResult.error)
|
|
276
|
+
return finalResult;
|
|
277
|
+
const files = finalRes.files;
|
|
278
|
+
const file = files?.[0];
|
|
279
|
+
return {
|
|
280
|
+
ok: true,
|
|
281
|
+
file_id: file?.id,
|
|
282
|
+
filename: file?.name ?? filename,
|
|
283
|
+
permalink: file?.permalink,
|
|
284
|
+
channels: channels.split(",").map((c) => c.trim()),
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
// ── Public dispatcher ──────────────────────────────────────────────────────────
|
|
288
|
+
export async function slackAction(action, args) {
|
|
289
|
+
const token = String(args.bot_token ?? "").trim();
|
|
290
|
+
if (!token)
|
|
291
|
+
return { error: "bot_token is required." };
|
|
292
|
+
if (!token.startsWith("xoxb-"))
|
|
293
|
+
return { error: "bot_token must start with xoxb-. Check your Slack app's Bot Token." };
|
|
294
|
+
try {
|
|
295
|
+
switch (action) {
|
|
296
|
+
case "slack_send": return actionSend(token, args);
|
|
297
|
+
case "slack_read": return actionRead(token, args);
|
|
298
|
+
case "slack_search": return actionSearch(token, args);
|
|
299
|
+
case "slack_thread_reply": return actionThreadReply(token, args);
|
|
300
|
+
case "slack_channels": return actionChannels(token, args);
|
|
301
|
+
case "slack_react": return actionReact(token, args);
|
|
302
|
+
case "slack_upload": return actionUpload(token, args);
|
|
303
|
+
default:
|
|
304
|
+
return {
|
|
305
|
+
error: `Unknown slack action: "${action}". ` +
|
|
306
|
+
"Valid actions: slack_send, slack_read, slack_search, " +
|
|
307
|
+
"slack_thread_reply, slack_channels, slack_react, slack_upload.",
|
|
308
|
+
};
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
catch (err) {
|
|
312
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
313
|
+
return { error: message };
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
//# sourceMappingURL=slack-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slack-tool.js","sourceRoot":"","sources":["../src/slack-tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare function telegramSend(args: Record<string, unknown>): Promise<unknown>;
|
|
2
|
+
export declare function telegramRead(args: Record<string, unknown>): Promise<unknown>;
|
|
3
|
+
export declare function telegramSearch(args: Record<string, unknown>): Promise<unknown>;
|
|
4
|
+
export declare function telegramSendMedia(args: Record<string, unknown>): Promise<unknown>;
|
|
5
|
+
export declare function telegramGetUpdates(args: Record<string, unknown>): Promise<unknown>;
|
|
6
|
+
export declare function telegramManageChat(args: Record<string, unknown>): Promise<unknown>;
|
|
7
|
+
//# sourceMappingURL=telegram-tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telegram-tool.d.ts","sourceRoot":"","sources":["../src/telegram-tool.ts"],"names":[],"mappings":"AA4HA,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAiClF;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CA+BlF;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAoCpF;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CA4CvF;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAyCxF;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAuExF"}
|
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
// Telegram Bot API integration for the UnClick MCP server.
|
|
2
|
+
// Uses the official Telegram Bot API via fetch - no external dependencies.
|
|
3
|
+
// Users must create a bot via @BotFather on Telegram to get a token.
|
|
4
|
+
const TELEGRAM_API_BASE = "https://api.telegram.org";
|
|
5
|
+
// ─── API helper ──────────────────────────────────────────────────────────────
|
|
6
|
+
async function telegramCall(token, method, params = {}) {
|
|
7
|
+
const url = `${TELEGRAM_API_BASE}/bot${token}/${method}`;
|
|
8
|
+
const response = await fetch(url, {
|
|
9
|
+
method: "POST",
|
|
10
|
+
headers: { "Content-Type": "application/json" },
|
|
11
|
+
body: JSON.stringify(params),
|
|
12
|
+
});
|
|
13
|
+
if (!response.ok) {
|
|
14
|
+
throw new Error(`HTTP ${response.status} from Telegram API`);
|
|
15
|
+
}
|
|
16
|
+
const data = (await response.json());
|
|
17
|
+
if (!data.ok) {
|
|
18
|
+
const code = data.error_code ? ` (code ${data.error_code})` : "";
|
|
19
|
+
throw new Error(`Telegram API error${code}: ${data.description ?? "Unknown error"}`);
|
|
20
|
+
}
|
|
21
|
+
return data.result;
|
|
22
|
+
}
|
|
23
|
+
// ─── Message normalization ────────────────────────────────────────────────────
|
|
24
|
+
function normalizeMessage(msg) {
|
|
25
|
+
const sender = msg.from
|
|
26
|
+
? {
|
|
27
|
+
id: msg.from.id,
|
|
28
|
+
name: [msg.from.first_name, msg.from.last_name].filter(Boolean).join(" "),
|
|
29
|
+
username: msg.from.username,
|
|
30
|
+
is_bot: msg.from.is_bot,
|
|
31
|
+
}
|
|
32
|
+
: msg.sender_chat
|
|
33
|
+
? { id: msg.sender_chat.id, name: msg.sender_chat.title ?? "Channel", username: msg.sender_chat.username }
|
|
34
|
+
: null;
|
|
35
|
+
return {
|
|
36
|
+
message_id: msg.message_id,
|
|
37
|
+
date: new Date(msg.date * 1000).toISOString(),
|
|
38
|
+
sender,
|
|
39
|
+
chat: {
|
|
40
|
+
id: msg.chat.id,
|
|
41
|
+
type: msg.chat.type,
|
|
42
|
+
name: msg.chat.title ?? msg.chat.username ?? msg.chat.first_name ?? String(msg.chat.id),
|
|
43
|
+
},
|
|
44
|
+
text: msg.text ?? msg.caption ?? null,
|
|
45
|
+
has_media: Array.isArray(msg.photo) || msg.document !== undefined,
|
|
46
|
+
document_name: msg.document?.file_name ?? null,
|
|
47
|
+
reply_to: msg.reply_to_message?.message_id ?? null,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
// ─── Token validation ─────────────────────────────────────────────────────────
|
|
51
|
+
function requireToken(token) {
|
|
52
|
+
const t = String(token ?? "").trim();
|
|
53
|
+
if (!t)
|
|
54
|
+
throw new Error("bot_token is required. Create a bot at @BotFather on Telegram.");
|
|
55
|
+
return t;
|
|
56
|
+
}
|
|
57
|
+
// ─── Operations ──────────────────────────────────────────────────────────────
|
|
58
|
+
export async function telegramSend(args) {
|
|
59
|
+
const token = requireToken(args.bot_token);
|
|
60
|
+
const chatId = args.chat_id;
|
|
61
|
+
if (!chatId)
|
|
62
|
+
throw new Error("chat_id is required.");
|
|
63
|
+
const text = String(args.text ?? "").trim();
|
|
64
|
+
if (!text)
|
|
65
|
+
throw new Error("text is required.");
|
|
66
|
+
const params = {
|
|
67
|
+
chat_id: chatId,
|
|
68
|
+
text,
|
|
69
|
+
};
|
|
70
|
+
const parseMode = args.parse_mode;
|
|
71
|
+
if (parseMode === "Markdown" || parseMode === "HTML" || parseMode === "MarkdownV2") {
|
|
72
|
+
params.parse_mode = parseMode;
|
|
73
|
+
}
|
|
74
|
+
if (args.reply_to_message_id) {
|
|
75
|
+
params.reply_to_message_id = Number(args.reply_to_message_id);
|
|
76
|
+
}
|
|
77
|
+
if (args.disable_notification === true) {
|
|
78
|
+
params.disable_notification = true;
|
|
79
|
+
}
|
|
80
|
+
const msg = await telegramCall(token, "sendMessage", params);
|
|
81
|
+
return {
|
|
82
|
+
success: true,
|
|
83
|
+
message_id: msg.message_id,
|
|
84
|
+
chat_id: msg.chat.id,
|
|
85
|
+
date: new Date(msg.date * 1000).toISOString(),
|
|
86
|
+
text: msg.text,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
export async function telegramRead(args) {
|
|
90
|
+
const token = requireToken(args.bot_token);
|
|
91
|
+
const chatId = args.chat_id !== undefined ? String(args.chat_id) : null;
|
|
92
|
+
const limit = Math.min(100, Math.max(1, Number(args.limit ?? 20)));
|
|
93
|
+
const offset = args.offset !== undefined ? Number(args.offset) : undefined;
|
|
94
|
+
// getUpdates returns messages received by the bot (since last checked or from offset)
|
|
95
|
+
const params = { limit: 100 };
|
|
96
|
+
if (offset !== undefined)
|
|
97
|
+
params.offset = offset;
|
|
98
|
+
const updates = await telegramCall(token, "getUpdates", params);
|
|
99
|
+
// Extract messages from updates
|
|
100
|
+
let messages = updates
|
|
101
|
+
.map((u) => u.message ?? u.channel_post ?? u.edited_message ?? u.edited_channel_post)
|
|
102
|
+
.filter((m) => m !== undefined);
|
|
103
|
+
// Filter by chat_id if provided
|
|
104
|
+
if (chatId !== null) {
|
|
105
|
+
messages = messages.filter((m) => String(m.chat.id) === chatId);
|
|
106
|
+
}
|
|
107
|
+
// Return last N messages (most recent)
|
|
108
|
+
const recent = messages.slice(-limit).reverse();
|
|
109
|
+
const nextOffset = updates.length > 0 ? updates[updates.length - 1].update_id + 1 : offset;
|
|
110
|
+
return {
|
|
111
|
+
count: recent.length,
|
|
112
|
+
next_offset: nextOffset,
|
|
113
|
+
messages: recent.map(normalizeMessage),
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
export async function telegramSearch(args) {
|
|
117
|
+
const token = requireToken(args.bot_token);
|
|
118
|
+
const chatId = args.chat_id !== undefined ? String(args.chat_id) : null;
|
|
119
|
+
const query = String(args.query ?? "").toLowerCase().trim();
|
|
120
|
+
if (!query)
|
|
121
|
+
throw new Error("query is required.");
|
|
122
|
+
const limit = Math.min(50, Math.max(1, Number(args.limit ?? 10)));
|
|
123
|
+
const offset = args.offset !== undefined ? Number(args.offset) : undefined;
|
|
124
|
+
// Fetch all available updates and filter by keyword
|
|
125
|
+
const params = { limit: 100 };
|
|
126
|
+
if (offset !== undefined)
|
|
127
|
+
params.offset = offset;
|
|
128
|
+
const updates = await telegramCall(token, "getUpdates", params);
|
|
129
|
+
let messages = updates
|
|
130
|
+
.map((u) => u.message ?? u.channel_post ?? u.edited_message ?? u.edited_channel_post)
|
|
131
|
+
.filter((m) => m !== undefined);
|
|
132
|
+
if (chatId !== null) {
|
|
133
|
+
messages = messages.filter((m) => String(m.chat.id) === chatId);
|
|
134
|
+
}
|
|
135
|
+
// Filter by keyword in text or caption
|
|
136
|
+
const matched = messages.filter((m) => {
|
|
137
|
+
const content = (m.text ?? m.caption ?? "").toLowerCase();
|
|
138
|
+
return content.includes(query);
|
|
139
|
+
});
|
|
140
|
+
const results = matched.slice(0, limit).reverse();
|
|
141
|
+
return {
|
|
142
|
+
query,
|
|
143
|
+
count: results.length,
|
|
144
|
+
messages: results.map(normalizeMessage),
|
|
145
|
+
note: "Search covers messages received by the bot since last getUpdates call. For full history search, use a Telegram client.",
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
export async function telegramSendMedia(args) {
|
|
149
|
+
const token = requireToken(args.bot_token);
|
|
150
|
+
const chatId = args.chat_id;
|
|
151
|
+
if (!chatId)
|
|
152
|
+
throw new Error("chat_id is required.");
|
|
153
|
+
const mediaType = String(args.media_type ?? "photo").toLowerCase();
|
|
154
|
+
const mediaUrl = String(args.media_url ?? "").trim();
|
|
155
|
+
if (!mediaUrl)
|
|
156
|
+
throw new Error("media_url is required (URL to the file).");
|
|
157
|
+
const supportedTypes = ["photo", "document", "audio", "video", "animation"];
|
|
158
|
+
if (!supportedTypes.includes(mediaType)) {
|
|
159
|
+
throw new Error(`Unsupported media_type "${mediaType}". Supported: ${supportedTypes.join(", ")}.`);
|
|
160
|
+
}
|
|
161
|
+
const params = {
|
|
162
|
+
chat_id: chatId,
|
|
163
|
+
[mediaType]: mediaUrl,
|
|
164
|
+
};
|
|
165
|
+
if (args.caption) {
|
|
166
|
+
params.caption = String(args.caption);
|
|
167
|
+
if (args.parse_mode)
|
|
168
|
+
params.parse_mode = args.parse_mode;
|
|
169
|
+
}
|
|
170
|
+
if (args.disable_notification === true) {
|
|
171
|
+
params.disable_notification = true;
|
|
172
|
+
}
|
|
173
|
+
const methodMap = {
|
|
174
|
+
photo: "sendPhoto",
|
|
175
|
+
document: "sendDocument",
|
|
176
|
+
audio: "sendAudio",
|
|
177
|
+
video: "sendVideo",
|
|
178
|
+
animation: "sendAnimation",
|
|
179
|
+
};
|
|
180
|
+
const msg = await telegramCall(token, methodMap[mediaType], params);
|
|
181
|
+
return {
|
|
182
|
+
success: true,
|
|
183
|
+
message_id: msg.message_id,
|
|
184
|
+
chat_id: msg.chat.id,
|
|
185
|
+
date: new Date(msg.date * 1000).toISOString(),
|
|
186
|
+
media_type: mediaType,
|
|
187
|
+
caption: msg.caption ?? null,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
export async function telegramGetUpdates(args) {
|
|
191
|
+
const token = requireToken(args.bot_token);
|
|
192
|
+
const limit = Math.min(100, Math.max(1, Number(args.limit ?? 20)));
|
|
193
|
+
const timeout = Math.min(30, Math.max(0, Number(args.timeout ?? 0)));
|
|
194
|
+
const offset = args.offset !== undefined ? Number(args.offset) : undefined;
|
|
195
|
+
const params = { limit, timeout };
|
|
196
|
+
if (offset !== undefined)
|
|
197
|
+
params.offset = offset;
|
|
198
|
+
// Filter to specific update types if requested
|
|
199
|
+
const allowedUpdates = args.allowed_updates;
|
|
200
|
+
if (Array.isArray(allowedUpdates) && allowedUpdates.length > 0) {
|
|
201
|
+
params.allowed_updates = allowedUpdates;
|
|
202
|
+
}
|
|
203
|
+
const updates = await telegramCall(token, "getUpdates", params);
|
|
204
|
+
const nextOffset = updates.length > 0 ? updates[updates.length - 1].update_id + 1 : offset;
|
|
205
|
+
const formatted = updates.map((u) => {
|
|
206
|
+
const msg = u.message ?? u.channel_post ?? u.edited_message ?? u.edited_channel_post;
|
|
207
|
+
return {
|
|
208
|
+
update_id: u.update_id,
|
|
209
|
+
type: u.message
|
|
210
|
+
? "message"
|
|
211
|
+
: u.channel_post
|
|
212
|
+
? "channel_post"
|
|
213
|
+
: u.edited_message
|
|
214
|
+
? "edited_message"
|
|
215
|
+
: u.edited_channel_post
|
|
216
|
+
? "edited_channel_post"
|
|
217
|
+
: "other",
|
|
218
|
+
message: msg ? normalizeMessage(msg) : null,
|
|
219
|
+
};
|
|
220
|
+
});
|
|
221
|
+
return {
|
|
222
|
+
count: updates.length,
|
|
223
|
+
next_offset: nextOffset,
|
|
224
|
+
updates: formatted,
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
export async function telegramManageChat(args) {
|
|
228
|
+
const token = requireToken(args.bot_token);
|
|
229
|
+
const action = String(args.action ?? "").trim();
|
|
230
|
+
const chatId = args.chat_id;
|
|
231
|
+
if (!chatId)
|
|
232
|
+
throw new Error("chat_id is required.");
|
|
233
|
+
const validActions = ["info", "members", "pin", "unpin"];
|
|
234
|
+
if (!action)
|
|
235
|
+
throw new Error(`action is required. Valid values: ${validActions.join(", ")}.`);
|
|
236
|
+
if (!validActions.includes(action)) {
|
|
237
|
+
throw new Error(`Unknown action "${action}". Valid values: ${validActions.join(", ")}.`);
|
|
238
|
+
}
|
|
239
|
+
if (action === "info") {
|
|
240
|
+
const chat = await telegramCall(token, "getChat", {
|
|
241
|
+
chat_id: chatId,
|
|
242
|
+
});
|
|
243
|
+
return {
|
|
244
|
+
id: chat.id,
|
|
245
|
+
type: chat.type,
|
|
246
|
+
title: chat.title ?? null,
|
|
247
|
+
username: chat.username ?? null,
|
|
248
|
+
first_name: chat.first_name ?? null,
|
|
249
|
+
description: chat.description ?? null,
|
|
250
|
+
invite_link: chat.invite_link ?? null,
|
|
251
|
+
member_count: chat.member_count ?? null,
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
if (action === "members") {
|
|
255
|
+
const members = await telegramCall(token, "getChatAdministrators", {
|
|
256
|
+
chat_id: chatId,
|
|
257
|
+
});
|
|
258
|
+
return {
|
|
259
|
+
count: members.length,
|
|
260
|
+
administrators: members.map((m) => ({
|
|
261
|
+
status: m.status,
|
|
262
|
+
user_id: m.user.id,
|
|
263
|
+
name: [m.user.first_name, m.user.last_name].filter(Boolean).join(" "),
|
|
264
|
+
username: m.user.username ?? null,
|
|
265
|
+
is_bot: m.user.is_bot,
|
|
266
|
+
})),
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
if (action === "pin") {
|
|
270
|
+
const messageId = Number(args.message_id);
|
|
271
|
+
if (!messageId)
|
|
272
|
+
throw new Error("message_id is required for pin action.");
|
|
273
|
+
const disableNotification = args.disable_notification === true;
|
|
274
|
+
await telegramCall(token, "pinChatMessage", {
|
|
275
|
+
chat_id: chatId,
|
|
276
|
+
message_id: messageId,
|
|
277
|
+
disable_notification: disableNotification,
|
|
278
|
+
});
|
|
279
|
+
return { success: true, action: "pin", message_id: messageId, chat_id: chatId };
|
|
280
|
+
}
|
|
281
|
+
if (action === "unpin") {
|
|
282
|
+
const messageId = args.message_id !== undefined ? Number(args.message_id) : undefined;
|
|
283
|
+
const params = { chat_id: chatId };
|
|
284
|
+
if (messageId !== undefined)
|
|
285
|
+
params.message_id = messageId;
|
|
286
|
+
await telegramCall(token, "unpinChatMessage", params);
|
|
287
|
+
return {
|
|
288
|
+
success: true,
|
|
289
|
+
action: "unpin",
|
|
290
|
+
message_id: messageId ?? "most recent pinned",
|
|
291
|
+
chat_id: chatId,
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
// Should not reach here
|
|
295
|
+
throw new Error(`Unhandled action: ${action}`);
|
|
296
|
+
}
|
|
297
|
+
//# sourceMappingURL=telegram-tool.js.map
|