MCP Blacklist¶
Введение¶
Сервис управления блэклистом каналов FraudScore предоставляет единый интерфейс, который можно использовать двумя способами:
- как MCP-сервер — подключив его к любому LLM-клиенту с поддержкой Model Context Protocol (Claude Desktop, Cursor и др.);
- как обычный JSON-RPC 2.0 API — отправляя запросы напрямую из вашего кода, без участия LLM.
Это один и тот же протокол и один и тот же набор инструментов: MCP-транспорт построен поверх JSON-RPC 2.0, поэтому любой запрос, который отправляет MCP-клиент, вы можете воспроизвести обычным HTTP-вызовом POST /mcp.
Обратите внимание: имена инструментов, их описания и все тексты, возвращаемые API (сообщения об успехе и ошибки), всегда возвращаются на английском языке — независимо от языка документации. Это сделано для однозначной интерпретации как LLM, так и интеграциями.
Основная информация¶
| Параметр | Значение |
|---|---|
| Базовый URL | https://mcp.fraudscore.ru |
| Endpoint API | POST /mcp |
| Проверка доступности | GET /healthz — возвращает {"status":"ok"} |
| Протокол | JSON-RPC 2.0 (Streamable HTTP, без сессий) |
| Формат ответа | application/json (одиночный JSON-ответ, без стриминга) |
| Максимальный размер запроса | 256 КБ |
Сервис не поддерживает сессии: каждый HTTP-запрос обрабатывается независимо. Вам не нужно хранить идентификатор сессии, выполнять рукопожатие или повторно инициализировать соединение — достаточно отправлять отдельные JSON-RPC-запросы.
Аутентификация¶
Все запросы к POST /mcp требуют токен API в заголовке Authorization:
Требования к токену:
- префикс
mcp_; - далее от 8 до 128 символов: латинские буквы, цифры,
_,-и..
Токен определяет аккаунт и перечень каналов, доступных для управления. Попытка обратиться к каналу, не привязанному к вашему аккаунту, будет отклонена. Список доступных каналов можно получить инструментом list_channels.
Токен — это секрет. Передавайте его только по HTTPS и не публикуйте в открытых источниках.
Инструменты (tools)¶
Сервис предоставляет три инструмента. Описания инструментов (то, что видит LLM в tools/list) и их имена — на английском языке. Для инструментов чтения и записи объявлены стандартные аннотации MCP (readOnlyHint, destructiveHint, idempotentHint) — MCP-клиенты могут использовать их для подтверждения опасных действий.
list_channels¶
Возвращает список идентификаторов каналов, доступных вашему аккаунту. Параметров не имеет.
Результат: {"channels": ["my_channel_1", "my_channel_2"]} — только идентификаторы, без дополнительной информации о каналах.
Типичный порядок работы: сначала list_channels для получения доступных ID, затем get_install_filter / update_install_filter для чтения и изменения.
get_install_filter¶
Получает текущие настройки блэклиста канала.
Параметры:
| Поле | Тип | Обязателен | Описание |
|---|---|---|---|
channelId |
string | number | да | Идентификатор канала |
Формат channelId: строка от 1 до 200 символов, допускаются латинские буквы, цифры, _ и -. Числовые идентификаторы также принимаются.
Результат: объект install_filter с текущей конфигурацией фильтра канала (см. формат ниже).
update_install_filter¶
Обновляет настройки блэклиста канала.
Параметры:
| Поле | Тип | Обязателен | Описание |
|---|---|---|---|
channelId |
string | number | да | Идентификатор канала |
install_filter |
object | да | Новая конфигурация фильтра |
Важно: операция заменяет конфигурацию фильтра целиком — переданные списки не объединяются с существующими. Чтобы сохранить текущие значения, сначала получите их через get_install_filter, внесите изменения и отправьте полный объект.
Результат: подтверждение успешного обновления и применённая конфигурация фильтра.
Формат install_filter¶
| Поле | Тип | Обязателен | Описание |
|---|---|---|---|
type |
string | да | Всегда "block" — другое значение не допускается |
affiliate |
string[] | нет | Список идентификаторов аффилиатов, к которым применяется фильтр |
offer |
string[] | нет | Список идентификаторов офферов, к которым применяется фильтр |
Ограничения списков affiliate и offer:
- максимум 100 элементов в каждом списке;
- каждый элемент — строка от 1 до 648 символов (пробелы по краям обрезаются);
- отсутствие поля в запросе или передача пустого массива [] очищает список;
- все поля, кроме перечисленных выше, запрещены — объект валидируется строго, лишние поля приводят к ошибке.
Поле type обязательно в каждом запросе на обновление, включая те случаи, когда вы меняете только списки.
Прямой API¶
Любой инструмент вызывается методом JSON-RPC tools/call. Для получения списка доступных инструментов используйте tools/list.
Заголовки запроса¶
POST https://mcp.fraudscore.ru/mcp
Authorization: Bearer mcp_XXXXXXXXXXXXXXXX
Content-Type: application/json
Accept: application/json, text/event-stream
Получение списка инструментов¶
Вызов list_channels¶
{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "list_channels",
"arguments": {}
}
}
Пример ответа:
{
"jsonrpc": "2.0",
"id": 2,
"result": {
"content": [
{
"type": "text",
"text": "{\"channels\":[\"my_channel_1\",\"my_channel_2\"]}"
}
],
"isError": false
}
}
Вызов get_install_filter¶
{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
"name": "get_install_filter",
"arguments": {
"channelId": "my_channel_1"
}
}
}
Пример ответа:
{
"jsonrpc": "2.0",
"id": 3,
"result": {
"content": [
{
"type": "text",
"text": "{\"install_filter\":{\"type\":\"block\",\"affiliate\":[\"affiliate_1\"]}}"
}
],
"isError": false
}
}
Полезная нагрузка инструмента всегда возвращается в result.content[0].text в виде компактной JSON-строки (без пробелов и переносов) — распарсите её на своей стороне (например, JSON.parse в JavaScript).
Вызов update_install_filter¶
{
"jsonrpc": "2.0",
"id": 4,
"method": "tools/call",
"params": {
"name": "update_install_filter",
"arguments": {
"channelId": "my_channel_1",
"install_filter": {
"type": "block",
"affiliate": ["affiliate_1", "affiliate_2"],
"offer": ["offer_1"]
}
}
}
}
Пример успешного ответа:
{
"jsonrpc": "2.0",
"id": 4,
"result": {
"content": [
{
"type": "text",
"text": "{\"success\":true,\"message\":\"Filter updated successfully\",\"install_filter\":{\"type\":\"block\",\"affiliate\":[\"affiliate_1\",\"affiliate_2\"],\"offer\":[\"offer_1\"]}}"
}
],
"isError": false
}
}
Пример на JavaScript (без SDK)¶
const response = await fetch('https://mcp.fraudscore.ru/mcp', {
method: 'POST',
headers: {
'Authorization': 'Bearer mcp_XXXXXXXXXXXXXXXX',
'Content-Type': 'application/json',
'Accept': 'application/json, text/event-stream'
},
body: JSON.stringify({
jsonrpc: '2.0',
id: 1,
method: 'tools/call',
params: {
name: 'get_install_filter',
arguments: { channelId: 'my_channel_1' }
}
})
})
const rpc = await response.json()
const payload = JSON.parse(rpc.result.content[0].text)
console.log(payload.install_filter)
MCP-сервер¶
Подключите сервис к вашему MCP-клиенту. Пример конфигурации:
{
"mcpServers": {
"fraudscore": {
"type": "http",
"url": "https://mcp.fraudscore.ru/mcp",
"headers": {
"Authorization": "Bearer mcp_XXXXXXXXXXXXXXXX"
}
}
}
}
После подключения вы сможете давать модели инструкции на естественном языке, например:
- «Покажи доступные каналы»;
- «Покажи текущий блэклист канала my_channel_1»;
- «Добавь аффилиата affiliate_3 в блэклист канала my_channel_1» — при таком запросе модель сама выполнит цепочку:
list_channels→get_install_filter→update_install_filterс полным объектом.
Клиент и сервер обмениваются теми же JSON-RPC-сообщениями, что и при прямых вызовах, — просто за их формирование отвечает MCP-клиент и LLM. Общаться с моделью можно на любом языке; на английском возвращаются только служебные тексты API (описания инструментов, сообщения об успехе и ошибках).
Обработка ошибок¶
Ошибки возвращаются на двух уровнях. Все тексты ошибок API — на английском языке.
HTTP-уровень¶
| Код | Тело ответа | Причина | Что делать |
|---|---|---|---|
401 |
{"error": "Unauthorized. Valid mcp_* token required"} |
Токен отсутствует или имеет неверный формат | Проверьте заголовок Authorization и формат токена mcp_* |
403 |
{"error": "Forbidden or account not found"} |
Токен не найден или аккаунт недоступен | Уточните токен у поддержки |
502 |
{"error": "Authorization service unavailable"} |
Временная недоступность сервиса авторизации | Повторите запрос позже |
Уровень инструмента¶
Если HTTP-запрос прошёл, но сам инструмент не смог выполнить операцию, ответ приходит с isError: true и текстовым описанием ошибки на английском.
Пример — отсутствие доступа к каналу:
{
"jsonrpc": "2.0",
"id": 5,
"result": {
"content": [
{
"type": "text",
"text": "Access to channel my_channel_2 denied"
}
],
"isError": true
}
}
Пример — ошибка валидации фильтра (в ответе указывается конкретная причина):
{
"jsonrpc": "2.0",
"id": 6,
"result": {
"content": [
{
"type": "text",
"text": "Invalid install_filter: \"type\" must be strictly \"block\""
}
],
"isError": true
}
}
Типичные причины и форматы сообщений:
- нет доступа к каналу — канал не привязан к аккаунту вашего токена:
Access to channel ... denied; - ошибка валидации
install_filter— лишние поля, неверныйtype, слишком длинные значения и т.д.:Invalid install_filter: <конкретная причина>; - внутренний сбой — нейтральное сообщение без раскрытия деталей:
Failed to retrieve filterпри чтении,Failed to update filterпри записи.
Такой формат сообщений позволяет интеграции (и LLM) сразу понять причину ошибки и исправить запрос, не раскрывая внутренние детали работы сервиса.
Ограничения и примечания¶
- Один запрос — одна операция: сервис не хранит состояние между запросами.
- Операция обновления заменяет конфигурацию фильтра целиком: чтобы сохранить текущие списки, сначала получите их через
get_install_filter, внесите изменения и отправьте полный объект. - Повторная отправка одного и того же запроса на обновление безопасна: она приводит фильтр к одному и тому же состоянию.
- Все запросы и ответы используют кодировку UTF-8.
7 окт 2026 г.