AnySkills

AnySkills online school: build courses, lessons and tests, publish, track student progress.

Should I use this

Quality & Safety

B
Description quality
73%
Schema completeness
64%
Naming quality
98%
Poisoning risk
60%
Permission match
100%
Protocol compliance
100%

Findings (26)

  • HIGHTool poisoning patterns detected
  • MEDIUMTool description contains URL to non-standard domainin create_short_link
  • MEDIUMTool description contains URL to non-standard domainin update_short_link
  • LOWTool 'get_school_summary' description lacks action verbin get_school_summary
  • LOWTool 'publish_course' description lacks action verbin publish_course
  • LOWTool 'list_cohorts' description lacks action verbin list_cohorts
  • LOWTool 'cohort_progress' description lacks action verbin cohort_progress
  • LOWTool 'stuck_students' description lacks action verbin stuck_students
  • LOWTool 'review_queue' description lacks action verbin review_queue
  • LOWTool 'question_stats' description lacks action verbin question_stats

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~11,510Tokens (tool definitions)
~874 BTypical response size
Significant attention impact (8.99% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "anyskills": {
      "url": "https://mcp.anyskills.ru/"
    }
  }
}

Remote endpoints

https://mcp.anyskills.ru/streamable-http

What it can do

Tool inventory

Tools (45)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢get_school_summary

Название школы, тариф, сколько курсов и из них опубликовано, сколько учеников и потоков, и что можно этому ключу. ИИ вызывает это первым при подключении и представляется человеку по-человечески: не списком инструментов, а тремя делами, ради которых школа его подключила, и одним примером вопроса. Цифры настоящие, из этого же ключа.

Input Schema

{
  "type": "object",
  "properties": {},
  "required": []
}
🟢list_courses

Все курсы школы, включая черновики: название, опубликован ли, сколько модулей и уроков. Звать первым, чтобы узнать номера курсов для остальных запросов. Черновик отличается от опубликованного полем `is_published`; ученики видят только опубликованные.

Input Schema

{
  "type": "object",
  "properties": {},
  "required": []
}
🟡create_course(title, description, access_mode)

Заводит курс-черновик: ученикам он не виден, пока не опубликован через `publish_course`. Черновиков можно держать сколько угодно на любом тарифе. Режим доступа: `open` — всё открыто сразу, `cohort` — по расписанию потока, `sequence` — по прогрессу ученика. Автор курса — хозяин ключа. Повтор с тем же Idempotency-Key вернёт тот же курс, а не создаст второй.

Input Schema

{
  "type": "object",
  "properties": {
    "title": {
      "type": "string",
      "maxLength": 200,
      "minLength": 1,
      "title": "Title"
    },
    "description": {
      "type": "string",
      "title": "Description",
      "default": ""
    },
    "access_mode": {
      "type": "string",
      "enum": [
        "open",
        "cohort",
        "sequence"
      ],
      "title": "Access Mode",
      "default": "open"
    }
  },
  "required": [
    "title"
  ]
}

Output Schema

{
  "type": "object",
  "additionalProperties": true
}
🟢get_course(course_id)

Один курс целиком: модули по порядку, в каждом — уроки по порядку с типом (`lecture`, `practice`, `webinar`, `test`, `survey`), длительностью и признаком обязательности. Итоговый тест модуля, если есть, назван по номеру — его вопросы отдаёт `get_test`. Текст уроков сюда не входит: за ним `get_lesson`.

Input Schema

{
  "type": "object",
  "properties": {
    "course_id": {
      "type": "integer",
      "title": "Course Id"
    }
  },
  "required": [
    "course_id"
  ]
}
🟢get_lesson(lesson_id)

Документ урока в формате TipTap/ProseMirror (`document_format: "v2"`): `{"type": "doc", "content": [узлы]}`. Узлы: `paragraph`, `heading` (`attrs.level` 2–4), `bulletList`/`orderedList`/`taskList` из `listItem`/`taskItem`, `blockquote`, `codeBlock` (`attrs.language`), `table`, `image` (`attrs.attachmentId`), `video` (`attrs.provider`, `attrs.videoId`), `file`, `test` (`attrs.testId`), `assignment`, `survey`, `callout` (`attrs.style`), `details` (спойлер), `columns`, `section`, `horizontalRule`. Текст — узлы `text` с `marks` (`bold`, `italic`, `link` …). Ответ годится как образец для `create_lesson`. Урок, ещё не открытый в редакторе, отдаётся тоже в этом формате.

Input Schema

{
  "type": "object",
  "properties": {
    "lesson_id": {
      "type": "integer",
      "title": "Lesson Id"
    }
  },
  "required": [
    "lesson_id"
  ]
}
🔴update_lesson(lesson_id, title, document, updated_at)

Меняет название и/или документ урока. Прежний документ уходит в историю версий урока (вернуть — в кабинете). При замене документа ОБЯЗАТЕЛЬНО передать `updated_at` из `get_lesson`: если урок с тех пор менялся — отказ 409, а не затирание. Сначала `get_lesson`, потом правка.

Input Schema

{
  "type": "object",
  "properties": {
    "lesson_id": {
      "type": "integer",
      "title": "Lesson Id"
    },
    "title": {
      "anyOf": [
        {
          "type": "string",
          "maxLength": 200,
          "minLength": 1
        },
        {
          "type": "null"
        }
      ],
      "title": "Title"
    },
    "document": {
      "anyOf": [
        {
          "additionalProperties": true,
          "type": "object"
        },
        {
          "type": "null"
        }
      ],
      "title": "Document"
    },
    "updated_at": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Updated At"
    }
  },
  "required": [
    "lesson_id"
  ]
}
🟢get_test(test_id)

Тест целиком: порог зачёта, число попыток и вопросы по порядку. У каждого вопроса тип (`one`, `many`, `text`, `number`, `open`), варианты с отметкой верного либо верный текст. Верные ответы отдаются, потому что ключ принадлежит сотруднику школы, а не ученику. Владельцу и методисту — любой тест школы; остальным — только тест, стоящий в их курсах.

Input Schema

{
  "type": "object",
  "properties": {
    "test_id": {
      "type": "integer",
      "title": "Test Id"
    }
  },
  "required": [
    "test_id"
  ]
}
🟡create_module(course_id, title)

Модуль встаёт в конец курса. Уроки добавляются в модуль отдельно, `create_lesson`. Порядок модулей потом можно поменять в кабинете.

Input Schema

{
  "type": "object",
  "properties": {
    "course_id": {
      "type": "integer",
      "title": "Course Id"
    },
    "title": {
      "type": "string",
      "maxLength": 200,
      "minLength": 1,
      "title": "Title"
    }
  },
  "required": [
    "course_id",
    "title"
  ]
}

Output Schema

{
  "type": "object",
  "additionalProperties": true
}
🟡create_lesson(module_id, title, kind, duration_minutes, is_required, ...)

Урок встаёт в конец модуля. `document` — в формате TipTap (`{"type": "doc", "content": [{"type": "heading", "attrs": {"level": 2}, "content": [{"type": "text", "text": "..."}]}, {"type": "paragraph", "content": [...]}]}`); узлы перечислены у `get_lesson`, образец отдаёт он же. Старый формат Editor.js (`{"blocks": [...]}`) тоже принимается и переводится. Видео — провайдер и идентификатор, не iframe. Неизвестное выбрасывается.

Input Schema

{
  "type": "object",
  "properties": {
    "module_id": {
      "type": "integer",
      "title": "Module Id"
    },
    "title": {
      "type": "string",
      "maxLength": 200,
      "minLength": 1,
      "title": "Title"
    },
    "kind": {
      "type": "string",
      "enum": [
        "lecture",
        "practice",
        "webinar",
        "test",
        "survey"
      ],
      "title": "Kind",
      "default": "lecture"
    },
    "duration_minutes": {
      "anyOf": [
        {
          "type": "integer",
          "maximum": 600,
          "minimum": 0
        },
        {
          "type": "null"
        }
      ],
      "title": "Duration Minutes"
    },
    "is_required": {
      "type": "boolean",
      "title": "Is Required",
      "default": true
    },
    "document": {
      "anyOf": [
        {
          "additionalProperties": true,
          "type": "object"
        },
        {
          "type": "null"
        }
      ],
      "title": "Document"
    }
  },
  "required": [
    "module_id",
    "title"
  ]
}

Output Schema

{
  "type": "object",
  "additionalProperties": true
}
🟡create_test(title, description, pass_score, max_attempts, questions, ...)

Тест целиком за один вызов: параметры и вопросы по порядку. Типы вопросов: `one` (один из списка, ровно один верный), `many` (несколько верных), `text` и `number` (верный ответ в `correct_text`), `open` (ответ своими словами; `reference_answer` и `criteria` помогают проверке). Куда положить: `lesson_id` — блоком в конец урока, `module_id` — итоговым тестом модуля; можно и то и другое, можно ничего.

Input Schema

{
  "type": "object",
  "properties": {
    "title": {
      "type": "string",
      "maxLength": 200,
      "minLength": 1,
      "title": "Title"
    },
    "description": {
      "type": "string",
      "title": "Description",
      "default": ""
    },
    "pass_score": {
      "type": "integer",
      "maximum": 100,
      "minimum": 0,
      "title": "Pass Score",
      "default": 70
    },
    "max_attempts": {
      "type": "integer",
      "maximum": 100,
      "minimum": 0,
      "title": "Max Attempts",
      "default": 0
    },
    "questions": {
      "items": {
        "properties": {
          "text": {
            "type": "string",
            "minLength": 1,
            "title": "Text"
          },
          "kind": {
            "type": "string",
            "enum": [
              "one",
              "many",
              "text",
              "number",
              "open"
            ],
            "title": "Kind",
            "default": "one"
          },
          "weight": {
            "type": "integer",
            "maximum": 100,
            "minimum": 1,
            "title": "Weight",
            "default": 1
          },
          "options": {
            "items": {
              "properties": {
                "text": {
                  "type": "string",
                  "maxLength": 300,
                  "minLength": 1,
                  "title": "Text"
                },
                "is_correct": {
                  "type": "boolean",
                  "title": "Is Correct",
                  "default": false
                }
              },
              "type": "object",
              "required": [
                "text"
              ],
              "title": "OptionIn"
            },
            "type": "array",
            "title": "Options",
            "default": []
          },
          "correct_text": {
            "type": "string",
            "title": "Correct Text",
            "default": ""
          },
          "reference_answer": {
            "type": "string",
            "title": "Reference Answer",
            "default": ""
          },
          "criteria": {
            "type": "string",
            "title": "Criteria",
            "default": ""
          }
        },
        "type": "object",
        "required": [
          "text"
        ],
        "title": "QuestionIn"
      },
      "type": "array",
      "minItems": 1,
      "title": "Questions"
    },
    "lesson_id": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "title": "Lesson Id"
    },
    "module_id": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "title": "Module Id"
    }
  },
  "required": [
    "title",
    "questions"
  ]
}
🟡publish_course(course_id, published)

Открывает курс ученикам или возвращает в черновики. Публикация идёт через лимит тарифа — ту же проверку, что кнопка в кабинете: считаются только опубликованные курсы, черновики нет. Если лимит исчерпан — 409 с текстом, что делать. Снять с публикации можно всегда.

Input Schema

{
  "type": "object",
  "properties": {
    "course_id": {
      "type": "integer",
      "title": "Course Id"
    },
    "published": {
      "type": "boolean",
      "title": "Published",
      "default": true
    }
  },
  "required": [
    "course_id"
  ]
}
🟢list_cohorts

Потоки: курс, даты старта и окончания, сколько записано. Поток — группа учеников с общим расписанием; прогресс по нему — `cohort_progress`. Ученики вне потоков (запись без потока) сюда не попадают — их ищет `stuck_students` без `cohort_id`.

Input Schema

{
  "type": "object",
  "properties": {},
  "required": []
}
🟢cohort_progress(cohort_id)

По каждому ученику потока: процент курса (считается по обязательным опубликованным урокам, как в кабинете), когда последний раз заходил или проходил урок, сколько дней с тех пор. Плюс доходимость потока — доля тех, кто дошёл до 100 %. Имена — только по ступени 3 (см. описание сервера), иначе «Ученик 14».

Input Schema

{
  "type": "object",
  "properties": {
    "cohort_id": {
      "type": "integer",
      "title": "Cohort Id"
    }
  },
  "required": [
    "cohort_id"
  ]
}
🟢stuck_students(days, cohort_id)

Ученики, которые не дошли до конца и ничего не делали дольше `days` дней (ни входа, ни пройденного урока). Это адрес для куратора, а не оценка ученика. `cohort_id` сужает до одного потока; без него — вся школа, включая записи без потока. Черновики курсов не считаются.

Input Schema

{
  "type": "object",
  "properties": {
    "days": {
      "type": "integer",
      "title": "Days",
      "default": 7
    },
    "cohort_id": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "title": "Cohort Id"
    }
  },
  "required": []
}
🟢review_queue

Работы, которые ждут куратора: кто сдал, по какому заданию, когда и сколько часов ждёт. Отсортировано от самых старых. Принять или вернуть работу через API нельзя — только посмотреть очередь.

Input Schema

{
  "type": "object",
  "properties": {},
  "required": []
}
🟢question_stats(test_id)

По каждому вопросу теста: сколько ответов и какая доля верных по завершённым попыткам. Считаются ВСЕ попытки, а не последняя: вопрос, на котором спотыкаются с первого раза, виден только так. Ниже 50 % верных — вопрос стоит перечитать: он либо трудный, либо сформулирован неясно.

Input Schema

{
  "type": "object",
  "properties": {
    "test_id": {
      "type": "integer",
      "title": "Test Id"
    }
  },
  "required": [
    "test_id"
  ]
}
🟢list_sales_stages

Этапы воронки продаж школы по порядку: номер, название и смысл (open — в работе, won — успех, lost — отказ). Нужны, чтобы перевести сделку или отобрать сделки на одном этапе.

Input Schema

{
  "type": "object",
  "properties": {},
  "required": []
}
🟡create_sales_stage(name, color, after_stage_id)

Новый этап «в работе» в воронке продаж: сразу после after_stage_id, а без него перед «Оплачено» и «Отказом». Цвет: secondary, azure, blue, purple, yellow, orange, green, red. Людям это ничего не шлёт. Удалить этап может только человек в кабинете.

Input Schema

{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "title": "Name"
    },
    "color": {
      "type": "string",
      "title": "Color",
      "default": "secondary"
    },
    "after_stage_id": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "title": "After Stage Id"
    }
  },
  "required": [
    "name"
  ]
}
🟢list_deals(stage_id, open_only, limit, updated_since, tag)

Сделки школы, новые сверху: этап, курс, сумма, метки, откуда пришёл человек. Например, «какие сделки ждут оплаты»: отбор по этапу, «кто молчит»: по метке (`tag`, имя метки или её прежнее имя). Люди без имён, если у ключа нет области «имена» или школа не разрешила ИИ персональные данные. Не больше 200 за раз.

Input Schema

{
  "type": "object",
  "properties": {
    "stage_id": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "title": "Stage Id"
    },
    "open_only": {
      "type": "boolean",
      "title": "Open Only",
      "default": true
    },
    "limit": {
      "type": "integer",
      "title": "Limit",
      "default": 50
    },
    "updated_since": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ],
      "title": "Updated Since"
    },
    "tag": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Tag"
    }
  },
  "required": []
}
🟢get_deal(deal_id)

Одна сделка: поля, человек и последние 30 событий ленты (заметки менеджеров, переводы, открытие доступа, оплаты). Помогает ответить, что с человеком происходит и о чём с ним договорились.

Input Schema

{
  "type": "object",
  "properties": {
    "deal_id": {
      "type": "integer",
      "title": "Deal Id"
    }
  },
  "required": [
    "deal_id"
  ]
}
🟡create_lead(name, email, phone, telegram, comment, ...)

Завести заявку: человек и сделка одним запросом. Нужна почта, телефон или Telegram. Человек, который уже есть, не заводится второй раз; повторная заявка про то же ложится заметкой в открытую сделку. Заголовок `Idempotency-Key` защищает от двойной отправки.

Input Schema

{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "title": "Name",
      "default": ""
    },
    "email": {
      "type": "string",
      "title": "Email",
      "default": ""
    },
    "phone": {
      "type": "string",
      "title": "Phone",
      "default": ""
    },
    "telegram": {
      "type": "string",
      "title": "Telegram",
      "default": ""
    },
    "comment": {
      "type": "string",
      "title": "Comment",
      "default": ""
    },
    "course_id": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "title": "Course Id"
    },
    "utm_source": {
      "type": "string",
      "title": "Utm Source",
      "default": ""
    },
    "utm_medium": {
      "type": "string",
      "title": "Utm Medium",
      "default": ""
    },
    "utm_campaign": {
      "type": "string",
      "title": "Utm Campaign",
      "default": ""
    },
    "utm_content": {
      "type": "string",
      "title": "Utm Content",
      "default": ""
    },
    "utm_term": {
      "type": "string",
      "title": "Utm Term",
      "default": ""
    }
  },
  "required": []
}
⚪move_deal(deal_id, stage_id, reason)

Перевести сделку на другой этап той же воронки. Для отказа можно указать причину. Перевод пишется в ленту сделки с пометкой, что его сделал ключ API сотрудника.

Input Schema

{
  "type": "object",
  "properties": {
    "deal_id": {
      "type": "integer",
      "title": "Deal Id"
    },
    "stage_id": {
      "type": "integer",
      "title": "Stage Id"
    },
    "reason": {
      "type": "string",
      "title": "Reason",
      "default": ""
    }
  },
  "required": [
    "deal_id",
    "stage_id"
  ]
}
🟡add_deal_note(deal_id, text)

Добавить заметку в ленту сделки: итог звонка, договорённость, возражение. Заметку увидят менеджеры в карточке сделки.

Input Schema

{
  "type": "object",
  "properties": {
    "deal_id": {
      "type": "integer",
      "title": "Deal Id"
    },
    "text": {
      "type": "string",
      "title": "Text"
    }
  },
  "required": [
    "deal_id",
    "text"
  ]
}
🟢list_deal_tags

Справочник меток сделок школы: имя, цвет, группа «одна из» (у сделки одна метка группы, новая снимает прежнюю), признак источника (откуда пришёл человек), прежние имена и на скольких сделках метка стоит. Нужен, чтобы поставить метку существующим именем, а не завести дубль.

Input Schema

{
  "type": "object",
  "properties": {},
  "required": []
}
🟡create_deal_tag(name, color, group, is_source)

Новая метка в справочнике сделок. group: имя группы «одна из» (у сделки одна метка группы, например «Урок»), новая группа заведётся. is_source: метка говорит, откуда пришёл человек. Имя, занятое другой меткой или её прежним именем, отказ: возьмите ту метку.

Input Schema

{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "title": "Name"
    },
    "color": {
      "type": "string",
      "title": "Color",
      "default": "secondary"
    },
    "group": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Group"
    },
    "is_source": {
      "type": "boolean",
      "title": "Is Source",
      "default": false
    }
  },
  "required": [
    "name"
  ]
}
🟡add_deal_tag(deal_id, name)

Поставить сделке метку по имени. Имя сравнивается без регистра и с прежними именами меток; такой метки нет, она заводится. Если метка в группе «одна из», прежняя метка группы снимается сама. Повторная метка ничего не меняет. Событие ложится в ленту сделки.

Input Schema

{
  "type": "object",
  "properties": {
    "deal_id": {
      "type": "integer",
      "title": "Deal Id"
    },
    "name": {
      "type": "string",
      "title": "Name"
    }
  },
  "required": [
    "deal_id",
    "name"
  ]
}
🔴remove_deal_tag(deal_id, name)

Снять со сделки метку по имени (или прежнему имени). Метка остаётся в справочнике и на других сделках. Если её на сделке не было, ответ `changed: false`.

Input Schema

{
  "type": "object",
  "properties": {
    "deal_id": {
      "type": "integer",
      "title": "Deal Id"
    },
    "name": {
      "type": "string",
      "title": "Name"
    }
  },
  "required": [
    "deal_id",
    "name"
  ]
}
🟡add_deal_task(deal_id, text, due_at)

Поставить задачу по сделке со сроком: позвонить, отправить договор. Ответственный — хозяин ключа. Срок обязателен: задача без срока не попадёт в «Сегодня» и будет забыта.

Input Schema

{
  "type": "object",
  "properties": {
    "deal_id": {
      "type": "integer",
      "title": "Deal Id"
    },
    "text": {
      "type": "string",
      "title": "Text"
    },
    "due_at": {
      "type": "string",
      "format": "date-time",
      "title": "Due At"
    }
  },
  "required": [
    "deal_id",
    "text",
    "due_at"
  ]
}
🟡update_sales_stage(stage_id, name, color, after_stage_id)

Переименовать этап, сменить цвет или переставить: after_stage_id это этап, после которого он встанет. Смысл этапа (в работе, успех, отказ) меняется только в кабинете.

Input Schema

{
  "type": "object",
  "properties": {
    "stage_id": {
      "type": "integer",
      "title": "Stage Id"
    },
    "name": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Name"
    },
    "color": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Color"
    },
    "after_stage_id": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "title": "After Stage Id"
    }
  },
  "required": [
    "stage_id"
  ]
}
🟡update_deal_tag(tag_id, name, color, group, is_source)

Переименовать метку (прежнее имя запомнится, бот и правила по нему её найдут), сменить цвет, группу (пустая строка убирает из группы) или признак источника. Удалить и склеить метки можно только в кабинете.

Input Schema

{
  "type": "object",
  "properties": {
    "tag_id": {
      "type": "integer",
      "title": "Tag Id"
    },
    "name": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Name"
    },
    "color": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Color"
    },
    "group": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Group"
    },
    "is_source": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "title": "Is Source"
    }
  },
  "required": [
    "tag_id"
  ]
}
🟢list_sales_rules

Шаги правил продаж: повод (event tag или stage, с номером метки или этапа), через сколько минут, что сделать (action: bot запустить воронку бота, tag_add, tag_remove, stage, task, goal), включён ли и почему может не сработать (problem).

Input Schema

{
  "type": "object",
  "properties": {},
  "required": []
}
🔴create_sales_rule(event, tag_id, stage_id, delay_minutes, action, ...)

Шаг правила продаж, ВСЕГДА выключенный: включает его владелец в кабинете, до этого он ничего не делает. Повод: event tag (tag_id, метка поставлена на сделку) или stage (stage_id, сделка перешла на этап). delay_minutes: через сколько. action: bot (funnel_id, запустить воронку бота), tag_add или tag_remove (target_tag_id), stage (target_stage_id, «Оплачено» нельзя), task (task_text, task_days), goal (цель Метрики). skip_if_replied: не делать, если человек ответил.

Input Schema

{
  "type": "object",
  "properties": {
    "event": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Event"
    },
    "tag_id": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "title": "Tag Id"
    },
    "stage_id": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "title": "Stage Id"
    },
    "delay_minutes": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "title": "Delay Minutes"
    },
    "action": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Action"
    },
    "funnel_id": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "title": "Funnel Id"
    },
    "target_tag_id": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "title": "Target Tag Id"
    },
    "target_stage_id": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "title": "Target Stage Id"
    },
    "lost_reason": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Lost Reason"
    },
    "task_text": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Task Text"
    },
    "task_days": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "title": "Task Days"
    },
    "goal": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Goal"
    },
    "skip_if_replied": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "title": "Skip If Replied"
    }
  },
  "required": []
}
🟡update_sales_rule(rule_id, event, tag_id, stage_id, delay_minutes, ...)

Поправить шаг правила, пока он выключен: только присланные поля. Включённый шаг работает на людях, его меняет только владелец в кабинете: ответ 409.

Input Schema

{
  "type": "object",
  "properties": {
    "rule_id": {
      "type": "integer",
      "title": "Rule Id"
    },
    "event": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Event"
    },
    "tag_id": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "title": "Tag Id"
    },
    "stage_id": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "title": "Stage Id"
    },
    "delay_minutes": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "title": "Delay Minutes"
    },
    "action": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Action"
    },
    "funnel_id": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "title": "Funnel Id"
    },
    "target_tag_id": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "title": "Target Tag Id"
    },
    "target_stage_id": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "title": "Target Stage Id"
    },
    "lost_reason": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Lost Reason"
    },
    "task_text": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Task Text"
    },
    "task_days": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "title": "Task Days"
    },
    "goal": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Goal"
    },
    "skip_if_replied": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "title": "Skip If Replied"
    }
  },
  "required": [
    "rule_id"
  ]
}
🟢list_bots

Боты школы в Telegram: номер, название, адрес и работает ли. Номер бота нужен, чтобы читать его воронки и собирать новые.

Input Schema

{
  "type": "object",
  "properties": {},
  "required": []
}
🟢list_funnels(bot_id)

Воронки бота: состояние (draft — черновик, active — работает, paused — остановлена), есть ли неопубликованные правки и чьи.

Input Schema

{
  "type": "object",
  "properties": {
    "bot_id": {
      "type": "integer",
      "title": "Bot Id"
    }
  },
  "required": [
    "bot_id"
  ]
}
🟡create_funnel_draft(bot_id, name, graph)

Новая воронка бота черновиком. Людям ничего не уходит: опубликовать её может только человек в кабинете, ссылка в ответе (editor_url). Формат воронки: get_funnel_format. В ответе проверка (errors, warnings): исправьте ошибки правкой черновика.

Input Schema

{
  "type": "object",
  "properties": {
    "bot_id": {
      "type": "integer",
      "title": "Bot Id"
    },
    "name": {
      "type": "string",
      "title": "Name"
    },
    "graph": {
      "additionalProperties": true,
      "type": "object",
      "title": "Graph"
    }
  },
  "required": [
    "bot_id",
    "name",
    "graph"
  ]
}
🟢get_funnel_format

Формат воронки: блоки, их настройки и стрелки. Прочитать до того, как собирать или править воронку: черновик присылается целиком в этом формате.

Input Schema

{
  "type": "object",
  "properties": {},
  "required": []
}
🟢get_funnel(funnel_id)

Черновик и опубликованная версия воронки, номер версии черновика (нужен для правки) и сколько людей сейчас стоит на каждом блоке опубликованной версии. Люди считаются числом, без имён.

Input Schema

{
  "type": "object",
  "properties": {
    "funnel_id": {
      "type": "integer",
      "title": "Funnel Id"
    }
  },
  "required": [
    "funnel_id"
  ]
}
🟢check_funnel(funnel_id)

Та же проверка, что перед публикацией, но ничего не публикует. errors: не опубликуется, пока не исправить; warnings: можно, но стоит посмотреть. У каждой записи номер блока (node) и текст.

Input Schema

{
  "type": "object",
  "properties": {
    "funnel_id": {
      "type": "integer",
      "title": "Funnel Id"
    }
  },
  "required": [
    "funnel_id"
  ]
}
🔴update_funnel_draft(funnel_id, graph, draft_version, name)

Заменить черновик воронки целиком, в том числе у работающей: люди идут по опубликованной версии, пока человек не опубликует правки в кабинете (там он увидит их списком). draft_version из get_funnel: если черновик успели поменять, ответ 409, прочитайте воронку заново. В ответе задетые блоки и проверка.

Input Schema

{
  "type": "object",
  "properties": {
    "funnel_id": {
      "type": "integer",
      "title": "Funnel Id"
    },
    "graph": {
      "additionalProperties": true,
      "type": "object",
      "title": "Graph"
    },
    "draft_version": {
      "type": "integer",
      "title": "Draft Version"
    },
    "name": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Name"
    }
  },
  "required": [
    "funnel_id",
    "graph",
    "draft_version"
  ]
}
🟢list_short_links(q, platform, set_id, archived, limit, ...)

Короткие ссылки школы, новые сверху: короткий адрес, куда ведёт (адрес или бот с кодом воронки), площадка, ролик или кампания, метки и цифры за последние 30 дней в stats_30d: clicks (переходы), people (разные люди), to_bot (пришли в бота), leads (заявки), deals (сделки), payments (оплаты), revenue (рубли, строкой). Отбор: q ищет в названии, адресе, кнопке, имени бота и пути; platform: youtube, vk, rutube, telegram, direct, email, site, other; set_id: ссылки одного ролика или кампании; archived=true: архив. Например, «какая ссылка под роликами YouTube принесла больше денег»: platform=youtube, затем сравнить stats_30d.revenue. Не больше 200 за раз, дальше offset; total показывает, сколько всего.

Input Schema

{
  "type": "object",
  "properties": {
    "q": {
      "type": "string",
      "title": "Q",
      "default": ""
    },
    "platform": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Platform"
    },
    "set_id": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "title": "Set Id"
    },
    "archived": {
      "type": "boolean",
      "title": "Archived",
      "default": false
    },
    "limit": {
      "type": "integer",
      "title": "Limit",
      "default": 50
    },
    "offset": {
      "type": "integer",
      "title": "Offset",
      "default": 0
    }
  },
  "required": []
}
🟡create_short_link(url, bot_username, start_code, platform, path, ...)

Короткая ссылка на домене школы: на адрес (url) или в бота (bot_username и, если нужно, start_code: код воронки «Старта»). platform (youtube, vk, rutube, telegram, direct, email, site, other) ставит метки сама: utm_source, utm_medium, utm_campaign; свои метки (utm: source, medium, campaign, content, term) главнее. path: свой путь латиницей; без него система выберет понятный, варианты покажет suggest_link_path. button: подпись кнопки под роликом, set_id: ролик или кампания школы. Та же ссылка (тот же адрес или бот с кодом, та же площадка, кнопка и ролик) второй раз не заводится: вернётся прежняя, created=false. Например: url https://it-ontime.ru/mikrotik, platform youtube → short_url https://go.it-ontime.ru/mikrotik, метки youtube, video, mikrotik. Ошибка (путь занят, адрес не тот, нет домена) приходит ответом 400 с текстом для человека.

Input Schema

{
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "title": "Url",
      "default": ""
    },
    "bot_username": {
      "type": "string",
      "title": "Bot Username",
      "default": ""
    },
    "start_code": {
      "type": "string",
      "title": "Start Code",
      "default": ""
    },
    "platform": {
      "type": "string",
      "title": "Platform",
      "default": ""
    },
    "path": {
      "type": "string",
      "title": "Path",
      "default": ""
    },
    "title": {
      "type": "string",
      "title": "Title",
      "default": ""
    },
    "button": {
      "type": "string",
      "title": "Button",
      "default": ""
    },
    "set_id": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "title": "Set Id"
    },
    "utm": {
      "anyOf": [
        {
          "additionalProperties": {
            "type": "string"
          },
          "type": "object"
        },
        {
          "type": "null"
        }
      ],
      "title": "Utm"
    }
  },
  "required": []
}
🟢get_link_stats(link_id, since, until, days)

Что принесла одна ссылка за период. funnel: clicks (переходы), people (разные люди), to_bot (пришли в бота), leads (заявки с сайта), deals (сделки), payments (оплаты), revenue (рубли, строкой), returned (вернулись в бота, были в нём раньше), filtered (отсеяны роботы и повторы). daily: переходы по дням. paths: люди по каждому пути за 7 и 30 дней и всего, видно, идут ли ещё по старому пути. referrers: откуда переходят, devices: с чего. Период: since и until, даты ГГГГ-ММ-ДД включительно, по Москве; без них последние days дней (по умолчанию 30), days=0 значит всё время. Например, «сколько оплат дал ролик за сентябрь»: since=2026-09-01, until=2026-09-30.

Input Schema

{
  "type": "object",
  "properties": {
    "link_id": {
      "type": "integer",
      "title": "Link Id"
    },
    "since": {
      "anyOf": [
        {
          "type": "string",
          "format": "date"
        },
        {
          "type": "null"
        }
      ],
      "title": "Since"
    },
    "until": {
      "anyOf": [
        {
          "type": "string",
          "format": "date"
        },
        {
          "type": "null"
        }
      ],
      "title": "Until"
    },
    "days": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "title": "Days"
    }
  },
  "required": [
    "link_id"
  ]
}
🟢suggest_link_path(url, title, button, platform, set_id, ...)

До трёх свободных понятных путей для новой ссылки, лучшие первыми: латиница, дефисы, до 40 знаков (go.школа.ru/osi-minikurs вместо go.школа.ru/k7Pq2a). Строятся из того, что передали: адрес, куда вести (url), название ссылки (title), подпись кнопки под роликом (button), название ролика (video_title) или ролик и кампания школы (set_id), кампания (campaign), заголовок страницы (page_title), код воронки бота (code), площадка (platform). Ничего не создаёт. Выбранный путь передайте в create_short_link (path); без path он выберет первый сам. Например: video_title «Модель OSI», button «Мини-курс» → model-osi-minikurs, minikurs, model-osi.

Input Schema

{
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "title": "Url",
      "default": ""
    },
    "title": {
      "type": "string",
      "title": "Title",
      "default": ""
    },
    "button": {
      "type": "string",
      "title": "Button",
      "default": ""
    },
    "platform": {
      "type": "string",
      "title": "Platform",
      "default": ""
    },
    "set_id": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ],
      "title": "Set Id"
    },
    "video_title": {
      "type": "string",
      "title": "Video Title",
      "default": ""
    },
    "campaign": {
      "type": "string",
      "title": "Campaign",
      "default": ""
    },
    "page_title": {
      "type": "string",
      "title": "Page Title",
      "default": ""
    },
    "code": {
      "type": "string",
      "title": "Code",
      "default": ""
    }
  },
  "required": []
}
🔴update_short_link(link_id, url, title, archived)

Поменять, куда ведёт ссылка (url), её название (title) или убрать в архив (archived=true, вернуть: false). Короткий адрес не меняется: новый url сразу получат все, кто нажмёт ссылку под роликами, в письмах и в рекламе, поэтому сначала прочитайте ссылку (list_short_links) и убедитесь, что меняете ту. Ссылку в бота url переводит на адрес. Архивная ссылка продолжает вести людей, она только уходит из списка. Например: {"url": "https://it-ontime.ru/mikrotik-2026"}. Удаления нет: ссылка с переходами хранит историю.

Input Schema

{
  "type": "object",
  "properties": {
    "link_id": {
      "type": "integer",
      "title": "Link Id"
    },
    "url": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Url"
    },
    "title": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Title"
    },
    "archived": {
      "anyOf": [
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "title": "Archived"
    }
  },
  "required": [
    "link_id"
  ]
}

Recommended Prompts

retrieve_data
Get details about [item] from AnySkills
Expected tools: get_school_summary
fetch_info
Fetch [information type] using AnySkills
Expected tools: get_school_summary
list_items
List all [items] available in AnySkills
Expected tools: list_courses
browse_collection
Show me the [collection] from AnySkills
Expected tools: list_courses
explore_workflow
List available [items], then get details for each one using AnySkills
Expected tools: list_coursesget_school_summary

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded45 tools
verifiedversion not recorded45 tools
verifiedversion not recorded45 tools
verifiedversion not recorded45 tools
verifiedversion not recorded40 tools
verifiedversion not recorded16 tools