github / github/copilot-sdk

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

Abierto
#1,143 0 comentarios 0 reacciones 0 asignados Ver en GitHub
enhancement
Lenguaje dominante
Java
Estrellas
10.5k
Forks
1.5k
Merge medio
1 d 11 h
PR fusionados (30 d)
127

Descripción

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

Guía de contribución

Abrir la guía de contribución

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.