diff --git a/src/lib/mcp/telegram/tools/addContact.ts b/src/lib/mcp/telegram/tools/addContact.ts index 122b42bad..529ac9b62 100644 --- a/src/lib/mcp/telegram/tools/addContact.ts +++ b/src/lib/mcp/telegram/tools/addContact.ts @@ -3,6 +3,7 @@ import type { TelegramMCPContext } from '../types'; import { ErrorCategory, logAndFormatError } from '../../errorHandler'; import { mtprotoService } from '../../../../services/mtprotoService'; import { Api } from 'telegram'; +import bigInt from 'big-integer'; import { optString } from '../args'; export const tool: MCPTool = { @@ -38,7 +39,7 @@ export async function addContact( new Api.contacts.ImportContacts({ contacts: [ new Api.InputPhoneContact({ - clientId: BigInt(0), + clientId: bigInt(0), phone, firstName, lastName, diff --git a/src/lib/mcp/telegram/tools/blockUser.ts b/src/lib/mcp/telegram/tools/blockUser.ts index 7bab4040f..f14dca85d 100644 --- a/src/lib/mcp/telegram/tools/blockUser.ts +++ b/src/lib/mcp/telegram/tools/blockUser.ts @@ -28,7 +28,7 @@ export async function blockUser( await mtprotoService.withFloodWaitHandling(async () => { const inputUser = await client.getInputEntity(userId); await client.invoke( - new Api.contacts.Block({ id: inputUser as Api.TypeInputPeer }), + new Api.contacts.Block({ id: inputUser as unknown as Api.TypeInputPeer }), ); }); diff --git a/src/lib/mcp/telegram/tools/createPoll.ts b/src/lib/mcp/telegram/tools/createPoll.ts index 21eb76ef6..0077922f5 100644 --- a/src/lib/mcp/telegram/tools/createPoll.ts +++ b/src/lib/mcp/telegram/tools/createPoll.ts @@ -5,6 +5,7 @@ import { validateId } from '../../validation'; import { getChatById } from '../telegramApi'; import { mtprotoService } from '../../../../services/mtprotoService'; import { Api } from 'telegram'; +import bigInt from 'big-integer'; export const tool: MCPTool = { name: "create_poll", @@ -45,7 +46,7 @@ export async function createPoll( peer: inputPeer, media: new Api.InputMediaPoll({ poll: new Api.Poll({ - id: BigInt(0), + id: bigInt(0), question: new Api.TextWithEntities({ text: question, entities: [] }), answers: options.map((opt, i) => new Api.PollAnswer({ @@ -56,7 +57,7 @@ export async function createPoll( }), }), message: '', - randomId: BigInt(Math.floor(Math.random() * Number.MAX_SAFE_INTEGER)), + randomId: bigInt(Math.floor(Math.random() * Number.MAX_SAFE_INTEGER)), }), ); }); diff --git a/src/lib/mcp/telegram/tools/deleteContact.ts b/src/lib/mcp/telegram/tools/deleteContact.ts index 4e7b6d3e2..5894c09f8 100644 --- a/src/lib/mcp/telegram/tools/deleteContact.ts +++ b/src/lib/mcp/telegram/tools/deleteContact.ts @@ -29,7 +29,7 @@ export async function deleteContact( const inputUser = await client.getInputEntity(userId); await client.invoke( new Api.contacts.DeleteContacts({ - id: [inputUser as Api.TypeInputUser], + id: [inputUser as unknown as Api.TypeInputUser], }), ); }); diff --git a/src/lib/mcp/telegram/tools/deleteProfilePhoto.ts b/src/lib/mcp/telegram/tools/deleteProfilePhoto.ts index d5f0790ac..a6b141341 100644 --- a/src/lib/mcp/telegram/tools/deleteProfilePhoto.ts +++ b/src/lib/mcp/telegram/tools/deleteProfilePhoto.ts @@ -3,6 +3,7 @@ import type { TelegramMCPContext } from "../types"; import { ErrorCategory, logAndFormatError } from '../../errorHandler'; import { mtprotoService } from '../../../../services/mtprotoService'; import { Api } from 'telegram'; +import bigInt from 'big-integer'; export const tool: MCPTool = { name: "delete_profile_photo", @@ -22,7 +23,7 @@ export async function deleteProfilePhoto( new Api.photos.GetUserPhotos({ userId: new Api.InputUserSelf(), offset: 0, - maxId: BigInt(0), + maxId: bigInt(0), limit: 1, }), ); diff --git a/src/lib/mcp/telegram/tools/exportContacts.ts b/src/lib/mcp/telegram/tools/exportContacts.ts index 1c7ea81b4..025d6d9a7 100644 --- a/src/lib/mcp/telegram/tools/exportContacts.ts +++ b/src/lib/mcp/telegram/tools/exportContacts.ts @@ -3,6 +3,7 @@ import type { TelegramMCPContext } from "../types"; import { ErrorCategory, logAndFormatError } from "../../errorHandler"; import { mtprotoService } from "../../../../services/mtprotoService"; import { Api } from "telegram"; +import bigInt from "big-integer"; export const tool: MCPTool = { name: "export_contacts", @@ -18,7 +19,7 @@ export async function exportContacts( const client = mtprotoService.getClient(); const result = await mtprotoService.withFloodWaitHandling(async () => { - return client.invoke(new Api.contacts.GetContacts({ hash: BigInt(0) })); + return client.invoke(new Api.contacts.GetContacts({ hash: bigInt(0) })); }); if ( diff --git a/src/lib/mcp/telegram/tools/getBotInfo.ts b/src/lib/mcp/telegram/tools/getBotInfo.ts index c0ec00a3f..2db9ee949 100644 --- a/src/lib/mcp/telegram/tools/getBotInfo.ts +++ b/src/lib/mcp/telegram/tools/getBotInfo.ts @@ -28,7 +28,7 @@ export async function getBotInfo( const result = await mtprotoService.withFloodWaitHandling(async () => { const inputUser = await client.getInputEntity(botId); return client.invoke( - new Api.users.GetFullUser({ id: inputUser as Api.TypeInputUser }), + new Api.users.GetFullUser({ id: inputUser as unknown as Api.TypeInputUser }), ); }); diff --git a/src/lib/mcp/telegram/tools/getContactIds.ts b/src/lib/mcp/telegram/tools/getContactIds.ts index de3181f74..277ef699a 100644 --- a/src/lib/mcp/telegram/tools/getContactIds.ts +++ b/src/lib/mcp/telegram/tools/getContactIds.ts @@ -3,6 +3,7 @@ import type { TelegramMCPContext } from '../types'; import { ErrorCategory, logAndFormatError } from '../../errorHandler'; import { mtprotoService } from '../../../../services/mtprotoService'; import { Api } from 'telegram'; +import bigInt from 'big-integer'; export const tool: MCPTool = { name: 'get_contact_ids', @@ -18,7 +19,7 @@ export async function getContactIds( const client = mtprotoService.getClient(); const result = await mtprotoService.withFloodWaitHandling(async () => { - return client.invoke(new Api.contacts.GetContactIDs({ hash: BigInt(0) })); + return client.invoke(new Api.contacts.GetContactIDs({ hash: bigInt(0) })); }); if (!result || !Array.isArray(result) || result.length === 0) { diff --git a/src/lib/mcp/telegram/tools/getGifSearch.ts b/src/lib/mcp/telegram/tools/getGifSearch.ts index fa6451009..5b910989a 100644 --- a/src/lib/mcp/telegram/tools/getGifSearch.ts +++ b/src/lib/mcp/telegram/tools/getGifSearch.ts @@ -1,20 +1,62 @@ import type { MCPTool, MCPToolResult } from "../../types"; import type { TelegramMCPContext } from "../types"; -import { notImplemented } from "./notImplemented"; +import { ErrorCategory, logAndFormatError } from '../../errorHandler'; +import { mtprotoService } from '../../../../services/mtprotoService'; +import { Api } from 'telegram'; +import { optNumber } from '../args'; export const tool: MCPTool = { name: "get_gif_search", description: "Search GIFs", inputSchema: { type: "object", - properties: { query: { type: "string", description: "Search query" } }, + properties: { + query: { type: "string", description: "Search query" }, + limit: { type: 'number', description: 'Max results', default: 10 }, + }, required: ["query"], }, }; export async function getGifSearch( - _args: Record, + args: Record, _context: TelegramMCPContext, ): Promise { - return notImplemented("get_gif_search"); + try { + const query = typeof args.query === 'string' ? args.query : ''; + if (!query) return { content: [{ type: 'text', text: 'query is required' }], isError: true }; + const limit = optNumber(args, 'limit', 10); + + const client = mtprotoService.getClient(); + + const result = await mtprotoService.withFloodWaitHandling(async () => { + const bot = await client.getInputEntity('gif'); + return client.invoke( + new Api.messages.GetInlineBotResults({ + bot: bot as unknown as Api.TypeInputUser, + peer: new Api.InputPeerSelf(), + query, + offset: '', + }), + ); + }); + + const results = (result as any)?.results; + if (!results || !Array.isArray(results) || results.length === 0) { + return { content: [{ type: 'text', text: 'No GIFs found for: ' + query }] }; + } + + const lines = results.slice(0, limit).map((r: any, i: number) => { + const title = r.title ?? r.description ?? 'GIF ' + (i + 1); + return (i + 1) + '. ' + title; + }); + + return { content: [{ type: 'text', text: lines.length + ' GIFs found:\n' + lines.join('\n') }] }; + } catch (error) { + return logAndFormatError( + 'get_gif_search', + error instanceof Error ? error : new Error(String(error)), + ErrorCategory.MEDIA, + ); + } } diff --git a/src/lib/mcp/telegram/tools/getPinnedMessages.ts b/src/lib/mcp/telegram/tools/getPinnedMessages.ts index bb1545f32..a78008625 100644 --- a/src/lib/mcp/telegram/tools/getPinnedMessages.ts +++ b/src/lib/mcp/telegram/tools/getPinnedMessages.ts @@ -5,6 +5,7 @@ import { getChatById, getMessages, formatMessage } from '../telegramApi'; import { validateId } from '../../validation'; import { mtprotoService } from '../../../../services/mtprotoService'; import { Api } from 'telegram'; +import bigInt from 'big-integer'; export const tool: MCPTool = { name: 'get_pinned_messages', @@ -47,7 +48,7 @@ export async function getPinnedMessages( limit: 50, maxId: 0, minId: 0, - hash: BigInt(0), + hash: bigInt(0), }), ); diff --git a/src/lib/mcp/telegram/tools/getRecentActions.ts b/src/lib/mcp/telegram/tools/getRecentActions.ts index 844e87689..5ccd36df8 100644 --- a/src/lib/mcp/telegram/tools/getRecentActions.ts +++ b/src/lib/mcp/telegram/tools/getRecentActions.ts @@ -5,6 +5,7 @@ import { validateId } from '../../validation'; import { getChatById } from '../telegramApi'; import { mtprotoService } from '../../../../services/mtprotoService'; import { Api } from 'telegram'; +import bigInt from 'big-integer'; import { optNumber } from '../args'; export const tool: MCPTool = { @@ -44,8 +45,8 @@ export async function getRecentActions( new Api.channels.GetAdminLog({ channel: inputChannel as Api.TypeInputChannel, q: '', - maxId: BigInt(0), - minId: BigInt(0), + maxId: bigInt(0), + minId: bigInt(0), limit, }), ); diff --git a/src/lib/mcp/telegram/tools/getStickerSets.ts b/src/lib/mcp/telegram/tools/getStickerSets.ts index afbf36383..ed34cb4ee 100644 --- a/src/lib/mcp/telegram/tools/getStickerSets.ts +++ b/src/lib/mcp/telegram/tools/getStickerSets.ts @@ -3,6 +3,7 @@ import type { TelegramMCPContext } from "../types"; import { ErrorCategory, logAndFormatError } from '../../errorHandler'; import { mtprotoService } from '../../../../services/mtprotoService'; import { Api } from 'telegram'; +import bigInt from 'big-integer'; export const tool: MCPTool = { name: "get_sticker_sets", @@ -18,7 +19,7 @@ export async function getStickerSets( const client = mtprotoService.getClient(); const result = await mtprotoService.withFloodWaitHandling(async () => { - return client.invoke(new Api.messages.GetAllStickers({ hash: BigInt(0) })); + return client.invoke(new Api.messages.GetAllStickers({ hash: bigInt(0) })); }); const sets = (result as any)?.sets; diff --git a/src/lib/mcp/telegram/tools/getUserPhotos.ts b/src/lib/mcp/telegram/tools/getUserPhotos.ts index f51d28e2a..98e823ba4 100644 --- a/src/lib/mcp/telegram/tools/getUserPhotos.ts +++ b/src/lib/mcp/telegram/tools/getUserPhotos.ts @@ -4,6 +4,7 @@ import { ErrorCategory, logAndFormatError } from '../../errorHandler'; import { validateId } from '../../validation'; import { mtprotoService } from '../../../../services/mtprotoService'; import { Api } from 'telegram'; +import bigInt from 'big-integer'; import { optNumber } from '../args'; export const tool: MCPTool = { @@ -32,9 +33,9 @@ export async function getUserPhotos( const inputUser = await client.getInputEntity(userId); return client.invoke( new Api.photos.GetUserPhotos({ - userId: inputUser as Api.TypeInputUser, + userId: inputUser as unknown as Api.TypeInputUser, offset: 0, - maxId: BigInt(0), + maxId: bigInt(0), limit, }), ); diff --git a/src/lib/mcp/telegram/tools/getUserStatus.ts b/src/lib/mcp/telegram/tools/getUserStatus.ts index 4d8c7aa87..d361d827a 100644 --- a/src/lib/mcp/telegram/tools/getUserStatus.ts +++ b/src/lib/mcp/telegram/tools/getUserStatus.ts @@ -28,7 +28,7 @@ export async function getUserStatus( const result = await mtprotoService.withFloodWaitHandling(async () => { const inputUser = await client.getInputEntity(userId); return client.invoke( - new Api.users.GetUsers({ id: [inputUser as Api.TypeInputUser] }), + new Api.users.GetUsers({ id: [inputUser as unknown as Api.TypeInputUser] }), ); }); diff --git a/src/lib/mcp/telegram/tools/importContacts.ts b/src/lib/mcp/telegram/tools/importContacts.ts index 4c321960d..6d2debc67 100644 --- a/src/lib/mcp/telegram/tools/importContacts.ts +++ b/src/lib/mcp/telegram/tools/importContacts.ts @@ -3,6 +3,7 @@ import type { TelegramMCPContext } from "../types"; import { ErrorCategory, logAndFormatError } from "../../errorHandler"; import { mtprotoService } from "../../../../services/mtprotoService"; import { Api } from "telegram"; +import bigInt from "big-integer"; export const tool: MCPTool = { name: "import_contacts", @@ -49,7 +50,7 @@ export async function importContacts( const inputContacts = contactsArg.map( (c: any, i: number) => new Api.InputPhoneContact({ - clientId: BigInt(i), + clientId: bigInt(i), phone: String(c.phone ?? ""), firstName: String(c.first_name ?? ""), lastName: String(c.last_name ?? ""), diff --git a/src/lib/mcp/telegram/tools/listContacts.ts b/src/lib/mcp/telegram/tools/listContacts.ts index ce6645718..b855e25da 100644 --- a/src/lib/mcp/telegram/tools/listContacts.ts +++ b/src/lib/mcp/telegram/tools/listContacts.ts @@ -3,6 +3,7 @@ import type { TelegramMCPContext } from '../types'; import { ErrorCategory, logAndFormatError } from '../../errorHandler'; import { mtprotoService } from '../../../../services/mtprotoService'; import { Api } from 'telegram'; +import bigInt from 'big-integer'; export const tool: MCPTool = { name: 'list_contacts', @@ -18,7 +19,7 @@ export async function listContacts( const client = mtprotoService.getClient(); const result = await mtprotoService.withFloodWaitHandling(async () => { - return client.invoke(new Api.contacts.GetContacts({ hash: BigInt(0) })); + return client.invoke(new Api.contacts.GetContacts({ hash: bigInt(0) })); }); if (!result || !('users' in result) || !Array.isArray(result.users)) { diff --git a/src/lib/mcp/telegram/tools/unblockUser.ts b/src/lib/mcp/telegram/tools/unblockUser.ts index 0f73c4e1a..6bb847cbd 100644 --- a/src/lib/mcp/telegram/tools/unblockUser.ts +++ b/src/lib/mcp/telegram/tools/unblockUser.ts @@ -28,7 +28,7 @@ export async function unblockUser( await mtprotoService.withFloodWaitHandling(async () => { const inputUser = await client.getInputEntity(userId); await client.invoke( - new Api.contacts.Unblock({ id: inputUser as Api.TypeInputPeer }), + new Api.contacts.Unblock({ id: inputUser as unknown as Api.TypeInputPeer }), ); });