KrosAI MCP
KrosAI MCP управляет телефонными номерами и голосовыми AI-агентами через оператора связи
Что умеет
- Искать, закреплять и освобождать телефонные номера по рынкам
- Подключать и настраивать голосовые эндпоинты AI-провайдеров к номерам
- Инициировать и завершать исходящие звонки
- Получать транскрипты, записи и историю событий звонков
- Запускать SIP-диагностику и следить за статусом портирования
Какие данные видит
Доступ ограничен телефонной инфраструктурой организации пользователя в KrosAI.
Нужен ли аккаунт
Не нужен: сервер работает без входа
KrosAI — MCP-сервер телеком-инфраструктуры для голосовых AI-агентов: выделение номеров, подключение операторов, настройка голосовых эндпоинтов (ElevenLabs, Vapi, Retell) и работа с историей звонков в Нигерии, Кении, Гане, США и Великобритании. Сервер закрывает регуляторные и carrier-вопросы, чтобы агент мог реально звонить и принимать звонки.
Как подключить
Как подключить KrosAI MCP к Claude
Адрес сервера, который нужно вставить в настройках Claude:
https://krosai-mcp--trykrosweb.run.tools
- Откройте Claude (сайт claude.ai или приложение для компьютера).
- Перейдите в Настройки → Коннекторы (в английском интерфейсе: Settings → Connectors).
- Нажмите Добавить пользовательский коннектор (Add custom connector).
- Вставьте адрес сервера, скопированный ниже, в поле URL удалённого MCP-сервера и нажмите Добавить.
- В чате нажмите + → Коннекторы и включите новый коннектор.
Пользовательские коннекторы доступны на тарифах Free, Pro, Max, Team и Enterprise. На Free можно добавить только один. В Team и Enterprise коннектор сначала добавляет владелец организации в Настройки организации → Коннекторы.
Авторизация
После нажатия Добавить откроется окно входа в сервис. Войдите под своим аккаунтом и подтвердите доступ. Пароль Claude не видит.
Как подключить KrosAI MCP к ChatGPT
Адрес сервера, который нужно вставить в настройках ChatGPT:
https://krosai-mcp--trykrosweb.run.tools
- Откройте ChatGPT в браузере (chatgpt.com). Нужен тариф Plus, Pro, Business, Enterprise или Edu.
- Один раз включите режим разработчика: Настройки → Приложения → Дополнительные настройки → Режим разработчика (Settings → Apps → Advanced settings → Developer mode).
- Откройте Настройки → Коннекторы и нажмите Создать (Create).
- Заполните форму: Название (любое), Описание (одна фраза, что делает сервис), URL MCP-сервера (скопируйте ниже).
- В поле Аутентификация выберите OAuth, если сервис требует вход, иначе Нет. Нажмите Создать.
- В новом чате откройте + → Приложения/Коннекторы и включите коннектор.
Название раздела у OpenAI менялось (Connectors → Apps/Plugins). Если пункт называется иначе, ищите «режим разработчика» в настройках. В рабочих пространствах Business/Enterprise администратор должен разрешить пользовательские коннекторы.
Авторизация
При первом использовании ChatGPT откроет окно входа в сервис. Войдите и подтвердите доступ.
Как подключить KrosAI MCP к Cursor
Адрес сервера, который нужно вставить в настройках Cursor:
https://krosai-mcp--trykrosweb.run.tools
Быстрый способ: нажмите кнопку Открыть в Cursor ниже, Cursor сам предложит добавить сервер.
Вручную:
- В Cursor откройте Settings → Cursor Settings → MCP и нажмите Add new global MCP server.
- Вставьте JSON, скопированный ниже, в открывшийся файл
~/.cursor/mcp.json(для одного проекта:.cursor/mcp.jsonв корне проекта). - Сохраните файл. Сервер появится в списке MCP; при необходимости пройдите авторизацию по кнопке рядом с ним.
Авторизация
Если сервис требует вход, рядом с сервером в списке MCP появится кнопка авторизации.
Список инструментов сервера (45)
Технические названия из tools/list. Нужны только разработчикам.
| calls.list | List calls for the authenticated organisation with optional filters. Args: status: Filter by call status (``completed``, ``in_progress``, ``failed``, ``never_connected``, etc.). direction: Filter by direction — ``"inbound"`` or ``"outbound"``. limit: Maximum rows to return (1–200; default 50). cursor: Pagination cursor — pass the ``created_at`` value of the last row from the previous page to fetch the next page. include_never_connected: Include ``never_connected`` ghost-call rows (campaign calls that never reached the remote party). Defaults to ``False``. Returns: Dict with ``data`` (list of call rows), ``count``, ``has_more``, and optional ``next_cursor``. |
| calls.get | Fetch the full record for a single call. Args: call_id: Internal KrosAI call UUID. Returns: Full call row dict including transcript, recording URL, cost, and provider metadata. |
| calls.initiate | Place an outbound call to a PSTN number via an AI endpoint. The endpoint determines the AI provider (ElevenLabs, Vapi, Retell, etc.) and the routing strategy. If ``endpoint_id`` is omitted, the endpoint attached to ``from_number`` is used. Args: to_number: Destination E.164 phone number (e.g. ``"+14155552671"``). from_number: Caller-ID E.164 number owned by the organisation. endpoint_id: UUID of the AI endpoint to use for the call. Optional if ``from_number`` has a default endpoint attached. metadata: Optional key-value dict attached to the call row for downstream enrichment. Returns: Dict with ``call_id``, ``status``, and provider-specific fields. |
| calls.hangup | Terminate an active in-progress call. Sends a hangup signal to FreeSWITCH for the underlying channel. Has no effect if the call has already ended. Args: call_id: Internal KrosAI call UUID. Returns: Dict with ``ok`` flag and ``call_id``. |
| calls.events | Fetch the lifecycle event log for a call. Events include ``call.initiated``, ``call.answered``, ``call.completed``, ``call.recording.available``, ``call.transcript.available``, etc. Args: call_id: Internal KrosAI call UUID. limit: Maximum events to return (default 100). Returns: Dict with ``data`` list of event rows ordered by ``created_at`` ascending. |
| calls.transcript | Fetch the turn-by-turn transcript for a completed call. Returns the Deepgram or provider-supplied diarised transcript stored in the ``calls.transcript`` column. Args: call_id: Internal KrosAI call UUID. Returns: Dict with ``call_id`` and ``transcript`` (list of speaker turns or raw text, depending on the transcription provider). |
| calls.recording | Fetch the recording URL for a completed call. Args: call_id: Internal KrosAI call UUID. Returns: Dict with ``call_id`` and ``recording_url`` (presigned Supabase Storage URL, valid for a limited time). |
| calls.delete | Soft-delete a call record by setting its status to ``deleted``. The row is retained for billing and audit purposes. Cannot delete a call that is currently in-progress — hang it up first. Args: call_id: Internal KrosAI call UUID. Returns: Dict with ``ok`` flag on success. |
| endpoints.list | List all AI endpoint configurations for the organisation. Args: type: Optional provider type filter — one of ``"elevenlabs"``, ``"vapi"``, ``"retell"``, ``"vogent"``, ``"aethex"``, ``"sip"``. Returns: List of endpoint dicts ordered by ``created_at`` descending. Each dict includes ``id``, ``name``, ``type``, ``url``, ``provider_config``, ``status``, ``organization_id``, ``created_at``, and ``updated_at``. |
| endpoints.get | Fetch a single AI endpoint configuration by ID. Args: endpoint_id: UUID of the endpoint. Returns: Endpoint dict with full ``provider_config``. |
| endpoints.create | Create a new AI endpoint configuration. Args: name: Human-readable display name for the endpoint. type: Provider type — one of ``"elevenlabs"``, ``"vapi"``, ``"retell"``, ``"vogent"``, ``"aethex"``, ``"sip"``. url: SIP URI or provider webhook URL. Required for ``"sip"`` and ``"vogent"``; optional for API-based providers. provider_config: Provider-specific configuration dict (e.g. ``{"agent_id": "...", "elevenlabs_phone_number_id": "..."}``) Required structure varies by provider type. status: Lifecycle status — ``"active"`` (default) or ``"inactive"``. Returns: Newly created endpoint row dict. |
| endpoints.update | Update an existing AI endpoint configuration. Only the provided fields are changed; omitted fields are left as-is. Args: endpoint_id: UUID of the endpoint to update. name: New display name. url: New SIP URI or webhook URL. provider_config: Full replacement for the provider config dict. status: New lifecycle status — ``"active"`` or ``"inactive"``. Returns: Updated endpoint row dict. |
| endpoints.delete | Delete an AI endpoint configuration. Fails if any phone numbers are currently attached to this endpoint. Detach them first using :func:`mcp_tools.phone_numbers.detach_endpoint_from_number`. Args: endpoint_id: UUID of the endpoint to delete. Returns: Dict with ``ok`` flag on success. |
| endpoints.test | Test live connectivity to an AI endpoint. Sends a lightweight probe to the provider API (no call is placed) and returns the connection result. Args: endpoint_id: UUID of the endpoint to test. Returns: Dict with ``ok`` flag, ``latency_ms`` (when available), and optional ``detail`` message from the provider. |
| numbers.list | List all phone numbers owned by the organisation. SIP credentials are excluded from list results for security; fetch a single number by ``id`` to obtain credentials. Args: status: Optional status filter — ``"active"``, ``"released"``, or ``"porting"``. Returns: List of phone number dicts ordered by ``number`` ascending. Each dict includes ``id``, ``number``, ``status``, ``endpoint_id``, ``allow_inbound``, ``allow_outbound``, ``routing_mode``, ``created_at``, and ``updated_at``. |
| numbers.get | Fetch the full record for a single phone number. Includes SIP credentials (``sip_username``, ``sip_password``, ``sip_domain``) unlike the list endpoint. Args: phone_number_id: UUID of the phone number record. Returns: Full phone number dict. |
| numbers.search | Search for purchasable phone numbers. Args: country_code: ISO 3166-1 alpha-2 country code (default ``"US"``). area_code: Optional NPA area code to filter by (e.g. ``"415"``). contains: Optional digit sequence the number must contain. limit: Maximum results to return (default 20, max 50). Returns: List of available number dicts with ``number``, ``monthly_cost``, and capability fields. |
| numbers.claim | Claim / register a phone number for the organisation. Args: number: E.164 phone number string (e.g. ``"+14155552671"``). endpoint_id: UUID of the AI endpoint to attach immediately. allow_inbound: Whether to accept inbound calls on this number. allow_outbound: Whether to use this number as caller-ID for outbound calls. Returns: Newly registered phone number row dict. |
| numbers.update | Update routing configuration for a phone number. Args: phone_number_id: UUID of the phone number to update. allow_inbound: Enable or disable inbound call reception. allow_outbound: Enable or disable use as outbound caller-ID. routing_mode: Routing mode string (e.g. ``"endpoint"`` or ``"ivr"``). Returns: Updated phone number row dict. |
| numbers.release | Release a phone number back to the carrier pool. This action is irreversible. The number will no longer receive calls and will be removed from the organisation's inventory. Args: phone_number_id: UUID of the phone number to release. Returns: Dict with ``ok`` flag on success. |
| numbers.attach | Attach an AI endpoint to a phone number. Inbound calls to this number will be routed to the specified endpoint. Args: phone_number_id: UUID of the phone number. endpoint_id: UUID of the AI endpoint to attach. Returns: Updated phone number row dict. |
| numbers.detach | Detach the AI endpoint from a phone number. After detaching, inbound calls to this number will not be routed to any AI endpoint until a new one is attached. Args: phone_number_id: UUID of the phone number. Returns: Updated phone number row dict with ``endpoint_id`` set to ``null``. |
| numbers.diagnostics | Fetch porting status and SIP diagnostics for a phone number. Returns carrier porting events, SIP registration state, and any known configuration issues. Args: phone_number_id: UUID of the phone number. Returns: Dict with ``porting_status``, ``sip_registered``, ``events`` list, and optional ``issues`` list. |
| webhooks.list | List all outbound webhook registrations for the organisation. Signing secrets are not included in the list response. Returns: List of webhook dicts ordered by ``created_at`` descending. Each dict includes ``id``, ``url``, ``events``, ``enabled``, ``organization_id``, ``created_at``, and ``updated_at``. |
| webhooks.create | Register a new outbound webhook URL. The Bridge will POST call lifecycle events to this URL signed with an HMAC-SHA256 ``X-KrosAI-Signature`` header. Valid ``events`` values: ``"call.initiated"``, ``"call.answered"``, ``"call.completed"``, ``"call.failed"``, ``"call.recording.available"``, ``"call.transcript.available"``. Args: url: HTTPS URL to deliver events to. events: List of event names to subscribe to. Omit to subscribe to all events. enabled: Whether the webhook is active (default ``True``). signing_secret: Optional custom HMAC signing secret. A random secret is generated automatically when omitted. Returns: Newly registered webhook row dict (without signing_secret). |
| webhooks.update | Update a webhook registration. Only provided fields are changed. Args: webhook_id: UUID of the webhook to update. url: New delivery URL. events: Replacement event subscription list. enabled: Enable or disable the webhook. signing_secret: New HMAC signing secret. Returns: Updated webhook row dict. |
| webhooks.delete | Delete a webhook registration. The webhook will immediately stop receiving events. Args: webhook_id: UUID of the webhook to delete. Returns: Dict with ``ok`` flag on success. |
| webhooks.test | Send a test event to a webhook URL to verify reachability. The Bridge sends a synthetic ``"webhook.test"`` payload and returns whether the endpoint responded with a 2xx status code within the timeout. Args: webhook_id: UUID of the webhook to test. Returns: Dict with ``ok`` flag, ``status_code`` from the target server, and optional ``latency_ms``. |
| webhooks.deliveries.list | Fetch the delivery history for a webhook. Args: webhook_id: UUID of the webhook. limit: Maximum deliveries to return (default 50). status: Filter by delivery status — ``"success"`` or ``"failed"``. Returns: Dict with ``data`` list of delivery records including ``event``, ``status_code``, ``response_body``, ``created_at``, and ``next_retry_at`` for pending retries. |
| webhooks.deliveries.retry | Retry a failed webhook delivery immediately. Args: delivery_id: UUID of the delivery record to retry. Returns: Dict with ``ok`` flag and updated delivery row. |
| keys.list | List API keys for the organisation. Raw key values are never returned — only ``prefix`` (first 12 chars) and ``last4`` (last 4 chars) are available. Args: include_revoked: When ``True``, revoked keys are included in the results. Defaults to ``False``. Returns: List of API key dicts ordered by ``created_at`` descending. Each dict includes ``id``, ``name``, ``prefix``, ``scopes``, ``last_used_at``, ``created_at``, ``revoked_at``, and ``organization_id``. |
| keys.create | Create a new ``kros_*`` API key. The raw key is returned only in this response — store it immediately. It cannot be retrieved again. Args: name: Human-readable label for the key (e.g. ``"Production server"``). scopes: Optional list of permission scopes. Omit for full access. Returns: Dict including ``id``, ``name``, ``key`` (raw value, one-time), ``prefix``, ``last4``, ``scopes``, and ``created_at``. |
| keys.update | Update an API key's name or scope list. Args: key_id: UUID of the API key record. name: New display name. scopes: Replacement scope list. Returns: Updated API key row dict (without the raw key value). |
| keys.rotate | Rotate an API key: revoke the existing key and issue a new one. The new raw key is returned only in this response — store it immediately. Args: key_id: UUID of the API key to rotate. Returns: Dict with the new ``key`` value (raw, one-time), ``id``, ``prefix``, and ``last4`` for the replacement key. |
| keys.revoke | Permanently revoke an API key. The key will be rejected immediately on the next request. This action cannot be undone. Args: key_id: UUID of the API key to revoke. Returns: Dict with ``ok`` flag and ``revoked_at`` timestamp. |
| keys.usage | Fetch per-key usage statistics. Args: key_id: UUID of the API key. Returns: Dict with ``calls_count``, ``last_used_at``, and a ``daily`` breakdown of request counts for the last 30 days. |
| org.get | Return read-only metadata for the authenticated organisation. Exposes plan, balance, billing window, KYC status, SIP subdomain, and locale. Fields that could leak Stripe credentials or internal configs are excluded. Returns: Dict with ``id``, ``name``, ``plan``, ``plan_id``, ``cents_balance``, ``billing_period_start``, ``billing_period_cents_used``, ``sip_subdomain``, ``stack_level``, ``kyc_provider``, ``timezone``, ``locale``, ``created_at``, and ``updated_at``. |
| billing.get | Return the current billing snapshot for the organisation. Includes the live wallet balance, current billing period usage, plan included credits, and a breakdown of recent charges. Returns: Dict with ``cents_balance``, ``billing_period_cents_used``, ``billing_period_start``, ``included_cents``, ``plan``, and a ``recent_transactions`` list. |
| integrations.list | List provider integrations configured for the organisation. Raw API keys are never returned — only safe metadata fields are included (``id``, ``provider``, ``display_name``, ``is_connected``, ``last_tested_at``, ``organization_id``, ``created_at``, ``updated_at``). Args: provider: Optional provider filter — one of ``"elevenlabs"``, ``"vapi"``, ``"retell"``, ``"openai"``, ``"aethex"``. Returns: List of integration metadata dicts ordered by ``created_at`` descending. |
| integrations.get | Fetch a single provider integration by ID. Args: integration_id: UUID of the integration record. Returns: Integration metadata dict (no raw API key values). |
| integrations.create | Store or upsert provider API credentials. If an integration for this ``(organization, provider)`` pair already exists it is updated in-place. The raw ``api_key`` is stored encrypted and is never returned; the response includes only a masked hint. Args: provider: Provider name — one of ``"elevenlabs"``, ``"vapi"``, ``"retell"``, ``"openai"``, ``"aethex"``. api_key: Provider API key or secret. Write-only: stored encrypted, never returned. display_name: Optional human-readable label for the integration. extra_config: Optional provider-specific extra settings dict. Returns: Integration metadata row with ``api_key_hint`` (masked). |
| integrations.update | Update an existing provider integration. Only provided fields are changed. Args: integration_id: UUID of the integration to update. api_key: New provider API key (write-only; replaces the stored key). display_name: New display name. extra_config: Replacement extra configuration dict. Returns: Updated integration metadata dict. |
| integrations.delete | Remove a provider integration and its stored credentials. Args: integration_id: UUID of the integration to delete. Returns: Dict with ``ok`` flag on success. |
| integrations.test | Verify that the stored API key can authenticate with the provider. Sends a lightweight probe to the provider API and updates ``last_tested_at`` and ``is_connected`` on the integration record. Args: integration_id: UUID of the integration to test. Returns: Dict with ``ok`` flag, ``is_connected`` bool, and optional ``detail`` from the provider. |
| analytics.summary | Return aggregate call statistics for the organisation over a date range. Reads from the ``call_stats_daily`` rollup table. Totals are pre-computed by the nightly rollup job; the most recent day may be slightly behind real-time. Args: start_date: Inclusive start date in ``YYYY-MM-DD`` format. Defaults to 30 days ago when omitted. end_date: Inclusive end date in ``YYYY-MM-DD`` format. Defaults to today when omitted. Returns: Dict with: - ``total_calls`` — total call count in the period. - ``answered_calls`` — calls that were answered. - ``total_minutes`` — total call duration in minutes. - ``total_cost`` — total cost in USD. - ``date_range`` — dict with ``start`` and ``end`` used. - ``by_day`` — list of daily breakdown rows sorted by date ascending. |