@besales/mcp 0.38.0 → 0.39.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/README.md CHANGED
@@ -290,10 +290,11 @@ connect each once and pin sessions via `BESALES_WORKSPACE_ID` (or switch the
290
290
  global default with `besales-mcp use <id>`) — see
291
291
  [Multiple Workspaces](#multiple-workspaces).
292
292
 
293
- ## Available tools (169 tools by category)
293
+ ## Available tools (191 tools by category)
294
294
 
295
- Counts are derived from `src/schemas/mcp-tools.json` (`summary.tools_by_category`)
296
- and asserted in `src/tools/registry.spec.ts`:
295
+ Итоговое число выводится из `src/schemas/mcp-tools.json` (`tools.length`) и закреплено в
296
+ `src/tools/registry.spec.ts`. ⚠️ Разбивка по категориям ниже и `summary.tools_by_category`
297
+ ведутся ВРУЧНУЮ и в сумме отстают от итога — тестами они не проверяются:
297
298
 
298
299
  | Category | Tools | Notes |
299
300
  |---|---|---|
@@ -323,6 +324,7 @@ and asserted in `src/tools/registry.spec.ts`:
323
324
  | Broadcast analytics | 2 | `besales_broadcast_analytics_get`, `besales_broadcast_cohorts_list` — authoritative read-only aggregates, drill-downs, segment/product catalogs, insights and payment-candidate reports from `/broadcast-analytics`, not transcript-derived counts |
324
325
  | GetCourse waves | 10 | `besales_getcourse_wave_import`, `besales_getcourse_wave_status`, `besales_getcourse_wave_run_start`, `besales_getcourse_wave_run_status`, `besales_getcourse_wave_run_contacts`, `besales_getcourse_wave_run_cancel`, `besales_getcourse_wave_run_batch_start`, `besales_getcourse_wave_run_batch_status`, `besales_getcourse_wave_run_batch_cancel`, `besales_getcourse_wave_run_batch_resume`; durable confirm использует стабильный `launch_key` + `dry_run_hash`, import/run/batch принимают `segment_description` |
325
326
  | Scheduled tasks | 2 | `besales_scheduled_task_list`, `besales_scheduled_task_update` — cron-driven dialogue analysis («суфлёр»): daily summary + hourly status written to the CRM timeline or as a hidden open-line message, never to the client |
327
+ | Link tracking (короткие ссылки) | 6 | `besales_tracked_link_list` / `_create` / `_update` / `_archive` / `_breakdown` / `_clicks` — каталог токенов `{{link:slug}}` для текстов дожимов и рассылок; удаления нет (архивация), правка адреса историю выдач не переписывает |
326
328
  | Follow-up (read) | 2 | `besales_followup_sequence_list`, `besales_followup_step_stats` — read a sequence config before a read-modify-write upsert, and see per-step delivery/skip reasons |
327
329
 
328
330
  Recent capabilities:
@@ -390,7 +392,7 @@ Inspect them locally:
390
392
  yarn dlx @modelcontextprotocol/inspector node bin/besales-mcp.js
391
393
  ```
392
394
 
393
- The Inspector should show 169 tools and 31 resources.
395
+ The Inspector should show 191 tools and 31 resources.
394
396
 
395
397
  ## Codex Dialogue Audit Skill
396
398
 
@@ -434,7 +436,7 @@ Claude Code, and Codex CLI are documented in
434
436
  - This package calls Animaly only through `ai-aniomaly` `/api/v2/*`.
435
437
  - Direct calls to `prompt-services` are intentionally out of scope.
436
438
 
437
- The package exposes 169 active MCP tools from `src/schemas/mcp-tools.json`.
439
+ The package exposes 191 active MCP tools from `src/schemas/mcp-tools.json`.
438
440
 
439
441
  ### Token scopes
440
442
 
@@ -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-07-28",
5
+ "lastUpdated": "2026-08-14",
6
6
  "description": "MCP tool schemas для besales-mcp npm package. Active v1.5 set содержит PromptHub/ICP/Sandbox/Knowledge external-execution operations и stateless Platform Setup Bridge direct tools. 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.",
@@ -8091,7 +8091,7 @@
8091
8091
  },
8092
8092
  {
8093
8093
  "name": "besales_broadcast_analytics_get",
8094
- "description": "Read-only все данные страницы /broadcast-analytics: отчёты, drill-down, справочники сегментов и продуктов, качество данных и подтверждения оплат. Выбери report; общие фильтры совпадают с UI. Scope: read:analytics.",
8094
+ "description": "Read-only все данные страницы /broadcast-analytics: отчёты, drill-down, справочники сегментов и продуктов, качество данных и подтверждения оплат. Выбери report; общие фильтры совпадают с UI. Scope: read:analytics для агрегатов; отчёты со строками про конкретных людей (recipients, deals, action_failures, indirect_payments, potential_payments, recent_leads, payment_candidates) требуют дополнительно read:conversations — композитный mcp:* покрывает оба.",
8095
8095
  "inputSchema": {
8096
8096
  "type": "object",
8097
8097
  "required": [],
@@ -9788,7 +9788,7 @@
9788
9788
  },
9789
9789
  {
9790
9790
  "name": "besales_dialogue_audit_findings",
9791
- "description": "Находки прогона — материал для правки промпта. Фильтры: агент, категория, важность, статус разметки человеком (NEW/LIKED/DISLIKED). truncated=true означает обрезанный список. Разметка находок через MCP НЕ выведена: это человеческая оценка работы ревизора. Scope: read:analytics.",
9791
+ "description": "Находки прогона — материал для правки промпта. Фильтры: агент, категория, важность, статус разметки человеком (NEW/LIKED/DISLIKED). truncated=true означает обрезанный список. Разметка находок через MCP НЕ выведена: это человеческая оценка работы ревизора. Scope: read:analytics + read:conversations — находка несёт цитату реплики конкретного человека, а не агрегат (композитный mcp:* покрывает оба).",
9792
9792
  "inputSchema": {
9793
9793
  "type": "object",
9794
9794
  "required": [
@@ -9879,6 +9879,224 @@
9879
9879
  }
9880
9880
  }
9881
9881
  }
9882
+ },
9883
+ {
9884
+ "name": "besales_tracked_link_list",
9885
+ "description": "Каталог коротких трекинговых ссылок workspace со сводкой «выдано → клики → ответы → заявки → оплаты». Поле placeholder — готовый токен {{link:slug}} для текстов дожимов, рассылок и шаблонов: вставляется ИМЕННО он, сырой URL мимо трекинга не считается. staticUrl — анонимный короткий адрес для мест без персональной выдачи (промпт агента, письмо школы). Ответ постраничный; hasMore=true означает, что каталог не дочитан. Scope: read:analytics. ⚠️ Токен берётся ТОЛЬКО копированием поля placeholder: собранный вручную токен с неточным слагом вырезается вместе с маркером, и клиент получает фразу без ссылки. В промпт агента токен не кладут — там staticUrl.",
9886
+ "inputSchema": {
9887
+ "type": "object",
9888
+ "required": [],
9889
+ "additionalProperties": false,
9890
+ "properties": {
9891
+ "workspace_id": {
9892
+ "type": "string",
9893
+ "format": "uuid",
9894
+ "description": "Optional override. Normally omit — defaults to the workspace bound to this session."
9895
+ },
9896
+ "include_archived": {
9897
+ "type": "boolean",
9898
+ "description": "Показать и архивные ссылки. Их слаги ЗАНЯТЫ: создание с тем же слагом даст 409. Архивные идут первыми."
9899
+ },
9900
+ "days": {
9901
+ "type": "integer",
9902
+ "minimum": 1,
9903
+ "maximum": 366,
9904
+ "description": "Глубина сводки в днях (по умолчанию 60)."
9905
+ },
9906
+ "limit": {
9907
+ "type": "integer",
9908
+ "minimum": 1,
9909
+ "maximum": 200,
9910
+ "description": "Размер страницы (по умолчанию 50)."
9911
+ },
9912
+ "offset": {
9913
+ "type": "integer",
9914
+ "minimum": 0,
9915
+ "description": "Смещение страницы."
9916
+ }
9917
+ }
9918
+ }
9919
+ },
9920
+ {
9921
+ "name": "besales_tracked_link_create",
9922
+ "description": "Завести трекинговую ссылку: имя, слаг и целевой http(s)-адрес. В ответе приходит placeholder {{link:slug}} — вставляй его в тексты вместо сырого URL, иначе переход не попадёт в аналитику. Слаг НЕИЗМЕНЯЕМ (он уходит в отправленные сообщения) и уникален в workspace; 409 значит, что слаг занят живой ИЛИ архивной ссылкой — архивную восстанавливают besales_tracked_link_update(restore=true), а не заводят новую. Scope: mcp:platform-setup. ⚠️ В тексты вставляется поле placeholder из ответа ДОСЛОВНО, а не собранный вручную токен: неточный слаг вырежется и клиент получит фразу без ссылки.",
9923
+ "inputSchema": {
9924
+ "type": "object",
9925
+ "required": [
9926
+ "name",
9927
+ "slug",
9928
+ "target_url"
9929
+ ],
9930
+ "additionalProperties": false,
9931
+ "properties": {
9932
+ "workspace_id": {
9933
+ "type": "string",
9934
+ "format": "uuid",
9935
+ "description": "Optional override. Normally omit — defaults to the workspace bound to this session."
9936
+ },
9937
+ "name": {
9938
+ "type": "string",
9939
+ "minLength": 1,
9940
+ "maxLength": 200,
9941
+ "description": "Название для аналитики, например «Эфир 1, 15:00»."
9942
+ },
9943
+ "slug": {
9944
+ "type": "string",
9945
+ "pattern": "^[a-zA-Z0-9_-]{1,64}$",
9946
+ "description": "Часть плейсхолдера {{link:slug}}: латиница, цифры, дефис, подчёркивание, до 64 символов. Изменить потом нельзя."
9947
+ },
9948
+ "target_url": {
9949
+ "type": "string",
9950
+ "maxLength": 2048,
9951
+ "description": "Абсолютный http(s)-адрес, куда ведёт ссылка. Только http/https.",
9952
+ "pattern": "^https?://"
9953
+ },
9954
+ "product_code": {
9955
+ "type": "string",
9956
+ "maxLength": 64,
9957
+ "description": "Код продукта для сводки каталога."
9958
+ }
9959
+ }
9960
+ }
9961
+ },
9962
+ {
9963
+ "name": "besales_tracked_link_update",
9964
+ "description": "Изменить название, целевой адрес или код продукта ссылки либо снять её из архива (restore=true). Требуется хотя бы одно изменяемое поле. ⚠️ Правка target_url действует ТОЛЬКО ВПЕРЁД: персональные коды, уже ушедшие людям, остаются на СТАРОМ адресе (каждая выдача хранит снимок адреса на момент отправки, резолвер читает его), новые выдачи получат новый адрес, анонимный staticUrl переключится сразу. Перенаправить тех, кому ссылка уже отправлена, правкой НЕЛЬЗЯ — нужна новая ссылка в новом тексте. Поля ответа сюда не копируются: slug неизменяем, archivedAt не поле записи (архивация — besales_tracked_link_archive), счётчики и placeholder только читаются. Scope: mcp:platform-setup.",
9965
+ "inputSchema": {
9966
+ "type": "object",
9967
+ "required": [
9968
+ "link_id"
9969
+ ],
9970
+ "additionalProperties": false,
9971
+ "properties": {
9972
+ "workspace_id": {
9973
+ "type": "string",
9974
+ "format": "uuid",
9975
+ "description": "Optional override. Normally omit — defaults to the workspace bound to this session."
9976
+ },
9977
+ "link_id": {
9978
+ "type": "string",
9979
+ "format": "uuid",
9980
+ "description": "UUID ссылки из каталога."
9981
+ },
9982
+ "name": {
9983
+ "type": "string",
9984
+ "minLength": 1,
9985
+ "maxLength": 200
9986
+ },
9987
+ "target_url": {
9988
+ "type": "string",
9989
+ "maxLength": 2048,
9990
+ "description": "Новый абсолютный http(s)-адрес. Действует только вперёд: уже отправленные персональные коды остаются на прежней цели (там снимок адреса).",
9991
+ "pattern": "^https?://"
9992
+ },
9993
+ "product_code": {
9994
+ "type": "string",
9995
+ "maxLength": 64
9996
+ },
9997
+ "restore": {
9998
+ "const": true,
9999
+ "type": "boolean",
10000
+ "description": "Снять ссылку из архива. Архивирует besales_tracked_link_archive."
10001
+ }
10002
+ }
10003
+ }
10004
+ },
10005
+ {
10006
+ "name": "besales_tracked_link_archive",
10007
+ "description": "Архивировать ссылку. Удаления у трекинговых ссылок НЕТ и не будет: код уже лежит в отправленных людям сообщениях, и hard-delete превратил бы живую ссылку в 404. Архивная ссылка перестаёт подставляться в новые тексты, но её код продолжает резолвиться, клики считаются, а слаг остаётся занятым. Восстановление — besales_tracked_link_update(restore=true). Требует explicit_confirmation=true после явного подтверждения пользователя. Scope: mcp:platform-setup.",
10008
+ "inputSchema": {
10009
+ "type": "object",
10010
+ "required": [
10011
+ "link_id",
10012
+ "explicit_confirmation"
10013
+ ],
10014
+ "additionalProperties": false,
10015
+ "properties": {
10016
+ "workspace_id": {
10017
+ "type": "string",
10018
+ "format": "uuid",
10019
+ "description": "Optional override. Normally omit — defaults to the workspace bound to this session."
10020
+ },
10021
+ "link_id": {
10022
+ "type": "string",
10023
+ "format": "uuid",
10024
+ "description": "UUID ссылки из каталога."
10025
+ },
10026
+ "explicit_confirmation": {
10027
+ "const": true,
10028
+ "type": "boolean",
10029
+ "description": "Подтверждение пользователя на архивацию ссылки."
10030
+ }
10031
+ }
10032
+ }
10033
+ },
10034
+ {
10035
+ "name": "besales_tracked_link_breakdown",
10036
+ "description": "Разрез одной ссылки по источникам выдачи: WAVE (волна), FOLLOWUP (дожим), CAMPAIGN (кампания), GREETING (приветствие), AGENT (обычный ответ агента) — с воронкой по каждому. Отвечает на вопрос «после чего по ссылке ходят», а не «каким сообщением она ушла». Оплата атрибутируется last-touch по ближайшему клику. Scope: read:analytics.",
10037
+ "inputSchema": {
10038
+ "type": "object",
10039
+ "required": [
10040
+ "link_id"
10041
+ ],
10042
+ "additionalProperties": false,
10043
+ "properties": {
10044
+ "workspace_id": {
10045
+ "type": "string",
10046
+ "format": "uuid",
10047
+ "description": "Optional override. Normally omit — defaults to the workspace bound to this session."
10048
+ },
10049
+ "link_id": {
10050
+ "type": "string",
10051
+ "format": "uuid",
10052
+ "description": "UUID ссылки из каталога."
10053
+ },
10054
+ "days": {
10055
+ "type": "integer",
10056
+ "minimum": 1,
10057
+ "maximum": 366,
10058
+ "description": "Глубина сводки в днях (по умолчанию 60)."
10059
+ }
10060
+ }
10061
+ }
10062
+ },
10063
+ {
10064
+ "name": "besales_tracked_link_clicks",
10065
+ "description": "Лента переходов по ссылке: контакт, сообщение, источник выдачи и время. Клики-предпросмотры мессенджеров отсеяны. ⚠️ Анонимные переходы по staticUrl В ЛЕНТЕ ЕСТЬ — строками с null в chatUserId/contactName/messageId/issuedAt/sourceKind (у анонимного кода человека нет по построению); не считай их людьми, их суммарное число лежит в каталоге полем anonymousClicks. ⚠️ total — число КЛИКОВ (включая повторные и анонимные), а clicked в каталоге — число ВЫДАЧ с первым живым кликом: величины разные и сходиться не обязаны. Постранично: page + page_size (максимум 200). Scope: read:analytics + read:conversations (лента несёт имя контакта и id сообщения; композитный mcp:* покрывает оба).",
10066
+ "inputSchema": {
10067
+ "type": "object",
10068
+ "required": [
10069
+ "link_id"
10070
+ ],
10071
+ "additionalProperties": false,
10072
+ "properties": {
10073
+ "workspace_id": {
10074
+ "type": "string",
10075
+ "format": "uuid",
10076
+ "description": "Optional override. Normally omit — defaults to the workspace bound to this session."
10077
+ },
10078
+ "link_id": {
10079
+ "type": "string",
10080
+ "format": "uuid",
10081
+ "description": "UUID ссылки из каталога."
10082
+ },
10083
+ "days": {
10084
+ "type": "integer",
10085
+ "minimum": 1,
10086
+ "maximum": 366,
10087
+ "description": "Глубина сводки в днях (по умолчанию 60)."
10088
+ },
10089
+ "page": {
10090
+ "type": "integer",
10091
+ "minimum": 1
10092
+ },
10093
+ "page_size": {
10094
+ "type": "integer",
10095
+ "minimum": 1,
10096
+ "maximum": 200
10097
+ }
10098
+ }
10099
+ }
9882
10100
  }
9883
10101
  ],
9884
10102
  "resources": [
@@ -10070,7 +10288,7 @@
10070
10288
  }
10071
10289
  ],
10072
10290
  "summary": {
10073
- "total_tools": 185,
10291
+ "total_tools": 191,
10074
10292
  "tools_by_category": {
10075
10293
  "getcourse_wave": 10,
10076
10294
  "files_upload": 3,
@@ -10109,7 +10327,8 @@
10109
10327
  "broadcast_analytics": 2,
10110
10328
  "scheduled_tasks": 2,
10111
10329
  "follow_up_read": 3,
10112
- "dialogue_audit": 6
10330
+ "dialogue_audit": 6,
10331
+ "link_tracking": 6
10113
10332
  },
10114
10333
  "external_execution_pairs": [
10115
10334
  "besales_icp_analysis_get_instructions / submit",
@@ -10301,6 +10520,14 @@
10301
10520
  ],
10302
10521
  "newly_added_in_followup_reactions": [
10303
10522
  "besales_followup_reactions"
10523
+ ],
10524
+ "newly_added_in_link_tracking": [
10525
+ "besales_tracked_link_list",
10526
+ "besales_tracked_link_create",
10527
+ "besales_tracked_link_update",
10528
+ "besales_tracked_link_archive",
10529
+ "besales_tracked_link_breakdown",
10530
+ "besales_tracked_link_clicks"
10304
10531
  ]
10305
10532
  }
10306
10533
  }
@@ -0,0 +1,34 @@
1
+ export declare const linkTrackingTools: (import("./shared.js").ToolDefinition<{
2
+ workspace_id?: string | undefined;
3
+ include_archived?: boolean | undefined;
4
+ days?: number | undefined;
5
+ limit?: number | undefined;
6
+ offset?: number | undefined;
7
+ }> | import("./shared.js").ToolDefinition<{
8
+ name: string;
9
+ slug: string;
10
+ target_url: string;
11
+ workspace_id?: string | undefined;
12
+ product_code?: string | undefined;
13
+ }> | import("./shared.js").ToolDefinition<{
14
+ link_id: string;
15
+ workspace_id?: string | undefined;
16
+ name?: string | undefined;
17
+ target_url?: string | undefined;
18
+ product_code?: string | undefined;
19
+ restore?: true | undefined;
20
+ }> | import("./shared.js").ToolDefinition<{
21
+ link_id: string;
22
+ explicit_confirmation: true;
23
+ workspace_id?: string | undefined;
24
+ }> | import("./shared.js").ToolDefinition<{
25
+ link_id: string;
26
+ workspace_id?: string | undefined;
27
+ days?: number | undefined;
28
+ }> | import("./shared.js").ToolDefinition<{
29
+ link_id: string;
30
+ workspace_id?: string | undefined;
31
+ days?: number | undefined;
32
+ page?: number | undefined;
33
+ page_size?: number | undefined;
34
+ }>)[];
@@ -0,0 +1,200 @@
1
+ import { z } from 'zod';
2
+ import { buildListQuery, compactObject, defineTool, uuidSchema, withInstructions } from './shared.js';
3
+ const NAME_MAX_LENGTH = 200;
4
+ const TARGET_URL_MAX_LENGTH = 2048;
5
+ const PRODUCT_CODE_MAX_LENGTH = 64;
6
+ /** Форма слага — паритет с `CreateTrackedLinkDto`: латиница, цифры, дефис, подчёркивание. */
7
+ const SLUG_PATTERN = /^[a-zA-Z0-9_-]{1,64}$/;
8
+ /** Потолок глубины аналитики — паритет с `LINK_ANALYTICS_MAX_DAYS`. */
9
+ const ANALYTICS_MAX_DAYS = 366;
10
+ /** Потолок страницы каталога и ленты кликов — паритет с `LINK_CATALOG_PAGE_SIZE_MAX`. */
11
+ const PAGE_SIZE_MAX = 200;
12
+ /** Схемы целевого адреса — паритет с `LINK_ALLOWED_PROTOCOLS`. */
13
+ const ALLOWED_TARGET_PROTOCOLS = ['http:', 'https:'];
14
+ const slugSchema = z
15
+ .string()
16
+ .regex(SLUG_PATTERN, 'slug: латиница, цифры, дефис и подчёркивание, до 64 символов');
17
+ /**
18
+ * Целевой адрес обязан быть абсолютным http(s). Проверяем здесь, а не только на бэкенде:
19
+ * `javascript:`-адрес через наш общий домен — это фишинг, и узнавать о запрете из 400-й
20
+ * после того, как агент уже сочинил каталог ссылок, дороже, чем отвергнуть на входе.
21
+ *
22
+ * ⚠️ Разбираем `new URL()`, а не сверяем префикс: бэкендский `isAllowedTargetUrl` устроен
23
+ * именно так, и проверка префиксом принимала бы `http://` без хоста — значение, которое
24
+ * клиент считает валидным, а сервер отвергает 400-й.
25
+ */
26
+ const targetUrlSchema = z
27
+ .string()
28
+ .max(TARGET_URL_MAX_LENGTH)
29
+ .refine((value) => {
30
+ try {
31
+ return ALLOWED_TARGET_PROTOCOLS.includes(new URL(value).protocol);
32
+ }
33
+ catch {
34
+ return false;
35
+ }
36
+ }, { message: 'target_url должен быть абсолютным http(s)-адресом' });
37
+ const daysSchema = z.number().int().min(1).max(ANALYTICS_MAX_DAYS);
38
+ export const linkTrackingTools = [
39
+ defineTool({
40
+ name: 'besales_tracked_link_list',
41
+ requiredFields: [],
42
+ defaultWorkspaceId: true,
43
+ schema: z
44
+ .object({
45
+ workspace_id: uuidSchema.optional(),
46
+ include_archived: z.boolean().optional(),
47
+ days: daysSchema.optional(),
48
+ limit: z.number().int().min(1).max(PAGE_SIZE_MAX).optional(),
49
+ offset: z.number().int().min(0).optional(),
50
+ })
51
+ .strict(),
52
+ createRequest: (input) => ({
53
+ method: 'GET',
54
+ path: `/workspaces/${input.workspace_id}/tracked-links${buildListQuery({
55
+ includeArchived: input.include_archived,
56
+ days: input.days,
57
+ limit: input.limit,
58
+ offset: input.offset,
59
+ })}`,
60
+ }),
61
+ enhanceResponse: (response) => withInstructions(response, [
62
+ 'Каталог коротких ссылок воркспейса со сводкой «выдано → клики → ответы → заявки → оплаты».',
63
+ 'Поле placeholder — готовый токен ссылки. Копируй его ДОСЛОВНО в текст дожима, рассылки или шаблона; сырой URL мимо каталога не трекается.',
64
+ '⚠️ Токен не пиши руками и не подставляй в него свой слаг: несуществующий слаг вырезается вместе с маркером, и клиент получит фразу ВООБЩЕ без ссылки — молча, только с ошибкой в логах. В промпт агента токен не клади вовсе (модель воспроизведёт его неточно) — там используй staticUrl.',
65
+ 'staticUrl — анонимный короткий адрес для мест, где персональной выдачи нет: промпт агента (модель не воспроизведёт токен дословно), письмо школы, подпись вложения. Клики по нему считаются без привязки к человеку.',
66
+ 'hasMore=true означает, что каталог не дочитан: увеличивай offset. Вывод «такого слага нет» по неполной странице недействителен.',
67
+ 'Архивные ссылки по умолчанию скрыты — чтобы их увидеть, передай include_archived=true. Их слаги ЗАНЯТЫ: создание с тем же слагом даст 409. При include_archived=true архивные идут ПЕРВЫМИ.',
68
+ ]),
69
+ }),
70
+ defineTool({
71
+ name: 'besales_tracked_link_create',
72
+ requiredFields: ['name', 'slug', 'target_url'],
73
+ defaultWorkspaceId: true,
74
+ schema: z
75
+ .object({
76
+ workspace_id: uuidSchema.optional(),
77
+ name: z.string().trim().min(1).max(NAME_MAX_LENGTH),
78
+ slug: slugSchema,
79
+ target_url: targetUrlSchema,
80
+ product_code: z.string().max(PRODUCT_CODE_MAX_LENGTH).optional(),
81
+ })
82
+ .strict(),
83
+ createRequest: (input) => ({
84
+ method: 'POST',
85
+ path: `/workspaces/${input.workspace_id}/tracked-links`,
86
+ body: compactObject({
87
+ name: input.name,
88
+ slug: input.slug,
89
+ targetUrl: input.target_url,
90
+ productCode: input.product_code,
91
+ }),
92
+ }),
93
+ enhanceResponse: (response) => withInstructions(response, [
94
+ 'Ссылка заведена. Возьми из ответа поле placeholder и вставь его в тексты ДОСЛОВНО — сырой URL мимо каталога не трекается, а собранный вручную токен с неточным слагом вырежется, и клиент получит фразу без ссылки.',
95
+ 'Слаг НЕИЗМЕНЯЕМ: он уходит в отправленные сообщения. Выбирай осмысленный и стабильный (например shzh-w1-15), переименовать потом можно только name.',
96
+ '409 означает, что слаг занят — возможно, АРХИВНОЙ ссылкой. Тогда не выдумывай новый слаг: найди её через besales_tracked_link_list(include_archived=true) и восстанови besales_tracked_link_update(restore=true).',
97
+ ]),
98
+ }),
99
+ defineTool({
100
+ name: 'besales_tracked_link_update',
101
+ requiredFields: ['link_id'],
102
+ defaultWorkspaceId: true,
103
+ schema: z
104
+ .object({
105
+ workspace_id: uuidSchema.optional(),
106
+ link_id: uuidSchema,
107
+ name: z.string().trim().min(1).max(NAME_MAX_LENGTH).optional(),
108
+ target_url: targetUrlSchema.optional(),
109
+ product_code: z.string().max(PRODUCT_CODE_MAX_LENGTH).optional(),
110
+ restore: z.literal(true).optional(),
111
+ })
112
+ .strict()
113
+ .refine((input) => input.name !== undefined ||
114
+ input.target_url !== undefined ||
115
+ input.product_code !== undefined ||
116
+ input.restore !== undefined, { message: 'Передай хотя бы одно поле для изменения' }),
117
+ createRequest: (input) => ({
118
+ method: 'PATCH',
119
+ path: `/workspaces/${input.workspace_id}/tracked-links/${input.link_id}`,
120
+ body: compactObject({
121
+ name: input.name,
122
+ targetUrl: input.target_url,
123
+ productCode: input.product_code,
124
+ restore: input.restore,
125
+ }),
126
+ }),
127
+ enhanceResponse: (response) => withInstructions(response, [
128
+ '⚠️ Правка target_url действует ТОЛЬКО ВПЕРЁД, и это три разных случая. Персональные коды, УЖЕ ушедшие людям, остаются на СТАРОМ адресе: каждая выдача хранит снимок адреса на момент отправки, и резолвер читает именно его. Новые выдачи получат новый адрес. Анонимный staticUrl переключается на новый адрес сразу.',
129
+ 'Отсюда следствие: правкой target_url НЕЛЬЗЯ перенаправить тех, кому ссылка уже отправлена, — для этого нужна новая ссылка в новом тексте. Снимок ещё и делает отчёты доказуемыми: видно, куда вело конкретное сообщение.',
130
+ 'Поля ответа сюда не копируются: slug неизменяем, а archivedAt не поле записи — снятие из архива это restore=true, архивация — besales_tracked_link_archive. Счётчики (issued/clicked/...) и placeholder/staticUrl только читаются.',
131
+ ]),
132
+ }),
133
+ defineTool({
134
+ name: 'besales_tracked_link_archive',
135
+ requiredFields: ['link_id', 'explicit_confirmation'],
136
+ defaultWorkspaceId: true,
137
+ schema: z
138
+ .object({
139
+ workspace_id: uuidSchema.optional(),
140
+ link_id: uuidSchema,
141
+ explicit_confirmation: z.literal(true),
142
+ })
143
+ .strict(),
144
+ createRequest: (input) => ({
145
+ method: 'DELETE',
146
+ path: `/workspaces/${input.workspace_id}/tracked-links/${input.link_id}`,
147
+ }),
148
+ enhanceResponse: (response) => withInstructions(response, [
149
+ 'Это АРХИВАЦИЯ, а не удаление: hard-delete у ссылок отсутствует в принципе. Код уже лежит в отправленных людям сообщениях, и удаление превратило бы живую ссылку в 404.',
150
+ 'Архивная ссылка перестаёт подставляться в новые тексты, но её код продолжает резолвиться, клики продолжают считаться, а слаг остаётся занятым.',
151
+ 'Восстановление — besales_tracked_link_update(restore=true). explicit_confirmation=true передавай только после явного подтверждения пользователя.',
152
+ ]),
153
+ }),
154
+ defineTool({
155
+ name: 'besales_tracked_link_breakdown',
156
+ requiredFields: ['link_id'],
157
+ defaultWorkspaceId: true,
158
+ schema: z
159
+ .object({
160
+ workspace_id: uuidSchema.optional(),
161
+ link_id: uuidSchema,
162
+ days: daysSchema.optional(),
163
+ })
164
+ .strict(),
165
+ createRequest: (input) => ({
166
+ method: 'GET',
167
+ path: `/workspaces/${input.workspace_id}/tracked-links/${input.link_id}/breakdown${buildListQuery({ days: input.days })}`,
168
+ }),
169
+ enhanceResponse: (response) => withInstructions(response, [
170
+ 'Разрез одной ссылки по источникам выдачи: WAVE (волна), FOLLOWUP (дожим), CAMPAIGN (кампания), GREETING (приветствие), AGENT (обычный ответ агента).',
171
+ 'sourceId у волны пуст: welcome запускается переходом сделки, а не джобом импорта, поэтому разрез отвечает «после волны», но не «после какой именно».',
172
+ 'Оплата атрибутируется last-touch по ближайшему клику, поэтому суммы по разным ссылкам не складываются в общую выручку дважды.',
173
+ ]),
174
+ }),
175
+ defineTool({
176
+ name: 'besales_tracked_link_clicks',
177
+ requiredFields: ['link_id'],
178
+ defaultWorkspaceId: true,
179
+ schema: z
180
+ .object({
181
+ workspace_id: uuidSchema.optional(),
182
+ link_id: uuidSchema,
183
+ days: daysSchema.optional(),
184
+ page: z.number().int().min(1).optional(),
185
+ page_size: z.number().int().min(1).max(PAGE_SIZE_MAX).optional(),
186
+ })
187
+ .strict(),
188
+ createRequest: (input) => ({
189
+ method: 'GET',
190
+ path: `/workspaces/${input.workspace_id}/tracked-links/${input.link_id}/clicks${buildListQuery({ days: input.days, page: input.page, pageSize: input.page_size })}`,
191
+ }),
192
+ enhanceResponse: (response) => withInstructions(response, [
193
+ 'Лента переходов живых людей: контакт, сообщение, источник, время. Клики-предпросмотры мессенджеров отсеяны и сюда не попадают.',
194
+ '⚠️ Анонимные переходы по staticUrl В ЛЕНТЕ ЕСТЬ — строками, где chatUserId, contactName, messageId, issuedAt и sourceKind равны null. Это не битый ответ: у анонимного кода человека нет по построению. Не считай такие строки людьми; их суммарное число отдельно лежит в каталоге полем anonymousClicks.',
195
+ '⚠️ total — это число КЛИКОВ (включая повторные и анонимные), а поле clicked в каталоге — число ВЫДАЧ с первым живым кликом. Величины разные, сходиться не обязаны и по-разному отвечают на «сколько человек перешло».',
196
+ 'Для следующей страницы увеличивай page; максимальный page_size — 200.',
197
+ ]),
198
+ }),
199
+ ];
200
+ //# sourceMappingURL=link-tracking.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link-tracking.js","sourceRoot":"","sources":["../../../src/tools/definitions/link-tracking.ts"],"names":[],"mappings":"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"}
@@ -1571,6 +1571,39 @@ export declare const toolDefinitions: (import("./definitions/shared.js").ToolDef
1571
1571
  }> | import("./definitions/shared.js").ToolDefinition<{
1572
1572
  run_id: string;
1573
1573
  explicit_confirmation?: boolean | undefined;
1574
+ }> | import("./definitions/shared.js").ToolDefinition<{
1575
+ workspace_id?: string | undefined;
1576
+ include_archived?: boolean | undefined;
1577
+ days?: number | undefined;
1578
+ limit?: number | undefined;
1579
+ offset?: number | undefined;
1580
+ }> | import("./definitions/shared.js").ToolDefinition<{
1581
+ name: string;
1582
+ slug: string;
1583
+ target_url: string;
1584
+ workspace_id?: string | undefined;
1585
+ product_code?: string | undefined;
1586
+ }> | import("./definitions/shared.js").ToolDefinition<{
1587
+ link_id: string;
1588
+ workspace_id?: string | undefined;
1589
+ name?: string | undefined;
1590
+ target_url?: string | undefined;
1591
+ product_code?: string | undefined;
1592
+ restore?: true | undefined;
1593
+ }> | import("./definitions/shared.js").ToolDefinition<{
1594
+ link_id: string;
1595
+ explicit_confirmation: true;
1596
+ workspace_id?: string | undefined;
1597
+ }> | import("./definitions/shared.js").ToolDefinition<{
1598
+ link_id: string;
1599
+ workspace_id?: string | undefined;
1600
+ days?: number | undefined;
1601
+ }> | import("./definitions/shared.js").ToolDefinition<{
1602
+ link_id: string;
1603
+ workspace_id?: string | undefined;
1604
+ days?: number | undefined;
1605
+ page?: number | undefined;
1606
+ page_size?: number | undefined;
1574
1607
  }> | import("./definitions/shared.js").ToolDefinition<{
1575
1608
  platform_id: string;
1576
1609
  type: "DIALOGUE_ANALYSIS";
@@ -12,6 +12,7 @@ import { broadcastMailingVariantTools } from './definitions/broadcast-mailing-va
12
12
  import { getcourseColdWelcomeTools } from './definitions/getcourse-cold-welcome.js';
13
13
  import { followUpTools } from './definitions/follow-up.js';
14
14
  import { dialogueAuditTools } from './definitions/dialogue-audit.js';
15
+ import { linkTrackingTools } from './definitions/link-tracking.js';
15
16
  import { scheduledTaskTools } from './definitions/scheduled-tasks.js';
16
17
  export const toolDefinitions = [
17
18
  ...agentDesignTools,
@@ -30,5 +31,6 @@ export const toolDefinitions = [
30
31
  ...getcourseColdWelcomeTools,
31
32
  ...broadcastLaunchTools,
32
33
  ...dialogueAuditTools,
34
+ ...linkTrackingTools,
33
35
  ];
34
36
  //# sourceMappingURL=definitions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../src/tools/definitions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AACjF,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EACL,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,4BAA4B,EAAE,MAAM,6CAA6C,CAAC;AAC3F,OAAO,EAAE,yBAAyB,EAAE,MAAM,yCAAyC,CAAC;AACpF,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAEtE,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,GAAG,gBAAgB;IACnB,GAAG,kBAAkB;IACrB,GAAG,cAAc;IACjB,GAAG,gBAAgB;IACnB,GAAG,eAAe;IAClB,GAAG,YAAY;IACf,GAAG,oBAAoB;IACvB,GAAG,uBAAuB;IAC1B,GAAG,mBAAmB;IACtB,GAAG,uBAAuB;IAC1B,GAAG,aAAa;IAChB,GAAG,kBAAkB;IACrB,GAAG,4BAA4B;IAC/B,GAAG,yBAAyB;IAC5B,GAAG,oBAAoB;IACvB,GAAG,kBAAkB;CACtB,CAAC"}
1
+ {"version":3,"file":"definitions.js","sourceRoot":"","sources":["../../src/tools/definitions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AACjF,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EACL,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,4BAA4B,EAAE,MAAM,6CAA6C,CAAC;AAC3F,OAAO,EAAE,yBAAyB,EAAE,MAAM,yCAAyC,CAAC;AACpF,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAEtE,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,GAAG,gBAAgB;IACnB,GAAG,kBAAkB;IACrB,GAAG,cAAc;IACjB,GAAG,gBAAgB;IACnB,GAAG,eAAe;IAClB,GAAG,YAAY;IACf,GAAG,oBAAoB;IACvB,GAAG,uBAAuB;IAC1B,GAAG,mBAAmB;IACtB,GAAG,uBAAuB;IAC1B,GAAG,aAAa;IAChB,GAAG,kBAAkB;IACrB,GAAG,4BAA4B;IAC/B,GAAG,yBAAyB;IAC5B,GAAG,oBAAoB;IACvB,GAAG,kBAAkB;IACrB,GAAG,iBAAiB;CACrB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@besales/mcp",
3
- "version": "0.38.0",
3
+ "version": "0.39.0",
4
4
  "description": "Model Context Protocol server for Animaly / Besales",
5
5
  "license": "MIT",
6
6
  "homepage": "https://github.com/be-sales/mcp#readme",