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 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
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=test.d.ts.map
@@ -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
@@ -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();