@retensy/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
@@ -282,6 +282,7 @@ MCP-сервер (+ скилл для Claude Code) для **сборки и пу
282
282
  | `bot_channel_list(botId)` / `bot_channel_add(botId, token, name?)` / `bot_channel_delete(botId, channelId, confirm:true)` | дополнительные Telegram-боты (мультиканальность); каналы/группы для постинга — `list_channels` |
283
283
  | `link_create(botId, name?, targetNodeId?)` / `link_delete(linkId, confirm:true)` | стартовая ссылка (диплинк на узел) / удаление; список — `list_links` |
284
284
  | `utm_sources(botId)` / `ab_results(graphId, branchNodeId, period?)` | UTM-источники подписчиков / итоги A/B-развилки (`period`: `24h`, `7d`, `30d`) |
285
+ | `source_revenue(botId, from, to)` | Отчёт источник -> подписчики/покупатели/выручка (RUB + Stars)/конверсия, даты YYYY-MM-DD |
285
286
  | `kb_delete(kbId, confirm:true)` | удалить базу знаний целиком (база агента — только вместе с агентом) |
286
287
  | `agent_unpublish(agentId)` / `agent_delete(agentId, confirm:true)` | снять агента с публикации / удалить (409 `AGENT_IN_USE`, пока подключён к сценариям) |
287
288
  | `site_leads_mark_read(siteId)` / `site_lead_delete(siteId, leadId, confirm:true)` / `site_leads_export(siteId, savePath?)` | заявки сайта: всё прочитано / удалить заявку / CSV |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@retensy/mcp",
3
- "version": "0.38.0",
3
+ "version": "0.39.0",
4
4
  "description": "MCP server to build and publish Telegram and MAX bot funnels/automations, broadcasts, service integrations, block-based websites (incl. free-layout Zero blocks, designs, templates, custom domains, form leads) and Markdown blog articles in the Retensy Bots service. Zero dependencies.",
5
5
  "type": "module",
6
6
  "bin": {
package/src/index.mjs CHANGED
@@ -1189,6 +1189,7 @@ const TOOLS = [
1189
1189
  { name: "link_create", description: "Создать стартовую ссылку бота (POST /api/bots/{botId}/links {name, targetNodeId?}): code для t.me/<бот>?start=<code>, счётчик стартов. targetNodeId — узел сценария, на который ведёт диплинк; для одного узла повторный вызов вернёт существующую ссылку. targetGraphId — дополнительный сценарий этого бота (publish_graph secondary:true), в котором стартует подписчик (targetNodeId тогда — узел в нём); не опубликован как дополнительный — ведёт в основной; чужой граф — HTTP 400.", inputSchema: { type: "object", properties: { botId: { type: "string" }, name: { type: "string" }, targetNodeId: { type: "string" }, targetGraphId: { type: "string" } }, required: ["botId"] } },
1190
1190
  { name: "link_delete", description: "Удалить стартовую ссылку (DELETE /api/bots/links/{linkId}); id — из list_links. Разосланные ссылки перестанут считаться. Только по явной просьбе, с confirm:true.", inputSchema: { type: "object", properties: { linkId: { type: "string" }, confirm: { type: "boolean" } }, required: ["linkId", "confirm"] } },
1191
1191
  { name: "utm_sources", description: "UTM-источники подписчиков бота (GET /api/bots/{botId}/utm-sources): по каким меткам utm_* люди входили в сценарии и сколько их. Read-only.", inputSchema: { type: "object", properties: { botId: { type: "string" } }, required: ["botId"] } },
1192
+ { name: "source_revenue", description: "Отчёт источник -> выручка по боту (GET /api/bots/{botId}/analytics/source-revenue): по каждому источнику (UTM или стартовая ссылка) подписчики периода, покупатели, выручка (RUB копейки revenueKop + Stars revenueStars), конверсия. Когорта: подписчики за from..to и все их оплаты. Даты YYYY-MM-DD, окно до 92 дней. Read-only.", inputSchema: { type: "object", properties: { botId: { type: "string" }, from: { type: "string", description: "YYYY-MM-DD" }, to: { type: "string", description: "YYYY-MM-DD" } }, required: ["botId", "from", "to"] } },
1192
1193
  { name: "ab_results", description: "Результаты A/B-теста (GET /api/bots/graphs/{graphId}/ab-results?branchNodeId&period): статистика по вариантам узла-развилки. branchNodeId — id узла A/B в графе; period — «24h», «7d», «30d» (по умолчанию 7d). Read-only.", inputSchema: { type: "object", properties: { graphId: { type: "string" }, branchNodeId: { type: "string" }, period: { type: "string" } }, required: ["graphId", "branchNodeId"] } },
1193
1194
  { name: "kb_delete", description: "УДАЛИТЬ базу знаний целиком со всеми документами (DELETE /api/bots/kb/{kbId}). База ИИ-агента так не удаляется (ошибка KB_OWNED_BY_AGENT) — удаляй агента. Необратимо: только по явной просьбе, с confirm:true.", inputSchema: { type: "object", properties: { kbId: { type: "string" }, confirm: { type: "boolean" } }, required: ["kbId", "confirm"] } },
1194
1195
  { name: "agent_unpublish", description: "Снять ИИ-агента с публикации (POST /api/bots/agents/{agentId}/unpublish): агент возвращается в черновик и перестаёт отвечать. В ответе — agent и сценарии, которые сейчас на нём работают (их стоит проверить).", inputSchema: { type: "object", properties: { agentId: { type: "string" } }, required: ["agentId"] } },
@@ -1857,6 +1858,10 @@ async function handleCall(params) {
1857
1858
  await api(`/api/bots/links/${linkId}`, { method: "DELETE" });
1858
1859
  return okResult(`🗑️ Ссылка ${linkId} удалена.`);
1859
1860
  }
1861
+ case "source_revenue": {
1862
+ const d = (v, n) => { if (typeof v !== "string" || !/^\d{4}-\d{2}-\d{2}$/.test(v)) throw new Error(`${n}: нужна дата YYYY-MM-DD`); return v; };
1863
+ return okResult(await api(`/api/bots/${uuidArg(a.botId, "botId")}/analytics/source-revenue?from=${d(a.from, "from")}&to=${d(a.to, "to")}`));
1864
+ }
1860
1865
  case "utm_sources": return okResult(await api(`/api/bots/${uuidArg(a.botId, "botId")}/utm-sources`));
1861
1866
  case "ab_results": {
1862
1867
  const q = { branchNodeId: uuidArg(a.branchNodeId, "branchNodeId") };