telegram-mcp-local-server 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/LICENSE +21 -0
- package/README.md +298 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +282 -0
- package/dist/index.js.map +1 -0
- package/dist/telegram-client.d.ts +33 -0
- package/dist/telegram-client.d.ts.map +1 -0
- package/dist/telegram-client.js +136 -0
- package/dist/telegram-client.js.map +1 -0
- package/dist/test.d.ts +3 -0
- package/dist/test.d.ts.map +1 -0
- package/dist/test.js +55 -0
- package/dist/test.js.map +1 -0
- package/package.json +55 -0
- package/session-helper.js +60 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024 Telegram MCP Server
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
# Telegram MCP Local Server
|
|
2
|
+
|
|
3
|
+
Простой MCP (Model Context Protocol) сервер для работы с Telegram. Позволяет получать список чатов, историю сообщений и отправлять сообщения через Telegram API.
|
|
4
|
+
|
|
5
|
+
## Возможности
|
|
6
|
+
|
|
7
|
+
- 🔌 Подключение к Telegram через API
|
|
8
|
+
- 💬 Получение списка чатов
|
|
9
|
+
- 📜 Получение истории сообщений из чатов
|
|
10
|
+
- 📤 Отправка сообщений
|
|
11
|
+
- 🔄 Работа через stdio (для интеграции с MCP-совместимыми клиентами)
|
|
12
|
+
- 🔒 Режим "только чтение" (readonly) для безопасной работы
|
|
13
|
+
|
|
14
|
+
## Установка
|
|
15
|
+
|
|
16
|
+
### Через npx (рекомендуется)
|
|
17
|
+
|
|
18
|
+
Вы можете запустить сервер напрямую без установки:
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
npx telegram-mcp-local-server
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Или установить глобально:
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
npm install -g telegram-mcp-local-server
|
|
28
|
+
telegram-mcp-local-server
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### Для разработки
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
git clone <repository-url>
|
|
35
|
+
cd telegram-mcp-server
|
|
36
|
+
npm install
|
|
37
|
+
npm run build
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Получение Telegram API ключей
|
|
41
|
+
|
|
42
|
+
1. Перейдите на https://my.telegram.org/
|
|
43
|
+
2. Войдите в свою учетную запись Telegram
|
|
44
|
+
3. Перейдите в раздел "API development tools"
|
|
45
|
+
4. Создайте новое приложение и получите `api_id` и `api_hash`
|
|
46
|
+
|
|
47
|
+
## Использование
|
|
48
|
+
|
|
49
|
+
### Запуск сервера
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
# Через npx
|
|
53
|
+
npx telegram-mcp-local-server
|
|
54
|
+
|
|
55
|
+
# Или если установлен глобально
|
|
56
|
+
telegram-mcp-local-server
|
|
57
|
+
|
|
58
|
+
# Для разработки
|
|
59
|
+
npm start
|
|
60
|
+
# или
|
|
61
|
+
npm run dev
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### Режим "только чтение" (Readonly Mode)
|
|
65
|
+
|
|
66
|
+
Для безопасной работы сервер можно запустить в режиме "только чтение", в котором доступны только функции чтения (получение чатов и истории сообщений), а отправка сообщений заблокирована.
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
# Через npx
|
|
70
|
+
TELEGRAM_READONLY_MODE=true npx telegram-mcp-local-server
|
|
71
|
+
|
|
72
|
+
# Или если установлен глобально
|
|
73
|
+
TELEGRAM_READONLY_MODE=true telegram-mcp-local-server
|
|
74
|
+
|
|
75
|
+
# Для разработки
|
|
76
|
+
TELEGRAM_READONLY_MODE=true npm start
|
|
77
|
+
# или
|
|
78
|
+
TELEGRAM_READONLY_MODE=true npm run dev
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
В readonly режиме доступны только следующие инструменты:
|
|
82
|
+
- `telegram_connect` - подключение к Telegram
|
|
83
|
+
- `telegram_get_chats` - получение списка чатов
|
|
84
|
+
- `telegram_get_chat_history` - получение истории сообщений
|
|
85
|
+
|
|
86
|
+
Инструмент `telegram_send_message` недоступен в readonly режиме.
|
|
87
|
+
|
|
88
|
+
### Доступные инструменты
|
|
89
|
+
|
|
90
|
+
#### `telegram_connect`
|
|
91
|
+
Подключение к Telegram с использованием API ключей.
|
|
92
|
+
|
|
93
|
+
Параметры:
|
|
94
|
+
- `apiId` (обязательно): Telegram API ID
|
|
95
|
+
- `apiHash` (обязательно): Telegram API Hash
|
|
96
|
+
- `sessionString` (опционально): Строка сессии для авторизации
|
|
97
|
+
|
|
98
|
+
#### `telegram_get_chats`
|
|
99
|
+
Получение списка чатов.
|
|
100
|
+
|
|
101
|
+
Параметры:
|
|
102
|
+
- `limit` (опционально): Максимальное количество чатов (по умолчанию: 50)
|
|
103
|
+
|
|
104
|
+
#### `telegram_get_chat_history`
|
|
105
|
+
Получение истории сообщений из конкретного чата.
|
|
106
|
+
|
|
107
|
+
Параметры:
|
|
108
|
+
- `chatId` (обязательно): ID чата или username
|
|
109
|
+
- `limit` (опционально): Максимальное количество сообщений (по умолчанию: 50)
|
|
110
|
+
- `offsetId` (опционально): ID сообщения для начала (для пагинации)
|
|
111
|
+
|
|
112
|
+
#### `telegram_send_message`
|
|
113
|
+
Отправка сообщения в конкретный чат.
|
|
114
|
+
|
|
115
|
+
Параметры:
|
|
116
|
+
- `chatId` (обязательно): ID чата или username
|
|
117
|
+
- `message` (обязательно): Текст сообщения
|
|
118
|
+
|
|
119
|
+
## Пример использования
|
|
120
|
+
|
|
121
|
+
```javascript
|
|
122
|
+
// Подключение к Telegram
|
|
123
|
+
{
|
|
124
|
+
"name": "telegram_connect",
|
|
125
|
+
"arguments": {
|
|
126
|
+
"apiId": "your_api_id",
|
|
127
|
+
"apiHash": "your_api_hash"
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// Получение списка чатов
|
|
132
|
+
{
|
|
133
|
+
"name": "telegram_get_chats",
|
|
134
|
+
"arguments": {
|
|
135
|
+
"limit": 20
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// Получение истории сообщений
|
|
140
|
+
{
|
|
141
|
+
"name": "telegram_get_chat_history",
|
|
142
|
+
"arguments": {
|
|
143
|
+
"chatId": "@username",
|
|
144
|
+
"limit": 100
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// Отправка сообщения
|
|
149
|
+
{
|
|
150
|
+
"name": "telegram_send_message",
|
|
151
|
+
"arguments": {
|
|
152
|
+
"chatId": "@username",
|
|
153
|
+
"message": "Привет!"
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
## Настройка аутентификации
|
|
159
|
+
|
|
160
|
+
Для работы с Telegram API необходимо получить строку сессии:
|
|
161
|
+
|
|
162
|
+
### Способ 1: Использование утилиты session-helper
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
npm run session
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
Следуйте инструкциям в интерактивном режиме:
|
|
169
|
+
1. Введите API ID и Hash
|
|
170
|
+
2. Введите номер телефона
|
|
171
|
+
3. Введите код из SMS
|
|
172
|
+
4. При необходимости введите пароль двухфакторной аутентификации
|
|
173
|
+
5. Скопируйте полученную строку сессии
|
|
174
|
+
|
|
175
|
+
### Способ 2: Вручную
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
npm run test-client
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
Эта команда запустит интерактивный тест клиента для получения сессии.
|
|
182
|
+
|
|
183
|
+
## Тестирование
|
|
184
|
+
|
|
185
|
+
### Тест основного функционала
|
|
186
|
+
|
|
187
|
+
```bash
|
|
188
|
+
npm run example
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
Эта команда покажет доступные инструменты и примеры использования.
|
|
192
|
+
|
|
193
|
+
### Интерактивный тест
|
|
194
|
+
|
|
195
|
+
```bash
|
|
196
|
+
npm run test-client
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
Интерактивный тест, который поможет проверить подключение и основные функции.
|
|
200
|
+
|
|
201
|
+
## Настройка MCP клиента
|
|
202
|
+
|
|
203
|
+
Для использования с MCP-совместимыми клиентами (например, Claude Desktop), добавьте в конфигурацию:
|
|
204
|
+
|
|
205
|
+
### Через npx (рекомендуется)
|
|
206
|
+
|
|
207
|
+
```json
|
|
208
|
+
{
|
|
209
|
+
"mcpServers": {
|
|
210
|
+
"telegram": {
|
|
211
|
+
"command": "npx",
|
|
212
|
+
"args": ["telegram-mcp-local-server"],
|
|
213
|
+
"env": {
|
|
214
|
+
"TELEGRAM_API_ID": "your_api_id",
|
|
215
|
+
"TELEGRAM_API_HASH": "your_api_hash",
|
|
216
|
+
"TELEGRAM_SESSION_STRING": "your_session_string",
|
|
217
|
+
"TELEGRAM_READONLY_MODE": "true"
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
### Через глобальную установку
|
|
225
|
+
|
|
226
|
+
```json
|
|
227
|
+
{
|
|
228
|
+
"mcpServers": {
|
|
229
|
+
"telegram": {
|
|
230
|
+
"command": "telegram-mcp-local-server",
|
|
231
|
+
"env": {
|
|
232
|
+
"TELEGRAM_API_ID": "your_api_id",
|
|
233
|
+
"TELEGRAM_API_HASH": "your_api_hash",
|
|
234
|
+
"TELEGRAM_SESSION_STRING": "your_session_string",
|
|
235
|
+
"TELEGRAM_READONLY_MODE": "true"
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
### Локальная установка
|
|
243
|
+
|
|
244
|
+
```json
|
|
245
|
+
{
|
|
246
|
+
"mcpServers": {
|
|
247
|
+
"telegram": {
|
|
248
|
+
"command": "node",
|
|
249
|
+
"args": ["dist/index.js"],
|
|
250
|
+
"cwd": "/path/to/telegram-mcp-server",
|
|
251
|
+
"env": {
|
|
252
|
+
"TELEGRAM_API_ID": "your_api_id",
|
|
253
|
+
"TELEGRAM_API_HASH": "your_api_hash",
|
|
254
|
+
"TELEGRAM_SESSION_STRING": "your_session_string",
|
|
255
|
+
"TELEGRAM_READONLY_MODE": "true"
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
**Примечание**: Установите `TELEGRAM_READONLY_MODE=true` для безопасного режима только чтения.
|
|
263
|
+
|
|
264
|
+
## Структура проекта
|
|
265
|
+
|
|
266
|
+
```
|
|
267
|
+
src/
|
|
268
|
+
├── index.ts # Основной MCP сервер
|
|
269
|
+
└── telegram-client.ts # Клиент для работы с Telegram API
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
## Зависимости
|
|
273
|
+
|
|
274
|
+
- `@modelcontextprotocol/sdk` - SDK для MCP
|
|
275
|
+
- `telegram` - Библиотека для работы с Telegram API
|
|
276
|
+
- `zod` - Валидация параметров
|
|
277
|
+
|
|
278
|
+
## Разработка
|
|
279
|
+
|
|
280
|
+
Для разработки и внесения изменений см. [CONTRIBUTING.md](CONTRIBUTING.md).
|
|
281
|
+
|
|
282
|
+
### Быстрый старт для разработчиков
|
|
283
|
+
|
|
284
|
+
```bash
|
|
285
|
+
git clone <repository-url>
|
|
286
|
+
cd telegram-mcp-server
|
|
287
|
+
npm install
|
|
288
|
+
npm run build
|
|
289
|
+
npm test
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
### Автоматическая публикация
|
|
293
|
+
|
|
294
|
+
Проект использует GitHub Actions для автоматической публикации в npm при изменениях в main ветке.
|
|
295
|
+
|
|
296
|
+
## Лицензия
|
|
297
|
+
|
|
298
|
+
MIT
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
3
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
4
|
+
import { CallToolRequestSchema, ErrorCode, ListToolsRequestSchema, McpError, } from "@modelcontextprotocol/sdk/types.js";
|
|
5
|
+
import { z } from "zod";
|
|
6
|
+
import { TelegramClient } from "./telegram-client.js";
|
|
7
|
+
const server = new Server({
|
|
8
|
+
name: "telegram-mcp-server",
|
|
9
|
+
version: "0.1.0",
|
|
10
|
+
}, {
|
|
11
|
+
capabilities: {
|
|
12
|
+
tools: {},
|
|
13
|
+
},
|
|
14
|
+
});
|
|
15
|
+
// Telegram client instance
|
|
16
|
+
let telegramClient = null;
|
|
17
|
+
// Check if server is running in readonly mode
|
|
18
|
+
const isReadonlyMode = process.env.TELEGRAM_READONLY_MODE === 'true';
|
|
19
|
+
// Initialize Telegram client
|
|
20
|
+
async function initializeTelegramClient(apiId, apiHash, sessionString) {
|
|
21
|
+
if (!telegramClient) {
|
|
22
|
+
telegramClient = new TelegramClient({
|
|
23
|
+
apiId: parseInt(apiId),
|
|
24
|
+
apiHash,
|
|
25
|
+
sessionString,
|
|
26
|
+
});
|
|
27
|
+
await telegramClient.connect();
|
|
28
|
+
}
|
|
29
|
+
return telegramClient;
|
|
30
|
+
}
|
|
31
|
+
// Auto-initialize Telegram client if environment variables are present
|
|
32
|
+
async function autoInitializeTelegramClient() {
|
|
33
|
+
const apiId = process.env.TELEGRAM_API_ID;
|
|
34
|
+
const apiHash = process.env.TELEGRAM_API_HASH;
|
|
35
|
+
const sessionString = process.env.TELEGRAM_SESSION_STRING;
|
|
36
|
+
if (apiId && apiHash) {
|
|
37
|
+
try {
|
|
38
|
+
await initializeTelegramClient(apiId, apiHash, sessionString);
|
|
39
|
+
console.log(`Telegram client auto-initialized from environment variables (${isReadonlyMode ? 'readonly' : 'read-write'} mode)`);
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
console.warn("Failed to auto-initialize Telegram client:", error instanceof Error ? error.message : String(error));
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// List available tools
|
|
47
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
48
|
+
const tools = [
|
|
49
|
+
{
|
|
50
|
+
name: "telegram_connect",
|
|
51
|
+
description: "Connect to Telegram using API credentials",
|
|
52
|
+
inputSchema: {
|
|
53
|
+
type: "object",
|
|
54
|
+
properties: {
|
|
55
|
+
apiId: {
|
|
56
|
+
type: "string",
|
|
57
|
+
description: "Telegram API ID",
|
|
58
|
+
},
|
|
59
|
+
apiHash: {
|
|
60
|
+
type: "string",
|
|
61
|
+
description: "Telegram API Hash",
|
|
62
|
+
},
|
|
63
|
+
sessionString: {
|
|
64
|
+
type: "string",
|
|
65
|
+
description: "Optional session string for authentication",
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
required: ["apiId", "apiHash"],
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
name: "telegram_get_chats",
|
|
73
|
+
description: "Get list of chats from Telegram",
|
|
74
|
+
inputSchema: {
|
|
75
|
+
type: "object",
|
|
76
|
+
properties: {
|
|
77
|
+
limit: {
|
|
78
|
+
type: "number",
|
|
79
|
+
description: "Maximum number of chats to retrieve (default: 50)",
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
name: "telegram_get_chat_history",
|
|
86
|
+
description: "Get message history from a specific chat",
|
|
87
|
+
inputSchema: {
|
|
88
|
+
type: "object",
|
|
89
|
+
properties: {
|
|
90
|
+
chatId: {
|
|
91
|
+
type: "string",
|
|
92
|
+
description: "Chat ID or username",
|
|
93
|
+
},
|
|
94
|
+
limit: {
|
|
95
|
+
type: "number",
|
|
96
|
+
description: "Maximum number of messages to retrieve (default: 50)",
|
|
97
|
+
},
|
|
98
|
+
offsetId: {
|
|
99
|
+
type: "number",
|
|
100
|
+
description: "Message ID to start from (for pagination)",
|
|
101
|
+
},
|
|
102
|
+
},
|
|
103
|
+
required: ["chatId"],
|
|
104
|
+
},
|
|
105
|
+
},
|
|
106
|
+
];
|
|
107
|
+
// Add send message tool only if not in readonly mode
|
|
108
|
+
if (!isReadonlyMode) {
|
|
109
|
+
tools.push({
|
|
110
|
+
name: "telegram_send_message",
|
|
111
|
+
description: "Send a message to a specific chat",
|
|
112
|
+
inputSchema: {
|
|
113
|
+
type: "object",
|
|
114
|
+
properties: {
|
|
115
|
+
chatId: {
|
|
116
|
+
type: "string",
|
|
117
|
+
description: "Chat ID or username",
|
|
118
|
+
},
|
|
119
|
+
message: {
|
|
120
|
+
type: "string",
|
|
121
|
+
description: "Message text to send",
|
|
122
|
+
},
|
|
123
|
+
},
|
|
124
|
+
required: ["chatId", "message"],
|
|
125
|
+
},
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
return { tools };
|
|
129
|
+
});
|
|
130
|
+
// Handle tool calls
|
|
131
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
132
|
+
const { name, arguments: args } = request.params;
|
|
133
|
+
try {
|
|
134
|
+
switch (name) {
|
|
135
|
+
case "telegram_connect": {
|
|
136
|
+
const connectSchema = z.object({
|
|
137
|
+
apiId: z.string(),
|
|
138
|
+
apiHash: z.string(),
|
|
139
|
+
sessionString: z.string().optional(),
|
|
140
|
+
});
|
|
141
|
+
const { apiId, apiHash, sessionString } = connectSchema.parse(args);
|
|
142
|
+
try {
|
|
143
|
+
await initializeTelegramClient(apiId, apiHash, sessionString);
|
|
144
|
+
return {
|
|
145
|
+
content: [
|
|
146
|
+
{
|
|
147
|
+
type: "text",
|
|
148
|
+
text: "Successfully connected to Telegram",
|
|
149
|
+
},
|
|
150
|
+
],
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
return {
|
|
155
|
+
content: [
|
|
156
|
+
{
|
|
157
|
+
type: "text",
|
|
158
|
+
text: `Failed to connect to Telegram: ${error instanceof Error ? error.message : String(error)}`,
|
|
159
|
+
},
|
|
160
|
+
],
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
case "telegram_get_chats": {
|
|
165
|
+
if (!telegramClient) {
|
|
166
|
+
throw new McpError(ErrorCode.InvalidRequest, "Telegram client not initialized. Please connect first using telegram_connect.");
|
|
167
|
+
}
|
|
168
|
+
const chatsSchema = z.object({
|
|
169
|
+
limit: z.number().optional().default(50),
|
|
170
|
+
});
|
|
171
|
+
const { limit } = chatsSchema.parse(args);
|
|
172
|
+
try {
|
|
173
|
+
const chats = await telegramClient.getChats(limit);
|
|
174
|
+
return {
|
|
175
|
+
content: [
|
|
176
|
+
{
|
|
177
|
+
type: "text",
|
|
178
|
+
text: JSON.stringify(chats, null, 2),
|
|
179
|
+
},
|
|
180
|
+
],
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
catch (error) {
|
|
184
|
+
return {
|
|
185
|
+
content: [
|
|
186
|
+
{
|
|
187
|
+
type: "text",
|
|
188
|
+
text: `Failed to get chats: ${error instanceof Error ? error.message : String(error)}`,
|
|
189
|
+
},
|
|
190
|
+
],
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
case "telegram_get_chat_history": {
|
|
195
|
+
if (!telegramClient) {
|
|
196
|
+
throw new McpError(ErrorCode.InvalidRequest, "Telegram client not initialized. Please connect first using telegram_connect.");
|
|
197
|
+
}
|
|
198
|
+
const historySchema = z.object({
|
|
199
|
+
chatId: z.string(),
|
|
200
|
+
limit: z.number().optional().default(50),
|
|
201
|
+
offsetId: z.number().optional(),
|
|
202
|
+
});
|
|
203
|
+
const { chatId, limit, offsetId } = historySchema.parse(args);
|
|
204
|
+
try {
|
|
205
|
+
const messages = await telegramClient.getChatHistory(chatId, limit, offsetId);
|
|
206
|
+
return {
|
|
207
|
+
content: [
|
|
208
|
+
{
|
|
209
|
+
type: "text",
|
|
210
|
+
text: JSON.stringify(messages, null, 2),
|
|
211
|
+
},
|
|
212
|
+
],
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
catch (error) {
|
|
216
|
+
return {
|
|
217
|
+
content: [
|
|
218
|
+
{
|
|
219
|
+
type: "text",
|
|
220
|
+
text: `Failed to get chat history: ${error instanceof Error ? error.message : String(error)}`,
|
|
221
|
+
},
|
|
222
|
+
],
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
case "telegram_send_message": {
|
|
227
|
+
if (isReadonlyMode) {
|
|
228
|
+
throw new McpError(ErrorCode.InvalidRequest, "Message sending is not available in readonly mode.");
|
|
229
|
+
}
|
|
230
|
+
if (!telegramClient) {
|
|
231
|
+
throw new McpError(ErrorCode.InvalidRequest, "Telegram client not initialized. Please connect first using telegram_connect.");
|
|
232
|
+
}
|
|
233
|
+
const sendSchema = z.object({
|
|
234
|
+
chatId: z.string(),
|
|
235
|
+
message: z.string(),
|
|
236
|
+
});
|
|
237
|
+
const { chatId, message } = sendSchema.parse(args);
|
|
238
|
+
try {
|
|
239
|
+
const result = await telegramClient.sendMessage(chatId, message);
|
|
240
|
+
return {
|
|
241
|
+
content: [
|
|
242
|
+
{
|
|
243
|
+
type: "text",
|
|
244
|
+
text: JSON.stringify(result, null, 2),
|
|
245
|
+
},
|
|
246
|
+
],
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
catch (error) {
|
|
250
|
+
return {
|
|
251
|
+
content: [
|
|
252
|
+
{
|
|
253
|
+
type: "text",
|
|
254
|
+
text: `Failed to send message: ${error instanceof Error ? error.message : String(error)}`,
|
|
255
|
+
},
|
|
256
|
+
],
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
default:
|
|
261
|
+
throw new McpError(ErrorCode.MethodNotFound, `Unknown tool: ${name}`);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
catch (error) {
|
|
265
|
+
if (error instanceof z.ZodError) {
|
|
266
|
+
throw new McpError(ErrorCode.InvalidParams, `Invalid parameters: ${error.issues.map(i => `${i.path.join('.')}: ${i.message}`).join(', ')}`);
|
|
267
|
+
}
|
|
268
|
+
throw error;
|
|
269
|
+
}
|
|
270
|
+
});
|
|
271
|
+
async function runServer() {
|
|
272
|
+
// Auto-initialize Telegram client if environment variables are present
|
|
273
|
+
await autoInitializeTelegramClient();
|
|
274
|
+
const transport = new StdioServerTransport();
|
|
275
|
+
await server.connect(transport);
|
|
276
|
+
console.log(`Telegram MCP server running on stdio (${isReadonlyMode ? 'readonly' : 'read-write'} mode)`);
|
|
277
|
+
}
|
|
278
|
+
runServer().catch((error) => {
|
|
279
|
+
console.error("Server error:", error);
|
|
280
|
+
process.exit(1);
|
|
281
|
+
});
|
|
282
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export interface TelegramConfig {
|
|
2
|
+
apiId: number;
|
|
3
|
+
apiHash: string;
|
|
4
|
+
sessionString?: string;
|
|
5
|
+
}
|
|
6
|
+
export interface ChatInfo {
|
|
7
|
+
id: string;
|
|
8
|
+
title: string;
|
|
9
|
+
type: string;
|
|
10
|
+
username?: string;
|
|
11
|
+
participantsCount?: number;
|
|
12
|
+
}
|
|
13
|
+
export interface MessageInfo {
|
|
14
|
+
id: number;
|
|
15
|
+
text: string;
|
|
16
|
+
date: Date;
|
|
17
|
+
fromId?: string;
|
|
18
|
+
fromUsername?: string;
|
|
19
|
+
fromFirstName?: string;
|
|
20
|
+
fromLastName?: string;
|
|
21
|
+
replyToMsgId?: number;
|
|
22
|
+
}
|
|
23
|
+
export declare class TelegramClient {
|
|
24
|
+
private client;
|
|
25
|
+
private config;
|
|
26
|
+
constructor(config: TelegramConfig);
|
|
27
|
+
connect(): Promise<void>;
|
|
28
|
+
getChats(limit?: number): Promise<ChatInfo[]>;
|
|
29
|
+
getChatHistory(chatId: string, limit?: number, offsetId?: number): Promise<MessageInfo[]>;
|
|
30
|
+
sendMessage(chatId: string, message: string): Promise<MessageInfo>;
|
|
31
|
+
disconnect(): Promise<void>;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=telegram-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telegram-client.d.ts","sourceRoot":"","sources":["../src/telegram-client.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,IAAI,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAW;IACzB,OAAO,CAAC,MAAM,CAAiB;gBAEnB,MAAM,EAAE,cAAc;IAS5B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAMxB,QAAQ,CAAC,KAAK,GAAE,MAAW,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IA+CjD,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IA0D7F,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IA0BlE,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAKlC"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { TelegramClient as TgClient } from "telegram";
|
|
2
|
+
import { StringSession } from "telegram/sessions/index.js";
|
|
3
|
+
export class TelegramClient {
|
|
4
|
+
constructor(config) {
|
|
5
|
+
this.config = config;
|
|
6
|
+
const session = new StringSession(config.sessionString || "");
|
|
7
|
+
this.client = new TgClient(session, config.apiId, config.apiHash, {
|
|
8
|
+
connectionRetries: 5,
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
async connect() {
|
|
12
|
+
console.error("Connecting to Telegram...");
|
|
13
|
+
await this.client.connect();
|
|
14
|
+
console.error("Connected to Telegram successfully");
|
|
15
|
+
}
|
|
16
|
+
async getChats(limit = 50) {
|
|
17
|
+
console.error(`Fetching ${limit} chats...`);
|
|
18
|
+
const dialogs = await this.client.getDialogs({ limit });
|
|
19
|
+
const chats = [];
|
|
20
|
+
for (const dialog of dialogs) {
|
|
21
|
+
const entity = dialog.entity;
|
|
22
|
+
if (!entity)
|
|
23
|
+
continue;
|
|
24
|
+
let chatInfo;
|
|
25
|
+
if (entity.className === "User") {
|
|
26
|
+
chatInfo = {
|
|
27
|
+
id: entity.id.toString(),
|
|
28
|
+
title: `${entity.firstName || ""} ${entity.lastName || ""}`.trim(),
|
|
29
|
+
type: "user",
|
|
30
|
+
username: entity.username,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
else if (entity.className === "Chat") {
|
|
34
|
+
chatInfo = {
|
|
35
|
+
id: entity.id.toString(),
|
|
36
|
+
title: entity.title,
|
|
37
|
+
type: "group",
|
|
38
|
+
participantsCount: entity.participantsCount,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
else if (entity.className === "Channel") {
|
|
42
|
+
chatInfo = {
|
|
43
|
+
id: entity.id.toString(),
|
|
44
|
+
title: entity.title,
|
|
45
|
+
type: entity.broadcast ? "channel" : "supergroup",
|
|
46
|
+
username: entity.username,
|
|
47
|
+
participantsCount: entity.participantsCount,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
continue; // Skip unknown entity types
|
|
52
|
+
}
|
|
53
|
+
chats.push(chatInfo);
|
|
54
|
+
}
|
|
55
|
+
console.error(`Fetched ${chats.length} chats`);
|
|
56
|
+
return chats;
|
|
57
|
+
}
|
|
58
|
+
async getChatHistory(chatId, limit = 50, offsetId) {
|
|
59
|
+
console.error(`Fetching ${limit} messages from chat ${chatId}...`);
|
|
60
|
+
try {
|
|
61
|
+
const entity = await this.client.getEntity(chatId);
|
|
62
|
+
const messages = await this.client.getMessages(entity, {
|
|
63
|
+
limit,
|
|
64
|
+
offsetId,
|
|
65
|
+
});
|
|
66
|
+
const messageInfos = [];
|
|
67
|
+
for (const message of messages) {
|
|
68
|
+
const msg = message;
|
|
69
|
+
if (!msg || msg.className !== "Message") {
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
let fromUsername;
|
|
73
|
+
let fromFirstName;
|
|
74
|
+
let fromLastName;
|
|
75
|
+
if (msg.fromId) {
|
|
76
|
+
try {
|
|
77
|
+
const sender = await this.client.getEntity(msg.fromId);
|
|
78
|
+
if (sender?.className === "User") {
|
|
79
|
+
fromUsername = sender.username;
|
|
80
|
+
fromFirstName = sender.firstName;
|
|
81
|
+
fromLastName = sender.lastName;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
console.error("Error getting sender info:", error);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
const messageInfo = {
|
|
89
|
+
id: msg.id,
|
|
90
|
+
text: msg.message || "",
|
|
91
|
+
date: new Date(msg.date * 1000),
|
|
92
|
+
fromId: msg.fromId?.toString(),
|
|
93
|
+
fromUsername,
|
|
94
|
+
fromFirstName,
|
|
95
|
+
fromLastName,
|
|
96
|
+
replyToMsgId: msg.replyTo?.replyToMsgId,
|
|
97
|
+
};
|
|
98
|
+
messageInfos.push(messageInfo);
|
|
99
|
+
}
|
|
100
|
+
console.error(`Fetched ${messageInfos.length} messages`);
|
|
101
|
+
return messageInfos;
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
console.error(`Error fetching chat history for ${chatId}:`, error);
|
|
105
|
+
throw error;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
async sendMessage(chatId, message) {
|
|
109
|
+
console.error(`Sending message to chat ${chatId}...`);
|
|
110
|
+
try {
|
|
111
|
+
const entity = await this.client.getEntity(chatId);
|
|
112
|
+
const result = await this.client.sendMessage(entity, { message });
|
|
113
|
+
if (!result || result.className !== "Message") {
|
|
114
|
+
throw new Error("Failed to send message");
|
|
115
|
+
}
|
|
116
|
+
const messageInfo = {
|
|
117
|
+
id: result.id,
|
|
118
|
+
text: result.message || "",
|
|
119
|
+
date: new Date(result.date * 1000),
|
|
120
|
+
fromId: result.fromId?.toString(),
|
|
121
|
+
};
|
|
122
|
+
console.error("Message sent successfully");
|
|
123
|
+
return messageInfo;
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
console.error(`Error sending message to ${chatId}:`, error);
|
|
127
|
+
throw error;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
async disconnect() {
|
|
131
|
+
console.error("Disconnecting from Telegram...");
|
|
132
|
+
await this.client.disconnect();
|
|
133
|
+
console.error("Disconnected from Telegram");
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=telegram-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telegram-client.js","sourceRoot":"","sources":["../src/telegram-client.ts"],"names":[],"mappings":"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"}
|
package/dist/test.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":""}
|
package/dist/test.js
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { TelegramClient } from "./telegram-client.js";
|
|
3
|
+
import * as readline from "readline";
|
|
4
|
+
const rl = readline.createInterface({
|
|
5
|
+
input: process.stdin,
|
|
6
|
+
output: process.stdout,
|
|
7
|
+
});
|
|
8
|
+
function question(query) {
|
|
9
|
+
return new Promise((resolve) => {
|
|
10
|
+
rl.question(query, resolve);
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
async function main() {
|
|
14
|
+
try {
|
|
15
|
+
console.log("=== Telegram MCP Server Test ===\n");
|
|
16
|
+
const apiId = await question("Enter your Telegram API ID: ");
|
|
17
|
+
const apiHash = await question("Enter your Telegram API Hash: ");
|
|
18
|
+
const sessionString = await question("Enter your session string (or press Enter to skip): ");
|
|
19
|
+
console.log("\nConnecting to Telegram...");
|
|
20
|
+
const client = new TelegramClient({
|
|
21
|
+
apiId: parseInt(apiId),
|
|
22
|
+
apiHash,
|
|
23
|
+
sessionString: sessionString || undefined,
|
|
24
|
+
});
|
|
25
|
+
await client.connect();
|
|
26
|
+
console.log("\n=== Testing chat list ===");
|
|
27
|
+
const chats = await client.getChats(10);
|
|
28
|
+
console.log(`Found ${chats.length} chats:`);
|
|
29
|
+
chats.forEach((chat, index) => {
|
|
30
|
+
console.log(`${index + 1}. ${chat.title} (${chat.type}) - ID: ${chat.id}`);
|
|
31
|
+
});
|
|
32
|
+
if (chats.length > 0) {
|
|
33
|
+
const chatIndex = await question(`\nSelect chat number (1-${chats.length}) to get history: `);
|
|
34
|
+
const selectedChat = chats[parseInt(chatIndex) - 1];
|
|
35
|
+
if (selectedChat) {
|
|
36
|
+
console.log(`\n=== Getting history for ${selectedChat.title} ===`);
|
|
37
|
+
const messages = await client.getChatHistory(selectedChat.id, 5);
|
|
38
|
+
console.log(`Found ${messages.length} messages:`);
|
|
39
|
+
messages.forEach((msg, index) => {
|
|
40
|
+
console.log(`${index + 1}. [${msg.date.toLocaleString()}] ${msg.fromFirstName || 'Unknown'}: ${msg.text.substring(0, 100)}${msg.text.length > 100 ? '...' : ''}`);
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
await client.disconnect();
|
|
45
|
+
console.log("\nTest completed successfully!");
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
console.error("Test failed:", error);
|
|
49
|
+
}
|
|
50
|
+
finally {
|
|
51
|
+
rl.close();
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
main();
|
|
55
|
+
//# sourceMappingURL=test.js.map
|
package/dist/test.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.js","sourceRoot":"","sources":["../src/test.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "telegram-mcp-local-server",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "MCP server for Telegram integration. Allows reading chat lists, message history, and sending messages through Telegram API.",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"bin": {
|
|
8
|
+
"telegram-mcp-local-server": "dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist/**/*",
|
|
12
|
+
"README.md",
|
|
13
|
+
"LICENSE",
|
|
14
|
+
"session-helper.js"
|
|
15
|
+
],
|
|
16
|
+
"scripts": {
|
|
17
|
+
"build": "tsc",
|
|
18
|
+
"start": "node dist/index.js",
|
|
19
|
+
"dev": "tsx src/index.ts",
|
|
20
|
+
"test": "jest",
|
|
21
|
+
"test-client": "tsx src/test.ts",
|
|
22
|
+
"session": "node session-helper.js",
|
|
23
|
+
"example": "node example.js",
|
|
24
|
+
"test-readonly": "node test-readonly.js",
|
|
25
|
+
"prepublishOnly": "npm run build",
|
|
26
|
+
"version:patch": "node scripts/bump-version.js patch",
|
|
27
|
+
"version:minor": "node scripts/bump-version.js minor",
|
|
28
|
+
"version:major": "node scripts/bump-version.js major"
|
|
29
|
+
},
|
|
30
|
+
"keywords": ["mcp", "telegram", "server", "model-context-protocol", "ai", "llm", "chat", "messaging"],
|
|
31
|
+
"author": "Your Name <your.email@example.com>",
|
|
32
|
+
"license": "MIT",
|
|
33
|
+
"repository": {
|
|
34
|
+
"type": "git",
|
|
35
|
+
"url": "https://github.com/yourusername/telegram-mcp-local-server.git"
|
|
36
|
+
},
|
|
37
|
+
"homepage": "https://github.com/yourusername/telegram-mcp-local-server#readme",
|
|
38
|
+
"bugs": {
|
|
39
|
+
"url": "https://github.com/yourusername/telegram-mcp-local-server/issues"
|
|
40
|
+
},
|
|
41
|
+
|
|
42
|
+
"dependencies": {
|
|
43
|
+
"@modelcontextprotocol/sdk": "^0.5.0",
|
|
44
|
+
"telegram": "^2.24.10",
|
|
45
|
+
"zod": "^3.22.4"
|
|
46
|
+
},
|
|
47
|
+
"devDependencies": {
|
|
48
|
+
"@types/node": "^20.10.0",
|
|
49
|
+
"tsx": "^4.6.0",
|
|
50
|
+
"typescript": "^5.3.0",
|
|
51
|
+
"jest": "^29.7.0",
|
|
52
|
+
"@types/jest": "^29.5.8",
|
|
53
|
+
"ts-jest": "^29.1.1"
|
|
54
|
+
}
|
|
55
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// Утилита для получения строки сессии Telegram
|
|
4
|
+
const { TelegramClient } = require('telegram');
|
|
5
|
+
const { StringSession } = require('telegram/sessions');
|
|
6
|
+
const readline = require('readline');
|
|
7
|
+
|
|
8
|
+
const rl = readline.createInterface({
|
|
9
|
+
input: process.stdin,
|
|
10
|
+
output: process.stdout,
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
function question(query) {
|
|
14
|
+
return new Promise((resolve) => {
|
|
15
|
+
rl.question(query, resolve);
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
async function main() {
|
|
20
|
+
console.log('=== Telegram Session Helper ===\n');
|
|
21
|
+
console.log('Эта утилита поможет вам получить строку сессии для MCP сервера.');
|
|
22
|
+
console.log('Для этого вам понадобятся API ключи с https://my.telegram.org/\n');
|
|
23
|
+
|
|
24
|
+
try {
|
|
25
|
+
const apiId = await question('Введите ваш API ID: ');
|
|
26
|
+
const apiHash = await question('Введите ваш API Hash: ');
|
|
27
|
+
|
|
28
|
+
console.log('\nПодключение к Telegram...');
|
|
29
|
+
|
|
30
|
+
const stringSession = new StringSession('');
|
|
31
|
+
const client = new TelegramClient(stringSession, parseInt(apiId), apiHash, {
|
|
32
|
+
connectionRetries: 5,
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
await client.start({
|
|
36
|
+
phoneNumber: async () => await question('Введите ваш номер телефона (с кодом страны): '),
|
|
37
|
+
password: async () => await question('Введите ваш пароль двухфакторной аутентификации: '),
|
|
38
|
+
phoneCode: async () => await question('Введите код из SMS: '),
|
|
39
|
+
onError: (err) => console.error('Ошибка:', err),
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
console.log('\n✅ Успешно подключены к Telegram!');
|
|
43
|
+
|
|
44
|
+
const sessionString = client.session.save();
|
|
45
|
+
console.log('\n🔑 Ваша строка сессии:');
|
|
46
|
+
console.log(`"${sessionString}"`);
|
|
47
|
+
|
|
48
|
+
console.log('\n📝 Используйте эту строку сессии в параметре sessionString при вызове telegram_connect');
|
|
49
|
+
console.log('⚠️ Храните эту строку в безопасном месте и не делитесь ей с другими!');
|
|
50
|
+
|
|
51
|
+
await client.disconnect();
|
|
52
|
+
|
|
53
|
+
} catch (error) {
|
|
54
|
+
console.error('Ошибка:', error.message);
|
|
55
|
+
} finally {
|
|
56
|
+
rl.close();
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
main();
|