@besales/mcp 1.0.0-beta.4 → 1.0.0-beta.7

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 (56) hide show
  1. package/README.md +5 -3
  2. package/dist/http/api-client.d.ts +18 -0
  3. package/dist/http/api-client.js +33 -1
  4. package/dist/http/api-client.js.map +1 -1
  5. package/dist/resources/docs/platforms.md +63 -0
  6. package/dist/schemas/mcp-tools.json +847 -30
  7. package/dist/tools/definitions/agent-design.d.ts +2 -0
  8. package/dist/tools/definitions/agent-design.js +5 -0
  9. package/dist/tools/definitions/agent-design.js.map +1 -1
  10. package/dist/tools/definitions/agent-settings.d.ts +1 -0
  11. package/dist/tools/definitions/agent-settings.js +2 -0
  12. package/dist/tools/definitions/agent-settings.js.map +1 -1
  13. package/dist/tools/definitions/api-tool-request.d.ts +4 -2
  14. package/dist/tools/definitions/dialogue-nudge.d.ts +7 -0
  15. package/dist/tools/definitions/dialogue-nudge.js +139 -0
  16. package/dist/tools/definitions/dialogue-nudge.js.map +1 -0
  17. package/dist/tools/definitions/platform-setup.d.ts +1 -0
  18. package/dist/tools/definitions/task-state.d.ts +1 -1
  19. package/dist/tools/definitions/telegram-personal-connect.d.ts +12 -0
  20. package/dist/tools/definitions/telegram-personal-connect.js +61 -0
  21. package/dist/tools/definitions/telegram-personal-connect.js.map +1 -0
  22. package/dist/tools/definitions/telegram-personal-management.d.ts +1 -1
  23. package/dist/tools/definitions/telegram-personal-profile.d.ts +24 -0
  24. package/dist/tools/definitions/telegram-personal-profile.js +154 -0
  25. package/dist/tools/definitions/telegram-personal-profile.js.map +1 -0
  26. package/dist/tools/definitions/telegram-personal-proxies.d.ts +42 -0
  27. package/dist/tools/definitions/telegram-personal-proxies.js +204 -0
  28. package/dist/tools/definitions/telegram-personal-proxies.js.map +1 -0
  29. package/dist/tools/definitions/telegram-proxy-stock.d.ts +34 -0
  30. package/dist/tools/definitions/telegram-proxy-stock.js +129 -0
  31. package/dist/tools/definitions/telegram-proxy-stock.js.map +1 -0
  32. package/dist/tools/definitions.d.ts +98 -2
  33. package/dist/tools/definitions.js +11 -0
  34. package/dist/tools/definitions.js.map +1 -1
  35. package/dist/tools/follow-up-request.js +3 -0
  36. package/dist/tools/follow-up-request.js.map +1 -1
  37. package/dist/tools/operation-recovery.d.ts +1 -1
  38. package/dist/tools/operation-recovery.js +1 -1
  39. package/dist/tools/operation-recovery.js.map +1 -1
  40. package/dist/tools/registry-mapping.cases.js +235 -0
  41. package/dist/tools/registry-mapping.cases.js.map +1 -1
  42. package/dist/tools/registry-test-fixtures.js +5 -1
  43. package/dist/tools/registry-test-fixtures.js.map +1 -1
  44. package/dist/tools/registry.js +18 -4
  45. package/dist/tools/registry.js.map +1 -1
  46. package/dist/tools/result.d.ts +1 -0
  47. package/dist/tools/result.js +57 -5
  48. package/dist/tools/result.js.map +1 -1
  49. package/docs/dialogue-nudge.md +50 -0
  50. package/docs/failure-semantics.md +4 -1
  51. package/docs/help-navigation.md +2 -0
  52. package/docs/telegram-personal-management.md +80 -3
  53. package/docs/telegram-personal-proxies.md +135 -0
  54. package/package.json +1 -1
  55. package/scripts/telegram-personal-profile-mutants.mjs +96 -0
  56. package/scripts/telegram-personal-proxy-mutants.mjs +171 -0
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "title": "besales-mcp Tool Definitions",
4
4
  "version": "1.2.0-draft",
5
- "lastUpdated": "2026-11-09",
5
+ "lastUpdated": "2026-11-12",
6
6
  "description": "MCP tool schemas для besales-mcp npm package. Активная v2-поверхность содержит ICP, Sandbox, Knowledge, prompt operations и stateless Platform Setup Bridge. Setup Pipeline session tools сохранены как Phase 4+ future design, но не входят в active toolset.",
7
7
  "executionModes": {
8
8
  "summary": "Каждая active LLM-операция имеет 2 MCP tools: get_instructions + submit. Claude локально между tools выполняет LLM-вызовы своими моделями. Auto-detection через JWT scope mcp:* → external default.",
@@ -996,7 +996,7 @@
996
996
  },
997
997
  {
998
998
  "name": "besales_sandbox_run_start",
999
- "description": "Start sandbox run для agent (full multi-persona × multi-scenario testing). Queued async. Без вопроса запускай обычный прогон: mode=single_agent и client_mode=scripted (умолчания схемы) — это дешёвый, воспроизводимый прогон для регрессии и проверки кандидата промпта до публикации (candidate_prompt). Перед запуском спроси пользователя одним коротким вопросом с ценой в одну фразу только если нужен client_mode=simulated (LLM играет клиента — дороже и каждый раз по-разному), оба режима клиента (= два прогона) либо mode=workflow (все агенты канала через роутер — шире и дороже).",
999
+ "description": "Start sandbox run для agent (full multi-persona × multi-scenario testing). Queued async. Без вопроса запускай обычный прогон: mode=single_agent и client_mode=scripted (умолчания схемы) — это дешёвый, воспроизводимый прогон для регрессии и проверки кандидата промпта до публикации (candidate_prompt). Перед запуском спроси пользователя одним коротким вопросом с ценой в одну фразу только если нужен client_mode=simulated (LLM играет клиента — дороже и каждый раз по-разному), оба режима клиента (= два прогона) либо mode=workflow (все агенты канала через роутер — шире и дороже). request_key (UUID) — идемпотентность повторного запуска: для повтора того же намерения передай тот же ключ; без поля мост генерирует один ключ на вызов, транспорт внутри вызова использует его повторно. icp_profile_id: UUID — выбранный портрет, null — без выбора, отсутствие — основной портрет агента.",
1000
1000
  "inputSchema": {
1001
1001
  "type": "object",
1002
1002
  "required": [
@@ -1075,6 +1075,19 @@
1075
1075
  "default": 10
1076
1076
  }
1077
1077
  }
1078
+ },
1079
+ "request_key": {
1080
+ "type": "string",
1081
+ "format": "uuid",
1082
+ "description": "Ключ идемпотентности запуска; один на намерение. Если пропущен, мост генерирует UUID один раз на вызов."
1083
+ },
1084
+ "icp_profile_id": {
1085
+ "type": [
1086
+ "string",
1087
+ "null"
1088
+ ],
1089
+ "format": "uuid",
1090
+ "description": "UUID выбранного портрета; null — без выбора; отсутствие — основной портрет агента."
1078
1091
  }
1079
1092
  }
1080
1093
  }
@@ -3341,7 +3354,7 @@
3341
3354
  },
3342
3355
  {
3343
3356
  "name": "besales_agent_clone",
3344
- "description": "Deep-clone an existing agent into a NEW agent on the SAME platform (mirrors the besales GUI clone button). Copies baseSystemPrompt, knowledge namespaces, model/model_lane/runtime config, tools + builtin tools, agent + workspace variable overrides, ICP links, and ALL triggers + actions (with FK remap to new ids). Does NOT copy routing rules (per-router) or per-platform behavior — the clone is inert until wired into the router. Prompt is identical to source; PromptHub auto-bootstraps a fresh version on the first prompt op. Cross-platform clone is not supported — use besales_platform_clone_* for that.",
3357
+ "description": "Deep-clone an existing agent into a NEW agent on the SAME platform (mirrors the besales GUI clone button). Copies baseSystemPrompt, knowledge namespaces, model/model_lane/runtime config, tools + builtin tools, agent + workspace variable overrides, ICP links, and ALL triggers + actions (with FK remap to new ids). Does NOT copy routing rules (per-router) or per-platform behavior — the clone is inert until wired into the router. Prompt is identical to source; PromptHub auto-bootstraps a fresh version on the first prompt op. Cross-platform clone is not supported — use besales_platform_clone_* for that. Если у исходного агента есть необратимые действия, включая закрытие разговора после тишины, требуется отдельное явное согласие человека: explicit_confirmation=true. Без него API вернёт 400 TRIGGER_DANGEROUS_CONFIRMATION_REQUIRED. Не подтверждай за человека.",
3345
3358
  "inputSchema": {
3346
3359
  "type": "object",
3347
3360
  "required": [
@@ -3367,6 +3380,10 @@
3367
3380
  "display_name": {
3368
3381
  "type": "string",
3369
3382
  "description": "Отображаемое имя нового агента; если не задано — зеркалит name."
3383
+ },
3384
+ "explicit_confirmation": {
3385
+ "type": "boolean",
3386
+ "description": "Отдельное согласие человека на копирование необратимых действий, включая закрытие разговора после тишины. При таких действиях требуется true."
3370
3387
  }
3371
3388
  }
3372
3389
  }
@@ -11954,7 +11971,7 @@
11954
11971
  },
11955
11972
  {
11956
11973
  "name": "besales_platform_create_init",
11957
- "description": "v1.5 Increment 5b: создать platform provisioning сессию (Setup URL pattern) для API-key канала. Секреты НЕ передаются через MCP — пользователь вводит их на setup_page_url. Возвращает { setup_ref, setup_page_url, expires_at, required_secret_fields }. OAuth-каналы (Instagram/Avito) — besales_platform_create_oauth_init; TelegramPersonal не поддержан. Scope: mcp:platform-setup.",
11974
+ "description": "v1.5 Increment 5b: создать platform provisioning сессию (Setup URL pattern) для API-key канала. Секреты НЕ передаются через MCP — пользователь вводит их на setup_page_url. Возвращает { setup_ref, setup_page_url, expires_at, required_secret_fields }. OAuth-каналы (Instagram/Avito) — besales_platform_create_oauth_init; TelegramPersonal не поддержан; номера в существующий канал — besales_platform_telegram_personal_connect_link. Scope: mcp:platform-setup.",
11958
11975
  "inputSchema": {
11959
11976
  "type": "object",
11960
11977
  "required": [
@@ -13504,6 +13521,49 @@
13504
13521
  "additionalProperties": false
13505
13522
  }
13506
13523
  },
13524
+ {
13525
+ "name": "besales_dialogue_nudge_agent",
13526
+ "description": "Подтолкнуть агента, если клиент без ответа из-за сбоя или ошибки бота, а переобработка последнего входящего не подходит. Полный ход по ВСЕЙ истории диалога; клиент получит настоящее сообщение, операция платная. Отказывает (REFUSED, при тишине обычно BOT_SILENCED) при тишине, поставленной человеком/оператором (ручная остановка, стоп-слово), отписке, блокировке, бане, вне срока переписки канала, при выключенном канале/ИИ и пока ход уже идёт. Служебную тишину (ожидание оператора «до /start», стадия CRM, фильтр сделки, тишина агента) СНИМАЕТ, возвращая reactivated: true. Перед подтверждением предупреди человека: клиент получит настоящее сообщение бота даже при служебном ожидании оператора. Покажи reactivated в итоге. Не обходи отказ сервера. Только после явного «да» человека: explicit_confirmation=true. От 1 до 30 диалогов без дублей, запросы последовательные, 429 останавливает пакет. Область run:conversation-nudge. attempt_key (до 64 символов, по умолчанию пусто) даёт стабильный ключ на диалог: тот же вход не отправит второй ответ. Новый ключ допустим для нового подтверждённого запуска позже. При 503, таймауте или неизвестном исходе не повторяй и не меняй ключ: проверь besales_dialogue_transcript. Отчёт отдельно: запущено / отказано (код+причина) / исход неизвестен / не обработано; доставка указана отдельно.",
13527
+ "inputSchema": {
13528
+ "type": "object",
13529
+ "properties": {
13530
+ "workspace_id": {
13531
+ "type": "string",
13532
+ "format": "uuid",
13533
+ "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
13534
+ "description": "Рабочая область; без поля используется выбранное подключение."
13535
+ },
13536
+ "conversation_ids": {
13537
+ "minItems": 1,
13538
+ "maxItems": 30,
13539
+ "type": "array",
13540
+ "items": {
13541
+ "type": "string",
13542
+ "format": "uuid",
13543
+ "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
13544
+ },
13545
+ "uniqueItems": true,
13546
+ "description": "Идентификаторы диалогов без дублей, в порядке обработки (1–30)."
13547
+ },
13548
+ "explicit_confirmation": {
13549
+ "type": "boolean",
13550
+ "const": true,
13551
+ "description": "Только после явного «да» человека. Перед подтверждением предупреди: клиент получит настоящее сообщение бота даже при служебном ожидании оператора; служебная тишина снимается (reactivated: true)."
13552
+ },
13553
+ "attempt_key": {
13554
+ "default": "",
13555
+ "description": "Ключ осознанной попытки, до 64 символов; по умолчанию пусто. Тот же ключ для диалога возвращает прежний результат. Новый ключ — только для нового подтверждённого запуска позже, не для повтора неизвестного исхода.",
13556
+ "type": "string",
13557
+ "maxLength": 64
13558
+ }
13559
+ },
13560
+ "required": [
13561
+ "conversation_ids",
13562
+ "explicit_confirmation"
13563
+ ],
13564
+ "additionalProperties": false
13565
+ }
13566
+ },
13507
13567
  {
13508
13568
  "name": "besales_broadcast_analytics_get",
13509
13569
  "description": "Отчёты страницы аналитики рассылок: выбор отчёта полем report (16 значений). Scope: read:analytics. Персональные отчёты recipients, recipients+notSent (recipient_metric=notSent), deals, action_failures, indirect_payments, recent_leads, payment_candidates, registration_intake требуют дополнительно read:conversations: ответ несёт имена и идентификаторы людей, номера заказов или ссылки на карточки. Агрегатные отчёты summary, cohorts, skip_reasons, response_windows, insights, data_quality, segments_catalog, funnel_products, payment_candidates_summary доступны с read:analytics. Для report=response_windows в conversionCycles поле cut различает overall (серверный итог), product и segment; пустой ключ в разрезе не является итогом. Строку «Итого» берите только по cut=overall, медианы строк не складывайте. registration_intake — сверка регистраций: состояние, всего/вошли/не вошли, группы, исход приёма и приветствия, воронка, момент, номера заказов, ссылка на живой контакт. Один канал, ограниченный период, view=period; фильтр funnel допустим. Поздние записи могут появиться позже; недошедший заказ без решения при двух каналах одной воронки виден обоим. Отчёт registration_intake также возвращает персональные данные клиентов воркспейса: имя, контакт и номера заказов. У регистраций применяется только view=period; entry/cohort отвергаются. Валютный фильтр currency: ISO 4217 или UNKNOWN. Точные десятичные строки сохраняются без округления; moneyTotalsByCurrency показывает раздельные итоги по валютам, currencyAssumed отмечает предположение. Для segments_catalog, funnel_products, payment_candidates и payment_candidates_summary валютный фильтр недоступен. Список и сводка оплат поддерживают platform_id, funnel, остальные общие измерения и include_archived. Период оплат передаётся как periodMode: без mode/days всё время; mode=days без days — 30 дней. mode=range принимает открытый диапазон: только from, только to или обе границы; если заданы обе, to не раньше from. Параметры должны поддерживаться выбранным report; payment_candidates: page_size не больше 100. payment_view можно сочетать с payment_status/payment_eligibility: API отдаёт приоритет view.",
@@ -18715,32 +18775,771 @@
18715
18775
  }
18716
18776
  }
18717
18777
  }
18718
- }
18719
- ],
18720
- "resources": [
18721
- {
18722
- "uri": "besales://concepts/icp",
18723
- "name": "ICP Concept Reference",
18724
- "description": "Что такое ICP, segments / personas / scenarios.",
18725
- "mimeType": "text/markdown"
18726
- },
18727
- {
18728
- "uri": "besales://concepts/triggers",
18729
- "name": "Actions & Triggers Reference",
18730
- "description": "agent_actions, step types, condition language.",
18731
- "mimeType": "text/markdown"
18732
18778
  },
18733
18779
  {
18734
- "uri": "besales://concepts/sandbox",
18735
- "name": "Sandbox Reference",
18736
- "description": "Что такое sandbox, какие сценарии тестирует.",
18737
- "mimeType": "text/markdown"
18780
+ "name": "besales_platform_telegram_personal_profile_bulk",
18781
+ "description": "Изменить профили своих личных номеров Telegram пачкой. Меняются СВОИ номера канала, не клиенты: имя first_name, фамилия last_name, описание bio, дата рождения birthday (null снимает) и ники. Фото через этот инструмент не меняется — только в приложении. Требует manage:channels. Поля профиля одинаковы для всех выбранных номеров; пропуск поля сохраняет прежнее значение. Номера выбираются account_ids (1–100 уникальных UUID v4) либо all:true — ровно одно. Ники — один из двух режимов либо ни одного: usernames (по номерам: account_id и новый username; account_ids и all не передаются) или username_base (основа ника; номера выбираются account_ids или all). Оба режима ников сразу отвергаются до запроса. Ники необратимо освобождают прежние ники у Telegram: перед вызовом покажи человеку список номеров и новые значения и получи ответ «делать?»; явное explicit_confirmation не требуется. Операция идёт заданием фермы: ответ — принятие (job_id, state, total), а не итог; итог по каждому номеру смотри в besales_platform_telegram_personal_profile_job. Обязателен стабильный idempotency_key (1–200 видимых ASCII-символов без пробелов): повтор того же намерения — с тем же ключом и аргументами; при неизвестном исходе новый ключ автоматически не создавай.",
18782
+ "inputSchema": {
18783
+ "type": "object",
18784
+ "additionalProperties": false,
18785
+ "required": [
18786
+ "channel_id",
18787
+ "idempotency_key"
18788
+ ],
18789
+ "properties": {
18790
+ "workspace_id": {
18791
+ "type": "string",
18792
+ "format": "uuid"
18793
+ },
18794
+ "channel_id": {
18795
+ "type": "string",
18796
+ "format": "uuid"
18797
+ },
18798
+ "account_ids": {
18799
+ "type": "array",
18800
+ "minItems": 1,
18801
+ "maxItems": 100,
18802
+ "uniqueItems": true,
18803
+ "items": {
18804
+ "type": "string",
18805
+ "format": "uuid",
18806
+ "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$"
18807
+ },
18808
+ "description": "Номера канала (UUID из таблицы номеров), 1–100 уникальных. Вместо all; с usernames не передаётся."
18809
+ },
18810
+ "all": {
18811
+ "type": "boolean",
18812
+ "const": true,
18813
+ "description": "Все номера канала. Вместо account_ids; с usernames не передаётся."
18814
+ },
18815
+ "first_name": {
18816
+ "type": "string",
18817
+ "maxLength": 64,
18818
+ "description": "Имя, до 64 знаков. Ограничения Telegram проверяет ферма."
18819
+ },
18820
+ "last_name": {
18821
+ "type": "string",
18822
+ "maxLength": 64,
18823
+ "description": "Фамилия, до 64 знаков."
18824
+ },
18825
+ "bio": {
18826
+ "type": "string",
18827
+ "maxLength": 140,
18828
+ "description": "Описание профиля, до 140 знаков; лимит Telegram — до 70 без Premium, до 140 с Premium, его проверяет ферма по каждому номеру."
18829
+ },
18830
+ "birthday": {
18831
+ "anyOf": [
18832
+ {
18833
+ "type": "object",
18834
+ "additionalProperties": false,
18835
+ "required": [
18836
+ "day",
18837
+ "month"
18838
+ ],
18839
+ "properties": {
18840
+ "day": {
18841
+ "type": "integer",
18842
+ "minimum": 1,
18843
+ "maximum": 31
18844
+ },
18845
+ "month": {
18846
+ "type": "integer",
18847
+ "minimum": 1,
18848
+ "maximum": 12
18849
+ },
18850
+ "year": {
18851
+ "type": "integer",
18852
+ "minimum": 1,
18853
+ "maximum": 9999
18854
+ }
18855
+ }
18856
+ },
18857
+ {
18858
+ "type": "null"
18859
+ }
18860
+ ],
18861
+ "description": "Дата рождения: день, месяц, год необязателен. null снимает дату."
18862
+ },
18863
+ "usernames": {
18864
+ "type": "array",
18865
+ "minItems": 1,
18866
+ "maxItems": 100,
18867
+ "items": {
18868
+ "type": "object",
18869
+ "additionalProperties": false,
18870
+ "required": [
18871
+ "account_id",
18872
+ "username"
18873
+ ],
18874
+ "properties": {
18875
+ "account_id": {
18876
+ "type": "string",
18877
+ "format": "uuid",
18878
+ "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-4[0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$"
18879
+ },
18880
+ "username": {
18881
+ "type": "string",
18882
+ "minLength": 5,
18883
+ "maxLength": 32,
18884
+ "pattern": "^(?!.*__)[A-Za-z][A-Za-z0-9_]{3,30}[A-Za-z0-9]$"
18885
+ }
18886
+ }
18887
+ },
18888
+ "description": "Режим ников по номерам: пары account_id и новый username (5–32 знака: латиница, цифры, _, без двойного _, с буквы). Номера и ники не повторяются. С account_ids, all и username_base не передаётся."
18889
+ },
18890
+ "username_base": {
18891
+ "type": "string",
18892
+ "minLength": 5,
18893
+ "maxLength": 32,
18894
+ "pattern": "^(?!.*__)[A-Za-z][A-Za-z0-9_]{3,30}[A-Za-z0-9]$",
18895
+ "description": "Режим основы ника: общая основа для выбранных account_ids или all. С usernames не передаётся."
18896
+ },
18897
+ "idempotency_key": {
18898
+ "type": "string",
18899
+ "minLength": 1,
18900
+ "maxLength": 200,
18901
+ "pattern": "^[!-~]+$"
18902
+ }
18903
+ },
18904
+ "allOf": [
18905
+ {
18906
+ "not": {
18907
+ "required": [
18908
+ "usernames",
18909
+ "username_base"
18910
+ ]
18911
+ }
18912
+ },
18913
+ {
18914
+ "if": {
18915
+ "required": [
18916
+ "usernames"
18917
+ ]
18918
+ },
18919
+ "then": {
18920
+ "not": {
18921
+ "anyOf": [
18922
+ {
18923
+ "required": [
18924
+ "account_ids"
18925
+ ]
18926
+ },
18927
+ {
18928
+ "required": [
18929
+ "all"
18930
+ ]
18931
+ }
18932
+ ]
18933
+ }
18934
+ },
18935
+ "else": {
18936
+ "oneOf": [
18937
+ {
18938
+ "required": [
18939
+ "account_ids"
18940
+ ],
18941
+ "not": {
18942
+ "required": [
18943
+ "all"
18944
+ ]
18945
+ }
18946
+ },
18947
+ {
18948
+ "required": [
18949
+ "all"
18950
+ ],
18951
+ "not": {
18952
+ "required": [
18953
+ "account_ids"
18954
+ ]
18955
+ }
18956
+ }
18957
+ ]
18958
+ }
18959
+ },
18960
+ {
18961
+ "anyOf": [
18962
+ {
18963
+ "required": [
18964
+ "first_name"
18965
+ ]
18966
+ },
18967
+ {
18968
+ "required": [
18969
+ "last_name"
18970
+ ]
18971
+ },
18972
+ {
18973
+ "required": [
18974
+ "bio"
18975
+ ]
18976
+ },
18977
+ {
18978
+ "required": [
18979
+ "birthday"
18980
+ ]
18981
+ },
18982
+ {
18983
+ "required": [
18984
+ "usernames"
18985
+ ]
18986
+ },
18987
+ {
18988
+ "required": [
18989
+ "username_base"
18990
+ ]
18991
+ }
18992
+ ]
18993
+ }
18994
+ ]
18995
+ }
18738
18996
  },
18739
18997
  {
18740
- "uri": "besales://concepts/handoff",
18741
- "name": "Multi-agent Routing & Handoffs",
18742
- "description": "Routing rules vs handoff rules, memory transfer.",
18743
- "mimeType": "text/markdown"
18998
+ "name": "besales_platform_telegram_personal_profile_job",
18999
+ "description": "Прочитать итог задания фермы по изменению профилей номеров Telegram. Требует read:channels. Принимает channel_id и job_id из ответа besales_platform_telegram_personal_profile_bulk. Возвращает job_id, kind, state (PENDING, RUNNING, COMPLETED), counters (total, pending, running, succeeded, failed) и items по номерам: account_id, state (PENDING, RUNNING, SUCCEEDED, FAILED), failure_code и outcome.fields по каждому полю. Элемент с частичным успехом остаётся SUCCEEDED, поэтому читай поля: отдельное поле может быть FAILED. TELEGRAM_BIO_TOO_LONG — описание длиннее лимита Telegram (до 70 без Premium, до 140 с Premium); PROFILE_PROVIDER_OUTCOME_UNKNOWN — исход у Telegram неизвестен, не повторяй вслепую, сначала сверь профиль номера. Принятие задания итогом не является: пока state не COMPLETED, повтори чтение позже. Ничего не меняет.",
19000
+ "inputSchema": {
19001
+ "type": "object",
19002
+ "additionalProperties": false,
19003
+ "required": [
19004
+ "channel_id",
19005
+ "job_id"
19006
+ ],
19007
+ "properties": {
19008
+ "workspace_id": {
19009
+ "type": "string",
19010
+ "format": "uuid"
19011
+ },
19012
+ "channel_id": {
19013
+ "type": "string",
19014
+ "format": "uuid"
19015
+ },
19016
+ "job_id": {
19017
+ "type": "string",
19018
+ "minLength": 1,
19019
+ "maxLength": 128
19020
+ }
19021
+ }
19022
+ }
19023
+ },
19024
+ {
19025
+ "name": "besales_platform_telegram_personal_proxy_import_link",
19026
+ "description": "Выдать ссылку для массовой загрузки прокси личного Telegram в пул канала. Требует manage:channels; профиль platform. Ссылку отдать человеку: логины и пароли он вводит на защищённой странице после входа в приложение, не в чате. Ссылка одноразовая, живёт до expires_at. В ответе session_id, setup_page_url, expires_at; итог читай через besales_platform_telegram_personal_proxy_import_status. Создание ссылки ещё не означает загрузку прокси. Не передавай строки прокси через MCP.",
19027
+ "inputSchema": {
19028
+ "type": "object",
19029
+ "additionalProperties": false,
19030
+ "required": [
19031
+ "channel_id"
19032
+ ],
19033
+ "properties": {
19034
+ "workspace_id": {
19035
+ "type": "string",
19036
+ "format": "uuid"
19037
+ },
19038
+ "channel_id": {
19039
+ "type": "string",
19040
+ "format": "uuid"
19041
+ }
19042
+ }
19043
+ }
19044
+ },
19045
+ {
19046
+ "name": "besales_platform_telegram_personal_proxy_import_status",
19047
+ "description": "Прочитать итог загрузки прокси личного Telegram по session_id и channel_id. Требует manage:channels (контракт защищённого импорта); профили readonly и platform. Возвращает только sessionId, status, expiresAt и summary: total, pending, accepted, duplicates, invalid, checkFailed, rejected, registered. Строк, логинов и паролей нет. COMPLETED — обработка завершена, итог смотри в счётчиках; AWAITING_INPUT — ждёт человека, SUBMITTING/PROCESSING — в работе, UNKNOWN — исход неизвестен, повтори чтение позже; EXPIRED/CANCELLED — сессия закрыта. Ничего не меняет.",
19048
+ "inputSchema": {
19049
+ "type": "object",
19050
+ "additionalProperties": false,
19051
+ "required": [
19052
+ "channel_id",
19053
+ "session_id"
19054
+ ],
19055
+ "properties": {
19056
+ "workspace_id": {
19057
+ "type": "string",
19058
+ "format": "uuid"
19059
+ },
19060
+ "channel_id": {
19061
+ "type": "string",
19062
+ "format": "uuid"
19063
+ },
19064
+ "session_id": {
19065
+ "type": "string",
19066
+ "format": "uuid"
19067
+ }
19068
+ }
19069
+ }
19070
+ },
19071
+ {
19072
+ "name": "besales_platform_telegram_personal_proxy_delete",
19073
+ "description": "Удалить свободный прокси из пула канала личного Telegram. Требует manage:channels; профиль platform. Удаление необратимо: покажи человеку канал и proxy_id и получи явное согласие, затем передай explicit_confirmation:true. Без подтверждения отказ до HTTP. 204 — прокси удалён; 409 TELEGRAM_PROXY_NOT_EMPTY — сначала переключите номера на другой прокси; 404 TELEGRAM_PROXY_NOT_FOUND — прокси не найден. Логины, пароли, host и port через MCP не принимаются.",
19074
+ "inputSchema": {
19075
+ "type": "object",
19076
+ "additionalProperties": false,
19077
+ "required": [
19078
+ "channel_id",
19079
+ "proxy_id",
19080
+ "explicit_confirmation"
19081
+ ],
19082
+ "properties": {
19083
+ "workspace_id": {
19084
+ "type": "string",
19085
+ "format": "uuid"
19086
+ },
19087
+ "channel_id": {
19088
+ "type": "string",
19089
+ "format": "uuid"
19090
+ },
19091
+ "proxy_id": {
19092
+ "type": "string",
19093
+ "format": "uuid"
19094
+ },
19095
+ "explicit_confirmation": {
19096
+ "type": "boolean",
19097
+ "const": true,
19098
+ "description": "Только после явного согласия человека."
19099
+ }
19100
+ }
19101
+ }
19102
+ },
19103
+ {
19104
+ "name": "besales_platform_telegram_personal_account_proxy_change",
19105
+ "description": "Переключить свой личный номер Telegram на существующий прокси пула канала. Требует manage:channels; профиль platform. Номер переподключится: покажи человеку номер и целевой прокси и получи явное согласие, затем передай explicit_confirmation:true. Обязательны channel_id, account_id, proxy_id, стабильный action_id (UUID) и явный country_change_confirmed; значение по умолчанию не подставляй. Ответ — квитанция message, action_id, state, code?, retry_after_ms?. Успех только state=SUCCEEDED; UNKNOWN/PENDING не объявляй успехом, FAILED/EXPIRED — отказ. При повторе того же намерения сохраняй action_id и все аргументы, новый ключ автоматически не создавай. 404 TELEGRAM_PROXY_NOT_FOUND — целевой прокси не найден. При смене страны без согласия передай отказ человеку, автоматически согласие не повышай. Логины, пароли, host, port и edit-proxy через MCP не принимаются.",
19106
+ "inputSchema": {
19107
+ "type": "object",
19108
+ "additionalProperties": false,
19109
+ "required": [
19110
+ "channel_id",
19111
+ "account_id",
19112
+ "action_id",
19113
+ "proxy_id",
19114
+ "country_change_confirmed",
19115
+ "explicit_confirmation"
19116
+ ],
19117
+ "properties": {
19118
+ "workspace_id": {
19119
+ "type": "string",
19120
+ "format": "uuid"
19121
+ },
19122
+ "channel_id": {
19123
+ "type": "string",
19124
+ "format": "uuid"
19125
+ },
19126
+ "account_id": {
19127
+ "type": "string",
19128
+ "format": "uuid"
19129
+ },
19130
+ "action_id": {
19131
+ "type": "string",
19132
+ "format": "uuid",
19133
+ "description": "Стабильный UUID намерения: создай один раз, сохрани для повтора с теми же аргументами."
19134
+ },
19135
+ "proxy_id": {
19136
+ "type": "string",
19137
+ "format": "uuid"
19138
+ },
19139
+ "country_change_confirmed": {
19140
+ "type": "boolean",
19141
+ "description": "Явное решение человека о смене страны: true подтверждает, false не подтверждает. Обязательное поле без значения по умолчанию."
19142
+ },
19143
+ "explicit_confirmation": {
19144
+ "type": "boolean",
19145
+ "const": true,
19146
+ "description": "Только после явного согласия человека."
19147
+ }
19148
+ }
19149
+ }
19150
+ },
19151
+ {
19152
+ "name": "besales_platform_telegram_personal_proxy_stock_list",
19153
+ "description": "Прочитать общий запас прокси пространства. Требует read:channels; профили readonly и platform. Фильтры status, country_code (две заглавные буквы), search (до 200 знаков), cursor (UUID), limit (1–100, сервер по умолчанию 50). nextCursor продолжает список; counts, freeProxies, countryCounts и freeCountryCounts относятся ко всему пулу без фильтров. Занятость — occupiedSlots, ёмкость — maxAccounts; accountsCount не показывает свободные места. Данные о стране — IPinfo (https://ipinfo.io). Запаса ещё нет — пустой список и нули. Логины и пароли не возвращаются.",
19154
+ "inputSchema": {
19155
+ "type": "object",
19156
+ "additionalProperties": false,
19157
+ "required": [],
19158
+ "properties": {
19159
+ "workspace_id": {
19160
+ "type": "string",
19161
+ "format": "uuid"
19162
+ },
19163
+ "status": {
19164
+ "type": "string",
19165
+ "enum": [
19166
+ "ACTIVE",
19167
+ "CHECKING",
19168
+ "ERROR",
19169
+ "INACTIVE"
19170
+ ]
19171
+ },
19172
+ "country_code": {
19173
+ "type": "string",
19174
+ "pattern": "^[A-Z]{2}$"
19175
+ },
19176
+ "search": {
19177
+ "type": "string",
19178
+ "maxLength": 200
19179
+ },
19180
+ "cursor": {
19181
+ "type": "string",
19182
+ "format": "uuid"
19183
+ },
19184
+ "limit": {
19185
+ "type": "integer",
19186
+ "minimum": 1,
19187
+ "maximum": 100
19188
+ }
19189
+ }
19190
+ }
19191
+ },
19192
+ {
19193
+ "name": "besales_platform_telegram_personal_proxy_stock_import_link",
19194
+ "description": "Выдать ссылку массового импорта в общий запас прокси пространства. Требует manage:channels и ключ вида MCP: ядро проверяет живой ключ, создателя и его свежую роль CHANNEL_MANAGE, аудит пишет до вызова фермы. Профиль platform. Логины и пароли человек вводит на защищённой странице после входа, не в чате. Одноразовая ссылка действует до expires_at; в ответе session_id, setup_page_url, expires_at, без setup_ref. До 50 строк, 1–3 номера на прокси. Выдача ссылки не означает загрузку; итог — besales_platform_telegram_personal_proxy_stock_import_status. После обрыва автоматически новую ссылку не создавай.",
19195
+ "inputSchema": {
19196
+ "type": "object",
19197
+ "additionalProperties": false,
19198
+ "required": [],
19199
+ "properties": {
19200
+ "workspace_id": {
19201
+ "type": "string",
19202
+ "format": "uuid"
19203
+ }
19204
+ }
19205
+ }
19206
+ },
19207
+ {
19208
+ "name": "besales_platform_telegram_personal_proxy_stock_import_status",
19209
+ "description": "Прочитать состояние и счётчики импорта в общий запас по session_id. Требует manage:channels и ключ вида MCP со свежей ролью CHANNEL_MANAGE создателя; профили readonly и platform. Только sessionId, status, expiresAt, summary (total, pending, accepted, duplicates, invalid, checkFailed, rejected, registered), без строк прокси. COMPLETED — обработка завершена, смотри счётчики; UNKNOWN не означает успех, повтори чтение позже; EXPIRED/CANCELLED — закрыта.",
19210
+ "inputSchema": {
19211
+ "type": "object",
19212
+ "additionalProperties": false,
19213
+ "required": [
19214
+ "session_id"
19215
+ ],
19216
+ "properties": {
19217
+ "workspace_id": {
19218
+ "type": "string",
19219
+ "format": "uuid"
19220
+ },
19221
+ "session_id": {
19222
+ "type": "string",
19223
+ "format": "uuid"
19224
+ }
19225
+ }
19226
+ }
19227
+ },
19228
+ {
19229
+ "name": "besales_platform_telegram_personal_proxy_stock_delete",
19230
+ "description": "Удалить свободный прокси из общего запаса пространства. Требует manage:channels и ключ вида MCP: ядро проверяет живой ключ, создателя и его свежую роль CHANNEL_MANAGE, аудит пишет до вызова фермы. Профиль platform. Удаление необратимо: покажи человеку пространство и proxy_id, получи явное согласие и передай explicit_confirmation:true. Без него отказ до HTTP. 204 — удалён; 409 TELEGRAM_PROXY_NOT_EMPTY — идёт операция, повторить позже; 404 TELEGRAM_PROXY_NOT_FOUND — не найден; 503 не означает успех.",
19231
+ "inputSchema": {
19232
+ "type": "object",
19233
+ "additionalProperties": false,
19234
+ "required": [
19235
+ "proxy_id",
19236
+ "explicit_confirmation"
19237
+ ],
19238
+ "properties": {
19239
+ "workspace_id": {
19240
+ "type": "string",
19241
+ "format": "uuid"
19242
+ },
19243
+ "proxy_id": {
19244
+ "type": "string",
19245
+ "format": "uuid"
19246
+ },
19247
+ "explicit_confirmation": {
19248
+ "type": "boolean",
19249
+ "const": true,
19250
+ "description": "Только после явного согласия человека."
19251
+ }
19252
+ }
19253
+ }
19254
+ },
19255
+ {
19256
+ "name": "besales_platform_telegram_personal_proxy_stock_check",
19257
+ "description": "Проверить прокси общего запаса по proxy_id, обновить здоровье и страну. Требует manage:channels и ключ вида MCP: ядро проверяет живой ключ, создателя и его свежую роль CHANNEL_MANAGE, аудит пишет до вызова фермы. Профиль platform. 200 — результат проверки, 202 CHECKING — проверка ещё идёт, не объявляй прокси рабочим. Данные о стране — IPinfo (https://ipinfo.io).",
19258
+ "inputSchema": {
19259
+ "type": "object",
19260
+ "additionalProperties": false,
19261
+ "required": [
19262
+ "proxy_id"
19263
+ ],
19264
+ "properties": {
19265
+ "workspace_id": {
19266
+ "type": "string",
19267
+ "format": "uuid"
19268
+ },
19269
+ "proxy_id": {
19270
+ "type": "string",
19271
+ "format": "uuid"
19272
+ }
19273
+ }
19274
+ }
19275
+ },
19276
+ {
19277
+ "name": "besales_platform_telegram_personal_proxy_stock_check_all",
19278
+ "description": "Поставить на проверку все прокси общего запаса пространства. Требует manage:channels и ключ вида MCP: ядро проверяет живой ключ, создателя и его свежую роль CHANNEL_MANAGE, аудит пишет до вызова фермы. Профиль platform. queued — сколько поставлено в очередь, не число рабочих прокси. Итог перечитай через besales_platform_telegram_personal_proxy_stock_list.",
19279
+ "inputSchema": {
19280
+ "type": "object",
19281
+ "additionalProperties": false,
19282
+ "required": [],
19283
+ "properties": {
19284
+ "workspace_id": {
19285
+ "type": "string",
19286
+ "format": "uuid"
19287
+ }
19288
+ }
19289
+ }
19290
+ },
19291
+ {
19292
+ "name": "besales_platform_telegram_personal_proxies",
19293
+ "description": "Прочитать прокси существующего канала личного Telegram. Требует read:channels; профили readonly и platform. Фильтры status, country_code (две заглавные буквы), search (до 200 знаков), cursor (UUID), limit (1–100, сервер по умолчанию 50). nextCursor продолжает список; counts, freeProxies, countryCounts и freeCountryCounts относятся ко всему пулу без фильтров. Занятость — occupiedSlots, ёмкость — maxAccounts; accountsCount не показывает свободные места. Данные о стране — IPinfo (https://ipinfo.io). Для явной пары используй proxy_id, свободный прокси выбирай с учётом occupiedSlots, статуса и ёмкости.",
19294
+ "inputSchema": {
19295
+ "type": "object",
19296
+ "additionalProperties": false,
19297
+ "required": [
19298
+ "channel_id"
19299
+ ],
19300
+ "properties": {
19301
+ "workspace_id": {
19302
+ "type": "string",
19303
+ "format": "uuid"
19304
+ },
19305
+ "channel_id": {
19306
+ "type": "string",
19307
+ "format": "uuid"
19308
+ },
19309
+ "status": {
19310
+ "type": "string",
19311
+ "enum": [
19312
+ "ACTIVE",
19313
+ "CHECKING",
19314
+ "ERROR",
19315
+ "INACTIVE"
19316
+ ]
19317
+ },
19318
+ "country_code": {
19319
+ "type": "string",
19320
+ "pattern": "^[A-Z]{2}$"
19321
+ },
19322
+ "search": {
19323
+ "type": "string",
19324
+ "maxLength": 200
19325
+ },
19326
+ "cursor": {
19327
+ "type": "string",
19328
+ "format": "uuid"
19329
+ },
19330
+ "limit": {
19331
+ "type": "integer",
19332
+ "minimum": 1,
19333
+ "maximum": 100
19334
+ }
19335
+ }
19336
+ }
19337
+ },
19338
+ {
19339
+ "name": "besales_platform_telegram_personal_proxy_take_from_stock",
19340
+ "description": "Забрать прокси из общего запаса пространства в канал целиком, всё или ничего. Требует manage:channels и ключ вида MCP: ядро проверяет живой ключ, создателя и его свежую роль CHANNEL_MANAGE, аудит пишет до вызова фермы. Профиль platform. Перед вызовом покажи человеку, какие прокси (или сколько и из какой страны) и в какой канал переносишь, и получи «да». Поля explicit_confirmation нет. Ровно одна форма: proxy_ids (1–50 разных UUID) или count с необязательной country_code. count — число прокси: сколько ПРОКСИ забрать; у прокси 1–3 места (maxAccounts). При country_code прокси без определённой страны не участвуют; страны не смешиваются: нехватка означает отказ, без добора из других стран. Под N номеров выбирай proxy_ids из списка запаса по местам: заранее вычти места явных пар, затем выбери конкретные ACTIVE свободные прокси нужной страны, пока сумма maxAccounts не покроет недостачу. Если мест не хватает, не вызывай перенос. action_id (UUID) создаётся один на намерение и передаётся только заголовком X-Idempotency-Key. Новое намерение человека — новый action_id. Повтор того же намерения — тот же ключ и аргументы, в том числе при 503 (исход неизвестен). NOT_ENOUGH/REFUSED — ничего не перенесено, исправь причину; отказ ключом не запоминается. Изменение набора прокси согласуй как новое намерение с новым action_id. При IDEMPOTENCY_REQUEST_MISMATCH для того же намерения восстанови прежние аргументы и сохрани action_id; для нового намерения создай новый action_id после согласия человека.",
19341
+ "inputSchema": {
19342
+ "type": "object",
19343
+ "additionalProperties": false,
19344
+ "required": [
19345
+ "channel_id",
19346
+ "action_id"
19347
+ ],
19348
+ "properties": {
19349
+ "workspace_id": {
19350
+ "type": "string",
19351
+ "format": "uuid"
19352
+ },
19353
+ "channel_id": {
19354
+ "type": "string",
19355
+ "format": "uuid"
19356
+ },
19357
+ "action_id": {
19358
+ "type": "string",
19359
+ "format": "uuid"
19360
+ },
19361
+ "proxy_ids": {
19362
+ "type": "array",
19363
+ "items": {
19364
+ "type": "string",
19365
+ "format": "uuid"
19366
+ },
19367
+ "minItems": 1,
19368
+ "maxItems": 50,
19369
+ "uniqueItems": true
19370
+ },
19371
+ "count": {
19372
+ "type": "integer",
19373
+ "minimum": 1,
19374
+ "maximum": 50,
19375
+ "description": "Число прокси, не мест. Под номера выбирай proxy_ids по maxAccounts."
19376
+ },
19377
+ "country_code": {
19378
+ "type": "string",
19379
+ "pattern": "^[A-Z]{2}$"
19380
+ }
19381
+ },
19382
+ "oneOf": [
19383
+ {
19384
+ "required": [
19385
+ "proxy_ids"
19386
+ ],
19387
+ "not": {
19388
+ "anyOf": [
19389
+ {
19390
+ "required": [
19391
+ "count"
19392
+ ]
19393
+ },
19394
+ {
19395
+ "required": [
19396
+ "country_code"
19397
+ ]
19398
+ }
19399
+ ]
19400
+ }
19401
+ },
19402
+ {
19403
+ "required": [
19404
+ "count"
19405
+ ],
19406
+ "not": {
19407
+ "required": [
19408
+ "proxy_ids"
19409
+ ]
19410
+ }
19411
+ }
19412
+ ]
19413
+ }
19414
+ },
19415
+ {
19416
+ "name": "besales_platform_telegram_personal_proxy_return_to_stock",
19417
+ "description": "Вернуть свободный прокси канала в общий запас пространства. Требует manage:channels и ключ вида MCP: ядро проверяет живой ключ, создателя и его свежую роль CHANNEL_MANAGE, аудит пишет до вызова фермы. Профиль platform. Перед вызовом покажи человеку, какой прокси из какого канала возвращаешь в общий запас пространства, и получи «да». Поля explicit_confirmation нет. Обязательный action_id (UUID) создаётся один на намерение и передаётся только заголовком X-Idempotency-Key, тело отсутствует. Новое намерение человека — новый action_id. Повтор того же намерения — тот же ключ и аргументы; при 503 исход неизвестен, сохрани их. При IDEMPOTENCY_REQUEST_MISMATCH для того же намерения восстанови прежние аргументы и сохрани action_id; для нового намерения создай новый action_id после согласия человека. TELEGRAM_PROXY_NOT_EMPTY — сначала освободи прокси; TELEGRAM_PROXY_ADDRESS_IN_USE — такой адрес уже в запасе, предложи удалить этот прокси из канала; NOT_FOUND — перечитай список.",
19418
+ "inputSchema": {
19419
+ "type": "object",
19420
+ "additionalProperties": false,
19421
+ "required": [
19422
+ "channel_id",
19423
+ "proxy_id",
19424
+ "action_id"
19425
+ ],
19426
+ "properties": {
19427
+ "workspace_id": {
19428
+ "type": "string",
19429
+ "format": "uuid"
19430
+ },
19431
+ "channel_id": {
19432
+ "type": "string",
19433
+ "format": "uuid"
19434
+ },
19435
+ "proxy_id": {
19436
+ "type": "string",
19437
+ "format": "uuid"
19438
+ },
19439
+ "action_id": {
19440
+ "type": "string",
19441
+ "format": "uuid"
19442
+ }
19443
+ }
19444
+ }
19445
+ },
19446
+ {
19447
+ "name": "besales_platform_telegram_personal_connect_link",
19448
+ "description": "Выдать ссылку подключения номеров в существующий канал личного Telegram. Требует manage:channels, ключ MCP и свежую роль CHANNEL_MANAGE создателя на канал; профиль platform. channel_id обязателен. proxy_plan необязателен: ровно pairs (1–50 пар phone E.164 и proxy_id; разные телефоны, не больше трёх пар на один прокси) или country_code. При country_code прокси без определённой страны не участвуют; страны не смешиваются: нехватка означает отказ, без добора из других стран. План только заполняет страницу, не бронирует, не переносит и не подключает. Пары хранят исходный proxy_id: адрес только для показа, обратного разрешения адреса нет; пропавший id блокирует старт до правки человеком. Занятость проверяет страница при старте. Коды Telegram и пароль 2FA вводит человек на защищённой странице после входа, не в чате. В ответе setup_page_url и expires_at, без setup_ref и телефонов. Итог — besales_platform_telegram_personal_accounts. После обрыва автоматически новую ссылку не создавай.",
19449
+ "inputSchema": {
19450
+ "type": "object",
19451
+ "additionalProperties": false,
19452
+ "required": [
19453
+ "channel_id"
19454
+ ],
19455
+ "properties": {
19456
+ "workspace_id": {
19457
+ "type": "string",
19458
+ "format": "uuid"
19459
+ },
19460
+ "channel_id": {
19461
+ "type": "string",
19462
+ "format": "uuid"
19463
+ },
19464
+ "proxy_plan": {
19465
+ "oneOf": [
19466
+ {
19467
+ "type": "object",
19468
+ "additionalProperties": false,
19469
+ "required": [
19470
+ "pairs"
19471
+ ],
19472
+ "properties": {
19473
+ "pairs": {
19474
+ "type": "array",
19475
+ "minItems": 1,
19476
+ "maxItems": 50,
19477
+ "uniqueItems": true,
19478
+ "description": "Разные телефоны E.164; один proxy_id не больше трёх раз. Исходный id сохраняется, адрес обратно в id не разрешается.",
19479
+ "items": {
19480
+ "type": "object",
19481
+ "additionalProperties": false,
19482
+ "required": [
19483
+ "phone",
19484
+ "proxy_id"
19485
+ ],
19486
+ "properties": {
19487
+ "phone": {
19488
+ "type": "string",
19489
+ "pattern": "^\\+[1-9]\\d{6,14}$"
19490
+ },
19491
+ "proxy_id": {
19492
+ "type": "string",
19493
+ "format": "uuid"
19494
+ }
19495
+ }
19496
+ }
19497
+ }
19498
+ }
19499
+ },
19500
+ {
19501
+ "type": "object",
19502
+ "additionalProperties": false,
19503
+ "required": [
19504
+ "country_code"
19505
+ ],
19506
+ "properties": {
19507
+ "country_code": {
19508
+ "type": "string",
19509
+ "pattern": "^[A-Z]{2}$"
19510
+ }
19511
+ }
19512
+ }
19513
+ ]
19514
+ }
19515
+ }
19516
+ }
19517
+ }
19518
+ ],
19519
+ "resources": [
19520
+ {
19521
+ "uri": "besales://concepts/icp",
19522
+ "name": "ICP Concept Reference",
19523
+ "description": "Что такое ICP, segments / personas / scenarios.",
19524
+ "mimeType": "text/markdown"
19525
+ },
19526
+ {
19527
+ "uri": "besales://concepts/triggers",
19528
+ "name": "Actions & Triggers Reference",
19529
+ "description": "agent_actions, step types, condition language.",
19530
+ "mimeType": "text/markdown"
19531
+ },
19532
+ {
19533
+ "uri": "besales://concepts/sandbox",
19534
+ "name": "Sandbox Reference",
19535
+ "description": "Что такое sandbox, какие сценарии тестирует.",
19536
+ "mimeType": "text/markdown"
19537
+ },
19538
+ {
19539
+ "uri": "besales://concepts/handoff",
19540
+ "name": "Multi-agent Routing & Handoffs",
19541
+ "description": "Routing rules vs handoff rules, memory transfer.",
19542
+ "mimeType": "text/markdown"
18744
19543
  },
18745
19544
  {
18746
19545
  "uri": "besales://concepts/external-execution",
@@ -18954,7 +19753,7 @@
18954
19753
  }
18955
19754
  ],
18956
19755
  "summary": {
18957
- "total_tools": 303,
19756
+ "total_tools": 320,
18958
19757
  "tools_by_category": {
18959
19758
  "workspace_and_help": 18,
18960
19759
  "agent_configuration": 15,
@@ -18962,8 +19761,8 @@
18962
19761
  "icp": 11,
18963
19762
  "knowledge_and_content": 52,
18964
19763
  "crm_and_data_sources": 32,
18965
- "channels_and_credentials": 24,
18966
- "dialogues_and_contacts": 34,
19764
+ "channels_and_credentials": 40,
19765
+ "dialogues_and_contacts": 35,
18967
19766
  "automation": 5,
18968
19767
  "outbound_and_analytics": 72
18969
19768
  },
@@ -19177,6 +19976,24 @@
19177
19976
  "besales_followup_sequence_list",
19178
19977
  "besales_followup_step_stats"
19179
19978
  ]
19180
- }
19979
+ },
19980
+ "newly_added_in_PROXYMCP1M": [
19981
+ "besales_platform_telegram_personal_proxy_import_link",
19982
+ "besales_platform_telegram_personal_proxy_import_status",
19983
+ "besales_platform_telegram_personal_proxy_delete",
19984
+ "besales_platform_telegram_personal_account_proxy_change"
19985
+ ],
19986
+ "newly_added_in_PROXYPOOL1M": [
19987
+ "besales_platform_telegram_personal_proxy_stock_list",
19988
+ "besales_platform_telegram_personal_proxy_stock_import_link",
19989
+ "besales_platform_telegram_personal_proxy_stock_import_status",
19990
+ "besales_platform_telegram_personal_proxy_stock_delete",
19991
+ "besales_platform_telegram_personal_proxy_stock_check",
19992
+ "besales_platform_telegram_personal_proxy_stock_check_all",
19993
+ "besales_platform_telegram_personal_proxies",
19994
+ "besales_platform_telegram_personal_proxy_take_from_stock",
19995
+ "besales_platform_telegram_personal_proxy_return_to_stock",
19996
+ "besales_platform_telegram_personal_connect_link"
19997
+ ]
19181
19998
  }
19182
19999
  }