teletype-mcp-server 0.1.0 → 0.1.1

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 (64) hide show
  1. package/.env.example +7 -0
  2. package/LAUNCHGUIDE.md +51 -0
  3. package/README-ru.md +49 -11
  4. package/README.md +68 -30
  5. package/dist/config.d.ts +4 -0
  6. package/dist/config.js +17 -0
  7. package/dist/config.js.map +1 -1
  8. package/dist/http.js +69 -1
  9. package/dist/http.js.map +1 -1
  10. package/dist/landing-page.d.ts +1 -0
  11. package/dist/landing-page.js +166 -0
  12. package/dist/landing-page.js.map +1 -0
  13. package/dist/oauth-page.d.ts +1 -0
  14. package/dist/oauth-page.js +242 -0
  15. package/dist/oauth-page.js.map +1 -0
  16. package/dist/oauth-store.d.ts +48 -0
  17. package/dist/oauth-store.js +131 -0
  18. package/dist/oauth-store.js.map +1 -0
  19. package/dist/oauth.d.ts +4 -0
  20. package/dist/oauth.js +382 -0
  21. package/dist/oauth.js.map +1 -0
  22. package/dist/request-context.d.ts +2 -0
  23. package/dist/request-context.js.map +1 -1
  24. package/dist/tool-policy.js +7 -0
  25. package/dist/tool-policy.js.map +1 -1
  26. package/docs/CLIENTS.md +651 -27
  27. package/docs/CONTRIBUTING.md +4 -2
  28. package/docs/OAUTH.md +54 -0
  29. package/docs/SECURITY.md +3 -1
  30. package/docs/ru/CLIENTS.md +651 -27
  31. package/docs/ru/CONTRIBUTING.md +4 -2
  32. package/docs/ru/OAUTH.md +54 -0
  33. package/docs/ru/SECURITY.md +3 -1
  34. package/examples/clients/goose-stdio.yaml +13 -0
  35. package/examples/clients/openclaw.json +13 -0
  36. package/gemini-extension.json +22 -0
  37. package/lhm.plugin.json +1408 -0
  38. package/llms-install.md +17 -0
  39. package/package.json +9 -4
  40. package/plugin/.claude-plugin/plugin.json +37 -0
  41. package/plugin/.cursor-plugin/plugin.json +34 -0
  42. package/plugin/LICENSE +21 -0
  43. package/plugin/README.md +48 -0
  44. package/plugin/assets/README.md +12 -0
  45. package/plugin/assets/consent.js +32 -0
  46. package/plugin/assets/fonts/OFL.txt +93 -0
  47. package/plugin/assets/fonts/manrope.woff2 +0 -0
  48. package/plugin/assets/icon-400.png +0 -0
  49. package/plugin/assets/icon.png +0 -0
  50. package/plugin/assets/icon.svg +15 -0
  51. package/plugin/assets/landing.css +442 -0
  52. package/plugin/assets/landing.js +85 -0
  53. package/plugin/assets/logo.svg +16 -0
  54. package/plugin/commands/client-summary.md +14 -0
  55. package/plugin/commands/draft-reply.md +13 -0
  56. package/plugin/commands/escalate-issue.md +15 -0
  57. package/plugin/commands/shift-handover.md +10 -0
  58. package/plugin/commands/triage-inbox.md +13 -0
  59. package/plugin/mcp.json +10 -0
  60. package/plugin/plugin.json +15 -0
  61. package/plugin/skills/teletype-support/SKILL.md +3 -1
  62. package/plugin/skills/teletype-support/references/installation.md +31 -0
  63. package/server.json +18 -4
  64. package/smithery.yaml +3 -2
@@ -0,0 +1,1408 @@
1
+ {
2
+ "author": "Teletype-App",
3
+ "authorUrl": "https://github.com/Teletype-App",
4
+ "description": "MCP server for Teletype customer support: conversations, customer profiles, replies, and workspace tools.",
5
+ "homepage": "https://teletype.app",
6
+ "identifier": "teletype-app-teletype-mcp-server",
7
+ "name": "Teletype",
8
+ "prompts": [
9
+ {
10
+ "name": "triage-inbox",
11
+ "description": "Triage unanswered Teletype conversations by urgency and suggest the operator's next actions.",
12
+ "arguments": [
13
+ {
14
+ "name": "channel_id",
15
+ "description": "Optional channel ID to limit the queue.",
16
+ "required": false
17
+ },
18
+ {
19
+ "name": "limit",
20
+ "description": "How many dialogs to load for analysis (default 10).",
21
+ "required": false
22
+ }
23
+ ]
24
+ },
25
+ {
26
+ "name": "draft-reply",
27
+ "description": "Read the client's conversation and draft a clear, polite reply in the requested tone.",
28
+ "arguments": [
29
+ {
30
+ "name": "dialog_id",
31
+ "description": "Teletype conversation ID for the response.",
32
+ "required": true
33
+ },
34
+ {
35
+ "name": "instructions",
36
+ "description": "Extra instructions for the reply, such as 'refund approved, offer a 10% discount'.",
37
+ "required": false
38
+ }
39
+ ]
40
+ },
41
+ {
42
+ "name": "client-summary",
43
+ "description": "Summarize a client's contact details, tags, notes, recent conversations, and sentiment.",
44
+ "arguments": [
45
+ {
46
+ "name": "client",
47
+ "description": "Name, phone, email or client ID to search.",
48
+ "required": true
49
+ }
50
+ ]
51
+ },
52
+ {
53
+ "name": "escalate-issue",
54
+ "description": "Create a structured bug report or escalation from a client conversation.",
55
+ "arguments": [
56
+ {
57
+ "name": "dialog_id",
58
+ "description": "ID of the dialog with the problem message.",
59
+ "required": true
60
+ },
61
+ {
62
+ "name": "component",
63
+ "description": "Component or service (for example, 'Payment', 'Mobile application', 'CRM integration').",
64
+ "required": false
65
+ }
66
+ ]
67
+ },
68
+ {
69
+ "name": "shift-handover",
70
+ "description": "Prepare a support shift handover with unanswered conversations, channel issues, team availability, and project warnings.",
71
+ "arguments": [
72
+ {
73
+ "name": "channel_id",
74
+ "description": "Channel ID for focus check (optional).",
75
+ "required": false
76
+ }
77
+ ]
78
+ }
79
+ ],
80
+ "resources": [
81
+ {
82
+ "name": "Teletype Workspace Metadata",
83
+ "uri": "teletype://workspace/metadata",
84
+ "description": "Teletype Project Directory: channels, tags, categories, templates, operators and groups.",
85
+ "mimeType": "application/json"
86
+ },
87
+ {
88
+ "name": "Teletype Project Status",
89
+ "uri": "teletype://project/status",
90
+ "description": "Teletype project status summary: balance, operator availability and API errors.",
91
+ "mimeType": "application/json"
92
+ },
93
+ {
94
+ "name": "Teletype Unanswered Dialogs",
95
+ "uri": "teletype://dialogs/unanswered",
96
+ "description": "The current queue of unanswered customer requests with links to conversations.",
97
+ "mimeType": "application/json"
98
+ },
99
+ {
100
+ "name": "Teletype Dialog Thread",
101
+ "uriTemplate": "teletype://dialogs/{dialogId}",
102
+ "description": "History of Teletype dialog messages by dialog ID.",
103
+ "mimeType": "application/json"
104
+ },
105
+ {
106
+ "name": "Teletype Client Profile",
107
+ "uriTemplate": "teletype://clients/{clientId}",
108
+ "description": "Teletype client profile (contacts, tags, notes) by client ID.",
109
+ "mimeType": "application/json"
110
+ }
111
+ ],
112
+ "tags": ["customer-support", "messaging", "teletype", "mcp"],
113
+ "tools": [
114
+ {
115
+ "name": "find_conversations",
116
+ "title": "Find conversations",
117
+ "description": "Find Teletype conversations by status (open/close/unanswered/all), channel, client, tags, operator, category, last message text, or client name. The query parameter searches last message text or client name, not dialog IDs. If the user already supplied dialog_id, pass it directly to read_conversation_thread, resolve_conversation, or send_reply_to_client as appropriate. For text in older messages use find_messages and continue through pages. Each result includes link_to_dialog. Show every conversation to the user as a clickable Markdown link. Use this tool for the active queue, unanswered conversations, a client's history, or tagged cases. For several dialogs of one client, prefer read_client_history.",
118
+ "inputSchema": {
119
+ "type": "object",
120
+ "properties": {
121
+ "status": {
122
+ "type": "string",
123
+ "enum": ["unanswered", "open", "close", "all"],
124
+ "description": "Filter by status. Default is 'open'. Use 'unanswered' for triage."
125
+ },
126
+ "channel": {
127
+ "type": "string",
128
+ "description": "Channel name (eg 'WhatsApp Sales') or its type (telegram, whatsapp_teletype, email, vk, viber, instagram_direct_business, etc.). Resolves automatically."
129
+ },
130
+ "tags": {
131
+ "type": "array",
132
+ "items": {
133
+ "type": "string"
134
+ },
135
+ "description": "Client tag names. All listed tags must match. For example, ['VIP', 'refund']."
136
+ },
137
+ "operator": {
138
+ "type": "string",
139
+ "description": "Agent name (full or partial) or 'unassigned' string for dialogs without an assigned agent."
140
+ },
141
+ "client": {
142
+ "type": "string",
143
+ "description": "Name, phone, email or client_id - filter by client."
144
+ },
145
+ "category": {
146
+ "type": "string",
147
+ "description": "Conversation category name. List available categories with list_workspace_metadata(resource='categories')."
148
+ },
149
+ "query": {
150
+ "type": "string",
151
+ "description": "Search query based on the text of the last message or client name (case-insensitive substring search)."
152
+ },
153
+ "limit": {
154
+ "type": "integer",
155
+ "minimum": 1,
156
+ "maximum": 100,
157
+ "description": "Maximum number of conversations to return. Default: 20. Allowed range is 1 to 100."
158
+ },
159
+ "channel_type": {
160
+ "type": "string",
161
+ "description": "Channel type for filtering (for example: telegram, whatsapp_teletype, email, vk, viber, instagram_direct_business, etc.)."
162
+ },
163
+ "page": {
164
+ "type": "integer",
165
+ "minimum": 1,
166
+ "description": "Results page number (default 1). Pages beyond the last one return an empty list."
167
+ },
168
+ "response_format": {
169
+ "type": "string",
170
+ "enum": ["concise", "detailed"],
171
+ "description": "'concise' (default) keeps the text output short. 'detailed' adds per-item fields to the text output (ids, statuses, timestamps, full message texts). structuredContent always contains every field regardless of this parameter."
172
+ }
173
+ },
174
+ "additionalProperties": false
175
+ },
176
+ "outputSchema": {
177
+ "type": "object",
178
+ "properties": {
179
+ "total_returned": {
180
+ "type": "integer"
181
+ },
182
+ "search_truncated": {
183
+ "type": "boolean"
184
+ },
185
+ "has_more": {
186
+ "type": "boolean"
187
+ },
188
+ "next_page_hint": {
189
+ "anyOf": [
190
+ {
191
+ "type": "string"
192
+ },
193
+ {
194
+ "type": "null"
195
+ }
196
+ ]
197
+ },
198
+ "notices": {
199
+ "type": "array",
200
+ "items": {
201
+ "type": "string"
202
+ }
203
+ },
204
+ "defaults_applied": {
205
+ "type": "object"
206
+ },
207
+ "resolved": {
208
+ "type": "object"
209
+ },
210
+ "dialogs": {
211
+ "type": "array",
212
+ "items": {
213
+ "type": "object"
214
+ }
215
+ }
216
+ },
217
+ "required": ["total_returned", "search_truncated", "dialogs"],
218
+ "additionalProperties": true
219
+ },
220
+ "annotations": {
221
+ "title": "Find conversations",
222
+ "readOnlyHint": true,
223
+ "destructiveHint": false,
224
+ "idempotentHint": true,
225
+ "openWorldHint": true
226
+ }
227
+ },
228
+ {
229
+ "name": "list_clients",
230
+ "title": "List clients",
231
+ "description": "List project clients, optionally filtering by phone. Use this for a client inventory or to look up a phone number without changing data. The Public API matches part of a normalized phone number. Follow page/has_more to continue.",
232
+ "inputSchema": {
233
+ "type": "object",
234
+ "properties": {
235
+ "phone": {
236
+ "type": "string",
237
+ "description": "Phone number or part of one. The Public API searches normalized phone numbers."
238
+ },
239
+ "page": {
240
+ "type": "integer",
241
+ "minimum": 1,
242
+ "description": "API page, starting at 1. Default: 1."
243
+ },
244
+ "limit": {
245
+ "type": "integer",
246
+ "minimum": 1,
247
+ "maximum": 100,
248
+ "description": "Clients per page, 1 to 100. Default: 20."
249
+ }
250
+ },
251
+ "additionalProperties": false
252
+ },
253
+ "outputSchema": {
254
+ "type": "object",
255
+ "properties": {
256
+ "clients": {
257
+ "type": "array",
258
+ "items": {
259
+ "type": "object"
260
+ }
261
+ },
262
+ "total_returned": {
263
+ "type": "integer"
264
+ },
265
+ "page": {
266
+ "type": "integer"
267
+ },
268
+ "has_more": {
269
+ "type": "boolean"
270
+ }
271
+ },
272
+ "required": ["clients", "total_returned", "page", "has_more"],
273
+ "additionalProperties": true
274
+ },
275
+ "annotations": {
276
+ "title": "List clients",
277
+ "readOnlyHint": true,
278
+ "destructiveHint": false,
279
+ "idempotentHint": true,
280
+ "openWorldHint": true
281
+ }
282
+ },
283
+ {
284
+ "name": "find_messages",
285
+ "title": "Find messages",
286
+ "description": "List project messages, optionally filtered by conversation, client ID, channel, or message text. The query parameter searches message text, not message IDs. To edit, delete, or resend a known message_id, use manage_sent_message directly. Text matching runs only on the returned API page because the Public API has no full-text filter. Continue through pages while has_more is true before concluding that an older message is absent. Use this instead of find_conversations for text in historical messages.",
287
+ "inputSchema": {
288
+ "type": "object",
289
+ "properties": {
290
+ "query": {
291
+ "type": "string",
292
+ "description": "Case-insensitive substring in message text on this page only. Empty results do not mean no match exists on later pages."
293
+ },
294
+ "dialog_id": {
295
+ "type": "string",
296
+ "description": "Conversation ID to restrict messages. From find_conversations or a conversation link."
297
+ },
298
+ "client_id": {
299
+ "type": "string",
300
+ "description": "Exact client ID to restrict messages. Use list_clients or lookup_client_profile first."
301
+ },
302
+ "channel": {
303
+ "type": "string",
304
+ "description": "Channel name, type, or ID. Resolves to channelId."
305
+ },
306
+ "only_active": {
307
+ "type": "boolean",
308
+ "description": "Limit to active channels when channel is omitted. Default: false."
309
+ },
310
+ "page": {
311
+ "type": "integer",
312
+ "minimum": 1,
313
+ "description": "API page to inspect, starting at 1. Default: 1."
314
+ },
315
+ "limit": {
316
+ "type": "integer",
317
+ "minimum": 1,
318
+ "maximum": 100,
319
+ "description": "Messages per API page, 1 to 100. Default: 50."
320
+ },
321
+ "response_format": {
322
+ "type": "string",
323
+ "enum": ["concise", "detailed"],
324
+ "description": "Concise text by default, detailed text includes full message bodies. structuredContent always includes full text."
325
+ }
326
+ },
327
+ "additionalProperties": false
328
+ },
329
+ "outputSchema": {
330
+ "type": "object",
331
+ "properties": {
332
+ "messages": {
333
+ "type": "array",
334
+ "items": {
335
+ "type": "object"
336
+ }
337
+ },
338
+ "total_returned": {
339
+ "type": "integer"
340
+ },
341
+ "page": {
342
+ "type": "integer"
343
+ },
344
+ "has_more": {
345
+ "type": "boolean"
346
+ }
347
+ },
348
+ "required": ["messages", "total_returned", "page", "has_more"],
349
+ "additionalProperties": true
350
+ },
351
+ "annotations": {
352
+ "title": "Find messages",
353
+ "readOnlyHint": true,
354
+ "destructiveHint": false,
355
+ "idempotentHint": true,
356
+ "openWorldHint": true
357
+ }
358
+ },
359
+ {
360
+ "name": "lookup_client_profile",
361
+ "title": "Client profile lookup",
362
+ "description": "Get a client's contact details, tags, custom fields, recent notes, and conversations in one call. Each recent_dialogs item includes link_to_dialog. Show these links as Markdown. Accepts a name, phone number, email, or client_id. If a name is ambiguous, the result lists candidates so you can retry with a client_id or phone number.",
363
+ "inputSchema": {
364
+ "type": "object",
365
+ "properties": {
366
+ "client": {
367
+ "type": "string",
368
+ "description": "Client name, phone (any format), email or client_id."
369
+ },
370
+ "include_dialog_history": {
371
+ "type": "boolean",
372
+ "description": "Whether to include a list of the last 5 conversations. Defaults to true."
373
+ },
374
+ "include_notes": {
375
+ "type": "boolean",
376
+ "description": "Whether to include operator notes. Defaults to true."
377
+ },
378
+ "response_format": {
379
+ "type": "string",
380
+ "enum": ["concise", "detailed"],
381
+ "description": "'concise' (default) keeps the text output short. 'detailed' adds per-item fields to the text output (ids, statuses, timestamps, full message texts). structuredContent always contains every field regardless of this parameter."
382
+ }
383
+ },
384
+ "required": ["client"],
385
+ "additionalProperties": false
386
+ },
387
+ "outputSchema": {
388
+ "type": "object",
389
+ "properties": {
390
+ "client_id": {
391
+ "type": "string"
392
+ },
393
+ "recent_dialogs": {
394
+ "type": "array",
395
+ "items": {
396
+ "type": "object"
397
+ }
398
+ },
399
+ "partial_errors": {
400
+ "type": "array",
401
+ "items": {
402
+ "type": "string"
403
+ }
404
+ }
405
+ },
406
+ "required": ["client_id", "recent_dialogs", "partial_errors"],
407
+ "additionalProperties": true
408
+ },
409
+ "annotations": {
410
+ "title": "Client profile lookup",
411
+ "readOnlyHint": true,
412
+ "destructiveHint": false,
413
+ "idempotentHint": true,
414
+ "openWorldHint": true
415
+ }
416
+ },
417
+ {
418
+ "name": "read_conversation_thread",
419
+ "title": "Read conversation thread",
420
+ "description": "Read a conversation's messages in chronological order, including authors, attachments, replies, delivery status, and timestamps. Also returns the channel, client, operator, and category. Show link_to_dialog when presenting the conversation and link_to_message when quoting a message. If dialog_id is already known, pass it directly without listing or searching conversations. Alternatively pass a client to read their latest conversation. When drafting a reply, do not promise actions, deadlines, or policy exceptions that the conversation does not establish.",
421
+ "inputSchema": {
422
+ "type": "object",
423
+ "properties": {
424
+ "dialog_id": {
425
+ "type": "string",
426
+ "description": "Conversation ID. Use a known ID directly. Call find_conversations only if the ID is missing."
427
+ },
428
+ "client": {
429
+ "type": "string",
430
+ "description": "Alternative dialog_id: name/phone/email/client_id. The client's last conversation will be taken."
431
+ },
432
+ "messages_limit": {
433
+ "type": "integer",
434
+ "minimum": 1,
435
+ "maximum": 200,
436
+ "description": "How many recent messages to return. Default is 50. Allowed range is 1 to 200."
437
+ },
438
+ "mark_seen": {
439
+ "type": "boolean",
440
+ "description": "If true, marks the conversation as read by an operator (resets the unread badge in the Teletype panel). Requires confirm: true. Default is false."
441
+ },
442
+ "confirm": {
443
+ "type": "boolean",
444
+ "const": true,
445
+ "description": "Required only with mark_seen: true. Without it a mark_seen request is rejected and nothing is read. Without mark_seen the call only reads and leaves the unread state untouched."
446
+ },
447
+ "include_sessions": {
448
+ "type": "boolean",
449
+ "description": "Include the conversation's session history (dates, operators, statuses, and categories). Default: false."
450
+ },
451
+ "session_id": {
452
+ "type": "string",
453
+ "description": "ID of a specific session to obtain extended information about it."
454
+ },
455
+ "include_group_clients": {
456
+ "type": "boolean",
457
+ "description": "If true and the conversation is a group chat, returns a list of group members. Default is false."
458
+ },
459
+ "response_format": {
460
+ "type": "string",
461
+ "enum": ["concise", "detailed"],
462
+ "description": "'concise' (default) keeps the text output short. 'detailed' adds per-item fields to the text output (ids, statuses, timestamps, full message texts). structuredContent always contains every field regardless of this parameter."
463
+ }
464
+ },
465
+ "additionalProperties": false
466
+ },
467
+ "outputSchema": {
468
+ "type": "object",
469
+ "properties": {
470
+ "dialog_id": {
471
+ "type": "string"
472
+ },
473
+ "messages_count": {
474
+ "type": "integer"
475
+ },
476
+ "messages": {
477
+ "type": "array",
478
+ "items": {
479
+ "type": "object"
480
+ }
481
+ },
482
+ "marked_seen": {
483
+ "type": "boolean"
484
+ },
485
+ "notices": {
486
+ "type": "array",
487
+ "items": {
488
+ "type": "string"
489
+ }
490
+ }
491
+ },
492
+ "required": ["dialog_id", "messages_count", "messages"],
493
+ "additionalProperties": true
494
+ },
495
+ "annotations": {
496
+ "title": "Read conversation thread",
497
+ "readOnlyHint": false,
498
+ "destructiveHint": false,
499
+ "idempotentHint": true,
500
+ "openWorldHint": true
501
+ }
502
+ },
503
+ {
504
+ "name": "read_client_history",
505
+ "title": "Read client history",
506
+ "description": "Read a client's recent conversations in one call: the latest dialogs with their messages, channels, and links. Use it to get context on a client across several conversations before replying. read_conversation_thread returns the full metadata of one dialog. Accepts a name, phone number, email, or client_id.",
507
+ "inputSchema": {
508
+ "type": "object",
509
+ "properties": {
510
+ "client": {
511
+ "type": "string",
512
+ "description": "Client name, phone (any format), email or client_id."
513
+ },
514
+ "dialogs_limit": {
515
+ "type": "integer",
516
+ "minimum": 1,
517
+ "maximum": 5,
518
+ "description": "How many recent conversations to return, from 1 to 5. Default is 3."
519
+ },
520
+ "messages_per_dialog": {
521
+ "type": "integer",
522
+ "minimum": 1,
523
+ "maximum": 20,
524
+ "description": "How many recent messages to return per conversation, from 1 to 20. Default is 10."
525
+ },
526
+ "response_format": {
527
+ "type": "string",
528
+ "enum": ["concise", "detailed"],
529
+ "description": "'concise' (default) keeps the text output short. 'detailed' adds per-item fields to the text output (ids, statuses, timestamps, full message texts). structuredContent always contains every field regardless of this parameter."
530
+ }
531
+ },
532
+ "required": ["client"],
533
+ "additionalProperties": false
534
+ },
535
+ "outputSchema": {
536
+ "type": "object",
537
+ "properties": {
538
+ "client_id": {
539
+ "type": "string"
540
+ },
541
+ "client_name": {
542
+ "type": "string"
543
+ },
544
+ "dialogs_returned": {
545
+ "type": "integer"
546
+ },
547
+ "dialogs": {
548
+ "type": "array",
549
+ "items": {
550
+ "type": "object"
551
+ }
552
+ },
553
+ "partial_errors": {
554
+ "type": "array",
555
+ "items": {
556
+ "type": "string"
557
+ }
558
+ }
559
+ },
560
+ "required": ["client_id", "client_name", "dialogs_returned", "dialogs", "partial_errors"],
561
+ "additionalProperties": true
562
+ },
563
+ "annotations": {
564
+ "title": "Read client history",
565
+ "readOnlyHint": true,
566
+ "destructiveHint": false,
567
+ "idempotentHint": true,
568
+ "openWorldHint": true
569
+ }
570
+ },
571
+ {
572
+ "name": "send_reply_to_client",
573
+ "title": "Send reply to client",
574
+ "description": "Send a message only when the user asked to send it. Pass recipient_dialog_id for an existing conversation, or client and channel to start one. For a draft, use read_conversation_thread and write the draft without calling this tool. Supports text, project templates, attachments, and reply_to_message_id. Marks the conversation answered by default. Requires confirm: true. The result reports API acceptance, not confirmed delivery.",
575
+ "inputSchema": {
576
+ "type": "object",
577
+ "properties": {
578
+ "recipient_dialog_id": {
579
+ "type": "string",
580
+ "description": "ID of the existing conversation to reply to. If set, the client/channel parameters are ignored."
581
+ },
582
+ "client": {
583
+ "type": "string",
584
+ "description": "For a NEW conversation: recipient's name/phone/email/client_id."
585
+ },
586
+ "channel": {
587
+ "type": "string",
588
+ "description": "For a NEW conversation: name or type of sending channel (telegram, whatsapp_teletype, email, etc.)."
589
+ },
590
+ "text": {
591
+ "type": "string",
592
+ "description": "Message text. Optional if template_name is used."
593
+ },
594
+ "template_name": {
595
+ "type": "string",
596
+ "description": "The name of the template from the project library. List - list_workspace_metadata with resource='templates'."
597
+ },
598
+ "template_variables": {
599
+ "type": "object",
600
+ "description": "Substitutions for the template: {'name': 'Ivan', 'order_id': '1234'}. In the template, variables are designated {{name}}.",
601
+ "additionalProperties": {
602
+ "type": "string"
603
+ }
604
+ },
605
+ "attachment_url": {
606
+ "type": "string",
607
+ "description": "Public URL of the file or image. Teletype will download the file from this URL and send it to the channel. Use if the file has already been uploaded to the cloud (S3 presigned, Dropbox direct, etc.)."
608
+ },
609
+ "attachment_path": {
610
+ "type": "string",
611
+ "description": "Absolute path to a local attachment. Available only in trusted stdio mode. HTTP rejects local paths. Takes precedence over attachment_url."
612
+ },
613
+ "reply_to_message_id": {
614
+ "type": "string",
615
+ "description": "ID of the message that is being quoted."
616
+ },
617
+ "mark_dialog_answered": {
618
+ "type": "boolean",
619
+ "description": "Whether to mark the conversation as answered after sending. Defaults to true."
620
+ },
621
+ "auto_close": {
622
+ "type": "boolean",
623
+ "description": "When sending through a channel (recipient_type='channel'), close the new session automatically (autoClose=1)."
624
+ },
625
+ "create_dialog_only": {
626
+ "type": "boolean",
627
+ "description": "Create a conversation with a client in a channel without sending text (via /dialog/create). Requires client and channel."
628
+ },
629
+ "confirm": {
630
+ "type": "boolean",
631
+ "const": true,
632
+ "description": "Explicit confirmation of sending a message or creating a conversation."
633
+ },
634
+ "dry_run": {
635
+ "type": "boolean",
636
+ "description": "Preview only: resolve the recipient, render the template, and return the full target without sending anything. Does not require confirm."
637
+ }
638
+ },
639
+ "additionalProperties": false
640
+ },
641
+ "outputSchema": {
642
+ "type": "object",
643
+ "properties": {
644
+ "accepted": {
645
+ "type": "boolean"
646
+ },
647
+ "delivery_confirmed": {
648
+ "type": "boolean"
649
+ },
650
+ "message_ids": {
651
+ "type": "array",
652
+ "items": {
653
+ "type": "string"
654
+ }
655
+ },
656
+ "dry_run": {
657
+ "type": "boolean"
658
+ }
659
+ },
660
+ "required": [],
661
+ "additionalProperties": true
662
+ },
663
+ "annotations": {
664
+ "title": "Send reply to client",
665
+ "readOnlyHint": false,
666
+ "destructiveHint": true,
667
+ "idempotentHint": false,
668
+ "openWorldHint": true
669
+ }
670
+ },
671
+ {
672
+ "name": "create_dialog_by_phone",
673
+ "title": "Create dialog by phone",
674
+ "description": "Create or find a conversation for a phone number in a phone-capable channel without sending a message. This is a write, not a phone lookup: it may create a conversation and may assign the project owner to an existing open conversation. Use list_clients to check a phone without changing data. Preview with dry_run, then call with confirm: true only when creation is requested.",
675
+ "inputSchema": {
676
+ "type": "object",
677
+ "properties": {
678
+ "phone": {
679
+ "type": "string",
680
+ "description": "Recipient phone number. Use an international number when available."
681
+ },
682
+ "channel": {
683
+ "type": "string",
684
+ "description": "Phone-capable channel name, type, or ID: WhatsApp, MAX, SMS, Kakao, Telegram, or VK Direct."
685
+ },
686
+ "dry_run": {
687
+ "type": "boolean",
688
+ "description": "Preview the channel, phone, and possible side effects without creating a dialog."
689
+ },
690
+ "confirm": {
691
+ "type": "boolean",
692
+ "const": true,
693
+ "description": "Explicit confirmation to create or find the dialog. May change the operator of an existing open dialog."
694
+ }
695
+ },
696
+ "required": ["phone", "channel"],
697
+ "additionalProperties": false
698
+ },
699
+ "outputSchema": {
700
+ "type": "object",
701
+ "properties": {
702
+ "dry_run": {
703
+ "type": "boolean"
704
+ },
705
+ "created_or_found": {
706
+ "type": "boolean"
707
+ },
708
+ "dialog_id": {
709
+ "type": "string"
710
+ },
711
+ "dialog_url": {
712
+ "type": "string"
713
+ }
714
+ },
715
+ "required": ["dry_run", "created_or_found"],
716
+ "additionalProperties": true
717
+ },
718
+ "annotations": {
719
+ "title": "Create dialog by phone",
720
+ "readOnlyHint": false,
721
+ "destructiveHint": true,
722
+ "idempotentHint": false,
723
+ "openWorldHint": true
724
+ }
725
+ },
726
+ {
727
+ "name": "annotate_client_record",
728
+ "title": "Annotate client record",
729
+ "description": "Update client or conversation metadata in one call: add or remove tags, create a note, update custom fields, or set a category. Tags, notes, and fields apply to the client. dialog_category applies to the dialog and requires dialog_id. A note becomes a system message in the client's current conversation timeline, visible to operators in the Teletype panel. If an operation fails, other changes may still have been applied. Check partial_errors before retrying. Requires confirm: true.",
730
+ "inputSchema": {
731
+ "type": "object",
732
+ "properties": {
733
+ "client": {
734
+ "type": "string",
735
+ "description": "Name/phone/email/client_id. Optional if dialog_id identifies the client."
736
+ },
737
+ "dialog_id": {
738
+ "type": "string",
739
+ "description": "Conversation ID. Required for dialog_category and can identify the client for other changes."
740
+ },
741
+ "add_tags": {
742
+ "type": "array",
743
+ "items": {
744
+ "type": "string"
745
+ },
746
+ "description": "Names of tags to add. Non-existent tags are listed in partial_errors."
747
+ },
748
+ "remove_tags": {
749
+ "type": "array",
750
+ "items": {
751
+ "type": "string"
752
+ },
753
+ "description": "Names of tags to be deleted."
754
+ },
755
+ "note": {
756
+ "type": "string",
757
+ "description": "The text of the new note. It appears in the client's current conversation timeline, visible to operators."
758
+ },
759
+ "delete_note_id": {
760
+ "type": "string",
761
+ "description": "ID of the client note to delete (obtained from lookup_client_profile)."
762
+ },
763
+ "custom_fields": {
764
+ "type": "object",
765
+ "description": "Dictionary of custom fields: {'order_id': '1234', 'segment': 'B2B'}. Replaces existing values by key.",
766
+ "additionalProperties": true
767
+ },
768
+ "dialog_category": {
769
+ "type": "string",
770
+ "description": "Category name for the dialog (requires dialog_id)."
771
+ },
772
+ "name": {
773
+ "type": "string",
774
+ "description": "Update client display name."
775
+ },
776
+ "phone": {
777
+ "type": "string",
778
+ "description": "Update the client's phone."
779
+ },
780
+ "email": {
781
+ "type": "string",
782
+ "description": "Update client email."
783
+ },
784
+ "additional_payload": {
785
+ "description": "Additional client data (JSON string or object, for example { source: 'website' }).",
786
+ "oneOf": [
787
+ {
788
+ "type": "object",
789
+ "additionalProperties": true
790
+ },
791
+ {
792
+ "type": "string"
793
+ }
794
+ ]
795
+ },
796
+ "force_additional_payload": {
797
+ "type": "boolean",
798
+ "description": "Overwrite the data available in the additional information array (true) instead of merging it (false)."
799
+ },
800
+ "confirm": {
801
+ "type": "boolean",
802
+ "const": true,
803
+ "description": "Explicit confirmation of changes to client data or conversation."
804
+ }
805
+ },
806
+ "required": ["confirm"],
807
+ "additionalProperties": false
808
+ },
809
+ "outputSchema": {
810
+ "type": "object",
811
+ "properties": {
812
+ "applied": {
813
+ "type": "object"
814
+ },
815
+ "partial_errors": {
816
+ "type": "array",
817
+ "items": {
818
+ "type": "string"
819
+ }
820
+ }
821
+ },
822
+ "required": ["applied", "partial_errors"],
823
+ "additionalProperties": true
824
+ },
825
+ "annotations": {
826
+ "title": "Annotate client record",
827
+ "readOnlyHint": false,
828
+ "destructiveHint": true,
829
+ "idempotentHint": false,
830
+ "openWorldHint": true
831
+ }
832
+ },
833
+ {
834
+ "name": "resolve_conversation",
835
+ "title": "Resolve conversation",
836
+ "description": "Close a conversation or hand it to an operator. Default: close=true. Use close=false only when the user wants it left open. Category, tags, operator, and final note are optional, separate changes. Closing does not require a category. Look up exact category and tag names before using them. Requires confirm: true. Read applied and partial_errors before reporting or retrying.",
837
+ "inputSchema": {
838
+ "type": "object",
839
+ "properties": {
840
+ "dialog_id": {
841
+ "type": "string",
842
+ "description": "Conversation ID. Use a known ID directly. Look it up only if the ID is missing."
843
+ },
844
+ "assign_operator": {
845
+ "type": "string",
846
+ "description": "Assign an operator to the conversation (ID, name, email of the operator, or 'auto' for automatic distribution)."
847
+ },
848
+ "close": {
849
+ "type": "boolean",
850
+ "description": "Close the dialog after completing other actions (true by default). Specify false if you only want to assign an operator, set a category or tags, leaving the dialog open."
851
+ },
852
+ "final_note": {
853
+ "type": "string",
854
+ "description": "A final note about the client is attached upon closing."
855
+ },
856
+ "category": {
857
+ "type": "string",
858
+ "description": "Optional exact category name. First list_workspace_metadata(resource='categories') if the user requested a category. Do not infer or translate a category name from 'resolved' or 'closed'. Omit this field when merely closing a conversation."
859
+ },
860
+ "add_tags": {
861
+ "type": "array",
862
+ "items": {
863
+ "type": "string"
864
+ },
865
+ "description": "Client tags to add when closing."
866
+ },
867
+ "mark_unanswered": {
868
+ "type": "boolean",
869
+ "description": "If true, it does not close the conversation, but marks its open requests as unanswered. Closed requests are not re-opened."
870
+ },
871
+ "mark_answered": {
872
+ "type": "boolean",
873
+ "description": "If true, marks open requests in the conversation as answered (clears the unanswered flag)."
874
+ },
875
+ "confirm": {
876
+ "type": "boolean",
877
+ "const": true,
878
+ "description": "Explicit confirmation to close or mark the conversation as unanswered/answered."
879
+ }
880
+ },
881
+ "required": ["dialog_id", "confirm"],
882
+ "additionalProperties": false
883
+ },
884
+ "outputSchema": {
885
+ "type": "object",
886
+ "properties": {
887
+ "dialog_id": {
888
+ "type": "string"
889
+ },
890
+ "applied": {
891
+ "type": "object"
892
+ },
893
+ "partial_errors": {
894
+ "type": "array",
895
+ "items": {
896
+ "type": "string"
897
+ }
898
+ }
899
+ },
900
+ "required": ["dialog_id", "applied", "partial_errors"],
901
+ "additionalProperties": true
902
+ },
903
+ "annotations": {
904
+ "title": "Resolve conversation",
905
+ "readOnlyHint": false,
906
+ "destructiveHint": true,
907
+ "idempotentHint": false,
908
+ "openWorldHint": true
909
+ }
910
+ },
911
+ {
912
+ "name": "list_workspace_metadata",
913
+ "title": "Workspace metadata",
914
+ "description": "Look up project channels, tags, categories, quick reply templates, operators, or groups. Set resource to the requested kind. The default 'all' can truncate each list and does extra API work. Use resource='channels' for channel names and active state, or resource='categories' before assigning a category. WABA templates are separate. Results are cached for one minute.",
915
+ "inputSchema": {
916
+ "type": "object",
917
+ "properties": {
918
+ "resource": {
919
+ "type": "string",
920
+ "enum": [
921
+ "channels",
922
+ "tags",
923
+ "categories",
924
+ "templates",
925
+ "template_directories",
926
+ "operators",
927
+ "groups",
928
+ "all"
929
+ ],
930
+ "description": "Choose one resource when possible: channels, tags, categories, templates, template_directories, operators, or groups. 'all' returns several limited lists and is for requests about the whole workspace."
931
+ },
932
+ "group_id": {
933
+ "type": "string",
934
+ "description": "Optional: ID or group name for obtaining detailed data (operators, supervisors, channels) via /group/view/:groupId."
935
+ },
936
+ "channel_type": {
937
+ "type": "string",
938
+ "description": "For resource='channels': filtering by channel type (for example telegram, email, whatsapp_teletype)."
939
+ },
940
+ "only_active": {
941
+ "type": "boolean",
942
+ "description": "For resource='channels': return only active channels."
943
+ }
944
+ },
945
+ "additionalProperties": false
946
+ },
947
+ "outputSchema": {
948
+ "type": "object",
949
+ "properties": {
950
+ "resource_errors": {
951
+ "type": "object"
952
+ },
953
+ "group": {
954
+ "type": "object"
955
+ }
956
+ },
957
+ "required": ["resource_errors"],
958
+ "additionalProperties": true
959
+ },
960
+ "annotations": {
961
+ "title": "Workspace metadata",
962
+ "readOnlyHint": true,
963
+ "destructiveHint": false,
964
+ "idempotentHint": true,
965
+ "openWorldHint": true
966
+ }
967
+ },
968
+ {
969
+ "name": "get_project_status",
970
+ "title": "Project status",
971
+ "description": "Check project health: finances, operator availability, Public API status, channel activity, and webhook errors. For a technical check of channels or the Public API, set aspect='technical'. Use list_workspace_metadata(resource='channels') when the user wants the channel inventory. Includes derived warnings.",
972
+ "inputSchema": {
973
+ "type": "object",
974
+ "properties": {
975
+ "aspect": {
976
+ "type": "string",
977
+ "enum": ["financial", "team", "technical", "all"],
978
+ "description": "Choose 'technical' for channels, Public API, or webhook health, 'financial' for balance and billing, 'team' for operators, or 'all' for a whole-project overview. Default is 'all'."
979
+ },
980
+ "include_warnings": {
981
+ "type": "boolean",
982
+ "description": "Whether to include a derived warning block. Defaults to true."
983
+ },
984
+ "operator_details": {
985
+ "type": "boolean",
986
+ "description": "If true, an expanded list of operators is returned to team. Default is false."
987
+ }
988
+ },
989
+ "additionalProperties": false
990
+ },
991
+ "outputSchema": {
992
+ "type": "object",
993
+ "additionalProperties": true
994
+ },
995
+ "annotations": {
996
+ "title": "Project status",
997
+ "readOnlyHint": true,
998
+ "destructiveHint": false,
999
+ "idempotentHint": true,
1000
+ "openWorldHint": true
1001
+ }
1002
+ },
1003
+ {
1004
+ "name": "manage_sent_message",
1005
+ "title": "Manage sent message",
1006
+ "description": "Manage a sent message in Teletype by its message_id: edit the text, delete it, or resend after failure. If the user supplied message_id, use it directly rather than searching message text. Otherwise take it from the send result's message_ids or read_conversation_thread. Requires an explicit confirm: true.",
1007
+ "inputSchema": {
1008
+ "type": "object",
1009
+ "properties": {
1010
+ "message_id": {
1011
+ "type": "string",
1012
+ "description": "Message ID obtained from send_reply_to_client or read_conversation_thread."
1013
+ },
1014
+ "action": {
1015
+ "type": "string",
1016
+ "enum": ["update", "delete", "resend"],
1017
+ "description": "Action: 'update' (edit text), 'delete' (delete), 'resend' (resend)."
1018
+ },
1019
+ "text": {
1020
+ "type": "string",
1021
+ "description": "New message text (required for action='update')."
1022
+ },
1023
+ "confirm": {
1024
+ "type": "boolean",
1025
+ "const": true,
1026
+ "description": "Confirms the requested message operation."
1027
+ }
1028
+ },
1029
+ "required": ["message_id", "action", "confirm"],
1030
+ "additionalProperties": false
1031
+ },
1032
+ "outputSchema": {
1033
+ "type": "object",
1034
+ "properties": {
1035
+ "message_id": {
1036
+ "type": "string"
1037
+ },
1038
+ "action": {
1039
+ "type": "string"
1040
+ },
1041
+ "status": {
1042
+ "type": "string"
1043
+ }
1044
+ },
1045
+ "required": ["message_id", "action", "status"],
1046
+ "additionalProperties": true
1047
+ },
1048
+ "annotations": {
1049
+ "title": "Manage sent message",
1050
+ "readOnlyHint": false,
1051
+ "destructiveHint": true,
1052
+ "idempotentHint": false,
1053
+ "openWorldHint": true
1054
+ }
1055
+ },
1056
+ {
1057
+ "name": "send_whatsapp_template",
1058
+ "title": "Send WhatsApp template",
1059
+ "description": "Send a WABA-approved template in an existing Edna WhatsApp conversation outside the 24-hour service window. Get the WABA template ID from project settings or the user. Quick reply templates returned by list_workspace_metadata are different. Requires confirm: true.",
1060
+ "inputSchema": {
1061
+ "type": "object",
1062
+ "properties": {
1063
+ "channel_id": {
1064
+ "type": "string",
1065
+ "description": "WhatsApp channel ID. Use a known ID directly. Call list_workspace_metadata(resource='channels') only if it is missing."
1066
+ },
1067
+ "dialog_id": {
1068
+ "type": "string",
1069
+ "description": "Conversation ID. Use a known ID directly. Call find_conversations only if it is missing."
1070
+ },
1071
+ "template_id": {
1072
+ "type": "string",
1073
+ "description": "ID of a WABA approved template imported from Edna. It is not in resource='templates' with the list of quick responses."
1074
+ },
1075
+ "template_params": {
1076
+ "type": "object",
1077
+ "description": "Template parameters: text_variables (array of strings for variables like {{1}}, {{2}}), button_variables, header_variables, attachment.",
1078
+ "properties": {
1079
+ "text_variables": {
1080
+ "type": "array",
1081
+ "items": {
1082
+ "type": "string"
1083
+ },
1084
+ "description": "Text values to be substituted into the template body."
1085
+ },
1086
+ "header_variables": {
1087
+ "type": "array",
1088
+ "items": {
1089
+ "type": "string"
1090
+ },
1091
+ "description": "Values for variables in the template header."
1092
+ },
1093
+ "button_variables": {
1094
+ "type": "array",
1095
+ "items": {
1096
+ "type": "string"
1097
+ },
1098
+ "description": "Values for template button variables."
1099
+ },
1100
+ "attachment": {
1101
+ "type": "object",
1102
+ "properties": {
1103
+ "url": {
1104
+ "type": "string",
1105
+ "format": "uri"
1106
+ },
1107
+ "name": {
1108
+ "type": "string"
1109
+ }
1110
+ },
1111
+ "required": ["url"]
1112
+ }
1113
+ },
1114
+ "additionalProperties": true
1115
+ },
1116
+ "template_options": {
1117
+ "type": "object",
1118
+ "properties": {
1119
+ "priority": {
1120
+ "type": "string",
1121
+ "enum": ["LOW", "NORMAL", "HIGH", "REALTIME"]
1122
+ },
1123
+ "sendDelay": {
1124
+ "type": "integer",
1125
+ "minimum": 0
1126
+ },
1127
+ "comment": {
1128
+ "type": "string"
1129
+ }
1130
+ },
1131
+ "additionalProperties": true
1132
+ },
1133
+ "confirm": {
1134
+ "type": "boolean",
1135
+ "const": true,
1136
+ "description": "Confirms sending the WhatsApp template to the client."
1137
+ },
1138
+ "dry_run": {
1139
+ "type": "boolean",
1140
+ "description": "Preview only: validate parameters and return the target conversation and template without sending. Does not require confirm."
1141
+ }
1142
+ },
1143
+ "required": ["channel_id", "dialog_id", "template_id"],
1144
+ "additionalProperties": false
1145
+ },
1146
+ "outputSchema": {
1147
+ "type": "object",
1148
+ "properties": {
1149
+ "channel_id": {
1150
+ "type": "string"
1151
+ },
1152
+ "dialog_id": {
1153
+ "type": "string"
1154
+ },
1155
+ "template_id": {
1156
+ "type": "string"
1157
+ },
1158
+ "message_ids": {
1159
+ "type": "array",
1160
+ "items": {
1161
+ "type": "string"
1162
+ }
1163
+ },
1164
+ "accepted": {
1165
+ "type": "boolean"
1166
+ },
1167
+ "delivery_confirmed": {
1168
+ "type": "boolean"
1169
+ },
1170
+ "dry_run": {
1171
+ "type": "boolean"
1172
+ }
1173
+ },
1174
+ "required": ["channel_id", "dialog_id", "template_id"],
1175
+ "additionalProperties": true
1176
+ },
1177
+ "annotations": {
1178
+ "title": "Send WhatsApp template",
1179
+ "readOnlyHint": false,
1180
+ "destructiveHint": true,
1181
+ "idempotentHint": false,
1182
+ "openWorldHint": true
1183
+ }
1184
+ },
1185
+ {
1186
+ "name": "manage_operator_group",
1187
+ "title": "Manage operator group",
1188
+ "description": "Manage operator groups: add or remove members, link or unlink channels, assign supervisors, and control visibility of other operators' conversations. Take group names from list_workspace_metadata(resource='groups'). Requires confirm: true.",
1189
+ "inputSchema": {
1190
+ "type": "object",
1191
+ "properties": {
1192
+ "action": {
1193
+ "type": "string",
1194
+ "enum": [
1195
+ "add_member",
1196
+ "remove_member",
1197
+ "add_channel",
1198
+ "remove_channel",
1199
+ "set_supervisor",
1200
+ "set_channel_visibility"
1201
+ ],
1202
+ "description": "Action: add_member (add operator), remove_member (remove operator), add_channel (bind channel), remove_channel (unlink channel), set_supervisor (assign/remove supervisor), set_channel_visibility (dialog visibility)."
1203
+ },
1204
+ "group": {
1205
+ "type": "string",
1206
+ "description": "Operator group name or ID (get it via list_workspace_metadata with resource='groups')."
1207
+ },
1208
+ "operator": {
1209
+ "type": "string",
1210
+ "description": "Operator name or ID (for add_member, remove_member, set_supervisor)."
1211
+ },
1212
+ "channel": {
1213
+ "type": "string",
1214
+ "description": "Channel name or ID (for add_channel, remove_channel, set_channel_visibility)."
1215
+ },
1216
+ "is_supervisor": {
1217
+ "type": "boolean",
1218
+ "description": "For set_supervisor, true grants supervisor access and false removes it."
1219
+ },
1220
+ "can_view_other_dialogs": {
1221
+ "type": "boolean",
1222
+ "description": "For set_channel_visibility: true - allow viewing of other people's conversations in the channel, false - prohibit."
1223
+ },
1224
+ "confirm": {
1225
+ "type": "boolean",
1226
+ "const": true,
1227
+ "description": "Explicit confirmation of a group configuration change."
1228
+ }
1229
+ },
1230
+ "required": ["action", "group", "confirm"],
1231
+ "additionalProperties": false
1232
+ },
1233
+ "outputSchema": {
1234
+ "type": "object",
1235
+ "properties": {
1236
+ "success": {
1237
+ "type": "boolean"
1238
+ },
1239
+ "action": {
1240
+ "type": "string"
1241
+ },
1242
+ "group_id": {
1243
+ "type": "string"
1244
+ },
1245
+ "hint": {
1246
+ "type": "string"
1247
+ }
1248
+ },
1249
+ "required": ["success", "action", "group_id"],
1250
+ "additionalProperties": true
1251
+ },
1252
+ "annotations": {
1253
+ "title": "Manage operator group",
1254
+ "readOnlyHint": false,
1255
+ "destructiveHint": true,
1256
+ "idempotentHint": false,
1257
+ "openWorldHint": true
1258
+ }
1259
+ },
1260
+ {
1261
+ "name": "configure_project_webhook",
1262
+ "title": "Configure project webhook",
1263
+ "description": "Configure the project's Public API webhook URL and active events. An empty active_events list disables all events. Requires confirm: true.",
1264
+ "inputSchema": {
1265
+ "type": "object",
1266
+ "properties": {
1267
+ "webhook_url": {
1268
+ "type": "string",
1269
+ "description": "URL that receives webhooks. An empty string removes the current URL."
1270
+ },
1271
+ "active_events": {
1272
+ "type": "array",
1273
+ "items": {
1274
+ "type": "string",
1275
+ "enum": [
1276
+ "new message",
1277
+ "success send",
1278
+ "message status change",
1279
+ "message deleted",
1280
+ "new note",
1281
+ "new dialog",
1282
+ "open dialog",
1283
+ "close dialog",
1284
+ "person change",
1285
+ "appeal rate",
1286
+ "messages templates updated",
1287
+ "session operator changed",
1288
+ "channel deleted",
1289
+ "channel status updated"
1290
+ ]
1291
+ },
1292
+ "description": "List of events to activate. A missing or empty list disables all events."
1293
+ },
1294
+ "confirm": {
1295
+ "type": "boolean",
1296
+ "const": true,
1297
+ "description": "Explicit confirmation of changing the project webhook settings."
1298
+ }
1299
+ },
1300
+ "required": ["confirm"],
1301
+ "additionalProperties": false
1302
+ },
1303
+ "outputSchema": {
1304
+ "type": "object",
1305
+ "properties": {
1306
+ "success": {
1307
+ "type": "boolean"
1308
+ },
1309
+ "webhook_url": {
1310
+ "anyOf": [
1311
+ {
1312
+ "type": "string"
1313
+ },
1314
+ {
1315
+ "type": "null"
1316
+ }
1317
+ ]
1318
+ },
1319
+ "active_events": {
1320
+ "type": "array",
1321
+ "items": {
1322
+ "type": "string"
1323
+ }
1324
+ }
1325
+ },
1326
+ "required": ["success"],
1327
+ "additionalProperties": true
1328
+ },
1329
+ "annotations": {
1330
+ "title": "Configure project webhook",
1331
+ "readOnlyHint": false,
1332
+ "destructiveHint": true,
1333
+ "idempotentHint": false,
1334
+ "openWorldHint": true
1335
+ }
1336
+ },
1337
+ {
1338
+ "name": "get_capabilities",
1339
+ "title": "Server capabilities",
1340
+ "description": "Return the server's active tool map: read-only mode, active toolsets, registered tools with their toolset and whether they write data, locale, and local-upload availability. Call this first when unsure which tools or filters are available. It fetches the project identity once and caches it for 10 minutes.",
1341
+ "inputSchema": {
1342
+ "type": "object",
1343
+ "properties": {},
1344
+ "additionalProperties": false
1345
+ },
1346
+ "outputSchema": {
1347
+ "type": "object",
1348
+ "properties": {
1349
+ "read_only": {
1350
+ "type": "boolean"
1351
+ },
1352
+ "active_toolsets": {
1353
+ "type": "array",
1354
+ "items": {
1355
+ "type": "string"
1356
+ }
1357
+ },
1358
+ "available_toolsets": {
1359
+ "type": "array",
1360
+ "items": {
1361
+ "type": "string"
1362
+ }
1363
+ },
1364
+ "project": {
1365
+ "type": "object"
1366
+ },
1367
+ "tools": {
1368
+ "type": "array",
1369
+ "items": {
1370
+ "type": "object"
1371
+ }
1372
+ },
1373
+ "locale": {
1374
+ "type": "string"
1375
+ },
1376
+ "local_uploads": {
1377
+ "type": "boolean"
1378
+ },
1379
+ "notes": {
1380
+ "type": "array",
1381
+ "items": {
1382
+ "type": "string"
1383
+ }
1384
+ }
1385
+ },
1386
+ "required": ["read_only", "active_toolsets", "tools"],
1387
+ "additionalProperties": true
1388
+ },
1389
+ "annotations": {
1390
+ "title": "Server capabilities",
1391
+ "readOnlyHint": true,
1392
+ "destructiveHint": false,
1393
+ "idempotentHint": true,
1394
+ "openWorldHint": true
1395
+ }
1396
+ }
1397
+ ],
1398
+ "version": "0.1.1",
1399
+ "cloudEndpoint": "https://mcp.teletype.app/mcp",
1400
+ "localizations": [
1401
+ {
1402
+ "locale": "ru-RU",
1403
+ "name": "Teletype",
1404
+ "description": "MCP-сервер Teletype для клиентской поддержки: диалоги, профили клиентов, ответы и настройки проекта.",
1405
+ "tags": ["поддержка-клиентов", "мессенджеры", "teletype", "mcp"]
1406
+ }
1407
+ ]
1408
+ }