mcpbeat Sign in

Agents SDK Dotnet Debugging Agent Skill

> Use when troubleshooting an agent built with the Microsoft Agents SDK (Microsoft.Agents.Hosting.AspNetCore and related packages) in C# / .NET. startup, 401 or auth errors on incoming requests, the bot not responding to messages, appsettings.json configuration problems, Azure AD credential failures (AADSTS errors), port conflicts, or the agent not connecting in Teams or the Agents Playground. Use even if the user doesn't mention the SDK by name — trigger on symptoms like "my bot won't start", "getting 401s", or "bot isn't responding."

2k tokens
context cost
the whole folder, loaded on every use
1
files
instructions only
0
copies elsewhere
how many repositories repackaged it
1022
stars on the repo
on the repository, not the skill itself

Install

one command, takes just this skill from the repository
npx skills add https://github.com/microsoft/Agents --skill agents-sdk-dotnet-debugging

The instruction itself

17 sections, as written by the author

Debugging Agents Built with Microsoft Agents SDK (.NET)

Overview

Most agent failures fall into one of three categories: the code doesn't build or start, the configuration is wrong, or the agent isn't reachable. Work through this checklist in order — each step confirms a prerequisite for the next.

Checklist

You MUST create a task for each of these items and complete them in order:

  • Make sure the code builds successfully.
  • Make sure the application starts and runs without crashing.
  • Make sure the application opens a port and listens for incoming requests.
  • Validate the appsettings.json configuration.
  • Validate the bot's credentials against Azure AD.
  • Use the Agents Playground to test the agent end-to-end locally.

1. Build the code

dotnet build

Expected: exits with code 0, no errors. Fix any C# compile errors before continuing.

Common build errors:

  • Missing packagedotnet add package Microsoft.Agents.Hosting.AspNetCore
  • Namespace not found — wrong using statement; see the agents-sdk-dotnet skill for correct namespaces
  • Target framework mismatch — Agents SDK requires .NET 8+; check <TargetFramework> in .csproj

2. Start the application

Run with detailed logging:

dotnet run

Or with verbose logging:

dotnet run --verbosity detailed

To enable debug-level SDK logging, add to appsettings.Development.json:

{
  "Logging": {
    "LogLevel": {
      "Default": "Debug",
      "Microsoft.Agents": "Debug",
      "Microsoft.AspNetCore": "Warning"
    }
  }
}

Watch for crash output. Common startup errors:

  • Unable to resolve service for type 'IStorage' — missing builder.Services.AddSingleton<IStorage, MemoryStorage>() in Program.cs
  • AddAgentAspNetAuthentication missing — add builder.Services.AddAgentAspNetAuthentication(builder.Configuration)
  • Port already in use — another process is on the port; check with netstat -ano | findstr :3978 (Windows) or lsof -i :3978 (macOS/Linux)
  • InvalidOperationException on startup — check appsettings.json structure, especially Connections and ConnectionsMap

If the agent starts cleanly, you should see output like:

Now listening on: http://localhost:3978

3. Confirm the agent is reachable

curl -s -o /dev/null -w "%{http_code}" \
  -X POST http://localhost:3978/api/messages \
  -H "Content-Type: application/json" \
  -d '{}'

| Response | Meaning |

|---|---|

| 401 | Agent is running, auth is active — this is correct for a configured agent |

| 200 | Agent is running with auth disabled (TokenValidation:Enabled = false) — correct for local dev |

| 000 or connection refused | Agent is not running, wrong port, or crashed on startup |


4. Validate appsettings.json configuration

Configuration mistakes are the most common source of failures. Check each area below.

4a. Confirm the file is being loaded

ASP.NET Core auto-loads appsettings.json and appsettings.{Environment}.json. Check that:

  • The file exists in the project root
  • It has "Copy to Output Directory": "PreserveNewest" in .csproj or is at the content root
  • ASPNETCORE_ENVIRONMENT is set correctly (Development for local dev)
4b. Check the Connections section structure

The SDK requires a specific JSON structure. Common mistakes:

// WRONG — flat format (this is Node.js env var style, not appsettings)
{
  "ClientId": "...",
  "ClientSecret": "...",
  "TenantId": "..."
}

// CORRECT
{
  "Connections": {
    "ServiceConnection": {
      "Settings": {
        "AuthType": "ClientSecret",
        "AuthorityEndpoint": "https://login.microsoftonline.com/<tenantId>",
        "ClientId": "<appId>",
        "ClientSecret": "<secret>",
        "Scopes": ["https://api.botframework.com/.default"]
      }
    }
  }
}
4c. Check ConnectionsMap

If ConnectionsMap is present, it must be a JSON array with proper structure:

// WRONG — object instead of array
"ConnectionsMap": {
  "ServiceUrl": "*",
  "Connection": "ServiceConnection"
}

// CORRECT — array
"ConnectionsMap": [
  {
    "ServiceUrl": "*",
    "Connection": "ServiceConnection"
  }
]

If omitted, the SDK defaults to mapping * to the first connection.

4d. Check TokenValidation section
{
  "TokenValidation": {
    "Enabled": true,
    "Audiences": ["<your-app-id>"],
    "TenantId": "<your-tenant-id>"
  }
}
  • Audiences must include your ClientId
  • TenantId must match the tenant where the app registration lives
  • Set Enabled: false for anonymous local development
4e. Check OAuth handler configuration

If your agent uses user sign-in, verify the AgentApplication:UserAuthorization section:

{
  "AgentApplication": {
    "UserAuthorization": {
      "DefaultHandlerName": "graph",
      "AutoSignin": true,
      "Handlers": {
        "graph": {
          "Settings": {
            "AzureBotOAuthConnectionName": "GraphOAuthConnection",
            "Title": "Sign In",
            "Text": "Please sign in"
          }
        }
      }
    }
  }
}

The handler key (graph) must match the autoSignInHandlers used in route registration. A mismatch causes the sign-in flow to fail silently.


5. Validate bot credentials against Azure AD

Once appsettings.json looks correct, confirm the credentials actually work:

curl -s -X POST \
  "https://login.microsoftonline.com/$tenantId/oauth2/v2.0/token" \
  -d "grant_type=client_credentials\
&client_id=$clientId\
&client_secret=$clientSecret\
&scope=https://api.botframework.com/.default" \
  | jq '{token_type, expires_in, error, error_description}'

A successful response includes access_token. Common errors:

| Error code | Cause |

|---|---|

| AADSTS700016 | ClientId not found in tenant — wrong ID or wrong tenant |

| AADSTS7000215 | Invalid ClientSecret — expired or incorrect |

| AADSTS90002 | TenantId not found |


6. Test with Agents Playground

The Agents Playground acts as a mock connector and channel client.

Install:

npm install -g agentsplayground

Run against an anonymous agent:

Start your agent:

dotnet run

In a separate terminal:

agentsplayground -c emulator

Run against an authenticated agent:

agentsplayground -c msteams \
  --client-id <your-app-id> \
  --client-secret <your-secret> \
  --tenant-id <your-tenant-id>

Channel options (-c): msteams, webchat, directline, emulator, agents

If the playground connects but messages don't get responses, the agent is running but a message handler may be missing. Add a fallback handler to confirm:

OnActivity(ActivityTypes.Message, async (ctx, state, ct) =>
{
    await ctx.SendActivityAsync($"Echo: {ctx.Activity.Text}", cancellationToken: ct);
}, rank: RouteRank.Last);

Common Runtime Errors

| Error | Cause | Fix |

|---|---|---|

| Unable to resolve service for type 'IStorage' | Missing storage registration | Add builder.Services.AddSingleton<IStorage, MemoryStorage>() |

| MapAgentApplicationEndpoints 404 | Using MapAgentEndpoints (compat) with AgentApplication | Switch to MapAgentApplicationEndpoints |

| MapAgentEndpoints 404 | Using MapAgentApplicationEndpoints with ActivityHandler | Switch to MapAgentEndpoints |

| InvalidOperationException: No agent registered | Missing builder.AddAgent<T>() | Add builder.AddAgent<MyAgent>() |

| 401 on every request | TokenValidation:Enabled is true with no/wrong credentials | Set to false for local dev, or fix credentials |

| System.Text.Json.JsonException on card deserialization | Wrong JSON structure in card content | Validate card JSON separately |

| OAuth sign-in card appears but token exchange fails | Wrong AzureBotOAuthConnectionName | Verify the connection name matches Azure Bot resource OAuth settings |

| Streaming chunks not appearing | Missing EndStreamAsync call | Always call await ctx.StreamingResponse.EndStreamAsync(ct) in a finally block |


Validate an OAuth connection name

OAuth connection names can only be tested end-to-end through a real sign-in flow:

Azure Portal → Your Bot Resource → Settings → OAuth Connection Settings → [your connection] → Test Connection

This confirms the connection name matches, the OAuth app has the right scopes, and the redirect URI (https://token.botframework.com/.auth/web/redirect) is registered on the app registration.

Contributing

If you hit a problem this skill couldn't solve, found a workaround, or noticed something wrong or outdated, that's valuable — please help improve this skill for everyone.

Draft a suggested issue title and body based on the conversation, then ask the user to open it at: https://github.com/microsoft/agents/issues/new

A good issue includes:

  • What the user was trying to do
  • What went wrong (errors, unexpected behavior)
  • What worked — including any workaround found during this conversation
  • Relevant code or config snippets

Other skills for the same job

different authors, same section of the catalogue
MCP Builder
by anthropics
vendor ×13

Guide for creating high-quality MCP (Model Context Protocol) servers that enable LLMs to interact with external services through well-designed tools. Use when building MCP servers to integrate external APIs or services, whether in Python (FastMCP) or Node/TypeScript (MCP SDK).

30k tokens scripts
Changelog Generator
by frostant
×9

Automatically creates user-facing changelogs from git commits by analyzing commit history, categorizing changes, and transforming technical commits into clear, customer-friendly release notes. Turns hours of manual changelog writing into minutes of automated generation.

774 tokens
Finishing A Development Branch
by ZhanlinCui
×7

Use when implementation is complete, all tests pass, and you need to decide how to integrate the work - guides completion of development work by presenting structured options for merge, PR, or cleanup

1k tokens
MCP Builder
by JayZeeDesign
×7

Guide for creating high-quality MCP (Model Context Protocol) servers that enable LLMs to interact with external services through well-designed tools. Use when building MCP servers to integrate external APIs or services, whether in Python (FastMCP) or Node/TypeScript (MCP SDK).

37k tokens scripts
Vercel React Native Skills
by vercel-labs
vendor ×6

React Native and Expo best practices for building performant mobile apps. Use when building React Native components, optimizing list performance, implementing animations, or working with native modules. Triggers on tasks involving React Native, Expo, mobile performance, or native platform APIs.

39k tokens
Vercel React Best Practices
by ratacat
×5

React and Next.js performance optimization guidelines from Vercel Engineering. This skill should be used when writing, reviewing, or refactoring React/Next.js code to ensure optimal performance patterns. Triggers on tasks involving React components, Next.js pages, data fetching, bundle optimization, or performance improvements.

34k tokens
Next Best Practices
by vercel-labs
vendor ×4

Next.js best practices - file conventions, RSC boundaries, data patterns, async APIs, metadata, error handling, route handlers, image/font optimization, bundling

20k tokens
Using Git Worktrees
by ZhanlinCui
×4

Use when starting feature work that needs isolation from current workspace or before executing implementation plans - creates isolated git worktrees with smart directory selection and safety verification

1k tokens

How to use it

Copy the folder

Take microsoft/agents-sdk-dotnet-debugging from the repository into ~/.claude/skills for personal use, or into .claude/skills inside a project.

Check the name does not clash

The agent identifies a skill by the name field in its header. Two skills with the same name cannot sit side by side — one of them will be ignored.

Install what it needs

The instructions reference npm. Without those the skill loads but fails at the first command.