@besales/mcp 0.43.0 → 0.46.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/instructions/server-instructions.d.ts +1 -1
- package/dist/instructions/server-instructions.js +5 -2
- package/dist/instructions/server-instructions.js.map +1 -1
- package/dist/resources/docs/crm-integration.md +3 -1
- package/dist/resources/workflows/compare-models.md +4 -3
- package/dist/resources/workflows/connect-crm-from-scratch.md +8 -0
- package/dist/schemas/mcp-tools.json +1098 -54
- package/dist/tools/definitions/agent-design.d.ts +8 -0
- package/dist/tools/definitions/agent-design.js +3 -0
- package/dist/tools/definitions/agent-design.js.map +1 -1
- package/dist/tools/definitions/broadcast-analytics.d.ts +5 -4
- package/dist/tools/definitions/broadcast-analytics.js +17 -6
- package/dist/tools/definitions/broadcast-analytics.js.map +1 -1
- package/dist/tools/definitions/broadcast-mailing-variants.js +8 -4
- package/dist/tools/definitions/broadcast-mailing-variants.js.map +1 -1
- package/dist/tools/definitions/broadcast-scheduler.d.ts +82 -0
- package/dist/tools/definitions/broadcast-scheduler.js +317 -0
- package/dist/tools/definitions/broadcast-scheduler.js.map +1 -0
- package/dist/tools/definitions/crm-platform.js +20 -0
- package/dist/tools/definitions/crm-platform.js.map +1 -1
- package/dist/tools/definitions/follow-up-setup.d.ts +6 -0
- package/dist/tools/definitions/follow-up-setup.js +31 -0
- package/dist/tools/definitions/follow-up-setup.js.map +1 -1
- package/dist/tools/definitions/follow-up.d.ts +18 -1
- package/dist/tools/definitions/follow-up.js +80 -5
- package/dist/tools/definitions/follow-up.js.map +1 -1
- package/dist/tools/definitions/getcourse-cold-welcome.d.ts +11 -0
- package/dist/tools/definitions/getcourse-cold-welcome.js +77 -8
- package/dist/tools/definitions/getcourse-cold-welcome.js.map +1 -1
- package/dist/tools/definitions/getcourse-wave.d.ts +3 -3
- package/dist/tools/definitions/getcourse-wave.js +5 -5
- package/dist/tools/definitions/getcourse-wave.js.map +1 -1
- package/dist/tools/definitions/link-tracking.js +22 -0
- package/dist/tools/definitions/link-tracking.js.map +1 -1
- package/dist/tools/definitions/model-comparison.js +6 -3
- package/dist/tools/definitions/model-comparison.js.map +1 -1
- package/dist/tools/definitions/platform-setup.d.ts +38 -3
- package/dist/tools/definitions/platform-setup.js +52 -2
- package/dist/tools/definitions/platform-setup.js.map +1 -1
- package/dist/tools/definitions/shared.d.ts +127 -5
- package/dist/tools/definitions/shared.js +103 -5
- package/dist/tools/definitions/shared.js.map +1 -1
- package/dist/tools/definitions/trigger-contact-claims.d.ts +7 -0
- package/dist/tools/definitions/trigger-contact-claims.js +58 -0
- package/dist/tools/definitions/trigger-contact-claims.js.map +1 -0
- package/dist/tools/definitions.d.ts +141 -7
- package/dist/tools/definitions.js +4 -0
- package/dist/tools/definitions.js.map +1 -1
- package/dist/tools/registry-mapping-cases-core.js +11 -2
- package/dist/tools/registry-mapping-cases-core.js.map +1 -1
- package/dist/tools/registry-mapping-cases-platform.js +29 -0
- package/dist/tools/registry-mapping-cases-platform.js.map +1 -1
- package/dist/tools/trigger-action-config.d.ts +49 -0
- package/dist/tools/trigger-action-config.js +171 -0
- package/dist/tools/trigger-action-config.js.map +1 -0
- package/dist/types/api-contract.gen.d.ts +2285 -221
- package/docs/agent-usage-guide.full.ru.md +1 -0
- package/package.json +1 -1
|
@@ -1305,15 +1305,27 @@
|
|
|
1305
1305
|
"channels": {
|
|
1306
1306
|
"type": "array",
|
|
1307
1307
|
"items": {
|
|
1308
|
-
"type": "string"
|
|
1308
|
+
"type": "string",
|
|
1309
|
+
"enum": [
|
|
1310
|
+
"Site",
|
|
1311
|
+
"Email",
|
|
1312
|
+
"SMS",
|
|
1313
|
+
"Telegram",
|
|
1314
|
+
"Facebook",
|
|
1315
|
+
"VK",
|
|
1316
|
+
"Chatium",
|
|
1317
|
+
"WhatsApp",
|
|
1318
|
+
"Viber",
|
|
1319
|
+
"MAX"
|
|
1320
|
+
]
|
|
1309
1321
|
},
|
|
1310
1322
|
"minItems": 1,
|
|
1311
|
-
"description": "Wave channels (GetCourseTransport
|
|
1323
|
+
"description": "Wave channels (full GetCourseTransport enum) for analytics. Only channels allowed by the platform will be delivered."
|
|
1312
1324
|
},
|
|
1313
1325
|
"funnel": {
|
|
1314
1326
|
"type": "string",
|
|
1315
1327
|
"maxLength": 200,
|
|
1316
|
-
"description": "
|
|
1328
|
+
"description": "Воронка ШКОЛЫ в форме «f11 — ДБО / NR / ВК / In Stream» — код fNN ОБЯЗАТЕЛЕН. ⚠️ Это НЕ когорта и НЕ подпись запуска: «reg-no-show», «post-web|дбо», «svs-zapusk» сюда класть нельзя — тип отбора идёт в segment, продукт в product_code, подпись запуска в cohort_label. Ось «Воронка» сравнивается по коду, поэтому значение без кода становится отдельной «воронкой» и засоряет фильтр аналитики."
|
|
1317
1329
|
},
|
|
1318
1330
|
"segment": {
|
|
1319
1331
|
"type": "string",
|
|
@@ -1578,15 +1590,27 @@
|
|
|
1578
1590
|
"channels": {
|
|
1579
1591
|
"type": "array",
|
|
1580
1592
|
"items": {
|
|
1581
|
-
"type": "string"
|
|
1593
|
+
"type": "string",
|
|
1594
|
+
"enum": [
|
|
1595
|
+
"Site",
|
|
1596
|
+
"Email",
|
|
1597
|
+
"SMS",
|
|
1598
|
+
"Telegram",
|
|
1599
|
+
"Facebook",
|
|
1600
|
+
"VK",
|
|
1601
|
+
"Chatium",
|
|
1602
|
+
"WhatsApp",
|
|
1603
|
+
"Viber",
|
|
1604
|
+
"MAX"
|
|
1605
|
+
]
|
|
1582
1606
|
},
|
|
1583
1607
|
"minItems": 1,
|
|
1584
|
-
"description": "Wave channels (GetCourseTransport
|
|
1608
|
+
"description": "Wave channels (full GetCourseTransport enum) for analytics. Only channels allowed by the platform will be delivered."
|
|
1585
1609
|
},
|
|
1586
1610
|
"funnel": {
|
|
1587
1611
|
"type": "string",
|
|
1588
1612
|
"maxLength": 200,
|
|
1589
|
-
"description": "
|
|
1613
|
+
"description": "Воронка ШКОЛЫ в форме «f11 — ДБО / NR / ВК / In Stream» — код fNN ОБЯЗАТЕЛЕН. ⚠️ Это НЕ когорта и НЕ подпись запуска: «reg-no-show», «post-web|дбо», «svs-zapusk» сюда класть нельзя — тип отбора идёт в segment, продукт в product_code, подпись запуска в cohort_label. Ось «Воронка» сравнивается по коду, поэтому значение без кода становится отдельной «воронкой» и засоряет фильтр аналитики."
|
|
1590
1614
|
},
|
|
1591
1615
|
"segment": {
|
|
1592
1616
|
"type": "string",
|
|
@@ -1997,10 +2021,22 @@
|
|
|
1997
2021
|
"channels": {
|
|
1998
2022
|
"type": "array",
|
|
1999
2023
|
"items": {
|
|
2000
|
-
"type": "string"
|
|
2024
|
+
"type": "string",
|
|
2025
|
+
"enum": [
|
|
2026
|
+
"Site",
|
|
2027
|
+
"Email",
|
|
2028
|
+
"SMS",
|
|
2029
|
+
"Telegram",
|
|
2030
|
+
"Facebook",
|
|
2031
|
+
"VK",
|
|
2032
|
+
"Chatium",
|
|
2033
|
+
"WhatsApp",
|
|
2034
|
+
"Viber",
|
|
2035
|
+
"MAX"
|
|
2036
|
+
]
|
|
2001
2037
|
},
|
|
2002
2038
|
"minItems": 1,
|
|
2003
|
-
"description": "Wave channels (GetCourseTransport
|
|
2039
|
+
"description": "Wave channels (full GetCourseTransport enum) for analytics. Only channels allowed by the platform will be delivered."
|
|
2004
2040
|
},
|
|
2005
2041
|
"deal_fields": {
|
|
2006
2042
|
"type": "object",
|
|
@@ -2017,7 +2053,7 @@
|
|
|
2017
2053
|
"funnel": {
|
|
2018
2054
|
"type": "string",
|
|
2019
2055
|
"maxLength": 200,
|
|
2020
|
-
"description": "
|
|
2056
|
+
"description": "Воронка ШКОЛЫ в форме «f11 — ДБО / NR / ВК / In Stream» — код fNN ОБЯЗАТЕЛЕН. ⚠️ Это НЕ когорта и НЕ подпись запуска: «reg-no-show», «post-web|дбо», «svs-zapusk» сюда класть нельзя — тип отбора идёт в segment, продукт в product_code, подпись запуска в cohort_label. Ось «Воронка» сравнивается по коду, поэтому значение без кода становится отдельной «воронкой» и засоряет фильтр аналитики."
|
|
2021
2057
|
},
|
|
2022
2058
|
"segment": {
|
|
2023
2059
|
"type": "string",
|
|
@@ -2963,7 +2999,7 @@
|
|
|
2963
2999
|
},
|
|
2964
3000
|
{
|
|
2965
3001
|
"name": "besales_trigger_upsert",
|
|
2966
|
-
"description": "Create trigger, patch trigger metadata, or replace its full action set (replace_actions=true) for an agent. Without replace_actions existing actions are not bulk-replaced; webhook, operator, silent AI, CRM, calendar, outbound and follow-up actions require explicit_confirmation.",
|
|
3002
|
+
"description": "Create trigger, patch trigger metadata, or replace its full action set (replace_actions=true) for an agent. Without replace_actions existing actions are not bulk-replaced; webhook, operator, silent AI, CRM, calendar, outbound and follow-up actions require explicit_confirmation. Конфиг действия кладётся в поле, имя которого зависит от actionType — см. actions.description.",
|
|
2967
3003
|
"inputSchema": {
|
|
2968
3004
|
"type": "object",
|
|
2969
3005
|
"required": [
|
|
@@ -3011,8 +3047,35 @@
|
|
|
3011
3047
|
},
|
|
3012
3048
|
"actions": {
|
|
3013
3049
|
"type": "array",
|
|
3050
|
+
"description": "Полный набор действий триггера (при replace_actions=true — именно ПОЛНЫЙ, а не дельта). Конфиг действия кладётся в ОТДЕЛЬНОЕ поле, имя которого зависит от actionType: правило camelCase(actionType)+\"Config\" — CRM_UPDATE_FIELD → crmUpdateFieldConfig, HTTP_WEBHOOK → httpWebhookConfig, GETCOURSE_SET_DEAL_TAGS → getcourseSetDealTagsConfig. Пять исключений: CRM_MOVE_STAGE → crmConfig, SCHEDULE_FOLLOWUP → scheduleFollowUpConfig, SUMMARIZE_DIALOG → summarizeConfig, SEND_TELEGRAM_CHANNEL_MESSAGE → telegramChannelConfig, CRM_RENAME_DEAL → renameDealConfig. В ОТВЕТЕ API (besales_platform_context_get) тот же конфиг приходит под именем связи (crmMoveStage, scheduleFollowUp, summarizeAction, telegramChannelMessage, renameDeal) — прочитанное можно пересылать как есть: MCP переименует конфиг в ключ входа и снимет поля, которые ответ отдаёт, а вход не принимает (id, triggerId, createdAt, updatedAt, пустые связи чужих типов). Действие с обязательным конфигом, отправленное без него, отвергается.",
|
|
3014
3051
|
"items": {
|
|
3015
|
-
"type": "object"
|
|
3052
|
+
"type": "object",
|
|
3053
|
+
"required": [
|
|
3054
|
+
"actionType"
|
|
3055
|
+
],
|
|
3056
|
+
"properties": {
|
|
3057
|
+
"actionType": {
|
|
3058
|
+
"type": "string",
|
|
3059
|
+
"description": "Тип действия (Prisma ActionType), например CRM_MOVE_STAGE."
|
|
3060
|
+
},
|
|
3061
|
+
"priority": {
|
|
3062
|
+
"type": "integer",
|
|
3063
|
+
"minimum": 1,
|
|
3064
|
+
"maximum": 100
|
|
3065
|
+
},
|
|
3066
|
+
"isEnabled": {
|
|
3067
|
+
"type": "boolean"
|
|
3068
|
+
},
|
|
3069
|
+
"continueOnError": {
|
|
3070
|
+
"type": "boolean",
|
|
3071
|
+
"description": "Следующие действия триггера выполнятся даже при падении этого."
|
|
3072
|
+
},
|
|
3073
|
+
"crmConfig": {
|
|
3074
|
+
"type": "object",
|
|
3075
|
+
"description": "Конфиг CRM_MOVE_STAGE: crmId (uuid интеграции), crmType (AMOCRM|BITRIX24|GETCOURSE), statusId (id стадии), pipelineId и pipelineCrmId (рекомендуются — без них стадия ищется по всем воронкам), note. В ответе API это поле называется crmMoveStage."
|
|
3076
|
+
}
|
|
3077
|
+
},
|
|
3078
|
+
"additionalProperties": true
|
|
3016
3079
|
}
|
|
3017
3080
|
},
|
|
3018
3081
|
"replace_actions": {
|
|
@@ -3665,9 +3728,34 @@
|
|
|
3665
3728
|
}
|
|
3666
3729
|
}
|
|
3667
3730
|
}
|
|
3731
|
+
},
|
|
3732
|
+
"skipIfContactRepliedSincePreviousSlot": {
|
|
3733
|
+
"type": "boolean",
|
|
3734
|
+
"description": "Не отправлять шаг, если клиент писал ПОСЛЕ предыдущего слота цепочки. Даёт правило «ответил — ближайшее касание пропускаем, через одно продолжаем»: ответ в 13:05 гасит касание в 16:00, а к 17:00 предыдущим слотом становится 16:00, ответ старше него — и цепочка идёт дальше. Прогресс при пропуске двигается, контакт не зависает. Только для календарного шага (scheduleMode=clock + anchorMode=variable): на остальных рантайм и так проверяет свежесть входящего, и флаг там отвергается."
|
|
3668
3735
|
}
|
|
3669
3736
|
}
|
|
3670
3737
|
}
|
|
3738
|
+
},
|
|
3739
|
+
"sessionTimeVariable": {
|
|
3740
|
+
"type": "string",
|
|
3741
|
+
"minLength": 1,
|
|
3742
|
+
"description": "ИМЯ переменной контакта с ЧАСОМ события (ЧЧ:ММ), парное к anchorVariable шага, который задаёт ДАТУ. Нужно потому, что поле-якорь во внешней CRM хранит только дату, а разбор нормализует её в служебный ПОЛДЕНЬ: без этого поля агент в своём промпте видит «Эфир: 21.08.2026 12:00» при эфире в 19:00. Задаётся НА ЦЕПОЧКУ (час слота одинаков для всех касаний и всех дней — dayOffset сдвигает дату, не час). Хранится ИМЯ, а не сам час: цепочка отбирает контактов условием по этой же переменной, и вторая копия значения разошлась бы с отбором молча. На расписание НЕ влияет — его задают atTime шагов; поле читает только промпт агента. Значение у контакта вне ЧЧ:ММ игнорируется: печатается одна дата, выдуманный час не подставляется."
|
|
3743
|
+
},
|
|
3744
|
+
"sessionDayOffsets": {
|
|
3745
|
+
"type": "array",
|
|
3746
|
+
"items": {
|
|
3747
|
+
"type": "integer",
|
|
3748
|
+
"minimum": 0,
|
|
3749
|
+
"maximum": 30
|
|
3750
|
+
},
|
|
3751
|
+
"minItems": 1,
|
|
3752
|
+
"description": "На каких dayOffset цепочки проходят САМИ эфиры ([0,1,2] — три дня подряд от якоря). Вывести из шагов нельзя: касания стоят и на днях без эфира (у вебинарной цепочки шаги занимают дни 0–5, а эфиров три — дни 4 и 5 это продажа), поэтому дни объявляются явно, как явно объявлено время в sessionTimeVariable. На расписание НЕ влияет — его задают atTime/dayOffset шагов; поле читает только промпт агента. Без объявления блок печатает ОДИН эфир по якорю: якорь несёт дату лишь ПЕРВОГО эфира, и на второй день агент видел «был вчера», не зная, что сегодня вечером эфир есть. Порядок задаёт нумерацию («эфир 2 из 3») и нормализуется по возрастанию."
|
|
3753
|
+
},
|
|
3754
|
+
"sessionDurationMinutes": {
|
|
3755
|
+
"type": "integer",
|
|
3756
|
+
"exclusiveMinimum": 0,
|
|
3757
|
+
"description": "Сколько минут длится эфир. Объявляется, ТОЛЬКО если длительность действительно известна: с ней блок промпта утверждает «идёт сейчас» и перестаёт это утверждать по её истечении, без неё — только «уже начался», то есть факт, который нельзя опровергнуть временем. Дефолта нет намеренно: подставленная длительность это утверждение о мире, сделанное за клиента, а такие утверждения агент пересказывает человеку. Читается только при объявленном sessionDayOffsets.",
|
|
3758
|
+
"maximum": 1440
|
|
3671
3759
|
}
|
|
3672
3760
|
}
|
|
3673
3761
|
},
|
|
@@ -3707,6 +3795,44 @@
|
|
|
3707
3795
|
}
|
|
3708
3796
|
}
|
|
3709
3797
|
},
|
|
3798
|
+
{
|
|
3799
|
+
"name": "besales_followup_step_message_set",
|
|
3800
|
+
"description": "Replace the message text of ONE follow-up step without touching other steps, the sequence description, timing or conditions. Requires expected_content: the step is addressed by position, and positions shift when steps are inserted.",
|
|
3801
|
+
"inputSchema": {
|
|
3802
|
+
"type": "object",
|
|
3803
|
+
"required": [
|
|
3804
|
+
"platform_id",
|
|
3805
|
+
"sequence_id",
|
|
3806
|
+
"step_index",
|
|
3807
|
+
"content",
|
|
3808
|
+
"expected_content"
|
|
3809
|
+
],
|
|
3810
|
+
"properties": {
|
|
3811
|
+
"platform_id": {
|
|
3812
|
+
"type": "string",
|
|
3813
|
+
"format": "uuid"
|
|
3814
|
+
},
|
|
3815
|
+
"sequence_id": {
|
|
3816
|
+
"type": "string",
|
|
3817
|
+
"format": "uuid"
|
|
3818
|
+
},
|
|
3819
|
+
"step_index": {
|
|
3820
|
+
"type": "integer",
|
|
3821
|
+
"minimum": 0,
|
|
3822
|
+
"description": "Zero-based position in config.steps"
|
|
3823
|
+
},
|
|
3824
|
+
"content": {
|
|
3825
|
+
"type": "string",
|
|
3826
|
+
"minLength": 1,
|
|
3827
|
+
"description": "New message text"
|
|
3828
|
+
},
|
|
3829
|
+
"expected_content": {
|
|
3830
|
+
"type": "string",
|
|
3831
|
+
"description": "Current text as the caller saw it; mismatch returns 409 with the actual text"
|
|
3832
|
+
}
|
|
3833
|
+
}
|
|
3834
|
+
}
|
|
3835
|
+
},
|
|
3710
3836
|
{
|
|
3711
3837
|
"name": "besales_pipeline_settings_update",
|
|
3712
3838
|
"description": "Patch allowlisted platform PipelineSettings via typed sections (crm_pipeline_behavior, auto_finish). Phase B (2026-05-27): generic `updates` field удалён — отвергается с 400. CRM stage movement or lead/contact creation fields require explicit_confirmation.",
|
|
@@ -4378,6 +4504,45 @@
|
|
|
4378
4504
|
"type": "integer"
|
|
4379
4505
|
},
|
|
4380
4506
|
"description": "GetCourse offer ids whose paid orders are credited to us regardless of who created the order — the agent via GETCOURSE_CREATE_DEAL or a manager by hand in the GetCourse admin. Empty array turns the rule off. The set applies to the whole school (every platform sharing the GetCourse domain), not to a single platform. Changes money attribution retroactively — dangerous, requires explicit_confirmation."
|
|
4507
|
+
},
|
|
4508
|
+
"guard_active_series": {
|
|
4509
|
+
"type": [
|
|
4510
|
+
"string",
|
|
4511
|
+
"null"
|
|
4512
|
+
],
|
|
4513
|
+
"enum": [
|
|
4514
|
+
"OFF",
|
|
4515
|
+
"WARN",
|
|
4516
|
+
"BLOCK",
|
|
4517
|
+
null
|
|
4518
|
+
],
|
|
4519
|
+
"description": "Outbound guard: do not write while the person's webinar series is running. OFF — rule off; WARN — reason audited, send proceeds; BLOCK — send stopped. null = not configured (default: active_series BLOCK, others WARN). See docs/features/outbound-guards.md."
|
|
4520
|
+
},
|
|
4521
|
+
"guard_active_application": {
|
|
4522
|
+
"type": [
|
|
4523
|
+
"string",
|
|
4524
|
+
"null"
|
|
4525
|
+
],
|
|
4526
|
+
"enum": [
|
|
4527
|
+
"OFF",
|
|
4528
|
+
"WARN",
|
|
4529
|
+
"BLOCK",
|
|
4530
|
+
null
|
|
4531
|
+
],
|
|
4532
|
+
"description": "Outbound guard: do not write while a sales rep works an active application. OFF — rule off; WARN — reason audited, send proceeds; BLOCK — send stopped. null = not configured (default: active_series BLOCK, others WARN). See docs/features/outbound-guards.md."
|
|
4533
|
+
},
|
|
4534
|
+
"guard_paid": {
|
|
4535
|
+
"type": [
|
|
4536
|
+
"string",
|
|
4537
|
+
"null"
|
|
4538
|
+
],
|
|
4539
|
+
"enum": [
|
|
4540
|
+
"OFF",
|
|
4541
|
+
"WARN",
|
|
4542
|
+
"BLOCK",
|
|
4543
|
+
null
|
|
4544
|
+
],
|
|
4545
|
+
"description": "Outbound guard: do not write to someone who already paid for THIS product. OFF — rule off; WARN — reason audited, send proceeds; BLOCK — send stopped. null = not configured (default: active_series BLOCK, others WARN). See docs/features/outbound-guards.md."
|
|
4381
4546
|
}
|
|
4382
4547
|
}
|
|
4383
4548
|
},
|
|
@@ -4386,6 +4551,120 @@
|
|
|
4386
4551
|
},
|
|
4387
4552
|
"confirmation_reason": {
|
|
4388
4553
|
"type": "string"
|
|
4554
|
+
},
|
|
4555
|
+
"funnel_analytics": {
|
|
4556
|
+
"type": "object",
|
|
4557
|
+
"description": "Настройки раздела «Воронка канала»: ворота решения (тройка стадий «отправлено → одобрено | отклонено»), целевая стадия «Пути до стадии», пороги вовлечённости и «застрял». null у ворот и цели — СБРОС, отсутствие поля — «не трогать». Запись делегируется сервисам раздела, поэтому их проверки (стадии разные, стадии есть в каталоге площадки) не обходятся.",
|
|
4558
|
+
"properties": {
|
|
4559
|
+
"decision_gate": {
|
|
4560
|
+
"type": [
|
|
4561
|
+
"object",
|
|
4562
|
+
"null"
|
|
4563
|
+
],
|
|
4564
|
+
"required": [
|
|
4565
|
+
"submitted",
|
|
4566
|
+
"approved",
|
|
4567
|
+
"rejected"
|
|
4568
|
+
],
|
|
4569
|
+
"properties": {
|
|
4570
|
+
"submitted": {
|
|
4571
|
+
"type": "object",
|
|
4572
|
+
"required": [
|
|
4573
|
+
"pipeline_crm_id",
|
|
4574
|
+
"pipeline_id",
|
|
4575
|
+
"status_id"
|
|
4576
|
+
],
|
|
4577
|
+
"properties": {
|
|
4578
|
+
"pipeline_crm_id": {
|
|
4579
|
+
"type": "string"
|
|
4580
|
+
},
|
|
4581
|
+
"pipeline_id": {
|
|
4582
|
+
"type": "integer"
|
|
4583
|
+
},
|
|
4584
|
+
"status_id": {
|
|
4585
|
+
"type": "integer"
|
|
4586
|
+
}
|
|
4587
|
+
}
|
|
4588
|
+
},
|
|
4589
|
+
"approved": {
|
|
4590
|
+
"type": "object",
|
|
4591
|
+
"required": [
|
|
4592
|
+
"pipeline_crm_id",
|
|
4593
|
+
"pipeline_id",
|
|
4594
|
+
"status_id"
|
|
4595
|
+
],
|
|
4596
|
+
"properties": {
|
|
4597
|
+
"pipeline_crm_id": {
|
|
4598
|
+
"type": "string"
|
|
4599
|
+
},
|
|
4600
|
+
"pipeline_id": {
|
|
4601
|
+
"type": "integer"
|
|
4602
|
+
},
|
|
4603
|
+
"status_id": {
|
|
4604
|
+
"type": "integer"
|
|
4605
|
+
}
|
|
4606
|
+
}
|
|
4607
|
+
},
|
|
4608
|
+
"rejected": {
|
|
4609
|
+
"type": "object",
|
|
4610
|
+
"required": [
|
|
4611
|
+
"pipeline_crm_id",
|
|
4612
|
+
"pipeline_id",
|
|
4613
|
+
"status_id"
|
|
4614
|
+
],
|
|
4615
|
+
"properties": {
|
|
4616
|
+
"pipeline_crm_id": {
|
|
4617
|
+
"type": "string"
|
|
4618
|
+
},
|
|
4619
|
+
"pipeline_id": {
|
|
4620
|
+
"type": "integer"
|
|
4621
|
+
},
|
|
4622
|
+
"status_id": {
|
|
4623
|
+
"type": "integer"
|
|
4624
|
+
}
|
|
4625
|
+
}
|
|
4626
|
+
}
|
|
4627
|
+
}
|
|
4628
|
+
},
|
|
4629
|
+
"path_target_stage": {
|
|
4630
|
+
"type": [
|
|
4631
|
+
"object",
|
|
4632
|
+
"null"
|
|
4633
|
+
],
|
|
4634
|
+
"required": [
|
|
4635
|
+
"pipeline_crm_id",
|
|
4636
|
+
"pipeline_id",
|
|
4637
|
+
"status_id"
|
|
4638
|
+
],
|
|
4639
|
+
"properties": {
|
|
4640
|
+
"pipeline_crm_id": {
|
|
4641
|
+
"type": "string"
|
|
4642
|
+
},
|
|
4643
|
+
"pipeline_id": {
|
|
4644
|
+
"type": "integer"
|
|
4645
|
+
},
|
|
4646
|
+
"status_id": {
|
|
4647
|
+
"type": "integer"
|
|
4648
|
+
}
|
|
4649
|
+
}
|
|
4650
|
+
},
|
|
4651
|
+
"engaged_inbound_count": {
|
|
4652
|
+
"type": [
|
|
4653
|
+
"integer",
|
|
4654
|
+
"null"
|
|
4655
|
+
],
|
|
4656
|
+
"minimum": 2,
|
|
4657
|
+
"maximum": 20
|
|
4658
|
+
},
|
|
4659
|
+
"stuck_threshold_hours": {
|
|
4660
|
+
"type": [
|
|
4661
|
+
"integer",
|
|
4662
|
+
"null"
|
|
4663
|
+
],
|
|
4664
|
+
"minimum": 1,
|
|
4665
|
+
"maximum": 720
|
|
4666
|
+
}
|
|
4667
|
+
}
|
|
4389
4668
|
}
|
|
4390
4669
|
}
|
|
4391
4670
|
}
|
|
@@ -4703,7 +4982,7 @@
|
|
|
4703
4982
|
},
|
|
4704
4983
|
{
|
|
4705
4984
|
"name": "besales_prompt_patch_apply",
|
|
4706
|
-
"description": "S3.8: применяет batch operations к draft.currentContent. Resets TTL на 24h (activity-based). Возвращает `appliedCount` + `skippedCount` (anchor не найден / growth guard >30%). Endpoint: PATCH /api/v2/agents/{agentId}/prompt/drafts/{draftId}/operations. Scope: write:prompt-drafts. ВАЖНО: ведущие и замыкающие пробелы/переводы строк в replacement_text срезаются — чтобы вставить пустую строку-разделитель между абзацами, держи перевод строки В СЕРЕДИНЕ replacement_text или включи окружающий текст в anchor/target; иначе соседние заголовки/абзацы склеятся. Ответ
|
|
4985
|
+
"description": "S3.8: применяет batch operations к draft.currentContent. Resets TTL на 24h (activity-based). Возвращает `appliedCount` + `skippedCount` (anchor не найден / growth guard >30%). Endpoint: PATCH /api/v2/agents/{agentId}/prompt/drafts/{draftId}/operations. Scope: write:prompt-drafts. ВАЖНО: ведущие и замыкающие пробелы/переводы строк в replacement_text срезаются — чтобы вставить пустую строку-разделитель между абзацами, держи перевод строки В СЕРЕДИНЕ replacement_text или включи окружающий текст в anchor/target; иначе соседние заголовки/абзацы склеятся. Ответ НЕ содержит текст черновика: приезжают appliedCount/skippedCount, метаданные (draft.characters — длина после правки) и diff — построчная разница «до → после» (removedLines/addedLines, при обрезке truncated: true). ВНИМАНИЕ: пустые removedLines/addedLines НЕ означают «ничего не применилось» — diff строится как разность множеств строк, поэтому move_text_after_text и правка одних пробелов дают пустые списки; факт изменения читай по diff.contentChanged. Перечитать промпт целиком — besales_prompt_patch_get. между батчами.",
|
|
4707
4986
|
"inputSchema": {
|
|
4708
4987
|
"type": "object",
|
|
4709
4988
|
"required": [
|
|
@@ -4766,7 +5045,7 @@
|
|
|
4766
5045
|
},
|
|
4767
5046
|
{
|
|
4768
5047
|
"name": "besales_prompt_patch_commit",
|
|
4769
|
-
"description": "S3.8: коммитит draft как новую PromptVersion. Pipeline: (1) Lint (PromptLintService) — hard_fail блокирует commit с 400; (2) Optimistic lock в prompt-services — `agentSideHash` server-side читается из AgentChat (если production prompt изменился между fork и commit → 409 PROMPT_DRAFT_REBASE_REQUIRED, discard и создай новый); (3) AgentChat sync с conditional UPDATE; (4) если sync упал после успешного PS commit → retry queue (success клиенту). Endpoint: POST /api/v2/agents/{agentId}/prompt/drafts/{draftId}/commit. Scope: write:prompt-drafts.",
|
|
5048
|
+
"description": "S3.8: коммитит draft как новую PromptVersion. Pipeline: (1) Lint (PromptLintService) — hard_fail блокирует commit с 400; (2) Optimistic lock в prompt-services — `agentSideHash` server-side читается из AgentChat (если production prompt изменился между fork и commit → 409 PROMPT_DRAFT_REBASE_REQUIRED, discard и создай новый); (3) AgentChat sync с conditional UPDATE; (4) если sync упал после успешного PS commit → retry queue (success клиенту). Endpoint: POST /api/v2/agents/{agentId}/prompt/drafts/{draftId}/commit. Scope: write:prompt-drafts. Ответ несёт только адресацию новой версии (newVersion.id + version) и метаданные черновика — текст промпта не дублируется.",
|
|
4770
5049
|
"inputSchema": {
|
|
4771
5050
|
"type": "object",
|
|
4772
5051
|
"required": [
|
|
@@ -7325,6 +7604,21 @@
|
|
|
7325
7604
|
}
|
|
7326
7605
|
}
|
|
7327
7606
|
},
|
|
7607
|
+
{
|
|
7608
|
+
"name": "besales_crm_amocrm_channel_registration",
|
|
7609
|
+
"description": "Заявка на регистрацию чат-канала AmoCRM: адрес вебхука воркспейса + текст письма в техподдержку AmoCRM. Без зарегистрированного канала бот управляет сделкой, но переписка в её карточке не появляется — channelId/channelSecretKey выдаёт только их поддержка по письму заданной формы. Текст собирает бэкенд, тот же ответ показывает страница AmoCRM в интерфейсе: пересылай дословно, адрес сам не собирай. Scope: mcp:platform-setup.",
|
|
7610
|
+
"inputSchema": {
|
|
7611
|
+
"type": "object",
|
|
7612
|
+
"required": [],
|
|
7613
|
+
"properties": {
|
|
7614
|
+
"workspace_id": {
|
|
7615
|
+
"type": "string",
|
|
7616
|
+
"format": "uuid",
|
|
7617
|
+
"description": "Optional override. Normally omit — defaults to the workspace bound to this session."
|
|
7618
|
+
}
|
|
7619
|
+
}
|
|
7620
|
+
}
|
|
7621
|
+
},
|
|
7328
7622
|
{
|
|
7329
7623
|
"name": "besales_crm_field_mapping_get",
|
|
7330
7624
|
"description": "v1.5 Increment 5c: текущий маппинг полей CRM + доступные поля. Только AmoCRM/Bitrix24 (иначе unsupported_reason). Scope: mcp:platform-setup.",
|
|
@@ -7756,7 +8050,7 @@
|
|
|
7756
8050
|
},
|
|
7757
8051
|
{
|
|
7758
8052
|
"name": "besales_model_comparison_run_start",
|
|
7759
|
-
"description": "Запустить прогон сравнения промпта агента на нескольких моделях (один и тот же набор диалогов, меняется только модель агента). ДОРОГО — только по явному запросу оператора, НЕ после каждого фикса. models опционально (по умолчанию ~5 defaultSelected из besales_model_catalog_list), 1..
|
|
8053
|
+
"description": "Запустить прогон сравнения промпта агента на нескольких моделях (один и тот же набор диалогов, меняется только модель агента). ДОРОГО — только по явному запросу оператора, НЕ после каждого фикса. models опционально (по умолчанию ~5 defaultSelected из besales_model_catalog_list), 1..26. dialogue_count по умолчанию 5, до 20. Возвращает run_id для besales_model_comparison_get.",
|
|
7760
8054
|
"inputSchema": {
|
|
7761
8055
|
"type": "object",
|
|
7762
8056
|
"required": [
|
|
@@ -7774,8 +8068,8 @@
|
|
|
7774
8068
|
"type": "string"
|
|
7775
8069
|
},
|
|
7776
8070
|
"minItems": 1,
|
|
7777
|
-
"maxItems":
|
|
7778
|
-
"description": "Runnable id моделей из каталога (1..
|
|
8071
|
+
"maxItems": 26,
|
|
8072
|
+
"description": "Runnable id моделей из каталога (1..26). По умолчанию набор defaultSelected."
|
|
7779
8073
|
},
|
|
7780
8074
|
"dialogue_count": {
|
|
7781
8075
|
"type": "integer",
|
|
@@ -8283,7 +8577,8 @@
|
|
|
8283
8577
|
"type": "string",
|
|
8284
8578
|
"enum": [
|
|
8285
8579
|
"cohort",
|
|
8286
|
-
"period"
|
|
8580
|
+
"period",
|
|
8581
|
+
"entry"
|
|
8287
8582
|
],
|
|
8288
8583
|
"default": "period",
|
|
8289
8584
|
"description": "period — по дате события (как вкладка по дням); cohort — по дате запуска волны."
|
|
@@ -8296,20 +8591,24 @@
|
|
|
8296
8591
|
"0-7",
|
|
8297
8592
|
"8-14",
|
|
8298
8593
|
"15-30",
|
|
8299
|
-
"31
|
|
8594
|
+
"31-45",
|
|
8595
|
+
"46-60",
|
|
8596
|
+
"61+"
|
|
8300
8597
|
]
|
|
8301
8598
|
},
|
|
8302
8599
|
{
|
|
8303
8600
|
"type": "array",
|
|
8304
8601
|
"minItems": 1,
|
|
8305
|
-
"maxItems":
|
|
8602
|
+
"maxItems": 6,
|
|
8306
8603
|
"items": {
|
|
8307
8604
|
"type": "string",
|
|
8308
8605
|
"enum": [
|
|
8309
8606
|
"0-7",
|
|
8310
8607
|
"8-14",
|
|
8311
8608
|
"15-30",
|
|
8312
|
-
"31
|
|
8609
|
+
"31-45",
|
|
8610
|
+
"46-60",
|
|
8611
|
+
"61+"
|
|
8313
8612
|
]
|
|
8314
8613
|
}
|
|
8315
8614
|
}
|
|
@@ -8626,20 +8925,24 @@
|
|
|
8626
8925
|
"0-7",
|
|
8627
8926
|
"8-14",
|
|
8628
8927
|
"15-30",
|
|
8629
|
-
"31
|
|
8928
|
+
"31-45",
|
|
8929
|
+
"46-60",
|
|
8930
|
+
"61+"
|
|
8630
8931
|
]
|
|
8631
8932
|
},
|
|
8632
8933
|
{
|
|
8633
8934
|
"type": "array",
|
|
8634
8935
|
"minItems": 1,
|
|
8635
|
-
"maxItems":
|
|
8936
|
+
"maxItems": 6,
|
|
8636
8937
|
"items": {
|
|
8637
8938
|
"type": "string",
|
|
8638
8939
|
"enum": [
|
|
8639
8940
|
"0-7",
|
|
8640
8941
|
"8-14",
|
|
8641
8942
|
"15-30",
|
|
8642
|
-
"31
|
|
8943
|
+
"31-45",
|
|
8944
|
+
"46-60",
|
|
8945
|
+
"61+"
|
|
8643
8946
|
]
|
|
8644
8947
|
}
|
|
8645
8948
|
}
|
|
@@ -8690,7 +8993,8 @@
|
|
|
8690
8993
|
"type": "string",
|
|
8691
8994
|
"enum": [
|
|
8692
8995
|
"cohort",
|
|
8693
|
-
"period"
|
|
8996
|
+
"period",
|
|
8997
|
+
"entry"
|
|
8694
8998
|
],
|
|
8695
8999
|
"default": "period"
|
|
8696
9000
|
},
|
|
@@ -8781,7 +9085,7 @@
|
|
|
8781
9085
|
},
|
|
8782
9086
|
{
|
|
8783
9087
|
"name": "besales_followup_reactions",
|
|
8784
|
-
"description": "Read-only аналитика дожимов: на какой шаг follow-up-цепочки контакт реально отреагировал. Метрик
|
|
9088
|
+
"description": "Read-only аналитика дожимов: на какой шаг follow-up-цепочки контакт реально отреагировал. Метрик ТРИ — операционная (следует за длиной окна шага, шаги по ней сравнивать нельзя), сравнительная на равном горизонте (сравнивать можно только при comparableReliable=true) и runs — отклик на ПРОХОЖДЕНИЕ цепочки за run_window_days от входа, единственная, на которую не влияет частота шагов. Срезы по сегменту/продукту/мессенджеру доступны только у каналов с рассылками. Scope: read:analytics. ⚠️ Реакцией считается не только ответ: `horizonEngaged` — ответили ИЛИ перешли по ссылке касания в том же горизонте, разность с `horizonReplied` даёт «не ответил, но кликнул». Складывать `horizonReplied` и `linkClicked` нельзя — ответивший часто ещё и кликает.",
|
|
8785
9089
|
"inputSchema": {
|
|
8786
9090
|
"type": "object",
|
|
8787
9091
|
"required": [
|
|
@@ -8846,6 +9150,18 @@
|
|
|
8846
9150
|
"type": "string"
|
|
8847
9151
|
},
|
|
8848
9152
|
"description": "Транспорты волны (dimensions.channels): Telegram, WhatsApp, MAX, VK."
|
|
9153
|
+
},
|
|
9154
|
+
"run_window_days": {
|
|
9155
|
+
"type": "integer",
|
|
9156
|
+
"enum": [
|
|
9157
|
+
1,
|
|
9158
|
+
3,
|
|
9159
|
+
5,
|
|
9160
|
+
7,
|
|
9161
|
+
14
|
|
9162
|
+
],
|
|
9163
|
+
"default": 1,
|
|
9164
|
+
"description": "Окно ПРОХОЖДЕНИЯ цепочки для метрики runs: ответил ли человек хоть раз за N дней от входа. Не путать с horizon_minutes — там единица касание, здесь прохождение. У частых цепочек подходящего горизонта не существует, и тогда смотреть надо именно runs."
|
|
8849
9165
|
}
|
|
8850
9166
|
}
|
|
8851
9167
|
}
|
|
@@ -9354,8 +9670,7 @@
|
|
|
9354
9670
|
"RESTRICT",
|
|
9355
9671
|
"ADD"
|
|
9356
9672
|
],
|
|
9357
|
-
"
|
|
9358
|
-
"description": "Как применять «Каналы первого сообщения» к КОНТАКТУ. RESTRICT (по умолчанию) — ФИЛЬТР поверх автоматического выбора: сужает набор и добавить канал НЕ МОЖЕТ, поэтому Email/WhatsApp/SMS в этом режиме не уедут никогда (их нет в bot_link школы). ADD — выбранные каналы добавляются КАЖДОМУ контакту сверх его мессенджеров. Едет ПАРОЙ со списком channels: перебил список на запуске — режим тоже берётся с запуска."
|
|
9673
|
+
"description": "⚠️ УСТАРЕЛО и на поведение НЕ влияет (с 23.08.2026). Список channels значит «слать сюда», а судьбу КАЖДОГО канала решает сервер: мессенджер (Telegram/VK/MAX) уходит, только если школа подтвердила его наличие у контакта; SMS — только при известном телефоне; Email, WhatsApp, Viber, Сайт, Chatium уходят вслепую всем выбранным. Просят «написать ещё и на почту» — добавь Email в channels и перечисли мессенджеры явно, иначе уедет только письмо. Поле принимается ради обратной совместимости и игнорируется."
|
|
9359
9674
|
}
|
|
9360
9675
|
}
|
|
9361
9676
|
}
|
|
@@ -9519,8 +9834,7 @@
|
|
|
9519
9834
|
"RESTRICT",
|
|
9520
9835
|
"ADD"
|
|
9521
9836
|
],
|
|
9522
|
-
"
|
|
9523
|
-
"description": "Как применять «Каналы первого сообщения» к КОНТАКТУ. RESTRICT (по умолчанию) — ФИЛЬТР поверх автоматического выбора: сужает набор и добавить канал НЕ МОЖЕТ, поэтому Email/WhatsApp/SMS в этом режиме не уедут никогда (их нет в bot_link школы). ADD — выбранные каналы добавляются КАЖДОМУ контакту сверх его мессенджеров. Едет ПАРОЙ со списком channels: перебил список на запуске — режим тоже берётся с запуска."
|
|
9837
|
+
"description": "⚠️ УСТАРЕЛО и на поведение НЕ влияет (с 23.08.2026). Список channels значит «слать сюда», а судьбу КАЖДОГО канала решает сервер: мессенджер (Telegram/VK/MAX) уходит, только если школа подтвердила его наличие у контакта; SMS — только при известном телефоне; Email, WhatsApp, Viber, Сайт, Chatium уходят вслепую всем выбранным. Просят «написать ещё и на почту» — добавь Email в channels и перечисли мессенджеры явно, иначе уедет только письмо. Поле принимается ради обратной совместимости и игнорируется."
|
|
9524
9838
|
}
|
|
9525
9839
|
},
|
|
9526
9840
|
"if": {
|
|
@@ -9613,6 +9927,11 @@
|
|
|
9613
9927
|
"type": "string",
|
|
9614
9928
|
"pattern": "^\\d+$",
|
|
9615
9929
|
"description": "Пин сделки для штампа полей (число в строковом виде)"
|
|
9930
|
+
},
|
|
9931
|
+
"segment_entered_at": {
|
|
9932
|
+
"type": "string",
|
|
9933
|
+
"format": "date-time",
|
|
9934
|
+
"description": "Точный момент входа контакта в когорту (ISO с зоной). На нём считается свежесть в «Аналитике рассылок». Заполняй, когда предсписок собран ПРАВИЛОМ и у строки есть свой момент события. Дату запуска подставлять нельзя — она схлопнула бы месяцы когорт в одну."
|
|
9616
9935
|
}
|
|
9617
9936
|
}
|
|
9618
9937
|
}
|
|
@@ -9647,8 +9966,7 @@
|
|
|
9647
9966
|
"RESTRICT",
|
|
9648
9967
|
"ADD"
|
|
9649
9968
|
],
|
|
9650
|
-
"
|
|
9651
|
-
"description": "Как применять «Каналы первого сообщения» к КОНТАКТУ. RESTRICT (по умолчанию) — ФИЛЬТР поверх автоматического выбора: сужает набор и добавить канал НЕ МОЖЕТ, поэтому Email/WhatsApp/SMS в этом режиме не уедут никогда (их нет в bot_link школы). ADD — выбранные каналы добавляются КАЖДОМУ контакту сверх его мессенджеров. Едет ПАРОЙ со списком channels: перебил список на запуске — режим тоже берётся с запуска."
|
|
9969
|
+
"description": "⚠️ УСТАРЕЛО и на поведение НЕ влияет (с 23.08.2026). Список channels значит «слать сюда», а судьбу КАЖДОГО канала решает сервер: мессенджер (Telegram/VK/MAX) уходит, только если школа подтвердила его наличие у контакта; SMS — только при известном телефоне; Email, WhatsApp, Viber, Сайт, Chatium уходят вслепую всем выбранным. Просят «написать ещё и на почту» — добавь Email в channels и перечисли мессенджеры явно, иначе уедет только письмо. Поле принимается ради обратной совместимости и игнорируется."
|
|
9652
9970
|
}
|
|
9653
9971
|
}
|
|
9654
9972
|
}
|
|
@@ -9699,7 +10017,8 @@
|
|
|
9699
10017
|
},
|
|
9700
10018
|
"funnel": {
|
|
9701
10019
|
"type": "string",
|
|
9702
|
-
"maxLength": 200
|
|
10020
|
+
"maxLength": 200,
|
|
10021
|
+
"description": "Воронка ШКОЛЫ в форме «f11 — ДБО / NR / ВК / In Stream» — код fNN ОБЯЗАТЕЛЕН. ⚠️ Это НЕ когорта и НЕ подпись запуска: «reg-no-show», «post-web|дбо», «svs-zapusk» сюда класть нельзя — тип отбора идёт в segment, продукт в product_code, подпись запуска в cohort_label. Ось «Воронка» сравнивается по коду, поэтому значение без кода становится отдельной «воронкой» и засоряет фильтр аналитики. Файл из НЕСКОЛЬКИХ воронок — заполняй воронку построчно в contacts[].funnel."
|
|
9703
10022
|
},
|
|
9704
10023
|
"cohort_label": {
|
|
9705
10024
|
"type": "string",
|
|
@@ -9732,6 +10051,17 @@
|
|
|
9732
10051
|
"type": "string",
|
|
9733
10052
|
"pattern": "^\\d+$",
|
|
9734
10053
|
"description": "Пин сделки для штампа полей (число в строковом виде)"
|
|
10054
|
+
},
|
|
10055
|
+
"segment_entered_at": {
|
|
10056
|
+
"type": "string",
|
|
10057
|
+
"format": "date-time",
|
|
10058
|
+
"description": "Точный момент входа контакта в когорту (ISO с зоной). На нём считается свежесть в «Аналитике рассылок». Заполняй, когда предсписок собран ПРАВИЛОМ и у строки есть свой момент события. Дату запуска подставлять нельзя — она схлопнула бы месяцы когорт в одну."
|
|
10059
|
+
},
|
|
10060
|
+
"funnel": {
|
|
10061
|
+
"type": "string",
|
|
10062
|
+
"minLength": 1,
|
|
10063
|
+
"maxLength": 200,
|
|
10064
|
+
"description": "Воронка ЭТОГО контакта (например «f11 — ДБО / NR / ВК / In Stream»). Заполняй, когда файл собран из НЕСКОЛЬКИХ воронок: одна метка на запуск заставляет писать в поле воронки когорту («reg-no-show|дбо»), и фильтр по воронке перестаёт отвечать на свой вопрос. Не передан — берётся воронка запуска."
|
|
9735
10065
|
}
|
|
9736
10066
|
}
|
|
9737
10067
|
}
|
|
@@ -9776,8 +10106,7 @@
|
|
|
9776
10106
|
"RESTRICT",
|
|
9777
10107
|
"ADD"
|
|
9778
10108
|
],
|
|
9779
|
-
"
|
|
9780
|
-
"description": "Как применять «Каналы первого сообщения» к КОНТАКТУ. RESTRICT (по умолчанию) — ФИЛЬТР поверх автоматического выбора: сужает набор и добавить канал НЕ МОЖЕТ, поэтому Email/WhatsApp/SMS в этом режиме не уедут никогда (их нет в bot_link школы). ADD — выбранные каналы добавляются КАЖДОМУ контакту сверх его мессенджеров. Едет ПАРОЙ со списком channels: перебил список на запуске — режим тоже берётся с запуска."
|
|
10109
|
+
"description": "⚠️ УСТАРЕЛО и на поведение НЕ влияет (с 23.08.2026). Список channels значит «слать сюда», а судьбу КАЖДОГО канала решает сервер: мессенджер (Telegram/VK/MAX) уходит, только если школа подтвердила его наличие у контакта; SMS — только при известном телефоне; Email, WhatsApp, Viber, Сайт, Chatium уходят вслепую всем выбранным. Просят «написать ещё и на почту» — добавь Email в channels и перечисли мессенджеры явно, иначе уедет только письмо. Поле принимается ради обратной совместимости и игнорируется."
|
|
9781
10110
|
}
|
|
9782
10111
|
}
|
|
9783
10112
|
}
|
|
@@ -9833,7 +10162,8 @@
|
|
|
9833
10162
|
},
|
|
9834
10163
|
"funnel": {
|
|
9835
10164
|
"type": "string",
|
|
9836
|
-
"maxLength": 200
|
|
10165
|
+
"maxLength": 200,
|
|
10166
|
+
"description": "Воронка ШКОЛЫ в форме «f11 — ДБО / NR / ВК / In Stream» — код fNN ОБЯЗАТЕЛЕН. ⚠️ Это НЕ когорта и НЕ подпись запуска: «reg-no-show», «post-web|дбо», «svs-zapusk» сюда класть нельзя — тип отбора идёт в segment, продукт в product_code, подпись запуска в cohort_label. Ось «Воронка» сравнивается по коду, поэтому значение без кода становится отдельной «воронкой» и засоряет фильтр аналитики."
|
|
9837
10167
|
},
|
|
9838
10168
|
"cohort_label": {
|
|
9839
10169
|
"type": "string",
|
|
@@ -9865,6 +10195,11 @@
|
|
|
9865
10195
|
"deal_id": {
|
|
9866
10196
|
"type": "string",
|
|
9867
10197
|
"pattern": "^\\d+$"
|
|
10198
|
+
},
|
|
10199
|
+
"segment_entered_at": {
|
|
10200
|
+
"type": "string",
|
|
10201
|
+
"format": "date-time",
|
|
10202
|
+
"description": "Точный момент входа контакта в когорту (ISO с зоной). На нём считается свежесть в «Аналитике рассылок». Заполняй, когда предсписок собран ПРАВИЛОМ и у строки есть свой момент события. Дату запуска подставлять нельзя — она схлопнула бы месяцы когорт в одну."
|
|
9868
10203
|
}
|
|
9869
10204
|
}
|
|
9870
10205
|
}
|
|
@@ -9902,15 +10237,48 @@
|
|
|
9902
10237
|
"RESTRICT",
|
|
9903
10238
|
"ADD"
|
|
9904
10239
|
],
|
|
9905
|
-
"
|
|
9906
|
-
|
|
10240
|
+
"description": "⚠️ УСТАРЕЛО и на поведение НЕ влияет (с 23.08.2026). Список channels значит «слать сюда», а судьбу КАЖДОГО канала решает сервер: мессенджер (Telegram/VK/MAX) уходит, только если школа подтвердила его наличие у контакта; SMS — только при известном телефоне; Email, WhatsApp, Viber, Сайт, Chatium уходят вслепую всем выбранным. Просят «написать ещё и на почту» — добавь Email в channels и перечисли мессенджеры явно, иначе уедет только письмо. Поле принимается ради обратной совместимости и игнорируется."
|
|
10241
|
+
},
|
|
10242
|
+
"guards": {
|
|
10243
|
+
"type": "object",
|
|
10244
|
+
"additionalProperties": false,
|
|
10245
|
+
"description": "Перекрытие предохранителей на ЭТОТ пакет — аварийный обход одной отправки. Не передано — берутся настройки площадки. Значение сохраняется в план пакета, поэтому resume после рестарта доедет с тем же решением. Постоянное ослабление делается в besales_platform_settings_update, где его видно всей команде.",
|
|
10246
|
+
"properties": {
|
|
10247
|
+
"active_series": {
|
|
10248
|
+
"type": "string",
|
|
10249
|
+
"enum": [
|
|
10250
|
+
"OFF",
|
|
10251
|
+
"WARN",
|
|
10252
|
+
"BLOCK"
|
|
10253
|
+
],
|
|
10254
|
+
"description": "Не писать, пока у человека идёт вебинарная серия. По умолчанию BLOCK: до внедрения правило уже блокировало внешними скриптами, и WARN снял бы действующую защиту."
|
|
10255
|
+
},
|
|
10256
|
+
"active_application": {
|
|
10257
|
+
"type": "string",
|
|
10258
|
+
"enum": [
|
|
10259
|
+
"OFF",
|
|
10260
|
+
"WARN",
|
|
10261
|
+
"BLOCK"
|
|
10262
|
+
],
|
|
10263
|
+
"description": "Не писать при действующей (не отменённой) заявке — с человеком работает менеджер. По умолчанию WARN."
|
|
10264
|
+
},
|
|
10265
|
+
"paid": {
|
|
10266
|
+
"type": "string",
|
|
10267
|
+
"enum": [
|
|
10268
|
+
"OFF",
|
|
10269
|
+
"WARN",
|
|
10270
|
+
"BLOCK"
|
|
10271
|
+
],
|
|
10272
|
+
"description": "Не писать оплатившему ЭТОТ продукт. Скоуп по продукту, а не «платил хоть раз». По умолчанию WARN."
|
|
10273
|
+
}
|
|
10274
|
+
}
|
|
9907
10275
|
}
|
|
9908
10276
|
}
|
|
9909
10277
|
}
|
|
9910
10278
|
},
|
|
9911
10279
|
{
|
|
9912
10280
|
"name": "besales_getcourse_cold_welcome_batch_status",
|
|
9913
|
-
"description": "Состояние пакета: агрегат state и разбивка segments[] со своим статусом, importJobId и причиной отказа у каждого. stalled=true — драйвер
|
|
10281
|
+
"description": "Состояние пакета: агрегат state и разбивка segments[] со своим статусом, importJobId и причиной отказа у каждого. completedAt — момент закрытия ВСЕХ сегментов (null, пока пакет идёт). summary — план, доказанные доставки (реестр рассылок) и разбивка исходов; segmentsWithoutOutcomes>0 значит, что у стольких сегментов прогон оборвался, не записав итог, и их исходы в разбивку не вошли. stalled=true — драйвер оборвался: зови besales_getcourse_cold_welcome_batch_resume, а не запускай пакет заново. Опрашивать в цикле не нужно: о завершении и об обрыве платформа докладывает в чат уведомлений воркспейса.",
|
|
9914
10282
|
"inputSchema": {
|
|
9915
10283
|
"type": "object",
|
|
9916
10284
|
"required": [
|
|
@@ -10217,6 +10585,11 @@
|
|
|
10217
10585
|
"type": "integer",
|
|
10218
10586
|
"minimum": 1,
|
|
10219
10587
|
"maximum": 50
|
|
10588
|
+
},
|
|
10589
|
+
"schedule_id": {
|
|
10590
|
+
"type": "string",
|
|
10591
|
+
"format": "uuid",
|
|
10592
|
+
"description": "Только прогоны этого расписания. Ручные отправки и волны при этом не возвращаются вовсе: расписанием они не запускались."
|
|
10220
10593
|
}
|
|
10221
10594
|
}
|
|
10222
10595
|
}
|
|
@@ -10517,7 +10890,7 @@
|
|
|
10517
10890
|
},
|
|
10518
10891
|
{
|
|
10519
10892
|
"name": "besales_tracked_link_list",
|
|
10520
|
-
"description": "Каталог коротких трекинговых ссылок workspace со сводкой «выдано → клики → ответы → заявки → оплаты». Поле placeholder — готовый токен {{link:slug}} для текстов дожимов, рассылок и шаблонов: вставляется ИМЕННО он, сырой URL мимо трекинга не считается. staticUrl — анонимный короткий адрес для мест без персональной выдачи (промпт агента, письмо школы). Ответ постраничный; hasMore=true означает, что каталог не дочитан. Scope: read:analytics. ⚠️ Токен берётся ТОЛЬКО копированием поля placeholder: собранный вручную токен с неточным слагом вырезается вместе с маркером, и клиент получает фразу без ссылки. В промпт агента токен не кладут — там staticUrl.",
|
|
10893
|
+
"description": "Каталог коротких трекинговых ссылок workspace со сводкой «выдано → клики → ответы → заявки → оплаты». Поле placeholder — готовый токен {{link:slug}} для текстов дожимов, рассылок и шаблонов: вставляется ИМЕННО он, сырой URL мимо трекинга не считается. staticUrl — анонимный короткий адрес для мест без персональной выдачи (промпт агента, письмо школы). Ответ постраничный; hasMore=true означает, что каталог не дочитан. Scope: read:analytics. ⚠️ Токен берётся ТОЛЬКО копированием поля placeholder: собранный вручную токен с неточным слагом вырезается вместе с маркером, и клиент получает фразу без ссылки. В промпт агента токен не кладут — там staticUrl. ⚠️ days НЕ ЗАДАН — сводка за ВСЁ ВРЕМЯ (прежде подставлялось окно 60 дней, и оно расходилось само с собой: выданное раньше него показывалось как «выдано 0», тогда как выручка в той же строке считалась за всё время). Нужно окно — назови его явно.",
|
|
10521
10894
|
"inputSchema": {
|
|
10522
10895
|
"type": "object",
|
|
10523
10896
|
"required": [],
|
|
@@ -10668,7 +11041,7 @@
|
|
|
10668
11041
|
},
|
|
10669
11042
|
{
|
|
10670
11043
|
"name": "besales_tracked_link_breakdown",
|
|
10671
|
-
"description": "Разрез одной ссылки по источникам выдачи: WAVE (волна), FOLLOWUP (дожим), CAMPAIGN (кампания), GREETING (приветствие), AGENT (обычный ответ агента) — с воронкой по каждому. Отвечает на вопрос «после чего по ссылке ходят», а не «каким сообщением она ушла». Оплата атрибутируется last-touch по ближайшему клику. Scope: read:analytics.",
|
|
11044
|
+
"description": "Разрез одной ссылки по источникам выдачи: WAVE (волна), FOLLOWUP (дожим), CAMPAIGN (кампания), GREETING (приветствие), AGENT (обычный ответ агента) — с воронкой по каждому. Отвечает на вопрос «после чего по ссылке ходят», а не «каким сообщением она ушла». Оплата атрибутируется last-touch по ближайшему клику. Scope: read:analytics. ⚠️ days НЕ ЗАДАН — сводка за ВСЁ ВРЕМЯ (прежде подставлялось окно 60 дней, и оно расходилось само с собой: выданное раньше него показывалось как «выдано 0», тогда как выручка в той же строке считалась за всё время). Нужно окно — назови его явно.",
|
|
10672
11045
|
"inputSchema": {
|
|
10673
11046
|
"type": "object",
|
|
10674
11047
|
"required": [
|
|
@@ -10696,8 +11069,8 @@
|
|
|
10696
11069
|
}
|
|
10697
11070
|
},
|
|
10698
11071
|
{
|
|
10699
|
-
"name": "
|
|
10700
|
-
"description": "
|
|
11072
|
+
"name": "besales_tracked_link_reach",
|
|
11073
|
+
"description": "Разрез одной ссылки по МЕСТУ применения: площадка и агент, через которых она уходила людям. Отвечает на «где ссылка работает», тогда как besales_tracked_link_breakdown — на «после какого касания по ней ходят». Оси независимые: одна выдача принадлежит ровно одной площадке и одному агенту. null в оси — «не определён», отдельная строка, а не ноль. Пустое имя при заполненном id значит, что площадку или агента удалили: id хранится снимком без внешнего ключа, чтобы история кликов пережила удаление. Scope: read:analytics.",
|
|
10701
11074
|
"inputSchema": {
|
|
10702
11075
|
"type": "object",
|
|
10703
11076
|
"required": [
|
|
@@ -10720,14 +11093,43 @@
|
|
|
10720
11093
|
"minimum": 1,
|
|
10721
11094
|
"maximum": 366,
|
|
10722
11095
|
"description": "Глубина сводки в днях (по умолчанию 60)."
|
|
10723
|
-
}
|
|
10724
|
-
|
|
10725
|
-
|
|
10726
|
-
|
|
10727
|
-
|
|
10728
|
-
|
|
10729
|
-
|
|
10730
|
-
|
|
11096
|
+
}
|
|
11097
|
+
}
|
|
11098
|
+
}
|
|
11099
|
+
},
|
|
11100
|
+
{
|
|
11101
|
+
"name": "besales_tracked_link_clicks",
|
|
11102
|
+
"description": "Лента переходов по ссылке: контакт, сообщение, источник выдачи и время. Клики-предпросмотры мессенджеров отсеяны. ⚠️ Анонимные переходы по staticUrl В ЛЕНТЕ ЕСТЬ — строками с null в chatUserId/contactName/messageId/issuedAt/sourceKind (у анонимного кода человека нет по построению); не считай их людьми, их суммарное число лежит в каталоге полем anonymousClicks. ⚠️ total — число КЛИКОВ (включая повторные и анонимные), а clicked в каталоге — число ВЫДАЧ с первым живым кликом: величины разные и сходиться не обязаны. Постранично: page + page_size (максимум 200). Scope: read:analytics + read:conversations (лента несёт имя контакта и id сообщения; композитный mcp:* покрывает оба). ⚠️ days НЕ ЗАДАН — сводка за ВСЁ ВРЕМЯ (прежде подставлялось окно 60 дней, и оно расходилось само с собой: выданное раньше него показывалось как «выдано 0», тогда как выручка в той же строке считалась за всё время). Нужно окно — назови его явно.",
|
|
11103
|
+
"inputSchema": {
|
|
11104
|
+
"type": "object",
|
|
11105
|
+
"required": [
|
|
11106
|
+
"link_id"
|
|
11107
|
+
],
|
|
11108
|
+
"additionalProperties": false,
|
|
11109
|
+
"properties": {
|
|
11110
|
+
"workspace_id": {
|
|
11111
|
+
"type": "string",
|
|
11112
|
+
"format": "uuid",
|
|
11113
|
+
"description": "Optional override. Normally omit — defaults to the workspace bound to this session."
|
|
11114
|
+
},
|
|
11115
|
+
"link_id": {
|
|
11116
|
+
"type": "string",
|
|
11117
|
+
"format": "uuid",
|
|
11118
|
+
"description": "UUID ссылки из каталога."
|
|
11119
|
+
},
|
|
11120
|
+
"days": {
|
|
11121
|
+
"type": "integer",
|
|
11122
|
+
"minimum": 1,
|
|
11123
|
+
"maximum": 366,
|
|
11124
|
+
"description": "Глубина сводки в днях (по умолчанию 60)."
|
|
11125
|
+
},
|
|
11126
|
+
"page": {
|
|
11127
|
+
"type": "integer",
|
|
11128
|
+
"minimum": 1
|
|
11129
|
+
},
|
|
11130
|
+
"page_size": {
|
|
11131
|
+
"type": "integer",
|
|
11132
|
+
"minimum": 1,
|
|
10731
11133
|
"maximum": 200
|
|
10732
11134
|
}
|
|
10733
11135
|
}
|
|
@@ -10774,6 +11176,631 @@
|
|
|
10774
11176
|
}
|
|
10775
11177
|
}
|
|
10776
11178
|
}
|
|
11179
|
+
},
|
|
11180
|
+
{
|
|
11181
|
+
"name": "besales_broadcast_schedule_list",
|
|
11182
|
+
"description": "Список расписаний автоматических рассылок воркспейса. Scope: read:campaigns. isEnabled=false — расписание заведено, но крон его не берёт (нормальное состояние сразу после создания).",
|
|
11183
|
+
"inputSchema": {
|
|
11184
|
+
"type": "object",
|
|
11185
|
+
"properties": {
|
|
11186
|
+
"workspace_id": {
|
|
11187
|
+
"type": "string",
|
|
11188
|
+
"description": "UUID воркспейса. Подставляется MCP-сервером из подключения — спрашивать у пользователя не нужно."
|
|
11189
|
+
}
|
|
11190
|
+
},
|
|
11191
|
+
"required": []
|
|
11192
|
+
}
|
|
11193
|
+
},
|
|
11194
|
+
{
|
|
11195
|
+
"name": "besales_broadcast_schedule_preview",
|
|
11196
|
+
"description": "Предпросмотр отбора расписания БЕЗ отправки: тот же источник фактов, компилятор правила и исключения, что у крона. Scope: read:campaigns. ⚠️ Показывай пользователю excludedBy и unverifiable числами: unverifiable — «нечем проверить» (нет назначения серии, серия идёт, нет длительности), а не «не подходит». ⚠️⚠️ overlaps — контакты, которых за неделю подавали другие расписания: непустой список означает риск нескольких сообщений одному человеку.",
|
|
11197
|
+
"inputSchema": {
|
|
11198
|
+
"type": "object",
|
|
11199
|
+
"properties": {
|
|
11200
|
+
"workspace_id": {
|
|
11201
|
+
"type": "string",
|
|
11202
|
+
"description": "UUID воркспейса. Подставляется MCP-сервером из подключения — спрашивать у пользователя не нужно."
|
|
11203
|
+
},
|
|
11204
|
+
"segment_id": {
|
|
11205
|
+
"type": "string",
|
|
11206
|
+
"description": "UUID сегмента-правила (BroadcastSegment с фасетами)"
|
|
11207
|
+
},
|
|
11208
|
+
"mailing_variant_id": {
|
|
11209
|
+
"type": "string",
|
|
11210
|
+
"description": "UUID рассылки (текст сообщения)"
|
|
11211
|
+
},
|
|
11212
|
+
"platform_id": {
|
|
11213
|
+
"type": "string",
|
|
11214
|
+
"description": "UUID площадки отправки; её таймзона задаёт сутки расписания"
|
|
11215
|
+
},
|
|
11216
|
+
"mechanism": {
|
|
11217
|
+
"type": "string",
|
|
11218
|
+
"enum": [
|
|
11219
|
+
"cold_welcome"
|
|
11220
|
+
],
|
|
11221
|
+
"description": "Механизм запуска. Пока поддержан только cold_welcome"
|
|
11222
|
+
},
|
|
11223
|
+
"funnels": {
|
|
11224
|
+
"description": "Коды воронок источника, либо \"all\" (без фильтра)",
|
|
11225
|
+
"oneOf": [
|
|
11226
|
+
{
|
|
11227
|
+
"type": "string",
|
|
11228
|
+
"enum": [
|
|
11229
|
+
"all"
|
|
11230
|
+
]
|
|
11231
|
+
},
|
|
11232
|
+
{
|
|
11233
|
+
"type": "array",
|
|
11234
|
+
"items": {
|
|
11235
|
+
"type": "string"
|
|
11236
|
+
},
|
|
11237
|
+
"maxItems": 100
|
|
11238
|
+
}
|
|
11239
|
+
]
|
|
11240
|
+
},
|
|
11241
|
+
"product_codes": {
|
|
11242
|
+
"description": "Канонические коды продуктов, либо \"all\" (без фильтра)",
|
|
11243
|
+
"oneOf": [
|
|
11244
|
+
{
|
|
11245
|
+
"type": "string",
|
|
11246
|
+
"enum": [
|
|
11247
|
+
"all"
|
|
11248
|
+
]
|
|
11249
|
+
},
|
|
11250
|
+
{
|
|
11251
|
+
"type": "array",
|
|
11252
|
+
"items": {
|
|
11253
|
+
"type": "string"
|
|
11254
|
+
},
|
|
11255
|
+
"maxItems": 50
|
|
11256
|
+
}
|
|
11257
|
+
]
|
|
11258
|
+
},
|
|
11259
|
+
"freshness_days": {
|
|
11260
|
+
"type": "integer",
|
|
11261
|
+
"minimum": 1,
|
|
11262
|
+
"maximum": 78,
|
|
11263
|
+
"description": "Окно свежести при window_mode=ROLLING: вошедшие в сегмент за последние N дней. При FIXED не читается"
|
|
11264
|
+
},
|
|
11265
|
+
"time_local": {
|
|
11266
|
+
"type": "string",
|
|
11267
|
+
"pattern": "^([01]\\d|2[0-3]):([0-5]\\d)$",
|
|
11268
|
+
"description": "Локальное время запуска HH:mm в таймзоне площадки"
|
|
11269
|
+
},
|
|
11270
|
+
"days_of_week": {
|
|
11271
|
+
"type": "array",
|
|
11272
|
+
"items": {
|
|
11273
|
+
"type": "integer",
|
|
11274
|
+
"minimum": 1,
|
|
11275
|
+
"maximum": 7
|
|
11276
|
+
},
|
|
11277
|
+
"maxItems": 7,
|
|
11278
|
+
"description": "Дни недели ISO (1 = понедельник). Пусто = каждый день"
|
|
11279
|
+
},
|
|
11280
|
+
"days_of_month": {
|
|
11281
|
+
"type": "array",
|
|
11282
|
+
"items": {
|
|
11283
|
+
"type": "integer",
|
|
11284
|
+
"minimum": 1,
|
|
11285
|
+
"maximum": 31
|
|
11286
|
+
},
|
|
11287
|
+
"maxItems": 31,
|
|
11288
|
+
"description": "Числа месяца 1–31. Пусто = не по числам месяца. Взаимоисключимо с days_of_week: вместе они означают «31-е И понедельник». Число больше длины месяца попадает на ПОСЛЕДНИЙ его день, иначе «31-е» пропускало бы февраль целиком."
|
|
11289
|
+
},
|
|
11290
|
+
"daily_cap": {
|
|
11291
|
+
"type": "integer",
|
|
11292
|
+
"minimum": 1,
|
|
11293
|
+
"maximum": 5000,
|
|
11294
|
+
"description": "Потолок ОТОБРАННЫХ за прогон (не доставленных)"
|
|
11295
|
+
},
|
|
11296
|
+
"selection_order": {
|
|
11297
|
+
"type": "string",
|
|
11298
|
+
"enum": [
|
|
11299
|
+
"FRESH_FIRST",
|
|
11300
|
+
"OLD_FIRST"
|
|
11301
|
+
],
|
|
11302
|
+
"description": "Порядок отбора внутри пула"
|
|
11303
|
+
},
|
|
11304
|
+
"cooldown_days": {
|
|
11305
|
+
"type": "integer",
|
|
11306
|
+
"minimum": 0,
|
|
11307
|
+
"maximum": 365,
|
|
11308
|
+
"description": "Не писать контакту, если он получал любую нашу рассылку за N дней"
|
|
11309
|
+
},
|
|
11310
|
+
"is_enabled": {
|
|
11311
|
+
"type": "boolean",
|
|
11312
|
+
"description": "Включено ли расписание. Создавай выключенным и включай после предпросмотра"
|
|
11313
|
+
},
|
|
11314
|
+
"channels": {
|
|
11315
|
+
"type": "array",
|
|
11316
|
+
"maxItems": 20,
|
|
11317
|
+
"items": {
|
|
11318
|
+
"type": "string",
|
|
11319
|
+
"enum": [
|
|
11320
|
+
"Site",
|
|
11321
|
+
"Email",
|
|
11322
|
+
"SMS",
|
|
11323
|
+
"Telegram",
|
|
11324
|
+
"Facebook",
|
|
11325
|
+
"VK",
|
|
11326
|
+
"Chatium",
|
|
11327
|
+
"WhatsApp",
|
|
11328
|
+
"Viber",
|
|
11329
|
+
"MAX"
|
|
11330
|
+
]
|
|
11331
|
+
},
|
|
11332
|
+
"description": "Каналы «Первого сообщения» (GetCourseTransport). Пусто или ключ не передан — дефолт рассылки. Канал вне списка площадки отвергается: школа не сужает набор, а отвергает его ЦЕЛИКОМ."
|
|
11333
|
+
},
|
|
11334
|
+
"channels_mode": {
|
|
11335
|
+
"type": "string",
|
|
11336
|
+
"enum": [
|
|
11337
|
+
"RESTRICT",
|
|
11338
|
+
"ADD"
|
|
11339
|
+
],
|
|
11340
|
+
"description": "⚠️ УСТАРЕЛО и на поведение НЕ влияет (с 23.08.2026). Список channels значит «слать сюда», а судьбу КАЖДОГО канала решает сервер: мессенджер (Telegram/VK/MAX) уходит, только если школа подтвердила его наличие у контакта; SMS — только при известном телефоне; Email, WhatsApp, Viber, Сайт, Chatium уходят вслепую всем выбранным. Просят «написать ещё и на почту» — добавь Email в channels и перечисли мессенджеры явно, иначе уедет только письмо. Поле принимается ради обратной совместимости и игнорируется."
|
|
11341
|
+
},
|
|
11342
|
+
"window_mode": {
|
|
11343
|
+
"type": "string",
|
|
11344
|
+
"enum": [
|
|
11345
|
+
"ROLLING",
|
|
11346
|
+
"FIXED"
|
|
11347
|
+
],
|
|
11348
|
+
"description": "ROLLING (правый край окна — «сейчас», по умолчанию) или FIXED (явная пара дат)"
|
|
11349
|
+
},
|
|
11350
|
+
"window_from_local": {
|
|
11351
|
+
"type": "string",
|
|
11352
|
+
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
|
|
11353
|
+
"description": "Начало окна при FIXED — ЛОКАЛЬНАЯ дата площадки ГГГГ-ММ-ДД (не момент: момент сдвинул бы границу на смещение зоны)"
|
|
11354
|
+
},
|
|
11355
|
+
"window_to_local": {
|
|
11356
|
+
"type": "string",
|
|
11357
|
+
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
|
|
11358
|
+
"description": "Конец окна при FIXED, ВКЛЮЧИТЕЛЬНО: «по 20 августа» берёт весь двадцатый день"
|
|
11359
|
+
}
|
|
11360
|
+
},
|
|
11361
|
+
"required": [
|
|
11362
|
+
"segment_id",
|
|
11363
|
+
"mailing_variant_id",
|
|
11364
|
+
"platform_id",
|
|
11365
|
+
"mechanism",
|
|
11366
|
+
"freshness_days",
|
|
11367
|
+
"time_local",
|
|
11368
|
+
"daily_cap",
|
|
11369
|
+
"selection_order",
|
|
11370
|
+
"cooldown_days"
|
|
11371
|
+
]
|
|
11372
|
+
}
|
|
11373
|
+
},
|
|
11374
|
+
{
|
|
11375
|
+
"name": "besales_broadcast_schedule_upsert",
|
|
11376
|
+
"description": "Создать или обновить расписание автоматической рассылки (передай schedule_id для обновления). Scope: launch:campaigns. ⚠️ Включённое расписание начнёт слать ЖИВЫМ ЛЮДЯМ на ближайшем тике крона (каждые 5 минут) — создавай выключенным и включай после besales_broadcast_schedule_preview. time_local — в таймзоне ПЛОЩАДКИ.",
|
|
11377
|
+
"inputSchema": {
|
|
11378
|
+
"type": "object",
|
|
11379
|
+
"properties": {
|
|
11380
|
+
"workspace_id": {
|
|
11381
|
+
"type": "string",
|
|
11382
|
+
"description": "UUID воркспейса. Подставляется MCP-сервером из подключения — спрашивать у пользователя не нужно."
|
|
11383
|
+
},
|
|
11384
|
+
"segment_id": {
|
|
11385
|
+
"type": "string",
|
|
11386
|
+
"description": "UUID сегмента-правила (BroadcastSegment с фасетами)"
|
|
11387
|
+
},
|
|
11388
|
+
"mailing_variant_id": {
|
|
11389
|
+
"type": "string",
|
|
11390
|
+
"description": "UUID рассылки (текст сообщения)"
|
|
11391
|
+
},
|
|
11392
|
+
"platform_id": {
|
|
11393
|
+
"type": "string",
|
|
11394
|
+
"description": "UUID площадки отправки; её таймзона задаёт сутки расписания"
|
|
11395
|
+
},
|
|
11396
|
+
"mechanism": {
|
|
11397
|
+
"type": "string",
|
|
11398
|
+
"enum": [
|
|
11399
|
+
"cold_welcome"
|
|
11400
|
+
],
|
|
11401
|
+
"description": "Механизм запуска. Пока поддержан только cold_welcome"
|
|
11402
|
+
},
|
|
11403
|
+
"funnels": {
|
|
11404
|
+
"description": "Коды воронок источника, либо \"all\" (без фильтра)",
|
|
11405
|
+
"oneOf": [
|
|
11406
|
+
{
|
|
11407
|
+
"type": "string",
|
|
11408
|
+
"enum": [
|
|
11409
|
+
"all"
|
|
11410
|
+
]
|
|
11411
|
+
},
|
|
11412
|
+
{
|
|
11413
|
+
"type": "array",
|
|
11414
|
+
"items": {
|
|
11415
|
+
"type": "string"
|
|
11416
|
+
},
|
|
11417
|
+
"maxItems": 100
|
|
11418
|
+
}
|
|
11419
|
+
]
|
|
11420
|
+
},
|
|
11421
|
+
"product_codes": {
|
|
11422
|
+
"description": "Канонические коды продуктов, либо \"all\" (без фильтра)",
|
|
11423
|
+
"oneOf": [
|
|
11424
|
+
{
|
|
11425
|
+
"type": "string",
|
|
11426
|
+
"enum": [
|
|
11427
|
+
"all"
|
|
11428
|
+
]
|
|
11429
|
+
},
|
|
11430
|
+
{
|
|
11431
|
+
"type": "array",
|
|
11432
|
+
"items": {
|
|
11433
|
+
"type": "string"
|
|
11434
|
+
},
|
|
11435
|
+
"maxItems": 50
|
|
11436
|
+
}
|
|
11437
|
+
]
|
|
11438
|
+
},
|
|
11439
|
+
"freshness_days": {
|
|
11440
|
+
"type": "integer",
|
|
11441
|
+
"minimum": 1,
|
|
11442
|
+
"maximum": 78,
|
|
11443
|
+
"description": "Окно свежести при window_mode=ROLLING: вошедшие в сегмент за последние N дней. При FIXED не читается"
|
|
11444
|
+
},
|
|
11445
|
+
"time_local": {
|
|
11446
|
+
"type": "string",
|
|
11447
|
+
"pattern": "^([01]\\d|2[0-3]):([0-5]\\d)$",
|
|
11448
|
+
"description": "Локальное время запуска HH:mm в таймзоне площадки"
|
|
11449
|
+
},
|
|
11450
|
+
"days_of_week": {
|
|
11451
|
+
"type": "array",
|
|
11452
|
+
"items": {
|
|
11453
|
+
"type": "integer",
|
|
11454
|
+
"minimum": 1,
|
|
11455
|
+
"maximum": 7
|
|
11456
|
+
},
|
|
11457
|
+
"maxItems": 7,
|
|
11458
|
+
"description": "Дни недели ISO (1 = понедельник). Пусто = каждый день"
|
|
11459
|
+
},
|
|
11460
|
+
"days_of_month": {
|
|
11461
|
+
"type": "array",
|
|
11462
|
+
"items": {
|
|
11463
|
+
"type": "integer",
|
|
11464
|
+
"minimum": 1,
|
|
11465
|
+
"maximum": 31
|
|
11466
|
+
},
|
|
11467
|
+
"maxItems": 31,
|
|
11468
|
+
"description": "Числа месяца 1–31. Пусто = не по числам месяца. Взаимоисключимо с days_of_week: вместе они означают «31-е И понедельник». Число больше длины месяца попадает на ПОСЛЕДНИЙ его день, иначе «31-е» пропускало бы февраль целиком."
|
|
11469
|
+
},
|
|
11470
|
+
"daily_cap": {
|
|
11471
|
+
"type": "integer",
|
|
11472
|
+
"minimum": 1,
|
|
11473
|
+
"maximum": 5000,
|
|
11474
|
+
"description": "Потолок ОТОБРАННЫХ за прогон (не доставленных)"
|
|
11475
|
+
},
|
|
11476
|
+
"selection_order": {
|
|
11477
|
+
"type": "string",
|
|
11478
|
+
"enum": [
|
|
11479
|
+
"FRESH_FIRST",
|
|
11480
|
+
"OLD_FIRST"
|
|
11481
|
+
],
|
|
11482
|
+
"description": "Порядок отбора внутри пула"
|
|
11483
|
+
},
|
|
11484
|
+
"cooldown_days": {
|
|
11485
|
+
"type": "integer",
|
|
11486
|
+
"minimum": 0,
|
|
11487
|
+
"maximum": 365,
|
|
11488
|
+
"description": "Не писать контакту, если он получал любую нашу рассылку за N дней"
|
|
11489
|
+
},
|
|
11490
|
+
"is_enabled": {
|
|
11491
|
+
"type": "boolean",
|
|
11492
|
+
"description": "Включено ли расписание. Создавай выключенным и включай после предпросмотра"
|
|
11493
|
+
},
|
|
11494
|
+
"schedule_id": {
|
|
11495
|
+
"type": "string",
|
|
11496
|
+
"description": "UUID расписания для обновления. Без него создаётся новое"
|
|
11497
|
+
},
|
|
11498
|
+
"channels": {
|
|
11499
|
+
"type": "array",
|
|
11500
|
+
"maxItems": 20,
|
|
11501
|
+
"items": {
|
|
11502
|
+
"type": "string",
|
|
11503
|
+
"enum": [
|
|
11504
|
+
"Site",
|
|
11505
|
+
"Email",
|
|
11506
|
+
"SMS",
|
|
11507
|
+
"Telegram",
|
|
11508
|
+
"Facebook",
|
|
11509
|
+
"VK",
|
|
11510
|
+
"Chatium",
|
|
11511
|
+
"WhatsApp",
|
|
11512
|
+
"Viber",
|
|
11513
|
+
"MAX"
|
|
11514
|
+
]
|
|
11515
|
+
},
|
|
11516
|
+
"description": "Каналы «Первого сообщения» (GetCourseTransport). Пусто или ключ не передан — дефолт рассылки. Канал вне списка площадки отвергается: школа не сужает набор, а отвергает его ЦЕЛИКОМ."
|
|
11517
|
+
},
|
|
11518
|
+
"channels_mode": {
|
|
11519
|
+
"type": "string",
|
|
11520
|
+
"enum": [
|
|
11521
|
+
"RESTRICT",
|
|
11522
|
+
"ADD"
|
|
11523
|
+
],
|
|
11524
|
+
"description": "⚠️ УСТАРЕЛО и на поведение НЕ влияет (с 23.08.2026). Список channels значит «слать сюда», а судьбу КАЖДОГО канала решает сервер: мессенджер (Telegram/VK/MAX) уходит, только если школа подтвердила его наличие у контакта; SMS — только при известном телефоне; Email, WhatsApp, Viber, Сайт, Chatium уходят вслепую всем выбранным. Просят «написать ещё и на почту» — добавь Email в channels и перечисли мессенджеры явно, иначе уедет только письмо. Поле принимается ради обратной совместимости и игнорируется."
|
|
11525
|
+
},
|
|
11526
|
+
"window_mode": {
|
|
11527
|
+
"type": "string",
|
|
11528
|
+
"enum": [
|
|
11529
|
+
"ROLLING",
|
|
11530
|
+
"FIXED"
|
|
11531
|
+
],
|
|
11532
|
+
"description": "ROLLING (правый край окна — «сейчас», по умолчанию) или FIXED (явная пара дат)"
|
|
11533
|
+
},
|
|
11534
|
+
"window_from_local": {
|
|
11535
|
+
"type": "string",
|
|
11536
|
+
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
|
|
11537
|
+
"description": "Начало окна при FIXED — ЛОКАЛЬНАЯ дата площадки ГГГГ-ММ-ДД (не момент: момент сдвинул бы границу на смещение зоны)"
|
|
11538
|
+
},
|
|
11539
|
+
"window_to_local": {
|
|
11540
|
+
"type": "string",
|
|
11541
|
+
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
|
|
11542
|
+
"description": "Конец окна при FIXED, ВКЛЮЧИТЕЛЬНО: «по 20 августа» берёт весь двадцатый день"
|
|
11543
|
+
}
|
|
11544
|
+
},
|
|
11545
|
+
"required": [
|
|
11546
|
+
"segment_id",
|
|
11547
|
+
"mailing_variant_id",
|
|
11548
|
+
"platform_id",
|
|
11549
|
+
"mechanism",
|
|
11550
|
+
"freshness_days",
|
|
11551
|
+
"time_local",
|
|
11552
|
+
"daily_cap",
|
|
11553
|
+
"selection_order",
|
|
11554
|
+
"cooldown_days"
|
|
11555
|
+
]
|
|
11556
|
+
}
|
|
11557
|
+
},
|
|
11558
|
+
{
|
|
11559
|
+
"name": "besales_broadcast_schedule_delete",
|
|
11560
|
+
"description": "Удалить расписание вместе с историей прогонов. Scope: launch:campaigns. ⚠️ Удаление уносит журнал подач — контакты, которым уже подавали, снова станут кандидатами. Чтобы просто остановить рассылку, сохрани расписание с is_enabled=false.",
|
|
11561
|
+
"inputSchema": {
|
|
11562
|
+
"type": "object",
|
|
11563
|
+
"properties": {
|
|
11564
|
+
"workspace_id": {
|
|
11565
|
+
"type": "string",
|
|
11566
|
+
"description": "UUID воркспейса. Подставляется MCP-сервером из подключения — спрашивать у пользователя не нужно."
|
|
11567
|
+
},
|
|
11568
|
+
"schedule_id": {
|
|
11569
|
+
"type": "string",
|
|
11570
|
+
"description": "UUID расписания"
|
|
11571
|
+
},
|
|
11572
|
+
"explicit_confirmation": {
|
|
11573
|
+
"type": "boolean",
|
|
11574
|
+
"enum": [
|
|
11575
|
+
true
|
|
11576
|
+
],
|
|
11577
|
+
"description": "Явное подтверждение необратимого удаления"
|
|
11578
|
+
}
|
|
11579
|
+
},
|
|
11580
|
+
"required": [
|
|
11581
|
+
"schedule_id",
|
|
11582
|
+
"explicit_confirmation"
|
|
11583
|
+
]
|
|
11584
|
+
}
|
|
11585
|
+
},
|
|
11586
|
+
{
|
|
11587
|
+
"name": "besales_broadcast_schedule_runs",
|
|
11588
|
+
"description": "История прогонов расписания со счётчиками исключений. Scope: read:campaigns. ⚠️ selectedCount — сколько ОТОБРАНО, launchedCount — сколько фактически доставлено; расхождение нормально. WAITING_RESOURCE — воркспейс был занят другим импортом, период не сгорел.",
|
|
11589
|
+
"inputSchema": {
|
|
11590
|
+
"type": "object",
|
|
11591
|
+
"properties": {
|
|
11592
|
+
"workspace_id": {
|
|
11593
|
+
"type": "string",
|
|
11594
|
+
"description": "UUID воркспейса. Подставляется MCP-сервером из подключения — спрашивать у пользователя не нужно."
|
|
11595
|
+
},
|
|
11596
|
+
"schedule_id": {
|
|
11597
|
+
"type": "string",
|
|
11598
|
+
"description": "UUID расписания"
|
|
11599
|
+
},
|
|
11600
|
+
"limit": {
|
|
11601
|
+
"type": "integer",
|
|
11602
|
+
"minimum": 1,
|
|
11603
|
+
"maximum": 100,
|
|
11604
|
+
"description": "Сколько прогонов вернуть (по умолчанию 30)"
|
|
11605
|
+
}
|
|
11606
|
+
},
|
|
11607
|
+
"required": [
|
|
11608
|
+
"schedule_id"
|
|
11609
|
+
]
|
|
11610
|
+
}
|
|
11611
|
+
},
|
|
11612
|
+
{
|
|
11613
|
+
"name": "besales_broadcast_segment_rule_set",
|
|
11614
|
+
"description": "Задать правило отбора сегмента: фасеты поведения, якорь свежести, окно ожидания и приоритет. Scope: launch:campaigns. ⚠️⚠️ 409 означает, что сегментом уже отправляли и правило заморожено — заведи НОВЫЙ сегмент, правка задним числом сделала бы разрез отчёта несопоставимым. Секунды, а не минуты: «от 120 минут» — это activeSecondsMin=7200.",
|
|
11615
|
+
"inputSchema": {
|
|
11616
|
+
"type": "object",
|
|
11617
|
+
"properties": {
|
|
11618
|
+
"workspace_id": {
|
|
11619
|
+
"type": "string",
|
|
11620
|
+
"description": "UUID воркспейса. Подставляется MCP-сервером из подключения — спрашивать у пользователя не нужно."
|
|
11621
|
+
},
|
|
11622
|
+
"segment_id": {
|
|
11623
|
+
"type": "string",
|
|
11624
|
+
"description": "UUID сегмента"
|
|
11625
|
+
},
|
|
11626
|
+
"facets": {
|
|
11627
|
+
"type": "object",
|
|
11628
|
+
"description": "Закрытый набор фасетов поведения",
|
|
11629
|
+
"properties": {
|
|
11630
|
+
"attended": {
|
|
11631
|
+
"type": "string",
|
|
11632
|
+
"enum": [
|
|
11633
|
+
"YES",
|
|
11634
|
+
"NO",
|
|
11635
|
+
"ANY"
|
|
11636
|
+
],
|
|
11637
|
+
"description": "Был на вебинаре. NO проходит только достоверный «не пришёл»"
|
|
11638
|
+
},
|
|
11639
|
+
"activeSecondsMin": {
|
|
11640
|
+
"type": "integer",
|
|
11641
|
+
"minimum": 0,
|
|
11642
|
+
"description": "Нижняя граница секунд просмотра"
|
|
11643
|
+
},
|
|
11644
|
+
"activeSecondsMax": {
|
|
11645
|
+
"type": "integer",
|
|
11646
|
+
"minimum": 0,
|
|
11647
|
+
"description": "Верхняя граница секунд просмотра"
|
|
11648
|
+
},
|
|
11649
|
+
"webinarDayMin": {
|
|
11650
|
+
"type": "integer",
|
|
11651
|
+
"minimum": 0,
|
|
11652
|
+
"description": "Нижняя граница достигнутого дня серии"
|
|
11653
|
+
},
|
|
11654
|
+
"webinarDayMax": {
|
|
11655
|
+
"type": "integer",
|
|
11656
|
+
"minimum": 0,
|
|
11657
|
+
"description": "Верхняя граница достигнутого дня серии"
|
|
11658
|
+
},
|
|
11659
|
+
"bannerClick": {
|
|
11660
|
+
"type": "string",
|
|
11661
|
+
"enum": [
|
|
11662
|
+
"YES",
|
|
11663
|
+
"NO",
|
|
11664
|
+
"ANY"
|
|
11665
|
+
],
|
|
11666
|
+
"description": "Клик по баннеру"
|
|
11667
|
+
},
|
|
11668
|
+
"application": {
|
|
11669
|
+
"type": "string",
|
|
11670
|
+
"enum": [
|
|
11671
|
+
"NONE",
|
|
11672
|
+
"CANCELLED",
|
|
11673
|
+
"ANY"
|
|
11674
|
+
],
|
|
11675
|
+
"description": "CANCELLED требует отменённой заявки И отсутствия живой"
|
|
11676
|
+
},
|
|
11677
|
+
"payment": {
|
|
11678
|
+
"type": "string",
|
|
11679
|
+
"enum": [
|
|
11680
|
+
"NOT_IN_FUNNEL",
|
|
11681
|
+
"NOT_ANYWHERE",
|
|
11682
|
+
"ANY"
|
|
11683
|
+
],
|
|
11684
|
+
"description": "NOT_ANYWHERE исключает всех, кто когда-либо успешно платил (включая возврат)"
|
|
11685
|
+
},
|
|
11686
|
+
"prelist": {
|
|
11687
|
+
"type": "string",
|
|
11688
|
+
"enum": [
|
|
11689
|
+
"YES",
|
|
11690
|
+
"NO",
|
|
11691
|
+
"ANY"
|
|
11692
|
+
],
|
|
11693
|
+
"description": "Предсписок: оформил заказ предсписка. Применимость и метки заказа объявляет ВОРОНКА в источнике фактов; если правило у воронки не задано или данные не готовы, строки приходят непроверяемыми и никому ничего не уйдёт"
|
|
11694
|
+
},
|
|
11695
|
+
"previousSegment": {
|
|
11696
|
+
"type": "object",
|
|
11697
|
+
"additionalProperties": false,
|
|
11698
|
+
"properties": {
|
|
11699
|
+
"key": {
|
|
11700
|
+
"type": "string",
|
|
11701
|
+
"minLength": 1,
|
|
11702
|
+
"maxLength": 64,
|
|
11703
|
+
"description": "Имя сегмента ПРЕДЫДУЩЕГО касания"
|
|
11704
|
+
},
|
|
11705
|
+
"minDaysSince": {
|
|
11706
|
+
"type": "integer",
|
|
11707
|
+
"minimum": 30,
|
|
11708
|
+
"maximum": 78,
|
|
11709
|
+
"description": "Сколько суток должно пройти с прошлого касания (минимум 30 — граница владельца)"
|
|
11710
|
+
}
|
|
11711
|
+
},
|
|
11712
|
+
"required": [
|
|
11713
|
+
"key",
|
|
11714
|
+
"minDaysSince"
|
|
11715
|
+
],
|
|
11716
|
+
"description": "ПОВТОРНОЕ касание: сегмент уходит тем, у кого названный сегмент был ПОСЛЕДНИМ нашим касанием и кто нам не ответил. Снимает вечный одноразовый claim приветствия — единственную защиту от второго сообщения живому человеку"
|
|
11717
|
+
}
|
|
11718
|
+
},
|
|
11719
|
+
"required": [
|
|
11720
|
+
"application",
|
|
11721
|
+
"payment"
|
|
11722
|
+
]
|
|
11723
|
+
},
|
|
11724
|
+
"freshness_anchor": {
|
|
11725
|
+
"type": "string",
|
|
11726
|
+
"enum": [
|
|
11727
|
+
"SERIES_END",
|
|
11728
|
+
"SERIES_END_PLUS_WAIT",
|
|
11729
|
+
"LAST_APPLICATION",
|
|
11730
|
+
"REGISTRATION",
|
|
11731
|
+
"PRELIST"
|
|
11732
|
+
],
|
|
11733
|
+
"description": "Откуда берётся момент входа контакта в сегмент"
|
|
11734
|
+
},
|
|
11735
|
+
"wait_after_series_end_hours": {
|
|
11736
|
+
"type": "integer",
|
|
11737
|
+
"minimum": 0,
|
|
11738
|
+
"maximum": 720,
|
|
11739
|
+
"description": "Сколько ждать после эфира до признания «не пришёл». Дефолт 1 час: касание свежее, но явка к этому моменту досчитана у меньшинства (6 ч → 56 %, 24 ч → 74 %, 48 ч → 81 %), а недосчитанный контакт в отбор не попадает. При коротком ожидании ставьте freshness_days от 3: при 1 человека смотрят ровно один раз"
|
|
11740
|
+
},
|
|
11741
|
+
"priority": {
|
|
11742
|
+
"type": "integer",
|
|
11743
|
+
"minimum": -1000,
|
|
11744
|
+
"maximum": 1000,
|
|
11745
|
+
"description": "Приоритет при пересечении сегментов (больше = важнее)"
|
|
11746
|
+
}
|
|
11747
|
+
},
|
|
11748
|
+
"required": [
|
|
11749
|
+
"segment_id",
|
|
11750
|
+
"facets",
|
|
11751
|
+
"freshness_anchor"
|
|
11752
|
+
]
|
|
11753
|
+
}
|
|
11754
|
+
},
|
|
11755
|
+
{
|
|
11756
|
+
"name": "besales_trigger_claim_list",
|
|
11757
|
+
"description": "Read-only список одноразовых триггеров (runOncePerContact), уже сработавших на контакте. Право сжигается навсегда после первого срабатывания. Scope: mcp:platform-setup.",
|
|
11758
|
+
"inputSchema": {
|
|
11759
|
+
"type": "object",
|
|
11760
|
+
"required": [
|
|
11761
|
+
"chat_user_id"
|
|
11762
|
+
],
|
|
11763
|
+
"additionalProperties": false,
|
|
11764
|
+
"properties": {
|
|
11765
|
+
"chat_user_id": {
|
|
11766
|
+
"type": "string",
|
|
11767
|
+
"format": "uuid",
|
|
11768
|
+
"description": "Контакт (ChatUser). Единица права — канал, а не человек."
|
|
11769
|
+
}
|
|
11770
|
+
}
|
|
11771
|
+
}
|
|
11772
|
+
},
|
|
11773
|
+
{
|
|
11774
|
+
"name": "besales_trigger_claim_reset",
|
|
11775
|
+
"description": "Возвращает контакту право на повторное срабатывание одноразового триггера. Триггер сможет повторить необратимые действия (запись в CRM, передача оператору), поэтому требуется explicit_confirmation. Scope: mcp:platform-setup.",
|
|
11776
|
+
"inputSchema": {
|
|
11777
|
+
"type": "object",
|
|
11778
|
+
"required": [
|
|
11779
|
+
"chat_user_id",
|
|
11780
|
+
"trigger_id",
|
|
11781
|
+
"explicit_confirmation"
|
|
11782
|
+
],
|
|
11783
|
+
"additionalProperties": false,
|
|
11784
|
+
"properties": {
|
|
11785
|
+
"chat_user_id": {
|
|
11786
|
+
"type": "string",
|
|
11787
|
+
"format": "uuid",
|
|
11788
|
+
"description": "Контакт (ChatUser), которому возвращается право."
|
|
11789
|
+
},
|
|
11790
|
+
"trigger_id": {
|
|
11791
|
+
"type": "string",
|
|
11792
|
+
"format": "uuid",
|
|
11793
|
+
"description": "Одноразовый триггер, право на который снимается."
|
|
11794
|
+
},
|
|
11795
|
+
"explicit_confirmation": {
|
|
11796
|
+
"type": "boolean",
|
|
11797
|
+
"enum": [
|
|
11798
|
+
true
|
|
11799
|
+
],
|
|
11800
|
+
"description": "Обязательное подтверждение оператора: триггер сможет повторить необратимые действия во внешних системах. Проверяется и на сервере."
|
|
11801
|
+
}
|
|
11802
|
+
}
|
|
11803
|
+
}
|
|
10777
11804
|
}
|
|
10778
11805
|
],
|
|
10779
11806
|
"resources": [
|
|
@@ -10965,12 +11992,12 @@
|
|
|
10965
11992
|
}
|
|
10966
11993
|
],
|
|
10967
11994
|
"summary": {
|
|
10968
|
-
"total_tools":
|
|
11995
|
+
"total_tools": 213,
|
|
10969
11996
|
"tools_by_category": {
|
|
10970
11997
|
"getcourse_wave": 10,
|
|
10971
11998
|
"files_upload": 3,
|
|
10972
11999
|
"platform_provisioning": 3,
|
|
10973
|
-
"crm_provisioning":
|
|
12000
|
+
"crm_provisioning": 7,
|
|
10974
12001
|
"data_sources": 9,
|
|
10975
12002
|
"workspace_overview": 1,
|
|
10976
12003
|
"icp_management": 3,
|
|
@@ -10984,7 +12011,7 @@
|
|
|
10984
12011
|
"sandbox_findings_external": 2,
|
|
10985
12012
|
"simulation_findings_external": 2,
|
|
10986
12013
|
"qa_generation_external": 2,
|
|
10987
|
-
"platform_setup_bridge":
|
|
12014
|
+
"platform_setup_bridge": 15,
|
|
10988
12015
|
"feedback_sheets": 5,
|
|
10989
12016
|
"facts_management": 2,
|
|
10990
12017
|
"prompt_lint_standalone": 1,
|
|
@@ -11008,7 +12035,9 @@
|
|
|
11008
12035
|
"dialogue_audit": 6,
|
|
11009
12036
|
"link_tracking": 6,
|
|
11010
12037
|
"dialogue_audit_external": 2,
|
|
11011
|
-
"link_tracking_domain": 2
|
|
12038
|
+
"link_tracking_domain": 2,
|
|
12039
|
+
"broadcast_scheduler": 6,
|
|
12040
|
+
"trigger_contact_claims": 2
|
|
11012
12041
|
},
|
|
11013
12042
|
"external_execution_pairs": [
|
|
11014
12043
|
"besales_icp_analysis_get_instructions / submit",
|
|
@@ -11218,6 +12247,21 @@
|
|
|
11218
12247
|
"newly_added_in_link_tracking_domain": [
|
|
11219
12248
|
"besales_link_domain_get",
|
|
11220
12249
|
"besales_link_domain_set"
|
|
12250
|
+
],
|
|
12251
|
+
"newly_added_in_broadcast_scheduler": [
|
|
12252
|
+
"besales_broadcast_schedule_list",
|
|
12253
|
+
"besales_broadcast_schedule_preview",
|
|
12254
|
+
"besales_broadcast_schedule_upsert",
|
|
12255
|
+
"besales_broadcast_schedule_delete",
|
|
12256
|
+
"besales_broadcast_schedule_runs",
|
|
12257
|
+
"besales_broadcast_segment_rule_set"
|
|
12258
|
+
],
|
|
12259
|
+
"newly_added_in_amocrm_channel_registration": [
|
|
12260
|
+
"besales_crm_amocrm_channel_registration"
|
|
12261
|
+
],
|
|
12262
|
+
"newly_added_in_trigger_contact_claims": [
|
|
12263
|
+
"besales_trigger_claim_list",
|
|
12264
|
+
"besales_trigger_claim_reset"
|
|
11221
12265
|
]
|
|
11222
12266
|
}
|
|
11223
12267
|
}
|