关于 p4plan-mcp
p4plan-mcp 是无状态 MCP 服务,通过 P4 Plan GraphQL API 让 AI 助手处理项目数据,并提供可选的只读模式。
主要功能
- 01通过 GraphQL 访问 P4 Plan
- 02管理任务、迭代和缺陷
- 03处理评论与自定义字段
- 04按目录限制附件上传
- 05可选只读模式
适用场景
- 01查找并更新项目任务
- 02查看迭代与缺陷信息
- 03添加评论或上传附件
- 04限制助手仅执行读取操作
MCP 相关
通过 stdio 向 Claude 和 VS Code Copilot 等客户端提供 P4 Plan 工具,并将 JWT 身份验证转发至 GraphQL API。只读模式下仅注册读取工具。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
npx -y @perforce/p4plan-mcpP4PLAN_API_AUTH_TOKEN密钥JWT bearer token for the P4 Plan GraphQL API. Forwarded as Authorization on every tool call.P4PLAN_API_URLURL of the P4 Plan GraphQL API (default: http://localhost:4000).P4PLAN_ALLOW_SELF_SIGNED_CERTSSet to 'true' to accept self-signed TLS certificates from the GraphQL API. Default: false.P4PLAN_READONLYSet to 'true' to expose only the tools that read (same as the --readonly argument). Default: false.P4PLAN_UPLOAD_DIRSFolders upload_attachment may read files from, besides the workspace folders the MCP client shares. Separate several with ':' (';' on Windows).本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
P4 Plan MCP 服务
适用于 P4 Plan 的 MCP(Model Context Protocol)服务,可让 Claude 和 VS Code Copilot 等 AI 助手与 P4 Plan 项目管理数据交互。
架构
此服务充当 MCP 客户端(AI 助手)与 P4 Plan GraphQL API 之间的无状态协议适配器,并使用 stdio 传输(stdin/stdout)。
┌─────────────────┐ stdio (stdin/stdout) ┌─────────────────┐ GraphQL ┌─────────────────┐
│ AI Client │ ────────────────────────▶ │ P4 Plan MCP │ ──────────────▶ │ P4 Plan GraphQL │
│(Claude, Copilot)│ Spawns as child process │ Server │ Port 4000 │ API │
│ │ P4PLAN_API_AUTH_TOKEN │ (stateless) │ Bearer token │ │
└─────────────────┘ env var └─────────────────┘ forwarded └─────────────────┘
客户端会将 MCP 服务作为子进程启动。身份验证通过 P4PLAN_API_AUTH_TOKEN 环境变量提供,服务会在启动时验证该变量,并在每次工具调用时将其转发给 GraphQL API。
先决条件
| 要求 | 版本 | 说明 |
|---|---|---|
| Node.js | >= 20(推荐 24+) | 服务面向 ES2023。使用 node -v 检查。 |
| npm | >= 9 | 随 Node.js 一同提供。使用 npm -v 检查。 |
| P4 Plan API | >= 2026.1.002 | 所有工具操作的必需条件。不支持更早的版本。 |
快速开始(npx)
最快的入门方式——无需安装。只需将 MCP 客户端配置为使用 npx:
npx -y @perforce/p4plan-mcp
npx 会自动下载并运行最新版本的服务。MCP 客户端(VS Code、Claude Desktop 等)会为你处理这些操作——只需添加以下配置并开始对话。
VS Code — 添加到 .vscode/mcp.json:
{
"servers": {
"p4-plan": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@perforce/p4plan-mcp"],
"env": {
"P4PLAN_API_AUTH_TOKEN": "YOUR_JWT_TOKEN",
"P4PLAN_API_URL": "http://localhost:4000"
}
}
}
}
Claude Desktop — 添加到配置中:
{
"mcpServers": {
"p4-plan": {
"command": "npx",
"args": ["-y", "@perforce/p4plan-mcp"],
"env": {
"P4PLAN_API_AUTH_TOKEN": "YOUR_JWT_TOKEN",
"P4PLAN_API_URL": "http://localhost:4000"
}
}
}
}
注意:
-y标志会自动确认 npm 安装提示,因此服务无需用户交互即可启动。
请参阅客户端配置,了解包括 Docker、安全令牌提示和本地构建在内的更多选项。
MCP 注册表
此服务已作为 io.github.perforce/p4plan-mcp 发布到官方 MCP 注册表。通过注册表 API 查找:
curl 'https://registry.modelcontextprotocol.io/v0/servers?search=io.github.perforce/p4plan-mcp'
支持注册表发现的 MCP 客户端可以按名称安装此服务,无需知道 npm 包标识符。
安装
从源代码构建
用于开发,或在本地克隆后运行:
npm ci
npm run build
# For using npx locally
npm link
通过 Docker 运行
通过 Docker 运行 MCP 服务,无需在本地安装 Node.js。MCP 客户端(VS Code、Claude Desktop)会将容器作为子进程启动——与 npx 相同,只是将命令换成了 docker。
镜像发布在 Docker Hub 上,地址为 perforce/p4plan-mcp,每次发布都会构建多架构镜像(linux/amd64 + linux/arm64),并提供 SLSA 来源证明和 SBOM 证明。
VS Code(.vscode/mcp.json):
{
"servers": {
"p4-plan": {
"type": "stdio",
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "P4PLAN_API_AUTH_TOKEN=YOUR_JWT_TOKEN",
"-e", "P4PLAN_API_URL=http://host.docker.internal:4000",
"perforce/p4plan-mcp:latest"
]
}
}
}
Claude Desktop:
{
"mcpServers": {
"p4-plan": {
"command": "docker",
"args": [
"run", "-i", "--rm",
"-e", "P4PLAN_API_AUTH_TOKEN=YOUR_JWT_TOKEN",
"-e", "P4PLAN_API_URL=http://host.docker.internal:4000",
"perforce/p4plan-mcp:latest"
]
}
}
}
注意: 使用
host.docker.internal(macOS/Windows)或172.17.0.1(Linux)访问主机上运行的 P4 Plan GraphQL API。
固定特定版本: 将
:latest替换为:2026.3.2(或其他标签),以实现可复现的部署。
在本地构建(用于针对尚未发布的更改进行开发):
docker build -t p4plan-mcp:dev .
# then swap "perforce/p4plan-mcp:latest" for "p4plan-mcp:dev" in the configs above
配置
复制示例配置并进行设置:
cp config-example.env .env
编辑 .env 并填写你的设置:
# JWT token for authenticating with P4 Plan GraphQL API
# Obtain via: login mutation on the GraphQL API
P4PLAN_API_AUTH_TOKEN=your-jwt-token
# P4 Plan GraphQL API URL — base origin only. Do not include a path or a
# trailing slash: the server appends /graphql, /healthcheck and /attachment/<id>
# itself, so a trailing slash produces //graphql.
P4PLAN_API_URL=https://p4plan-api.example.com
# Logging
LOG_LEVEL=info
# Maximum number of results returned by search_tasks (default: 400)
# SEARCH_LIMIT=400
# Allow self-signed TLS certificates when connecting to the P4 Plan API over HTTPS
# Set to true if your API uses a self-signed or untrusted certificate
# P4PLAN_ALLOW_SELF_SIGNED_CERTS=true
# Read-only mode: expose only the tools that read (same as the --readonly argument)
# P4PLAN_READONLY=true
# Folders upload_attachment may read files from, besides the workspace folders
# the MCP client shares. Separate several with ":" (";" on Windows)
# P4PLAN_UPLOAD_DIRS=/Users/me/Screenshots:/Users/me/logs
服务通过 stdin/stdout 通信,不适合交互式运行——MCP 客户端(VS Code、Claude Desktop)会自动将其作为子进程启动。
只读模式
使用 --readonly 参数启动服务,或设置 P4PLAN_READONLY=true,即可启用只读模式:
- 只注册读取类工具。不会向模型提供创建、更新、评论、链接、提交或删除类工具。
- 作为第二层防护,每个工具发出的 GraphQL 请求都会经过检查,并且只会向 P4 Plan API 发送普通查询。修改操作、订阅以及任何无法分类的请求都会被拒绝。
- 模型会获知无法进行更改,因此会对此作出说明,而不是尝试更改。仅与写入相关的技能(
comment-html-format、mentions)不会加载。
这意味着从 P4 Plan 读取的内容(例如任务描述或评论)无法引导模型通过此服务更改数据。
{
"servers": {
"p4-plan": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@perforce/p4plan-mcp", "--readonly"],
"env": {
"P4PLAN_API_AUTH_TOKEN": "YOUR_JWT_TOKEN",
"P4PLAN_API_URL": "http://localhost:4000"
}
}
}
}
使用 Docker 时,传入 -e P4PLAN_READONLY=true,或在镜像名称后添加 --readonly。使用 Docker Compose 时,在 shell 或 .env 中设置 P4PLAN_READONLY=true;docker-compose.yml 会将其传递给容器。
只读模式限制 MCP 服务的操作,但不会改变令牌的权限。若要获得最强保障,还应使用仅具有读取权限的 P4 Plan 用户进行身份验证。
上传文件
upload_attachment 会将本地文件或模型撰写的文本附加到任务、缺陷、迭代或发布中。读取本地文件可能会让提示词注入要求读取类似 ~/.ssh/id_rsa 的文件,因此服务只会读取允许文件夹中的文件:
- MCP 客户端与服务共享的工作区文件夹(MCP 根目录),以及
P4PLAN_UPLOAD_DIRS中列出的文件夹(多个路径以:分隔;Windows 上以;分隔)。
检查前会解析符号链接;隐藏文件和文件夹(名称以 . 开头,例如 .env、.ssh 或 .git)永远不会上传,且只会读取常规文件。如果客户端未共享任何文件夹,且未设置 P4PLAN_UPLOAD_DIRS,则只能上传文本(content + fileName)。
使用 Docker 时,容器无法访问你的文件:请挂载文件夹,并将 P4PLAN_UPLOAD_DIRS 指向容器内的路径,例如 -v "$HOME/Screenshots:/uploads:ro" -e P4PLAN_UPLOAD_DIRS=/uploads,并传入 /uploads/bug.png 这样的路径。
文件会流式传输到 P4 Plan API(POST /attachment/<id>/upload),因此其内容不会经过模型。P4 Plan 服务自身的限制仍然适用:附件大小限制和禁止的文件类型。如果已附加同名文件,服务会将新文件存储为 name (1).ext。如果上传超时,上传操作可能仍已完成,因此重试前请先检查 get_attachments。
若要在评论或多行字段(缺陷描述、重现步骤、多行文本列)中显示图片,请将图片上传到同一条目,并在 HTML 中放入返回的 imageHtml(<img src="hansoft://...">)。P4 Plan 客户端会以这种方式嵌入粘贴的图片;对于其他 src 的图片,服务会将其转换为普通链接。
为防止单个客户端向 P4 Plan API 发送过多请求(例如模型陷入循环,或提示词注入要求上传大量文件),每个 MCP 服务一次只运行一个上传任务,每分钟最多启动 20 次上传。后续调用会返回错误,告知需要等待多久。
每个工具都会发布 MCP 工具注解。readOnlyHint 用于标记仅执行读取操作的工具;执行写入操作的工具还会带有 destructiveHint(调用会删除或覆盖数据)和 idempotentHint。支持注解的客户端可以据此在写入前请求确认。
身份验证
MCP 服务需要通过 P4PLAN_API_AUTH_TOKEN 环境变量提供 JWT 令牌。服务会在启动时验证令牌,并在每次工具调用时将其转发给 P4 Plan GraphQL API。服务不会维护会话或状态。
获取 JWT 令牌
使用 curl 从 P4 Plan GraphQL API 获取 JWT 令牌。你可以使用密码或**个人访问令牌(PAT)**进行身份验证:
使用密码
curl -s -X POST http://localhost:4000/graphql \
-H "Content-Type: application/json" \
-d '{
"query": "mutation Login($loginUserInput: LoginUserInput!) { login(loginUserInput: $loginUserInput) { access_token } }",
"variables": { "loginUserInput": { "username": "YOUR_USERNAME", "password": "YOUR_PASSWORD" } }
}'
使用个人访问令牌(推荐)
PAT 可在同一个登录 mutation 中代替密码使用。这样可以避免泄露你的实际密码:
curl -s -X POST http://localhost:4000/graphql \
-H "Content-Type: application/json" \
-d '{
"query": "mutation Login($loginUserInput: LoginUserInput!) { login(loginUserInput: $loginUserInput) { access_token } }",
"variables": { "loginUserInput": { "username": "YOUR_USERNAME", "password": "YOUR_PERSONAL_ACCESS_TOKEN" } }
}'
两种方法都会返回相同的响应:
{
"data": {
"login": {
"access_token": "eyJhbGciOiJIUzI1NiIs..."
}
}
}
复制 access_token 的值,并在 MCP 客户端配置中使用。
获取个人访问令牌
- 登录 P4 Plan
- 前往 用户设置 → 个人访问令牌
- 点击 生成新令牌
- 设置合适的过期日期
- 复制令牌 — 在上方的登录 mutation 中使用它,以获取 JWT
注意: JWT 令牌会过期。令牌过期后,服务将因身份验证错误而无法启动。使用上方相同的
curl命令生成新的 JWT。
可用工具(共 31 个)
工具参数的解析较为宽松,因此能力较弱的模型也能更容易地调用成功。枚举值不区分大小写、空格、_ 或 -("Time Spent" → timeSpent)。布尔值接受 "true"/"yes",ID 接受数字,数字接受数字字符串,列表接受 JSON 编码格式或以逗号分隔的 ID 列表。无法明确映射的值将被拒绝,并返回允许的值。
项目
list_projects - 列出用户所属的所有活跃项目
- 用途:查找其他工具所需的项目 ID
get_project - 获取项目配置,包括 archivedStatus、backlog ID 和 QA ID
- 参数:
projectId - 用途:获取其他工具所需的分区 ID(backlog、QA、规划)
create_project - 一次调用即可创建项目并组建团队
- 参数:
name、可选的methodTemplate、defaultMode、members(用户或全局群组的名称/ID)、managers(普通用户的名称/ID)、addMeAsManager(默认为 true),或通过copyFromProjectId复制现有项目,并设置copyUsers/copyColumns - 用途:无需使用界面即可为团队创建新项目。需要 P4 Plan 管理员权限;项目创建后失败的步骤会列在
failed中
任务
get_my_tasks - 获取分配给当前用户的任务(todoList)
- 参数:
showCompleted、showOnlyNextFourWeeks、showHidden、showPipelineTasksThatCannotStart - 用途:查看所有项目中的个人待办队列
get_tasks - 按 ID 获取一个或多个条目的详细信息(最多 20 个)
- 参数:
taskIds(字符串数组,最多 20 个)——数据库条目 ID,即其他工具返回的id - 每条响应都包含
id(所有工具使用的数据库 ID)和localID(P4 Plan 界面“ID”列中显示的编号)。 - 用途:获取条目完整详情、检查链接、批量检索多个条目
search_tasks - 使用 P4 Plan Find 查询在项目分区中搜索条目
- 参数:
findQuery、projectId - 所有搜索均使用 P4 Plan Find 查询语法。请先调用
read_skill并设置skillName="search-queries",以获取准确的列名、运算符和取值格式。简单名称搜索可使用Itemname:Text("text")。支持按状态、负责人、严重程度、条目类型、日期、布尔条件以及 AND/OR/NOT 组合进行筛选。 - 每个项目包含三个分区(Backlog、QA、Planning),各自的 ID 不同。
- 若要解析 ID,请直接查询:
ID=<n>匹配界面中的“ID”列(本地 ID,仅在一个分区内唯一),Databaseid=<n>匹配数据库 ID。 - 用途:查找条目、筛选、生成报告
create_item - 创建任意类型的条目
- 类型:
backlog_task、bug、scheduled_task、sprint、release、sprint_task - 参数:
type、name、projectId、parentItemId、previousItemId,以及特定类型的字段 - 用途:创建任务、创建 sprint、提交 bug
update_item - 更新任意条目(自动检测类型)
- 类型:BacklogTask、Bug、ScheduledTask、Sprint、Release
- 参数:
itemId,以及所有可更新字段(name、status、assignedTo、points 等) - 用途:更新状态、分配任务、估算、配置 sprint
commit_to_sprint - 将待办任务或缺陷提交到 sprint
- 参数:
taskId、sprintId - 使用场景:Sprint 规划、待办事项承诺
uncommit_from_sprint - 将任务从 sprint 中移除(返回待办事项)
- 参数:
taskId - 使用场景:调整 sprint 范围
自定义字段与工作流
get_custom_columns - 获取项目中可用的自定义列定义
- 参数:
projectId - 使用场景:读取或写入值之前,查找自定义字段
create_custom_column - 在项目分区中创建自定义列(例如 Time Spent)
- 参数:
projectId(planning、backlog 或 QA ID)、name、columnType、activated、readOnly,以及类型专属的unitName、updateOn*/updateOnlyFirstTime、useForTimeReporting/updateWorkRemaining、dropListItems(标签,或包含icon、autoAssignToUsers、autoAssignToUserGroups的对象) - 使用场景:无需使用 UI 即可设置项目的列。需要拥有主项目经理权限
get_custom_fields - 获取任务上设置的自定义字段值
- 参数:
taskId、onlySet - 使用场景:读取项目专属元数据
set_custom_field - 设置任务的自定义字段值
- 参数:
taskId、customFieldId、value - 使用场景:更新项目专属元数据
get_workflows - 获取项目的工作流定义和状态 ID
- 参数:
projectId - 使用场景:查找状态转换所需的工作流状态
任务操作
complete_task - 将任务标记为已完成
- 参数:
taskId - 使用场景:便捷地快速更新状态
start_task - 将任务标记为进行中
- 参数:
taskId - 使用场景:便捷地快速更新状态
get_comments - 获取任务的所有评论
- 参数:
taskId - 用例:查看讨论历史
post_comment - 在任务上发布新评论
- 参数:
taskId、text - 用例:添加讨论内容、验收标准和备注
update_comment - 编辑现有评论
- 参数:
taskId、commentId、text - 用例:更正或更新现有评论
delete_comment - 删除任务上的评论
- 参数:
taskId、commentId - 用例:移除过时或错误的评论
get_attachments - 获取任务的所有附件
- 参数:
taskId - 用例:列出附件文件,查找下载路径
download_attachment - 下载附件并返回文件内容
- 参数:
taskId、path - 文本文件以内联形式返回,图片以 base64 格式返回
- 用例:阅读附件文档、查看屏幕截图
upload_attachment - 将本地文件或文本附加到任务
- 参数:
taskId,以及filePath(可选fileName用于重命名)或content+fileName - 本地文件必须位于允许的文件夹内,参见上传文件
- 返回新附件的
path;第一个附加的图片会成为封面图片 - 对于图片,还会返回
imageHtml,这是一个<img>标签,可在同一项的评论、描述、复现步骤或多行文本字段中显示图片 - 用例:在 Bug 报告和用户故事中附加屏幕截图、日志或复现文件
delete_attachment - 从任务中删除附件
- 参数:
taskId、path - 用例:移除过时的附件
set_cover_image - 设置或取消任务的封面图片
- 参数:
taskId、imagePath - 用例:为卡片/项目设置视觉标识
链接
link_items - 创建内部或外部链接
- 参数:
fromItemId、toItemId或url、relation(blocks、duplicates、relatedTo) - 用例:依赖关系跟踪、交叉引用、外部 URL
unlink_items - 移除内部或外部链接
- 参数:
fromItemId、toItemId或url - 用例:清理过时的依赖关系
用户
get_current_user - 获取当前用户信息
- 用例:身份验证、用户上下文
list_project_users - 列出项目中的用户
- 参数:
projectId - 用例:查找用于分配任务的用户 ID、管理冲刺成员
read_skill - 在运行时读取 P4 Plan 技能文档
- 参数:
skillName - 返回所请求技能文档的完整 Markdown 内容。AI Agent 在为
search_tasks编写任何findQuery之前,必须先使用skillName="search-queries"调用此工具。 - 可用技能:
project-navigation、search-queries、task-management、planning、backlog-refinement、bug-tracking、custom-fields、gantt-scheduling、workflows、pipeline、comment-html-format、mentions - 使用场景:了解正确的查询语法、发现工具使用模式、理解领域概念
客户端配置
VS Code (Copilot) — 通过 npx(推荐)
在工作区中创建 .vscode/mcp.json:
{
"servers": {
"p4-plan": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@perforce/p4plan-mcp"],
"env": {
"P4PLAN_API_AUTH_TOKEN": "YOUR_JWT_TOKEN",
"P4PLAN_API_URL": "http://localhost:4000"
}
}
}
}
注意:
-y标志会自动确认 npm 安装提示,因此服务无需用户交互即可启动。
VS Code (Copilot) — 通过 node(本地构建)
如果从本地克隆运行,而不是通过 npm 运行:
{
"servers": {
"p4-plan": {
"type": "stdio",
"command": "node",
"args": ["/path/to/MCP/dist/main.js"],
"env": {
"P4PLAN_API_AUTH_TOKEN": "YOUR_JWT_TOKEN",
"P4PLAN_API_URL": "http://localhost:4000"
}
}
}
}
VS Code — 使用安全令牌提示
为增强安全性,你可以使用 VS Code 输入提示,避免将令牌存储在文件中:
{
"inputs": [
{
"type": "promptString",
"id": "p4-plan-jwt",
"description": "P4 Plan JWT Token",
"password": true
}
],
"servers": {
"p4-plan": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@perforce/p4plan-mcp"],
"env": {
"P4PLAN_API_AUTH_TOKEN": "${input:p4-plan-jwt}",
"P4PLAN_API_URL": "http://localhost:4000"
}
}
}
}
Claude Desktop
添加到 ~/Library/Application Support/Claude/claude_desktop_config.json(macOS)或 %APPDATA%\Claude\claude_desktop_config.json(Windows):
{
"mcpServers": {
"p4-plan": {
"command": "npx",
"args": ["-y", "@perforce/p4plan-mcp"],
"env": {
"P4PLAN_API_AUTH_TOKEN": "YOUR_JWT_TOKEN",
"P4PLAN_API_URL": "http://localhost:4000"
}
}
}
}
将 YOUR_JWT_TOKEN 替换为通过登录 mutation 获取的令牌(参见获取 JWT 令牌)。
Claude Code(CLI / VS Code 扩展)
在项目根目录中创建 .mcp.json:
{
"mcpServers": {
"p4-plan": {
"command": "npx",
"args": ["-y", "@perforce/p4plan-mcp"],
"env": {
"P4PLAN_API_AUTH_TOKEN": "YOUR_JWT_TOKEN",
"P4PLAN_API_URL": "http://localhost:4000"
}
}
}
}
对于本地构建,请将 "command" 和 "args" 替换为:
{
"mcpServers": {
"p4-plan": {
"command": "node",
"args": ["/path/to/MCP/dist/main.js"],
"env": {
"P4PLAN_API_AUTH_TOKEN": "YOUR_JWT_TOKEN",
"P4PLAN_API_URL": "http://localhost:4000"
}
}
}
}
或者通过 CLI 添加:
claude mcp add p4-plan \
-e P4PLAN_API_AUTH_TOKEN=YOUR_JWT_TOKEN \
-e P4PLAN_API_URL=http://localhost:4000 \
-- npx -y @perforce/p4plan-mcp
注意: 服务名称必须放在
-e标志之前,否则可变参数-e解析器会将名称作为环境变量值处理。
验证是否正在运行: 在 Claude Code 中输入 /mcp,检查服务状态。
提示: 将
.mcp.json放在项目根目录中,以便与团队共享配置(不包含令牌)。对于个人配置,请改为将服务添加到~/.claude.json。
验证连接
- 确保 P4 Plan GraphQL API 正在运行
- 打开包含
.vscode/mcp.json的工作区所在的 VS Code - 在扩展侧边栏中查找“MCP SERVERS”——你应该会看到列出的“p4-plan”
- 开始新的 Copilot 聊天,并询问“分配给我的任务有哪些?”
环境变量
P4PLAN_API_AUTH_TOKEN- 用于向 P4 Plan GraphQL API 进行身份验证的 JWT 令牌P4PLAN_API_URL- P4 Plan GraphQL API URL,仅包含基础源地址——不含路径和末尾斜杠(服务会附加/graphql、/healthcheck和/attachment/<id>)。未设置时默认为http://localhost:4000;config-example.env中提供了 HTTPS 示例。P4PLAN_ALLOW_SELF_SIGNED_CERTS- 设置为true,以便通过 HTTPS 连接 API 时接受自签名或不受信任的 TLS 证书(默认值:false)P4PLAN_READONLY- 设置为true(或1、yes、on),仅公开读取数据的工具,效果与--readonly参数相同(默认值:false)。大小写和首尾空格会被忽略;无法识别的值会启用只读模式并记录警告。参见只读模式P4PLAN_UPLOAD_DIRS- 除 MCP 客户端共享的工作区文件夹外,upload_attachment还可以从这些文件夹读取文件。多个文件夹之间用:分隔(Windows 上用;)。参见上传文件LOG_LEVEL- 日志级别:debug、info、warn、error(默认值:debug)SEARCH_LIMIT-search_tasks返回的最大结果数(默认值:400)
技能与资源
该服务包含技能文件——面向特定领域的指南,可帮助 AI Agent 构造正确的工具调用。技能有两种访问方式:
read_skill工具——任何 MCP 客户端都可以调用read_skill并传入skillName,在运行时获取技能内容。这是主要访问方式,适用于所有客户端。- MCP 资源——技能也会注册为 MCP 资源(例如
skill://p4-plan/search-queries),供支持原生资源读取的客户端使用。
| 技能 | 用途 |
|---|---|
| project-navigation | 查找和创建项目、工作项以及入门指南 |
| search-queries | P4 Plan 查找查询语法(列名、值、运算符) |
| task-management | 任务的增删改查、状态、分配、评论和附件 |
| planning | 冲刺、发布、承诺、分配 |
| backlog-refinement | 待办事项、估算、优先级排序 |
| bug-tracking | 缺陷、严重程度、QA 部分 |
| custom-fields | 自定义列、项目专属元数据 |
| gantt-scheduling | 已排期任务、时间线、依赖项 |
| workflows | 状态工作流、状态状态机 |
| pipeline | 流水线步骤、分解、流水线步骤中的缺陷 |
| comment-html-format | 评论和多行字段允许使用的 HTML 子集 |
| mentions | 评论中的 @用户提及语法 |
请参阅 skills/README.md,了解如何在不同 AI 客户端中使用技能。
开发
使用 npm link 进行本地测试
无需发布到 npm,即可在本地测试 npx 体验:
# Build and create a global symlink
npm run build
npm link
# Now test exactly as an end user would
P4PLAN_API_AUTH_TOKEN=your-jwt-token npx @perforce/p4plan-mcp
# Clean up when done
npm unlink -g @perforce/p4plan-mcp
符号链接在重新构建后仍会保留——代码更改后只需运行 npm run build。
添加新工具
-
在
src/tools/中创建或编辑工具文件 -
定义工具,包含:
name:唯一的工具标识符description:工具的功能说明(展示给 AI)inputSchema:参数的 JSON Schemahandler:执行工具的函数
-
在
ToolsModule中注册
测试
# Unit tests
npm run test
# E2E tests (MCP protocol compliance via @modelcontextprotocol/sdk)
npm run test:e2e
日志记录
该服务使用 Winston,并配置了两种传输方式:
- 控制台(stderr): 只有警告和错误会写入 stderr。在 VS Code 中,这些内容会显示在“输出”面板的“p4-plan”下拉菜单中。为保持输出简洁,只显示
warn和error级别的消息。 - 文件: 完整的调试日志会写入
logs/P4PlanMCP_<timestamp>.log。可使用这些日志进行详细故障排查。
注意: 所有控制台输出都写入 stderr(绝不写入 stdout),因为 stdout 是 MCP 协议通道。VS Code 会将所有 stderr 输出标记为
[warning]——这是预期行为,并不表示存在问题。
协议
该服务使用 MCP stdio 传输——通过 stdin/stdout 传输 JSON-RPC 2.0 消息进行通信。客户端会将该服务作为子进程启动。
- 传输: stdio(stdin/stdout)
- 协议: JSON-RPC 2.0
- 身份验证:
P4PLAN_API_AUTH_TOKEN环境变量(启动时验证) - SDK:
@modelcontextprotocol/sdk,使用StdioServerTransport
故障排除
服务无法启动
-
检查是否已设置 P4PLAN_API_AUTH_TOKEN: 服务需要在
P4PLAN_API_AUTH_TOKEN环境变量中配置有效的 JWT 令牌。如果未设置,服务会立即报错退出。 -
检查令牌是否有效: 如果令牌已过期或无效,服务会退出并显示“身份验证失败”。使用登录 mutation 生成新的 JWT。
-
检查 GraphQL API 是否可访问: 必须能够通过已配置的
P4PLAN_API_URL访问 P4 Plan GraphQL API(默认值:http://localhost:4000)。
VS Code 未检测到服务
-
检查 mcp.json 语法: 确保
.vscode/mcp.json是有效的 JSON。检查是否存在多余的逗号。 -
检查命令是否可用: 如果使用
npx,请确保 Node.js 位于 VS Code 的 PATH 中。如果找不到npx,请改用node的绝对路径(参见本地构建配置)。 -
重新加载 VS Code 窗口: 按
Cmd+Shift+P→“Developer: Reload Window” -
开始新的聊天: MCP 服务会在新的聊天会话开始时连接。
工具无法使用
-
检查 GraphQL 服务是否正在运行: 必须能够通过已配置的 URL 访问 P4 Plan GraphQL API。
-
检查服务日志: 在 VS Code 中,打开“输出”面板 → 从下拉菜单中选择“p4-plan”,查看警告和错误。完整的调试日志请查看
logs/目录。 -
确认 JWT 尚未过期: 如有需要,请生成新的 JWT 并更新 mcp.json 配置。
许可证
本项目采用 MIT 许可证授权。详情请参见 LICENSE。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。