Skip to main content
Glama
sergey-akhmineev

rtk-vats

rtk-vats-api

REST-API über der internen API des persönlichen Kontos der virtuellen Telefonanlage von Rostelecom (cloudpbx.rt.ru/webapi). Ermöglicht Skripten und KI-Agenten die Steuerung der Telefonie: Kontakte, Teilnehmer, Anrufgruppen, Anrufverlauf, Gesprächsaufzeichnungen, Nummern und Routing, Guthaben – plus einen transparenten Proxy zu jedem der ~240 Endpunkte der VTA.

Der Zugang erfolgt über Benutzername und Passwort des „Rostelecom-Passports“ mit Bestätigung per SMS-Code; danach wird die Sitzung automatisch aufrechterhalten. Im Lieferumfang enthalten sind ein MCP-Server und ein fertiger Skill, damit ein KI-Agent (Claude Code und kompatible) dies nutzen kann.

Inoffizielles Projekt: nutzt die interne API des persönlichen Kontos, die Rostelecom ohne Vorwarnung ändern kann. Nicht mit PJSC Rostelecom verbunden.

So funktioniert es

  • Anmeldung – mit Benutzername und Passwort des „Rostelecom-Passports“ plus einem Einmalcode aus SMS (POST /auth/loginPOST /auth/code). Danach funktioniert der Dienst von selbst: JWT ~24 Minuten, ein Hintergrund-Keepalive erneuert ihn über das Refresh-Token.

  • Die Sitzung wird in data/session.json (Rechte 600) gespeichert und übersteht einen Neustart des Dienstes.

  • Der Zugriff auf diese API erfolgt über den Header X-API-Key (Wert in .env).

Warum für die Anmeldung eine Browser-Engine nötig ist

Bei Domains, die mit dem „Rostelecom-Passport“ verbunden sind, funktioniert das klassische POST /webapi/auth (Benutzername + Passwort + Domain) nicht: Ein solches Konto hat kein eigenes Passwort in der VTA, der Server antwortet mit „Die eingegebenen Anmeldedaten sind ungültig“. Die Anmeldung erfolgt über die Kette /webapi/sso → Keycloak passport.rt.ru → SMS-Code → Rückkehr zum persönlichen Konto mit Tokens.

Die Passport-Seiten sind durch den Anti-Bot F5 geschützt: Ein normaler HTTP-Client erhält eine JS-Herausforderung statt des Formulars, und grant_type=password (ROPC) – dieselbe Herausforderung. Deshalb führt den Login-Schritt eine echte Engine (Playwright, Chromium) aus – nur im Moment der Anmeldung, für etwa dreißig Sekunden. Die gesamte weitere Arbeit erfolgt mit normalem httpx ohne Browser.

Wenn Sie Chromium nicht auf dem Server installieren möchten, gibt es zwei Wege: scripts/login_helper.py (der Browser läuft auf Ihrem Rechner, die Tokens werden an den Dienst übergeben) oder manuelles POST /auth/import.

Related MCP server: Radius MCP Server

Start (Entwicklung)

python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
.venv/bin/playwright install chromium     # нужен только для /auth/login
cp .env.example .env                      # заполнить PBX_USERNAME/PBX_PASSWORD, API_KEY
.venv/bin/uvicorn app.main:app --host 0.0.0.0 --port 8010

OpenAPI-Dokumentation: http://<host>:8010/docs

Autorisierung

KEY="X-API-Key: <ваш API_KEY>"

# 1. Логин и пароль -> на телефон владельца учётки уходит SMS
curl -X POST http://localhost:8010/auth/login -H "$KEY" \
     -H 'Content-Type: application/json' \
     -d '{"username":"lk_1234567890","password":"..."}'
# -> {"status":"code_required","hint":"Мы отправили код на номер +7 ...","seconds_to_enter_code":300}

# 2. Код из SMS
curl -X POST http://localhost:8010/auth/code -H "$KEY" \
     -H 'Content-Type: application/json' -d '{"code":"123456"}'
# -> {"status":"ok","seconds_left":1435,"has_refresh_token":true,"has_fingerprint":true}

# Состояние сессии / принудительное обновление / отмена входа
curl http://localhost:8010/auth/status -H "$KEY"
curl -X POST http://localhost:8010/auth/refresh -H "$KEY"
curl -X POST http://localhost:8010/auth/cancel  -H "$KEY"

Benutzername und Passwort können auch weggelassen werden – dann werden PBX_USERNAME / PBX_PASSWORD aus .env verwendet. Anmeldung mit Einmalcode ohne Passwort: {"by_code": true}.

Für die Eingabe des Codes stehen BROWSER_CODE_TTL Sekunden zur Verfügung (Standard: 300): Während dieser Zeit wartet die geöffnete Passport-Seite auf den Code. Wenn Sie es nicht rechtzeitig schaffen, beginnen Sie erneut mit /auth/login.

Anmeldung ohne Browser auf dem Server

# на своей машине (там, где есть playwright); токены уедут на удалённый сервис
python scripts/login_helper.py --api-url http://10.10.0.187:8010 --api-key <KEY>

Manueller Import von Tokens (letzter Ausweg)

DevTools (F12) → Application → Local Storage → token, refreshToken. Der Wert fingerprint ist im Speicher nicht vorhanden – aus der Adressleiste des SSO-Redirects entnehmen (...&fingerprint=...) oder getBrowserFingerprint() in der Konsole des persönlichen Kontos ausführen. Ohne fingerprint funktioniert die Sitzungsaktualisierung nicht.

curl -X POST http://localhost:8010/auth/import -H "$KEY" \
     -H 'Content-Type: application/json' \
     -d '{"token":"<JWT>","refresh_token":"<refreshToken>","fingerprint":"<fp>"}'

Domains ohne SSO

Wenn das Konto ein eigenes Passwort in der VTA selbst hat, funktioniert die klassische Anmeldung: POST /auth/start (Benutzername/Passwort/Domain aus .env) → POST /auth/complete mit dem Code aus SMS.

Endpunkte

Bequeme (typisierte)

Methode und Pfad

Funktion

VTA-Endpunkt

GET /contacts

Kontaktgruppen mit Kontakten

GET /domain/contacts

POST /contacts

Kontakt erstellen

POST /domain/contacts

PUT/DELETE /contacts/{id}

Kontakt ändern/löschen

PUT/DELETE /domain/contacts/{id}

POST /contacts/groups

Gruppe erstellen

POST /domain/contacts/group

PUT/DELETE /contacts/groups/{id}

Gruppe ändern/löschen

PUT/DELETE /domain/contacts/group/{id}

GET /contacts/users

Domain-Teilnehmer (Nummern, PIN)

GET /domain/contacts/users

GET/POST /users, PUT/DELETE /users/{id}

Domain-Teilnehmer

/domain/users*

GET/POST /groups, GET/PUT/DELETE /groups/{id}

Anrufgruppen

/domain/groups*

GET /calls?...

Anrufverlauf (Query wird durchgereicht)

GET /domain/call_history

GET /calls/stat

Anrufstatistik

GET /domain/call_history/stat

GET /calls/{id}/protocol

Anrufprotokoll

GET /domain/call_history/{id}/protocol

GET /calls/{id}/record

Gesprächsaufzeichnung (audio/*)

GET /domain/call_history/{id}/record

GET /numbers

Nummern und Routing

GET /domain/numbers

GET /balance

Guthaben des persönlichen Kontos

GET /domain/payments/balance

GET /settings

Domain-Einstellungen

GET /domain/settings

Transparenter Proxy

Jeder VTA-Endpunkt ist über ANY /proxy/{path}/webapi/{path} erreichbar (Query, Body und Methode werden durchgereicht; binäre Antworten werden unverändert ausgegeben):

curl http://localhost:8010/proxy/domain/payments/balance -H "$KEY"
curl -X POST http://localhost:8010/proxy/callcenter/reports/by_calls \
     -H "$KEY" -H 'Content-Type: application/json' -d '{"date_from":"2026-08-01"}'

Die Karte der VTA-Endpunkte (auth, domain/, callcenter/, user/*, meetings, ivr …) – im Quellcode des persönlichen Kontos lk_new/assets/index-*.js (nach callApi("/... greppen).

Tests

.venv/bin/python -m pytest -q

Mocks über respx, keine echten Anfragen an die VTA.

Skill für KI-Systeme

MCP-Server (mcp_server/)

MCP-Server rtk-vats (stdio) mit typisierten Tools vats_* – verbindet sich mit jedem Agenten, der MCP unterstützt (Kimi Code, Claude Code/Desktop, Cursor). Er greift über HTTP auf diese REST-API zu und läuft daher auf dem Rechner des Agenten:

{
  "mcpServers": {
    "rtk-vats": {
      "command": "/path/to/rtk-vats-api/.venv/bin/python",
      "args": ["-m", "mcp_server.server"],
      "cwd": "/path/to/rtk-vats-api",
      "env": {
        "VATS_API_URL": "http://10.10.0.187:8010",
        "VATS_API_KEY": "<тот же API_KEY>"
      }
    }
  }
}

Tools: vats_auth_login/code/status/refresh/cancel, vats_contacts_*, vats_domain_users, vats_users_list, vats_groups_list, vats_calls_history, vats_call_protocol, vats_call_record (lädt in VATS_DOWNLOAD_DIR, Standard ./downloads), vats_balance, vats_numbers, vats_settings, vats_proxy (beliebiger VTA-Endpunkt).

SKILL.md (skills/rtk-vats/)

Fertiger Skill für CLI-Agenten (Claude Code / Kimi Code und kompatible): Anmeldeablauf (Benutzername/Passwort → SMS), Endpunkte, Sicherheitsregeln und Nachschlagewerk references/pbx-setup.md zur Einrichtung der Telefonanlage (Teilnehmer, Gruppen, IVR, Zeitpläne). Installation – kopieren oder Symlink skills/rtk-vats/ in das Skill-Verzeichnis des Agenten (Projekt-.kimi/skills/, .claude/skills/ oder benutzerdefiniert).

Deployment (Docker)

cp .env.example .env      # заполнить PBX_USERNAME/PBX_PASSWORD, API_KEY
docker compose up -d --build
docker compose logs -f

Das Standard-Image enthält Chromium für die Anmeldung über den Passport. Leichte Variante ohne – docker build --build-arg WITH_BROWSER=0 -t rtk-vats-api:slim .; dann erfolgt die Anmeldung extern (scripts/login_helper.py) oder über /auth/import.

⚠️ Port 8010 im lokalen Netzwerk oder hinter VPN halten und nicht im Internet veröffentlichen: dahinter liegt eine aktive Sitzung Ihrer Telefonanlage. Der Schlüssel API_KEY ist der einzige Schutz des Dienstes selbst.

Sicherheit

  • Passwort, SMS-Codes und Tokens werden nicht protokolliert; .env und data/ in .gitignore.

  • PBX_VERIFY_SSL=false – nur für Maschinen hinter einem Unternehmens-MITM-Proxy (sonst stimmt die Zertifikatskette nicht). Auf dem Server true lassen.

  • Der zweite Faktor wird nicht umgangen: Den SMS-Code gibt ein Mensch ein, einmal pro Sitzung.

  • Ein nicht abgeschlossener Anmeldeversuch wird per Timeout beendet – der Browser bleibt nicht hängen.

Falls RTK die API ändert

Es gibt nur eine Stelle zum Anpassen: app/pbx_client.py (Autorisierung/Refresh) + der entsprechende Router in app/routers/. Der Proxy /proxy/* funktioniert weiter, solange sich das Pfadschema selbst nicht ändert.

A
license - permissive license
Not graded
quality - not tested
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Provides comprehensive access to Telnyx's telephony and communication services including call control, SMS/MMS messaging, fax, number management, and SIM card operations. Implements 822 API endpoints from Telnyx API v2.0.0 for complete telecommunications functionality.
    MIT
  • -
    license
    Not graded
    quality
    Not graded
    maintenance
    Enables AI agents to authenticate users, manage calendar events, create meetings, and maintain persistent API sessions for seamless integration with Russian business platforms. Provides comprehensive business productivity capabilities including session management, password operations, and cross-user calendar coordination.
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI assistants to manage Davoxi voice agent platform resources such as businesses, agents, call logs, webhooks, analytics, and billing through natural language conversations.
    26
    MIT

View all related MCP servers

Related MCP Connectors

  • Create voice-agent scenarios, pull session analytics, place SIP calls, schedule meeting bots.

  • Phone, SMS & email for AI agents — one remote MCP endpoint, OAuth login, zero install.

  • Let AI agents place real phone calls from your verified number, with transcripts and recordings.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/sergey-akhmineev/rtk-vats-api'

If you have feedback or need assistance with the MCP directory API, please join our Discord server