
TatNet — apps and cloud infrastructure
cloud.tatnet由 tatnet.cloud 發布官方發布者v1.11.0更新於 Nov 12, 2026
Deploy websites; manage apps, persistent app volumes, VMs, S3, NAT gateways and load balancers.
概覽
面向 TatNet 雲端平台的遠端 MCP 伺服器:部署網站與應用程式,並管理虛擬機、磁碟區、S3、NAT、負載平衡、Kafka 與託管資料庫。
- 可以做什麼
- 從對話中的檔案部署網站,並管理 Git/Docker 應用程式、建置、日誌、環境變數與網域
- 檢視帳戶、餘額、虛擬機方案、磁碟區、S3 區域與用量,以及公開的 AI 模型目錄
- 建立與管理虛擬機、備份與備份政策、VPC 改名、NAT 閘道與負載平衡器
- 維運託管 Kafka 叢集、監控與節點指標,以及可設定 TLS 模式的 Valkey 叢集
- 在獨立端點上:列出託管資料庫、執行唯讀 SQL 查詢、執行 SQL 指令碼
- 適用情境
- 適合讓助理把靜態或 SSR 網站發佈到 TatNet、診斷建置失敗,或在既有 TatNet 帳戶中檢視與變更雲端資源(虛擬機、儲存、網路、Kafka、資料庫),不必切換到主控台或命令列。
- 執行需求
- 遠端 Streamable HTTP 端點;以 OAuth 登入 TatNet 並在同意畫面選擇帳戶、專案與存取層級,或使用受限 API 金鑰以 Authorization Bearer 標頭傳送。託管資料庫工具位於獨立端點,使用個別的 OAuth 受眾。不需本機執行環境。
安裝
在 SourceWeft 中
- 開啟 儀表板中的 TatNet — apps and cloud infrastructure,將其新增到工作區。
- 連接 所需的 憑證。它們會被私密儲存,絕不會在公開頁面上展示。
- 為需要使用其工具的對話啟用該服務。
Web executable,透過 Streamable HTTP。 遠端服務在工作區中設定後即可從網頁執行環境執行。
交給代理程式安裝
把這段提示詞貼上到 Claude Code、Codex、Cursor 等代理程式,或 SourceWeft 對話中。代理程式會讀取該伺服器的安裝指南,先向你展示發布者、端點和登入方式,經你同意後再把它新增到你的客戶端。金鑰不會寫進任何命令。
閱讀 https://sourceweft.com/mcp/cloud.tatnet%2Fmcp/install.md,並按其中說明把這個 MCP 伺服器接入我的客戶端。修改任何設定之前,先告訴我它的發布者、端點和登入方式,等我確認。不要把 API 金鑰寫進命令或我會提交的檔案;問我金鑰應從哪裡取得。其他 MCP 客戶端
把它新增到你客戶端的 mcpServers 設定中。 客戶端會在首次連接時完成 OAuth 登入。
{
"mcpServers": {
"tatnet-apps-and-cloud-infrastructure": {
"type": "http",
"url": "https://mcp.tatnet.cloud/mcp"
}
}
}README
tatnet-mcp
MCP-сервер TatNet: управление платформой из Claude (claude.ai, Desktop, Code),
ChatGPT и любого клиента Model Context Protocol.
«Сделай сайт и выложи на TatNet» — это вызов deploy_files.
Quick start / English
TatNet MCP is a remote server for deploying static and SSR websites from an AI
conversation and managing Git/Docker apps, builds, logs, environment variables
and domains on TatNet, a Russian cloud platform. Transport: Streamable HTTP.
Endpoint: https://mcp.tatnet.cloud/mcp. Authentication: OAuth or a scoped API key.
Connect through OAuth, choose a project and write access, then ask the assistant
to publish your website. A deployment is ready when both status=success and
deploy_state=live are confirmed. Backend apps require Git or a Docker image;
Additional tools cover managed Kafka, VM creation and backup policies, regional
S3 discovery and bucket creation, VPC display-name changes and the public AI
model catalog. list_vm_plans discovers VM plan UUIDs, specifications and prices.
Use the CLI/API for discovery of VM images/clusters, other
VM operations, databases, DNS zones, S3 credentials and object operations.
App deletion and balance top-ups are unavailable through MCP.
- MCP overview and connection docs.
- Publish from Claude Code.
- Diagnose a failed build.
- CLI deployment from CI.
Устройство
- Тонкий слой над публичным
/v1. Своей БД, своих прав и бизнес-логики нет: инструменты управления зовутapi.tatnet.ru/v1через SDKtatnet-goили общий JSON-транспорт с той же авторизацией вызывающего.ai_modelsотдельно читает публичный каталог ИИ без передачи ключа. Права — политика ключа ∩ живая роль создателя, как у CLI и SDK. Чего нет в/v1, того нет и здесь: сначала ручка в/v1, потом инструмент. - Streamable HTTP без состояния (
/mcp), официальныйmodelcontextprotocol/go-sdk. Реплики взаимозаменяемы, выкат клиентов не рвёт. - Авторизация — OAuth или ключ
/v1. Клиент без поля для заголовка регистрируется сам (DCR), человек входит в TatNet и на экране согласия выбирает аккаунт, проекты и уровень доступа; подключение появляется в панели рядом с API-ключами и отзывается там же. Токен выдан только для MCP и дальше сервера не уходит — в/v1сервер ходит сам от имени подключения. Клиенты, которые умеют передать заголовок, могут прийти и с ключомAuthorization: Bearer tn_live_…. Права в обоих случаях решает api на каждом вызове: политика подключения или ключа пересекается с ролью человека.
Инструменты
Kafka тарифицируется в API: почасовые VM + 30% за управление; IPv4 и
дополнительные диски без наценки. Управление оплачивается после первого ready.
MCP передаёт цены и решения биллинга, не рассчитывает их самостоятельно.
Удаление аппов не поддерживается. Удаление Kafka и бэкапов уже доступно:
инструменты помечены destructiveHint; показ подтверждения зависит от клиента.
Серверного двухшагового подтверждения нет, права и защитные ограничения проверяет API.
Правила, на которых держится
- Ключи авторизации не возвращаются инструментами.
.envизdeploy_filesв архив не кладётся (как уtatnet deploy), значения секретных env не читаются. Исключение — создание Kafka: начальный пароль возвращается один раз и попадёт в контекст клиента. Сохраните его в менеджере секретов; не публикуйте логи вызова. - Пустой список ≠ «ничего нет».
/v1отвечает 200 и пустым списком, когда ключу не видно ресурсов; инструменты говорят это прямо, если ключ ограничен. - Отказ — текст, по которому можно действовать: что случилось и что делать (403 → «расширьте ключ, не повторяйте», 5xx → «наша сторона, повторите»).
- Лог сборки — недоверенные данные. Его пишет код клиента; инструкции сервера и схемы полей говорят модели не исполнять найденное в нём.
- «Сборка прошла» ≠ «работает».
get_buildждёт конца раскатки и отдаётdeploy_state; живым апп называется только приlive. - Повторы не плодят ресурсы. Модели повторяют вызовы;
create_appиdeploy_filesнаходят апп по имени вместо создания второго.
Подключение
Адрес сервера — https://mcp.tatnet.cloud/mcp.
Через OAuth — в клиенте с поддержкой удалённых MCP-серверов (веб-чаты, десктопные приложения, IDE) достаточно указать адрес и выбрать OAuth: клиент зарегистрируется сам и откроет вход в TatNet.
Ключом — для клиентов, которые передают заголовок, и для скриптов. Ключ создаётся в панели TatNet → «API-ключи»; можно ограничить проектами и действиями.
Окружение
Метрики: tatnet_mcp_tool_calls_total{tool,outcome},
tatnet_mcp_tool_duration_seconds{tool}, tatnet_mcp_auth_failures_total{reason}.
Разработка
Сквозной тест (cmd/tatnet-mcp/e2e_test.go) поднимает настоящий MCP-клиент
SDK против сервера, а сервер — против поддельного /v1 с состоянием в памяти,
и проверяет последствия вызовов: что ушло в архив, сколько аппов создано,
что попало в ответ модели.
Каталоги
Сервер один; каталогов, из которых о нём узнают клиенты, три, и в каждый он подаётся отдельно.
Реестр. Пространство имён cloud.tatnet/* подтверждается TXT-записью на
АПЕКСЕ tatnet.cloud (не под селектором вроде _mcp.), адрес сервера держим
на том же домене (тест TestServerJSONFitsTheRegistry; реестр этого не
требует, это наше правило). Ключ Ed25519 — только OpenSSL 3 (системный
openssl macOS — LibreSSL, Ed25519 не умеет):
Ключ текущей DNS-авторизации хранится локально в конфигурации издателя, вне этого репозитория. При повторном входе используйте существующий ключ; его содержимое не должно попадать в README или Git.
⚠ Каждая публикация требует НОВОЙ version в server.json: реестр
отвергает повтор уже опубликованной версии.
Аннотации. Оба каталога читают title, readOnlyHint,
destructiveHint, openWorldHint с провода, а ChatGPT отклоняет инструмент,
у которого флаг не указан явно. Тест TestToolAnnotationsAreExplicitOnTheWire
проверяет сырой tools/list.
Finding apps and confirming a deployment
list_apps accepts exact repo, branch, name, and domain filters.
Omitting project_id searches all projects visible to the connection.
limit defaults to 100 matches (maximum 200). If next_cursor is present,
continue with that cursor and the same filters; an empty page can still have
more pages. scope states which projects were searched. Filtering happens
across API pages, so later matches remain discoverable.
get_build accepts either build_id or an exact full commit_sha.
Both searches continue through build history, rather than just the latest
50 builds. Omitting both selects the latest build and pins its ID during
that call's polling. When continuing across calls, pass the returned build
ID to keep observing the same build.
build_succeeded describes artifact creation. deployment_succeeded and
succeeded are true only for status=success and deploy_state=live.
A missing, unknown, rolling or unverified deployment state remains pending;
startup failures terminate with succeeded=false and diagnostic log lines.
finished means waiting has ended, including failure. Never treat it alone
as a successful deployment.
Каталог моделей ИИ
ai_models(kind="chat" | "text" | "image" | "video") читает публичный каталог
ai.tatnet.cloud: модели, умения и клиентские цены. Инструмент не передаёт
ключ управления облаком в шлюз инференса и не запускает генерацию.
Платные операции генерации ИИ требуют отдельного tnai_live_…, тогда как текущий
OAuth/ключ MCP авторизует управление облаком. Без безопасного обмена на
ключ инференса конкретного аккаунта генерацию через remote MCP не добавляем.
Оставшийся шаг — такой обмен/делегирование с проверкой прав аккаунта;
передавать секрет через аргументы модели или общий ключ сервера не следует.
Для генерации сейчас используйте tatnet ai с собственным ключом инференса.
Rename a VPC
rename_vpc accepts vpc_id and name. It changes only the display label through PATCH /v1/vpcs/{id} and requires vpc:update; subnet, ports, NAT and OVN identifiers stay unchanged.
S3
list_s3_regions показывает регионы и публичные endpoints;
get_s3_connection_info возвращает настройки подключения выбранного региона;
create_s3_bucket создаёт приватный по умолчанию бакет с необязательным region.
При отсутствии региона API использует регион по умолчанию. Авторизация — та же
политика /v1, включая OAuth-подключения; права на бакеты проверяет API.
VM и бэкапы
VM tools: create_vm accepts the public VM creation settings, including an optional atomic backup_policy; list_vm_backups returns recovery point origin, expiry, compressed size and immutable deletion deadlines. API permissions and billing checks remain authoritative.
VM backups: delete_vm_backup deletes a selected point through the public API, preserving active-job, retention and chain-dependency guards. Abandoned legacy placeholders can be explicitly deleted after seven days without a stored result or dispatch.
get_vm_backup_policy reads the schedule; set_vm_backup_policy accepts
project_id, vm_id, enabled, hour_utc (0–23 UTC) and retention_days
(1–365). Storage costs 6 RUB per compressed decimal GB-month (730 hours),
separate from the VM subscription, without prepaid slots. Disabling a policy
preserves copies and storage charges. Manual copies do not expire; old locks
and chain dependencies remain enforced. New captures are independent full
compressed points. See the user guide.
Выпуск и проверка версии
Выпуск 1.5.0 добавляет enable_nat_gateway и disable_nat_gateway с сохранением
публичного IP. Для повторного подключения дождитесь available и передайте
fip_id; сохранённый адрес продолжает тарифицироваться.
Тег Git, GitHub Release, образ в GHCR, работающий сервер и карточка MCP Registry
обновляются отдельно. server.json описывает публикацию в Registry; он не
переключает образ приложения и не задаёт версию бинарника. Версия в MCP
initialize приходит из Docker build-аргумента VERSION (в CI — ref + SHA).
Текущие версии проверяйте отдельно: Git/GitHub Release, образ работающего
приложения и MCP Registry могут обновляться в разное время. Версия карточки
берётся из server.json соответствующего тега; фактическая версия сервера —
из initialize и подтверждённого SHA образа после deploy_state=live.
Выпуск 1.6.0 добавляет create_load_balancer и get_load_balancer с поддержкой
зарезервированного floating_ip_id, который сохраняется после удаления LB.
Порядок нового выпуска:
- Обновить
server.jsonдо ещё не опубликованной версии, описать изменения, запустить vet/build/tests и дождаться успешного CI на коммите выпуска. - Поставить
v<version>на проверенный коммит. Workflowimageпубликует образы на push вmainи на тег. Толькоmainпишет тег полного SHA; релизный push пишетv<version>и не перезаписывает SHA-образ. Сборка образа и тесты — отдельные workflows: наличие образа само по себе не доказывает, что тесты прошли. - Оформить GitHub Release с изменениями, результатами проверок и полным SHA.
- При изменении сервера выбрать образ
ghcr.io/tatnet-ru/tatnet-mcp:<полный-SHA>черезtatnet app update <app-id> --image <image>, затемtatnet app deploy <app-id>. Указать нужный проект CLI (-p <project-id>). - Через
tatnet app get <app-id> -o jsonпроверитьdeploy_state=live,running_docker_imageиrunning_docker_image_digest; проверить/healthzи авторизованный MCPinitialize/tools/list. При необходимости отката вернуть предыдущий SHA образа и повторить deploy. - Из checkout того же тега выполнить
mcp-publisher publishсуществующей учётной записью издателя. Проверитьserver.versionиisLatestпо Registry API.gh release createи пуш тега не публикуют карточку Registry.
Полнота поддержки операций определяется tools/list. Описание карточки Registry
краткое и не заменяет таблицу инструментов выше.
Несколько VPC на ВМ
Каждая VPC подключается отдельным сетевым интерфейсом в том же аккаунте и регионе. Перед изменением интерфейсов ВМ нужно выключить; настройки применяются при запуске. Основной интерфейс и маршрут по умолчанию защищены от отключения.
attach_vm_interface принимает project_id, vm_id, vpc_id;
detach_vm_interface — project_id, vm_id, interface_id. Обе операции
используют общий публичный API с проверками vm:update и vpc:write.
Managed PostgreSQL
get_postgres_clusterreads the current cluster, dedicated reader endpoint, replica node states, byte lag and pending changes.set_postgres_read_replicassetscount(0–5) for aproject_idandcluster_id. These are additional paid nodes on the cluster plan, independent of HA. Count zero removes readers; the primary database remains. Replicas never automatically promote and can lag. The read endpoint shares the writer address on TCP/5433. After changing intent, inspectget_postgres_clusteruntilread_replicas_pendingis false and verify the observed node states.
Both tools use the common public API and preserve API-key/OAuth authorization.
retain_load_balancer_ip закрепляет именно текущий адрес работающего LB.
Передайте project_id, load_balancer_id и точный expected_vip: при смене
адреса API вернёт 409. Операция не пересоздаёт LB и не выбирает другой IP.
Ответ содержит floating_ip_id; этот резерв остаётся после удаления LB.
Оплата адреса остаётся в текущей подписке LB и переходит в отдельный почасовой
учёт после её освобождения. Для Kubernetes добавьте UUID в
tatnet/lb-floating-ip-id и исходные Helm/GitOps values до пересоздания Service.
Kafka monitoring and password recovery
Kafka now exposes GET /projects/{project}/kafka-clusters/{cluster}/nodes/{node}/metrics?metric=cpu&range=1h (also memory, disk_io, network_io) and POST /projects/{project}/kafka-clusters/{cluster}/password. These use the common authenticated /v1 API, cluster permissions and node ownership checks. Password reset returns a generated password once with applied=false; wait for cluster password_status=applied before updating clients. An empty allowlist closes public client access.
Block volumes: list_volumes, attach_app_volume, detach_app_volume use the
same public API permissions and lifecycle as the dashboard. Attachment requires
a preformatted ext4 disk, one Firecracker backend replica and regional support.
Changing mounts restarts the app; detach preserves the volume and its billing.
get_s3_usage читает /v1/object-storage/usage с правами вызывающего. snapshot_at: null означает отсутствие замера размера, а не пустой бакет. egress_bytes_month и request_count_month относятся к traffic_month (UTC); счётчики поступают с задержкой.
Managed Supabase: separate protected endpoint
Connect ChatGPT to https://mcp.tatnet.cloud/supabase/mcp using OAuth. This endpoint
has its own protected-resource metadata and OAuth audience. It exposes only:
In ChatGPT on the web, open Plugins → Add → Add custom MCP server, enter the
URL above, and choose OAuth. Discovery and dynamic client registration are
automatic. Do not provide Studio passwords, anon, or service_role keys.
See the connection guide.
TatNet's database detail and Studio Connect → MCP show the same instructions.
Existing Studio applications receive the updated UI when opened from TatNet.
During OAuth consent, select an account, specific databases and read or write
access. Read is the default. Future databases are excluded. No app, billing or
infrastructure access is added. Read grants allow database data, including
sensitive rows accessible to the database owner; they are not limited by the
end-user RLS policies. Write access is database-owner authority, never cluster
superuser authority. There is no read-only SQL guarantee on execute_sql.
Revoke the connected app in the dashboard under API keys. API authorization rechecks the live membership and policy for every tool call, including after MCP authentication cache hits. Turning off a member's Supabase access also removes SQL access. Existing application OAuth grants are not extended to databases.
Default SQL limits: 30 seconds, 100 rows per statement; callers may lower the
timeout and request up to 1000 rows. SQL bodies are limited to 100 KB. Results
are bounded and values are text or JSON null (distinct from empty text).
Large values may be truncated. Use SQL pagination for large datasets.
query_database requires a row-returning statement (for example SELECT, SHOW or EXPLAIN).
It rejects multi-statement scripts, transaction-control commands and
writes hidden in SQL functions. A read-only transaction is not a sandbox for
arbitrary CPU work or extension side effects: timeouts, the constrained owner
role and the platform's extension/egress policy still apply.
execute_sql is marked destructive and non-idempotent. Clients must obtain user
confirmation for destructive SQL. The OAuth write grant is the server-side
permission boundary; MCP annotations are guidance, not an extra authorization
check. No automatic retries: after a timeout the outcome may be unknown. Inspect
the database before manually retrying. Multi-statement scripts can commit a
prefix if they explicitly manage transactions. Audit records include database,
actor, SQL fingerprint, limits and execution outcome, without SQL text or rows.
API keys also work as bearer tokens for non-OAuth MCP clients. Pin their policy
to supabase:<database UUID> with supabase:read and supabase:query; add
supabase:sql only for writes. Query and SQL actions require the creator's live
account:manage_supabase permission; metadata listing requires
account:view_supabase.
Operator rollout and verification
- Deploy
tatnet-supabase-controlwith privatePOST /v1/projects/{ref}/query. An older control returns an error for reads; there is no fallback to/sql. - Deploy API with
/v1/supabase,/query,/sql, the action catalog and the endpoint-specific consent policy. No database migration is required. - Deploy the auth frontend with explicit database selection and read default.
- Deploy MCP. Reuse the existing OAuth issuer, JWKS, internal secret and TLS
hosting configuration. Protected-resource metadata is at
/.well-known/oauth-protected-resource/supabase/mcp; DCR allows both resources.MCP_RESOURCE_URLScontinues to contain the application/mcpbase resources; the API derives the corresponding/supabase/mcpresources from them. - On a disposable managed database, connect ChatGPT through OAuth; verify
listing,
SELECT, read-mode write rejection and explicit write consent. Revoke the connection and verify the next tool request is denied. Never test destructive SQL against a customer database.
Do not expose Studio's /api/mcp, pg-meta or PostgreSQL as an alternative. This
implementation authenticates through TatNet and uses the same public API as CLI.
The regenerated Go SDK can be released independently; the new CLI commands use
the existing authenticated HTTP transport and do not require an unreleased SDK.
Production OAuth, all three database tools, and grant revocation were verified through ChatGPT on 2026-11-07 without changing application tables or rows. See validation and deployment evidence.
Kafka monitoring tools: kafka_health reads current replication/group lag;
kafka_history reads replication or selected consumer-group history;
kafka_monitoring_config sets per-group lag warnings (null lag_threshold
disables them, duration 60..3600 seconds in whole minutes). Configuration applies
asynchronously. Warnings appear in the console only. Unknown lag stays null;
committed-offset lag is not processing time. Existing scoped API permissions apply.
Valkey transport
create_valkey_cluster creates a paid instance with tls_mode defaulting to
required. preferred accepts TLS and plaintext on the same endpoint port;
disabled accepts plaintext only. Creation returns a password once: save it
securely. get_valkey_cluster returns the mode, readiness gate and applied
receipt. update_valkey_tls_mode changes intent through the public API; changing
to required closes plaintext sessions. Old nodes require replacement first,
reported as 409. Wait for parameters_applied before claiming completion.
All authorization, validation and audit decisions remain in the API.
來源:README.md,提交 5f7d494
工具
0版本歷史
7- v1.11.0最新Nov 12, 2026
- v1.8.0Nov 4, 2026
- v1.7.0Oct 29, 2026
- v1.4.5Oct 26, 2026
- v1.4.4Oct 22, 2026
- v1.1.1Oct 5, 2026
- v1.0.0Sep 29, 2026
評分
已滿足適用檢查項的 75%
該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。
- 近 30 天內可連通必需25 分
- 已宣告認證方式必需10 分
- 已列出工具15 分
請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。
- 描述必需15 分
- 圖示10 分
- 文件15 分
- 授權條款10 分
請在儲存庫或註冊中心條目中宣告授權條款。