termdesk
TermDesk
Кроссплатформенный десктопный клиент SSH + SFTP + VNC + RDP — терминалы с вкладками, потоковая передача файлов и удалённые рабочие столы (VNC через SSH, плюс нативный RDP) в одном окне.
Статус: выпущено — 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открывает рабочее приложение — никакой проверки лицензии, ни лицензионных мест, ни учётных записей. Полную настройку разработки, включая шаг с ABIbetter-sqlite3, необходимый перед запускомnpm test, см. вCONTRIBUTING.md.
Скрипт | Что делает |
| dev-сервер electron-vite + окно Electron |
| предварительная проверка: Node, тулчейн, ABI better-sqlite3, связка ключей Linux |
| проверка типов (строгий TS) + продакшен-сборка в |
| проверка biome (форматирование + линт) |
| vitest (юнит + интеграционные) |
| vitest с покрытием v8 |
| сборка + 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 |
|
|
VNC |
|
|
E2E smoke-тесты
Пять автономных end-to-end наборов запускаются внутри настоящего приложения Electron (первые четыре — против docker-контейнера; набору MCP внешние сервисы не нужны). Каждый при успехе печатает маркер *_OK:
Command | Что проверяет | Проверенный результат |
| Секреты шифруются через |
|
| Реальные входы с паролем, ключом и ключом + зашифрованная парольная фраза |
|
| Загрузка и скачивание 1 ГБ с мониторингом RSS (пик 259 МБ — в пределах бюджета 300 МБ) и загрузка папки из 500 файлов |
|
| RFB-рукопожатие как напрямую, так и через SSH-туннель; подключения с поддельным токеном отклоняются; токены одноразовые |
|
| MCP-сервер с токен-гейтом запускается на loopback; поддельный bearer-токен отклоняется |
|
✅ Тестирование
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 для актуальных цифр):
Высокое (по строкам):
shared97,1% — контракт Zod IPC, от которого зависит каждый процесс, —renderer/lib97,5%,main/store81,4% (db, hosts-repo, settings и snippets-repo на уровне 100% или около того),ssh-util100%, парсер~/.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 | Действие |
| Палитра команд (нечёткий поиск хостов + команды) |
| Новая сессия (открывает палитру) |
| Закрыть активную вкладку |
| Поиск в терминале |
| Копировать/вставить в терминале |
⚙️ Настройки
Тема (тёмная, светлая или системная — в соответствии с 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 вместе с остальным исходным кодом.
This server cannot be installed
Maintenance
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
Governed MCP gateway: one endpoint for your tools, with credential custody and audit log.
Scoped, audited SSH exec, sessions, and SFTP on your saved servers without exposing credentials
An authenticated remote MCP server for user-owned devices and one-shot capability invocation.
Authenticated MCP server for ClearPolicy policy and compliance workflows.
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceEnables SSH interactive session management through MCP, supporting commands, menus, and session lifecycle operations.1
- AlicenseAqualityDmaintenanceProvides a governed command plane for MCP agents to manage PostgreSQL databases, SSH sessions, and HTTP APIs with encrypted credential storage and prescriptive workflows.3MIT
- AlicenseNot gradedqualityBmaintenanceMCP 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
- AlicenseNot gradedqualityBmaintenanceEnables AI clients to securely execute remote commands and transfer files over SSH through standardized MCP tools, with multi-host management, flexible authentication, and an admin console.ISC
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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