关于 p4mcp-server
Perforce P4 MCP Server 是基于 FastMCP 和 P4 Python 绑定构建的 MCP 服务,用于连接 Perforce P4 版本控制系统。它面向需要通过 AI 助手操作 P4 仓库的用户,默认只读并对删除类操作设置确认。
主要功能
- 01覆盖变更列表、文件、shelve、工作区等的读写工具
- 02P4 Code Review 支持,包括投票、状态切换和评论
- 03通过 REST API 集成 P4 DAM 资源管理
- 04默认只读模式与所有权检查
- 05删除和 obliterate 操作需交互确认
- 06可按工具类别启用不同工具集
适用场景
- 01通过 AI 助手查询 P4 变更列表和文件状态
- 02在代码评审流程中查看与投票
- 03通过 AI 助手检索并标记 P4 DAM 资产
MCP 相关
该项目是一个 MCP 服务,向 MCP 客户端暴露 P4 的工具集合,包括文件、变更列表、评审等操作。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
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 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。