{
  "markdown": "# Appcircle MCP Server\n\nMCP server for [Appcircle](https://appcircle.io): exposes Build, Signing Identities, Testing Distribution, Enterprise App Store, Publish to Stores, and Reporting tools to any MCP-capable client (Claude Desktop, Cursor, VS Code, etc.). The Appcircle MCP Server acts as the bridge between AI tools and Appcircle; thus, AI agents, assistants and chatbots to safely access and interact with Appcircle resources through structured, governed, and task-level tools.\n\n## Use Cases\n\n- CI/CD and Workflow Intelligence: Monitor pipeline runs, track release status, and get insights into your mobile CI/CD workflows.\n- Configuration and Environment Insights: Query build configurations and signing setup to understand how a project is configured and where issues may originate.\n- Reporting and Operational Insights: Generate summaries of CI stability, recurring issues, pipeline performance, and overall CI/CD health. \n\n\n## Running Modes\n\nYou can use the MCP server in four ways:\n\n| Mode | Summary |\n|------|--------|\n| **1. Remote host** | Connect to **https://mcp.appcircle.io**. No local install; your client sends your Appcircle token (e.g. `Authorization: Bearer <token>`) on each request. |\n| **2. Local (stdio)** | Run the server from source: clone the repo, optionally use a venv, then run `appcircle-mcp` (default transport is stdio). Requires Python and pip. Set `APPCIRCLE_ACCESS_TOKEN` in the environment. Your MCP client runs the server as a subprocess. |\n| **3. Local (streamable-http)** | Run the server locally over HTTP: use `--transport streamable-http` and optionally `--host` / `--port` (e.g. `appcircle-mcp --transport streamable-http --host 127.0.0.1 --port 8000`). Clients connect to that URL and send their token in the request. |\n| **4. Local (Docker)** | Run the official Docker image on your machine. Requires Docker. Use the image’s default port or override with `--port`; see the image documentation for exact usage. |\n\nDetailed client configuration (Cursor, Claude, etc.) lives in the dedicated [installation guides](docs/installation_guides/claude_applications.md); this section is a high-level summary only.\n\n## Installation\n\nClient-specific setup guides:\n\n- **[Claude Applications](docs/installation_guides/claude_applications.md)** - Installation guide for Claude Desktop and Claude Code CLI.\n- **[Cursor IDE](docs/installation_guides/cursor.md)** - Installation guide for Cursor IDE.\n- **[Codex](docs/installation_guides/codex.md)** - Installation guide for Codex app and Codex CLI.\n- **[Antigravity IDE](docs/installation_guides/antigravity.md)** - Installation guide for Antigravity IDE.\n- **[VS Code (GitHub Copilot)](docs/installation_guides/vscode.md)** - Installation guide for VS Code with GitHub Copilot.\n- **[Windsurf IDE](docs/installation_guides/windsurf.md)** - Installation guide for Windsurf IDE.\n- **[Gemini CLI](docs/installation_guides/gemini_cli.md)** - Installation guide for Gemini CLI.\n - **[GitHub Copilot CLI](docs/installation_guides/copilot_cli.md)** - Installation guide for GitHub Copilot CLI.\n\n## Configuration (Environment Variables)\n\n| Variable | Required | Description |\n|----------|----------|-------------|\n| `APPCIRCLE_ACCESS_TOKEN` | Yes (stdio only) | Appcircle API access token. Required when using stdio transport. For streamable-http, each client sends its own token. See [Obtaining a token](docs/appcircle_access_token.md) for how to get one. |\n| `APPCIRCLE_API_URL` | No | API base URL (default: `https://api.appcircle.io` may differ for self-hosted users). |\n| `APPCIRCLE_MCP_ALLOWED_HOST` | No (streamable-http only) | Public hostname for the MCP server (e.g. `mcp.appcircle.io`). Set this when deploying behind a reverse proxy so the server accepts the `Host` header from clients. Omit for localhost. |\n| `APPCIRCLE_MCP_PORT` | No (streamable-http only) | Bind port for the HTTP server (default: `8000`). Overridden by `--port` if provided. Useful for on-prem or Docker when a specific port is required. |\n| `LOG_LEVEL` | No | Logging level, e.g. `DEBUG`, `INFO` (default: `INFO`). |\n| `APPCIRCLE_EXCLUDED_TOOLSETS` | No | Comma-separated toolsets to exclude (e.g. `build_module,report`). See [Toolsets](#toolsets) below. |\n| `AC_MCP_ENABLE_WRITE_TOOLS` | No | Write/action tools (e.g. `trigger_build`, `cancel_build`) are registered by default. Set to `false`/`0`/`no`/`off` to opt out and not register them at all (not just disable at call time). |\n\nSet these in your shell or in your MCP client’s configuration.\n\n## Toolsets\n\n### Available Toolsets\n\nThe following sets of tools are available:\n\n| Toolset | Description |\n|---------|-------------|\n| `build_module` | Build profiles, configurations, workflows, commits, and pipeline operations |\n| `signing_identities` | Signing identities and bundle identifiers |\n| `testing_distribution` | Testing distribution profiles and distribution details |\n| `publish_to_stores` | Publish profiles and store publishing operations |\n| `enterprise_app_store` | Enterprise app store profiles and store details |\n| `report` | Reporting: build history, distribution, signing, publish status, and related reports |\n\nYou can exclude one or more toolsets so their tools are not registered. Exclusions can be set via CLI arguments or the `APPCIRCLE_EXCLUDED_TOOLSETS` environment variable; both are merged (union).\n\n- **CLI:** `--exclude toolset1 toolset2` or `--exclude-toolsets toolset1,toolset2`\n- **Env:** `APPCIRCLE_EXCLUDED_TOOLSETS=build_module,report`\n\nExample MCP config (Cursor / Claude Desktop) with exclusions:\n\n```json\n{\n  \"mcpServers\": {\n    \"appcircle\": {\n      \"command\": \"appcircle-mcp\",\n      \"args\": [\"--exclude\", \"report\"]\n    }\n  }\n}\n```\n\n### Tools\n\nTools are exposed via MCP `tools/list`. Reference below lists all tools by toolset; for response shape and examples see [docs/tool_contract.md](docs/tool_contract.md).\n\n<!-- START AUTOMATED TOOLS -->\n<details>\n\n<summary>Build</summary>\n\n- **get_build_profiles** - Get build profiles for the current organization (paginated). Optionally filter by profile name, platform, last build status, and repository source. Optionally sort.\n  - **Access level:** read\n  - `page`: Page number (1-based). Default: 1. (number, optional)\n  - `size`: Page size (1-100). Default: 25. Values above 100 are capped at 100. (number, optional)\n  - `search`: Optional search term to filter profiles (case-insensitive partial match on profile name; the API's search may also match other profile fields). (string, optional)\n  - `platform`: Optional list of platform codes to filter by. Allowed values: 1=iOS, 2=Android. (list of numbers, optional)\n  - `last_build_status`: Optional list of last build status codes to filter by. Allowed values: 0=Success, 1=Failed, 2=Canceled, 3=Timeout, 90=Waiting, 91=Running. (list of numbers, optional)\n  - `repository_source`: Optional list of repository source codes to filter by. Allowed values: 1=GitHub, 2=Bitbucket, 3=GitLab, 4=Azure DevOps, 6=Public Repository, 7=Private Repository, 8=SSH. (list of numbers, optional)\n  - `sort`: Optional sort field code. Allowed values: 1=Profile Name, 2=Create Date, 3=Last Build Date. (number, optional)\n  - `sort_direction`: Optional sort direction code. Allowed values: 1=ASC, 2=DESC. (number, optional)\n\n- **get_build_profile_details** - Get a single build profile by ID, optionally including its build configurations.\n  - **Access level:** read\n  - `profile_id`: The build profile ID (e.g. UUID). (string, required)\n  - `configurations`: If true, also fetch the profile's build configurations. Default: false. (boolean, optional)\n\n- **get_build_configuration_details** - Get a single build configuration by profile ID and configuration ID.\n  - **Access level:** read\n  - `profile_id`: The build profile ID (e.g. UUID). (string, required)\n  - `configuration_id`: The build configuration ID (e.g. UUID). (string, required)\n\n- **get_build_profile_workflows** - Get workflows for a build profile by profile ID.\n  - **Access level:** read\n  - `profile_id`: The build profile ID (e.g. UUID). (string, required)\n\n- **get_workflow_detail** - Get a single workflow by build profile ID and workflow ID.\n  - **Access level:** read\n  - `profile_id`: The build profile ID (e.g. UUID). (string, required)\n  - `workflow_id`: The workflow ID (e.g. UUID). (string, required)\n\n- **get_commits_by_branch** - Get commits for a build branch (paginated).\n  - **Access level:** read\n  - `branch_id`: The branch ID (e.g. UUID). (string, required)\n  - `page`: Page number (1-based). If provided with size, enables pagination. Default: 1. (number, optional)\n  - `size`: Page size. If provided with page, enables pagination. Default: 25, max 100. (number, optional)\n\n- **get_commit_details** - Get a single commit by commit ID (UUID) or by commit hash (git SHA). Provide either commit_id or commit_hash, not both.\n  - **Access level:** read\n  - `commit_id`: The commit ID (UUID). (string, optional)\n  - `commit_hash`: The commit hash (git SHA). (string, optional)\n\n- **get_last_commit** - Get the most recent commit on a build branch.\n  - **Access level:** read\n  - `branch_id`: The branch ID (e.g. UUID). (string, required)\n\n- **get_build_status** - Get the status of a build (e.g. 0=Success, 1=Failed, 2=Canceled, 3=Timeout, 90=Waiting, 91=Running, 92=Completing, 99=Unknown).\n  - **Access level:** read\n  - `commit_id`: The commit ID (UUID). (string, required)\n  - `build_id`: The build ID (UUID). (string, required)\n\n- **get_build_logs** - Get the logs for a build, optionally scoped to a single step. Defaults to a tail-truncated view to avoid flooding the model's context.\n  - **Access level:** read\n  - `commit_id`: The commit ID (UUID). (string, required)\n  - `build_id`: The build ID (UUID). (string, required)\n  - `step`: Optional exact step name (case-insensitive) to scope output to one step's log block. (string, optional)\n  - `full_log`: If true, return the entire log instead of the default tail. Still capped at 256 KB. Default: false. (boolean, optional)\n  - `tail_lines`: Number of lines to keep from the end when not using full_log. Default: 200, max 1000. (number, optional)\n  - `grep`: Case-insensitive substring filter applied to lines before truncation. (string, optional)\n\n- **get_variable_groups** - Get all build environment variable groups for the organization, including each group's variables (key, value, isSecret, isFile). Secret values are already redacted by the API.\n  - **Access level:** read\n  - Takes no parameters.\n\n- **trigger_build** - **SIDE EFFECT: starts a new real build run** (queues an actual build, consuming build minutes/credits) either on a branch (latest synced commit) or for one specific commit. Registered by default; set `AC_MCP_ENABLE_WRITE_TOOLS=false` to opt out.\n  - **Access level:** write\n  - `profile_id`: The build profile ID (e.g. UUID). Required in branch mode (commit_id not given); unused in commit mode. (string, optional)\n  - `workflow_id`: The workflow ID (e.g. UUID). Required in branch mode. Optional in commit mode (uses the last-used/default workflow if omitted). (string, optional)\n  - `branch_name`: Optional branch name (e.g. \"main\"). Branch mode only; falls back to the profile's default branch if omitted. Must not be given together with commit_id. (string, optional)\n  - `commit_id`: The commit's own ID (not its git hash) to trigger a build for a specific commit instead of the latest one on a branch. Must not be given together with branch_name. (string, optional)\n  - `configuration_id`: Optional build configuration ID (e.g. UUID) to use instead of the default. (string, optional)\n\n- **cancel_build** - **SIDE EFFECT: cancels a queued or running build** (real, in-progress work is stopped; cannot be resumed). Registered by default; set `AC_MCP_ENABLE_WRITE_TOOLS=false` to opt out.\n  - **Access level:** write\n  - `task_id`: The build's task ID (the \"taskId\" field returned by trigger_build). (string, required)\n\n</details>\n\n<details>\n\n<summary>Signing Identities</summary>\n\n- **get_bundle_identifiers** - Get all bundle identifiers for the organization (iOS/macOS app bundle IDs).\n  - **Access level:** read\n  - No parameters.\n\n- **get_certificates** - Get all signing certificates for the organization. Sensitive fields (p12Password, p12Binary, metaData, thumbprint) are omitted.\n  - **Access level:** read\n  - No parameters.\n\n- **get_keystores** - Get all keystores for the organization (e.g. Android signing keystores). Sensitive fields (password, aliasPassword, binary, checkSum, sha256FingerPrint) are omitted.\n  - **Access level:** read\n  - No parameters.\n\n- **get_provisioning_profiles** - Get provisioning profiles for the organization (e.g. iOS/macOS). Sensitive/large fields (binary, metaData, certificateThumbPrints, provisionedDevices, connectApiKeyId) are omitted. Optionally filter by app (bundle) ID.\n  - **Access level:** read\n  - `app_id`: Optional app (bundle) ID to filter provisioning profiles (e.g. com.example.app). (string, optional)\n\n</details>\n\n<details>\n\n<summary>Testing Distribution</summary>\n\n- **get_distribution_profiles** - Get testing distribution profiles for the current organization (paginated). Optionally filter by profile name, platform, and authentication type. Optionally sort.\n  - **Access level:** read\n  - `page`: Page number (1-based). Default: 1. (number, optional)\n  - `size`: Page size (1-100). Default: 25, max 100. (number, optional)\n  - `search`: Optional search term to filter profiles (case-insensitive partial match on profile name; the API's search may also match other profile fields). (string, optional)\n  - `platform`: Optional list of platform codes to filter by. Allowed values: 1=iOS, 2=Android. (list of numbers, optional)\n  - `authentication_type`: Optional list of authentication type codes to filter by. Allowed values: 1=None, 3=Static Login, 4=LDAP, 5=SSO. (list of numbers, optional)\n  - `sort`: Optional sort field code. Allowed values: 1=Profile Name, 2=Create Date, 3=Last Upload Date. (number, optional)\n  - `sort_direction`: Optional sort direction code. Allowed values: 1=ASC, 2=DESC. (number, optional)\n\n- **get_distribution_profile_details** - Get a single testing distribution profile by ID (with optional app versions pagination).\n  - **Access level:** read\n  - `profile_id`: The distribution profile ID (e.g. UUID). (string, required)\n  - `page`: Page number for app versions (1-based). Default: 1. (number, optional)\n  - `size`: Page size for app versions (1-100). Default: 25, max 100. (number, optional)\n\n- **get_testing_groups** - Get all testing distribution groups for the organization, including each group's member tester emails and group type.\n  - **Access level:** read\n  - Takes no parameters.\n\n- **update_app_version_release_notes** - **SIDE EFFECT: overwrites the release notes (\"message\") shown to testers** for a distribution app version. Returns the updated app version object (excludes certThumbPrints). Registered by default; set `AC_MCP_ENABLE_WRITE_TOOLS=false` to opt out.\n  - **Access level:** write\n  - `profile_id`: The distribution profile ID (e.g. UUID). (string, required)\n  - `app_version_id`: The app version ID (e.g. UUID). (string, required)\n  - `message`: The new release notes text. (string, required)\n\n- **send_app_version_to_testers** - **SIDE EFFECT: sends a real notification** to testers/a testing group, dispatching a distribution task for a specific app version. Registered by default; set `AC_MCP_ENABLE_WRITE_TOOLS=false` to opt out.\n  - **Access level:** write\n  - `profile_id`: The distribution profile ID (e.g. UUID). (string, required)\n  - `app_version_id`: The app version ID (e.g. UUID). (string, required)\n  - `message`: The notification message shown to testers. (string, required)\n  - `testers`: List of testers to send to. Each entry is either a tester's email address or a testing group ID (the \"id\" field from get_testing_groups). (list of strings, required)\n\n</details>\n\n<details>\n\n<summary>Publish to Stores</summary>\n\n- **get_publish_profiles** - Get publish profiles for the current organization for a given platform type (paginated). Optionally filter by flow status, target marketplace, release-candidate binary presence, and store status. Optionally sort.\n  - **Access level:** read\n  - `platform_type`: Platform type of publish profiles (\"ios\" or \"android\"). (string, required)\n  - `page`: Page number (1-based). Default: 1. (number, optional)\n  - `size`: Page size (1-100). Default: 25, max 100. (number, optional)\n  - `flow_status`: Optional flow status code to filter by (e.g. 0=Success, 1=Failed, 91=Running). (number, optional)\n  - `market_place_type`: Optional list of target marketplace codes to filter by. Allowed values depend on platform_type -- ios: 0=Not Available, 1=App Store Connect, 4=Intune; android: 0=Not Available, 2=Google Play, 3=AppGallery, 4=Intune. (list of numbers, optional)\n  - `has_rc_binary`: Optional filter for whether the profile has a release-candidate binary. (boolean, optional)\n  - `store_status`: Optional list of store status codes to filter by. Allowed values depend on platform_type (many more codes for ios than android, e.g. ios: \"IN_REVIEW\", \"READY_FOR_SALE\", \"REJECTED\"; android: \"NOT_AVAILABLE\", \"DRAFT\", \"IN_PROGRESS\", \"HALTED\", \"COMPLETED\"). (list of strings, optional)\n  - `sort`: Optional sort field code. Allowed values: 1=Profile Name, 2=Create Date. (number, optional)\n  - `sort_direction`: Optional sort direction code. Allowed values: 1=ASC, 2=DESC. (number, optional)\n\n- **get_publish_profile_details** - Get a single publish profile by platform type and ID (with optional app versions pagination).\n  - **Access level:** read\n  - `platform_type`: Platform type (\"ios\" or \"android\"). (string, required)\n  - `profile_id`: The publish profile ID (e.g. UUID). (string, required)\n  - `page`: Page number for app versions (1-based). Default: 1. (number, optional)\n  - `size`: Page size for app versions (1-100). Default: 25, max 100. (number, optional)\n\n- **get_app_version_metadata** - Get store listing metadata for a single app version (app review information, localizations, release information, app version information). appReviewInformation.demoPassword is excluded.\n  - **Access level:** read\n  - `platform_type`: Platform type (\"ios\" or \"android\"). (string, required)\n  - `profile_id`: The publish profile ID (e.g. UUID). (string, required)\n  - `app_version_id`: The app version ID (e.g. UUID). (string, required)\n\n- **get_metadata_locales** - Get the available store metadata locales for a single app version (name, code, localized, isPrimary).\n  - **Access level:** read\n  - `platform_type`: Platform type (\"ios\" or \"android\"). (string, required)\n  - `profile_id`: The publish profile ID (e.g. UUID). (string, required)\n  - `app_version_id`: The app version ID (e.g. UUID). (string, required)\n\n- **get_intune_metadata** - Get Microsoft Intune app metadata for a single app version (display name, publisher, bundle ID, version, publishing state, applicable device types, categories, etc.).\n  - **Access level:** read\n  - `platform_type`: Platform type (\"ios\" or \"android\"). (string, required)\n  - `profile_id`: The publish profile ID (e.g. UUID). (string, required)\n  - `app_version_id`: The app version ID (e.g. UUID). (string, required)\n\n- **get_publish_metadata_lock_status** - Get whether a publish profile's store metadata is locked for editing.\n  - **Access level:** read\n  - `platform_type`: Platform type (\"ios\" or \"android\"). (string, required)\n  - `profile_id`: The publish profile ID (e.g. UUID). (string, required)\n\n- **get_publish_details** - Get the publish flow run details for a single app version (status, timing, ordered steps with run history/artifacts/log resource IDs).\n  - **Access level:** read\n  - `platform_type`: Platform type (\"ios\" or \"android\"). (string, required)\n  - `profile_id`: The publish profile ID (e.g. UUID). (string, required)\n  - `app_version_id`: The app version ID (e.g. UUID). (string, required)\n\n- **get_publish_step_logs** - Get the logs for a publish flow run, optionally scoped to a single step. Defaults to a tail-truncated view to avoid flooding the model's context.\n  - **Access level:** read\n  - `platform_type`: Platform type (\"ios\" or \"android\"). (string, required)\n  - `profile_id`: The publish profile ID (e.g. UUID). (string, required)\n  - `publish_id`: The publish flow run ID (the \"id\" field from get_publish_details). (string, required)\n  - `step_id`: The step ID (a step's \"id\" field from get_publish_details' steps list). (string, required)\n  - `step`: Optional exact step name (case-insensitive) to scope output to one step's log block. (string, optional)\n  - `full_log`: If true, return the entire log instead of the default tail. Still capped at 256 KB. Default: false. (boolean, optional)\n  - `tail_lines`: Number of lines to keep from the end when not using full_log. Default: 200, max 1000. (number, optional)\n  - `grep`: Case-insensitive substring filter applied to lines before truncation. (string, optional)\n\n- **get_publish_flows** - Get the publish flows configured for a publish profile (name, ID, full flow document YAML).\n  - **Access level:** read\n  - `platform_type`: Platform type (\"ios\" or \"android\"). (string, required)\n  - `profile_id`: The publish profile ID (e.g. UUID). (string, required)\n\n- **start_publish** - **SIDE EFFECT: starts a publish flow run** (or restarts it from a specific step) -- real publishing work (e.g. uploading to the App Store/Play Store/Intune). Registered by default; set `AC_MCP_ENABLE_WRITE_TOOLS=false` to opt out.\n  - **Access level:** write\n  - `platform_type`: Platform type (\"ios\" or \"android\"). (string, required)\n  - `profile_id`: The publish profile ID (e.g. UUID). (string, required)\n  - `publish_id`: The publish flow run ID (the \"id\" field from get_publish_details). (string, required)\n  - `step_id`: Optional step ID to start from that step instead of the beginning of the flow. (string, optional)\n  - `organization_pool_id`: Optional organization pool ID (e.g. UUID) to run on. (string, optional)\n\n- **stop_publish** - **SIDE EFFECT: cancels a running publish flow run** (real, in-progress work is stopped; cannot be resumed). Registered by default; set `AC_MCP_ENABLE_WRITE_TOOLS=false` to opt out.\n  - **Access level:** write\n  - `platform_type`: Platform type (\"ios\" or \"android\"). (string, required)\n  - `profile_id`: The publish profile ID (e.g. UUID). (string, required)\n  - `publish_id`: The publish flow run ID (the \"id\" field from get_publish_details). (string, required)\n  - `step_id`: Optional step ID. (string, optional)\n  - `organization_pool_id`: Optional organization pool ID (e.g. UUID). (string, optional)\n\n</details>\n\n<details>\n\n<summary>Enterprise App Store</summary>\n\n- **get_store_profiles** - Get enterprise app store profiles for the current organization (paginated). Does not support search, but can filter by platform, publish type, and visibility. Optionally sort.\n  - **Access level:** read\n  - `page`: Page number (1-based). Default: 1. (number, optional)\n  - `size`: Page size (1-100). Default: 25, max 100. (number, optional)\n  - `platform_type`: Optional list of platform codes to filter by. Allowed values: 1=iOS, 2=Android. (list of numbers, optional)\n  - `publish_type`: Optional list of publish type codes to filter by. Allowed values: 1=Published to Beta, 2=Published to Live. (list of numbers, optional)\n  - `visibility`: Optional filter for whether the profile is publicly listed (true=Listed, false=Unlisted). (boolean, optional)\n  - `sort`: Optional sort field code. Allowed values: 1=App Name, 2=Create Date, 3=Download Count, 4=Binary Receive Date. (number, optional)\n  - `sort_direction`: Optional sort direction code. Allowed values: 1=ASC, 2=DESC. (number, optional)\n\n- **get_store_profile_details** - Get a single enterprise app store profile by ID (with optional app versions pagination).\n  - **Access level:** read\n  - `profile_id`: The enterprise app store profile ID (e.g. UUID). (string, required)\n  - `page`: Page number for app versions (1-based). Default: 1. (number, optional)\n  - `size`: Page size for app versions (1-100). Default: 25, max 100. (number, optional)\n  - Each app version's `publishType` field is an int: 0=None, 1=Beta, 2=Live.\n\n</details>\n\n<details>\n\n<summary>Report</summary>\n\n- **get_build_history_report** - Get build history report, optionally filtered by date range, build profile, and organization. Paginated.\n  - **Access level:** read\n  - `start_date`: Optional start date (YYYY-MM-DD). (string, optional)\n  - `end_date`: Optional end date (YYYY-MM-DD). (string, optional)\n  - `page`: Page number (default: 1). (number, optional)\n  - `size`: Items per page (1-100, default: 50). (number, optional)\n  - `build_profile_name`: Filter by build profile name. (string, optional)\n  - `organization_id`: Filter by organization UUID. (string, optional)\n\n- **get_build_queue_waiting_report** - Get the build queue waiting report, optionally filtered by date range. Paginated. Note: on this endpoint, `buildDuration` means queue wait time in minutes, not execution time (unlike get_build_history_report).\n  - **Access level:** read\n  - `start_date`: Optional start date (YYYY-MM-DD). Must be <= end_date if both are given. (string, optional)\n  - `end_date`: Optional end date (YYYY-MM-DD). (string, optional)\n  - `page`: Page number (default: 1). (number, optional)\n  - `size`: Items per page (1-100, default: 50). (number, optional)\n\n- **get_build_activity_log** - Get the build activity log (workflow/profile changes, CodePush releases, etc.), optionally filtered by date range and other parameters. Paginated.\n  - **Access level:** read\n  - `start_date`: Optional start date (YYYY-MM-DD). Must be <= end_date if both are given. (string, optional)\n  - `end_date`: Optional end date (YYYY-MM-DD). (string, optional)\n  - `page`: Page number (default: 1). (number, optional)\n  - `size`: Items per page (1-100, default: 50). (number, optional)\n  - `organization_id`: Filter by organization UUID. (string, optional)\n  - `platform`: Filter by platform type (integer code, e.g. 0=Android, 1=iOS). (number, optional)\n  - `email`: Filter by acting user's email. (string, optional)\n  - `profile_name`: Filter by build profile name. (string, optional)\n  - `action`: Filter by activity action code (integer; see `BUILD_ACTIVITY_ACTIONS` in the tool source for the full mapping). (number, optional)\n\n- **get_build_insights_report** - Get a computed Build Insights Report (Health Snapshot + Trends, Root Cause, Artifact Health, Workflow Quality, Queue Time, and Maturity Assessment analysis) over build history, aggregated server-side. Unlike get_build_history_report, this fetches every page internally and returns small pre-aggregated results instead of raw records.\n  - **Access level:** read\n  - `start_date`: Optional start date (YYYY-MM-DD) for the current period. Default: last 30 days. (string, optional)\n  - `end_date`: Optional end date (YYYY-MM-DD) for the current period. (string, optional)\n  - `sections`: Optional list of sections to compute: `health_snapshot`, `root_cause`, `artifact_health`, `workflow_quality`, `queue_time`, `maturity_assessment`. Default: all six. (array of strings, optional)\n  - `include_sub_orgs`: If true, keep cross-org build records in history-derived metrics instead of filtering to the token's own organization. Default: false. (boolean, optional)\n\n- **get_distribution_app_version_report** - Get daily usage report for distributed app versions. Paginated; supports filters by profile, OS, organization.\n  - **Access level:** read\n  - `start_date`: Optional start date (YYYY-MM-DD). (string, optional)\n  - `end_date`: Optional end date (YYYY-MM-DD). (string, optional)\n  - `page`: Page number (default: 1). (number, optional)\n  - `size`: Items per page (1-100, default: 50). (number, optional)\n  - `profile_name`: Filter by distribution profile name. (string, optional)\n  - `os`: Filter by OS (\"ios\" or \"android\"). (string, optional)\n  - `organization_id`: Filter by organization UUID. (string, optional)\n\n- **get_distribution_sent_report** - Get daily usage report for distributed app sharing. Paginated; supports filters by profile, OS, organization.\n  - **Access level:** read\n  - `start_date`: Optional start date (YYYY-MM-DD). (string, optional)\n  - `end_date`: Optional end date (YYYY-MM-DD). (string, optional)\n  - `page`: Page number (default: 1). (number, optional)\n  - `size`: Items per page (1-100, default: 50). (number, optional)\n  - `profile_name`: Filter by distribution profile name. (string, optional)\n  - `os`: Filter by OS (\"ios\" or \"android\"). (string, optional)\n  - `organization_id`: Filter by organization UUID. (string, optional)\n\n- **get_enterprise_app_store_app_usage_report** - Get app usage report for enterprise app store. start_date and end_date are required. Paginated.\n  - **Access level:** read\n  - `start_date`: Start date (YYYY-MM-DD). (string, required)\n  - `end_date`: End date (YYYY-MM-DD). (string, required)\n  - `page`: Page number (default: 1). (number, optional)\n  - `size`: Items per page (1-100, default: 50). (number, optional)\n  - `organization_id`: Optional filter by organization UUID. (string, optional)\n\n- **get_publish_resign_report** - Get publish resign report, optionally filtered by date range, app name, organization, and status. Paginated.\n  - **Access level:** read\n  - `start_date`: Optional start date (YYYY-MM-DD). (string, optional)\n  - `end_date`: Optional end date (YYYY-MM-DD). (string, optional)\n  - `page`: Page number (default: 1). (number, optional)\n  - `size`: Items per page (1-100, default: 50). (number, optional)\n  - `app_name`: Filter by app name. (string, optional)\n  - `organization_id`: Filter by organization UUID. (string, optional)\n  - `status`: Filter by resign status (0=waiting, 1=processing, 2=succeeded, 3=failed, 4=cancelled, 5=timeout). (number, optional)\n\n- **get_publish_status_report** - Get publish status report, optionally filtered by date range, app name, organization, and status. Paginated.\n  - **Access level:** read\n  - `start_date`: Optional start date (YYYY-MM-DD). (string, optional)\n  - `end_date`: Optional end date (YYYY-MM-DD). (string, optional)\n  - `page`: Page number (default: 1). (number, optional)\n  - `size`: Items per page (1-100, default: 50). (number, optional)\n  - `app_name`: Filter by app name. (string, optional)\n  - `organization_id`: Filter by organization UUID. (string, optional)\n  - `status`: Filter by publish status (e.g. 0=Success, 1=Failed, 91=Running). (number, optional)\n\n- **get_signing_report** - Get signing report, optionally filtered by date range, organization, OS, and build status. Paginated.\n  - **Access level:** read\n  - `start_date`: Optional start date (YYYY-MM-DD). (string, optional)\n  - `end_date`: Optional end date (YYYY-MM-DD). (string, optional)\n  - `page`: Page number (default: 1). (number, optional)\n  - `size`: Items per page (1-100, default: 50). (number, optional)\n  - `organization_id`: Filter by organization UUID. (string, optional)\n  - `os`: Filter by OS (\"ios\" or \"android\"). (string, optional)\n  - `build_status`: Filter by build status (e.g. 0=Success, 1=Failed, 91=Running). (number, optional)\n\n- **get_signing_activity_log** - Get the signing activity log (e.g. certificate/provisioning profile/keystore expiry notices), optionally filtered by date range and other parameters. Paginated.\n  - **Access level:** read\n  - `start_date`: Optional start date (YYYY-MM-DD). Must be <= end_date if both are given. (string, optional)\n  - `end_date`: Optional end date (YYYY-MM-DD). (string, optional)\n  - `page`: Page number (default: 1). (number, optional)\n  - `size`: Items per page (1-100, default: 50). (number, optional)\n  - `organization_id`: Filter by organization UUID. (string, optional)\n  - `platform`: Filter by platform (e.g. \"iOS\", \"Android\"). (string, optional)\n  - `email`: Filter by acting user's email. (string, optional)\n  - `action`: Filter by activity action code (integer; see `SIGNING_ACTIVITY_ACTIONS` in the tool source for the full mapping). (number, optional)\n\n- **get_publish_activity_log** - Get the publish activity log (re-sign, publish flow events, etc.), optionally filtered by date range and other parameters. Paginated.\n  - **Access level:** read\n  - `start_date`: Optional start date (YYYY-MM-DD). Must be <= end_date if both are given. (string, optional)\n  - `end_date`: Optional end date (YYYY-MM-DD). (string, optional)\n  - `page`: Page number (default: 1). (number, optional)\n  - `size`: Items per page (1-100, default: 50). (number, optional)\n  - `organization_id`: Filter by organization UUID. (string, optional)\n  - `platform`: Filter by platform (e.g. \"iOS\", \"Android\"). (string, optional)\n  - `email`: Filter by acting user's email. (string, optional)\n  - `profile_name`: Filter by publish profile name. (string, optional)\n  - `action`: Filter by activity action code (integer; see `PUBLISH_ACTIVITY_ACTIONS` in the tool source for the full mapping). (number, optional)\n\n</details>\n<!-- END AUTOMATED TOOLS -->\n\n## Running the server\n\nFrom the repo root:\n\n```bash\npython -m src.server\n```\n\nOr after `pip install -e .`:\n\n```bash\nappcircle-mcp\n```\n\nThe server runs over stdio (or SSE/HTTP depending on how your client starts it).\n\n## Response format\n\nEvery tool returns a **standard envelope**:\n\n- **Success:** `{ \"success\": true, \"data\": <payload>, \"meta\": { ... } }`  \n  `data` is the tool result; `meta` is optional (e.g. `count`, `page`, `filters`).\n- **Error:** `{ \"success\": false, \"error\": { \"tool\", \"type\", \"message\", \"details\" } }`  \n  Same shape for all tools so clients can parse errors consistently.\n\nFull specification: [docs/tool_contract.md](docs/tool_contract.md).\n\n## Testing\n\nInstall with dev dependencies:\n\n```bash\npip install -e \".[dev]\"\n```\n\n### Unit tests (default)\n\nUse a mocked API; **no `APPCIRCLE_ACCESS_TOKEN`** needed. Default `pytest` only runs these (see `testpaths` in [pyproject.toml](pyproject.toml)):\n\n```bash\npytest test/unit/ -v\n```\n\n- Single file: `pytest test/unit/tools/build_module/test_get_build_profiles.py -v`\n- With coverage: `pytest test/unit/ --cov=src --cov-report=term-missing`\n\n### Integration tests\n\nCall the **real Appcircle API**. Set `APPCIRCLE_ACCESS_TOKEN` in the environment, then run:\n\n```bash\npytest test/integration/ -v\n```\n\n- All integration tests: `pytest test/integration/ -v`\n- By tool: `pytest test/integration/build_module/ -v`, `pytest test/integration/report/ -v`, etc.\n- By marker: `pytest -m integration -v` (when running from repo root; includes only integration tests if both unit and integration are collected)\n\nIf `APPCIRCLE_ACCESS_TOKEN` is not set, integration tests are **skipped** (no failure).\n\n**Optional env vars for integration tests** (when discovery fails or tests need real IDs; omit to skip those tests):\n\n| Variable | Description |\n|----------|-------------|\n| `APPCIRCLE_TEST_ORGANIZATION_ID` | Organization UUID. Used by `test_with_organization_id` (enterprise app store app usage report). |\n| `APPCIRCLE_TEST_BRANCH_ID` | Branch UUID. Used by get_commits_by_branch and related tests when no branch can be discovered from the API. |\n| `APPCIRCLE_TEST_COMMIT_ID` | Commit UUID. Used by get_commit_details tests when no commit can be discovered from the API. |\n\n**Write/action integration tests** (`trigger_build`, `cancel_build`, etc.) are marked `integration_write` and are **opt-in on top of** `APPCIRCLE_ACCESS_TOKEN` — they mutate real data (trigger real builds, etc.), so they never run just from `pytest test/integration/ -v`. Set `APPCIRCLE_RUN_WRITE_INTEGRATION_TESTS=true` (pointing `APPCIRCLE_ACCESS_TOKEN` at a **dedicated test org**, not production) to enable them.\n\n## Security\n\nThis project depends on third-party open-source packages listed in\n[pyproject.toml](pyproject.toml). While we pin dependency version ranges and\nship a lockfile (`uv.lock`) with cryptographic hashes, these packages are\nmaintained independently and provided \"as-is.\" Appcircle makes no guarantees\nregarding the security or reliability of third-party dependencies.\n\nWe recommend auditing installed packages before use:\n\n```bash\nuv run pip-audit\n```\n",
  "bytes": 36164,
  "sha": "c04d7b5f9c72f3b927443737e377a9971fb13bcc3804d6b6978c76b91a2cc952",
  "repo_slug": "appcircleio/appcircle-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_appcircle_appcircle_mcp_0e0345b3/readme"
}