Aki MCP (local connector)

by lacvietanh (community) · Claude.ai, ChatGPT, Grok, Gemini, Windows, macOS, Linux

MCP MCP Servers Open Source v1.10.0 · 21.08.2026 активный

Кастомный MCP-коннектор для веб-чатов AI (Claude, ChatGPT, Grok...) — работа с файлами/shell прямо на вашем компьютере.

v1.10.0
21.08.2026 current

Установка
# Вариант 1: автономный пакет (Node.js не нужен) — скачать лаунчер из последнего релиза
# macOS: дважды щёлкните aki-mcp-sv-<version>-macos.command (или запустите его из терминала)
# Windows: дважды щёлкните aki-mcp-sv-<version>-windows.cmd
chmod +x aki-mcp-sv-<version>-linux.run && ./aki-mcp-sv-<version>-linux.run

# Вариант 2: установка из исходников (требуется Node.js)
git clone <repo-url> aki-mcp-sv
cd aki-mcp-sv
npm install
показать оригинал переведено ИИ

aki-mcp-sv

Предоставьте Claude в веб-версии (claude.ai), ChatGPT и Grok доступ на чтение/редактирование файлов и работу с разрешённым шеллом на вашем локальном компьютере. Работает по HTTPS через сменяемый публичный край (по умолчанию Tailscale Funnel или ваш собственный Cloudflare Tunnel / любой стабильный HTTPS-край), защищённый OAuth 2.1. (Экспериментальная поддержка Gemini — см. Подключение из Grok и Gemini.)

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

aki-mcp-sv control panel

Version License: MIT Platform

Содержание: Зачем это нужно · Когда использовать и основные сценарии · Установка · Запуск · Подключение из веб-версии Claude · Подключение из ChatGPT · Подключение из Grok и Gemini · Автономная облачная автоматизация · Требования · Архитектура · Структура каталогов · Конфигурация · Публикация в интернете · Поиск файлов · Безопасность

Зачем это нужно

Квота веб-версии/Pro на claude.ai значительно дешевле, чем оплата за токен через API при эквивалентном использовании. Однако большая часть реальной работы связана с проектами: чтение, редактирование и выполнение команд с файлами на вашем компьютере, а не просто открытый чат.

Десктопное приложение Claude уже предоставляет доступ к локальным файлам, но привязывает использование к идентификатору устройства, который вы не контролируете, а работа с несколькими аккаунтами требует постоянного входа/выхода. Этот веб-подход даёт настоящую гибкость работы с несколькими аккаунтами: просто переключайте профили браузера, чтобы использовать разные аккаунты (например, несколько подписок Claude Pro), все направленные на один и тот же локальный компьютер, без привязки к устройству.

aki-mcp-sv решает обе проблемы: запустите MCP-сервер на своём компьютере, опубликуйте его по HTTPS через Tailscale Funnel и подключите к claude.ai как пользовательский коннектор.

Преимущества: - Используйте свою веб-квоту для доступа к локальным файлам и шеллу прямо из браузера. - Настоящая гибкость работы с несколькими аккаунтами: переключайте профили браузера, чтобы мгновенно использовать другой аккаунт, все направленные на одну и ту же машину. - Безопасность по умолчанию: строгий белый список команд, а не уязвимый чёрный список — см. Безопасность.

Когда использовать и основные сценарии

  • За рабочим столом: родной терминал/CLI (Claude Code, Antigravity CLI, Cursor) всё ещё остаётся самым быстрым и удобным вариантом — используйте его.
  • Вдали от рабочего стола (мобильные устройства / веб / чужой компьютер): используйте aki-mcp-sv через Claude Web, ChatGPT Mobile или Grok, чтобы проверить выполнение задачи, прочитать логи, очистить временные файлы или получить последнюю версию кода на своём домашнем/рабочем компьютере.
  • По расписанию, без наблюдения: сочетайте запланированные промпты Grok с aki-mcp-sv для запуска локальных задач по облачному триггеру — см. Автономная облачная автоматизация.

Установка

[!NOTE] Безопасно ли это запускать? Автономные лаунчеры распаковывают приватный Node.js и приложение строго в каталог данных приложения для текущего пользователя ОС (~/Library/Application Support/aki-mcp-sv на macOS, %LOCALAPPDATA%\aki-mcp-sv на Windows, ${XDG_DATA_HOME:-~/.local/share}/aki-mcp-sv на Linux); ваши настройки/токены хранятся отдельно в ~/.aki/mcpsv/. Ничего не устанавливается системно, не создаётся фоновый сервис или демон, не требуются права sudo/администратора. Инструмент шелла доступен только для чтения по умолчанию (см. Безопасность). Закрытие окна терминала полностью останавливает сервер.

Вариант 1: Автономный пакет (рекомендуется — не требуется Node.js)

Скачайте лаунчер для своей ОС из последнего релиза — не кнопку "Code" с "Download ZIP" выше, это просто исходный код, который не запустится:

  • macOS: дважды кликните на aki-mcp-sv-<версия>-macos.command (или запустите из Терминала)
  • Linux: chmod +x aki-mcp-sv-<версия>-linux.run && ./aki-mcp-sv-<версия>-linux.run (скачанные файлы по умолчанию не исполняемые)
  • Windows: дважды кликните на aki-mcp-sv-<версия>-windows.cmd — всё ещё требуется Git для Windows (или WSL) в PATH, см. Требования

Обработка предупреждений безопасности ОС при первом запуске — ожидаемо для лаунчера без цифровой подписи, не признак проблем: - Предупреждение браузера при загрузке (Chrome/Edge/Safari помечают .command/.cmd/.run как нераспространённый тип файла): нажмите "Сохранить"/"Загрузить в любом случае". - macOS Gatekeeper ("невозможно открыть, так как разработчик не может быть проверен"): щёлкните правой кнопкой мыши по файлу .command → Открыть один раз для обхода. Если этой опции нет (macOS 15+ убрали её), откройте Системные настройки → Конфиденциальность и безопасность, прокрутите вниз и нажмите Открыть в любом случае — или сначала выполните xattr -d com.apple.quarantine <путь-к-файлу> в Терминале, что работает на всех версиях macOS. - Windows SmartScreen ("Windows защитил ваш ПК"): нажмите Подробнее, затем Всё равно запустить.

Замечания по работе: - Первый запуск загружает и проверяет контрольную сумму среды выполнения Node + полезной нагрузки приложения; последующие запуски используют уже загруженное, поэтому стартуют быстро и не требуют доступа к сети. - Чтобы запустить снова позже (после перезагрузки или закрытия терминала): запустите тот же самый файл лаунчера — он всё ещё находится в папке Загрузки. - Не закрывайте окно терминала/консоли — это работающий сервер, а не просто журнал прогресса. Закрытие останавливает всё, включая панель управления и любое активное соединение.

Вариант 2: Установка из исходников (требуется Node.js)

git clone <repo-url> aki-mcp-sv
cd aki-mcp-sv
npm install

Затем см. раздел Запуск ниже.

Запуск

Автономный пакет: лаунчер уже запустил сервер за вас — не нужно вводить команды. Всё ниже (что выводится в консоль, что показывает панель управления, доступ к папкам по умолчанию) относится и к вам, поэтому пробегитесь глазами перед переходом к разделу Подключение из веб-версии Claude.

Путь через клон репозитория Git:

cp .env.example .env   # optional: only if you need PUBLIC_ORIGIN or another non-default var
npm start

Ничего не нужно подготавливать заранее; npm start всё обрабатывает: - Парольная фраза и ID/секрет клиента OAuth в ~/.aki/mcpsv/: генерируются один раз, используются при каждом последующем запуске. - Funnel: проверяет tailscale funnel status; если порт 9999 ещё не включён, выполняет tailscale funnel --bg 9999 (идемпотентно: никогда не переключает уже включённый порт). - Выводит 4 необходимых значения: URL удалённого MCP-сервера, ID клиента OAuth, Секрет клиента OAuth (вставьте в claude.ai) и Парольную фразу (введите на странице подтверждения при нажатии Подключить). - Открывает панель управления по адресу http://127.0.0.1:9998/?t=<токен>. Заголовок шага отображает последовательность (0 Настройка · 1 Коннекторы · 2 Установка правил · 3 Инструкции · 4 Расширение), затем следуют разделы: 0 Настройка (выбор входа из 3 вкладок: Tailscale + Funnel / Собственный публичный источник / Хостинговый домен), 1 Коннекторы, 2 Установка akidevrule, 3 Инструкции для запроса, 4 Утилиты браузера, 5 Разрешённые папки, 6 Белый список оболочки.

Корневой каталог по умолчанию — это ваша домашняя директория ($HOME или %USERPROFILE% в Windows): единственная папка, гарантированно существующая на любой машине и содержащая проекты, к которым вы действительно хотите предоставить доступ Claude. Проще говоря, это означает всю домашнюю папку (Рабочий стол, Документы, Загрузки, Фото, всё внутри неё), а не только проекты, которыми вы собирались поделиться. Добавьте/удалите папки в разделе 5 панели: нажмите "+ Добавить папку…" и введите абсолютный путь (/Users/you/projects или C:\Users\you\projects). Сохранение вступает в силу немедленно для всех инструментов — оболочки, поиска, чтения/записи/редактирования файлов — без перезапуска. Чтобы изменить корневую директорию с самого начала: MCP_DATA_DIR=/другой/путь npm start (или set MCP_DATA_DIR=D:\work, затем npm start в командной строке Windows).

Помимо $MCP_DATA_DIR, инструменты файловой системы также получают доступ к ~/.aki (куда развёртывается akidevrule) и ~/.claude, поэтому claude.ai может читать ваш родной CLAUDE.md и маршрутизатор навыков так же, как это делает Claude Code, без копирования или промежуточного хранения.

~/.claude предоставляется на уровне папки (инструменты файловой системы не могут ограничиваться отдельными файлами), поэтому .claude.json/auth-cache.json (токены сеанса) и history.jsonl (история чата) внутри неё также доступны через коннектор. Эта строка заблокирована в разделе 5 панели без кнопки удаления по замыслу, чтобы её нельзя было случайно отозвать; сама панель не может её убрать. Если вы не хотите предоставлять доступ к ~/.claude вообще, отредактируйте ~/.aki/mcpsv/setting.json и удалите запись ~/.claude из списка folders до подключения; тогда claude.ai потеряет доступ и к вашему CLAUDE.md.

npm start работает в foreground-режиме: Ctrl+C для остановки, перезапуск вручную при необходимости. После редактирования кода снова выполните Ctrl+C и npm start (Node не поддерживает горячую перезагрузку).

Подключение из веб-версии Claude

  1. Go to claude.ai → Settings → Connectors → Add custom connector
  2. Remote MCP server URL: paste https://your-machine.your-tailnet.ts.net/mcp (printed by npm start)
  3. Advanced settings → OAuth Client ID / OAuth Client Secret: paste the two values npm start printed
  4. Click Connect: a local confirmation page opens; enter the passphrase shown in the control panel (section 1 · Connectors) to approve — or read it straight from ~/.aki/mcpsv/passphrase.txt

Why not token-in-URL: docs/ref/claude-connector.md, docs/research/claude-ai-oauth-connector.md.

claude.ai connects and calls the in-house local__* tool suite: local__find_path, local__search_content, local__run_cmd, local__agy_run, local__kiro_read, plus native file read/write/edit (local__read_text_file, local__write_file, local__edit_file, local__create_directory, local__move_file, local__get_file_info, local__list_allowed_directories).

Note on the connector icon: claude.ai doesn't read the icon from the MCP server. It queries Google's favicon service with the tailnet's apex domain, not your host: https://t2.gstatic.com/faviconV2?...&url=http://<tailnet>.ts.net&size=32. <tailnet>.ts.net has no public DNS record, so Google returns 404 and claude.ai falls back to a default letter icon. This server serves /favicon.ico publicly, but no file placed here can change that result: your subdomain never appears in the query Google receives.

Connecting from ChatGPT

Needs ChatGPT Plus/Pro (or Business/Enterprise/Edu) with Developer mode for custom connectors.

  1. ChatGPT → Settings → Apps & Connectors (or Security) → enable Developer mode
  2. Create a custom connector / app → paste the same MCP URL (https://your-machine.your-tailnet.ts.net/mcp)
  3. Auth: OAuth → Advanced OAuth settings → set Registration URL to https://your-machine.your-tailnet.ts.net/register (the panel prints the exact value to copy). This is the step that enables DCR: ChatGPT self-registers its own client from it. Skip it and ChatGPT can't register, so it falls back to a user-defined client — and pasting Claude's Client ID there fails, because that client only allows claude.ai redirects.
  4. Leave registration method on DCR, token endpoint auth method none — do not paste Claude's Client ID/Secret here.
  5. Enter the same passphrase on the confirmation page

Same folder allowlist and shell allowlist as Claude. Restart npm start after upgrading so gatekeeper advertises registration_endpoint and serves /.well-known/openid-configuration (ChatGPT reads that to auto-fill the Registration URL).

Connecting from Grok and Gemini

Both ride the same MCP URL and passphrase flow — no separate transport or auth. They differ in how the client authenticates, and the connector panel (section 1) prints the exact copy fields for each.

Grok — verified, production-ready: self-registers via the /register DCR path like ChatGPT — paste only the MCP URL, no Client ID. Its real redirect_uri https://grok.com/connectors-oauth-exchange-code/ was observed live 2026-08-09 and is allowlisted via GROK_CALLBACK_PREFIX. Verified working end to end (authorize → token 200). If a future Grok change moves that callback, a rejected registration logs register REJECTED (redirect_uri not allowlisted): [...] so the new value can be re-allowlisted.

Gemini — experimental, connection works but tool use doesn't (yet) (paid tiers only — Pro / Business / Enterprise; the free tier may not expose custom apps): pastes a confidential client, exactly like Claude — set the custom app link to the MCP URL, then under Advanced Settings paste the same Client ID / Client secret. Gemini's redirect goes through Google's OAuth proxy https://oauth-redirect.googleusercontent.com/r/... (observed live 2026-08-09), allowlisted by isAllowedRedirect in scripts/oauth.js. Caveat: the OAuth handshake succeeds and Gemini accepts the instruction, but in repeated testing 2026-08-09 it did not reliably discover or drive the MCP tools — connection healthy, tool use unreliable. Claude and Grok are the dependable clients today.

Autonomous Cloud Automation (Grok + Local MCP)

Grok's scheduled prompts turn your machine into a headless "personal remote AI node": no browser tab, no desktop app, just npm start running in the background.


  • Локальное выполнение по облачному триггеру: настройте запланированный промпт в Grok (Automation), который срабатывает в заданное время.
  • Безголовый режим: облачный сервис Grok отправляет запрос на /mcp через ваш URL Tailscale Funnel, а aki-mcp-sv выполняет задачу — проверку работоспособности, очистку логов, git pull, очистку — без необходимости держать что-либо открытым на вашей стороне.
  • Нулевой UI: пока процесс запущен, для выполнения запланированной задачи не требуется открытый браузер или приложение.

Требования

  • Node.js для Windows, Linux или macOS. Нет Node.js? Сразу переходите к автономному пакету ниже — не требуется установка, доступны загрузочные лаунчеры для Windows, Linux и macOS.
  • Только для Windows: Git для Windows (или WSL) в PATH — оболочка/инструменты поиска вызывают Unix-утилиты (ls cat pwd grep head tail wc file stat tree ps df du whoami uname), а install.sh из akidevrule требует bash; usr/bin из Git для Windows содержит необходимые coreutils/findutils/grep/diffutils. Это требование того же уровня, что и Tailscale ниже, а не зависимость кода.
  • Tailscale (одноразовая настройка):
    1. Установите Tailscale и войдите в систему (на macOS подойдёт как приложение, так и brew install tailscale, если tailscale есть в PATH).
    2. Включите Funnel для вашей tailnet: бесплатно в любом тарифном плане, одноразовый переключатель через ссылку login.tailscale.com/f/funnel, которую выводит npm start, если Funnel ещё не включён.

После этого npm start автоматически включает Funnel на порту 9999 при каждом запуске.

Архитектура

Claude web / ChatGPT
      │  HTTPS + OAuth 2.1 (Claude: paste client ID/secret; ChatGPT: DCR self-register)
      ▼
Tailscale Funnel        (https://your-machine.your-tailnet.ts.net)
      │
      ▼
gatekeeper.js  — public port 9999
      │           /.well-known/oauth-* + openid-configuration  metadata (openid is an alias for ChatGPT discovery)
      │           /authorize, /token    minimal authorization server (scripts/oauth.js)
      │           /register         RFC 7591 dynamic client registration (ChatGPT self-registers here)
      │           /mcp                  requires a valid Bearer access token, else 401
      │                                 POST → real Streamable HTTP (scripts/streamable-bridge.js)
      ▼
tools-server.js — one shared McpServer, in-process (InMemoryTransport, no child, no SSE), tools:
                                  search-mcp.js       (find_path/search_content, whole-tree in one call)
                                  shell-mcp.js        (allowlisted commands, curated to read-only)
                                  agy-mcp.js          (Antigravity CLI, read-only plan mode)
                                  kiro-mcp.js         (kiro_read, read-only, needs kiro-cli on PATH)
                                  filesystem-mcp.js   (native read/write/edit inside the allowed folders)

panel.js       — 127.0.0.1:9998, never exposed via Funnel
                 control UI: allowed folders, shell allowlist,
                 install akidevrule, generate the connector prompt

Слой входящих соединений можно заменить: Tailscale Funnel — это вариант по умолчанию без конфигурации, но тот же эндпоинт /mcp можно обслуживать через собственный именованный туннель Cloudflare или любой другой стабильный публичный HTTPS-край, который вы уже используете — см. Публикация в интернете. Всё, что ниже линии входящих соединений (гейткипер, OAuth), остаётся неизменным независимо от выбранного края.

Используется OAuth (а не токен в URL), потому что claude.ai всегда пытается выполнить динамическую регистрацию клиента независимо от конфигурации (docs/research/claude-ai-oauth-connector.md). ChatGPT также ожидает OAuth; этот сервер предоставляет /register (RFC 7591 DCR), чтобы ChatGPT мог зарегистрироваться самостоятельно, а Claude мог продолжать использовать предварительно выданные Client ID/Secret.

Структура каталогов

aki-mcp-sv/
├── package.json
├── scripts/
│   ├── start.js                 # orchestrates gatekeeper + panel, single process
│   ├── open-browser.js           # cross-platform "open default browser" — the one per-OS seam, no external dep
│   ├── gatekeeper.js             # OAuth-gated reverse proxy, public port
│   ├── oauth.js                  # minimal authorization server (pre-registered client + RFC 7591 DCR)
│   ├── streamable-bridge.js      # Streamable HTTP shim <-> the in-process tools server (InMemoryTransport)
│   ├── tools-server.js           # builds the one shared McpServer mounting shell/agy/kiro/search/filesystem
│   ├── http.js                   # shared HTTP helpers: readBody / json / serveStatic (+ MIME)
│   ├── shell-mcp.js              # allowlist-gated shell tool (curated to read-only)
│   ├── agy-mcp.js                # register() module for the agy CLI (mounted by tools-server.js)
│   ├── kiro-mcp.js               # Kiro arm: kiro_read (read-only) tool, sonnet-4.5 locked, needs kiro-cli on PATH
│   ├── filesystem-mcp.js         # native read/write/edit tools, symlink-safe path containment
│   ├── mcp-tool.js               # shared MCP tool-result envelope: ok / err / fail
│   ├── allowlist.js              # default command set + settings reader — shared by server and panel
│   ├── search-mcp.js             # find_path / search_content — whole tree in one call
│   ├── roots.js                  # path containment shared by every filesystem-touching tool
│   ├── tailscale.js              # reads Funnel status — shared by start.js and panel
│   ├── update-check.js           # checks for newer aki-mcp-sv/akidevrule versions, shown in the panel
│   ├── log.js                    # shared timestamped logger
│   ├── panel.js                  # loopback-only control panel (:9998), token-gated
│   ├── config-page.js            # renders the panel page
│   ├── html.js                   # HTML escaper (esc) — shared by oauth confirm page and panel
│   ├── userdata.js               # user data location (~/.aki/mcpsv) — single source of truth
│   └── build/                    # standalone release builder: payload/launchers/checksums, smoke-test, release-gate
└── public/                       # panel CSS/JS, favicon + images, served publicly by gatekeeper

Ваши данные хранятся вне репозитория, в ~/.aki/mcpsv/ (такое же соглашение используют CLI-инструменты, как ~/.aws или ~/.docker):

~/.aki/mcpsv/
├── setting.json          # allowed folders + shell allowlist, edited from the panel
├── oauth-client.json     # pre-issued client ID + secret, for Claude (0600)
├── oauth-dcr-clients.json # clients that self-registered via /register, one per ChatGPT connector (0600)
├── passphrase.txt        # passphrase for the /authorize consent screen (0600)
└── tokens.json           # access/refresh tokens (0600)

Клон остаётся в точности таким, как был выгружен: редактирование папок/разрешённого списка из панели никогда не создаёт diff в репозитории.

Конфигурация

Скопируйте .env.example в .env и раскомментируйте нужные параметры — start.js загружает его автоматически при запуске (если .env отсутствует, молча возвращается к значениям по умолчанию, поэтому стандартный поток с Tailscale не затрагивается). Поддерживаемые переменные: PUBLIC_ORIGIN, GATEKEEPER_PORT, PANEL_PORT, MCP_HUB_PORT, MCP_DATA_DIR, MCP_REQUEST_TIMEOUT_MS. Для одноразового альтернативного профиля используйте node --env-file=.env.user ./scripts/start.js.

Автономный пакет: .env.example не входит в загружаемый пакет, поэтому создайте .env вручную в той же директории приложения для конкретной версии, из которой запускается лаунчер (а не в папке, куда вы загрузили лаунчер): - macOS: ~/Library/Application Support/aki-mcp-sv/app/<версия>/.env - Linux: ${XDG_DATA_HOME:-~/.local/share}/aki-mcp-sv/app/<версия>/.env - Windows: %LOCALAPPDATA%\aki-mcp-sv\app\<версия>\.env

Публикация в интернете

Tailscale Funnel — это вариант по умолчанию без конфигурации и рекомендуемый способ. Если Funnel работает нестабильно, два альтернативных варианта входящих соединений позволяют использовать собственный публичный край — см. Альтернативный вход ниже.

npm start автоматически включает Funnel при необходимости (см. выше), не требуется ручных действий. Funnel — это состояние, хранящееся в tailscaled (сохраняется после перезагрузки), независимо от жизненного цикла npm start; отключите его полностью командой tailscale funnel 9999 off.

Что нужно знать перед включением Funnel: - Бесплатно в любом тарифном плане Tailscale, но для tailnet требуется одноразовое согласие (ссылка login.tailscale.com/f/funnel?node=..., которую выводит tailscale funnel --bg, если оно отсутствует). - Можно публиковать только 3 порта: 443, 8443, 10000; произвольный порт выставить нельзя. - Пропускная способность ограничена; Tailscale не публикует точные цифры.


  • Не переключайте Funnel включено/выключено многократно: слишком частое перевыпускание сертификата может привести к достижению лимита Let's Encrypt (~34 часа блокировки). start.js избегает этого, проверяя Web[].Handlers[].Proxy на порт 9999 в tailscale funnel status --json перед тем, как решить, что Funnel выключен (не ключ AllowFunnel, который отражает публичный порт 443, а не 9999).

Диагностика "claude.ai не может подключиться", когда tailscale funnel status показывает "on": конфигурация serve может сохраняться локально, но не синхронизироваться с управляющей плоскостью Tailscale, поэтому реальный клиент в открытом интернете блокируется на уровне TLS, в то время как хост-машина, маршрутизируемая через внутреннюю mesh-сеть, видит всё как исправное. Не тестируйте с помощью простого curl https://<host> с машины, на которой запущен npm start: эта машина находится в tailnet и незаметно использует короткий путь через mesh. Вместо этого протестируйте реальный путь:

dig @8.8.8.8 <host> A +short   # real public IP
curl --resolve <host>:443:<IP-from-above> https://<host>/.well-known/oauth-authorization-server

Если это возвращает SSL_ERROR_SYSCALL/таймаут, несмотря на то, что tailscale funnel status показывает "on", повторно запустите tailscale funnel --bg 9999, чтобы принудительно переотправить конфигурацию (это не ошибка кода). Полное описание: docs/research/claude-ai-oauth-connector.md, раздел "Debug round 5".

Альтернативный вход (если Funnel ненадёжен)

Граница Funnel может периодически терять отдельные запросы в некоторых регионах. Разница в частоте потерь по сравнению с Cloudflare пока не измерена, поэтому эти варианты не являются доказанным улучшением — используйте их только если Funnel ненадёжен для вас. Оба варианта полностью заменяют границу Tailscale; сервер OAuth и набор инструментов остаются неизменными. Приоритет при установке более одного варианта: --tunnel > PUBLIC_ORIGIN > сохранённая конфигурация панели (раздел 0 → "Собственный публичный origin") > Tailscale Funnel. Полное обоснование: docs/plan/done/cloudflare-tunnel-ingress.md.

Собственная граница (PUBLIC_ORIGIN): укажите переменную окружения на стабильный публичный HTTPS origin, который вы запускаете и терминируете самостоятельно, и npm start полностью пропустит Tailscale, обслуживая запросы на этом origin:

PUBLIC_ORIGIN=https://your-host npm start

Именованный туннель Cloudflare (--tunnel): сервер запускает именованный туннель Cloudflare за вас, считывая TunnelID из JSON-файла учётных данных cloudflared и выполняя cloudflared tunnel run, перенаправляя на 127.0.0.1:9999:

npm start -- --tunnel <cred.json> --origin https://your-host

--origin обязателен, так как JSON-файл учётных данных не содержит имя хоста. Это только режим JSON-учётных данных — без конфигурации yml, без токена. Перед использованием вам понадобится аккаунт Cloudflare, уже созданный именованный туннель (cloudflared tunnel create), его JSON-файл учётных данных и DNS-запись, указывающая имя хоста на этот туннель.

Вам передали JSON-файл туннеля: если хост, владеющий доменом, уже создал туннель и DNS-запись и отправил вам JSON-файл учётных данных, вам не нужен собственный аккаунт Cloudflare — просто установите cloudflared, затем запустите с origin, который они назначили:

npm start -- --tunnel <the-json-they-sent> --origin https://the-subdomain-they-gave-you

Чтобы получить субдомен под доменом хоста, договоритесь об этом с ним напрямую; самостоятельная регистрация недоступна.

Из панели (без флагов CLI): откройте панель управления → раздел 0 → вкладка "Собственный публичный origin" → загрузите JSON-файл учётных данных cloudflared и имя хоста, на которое вы его направили → Сохранить. Вступает в силу при следующем запуске npm start (требуется перезапуск, не мгновенное переключение); кнопка "Использовать Tailscale Funnel вместо этого" отменяет изменения.

Когда активен пользовательский вход, раздел 0 панели пропускает проверки Tailscale и вместо этого показывает активный вход и обслуживаемый origin — отсутствие интерфейса Tailscale ожидаемо, а не ошибка.

Поиск файлов

Используйте local__find_path для поиска файла или каталога — он сканирует всё дерево за один вызов (измерено: ~0.2 с на 164 тыс. файлов / 11.7 тыс. каталогов), возвращает как файлы, так и каталоги, и автоматически пропускает node_modules/.git/выходные данные сборки. query — это регистронезависимая подстрока или глоб, если содержит */?.

Безопасность

Минимальный OAuth 2.1: Claude использует предварительно выданные конфиденциальные Client ID/Secret; ChatGPT использует DCR (POST /register) как публичный клиент (token_endpoint_auth_method: none) с разрешёнными URI перенаправления chatgpt.com. Полное описание: docs/ref/security-model.md.

  • $MCP_DATA_DIR (по умолчанию $HOME, что даёт доступ ко всей домашней папке: Рабочий стол, Документы, Загрузки, Фото, всё внутри неё, а не только проекты) является корневой директорией для всех инструментов, а также ~/.aki и ~/.claude (для нативных файлов правил) — считывается заново из ~/.aki/mcpsv/setting.json при каждом вызове, поэтому изменения в панели вступают в силу при следующем вызове без перезапуска. ~/.claude предоставляется на уровне папки, поэтому токены сессий и история чатов внутри неё также доступны коннектору (известный компромисс; строка в панели заблокирована и не может быть удалена оттуда: если хотите убрать, редактируйте список folders в ~/.aki/mcpsv/setting.json напрямую).
  • MCP для оболочки написан вручную (shell-mcp.js), жёстко контролирует разрешенный список в коде (execFile, никогда не через оболочку, блокируются ; & | \``). Стандартный набор команд доступен только для чтения, определён вallowlist.js— бинарные файлы с богатыми флагами, чьи флаги позволяют обойти ограничение на запись (find -delete/-exec,sort -o <путь>), намеренно исключены из списка (issue #2), поэтому стандартный коннектор не может писать, удалять или выполнять команды через оболочку; инструментыfind_path/search_contentпокрывают поиск только для чтения, для которого они и использовались. Панель отображает именно этот набор как отправную точку для редактирования, сохраняемую в~/.aki/mcpsv/setting.json→shell.allowlist. **Любая команда, которую вы добавите, — на вашей ответственности**: добавление очевидной команды для записи (например,git commit) ещё больше расширяет поверхность атаки. Команда может выполняться в любой директории внутри разрешённых корней через параметрcwd, используемый вместоcd/-C` для указания конкретного репозитория.
  • gatekeeper.js — единственная публичная точка входа; все инструменты работают внутри процесса за ним, ничто другое не слушает ни один порт.
  • panel.js записывает конфигурацию и выполняет команды на вашей машине, поэтому привязан только к 127.0.0.1 и никогда не открывается через Funnel. Его токен генерируется заново при каждом npm start и требуется как в строке запроса страницы, так и в заголовке x-panel-token при каждом API-вызове, блокируя другие вкладки браузера от отправки POST-запросов.
  • ~/.aki/mcpsv/passphrase.txt (парольная фраза согласия /authorize) и ~/.aki/mcpsv/oauth-client.json (ID/секрет клиента) имеют права доступа 0600, находятся вне репозитория (никогда не попадают в git) и передаются только один раз, вставляясь в диалог коннектора.
  • Токены доступа и обновления хранятся в ~/.aki/mcpsv/tokens.json (права доступа 0600) и сохраняются после перезапусков: коннектор обеспечивает долговременный доступ к файлам, а не сессию входа, поэтому потеря токенов при каждом npm start вынуждала бы к бессмысленной повторной аутентификации. Время жизни токена доступа — 1 год, токены обновления не истекают. Для отзыва удалите ~/.aki/mcpsv/tokens.json и перезапустите.
  • Каждый экземпляр коннектора ChatGPT самостоятельно регистрирует одного клиента в ~/.aki/mcpsv/oauth-dcr-clients.json (права доступа 0600). Регистрация открыта, но сама по себе не даёт доступа: принимаются только URI перенаправления claude.ai и chatgpt.com, а зарегистрированный клиент всё равно должен пройти экран согласия с парольной фразой и PKCE, прежде чем получит токен. Для отзыва этих регистраций удалите этот файл и перезапустите.
  • Funnel остаётся включённым в фоне для всего проекта; npm start — единственное, что вы активно запускаете/останавливаете.

Чем это отличается от Desktop Commander

Desktop Commander — наиболее широко используемый MCP-сервер терминала. Он работает локально для Claude Desktop и защищает доступ к оболочке с помощью чёрного списка (blockedCommands, явный список запрещённых команд). Чёрный список по своей природе уязвим: невозможно перечислить все опасные команды и их варианты, а по умолчанию действует правило разрешить всё, что не в списке.

Этот проект нацелен на другой сценарий: предоставление локального доступа для Claude в вебе, через открытый интернет с помощью Funnel. Он делает противоположный выбор по умолчанию: белый список. Ничто не выполняется, если это явно не разрешено.

Почему белый список, а не чёрный

  • Безопасность по умолчанию: незнакомая или новая команда блокируется автоматически, не требуя догадок.
  • Минимальная поверхность атаки: могут выполняться только те команды, которые вы явно одобрили, и ничего больше.
  • Гранулярность вплоть до подкоманд: git ограничен status/log/diff/show, чего чёрный список не может выразить чисто.
  • Нейтрализация инъекций в промпты: при работе через открытый интернет жёсткий белый список означает, что вредоносная или внедрённая инструкция не имеет к чему эскалировать — нет незарегистрированных команд, к которым можно обратиться.

  • Только для чтения по умолчанию: встроенный набор команд доступен только для чтения — бинарные файлы с богатым набором флагов, которые могут обойти это ограничение через собственные флаги (find, sort), исключены (issue #2); добавление команды для записи требует осознанного редактирования файла ~/.aki/mcpsv/setting.json, а не снятия запрета.

Скриншоты

image image image gpt-aki-mcp-setting

Войдите, чтобы оставить комментарий