Plugin MCP servers cannot resolve the active project directory
- 主要語言
- Shell
- 星號
- 11.2k
- 分支
- 1.9k
- 平均合併
- 14 小時 16 分鐘
- 30 天內合併 PR
- 6
描述
### Describe the bug
An MCP server loaded from an installed plugin is launched with its working directory set to the plugin installation root, and the child process receives no project/workspace path. A project-scoped MCP server therefore reads and writes the plugin installation instead of the repository passed to Copilot CLI.
This is observable with Copilot CLI 1.0.73 on Linux when using either `--plugin-dir` or an installed plugin.
### Steps to reproduce
1. Create a plugin manifest that points at a plugin-root MCP config:
```json
{
"name": "cwd-probe",
"mcpServers": "./.mcp.json"
}
```
2. Use this `.mcp.json`:
```json
{
"mcpServers": {
"probe": {
"command": "sh",
"args": [
"-c",
"pwd > /tmp/plugin-mcp-pwd.txt; env > /tmp/plugin-mcp-env.txt; exec my-mcp-server"
]
}
}
}
```
3. Run the plugin against a different project:
```sh
copilot -C /tmp/example-project --plugin-dir /tmp/cwd-probe
```
4. Inspect the captured files.
### Actual behavior
- `PWD` is `/tmp/cwd-probe`, not `/tmp/example-project`.
- The MCP child receives `COPILOT_PLUGIN_ROOT` and `PLUGIN_ROOT`, but it does not receive `COPILOT_PROJECT_DIR` (plugin hooks do receive that variable).
- The MCP `initialize` request advertises only `sampling` and `elicitation`; it does not advertise MCP roots, so the server cannot request the workspace through `roots/list`.
- Setting `"cwd": "${workspaceFolder}"` leaves the value unresolved and fails before the child starts with `No such file or directory (os error 2)`.
The full initialization payload captured from 1.0.73 was:
```json
{"jsonrpc":"2.0","id":0,"method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{"sampling":{},"elicitation":{"form":{},"url":{}}},"clientInfo":{"name":"github-copilot-developer","version":"1.0.73"}}}
```
### Expected behavior
A plugin-provided MCP server needs a supported way to resolve the active project. Any one of these would unblock project-scoped servers:
- launch plugin MCP children from the active project directory;
- pass `COPILOT_PROJECT_DIR` to MCP children as Copilot already does for plugin hooks; or
- expose a documented project variable / MCP roots capability that plugin MCP configuration can pass to the server.
The plugin root should remain available separately through `COPILOT_PLUGIN_ROOT`.
### Impact
Project-scoped MCP tools can silently operate on files inside the cached plugin installation. In [archcore-ai/plugin#24](https://github.com/archcore-ai/plugin/issues/24), the MCP tools register and return success, but document writes land under the installed plugin rather than the project, which prevents a safe Copilot plugin release.
貢獻指南
研究方向
使用 `copilot -C /tmp/example-project --plugin-dir /tmp/cwd-probe` 重現問題,並追蹤外掛程式 MCP 啟動路徑、工作目錄選擇、環境建構和初始化能力。完成的標誌是,外掛程式 MCP 伺服器能夠解析作用中的專案,同時不遺失獨立的外掛程式根目錄,並使用 issue 中描述的其中一種受支援方法。
由索引模型根據 Issue 內容生成。
評估
- 技術堆疊
- shell
- 領域
- cli, tooling
- Issue 類型
- 缺陷
- 難度
- 4/5
- 預估耗時
- 3-5 天
- 活躍度
- 冷清
- 描述清晰度
- 基本清楚
- 新手友好度
- 52/100