Назад до Quickstart

OAuth для власних MCP-клієнтів

Якщо ти пишеш свій MCP-клієнт (CLI, SDK, плагін для IDE), ця сторінка описує нашу реалізацію OAuth: які стандарти ми підтримуємо, точки доступу, правила зіставлення redirect_uri та як виправити типові помилки. Користувачам Claude.ai і ChatGPT ця сторінка не потрібна — переглянь натомість Quickstart.

Які стандарти ми реалізуємо

mcp-telegram.com повністю відповідає OAuth-специфікаціям, на які спирається екосистема MCP — без пропрієтарних розширень, без зашитих у клієнти спільних секретів.

RFC 6749OAuth 2.0 Authorization Framework — базовий authorization code grant із refresh-токенами
RFC 7591Dynamic Client Registration — будь-який клієнт може зареєструватися самостійно через /oauth/register, без попередніх домовленостей
RFC 7636PKCE (Proof Key for Code Exchange) — S256 challenge обов'язковий для публічних клієнтів
RFC 8252OAuth 2.0 for Native Apps — loopback IP redirect URI з гнучкістю ефемерного порту
RFC 8414OAuth 2.0 Authorization Server Metadata — discovery-документ за адресою /.well-known/oauth-authorization-server
RFC 9728OAuth 2.0 Protected Resource Metadata — discovery меж MCP-ресурсу

Точки доступу

Метадані authorization-сервера (RFC 8414)
Динамічна реєстрація клієнта (RFC 7591)
Authorization endpoint
Token endpoint
MCP-ресурс (Streamable HTTP)

Authorization code flow з PKCE

Стандартний потік RFC 6749 §4.1 + RFC 7636. Жодних сюрпризів — якщо твоя OAuth-бібліотека вміє «authorization code + PKCE», усе запрацює.

1

Зареєструй свій клієнт

POST /oauth/register із { redirect_uris: ["http://127.0.0.1:«port»/callback"], client_name: "назва-твого-клієнта" }. Сервер поверне client_id + client_secret (secret необов'язковий для публічних PKCE-клієнтів, але отримати його не зашкодить).

2

Згенеруй PKCE-пару

Згенеруй випадковий code_verifier на 43–128 символів, потім обчисли code_challenge = BASE64URL(SHA256(code_verifier)). Збережи verifier локально для кроку 4.

3

Відкрий /oauth/authorize у браузері

Перенаправ користувача на /oauth/authorize?response_type=code&client_id=...&redirect_uri=...&state=...&code_challenge=...&code_challenge_method=S256. Сервер покаже QR-код; користувач сканує його у застосунку Telegram, щоб автентифікуватися.

4

Отримай authorization code

Після сканування QR сервер перенаправляє на твій redirect_uri з ?code=...&state=.... Перевір, що параметр state збігається з тим, який ти надсилав.

5

Обміняй code на токен

POST /oauth/token із grant_type=authorization_code, code, redirect_uri, code_verifier, client_id. Отримаєш access_token (TTL 10 років — див. нижче Token Lifetime) та refresh_token. Використовуй access_token як Authorization: Bearer ... у запитах до /mcp.

Правила зіставлення redirect_uri

Ми суворо дотримуємося RFC 8252 §7.3 та §8.4. Алгоритм зіставлення залежить від того, чи є зареєстрований URI loopback IP-літералом.

Loopback (http://127.0.0.1 або http://[::1])

Якщо ти зареєстрував loopback URI, то redirect_uri на момент authorize має точно збігатися за scheme, host, path і query — але порт може відрізнятися. Цього вимагає RFC 8252 §7.3, бо нативні клієнти прив'язуються до ефемерного порту, призначеного ОС, який може змінюватися між запусками.

HTTPS (https://your-domain.example/...)

Потрібен точний побайтовий збіг, включно з path, query та портом (RFC 6749 §3.1.2). Без гнучкості.

localhost (НЕ рекомендовано)

Ми трактуємо http://localhost як звичайне ім'я хоста — потрібен точний збіг, гнучкості за портом немає. RFC 8252 §8.3 рекомендує використовувати IP-літерали (127.0.0.1 / [::1]) замість localhost, бо розв'язання DNS залежить від реалізації.

PKCE обов'язковийcode_challenge_method=S256 потрібен у кожному запиті до authorize. Метод Plain відхиляється. Якщо повністю пропустити code_challenge, обмін на /token впаде на перевірці code_verifier.
Час життя токенаTTL access_token навмисно великий (10 років), бо деякі MCP-клієнти ненадійно зберігають refresh_token. Тим не менш refresh_token усе одно видається й ротується під час кожного refresh (RFC 6819 §5.2.2.3). Користувач будь-коли може відкликати всі токени за адресою /my/sessions або виходом із Telegram. Також можна явно надіслати POST на /oauth/revoke (RFC 7009), щоб завершити сесію.

Типові помилки

Перевірені клієнти

Підтверджена сумісність із нашим сервером. Якщо ти зібрав щось нове і воно працює — надішли нам PR, додамо сюди.

Claude.ai web — через вбудований MCP connector
ChatGPT Apps — через вбудований MCP connector
Hermes Agent — open-source CLI MCP-клієнт (RFC 8252 loopback flow)
Cursor MCP — плагін для IDE (RFC 8252 loopback flow)
Будь-який клієнт, що відповідає RFC 6749 + RFC 7591 + RFC 7636 + RFC 8252, має працювати без змін у коді з нашого боку.

Кілька облікових записів Telegram на одному OAuth-з'єднанні

Починаючи з v2.32.0 одне OAuth-з'єднання може містити кілька ідентичностей Telegram і перемикатися між ними одним викликом інструмента — без циклу Disconnect/Connect, без реєстрації нового клієнта.

1

Перегляньте, що прив'язано

Викличте telegram-accounts-list. Ви побачите основний (прив'язаний до OAuth) акаунт, позначений ⭐, якщо він активний, а також будь-які вторинні, які ви додали.

2

Прив'яжіть ще один акаунт

Викличте telegram-accounts-add з опціональною міткою (наприклад, "testing"). Інструмент поверне одноразове посилання (TTL 10 minutes) — відкрийте його на будь-якому пристрої та відскануйте QR обліковим записом Telegram, який хочете додати.

3

Перемкніть активний акаунт

Викличте telegram-accounts-switch з identifier=label, @username, account_id або 'primary'. Наступний виклик telegram-* одразу використає цей акаунт. Без перепідключення.

4

Від'єднайте вторинний акаунт

Викличте telegram-accounts-remove identifier=… для вторинного. Сам обліковий запис Telegram НЕ виходить із системи — від'єднується лише прив'язка тут. Основний акаунт у такий спосіб видалити не можна; для повного виходу скористайтеся процесом Disconnect у вашому клієнті.

Кожне OAuth-з'єднання ізольоване: акаунти, які ви прив'язали через Hermes, невидимі для Claude.ai чи ChatGPT, навіть якщо це та сама ідентичність Telegram. Щоб під'єднати різні акаунти до різних MCP-клієнтів, зареєструйте кожен клієнт окремо та використовуйте telegram-accounts-add у межах його сесії.