Proxy for atlassian mcp to not waste tokens on useless info
  • Python 93.8%
  • Nix 6.2%
Find a file
Aleksandr 15891fede6 🔧 atlassian-proxy: discovery перед refresh (тихое продление токена) и ограниченный по времени листинг апстрима
SDK шлёт refresh до discovery — на фолбэчный <base>/token, который у
Atlassian отвечает 404: живой refresh token выбрасывается и требуется
браузерный релогин при каждой экспирации access token'а (~8h).
_RefreshDiscoveryOAuth предзаполняет oauth_metadata из RFC 8414
well-known, и рефреш попадает в настоящий endpoint.

ResilientProxyProvider ограничивает все list-операции апстрима 15s и
деградирует в пустой список: неаутентифицированный или зависший апстрим
больше не вешает tools/list до клиентского таймаута (30s в Claude Code)
— манифест и management-инструменты остаются доступными.

Co-Authored-By: Eva
2026-07-06 14:10:02 +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: discovery перед refresh (тихое продление токена) и ограниченный по времени листинг апстрима 2026-07-06 14:10:02 +03:00
README.md atlassian-proxy: NixOS-native прокси со сжатием ответов Atlassian MCP 2026-06-26 11:49:22 +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.

При первом запуске FastMCP проведёт OAuth-логин в Atlassian через браузер и закэширует токен (в чат/репозиторий ничего не попадает, см. .gitignore).

Параметры

Флаг По умолчанию Что делает
--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 рядом конфиг слимминга
--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"
    }
  }
}

Прокси держит одну сессию с апстримом, поднятую на старте, и переиспользует её на все вызовы.

Слимминг ответов (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.