- Python 93.8%
- Nix 6.2%
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 |
||
|---|---|---|
| .envrc | ||
| .gitignore | ||
| flake.lock | ||
| flake.nix | ||
| proxy.py | ||
| README.md | ||
| slim_config.yaml | ||
atlassian-proxy
MCP-прокси к облачному Atlassian MCP (https://mcp.atlassian.com/v1/mcp) с
OAuth-аутентификацией поверх FastMCP. Между клиентом и Atlassian стоит мидлварь,
которая обрезает жирные JSON-ответы Jira/Confluence — поиски задач, эпики и
прочие тяжёлые payload'ы худеют на 70–90%, и это напрямую режет расход токенов на
каждый вызов инструмента.
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.nix —
devShells.default(python для разработки),packages.default(запускаемыйatlassian-proxy),apps.default(дляnix run).
Зависимости
Все из nixpkgs (см. flake.nix): fastmcp, mcp, jq, pyyaml, authlib,
httpx, uvicorn. Не-Nix окружению хватит тех же пакетов из PyPI.