Skip to main content
Glama
BandaruDheeraj

TestFlight Feedback MCP Server

TestFlight Feedback MCP Server

An MCP (Model Context Protocol) server that gives AI assistants access to TestFlight beta tester feedback from App Store Connect. No Xcode required.

Why?

Apple doesn't expose TestFlight feedback text/comments via their public API (fastlane discussion). This MCP server provides:

  • Official API access to screenshot & crash feedback submissions (JWT auth)

  • Optional browser automation for full text feedback via Apple's internal iris API (Playwright)

  • Works on any platform — Windows, Linux, macOS — no Xcode needed

Related MCP server: App Store Connect MCP Server

Tools

Tool

Description

list_apps

List all apps in your App Store Connect account

list_builds

List TestFlight builds (filter by version, status)

list_beta_testers

List beta testers (filter by app, group, email)

list_beta_groups

List beta tester groups for an app

list_feedback

List all feedback: screenshots, crashes, and text comments

get_feedback_detail

Get full details for a specific feedback submission

get_crash_log

Download crash log content for a crash submission

respond_to_feedback

Email a tester that their feedback has been addressed

Setup

1. Get App Store Connect API Keys

  1. Go to App Store Connect → Users and Access → Keys

  2. Click Generate API Key (requires Admin role)

  3. Download the .p8 file (you can only download it once)

  4. Note the Key ID and Issuer ID

2. Install

cd testflight-feedback-mcp
npm install
npm run build

3. Configure

Set environment variables or create a .env file:

ASC_KEY_ID=YOUR_KEY_ID
ASC_ISSUER_ID=YOUR_ISSUER_ID
ASC_PRIVATE_KEY_PATH=./AuthKey_XXXXXXXX.p8

Or provide the key inline:

ASC_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\nMIGT...your key...\n-----END PRIVATE KEY-----"

4. Connect to Your AI Assistant

Claude Desktop

Add to claude_desktop_config.json:

{
  "mcpServers": {
    "testflight-feedback": {
      "command": "node",
      "args": ["/absolute/path/to/testflight-feedback-mcp/dist/index.js"],
      "env": {
        "ASC_KEY_ID": "YOUR_KEY_ID",
        "ASC_ISSUER_ID": "YOUR_ISSUER_ID",
        "ASC_PRIVATE_KEY_PATH": "/path/to/AuthKey.p8"
      }
    }
  }
}

Cursor

Add to .cursor/mcp.json:

{
  "mcpServers": {
    "testflight-feedback": {
      "command": "node",
      "args": ["/absolute/path/to/testflight-feedback-mcp/dist/index.js"],
      "env": {
        "ASC_KEY_ID": "YOUR_KEY_ID",
        "ASC_ISSUER_ID": "YOUR_ISSUER_ID",
        "ASC_PRIVATE_KEY_PATH": "/path/to/AuthKey.p8"
      }
    }
  }
}

VS Code + GitHub Copilot

Add to .vscode/mcp.json:

{
  "servers": {
    "testflight-feedback": {
      "command": "node",
      "args": ["/absolute/path/to/testflight-feedback-mcp/dist/index.js"],
      "env": {
        "ASC_KEY_ID": "YOUR_KEY_ID",
        "ASC_ISSUER_ID": "YOUR_ISSUER_ID",
        "ASC_PRIVATE_KEY_PATH": "/path/to/AuthKey.p8"
      }
    }
  }
}

Optional: Respond to Testers via Email (SMTP)

The respond_to_feedback tool looks up the tester's email from a feedback submission and sends them a response. Configure any SMTP provider:

SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
SMTP_USER=your-email@gmail.com
SMTP_PASS=your-app-password          # Use App Password for Gmail
SMTP_FROM=your-email@gmail.com       # Optional, defaults to SMTP_USER
APP_NAME=My App                      # Shows in the email footer

Works with Gmail, Outlook, custom SMTP, etc. The tool:

  1. Fetches the submission to get the tester's email + build version

  2. Sends a nicely formatted HTML email with your message

  3. Returns confirmation with tester name, email, and message ID

Optional: Full Text Feedback (Browser Auth)

Apple's public API only returns screenshot and crash submissions — not text comments. To access text feedback, enable Playwright-based browser authentication:

npm install playwright
npx playwright install chromium

# Add to your env:
ENABLE_BROWSER_AUTH=true
ASC_USERNAME=your@apple.id
ASC_PASSWORD=your-password

Note: This uses Apple's internal iris/v1/betaFeedbacks API. You may be prompted for 2FA on your Apple device. Session cookies are cached in memory for the server lifetime.

Example Usage

Once connected, ask your AI assistant:

  • "Show me the latest TestFlight feedback for my app"

  • "List all crash reports from the last build"

  • "Get the crash log for submission XYZ"

  • "Who are my beta testers?"

  • "Show feedback from build 1.2.0"

Architecture

src/
├── index.ts              # MCP server entry point, tool registration
├── auth/
│   ├── jwt.ts            # JWT token generation (ES256, .p8 key)
│   └── browser.ts        # Optional Playwright session for iris API
├── api/
│   ├── client.ts         # HTTP client with JWT auth & pagination
│   ├── types.ts          # TypeScript types for API responses
│   ├── apps.ts           # /v1/apps endpoints
│   ├── builds.ts         # /v1/builds endpoints
│   ├── testers.ts        # /v1/betaTesters, /v1/betaGroups
│   └── feedback.ts       # Screenshot/crash/iris feedback endpoints
└── tools/
    ├── list-apps.ts
    ├── list-builds.ts
    ├── list-testers.ts
    ├── list-feedback.ts
    ├── get-feedback-detail.ts
    └── get-crash-log.ts

API Coverage

Endpoint

Auth

Status

/v1/apps

JWT

/v1/builds

JWT

/v1/betaTesters

JWT

/v1/betaGroups

JWT

/v1/betaFeedbackScreenshotSubmissions

JWT

/v1/betaFeedbackCrashSubmissions

JWT

/iris/v1/betaFeedbacks (text comments)

Browser

✅ (optional)

License

MIT

Available Tools

8 tools
get_crash_logA

Download the crash log content for a specific beta feedback crash submission.

ParametersJSON Schema
NameRequiredDescriptionDefault
crash_submission_idYesThe beta feedback crash submission ID

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description carries full burden. It indicates a read/download operation but does not disclose output format, authentication needs, or potential side effects. For a simple download, this is adequate but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence, no redundant words, perfect structure for a simple tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with one required parameter and no output schema, the description covers the core behavior. However, omitting output format (e.g., plain text) or error conditions slightly reduces completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with parameter description 'The beta feedback crash submission ID'. The tool description adds little beyond that, just rephrasing. Baseline 3 is appropriate as no additional semantic value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Download', the resource 'crash log content', and the context 'for a specific beta feedback crash submission'. It distinguishes from sibling tools like get_feedback_detail, which likely returns feedback details rather than crash logs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives (e.g., get_feedback_detail). It does not mention prerequisites or scenarios where it should not be used.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_feedback_detailA

Get detailed information about a specific feedback submission, including device info, tester details, screenshot asset, or crash log reference.

ParametersJSON Schema
NameRequiredDescriptionDefault
submission_idYesThe feedback submission ID
typeYesType of feedback submission

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It reveals that the tool returns details contingent on the 'type' parameter (screenshot asset or crash log reference), but it does not disclose permissions, rate limits, or the exact structure of the response. Given the conditional nature implied by the enum, more explicit behavioral notes would be beneficial.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single 16-word sentence that immediately states the verb and resource, then lists included items. There is no wasted text, and it is well-structured for quick parsing by an AI agent.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description reasonably covers the return content (device info, tester details, screenshot or crash reference). While it does not detail the exact structure or nesting, the tool's low parameter count and simple purpose make the description sufficiently complete for most usage scenarios.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% description coverage, and the description adds value by explaining that the 'type' parameter determines whether the response includes a screenshot asset or crash log reference. This linkage between parameters and return content goes beyond the schema's bare descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description explicitly states the verb 'Get' and the resource 'detailed information about a specific feedback submission', listing specific content like device info, tester details, screenshot asset, or crash log reference. This clearly distinguishes it from sibling tools like list_feedback (lists summaries) and get_crash_log (standalone crash log retrieval).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description indicates this tool is used for obtaining detailed info on a single feedback submission, implying it is suitable after a list operation. While it does not explicitly state when not to use it or mention alternatives, the purpose is clear enough for an agent to infer appropriate usage from the sibling context (e.g., use list_feedback first, then this).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_appsB

List all apps in your App Store Connect account. Returns app ID, name, bundle ID, and SKU.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of apps to return (default: 50)

TDQS

B3.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It claims to 'list all apps' but the limit parameter (default 50, max 200) implies it may not return all apps. This contradiction and lack of pagination details reduce transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with two sentences: one for action and one for return fields. Every word adds value, and the structure is front-loaded with the primary purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

While the description states the return fields, it omits details about the limit parameter and pagination behavior. For a simple tool without an output schema, this is adequate but not fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% description coverage for the limit parameter, so the baseline is 3. The description does not add any additional meaning to the parameter beyond the schema, thus earning the baseline score.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'List' and the resource 'apps in your App Store Connect account', and distinguishes it from sibling tools like list_beta_groups and list_builds. It also specifies the return fields (app ID, name, bundle ID, SKU), making the purpose very clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives, such as when to use list_builds for app-specific builds. There is no mention of prerequisites, filtering, or limitations like pagination.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_beta_groupsB

List beta tester groups for an app. Returns group name, internal/external status, and feedback settings.

ParametersJSON Schema
NameRequiredDescriptionDefault
app_idYesApp Store Connect app ID
limitNoMaximum number of groups to return (default: 50)

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations are absent, and the description does not disclose behavioral traits such as idempotency, rate limits, or side effects. The tool appears to be a read operation, but this is not explicitly stated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is a single concise sentence with no redundant information. It is front-loaded with the main action and result.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema is provided, and the description only briefly mentions return fields. Lacks details on pagination, sorting, or other behaviors that might be needed given the absence of annotations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so parameters are adequately described in the schema. The description adds value by mentioning what the response includes, but this is not necessary for parameter understanding.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists beta tester groups for an app and specifies the returned information (group name, status, feedback settings). It distinguishes from siblings like list_beta_testers or list_apps.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this tool versus alternatives like list_beta_testers or list_feedback. The description does not provide context for choosing this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_beta_testersA

List beta testers. Filter by app, group, or email. Returns tester name, email, invite type, and state.

ParametersJSON Schema
NameRequiredDescriptionDefault
app_idNoFilter testers by app ID
group_idNoFilter testers by beta group ID
emailNoFilter by tester email address
limitNoMaximum number of testers to return (default: 50)

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must disclose behavioral traits. It correctly indicates a read-only list operation and describes returned fields, but it omits details like pagination, sorting, or potential side effects. Adequate but not thorough.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no redundant information. Every phrase adds value: action, filters, and output fields.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers core purpose and filters but lacks details on default limit, pagination, or ordering. With 4 optional parameters and no output schema, more context (e.g., 'returns up to 50 testers by default') would improve completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema has 100% description coverage, each parameter is documented. The description adds that the tool returns specific fields, but does not enrich parameter meaning beyond the schema. Baseline score applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists beta testers and specifies filter options (app, group, email) and return fields (name, email, invite type, state). This differentiates it from sibling tools like list_beta_groups.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description lists filter parameters and implies when to use (listing testers with optional filters). It does not explicitly exclude alternatives, but the context is clear and sufficient for a list operation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_buildsA

List TestFlight builds for an app. Filter by version or processing state. Returns build number, version, upload date, and status.

ParametersJSON Schema
NameRequiredDescriptionDefault
app_idYesApp Store Connect app ID
versionNoFilter by pre-release version string (e.g., '1.2.0')
processing_stateNoFilter by build processing state
limitNoMaximum number of builds to return (default: 20)

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden. It specifies return fields (build number, version, upload date, status) and filtering, but lacks details on pagination, sorting, or side effects. It does not explicitly declare the tool as read-only.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences totaling 16 words, front-loaded with the core purpose, followed by filtering and return values. Every sentence is essential and efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema and 4 parameters, the description covers the main purpose and return fields. It omits details about the limit parameter's default and error handling, but is largely adequate for a simple list tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so baseline is 3. The description adds value by summarizing the filtering ('Filter by version or processing state') and listing the return fields, which are not in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('List'), resource ('TestFlight builds'), and scope ('for an app'). It also mentions filtering capabilities, and the tool's purpose is distinct from siblings like list_apps or list_beta_groups.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use the tool (to list builds), but it does not explicitly state when not to use it or provide alternatives. No exclusions or context versus other list tools is given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_feedbackA

List TestFlight feedback for an app. Retrieves screenshot submissions, crash reports, and (with browser auth) text comments. Filter by build or feedback type.

ParametersJSON Schema
NameRequiredDescriptionDefault
app_idYesApp Store Connect app ID
build_idNoFilter feedback by build ID
typeNoType of feedback to retrieve. 'comments' requires browser auth. Default: 'all'
limitNoMaximum number of feedback items per type (default: 50)

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It discloses that comments require browser auth, which is valuable. However, it does not explain pagination behavior, rate limits, or whether the operation is read-only (assumed but unstated). Gaps remain in behavioral expectations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loaded with the main purpose followed by retrieval specifics and filtering options. Every sentence adds value without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has no output schema and the description does not describe the return format or behavior when no results are found. Given the complexity (4 parameters, list tool), additional context on pagination or response structure would improve completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% coverage with descriptions. The description's mention of filtering by build or type reinforces the schema but does not add new meaning beyond what is already in the parameter descriptions. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists TestFlight feedback for an app, specifying the types (screenshots, crashes, comments) and the auth requirement for comments. It distinguishes itself from sibling tools like get_crash_log (specific crash) and get_feedback_detail (single feedback).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description mentions filtering by build or feedback type, giving clear usage context. However, it does not explicitly state when to avoid this tool in favor of siblings (e.g., for detailed feedback or responding). The absence of exclusions leaves some ambiguity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

respond_to_feedbackA

Send an email to a beta tester letting them know their feedback has been addressed. Looks up the tester's email from the submission and sends via SMTP.

ParametersJSON Schema
NameRequiredDescriptionDefault
submission_idYesThe feedback submission ID to respond to
submission_typeYesType of feedback submission
messageYesThe response message to send to the tester (e.g., 'We fixed the crash you reported in build 1.2.1')
subjectNoCustom email subject line. Defaults to 'Your TestFlight feedback has been addressed'

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden. It explains the mechanism (lookup email, send SMTP) but omits side effects, error states, and authorization requirements. Partial transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the key action, no extraneous information. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description explains the core process and covers the main purpose, but lacks detail on return value (success/failure), error handling, and why submission_type is needed. Still largely complete for a simple tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and parameter descriptions are adequate. The description adds no new meaning beyond what the schema already provides for individual parameters, so baseline score applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Send an email') and the resource ('beta tester feedback'), distinguishing it from sibling tools that retrieve or list data. The verb+resource is specific and unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage (responding to feedback) but provides no explicit guidance on when not to use it, prerequisites, or alternatives. The agent must infer usage from the action and schema.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 8 tool updatesv1.0.0
    • First observedget_crash_log
    • First observedget_feedback_detail
    • First observedlist_apps
    • First observedlist_beta_groups
    • First observedlist_beta_testers
    • First observedlist_builds
    • First observedlist_feedback
    • First observedrespond_to_feedback

TDQS

A3.9/5.0

Scored across 8 tools

Disambiguation5/5

Each tool targets a distinct resource or action (apps, groups, testers, builds, feedback, crash logs, and responses). Even the two feedback-related tools have clear separation: list_feedback retrieves items, get_feedback_detail provides in-depth detail, and get_crash_log downloads specific crash content.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern using lowercase with underscores (e.g., list_apps, get_feedback_detail, respond_to_feedback). This makes the set predictable for an agent to learn and select tools.

Tool Count5/5

8 tools is well-scoped for a TestFlight feedback MCP. Each tool serves a necessary function without redundancy, covering the essential workflows: listing resources, retrieving details, downloading crash logs, and responding to feedback.

Completeness4/5

The tool set covers the core TestFlight feedback lifecycle: listing apps/groups/testers/builds/feedback, retrieving detailed info and crash logs, and responding. Minor gaps exist, such as the ability to delete feedback or manage beta tester invitations, but these are not critical for the stated purpose.

Maintenance

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers