Appcircle MCP Server
официальныйОфициальный MCP-сервер Appcircle
Что можно делать с Appcircle MCP?
- Список и поиск профилей сборки — Получение постраничных профилей сборки и фильтрация по имени с помощью
get_build_profiles. - Просмотр конфигураций сборки и рабочих процессов — Получение сведений о конкретном профиле сборки, его конфигурациях и рабочих процессах с помощью
get_build_profile_details,get_build_configuration_detailsиget_workflow_detail. - Просмотр подписывающих удостоверений — Вывод списка сертификатов, хранилищ ключей, профилей подготовки и идентификаторов пакетов через
get_certificates,get_keystores,get_provisioning_profilesиget_bundle_identifiers. - Проверка статуса тестирования и корпоративного распространения — Получение профилей распространения и их версий приложений с помощью
get_distribution_profilesиget_distribution_profile_details, или просмотр профилей корпоративного магазина черезget_store_profiles. - Создание отчетов о состоянии CI/CD и истории сборок — Используйте
get_build_insights_reportдля агрегированных трендов и анализа первопричин, илиget_build_history_reportдля необработанных записей сборок.
Документация
Appcircle MCP Server
MCP-сервер для Appcircle: предоставляет инструменты сборки, идентификации подписей, тестового распространения, корпоративного магазина приложений, публикации в магазины и отчетности любому MCP-совместимому клиенту (Claude Desktop, Cursor, VS Code и др.). Appcircle MCP Server выступает в роли моста между инструментами ИИ и Appcircle, позволяя ИИ-агентам, ассистентам и чат-ботам безопасно получать доступ и взаимодействовать с ресурсами Appcircle через структурированные, управляемые инструменты на уровне задач.
Варианты использования
- Интеллектуальный CI/CD и рабочие процессы: отслеживание запусков пайплайнов, отслеживание статуса релизов и получение аналитики по вашим мобильным CI/CD рабочим процессам.
- Аналитика конфигураций и окружения: запрос конфигураций сборки и настройки подписей для понимания того, как настроен проект и где могут возникать проблемы.
- Отчетность и операционная аналитика: создание сводок по стабильности CI, повторяющимся проблемам, производительности пайплайнов и общему состоянию CI/CD.
Режимы работы
Вы можете использовать MCP-сервер четырьмя способами:
| Режим | Краткое описание |
|---|---|
| 1. Удаленный хост | Подключение к https://mcp.appcircle.io. Локальная установка не требуется; ваш клиент отправляет ваш токен Appcircle (например, Authorization: Bearer <token>) при каждом запросе. |
| 2. Локальный (stdio) | Запуск сервера из исходного кода: клонируйте репозиторий, при необходимости используйте venv, затем выполните appcircle-mcp (транспорт по умолчанию — stdio). Требуются Python и pip. Установите APPCIRCLE_ACCESS_TOKEN в переменных окружения. Ваш MCP-клиент запускает сервер как подпроцесс. |
| 3. Локальный (streamable-http) | Запуск сервера локально через HTTP: используйте --transport streamable-http и, при необходимости, --host / --port (например, appcircle-mcp --transport streamable-http --host 127.0.0.1 --port 8000). Клиенты подключаются к этому URL и отправляют свой токен в запросе. |
| 4. Локальный (Docker) | Запуск официального Docker-образа на вашей машине. Требуется Docker. Используйте порт образа по умолчанию или переопределите его с помощью --port; точные инструкции смотрите в документации образа. |
Подробная конфигурация клиентов (Cursor, Claude и др.) находится в специальных руководствах по установке; этот раздел представляет собой лишь краткий обзор.
Установка
Руководства по настройке для конкретных клиентов:
- Приложения Claude — Руководство по установке для Claude Desktop и Claude Code CLI.
- Cursor IDE — Руководство по установке для Cursor IDE.
- Codex — Руководство по установке для приложения Codex и Codex CLI.
- Antigravity IDE — Руководство по установке для Antigravity IDE.
- VS Code (GitHub Copilot) — Руководство по установке для VS Code с GitHub Copilot.
- Windsurf IDE — Руководство по установке для Windsurf IDE.
- Gemini CLI — Руководство по установке для Gemini CLI.
- GitHub Copilot CLI — Руководство по установке для GitHub Copilot CLI.
Конфигурация (Переменные окружения)
| Переменная | Обязательная | Описание |
|---|---|---|
APPCIRCLE_ACCESS_TOKEN | Да (только stdio) | Токен доступа к API Appcircle. Обязателен при использовании транспорта stdio. Для streamable-http каждый клиент отправляет свой собственный токен. См. Получение токена для информации о том, как его получить. |
APPCIRCLE_API_URL | Нет | Базовый URL API (по умолчанию: https://api.appcircle.io может отличаться для пользователей self-hosted). |
APPCIRCLE_MCP_ALLOWED_HOST | Нет (только streamable-http) | Публичное имя хоста для MCP-сервера (например, mcp.appcircle.io). Установите это при развертывании за обратным прокси, чтобы сервер принимал заголовок Host от клиентов. Не указывайте для localhost. |
APPCIRCLE_MCP_PORT | Нет (только streamable-http) | Порт привязки для HTTP-сервера (по умолчанию: 8000). Переопределяется переменной --port, если она указана. Полезно для on-prem или Docker, когда требуется определенный порт. |
LOG_LEVEL | Нет | Уровень логирования, например, DEBUG, INFO (по умолчанию: INFO). |
APPCIRCLE_EXCLUDED_TOOLSETS | Нет | Разделенный запятыми список наборов инструментов для исключения (например, build_module,report). См. Наборы инструментов ниже. |
Установите их в вашей оболочке или в конфигурации вашего MCP-клиента.
Наборы инструментов
Доступные наборы инструментов
Доступны следующие наборы инструментов:
| Набор инструментов | Описание |
|---|---|
build_module | Профили сборки, конфигурации, рабочие процессы, коммиты и операции пайплайна |
signing_identities | Идентификаторы подписей и идентификаторы пакетов |
testing_distribution | Профили тестового распространения и детали распространения |
publish_to_stores | Профили публикации и операции публикации в магазины |
enterprise_app_store | Профили корпоративного магазина приложений и детали магазина |
report | Отчетность: история сборок, распространение, подписание, статус публикации и связанные отчеты |
Вы можете исключить один или несколько наборов инструментов, чтобы их инструменты не регистрировались. Исключения можно задать через аргументы CLI или переменную окружения APPCIRCLE_EXCLUDED_TOOLSETS; оба варианта объединяются (объединение).
- CLI:
--exclude toolset1 toolset2или--exclude-toolsets toolset1,toolset2 - Окружение:
APPCIRCLE_EXCLUDED_TOOLSETS=build_module,report
Пример конфигурации MCP (Cursor / Claude Desktop) с исключениями:
{
"mcpServers": {
"appcircle": {
"command": "appcircle-mcp",
"args": ["--exclude", "report"]
}
}
}
Инструменты
Инструменты предоставляются через MCP tools/list. Справочник ниже перечисляет все инструменты по наборам; форму ответа и примеры см. в docs/tool_contract.md.
Сборка
-
get_build_profiles — Получить профили сборки для текущей организации (с пагинацией). Опционально фильтровать по имени профиля.
- Уровень доступа: чтение
page: Номер страницы (начиная с 1). По умолчанию: 1. (число, опционально)size: Размер страницы (1-100). По умолчанию: 25. Значения выше 100 ограничиваются 100. (число, опционально)search: Опциональный поисковый запрос для фильтрации профилей по имени (частичное совпадение без учета регистра). (строка, опционально)
-
get_build_profile_details — Получить один профиль сборки по ID, опционально включая его конфигурации сборки.
- Уровень доступа: чтение
profile_id: ID профиля сборки (например, UUID). (строка, обязательно)configurations: Если true, также получить конфигурации сборки профиля. По умолчанию: false. (логическое, опционально)
-
get_build_configuration_details — Получить одну конфигурацию сборки по ID профиля и ID конфигурации.
- Уровень доступа: чтение
profile_id: ID профиля сборки (например, UUID). (строка, обязательно)configuration_id: ID конфигурации сборки (например, UUID). (строка, обязательно)
-
get_build_profile_workflows — Получить рабочие процессы для профиля сборки по ID профиля.
- Уровень доступа: чтение
profile_id: ID профиля сборки (например, UUID). (строка, обязательно)
-
get_workflow_detail — Получить один рабочий процесс по ID профиля сборки и ID рабочего процесса.
- Уровень доступа: чтение
profile_id: ID профиля сборки (например, UUID). (строка, обязательно)workflow_id: ID рабочего процесса (например, UUID). (строка, обязательно)
-
get_commits_by_branch — Получить коммиты для ветки сборки (с пагинацией).
- Уровень доступа: чтение
branch_id: ID ветки (например, UUID). (строка, обязательно)page: Номер страницы (начиная с 1). Если указан вместе с size, включает пагинацию. По умолчанию: 1. (число, опционально)size: Размер страницы. Если указан вместе с page, включает пагинацию. По умолчанию: 25, макс. 100. (число, опционально)
-
get_commit_details — Получить один коммит по ID коммита (UUID) или по хешу коммита (git SHA). Укажите либо commit_id, либо commit_hash, но не оба сразу.
- Уровень доступа: чтение
commit_id: ID коммита (UUID). (строка, опционально)commit_hash: Хеш коммита (git SHA). (строка, опционально)
Идентификаторы подписей
-
get_bundle_identifiers — Получить все идентификаторы пакетов для организации (идентификаторы пакетов приложений iOS/macOS).
- Уровень доступа: чтение
- Без параметров.
-
get_certificates — Получить все сертификаты подписи для организации. Конфиденциальные поля (p12Password, p12Binary, metaData, thumbprint) опущены.
- Уровень доступа: чтение
- Без параметров.
-
get_keystores — Получить все хранилища ключей для организации (например, хранилища ключей подписи Android). Конфиденциальные поля (password, aliasPassword, binary, checkSum, sha256FingerPrint) опущены.
- Уровень доступа: чтение
- Без параметров.
-
get_provisioning_profiles — Получить профили обеспечения для организации (например, iOS/macOS). Конфиденциальные/большие поля (binary, metaData, certificateThumbPrints, provisionedDevices, connectApiKeyId) опущены. Опционально фильтровать по ID приложения (пакета).
- Уровень доступа: чтение
app_id: Опциональный ID приложения (пакета) для фильтрации профилей обеспечения (например, com.example.app). (строка, опционально)
Тестовое распространение
-
get_distribution_profiles — Получить профили тестового распространения для текущей организации (с пагинацией). Опционально фильтровать по имени профиля.
- Уровень доступа: чтение
page: Номер страницы (начиная с 1). По умолчанию: 1. (число, опционально)size: Размер страницы (1-100). По умолчанию: 25, макс. 100. (число, опционально)search: Опциональный поисковый запрос для фильтрации профилей по имени. (строка, опционально)
-
get_distribution_profile_details — Получить один профиль тестового распространения по ID (с опциональной пагинацией версий приложения).
- Уровень доступа: чтение
profile_id: ID профиля распространения (например, UUID). (строка, обязательно)page: Номер страницы для версий приложения (начиная с 1). По умолчанию: 1. (число, опционально)size: Размер страницы для версий приложения (1-100). По умолчанию: 25, макс. 100. (число, опционально)
Публикация в магазины
-
get_publish_profiles — Получить профили публикации для текущей организации для заданного типа платформы (с пагинацией). Опционально фильтровать по статусу потока.
- Уровень доступа: чтение
platform_type: Тип платформы профилей публикации ("ios" или "android"). (строка, обязательно)page: Номер страницы (начиная с 1). По умолчанию: 1. (число, опционально)size: Размер страницы (1-100). По умолчанию: 25, макс. 100. (число, опционально)flow_status: Опциональный код статуса потока для фильтрации (например, 0=Успех, 1=Ошибка, 91=Выполняется). (число, опционально)
-
get_publish_profile_details — Получить один профиль публикации по типу платформы и ID (с опциональной пагинацией версий приложения).
- Уровень доступа: чтение
platform_type: Тип платформы ("ios" или "android"). (строка, обязательно)profile_id: ID профиля публикации (например, UUID). (строка, обязательно)page: Номер страницы для версий приложения (начиная с 1). По умолчанию: 1. (число, опционально)size: Размер страницы для версий приложения (1-100). По умолчанию: 25, макс. 100. (число, опционально)
Корпоративный магазин приложений
-
get_store_profiles — Получить профили корпоративного магазина приложений для текущей организации (с пагинацией).
- Уровень доступа: чтение
page: Номер страницы (начиная с 1). По умолчанию: 1. (число, опционально)size: Размер страницы (1-100). По умолчанию: 25, макс. 100. (число, опционально)
-
get_store_profile_details — Получить один профиль корпоративного магазина приложений по ID (с опциональной пагинацией версий приложения).
- Уровень доступа: чтение
profile_id: ID профиля корпоративного магазина приложений (например, UUID). (строка, обязательно)page: Номер страницы для версий приложения (начиная с 1). По умолчанию: 1. (число, опционально)size: Размер страницы для версий приложения (1-100). По умолчанию: 25, макс. 100. (число, опционально)
Отчет
- **get_build_history_report** — Получить отчёт об истории сборок, опционально отфильтрованный по диапазону дат, профилю сборки и организации. С постраничной навигацией. - **Уровень доступа:** чтение - `start_date`: Опциональная дата начала (ГГГГ-ММ-ДД). (строка, опционально) - `end_date`: Опциональная дата окончания (ГГГГ-ММ-ДД). (строка, опционально) - `page`: Номер страницы (по умолчанию: 1). (число, опционально) - `size`: Элементов на странице (1-100, по умолчанию: 50). (число, опционально) - `build_profile_name`: Фильтр по имени профиля сборки. (строка, опционально) - `organization_id`: Фильтр по UUID организации. (строка, опционально)-
get_build_insights_report — Получить вычисленный отчёт Build Insights (снимок состояния и тренды, первопричина, состояние артефактов, качество рабочего процесса, время в очереди и оценка зрелости) по истории сборок, агрегированный на стороне сервера. В отличие от get_build_history_report, этот метод внутренне получает все страницы и возвращает небольшие предварительно агрегированные результаты вместо сырых записей.
- Уровень доступа: чтение
start_date: Опциональная дата начала (ГГГГ-ММ-ДД) для текущего периода. По умолчанию: последние 30 дней. (строка, опционально)end_date: Опциональная дата окончания (ГГГГ-ММ-ДД) для текущего периода. (строка, опционально)sections: Опциональный список разделов для вычисления:health_snapshot,root_cause,artifact_health,workflow_quality,queue_time,maturity_assessment. По умолчанию: все шесть. (массив строк, опционально)include_sub_orgs: Если true, сохранять записи сборок из других организаций в метриках, основанных на истории, вместо фильтрации по собственной организации токена. По умолчанию: false. (логическое, опционально)
-
get_distribution_app_version_report — Получить ежедневный отчёт об использовании распространённых версий приложений. С постраничной навигацией; поддерживает фильтры по профилю, ОС, организации.
- Уровень доступа: чтение
start_date: Опциональная дата начала (ГГГГ-ММ-ДД). (строка, опционально)end_date: Опциональная дата окончания (ГГГГ-ММ-ДД). (строка, опционально)page: Номер страницы (по умолчанию: 1). (число, опционально)size: Элементов на странице (1-100, по умолчанию: 50). (число, опционально)profile_name: Фильтр по имени профиля распространения. (строка, опционально)os: Фильтр по ОС ("ios" или "android"). (строка, опционально)organization_id: Фильтр по UUID организации. (строка, опционально)
-
get_distribution_sent_report — Получить ежедневный отчёт об использовании отправленных приложений. С постраничной навигацией; поддерживает фильтры по профилю, ОС, организации.
- Уровень доступа: чтение
start_date: Опциональная дата начала (ГГГГ-ММ-ДД). (строка, опционально)end_date: Опциональная дата окончания (ГГГГ-ММ-ДД). (строка, опционально)page: Номер страницы (по умолчанию: 1). (число, опционально)size: Элементов на странице (1-100, по умолчанию: 50). (число, опционально)profile_name: Фильтр по имени профиля распространения. (строка, опционально)os: Фильтр по ОС ("ios" или "android"). (строка, опционально)organization_id: Фильтр по UUID организации. (строка, опционально)
-
get_enterprise_app_store_app_usage_report — Получить отчёт об использовании приложений для корпоративного магазина приложений. start_date и end_date обязательны. С постраничной навигацией.
- Уровень доступа: чтение
start_date: Дата начала (ГГГГ-ММ-ДД). (строка, обязательно)end_date: Дата окончания (ГГГГ-ММ-ДД). (строка, обязательно)page: Номер страницы (по умолчанию: 1). (число, опционально)size: Элементов на странице (1-100, по умолчанию: 50). (число, опционально)organization_id: Опциональный фильтр по UUID организации. (строка, опционально)
-
get_publish_resign_report — Получить отчёт о переподписании публикаций, опционально отфильтрованный по диапазону дат, имени приложения, организации и статусу. С постраничной навигацией.
- Уровень доступа: чтение
start_date: Опциональная дата начала (ГГГГ-ММ-ДД). (строка, опционально)end_date: Опциональная дата окончания (ГГГГ-ММ-ДД). (строка, опционально)page: Номер страницы (по умолчанию: 1). (число, опционально)size: Элементов на странице (1-100, по умолчанию: 50). (число, опционально)app_name: Фильтр по имени приложения. (строка, опционально)organization_id: Фильтр по UUID организации. (строка, опционально)status: Фильтр по статусу переподписания (0=ожидание, 1=обработка, 2=успешно, 3=неудача, 4=отменено, 5=тайм-аут). (число, опционально)
-
get_publish_status_report — Получить отчёт о статусе публикаций, опционально отфильтрованный по диапазону дат, имени приложения, организации и статусу. С постраничной навигацией.
- Уровень доступа: чтение
start_date: Опциональная дата начала (ГГГГ-ММ-ДД). (строка, опционально)end_date: Опциональная дата окончания (ГГГГ-ММ-ДД). (строка, опционально)page: Номер страницы (по умолчанию: 1). (число, опционально)size: Элементов на странице (1-100, по умолчанию: 50). (число, опционально)app_name: Фильтр по имени приложения. (строка, опционально)organization_id: Фильтр по UUID организации. (строка, опционально)status: Фильтр по статусу публикации (например, 0=Успех, 1=Неудача, 91=Выполняется). (число, опционально)
-
get_signing_report — Получить отчёт о подписании, опционально отфильтрованный по диапазону дат, организации, ОС и статусу сборки. С постраничной навигацией.
- Уровень доступа: чтение
start_date: Опциональная дата начала (ГГГГ-ММ-ДД). (строка, опционально)end_date: Опциональная дата окончания (ГГГГ-ММ-ДД). (строка, опционально)page: Номер страницы (по умолчанию: 1). (число, опционально)size: Элементов на странице (1-100, по умолчанию: 50). (число, опционально)organization_id: Фильтр по UUID организации. (строка, опционально)os: Фильтр по ОС ("ios" или "android"). (строка, опционально)build_status: Фильтр по статусу сборки (например, 0=Успех, 1=Неудача, 91=Выполняется). (число, опционально)
Запуск сервера
Из корня репозитория:
python -m src.server
Или после pip install -e .:
appcircle-mcp
Сервер работает через stdio (или SSE/HTTP в зависимости от того, как его запускает ваш клиент).
Формат ответа
Каждый инструмент возвращает стандартную обёртку:
- Успех:
{ "success": true, "data": <payload>, "meta": { ... } }
data— это результат инструмента;metaопционально (например,count,page,filters). - Ошибка:
{ "success": false, "error": { "tool", "type", "message", "details" } }
Одинаковая структура для всех инструментов, чтобы клиенты могли единообразно обрабатывать ошибки.
Полная спецификация: docs/tool_contract.md.
Тестирование
Установка с зависимостями для разработки:
pip install -e ".[dev]"
Модульные тесты (по умолчанию)
Используют имитированный API; не требуется APPCIRCLE_ACCESS_TOKEN. По умолчанию pytest запускает только их (см. testpaths в pyproject.toml):
pytest test/unit/ -v
- Один файл:
pytest test/unit/tools/build_module/test_get_build_profiles.py -v - С покрытием:
pytest test/unit/ --cov=src --cov-report=term-missing
Интеграционные тесты
Обращаются к реальному API Appcircle. Установите APPCIRCLE_ACCESS_TOKEN в переменных окружения, затем выполните:
pytest test/integration/ -v
- Все интеграционные тесты:
pytest test/integration/ -v - По инструменту:
pytest test/integration/build_module/ -v,pytest test/integration/report/ -vи т. д. - По маркеру:
pytest -m integration -v(при запуске из корня репозитория; включает только интеграционные тесты, если собираются и модульные, и интеграционные)
Если APPCIRCLE_ACCESS_TOKEN не задана, интеграционные тесты пропускаются (без ошибки).
Опциональные переменные окружения для интеграционных тестов (когда обнаружение не удаётся или тестам нужны реальные ID; опустите, чтобы пропустить эти тесты):
| Переменная | Описание |
|---|---|
APPCIRCLE_TEST_ORGANIZATION_ID | UUID организации. Используется test_with_organization_id (отчёт об использовании приложений корпоративного магазина). |
APPCIRCLE_TEST_BRANCH_ID | UUID ветки. Используется get_commits_by_branch и связанными тестами, когда ветку не удаётся обнаружить через API. |
APPCIRCLE_TEST_COMMIT_ID | UUID коммита. Используется тестами get_commit_details, когда коммит не удаётся обнаружить через API. |
Безопасность
Этот проект зависит от сторонних пакетов с открытым исходным кодом, перечисленных в
pyproject.toml. Хотя мы фиксируем диапазоны версий зависимостей и
поставляем файл блокировки (uv.lock) с криптографическими хешами, эти пакеты
поддерживаются независимо и предоставляются «как есть». Appcircle не даёт никаких гарантий
относительно безопасности или надёжности сторонних зависимостей.
Рекомендуем проводить аудит установленных пакетов перед использованием:
uv run pip-audit