# Debugging guide This guide covers common issues and debugging techniques for the Copilot SDK across all supported languages. ## Table of contents * [Enable Debug Logging](#enable-debug-logging) * [Common Issues](#common-issues) * [MCP Server Debugging](#mcp-server-debugging) * [Connection Issues](#connection-issues) * [Tool Execution Issues](#tool-execution-issues) * [Platform-Specific Issues](#platform-specific-issues) ## Enable debug logging The first step in debugging is enabling verbose logging to see what's happening under the hood.
Node.js / TypeScript ```typescript import { CopilotClient } from "@github/copilot-sdk"; const client = new CopilotClient({ logLevel: "debug", // Options: "none", "error", "warning", "info", "debug", "all" }); ```
Python ```python from copilot import CopilotClient client = CopilotClient(log_level="debug") ```
Go ```go package main import copilot "github.com/github/copilot-sdk/go" func main() { client := copilot.NewClient(&copilot.ClientOptions{ LogLevel: "debug", }) _ = client } ``` ```go import copilot "github.com/github/copilot-sdk/go" client := copilot.NewClient(&copilot.ClientOptions{ LogLevel: "debug", }) ```
.NET ```csharp using GitHub.Copilot; using Microsoft.Extensions.Logging; // Using ILogger var loggerFactory = LoggerFactory.Create(builder => { builder.SetMinimumLevel(LogLevel.Debug); builder.AddConsole(); }); var client = new CopilotClient(new CopilotClientOptions { LogLevel = "debug", Logger = loggerFactory.CreateLogger() }); ```
Java ```java import com.github.copilot.CopilotClient; import com.github.copilot.rpc.*; var client = new CopilotClient(new CopilotClientOptions() .setLogLevel("debug") ); ```
### Log directory The CLI writes logs to a directory. You can specify a custom location:
Node.js / TypeScript ```typescript const client = new CopilotClient({ cliArgs: ["--log-dir", "/path/to/logs"], }); ```
Python ```python # The Python SDK does not currently support passing extra CLI arguments. # Logs are written to the default location or can be configured via # the CLI when running in server mode. ``` > [!NOTE] > Python SDK logging configuration is limited. For advanced logging, run the CLI manually with `--log-dir` and connect via `RuntimeConnection.for_uri(...)`.
Go ```go package main import copilot "github.com/github/copilot-sdk/go" func main() { client := copilot.NewClient(&copilot.ClientOptions{ Connection: copilot.StdioConnection{ Args: []string{"--log-dir", "/path/to/logs"}, }, }) _ = client } ``` ```go client := copilot.NewClient(&copilot.ClientOptions{ Connection: copilot.StdioConnection{ Args: []string{"--log-dir", "/path/to/logs"}, }, }) ```
.NET ```csharp var client = new CopilotClient(new CopilotClientOptions { Connection = RuntimeConnection.ForStdio(args: new[] { "--log-dir", "/path/to/logs" }) }); ```
Java ```java // The Java SDK does not currently support passing extra CLI arguments. // For custom log directories, run the CLI manually with --log-dir // and connect via cliUrl. ```
## Common issues ### "CLI not found" / "Copilot: command not found" **Cause:** The Copilot CLI is not installed or not in PATH. **Solution:** 1. Install the CLI: [Installation guide](https://docs.github.com/en/copilot/how-tos/set-up/install-copilot-cli) 1. Verify installation: ```bash copilot --version ``` 1. Or specify the full path:
Node.js ```typescript const client = new CopilotClient({ cliPath: "/usr/local/bin/copilot", }); ```
Python ```python client = CopilotClient({"cli_path": "/usr/local/bin/copilot"}) ```
Go ```go client := copilot.NewClient(&copilot.ClientOptions{ Connection: copilot.StdioConnection{Path: "/usr/local/bin/copilot"}, }) ```
.NET ```csharp var client = new CopilotClient(new CopilotClientOptions { CliPath = "/usr/local/bin/copilot" }); ```
Java ```java var client = new CopilotClient(new CopilotClientOptions() .setCliPath("/usr/local/bin/copilot") ); ```
### "Not authenticated" **Cause:** The CLI is not authenticated with GitHub. **Solution:** 1. Authenticate the CLI: ```bash copilot auth login ``` 1. Or provide a token programmatically:
Node.js ```typescript const client = new CopilotClient({ gitHubToken: process.env.GITHUB_TOKEN, }); ```
Python ```python import os client = CopilotClient({"github_token": os.environ.get("GITHUB_TOKEN")}) ```
Go ```go client := copilot.NewClient(&copilot.ClientOptions{ GitHubToken: os.Getenv("GITHUB_TOKEN"), }) ```
.NET ```csharp var client = new CopilotClient(new CopilotClientOptions { GitHubToken = Environment.GetEnvironmentVariable("GITHUB_TOKEN") }); ```
Java ```java var client = new CopilotClient(new CopilotClientOptions() .setGitHubToken(System.getenv("GITHUB_TOKEN")) ); ```
### "Session not found" **Cause:** Attempting to use a session that was destroyed or doesn't exist. **Solution:** 1. Ensure you're not calling methods after `disconnect()`: ```typescript await session.disconnect(); // Don't use session after this! ``` 1. For resuming sessions, verify the session ID exists: ```typescript const sessions = await client.listSessions(); console.log("Available sessions:", sessions); ``` ### "Connection refused" / "ECONNREFUSED" **Cause:** The CLI server process crashed or failed to start. **Solution:** 1. Check if the CLI runs correctly standalone: ```bash copilot --server --stdio ``` 1. Check for port conflicts if using TCP mode: ```typescript const client = new CopilotClient({ useStdio: false, port: 0, // Use random available port }); ``` ## MCP server debugging MCP (Model Context Protocol) servers can be tricky to debug. For comprehensive MCP debugging guidance, see the dedicated **[MCP Debugging Guide](./mcp-debugging.md)**. ### Quick MCP checklist * [ ] MCP server executable exists and runs independently * [ ] Command path is correct (use absolute paths) * [ ] Tools are enabled: `tools: ["*"]` * [ ] Server responds to `initialize` request correctly * [ ] Working directory (`cwd`) is set if needed ### Test your MCP server Before integrating with the SDK, verify your MCP server works: ```bash echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"1.0"}}}' | /path/to/your/mcp-server ``` See [MCP Debugging Guide](./mcp-debugging.md) for detailed troubleshooting. ## Connection issues ### stdio vs TCP mode The SDK supports two transport modes: | Mode | Description | Use Case | |------|-------------|----------| | **Stdio** (default) | CLI runs as subprocess, communicates via pipes | Local development, single process | | **TCP** | CLI runs separately, communicates via TCP socket | Multiple clients, remote CLI | **Stdio mode (default):** ```typescript const client = new CopilotClient({ useStdio: true, // This is the default }); ``` **TCP mode:** ```typescript const client = new CopilotClient({ useStdio: false, port: 8080, // Or 0 for random port }); ``` **Connect to existing server:** ```typescript const client = new CopilotClient({ cliUrl: "localhost:8080", // Connect to running server }); ``` ### Diagnosing connection failures 1. **Check client state:** ```typescript console.log("Connection state:", client.getState()); // Should be "connected" after start() ``` 1. **Listen for state changes:** ```typescript client.on("stateChange", (state) => { console.log("State changed to:", state); }); ``` 1. **Verify CLI process is running:** ```bash # Check for copilot processes ps aux | grep copilot ``` ## Tool execution issues ### Custom tool not being called 1. **Verify tool registration:** ```typescript const session = await client.createSession({ tools: [myTool], }); // Check registered tools console.log("Registered tools:", session.getTools?.()); ``` 1. **Check tool schema is valid JSON Schema:** ```typescript const myTool = { name: "get_weather", description: "Get weather for a location", parameters: { type: "object", properties: { location: { type: "string", description: "City name" }, }, required: ["location"], }, handler: async (args) => { return { temperature: 72 }; }, }; ``` 1. **Ensure handler returns valid result:** ```typescript handler: async (args) => { // Must return something JSON-serializable return { success: true, data: "result" }; // Don't return undefined or non-serializable objects } ``` ### Tool errors not surfacing Subscribe to error events: ```typescript session.on("tool.execution_error", (event) => { console.error("Tool error:", event.data); }); session.on("error", (event) => { console.error("Session error:", event.data); }); ``` ## Platform-specific issues ### Windows 1. **Path separators:** Use raw strings or forward slashes: ```csharp CliPath = @"C:\Program Files\GitHub\copilot.exe" // or CliPath = "C:/Program Files/GitHub/copilot.exe" ``` 1. **PATHEXT resolution:** The SDK handles this automatically, but if issues persist: ```csharp // Explicitly specify .exe Command = "myserver.exe" // Not just "myserver" ``` 1. **Console encoding:** Ensure UTF-8 for proper JSON handling: ```csharp Console.OutputEncoding = System.Text.Encoding.UTF8; ``` ### macOS 1. **Gatekeeper issues:** If CLI is blocked: ```bash xattr -d com.apple.quarantine /path/to/copilot ``` 1. **PATH issues in GUI apps:** GUI applications may not inherit shell PATH: ```typescript const client = new CopilotClient({ cliPath: "/opt/homebrew/bin/copilot", // Full path }); ``` ### Linux 1. **Permission issues:** ```bash chmod +x /path/to/copilot ``` 1. **Missing libraries:** Check for required shared libraries: ```bash ldd /path/to/copilot ``` ## Getting help If you're still stuck: 1. **Collect debug information:** * SDK version * CLI version (`copilot --version`) * Operating system * Debug logs * Minimal reproduction code 1. **Search existing issues:** [GitHub Issues](https://github.com/github/copilot-sdk/issues) 1. **Open a new issue** with the collected information ## See also * [Getting Started Guide](../getting-started.md) * [MCP Overview](../features/mcp.md) - MCP configuration and setup * [MCP Debugging Guide](./mcp-debugging.md) - Detailed MCP troubleshooting * [API Reference](https://github.com/github/copilot-sdk)