{"id":"2cdaa16d-b7e3-4d8e-ad58-13a67ed817be","shortId":"2tmsL4","kind":"skill","title":"m365-agents-dotnet","tagline":"Microsoft 365 Agents SDK for .NET. Build multichannel agents for Teams/M365/Copilot Studio with ASP.NET Core hosting, AgentApplication routing, and MSAL-based auth.","description":"# Microsoft 365 Agents SDK (.NET)\n\n## Overview\nBuild enterprise agents for Microsoft 365, Teams, and Copilot Studio using the Microsoft.Agents SDK with ASP.NET Core hosting, agent routing, and MSAL-based authentication.\n\n## Before implementation\n- Use the microsoft-docs MCP to verify the latest APIs for AddAgent, AgentApplication, and authentication options.\n- Confirm package versions in NuGet for the Microsoft.Agents.* packages you plan to use.\n\n## Installation\n\n```bash\ndotnet add package Microsoft.Agents.Hosting.AspNetCore\ndotnet add package Microsoft.Agents.Authentication.Msal\ndotnet add package Microsoft.Agents.Storage\ndotnet add package Microsoft.Agents.CopilotStudio.Client\ndotnet add package Microsoft.Identity.Client.Extensions.Msal\n```\n\n## Configuration (appsettings.json)\n\n```json\n{\n  \"TokenValidation\": {\n    \"Enabled\": true,\n    \"Audiences\": [\n      \"{{ClientId}}\"\n    ],\n    \"TenantId\": \"{{TenantId}}\"\n  },\n  \"AgentApplication\": {\n    \"StartTypingTimer\": false,\n    \"RemoveRecipientMention\": false,\n    \"NormalizeMentions\": false\n  },\n  \"Connections\": {\n    \"ServiceConnection\": {\n      \"Settings\": {\n        \"AuthType\": \"ClientSecret\",\n        \"ClientId\": \"{{ClientId}}\",\n        \"ClientSecret\": \"{{ClientSecret}}\",\n        \"AuthorityEndpoint\": \"https://login.microsoftonline.com/{{TenantId}}\",\n        \"Scopes\": [\n          \"https://api.botframework.com/.default\"\n        ]\n      }\n    }\n  },\n  \"ConnectionsMap\": [\n    {\n      \"ServiceUrl\": \"*\",\n      \"Connection\": \"ServiceConnection\"\n    }\n  ],\n  \"CopilotStudioClientSettings\": {\n    \"DirectConnectUrl\": \"\",\n    \"EnvironmentId\": \"\",\n    \"SchemaName\": \"\",\n    \"TenantId\": \"\",\n    \"AppClientId\": \"\",\n    \"AppClientSecret\": \"\"\n  }\n}\n```\n\n## Core Workflow: ASP.NET Core agent host\n\n```csharp\nusing Microsoft.Agents.Builder;\nusing Microsoft.Agents.Hosting.AspNetCore;\nusing Microsoft.Agents.Storage;\nusing Microsoft.AspNetCore.Builder;\nusing Microsoft.AspNetCore.Http;\nusing Microsoft.Extensions.DependencyInjection;\nusing Microsoft.Extensions.Hosting;\n\nvar builder = WebApplication.CreateBuilder(args);\n\nbuilder.Services.AddHttpClient();\nbuilder.AddAgentApplicationOptions();\nbuilder.AddAgent<MyAgent>();\nbuilder.Services.AddSingleton<IStorage, MemoryStorage>();\n\nbuilder.Services.AddControllers();\nbuilder.Services.AddAgentAspNetAuthentication(builder.Configuration);\n\nWebApplication app = builder.Build();\n\napp.UseAuthentication();\napp.UseAuthorization();\n\napp.MapGet(\"/\", () => \"Microsoft Agents SDK Sample\");\n\nvar incomingRoute = app.MapPost(\"/api/messages\",\n    async (HttpRequest request, HttpResponse response, IAgentHttpAdapter adapter, IAgent agent, CancellationToken ct) =>\n    {\n        await adapter.ProcessAsync(request, response, agent, ct);\n    });\n\nif (!app.Environment.IsDevelopment())\n{\n    incomingRoute.RequireAuthorization();\n}\nelse\n{\n    app.Urls.Add(\"http://localhost:3978\");\n}\n\napp.Run();\n```\n\n## AgentApplication routing\n\n```csharp\nusing Microsoft.Agents.Builder;\nusing Microsoft.Agents.Builder.App;\nusing Microsoft.Agents.Builder.State;\nusing Microsoft.Agents.Core.Models;\nusing System;\nusing System.Threading;\nusing System.Threading.Tasks;\n\npublic sealed class MyAgent : AgentApplication\n{\n    public MyAgent(AgentApplicationOptions options) : base(options)\n    {\n        OnConversationUpdate(ConversationUpdateEvents.MembersAdded, WelcomeAsync);\n        OnActivity(ActivityTypes.Message, OnMessageAsync, rank: RouteRank.Last);\n        OnTurnError(OnTurnErrorAsync);\n    }\n\n    private static async Task WelcomeAsync(ITurnContext turnContext, ITurnState turnState, CancellationToken ct)\n    {\n        foreach (ChannelAccount member in turnContext.Activity.MembersAdded)\n        {\n            if (member.Id != turnContext.Activity.Recipient.Id)\n            {\n                await turnContext.SendActivityAsync(\n                    MessageFactory.Text(\"Welcome to the agent.\"),\n                    ct);\n            }\n        }\n    }\n\n    private static async Task OnMessageAsync(ITurnContext turnContext, ITurnState turnState, CancellationToken ct)\n    {\n        await turnContext.SendActivityAsync(\n            MessageFactory.Text($\"You said: {turnContext.Activity.Text}\"),\n            ct);\n    }\n\n    private static async Task OnTurnErrorAsync(\n        ITurnContext turnContext,\n        ITurnState turnState,\n        Exception exception,\n        CancellationToken ct)\n    {\n        await turnState.Conversation.DeleteStateAsync(turnContext, ct);\n\n        var endOfConversation = Activity.CreateEndOfConversationActivity();\n        endOfConversation.Code = EndOfConversationCodes.Error;\n        endOfConversation.Text = exception.Message;\n        await turnContext.SendActivityAsync(endOfConversation, ct);\n    }\n}\n```\n\n## Copilot Studio direct-to-engine client\n\n### DelegatingHandler for token acquisition (interactive flow)\n\n```csharp\nusing System.Net.Http.Headers;\nusing Microsoft.Agents.CopilotStudio.Client;\nusing Microsoft.Identity.Client;\n\ninternal sealed class AddTokenHandler : DelegatingHandler\n{\n    private readonly SampleConnectionSettings _settings;\n\n    public AddTokenHandler(SampleConnectionSettings settings) : base(new HttpClientHandler())\n    {\n        _settings = settings;\n    }\n\n    protected override async Task<HttpResponseMessage> SendAsync(\n        HttpRequestMessage request,\n        CancellationToken cancellationToken)\n    {\n        if (request.Headers.Authorization is null)\n        {\n            string[] scopes = [CopilotClient.ScopeFromSettings(_settings)];\n\n            IPublicClientApplication app = PublicClientApplicationBuilder\n                .Create(_settings.AppClientId)\n                .WithAuthority(AadAuthorityAudience.AzureAdMyOrg)\n                .WithTenantId(_settings.TenantId)\n                .WithRedirectUri(\"http://localhost\")\n                .Build();\n\n            AuthenticationResult authResponse;\n            try\n            {\n                var account = (await app.GetAccountsAsync()).FirstOrDefault();\n                authResponse = await app.AcquireTokenSilent(scopes, account).ExecuteAsync(cancellationToken);\n            }\n            catch (MsalUiRequiredException)\n            {\n                authResponse = await app.AcquireTokenInteractive(scopes).ExecuteAsync(cancellationToken);\n            }\n\n            request.Headers.Authorization = new AuthenticationHeaderValue(\"Bearer\", authResponse.AccessToken);\n        }\n\n        return await base.SendAsync(request, cancellationToken);\n    }\n}\n```\n\n### Console host with CopilotClient\n\n```csharp\nusing Microsoft.Agents.CopilotStudio.Client;\nusing Microsoft.Extensions.DependencyInjection;\nusing Microsoft.Extensions.Hosting;\n\nHostApplicationBuilder builder = Host.CreateApplicationBuilder(args);\n\nvar settings = new SampleConnectionSettings(\n    builder.Configuration.GetSection(\"CopilotStudioClientSettings\"));\n\nbuilder.Services.AddHttpClient(\"mcs\").ConfigurePrimaryHttpMessageHandler(() =>\n{\n    return new AddTokenHandler(settings);\n});\n\nbuilder.Services\n    .AddSingleton(settings)\n    .AddTransient<CopilotClient>(sp =>\n    {\n        var logger = sp.GetRequiredService<ILoggerFactory>().CreateLogger<CopilotClient>();\n        return new CopilotClient(settings, sp.GetRequiredService<IHttpClientFactory>(), logger, \"mcs\");\n    });\n\nIHost host = builder.Build();\nvar client = host.Services.GetRequiredService<CopilotClient>();\n\nawait foreach (var activity in client.StartConversationAsync(emitStartConversationEvent: true))\n{\n    Console.WriteLine(activity.Type);\n}\n\nawait foreach (var activity in client.AskQuestionAsync(\"Hello!\", null))\n{\n    Console.WriteLine(activity.Type);\n}\n```\n\n## Best Practices\n\n1. Use AgentApplication subclasses to centralize routing and error handling.\n2. Use MemoryStorage only for development; use persisted storage in production.\n3. Enable TokenValidation in production and require authorization on /api/messages.\n4. Keep auth secrets in configuration providers (Key Vault, managed identity, env vars).\n5. Reuse HttpClient from IHttpClientFactory and cache MSAL tokens.\n6. Prefer async handlers and pass CancellationToken to SDK calls.\n\n## Reference Files\n\n| File | Contents |\n| --- | --- |\n| references/acceptance-criteria.md | Import paths, hosting pipeline, Copilot Studio client patterns, anti-patterns |\n\n## Reference Links\n\n| Resource | URL |\n| --- | --- |\n| Microsoft 365 Agents SDK | https://learn.microsoft.com/en-us/microsoft-365/agents-sdk/ |\n| AddAgent API | https://learn.microsoft.com/en-us/dotnet/api/microsoft.agents.hosting.aspnetcore.servicecollectionextensions.addagent?view=m365-agents-sdk |\n| AgentApplication API | https://learn.microsoft.com/en-us/dotnet/api/microsoft.agents.builder.app.agentapplication?view=m365-agents-sdk |\n| Auth configuration options | https://learn.microsoft.com/en-us/microsoft-365/agents-sdk/microsoft-authentication-library-configuration-options |\n| Copilot Studio integration | https://learn.microsoft.com/en-us/microsoft-365/agents-sdk/integrate-with-mcs |\n| GitHub samples | https://github.com/microsoft/agents |\n\n## When to Use\nThis skill is applicable to execute the workflow or actions described in the overview.\n\n## Limitations\n- Use this skill only when the task clearly matches the scope described above.\n- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.\n- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.","tags":["m365","agents","dotnet","antigravity","awesome","skills","sickn33","agent-skills","agentic-skills","ai-agent-skills","ai-agents","ai-coding"],"capabilities":["skill","source-sickn33","skill-m365-agents-dotnet","topic-agent-skills","topic-agentic-skills","topic-ai-agent-skills","topic-ai-agents","topic-ai-coding","topic-ai-workflows","topic-antigravity","topic-antigravity-skills","topic-claude-code","topic-claude-code-skills","topic-codex-cli","topic-codex-skills"],"categories":["antigravity-awesome-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/sickn33/antigravity-awesome-skills/m365-agents-dotnet","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add sickn33/antigravity-awesome-skills","source_repo":"https://github.com/sickn33/antigravity-awesome-skills","install_from":"skills.sh"}},"qualityScore":"0.700","qualityRationale":"deterministic score 0.70 from registry signals: · indexed on github topic:agent-skills · 34726 github stars · SKILL.md body (9,440 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-04-23T12:51:11.549Z","embedding":null,"createdAt":"2026-04-18T21:40:13.507Z","updatedAt":"2026-04-23T12:51:11.549Z","lastSeenAt":"2026-04-23T12:51:11.549Z","tsv":"'/.default':145 '/api/messages':204,543 '/en-us/dotnet/api/microsoft.agents.builder.app.agentapplication?view=m365-agents-sdk':612 '/en-us/dotnet/api/microsoft.agents.hosting.aspnetcore.servicecollectionextensions.addagent?view=m365-agents-sdk':607 '/en-us/microsoft-365/agents-sdk/':602 '/en-us/microsoft-365/agents-sdk/integrate-with-mcs':624 '/en-us/microsoft-365/agents-sdk/microsoft-authentication-library-configuration-options':618 '/microsoft/agents':629 '1':513 '2':523 '3':534 '365':6,29,39,597 '3978':228 '4':544 '5':557 '6':566 'aadauthorityaudience.azureadmyorg':402 'account':412,420 'acquisit':351 'action':642 'activ':494,504 'activity.createendofconversationactivity':332 'activity.type':500,510 'activitytypes.message':262 'adapt':211 'adapter.processasync':217 'add':94,98,102,106,110 'addag':73,603 'addsingleton':470 'addtokenhandl':364,371,467 'addtransi':472 'agent':3,7,13,30,36,52,161,198,213,220,293,598 'agentappl':21,74,123,230,251,515,608 'agentapplicationopt':254 'anti':590 'anti-pattern':589 'api':71,604,609 'api.botframework.com':144 'api.botframework.com/.default':143 'app':192,397 'app.acquiretokeninteractive':427 'app.acquiretokensilent':418 'app.environment.isdevelopment':223 'app.getaccountsasync':414 'app.mapget':196 'app.mappost':203 'app.run':229 'app.urls.add':226 'app.useauthentication':194 'app.useauthorization':195 'appclientid':155 'appclientsecret':156 'applic':636 'appsettings.json':114 'arg':181,455 'ask':680 'asp.net':18,49,159 'async':205,270,297,315,381,568 'audienc':119 'auth':27,546,613 'authent':58,76 'authenticationheadervalu':433 'authenticationresult':408 'author':541 'authorityendpoint':139 'authrespons':409,416,425 'authresponse.accesstoken':435 'authtyp':133 'await':216,287,306,326,337,413,417,426,437,491,501 'base':26,57,256,374 'base.sendasync':438 'bash':92 'bearer':434 'best':511 'boundari':688 'build':11,34,407 'builder':179,453 'builder.addagent':184 'builder.addagentapplicationoptions':183 'builder.build':193,487 'builder.configuration':190 'builder.configuration.getsection':460 'builder.services':469 'builder.services.addagentaspnetauthentication':189 'builder.services.addcontrollers':188 'builder.services.addhttpclient':182,462 'builder.services.addsingleton':185 'cach':563 'call':575 'cancellationtoken':214,277,304,324,386,387,422,430,440,572 'catch':423 'central':518 'channelaccount':280 'clarif':682 'class':249,363 'clear':655 'client':347,489,587 'client.askquestionasync':506 'client.startconversationasync':496 'clientid':120,135,136 'clientsecret':134,137,138 'configur':113,549,614 'configureprimaryhttpmessagehandl':464 'confirm':78 'connect':130,148 'connectionsmap':146 'consol':441 'console.writeline':499,509 'content':579 'conversationupdateevents.membersadded':259 'copilot':42,341,585,619 'copilotcli':444,480 'copilotclient.scopefromsettings':394 'copilotstudioclientset':150,461 'core':19,50,157,160 'creat':399 'createlogg':477 'criteria':691 'csharp':163,232,354,445 'ct':215,221,278,294,305,312,325,329,340 'delegatinghandl':348,365 'describ':643,659 'develop':528 'direct':344 'direct-to-engin':343 'directconnecturl':151 'doc':65 'dotnet':4,93,97,101,105,109 'els':225 'emitstartconversationev':497 'enabl':117,535 'endofconvers':331,339 'endofconversation.code':333 'endofconversation.text':335 'endofconversationcodes.error':334 'engin':346 'enterpris':35 'env':555 'environ':671 'environment-specif':670 'environmentid':152 'error':521 'except':322,323 'exception.message':336 'execut':638 'executeasync':421,429 'expert':676 'fals':125,127,129 'file':577,578 'firstordefault':415 'flow':353 'foreach':279,492,502 'github':625 'github.com':628 'github.com/microsoft/agents':627 'handl':522 'handler':569 'hello':507 'host':20,51,162,442,486,583 'host.createapplicationbuilder':454 'host.services.getrequiredservice':490 'hostapplicationbuild':452 'httpclient':559 'httpclienthandl':376 'httprequest':206 'httprequestmessag':384 'httprespons':208 'iagent':212 'iagenthttpadapt':210 'ident':554 'ihost':485 'ihttpclientfactori':561 'implement':60 'import':581 'incomingrout':202 'incomingroute.requireauthorization':224 'input':685 'instal':91 'integr':621 'interact':352 'intern':361 'ipublicclientappl':396 'istorag':186 'iturncontext':273,300,318 'iturnst':275,302,320 'json':115 'keep':545 'key':551 'latest':70 'learn.microsoft.com':601,606,611,617,623 'learn.microsoft.com/en-us/dotnet/api/microsoft.agents.builder.app.agentapplication?view=m365-agents-sdk':610 'learn.microsoft.com/en-us/dotnet/api/microsoft.agents.hosting.aspnetcore.servicecollectionextensions.addagent?view=m365-agents-sdk':605 'learn.microsoft.com/en-us/microsoft-365/agents-sdk/':600 'learn.microsoft.com/en-us/microsoft-365/agents-sdk/integrate-with-mcs':622 'learn.microsoft.com/en-us/microsoft-365/agents-sdk/microsoft-authentication-library-configuration-options':616 'limit':647 'link':593 'localhost':227,406 'logger':475,483 'login.microsoftonline.com':140 'm365':2 'm365-agents-dotnet':1 'manag':553 'match':656 'mcp':66 'mcs':463,484 'member':281 'member.id':285 'memorystorag':187,525 'messagefactory.text':289,308 'microsoft':5,28,38,64,197,596 'microsoft-doc':63 'microsoft.agents':46,85 'microsoft.agents.authentication.msal':100 'microsoft.agents.builder':165,234 'microsoft.agents.builder.app':236 'microsoft.agents.builder.state':238 'microsoft.agents.copilotstudio.client':108,358,447 'microsoft.agents.core.models':240 'microsoft.agents.hosting.aspnetcore':96,167 'microsoft.agents.storage':104,169 'microsoft.aspnetcore.builder':171 'microsoft.aspnetcore.http':173 'microsoft.extensions.dependencyinjection':175,449 'microsoft.extensions.hosting':177,451 'microsoft.identity.client':360 'microsoft.identity.client.extensions.msal':112 'miss':693 'msal':25,56,564 'msal-bas':24,55 'msaluirequiredexcept':424 'multichannel':12 'myagent':250,253 'net':10,32 'new':375,432,458,466,479 'normalizement':128 'nuget':82 'null':391,508 'onact':261 'onconversationupd':258 'onmessageasync':263,299 'onturnerror':266 'onturnerrorasync':267,317 'option':77,255,257,615 'output':665 'overrid':380 'overview':33,646 'packag':79,86,95,99,103,107,111 'pass':571 'path':582 'pattern':588,591 'permiss':686 'persist':530 'pipelin':584 'plan':88 'practic':512 'prefer':567 'privat':268,295,313,366 'product':533,538 'protect':379 'provid':550 'public':247,252,370 'publicclientapplicationbuild':398 'rank':264 'readon':367 'refer':576,592 'references/acceptance-criteria.md':580 'removerecipientment':126 'request':207,218,385,439 'request.headers.authorization':389,431 'requir':540,684 'resourc':594 'respons':209,219 'return':436,465,478 'reus':558 'review':677 'rout':22,53,231,519 'routerank.last':265 'safeti':687 'said':310 'sampl':200,626 'sampleconnectionset':368,372,459 'schemanam':153 'scope':142,393,419,428,658 'sdk':8,31,47,199,574,599 'seal':248,362 'secret':547 'sendasync':383 'serviceconnect':131,149 'serviceurl':147 'set':132,369,373,377,378,395,457,468,471,481 'settings.appclientid':400 'settings.tenantid':404 'skill':634,650 'skill-m365-agents-dotnet' 'source-sickn33' 'sp':473 'sp.getrequiredservice':476,482 'specif':672 'starttypingtim':124 'static':269,296,314 'stop':678 'storag':531 'string':392 'studio':16,43,342,586,620 'subclass':516 'substitut':668 'success':690 'system':242 'system.net.http.headers':356 'system.threading':244 'system.threading.tasks':246 'task':271,298,316,382,654 'team':40 'teams/m365/copilot':15 'tenantid':121,122,141,154 'test':674 'token':350,565 'tokenvalid':116,536 'topic-agent-skills' 'topic-agentic-skills' 'topic-ai-agent-skills' 'topic-ai-agents' 'topic-ai-coding' 'topic-ai-workflows' 'topic-antigravity' 'topic-antigravity-skills' 'topic-claude-code' 'topic-claude-code-skills' 'topic-codex-cli' 'topic-codex-skills' 'treat':663 'tri':410 'true':118,498 'turncontext':274,301,319,328 'turncontext.activity.membersadded':283 'turncontext.activity.recipient.id':286 'turncontext.activity.text':311 'turncontext.sendactivityasync':288,307,338 'turnstat':276,303,321 'turnstate.conversation.deletestateasync':327 'url':595 'use':44,61,90,164,166,168,170,172,174,176,233,235,237,239,241,243,245,355,357,359,446,448,450,514,524,529,632,648 'valid':673 'var':178,201,330,411,456,474,488,493,503,556 'vault':552 'verifi':68 'version':80 'webappl':191 'webapplication.createbuilder':180 'welcom':290 'welcomeasync':260,272 'withauthor':401 'withredirecturi':405 'withtenantid':403 'workflow':158,640","prices":[{"id":"0476130b-6607-4dd2-abb2-512a3c8f6fad","listingId":"2cdaa16d-b7e3-4d8e-ad58-13a67ed817be","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"sickn33","category":"antigravity-awesome-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T21:40:13.507Z"}],"sources":[{"listingId":"2cdaa16d-b7e3-4d8e-ad58-13a67ed817be","source":"github","sourceId":"sickn33/antigravity-awesome-skills/m365-agents-dotnet","sourceUrl":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/m365-agents-dotnet","isPrimary":false,"firstSeenAt":"2026-04-18T21:40:13.507Z","lastSeenAt":"2026-04-23T12:51:11.549Z"}],"details":{"listingId":"2cdaa16d-b7e3-4d8e-ad58-13a67ed817be","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"sickn33","slug":"m365-agents-dotnet","github":{"repo":"sickn33/antigravity-awesome-skills","stars":34726,"topics":["agent-skills","agentic-skills","ai-agent-skills","ai-agents","ai-coding","ai-workflows","antigravity","antigravity-skills","claude-code","claude-code-skills","codex-cli","codex-skills","cursor","cursor-skills","developer-tools","gemini-cli","gemini-skills","kiro","mcp","skill-library"],"license":"mit","html_url":"https://github.com/sickn33/antigravity-awesome-skills","pushed_at":"2026-04-23T06:41:03Z","description":"Installable GitHub library of 1,400+ agentic skills for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and more. Includes installer CLI, bundles, workflows, and official/community skill collections.","skill_md_sha":"449fafd118ecd9aa49eedaeb0d436e73fb3b1ac6","skill_md_path":"skills/m365-agents-dotnet/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/m365-agents-dotnet"},"layout":"multi","source":"github","category":"antigravity-awesome-skills","frontmatter":{"name":"m365-agents-dotnet","description":"Microsoft 365 Agents SDK for .NET. Build multichannel agents for Teams/M365/Copilot Studio with ASP.NET Core hosting, AgentApplication routing, and MSAL-based auth."},"skills_sh_url":"https://skills.sh/sickn33/antigravity-awesome-skills/m365-agents-dotnet"},"updatedAt":"2026-04-23T12:51:11.549Z"}}