# Perforce P4 MCP Server (oci · ghcr.io/perforce/p4mcp-server)

Perforce P4 MCP server for version control and P4 DAM digital asset management.

- Trust score: 37/100 (low)
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-05

## Components

- oci · `ghcr.io/perforce/p4mcp-server`: 37/100 (this document), [markdown](https://verifymcp.io/servers/perforce-p4mcp-server/ghcr-io-perforce-p4mcp-server.md), [page](https://verifymcp.io/servers/perforce-p4mcp-server/ghcr-io-perforce-p4mcp-server)

## Channel facts

- Registry: `oci`
- Package: `ghcr.io/perforce/p4mcp-server`
- Version: `2026.4.3126709`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-11-05.

- **Supply Chain Security**: 0/100
  - No malware scan is available for this kind of package: the supply-chain vendors we use do not cover it. This is a permanent gap in our coverage, not a finding about the package.
  - Known CVEs could not be checked: this artifact ships no SBOM or dependency manifest, so there is no dependency list to read.
  - Install-script risk not yet assessed.
  - Dependency health could not be checked: this artifact ships no SBOM or dependency manifest, so there is no dependency list to read.
- **Provenance & Transparency**: 35/100
  - Source repository is publicly reachable at the declared URL.
  - Provenance check failed: no build-provenance attestation is published.
  - License check failed: no license is declared.
  - Actively maintained (last published 2 days ago).
  - Publishes a security disclosure policy (SECURITY.md).
- **Schema Quality & AI Usability**: 57/100
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 3427 tokens (~228/item across 15 items; 15 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 10/100
  - Stability observed for 3 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 15 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 15 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

**Unverified: 1 category.** A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

## Install

### How do I install the Perforce P4 MCP Server server?

Perforce P4 MCP Server runs locally as a container image, launched with docker run --rm -i -e P4PORT -e P4USER -e P4CLIENT -e P4PASSWD -e P4DAM_API_KEY ghcr.io/perforce/p4mcp-server:2026.4.3126709. Ready-made configuration for Claude, Cursor, VS Code, Codex and 3 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add perforce-p4mcp-server -- docker run --rm -i -e P4PORT -e P4USER -e P4CLIENT -e P4PASSWD -e P4DAM_API_KEY ghcr.io/perforce/p4mcp-server:2026.4.3126709
```

This image reads P4PORT, P4USER, P4CLIENT, P4PASSWD and P4DAM_API_KEY. Set them in your client's env block for this server; docker run -e passes each one through to the container.

### Cursor

```json
{
  "mcpServers": {
    "perforce-p4mcp-server": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "-e",
        "P4PORT",
        "-e",
        "P4USER",
        "-e",
        "P4CLIENT",
        "-e",
        "P4PASSWD",
        "-e",
        "P4DAM_API_KEY",
        "ghcr.io/perforce/p4mcp-server:2026.4.3126709"
      ]
    }
  }
}
```

This image reads P4PORT, P4USER, P4CLIENT, P4PASSWD and P4DAM_API_KEY. Set them in your client's env block for this server; docker run -e passes each one through to the container.

### VS Code

```json
{
  "servers": {
    "perforce-p4mcp-server": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "-e",
        "P4PORT",
        "-e",
        "P4USER",
        "-e",
        "P4CLIENT",
        "-e",
        "P4PASSWD",
        "-e",
        "P4DAM_API_KEY",
        "ghcr.io/perforce/p4mcp-server:2026.4.3126709"
      ]
    }
  }
}
```

This image reads P4PORT, P4USER, P4CLIENT, P4PASSWD and P4DAM_API_KEY. Set them in your client's env block for this server; docker run -e passes each one through to the container.

### Codex

```bash
codex mcp add perforce-p4mcp-server -- docker run --rm -i -e P4PORT -e P4USER -e P4CLIENT -e P4PASSWD -e P4DAM_API_KEY ghcr.io/perforce/p4mcp-server:2026.4.3126709
```

This image reads P4PORT, P4USER, P4CLIENT, P4PASSWD and P4DAM_API_KEY. Set them in your client's env block for this server; docker run -e passes each one through to the container.

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "perforce-p4mcp-server": {
      "type": "local",
      "command": [
        "docker",
        "run",
        "--rm",
        "-i",
        "-e",
        "P4PORT",
        "-e",
        "P4USER",
        "-e",
        "P4CLIENT",
        "-e",
        "P4PASSWD",
        "-e",
        "P4DAM_API_KEY",
        "ghcr.io/perforce/p4mcp-server:2026.4.3126709"
      ],
      "enabled": true
    }
  }
}
```

This image reads P4PORT, P4USER, P4CLIENT, P4PASSWD and P4DAM_API_KEY. Set them in your client's env block for this server; docker run -e passes each one through to the container.

### Hermes

```yaml
mcp_servers:
  perforce-p4mcp-server:
    command: "docker"
    args: ["run", "--rm", "-i", "-e", "P4PORT", "-e", "P4USER", "-e", "P4CLIENT", "-e", "P4PASSWD", "-e", "P4DAM_API_KEY", "ghcr.io/perforce/p4mcp-server:2026.4.3126709"]
```

This image reads P4PORT, P4USER, P4CLIENT, P4PASSWD and P4DAM_API_KEY. Set them in your client's env block for this server; docker run -e passes each one through to the container.

### Netclaw

```json
{
  "McpServers": {
    "perforce-p4mcp-server": {
      "Transport": "stdio",
      "Command": "docker",
      "Arguments": [
        "run",
        "--rm",
        "-i",
        "-e",
        "P4PORT",
        "-e",
        "P4USER",
        "-e",
        "P4CLIENT",
        "-e",
        "P4PASSWD",
        "-e",
        "P4DAM_API_KEY",
        "ghcr.io/perforce/p4mcp-server:2026.4.3126709"
      ]
    }
  }
}
```

This image reads P4PORT, P4USER, P4CLIENT, P4PASSWD and P4DAM_API_KEY. Set them in your client's env block for this server; docker run -e passes each one through to the container.

### Other

```json
{
  "mcpServers": {
    "perforce-p4mcp-server": {
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "-i",
        "-e",
        "P4PORT",
        "-e",
        "P4USER",
        "-e",
        "P4CLIENT",
        "-e",
        "P4PASSWD",
        "-e",
        "P4DAM_API_KEY",
        "ghcr.io/perforce/p4mcp-server:2026.4.3126709"
      ]
    }
  }
}
```

This image reads P4PORT, P4USER, P4CLIENT, P4PASSWD and P4DAM_API_KEY. Set them in your client's env block for this server; docker run -e passes each one through to the container.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-11-05 (score 37, +1)

No change was recorded against any check on this day. Stability & Change Management went from 7 to 10. That category is still filling its 30-day observation window: 2 days of observed history at the previous scan, 3 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-11-03 (score 36, +1)

No change was recorded against any check on this day. Stability & Change Management went from 0 to 3. That category is still filling its 30-day observation window: 0 days of observed history at the previous scan, 1 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-11-02 (score 35)

First indexed and scored.

## MCP tools (15)

### `query_server` (~48 tokens)

Get server info and current user information (READ permission)

Input parameters:

- `action` (string, required): Server query action: server_info returns P4 server metadata and version, current_user returns authenticated user details and permissions

### `query_workspaces` (~106 tokens)

Get workspace details, list workspaces, check type and status (READ permission)

Input parameters:

- `action` (string, required): Workspace query action: list returns all workspaces matching filters, get retrieves specific workspace spec, type identifies workspace category, status shows opened files and sync state
- `max_results` (integer): Maximum number of results to return
- `user`: Filter by user - optional for list action
- `workspace_name`: Workspace name - required for get, type, status actions

### `modify_workspaces` (~122 tokens)

Create/delete workspace, Update workspace specs, and switch active workspace (WRITE permission)

Input parameters:

- `action` (string, required): Workspace modification action: create makes new workspace, delete removes workspace, update modifies workspace spec, switch changes active workspace
- `workspace_description`: Workspace description
- `workspace_line_end`: Line ending style (local, unix, win, mac)
- `workspace_name` (string, required): Workspace name
- `workspace_options`: Workspace options
- `workspace_root`: Root path of the workspace
- `workspace_view`: View mappings in depot-to-client format

### `query_files` (~235 tokens)

Get file content, history, info, diff, annotations, search by name, grep by content (READ permission)

Input parameters:

- `action` (string, required): File query action, metadata includes extra information like optional attributes and file size
- `case_insensitive` (boolean): Case-insensitive matching for grep action
- `diff2` (boolean): Use p4 diff2 for depot-to-depot diff, false for mixed diff
- `file2`: Second file path - required for diff action
- `file_path` (string, required): Primary file path - required for all actions
- `max_results`: Maximum number of results to return. Bounds history/search/grep and also caps fstat info/metadata via 'p4 fstat -m N'. Omit for unbounded info/metadata results.
- `pattern`: Search or grep pattern - required for search and grep actions
- `ranges`: Optional line ranges for the content action only. Each inner list is a [start, end] pair, 1-based inclusive. When set, the response carries a 'chunks' array with one entry per range instead of the wh…

### `modify_files` (~139 tokens)

Add, edit, move, delete, revert, reconcile, resolve, and sync files (WRITE permission)

Input parameters:

- `action` (string, required): File modification action
- `changelist` (string): Changelist ID or 'default'
- `file_paths`: Full depot or client or local paths
- `force` (boolean): Force operation - use with caution
- `mode` (string): Resolve mode: auto(-am), safe(-as), force(-af), preview(-n), theirs(-at), yours(-ay)
- `source_paths`: Source paths - required for move action
- `target_paths`: Target paths - required for move action

### `query_changelists` (~162 tokens)

Get changelist details and list changelists (READ permission)

Input parameters:

- `action` (string, required): Changelist query action: get retrieves specific changelist details, list returns all changelists matching filters
- `changelist_id`: Changelist ID - required for get action
- `depot_path`: Filter by depot path - for list action
- `max_results`: Maximum number of results to return. Bounds the 'list' action and also caps open files for get('default') via 'p4 opened -m N'. Omit for unbounded results.
- `status`: Filter by status - for list action
- `user`: Filter by user - for list action
- `workspace_name`: Filter by workspace - for list action

### `modify_changelists` (~120 tokens)

Create/delete changelists, update changelists and organize files/jobs (WRITE permission)

Input parameters:

- `action` (string, required): Changelist modification action: create makes new changelist, update modifies description, submit commits changes, delete removes changelist, move_files reorganizes files between changelists
- `changelist_id`: Changelist ID - required for most actions except create
- `description` (string): Changelist description - required for create, optional for update
- `file_paths`: File paths - required for move_files action

### `query_shelves` (~102 tokens)

List shelves, get shelve diff and files (READ permission)

Input parameters:

- `action` (string, required): Shelve query action: list returns all shelved changelists, diff shows shelved file differences, files lists files in shelved changelist
- `changelist_id`: Changelist ID - required for diff and files actions
- `max_results` (integer): Maximum number of results to return
- `user`: Filter by user - for list action

### `modify_shelves` (~133 tokens)

Create/delete, update shelves and unshelve files (WRITE permission)

Input parameters:

- `action` (string, required): Shelve modification action: shelve stores files to shelf, unshelve restores files from shelf, update modifies shelved files, delete removes shelf, unshelve_to_changelist restores to specific changeli…
- `changelist_id` (string, required): Changelist ID
- `file_paths`: File paths for shelve/unshelve/update/delete
- `force` (boolean): Force operation - use with caution
- `target_changelist` (string): Target changelist for unshelve operations

### `query_jobs` (~92 tokens)

Get jobs from changelist and get job details (READ permission)

Input parameters:

- `action` (string, required): Job query action: list_jobs returns jobs linked to changelist, get_job retrieves specific job details
- `changelist_id`: Changelist ID - required for list_jobs action
- `job_id`: Job ID - required for get_job action
- `max_results` (integer): Maximum number of results to return

### `modify_jobs` (~79 tokens)

Link or unlink jobs (WRITE permission)

Input parameters:

- `action` (string, required): Job modification action: link_job associates job with changelist, unlink_job removes job association
- `changelist_id` (string, required): Changelist ID - required for link_job/unlink_job
- `job_id` (string, required): Job ID - required for link_job/unlink_job

### `query_reviews` (~408 tokens)

Get review details and list reviews (READ permission).
Open review - state is 'approved but pending=true' or 'needsReview' or 'needsRevision'.
Closed review - state is 'approved but pending=false' or 'rejected' or 'archived'.

Input parameters:

- `action` (string, required): Review query action: list all reviews, dashboard for current user, get specific review, transitions, files_readby, files, comments, activity
- `after`: Review ID to seek to for pagination (list action). Reviews up to and including this ID are excluded.
- `after_updated`: Return reviews updated on the day before this date/time in seconds since epoch (list action). Mutually exclusive with 'after'.
- `comments_fields`: Comma-separated list of fields to return for comments action
- `fields`: List of fields to return for list/get actions
- `from_version`: Starting version for files action
- `include_transitions`: Include allowed state transitions in get action response
- `keywords`: Search keyword(s) to filter reviews (list action). Use with keywords_fields.
- `keywords_fields`: Fields to search keywords in (list action). Valid: changes, author, participants, hasReviewer, description, updated, projects, state, testStatus, pending, groups, id
- `max_results` (integer): Maximum number of results to return
- `projects`: Filter by project name(s) (list action)
- `result_order`: Set to 'updated' to return most recently updated reviews first (list action)
- `review_id`: Review ID - required for get, transitions, files_readby, files, comments, activity actions
- `state`: Filter by review state(s) (list action). Valid: needsRevision, needsReview, approved, approved:isPending, approved:commit, approved:notPending, rejected, archived
- `to_version`: Ending version for files action
- `up_voters`: List of up voters for transitions action

### `modify_reviews` (~491 tokens)

Create/update/delete reviews (WRITE permission)

Input parameters:

- `action` (string, required): Review modification action. To delete/obliterate review, use 'obliterate' action which requires approval
- `body`: Comment body (required for add_comment, reply_comment)
- `change_id`: Changelist ID (required for create, append_change, replace_with_change)
- `cleanup`: Perform cleanup for approved:commit/committed transitions
- `comment_content`: Content lines used to anchor an inline comment to the correct diff position (add_comment). Supply the code line the comment is on plus the four preceding lines, each terminated with a newline charact…
- `comment_file_path`: File path for inline comment
- `comment_id`: Comment ID (reply_comment, edit_comment, mark_comment_read/unread)
- `comment_left_line`: Left diff line number for inline comment
- `comment_right_line`: Right diff line number for inline comment
- `comment_version`: Review version for comment attachment
- `description`: Review description (optional on create)
- `fix_status`: Job fix status when transitioning
- `jobs`: Associated job IDs for transition
- `max_reviews` (integer): Maximum number of inactive reviews to archive (0 = no limit)
- `new_author`: New author username (update_author)
- `new_description`: New review description (update_description)
- `not_updated_since`: ISO date (YYYY-MM-DD) threshold for archive_inactive
- `notify`: Notification mode
- `participant_group_names`: List of participant group names
- `participant_groups_required`: List of required participant groups
- `participant_user_names`: List of participant usernames
- `participant_users_required`: List of required participant usernames
- `required_reviewers`: List of required reviewers
- `review_id`: Review ID (required for most actions except create, archive_inactive)
- `reviewer_group_names`: List of reviewer group names
- `reviewer_groups_required`: List of required reviewer groups
- `reviewers`: List of reviewers
- `task_state`: Task state. add_comment accepts only 'open'|'comment'; edit_comment additionally accepts 'addressed'|'verified'
- `transition`: Transition target state
- `version`: Review version (optional for vote)
- `vote_value`: Vote value

### `query_streams` (~512 tokens)

Query streams: list, get spec, children/parent/graph, integration status, workspaces, validate files, check resolve, interchanges (READ permission)

Input parameters:

- `action` (string, required): Stream query action: 'list' streams, 'get' stream spec, 'children'/'parent'/'graph' of a stream, 'integration_status' (p4 istat), 'get_workspace'/'list_workspaces', 'validate_file'/'validate_submit'…
- `all_streams` (boolean): Include virtual streams in 'list' results
- `at_change`: Changelist number for historical stream spec
- `both_directions` (boolean): Show integration status in both directions (-a flag for integration_status)
- `changelist`: Changelist for validate_submit
- `fields`: Fields to return for 'list' (e.g. ['Stream', 'Owner', 'Name', 'Type'])
- `file_paths`: File paths for validate_file or interchanges
- `filter`: Filter expression string for 'list' (-F flag). Supports &, |, and parentheses. E.g. 'Parent=//Ace/MAIN&(Type=development|Type=release)'
- `force_refresh` (boolean): Force istat to assume cache is stale and search for pending integrations (-c flag)
- `limit`: Max changelists (interchanges)
- `long_output` (boolean): Full changelist descriptions (interchanges)
- `max_results`: Maximum number of results to return. Bounds 'list' and 'list_workspaces' and also caps 'children' via 'p4 streams -m N'. Omit for unbounded results.
- `reverse` (boolean): Reverse comparison direction (interchanges)
- `stream_name`: Stream depot path (e.g. '//depot/main'). Required for most actions.
- `stream_path`: Stream path pattern(s) for 'list' (e.g. ['//depot/...'])
- `template`: Template workspace for get_workspace
- `unloaded` (boolean): Include unloaded streams/workspaces
- `user`: Filter workspaces by user (list_workspaces)
- `view_without_edit` (boolean): View locked stream without opening for edit (-v flag)
- `viewmatch`: Single depot file path to filter streams whose views contain this path
- `workspace`: Workspace name for get_workspace, validate_file, validate_submit

### `modify_streams` (~678 tokens)

Create/update/delete streams, edit/resolve/revert/shelve stream specs, copy/merge/integrate/populate between streams, switch workspace, create stream workspace (WRITE permission)

Input parameters:

- `action` (string, required): Stream modification action: 'create'/'update'/'delete' a stream, 'edit_spec'/'resolve_spec'/'revert_spec'/'shelve_spec'/'unshelve_spec' for spec editing, 'copy'/'merge'/'integrate'/'populate' for pro…
- `alt_roots`: Alternate root paths (create_workspace)
- `branch`: Branch spec name for integrate/populate (-b flag)
- `changelist`: Changelist for edit_spec, shelve_spec, unshelve_spec, or propagation, 'default' not allowed for edit_spec/shelve_spec/unshelve_spec
- `description`: Stream or workspace description
- `file_paths`: File paths for propagation
- `force` (boolean): Force operation
- `host`: Host restriction (create_workspace)
- `ignored`: Ignored paths
- `integrate_around_deleted` (boolean): Integrate around deleted revisions (-Di flag)
- `max_files`: Limit number of files processed (-m flag)
- `name`: Short display name for the stream
- `options`: Stream options: 'allsubmit/ownersubmit unlocked/locked toparent/notoparent fromparent/nofromparent'
- `output_base` (boolean): Show base revision with each scheduled resolve (-Ob flag for merge/integrate) or display list of files created (-o flag for populate)
- `parent`: Parent stream (required for non-mainline create)
- `parent_stream`: Override parent stream for propagation (-P flag)
- `parent_view`: Parent view treatment: 'inherit' or 'noinherit'
- `paths`: Stream view paths (e.g. ['share ...', 'isolate dir/...'])
- `preview` (boolean): Preview only, don't make changes (-n flag)
- `quiet` (boolean): Suppress informational messages (-q flag)
- `remapped`: Remapped paths
- `resolve_mode`: Resolve mode for resolve_spec: 'auto', 'accept_theirs', 'accept_yours'
- `reverse` (boolean): Reverse direction (-r flag)
- `root`: Workspace root directory (create_workspace)
- `schedule_branch_resolve` (boolean): Schedule 'branch resolves' instead of branching new target files automatically (-Rb flag)
- `skip_cherry_picked` (boolean): Skip cherry-picked revisions already integrated (-Rs flag)
- `source_path`: Source path for populate
- `stream_name`: Stream depot path (e.g. '//depot/main'). Also used as -S flag for propagation.
- `stream_type`: Stream type (required for create): mainline, development, sparsedev, release, sparserel, task, virtual
- `target_changelist`: Target changelist for unshelve_spec
- `target_path`: Target path for populate
- `virtual` (boolean): Copy using virtual stream (-v flag, copy only)
- `workspace`: Workspace name for switch
- `workspace_name`: Workspace name to create (create_workspace)

## Diagnostics

Captured diagnostic sections: Provenance. The full working is on the page: https://verifymcp.io/servers/perforce-p4mcp-server/ghcr-io-perforce-p4mcp-server#diagnostics

## Score history

- 2026-11-05: 37
- 2026-11-04: 36
- 2026-11-03: 36
- 2026-11-02: 35

## Common questions

### What is the Perforce P4 MCP Server server?

Perforce P4 MCP Server is listed in the public MCP registry as io.github.perforce/p4mcp-server. Perforce P4 MCP server for version control and P4 DAM digital asset management. This page covers its container image (ghcr.io/perforce/p4mcp-server).

### Is the Perforce P4 MCP Server server safe to use?

Perforce P4 MCP Server scores 37 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the Perforce P4 MCP Server server expose?

Perforce P4 MCP Server exposes 15 tools: query_server, query_workspaces, modify_workspaces, query_files, modify_files, and 10 more. Their descriptions and schemas cost roughly 3,427 tokens of context every time the server is loaded.

### Is the Perforce P4 MCP Server server still maintained?

Perforce P4 MCP Server is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

### What did VerifyMCP test on the Perforce P4 MCP Server server?

VerifyMCP ran 12 checks on Perforce P4 MCP Server, covering Source repository, Provenance, License, Maintenance and 8 more. 4 items could not be completed, a gap on our side rather than a finding about Perforce P4 MCP Server: Malware scan, Known CVEs, Install scripts and Dependency health. One category scores 0 for that reason, because we only credit what we can confirm. Endpoint Security and Transport & Reachability do not apply to a container image, so they were not tested. The score does not measure everything, and the scoring documentation lists what it leaves out.

## Links

- GitHub Container Registry: https://ghcr.io/perforce/p4mcp-server
- Repository: https://github.com/perforce/p4mcp-server
- Changelog RSS feed: https://verifymcp.io/servers/perforce-p4mcp-server/ghcr-io-perforce-p4mcp-server.xml
- Changelog JSON feed: https://verifymcp.io/servers/perforce-p4mcp-server/ghcr-io-perforce-p4mcp-server/changelog.json
- Trust report (JSON): https://verifymcp.io/servers/perforce-p4mcp-server/ghcr-io-perforce-p4mcp-server.json
- HTML version of this page: https://verifymcp.io/servers/perforce-p4mcp-server/ghcr-io-perforce-p4mcp-server
