github / github/copilot-cli

Plugin MCP servers cannot resolve the active project directory

未關閉
#4,234 0 則留言 0 個 reaction 已指派 0 人 在 GitHub 檢視
area:mcp area:plugins
主要語言
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

把新 issue 寄到你的電子郵件信箱

精選適合新手參與的 GitHub issue 摘要。