telegram-notify-mcp 1.0.0 → 2.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/dist/index.js CHANGED
@@ -1,16 +1,21 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
3
  * telegram-notify-mcp — stdio MCP server for Telegram Bot API notifications.
4
- * Env: TELEGRAM_BOT_TOKEN (required for tool calls), TELEGRAM_CHAT_ID (optional default).
4
+ * Env: TELEGRAM_BOT_TOKEN (required for tool calls), TELEGRAM_CHAT_ID (optional default),
5
+ * TELEGRAM_CHAT_ALLOWLIST (optional inbound), TELEGRAM_NOTIFY_DATA_DIR (optional store path).
5
6
  * Starts cleanly without a token; tools fail with a clear error when invoked.
6
7
  * Public release is env-only — no disk/secret-store token loading.
8
+ * Phase 2: outbound mapping + inbound pending queue (host must poll + SendToAgent + ack).
9
+ * 2.1: inline approval buttons (Accept / Decline / Custom message) via callback_query.
7
10
  */
8
11
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
9
12
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
10
13
  import { z } from 'zod';
11
- import { TelegramApiError, TelegramClient, formatNotifyMessage, getDefaultChatId, } from './telegram.js';
14
+ import { TelegramApiError, TelegramClient, buildApprovalKeyboard, formatNotifyMessage, generateApprovalToken, getDefaultChatId, } from './telegram.js';
15
+ import { LocalStore } from './store.js';
16
+ import { formatAgentFooter, formatNotifyWithFooter, processUpdates, } from './routing.js';
12
17
  const SERVER_NAME = 'telegram-notify-mcp';
13
- const SERVER_VERSION = '1.0.0';
18
+ const SERVER_VERSION = '2.1.0';
14
19
  function textResult(text, isError = false) {
15
20
  return {
16
21
  content: [{ type: 'text', text }],
@@ -27,6 +32,59 @@ function errorResult(err) {
27
32
  function getClient() {
28
33
  return new TelegramClient(process.env.TELEGRAM_BOT_TOKEN);
29
34
  }
35
+ function getStore() {
36
+ return new LocalStore();
37
+ }
38
+ async function handleCallbackActions(client, store, actions) {
39
+ let answered = 0;
40
+ let custom_prompts_sent = 0;
41
+ for (const action of actions) {
42
+ if (action.kind === 'answer') {
43
+ try {
44
+ await client.answerCallbackQuery({
45
+ callback_query_id: action.callback_query_id,
46
+ text: action.text,
47
+ });
48
+ answered += 1;
49
+ }
50
+ catch {
51
+ // Best-effort: spinner may already be cleared
52
+ }
53
+ continue;
54
+ }
55
+ // custom_prompt: answer + ForceReply + putMapping so next reply routes to agent
56
+ try {
57
+ await client.answerCallbackQuery({
58
+ callback_query_id: action.callback_query_id,
59
+ text: 'Send your custom message',
60
+ });
61
+ answered += 1;
62
+ }
63
+ catch {
64
+ /* ignore */
65
+ }
66
+ try {
67
+ const session = action.session;
68
+ const prompt = await client.sendMessage({
69
+ chat_id: session.chat_id,
70
+ text: 'Send your custom message as a reply to this prompt:',
71
+ reply_to_message_id: session.telegram_message_id,
72
+ reply_markup: { force_reply: true },
73
+ });
74
+ store.putMapping({
75
+ chat_id: String(prompt.chat.id),
76
+ telegram_message_id: prompt.message_id,
77
+ source_agent_id: session.source_agent_id,
78
+ source_agent_name: session.source_agent_name,
79
+ });
80
+ custom_prompts_sent += 1;
81
+ }
82
+ catch {
83
+ /* ignore send failures; poll summary still reports custom_prompts */
84
+ }
85
+ }
86
+ return { answered, custom_prompts_sent };
87
+ }
30
88
  function createServer() {
31
89
  const server = new McpServer({
32
90
  name: SERVER_NAME,
@@ -46,7 +104,7 @@ function createServer() {
46
104
  return errorResult(err);
47
105
  }
48
106
  });
49
- server.tool('telegram_send_message', 'Send a text message via the Bot API. chat_id is optional when TELEGRAM_CHAT_ID is set.', {
107
+ server.tool('telegram_send_message', 'Send a text message via the Bot API. chat_id is optional when TELEGRAM_CHAT_ID is set. Optional source_agent_id appends footer and persists reply mapping. Optional approval_buttons attach Accept/Decline/Custom keyboard.', {
50
108
  text: z.string().min(1).describe('Message text to send'),
51
109
  chat_id: z
52
110
  .union([z.string(), z.number()])
@@ -56,52 +114,169 @@ function createServer() {
56
114
  .enum(['Markdown', 'MarkdownV2', 'HTML'])
57
115
  .optional()
58
116
  .describe('Optional Telegram parse_mode'),
59
- }, async ({ text, chat_id, parse_mode }) => {
117
+ source_agent_id: z
118
+ .string()
119
+ .min(1)
120
+ .optional()
121
+ .describe('Originating agent id — when set, append footer and store mapping for replies'),
122
+ source_agent_name: z
123
+ .string()
124
+ .optional()
125
+ .describe('Optional display name for footer'),
126
+ approval_buttons: z
127
+ .boolean()
128
+ .optional()
129
+ .describe('Attach Accept/Decline/Custom inline keyboard (requires source_agent_id; default false)'),
130
+ accept_command: z
131
+ .string()
132
+ .optional()
133
+ .describe('Text enqueued on Accept (default "Accept")'),
134
+ decline_command: z
135
+ .string()
136
+ .optional()
137
+ .describe('Text enqueued on Decline (default "Decline")'),
138
+ }, async ({ text, chat_id, parse_mode, source_agent_id, source_agent_name, approval_buttons, accept_command, decline_command, }) => {
60
139
  try {
61
140
  const chatId = getDefaultChatId(chat_id);
141
+ let outbound = text;
142
+ if (source_agent_id) {
143
+ outbound = text + formatAgentFooter(source_agent_id, source_agent_name);
144
+ }
145
+ const wantButtons = approval_buttons === true && !!source_agent_id;
146
+ const acceptCmd = (accept_command ?? 'Accept').trim() || 'Accept';
147
+ const declineCmd = (decline_command ?? 'Decline').trim() || 'Decline';
148
+ let token;
149
+ let reply_markup = undefined;
150
+ if (wantButtons) {
151
+ token = generateApprovalToken();
152
+ reply_markup = buildApprovalKeyboard(token);
153
+ }
62
154
  const msg = await getClient().sendMessage({
63
155
  chat_id: chatId,
64
- text,
156
+ text: outbound,
65
157
  parse_mode,
158
+ reply_markup,
66
159
  });
160
+ let mapped = false;
161
+ if (source_agent_id) {
162
+ getStore().putMapping({
163
+ chat_id: String(msg.chat.id),
164
+ telegram_message_id: msg.message_id,
165
+ source_agent_id,
166
+ source_agent_name: source_agent_name || undefined,
167
+ accept_command: wantButtons ? acceptCmd : undefined,
168
+ decline_command: wantButtons ? declineCmd : undefined,
169
+ });
170
+ mapped = true;
171
+ }
172
+ if (wantButtons && token && source_agent_id) {
173
+ getStore().putApproval({
174
+ token,
175
+ chat_id: String(msg.chat.id),
176
+ telegram_message_id: msg.message_id,
177
+ source_agent_id,
178
+ source_agent_name: source_agent_name || undefined,
179
+ accept_command: acceptCmd,
180
+ decline_command: declineCmd,
181
+ });
182
+ }
67
183
  return textResult(JSON.stringify({
68
184
  ok: true,
69
185
  message_id: msg.message_id,
70
186
  chat_id: msg.chat.id,
71
- text: msg.text ?? text,
187
+ text: msg.text ?? outbound,
188
+ mapped,
189
+ source_agent_id: source_agent_id ?? null,
190
+ approval_buttons: wantButtons,
191
+ approval_token: token ?? null,
72
192
  }, null, 2));
73
193
  }
74
194
  catch (err) {
75
195
  return errorResult(err);
76
196
  }
77
197
  });
78
- server.tool('telegram_notify', 'Send a short completion-style notification (title + body) to the default or explicit chat.', {
198
+ server.tool('telegram_notify', 'Send a short completion-style notification (title + body) with required source_agent_id. Appends agent footer and persists message→agent mapping. Optional approval_buttons attach Accept/Decline/Custom keyboard (default false).', {
79
199
  body: z.string().min(1).describe('Notification body / details'),
80
200
  title: z.string().optional().describe('Optional short title (e.g. "Build finished")'),
81
201
  chat_id: z
82
202
  .union([z.string(), z.number()])
83
203
  .optional()
84
204
  .describe('Telegram chat id (falls back to TELEGRAM_CHAT_ID)'),
85
- }, async ({ body, title, chat_id }) => {
205
+ source_agent_id: z
206
+ .string()
207
+ .min(1)
208
+ .describe('Required stable id of the originating agent (for reply routing)'),
209
+ source_agent_name: z
210
+ .string()
211
+ .optional()
212
+ .describe('Optional short human label for the footer'),
213
+ approval_buttons: z
214
+ .boolean()
215
+ .optional()
216
+ .describe('Attach Accept/Decline/Custom inline keyboard (default false; opt-in)'),
217
+ accept_command: z
218
+ .string()
219
+ .optional()
220
+ .describe('Text enqueued as pending command when Accept is pressed (e.g. "asmj11 بفرست"). Default: "Accept"'),
221
+ decline_command: z
222
+ .string()
223
+ .optional()
224
+ .describe('Text enqueued when Decline is pressed. Default: "Decline"'),
225
+ }, async ({ body, title, chat_id, source_agent_id, source_agent_name, approval_buttons, accept_command, decline_command, }) => {
86
226
  try {
87
227
  const chatId = getDefaultChatId(chat_id);
88
- const text = formatNotifyMessage(title, body);
228
+ const text = formatNotifyWithFooter(title, body, source_agent_id, source_agent_name, formatNotifyMessage);
229
+ const wantButtons = approval_buttons === true;
230
+ const acceptCmd = (accept_command ?? 'Accept').trim() || 'Accept';
231
+ const declineCmd = (decline_command ?? 'Decline').trim() || 'Decline';
232
+ let token;
233
+ let reply_markup = undefined;
234
+ if (wantButtons) {
235
+ token = generateApprovalToken();
236
+ reply_markup = buildApprovalKeyboard(token);
237
+ }
89
238
  const msg = await getClient().sendMessage({
90
239
  chat_id: chatId,
91
240
  text,
241
+ reply_markup,
242
+ });
243
+ const store = getStore();
244
+ store.putMapping({
245
+ chat_id: String(msg.chat.id),
246
+ telegram_message_id: msg.message_id,
247
+ source_agent_id,
248
+ source_agent_name: source_agent_name || undefined,
249
+ accept_command: wantButtons ? acceptCmd : undefined,
250
+ decline_command: wantButtons ? declineCmd : undefined,
92
251
  });
252
+ if (wantButtons && token) {
253
+ store.putApproval({
254
+ token,
255
+ chat_id: String(msg.chat.id),
256
+ telegram_message_id: msg.message_id,
257
+ source_agent_id,
258
+ source_agent_name: source_agent_name || undefined,
259
+ accept_command: acceptCmd,
260
+ decline_command: declineCmd,
261
+ });
262
+ }
93
263
  return textResult(JSON.stringify({
94
264
  ok: true,
95
265
  message_id: msg.message_id,
96
266
  chat_id: msg.chat.id,
97
267
  text,
268
+ mapped: true,
269
+ source_agent_id,
270
+ source_agent_name: source_agent_name ?? null,
271
+ approval_buttons: wantButtons,
272
+ approval_token: token ?? null,
98
273
  }, null, 2));
99
274
  }
100
275
  catch (err) {
101
276
  return errorResult(err);
102
277
  }
103
278
  });
104
- server.tool('telegram_get_updates', 'Fetch recent bot updates so you can discover chat_id after messaging the bot with /start.', {
279
+ server.tool('telegram_get_updates', 'Fetch recent bot updates so you can discover chat_id after messaging the bot with /start. Does not enqueue pending commands (use telegram_poll_inbound for that).', {
105
280
  limit: z
106
281
  .number()
107
282
  .int()
@@ -114,7 +289,7 @@ function createServer() {
114
289
  const updates = await getClient().getUpdates({ limit: limit ?? 10 });
115
290
  const chats = new Map();
116
291
  for (const u of updates) {
117
- const m = u.message ?? u.edited_message ?? u.channel_post;
292
+ const m = u.message ?? u.edited_message ?? u.channel_post ?? u.callback_query?.message;
118
293
  if (!m?.chat)
119
294
  continue;
120
295
  const c = m.chat;
@@ -128,12 +303,20 @@ function createServer() {
128
303
  update_count: updates.length,
129
304
  discovered_chats: [...chats.values()],
130
305
  updates: updates.map((u) => {
131
- const m = u.message ?? u.edited_message ?? u.channel_post;
306
+ const m = u.message ??
307
+ u.edited_message ??
308
+ u.channel_post ??
309
+ u.callback_query?.message;
132
310
  return {
133
311
  update_id: u.update_id,
134
312
  chat_id: m?.chat?.id ?? null,
135
- from: m?.from?.username ?? m?.from?.first_name ?? null,
313
+ from: u.callback_query?.from?.username ??
314
+ u.callback_query?.from?.first_name ??
315
+ m?.from?.username ??
316
+ m?.from?.first_name ??
317
+ null,
136
318
  text: m?.text ?? null,
319
+ callback_data: u.callback_query?.data ?? null,
137
320
  };
138
321
  }),
139
322
  }, null, 2));
@@ -142,6 +325,93 @@ function createServer() {
142
325
  return errorResult(err);
143
326
  }
144
327
  });
328
+ server.tool('telegram_poll_inbound', 'Poll Telegram getUpdates, allowlist-filter, route replies/mappings, /to commands, and approval button callbacks into the pending queue. Answers callback_query; Custom sends a ForceReply prompt. Host must then list + SendToAgent + ack.', {
329
+ limit: z
330
+ .number()
331
+ .int()
332
+ .min(1)
333
+ .max(100)
334
+ .optional()
335
+ .describe('Max updates to fetch (default 50)'),
336
+ timeout: z
337
+ .number()
338
+ .int()
339
+ .min(0)
340
+ .max(50)
341
+ .optional()
342
+ .describe('Long-poll timeout seconds (default 0)'),
343
+ }, async ({ limit, timeout }) => {
344
+ try {
345
+ const store = getStore();
346
+ const client = getClient();
347
+ const offset = store.getUpdateOffset();
348
+ const updates = await client.getUpdates({
349
+ limit: limit ?? 50,
350
+ timeout: timeout ?? 0,
351
+ offset,
352
+ allowed_updates: ['message', 'edited_message', 'callback_query'],
353
+ });
354
+ const summary = processUpdates(store, updates);
355
+ if (summary.next_offset !== undefined) {
356
+ store.setUpdateOffset(summary.next_offset);
357
+ }
358
+ const cb = await handleCallbackActions(client, store, summary.callback_actions);
359
+ const { callback_actions: _actions, ...publicSummary } = summary;
360
+ return textResult(JSON.stringify({
361
+ ok: true,
362
+ ...publicSummary,
363
+ callbacks_answered: cb.answered,
364
+ custom_prompts_sent: cb.custom_prompts_sent,
365
+ note: 'Unroutable messages (no reply-to mapping and no /to <agent_id> …) are ignored. Approval Accept/Decline enqueue accept_command/decline_command. Custom prompts a ForceReply. Host should call telegram_list_pending_commands, deliver via SendToAgent, then telegram_ack_command.',
366
+ }, null, 2));
367
+ }
368
+ catch (err) {
369
+ return errorResult(err);
370
+ }
371
+ });
372
+ server.tool('telegram_list_pending_commands', 'List pending inbound commands (status=pending). Optional filter by source_agent_id. Host delivers each then calls telegram_ack_command.', {
373
+ source_agent_id: z
374
+ .string()
375
+ .optional()
376
+ .describe('If set, only list commands for this agent'),
377
+ }, async ({ source_agent_id }) => {
378
+ try {
379
+ const store = getStore();
380
+ const commands = store.listPending(source_agent_id ? { source_agent_id } : undefined);
381
+ return textResult(JSON.stringify({
382
+ ok: true,
383
+ count: commands.length,
384
+ commands,
385
+ }, null, 2));
386
+ }
387
+ catch (err) {
388
+ return errorResult(err);
389
+ }
390
+ });
391
+ server.tool('telegram_ack_command', 'Acknowledge (delete) a pending command by id after the host has delivered it to the target agent. Idempotent: unknown id returns ok=false.', {
392
+ command_id: z.string().min(1).describe('Pending command id from list/poll'),
393
+ }, async ({ command_id }) => {
394
+ try {
395
+ const store = getStore();
396
+ const cmd = store.ackCommand(command_id);
397
+ if (!cmd) {
398
+ return textResult(JSON.stringify({
399
+ ok: false,
400
+ error: 'unknown_command_id',
401
+ command_id,
402
+ }), true);
403
+ }
404
+ return textResult(JSON.stringify({
405
+ ok: true,
406
+ acked: true,
407
+ command_id: cmd.id,
408
+ source_agent_id: cmd.source_agent_id,
409
+ }), false);
410
+ }
411
+ catch (err) {
412
+ return errorResult(err);
413
+ }
414
+ });
145
415
  return server;
146
416
  }
147
417
  async function main() {
@@ -149,7 +419,9 @@ async function main() {
149
419
  const transport = new StdioServerTransport();
150
420
  await server.connect(transport);
151
421
  console.error(`${SERVER_NAME} v${SERVER_VERSION} running on stdio` +
152
- (process.env.TELEGRAM_BOT_TOKEN ? '' : ' (TELEGRAM_BOT_TOKEN not set — tools will error until configured)'));
422
+ (process.env.TELEGRAM_BOT_TOKEN
423
+ ? ''
424
+ : ' (TELEGRAM_BOT_TOKEN not set — tools will error until configured)'));
153
425
  }
154
426
  main().catch((err) => {
155
427
  console.error('Fatal:', err);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Inbound routing: allowlist, reply→mapping, /to <agent_id> fallback, approval callbacks.
3
+ * Unroutable allowlisted messages are ignored (counted); never executed as shell.
4
+ */
5
+ import type { ApprovalSession, PendingCommand, LocalStore } from './store.js';
6
+ import type { TelegramCallbackQuery, TelegramMessage, TelegramUpdate } from './telegram.js';
7
+ export interface AllowlistResult {
8
+ allowed: boolean;
9
+ chatId: string;
10
+ }
11
+ /**
12
+ * Allowed chats from TELEGRAM_CHAT_ALLOWLIST (comma-separated) or TELEGRAM_CHAT_ID.
13
+ * If neither is set, no chat is allowed for inbound commands.
14
+ */
15
+ export declare function getAllowedChatIds(env?: NodeJS.ProcessEnv): Set<string>;
16
+ export declare function isChatAllowed(chatId: string | number, env?: NodeJS.ProcessEnv): boolean;
17
+ /** Parse `/to <agent_id> <rest…>` — agent_id is the first whitespace-delimited token after /to. */
18
+ export declare function parseToAgentCommand(text: string): {
19
+ agentId: string;
20
+ body: string;
21
+ } | undefined;
22
+ export declare function truncateAgentLabel(idOrName: string, maxLen?: number): string;
23
+ /**
24
+ * Footer appended to outbound notify text (UX only; routing uses reply_to mapping).
25
+ */
26
+ export declare function formatAgentFooter(sourceAgentId: string, sourceAgentName?: string): string;
27
+ export declare function formatNotifyWithFooter(title: string | undefined, body: string, sourceAgentId: string, sourceAgentName?: string, formatBase?: (title: string | undefined, body: string) => string): string;
28
+ export type CallbackAction = 'ok' | 'no' | 'cu';
29
+ /** Parse callback_data: ok:TOKEN | no:TOKEN | cu:TOKEN */
30
+ export declare function parseApprovalCallbackData(data: string | undefined): {
31
+ action: CallbackAction;
32
+ token: string;
33
+ } | undefined;
34
+ export type InboundDisposition = {
35
+ kind: 'enqueued';
36
+ command: PendingCommand;
37
+ via: 'reply' | 'to_command' | 'approval';
38
+ } | {
39
+ kind: 'ignored_not_allowlisted';
40
+ } | {
41
+ kind: 'ignored_unroutable';
42
+ } | {
43
+ kind: 'ignored_no_text';
44
+ } | {
45
+ kind: 'custom_prompt';
46
+ session: ApprovalSession;
47
+ callback_query_id: string;
48
+ via: 'approval';
49
+ } | {
50
+ kind: 'ignored_unknown_callback';
51
+ } | {
52
+ kind: 'callback_answered_only';
53
+ callback_query_id: string;
54
+ };
55
+ export declare function routeInboundMessage(store: LocalStore, message: TelegramMessage, env?: NodeJS.ProcessEnv): InboundDisposition;
56
+ /**
57
+ * Route an inline-keyboard callback_query into pending queue or custom_prompt disposition.
58
+ */
59
+ export declare function routeCallbackQuery(store: LocalStore, callback: TelegramCallbackQuery, env?: NodeJS.ProcessEnv): InboundDisposition;
60
+ export interface PollSummary {
61
+ updates_seen: number;
62
+ enqueued: number;
63
+ ignored_not_allowlisted: number;
64
+ ignored_unroutable: number;
65
+ ignored_no_text: number;
66
+ ignored_unknown_callback: number;
67
+ custom_prompts: number;
68
+ commands: PendingCommand[];
69
+ /** Callbacks that need answerCallbackQuery + optional ForceReply follow-up. */
70
+ callback_actions: Array<{
71
+ kind: 'answer';
72
+ callback_query_id: string;
73
+ text?: string;
74
+ } | {
75
+ kind: 'custom_prompt';
76
+ callback_query_id: string;
77
+ session: ApprovalSession;
78
+ }>;
79
+ next_offset?: number;
80
+ }
81
+ export declare function processUpdates(store: LocalStore, updates: TelegramUpdate[], env?: NodeJS.ProcessEnv): PollSummary;