Skip to main content
Glama
6shihab

bitbucket-pr-review-mcp

by 6shihab

bitbucket-pr-review-mcp

MCP-сервер, который позволяет языковой модели читать pull request в Bitbucket Cloud и оставлять комментарии к нему — привязанные к строкам, к которым они относятся, плюс одно резюме вверху.

Сервер предоставляет материал и публикует слова. Он не формирует мнения: рецензирование выполняет вызывающая модель, и здесь нет ни промпта для рецензирования, ни учётных данных модели.

Что он не умеет

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

Bitbucket не продаёт разрешение, которое отделяет комментирование от слияния. Учётные данные, которые вы даёте этому серверу, способны сливать ваши pull request; ни токены, ни области действия этому не препятствуют. Препятствует то, что ни один инструмент об этом не просит, что единственная точка контроля в HTTP-клиенте отказывает в этом, как бы ни был составлен запрос, и — та часть, которая не зависит от правильности этого кода — ограничения веток, которые вы настраиваете в репозитории самостоятельно. См. ADR-0002 и прочтите Перед началом работы.

Related MCP server: Bitbucket MCP Server

Перед началом работы

Настройте ограничения веток для любого репозитория, который вы добавляете в белый список. В Bitbucket: Настройки репозитория → Ограничения веток. Ограничьте, кто может сливать изменения в вашу основную ветку, и требуйте одобрений, которые ожидает ваша команда. Bitbucket применяет это независимо от того, что делает этот сервер, что делает это единственной гарантией здесь, которая переживёт ошибку в этом репозитории. Это занимает минуту, и это разница между «мы верим, что этот код осторожен» и «неважно, если это не так».

Установка

Требуется uv и Python 3.13. Те же три команды работают на Windows, macOS и Linux:

git clone <this repository>
cd bitbucket-pr-review-mcp
uv sync

Затем укажите, к каким репозиториям он может обращаться:

cp config/repositories.yaml.example config/repositories.yaml

...и отредактируйте его. Файл перечисляет записи workspace/repo, не содержит секретов и предназначен для коммита:

repositories:
  - streamstech/db-explorer
  - streamstech/lent-manager

Целое рабочее пространство можно записать как jantrik/*. Это самая широкая запись здесь — она охватывает репозитории, созданные после того, как вы её написали, — поэтому сервер говорит об этом при каждом запуске:

repositories:
  - jantrik/*

Сервер отказывается запускаться без списка. Отсутствующий список неотличим от разрешения касаться каждого репозитория, доступного вашим учётным данным. Шаблоны уже целого рабочего пространства (*/db-explorer, streamstech/db-*) отклоняются по той же причине: это догадки о именовании, и они захватывают всё, что будет названо так в следующий раз.

Подключение вашей учётной записи Bitbucket

Запустите настройку и откройте ссылку, которую она выводит:

uv run bb-pr-mcp --setup

Она обслуживает страницу на вашей собственной машине — только loopback, на случайном порту, одноразовая ссылка, исчезает через пять минут — запрашивая ваш email учётной записи Atlassian (не имя пользователя Bitbucket и не имя, которое вы дали токену) и API-токен. Она проверяет пару на Bitbucket и показывает ваше отображаемое имя перед сохранением чего-либо, затем помещает учётные данные в связку ключей вашей ОС и закрывается.

Создайте токен на https://id.atlassian.com/manage-profile/security/api-tokens с ровно этими четырьмя областями:

Область

Зачем

read:user:bitbucket

Чтобы сервер знал, чьи комментарии его собственные — без этого каждый повторный ревью накапливает дубликаты

read:repository:bitbucket

Чтение файлов и коммитов вокруг изменения

read:pullrequest:bitbucket

Чтение самого pull request — гранулярные области не вкладываются, поэтому область записи ниже не покрывает это

write:pullrequest:bitbucket

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

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

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

Вам никогда не нужно запускать --setup явно: если учётные данные не сохранены, каждый инструмент отвечает URL-адресом настройки вместо ошибки.

Проверяйте это когда угодно:

uv run bb-pr-mcp --check

Это проверяет белый список, учётные данные и их области, выводит, от чьего имени вы публикуете, и завершается с кодом оболочки — 0 нормально, 1 нет пригодных учётных данных, 2 токен с неправильными областями.

Удаление

uv run bb-pr-mcp --forget

Это удаляет учётные данные из связки ключей этого устройства и ничего больше — токен по-прежнему существует в Atlassian, пока вы не отзовёте его там, и команда говорит об этом. Следующий вызов инструмента выдаст вам новую ссылку настройки.

Здесь намеренно нет инструмента для этого. Инструмент, который удаляет учётные данные, — это инструмент, который описание pull request может уговорить модель вызвать, и ничего не выигрывается: тот, кто хочет их удалить, уже находится в терминале.

Модель никогда не видит токен

Токен идёт из вашего браузера в связку ключей, а оттуда в заголовок Authorization. Он никогда не является аргументом инструмента, никогда не находится в ответе инструмента, никогда не находится в сообщении об ошибке и не находится в URL-адресе настройки — тот несёт другой одноразовый токен, который даёт только право заполнить одну форму на этой машине. tests/test_the_token_never_reaches_the_model.py ищет его во всех этих местах.

Если связка ключей недоступна

Учётные данные помещаются в связку ключей ОС и никуда больше — никогда в файл. На macOS и Windows это работает из коробки. На Linux вам нужна запущенная и разблокированная служба Secret Service (gnome-keyring или KWallet); если её нет, сервер останавливается, а не переключается на файл (ADR-0003).

Запуск

Сервер говорит по MCP через stdio. Укажите на него вашему клиенту:

{
  "mcpServers": {
    "bitbucket-pr-review": {
      "command": "uv",
      "args": ["run", "--directory", "/path/to/bitbucket-pr-review-mcp", "bb-pr-mcp"]
    }
  }
}

На Windows используйте ту же форму с путём Windows ("C:\\path\\to\\bitbucket-pr-review-mcp"). В остальном между платформами нет различий.

Для Claude Code:

claude mcp add bitbucket-pr-review -- uv run --directory /path/to/bitbucket-pr-review-mcp bb-pr-mcp

Запуск в Docker

Образ говорит по MCP через stdio, как и всё остальное, поэтому нет порта и ничего не нужно up. Соберите его, затем запустите с -i и общайтесь с ним.

docker build -t bitbucket-pr-review-mcp:local .

В контейнере нет связки ключей, и страница настройки не поможет: она привязывает порт loopback внутри контейнера, до которого ваш браузер не может добраться. Поэтому контейнерный запуск получает свои учётные данные, а не хранит их. Это реальное понижение — переменная окружения видна docker inspect и всему, что может читать процесс, — и это решение, а не запасной вариант: ничто не деградирует в него, обе переменные должны быть установлены, и запуск говорит об этом каждый раз. См. ADR-0007.

Поместите учётные данные в файл, который не находится в этом репозитории:

BB_MCP_EMAIL=you@yourcompany.com
BB_MCP_API_TOKEN=ATATT...
BB_MCP_TOKEN_EXPIRES_ON=2027-08-24

Затем проверьте его и подключите к клиенту:

docker run --rm \
  --env-file /path/to/env.docker \
  -v /path/to/repositories.yaml:/config/repositories.yaml:ro \
  bitbucket-pr-review-mcp:local --check
{
  "mcpServers": {
    "bitbucket-pr-review": {
      "command": "docker",
      "args": [
        "run", "--rm", "-i",
        "--env-file", "/path/to/env.docker",
        "-v", "/path/to/repositories.yaml:/config/repositories.yaml:ro",
        "bitbucket-pr-review-mcp:local"
      ]
    }
  }
}

docker-compose.yaml записывает те же флаги один раз: docker compose run --rm bitbucket-pr-review, читая .env.docker (в gitignore) из этого каталога.

Несколько вещей, которые стоит знать:

  • На Windows используйте путь в стиле Windows в -v (d:/path/to/repositories.yaml:/config/...). В Git Bash добавьте префикс MSYS_NO_PATHCONV=1 к команде, иначе путь будет переписан.

  • Белый список монтируется, а не встраивается. Он называет репозитории, к которым сервер может обращаться; этот список принадлежит тому, кто запускает образ, а не образу.

  • --setup завершается с кодом 2 в контейнере, сообщая, где можно запустить настройку. Ротация токена означает перезапуск с новым.

  • Контейнер работает как непривилегированный пользователь, только для чтения, со всеми отброшенными capabilities.

Подключение к общему серверу

Общее развёртывание — несколько человек, один сервер, у каждого своя учётная запись Bitbucket — работает за одним origin. И конечная точка MCP, и Keycloak обслуживаются с него, потому что issuer — это строка, которая должна означать одно и то же в токене, документе обнаружения, браузере и конфигурации.

Ни Claude Desktop, ни Claude Code не обращаются к серверу напрямую через localhost. Пользовательский коннектор Claude загружается инфраструктурой Anthropic, а не вашей машиной, поэтому сервер на вашем ноутбуке недостижим, как бы он ни был настроен. Локальный цикл идёт через mcp-remote: мост stdio, который работает на вашей машине, выполняет поток OAuth в вашем браузере и говорит по HTTP с сервером. Как только у сервера появляется публичный https-адрес, пользовательский коннектор достигает его напрямую, и мост больше не нужен.

Какой client id куда

В realm есть три OAuth-клиента, потому что аутентифицируются три разные вещи, и они не взаимозаменяемы. Использование неправильного терпит неудачу на первом шаге, с Invalid parameter: redirect_uri на странице ошибки Keycloak — которая называет параметр, а не клиента, и это одно и то же сообщение для любой причины.

Что вы настраиваете

Client id

Secret

Пользовательский коннектор в настройках Claude

bitbucket-pr-review

BB_MCP_CONNECTOR_CLIENT_SECRET

mcp-remote для Claude Code или Desktop

bitbucket-pr-review-cli

нет — это публичный клиент

Ничего. Этот сервер использует его сам для /connect

bitbucket-pr-review-web

BB_MCP_OIDC_CLIENT_SECRET

Разделение следует за тем, куда попадает callback. Callback коннектора — https://claude.ai/api/mcp/auth_callback, на инфраструктуре Anthropic, поэтому этот клиент конфиденциальный, и его секрет живёт там. Callback моста — это порт loopback на чьём-то ноутбуке, поэтому этот клиент вообще не содержит секрета — секрет в файле конфигурации на ноутбуке — это не секрет, и PKCE защищает поток loopback. Регистрация размещённого callback на публичном клиенте передала бы конфиденциальный поток клиенту, который не может ничего хранить, поэтому он не зарегистрирован, и Keycloak отказывает в этом.

Скопируйте .env.example в .env, затем запустите:

cp .env.example .env      # fill in the secrets; the defaults are the loopback stack
docker compose --profile shared up -d

Это поднимет Postgres, Keycloak, nginx и сервер ревью. docker compose --profile shared ps должен показать четыре здоровых контейнера, и http://localhost:8080/mcp должен отвечать 401 с заголовком WWW-Authenticate, называющим область bitbucket:review — отказ неаутентифицированному запросу — это работающая система.

Claude Code

Зарегистрируйте мост один раз, для всех проектов, с -s user:

claude mcp add bitbucket-pr-review -s user -- npx -y mcp-remote http://localhost:8080/mcp 3334 --allow-http --static-oauth-client-info "{\"client_id\":\"bitbucket-pr-review-cli\"}"

-s user записывает его в ключ верхнего уровня mcpServers в ~/.claude.json, который применяется в каждом каталоге. Альтернативы: -s local (только этот проект, также в ~/.claude.json, в разделе projects) и -s project (закоммиченный .mcp.json). Не регистрируйте его более чем в одной области: конфигурации раздельны, область пользователя выигрывает, и та, которую вы редактируете позже, может не быть используемой.

Проверьте:

claude mcp get bitbucket-pr-review

что должно сообщить Scope: User config и Status: ✔ Connected. Сессия подхватывает MCP- серверы при запуске, поэтому уже запущенный Claude Code не увидит только что зарегистрированный сервер, пока не будет перезапущен.

Выдача кому-то учётной записи

В realm поставляется один пользователь, dev / dev-only-not-for-production, который является учётными данными для разработки и говорит об этом. Всем остальным нужна учётная запись в Keycloak, прежде чем они смогут войти — это отдельная вещь от подключения их учётной записи Bitbucket впоследствии, которую они делают сами на /connect.

В консоли администратора. Откройте http://localhost:8080/admin, войдите как bootstrap-администратор (KC_BOOTSTRAP_ADMIN_USERNAME / KC_BOOTSTRAP_ADMIN_PASSWORD из вашего .env), переключите выбор realm с master на streamstech, затем Users → Add user. Заполните имя пользователя, email, имя и фамилию, отметьте Email verified и создайте. Затем Credentials → Set password и выключите Temporary, если только вы не хотите, чтобы их попросили сменить пароль при первом входе.

Или из командной строки, что проще повторить:

docker exec bitbucket-pr-review-mcp-keycloak-1 /opt/keycloak/bin/kcadm.sh \
  config credentials --server http://localhost:8080 --realm master \
  --user admin --password "$KC_BOOTSTRAP_ADMIN_PASSWORD"

docker exec bitbucket-pr-review-mcp-keycloak-1 /opt/keycloak/bin/kcadm.sh \
  create users -r streamstech \
  -s username=somebody -s email=somebody@example.com -s emailVerified=true \
  -s firstName=Some -s lastName=Body -s enabled=true

docker exec bitbucket-pr-review-mcp-keycloak-1 /opt/keycloak/bin/kcadm.sh \
  set-password -r streamstech --username somebody --new-password 'their-password'

В Git Bash добавьте перед каждой из этих команд MSYS_NO_PATHCONV=1, иначе /opt/keycloak/... будет переписан в путь Windows, и docker exec сообщит, что файл не существует.

Две вещи, которые легко перепутать, и обе приводят к ошибке при входе, а не при создании, с сообщением, которое не указывает на причину:

  • Имя и фамилия обязательны. Профиль пользователя Keycloak считает их обязательными, поэтому учетная запись, созданная без них, аутентифицируется с ошибкой invalid_grant: Account is not fully set up. Ничто не предупреждает вас при создании учетной записи.

  • kcadm.sh set-password без -t уже является постоянным; передача -t делает его временным и оставляет то же обязательное действие в ожидании.

Никакие роли или членство в группах не нужны. Новая учетная запись автоматически получает default-roles-streamstech, и этого достаточно — этот сервер авторизует по области bitbucket:review, которая запрашивается во время OAuth-потока и на которую дается согласие, а не предоставляется заранее.

Учетные записи хранятся в базе данных Keycloak, которая является томом. Они переживают перезапуски, но не переживают docker volume rm bitbucket-pr-review-mcp_keycloak-db.

Claude Desktop

В Claude Desktop нет команды mcp add; вы редактируете claude_desktop_config.json вручную. Где он находится, зависит от того, как был установлен Claude:

Установка

Путь

Windows

%APPDATA%\Claude\claude_desktop_config.json

Windows, Microsoft Store

%LOCALAPPDATA%\Packages\Claude_*\LocalCache\Roaming\Claude\claude_desktop_config.json

macOS

~/Library/Application Support/Claude/claude_desktop_config.json

Путь для Store — это тот, который чаще всего подводит людей — установка из Store полностью игнорирует файл %APPDATA%, и редактирование неправильного ничего не меняет без какой-либо ошибки.

{
  "mcpServers": {
    "bitbucket-pr-review": {
      "command": "cmd",
      "args": [
        "/c", "npx",
        "-y", "mcp-remote",
        "http://localhost:8080/mcp",
        "3335",
        "--allow-http",
        "--static-oauth-client-info", "{\"client_id\":\"bitbucket-pr-review-cli\"}"
      ]
    }
  }
}

deploy/claude_desktop_config.example.json содержит то же самое. Две детали там выполняют реальную работу:

  • cmd /c перед npx в Windows. Claude Desktop не запускает через оболочку, поэтому голый "command": "npx" разрешается в пакетный файл, чей собственный путь содержит пробел, и всё умирает с ошибкой 'C:\Program' is not recognized as an internal or external command в журнале ниже. На macOS уберите cmd и /c и используйте "command": "npx".

  • Порт 3335, а не 3334. Это число — собственный порт loopback моста, и регистрация Claude Code уже использует 3334. Два моста на одном порту означают, что тот, который запускается вторым, не сможет получить свой OAuth-обратный вызов. Realm регистрирует http://127.0.0.1:*/oauth/callback, так что подойдет любой свободный порт.

Перезапустите Claude Desktop — полностью, из трея, так как закрытие окна оставляет его работающим — и проверьте, что он запустился:

tail -f "$LOCALAPPDATA/Packages/Claude_*/LocalCache/Roaming/Claude/logs/mcp-server-bitbucket-pr-review.log"

Proxy established successfully between local STDIO and remote StreamableHTTPClientTransport — это строка, означающая, что мост общается с сервером. Server transport closed unexpectedly означает, что он вместо этого завершился — причина на несколько строк выше.

Первый вызов инструмента затем открывает вход в Keycloak (dev / dev-only-not-for-production в development realm, или учетная запись, которую вы создали выше). После входа вызов инструмента отвечает ссылкой на /connect, где вы подключаете свою учетную запись Atlassian — эта страница также заставляет браузер войти, поэтому ссылку безопасно видеть в транскрипте.

Несколько вещей, которые стоит знать:

  • Мост — это публичный OAuth-клиент, без секрета. Секрет клиента в конфигурационном файле на ноутбуке — это не секрет; PKCE — это то, что защищает loopback-поток.

  • Его обратный вызов — http://127.0.0.1:3334/oauth/callback — IP-литерал, а не localhost, и /oauth/callback, а не /callback от Claude Code. Realm регистрирует все из них, потому что ошибка приводит к сбою на последнем шаге потока.

  • --allow-http обязателен, пока сервер работает на обычном http. Реальное развертывание — это https, и этот сервер отказывается описывать себя через http где-либо, кроме loopback.

  • Аргумент 3334 — это собственный порт моста, и realm регистрирует обратный вызов на нем. Два клиента Claude, работающие одновременно через мост, должны использовать разные порты.

  • Значения по умолчанию профиля shared — это конфигурация для разработки — bootstrap-администратор, чей пароль находится в docker-compose.yaml, realm с пользователем, чей пароль находится в файле realm, и обычный http на loopback. Каждый из них — это переменная с значением по умолчанию, поэтому реальное развертывание переопределяет их в .env, а не редактирует какой-либо файл. См. docs/deploying-the-shared-server.md.

  • Изменение origin требует повторного импорта realm. Realm импортируется один раз, в базу данных Keycloak; --import-realm оставляет существующий realm нетронутым. Удалите этот том по имени — docker volume rm bitbucket-pr-review-mcp_keycloak-db — и никогда не используйте down -v, который заберет с собой хранилище учетных данных.

Управление им

uv run bb-pr-mcp --health
uv run bb-pr-mcp --rotate-key /path/to/new.key

--health сообщает, пригодно ли развертывание для работы — TLS, ключ хранилища, хранилище, список разрешенных, доступен ли сервер авторизации и сколько людей подключено — и завершается с кодом 0 (здоров), 1 (есть на что посмотреть), 2 (это не запустится).

--rotate-key повторно запечатывает все сохраненные учетные данные под новым ключом без повторного включения кого-либо, затем сообщает вам порядок выполнения остальных действий.

Прочтите docs/deploying-the-shared-server.md перед запуском этого где-либо в реальной среде. В нем указано, во что обходится одна компрометация хоста, что больше, чем кажется, и что с этим делать.

Кто подключен, и как снять кого-то

uv run bb-pr-mcp --who
uv run bb-pr-mcp --revoke alice@streamstech.com

--who перечисляет всех, кто подключил учетную запись Bitbucket: непрозрачный идентификатор, электронную почту Atlassian, когда они подключились и когда истекает их токен. Он расшифровывает хранилище, чтобы ответить, а затем выводит всё, кроме одного поля, которое стоит расшифровывать.

--revoke удаляет сохраненные учетные данные одного человека. Он принимает email или достаточную часть непрозрачного идентификатора, чтобы быть однозначным, и отказывается, а не угадывает, когда имя совпадает с двумя людьми. Отзыв вступает в силу при следующем вызове инструмента, в том числе на сервере, который уже запущен — общий сервер читает учетные данные напрямую, а не хранит их, именно для того, чтобы оператор в другом терминале не ждал перезапуска.

Чего он не делает — это та часть, которую стоит прочитать. Три места хранят что-то после ухода кого-то, и эта команда владеет одним из них:

  • Здесь. Сохраненные учетные данные удалены.

  • Keycloak. Они все еще могут войти и подключить новый токен. Отключите их учетную запись там, чтобы это остановить.

  • Atlassian. Их API-токен все еще существует и все еще работает везде. Только они, или администратор Atlassian, могут отозвать его.

Команда говорит все три каждый раз, потому что чек-лист по выходу, который отмечается после первого шага, хуже, чем отсутствие чек-листа.

Ни то, ни другое не является инструментом, и это намеренно: описание pull request не должно иметь возможности уговорить Caller отключить коллегу.

Инструменты

Инструмент

Что делает

bitbucket_get_pull_request

Заголовок, состояние, автор, ветки и основание для рецензирования

bitbucket_get_pull_request_changes

Каждый измененный файл с количеством, помечая двоичные, сгенерированные и lockfile-записи

bitbucket_get_pull_request_diff

Весь diff или один файл — с якорной боковой панелью, показывающей номер каждой строки

bitbucket_get_pr_comments

Существующий разговор, с якорями, устаревшими флагами и какие комментарии принадлежат серверу

bitbucket_add_pr_comment

Опубликовать одно замечание или весь обзор; полностью проверено перед отправкой

bitbucket_update_pr_comment

Опубликовать или обновить один сводный комментарий

bitbucket_get_repository

Метаданные и ветка по умолчанию

bitbucket_get_file

Любой файл в разрешенном репозитории, по ref

bitbucket_get_directory

Список каталога, по ref

bitbucket_get_commits

История для ref или pull request

bitbucket_search_code

Поиск кода внутри одного разрешенного репозитория

Pull request называется одной строкой: либо URL Bitbucket, либо сокращением workspace/repo/id.

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

Всё ниже имеет рабочее значение по умолчанию. Установите их в окружении или в файле .env, все с префиксом BB_MCP_:

Настройка

По умолчанию

Что делает

BB_MCP_REPOSITORIES_FILE

config/repositories.yaml

Где находится список разрешенных

BB_MCP_LOG_LEVEL

INFO

Журналы идут в stderr, никогда в stdout

BB_MCP_LOG_JSON

false

Один JSON-объект на строку, для отправки в агрегатор

BB_MCP_REQUEST_TIMEOUT_SECONDS

30

Таймаут на запрос

BB_MCP_MAX_DIFF_CHARACTERS

60000

Потолок ответа diff

BB_MCP_MAX_FILE_CHARACTERS

40000

Потолок ответа файла

BB_MCP_MAX_CHANGED_FILES

300

Строки манифеста

BB_MCP_MAX_DIRECTORY_ENTRIES

200

Строки каталога

BB_MCP_MAX_COMMITS

50

Строки коммитов

BB_MCP_MAX_SEARCH_RESULTS

25

Совпадения поиска

BB_MCP_MAX_COMMENTS

200

Комментарии, прочитанные на pull request

Существуют еще два, и они пусты, пока общее развертывание не завершено — описанная выше установка на устройство не нуждается ни в одном из них, потому что у stdio ровно один вызывающий:

Настройка

Что делает

BB_MCP_PUBLIC_URL

Адрес, к которому подключается Claude, в точности как он введён в коннекторе. Именно этот адрес токены должны указывать в качестве своей аудитории

BB_MCP_OIDC_ISSUER

Realm в Keycloak, выпускающий эти токены. Он должен в точности совпадать с issuer в discovery-документе этого realm — завершающий слэш уже является отличием

BB_MCP_VAULT_FILE

Здесь хранятся учётные данные для каждого пользователя. Они зашифрованы с помощью BB_MCP_VAULT_KEY, который не является настройкой, поскольку не должен храниться в .env рядом с данными

BB_MCP_OIDC_CLIENT_ID

Клиент Keycloak, через который этот сервер выполняет вход пользователей, чтобы страница, которая запрашивает API-токен, могла спросить, кто они

BB_MCP_OIDC_CLIENT_SECRET

Секрет этого клиента. Требуется для страницы подключения; без него вызывающая сторона без учётных данных получит сообщение о том, что настройка недоступна, а не будет перенаправлена в бесполезное место

Каждый лимит явно указывается в ответе, когда он срабатывает. Усечение никогда не происходит молча: Caller, который не может отличить усечённый diff от полного, сочтёт недостающую половину просмотренной, исходя из предположения, что с ней всё в порядке.

Разработка

uv run pytest                    # the suite
uv run pytest --cov=src          # with coverage
uv run ruff check src tests      # lint
uv run ruff format src tests     # format

Тесты никогда не обращаются к сети. Точка разделения — это HTTP-транспорт и только он, поэтому защитная проверка, список разрешённых и каждый модуль чтения ответов проверяются как боевой код. В tests/recorded/ хранятся ответы, записанные при работе с реальным pull request — см. docs/architecture.md, почему это важнее, чем кажется.

A
license - permissive license
Not graded
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables AI assistants to interact with Bitbucket Cloud repositories, allowing users to manage pull requests, comments, tasks, and branches through natural language commands.
    4,138
    1
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    Enables management of Bitbucket Cloud pull requests through natural language, including creating, reviewing, approving, and commenting on PRs with automatic default reviewer support.
    79
    1
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI assistants to programmatically manage Bitbucket Cloud resources, including pull requests, repositories, and branches, automating code review workflows.
    189
    MIT

View all related MCP servers

Related MCP Connectors

  • A Model Context Protocol (MCP) application for automated GitHub PR analysis and issue management.…

  • Screens public GitHub repos and PRs to generate risk maps, findings, and merge-readiness signals.

  • Risk-scan a diff, flag AI-generated-code tells, find secrets. 5 of 7 tools need no account.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/6shihab/bitbucket-pr-review-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server