关于 Perforce P4 MCP Server
Perforce P4 MCP Server 是基于 FastMCP 和 P4 Python 绑定构建的 MCP 服务,用于 Perforce P4 版本控制及 P4 DAM 数字资产管理。它面向希望通过 AI 助手访问 P4 仓库和资产的用户,默认只读。
主要功能
- 01覆盖变更列表、文件、shelve、工作区等的读写工具
- 02P4 Code Review 支持,包括投票、状态切换和评论
- 03P4 DAM 资产搜索、元数据读取与标签更新
- 04默认只读模式与所有权检查
- 05删除和 obliterate 操作需交互确认
- 06可按工具类别启用不同工具集
适用场景
- 01通过 AI 助手查询 P4 变更列表和文件状态
- 02在代码评审流程中查看与投票
- 03通过 AI 助手检索 P4 DAM 资产并创建资产包
MCP 相关
该项目是一个 MCP 服务,向 MCP 客户端暴露 P4 版本控制及 P4 DAM 相关的工具。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
docker run -i --rm -e P4PORT -e P4USER -e P4CLIENT -e P4PASSWD -e P4DAM_API_KEY ghcr.io/perforce/p4mcp-server:2026.4.3078076P4PORTPerforce server address (e.g. ssl:perforce.example.com:1666)P4USERPerforce usernameP4CLIENTPerforce workspace/client nameP4PASSWD密钥Perforce password or ticketP4DAM_API_KEY密钥P4 DAM API key (account_key). When unset, P4 DAM tools are not registered.本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
ghcr.io/perforce/p4mcp-server:2026.4.3078076stdio工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
Perforce P4 MCP 服务
Perforce P4 MCP 服务是一款模型上下文协议(MCP)服务,可与 Perforce P4 版本控制系统集成。它基于 FastMCP 构建,并通过直接调用 P4 Python 绑定,为变更列表、文件、搁置、工作区、作业、评审和服务元数据提供安全、结构化的读写工具。它还通过 REST API 与 P4 DAM 集成,以管理资源。
功能
- 全面的 P4 集成:提供用于文件、变更列表、搁置、工作区、作业、评审、流和服务信息的读写工具。
- 代码评审工作流:支持 P4 Code Review,包括评审发现、投票、状态转换、评论和参与者管理。
- P4 DAM 集成:通过兼容 MCP 的 AI 助手访问 P4 DAM 资产和元数据。搜索资产、获取元数据、管理评审、创建资产包、更新资产标签以及浏览项目。了解详情,请参阅 P4 DAM 文档中的为 P4 MCP 服务配置 P4 DAM 访问权限。
- 安全至上:默认采用只读模式,执行所有权检查,并在执行具有破坏性的删除和清除操作前,通过交互式 MCP 询问(PROCEED/CANCEL)进行确认。
- 灵活的工具集:可配置要启用的工具类别:server、files、changelists、shelves、workspaces、jobs、reviews、streams 和 p4dam。
- 完善的日志记录:应用和会话日志记录到
logs/目录。 - 可选的遥测:经同意后收集使用统计信息。默认禁用。
- 跨平台:支持 macOS、Linux 和 Windows,并提供预构建二进制文件。
前提条件
- P4 服务访问权限:连接到具有适当凭据的 P4 服务
- 身份验证:有效的 P4 登录凭据(基于票证或密码)
系统要求
| 组件 | 支持的版本 |
|---|---|
| 操作系统 | Windows 10+ macOS 12+ Linux(glibc 2.34+,例如 Ubuntu 22.04+、Rocky Linux 9+) |
| Perforce P4 服务 | 2026.1 (未测试更早版本) |
| Python | 3.11+ (仅从源代码构建时需要) |
本地 P4 MCP 服务安装
uvx(最简单,无需安装)
如果已安装 uv,可以直接运行 P4 MCP Server,无需手动安装:
# Run the server
uvx p4mcp-server
# Check version
uvx p4mcp-server --version
# Run with arguments
uvx p4mcp-server --readonly --allow-usage
此命令会自动从 PyPI 获取并运行最新版本。无需设置 Python 虚拟环境或管理依赖项。
要求:
- 系统已安装 uv
- Python 3.11+(uv 会自动处理)
预构建二进制文件(推荐用于离线/隔离网络环境)
下载适用于你操作系统的二进制文件:
- macOS:p4-mcp-server-mac.zip
- Windows:p4-mcp-server-win.zip
- Linux:p4-mcp-server-linux.zip
解压后直接使用可执行文件。无需安装 Python。
# 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 --help
从源代码构建
要求:
- Python 3.11+(含 Tkinter)
构建:
- macOS:
chmod +x build.sh && ./build.sh package - Linux:
chmod +x build.sh && ./build.sh package - Windows:
build.bat package
输出:
- macOS 和 Linux:
p4-mcp-server-<version>.tgz - Windows:
p4-mcp-server-<version>.zip
部署
基于 STDIO 的部署
本地
使用默认的 STDIO 传输方式,在本机直接运行 P4 MCP Server。
将以下内容添加到你的 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"
]
}
}
}
**注意:**此示例显式设置了
env值。如果已设置P4CONFIG,则可以省略这些值,改用MCP 客户端配置部分中的通用配置示例。
Docker
通过 Docker 容器以 STDIO 传输方式运行 P4 MCP Server,让 MCP 客户端管理容器生命周期。
**注意:**目前仅 macOS 和 Linux 支持基于 Docker 的运行方式。
前置条件
- 已安装并运行 Docker
- 有效的 P4 凭据以及对 P4 服务的访问权限
拉取 Docker 镜像
docker pull ghcr.io/perforce/p4mcp-server:latest
改为从源代码构建
cd /path/to/p4mcp-server
docker build -t ghcr.io/perforce/p4mcp-server .
配置 MCP 客户端
将以下内容添加到你的 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"
]
}
}
}
配置选项
| 标记 | 描述 |
|---|---|
-i | 交互模式(STDIO 必需) |
--rm | 容器停止时移除容器 |
--hostname | 匹配工作区主机限制 |
-e P4PORT | P4 服务地址 |
-e P4USER | P4 用户名 |
-e P4CLIENT | 工作区名称 |
-v | 挂载 P4 票据文件 |
身份验证
使用 P4 票据:
# macOS/Linux
-v /Users/your_username/.p4tickets:/home/mcpuser/.p4tickets:ro
**注意:**请使用票据文件的完整路径(不要使用
~)。运行p4 login后,请重启 MCP 服务以加载新票据。
注意:默认情况下,容器以 root 身份启动,将绑定挂载的票据文件复制到非 root 用户
mcpuser可读取的位置,然后通过gosu降低权限,使服务以mcpuser身份运行。此自动复制功能可使归属外部 uid 的仅所有者可读(0600)票据文件,在保留主机所有权的运行时环境(原生 Linux Docker/podman)中正常使用。支持对票据文件进行:ro绑定挂载——文件会被复制,而不会原地修改(这与只读容器根文件系统不同;请参见下文)。请注意,自动复制仅在容器以 root 身份启动时运行(默认行为);强制使用非 root uid 或只读根文件系统会改变此行为,具体说明见下文。
**只读根文件系统(
--read-only/readOnlyRootFilesystem):**请提供可写的/home/mcpuser或 tmpfs(例如--tmpfs /home/mcpuser),以便写入票据副本;否则票据复制会失败,P4 会报告常规身份验证错误。
使用密码:
-e P4PASSWD="your_password"
工作区主机限制
⚠️ **重要:**Docker 容器有自己的主机名,与本地计算机的主机名不同。如果 P4 工作区仅限特定主机使用,
sync等操作将会失败。
若要解决此问题,请将容器主机名设置为与工作区的主机限制相匹配:
--hostname your-hostname
查找工作区主机名:
# macOS/Linux
p4 client -o your_workspace | grep "^Host:"
挂载客户端根目录以执行写入操作
⚠️ 重要:默认情况下,Docker 容器无法访问本地工作区文件。对于
sync、submit或reconcile等写入操作,必须将客户端根目录挂载到容器中,且路径必须完全相同。
为客户端根目录添加卷挂载:
-v /path/to/your/client/root:/path/to/your/client/root
挂载了客户端根目录的配置示例:
{
"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"
]
}
}
}
查找客户端根目录:
p4 client -o your_workspace | grep "^Root:"
**注意:**容器内的挂载路径必须与客户端根目录路径完全一致,因为 P4 会根据文件的绝对路径跟踪文件。
基于 HTTP 的部署
VM
使用 HTTP 传输在 VM 上运行 MCP 服务,以便客户端通过网络连接。
在 VM 上启动服务:
P4PORT=ssl:perforce.example.com:1666 P4USER=your_username P4PASSWD=YOUR_TICKET ./p4-mcp-server --readonly --transport http --port 8000
配置 MCP 客户端:
将以下内容添加到 mcp.json:
{
"servers": {
"perforce-p4-mcp": {
"type": "http",
"url": "http://<ip-or-hostname>:8000/mcp"
}
}
}
**注意:**确保 VM 的防火墙允许所选端口上的入站连接。用于生产环境时,可考虑将服务部署在启用了 TLS 的反向代理之后。
Docker
使用 HTTP 传输在 Docker 容器中运行 MCP 服务,并通过主机端口公开 MCP 端点。
启动容器:
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 8000
配置 MCP 客户端:
将以下内容添加到 mcp.json:
{
"servers": {
"perforce-p4-mcp": {
"type": "http",
"url": "http://<ip-or-hostname>:8000/mcp"
}
}
}
**注意:**Docker 同样支持基于 HTTP 的部署。容器镜像默认使用 STDIO 传输,因此 HTTP 启动命令必须显式覆盖默认命令。如果需要执行写入操作,还需将客户端根目录和票据文件路径挂载到容器中。
注意: 在以下所有配置示例中,如果已设置
P4CONFIG,则无需在env块中设置任何环境变量。服务将改用指定 P4CONFIG 文件中的配置。
提示: 如果已安装 uv,可以在
command字段中使用uvx p4mcp-server,而不是/absolute/path/to/p4-mcp-server。这样就无需手动下载或构建二进制文件。使用 uvx 的服务配置示例
```json` { "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" } } } }
</details> <details> <summary><strong>使用二进制文件路径的服务配置示例</strong></summary> ```json` { "mcpServers": { "perforce-p4-mcp": { "command": "/absolute/path/to/p4-mcp-server", "env": { }, "args": [ "--readonly", "--allow-usage" ] } } }
JetBrains IDE(IntelliJ IDEA、Rider、PyCharm 等)
请参阅 JetBrains AI Assistant VCS 集成文档,了解详细配置步骤。
Claude Code
请参阅 Claude Code MCP 文档了解更多信息。
使用 uvx(无需安装):
{
"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": {
"P4PORT": "ssl:perforce.example.com:1666",
"P4USER": "your_username",
"P4CLIENT": "your_workspace",
"P4DAM_API_KEY": "your_api_key"
},
"args": [
"--readonly", "--allow-usage"
]
}
}
}
Cursor
请参阅 Cursor MCP 文档了解更多信息。
{
"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"
]
}
}
}
Eclipse
请参阅 Eclipse MCP 文档了解更多信息。
{
"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"
]
}
}
}
Kiro
请参阅 Kiro MCP 文档了解更多信息。
{
"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"
]
}
}
}
VS Code
请参阅 VS Code 文档了解更多信息。
{
"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"
]
}
}
}
Windsurf
请参阅 Windsurf MCP 文档了解更多信息。
{
"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 环境变量
P4PORT- P4 服务地址。示例:ssl:perforce.example.com:1666、localhost:1666P4USER- 你的 P4 用户名P4CLIENT- 你当前的 P4 工作区。可选,但建议设置
结果数量限制环境变量
P4MCP_MAX_RESULTS- 限制 P4 服务每条命令返回的行数上限(p4.maxresults)。默认值:10000。设为0可禁用此限制(使用服务默认值)。如果命令结果超过此限制,服务会报错中止命令,而不是截断结果,因此请将此值设得宽裕一些。可由--max-resultsCLI 参数覆盖。必须为非负整数;若值无效,程序会在启动时立即失败,不会尝试连接 P4。P4MCP_MAX_SCAN_ROWS- 限制 P4 服务每条命令扫描的行数上限(p4.maxscanrows)。默认未设置,因此扫描限制由管理员/组策略决定。可由--max-scan-rowsCLI 参数覆盖。设置时必须为非负整数。
日志环境变量
P4MCP_LOG_DIR- 日志文件目录。默认值:服务可执行文件所在目录下的logs/。可通过--log-dirCLI 参数覆盖。
SSL/TLS 环境变量
P4MCP_TLS_CA_MODE- TLS 证书来源模式。system(默认):通过truststore使用操作系统信任存储。注意: 在此模式下,truststore会覆盖verify=参数;通过P4MCP_CA_BUNDLE或--ca-bundle设置的自定义 CA 证书包会被忽略。若要使用自定义 CA 证书包,请设置P4MCP_TLS_CA_MODE=certifi。certifi:禁用truststore注入,并使用 Python 默认的 TLS 证书行为。自定义 CA 证书包(P4MCP_CA_BUNDLE/--ca-bundle)仅在此模式下生效。
P4MCP_SSL_VERIFY- 设置为false可为 P4 Code Review API 请求禁用 SSL 验证。默认值:true。两种 TLS 模式下均有效。P4MCP_CA_BUNDLE- P4 Code Review API 请求使用的自定义 CA 证书包(PEM)路径。优先级高于P4MCP_SSL_VERIFY。只有设置P4MCP_TLS_CA_MODE=certifi才会生效。
遥测环境变量
OTEL_EXPORTER_OTLP_ENDPOINT- 遥测数据导出的 OTLP 收集器端点。默认值:https://grpc.public.prd.shared.perforce.com。OTEL_EXPORTER_OTLP_PROTOCOL- OTLP 导出协议。仅支持grpc;其他值会触发警告,并回退到grpc。
P4 DAM 环境变量
P4DAM_API_KEY- P4 DAM API 密钥。所有 P4 DAM API 请求都会将其作为Authorization: account_key='<key>'发送。需要有效的 P4 DAM 会话。未设置时,不会注册 P4 DAM 工具。 启动时会静默跳过该工具集。
P4 DAM URL 发现: P4 DAM 基础 URL 从服务器上的
P4.HTH.URLP4 属性读取。如果未设置该属性,P4 DAM 工具调用将在运行时失败。P4 DAM 的 SSL: P4 DAM API 请求使用与 Swarm 相同的 SSL 配置 —
P4MCP_TLS_CA_MODE、--ca-bundle/P4MCP_CA_BUNDLE和--ssl-no-verify/P4MCP_SSL_VERIFY。
支持的参数
-
--readonly- 控制写入操作。- 如果指定,则使用只读模式。适合安全地探索和测试。
- 如果未指定,则启用写入操作。需要在 P4 Server 上拥有适当的权限。
-
--allow-usage- 允许收集使用情况统计信息。- 如果指定,则允许收集匿名使用情况统计信息。
- 如果未指定,则禁用所有使用情况统计信息。
-
--toolsets- 指定要启用的工具类别。- 可选值:
files、changelists、shelves、workspaces、jobs、reviews、streams、p4dam - 默认值:启用所有工具集。
- 无论
--toolsets设置如何,query_server始终可用。
- 可选值:
-
--search-transform- 启用基于搜索的工具发现,以减少令牌开销。regex— 提供正则表达式模式匹配搜索工具。最适合有针对性的查找。bm25— 提供按自然语言相关性排序的搜索工具。最适合探索性查询。both— 提供两个名称不同的搜索工具(regex_search_tools/regex_call_tool和semantic_search_tools/semantic_call_tool)。- 如果省略,则将完整工具目录发送给客户端(默认设置,向后兼容)。
- 启用后,客户端始终可以直接看到
query_server。 - **安全性:**管理员权限检查(
CheckPermissionMiddleware)和--readonly过滤仍会得到全面执行。搜索转换会在内部查询实际工具目录,因此,被中间件阻止或因只读模式而排除的工具,无法通过搜索界面发现或调用。
-
--max-results <N>- 限制 P4 服务每条命令返回的行数(p4.maxresults)。- 默认值:
10000。设为0可禁用此限制(此时采用服务默认设置)。 - 防止 AI 驱动的查询失控,耗尽本地内存或使服务不堪重负。
- 如果命令超出此限制,服务会中止命令并返回错误 — 不会截断结果 — 因此请将此值设得宽裕一些。
- 必须是非负整数;如果值无效,程序会在启动时立即失败,不会尝试连接 P4。
优先级顺序:
--max-results>P4MCP_MAX_RESULTS> 默认值(10000)。 - 默认值:
-
--max-scan-rows <N>- 限制 P4 服务每条命令扫描的行数(p4.maxscanrows)。- 默认未设置,因此扫描限制由管理员/组策略决定。
- 如果指定,则必须是非负整数;如果值无效,程序会在启动时立即失败。
优先级顺序:
--max-scan-rows>P4MCP_MAX_SCAN_ROWS> 默认值(未设置)。 -
--ssl-no-verify- 禁用 P4 Code Review API 请求的 SSL 证书验证。- 适用于使用自签名证书或内部 CA 证书的环境。
- 在
system和certifi两种 TLS 模式下均可使用。 - 这些 SSL 选项仅影响 HTTPS Swarm 连接。如果 Swarm URL 是
http://,则不会产生任何影响。
-
--ca-bundle <path>- 为 P4 Code Review API 请求指定自定义 CA 证书包(PEM)的路径。- 使用此选项可信任内部 CA,而不必完全禁用验证。
- 必须设置
P4MCP_TLS_CA_MODE=certifi才能生效。在默认的system模式下,truststore使用操作系统信任存储,并忽略此设置。 - 如果同时指定
--ca-bundle和--ssl-no-verify,则优先使用--ca-bundle(使用指定的证书包执行验证)。
优先级顺序:
--ca-bundle>--ssl-no-verify>P4MCP_CA_BUNDLE>P4MCP_SSL_VERIFY> 默认值(true)。CLI 参数优先于环境变量。 -
--log-dir <path>- 日志文件目录。- 指定自定义目录,用于存放日志文件(应用日志和会话日志)。
- 默认值:服务可执行文件所在目录中的
logs/。 - 也可通过
P4MCP_LOG_DIR环境变量设置。 - CLI 参数优先于环境变量。
优先级顺序:
--log-dir>P4MCP_LOG_DIR> 默认值(服务可执行文件所在目录中的logs/)。
必需配置
- 所有配置中的
command字段都使用绝对路径。 - 确保为每个主机正确设置环境变量。
- 不同主机的参数解析方式可能不同。请参阅相应主机的文档。
P4 配置
用户配置
设置示例
# Windows (PowerShell)
$env:P4PORT = "ssl:perforce.example.com:1666"
$env:P4USER = "your_username"
$env:P4CLIENT = "your_workspace"
# macOS/Linux (Bash)
export P4PORT="ssl:perforce.example.com:1666"
export P4USER="your_username"
export P4CLIENT="your_workspace"
P4USER必须是标准用户。 P4 MCP Server 会运行p4 describe和p4 changes等命令,而service类型的用户无权运行这些命令,因此使用服务用户会导致工具在运行时失败。请将P4USER配置为standard类型的 Perforce 用户。请参阅 P4 CLI 文档中的p4 user。
连接限制选项
这些选项限制单条 P4 命令可执行的工作量,以防止服务器受到失控查询的影响:
max_results— 限制 P4 服务器每条命令返回的行数。默认启用,并设有较宽松的上限,以防止失控查询。调低该值可收紧限制。通过P4MCP_MAX_RESULTS或--max-results配置。max_scan_rows— 限制服务器每条命令扫描的行数。默认未设置(由管理员/组策略决定)。通过P4MCP_MAX_SCAN_ROWS或--max-scan-rows配置。
管理员配置
通过组级和用户级服务器属性管理访问权限。 P4 按以下两条规则依次处理每个属性,并解析为单个值:
- 序号最高者优先。
-s标志是主要排序依据。该规则适用于所有范围——-s5的组属性优先于-s1的用户属性或默认值。 - 序号相同时,以范围作为判定依据: 用户 > 组 > 全局。同一序号的多个组之间,组名按字母顺序靠前者优先。
P4 不会从语义上比较属性值。它不知道 false 比 true 限制更多。获胜属性的值会原样返回,并由 MCP 服务进行检查。
如果没有适用的属性,除非明确禁用,否则 MCP 会保持启用状态。
主开关(全局禁用)
要为所有用户禁用 MCP:
p4 property -a -n mcp.enabled -v false
要重新启用基于组/用户的控制,请先删除全局属性:
p4 property -d -n mcp.enabled
基于组的限制
要禁止特定组的所有成员访问:
p4 property -a -n mcp.enabled -v false -g noaccessgroup
可以用相同方式设置多个组限制。
当用户属于多个设置互相冲突的组时,由 P4 的属性解析规则决定哪个值优先。
序号(-s)最高者优先。序号相同时,组名按字母顺序靠前者优先。
示例:
p4 property -a -n mcp.enabled -v false -s1 -g noaccessgroup
p4 property -a -n mcp.enabled -v true -s2 -g accessgroup
在此示例中,accessgroup 优先,因为 -s2 高于 -s1。
基于用户的限制
无论组成员身份如何,阻止特定用户访问:
p4 property -a -n mcp.enabled -v false -u noaccessuser
序号相同时,用户级属性优先于组级和全局设置(这是 P4 的范围判定规则)。
示例:即使 noaccessuser 属于已启用 MCP 的 accessgroup,相同序号下用户属性仍优先,因此 MCP 会被禁用。
注意: 序号(
-s)更高的组属性可以覆盖序号较低的用户属性。要确保用户级属性始终优先,请为其设置较高的-s值,或确保没有组属性使用更高的序号。
工具集允许列表(全局)
使用 mcp.toolsets.allowed 限制整个服务器上可用的工具集。仅启用列出的工具集;其他工具集均会被阻止。
可用工具集:server、changelists、files、jobs、reviews、shelves、workspaces、streams
仅允许 changelists 和 files:
p4 property -a -n mcp.toolsets.allowed -v changelists,files
移除允许列表以恢复所有工具集:
p4 property -d -n mcp.toolsets.allowed
全局只读模式
禁用所有写入操作(修改工具),同时保留读取操作(查询工具): ``` p4 property -a -n mcp.toolsets.write -v false ```重新启用写入:
p4 property -a -n mcp.toolsets.write -v true
当 write=false 时,所有 modify_* 工具都会被阻止,但所有 query_* 工具仍可正常使用。
按组启用/禁用工具集
为特定组启用或禁用单个工具集。
为特定组禁用工具集:
p4 property -a -n mcp.toolset.changelists.enabled -v false -g reviewers
reviewers 组中的用户无法访问变更列表。其他组中的用户(未进行显式设置)保留默认访问权限。
若要将工具集限制为仅一个组可用,请为其他所有不应获得访问权限的组禁用该工具集:
p4 property -a -n mcp.toolset.files.enabled -v false -g reviewers
p4 property -a -n mcp.toolset.files.enabled -v false -g interns
# Only groups without an explicit "false" retain default access to files
注意: 所有工具集默认均已启用。为某个组设置
enabled=true是多余的,除非你要显式覆盖先前的false设置。在序列号相同的情况下,组属性优先于全局属性(P4 的作用域优先级规则),因此组的enabled=true可以覆盖全局的enabled=false。若要确保全局设置不被覆盖,请为其设置较高的-s值。若要将工具集限制为特定组使用,请为想要阻止访问的组禁用该工具集。
按组控制各工具集的写入权限
在组级别控制各工具集的写入权限。
为特定组禁用某个工具集的写入操作:
p4 property -a -n mcp.toolset.workspaces.write -v false -g reviewers
这会阻止该组使用 modify_workspaces,同时仍允许访问 query_workspaces。
特定工具的覆盖设置
使用 mcp.toolset.<name>.tools 将组的权限限制为工具集中的特定工具。
仅允许开发者使用 query_files(阻止 modify_files):
p4 property -a -n mcp.toolset.files.tools -v query_files -g developers
允许负责人使用查询和修改工具:
p4 property -a -n mcp.toolset.reviews.tools -v query_reviews,modify_reviews -g leads
即使已启用写入操作,特定工具的覆盖设置仍可限制访问:
p4 property -a -n mcp.toolsets.write -v true
p4 property -a -n mcp.toolset.files.tools -v query_files -g developers
# Result: modify_files is BLOCKED — tool list restricts
注意: 特定工具的覆盖设置无法绕过写入限制。服务会先检查写入权限,再评估工具列表。如果任何级别设置了
write=false,无论工具列表如何,写入工具都会被阻止。
多组冲突解决
当用户属于多个设置相互冲突的组时,P4 会将每个属性解析为单个值。MCP 服务不会自行处理多组逻辑,而是使用 P4 返回的值。
P4 针对给定属性名称的解析规则:
- 最高的
-s(序列号)优先。 这是主要排序依据。 - 序列号相同时: 用户作用域 > 组作用域 > 全局作用域。
- 多个组的序列号相同时: 按字母顺序排列最靠前的组名优先。
P4 不会比较值。它根据条目的位置选择优先项,而非根据内容。
示例 — 序列号相同的组(默认):
p4 property -a -n mcp.toolset.files.enabled -v true -g developers
p4 property -a -n mcp.toolset.files.enabled -v false -g leads
# User in both groups → resolved value is "true"
# Reason: "developers" < "leads" alphabetically, so developers wins
交换这些值后,结果仍为 false——无论值是什么,developers 都优先。
示例 — 仅一个组具有设置:
p4 property -a -n mcp.toolset.files.enabled -v false -g leads
# developers has no setting
# User in developers + leads → resolved value is "false"
# Reason: leads is the only group with a value, so it wins
示例 — 写入权限:
p4 property -a -n mcp.toolset.files.write -v false -g developers
p4 property -a -n mcp.toolset.files.write -v true -g leads
# User in both groups → resolved value is "false"
# Reason: "developers" < "leads" alphabetically, not because false is "more restrictive"
示例 — 工具列表(不合并):
p4 property -a -n mcp.toolset.reviews.tools -v query_reviews -g developers
p4 property -a -n mcp.toolset.reviews.tools -v query_reviews,modify_reviews -g leads
# User in both groups → resolved value is "query_reviews"
# Reason: "developers" wins alphabetically. P4 returns one value, not a union.
示例 — 使用 -s 控制哪个组优先:
p4 property -a -n mcp.enabled -v false -s1 -g noaccessgroup
p4 property -a -n mcp.enabled -v true -s2 -g accessgroup
# accessgroup wins because -s2 > -s1 (highest sequence wins)
提示: 若要在多个组的情况下获得可预测的结果,请始终使用显式的
-s值,而不要依赖组名的字母顺序。
全局禁用特定工具集
为所有用户禁用单个工具集,而不影响其他工具集:
p4 property -a -n mcp.toolset.reviews.enabled -v false
这会为所有用户同时阻止 query_reviews 和 modify_reviews。其他工具集不受影响。
为特定组启用紧急只读模式
将特定组限制为只读,而不影响其他组:
p4 property -a -n mcp.toolsets.write -v false -g problematic_group
其他组中的用户保留完整的写入权限。如果用户同时属于受限组和未受限组,结果由 P4 的属性解析规则决定——通常在序列号相同时,按字母顺序排列最靠前的组名优先。请使用显式的 -s 值以获得可预测的结果。
#### 属性的解析方式
MCP 服务按以下顺序检查属性。P4 会使用标准解析规则独立解析每个属性(优先级最高的 -s 值胜出;序号相同时,用户 > 群组 > 全局;然后按群组名称的字母顺序取第一个)。
| 检查顺序 | 属性 | MCP 服务行为 |
|---|---|---|
| 1 | mcp.enabled | 如果解析后的值为 false,则阻止所有访问 |
| 2 | mcp.toolsets.write | 如果解析后的值为 false 且工具执行的是写操作,则阻止 |
| 3 | mcp.toolsets.allowed | 如果已设置,则仅允许使用列出的工具集 |
| 4 | mcp.toolset.<name>.enabled | 如果解析后的值为 false,则阻止使用该工具集 |
| 5 | mcp.toolset.<name>.write | 如果解析后的值为 false 且工具执行的是写操作,则阻止 |
| 6 | mcp.toolset.<name>.tools | 如果已设置,则仅允许使用该工具集内列出的工具 |
重要说明
-
P4 会先将每个属性解析为单个值,MCP 服务收到的就是该值。P4 的解析顺序为:优先级最高的序号(
-s)优先;然后以范围(用户 > 群组 > 全局)作为平局时的判定依据;最后按群组名称的字母顺序排列。MCP 服务不会自行进行多群组或多范围解析。 -
mcp.enabled是主开关。解析后的值为false时,所有访问都会被阻止。 -
序号相同时,群组或用户属性会覆盖全局属性。若要确保全局
false不会被覆盖,请为其指定较高的-s值。 -
范围层级(用户 > 群组 > 全局)仅在序号相同时作为平局判定依据。
-s5的群组属性优先于使用默认序号或-s1的用户属性。 -
当用户属于多个群组时,群组名称按字母顺序排在最前的群组胜出(序号相同时)。胜出的值会原样使用——P4 不会比较
true和false,也不会选择“限制最严格”的值。请使用明确的-s值来控制群组优先级。 -
特定工具的覆盖设置(
mcp.toolset.<name>.tools)可以进一步限制访问,但不能绕过写入限制。写入检查会先于工具列表进行。 -
由于服务端缓存,属性更改会在 60 秒内生效;建立新的 MCP 服务连接后则会立即生效。
-
只有值
false(不区分大小写)会禁用或阻止访问。任何其他值(包括true、1、yes或无效字符串)都不会阻止访问。
可用工具
查询工具(读取操作)
query_server - 获取服务信息和当前用户详情
- 操作:
server_info- 获取 P4 版本、运行时间和配置信息current_user- 获取当前用户信息和权限
- 使用场景 - 服务诊断、用户验证、连接测试
query_workspaces - 工作区信息与管理
- 操作:
list- 列出所有工作区(可按用户筛选)get- 获取详细的工作区规范type- 检查工作区类型和配置status- 检查工作区同步状态
- 参数:
workspace_name、user、max_results - 使用场景:发现工作区、检查配置、查看状态
query_changelists - 访问信更改列表信息与历史记录
- 操作:
get- 获取详细的更改列表信息(文件、说明、作业)list- 按筛选条件(状态、用户、工作区)列出更改列表
- 参数:
changelist_id、status(pending/submitted)、workspace_name、max_results - 使用场景:代码审查、历史跟踪、更改列表分析
query_files - 文件操作与信息
- **操作**:
- `content` - 获取特定修订版本的文件内容
- `history` - 获取文件修订历史和集成记录
- `info` - 获取文件基本详情(类型、大小、权限)
- `metadata` - 获取文件元数据(属性、文件大小等)
- `diff` - 比较文件版本(depot 对 depot 或混合比较)
- `annotations` - 获取包含 blame 信息的文件注释
- `search` - 按名称模式搜索文件(通配符匹配)
- `grep` - 按内容模式搜索文件(文本搜索)
- **参数**:`file_path`、`file2`(用于 diff)、`pattern`(用于 search/grep)、`case_insensitive`(用于 grep)、`max_results`、`diff2`(布尔值)、`ranges`(用于 content)
- `ranges` - 可选的 `[start, end]` 行号对列表,行号从 1 开始且包含边界(例如 `[[10, 20], [50, 60]]`)。仅适用于 `content` 操作。设置后,响应会返回一个 `chunks` 数组,每个范围对应一个条目,而不是返回整个文件。
- **使用场景**:代码分析、文件比较、历史跟踪、blame 分析、文件查找、内容搜索、从大型文件中检索特定行范围
query_shelves - 暂存变更列表操作与检查
- 操作:
list- 按用户或全局列出暂存的变更diff- 显示暂存文件中的差异files- 列出特定暂存区中的文件
- 参数:
changelist_id、user、max_results - 使用场景:代码审查、进行中工作跟踪、协作
query_jobs - 任务跟踪与缺陷管理
- 操作:
list_jobs- 列出与变更列表关联的任务get_job- 获取任务的详细信息和状态
- 参数:
changelist_id、job_id、max_results - 使用场景:缺陷跟踪、需求可追溯性、项目管理
query_reviews - 审查发现、详情与活动
- 操作:
list- 列出所有审查,并支持可选筛选dashboard- 获取当前用户的审查仪表板(我的审查、需要关注的审查)get- 获取审查详细信息transitions- 获取审查可用的状态转换files_readby- 获取用户已读文件状态files- 获取审查中的文件(可选版本范围)activity- 获取审查活动历史comments- 获取审查评论
- 参数:
review_id- 审查 ID(get、transitions、files_readby、files、comments、activity 必填)review_fields- 以逗号分隔的返回字段(例如 "id,description,author,state")comments_fields- 评论字段(默认值:"id,body,user,time")up_voters- transitions 操作的赞成票用户列表from_version、to_version- files 操作的版本范围max_results- 最大结果数(默认值:10)
- 使用场景:代码审查发现、审查状态跟踪、评论检索、审查活动监控
query_streams - Stream 层级结构、集成状态与工作区验证
- **操作**:
- `list` - 列出流,并可选使用筛选条件(路径模式、所有者、类型)
- `get` - 获取详细的流规格
- `children` - 获取指定流的子流
- `parent` - 获取父流
- `graph` - 获取完整的流关系图(父流和子流)
- `integration_status` - 获取流与父流之间的集成状态(p4 istat)
- `get_workspace` - 获取绑定到流的工作区规格
- `list_workspaces` - 列出绑定到流的工作区
- `validate_file` - 根据流的视图验证文件路径
- `validate_submit` - 验证流工作区中已打开以供提交的文件
- `check_resolve` - 检查待处理的流规格冲突
- `interchanges` - 列出流之间等待集成的变更列表
- **参数**:
- `stream_name` - 流 depot 路径(get、children、parent、graph、check_resolve、interchanges 必需)
- `stream_path` - `list` 的路径模式(例如,`["//depot/..."]`)
- `filter` - `list` 的筛选表达式(例如,`"Owner=alice&Type=development"`)
- `fields` - `list` 要返回的字段(例如,`["Stream", "Owner", "Type"]`)
- `workspace` - get_workspace、validate_file、validate_submit 的工作区名称
- `file_paths` - validate_file 的文件路径
- `view_without_edit` - 查看已锁定的流规格,但不打开以供编辑
- `at_change` - 按变更列表编号获取历史流规格
- `both_directions` - 显示两个方向的集成状态
- `force_refresh` - 强制刷新 istat 缓存
- `reverse`、`long_output`、`limit` - interchanges 的选项
- `unloaded`、`all_streams`、`viewmatch` - list 的筛选条件
- `max_results` - 最大结果数
- **使用场景**:探索流层次结构、跟踪集成状态、验证工作区、检查视图兼容性
query_p4dam_assets - 按关键字或筛选条件搜索 P4 DAM 资源
- 参数:
search_term、project_ids、repository_ids、path、tag、file_extension、user、all_revisions、max_results、offset - 使用场景:发现资源,按项目/仓库/标签/扩展名筛选,浏览 P4 DAM 内容。尚无 depot 路径时使用。
query_p4dam_asset - 获取单个 P4 DAM 资源的完整元数据
- 参数:
depot_path(必需)、identifier、project_id、repository_id、include - 使用场景:获取已知资源的提交信息、资源包、网页链接、自定义属性以及项目/仓库匹配信息。在
query_p4dam_assets之后使用,以获取特定文件的完整详情。
query_p4dam_projects - 列出 P4 DAM 项目
- 参数:
search_term、limit、offset - 使用场景:在创建资源包或文件审查之前发现可用项目,为其他调用查找项目 ID。
query_p4dam_repositories - 列出 P4 DAM 项目中的仓库
- 参数:
project_id(必需)、search_term、limit、offset - 使用场景:查找仓库类型(
helix_stream或helix_classic)和linked_streams;创建资源包或文件审查时需要提供stream_path,或据此发现分支。
query_p4dam_helix_classic_branches - 列出仓库中的 Helix Classic 分支
- 参数:
project_id(必需)、repository_id(必需)、limit、offset - 使用场景:查找在 Helix Classic 仓库中创建资源包或文件审查时所需的分支 ID。
fetch_p4dam_media - 获取 P4 DAM 媒体 URL 并将其渲染为图像
- **参数**:`url`(必填 — 资源结果中的 `thumbnail_url`、`preview_url`、`sprite_url` 或 `file_url`)
- **使用场景**:直接在客户端中渲染图像资源的缩略图、预览图和精灵图。对于非图像文件,返回 MIME 类型和大小,而非图像内容。传入 `query_p4dam_assets` 或 `query_p4dam_asset` 结果中的 URL — 只有图像文件才会包含 `thumbnail_url`、`preview_url` 和 `sprite_url`。
query_p4dam_file_reviews - 列出项目的文件(资源)评审
- 参数:
project_id(必填)、depot_path、include、limit、offset - 使用场景:浏览项目中的活动评审、按 depot 路径筛选,以及查找用于查询详情的评审 UUID。
query_p4dam_file_review - 按 UUID 获取单个文件评审
- 参数:
project_id(必填)、review_id(必填) - 使用场景:获取完整的评审详情 — 状态、view_paths、asset_bundle、创建者,以及 bundle 评审的
download_url。
query_p4dam_workflows - 列出 P4 DAM 工作流
- 参数:
include、limit、offset - 使用场景:查找可用工作流及其状态。传入
include=['states'],即可在一次调用中获取所有状态 — 在文件评审操作中,将状态的short_name用作state参数。
query_p4dam_workflow - 按简称或 UUID 获取单个工作流
- 参数:
workflow_id(必填)、include - 使用场景:检查工作流的状态(
kind:open/review/done、color、position)和转换规则。
query_p4dam_workflow_states - 列出工作流的状态
- 参数:
workflow_id(必填)、limit、offset - 使用场景:列出所有状态及其
short_name、kind、color和position。创建或更新文件评审时,short_name是要作为state传入的值。
query_p4dam_custom_attribute_templates - 列出项目的自定义属性模板
- 参数:
project_id(必填) - 使用场景:设置值之前查找可用的自定义属性 — 返回每个模板的 UUID、名称、类型(
text、single-select、multi-select、checkbox),以及选择类型的available_values。将 UUID 传入update_p4dam_asset_custom_attributes。
修改工具(写入操作)
modify_workspaces - 工作区创建和管理
- 操作 -
create、update、delete、switch - 参数 -
name、specs(包含 View、Root、Options 等的 WorkspaceSpec 对象) - 要求 - 禁用只读模式,并具备相应权限
- 使用场景 - 环境设置、工作区维护、分支切换
modify_changelists - Changelist 生命周期管理
- 操作 -
create、update、submit、delete、move_files - 参数 -
changelist_id、description、file_paths - 安全措施 - 所有权检查;执行删除操作时,会显示条目详情并通过交互式 PROCEED/CANCEL 提示词请求确认
- 使用场景 - 提交代码、组织工作、分组文件
modify_files - 文件系统操作和版本控制
- **操作** - `add`、`edit`、`delete`、`move`、`revert`、`reconcile`、`resolve`、`sync`
- **参数** - `file_paths`、`changelist`、`force`、`mode`(用于 resolve 操作)
- **解决模式** - `auto`、`safe`、`force`、`preview`、`theirs`、`yours`
- **使用场景** - 文件编辑、冲突解决、工作区同步
modify_shelves - 暂存进行中工作的操作
- 操作 -
shelve、unshelve、update、delete、unshelve_to_changelist - 参数 -
changelist_id、file_paths、target_changelist、force - 使用场景 - 临时存储、代码共享、实验前备份
modify_jobs - 作业与变更列表集成
- 操作 -
link_job、unlink_job - 参数 -
changelist_id、job_id - 使用场景 - 缺陷跟踪集成、需求关联
modify_reviews - 创建评审、状态转换、参与者管理和评论
- 操作:
create- 从变更列表创建新的评审refresh_projects- 刷新项目关联vote- 对评审投票(赞成、反对、清除)transition- 更改评审状态(needsRevision、needsReview、approved、committed、rejected、archived)append_participants- 向评审添加评审者/群组replace_participants- 替换所有参与者delete_participants- 从评审中移除参与者add_comment- 向评审添加评论reply_comment- 回复现有评论edit_comment- 编辑现有评论的正文和/或任务状态append_change- 将变更列表添加到现有评审replace_with_change- 用变更列表替换评审内容join- 作为参与者加入评审leave- 离开评审archive_inactive- 归档不活跃的评审mark_comment_read/mark_comment_unread- 标记单条评论的已读状态mark_all_comments_read/mark_all_comments_unread- 标记所有评论的已读状态update_author- 更改评审作者update_description- 更新评审说明obliterate- 永久删除评审
- 参数:
review_id- 评审 ID(大多数操作必需)change_id- 变更列表 ID(create、append_change、replace_with_change 操作必需)description- 评审说明reviewers、required_reviewers- 评审者用户名列表reviewer_groups- 带有要求的评审者群组vote_value- 投票值:up、down、clearversion- 投票所用的评审版本transition- 目标状态:needsRevision、needsReview、approved、committed、approved:commit、rejected、archivedjobs、fix_status、cleanup- 状态转换的作业关联和清理选项users、groups- 用于追加/替换/删除的结构化参与者数据body- 评论正文task_state- 评论任务状态:open、comment、addressed、verified。add_comment仅接受open和comment;addressed和verified可通过edit_comment设置。notify- 通知模式:immediate、delayedcomment_id- 用于回复、编辑或标记已读/未读的评论 IDcontext- 评论上下文(文件、行号、内容、版本)not_updated_since、max_reviews- archive_inactive 的筛选条件new_author、new_description- 更新操作的取值
- 使用场景: 代码评审工作流、评审状态管理、协作评论、参与者管理、评审清理
modify_streams - 流的生命周期、规范编辑、传播和工作区管理
- **操作**:
- `create` - 创建新流(主线、开发、发布、任务、虚拟流等)
- `update` - 更新流属性(名称、描述、选项、路径、parent_view)
- `delete` - 删除流
- `edit_spec` - 打开流规格以进行编辑(p4 stream edit)
- `resolve_spec` - 解决流规格冲突
- `revert_spec` - 还原流规格编辑
- `shelve_spec` - 将流规格编辑搁置到编号变更列表
- `unshelve_spec` - 取消搁置流规格编辑
- `copy` - 在父流和子流之间复制更改
- `merge` - 合并父流和子流之间的更改
- `integrate` - 使用高级选项集成更改
- `populate` - 使用文件填充新流(分支)
- `switch` - 将工作区切换到其他流
- `create_workspace` - 创建绑定到某个流的新工作区
- **参数**:
- `stream_name` - 流 depot 路径(create、update、delete、edit_spec、resolve_spec、revert_spec、switch 必填)
- `stream_type` - create 操作的流类型:`mainline`、`development`、`sparsedev`、`release`、`sparserel`、`task`、`virtual`
- `parent` - 非主线 create 操作的父流
- `name`、`description` - 流的显示名称和描述
- `options` - 流选项:`allsubmit/ownersubmit`、`unlocked/locked`、`toparent/notoparent`、`fromparent/nofromparent`、`mergedown/mergeany`
- `parent_view` - 父视图处理方式:`inherit` 或 `noinherit`
- `paths`、`remapped`、`ignored` - 流视图映射
- `changelist` - 用于规格编辑或传播操作的变更列表
- `resolve_mode` - resolve_spec 的解决模式:`auto`、`accept_theirs`、`accept_yours`
- `parent_stream` - 覆盖传播操作的父流(-P 标志)
- `branch` - 用于 integrate/populate 的分支规格(-b 标志)
- `file_paths` - 用于传播操作的文件路径
- `preview` - 仅预览,不进行更改(-n 标志)
- `force` - 强制执行操作(-f 标志)
- `reverse` - 反向操作(-r 标志)
- `max_files` - 限制处理的文件数(-m 标志)
- `quiet` - 不显示信息性消息(-q 标志)
- `output_base` - 显示已安排解决的基础修订版本(merge/integrate 的 -Ob 标志),或列出已创建的文件(populate 的 -o 标志)
- `virtual` - 使用虚拟流复制(-v 标志,仅适用于 copy)
- `schedule_branch_resolve` - 安排分支解决,而不是自动创建分支(-Rb 标志,仅适用于 integrate)
- `integrate_around_deleted` - 围绕已删除的修订版本进行集成(-Di 标志,仅适用于 integrate)
- `skip_cherry_picked` - 跳过已集成的挑选提交修订版本(-Rs 标志,仅适用于 integrate)
- `source_path`、`target_path` - populate 操作的源路径和目标路径
- `workspace` - switch 操作的工作区名称
- `workspace_name`、`root`、`host`、`alt_roots` - 工作区创建参数
- **安全性**:验证流是否存在,检测已锁定的流,针对绑定的工作区发出警告,并在更改视图时检查是否有打开的文件
- **使用场景**:创建和管理流、分支传播(merge/copy/integrate)、解决规格冲突、配置工作区
create_p4dam_asset_bundle - 创建 P4 DAM 资产包
- 参数:
depot_path(必填,必须以.p4bundle结尾)、project(必填)、repository(必填)、view_paths(必填)、stream_path、helix_classic_branch、description、hero_file_path - 使用场景:创建用于审核的命名且范围明确的 depot 文件集合。对于 Helix Stream 仓库,请提供
stream_path;对于 Helix Classic 仓库,请提供helix_classic_branch。
update_p4dam_asset_bundle - 更新现有资产包
- 参数:
bundle_id(必填)、description、view_paths、hero_file_path - 使用场景:更改资产包描述、调整其文件范围(
view_paths),或更新封面图片。创建后,depot_path不可更改。
delete_p4dam_asset_bundle - 删除 P4 DAM 资源包
- 参数:
bundle_id(必填) - 使用场景:移除不再需要的资源包。此操作不可撤销。
sync_p4dam_asset_bundle - 将资源包文件同步到本地工作区
- 参数:
view_paths(必填)、workspace_root(必填)、client_name、bundle_id、stream_path - 使用场景:通过
p4 sync下载资源包范围内的文件。创建或复用一个命名的 P4 客户端,后续同步会采用增量方式。对于 Helix Stream 仓库,请使用stream_path(应用LimitView,需要 Perforce 2025.2 或更高版本)。
create_p4dam_file_review - 创建 P4 DAM 资源审核
- 参数:
project_id(必填)、name(必填)、depot_path(必填)、view_paths(必填)、state(必填)、repository、helix_classic_branch、asset_bundle、hero_file_path、description、position、base_commit_id、head_commit_id - 使用场景:为单个资源或资源包(
.p4bundle)发起审核。对于资源包审核,如果未提供asset_bundle,系统会根据depot_path自动检测。
update_p4dam_file_review - 更新 P4 DAM 文件审核
- 参数:
project_id(必填)、review_id(必填)、state、name、view_paths、hero_file_path、description、position - 使用场景:将审核转换到新的工作流状态、更新其名称或描述、调整视图范围。当前用户的项目工作流必须允许相应的状态转换。
delete_p4dam_file_review - 删除 P4 DAM 文件审核
- 参数:
project_id(必填)、review_id(必填) - 使用场景:移除不再需要的审核。此操作不可撤销。操作成功时,API 会返回已删除的审核对象。
update_p4dam_asset_tags - 添加或移除资源标签和自动标签
- 参数:
paths(必填 —{path, identifier?}列表)、create、delete、delete_auto、propagatable、identifier - 使用场景:通过一次调用为一个或多个资源添加标签。支持单个文件、指定修订版本和递归文件夹路径(
//depot/folder/...)。create添加用户标签,delete移除用户标签,delete_auto移除自动生成的标签。设置propagatable=true可将标签应用到最新修订版本及所有后续修订版本。
create_p4dam_comment - 在文件审核或文件上发表评论,或回复评论
- 参数:
type(必填)、content(必填)、project、repository、file_review、commit、path、stream_path、helix_classic_branch、comment - 使用场景:对资源包文件审核(
file_review)、审核中的特定文件(file_review_file)、没有审核的已提交文件或资源包(commit_file)发表评论,或回复现有评论(comment)。必填参数取决于类型 — 请参阅type描述。
update_p4dam_asset_custom_attributes - 设置或移除资源的自定义属性值
- 参数:
paths(必填 —{path, identifier?}列表)、create({uuid, value}列表)、delete(要移除的属性 UUID 列表)、propagatable - 使用场景:为一个或多个资源设置或清除自定义元数据。请先使用
query_p4dam_custom_attribute_templates查找可用属性及其 UUID。对于text/single-select/checkbox类型,value是字符串;对于multi-select类型,value是字符串列表。
regenerate_p4dam_preview - 重新生成资源预览图像
- 参数:
depot_path(必需)、commit_id(必需) - 使用场景:预览缺失或过时时,重新触发预览生成。
commit_id是query_p4dam_asset结果中的变更集编号。
工具响应中的警告
当 P4 命令产生无害的信息或警告消息(例如
file(s) up-to-date或file not on client)时,工具会返回成功的status,并在可选的顶层warnings列表中包含该消息文本。只有至少存在一条警告时,才会出现此字段。真正的失败不受影响,仍会返回错误的status,并保留现有的code和error字段。
日志记录与使用数据
日志系统
日志位置:
- 应用程序日志:
logs/p4mcp.log- 服务器的主要操作和错误 - 会话日志:
logs/sessions/*.log- 仅当服务器启动参数中指定--allow-usage标志时,才会记录各个会话的活动。
使用数据
隐私优先:
- 默认禁用:未经明确同意,不会收集任何数据
- 需同意后启用:首次运行时会提示是否允许遥测
- 透明:清楚说明所收集的数据
- 可撤销:随时可轻松选择退出
收集的数据(经同意后):
- 工具使用频率(匿名)
- 错误率和类型(不含个人数据)
- 性能指标
- 功能采用情况统计
- P4 服务版本
不收集的数据:
- 文件内容或名称
- 除版本外的 P4 服务详情
- 用户凭据或个人信息
- 具体项目信息
控制:
- 仅在启动时提供
--allow-usage参数后,才会收集使用数据。
故障排除
服务器启动问题
无法启动服务器
症状:操作系统无法找到或执行二进制文件;错误中包含 ENOENT 或 "No such file or directory"。
解决方案:
- 检查路径: 确保
command字段使用适用于你的操作系统的正确绝对路径:- macOS/Linux:
/absolute/path/to/p4-mcp-server - Windows:
C:\absolute\path\to\p4-mcp-server.exe
- macOS/Linux:
- 确保二进制文件存在且可执行:
- 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:
- 在 Windows 上,确保二进制文件未被阻止:
- 右键点击
.exe文件,选择 属性,如果显示 解除锁定,请点击该选项。
- 右键点击
连接服务器失败;请检查 $P4PORT
症状:无法连接到 P4 服务器
解决方案:
- 验证
P4PORT环境变量:echo $P4PORT(macOS)或echo $env:P4PORT(Windows) - 测试直接连接:
p4 info - 检查服务器是否可用:
ping perforce.example.com - 验证端口和协议(SSL 连接需要
ssl:前缀)。
SSL 证书不受信任(P4 连接)
症状:连接到 P4 服务器时出现 SSL 信任错误 解决方案:
- 信任服务器:
p4 trust -f -y - 检查信任状态:
p4 trust -l - 如果问题持续存在,请验证 SSL 配置。
P4 Code Review API(reviews)的 SSL 证书错误
症状:使用审查工具时出现 CERTIFICATE_VERIFY_FAILED 错误
解决方案:
- 系统信任存储:默认情况下,服务器通过
truststore使用操作系统的信任存储。请确保企业 CA 已安装在操作系统证书存储中。 - 自定义 CA 捆绑包:要使用自定义 CA 证书,必须先设置
P4MCP_TLS_CA_MODE=certifi(以禁用truststore),然后通过--ca-bundle /path/to/ca.pem或P4MCP_CA_BUNDLE提供 CA 路径。在默认的system模式下,truststore会覆盖自定义 CA 捆绑包,并静默忽略它们。 - 禁用验证:使用
--ssl-no-verify或设置P4MCP_SSL_VERIFY=false(不建议用于生产环境)。两种 TLS 模式都支持此设置。
注意: 这些 SSL 设置仅在 Swarm URL 使用 HTTPS 时生效。如果 Swarm 配置为使用
http://URL,则不会执行 SSL 验证,这些设置也不会产生任何影响。
身份验证问题
用户未登录
症状:身份验证失败
解决方案:
- 登录 P4:
p4 login -a - 检查登录状态:
p4 login -s - 验证用户是否存在:
p4 users -m 1 your_username - 如果问题持续存在,请检查密码或使用基于票据的身份验证。
密码无效
症状:登录失败
解决方案:
- 联系 P4 管理员重置密码。
- 使用基于票据的身份验证:
p4 login -a - 验证用户名是否正确:
p4 info
工作区问题
客户端未知
症状:找不到工作区
解决方案:
- 列出可用工作区:
p4 clients - 验证
P4CLIENT环境变量。 - 如有需要,创建工作区:
p4 client workspace_name - 检查工作区所有权:
p4 client -o workspace_name
文件不在客户端视图中
症状:文件位于工作区映射范围之外
解决方案:
- 检查客户端视图:
p4 client -o workspace_name - 更新工作区映射,将所需路径纳入其中。
- 使用
p4 where file_path检查映射。
权限错误
不允许执行此操作
症状:执行操作时权限不足
解决方案:
- 检查文件是否已打开:
p4 opened file_path - 验证用户权限:
p4 protects file_path - 确保用户属于相应的组。
- 对于管理操作,请验证管理员权限。
文件已由其他用户打开
症状:独占锁冲突
解决方案:
- 检查谁已打开该文件:
p4 opened file_path - 联系该用户以解决冲突。
- 如有必要,管理员可以强制执行操作。
操作缓慢
症状:响应时间长
解决方案:
- 使用
max_results参数限制查询规模。 - 使用具体的文件路径,而不是通配符。
- 检查与 P4 的网络连接。
- 监控服务性能。
内存问题
症状:内存使用率高
解决方案:
- 对于大型查询,降低
max_results的值。 - 分批处理文件。
- 对于长时间运行的会话,定期重启 MCP 服务。
工具执行
无法执行工具
症状:与内置工具或其他 MCP 工具冲突
解决方案:
- 在环境或配置中禁用任何内置工具或冲突的 MCP 服务工具。
- 确保 P4 MCP 服务工具已正确注册并启用。
- 应用配置更改后重启 MCP 服务,以加载正确的工具。
未选用正确的工具
症状:上下文无效或会话历史过时
解决方案:
- 编写提示词时提供与 P4 相关的上下文。
- 如果现有会话时间较久或包含冲突的提示词历史,请开启新会话。
常见错误模式
- 身份验证:确保在执行 MCP 操作前已有效登录。
- 工作区映射:确认客户端视图包含目标文件。
- 权限:检查执行写入操作所需的用户和文件权限。
- 网络:确认与远程 P4 服务的连接正常。
获取帮助
- 检查日志:请始终先检查
logs/p4mcp.log。 - 测试 P4:排查 MCP 问题前,确保
p4 info可正常运行。 - 向社区报告问题:报告问题时,请附上日志摘录和环境详情。
支持
Perforce P4 MCP Server 是由社区维护的项目,并非由 Perforce 官方支持。 拉取请求和问题由项目版主负责处理;版主可能是经过审核的个人,也可能是包含 Perforce 组织外成员的团队。 所有问题都应通过 GitHub 报告和管理(而非通过 Perforce 的标准支持流程)。
贡献
欢迎为 P4 MCP Server 项目做出贡献。
许可证
本项目根据 MIT License 授权。详情请参阅 LICENSE。
第三方声明
本项目包含第三方组件。其许可证和归属信息列于 THIRD-PARTY-NOTICES。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。