Proxy for atlassian mcp to not waste tokens on useless info
  • Python 91.2%
  • Nix 8.8%
Find a file
Aleksandr 4d8b7fac42 atlassian-proxy: токены только в памяти, авто-логин при первом вызове тула
Диск-кэш токенов, спейсы и management-тулы удалены: токен живёт в MemoryStore
до конца процесса, каждая сессия клиента логинится один раз — AutoLoginMiddleware
сам запускает браузерный OAuth (или тихий refresh) под локом. Пин callback-порта
заменён на случайный свободный порт per-process — регистрация клиента больше не
переживает процесс, а фиксированный порт конфликтовал бы между параллельными
сессиями. На диске остаётся только манифест тулов, чтобы список был виден до
логина.

Co-Authored-By: Eva
2026-07-13 20:58:35 +03:00
.envrc atlassian-proxy: NixOS-native прокси со сжатием ответов Atlassian MCP 2026-06-26 11:49:22 +03:00
.gitignore atlassian-proxy: NixOS-native прокси со сжатием ответов Atlassian MCP 2026-06-26 11:49:22 +03:00
flake.lock atlassian-proxy: NixOS-native прокси со сжатием ответов Atlassian MCP 2026-06-26 11:49:22 +03:00
flake.nix atlassian-proxy: NixOS-native прокси со сжатием ответов Atlassian MCP 2026-06-26 11:49:22 +03:00
proxy.py atlassian-proxy: токены только в памяти, авто-логин при первом вызове тула 2026-07-13 20:58:35 +03:00
README.md atlassian-proxy: токены только в памяти, авто-логин при первом вызове тула 2026-07-13 20:58:35 +03:00
slim_config.yaml atlassian-proxy: NixOS-native прокси со сжатием ответов Atlassian MCP 2026-06-26 11:49:22 +03:00

atlassian-proxy

MCP-прокси к облачному Atlassian MCP (https://mcp.atlassian.com/v1/mcp) с OAuth-аутентификацией поверх FastMCP. Между клиентом и Atlassian стоит мидлварь, которая обрезает жирные JSON-ответы Jira/Confluence — поиски задач, эпики и прочие тяжёлые payload'ы худеют на 7090%, и это напрямую режет расход токенов на каждый вызов инструмента.

NixOS-native: всё ставится Nix-флейком через python3.withPackages, без venv/pip и без битых manylinux-wheel'ов (главная причина, по которой оригинал не заводился на NixOS — jq здесь линкуется к системному libjq).

Зачем

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

{
  "status": {
    "self": "https://api.atlassian.com/ex/jira/.../status/10009",
    "description": "",
    "iconUrl": "https://<host>.atlassian.net/images/icons/statuses/generic.png",
    "name": "On Hold",
    "id": "10009",
    "statusCategory": {
      "self": "https://api.atlassian.com/ex/jira/.../statuscategory/2",
      "id": 2, "key": "new", "colorName": "blue-gray", "name": "To Do"
    }
  }
}

После прокси от него остаётся {"status":{"name":"On Hold"}} — всё, что нужно модели, без мусора.

Быстрый старт (NixOS / Nix)

nix run                         # поднять прокси на http://127.0.0.1:8080/mcp
# с параметрами:
nix run . -- --port 9000 --log-level DEBUG

С direnv: direnv allow в каталоге — dev-shell поднимется сам, дальше python proxy.py.

Токены живут только в памяти процесса: при первом вызове инструмента в сессии прокси сам откроет браузер для OAuth-логина. На диск токены не пишутся — каждая сессия логинится один раз и независимо. Кэшируется только манифест инструментов, чтобы список тулов был виден клиенту ещё до логина.

Параметры

Флаг По умолчанию Что делает
--transport http stdio | http | sse | streamable-http
--host 127.0.0.1 адрес привязки для http/sse (0.0.0.0 — открыть наружу)
--port 8080 порт для http/sse
--upstream https://mcp.atlassian.com/v1/mcp апстрим Atlassian MCP
--config slim_config.yaml рядом конфиг слимминга
--manifest ~/.cache/atlassian-proxy/tool_manifest.json кэш манифеста инструментов апстрима
--name atlassian-proxy имя прокси-сервера
--log-level INFO уровень логов

Подключение к Claude Code

В .mcp.json проекта (или в пользовательском конфиге). Два режима:

stdio — клиент сам запускает прокси как подпроцесс (ничего не нужно держать запущенным вручную):

{
  "mcpServers": {
    "atlassian": {
      "command": "nix",
      "args": ["run", "/home/nerosama/dev/work/atlassian-proxy", "--", "--transport", "stdio"]
    }
  }
}

http — прокси крутится отдельным процессом (nix run), клиент ходит по URL; удобно держать рядом в другом окне. Если у тебя уже есть Atlassian MCP — просто поменяй type на http и подставь url:

{
  "mcpServers": {
    "atlassian": {
      "type": "http",
      "url": "http://127.0.0.1:8080/mcp"
    }
  }
}

Каждая сессия Claude Code запускает свой процесс прокси и при первом вызове инструмента проходит OAuth-логин через браузер; токен живёт до конца процесса.

Слимминг ответов (slim_config.yaml)

ResponseSlimMiddleware компилирует jq-программу из конфига и прогоняет через неё текстовые ответы перечисленных инструментов (остальные проходят насквозь).

Поле Описание
tools имена MCP-инструментов, к которым применять слимминг
remove имена полей, вырезаемых на любой глубине (self, avatarUrls, …)
compress поле → какие подполя оставить, если значение — объект (assignee: [displayName])
remove_nulls удалять null/пустые customfield_*
log логировать экономию на каждый запрос (инструмент, размеры, % экономии)

Правь под свои нужды: добавь инструменты в tools, поля в remove/compress.

Архитектура

  • proxy.py — FastMCP-прокси + мидлварь слимминга; CLI на argparse.
  • slim_config.yaml — конфиг слимминга.
  • flake.nixdevShells.default (python для разработки), packages.default (запускаемый atlassian-proxy), apps.default (для nix run).

Зависимости

Все из nixpkgs (см. flake.nix): fastmcp, mcp, jq, pyyaml, authlib, httpx, uvicorn. Не-Nix окружению хватит тех же пакетов из PyPI.