Skip to main content
Glama
konraddzbik

termdesk

by konraddzbik

TermDesk

Кроссплатформенный десктопный клиент SSH + SFTP + VNC + RDP — терминалы с вкладками, потоковая передача файлов и удалённые рабочие столы (VNC через SSH, плюс нативный RDP) в одном окне.

Electron React TypeScript CI License

Статус: выпущено — SSH-терминал, SFTP, VNC через SSH, нативный RDP, доступ к MCP-агентам, менеджер SSH-туннелей, автоматизация флота, локальные терминалы с выбором терминальной программы (login shell / tmux / Zellij / screen / альтернативные оболочки), Prompt Book + запланированные Routines, настройки, палитра команд и сборка.


✨ Возможности

  • 🖥️ Гибкие хосты — при создании можно указать только SSH, только VNC или комбинированные хосты. SSH и VNC опциональны независимо друг от друга. Чисто VNC-хосты поддерживают прямое TCP-подключение или подключение через SSH-туннель (с понятной ошибкой, если попытаться использовать туннель без SSH-учётных данных). Действия в интерфейсе, палитра команд и кнопки проверки адаптируются под тип хоста.

  • 🖥️ SSH-терминал с вкладками — xterm.js (WebGL) с поиском, копированием/вставкой, изменением размера; множество параллельных сессий к одним и тем же или разным хостам. Ранний вывод буферизуется до подключения терминала, поэтому MOTD/баннеры не теряются.

  • 📁 SFTP с потоковой очередью передачи — удалённый файловый браузер, перетаскивание (рекурсивная загрузка папок), потоковая передача по частям с постоянным потреблением памяти, отмена/повтор, редактирование на месте с автоматической загрузкой при сохранении.

  • 🔒 VNC через SSH — noVNC отображается прямо в приложении и подаётся через loopback-мост WebSocket, защищённый одноразовыми токенами на 30 секунд; по умолчанию используется SSH-туннель forwardOut, поэтому порт 5900 никогда не открывается наружу. Для VNC-хостов также поддерживается прямой режим.

  • 🖥️ RDP — подключение к Windows/RDP-хостам прямо в приложении через WASM-клиент IronRDP, работающий через внутрипроцессный прокси RDCleanPath (та же схема, что и у VNC-моста: одноразовые токены на 30 секунд, проверка origin, завершение TLS), с закреплением сертификата сервера по принципу trust-on-first-use.

  • 🔐 Зашифрованное хранилище — хосты, группы, сниппеты и известные хосты в SQLite; пароли/кодовые фразы шифруются с помощью safeStorage на базе системной связки ключей в тот момент, когда попадают в главный процесс.

  • 🛡️ Проверка ключа хоста — диалог подтверждения SHA256-отпечатка при первом подключении, жёсткая блокировка при смене ключа того же типа и отдельное громкое предупреждение о «возможной атаке man-in-the-middle», когда известный хост предъявляет ключ/тип, которому для него никогда не доверяли.

  • 🪜 ProxyJump — многохоповые цепочки (user@jump:port,next) через последовательные forwardOut.

  • 🔌 Менеджер SSH-туннелей — создавайте, сохраняйте и запускайте/останавливайте локальные (-L) пробросы портов и динамические SOCKS5 (-D) прокси с боковой панели, с индикатором статуса в реальном времени и пропускной способностью. По возможности переиспользует подключение открытого терминала; безопасен, привязан к владельцу, логируется. См. docs/TUNNELS.md.

  • 🪟 Разделённые панели — просмотр двух сессий рядом или друг под другом (Alt-клик по вкладке или кнопка на панели разделения), с перетаскиваемым разделителем. Отлично сочетается с автоматизацией на нескольких хостах для живой сетки мониторинга.

  • 💻 Локальные терминалы — вкладки оболочки node-pty на вашей машине с сохранёнными рабочими каталогами — SSH не требуется. При подключении учитывается заданный для хоста удалённый путь по умолчанию.

  • 🧩 Выбор терминальной программы — укажите, что запускается при открытии терминала (Settings → General): ваша оболочка входа по умолчанию, мультиплексор (tmux, Zellij, GNU Screen — сохраняется между перезапусками/отключениями) или альтернативная оболочка (bash, zsh, fish, PowerShell, Nushell). Можно выбрать только программы, обнаруженные на вашей машине; выбор применяется и к локальным терминалам, и к SSH-сессиям (на удалённой стороне запускается, если доступна, иначе обычная оболочка).

  • 🚀 Открыть во внешнем терминале — передайте текущий каталог вашему любимому GUI-терминалу — Ghostty, Warp, iTerm2, kitty, Alacritty, WezTerm, GNOME Terminal, Konsole, Windows Terminal — обнаруженному на вашей машине, с сохранённым значением по умолчанию (Settings → General), через ⌘K или кнопку в один клик на любой вкладке локального терминала.

  • Автоматизация флота — запуск сниппета или команды сразу на целой группе SSH-хостов с потоковым выводом по каждому хосту в реальном времени.

  • 🕘 Журнал активности — локальная хронология подключений/отключений, открытий SFTP/VNC и запусков автоматизации. Только метаданные: токены команд, содержащие секреты, редактируются, а записи удаляются через 90 дней.

  • 🎨 Цветовые схемы терминала — встроенные Dracula, Solarized Dark, Gruvbox, One Dark, Nord (плюс стандартная), на ваш вкус.

  • 🧱 Настраиваемая боковая панель — показывайте или скрывайте каждый раздел левой боковой панели (Hosts, Local terminals, Workspaces, Tunnels, Snippets, Prompt Book, Routines) в Settings → General или через кнопку Customize на самой панели. Ваш выбор сохраняется; по умолчанию видно всё.

  • 🧩 Prompt Book — переиспользуемые шаблонные промпты для AI-агентов. Промпты — это обычный текст с плейсхолдерами {{variable}} (опционально {{name:default}} / {{name|description}}); при запуске запрашиваются значения, показывается живой предпросмотр, и готовый текст либо отправляется в активный терминал (SSH или локальный), либо запускается в AI-агенте — Claude Code, Aider, OpenCode, Codex или Gemini — в выбранном вами каталоге. Шаблонизация — это чистая подстановка (без eval), а промпт передаётся одним аргументом в кавычках, поэтому метасимволы оболочки в нём инертны.

  • 🔁 Routines — сохранённые задания вида «запустить этот промпт через этого агента в этом каталоге», выполняемые по требованию или по расписанию (интервал / ежедневно / cron), каждое со своей историей запусков. Routines выполняются, пока TermDesk открыт, а пропущенный при закрытом приложении запуск догоняется один раз при следующем старте, а не навёрстывает каждый пропущенный слот. Автономная работа без присмотра включается явно и по умолчанию выключена; сохранённые сводки запусков очищаются от секретов.

  • 📋 Snippets — сохранённые команды, отправляемые в активную сессию.

  • ⌨️ Палитра команд⌘/Ctrl+K нечёткий поиск хостов + все команды (терминалы, SFTP, VNC, автоматизация, журналы); нажмите ? для шпаргалки по горячим клавишам.

  • ⚙️ Настройки — тема (тёмная / светлая / System, следующая за ОС), шрифт терминала + цветовая схема, поведение вставки по правому клику, SSH keepalive; обычный JSON, никогда — секреты.

  • 🤖 Доступ для AI-агентов (MCP) — позвольте Claude, Cursor, Grok или любому MCP клиенту использовать TermDesk: просматривать хосты, запускать команды, рассылать задания по флоту. Агент получает руки, но не ключи — учётные данные остаются в главном процессе, каждое действие требует явного согласия по хосту, подтверждения и отображается в реальном времени в журнале AI Activity. По умолчанию выключено. См. docs/MCP-INTEGRATION.md.

  • 🏠 Local-first — ваши хосты, ключи и история никогда не покидают вашу машину; никакой обязательной облачной учётки, никакой телеметрии.

Related MCP server: SentryFrogg MCP Server

🏗 Архитектура

Вся логика SSH/SFTP/VNC живёт в главном процессе. Рендерер полностью изолирован (contextIsolation: true, nodeIntegration: false, sandbox: true) и общается с ним только через типизированный IPC-контракт с валидацией Zod (src/shared/ipc.ts).

flowchart LR
    subgraph R["Renderer (sandboxed, no Node)"]
        UI["React 19 UI<br/>zustand stores"]
        XT["xterm.js<br/>terminal"]
        NV["noVNC<br/>RFB client"]
    end

    subgraph M["Main process"]
        IPC["Typed IPC<br/>Zod-validated contracts"]
        SM["SessionManager<br/>(ssh2: shell, agent,<br/>keys, ProxyJump)"]
        SF["SftpManager +<br/>TransferManager<br/>(streaming queue)"]
        WB["ws-bridge<br/>127.0.0.1, random port,<br/>single-use 30s tokens"]
        VA[("Vault<br/>better-sqlite3 + Drizzle<br/>secrets via safeStorage")]
    end

    RH[("Remote host<br/>sshd · sftp · vncserver")]

    UI <-->|"invoke/handle"| IPC
    XT <-->|"ssh:data:#lt;sessionId#gt; stream"| IPC
    IPC <--> SM
    IPC <--> SF
    SM --- VA
    SF --- SM
    NV -->|"ws://127.0.0.1:#lt;port#gt;/#lt;token#gt;"| WB
    WB -->|"variant B (default):<br/>ssh2 forwardOut → :5900"| SM
    WB -.->|"variant A (opt-in):<br/>direct TCP → :5900"| RH
    SM <-->|"SSH"| RH

Два намеренных исключения из правила «секреты остаются в главном процессе»: сохранённый пароль VNC (для RFB-рукопожатия учётных данных) и сохранённый пароль RDP (для клиента IronRDP) расшифровываются в главном процессе и возвращаются рендереру. Ни тот, ни другой сейчас не привязаны к открытой вкладке и не ограничены по частоте — см. Известные ограничения.

🚀 Быстрый старт

TermDesk сейчас запускается из исходников. У konraddzbik/termdesk нет тегов и GitHub Releases, поэтому со страницы Releases пока нечего скачивать — см. INSTALL.md.

Вам понадобятся Node.js >=22.12.0 и npm 10+, а также C/C++ тулчейн (Xcode Command Line Tools / build-essential / Visual Studio C++ build tools), чтобы скомпилировались нативные модули. В Linux также нужна разблокированная системная связка ключей (gnome-libsecret или kwallet) — TermDesk закрывается при ошибке, а не использует небезопасный запасной вариант Electron basic_text, поэтому без неё вы не сможете сохранить пароль хоста (SECURITY.md).

npm install        # also applies the better-sqlite3 patch + rebuilds native deps
npm run dev        # electron-vite dev server + Electron window, HMR

Первый запуск: npm install && npm run dev открывает рабочее приложение — никакой проверки лицензии, ни лицензионных мест, ни учётных записей. Полную настройку разработки, включая шаг с ABI better-sqlite3, необходимый перед запуском npm test, см. в CONTRIBUTING.md.

Скрипт

Что делает

npm run dev

dev-сервер electron-vite + окно Electron

npm run doctor

предварительная проверка: Node, тулчейн, ABI better-sqlite3, связка ключей Linux

npm run build

проверка типов (строгий TS) + продакшен-сборка в out/

npm run lint / lint:fix

проверка biome (форматирование + линт)

npm test

vitest (юнит + интеграционные)

npm run test:coverage

vitest с покрытием v8

npm run dist

сборка + electron-builder (dmg / NSIS / AppImage)

npm run dist создаёт неподписанный установщик для ОС хоста (dist/TermDesk-<version>-arm64.dmg на macOS с Apple Silicon, плюс кросс-собранный x64 .dmg). Он ничего не публикует. Настройку из исходников, имена локальных артефактов и то, как будет выпускаться будущий GitHub Release, см. в INSTALL.md.

🧪 Тестовое окружение для разработки

Один Docker-контейнер предоставляет SSH + TigerVNC для локального тестирования — реальные серверы не нужны:

npm run test:keys                                  # throwaway SSH keys (untracked)
docker compose -f docker-compose.test.yml up -d

Сервис

Адрес

Учётные данные

SSH

127.0.0.1:2222

testuser / testpass123 или сгенерированные ключи в .test/ (test_key, test_key_enc)

VNC

127.0.0.1:5901 (напрямую или через SSH-туннель — тот же контейнер)

testvncpass

E2E smoke-тесты

Пять автономных end-to-end наборов запускаются внутри настоящего приложения Electron (первые четыре — против docker-контейнера; набору MCP внешние сервисы не нужны). Каждый при успехе печатает маркер *_OK:

Command

Что проверяет

Проверенный результат

TERMDESK_SMOKE=vault npx electron .

Секреты шифруются через safeStorage перед сохранением; в SQLite нет открытого текста; рендереру никогда не возвращаются

VAULT_SMOKE_OK

TERMDESK_SMOKE=ssh npx electron .

Реальные входы с паролем, ключом и ключом + зашифрованная парольная фраза

SSH_SMOKE_OK

TERMDESK_SMOKE=sftp npx electron .

Загрузка и скачивание 1 ГБ с мониторингом RSS (пик 259 МБ — в пределах бюджета 300 МБ) и загрузка папки из 500 файлов

SFTP_SMOKE_OK

TERMDESK_SMOKE=vnc npx electron .

RFB-рукопожатие как напрямую, так и через SSH-туннель; подключения с поддельным токеном отклоняются; токены одноразовые

VNC_SMOKE_OK

TERMDESK_SMOKE=mcp npx electron .

MCP-сервер с токен-гейтом запускается на loopback; поддельный bearer-токен отклоняется

MCP_SMOKE_OK

✅ Тестирование

npm test                # unit + integration suite (vitest) — all green on main
npm run test:coverage   # v8 line coverage report into coverage/

Vitest запускает тесты рендерера в jsdom (Testing Library), а всё остальное — в node. Покрытие сконцентрировано там, где это важно: чистая логика покрыта хорошо, а процессная «склейка» и UI-оболочки покрываются пятью e2e-смоук-тестами вместо юнит-тестов (проценты ниже ориентировочные, не фиксированные — запустите npm run test:coverage для актуальных цифр):

  • Высокое (по строкам): shared 97,1% — контракт Zod IPC, от которого зависит каждый процесс, — renderer/lib 97,5%, main/store 81,4% (db, hosts-repo, settings и snippets-repo на уровне 100% или около того), ssh-util 100%, парсер ~/.ssh/config и его резолвер Include — в верхних 90-х.

  • Низкое, покрытое смоук-тестами: клей обработчиков main/ipc — 9,8%, session-manager и sftp-manager/transfer-manager — 0%, vnc-manager и UI-оболочки (SftpTab, TerminalView, VncTab, layout и боковые панели) — низкое или нулевое. Это процессная «склейка» и Electron/DOM-оболочки; харнессы TERMDESK_SMOKE прогоняют их end-to-end против реального сервера. Точки входа и файлы *-smoke.ts исключены из покрытия конфигом.

Сборка + typecheck + lint проходят чисто, а запуск dev-режима с окном не выдаёт ни одной строки ошибок.

⌨️ Горячие клавиши

Shortcut

Действие

⌘/Ctrl+K

Палитра команд (нечёткий поиск хостов + команды)

⌘/Ctrl+T

Новая сессия (открывает палитру)

⌘/Ctrl+W

Закрыть активную вкладку

⌘/Ctrl+F

Поиск в терминале

⌘/Ctrl+Shift+C/V

Копировать/вставить в терминале

⚙️ Настройки

Тема (тёмная, светлая или системная — в соответствии с prefers-color-scheme ОС), размер/семейство шрифта терминала, интервал keepalive SSH — хранятся как обычный JSON в userData/settings.json (никогда не секреты).

📡 Детали функций

SSH-терминал

  • Вся логика ssh2 живёт в основном процессе (src/main/ssh/session-manager.ts); рендерер видит только типизированный stream-API. Вывод стримится на ssh:data:<sessionId>; ранний вывод буферизуется, пока терминал не подключится.

  • Аутентификация: пароль из хранилища (с фолбэком keyboard-interactive), приватный ключ (+ зашифрованная парольная фраза) или SSH-агент (SSH_AUTH_SOCK, Windows OpenSSH pipe). Секреты расшифровываются только в момент подключения.

  • Ключи хостов: при первом подключении показывается диалог подтверждения SHA256-отпечатка, ключ сохраняется в таблицу known_hosts; несовпадение жёстко блокирует подключение.

  • Цепочки ProxyJump (user@jump:port,next) через последовательные forwardOut; keepalive 15 с.

SFTP

  • SFTP-сессии переиспользуют живое SSH-подключение открытого терминала к тому же хосту (без второго входа) и переключаются на выделенное подключение без шелла.

  • Передачи стримятся по частям (постоянная память — 1 ГБ проверено при RSS ниже 300 МБ) и могут быть отменены/повторены; перетаскивание папок загружает рекурсивно с сохранением структуры.

  • Редактирование на месте скачивает во временный файл, открывает редактор ОС и автоматически загружает обратно при сохранении.

VNC

  • noVNC рендерится в рендерере; он общается по WebSocket с мостом в основном процессе, привязанным к 127.0.0.1 на случайном порту. Каждое подключение требует одноразовый токен на 30 с — другие локальные процессы не могут воспользоваться мостом (отсюда ws://127.0.0.1:* в CSP).

  • Транспорт по умолчанию — канал SSH forwardOut (вариант B — порт 5900 никогда не открывается наружу), переиспользующий живое терминальное подключение к хосту, если оно есть; обычный TCP (вариант A) включается опционально для каждого хоста.

  • Сохранённые пароли VNC и RDP расшифровываются в основном процессе и возвращаются в рендерер для соответствующих клиентов — два задокументированных исключения из правила «секреты остаются в основном процессе».

  • Панель инструментов: переключатели локального масштабирования / удалённого изменения размера, вставка из буфера обмена, Ctrl+Alt+Del, полноэкранный режим, переподключение (каждое переподключение выдаёт свежий токен + туннель).

Хранилище (Vault)

  • Хосты, группы, сниппеты и known_hosts хранятся в SQLite (better-sqlite3 + Drizzle) в каталоге userData приложения.

  • Пароли/парольные фразы шифруются с помощью safeStorage (ключ из связки ключей ОС) в основном процессе в момент поступления; базу данных касаются только блобы шифротекста, и секреты никогда не отправляются обратно в рендерер.

  • Импорт ~/.ssh/config разбирает Host/HostName/Port/User/IdentityFile/ProxyJump, разрешает директивы Include (пути с тильдой, относительные/абсолютные пути и глобы, с защитой от циклов/глубины/размера) и объединяет значения по умолчанию из Host */wildcard в конкретные хосты, используя порядок OpenSSH «первый полученный побеждает».

🔐 Чек-лист безопасности

  • contextIsolation: true, nodeIntegration: false, sandbox: true — рендерер и preload никогда не касаются Node.

  • Строгий CSP через meta-тег: script-src 'self', без unsafe-eval, без удалённых модулей; connect-src разрешает только 'self' и loopback WebSockets (мост VNC с токен-гейтом). Ослабление только для dev-режима происходит через Vite-плагин, который громко падает при расхождении.

  • webSecurity: true; навигация проверяется по origin; window.open запрещён (внешние https: → системный браузер); <webview> заблокирован; запросы разрешений отклоняются по умолчанию.

  • Каждая IPC-нагрузка валидируется с помощью Zod (src/shared/ipc.ts — единый контракт); результаты invoke типизированы end-to-end через IpcInvokeMap.

  • Секреты (пароли SSH/VNC, парольные фразы ключей) шифруются с помощью safeStorage в основном процессе в момент поступления; сохраняется только шифротекст; расшифровка происходит в момент подключения, и ссылки немедленно удаляются. Проверено через TERMDESK_SMOKE=vault. Два задокументированных исключения: пароли VNC и RDP передаются в рендерер для клиентов соответствующих протоколов (см. Известные ограничения).

  • Ошибки, пересекающие IPC, санируются (только первая строка, без стеков/путей); секреты никогда не логируются.

  • Сессии, SFTP-дескрипторы, передачи и запросы ключей хостов привязаны к WebContents, который их создал, и уничтожаются при его разрушении.

  • Ключи хостов: подтверждение SHA256-отпечатка при первом подключении, жёсткая блокировка при несовпадении — для конечной цели и каждого перехода ProxyJump.

  • Журнал активности содержит только метаданные: имя пользователя ОС, токены команд с секретами вырезаются, очистка раз в 90 дней.

  • Опциональный мастер-пароль (второй слой шифрования на основе Argon2id) — отложено, отслеживается как будущее улучшение.

Полную модель безопасности, известные ограничения и политику раскрытия уязвимостей см. в SECURITY.md.

📂 Структура проекта

src/
  main/                  # Electron main process — all SSH/SFTP/VNC logic lives here
    ipc/                 # IPC handlers per domain (ssh, sftp, vnc, hosts, …)
    ssh/                 # session-manager, ssh-config-parser, ssh-util (+ smoke)
    sftp/                # sftp-manager, transfer-manager, edit-watch (+ smoke)
    vnc/                 # ws-bridge, vnc-manager (+ smoke)
    store/               # Drizzle + better-sqlite3, secrets (safeStorage), settings
  preload/               # contextBridge — typed, minimal API surface (window.api)
  renderer/              # React UI (no Node access)
    components/{layout,hosts,terminal,sftp,vnc,snippets,ui}/
    hooks/  stores/  lib/
  shared/                # IPC channel contracts + Zod schemas shared by all processes

🗺 Известные ограничения / дорожная карта

  • Мастер-пароль — опциональный второй слой шифрования на основе Argon2id поверх хранилища; отложено.

  • Смоук-тест Playwright (запуск приложения → добавление хоста → имитация подключения) — отложен; пять харнессов TERMDESK_SMOKE покрывают e2e уже сегодня.

  • Импорт ~/.ssh/config — блоки Match и подстановка токенов (%h/%p) по-прежнему пропускаются; импорт инвентаря облачных провайдеров (AWS/GCP) не реализован.

Дорожную карту усиления безопасности см. в SECURITY.md.

🔧 Заметки о нативных модулях

  • better-sqlite3 требует патча исходников для компиляции под V8 от Electron (готовых пребилтов пока нет) — применяется автоматически через patch-package при npm install (patches/better-sqlite3+12.10.0.patch).

  • cpu-features (опциональная нативная зависимость ssh2) заменён на noop2 в package.json, чтобы избежать лишней нативной сборки; ssh2 использует свой чисто-JS путь.

🤝 Участие в разработке

Issues и pull request'ы приветствуются. План поставки для установки сторонними пользователями, пакетов и настройки контрибьюторов — в docs/OSS-DELIVERY-PLAN.md. CONTRIBUTING.md содержит настройку окружения для разработки — включая две ловушки с нативными модулями, которые иначе стоят вам полдня, — инварианты, которые должен соблюдать новый код, и чек-лист перед PR. Вклад распространяется по принципу inbound=outbound MIT: без CLA, без передачи авторских прав.

Участие регулируется Кодексом поведения. Проблемы безопасности сообщаются через приватный канал, описанный в SECURITY.md, и никогда через публичный issue.

📄 Лицензия

Исходный код в этом репозитории распространяется под лицензией MIT — см. LICENSE. Вы можете использовать, изменять и распространять его, в том числе в коммерческих целях, при условии, что уведомление об авторских правах и текст лицензии передаются вместе с ним.

Когда на странице Releases появятся готовые установщики, на них дополнительно распространяется EULA.txt, который регулирует эти бинарники. Сейчас GitHub Releases нет, поэтому сборка, которую вы делаете сами из этого исходного кода, регулируется только LICENSE.

В этом клиенте нет проверки лицензии, активации рабочих мест или аккаунта: коммерческая подсистема лицензирования была удалена при публикации исходного кода, поэтому то, что вы собираете из этого репозитория, — это полное приложение.

Эта граница обеспечивается в коде, а не только описана здесь: запрос EULA при первом запуске компилируется только в собственные релизные сборки проекта, поэтому npm run dist форка, дистрибутивный пакет или ваш собственный установщик никогда его не показывают.

Сторонние зависимости сохраняют свои собственные лицензии, перечисленные в THIRD-PARTY-NOTICES.md. Одна из них несёт обязательство, которое стоит назвать: @novnc/novnc распространяется под MPL-2.0, и этот репозиторий патчит его (patches/@novnc+novnc+1.7.0.patch), поэтому данная модификация публикуется здесь под MPL-2.0 вместе с остальным исходным кодом.

Maintenance

ActivityMaintained
ResponsivenessResponsive

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

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

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables SSH interactive session management through MCP, supporting commands, menus, and session lifecycle operations.
    1
  • A
    license
    Not graded
    quality
    B
    maintenance
    MCP server that provides SSH tools (read-only probes and arbitrary exec) to a fleet of hosts outside Kubernetes, with an inventory-based allowlist and key-based authentication.
    MIT

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/konraddzbik/termdesk'

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