mcpField
P
p4plan-mcp

p4plan-mcp

本地服务
github.com/perforce生产力41 周前更新

关于 p4plan-mcp

p4plan-mcp 是无状态 MCP 服务,通过 P4 Plan GraphQL API 让 AI 助手处理项目数据,并提供可选的只读模式。

主要功能

  1. 01通过 GraphQL 访问 P4 Plan
  2. 02管理任务、迭代和缺陷
  3. 03处理评论与自定义字段
  4. 04按目录限制附件上传
  5. 05可选只读模式

适用场景

  1. 01查找并更新项目任务
  2. 02查看迭代与缺陷信息
  3. 03添加评论或上传附件
  4. 04限制助手仅执行读取操作

MCP 相关

通过 stdio 向 Claude 和 VS Code Copilot 等客户端提供 P4 Plan 工具,并将 JWT 身份验证转发至 GraphQL API。只读模式下仅注册读取工具。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"perforce-p4plan": {
"command": "npx",
"args": [
"-y",
"@perforce/p4plan-mcp"
],
"env": {
"P4PLAN_API_AUTH_TOKEN": "<P4PLAN_API_AUTH_TOKEN>",
"P4PLAN_API_URL": "<P4PLAN_API_URL>",
"P4PLAN_ALLOW_SELF_SIGNED_CERTS": "<P4PLAN_ALLOW_SELF_SIGNED_CERTS>",
"P4PLAN_READONLY": "<P4PLAN_READONLY>",
"P4PLAN_UPLOAD_DIRS": "<P4PLAN_UPLOAD_DIRS>"
}
}
}
}
启动命令npx -y @perforce/p4plan-mcp
需要配置的环境变量
P4PLAN_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+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npm@perforce/p4plan-mcp2026.3.2
ocidocker.io/perforce/p4plan-mcp:2026.3.2

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

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所有工具操作的必需条件。不支持更早的版本。

提示: 使用 nvm 管理 Node.js 版本,或者使用 Docker 完全跳过 Node.js 要求。

快速开始(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 客户端配置中使用。

获取个人访问令牌
  1. 登录 P4 Plan
  2. 前往 用户设置 → 个人访问令牌
  3. 点击 生成新令牌
  4. 设置合适的过期日期
  5. 复制令牌 — 在上方的登录 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
### 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。

验证连接
  1. 确保 P4 Plan GraphQL API 正在运行
  2. 打开包含 .vscode/mcp.json 的工作区所在的 VS Code
  3. 在扩展侧边栏中查找“MCP SERVERS”——你应该会看到列出的“p4-plan”
  4. 开始新的 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-queriesP4 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。

添加新工具
  1. 在 src/tools/ 中创建或编辑工具文件

  2. 定义工具,包含:

    • name:唯一的工具标识符
    • description:工具的功能说明(展示给 AI)
    • inputSchema:参数的 JSON Schema
    • handler:执行工具的函数
  3. 在 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

故障排除

服务无法启动
  1. 检查是否已设置 P4PLAN_API_AUTH_TOKEN: 服务需要在 P4PLAN_API_AUTH_TOKEN 环境变量中配置有效的 JWT 令牌。如果未设置,服务会立即报错退出。

  2. 检查令牌是否有效: 如果令牌已过期或无效,服务会退出并显示“身份验证失败”。使用登录 mutation 生成新的 JWT。

  3. 检查 GraphQL API 是否可访问: 必须能够通过已配置的 P4PLAN_API_URL 访问 P4 Plan GraphQL API(默认值:http://localhost:4000)。

VS Code 未检测到服务
  1. 检查 mcp.json 语法: 确保 .vscode/mcp.json 是有效的 JSON。检查是否存在多余的逗号。

  2. 检查命令是否可用: 如果使用 npx,请确保 Node.js 位于 VS Code 的 PATH 中。如果找不到 npx,请改用 node 的绝对路径(参见本地构建配置)。

  3. 重新加载 VS Code 窗口: 按 Cmd+Shift+P →“Developer: Reload Window”

  4. 开始新的聊天: MCP 服务会在新的聊天会话开始时连接。

工具无法使用
  1. 检查 GraphQL 服务是否正在运行: 必须能够通过已配置的 URL 访问 P4 Plan GraphQL API。

  2. 检查服务日志: 在 VS Code 中,打开“输出”面板 → 从下拉菜单中选择“p4-plan”,查看警告和错误。完整的调试日志请查看 logs/ 目录。

  3. 确认 JWT 尚未过期: 如有需要,请生成新的 JWT 并更新 mcp.json 配置。

许可证

本项目采用 MIT 许可证授权。详情请参见 LICENSE。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。