Feature Request: session-scoped tool inventory API (list MCP-discovered tools loaded into a session)
- 主要语言
- Java
- 星标
- 10.5k
- 派生
- 1.5k
- 平均合并
- 1 天 14 小时
- 30 天内合并 PR
- 129
描述
## Problem
No public API enumerates the tools loaded into a *session* — built-ins merged with MCP-discovered tools from `SessionConfig.mcpServers`. Closest existing surfaces don't cover it:
- `client.rpc.tools.list({ model? })` is server-scoped — built-ins only, no session-loaded MCP tools.
- `session.rpc.mcp.list()` returns server connection status (`name`, `status`, `error?`, `source?`), not tools or counts per server.
- `session.mcp_servers_loaded` event fires once on session startup but carries the same server-status-only payload — no tool list.
- `session.mcp_server_status_changed` carries `{ serverName, status }` only.
- `session.tools_updated` event payload is just `{ model: string }`.
A session can report `mcp.status: "connected"` and still expose zero tools (wrong CLI flags, version mismatch, schema error) — there's no SDK-side way to detect this.
## Why it's needed
- **Operational visibility.** Confirm before the first turn that an MCP server actually contributed the expected tools, not just that its process started.
- **Diagnostic UIs.** Surface per-server tool counts to operators of BYOK / multi-MCP deployments.
- **Test assertions.** Verify a given MCP wiring exposes the expected tool set without spawning a parallel `tools/list` probe.
- **Parity with prior MCP clients.** Other MCP integrations (e.g. `@ai-sdk/mcp`) expose discovered tools as an enumerable map; consumers migrating to copilot-sdk lose this.
## Contribution scope
`api.schema.json` ships from the closed `@github/copilot` npm package (the public `github/copilot-cli` repo is just the installer). The server-side RPC handler must live in the internal CLI — external contributors can only touch SDK bindings/wrappers in this repo, not the underlying RPC implementation.
## Proposed solution
Add a session-scoped `tools.list` RPC, mirroring the existing `client.rpc.tools.list()` but reflecting per-session config:
```ts
// in createSessionRpc:
tools: {
list: async (): Promise =>
connection.sendRequest("session.tools.list", { sessionId }),
handlePendingToolCall: /* unchanged */,
}
export interface SessionToolsListResult {
tools: Tool[]; // namespacedName populated for MCP tools (e.g. "playwright/browser_navigate")
}
```
Returns built-ins (post-`excludedTools`/`availableTools` filtering) + MCP-contributed tools. Consistent with existing `session.rpc.{mcp,skills,plugins,extensions}.list()` shape. Parity in Python/Go/.NET per CONTRIBUTING.
A leaner alternative: enrich `McpServer` with `toolCount?: number` and/or `tools?: string[]`. Less consistent with the existing pattern but lighter.
## Related
- #944 — same underlying gap, surfaced as a question.
- #735 — adjacent (manipulating session tool set without teardown).
## Environment
`@github/copilot-sdk@0.3.0`
贡献指南
调研方向
首先阅读 createSessionRpc 的实现以及现有的 session.rpc.{mcp,skills,plugins,extensions}.list() 封装。检查 CONTRIBUTING 中关于 Python、Go 和 .NET 对等性的要求,并查看 api.schema.json,即使服务器端 RPC 处理程序位于此仓库之外。完成的标准是:受支持的 SDK 绑定能够公开一致的会话范围 tools.list 结果,前提是内部 RPC 变得可用。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- csharp, go, python, typescript
- 领域
- api, backend-api-design, developer-experience
- Issue 类型
- 功能
- 难度
- 5/5
- 预计耗时
- 一周以上
- 活跃度
- 冷清
- 描述清晰度
- 基本清楚
- 新手友好度
- 35/100