{"id":"4a0093d7-a206-464f-b6c2-d639315e2c72","shortId":"Ebj4sX","kind":"skill","title":"m365-agents-py","tagline":"Microsoft 365 Agents SDK for Python. Build multichannel agents for Teams/M365/Copilot Studio with aiohttp hosting, AgentApplication routing, streaming responses, and MSAL-based auth.","description":"# Microsoft 365 Agents SDK (Python)\n\nBuild enterprise agents for Microsoft 365, Teams, and Copilot Studio using the Microsoft Agents SDK with aiohttp hosting, AgentApplication routing, streaming responses, and MSAL-based authentication.\n\n## Before implementation\n- Use the microsoft-docs MCP to verify the latest API signatures for AgentApplication, start_agent_process, and authentication options.\n- Confirm package versions on PyPI for the microsoft-agents-* packages you plan to use.\n\n## Important Notice - Import Changes\n\n> **⚠️ Breaking Change**: Recent updates have changed the Python import structure from `microsoft.agents` to `microsoft_agents` (using underscores instead of dots).\n\n## Installation\n\n```bash\npip install microsoft-agents-hosting-core\npip install microsoft-agents-hosting-aiohttp\npip install microsoft-agents-activity\npip install microsoft-agents-authentication-msal\npip install microsoft-agents-copilotstudio-client\npip install python-dotenv aiohttp\n```\n\n## Environment Variables (.env)\n\n```bash\nCONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTID=<client-id>\nCONNECTIONS__SERVICE_CONNECTION__SETTINGS__CLIENTSECRET=<client-secret>\nCONNECTIONS__SERVICE_CONNECTION__SETTINGS__TENANTID=<tenant-id>\n\n# Optional: OAuth handlers for auto sign-in\nAGENTAPPLICATION__USERAUTHORIZATION__HANDLERS__GRAPH__SETTINGS__AZUREBOTOAUTHCONNECTIONNAME=<connection-name>\n\n# Optional: Azure OpenAI for streaming\nAZURE_OPENAI_ENDPOINT=<endpoint>\nAZURE_OPENAI_API_VERSION=<version>\nAZURE_OPENAI_API_KEY=<key>\n\n# Optional: Copilot Studio client\nCOPILOTSTUDIOAGENT__ENVIRONMENTID=<environment-id>\nCOPILOTSTUDIOAGENT__SCHEMANAME=<schema-name>\nCOPILOTSTUDIOAGENT__TENANTID=<tenant-id>\nCOPILOTSTUDIOAGENT__AGENTAPPID=<app-id>\n```\n\n## Core Workflow: aiohttp-hosted AgentApplication\n\n```python\nimport logging\nfrom os import environ\n\nfrom dotenv import load_dotenv\nfrom aiohttp.web import Request, Response, Application, run_app\n\nfrom microsoft_agents.activity import load_configuration_from_env\nfrom microsoft_agents.hosting.core import (\n    Authorization,\n    AgentApplication,\n    TurnState,\n    TurnContext,\n    MemoryStorage,\n)\nfrom microsoft_agents.hosting.aiohttp import (\n    CloudAdapter,\n    start_agent_process,\n    jwt_authorization_middleware,\n)\nfrom microsoft_agents.authentication.msal import MsalConnectionManager\n\n# Enable logging\nms_agents_logger = logging.getLogger(\"microsoft_agents\")\nms_agents_logger.addHandler(logging.StreamHandler())\nms_agents_logger.setLevel(logging.INFO)\n\n# Load configuration\nload_dotenv()\nagents_sdk_config = load_configuration_from_env(environ)\n\n# Create storage and connection manager\nSTORAGE = MemoryStorage()\nCONNECTION_MANAGER = MsalConnectionManager(**agents_sdk_config)\nADAPTER = CloudAdapter(connection_manager=CONNECTION_MANAGER)\nAUTHORIZATION = Authorization(STORAGE, CONNECTION_MANAGER, **agents_sdk_config)\n\n# Create AgentApplication\nAGENT_APP = AgentApplicationTurnState\n\n\n@AGENT_APP.conversation_update(\"membersAdded\")\nasync def on_members_added(context: TurnContext, _state: TurnState):\n    await context.send_activity(\"Welcome to the agent!\")\n\n\n@AGENT_APP.activity(\"message\")\nasync def on_message(context: TurnContext, _state: TurnState):\n    await context.send_activity(f\"You said: {context.activity.text}\")\n\n\n@AGENT_APP.error\nasync def on_error(context: TurnContext, error: Exception):\n    await context.send_activity(\"The agent encountered an error.\")\n\n\n# Server setup\nasync def entry_point(req: Request) -> Response:\n    agent: AgentApplication = req.app[\"agent_app\"]\n    adapter: CloudAdapter = req.app[\"adapter\"]\n    return await start_agent_process(req, agent, adapter)\n\n\nAPP = Application(middlewares=[jwt_authorization_middleware])\nAPP.router.add_post(\"/api/messages\", entry_point)\nAPP[\"agent_configuration\"] = CONNECTION_MANAGER.get_default_connection_configuration()\nAPP[\"agent_app\"] = AGENT_APP\nAPP[\"adapter\"] = AGENT_APP.adapter\n\nif __name__ == \"__main__\":\n    run_app(APP, host=\"localhost\", port=environ.get(\"PORT\", 3978))\n```\n\n## AgentApplication Routing\n\n```python\nimport re\nfrom microsoft_agents.hosting.core import (\n    AgentApplication, TurnState, TurnContext, MessageFactory\n)\nfrom microsoft_agents.activity import ActivityTypes\n\nAGENT_APP = AgentApplicationTurnState\n\n# Welcome handler\n@AGENT_APP.conversation_update(\"membersAdded\")\nasync def on_members_added(context: TurnContext, _state: TurnState):\n    await context.send_activity(\"Welcome!\")\n\n# Regex-based message handler\n@AGENT_APP.message(re.compile(r\"^hello$\", re.IGNORECASE))\nasync def on_hello(context: TurnContext, _state: TurnState):\n    await context.send_activity(\"Hello!\")\n\n# Simple string message handler\n@AGENT_APP.message(\"/status\")\nasync def on_status(context: TurnContext, _state: TurnState):\n    await context.send_activity(\"Status: OK\")\n\n# Auth-protected message handler\n@AGENT_APP.message(\"/me\", auth_handlers=[\"GRAPH\"])\nasync def on_profile(context: TurnContext, state: TurnState):\n    token_response = await AGENT_APP.auth.get_token(context, \"GRAPH\")\n    if token_response and token_response.token:\n        # Use token to call Graph API\n        await context.send_activity(\"Profile retrieved\")\n\n# Invoke activity handler\n@AGENT_APP.activity(ActivityTypes.invoke)\nasync def on_invoke(context: TurnContext, _state: TurnState):\n    invoke_response = Activity(\n        type=ActivityTypes.invoke_response, value={\"status\": 200}\n    )\n    await context.send_activity(invoke_response)\n\n# Fallback message handler\n@AGENT_APP.activity(\"message\")\nasync def on_message(context: TurnContext, _state: TurnState):\n    await context.send_activity(f\"Echo: {context.activity.text}\")\n\n# Error handler\n@AGENT_APP.error\nasync def on_error(context: TurnContext, error: Exception):\n    await context.send_activity(\"An error occurred.\")\n```\n\n## Streaming Responses with Azure OpenAI\n\n```python\nfrom openai import AsyncAzureOpenAI\nfrom microsoft_agents.activity import SensitivityUsageInfo\n\nCLIENT = AsyncAzureOpenAI(\n    api_version=environ[\"AZURE_OPENAI_API_VERSION\"],\n    azure_endpoint=environ[\"AZURE_OPENAI_ENDPOINT\"],\n    api_key=environ[\"AZURE_OPENAI_API_KEY\"]\n)\n\n@AGENT_APP.message(\"poem\")\nasync def on_poem_message(context: TurnContext, _state: TurnState):\n    # Configure streaming response\n    context.streaming_response.set_feedback_loop(True)\n    context.streaming_response.set_generated_by_ai_label(True)\n    context.streaming_response.set_sensitivity_label(\n        SensitivityUsageInfo(\n            type=\"https://schema.org/Message\",\n            schema_type=\"CreativeWork\",\n            name=\"Internal\",\n        )\n    )\n    context.streaming_response.queue_informative_update(\"Starting a poem...\\n\")\n\n    # Stream from Azure OpenAI\n    streamed_response = await CLIENT.chat.completions.create(\n        model=\"gpt-4o\",\n        messages=[\n            {\"role\": \"system\", \"content\": \"You are a creative assistant.\"},\n            {\"role\": \"user\", \"content\": \"Write a poem about Python.\"}\n        ],\n        stream=True,\n    )\n    \n    try:\n        async for chunk in streamed_response:\n            if chunk.choices and chunk.choices[0].delta.content:\n                context.streaming_response.queue_text_chunk(\n                    chunk.choices[0].delta.content\n                )\n    finally:\n        await context.streaming_response.end_stream()\n```\n\n## OAuth / Auto Sign-In\n\n```python\n@AGENT_APP.message(\"/logout\")\nasync def logout(context: TurnContext, state: TurnState):\n    await AGENT_APP.auth.sign_out(context, \"GRAPH\")\n    await context.send_activity(MessageFactory.text(\"You have been logged out.\"))\n\n\n@AGENT_APP.message(\"/me\", auth_handlers=[\"GRAPH\"])\nasync def profile_request(context: TurnContext, state: TurnState):\n    user_token_response = await AGENT_APP.auth.get_token(context, \"GRAPH\")\n    if user_token_response and user_token_response.token:\n        # Use token to call Microsoft Graph\n        async with aiohttp.ClientSession() as session:\n            headers = {\n                \"Authorization\": f\"Bearer {user_token_response.token}\",\n                \"Content-Type\": \"application/json\",\n            }\n            async with session.get(\n                \"https://graph.microsoft.com/v1.0/me\", headers=headers\n            ) as response:\n                if response.status == 200:\n                    user_info = await response.json()\n                    await context.send_activity(f\"Hello, {user_info['displayName']}!\")\n```\n\n## Copilot Studio Client (Direct to Engine)\n\n```python\nimport asyncio\nfrom msal import PublicClientApplication\nfrom microsoft_agents.activity import ActivityTypes, load_configuration_from_env\nfrom microsoft_agents.copilotstudio.client import (\n    ConnectionSettings,\n    CopilotClient,\n)\n\n# Token cache (local file for interactive flows)\nclass LocalTokenCache:\n    # See samples for full implementation\n    pass\n\ndef acquire_token(settings, app_client_id, tenant_id):\n    pca = PublicClientApplication(\n        client_id=app_client_id,\n        authority=f\"https://login.microsoftonline.com/{tenant_id}\",\n    )\n    \n    token_request = {\"scopes\": [\"https://api.powerplatform.com/.default\"]}\n    accounts = pca.get_accounts()\n    \n    if accounts:\n        response = pca.acquire_token_silent(token_request[\"scopes\"], account=accounts[0])\n        return response.get(\"access_token\")\n    else:\n        response = pca.acquire_token_interactive(**token_request)\n        return response.get(\"access_token\")\n\n\nasync def main():\n    settings = ConnectionSettings(\n        environment_id=environ.get(\"COPILOTSTUDIOAGENT__ENVIRONMENTID\"),\n        agent_identifier=environ.get(\"COPILOTSTUDIOAGENT__SCHEMANAME\"),\n    )\n    \n    token = acquire_token(\n        settings,\n        app_client_id=environ.get(\"COPILOTSTUDIOAGENT__AGENTAPPID\"),\n        tenant_id=environ.get(\"COPILOTSTUDIOAGENT__TENANTID\"),\n    )\n    \n    copilot_client = CopilotClient(settings, token)\n    \n    # Start conversation\n    act = copilot_client.start_conversation(True)\n    async for action in act:\n        if action.text:\n            print(action.text)\n    \n    # Ask question\n    replies = copilot_client.ask_question(\"Hello!\", action.conversation.id)\n    async for reply in replies:\n        if reply.type == ActivityTypes.message:\n            print(reply.text)\n\n\nasyncio.run(main())\n```\n\n## Best Practices\n\n1. Use `microsoft_agents` import prefix (underscores, not dots).\n2. Use `MemoryStorage` only for development; use BlobStorage or CosmosDB in production.\n3. Always use `load_configuration_from_env(environ)` to load SDK configuration.\n4. Include `jwt_authorization_middleware` in aiohttp Application middlewares.\n5. Use `MsalConnectionManager` for MSAL-based authentication.\n6. Call `end_stream()` in finally blocks when using streaming responses.\n7. Use `auth_handlers` parameter on message decorators for OAuth-protected routes.\n8. Keep secrets in environment variables, not in source code.\n\n## Reference Files\n\n| File | Contents |\n| --- | --- |\n| references/acceptance-criteria.md | Import paths, hosting pipeline, streaming, OAuth, and Copilot Studio 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| GitHub samples (Python) | https://github.com/microsoft/Agents-for-python |\n| PyPI packages | https://pypi.org/search/?q=microsoft-agents |\n| Integrate with Copilot Studio | https://learn.microsoft.com/en-us/microsoft-365/agents-sdk/integrate-with-mcs |\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","antigravity","awesome","skills","sickn33","agent-skills","agentic-skills","ai-agent-skills","ai-agents","ai-coding","ai-workflows"],"capabilities":["skill","source-sickn33","skill-m365-agents-py","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-py","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 (11,843 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.610Z","embedding":null,"createdAt":"2026-04-18T21:40:14.280Z","updatedAt":"2026-04-23T12:51:11.610Z","lastSeenAt":"2026-04-23T12:51:11.610Z","tsv":"'/.default':937 '/api/messages':423 '/en-us/microsoft-365/agents-sdk/':1148 '/en-us/microsoft-365/agents-sdk/integrate-with-mcs':1166 '/logout':776 '/me':537,799 '/message':702 '/microsoft/agents-for-python':1154 '/search/?q=microsoft-agents':1159 '/status':517 '/v1.0/me':850 '0':757,763,952 '1':1039 '2':1048 '200':593,857 '3':1060 '365':6,30,39,1143 '3978':452 '4':1072 '4o':726 '5':1081 '6':1089 '7':1100 '8':1113 'access':955,966 'account':938,940,942,950,951 'acquir':912,984 'act':1005,1013 'action':1011,1179 'action.conversation.id':1024 'action.text':1015,1017 'activ':143,350,367,383,488,510,528,569,573,587,596,614,631,791,864 'activitytyp':468,886 'activitytypes.invoke':576,589 'activitytypes.message':1032 'ad':343,481 'adapt':317,403,406,414,439 'agent':3,7,13,31,36,47,78,92,116,128,135,142,148,155,271,283,287,296,314,328,333,354,385,398,401,410,413,427,434,436,469,978,1042,1144 'agent_app.activity':355,575,602 'agent_app.adapter':440 'agent_app.auth.get':552,815 'agent_app.auth.sign':785 'agent_app.conversation':336,474 'agent_app.error':372,620 'agent_app.message':495,516,536,671,775,798 'agentappid':224,992 'agentappl':20,52,76,191,230,262,332,399,453,461 'agentapplicationturnst':335,471 'ai':692 'aiohttp':18,50,137,163,228,1078 'aiohttp-host':227 'aiohttp.clientsession':833 'aiohttp.web':244 'alway':1061 'api':73,207,211,566,651,656,664,669 'api.powerplatform.com':936 'api.powerplatform.com/.default':935 'app':250,334,402,415,426,433,435,437,438,445,446,470,915,924,987 'app.router.add':421 'applic':248,416,1079,1173 'application/json':844 'ask':1018,1217 'assist':735 'async':339,357,373,391,477,500,518,541,577,604,621,673,747,777,803,831,845,968,1009,1025 'asyncazureopenai':644,650 'asyncio':878 'asyncio.run':1035 'auth':28,532,538,800,1102 'auth-protect':531 'authent':60,81,149,1088 'author':261,274,323,324,419,837,927,1075 'auto':187,770 'await':348,365,381,408,486,508,526,551,567,594,612,629,721,766,784,789,814,860,862 'azur':198,202,205,209,638,654,658,661,667,717 'azurebotoauthconnectionnam':196 'base':27,59,492,1087 'bash':123,167 'bearer':839 'best':1037 'blobstorag':1055 'block':1095 'boundari':1225 'break':102 'build':11,34 'cach':897 'call':564,828,1090 'chang':101,103,107 'chunk':749,761 'chunk.choices':754,756,762 'clarif':1219 'class':903 'clear':1192 'client':157,216,649,872,916,922,925,988,999 'client.chat.completions.create':722 'clientid':172 'clientsecret':177 'cloudadapt':269,318,404 'code':1122 'config':298,316,330 'configur':255,293,300,428,432,682,888,1064,1071 'confirm':83 'connect':168,170,173,175,178,180,307,311,319,321,326,431 'connection_manager.get':429 'connectionset':894,972 'content':730,738,842,1126 'content-typ':841 'context':344,361,377,482,504,522,545,554,581,608,625,678,780,787,807,817 'context.activity.text':371,617 'context.send':349,366,382,487,509,527,568,595,613,630,790,863 'context.streaming_response.end':767 'context.streaming_response.queue':708,759 'context.streaming_response.set':685,689,695 'convers':1004,1007 'copilot':42,214,870,998,1135,1162 'copilot_client.ask':1021 'copilot_client.start':1006 'copilotcli':895,1000 'copilotstudio':156 'copilotstudioag':217,219,221,223,976,981,991,996 'core':130,225 'cosmosdb':1057 'creat':304,331 'creativ':734 'creativework':705 'criteria':1228 'decor':1107 'def':340,358,374,392,478,501,519,542,578,605,622,674,778,804,911,969 'default':430 'delta.content':758,764 'describ':1180,1196 'develop':1053 'direct':873 'displaynam':869 'doc':67 'dot':121,1047 'dotenv':162,239,242,295 'echo':616 'els':957 'enabl':280 'encount':386 'end':1091 'endpoint':204,659,663 'engin':875 'enterpris':35 'entri':393,424 'env':166,257,302,890,1066 'environ':164,237,303,653,660,666,973,1067,1117,1208 'environ.get':450,975,980,990,995 'environment-specif':1207 'environmentid':218,977 'error':376,379,388,618,624,627,633 'except':380,628 'execut':1175 'expert':1213 'f':368,615,838,865,928 'fallback':599 'feedback':686 'file':899,1124,1125 'final':765,1094 'flow':902 'full':908 'generat':690 'github':1149 'github.com':1153 'github.com/microsoft/agents-for-python':1152 'gpt':725 'gpt-4o':724 'graph':194,540,555,565,788,802,818,830 'graph.microsoft.com':849 'graph.microsoft.com/v1.0/me':848 'handler':185,193,473,494,515,535,539,574,601,619,801,1103 'header':836,851,852 'hello':498,503,511,866,1023 'host':19,51,129,136,229,447,1130 'id':917,919,923,926,931,974,989,994 'identifi':979 'implement':62,909 'import':98,100,110,232,236,240,245,253,260,268,278,456,460,467,643,647,877,881,885,893,1043,1128 'includ':1073 'info':859,868 'inform':709 'input':1222 'instal':122,125,132,139,145,152,159 'instead':119 'integr':1160 'interact':901,961 'intern':707 'invok':572,580,585,597 'jwt':273,418,1074 'keep':1114 'key':212,665,670 'label':693,697 'latest':72 'learn.microsoft.com':1147,1165 'learn.microsoft.com/en-us/microsoft-365/agents-sdk/':1146 'learn.microsoft.com/en-us/microsoft-365/agents-sdk/integrate-with-mcs':1164 'limit':1184 'link':1139 'load':241,254,292,294,299,887,1063,1069 'local':898 'localhost':448 'localtokencach':904 'log':233,281,796 'logger':284 'logging.getlogger':285 'logging.info':291 'logging.streamhandler':289 'login.microsoftonline.com':929 'logout':779 'loop':687 'm365':2 'm365-agents-py':1 'main':443,970,1036 'manag':308,312,320,322,327 'match':1193 'mcp':68 'member':342,480 'membersad':338,476 'memorystorag':265,310,1050 'messag':356,360,493,514,534,600,603,607,677,727,1106 'messagefactori':464 'messagefactory.text':792 'microsoft':5,29,38,46,66,91,115,127,134,141,147,154,286,829,1041,1142 'microsoft-ag':90 'microsoft-agents-act':140 'microsoft-agents-authentication-ms':146 'microsoft-agents-copilotstudio-cli':153 'microsoft-agents-hosting-aiohttp':133 'microsoft-agents-hosting-cor':126 'microsoft-doc':65 'microsoft.agents':113 'microsoft_agents.activity':252,466,646,884 'microsoft_agents.authentication.msal':277 'microsoft_agents.copilotstudio.client':892 'microsoft_agents.hosting.aiohttp':267 'microsoft_agents.hosting.core':259,459 'middlewar':275,417,420,1076,1080 'miss':1230 'model':723 'ms':282 'ms_agents_logger.addhandler':288 'ms_agents_logger.setlevel':290 'msal':26,58,150,880,1086 'msal-bas':25,57,1085 'msalconnectionmanag':279,313,1083 'multichannel':12 'n':714 'name':442,706 'notic':99 'oauth':184,769,1110,1133 'oauth-protect':1109 'occur':634 'ok':530 'openai':199,203,206,210,639,642,655,662,668,718 'option':82,183,197,213 'os':235 'output':1202 'overview':1183 'packag':84,93,1156 'paramet':1104 'pass':910 'path':1129 'pattern':1137 'pca':920 'pca.acquire':944,959 'pca.get':939 'permiss':1223 'pip':124,131,138,144,151,158 'pipelin':1131 'plan':95 'poem':672,676,713,741 'point':394,425 'port':449,451 'post':422 'practic':1038 'prefix':1044 'print':1016,1033 'process':79,272,411 'product':1059 'profil':544,570,805 'protect':533,1111 'publicclientappl':882,921 'py':4 'pypi':87,1155 'pypi.org':1158 'pypi.org/search/?q=microsoft-agents':1157 'python':10,33,109,161,231,455,640,743,774,876,1151 'python-dotenv':160 'question':1019,1022 'r':497 're':457 're.compile':496 're.ignorecase':499 'recent':104 'refer':1123,1138 'references/acceptance-criteria.md':1127 'regex':491 'regex-bas':490 'repli':1020,1027,1029 'reply.text':1034 'reply.type':1031 'req':395,412 'req.app':400,405 'request':246,396,806,933,948,963 'requir':1221 'resourc':1140 'respons':23,55,247,397,550,558,586,590,598,636,684,720,752,813,822,854,943,958,1099 'response.get':954,965 'response.json':861 'response.status':856 'retriev':571 'return':407,953,964 'review':1214 'role':728,736 'rout':21,53,454,1112 'run':249,444 'safeti':1224 'said':370 'sampl':906,1150 'schema':703 'schema.org':701 'schema.org/message':700 'schemanam':220,982 'scope':934,949,1195 'sdk':8,32,48,297,315,329,1070,1145 'secret':1115 'see':905 'sensit':696 'sensitivityusageinfo':648,698 'server':389 'servic':169,174,179 'session':835 'session.get':847 'set':171,176,181,195,914,971,986,1001 'setup':390 'sign':189,772 'sign-in':188,771 'signatur':74 'silent':946 'simpl':512 'skill':1171,1187 'skill-m365-agents-py' 'sourc':1121 'source-sickn33' 'specif':1209 'start':77,270,409,711,1003 'state':346,363,484,506,524,547,583,610,680,782,809 'status':521,529,592 'stop':1215 'storag':305,309,325 'stream':22,54,201,635,683,715,719,744,751,768,1092,1098,1132 'string':513 'structur':111 'studio':16,43,215,871,1136,1163 'substitut':1205 'success':1227 'system':729 'task':1191 'team':40 'teams/m365/copilot':15 'tenant':918,930,993 'tenantid':182,222,997 'test':1211 'text':760 'token':549,553,557,562,812,816,821,826,896,913,932,945,947,956,960,962,967,983,985,1002 'token_response.token':560 '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':1200 'tri':746 'true':688,694,745,1008 'turncontext':264,345,362,378,463,483,505,523,546,582,609,626,679,781,808 'turnstat':263,347,364,462,485,507,525,548,584,611,681,783,810 'type':588,699,704,843 'underscor':118,1045 'updat':105,337,475,710 'url':1141 'use':44,63,97,117,561,825,1040,1049,1054,1062,1082,1097,1101,1169,1185 'user':737,811,820,858,867 'user_token_response.token':824,840 'userauthor':192 'valid':1210 'valu':591 'variabl':165,1118 'verifi':70 'version':85,208,652,657 'welcom':351,472,489 'workflow':226,1177 'write':739","prices":[{"id":"db986e96-f92a-440a-b7b2-e8243cada7c5","listingId":"4a0093d7-a206-464f-b6c2-d639315e2c72","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:14.280Z"}],"sources":[{"listingId":"4a0093d7-a206-464f-b6c2-d639315e2c72","source":"github","sourceId":"sickn33/antigravity-awesome-skills/m365-agents-py","sourceUrl":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/m365-agents-py","isPrimary":false,"firstSeenAt":"2026-04-18T21:40:14.280Z","lastSeenAt":"2026-04-23T12:51:11.610Z"}],"details":{"listingId":"4a0093d7-a206-464f-b6c2-d639315e2c72","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"sickn33","slug":"m365-agents-py","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":"bb8fcb8bb5d241dc7704242c723d55a2f7384062","skill_md_path":"skills/m365-agents-py/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/m365-agents-py"},"layout":"multi","source":"github","category":"antigravity-awesome-skills","frontmatter":{"name":"m365-agents-py","description":"Microsoft 365 Agents SDK for Python. Build multichannel agents for Teams/M365/Copilot Studio with aiohttp hosting, AgentApplication routing, streaming responses, and MSAL-based auth."},"skills_sh_url":"https://skills.sh/sickn33/antigravity-awesome-skills/m365-agents-py"},"updatedAt":"2026-04-23T12:51:11.610Z"}}