telegram-mcp-tools 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/.env.example +3 -0
- package/LICENSE +21 -0
- package/README.md +153 -0
- package/dist/auth.d.ts +2 -0
- package/dist/auth.js +33 -0
- package/dist/auth.js.map +1 -0
- package/dist/config.d.ts +21 -0
- package/dist/config.js +44 -0
- package/dist/config.js.map +1 -0
- package/dist/env-file.d.ts +1 -0
- package/dist/env-file.js +32 -0
- package/dist/env-file.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +283 -0
- package/dist/index.js.map +1 -0
- package/dist/telegram/chats.d.ts +3 -0
- package/dist/telegram/chats.js +10 -0
- package/dist/telegram/chats.js.map +1 -0
- package/dist/telegram/client.d.ts +2 -0
- package/dist/telegram/client.js +14 -0
- package/dist/telegram/client.js.map +1 -0
- package/dist/telegram/dialogs.d.ts +3 -0
- package/dist/telegram/dialogs.js +26 -0
- package/dist/telegram/dialogs.js.map +1 -0
- package/dist/telegram/folders.d.ts +4 -0
- package/dist/telegram/folders.js +131 -0
- package/dist/telegram/folders.js.map +1 -0
- package/dist/telegram/index.d.ts +10 -0
- package/dist/telegram/index.js +9 -0
- package/dist/telegram/index.js.map +1 -0
- package/dist/telegram/messages.d.ts +5 -0
- package/dist/telegram/messages.js +64 -0
- package/dist/telegram/messages.js.map +1 -0
- package/dist/telegram/peers.d.ts +11 -0
- package/dist/telegram/peers.js +79 -0
- package/dist/telegram/peers.js.map +1 -0
- package/dist/telegram/send.d.ts +12 -0
- package/dist/telegram/send.js +56 -0
- package/dist/telegram/send.js.map +1 -0
- package/dist/telegram/types.d.ts +49 -0
- package/dist/telegram/types.js +2 -0
- package/dist/telegram/types.js.map +1 -0
- package/dist/telegram/urls.d.ts +1 -0
- package/dist/telegram/urls.js +8 -0
- package/dist/telegram/urls.js.map +1 -0
- package/dist/telegram-client.d.ts +1 -0
- package/dist/telegram-client.js +2 -0
- package/dist/telegram-client.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { MemoryStorage, TelegramClient } from "@mtcute/node";
|
|
2
|
+
let client = null;
|
|
3
|
+
export async function getTelegramClient(apiId, apiHash, session) {
|
|
4
|
+
if (!client) {
|
|
5
|
+
client = new TelegramClient({
|
|
6
|
+
apiId,
|
|
7
|
+
apiHash,
|
|
8
|
+
storage: new MemoryStorage(),
|
|
9
|
+
});
|
|
10
|
+
await client.importSession(session, true);
|
|
11
|
+
}
|
|
12
|
+
return client;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/telegram/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE7D,IAAI,MAAM,GAA0B,IAAI,CAAC;AAEzC,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,KAAa,EACb,OAAe,EACf,OAAe;IAEf,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,GAAG,IAAI,cAAc,CAAC;YAC1B,KAAK;YACL,OAAO;YACP,OAAO,EAAE,IAAI,aAAa,EAAE;SAC7B,CAAC,CAAC;QACH,MAAM,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { getDialogType, getPeerId, getPeerName, getPeerUsername, normalizeFolderRef, } from "./peers.js";
|
|
2
|
+
function mapDialogToInfo(peer, unreadCount) {
|
|
3
|
+
const info = {
|
|
4
|
+
id: getPeerId(peer),
|
|
5
|
+
name: getPeerName(peer),
|
|
6
|
+
type: getDialogType(peer),
|
|
7
|
+
unreadCount,
|
|
8
|
+
};
|
|
9
|
+
const username = getPeerUsername(peer);
|
|
10
|
+
if (username) {
|
|
11
|
+
info.username = username;
|
|
12
|
+
}
|
|
13
|
+
return info;
|
|
14
|
+
}
|
|
15
|
+
export async function fetchDialogs(telegramClient, limit, folder) {
|
|
16
|
+
const dialogs = [];
|
|
17
|
+
const iterParams = { limit, archived: "keep" };
|
|
18
|
+
if (folder !== undefined) {
|
|
19
|
+
iterParams.folder = normalizeFolderRef(folder);
|
|
20
|
+
}
|
|
21
|
+
for await (const dialog of telegramClient.iterDialogs(iterParams)) {
|
|
22
|
+
dialogs.push(mapDialogToInfo(dialog.peer, dialog.unreadCount));
|
|
23
|
+
}
|
|
24
|
+
return dialogs;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=dialogs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dialogs.js","sourceRoot":"","sources":["../../src/telegram/dialogs.ts"],"names":[],"mappings":"AACA,OAAO,EACL,aAAa,EACb,SAAS,EACT,WAAW,EACX,eAAe,EACf,kBAAkB,GACnB,MAAM,YAAY,CAAC;AAGpB,SAAS,eAAe,CAAC,IAAU,EAAE,WAAmB;IACtD,MAAM,IAAI,GAAe;QACvB,EAAE,EAAE,SAAS,CAAC,IAAI,CAAC;QACnB,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC;QACvB,IAAI,EAAE,aAAa,CAAC,IAAI,CAAC;QACzB,WAAW;KACZ,CAAC;IAEF,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,cAA8B,EAC9B,KAAa,EACb,MAAkB;IAElB,MAAM,OAAO,GAAiB,EAAE,CAAC;IACjC,MAAM,UAAU,GAIZ,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IAEhC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,UAAU,CAAC,MAAM,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IACjD,CAAC;IAED,IAAI,KAAK,EAAE,MAAM,MAAM,IAAI,cAAc,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC;QAClE,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;IACjE,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { TelegramClient } from "@mtcute/node";
|
|
2
|
+
import type { CreateFolderParams, FolderInfo } from "./types.js";
|
|
3
|
+
export declare function fetchFolders(telegramClient: TelegramClient): Promise<FolderInfo[]>;
|
|
4
|
+
export declare function createTelegramFolder(telegramClient: TelegramClient, params: CreateFolderParams): Promise<FolderInfo>;
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { resolveInputPeers } from "./peers.js";
|
|
2
|
+
function mapDialogFilter(filter) {
|
|
3
|
+
if (filter._ === "dialogFilterDefault") {
|
|
4
|
+
return {
|
|
5
|
+
id: 0,
|
|
6
|
+
name: "All chats",
|
|
7
|
+
type: "default",
|
|
8
|
+
pinnedCount: 0,
|
|
9
|
+
includedPeersCount: 0,
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
if (filter._ === "dialogFilterChatlist") {
|
|
13
|
+
const info = {
|
|
14
|
+
id: filter.id,
|
|
15
|
+
name: filter.title.text,
|
|
16
|
+
type: "chatlist",
|
|
17
|
+
pinnedCount: filter.pinnedPeers.length,
|
|
18
|
+
includedPeersCount: filter.includePeers.length,
|
|
19
|
+
};
|
|
20
|
+
if (filter.emoticon) {
|
|
21
|
+
info.emoticon = filter.emoticon;
|
|
22
|
+
}
|
|
23
|
+
if (filter.color !== undefined) {
|
|
24
|
+
info.color = filter.color;
|
|
25
|
+
}
|
|
26
|
+
return info;
|
|
27
|
+
}
|
|
28
|
+
if (filter._ !== "dialogFilter") {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
const includeAll = {};
|
|
32
|
+
if (filter.contacts) {
|
|
33
|
+
includeAll.contacts = true;
|
|
34
|
+
}
|
|
35
|
+
if (filter.nonContacts) {
|
|
36
|
+
includeAll.nonContacts = true;
|
|
37
|
+
}
|
|
38
|
+
if (filter.groups) {
|
|
39
|
+
includeAll.groups = true;
|
|
40
|
+
}
|
|
41
|
+
if (filter.broadcasts) {
|
|
42
|
+
includeAll.broadcasts = true;
|
|
43
|
+
}
|
|
44
|
+
if (filter.bots) {
|
|
45
|
+
includeAll.bots = true;
|
|
46
|
+
}
|
|
47
|
+
const exclude = {};
|
|
48
|
+
if (filter.excludeMuted) {
|
|
49
|
+
exclude.muted = true;
|
|
50
|
+
}
|
|
51
|
+
if (filter.excludeRead) {
|
|
52
|
+
exclude.read = true;
|
|
53
|
+
}
|
|
54
|
+
if (filter.excludeArchived) {
|
|
55
|
+
exclude.archived = true;
|
|
56
|
+
}
|
|
57
|
+
const info = {
|
|
58
|
+
id: filter.id,
|
|
59
|
+
name: filter.title.text,
|
|
60
|
+
type: "custom",
|
|
61
|
+
pinnedCount: filter.pinnedPeers.length,
|
|
62
|
+
includedPeersCount: filter.includePeers.length,
|
|
63
|
+
excludedPeersCount: filter.excludePeers.length,
|
|
64
|
+
};
|
|
65
|
+
if (filter.emoticon) {
|
|
66
|
+
info.emoticon = filter.emoticon;
|
|
67
|
+
}
|
|
68
|
+
if (filter.color !== undefined) {
|
|
69
|
+
info.color = filter.color;
|
|
70
|
+
}
|
|
71
|
+
if (Object.keys(includeAll).length > 0) {
|
|
72
|
+
info.includeAll = includeAll;
|
|
73
|
+
}
|
|
74
|
+
if (Object.keys(exclude).length > 0) {
|
|
75
|
+
info.exclude = exclude;
|
|
76
|
+
}
|
|
77
|
+
return info;
|
|
78
|
+
}
|
|
79
|
+
export async function fetchFolders(telegramClient) {
|
|
80
|
+
const { filters } = await telegramClient.getFolders();
|
|
81
|
+
return filters
|
|
82
|
+
.map((filter) => mapDialogFilter(filter))
|
|
83
|
+
.filter((folder) => folder !== null);
|
|
84
|
+
}
|
|
85
|
+
export async function createTelegramFolder(telegramClient, params) {
|
|
86
|
+
const includePeers = params.includeChannels?.length
|
|
87
|
+
? await resolveInputPeers(telegramClient, params.includeChannels)
|
|
88
|
+
: [];
|
|
89
|
+
const excludePeers = params.excludeChannels?.length
|
|
90
|
+
? await resolveInputPeers(telegramClient, params.excludeChannels)
|
|
91
|
+
: [];
|
|
92
|
+
const folderParams = {
|
|
93
|
+
title: { _: "textWithEntities", text: params.name, entities: [] },
|
|
94
|
+
includePeers,
|
|
95
|
+
excludePeers,
|
|
96
|
+
};
|
|
97
|
+
if (params.emoticon) {
|
|
98
|
+
folderParams.emoticon = params.emoticon;
|
|
99
|
+
}
|
|
100
|
+
if (params.includeAll?.contacts) {
|
|
101
|
+
folderParams.contacts = true;
|
|
102
|
+
}
|
|
103
|
+
if (params.includeAll?.nonContacts) {
|
|
104
|
+
folderParams.nonContacts = true;
|
|
105
|
+
}
|
|
106
|
+
if (params.includeAll?.groups) {
|
|
107
|
+
folderParams.groups = true;
|
|
108
|
+
}
|
|
109
|
+
if (params.includeAll?.broadcasts) {
|
|
110
|
+
folderParams.broadcasts = true;
|
|
111
|
+
}
|
|
112
|
+
if (params.includeAll?.bots) {
|
|
113
|
+
folderParams.bots = true;
|
|
114
|
+
}
|
|
115
|
+
if (params.exclude?.muted) {
|
|
116
|
+
folderParams.excludeMuted = true;
|
|
117
|
+
}
|
|
118
|
+
if (params.exclude?.read) {
|
|
119
|
+
folderParams.excludeRead = true;
|
|
120
|
+
}
|
|
121
|
+
if (params.exclude?.archived) {
|
|
122
|
+
folderParams.excludeArchived = true;
|
|
123
|
+
}
|
|
124
|
+
const created = await telegramClient.createFolder(folderParams);
|
|
125
|
+
const mapped = mapDialogFilter(created);
|
|
126
|
+
if (!mapped) {
|
|
127
|
+
throw new Error("Failed to map created folder");
|
|
128
|
+
}
|
|
129
|
+
return mapped;
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=folders.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"folders.js","sourceRoot":"","sources":["../../src/telegram/folders.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { archiveChats, unarchiveChats } from "./chats.js";
|
|
2
|
+
export { getTelegramClient } from "./client.js";
|
|
3
|
+
export { createTelegramFolder, fetchFolders } from "./folders.js";
|
|
4
|
+
export { fetchDialogs } from "./dialogs.js";
|
|
5
|
+
export { fetchMessages, fetchRecentFromChannels, fetchRecentFromFolder, } from "./messages.js";
|
|
6
|
+
export { sendTelegramMessage } from "./send.js";
|
|
7
|
+
export { getDialogType, getPeerId, getPeerName, getPeerUsername, normalizeChannelRef, normalizeFolderRef, } from "./peers.js";
|
|
8
|
+
export { buildTelegramPostUrl } from "./urls.js";
|
|
9
|
+
export type { CreateFolderParams, DialogInfo, DialogType, FolderInfo, FolderRef, FolderType, MessageInfo, } from "./types.js";
|
|
10
|
+
export type { MessageFormat, SendMessageOptions, SendMessageResult } from "./send.js";
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { archiveChats, unarchiveChats } from "./chats.js";
|
|
2
|
+
export { getTelegramClient } from "./client.js";
|
|
3
|
+
export { createTelegramFolder, fetchFolders } from "./folders.js";
|
|
4
|
+
export { fetchDialogs } from "./dialogs.js";
|
|
5
|
+
export { fetchMessages, fetchRecentFromChannels, fetchRecentFromFolder, } from "./messages.js";
|
|
6
|
+
export { sendTelegramMessage } from "./send.js";
|
|
7
|
+
export { getDialogType, getPeerId, getPeerName, getPeerUsername, normalizeChannelRef, normalizeFolderRef, } from "./peers.js";
|
|
8
|
+
export { buildTelegramPostUrl } from "./urls.js";
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/telegram/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EACL,aAAa,EACb,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EACL,aAAa,EACb,SAAS,EACT,WAAW,EACX,eAAe,EACf,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { TelegramClient } from "@mtcute/node";
|
|
2
|
+
import type { FolderRef, MessageInfo } from "./types.js";
|
|
3
|
+
export declare function fetchMessages(telegramClient: TelegramClient, channelId: string, limit: number, sinceHours?: number): Promise<MessageInfo[]>;
|
|
4
|
+
export declare function fetchRecentFromChannels(telegramClient: TelegramClient, channelIds: string[], sinceHours: number, limitPerChannel: number): Promise<MessageInfo[]>;
|
|
5
|
+
export declare function fetchRecentFromFolder(telegramClient: TelegramClient, folder: FolderRef, sinceHours: number, limitPerChannel: number): Promise<MessageInfo[]>;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { fetchDialogs } from "./dialogs.js";
|
|
2
|
+
import { getPeerId, getPeerName, getPeerUsername, normalizeChannelRef, resolvePeer, } from "./peers.js";
|
|
3
|
+
import { buildTelegramPostUrl } from "./urls.js";
|
|
4
|
+
function hasTextContent(text) {
|
|
5
|
+
return text.trim().length > 0;
|
|
6
|
+
}
|
|
7
|
+
function messageMatchesSinceHours(date, sinceHours) {
|
|
8
|
+
if (sinceHours === undefined) {
|
|
9
|
+
return true;
|
|
10
|
+
}
|
|
11
|
+
const minDate = new Date(Date.now() - sinceHours * 3600 * 1000);
|
|
12
|
+
return date >= minDate;
|
|
13
|
+
}
|
|
14
|
+
function mapMessage(message, channelName, channelId, username) {
|
|
15
|
+
const info = {
|
|
16
|
+
id: message.id,
|
|
17
|
+
date: message.date.toISOString(),
|
|
18
|
+
text: message.text,
|
|
19
|
+
channelName,
|
|
20
|
+
channelId,
|
|
21
|
+
url: buildTelegramPostUrl(message.id, channelId, username),
|
|
22
|
+
};
|
|
23
|
+
if (message.views !== null) {
|
|
24
|
+
info.views = message.views;
|
|
25
|
+
}
|
|
26
|
+
return info;
|
|
27
|
+
}
|
|
28
|
+
export async function fetchMessages(telegramClient, channelId, limit, sinceHours) {
|
|
29
|
+
const peer = await resolvePeer(telegramClient, channelId);
|
|
30
|
+
const channelName = getPeerName(peer);
|
|
31
|
+
const resolvedChannelId = getPeerId(peer);
|
|
32
|
+
const username = getPeerUsername(peer);
|
|
33
|
+
const peerRef = normalizeChannelRef(channelId);
|
|
34
|
+
const history = await telegramClient.getHistory(peerRef, { limit });
|
|
35
|
+
return history
|
|
36
|
+
.filter((message) => !message.isService)
|
|
37
|
+
.filter((message) => hasTextContent(message.text))
|
|
38
|
+
.filter((message) => messageMatchesSinceHours(message.date, sinceHours))
|
|
39
|
+
.map((message) => mapMessage(message, channelName, resolvedChannelId, username));
|
|
40
|
+
}
|
|
41
|
+
export async function fetchRecentFromChannels(telegramClient, channelIds, sinceHours, limitPerChannel) {
|
|
42
|
+
const results = await Promise.all(channelIds.map(async (channelId) => {
|
|
43
|
+
try {
|
|
44
|
+
return await fetchMessages(telegramClient, channelId, limitPerChannel, sinceHours);
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return [];
|
|
48
|
+
}
|
|
49
|
+
}));
|
|
50
|
+
return results
|
|
51
|
+
.flat()
|
|
52
|
+
.sort((left, right) => new Date(right.date).getTime() - new Date(left.date).getTime());
|
|
53
|
+
}
|
|
54
|
+
export async function fetchRecentFromFolder(telegramClient, folder, sinceHours, limitPerChannel) {
|
|
55
|
+
const dialogs = await fetchDialogs(telegramClient, 500, folder);
|
|
56
|
+
const channelIds = dialogs
|
|
57
|
+
.filter((dialog) => dialog.type === "channel" || dialog.type === "group")
|
|
58
|
+
.map((dialog) => dialog.username ?? dialog.id);
|
|
59
|
+
if (channelIds.length === 0) {
|
|
60
|
+
return [];
|
|
61
|
+
}
|
|
62
|
+
return fetchRecentFromChannels(telegramClient, channelIds, sinceHours, limitPerChannel);
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=messages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/telegram/messages.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { TelegramClient, type InputPeerLike, type Peer, type tl } from "@mtcute/node";
|
|
2
|
+
import type { DialogType, FolderRef } from "./types.js";
|
|
3
|
+
export declare function normalizeFolderRef(folder: FolderRef): string | number;
|
|
4
|
+
export declare function normalizeChannelRef(channelId: string): InputPeerLike;
|
|
5
|
+
export declare function getPeerId(peer: Peer): string;
|
|
6
|
+
export declare function getPeerName(peer: Peer): string;
|
|
7
|
+
export declare function getDialogType(peer: Peer): DialogType;
|
|
8
|
+
export declare function getPeerUsername(peer: Peer): string | undefined;
|
|
9
|
+
export declare function peerToInputPeer(peer: Peer): tl.TypeInputPeer;
|
|
10
|
+
export declare function resolveInputPeers(telegramClient: TelegramClient, channelIds: string[]): Promise<tl.TypeInputPeer[]>;
|
|
11
|
+
export declare function resolvePeer(telegramClient: TelegramClient, channelId: string): Promise<Peer>;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
export function normalizeFolderRef(folder) {
|
|
2
|
+
if (typeof folder === "number") {
|
|
3
|
+
return folder;
|
|
4
|
+
}
|
|
5
|
+
const trimmed = folder.trim();
|
|
6
|
+
if (/^\d+$/.test(trimmed)) {
|
|
7
|
+
return Number.parseInt(trimmed, 10);
|
|
8
|
+
}
|
|
9
|
+
return trimmed;
|
|
10
|
+
}
|
|
11
|
+
export function normalizeChannelRef(channelId) {
|
|
12
|
+
const trimmed = channelId.trim();
|
|
13
|
+
if (trimmed.startsWith("@")) {
|
|
14
|
+
return trimmed.slice(1);
|
|
15
|
+
}
|
|
16
|
+
if (/^-?\d+$/.test(trimmed)) {
|
|
17
|
+
return Number(trimmed);
|
|
18
|
+
}
|
|
19
|
+
return trimmed;
|
|
20
|
+
}
|
|
21
|
+
export function getPeerId(peer) {
|
|
22
|
+
return String(peer.id);
|
|
23
|
+
}
|
|
24
|
+
export function getPeerName(peer) {
|
|
25
|
+
return peer.displayName;
|
|
26
|
+
}
|
|
27
|
+
export function getDialogType(peer) {
|
|
28
|
+
if (peer.type === "user") {
|
|
29
|
+
return "user";
|
|
30
|
+
}
|
|
31
|
+
return peer.chatType === "channel" ? "channel" : "group";
|
|
32
|
+
}
|
|
33
|
+
export function getPeerUsername(peer) {
|
|
34
|
+
const username = peer.username;
|
|
35
|
+
return username ?? undefined;
|
|
36
|
+
}
|
|
37
|
+
export function peerToInputPeer(peer) {
|
|
38
|
+
if (peer.type === "user") {
|
|
39
|
+
const accessHash = peer.raw.accessHash;
|
|
40
|
+
if (accessHash === undefined) {
|
|
41
|
+
throw new Error(`Cannot resolve user ${peer.displayName} for folder`);
|
|
42
|
+
}
|
|
43
|
+
return {
|
|
44
|
+
_: "inputPeerUser",
|
|
45
|
+
userId: peer.id,
|
|
46
|
+
accessHash,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
if (peer.raw._ === "channel") {
|
|
50
|
+
const accessHash = peer.raw.accessHash;
|
|
51
|
+
if (accessHash === undefined) {
|
|
52
|
+
throw new Error(`Cannot resolve channel ${peer.displayName} for folder`);
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
_: "inputPeerChannel",
|
|
56
|
+
channelId: Number.parseInt(String(Math.abs(peer.id)).slice(3), 10),
|
|
57
|
+
accessHash,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
if (peer.raw._ === "chat") {
|
|
61
|
+
return {
|
|
62
|
+
_: "inputPeerChat",
|
|
63
|
+
chatId: peer.raw.id,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
throw new Error(`Unsupported chat type for folder: ${peer.displayName}`);
|
|
67
|
+
}
|
|
68
|
+
export async function resolveInputPeers(telegramClient, channelIds) {
|
|
69
|
+
const peers = await Promise.all(channelIds.map(async (channelId) => {
|
|
70
|
+
const peerRef = normalizeChannelRef(channelId);
|
|
71
|
+
return telegramClient.getPeer(peerRef);
|
|
72
|
+
}));
|
|
73
|
+
return peers.map((peer) => peerToInputPeer(peer));
|
|
74
|
+
}
|
|
75
|
+
export async function resolvePeer(telegramClient, channelId) {
|
|
76
|
+
const peerRef = normalizeChannelRef(channelId);
|
|
77
|
+
return telegramClient.getPeer(peerRef);
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=peers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"peers.js","sourceRoot":"","sources":["../../src/telegram/peers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { TelegramClient } from "@mtcute/node";
|
|
2
|
+
export type MessageFormat = "plain" | "markdown" | "html";
|
|
3
|
+
export interface SendMessageOptions {
|
|
4
|
+
format?: MessageFormat;
|
|
5
|
+
}
|
|
6
|
+
export interface SendMessageResult {
|
|
7
|
+
chatId: string;
|
|
8
|
+
format: MessageFormat;
|
|
9
|
+
messageCount: number;
|
|
10
|
+
messageIds: number[];
|
|
11
|
+
}
|
|
12
|
+
export declare function sendTelegramMessage(telegramClient: TelegramClient, chatId: string, text: string, options?: SendMessageOptions): Promise<SendMessageResult>;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { html, md } from "@mtcute/node";
|
|
2
|
+
import { normalizeChannelRef } from "./peers.js";
|
|
3
|
+
const TELEGRAM_MAX_MESSAGE_LENGTH = 4096;
|
|
4
|
+
function splitSourceText(text, maxLength = TELEGRAM_MAX_MESSAGE_LENGTH) {
|
|
5
|
+
if (text.length <= maxLength) {
|
|
6
|
+
return [text];
|
|
7
|
+
}
|
|
8
|
+
const chunks = [];
|
|
9
|
+
let remaining = text;
|
|
10
|
+
while (remaining.length > 0) {
|
|
11
|
+
if (remaining.length <= maxLength) {
|
|
12
|
+
chunks.push(remaining);
|
|
13
|
+
break;
|
|
14
|
+
}
|
|
15
|
+
let splitAt = remaining.lastIndexOf("\n\n", maxLength);
|
|
16
|
+
if (splitAt <= 0) {
|
|
17
|
+
splitAt = remaining.lastIndexOf("\n", maxLength);
|
|
18
|
+
}
|
|
19
|
+
if (splitAt <= 0) {
|
|
20
|
+
splitAt = maxLength;
|
|
21
|
+
}
|
|
22
|
+
chunks.push(remaining.slice(0, splitAt).trimEnd());
|
|
23
|
+
remaining = remaining.slice(splitAt).trimStart();
|
|
24
|
+
}
|
|
25
|
+
return chunks;
|
|
26
|
+
}
|
|
27
|
+
function parseFormattedText(text, format) {
|
|
28
|
+
switch (format) {
|
|
29
|
+
case "markdown":
|
|
30
|
+
return md(text);
|
|
31
|
+
case "html":
|
|
32
|
+
return html(text);
|
|
33
|
+
default:
|
|
34
|
+
return text;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
function toMessageParts(text, format) {
|
|
38
|
+
return splitSourceText(text).map((chunk) => parseFormattedText(chunk, format));
|
|
39
|
+
}
|
|
40
|
+
export async function sendTelegramMessage(telegramClient, chatId, text, options = {}) {
|
|
41
|
+
const format = options.format ?? "markdown";
|
|
42
|
+
const peerRef = normalizeChannelRef(chatId);
|
|
43
|
+
const parts = toMessageParts(text, format);
|
|
44
|
+
const messageIds = [];
|
|
45
|
+
for (const part of parts) {
|
|
46
|
+
const message = await telegramClient.sendText(peerRef, part);
|
|
47
|
+
messageIds.push(message.id);
|
|
48
|
+
}
|
|
49
|
+
return {
|
|
50
|
+
chatId: chatId.trim(),
|
|
51
|
+
format,
|
|
52
|
+
messageCount: messageIds.length,
|
|
53
|
+
messageIds,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=send.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"send.js","sourceRoot":"","sources":["../../src/telegram/send.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,IAAI,EAAE,EAAE,EAAkB,MAAM,cAAc,CAAC;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEjD,MAAM,2BAA2B,GAAG,IAAI,CAAC;AAezC,SAAS,eAAe,CAAC,IAAY,EAAE,SAAS,GAAG,2BAA2B;IAC5E,IAAI,IAAI,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC;QAC7B,OAAO,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC;IAED,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,SAAS,GAAG,IAAI,CAAC;IAErB,OAAO,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,IAAI,SAAS,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC;YAClC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACvB,MAAM;QACR,CAAC;QAED,IAAI,OAAO,GAAG,SAAS,CAAC,WAAW,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QACvD,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;YACjB,OAAO,GAAG,SAAS,CAAC,WAAW,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACnD,CAAC;QACD,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;YACjB,OAAO,GAAG,SAAS,CAAC;QACtB,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QACnD,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC;IACnD,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAY,EAAE,MAAqB;IAC7D,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,UAAU;YACb,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;QAClB,KAAK,MAAM;YACT,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC;QACpB;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,IAAY,EAAE,MAAqB;IACzD,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,kBAAkB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;AACjF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,cAA8B,EAC9B,MAAc,EACd,IAAY,EACZ,UAA8B,EAAE;IAEhC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,UAAU,CAAC;IAC5C,MAAM,OAAO,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC3C,MAAM,UAAU,GAAa,EAAE,CAAC;IAEhC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC7D,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC;IAED,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE;QACrB,MAAM;QACN,YAAY,EAAE,UAAU,CAAC,MAAM;QAC/B,UAAU;KACX,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export type FolderRef = string | number;
|
|
2
|
+
export type DialogType = "channel" | "group" | "user";
|
|
3
|
+
export interface DialogInfo {
|
|
4
|
+
id: string;
|
|
5
|
+
name: string;
|
|
6
|
+
type: DialogType;
|
|
7
|
+
unreadCount: number;
|
|
8
|
+
username?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface MessageInfo {
|
|
11
|
+
id: number;
|
|
12
|
+
date: string;
|
|
13
|
+
text: string;
|
|
14
|
+
channelName: string;
|
|
15
|
+
channelId: string;
|
|
16
|
+
url: string;
|
|
17
|
+
views?: number;
|
|
18
|
+
}
|
|
19
|
+
export type FolderType = "default" | "custom" | "chatlist";
|
|
20
|
+
export interface FolderInfo {
|
|
21
|
+
id: number;
|
|
22
|
+
name: string;
|
|
23
|
+
type: FolderType;
|
|
24
|
+
emoticon?: string;
|
|
25
|
+
color?: number;
|
|
26
|
+
includeAll?: {
|
|
27
|
+
contacts?: boolean;
|
|
28
|
+
nonContacts?: boolean;
|
|
29
|
+
groups?: boolean;
|
|
30
|
+
broadcasts?: boolean;
|
|
31
|
+
bots?: boolean;
|
|
32
|
+
};
|
|
33
|
+
exclude?: {
|
|
34
|
+
muted?: boolean;
|
|
35
|
+
read?: boolean;
|
|
36
|
+
archived?: boolean;
|
|
37
|
+
};
|
|
38
|
+
pinnedCount: number;
|
|
39
|
+
includedPeersCount: number;
|
|
40
|
+
excludedPeersCount?: number;
|
|
41
|
+
}
|
|
42
|
+
export interface CreateFolderParams {
|
|
43
|
+
name: string;
|
|
44
|
+
includeChannels?: string[];
|
|
45
|
+
excludeChannels?: string[];
|
|
46
|
+
emoticon?: string;
|
|
47
|
+
includeAll?: FolderInfo["includeAll"];
|
|
48
|
+
exclude?: FolderInfo["exclude"];
|
|
49
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/telegram/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function buildTelegramPostUrl(messageId: number, channelId: string, username?: string): string;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export function buildTelegramPostUrl(messageId, channelId, username) {
|
|
2
|
+
if (username) {
|
|
3
|
+
return `https://t.me/${username}/${messageId}`;
|
|
4
|
+
}
|
|
5
|
+
const internalId = channelId.replace(/^-100/, "");
|
|
6
|
+
return `https://t.me/c/${internalId}/${messageId}`;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=urls.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"urls.js","sourceRoot":"","sources":["../../src/telegram/urls.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,oBAAoB,CAClC,SAAiB,EACjB,SAAiB,EACjB,QAAiB;IAEjB,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,gBAAgB,QAAQ,IAAI,SAAS,EAAE,CAAC;IACjD,CAAC;IACD,MAAM,UAAU,GAAG,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAClD,OAAO,kBAAkB,UAAU,IAAI,SAAS,EAAE,CAAC;AACrD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./telegram/index.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telegram-client.js","sourceRoot":"","sources":["../src/telegram-client.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "telegram-mcp-tools",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "MCP server for reading Telegram channel subscriptions via mtcute",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"author": "ausievich",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "git+https://github.com/ausievich/telegram-mcp-tools.git"
|
|
11
|
+
},
|
|
12
|
+
"homepage": "https://github.com/ausievich/telegram-mcp-tools#readme",
|
|
13
|
+
"bugs": {
|
|
14
|
+
"url": "https://github.com/ausievich/telegram-mcp-tools/issues"
|
|
15
|
+
},
|
|
16
|
+
"keywords": [
|
|
17
|
+
"mcp",
|
|
18
|
+
"mcp-server",
|
|
19
|
+
"telegram",
|
|
20
|
+
"mtproto",
|
|
21
|
+
"mtcute",
|
|
22
|
+
"cursor",
|
|
23
|
+
"claude",
|
|
24
|
+
"model-context-protocol"
|
|
25
|
+
],
|
|
26
|
+
"bin": {
|
|
27
|
+
"telegram-mcp-tools": "dist/index.js",
|
|
28
|
+
"telegram-mcp-tools-auth": "dist/auth.js"
|
|
29
|
+
},
|
|
30
|
+
"files": [
|
|
31
|
+
"dist",
|
|
32
|
+
".env.example",
|
|
33
|
+
"README.md",
|
|
34
|
+
"LICENSE"
|
|
35
|
+
],
|
|
36
|
+
"scripts": {
|
|
37
|
+
"build": "tsc",
|
|
38
|
+
"mcp": "node dist/index.js",
|
|
39
|
+
"auth": "node dist/auth.js",
|
|
40
|
+
"preauth": "npm run build",
|
|
41
|
+
"premcp": "npm run build",
|
|
42
|
+
"prepublishOnly": "npm run build"
|
|
43
|
+
},
|
|
44
|
+
"engines": {
|
|
45
|
+
"node": ">=18"
|
|
46
|
+
},
|
|
47
|
+
"dependencies": {
|
|
48
|
+
"@modelcontextprotocol/sdk": "^1.12.1",
|
|
49
|
+
"@mtcute/node": "^0.30.1",
|
|
50
|
+
"dotenv": "^16.5.0",
|
|
51
|
+
"qrcode-terminal": "^0.12.0",
|
|
52
|
+
"zod": "^3.24.4"
|
|
53
|
+
},
|
|
54
|
+
"devDependencies": {
|
|
55
|
+
"@types/node": "^22.15.21",
|
|
56
|
+
"typescript": "^5.8.3"
|
|
57
|
+
}
|
|
58
|
+
}
|