- Python 91.2%
- Nix 8.8%
Диск-кэш токенов, спейсы и management-тулы удалены: токен живёт в MemoryStore до конца процесса, каждая сессия клиента логинится один раз — AutoLoginMiddleware сам запускает браузерный OAuth (или тихий refresh) под локом. Пин callback-порта заменён на случайный свободный порт per-process — регистрация клиента больше не переживает процесс, а фиксированный порт конфликтовал бы между параллельными сессиями. На диске остаётся только манифест тулов, чтобы список был виден до логина. 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.
Токены живут только в памяти процесса: при первом вызове инструмента в сессии прокси сам откроет браузер для 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.nix —
devShells.default(python для разработки),packages.default(запускаемыйatlassian-proxy),apps.default(дляnix run).
Зависимости
Все из nixpkgs (см. flake.nix): fastmcp, mcp, jq, pyyaml, authlib,
httpx, uvicorn. Не-Nix окружению хватит тех же пакетов из PyPI.