github / github/copilot-sdk

Feature Request: session-scoped tool inventory API (list MCP-discovered tools loaded into a session)

Đang mở
#1,143 0 bình luận 0 reaction 0 người được giao Xem trên GitHub
enhancement
Ngôn ngữ chính
Java
Star
10.5k
Fork
1.5k
Merge trung bình
1 ngày 14 giờ
Pull request đã merge (30 ngày)
129

Mô tả

## 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`

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Hướng nghiên cứu

Bắt đầu bằng cách đọc phần triển khai createSessionRpc và các wrapper session.rpc.{mcp,skills,plugins,extensions}.list() hiện có. Kiểm tra CONTRIBUTING để biết các yêu cầu về tính tương đương giữa Python, Go và .NET, đồng thời xem lại api.schema.json dù trình xử lý RPC phía máy chủ nằm ngoài repository này. Công việc được xem là hoàn tất khi các binding SDK được hỗ trợ cung cấp kết quả tools.list nhất quán trong phạm vi session, với điều kiện RPC nội bộ trở nên khả dụng.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Đánh giá

Công nghệ
csharp, go, python, typescript
Lĩnh vực
api, backend-api-design, developer-experience
Loại issue
Tính năng
Độ khó
5/5
Thời gian dự kiến
Hơn một tuần
Mức độ hoạt động
Ít trao đổi
Độ rõ ràng
Khá rõ ràng
Mức phù hợp với người mới
35/100

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.