Repository navigation
SDK built-in tool set differs from the Copilot CLI — todo (and others) missing in .NET SDK sessions #1641
Description
Thank you for the SDK and the excellent docs — the custom-agent + skills model has been a pleasure to build on. I ran into a small gap between the documentation and what I observe in the .NET SDK, and I'd love to understand whether it's expected (and, if so, how the docs might be clarified). I may well be misreading the docs, so please correct me if I've misunderstood.
Summary
The reference Custom agents configuration → Tools → Tool aliases enumerates the tool aliases a custom agent's tools: property may contain (execute, read, edit, search, agent, web, todo) and notes the tools property applies to agent profiles "in GitHub.com, the Copilot CLI, and supported IDEs."
When I run the same agent profile through the .NET GitHub.Copilot.SDK (and equivalently via copilot -p), every documented alias resolves to a callable tool except todo / TodoWrite, which appears to resolve to nothing and is silently dropped (consistent with the doc's "All unrecognized tool names are ignored" rule). The net effect is that an agent whose workflow relies on todo can't create the task list — with no error surfaced — so I wasn't sure if this is intended behavior or just something the docs haven't called out yet.
I've included the evidence below in case it's useful; happy to provide more if helpful.
The documented alias table (source of truth)
From https://docs.github.com/en/copilot/reference/custom-agents-configuration#tools:
| Alias | Equivalent names | Maps to |
|---|---|---|
execute |
shell, Bash, powershell | shell tool |
read |
Read, NotebookRead | view |
edit |
Edit, MultiEdit, Write, NotebookEdit | str_replace / editor |
search |
Grep, Glob | search |
agent |
custom-agent, Task | custom-agent tools |
web |
WebSearch, WebFetch | (n/a cloud agent) |
todo |
TodoWrite | "Creates and manages structured task lists. Not supported in cloud agent today, but supported by VS Code." |
The page also says the tools property is valid "in GitHub.com, the Copilot CLI, and supported IDEs," and that "All unrecognized tool names are ignored."
What I observe in the SDK / CLI -p (for reference)
A) CLI -p, default agent — model self-reported available tools (24)
copilot -p "List every tool you currently have available, one name per line, nothing else. Include built-in tools like todo/update_plan if present. Do not call any tool." --allow-all-toolspowershell
write_powershell
read_powershell
stop_powershell
list_powershell
view
create
edit
web_fetch
report_intent
fetch_copilot_cli_documentation
skill
sql
session_store_sql
read_agent
list_agents
write_agent
grep
glob
task
azure-group_list
azure-group_resource_list
azure-kusto
azure-subscription_list
web_search
→ The documented aliases mostly resolve (read→view, edit→edit/create, search→grep/glob, agent→task, execute→powershell*, web→web_fetch/web_search), but there is no tool that todo / TodoWrite resolves to.
B) CLI -p, my custom agent (tools: ["read","search","edit","azure/*","agent","todo","threshold_query"]) — self-reported (10)
view
create
edit
azure-group_list
azure-group_resource_list
azure-kusto
azure-subscription_list
task
skill
report_intent
→ Every documented alias resolves except todo, which is dropped. (grep/glob from search also don't appear under the custom agent in -p.)
C) .NET SDK — GitHub.Copilot.BuiltInTools.Isolated
ask_user
task_complete
exit_plan_mode
task
read_agent
write_agent
list_agents
send_inbox
context_board
skill
→ Also no todo, and this list matches neither the doc's alias table nor the CLI -p set — raising a second question: what is the authoritative built-in surface for SDK sessions?
D) VS Code Copilot — todo is present
In VS Code's "Configure Tools" picker, todo is listed under Built-In: "todo — Manage and track todo items for task planning." So the alias is real and honored in at least one host, consistent with the doc's "supported by VS Code."
E) Observable effect (SDK reasoning trace)
With todo in the allowlist, the model's own chain-of-thought during an SDK run:
"I need to call the task tool to register the five workflow steps as my todo list, though I'm realizing the task tool here launches agents rather than just creating a simple checklist. … I'll take a pragmatic approach: I'll act as the orchestrator running the RCA workflow myself."
The agent correctly distinguishes task (the agent alias — which launches a sub-agent) from todo (a checklist) and gracefully skips the planning step. For completeness I also tried instructing it to "use task to build the todo list," and it (reasonably) declined to repurpose task as a checklist — so substituting task isn't a workaround.
Would any of these help?
- Clarify the docs: note which hosts honor each alias — e.g. that
todo/TodoWriteis VS Code-only today and not available in the Copilot CLI-p/ SDK hosts (in addition to cloud agent). - Or close the gap: make
todoresolvable in SDK / CLI-psessions, so the documented alias works everywhere thetoolsproperty is documented to apply. - A per-host built-in tool inventory would be lovely.
BuiltInTools.Isolatedin the .NET SDK returns 10 names that don't line up with either the CLI-pset or the doc's alias table, so I wasn't sure which list is authoritative for SDK sessions.
Thanks again for taking a look, and for all the work on the SDK — glad to help test any fix or doc change.
Environment
GitHub.Copilot.SDK1.0.1 (.NET 8 host)- Bundled Copilot CLI 1.0.61
- OS: Windows (pwsh)
- Model:
claude-opus-4.8 SessionConfig:EnableConfigDiscovery = true, custom agent selected, one custom tool registered (threshold_query), noAvailableTools/ExcludedToolsset.
Repro (minimal)
- Create a custom agent whose frontmatter
toolsuses the documented aliases, includingtodo:tools: ["read","search","edit","agent","todo"]. - Run it via the .NET SDK (
EnableConfigDiscovery=true) orcopilot -p --agent <name>; ask the model to list its available tools. - Observe: every documented alias resolves except
todo, which is silently absent — though the same alias is honored in VS Code per the doc.
Activity
github-actions commentedon Jun 12, 2026
Thanks for the detailed report and the thorough evidence — this is a real documentation gap. Here's a summary of what we've identified:
Documentation Gap Summary
What is missing or unclear
The Custom agents configuration → Tools → Tool aliases reference table does not clearly communicate per-host availability of each alias. Specifically:
todo/TodoWritehost scope is understated. The table notestodois "Not supported in cloud agent today, but supported by VS Code" — but it does not note thattodois also unavailable in the Copilot CLI (-p) and .NET/SDK sessions. The introductory text says thetoolsproperty applies "in GitHub.com, the Copilot CLI, and supported IDEs", which implies all aliases work in all those hosts. The reality is thattodosilently resolves to nothing outside VS Code.No per-host built-in tool inventory for SDK sessions.
GitHub.Copilot.BuiltInTools.Isolatedreturns 10 names (ask_user,task_complete,exit_plan_mode,task,read_agent,write_agent,list_agents,send_inbox,context_board,skill) that do not correspond to either the CLI-ptool set or the alias table. There is no documentation that explains which tool names are authoritative for SDK-hosted sessions, making it impossible to reason about whattools:filters will actually produce.Affected documentation
docs.github.com/en/copilot/reference/custom-agents-configuration#tools— alias tabletodorow should note it is VS Code only (not CLI or SDK)toolsproperty descriptiontools:filtering yieldsSuggested improvements
todois VS Code-only, whileexecute,read,edit,search,agent, andwebare available more broadly.Isolatedset), and explain how thetools:allowlist maps to those names.toolsproperty description: add a note that "All unrecognized tool names are silently ignored" applies per-host — so an alias valid in VS Code may resolve to nothing in CLI/SDK, producing no error but also no tool.The behavior you observed (silent drop, graceful model adaptation) is consistent with the documented "unrecognized names are ignored" rule — but without per-host clarity in the docs it reads as a bug rather than expected behavior. Clarifying this in the reference would set the right expectations and save others the same investigation.
NiceAsiv commentedon Jun 15, 2026
Follow-ups:
todo"missing" in .NET / SDK sessionsI dug into this and want to share findings that I
think resolve the confusion: this is not a bug, and the
.NETSDK is notactually missing the ability to manage todos. The short version is that
todois not a standalone runtime tool — it's a UI concept rendered by interactive
hosts (CLI TUI, VS Code) on top of a
todostable that the agent manipulatesthrough the
sql/session_store_sqltools. Those tools are available inSDK / headless sessions, so todos work fine; you just don't get the rendered
"Todo" panel.
1. The headless tool surface (
copilot -p, all SDKs)Asking the model to enumerate its tools in
-pmode returns 21 tools. Crucially,this is identical across
--mode interactive,--mode plan, and--plan— i.e.--mode/AgentModedoes not change which tools are registered. There is nostandalone
todo/TodoWrite/update_plan, butsqlandsession_store_sqlare both present:2. "todo" is the
sqltool operating atodostableThe repo's own
docs/features/fleet-mode.mddocuments the schema and describes "SQL todos as the shared coordination state":
When I asked an agent (in the interactive TUI) how todos work, it answered
verbatim:
3. Proof: a single
todocreation in the .NET SDKMinimal .NET SDK session (bundled CLI, headless), subscribing to
tool.execution_start, asking for a 3-item list:Assistant: "I used the sql tool (the session SQLite
todostable) to createthe three todos and set 'Write spec' to in_progress."
Verdict: used
sql= ✅, used a dedicatedtodotool = ❌.4. Proof: full multi-task lifecycle in the .NET SDK
I then drove four todos through
pending → in_progress → done, capturing everysqlcall and re-SELECTing the table after each change. All 19 calls were thesqltool — there is no separate todo tool anywhere in the trace:INSERT INTO todos … 4 rows ('pending')SELECT id,title,status …UPDATE … 'in_progress' WHERE id='write-spec'UPDATE … 'done' WHERE id='write-spec'UPDATE … 'in_progress' WHERE id='implement'UPDATE … 'done' WHERE id='implement'UPDATE … 'in_progress' WHERE id='test'UPDATE … 'done' WHERE id='test'UPDATE … 'in_progress' WHERE id='release'UPDATE … 'done' WHERE id='release'SELECT status, COUNT(*) … GROUP BY statusdone = 4Final assistant summary: "4 done."
This is exactly the state machine documented in
fleet-mode.md(
pending -> in_progress -> done), observed programmatically via the SDK's toolevents — the same underlying mechanism the TUI renders as its "Todo" panel.
5. About
BuiltInTools.IsolatedBuiltInTools.Isolated(the 10-name list) is a curated safe subset forCopilotClientMode.Emptymulti-tenant scenarios — session-only tools with nohost FS / network / cross-session access. It is intentionally not the full
SDK tool surface and shouldn't be compared against the CLI's 21-tool set or the
docs alias table. Note
sql/session_store_sqlare deliberately excluded(they touch session storage), so in Empty mode you'd add them explicitly:
Per-host summary
todotoolsql/session_store_sqlcopilot)copilot -pThe only real difference is whether the host renders a Todo panel — not whether
todos can be managed.
Suggested docs fixes
todo/TodoWriteis a host-rendered view over asql-managedtodostable, not a runtime tool registered in every host. The alias tableshould note it's surfaced by VS Code / the interactive CLI, and that in
SDK /
-pyou usesql+session_store_sql(seefleet-mode.md).--mode/AgentModedoes not change tool registration andcan't be used to "enable" todo.
BuiltInTools.Isolatedis a curated safe subset, and that todosin Empty mode require explicitly allowing
sql/session_store_sqlwithEnableSessionStore = true.Happy to share the small repro project (a .NET console app that subscribes to
tool.execution_start/tool.execution_completeand prints the SQL trace above)if useful.
rotationtv1-crypto commentedon Jun 16, 2026
Commit reviewed