@mseep/telegram-api-mcp 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +247 -0
  3. package/dist/circuit-breaker.d.ts +34 -0
  4. package/dist/circuit-breaker.d.ts.map +1 -0
  5. package/dist/circuit-breaker.js +64 -0
  6. package/dist/circuit-breaker.js.map +1 -0
  7. package/dist/config.d.ts +29 -0
  8. package/dist/config.d.ts.map +1 -0
  9. package/dist/config.js +22 -0
  10. package/dist/config.js.map +1 -0
  11. package/dist/index.d.ts +3 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +15 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/method-registry.d.ts +78 -0
  16. package/dist/method-registry.d.ts.map +1 -0
  17. package/dist/method-registry.js +117 -0
  18. package/dist/method-registry.js.map +1 -0
  19. package/dist/methods/bot.d.ts +3 -0
  20. package/dist/methods/bot.d.ts.map +1 -0
  21. package/dist/methods/bot.js +258 -0
  22. package/dist/methods/bot.js.map +1 -0
  23. package/dist/methods/business.d.ts +3 -0
  24. package/dist/methods/business.d.ts.map +1 -0
  25. package/dist/methods/business.js +137 -0
  26. package/dist/methods/business.js.map +1 -0
  27. package/dist/methods/chat.d.ts +3 -0
  28. package/dist/methods/chat.d.ts.map +1 -0
  29. package/dist/methods/chat.js +458 -0
  30. package/dist/methods/chat.js.map +1 -0
  31. package/dist/methods/editing.d.ts +3 -0
  32. package/dist/methods/editing.d.ts.map +1 -0
  33. package/dist/methods/editing.js +153 -0
  34. package/dist/methods/editing.js.map +1 -0
  35. package/dist/methods/forum.d.ts +3 -0
  36. package/dist/methods/forum.d.ts.map +1 -0
  37. package/dist/methods/forum.js +184 -0
  38. package/dist/methods/forum.js.map +1 -0
  39. package/dist/methods/forwarding.d.ts +3 -0
  40. package/dist/methods/forwarding.d.ts.map +1 -0
  41. package/dist/methods/forwarding.js +84 -0
  42. package/dist/methods/forwarding.js.map +1 -0
  43. package/dist/methods/games.d.ts +3 -0
  44. package/dist/methods/games.d.ts.map +1 -0
  45. package/dist/methods/games.js +43 -0
  46. package/dist/methods/games.js.map +1 -0
  47. package/dist/methods/gifts.d.ts +3 -0
  48. package/dist/methods/gifts.d.ts.map +1 -0
  49. package/dist/methods/gifts.js +87 -0
  50. package/dist/methods/gifts.js.map +1 -0
  51. package/dist/methods/index.d.ts +13 -0
  52. package/dist/methods/index.d.ts.map +1 -0
  53. package/dist/methods/index.js +57 -0
  54. package/dist/methods/index.js.map +1 -0
  55. package/dist/methods/inline.d.ts +3 -0
  56. package/dist/methods/inline.d.ts.map +1 -0
  57. package/dist/methods/inline.js +32 -0
  58. package/dist/methods/inline.js.map +1 -0
  59. package/dist/methods/managed-bots.d.ts +3 -0
  60. package/dist/methods/managed-bots.d.ts.map +1 -0
  61. package/dist/methods/managed-bots.js +33 -0
  62. package/dist/methods/managed-bots.js.map +1 -0
  63. package/dist/methods/messages.d.ts +3 -0
  64. package/dist/methods/messages.d.ts.map +1 -0
  65. package/dist/methods/messages.js +357 -0
  66. package/dist/methods/messages.js.map +1 -0
  67. package/dist/methods/other.d.ts +3 -0
  68. package/dist/methods/other.d.ts.map +1 -0
  69. package/dist/methods/other.js +247 -0
  70. package/dist/methods/other.js.map +1 -0
  71. package/dist/methods/passport.d.ts +3 -0
  72. package/dist/methods/passport.d.ts.map +1 -0
  73. package/dist/methods/passport.js +15 -0
  74. package/dist/methods/passport.js.map +1 -0
  75. package/dist/methods/payments.d.ts +3 -0
  76. package/dist/methods/payments.d.ts.map +1 -0
  77. package/dist/methods/payments.js +128 -0
  78. package/dist/methods/payments.js.map +1 -0
  79. package/dist/methods/stickers.d.ts +3 -0
  80. package/dist/methods/stickers.d.ts.map +1 -0
  81. package/dist/methods/stickers.js +208 -0
  82. package/dist/methods/stickers.js.map +1 -0
  83. package/dist/methods/stories.d.ts +3 -0
  84. package/dist/methods/stories.d.ts.map +1 -0
  85. package/dist/methods/stories.js +58 -0
  86. package/dist/methods/stories.js.map +1 -0
  87. package/dist/methods/updates.d.ts +3 -0
  88. package/dist/methods/updates.d.ts.map +1 -0
  89. package/dist/methods/updates.js +48 -0
  90. package/dist/methods/updates.js.map +1 -0
  91. package/dist/post-log.d.ts +14 -0
  92. package/dist/post-log.d.ts.map +1 -0
  93. package/dist/post-log.js +48 -0
  94. package/dist/post-log.js.map +1 -0
  95. package/dist/rate-limiter.d.ts +25 -0
  96. package/dist/rate-limiter.d.ts.map +1 -0
  97. package/dist/rate-limiter.js +93 -0
  98. package/dist/rate-limiter.js.map +1 -0
  99. package/dist/server.d.ts +3 -0
  100. package/dist/server.d.ts.map +1 -0
  101. package/dist/server.js +287 -0
  102. package/dist/server.js.map +1 -0
  103. package/dist/telegram-client.d.ts +28 -0
  104. package/dist/telegram-client.d.ts.map +1 -0
  105. package/dist/telegram-client.js +254 -0
  106. package/dist/telegram-client.js.map +1 -0
  107. package/dist/trail.d.ts +86 -0
  108. package/dist/trail.d.ts.map +1 -0
  109. package/dist/trail.js +185 -0
  110. package/dist/trail.js.map +1 -0
  111. package/package.json +61 -0
  112. package/server.json +18 -0
  113. package/smithery.yaml +27 -0
@@ -0,0 +1,86 @@
1
+ /**
2
+ * trail.ts — TRAIL Protocol v2.1 (Tracking Records Across Isolated Logs)
3
+ *
4
+ * Reference implementation for TypeScript MCP servers.
5
+ * https://github.com/timoncool/trail-spec
6
+ *
7
+ * Usage:
8
+ * import { Trail } from "./trail";
9
+ * const trail = new Trail("./data", "my-mcp-server");
10
+ * await trail.append("civitai:image:12345", "posted", "daily-post", { details: { platform: "telegram" } });
11
+ * const { entries, total } = await trail.query({ content_id: "civitai:image:12345" });
12
+ */
13
+ export interface TrailEntry {
14
+ version: number;
15
+ timestamp: string;
16
+ content_id: string;
17
+ action: string;
18
+ requester: string;
19
+ details?: Record<string, unknown>;
20
+ trace_id?: string;
21
+ server?: string;
22
+ entry_id?: string;
23
+ caused_by?: string;
24
+ tags?: string[];
25
+ }
26
+ export interface TrailQuery {
27
+ /** Filter by content ID (exact match, or prefix ending with ':') */
28
+ content_id?: string;
29
+ /** Filter by action (string or array for multi-action filtering) */
30
+ action?: string | string[];
31
+ /** Filter by requester */
32
+ requester?: string;
33
+ /** Filter by trace ID */
34
+ trace_id?: string;
35
+ /** Filter by server name */
36
+ server?: string;
37
+ /** Filter entries that have ALL specified tags */
38
+ tags?: string[];
39
+ /** ISO 8601 timestamp — only return entries after this time */
40
+ since?: string;
41
+ /** Max entries to return, newest first (0 = unlimited, default 50) */
42
+ limit?: number;
43
+ /** Number of entries to skip for pagination */
44
+ offset?: number;
45
+ }
46
+ export interface TrailAppendOptions {
47
+ details?: Record<string, unknown>;
48
+ trace_id?: string;
49
+ server?: string;
50
+ entry_id?: string;
51
+ caused_by?: string;
52
+ tags?: string[];
53
+ }
54
+ export interface TrailQueryResult {
55
+ entries: TrailEntry[];
56
+ total: number;
57
+ }
58
+ export interface TrailStats {
59
+ total_entries: number;
60
+ by_action: Record<string, number>;
61
+ unique_content_ids: number;
62
+ first_entry: string | null;
63
+ last_entry: string | null;
64
+ }
65
+ export declare class Trail {
66
+ private static readonly FILENAME;
67
+ private static readonly VERSION;
68
+ private readonly filePath;
69
+ private readonly serverName?;
70
+ private readonly _mutex;
71
+ constructor(dataDir: string, server?: string);
72
+ /**
73
+ * Append an event to the trail.
74
+ * Thread-safe — serialized via async mutex.
75
+ */
76
+ append(content_id: string, action: string, requester: string, options?: TrailAppendOptions): Promise<TrailEntry>;
77
+ /** Query the trail with filters. Returns entries newest first + total count. */
78
+ query(q?: TrailQuery): Promise<TrailQueryResult>;
79
+ /** Get summary statistics for the trail. */
80
+ stats(requester?: string, since?: string): Promise<TrailStats>;
81
+ /** Check if content was already posted. */
82
+ isUsed(content_id: string, requester?: string): Promise<boolean>;
83
+ /** Get set of all posted content IDs. */
84
+ getUsedIds(requester?: string): Promise<Set<string>>;
85
+ }
86
+ //# sourceMappingURL=trail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trail.d.ts","sourceRoot":"","sources":["../src/trail.ts"],"names":[],"mappings":"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"}
package/dist/trail.js ADDED
@@ -0,0 +1,185 @@
1
+ /**
2
+ * trail.ts — TRAIL Protocol v2.1 (Tracking Records Across Isolated Logs)
3
+ *
4
+ * Reference implementation for TypeScript MCP servers.
5
+ * https://github.com/timoncool/trail-spec
6
+ *
7
+ * Usage:
8
+ * import { Trail } from "./trail";
9
+ * const trail = new Trail("./data", "my-mcp-server");
10
+ * await trail.append("civitai:image:12345", "posted", "daily-post", { details: { platform: "telegram" } });
11
+ * const { entries, total } = await trail.query({ content_id: "civitai:image:12345" });
12
+ */
13
+ import { readFile, appendFile, mkdir, access } from "fs/promises";
14
+ import { join, dirname } from "path";
15
+ /**
16
+ * Async mutex for serializing writes.
17
+ * Ensures append-only integrity without external dependencies.
18
+ */
19
+ class Mutex {
20
+ _queue = [];
21
+ _locked = false;
22
+ async acquire() {
23
+ if (!this._locked) {
24
+ this._locked = true;
25
+ return;
26
+ }
27
+ return new Promise((resolve) => {
28
+ this._queue.push(resolve);
29
+ });
30
+ }
31
+ release() {
32
+ const next = this._queue.shift();
33
+ if (next) {
34
+ next();
35
+ }
36
+ else {
37
+ this._locked = false;
38
+ }
39
+ }
40
+ }
41
+ /** Check if content_id filter matches an entry's content_id.
42
+ * - Exact match: "civitai:image:12345" matches "civitai:image:12345"
43
+ * - Prefix match: "civitai:image:" matches "civitai:image:12345" (prefix must end with ':')
44
+ */
45
+ function matchContentId(filter, entryId) {
46
+ if (entryId === filter)
47
+ return true;
48
+ if (filter.endsWith(":") && entryId.startsWith(filter))
49
+ return true;
50
+ return false;
51
+ }
52
+ export class Trail {
53
+ static FILENAME = "trail.jsonl";
54
+ static VERSION = 2;
55
+ filePath;
56
+ serverName;
57
+ _mutex = new Mutex();
58
+ constructor(dataDir, server) {
59
+ this.filePath = join(dataDir, Trail.FILENAME);
60
+ this.serverName = server;
61
+ mkdir(dirname(this.filePath), { recursive: true }).catch(() => { });
62
+ }
63
+ /**
64
+ * Append an event to the trail.
65
+ * Thread-safe — serialized via async mutex.
66
+ */
67
+ async append(content_id, action, requester, options) {
68
+ const entry = {
69
+ version: Trail.VERSION,
70
+ timestamp: new Date().toISOString(),
71
+ content_id,
72
+ action,
73
+ requester,
74
+ };
75
+ const srv = options?.server ?? this.serverName;
76
+ if (srv)
77
+ entry.server = srv;
78
+ if (options?.details)
79
+ entry.details = options.details;
80
+ if (options?.trace_id)
81
+ entry.trace_id = options.trace_id;
82
+ if (options?.entry_id)
83
+ entry.entry_id = options.entry_id;
84
+ if (options?.caused_by)
85
+ entry.caused_by = options.caused_by;
86
+ if (options?.tags)
87
+ entry.tags = options.tags;
88
+ await this._mutex.acquire();
89
+ try {
90
+ await appendFile(this.filePath, JSON.stringify(entry) + "\n", "utf-8");
91
+ }
92
+ finally {
93
+ this._mutex.release();
94
+ }
95
+ return entry;
96
+ }
97
+ /** Query the trail with filters. Returns entries newest first + total count. */
98
+ async query(q = {}) {
99
+ const { content_id, action, requester, trace_id, server, tags, since, limit = 50, offset = 0, } = q;
100
+ const fileExists = await access(this.filePath)
101
+ .then(() => true)
102
+ .catch(() => false);
103
+ if (!fileExists)
104
+ return { entries: [], total: 0 };
105
+ const actionSet = action
106
+ ? new Set(Array.isArray(action) ? action : [action])
107
+ : null;
108
+ const data = await readFile(this.filePath, "utf-8");
109
+ const lines = data.split("\n").filter(Boolean);
110
+ const matched = [];
111
+ for (const line of lines) {
112
+ try {
113
+ const entry = JSON.parse(line);
114
+ if (content_id && !matchContentId(content_id, entry.content_id))
115
+ continue;
116
+ if (actionSet && !actionSet.has(entry.action))
117
+ continue;
118
+ if (requester && entry.requester !== requester)
119
+ continue;
120
+ if (trace_id && entry.trace_id !== trace_id)
121
+ continue;
122
+ if (server && entry.server !== server)
123
+ continue;
124
+ if (tags && !tags.every((t) => entry.tags?.includes(t)))
125
+ continue;
126
+ if (since && entry.timestamp < since)
127
+ continue;
128
+ matched.push(entry);
129
+ }
130
+ catch {
131
+ continue;
132
+ }
133
+ }
134
+ const total = matched.length;
135
+ let result = matched.reverse();
136
+ if (offset)
137
+ result = result.slice(offset);
138
+ if (limit)
139
+ result = result.slice(0, limit);
140
+ return { entries: result, total };
141
+ }
142
+ /** Get summary statistics for the trail. */
143
+ async stats(requester, since) {
144
+ const { entries } = await this.query({ requester, since, limit: 0 });
145
+ const byAction = {};
146
+ const cids = new Set();
147
+ const timestamps = [];
148
+ for (const e of entries) {
149
+ byAction[e.action] = (byAction[e.action] ?? 0) + 1;
150
+ cids.add(e.content_id);
151
+ timestamps.push(e.timestamp);
152
+ }
153
+ return {
154
+ total_entries: entries.length,
155
+ by_action: byAction,
156
+ unique_content_ids: cids.size,
157
+ first_entry: timestamps.length
158
+ ? timestamps.reduce((a, b) => (a < b ? a : b))
159
+ : null,
160
+ last_entry: timestamps.length
161
+ ? timestamps.reduce((a, b) => (a > b ? a : b))
162
+ : null,
163
+ };
164
+ }
165
+ /** Check if content was already posted. */
166
+ async isUsed(content_id, requester) {
167
+ const { entries } = await this.query({
168
+ content_id,
169
+ action: "posted",
170
+ requester,
171
+ limit: 1,
172
+ });
173
+ return entries.length > 0;
174
+ }
175
+ /** Get set of all posted content IDs. */
176
+ async getUsedIds(requester) {
177
+ const { entries } = await this.query({
178
+ action: "posted",
179
+ requester,
180
+ limit: 0,
181
+ });
182
+ return new Set(entries.map((e) => e.content_id));
183
+ }
184
+ }
185
+ //# sourceMappingURL=trail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trail.js","sourceRoot":"","sources":["../src/trail.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,61 @@
1
+ {
2
+ "name": "@mseep/telegram-api-mcp",
3
+ "version": "0.1.0",
4
+ "description": "Ultimate Telegram Bot API v9.6 MCP Server \u2014 169 methods, meta-mode, rate limiting, circuit breaker",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "telegram-api-mcp": "dist/index.js"
9
+ },
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "dev": "tsx src/index.ts",
13
+ "start": "node dist/index.js",
14
+ "test": "vitest run",
15
+ "test:watch": "vitest",
16
+ "test:coverage": "vitest run --coverage",
17
+ "typecheck": "tsc --noEmit",
18
+ "lint": "eslint src/",
19
+ "prepublishOnly": "npm run build"
20
+ },
21
+ "keywords": [
22
+ "telegram",
23
+ "bot-api",
24
+ "mcp",
25
+ "mcp-server",
26
+ "model-context-protocol",
27
+ "claude",
28
+ "ai-agent",
29
+ "mseep"
30
+ ],
31
+ "author": "timoncool",
32
+ "license": "MIT",
33
+ "files": [
34
+ "dist",
35
+ "README.md",
36
+ "LICENSE",
37
+ "server.json",
38
+ "smithery.yaml"
39
+ ],
40
+ "repository": {
41
+ "type": "git",
42
+ "url": "https://github.com/timoncool/telegram-api-mcp.git"
43
+ },
44
+ "engines": {
45
+ "node": ">=18.0.0"
46
+ },
47
+ "dependencies": {
48
+ "@modelcontextprotocol/sdk": "^1.12.0",
49
+ "zod": "^3.24.0"
50
+ },
51
+ "devDependencies": {
52
+ "@types/node": "^22.0.0",
53
+ "@typescript-eslint/eslint-plugin": "^8.58.0",
54
+ "@typescript-eslint/parser": "^8.58.0",
55
+ "eslint": "^10.2.0",
56
+ "tsx": "^4.19.0",
57
+ "typescript": "^5.7.0",
58
+ "vitest": "^3.0.0"
59
+ },
60
+ "publisher": "mseep"
61
+ }
package/server.json ADDED
@@ -0,0 +1,18 @@
1
+ {
2
+ "$schema": "https://registry.modelcontextprotocol.io/schema/server.json",
3
+ "name": "io.github.timoncool/telegram-api-mcp",
4
+ "description": "Ultimate Telegram Bot API v9.6 MCP server — 169 methods, meta-mode, rate limiting, circuit breaker, Zod validation",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "https://github.com/timoncool/telegram-api-mcp.git"
8
+ },
9
+ "version": "0.1.0",
10
+ "packages": [
11
+ {
12
+ "name": "telegram-api-mcp",
13
+ "type": "npm",
14
+ "version": "0.1.0",
15
+ "transport": "stdio"
16
+ }
17
+ ]
18
+ }
package/smithery.yaml ADDED
@@ -0,0 +1,27 @@
1
+ startCommand:
2
+ type: stdio
3
+ configSchema:
4
+ type: object
5
+ required:
6
+ - telegramBotToken
7
+ properties:
8
+ telegramBotToken:
9
+ type: string
10
+ description: Telegram Bot API token from @BotFather
11
+ defaultChatId:
12
+ type: string
13
+ description: Default chat ID for all tools (optional)
14
+ metaMode:
15
+ type: boolean
16
+ description: Use 2-tool meta mode instead of 169 tools (saves ~99% context tokens)
17
+ default: false
18
+ commandFunction: |-
19
+ (config) => ({
20
+ command: 'npx',
21
+ args: ['-y', 'telegram-api-mcp'],
22
+ env: {
23
+ TELEGRAM_BOT_TOKEN: config.telegramBotToken,
24
+ ...(config.defaultChatId ? { TELEGRAM_DEFAULT_CHAT_ID: config.defaultChatId } : {}),
25
+ ...(config.metaMode ? { TELEGRAM_META_MODE: 'true' } : {})
26
+ }
27
+ })