Perforce P4 MCP Server
Integrates with the Perforce P4 version control system to expose safe, structured read/write tools for managing changelists, files, shelves, workspaces, jobs, code reviews, streams, and server metadata, plus P4 DAM asset and metadata management (asset search, reviews, bundles, tags, and projects) via its REST API.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Perforce P4 MCP Servershow my open changelists"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Features
Comprehensive P4 integration: Read/write tools across files, changelists, shelves, workspaces, jobs, reviews, streams, and server information.
Code review workflows: P4 Code Review support for review discovery, voting, state transitions, commenting, and participant management.
P4 DAM integration: Access P4 DAM assets and metadata through MCP-compatible AI assistants. Search for assets, retrieve metadata, manage reviews, create asset bundles, update asset tags, and browse projects. To learn more, see Configure P4 DAM access for P4 MCP Server in the P4 DAM documentation.
Safety first: Read-only mode by default, ownership checks, interactive MCP elicitation (PROCEED/CANCEL) for destructive delete and obliterate operations.
Flexible toolsets: Configure which tool categories to enable: server, files, changelists, shelves, workspaces, jobs, reviews, streams, and p4dam.
Robust logging: Application and session logging to the
logs/directory.Optional telemetry: Consent-gated usage statistics. Disabled by default.
Cross platform: Supported on macOS, Linux and Windows with pre-built binaries.
Related MCP server: Perforce P4 MCP Server
Prerequisites
P4 Server access: Connection to a P4 Server with proper credentials
Authentication: Valid P4 login (ticket-based or password)
System Requirements
Component | Supported Versions |
Operating Systems | Windows 10+macOS 12+Linux (glibc 2.34+, e.g. Ubuntu 22.04+, Rocky Linux 9+) |
Perforce P4 Server | 2026.1 (earlier versions untested) |
Python | 3.11+ (required only for building from source) |
Local P4 MCP Server Installation
If you have uv installed, you can run P4 MCP Server directly without any manual installation:
# Run the server
uvx p4mcp-server
# Check version
uvx p4mcp-server --version
# Run with arguments
uvx p4mcp-server --readonly --allow-usageThis automatically fetches and runs the latest version from PyPI. No Python virtual environment setup or dependency management needed.
Requirements:
uv installed on your system
Python 3.11+ (uv will handle this automatically)
Download the appropriate binary for your operating system:
macOS: p4-mcp-server-mac.zip
Windows: p4-mcp-server-win.zip
Linux: p4-mcp-server-linux.zip
Extract and use the executable directly. No Python installation is required.
# macOS / Linux
unzip p4-mcp-server-mac.zip # or p4-mcp-server-linux.zip
./p4-mcp-server --help# Windows
Expand-Archive p4-mcp-server-win.zip -DestinationPath .
.\p4-mcp-server.exe --helpRequirements:
Python 3.11+ (with Tkinter)
Build:
macOS: chmod +x build.sh && ./build.sh package
Linux: chmod +x build.sh && ./build.sh package
Windows: build.bat package
Output:
macOS & Linux: p4-mcp-server-<version>.tgz
Windows: p4-mcp-server-<version>.zip
Deployment
STDIO-based deployment
Run the P4 MCP Server directly on your machine using the default STDIO transport.
Add the following to your mcp.json:
{
"mcpServers": {
"perforce-p4-mcp": {
"command": "/absolute/path/to/p4-mcp-server",
"env": {
"P4PORT": "ssl:perforce.example.com:1666",
"P4USER": "your_username",
"P4CLIENT": "your_workspace",
"P4DAM_API_KEY": "your_api_key"
},
"args": [
"--readonly", "--allow-usage"
]
}
}
}Note: This example shows explicit
envvalues. IfP4CONFIGis set, you can omit them and use the generic configuration example in theMCP client configurationsection instead.
Run the P4 MCP Server from a Docker container with STDIO transport, allowing MCP clients to manage the container lifecycle.
Note: Docker-based execution is currently supported on macOS and Linux only.
Prerequisites
Docker installed and running
Valid P4 credentials and access to a P4 server
Pull the Docker image
docker pull ghcr.io/perforce/p4mcp-server:latestcd /path/to/p4mcp-server
docker build -t ghcr.io/perforce/p4mcp-server .Configure MCP Client
Add the following to your mcp.json:
{
"servers": {
"perforce-p4mcp-docker": {
"command": "docker",
"args": [
"run", "-i", "--rm",
"--hostname", "your-hostname",
"-e", "P4PORT=ssl:perforce.example.com:1666",
"-e", "P4USER=your_username",
"-e", "P4CLIENT=your_workspace",
"-e", "P4DAM_API_KEY=your_api_key",
"-v", "/Users/your_username/.p4tickets:/home/mcpuser/.p4tickets:ro",
"ghcr.io/perforce/p4mcp-server:latest"
]
}
}
}Configuration Options
Flag | Description |
| Interactive mode (required for STDIO) |
| Remove container when stopped |
| Match workspace host restriction |
| P4 server address |
| P4 username |
| Workspace name |
| Mount P4 tickets file |
Authentication
Using P4 tickets:
# macOS/Linux
-v /Users/your_username/.p4tickets:/home/mcpuser/.p4tickets:roNote: Use the full path to your tickets file (not
~). After runningp4 login, restart the MCP server to pick up the new ticket.
Note: By default the container starts as root, copies the bind-mounted tickets file to a location readable by the non-root
mcpuser, then drops privileges (viagosu) so the server runs asmcpuser. This auto-copy lets an owner-only (0600) tickets file owned by a foreign uid work on runtimes that preserve host ownership (native Linux Docker/podman). A:robind mount of the ticket is supported — the file is copied, not modified in place (this is distinct from a read-only container root filesystem; see below). Note the auto-copy runs only when the container starts as root (the default); forcing a non-root uid or a read-only root filesystem changes this behavior, as described below.
Kubernetes / restricted (non-root-enforced) profiles: the image intentionally starts as root and drops to
mcpuser(uid 1000) viagosu, so the server always runs non-root — both paths are supported. ForrunAsNonRoot/ restricted PodSecurity / OpenShift restricted SCC, setsecurityContext.runAsUser: 1000(andfsGroup: 1000when mounting the ticket). In that mode the entrypoint's root-only ticket copy is skipped, so the mounted ticket must already be readable by uid 1000 (owner-matched mount,-e P4PASSWD="your_ticket_content", orpodman -v <host>:/home/mcpuser/.p4tickets:U).
Read-only root filesystem (
--read-only/readOnlyRootFilesystem): provide a writable/tmpfs/home/mcpuser(e.g.--tmpfs /home/mcpuser) so the ticket copy can be written; otherwise the ticket copy fails and P4 will report a normal auth error.
Using a password:
-e P4PASSWD="your_password"Workspace Host Restrictions
⚠️ Important: Docker containers have their own hostname, which differs from your local machine. If your P4 workspace is restricted to a specific host, operations like
syncwill fail.
To resolve this, set the container hostname to match your workspace's host restriction:
--hostname your-hostnameTo find your workspace host name:
# macOS/Linux
p4 client -o your_workspace | grep "^Host:"Mounting Client Root for Write Operations
⚠️ Important: By default, the Docker container cannot access your local workspace files. For write operations like
sync,submit, orreconcile, you must mount your client root directory into the container at the same path.
Add a volume mount for your client root:
-v /path/to/your/client/root:/path/to/your/client/rootExample configuration with client root mounted:
{
"servers": {
"perforce-p4mcp-docker": {
"command": "docker",
"args": [
"run", "-i", "--rm",
"--hostname", "your-hostname",
"-e", "P4PORT=ssl:perforce.example.com:1666",
"-e", "P4USER=your_username",
"-e", "P4CLIENT=your_workspace",
"-e", "P4DAM_API_KEY=your_api_key",
"-v", "/Users/your_username/.p4tickets:/home/mcpuser/.p4tickets",
"-v", "/path/to/client/root:/path/to/client/root",
"ghcr.io/perforce/p4mcp-server:latest"
]
}
}
}To find your client root:
p4 client -o your_workspace | grep "^Root:"Note: The mount path inside the container must match the client root path exactly, as P4 tracks files by their absolute paths.
HTTP-based deployment
Run the MCP server on a VM using the HTTP transport, allowing clients to connect over the network.
Start the server on the VM:
P4PORT=ssl:perforce.example.com:1666 P4USER=your_username P4PASSWD=YOUR_TICKET ./p4-mcp-server --readonly --transport http --port 8000Configure the MCP client:
Add the following to your mcp.json:
{
"servers": {
"perforce-p4-mcp": {
"type": "http",
"url": "http://<ip-or-hostname>:8000/mcp"
}
}
}Note: Ensure the VM's firewall allows inbound connections on the chosen port. For production use, consider placing the server behind a reverse proxy with TLS.
Run the MCP server in a Docker container using HTTP transport and expose the MCP endpoint over a host port.
Start the container:
docker run --rm -p 8000:8000 \
-e P4PORT=ssl:perforce.example.com:1666 \
-e P4USER=your_username \
-e P4PASSWD=YOUR_TICKET \
-e P4DAM_API_KEY=your_api_key \
ghcr.io/perforce/p4mcp-server:latest \
python3 -m p4mcp.main --readonly --transport http --port 8000Configure the MCP client:
Add the following to your mcp.json:
{
"servers": {
"perforce-p4-mcp": {
"type": "http",
"url": "http://<ip-or-hostname>:8000/mcp"
}
}
}Note: Docker supports HTTP-based deployment as well. The container image defaults to STDIO transport, so the HTTP startup command must explicitly override the default command. If you need write operations, also mount the client root and ticket file paths into the container.
MCP client configuration
Note: In all configuration examples below, if
P4CONFIGis set, you do not need to set any environment variables in theenvblock. The server will use the configuration from the specified P4CONFIG file instead.
Tip: If you have uv installed, you can use
uvx p4mcp-serverinstead of/absolute/path/to/p4-mcp-serverin thecommandfield. This eliminates the need to download or build binaries manually.{ "mcpServers": { "perforce-p4-mcp": { "command": "uvx", "args": [ "p4mcp-server", "--readonly", "--allow-usage" ], "env": { "P4PORT": "ssl:perforce.example.com:1666", "P4USER": "your_username", "P4CLIENT": "your_workspace", "P4DAM_API_KEY": "your_api_key" } } } }{ "mcpServers": { "perforce-p4-mcp": { "command": "/absolute/path/to/p4-mcp-server", "env": { }, "args": [ "--readonly", "--allow-usage" ] } } }
See the JetBrains AI Assistant VCS Integration documentation for detailed configuration steps.
See the Claude Code MCP docs for more information.
Using uvx (no installation required):
{
"mcpServers": {
"perforce-p4-mcp": {
"command": "uvx",
"args": [
"p4mcp-server",
"--readonly", "--allow-usage"
],
"env": {
"P4PORT": "ssl:perforce.example.com:1666",
"P4USER": "your_username",
"P4CLIENT": "your_workspace",
"P4DAM_API_KEY": "your_api_key"
}
}
}
}Using pre-built binary:
{
"mcpServers": {
"perforce-p4-mcp": {
"command": "/absolute/path/to/p4-mcp-server",
"env": {
"P4PORT": "ssl:perforce.example.com:1666",
"P4USER": "your_username",
"P4CLIENT": "your_workspace",
"P4DAM_API_KEY": "your_api_key"
},
"args": [
"--readonly", "--allow-usage"
]
}
}
}See the Cursor MCP documentation for more information.
{
"mcpServers": {
"perforce-p4-mcp": {
"command": "/absolute/path/to/p4-mcp-server",
"env": {
"P4PORT": "ssl:perforce.example.com:1666",
"P4USER": "your_username",
"P4CLIENT": "your_workspace",
"P4DAM_API_KEY": "your_api_key"
},
"args": [
"--readonly", "--allow-usage"
]
}
}
}See the Eclipse MCP documentation for more information.
{
"servers": {
"perforce-p4-mcp": {
"command": "/absolute/path/to/p4-mcp-server",
"env": {
"P4PORT": "ssl:perforce.example.com:1666",
"P4USER": "your_username",
"P4CLIENT": "your_workspace",
"P4DAM_API_KEY": "your_api_key"
},
"args": [
"--readonly", "--allow-usage"
]
}
}
}See the Kiro MCP documentation for more information.
{
"mcpServers": {
"perforce-p4-mcp": {
"command": "/absolute/path/to/p4-mcp-server",
"env": {
"P4PORT": "ssl:perforce.example.com:1666",
"P4USER": "your_username",
"P4CLIENT": "your_workspace",
"P4DAM_API_KEY": "your_api_key"
},
"args": [
"--readonly", "--allow-usage"
]
}
}
}See the VS Code documentation for more information.
{
"servers": {
"perforce-p4-mcp": {
"command": "/absolute/path/to/p4-mcp-server",
"env": {
"P4PORT": "ssl:perforce.example.com:1666",
"P4USER": "your_username",
"P4CLIENT": "your_workspace",
"P4DAM_API_KEY": "your_api_key"
},
"args": [
"--readonly", "--allow-usage"
]
}
}
}See the Windsurf MCP documentation for more information.
{
"mcpServers": {
"perforce-p4-mcp": {
"command": "/absolute/path/to/p4-mcp-server",
"env": {
"P4PORT": "ssl:perforce.example.com:1666",
"P4USER": "your_username",
"P4CLIENT": "your_workspace",
"P4DAM_API_KEY": "your_api_key"
},
"args": [
"--readonly", "--allow-usage"
]
}
}
}P4 Environment Variables
P4PORT- P4 Server address. Examples:ssl:perforce.example.com:1666,localhost:1666P4USER- Your P4 usernameP4CLIENT- Your current P4 workspace. Optional, but recommended
Result limit environment variables
P4MCP_MAX_RESULTS- Cap on the number of rows the P4 server returns per command (p4.maxresults). Default:10000. Set to0to disable the limit (server default in effect). When a command would exceed this limit the server aborts it with an error rather than truncating results, so keep the value generous. Can be overridden by the--max-resultsCLI argument. Must be a non-negative integer; an invalid value fails fast at startup before any P4 connection is attempted.P4MCP_MAX_SCAN_ROWS- Cap on the number of rows the P4 server scans per command (p4.maxscanrows). Unset by default, so admin/group policy governs scan limits. Can be overridden by the--max-scan-rowsCLI argument. Must be a non-negative integer when supplied.
Logging environment variables
P4MCP_LOG_DIR- Directory for log files. Default:logs/in the server executable's directory. Can be overridden by the--log-dirCLI argument.
SSL/TLS environment variables
P4MCP_TLS_CA_MODE- TLS certificate source mode.system(default): use OS trust store viatruststore. Note: In this mode,truststoreoverrides theverify=parameter — custom CA bundles set viaP4MCP_CA_BUNDLEor--ca-bundleare ignored. To use a custom CA bundle, setP4MCP_TLS_CA_MODE=certifi.certifi: disable `truststo
This server cannot be deployed
Maintenance
Related MCP Connectors
Read-only AI coding tools for change verification, release readiness, capacity, and guidance.
Plan Salesforce deploys, open pull requests and trigger pipelines from your AI client.
- mcpOAuthcom.vibgrate
Query your team's drift, vulnerability, and upgrade data from any AI assistant. OAuth 2.1, 51 tools.
Read and write KukGit repositories, files, issues and pull requests from an AI assistant.
Related MCP Servers
- FlicenseNot gradedqualityAmaintenanceEnables AI assistants to read and write Perforce P4 version control resources — files, changelists, shelves, workspaces, jobs, reviews, streams, and server metadata — through safe, structured tools. Also connects to P4 DAM via its REST API so assets, metadata, reviews, tags, bundles, and projects can be managed conversationally, with read-only mode on by default and confirmation prompts for destructive operations.-
- FlicenseNot gradedqualityAmaintenanceIntegrates with Perforce P4 version control and P4 DAM to expose safe, structured read/write tools for changelists, files, shelves, workspaces, jobs, reviews, streams, server metadata, and DAM assets. This enables MCP-compatible AI assistants to manage version-control and DAM workflows.-
- FlicenseNot gradedqualityAmaintenanceEnables MCP-compatible AI assistants to safely read and write Perforce P4 data—files, changelists, shelves, workspaces, jobs, code reviews, streams, and server metadata—through structured tools, with read-only mode by default and confirmation prompts for destructive operations. It also connects to P4 DAM via its REST API for searching assets, managing reviews, and updating tags and bundles.-
- FlicenseNot gradedqualityAmaintenanceIntegrates AI assistants with Perforce P4 version control to expose safe, structured read/write tools for changelists, files, shelves, workspaces, jobs, reviews, streams, server metadata, and P4 DAM resources. It supports code review workflows and configurable tool categories with read-only defaults and safeguards for destructive operations.-