Perforce P4 MCP Server is a Model Context Protocol (MCP) server that integrates with the Perforce P4 version control system. It is built on FastMCP with direct P4 Python bindings to expose safe, structured read/write tools for changelists, files, shelves, workspaces, jobs, and server metadata.
- Features
- Prerequisites
- Local P4 MCP Server installation
- MCP client configuration
- P4 configuration
- Available tools
- Logging and usage data
- Troubleshooting
- Support
- Contributions
- License
- Comprehensive P4 integration: Read/write tools across files, changelists, shelves, workspaces, jobs, and server information
- Safety first: Read-only mode by default, ownership checks, explicit confirmation for destructive deletes.
- Flexible toolsets: Configure which tool categories to enable: files, changelists, shelves, workspaces, and jobs.
- Robust logging: Application and session logging to the
logs/
directory. - Optional telemetry: Consent-gated usage statistics. Disabled by default.
- Cross platform: Supported on macOS and Windows with pre-built binaries.
- P4 Server access: Connection to a P4 Server with proper credentials
- Authentication: Valid P4 login (ticket-based or password)
Pre-built binaries (recommended)
Download the appropriate binary for your operating system:
- Windows:
binaries/win/p4-mcp-server-2025.1.0.zip
- macOS:
binaries/mac/p4-mcp-server-2025.1.0.tgz
Extract and use the executable directly. No Python installation is required.
# Windows
unzip p4-mcp-server-2025.1.0.zip
cd p4-mcp-server-2025.1.0
./p4-mcp-server.exe --help
# macOS
tar -xzf p4-mcp-server-2025.1.0.tgz
cd p4-mcp-server-2025.1.0
./p4-mcp-server --help
Build from source
Requirements:
- 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:
p4-mcp-server-<version>.tgz
- Windows:
p4-mcp-server-<version>.zip
Note: In all configuration examples below, if
P4CONFIG
is set, you do not need to set any environment variables in theenv
block. The server will use the configuration from the specified P4CONFIG file instead.Server configuration example
{ "mcpServers": { "perforce-p4-mcp": { "command": "/absolute/path/to/p4-mcp-server", "env": { }, "args": [ "--readonly", "--allow-usage" ] } } }
Claude Code
See the Claude Code MCP docs 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"
},
"args": [
"--readonly", "--allow-usage"
]
}
}
}
Cursor
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"
},
"args": [
"--readonly", "--allow-usage"
]
}
}
}
Eclipse
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"
},
"args": [
"--readonly", "--allow-usage"
]
}
}
}
IntelliJ
See the Intellij 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"
},
"args": [
"--readonly", "--allow-usage"
]
}
}
}
Kiro
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"
},
"args": [
"--readonly", "--allow-usage"
]
}
}
}
Rider
See the Rider MCP documentation for 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"
},
"args": [
"--readonly", "--allow-usage"
]
}
}
}
VS Code
See the VS Code documentation for more information. Add the following to your VS Code MCP settings:
{
"servers": {
"perforce-p4-mcp": {
"command": "/absolute/path/to/p4-mcp-server",
"env": {
"P4PORT": "ssl:perforce.example.com:1666",
"P4USER": "your_username",
"P4CLIENT": "your_workspace"
},
"args": [
"--readonly", "--allow-usage"
]
}
}
}
Windsurf
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"
},
"args": [
"--readonly", "--allow-usage"
]
}
}
}
P4PORT
- P4 Server address. Examples:ssl:perforce.example.com:1666
,localhost:1666
P4USER
- Your P4 usernameP4CLIENT
- Your current P4 workspace. Optional, but recommended
-
--readonly
- Control write operations.- If present, uses read-only mode. Safe for exploration and testing.
- If missing, enables write operations. Requires proper permissions on your P4 Server.
-
--allow-usage
- Allow usage statistics.- If present, allows anonymous usage statistics collection.
- If missing, disables all usage statistics.
-
--toolsets
- Specify which tool categories to enable.- Available:
files
,changelists
,shelves
,workspaces
,jobs
- Default: All toolsets enabled.
- Available:
- Use absolute paths for the
command
field in all configurations. - Ensure environment variables are properly set for each host.
- Different hosts may have different argument parsing. Refer to the host's documentation.
Example setup
# Windows (PowerShell)
$env:P4PORT = "ssl:perforce.example.com:1666"
$env:P4USER = "your_username"
$env:P4CLIENT = "your_workspace"
# macOS (Bash)
export P4PORT="ssl:perforce.example.com:1666"
export P4USER="your_username"
export P4CLIENT="your_workspace"
Manage access through group-level and user-level server properties. These follow a strict order of precedence:
- User-level properties override group properties.
- Group-level properties are evaluated in the order of their sequence number (set with
-s
). - If no property applies, MCP remains enabled unless explicitly disabled.
To disable MCP for all users:
p4 property -a -n mcp.enabled -v false
To re-enable group/user-based control, delete the global property first:
p4 property -d -n mcp.enabled
Group-based restrictions
To prevent access for all members of a specific group:
p4 property -a -n mcp.enabled -v false -g noaccessgroup
You can set multiple group restrictions the same way.
When a user belongs to multiple groups with conflicting settings, sequence order (-s) determines which settings apply.
Lower sequence numbers are evaluated first.
Example:
p4 property -a -n mcp.enabled -v false -s1 -g noaccessgroup
p4 property -a -n mcp.enabled -v true -s2 -g accessgroup
In this example, accessgroup
overrides noaccessgroup
because it is evaluated later.
User-based restrictions
To block a specific user regardless of group membership:
p4 property -a -n mcp.enabled -v false -u noaccessuser
User-level properties always override group-level settings.
Example: Even if noaccessuser
is in accessgroup
(where MCP is enabled), the user property takes precedence and MCP is disabled.
Important notes
-
mcp.enabled
acts as the main switch. -
Avoid global properties (
-a
without-u
or-g
) unless you absolutely need to disable MCP for everyone.
query_server
- Get server information and current user details
- Actions:
server_info
- Get P4 version, uptime, and configurationcurrent_user
- Get current user information and permissions
- Use cases - Server diagnostics, user verification, connection testing
query_workspaces
- Workspace information and management
- Actions:
list
- List all workspaces (optionally filtered by user)get
- Get a detailed workspace specificationtype
- Check workspace type and configurationstatus
- Check workspace sync status
- Parameters:
workspace_name
,user
,max_results
- Use cases: Workspace discovery, configuration review, status checking
query_changelists
- Access changelist information and history
- Actions:
get
- Get detailed changelist information (files, description, jobs)list
- List changelists with filters (status, user, workspace)
- Parameters:
changelist_id
,status
(pending/submitted),workspace_name
,max_results
- Use cases: Code review, history tracking, changelist analysis
query_files
- File operations and information
- Actions:
content
- Get file content at a specific revisionhistory
- Get file revision history and integration recordsinfo
- Get file basic details (type, size, permissions)metadata
- Get file metadata (attributes, filesize, etc.)diff
- Compare file versions (depot-to-depot or mixed)annotations
- Get file annotations with blame information
- Parameters:
file_path
,file2
(for diff),max_results
,diff2
(boolean) - Use cases: Code analysis, file comparison, history tracking, blame analysis
query_shelves
- Shelved changelist operations and inspection
- Actions:
list
- List shelved changes by user or globallydiff
- Show differences in shelved filesfiles
- List files in a specific shelf
- Parameters:
changelist_id
,user
,max_results
- Use cases: Code review, work-in-progress tracking, collaboration
query_jobs
- Job tracking and defect management
- Actions:
list_jobs
- List jobs associated with a changelistget_job
- Get detailed job information and status
- Parameters:
changelist_id
,job_id
,max_results
- Use cases: Defect tracking, requirement traceability, project management
modify_workspaces
- Workspace creation and management
- Actions -
create
,update
,delete
,switch
- Parameters -
name
,specs
(WorkspaceSpec object with View, Root, Options, etc.) - Requires - Non-read only mode, appropriate permissions
- Use cases - Environment setup, workspace maintenance, branch switching
modify_changelists
- Changelist lifecycle management
- Actions -
create
,update
,submit
,delete
,move_files
- Parameters -
changelist_id
,description
,file_paths
- Safety - Ownership checks, confirmation for destructive operations
- Use cases - Code submission, work organization, file grouping
modify_files
- File system operations and version control
- Actions -
add
,edit
,delete
,move
,revert
,reconcile
,resolve
,sync
- Parameters -
file_paths
,changelist
,force
,mode
(for resolve operations) - Resolve modes -
auto
,safe
,force
,preview
,theirs
,yours
- Use cases - File editing, conflict resolution, workspace synchronization
modify_shelves
- Shelving operations for work in progress
- Actions -
shelve
,unshelve
,update
,delete
,unshelve_to_changelist
- Parameters -
changelist_id
,file_paths
,target_changelist
,force
- Use cases - Temporary storage, code sharing, backup before experiments
modify_jobs
- Job and changelist integration
- Actions -
link_job
,unlink_job
- Parameters -
changelist_id
,job_id
- Use cases - Defect tracking integration, requirement linking
execute_delete
- Execute approved delete operations
- Parameters -
operation_id
,source_tool
,user_confirmed
- Safety - Requires explicit user confirmation, logs all operations
- Supported Resources - Changelists, workspaces, shelves
- Use cases - Cleanup operations, resource management
Log locations:
- Application log:
logs/p4mcp.log
- Main server operations and errors - Session logs:
logs/sessions/*.log
- Individual session activities are recorded only when the--allow-usage
is specified in the server's startup arguments.
Privacy-first approach:
- Disabled by default: No data collection without explicit consent
- Consent-gated: First-run prompt for telemetry permission
- Transparent: Clear explanation of data collected
- Revocable: Easy opt-out at any time
Data collected (if consented):
- Tool usage frequency (anonymized)
- Error rates and types (no personal data)
- Performance metrics
- Feature adoption statistics
- P4 server version
Data not collected:
- File contents or names
- P4 Server details except version
- User credentials or personal information
- Specific project information
Control:
- Usage data is only collected if the
--allow-usage
argument is provided at startup.
Unable to start server
Symptoms: OS cannot find or execute the binary; error includes ENOENT
or "No such file or directory".
Solutions:
- Check the path: Make sure the
command
field uses the correct absolute path for your OS:- macOS/Linux:
/absolute/path/to/p4-mcp-server
- Windows:
C:\absolute\path\to\p4-mcp-server.exe
- macOS/Linux:
- Ensure the binary exists and is executable:
- macOS/Linux:
ls -l /absolute/path/to/p4-mcp-server && chmod +x /absolute/path/to/p4-mcp-server
- Windows:
dir C:\absolute\path\to\p4-mcp-server.exe
- macOS/Linux:
- On Windows, ensure the binary is not blocked:
- Right-click the
.exe
file, select Properties, and if present, click Unblock.
- Right-click the
Connect to server failed; check $P4PORT
Symptoms: Cannot connect to P4 Server
Solutions:
- Verify the
P4PORT
environment variable:echo $P4PORT
(macOS) orecho $env:P4PORT
(Windows) - Test the direct connection:
p4 info
- Check server availability:
ping perforce.example.com
- Verify the port and protocol (
ssl:
prefix for SSL connections).
SSL certificate not trusted
Symptoms: SSL trust errors when connecting
Solutions:
- Trust the server:
p4 trust -f -y
- Check trust status:
p4 trust -l
- For persistent issues, verify the SSL configuration.
User not logged in
Symptoms: Authentication failures
Solutions:
- Log in to P4:
p4 login -a
- Check login status:
p4 login -s
- Verify the user exists:
p4 users -m 1 your_username
- For persistent issues, check password or use ticket-based authentication.
Password invalid
Symptoms: Login failures
Solutions:
- Reset the password through P4 administrator.
- Use ticket-based authentication:
p4 login -a
- Verify the username is correct:
p4 info
Client unknown
Symptoms: Workspace not found errors
Solutions:
- List the available workspaces:
p4 clients
- Verify the
P4CLIENT
environment variable. - Create a workspace if needed:
p4 client workspace_name
- Check the workspace ownership:
p4 client -o workspace_name
File(s) not in client view
Symptoms: Files are outside the workspace mapping
Solutions:
- Check the client view:
p4 client -o workspace_name
- Update the workspace mapping to include the required paths.
- Use
p4 where file_path
to check the mapping.
Operation not permitted
Symptoms: Insufficient permissions for operations
Solutions:
- Check the file ownership:
p4 opened file_path
- Verify the user permissions:
p4 protects file_path
- Ensure proper group membership.
- For admin operations, verify admin permissions.
File is opened by another user
Symptoms: Exclusive lock conflicts
Solutions:
- Check who has the file open:
p4 opened file_path
- Contact the user to resolve conflicts.
- Admin can force operations if necessary.
Slow operations
Symptoms: Long response times
Solutions:
- Use the
max_results
parameter to limit the query size. - Use specific file paths instead of wildcards.
- Check network connectivity to P4.
- Monitor server performance.
Memory issues
Symptoms: High memory usage
Solutions:
- Reduce
max_results
for large queries. - Process files in batches.
- Restart the MCP server periodically for long-running sessions.
Unable to execute tools
Symptoms: Conflict with built-in or other MCP tools
Solutions:
- Disable any built-in or conflicting MCP server tools in your environment or configuration.
- Ensure the P4 MCP server tools are properly registered and enabled.
- Restart the MCP server after applying configuration changes to load the correct tools.
Correct tools not picked up
Symptoms: Invalid context or outdated session history
Solutions:
- Provide a P4-related context when writing prompts.
- Start a new session if the existing session is old or contains conflicting prompt history.
- Authentication: Ensure valid login before MCP operations.
- Workspace mapping: Verify client views include target files.
- Permissions: Check user and file permissions for write operations.
- Network: Verify connectivity for remote P4 Servers.
- Check the logs: Always check
logs/p4mcp.log
first. - Test P4: Ensure
p4 info
works before troubleshooting MCP. - Report issues to the community: Report issues with log excerpts and environment details.
Perforce P4 MCP Server is a community supported project and is not officially supported by Perforce. Pull requests and issues are the responsibility of the project's moderator(s); this may be a vetted individual or team with members outside of the Perforce organization. Perforce does not officially support these projects, therefore all issues should be reported and managed via GitHub (not via Perforce's standard support process).
We welcome contributions to the P4 MCP Server project.
This project is licensed under the MIT License. See the LICENSE file for details.