agents
164 TopicsMicrosoft Power Platform community call - March 2026
๐ก Power Platform monthly community call focuses on different extensibility options for builders, makers and developers within the Power Platform. Typically demos are from our awesome community members who showcase the art of possible within the Power Platform capabilities. ๐ Looking to catch up on the latest news and updates, including cool community demos, this call is for you! ๐ On 18th of March we'll have following agenda: Power Platform Updates & Events Latest on Power Platform samples Shiv Sharma (Ameriprise Financial Services) - Design Full App Pages in Minutes with AIโPowered Generative Pages in Power Apps Darshan Magdum (Nihilent) - Adding Filters and Microsoft Teams Width to Adaptive Cards, and Tooltips & Anchor Tags via YAML in Copilot Studio Giridhar Mungamuri (EY) - Getting Started with Power Apps Code Apps: Build Your First Real App with the New ProโCode Experience ๐ Download recurrent invite from https://aka.ms/powerplatformcommunitycall ๐ & ๐บ Join the Microsoft Teams meeting live at https://aka.ms/PowerPlatformMonthlyCall ๐ก Building something cool for Microsoft 365 or Power Platform (Copilot, SharePoint, Power Apps, etc)? We are always looking for presenters - Volunteer for a community call demo at https://aka.ms/community/request/demo ๐ See you in the call! ๐ Resources: Previous community call recordings and demos from the Microsoft 365 & Power Platform community YouTube channel at https://aka.ms/community/videos Microsoft 365 & Power Platform samples from Microsoft and community - https://aka.ms/community/samples Microsoft 365 & Power Platform community details - https://aka.ms/community/home7Views0likes0CommentsMicrosoft 365 & Power Platform product updates call
๐กMicrosoft 365 & Power Platform product updates call concentrates on the different use cases and features within the Microsoft 365 and in Power Platform. Call includes topics like Microsoft 365 Copilot, Copilot Studio, Microsoft Teams, Power Platform, Microsoft Graph, Microsoft Viva, Microsoft Search, Microsoft Lists, SharePoint, Power Automate, Power Apps and more. ๐ Weekly Tuesday call is for all community members to see Microsoft PMs, engineering and Cloud Advocates showcasing the art of possible with Microsoft 365 and Power Platform. ๐ On the 17th of March we'll have following agenda: News and updates from Microsoft Together mode group photo Sรฉbastien Levert โ Grounding your Copilot Chat declarative agent with knowledge Mike Francis โ Message Center Agent - Natural language query and comms generation for Microsoft Admin Center messages and M365 Roadmap Paolo Pialorsi โ Consuming an MCP server with OAuth 2.0 in Copilot Studio ๐ & ๐บ Join the Microsoft Teams meeting live at https://aka.ms/community/ms-speakers-call-join ๐๏ธ Download recurrent invite for this weekly call from https://aka.ms/community/ms-speakers-call-invite ๐ See you in the call! ๐ก Building something cool for Microsoft 365 or Power Platform (Copilot, SharePoint, Power Apps, etc)? We are always looking for presenters - Volunteer for a community call demo at https://aka.ms/community/request/demo ๐ Resources: Previous community call recordings and demos from the Microsoft Community Learning YouTube channel at https://aka.ms/community/youtube Microsoft 365 & Power Platform samples from Microsoft and community - https://aka.ms/community/samples Microsoft 365 & Power Platform community details - https://aka.ms/community/home ๐งก Sharing is caring!8Views0likes0CommentsDemystifying GitHub Copilot Security Controls: easing concerns for organizational adoption
At a recent developer conference, I delivered a session on Legacy Code Rescue using GitHub Copilot App Modernization. Throughout the day, conversations with developers revealed a clear divide: some have fully embraced Agentic AI in their daily coding, while others remain cautious. Often, this hesitation isn't due to reluctance but stems from organizational concerns around security and regulatory compliance. Having witnessed similar patterns during past technology shifts, I understand how these barriers can slow adoption. In this blog, I'll demystify the most common security concerns about GitHub Copilot and explain how its built-in features address them, empowering organizations to confidently modernize their development workflows. GitHub Copilot Model Training A common question I received at the conference was whether GitHub uses your code as training data for GitHub Copilot. I always direct customers to the GitHub Copilot Trust Center for clarity, but the answer is straightforward: โNo. GitHub uses neither Copilot Business nor Enterprise data to train the GitHub model.โ Notice this restriction also applies to third-party models as well (e.g. Anthropic, Google). GitHub Copilot Intellectual Property indemnification policy A frequent concern I hear is, since GitHub Copilotโs underlying models are trained on sources that include public code, it might simply โcopy and pasteโ code from those sources. Letโs clarify how this actually works: Does GitHub Copilot โcopy/pasteโ? โThe AI models that create Copilotโs suggestions may be trained on public code, but do not contain any code. When they generate a suggestion, they are not โcopying and pastingโ from any codebase.โ To provide an additional layer of protection, GitHub Copilot includes a โduplicate detection filterโ. This feature helps prevent suggestions that closely match public code from being surfaced. (Note: This duplicate detection currently does not apply to the Copilot coding agent.) More importantly, customers are protected by an Intellectual Property indemnification policy. This means that if you receive an unmodified suggestion from GitHub Copilot and face a copyright claim as a result, Microsoft will defend you in court. GitHub Copilot Data Retention Another frequent question I hear concerns GitHub Copilotโs data retention policies. For organizations on GitHub Copilot Business and Enterprise plans, retention practices depend on how and where the service is accessed from: Access through IDE for Chat and Code Completions: Prompts and Suggestions: Not retained. User Engagement Data: Kept for two years. Feedback Data: Stored for as long as needed for its intended purpose. Other GitHub Copilot access and use: Prompts and Suggestions: Retained for 28 days. User Engagement Data: Kept for two years. Feedback Data: Stored for as long as needed for its intended purpose. For Copilot Coding Agent, session logs are retained for the life of the account in order to provide the service. Excluding content from GitHub Copilot To prevent GitHub Copilot from indexing sensitive files, you can configure content exclusions at the repository or organization level. In VS Code, use the .copilotignore file to exclude files client-side. Note that files listed in .gitignore are not indexed by default but may still be referenced if open or explicitly referenced (unless theyโre excluded through .copilotignore or content exclusions). The life cycle of a GitHub Copilot code suggestion Here are the key protections at each stage of the life cycle of a GitHub Copilot code suggestion: In the IDE: Content exclusions prevent files, folders, or patterns from being included. GitHub proxy (pre-model safety): Prompts go through a GitHub proxy hosted in Microsoft Azure for pre-inference checks: screening for toxic or inappropriate language, relevance, and hacking attempts/jailbreak-style prompts before reaching the model. Model response: With the public code filter enabled, some suggestions are suppressed. The vulnerability protection feature blocks insecure coding patterns like hardcoded credentials or SQL injections in real time. Disable access to GitHub Copilot Free Due to the varying policies associated with GitHub Copilot Free, it is crucial for organizations to ensure it is disabled both in the IDE and on GitHub.com. Since not all IDEs currently offer a built-in option to disable Copilot Free, the most reliable method to prevent both accidental and intentional access is to implement firewall rule changes, as outlined in the official documentation. Agent Mode Allow List Accidental file system deletion by Agentic AI assistants can happen. With GitHub Copilot agent mode, the "Terminal auto approveโ setting in VS Code can be used to prevent this. This setting can be managed centrally using a VS Code policy. MCP registry Organizations often want to restrict access to allow only trusted MCP servers. GitHub now offers an MCP registry feature for this purpose. This feature isnโt available in all IDEs and clients yet, but it's being developed. Compliance Certifications The GitHub Copilot Trust Center page lists GitHub Copilot's broad compliance credentials, surpassing many competitors in financial, security, privacy, cloud, and industry coverage. SOC 1 Type 2: Assurance over internal controls for financial reporting. SOC 2 Type 2: In-depth report covering Security, Availability, Processing Integrity, Confidentiality, and Privacy over time. SOC 3: General-use version of SOC 2 with broad executive-level assurance. ISO/IECโฏ27001:2013: Certification for a formal Information Security Management System (ISMS), based on risk management controls. CSA STAR Level 2: Includes a third-party attestation combining ISOโฏ27001 or SOC 2 with additional cloud control matrix (CCM) requirements. TISAX: Trusted Information Security Assessment Exchange, covering automotive-sector security standards. In summary, while the adoption of AI tools like GitHub Copilot in software development can raise important questions around security, privacy, and compliance, itโs clear that existing safeguards in place help address these concerns. By understanding the safeguards, configurable controls, and robust compliance certifications offered, organizations and developers alike can feel more confident in embracing GitHub Copilot to accelerate innovation while maintaining trust and peace of mind.Building a Multi-Agent On-Call Copilot with Microsoft Agent Framework
Four AI agents, one incident payload, structured triage in under 60 seconds powered by Microsoft Agent Framework and Foundry Hosted Agents. Multi-Agent Microsoft Agent Framework Foundry Hosted Agents Python SRE / Incident Response When an incident fires at 3 AM, every second the on-call engineer spends piecing together alerts, logs, and metrics is a second not spent fixing the problem. What if an AI system could ingest the raw incident signals and hand you a structured triage, a Slack update, a stakeholder brief, and a draft post-incident report, all in under 10 seconds? Thatโs exactly what On-Call Copilot does. In this post, weโll walk through how we built it using the Microsoft Agent Framework, deployed it as a Foundry Hosted Agent, and discuss the key design decisions that make multi-agent orchestration practical for production workloads. The full source code is open-source on GitHub. You can deploy your own instance with a single azd up . Why Multi-Agent? The Problem with Single-Prompt Triage Early AI incident assistants used a single large prompt: โHere is the incident. Give me root causes, actions, a Slack message, and a post-incident report.โ This approach has two fundamental problems: Context overload. A real incident may have 800 lines of logs, 10 alert lines, and dense metrics. Asking one model to process everything and produce four distinct output formats in a single turn pushes token limits and degrades quality. Conflicting concerns. Triage reasoning and communication drafting are cognitively different tasks. A model optimised for structured JSON analysis often produces stilted Slack messagesโand vice versa. The fix is specialisation: decompose the task into focused agents, give each agent a narrow instruction set, and run them in parallel. This is the core pattern that the Microsoft Agent Framework makes easy. Architecture: Four Agents Running Concurrently On-Call Copilot is deployed as a Foundry Hosted Agentโa containerised Python service running on Microsoft Foundryโs managed infrastructure. The core orchestrator uses ConcurrentBuilder from the Microsoft Agent Framework SDK to run four specialist agents in parallel via asyncio.gather() . All four panels populated simultaneously: Triage (red), Summary (blue), Comms (green), PIR (purple). Architecture: The orchestrator runs four specialist agents concurrently via asyncio.gather(), then merges their JSON fragments into a single response. All four agents The solution share a single Azure OpenAI Model Router deployment. Rather than hardcoding gpt-4o or gpt-4o-mini , Model Router analyses request complexity and routes automatically. A simple triage prompt costs less; a long post-incident synthesis uses a more capable model. One deployment name, zero model-selection code. Meet the Four Agents ๐ Triage Agent Root cause analysis, immediate actions, missing data identification, and runbook alignment. suspected_root_causes ยท immediate_actions ยท missing_information ยท runbook_alignment ๐ Summary Agent Concise incident narrative: what happened and current status (ONGOING / MITIGATED / RESOLVED). summary.what_happened ยท summary.current_status ๐ข Comms Agent Audience-appropriate communications: Slack channel update with emoji conventions, plus a non-technical stakeholder brief. comms.slack_update ยท comms.stakeholder_update ๐ PIR Agent Post-incident report: chronological timeline, quantified customer impact, and specific prevention actions. post_incident_report.timeline ยท .customer_impact ยท .prevention_actions The Code: Building the Orchestrator The entry point is remarkably concise. ConcurrentBuilder handles all the async wiringโyou just declare the agents and let the framework handle parallelism, error propagation, and response merging. main.py โ Orchestrator from agent_framework import ConcurrentBuilder from agent_framework.azure import AzureOpenAIChatClient from azure.ai.agentserver.agentframework import from_agent_framework from azure.identity import DefaultAzureCredential, get_bearer_token_provider from app.agents.triage import TRIAGE_INSTRUCTIONS from app.agents.comms import COMMS_INSTRUCTIONS from app.agents.pir import PIR_INSTRUCTIONS from app.agents.summary import SUMMARY_INSTRUCTIONS _credential = DefaultAzureCredential() _token_provider = get_bearer_token_provider( _credential, "https://cognitiveservices.azure.com/.default" ) def create_workflow_builder(): """Create 4 specialist agents and wire them into a ConcurrentBuilder.""" triage = AzureOpenAIChatClient(ad_token_provider=_token_provider).create_agent( instructions=TRIAGE_INSTRUCTIONS, name="triage-agent", ) summary = AzureOpenAIChatClient(ad_token_provider=_token_provider).create_agent( instructions=SUMMARY_INSTRUCTIONS, name="summary-agent", ) comms = AzureOpenAIChatClient(ad_token_provider=_token_provider).create_agent( instructions=COMMS_INSTRUCTIONS, name="comms-agent", ) pir = AzureOpenAIChatClient(ad_token_provider=_token_provider).create_agent( instructions=PIR_INSTRUCTIONS, name="pir-agent", ) return ConcurrentBuilder().participants([triage, summary, comms, pir]) def main(): builder = create_workflow_builder() from_agent_framework(builder.build).run() # starts on port 8088 if __name__ == "__main__": main() Key insight: DefaultAzureCredential means there are no API keys anywhere in the codebase. The container uses managed identity in production; local development uses your az login session. The same code runs in both environments without modification. Agent Instructions: Prompts as Configuration Each agent receives a tightly scoped system prompt that defines its output schema and guardrails. Hereโs the Triage Agentโthe most complex of the four: app/agents/triage.py TRIAGE_INSTRUCTIONS = """\ You are the **Triage Agent**, an expert Site Reliability Engineer specialising in root cause analysis and incident response. ## Task Analyse the incident data and return a single JSON object with ONLY these keys: { "suspected_root_causes": [ { "hypothesis": "string โ concise root cause hypothesis", "evidence": ["string โ supporting evidence from the input"], "confidence": 0.0 // 0-1, how confident you are } ], "immediate_actions": [ { "step": "string โ concrete action with runnable command if applicable", "owner_role": "oncall-eng | dba | infra-eng | platform-eng", "priority": "P0 | P1 | P2 | P3" } ], "missing_information": [ { "question": "string โ what data is missing", "why_it_matters": "string โ why this data would help" } ], "runbook_alignment": { "matched_steps": ["string โ runbook steps that match the situation"], "gaps": ["string โ gaps or missing runbook coverage"] } } ## Guardrails 1. **No secrets** โ redact any credential-like material as [REDACTED]. 2. **No hallucination** โ if data is insufficient, set confidence to 0 and add entries to missing_information. 3. **Diagnostic suggestions** โ when data is sparse, include diagnostic steps in immediate_actions. 4. **Structured output only** โ return ONLY valid JSON, no prose. """ The Comms Agent follows the same pattern but targets a different audience: app/agents/comms.py COMMS_INSTRUCTIONS = """\ You are the **Comms Agent**, an expert incident communications writer. ## Task Return a single JSON object with ONLY this key: { "comms": { "slack_update": "Slack-formatted message with emoji, severity, status, impact, next steps, and ETA", "stakeholder_update": "Non-technical summary for executives. Focus on business impact and resolution." } } ## Guidelines - Slack: Use :rotating_light: for active SEV1/2, :warning: for degraded, :white_check_mark: for resolved. - Stakeholder: No jargon. Translate to business impact. - Tone: Calm, factual, action-oriented. Never blame individuals. - Structured output only โ return ONLY valid JSON, no prose. """ Instructions as config, not code. Agent behaviour is defined entirely by instruction text strings. A non-developer can refine agent behaviour by editing the prompt and redeploying no Python changes needed. The Incident Envelope: What Goes In The agent accepts a single JSON envelope. It can come from a monitoring alert webhook, a PagerDuty payload, or a manual CLI invocation: Incident Input (JSON) { "incident_id": "INC-20260217-002", "title": "DB connection pool exhausted โ checkout-api degraded", "severity": "SEV1", "timeframe": { "start": "2026-02-17T14:02:00Z", "end": null }, "alerts": [ { "name": "DatabaseConnectionPoolNearLimit", "description": "Connection pool at 99.7% on orders-db-primary", "timestamp": "2026-02-17T14:03:00Z" } ], "logs": [ { "source": "order-worker", "lines": [ "ERROR: connection timeout after 30s (attempt 3/3)", "WARN: pool exhausted, queueing request (queue_depth=847)" ] } ], "metrics": [ { "name": "db_connection_pool_utilization_pct", "window": "5m", "values_summary": "Jumped from 22% to 99.7% at 14:03Z" } ], "runbook_excerpt": "Step 1: Check DB connection dashboard...", "constraints": { "max_time_minutes": 15, "environment": "production", "region": "swedencentral" } } Declaring the Hosted Agent The agent is registered with Microsoft Foundry via a declarative agent.yaml file. This tells Foundry how to discover and route requests to the container: agent.yaml kind: hosted name: oncall-copilot description: | Multi-agent hosted agent that ingests incident signals and runs 4 specialist agents concurrently via Microsoft Agent Framework ConcurrentBuilder. metadata: tags: - Azure AI AgentServer - Microsoft Agent Framework - Multi-Agent - Model Router protocols: - protocol: responses environment_variables: - name: AZURE_OPENAI_ENDPOINT value: ${AZURE_OPENAI_ENDPOINT} - name: AZURE_OPENAI_CHAT_DEPLOYMENT_NAME value: model-router The protocols: [responses] declaration exposes the agent via the Foundry Responses API on port 8088. Clients can invoke it with a standard HTTP POST no custom API needed. Invoking the Agent Once deployed, you can invoke the agent with the projectโs built-in scripts or directly via curl : CLI / curl # Using the included invoke script python scripts/invoke.py --demo 2 # multi-signal SEV1 demo python scripts/invoke.py --scenario 1 # Redis cluster outage # Or with curl directly TOKEN=$(az account get-access-token \ --resource https://ai.azure.com --query accessToken -o tsv) curl -X POST \ "$AZURE_AI_PROJECT_ENDPOINT/openai/responses?api-version=2025-05-15-preview" \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d '{ "input": [ {"role": "user", "content": "<incident JSON here>"} ], "agent": { "type": "agent_reference", "name": "oncall-copilot" } }' The Browser UI The project includes a zero-dependency browser UI built with plain HTML, CSS, and vanilla JavaScriptโno React, no bundler. A Python http.server backend proxies requests to the Foundry endpoint. The empty state. Quick-load buttons pre-populate the JSON editor with demo incidents or scenario files. Demo 1 loaded: API Gateway 5xx spike, SEV3. The JSON is fully editable before submitting. Agent Output Panels Triage: Root causes ranked by confidence. Evidence is collapsed under each hypothesis. Triage: Immediate actions with P0/P1/P2 priority badges and owner roles. Comms: Slack card with emoji substitution and a stakeholder executive summary. PIR: Chronological timeline with an ONGOING marker, customer impact in a red-bordered box. Performance: Parallel Execution Matters Incident Type Complexity Parallel Latency Sequential (est.) Single alert, minimal context (SEV4) Low 4โ6 s ~16 s Multi-signal, logs + metrics (SEV2) Medium 7โ10 s ~28 s Full SEV1 with long log lines High 10โ15 s ~40 s Post-incident synthesis (resolved) High 10โ14 s ~38 s asyncio.gather() running four independent agents cuts total latency by 3โ4ร compared to sequential execution. For a SEV1 at 3 AM, thatโs the difference between a 10-second AI-powered head start and a 40-second wait. Five Key Design Decisions Parallel over sequential Each agent is independent and processes the full incident payload in isolation. ConcurrentBuilder with asyncio.gather() is the right primitiveโno inter-agent dependencies, no shared state. JSON-only agent instructions Every agent returns only valid JSON with a defined schema. The orchestrator merges fragments with merged.update(agent_output) . No parsing, no extraction, no post-processing. No hardcoded model names AZURE_OPENAI_CHAT_DEPLOYMENT_NAME=model-router is the only model reference. Model Router selects the best model at runtime based on prompt complexity. When new models ship, the agent gets better for free. DefaultAzureCredential everywhere No API keys. No token management code. Managed identity in production, az login in development. Same code, both environments. Instructions as configuration Each agentโs system prompt is a plain Python string. Behaviour changes are text edits, not code logic. A non-developer can refine prompts and redeploy. Guardrails: Built into the Prompts The agent instructions include explicit guardrails that donโt require external filtering: No hallucination: When data is insufficient, the agent sets confidence: 0 and populates missing_information rather than inventing facts. Secret redaction: Each agent is instructed to redact credential-like patterns as [REDACTED] in its output. Mark unknowns: Undeterminable fields use the literal string "UNKNOWN" rather than plausible-sounding guesses. Diagnostic suggestions: When signal is sparse, immediate_actions includes diagnostic steps that gather missing information before prescribing a fix. Model Router: Automatic Model Selection One of the most powerful aspects of this architecture is Model Router. Instead of choosing between gpt-4o , gpt-4o-mini , or o3-mini per agent, you deploy a single model-router endpoint. Model Router analyses each requestโs complexity and routes it to the most cost-effective model that can handle it. Model Router insights: models selected per request with associated costs. Model Router telemetry from Microsoft Foundry: request distribution and cost analysis. This means you get optimal cost-performance without writing any model-selection logic. A simple Summary Agent prompt may route to gpt-4o-mini , while a complex Triage Agent prompt with 800 lines of logs routes to gpt-4o all automatically. Deployment: One Command The repo includes both azure.yaml and agent.yaml , so deployment is a single command: Deploy to Foundry # Deploy everything: infra + container + Model Router + Hosted Agent azd up This provisions the Foundry project resources, builds the Docker image, pushes to Azure Container Registry, deploys a Model Router instance, and creates the Hosted Agent. For more control, you can use the SDK deploy script: Manual Docker + SDK deploy # Build and push (must be linux/amd64) docker build --platform linux/amd64 -t oncall-copilot:v1 . docker tag oncall-copilot:v1 $ACR_IMAGE docker push $ACR_IMAGE # Create the hosted agent python scripts/deploy_sdk.py Getting Started Quickstart # Clone git clone https://github.com/microsoft-foundry/oncall-copilot cd oncall-copilot # Install python -m venv .venv source .venv/bin/activate # .venv\Scripts\activate on Windows pip install -r requirements.txt # Set environment variables export AZURE_OPENAI_ENDPOINT="https://<account>.openai.azure.com/" export AZURE_OPENAI_CHAT_DEPLOYMENT_NAME="model-router" export AZURE_AI_PROJECT_ENDPOINT="https://<account>.services.ai.azure.com/api/projects/<project>" # Validate schemas locally (no Azure needed) MOCK_MODE=true python scripts/validate.py # Deploy to Foundry azd up # Invoke the deployed agent python scripts/invoke.py --demo 1 # Start the browser UI python ui/server.py # โ http://localhost:7860 Extending: Add Your Own Agent Adding a fifth agent is straightforward. Follow this pattern: Create app/agents/<name>.py with a *_INSTRUCTIONS constant following the existing pattern. Add the agentโs output keys to app/schemas.py . Register it in main.py : main.py โ Adding a 5th agent from app.agents.my_new_agent import NEW_INSTRUCTIONS new_agent = AzureOpenAIChatClient( ad_token_provider=_token_provider ).create_agent( instructions=NEW_INSTRUCTIONS, name="new-agent", ) workflow = ConcurrentBuilder().participants( [triage, summary, comms, pir, new_agent] ) Ideas for extensions: a ticket auto-creation agent that creates Jira or Azure DevOps items from the PIR output, a webhook adapter agent that normalises PagerDuty or Datadog payloads, or a human-in-the-loop agent that surfaces missing_information as an interactive form. Key Takeaways for AI Engineers The multi-agent pattern isnโt just for chatbots. Any task that can be decomposed into independent subtasks with distinct output schemas is a candidate. Incident response, document processing, code review, data pipeline validationโthe pattern transfers. Microsoft Agent Framework gives you ConcurrentBuilder for parallel execution and AzureOpenAIChatClient for Azure-native authโyou write the prompts, the framework handles the plumbing. Foundry Hosted Agents let you deploy containerised agents with managed infrastructure, automatic scaling, and built-in telemetry. No Kubernetes, no custom API gateway. Model Router eliminates the model selection problem. One deployment name handles all scenarios with optimal cost-performance tradeoffs. Prompt-as-config means your agents are iterable by anyone who can edit text. The feedback loop from โthis output could be betterโ to โdeployed improvementโ is minutes, not sprints. Resources Microsoft Agent Framework SDK powering the multi-agent orchestration Model Router Automatic model selection based on prompt complexity Foundry Hosted Agents Deploy containerised agents on managed infrastructure ConcurrentBuilder Samples Official agents-in-workflow sample this project follows DefaultAzureCredential Zero-config auth chain used throughout Hosted Agents Concepts Architecture overview of Foundry Hosted Agents The On-Call Copilot sample is open source under the MIT licence. Contributions, scenario files, and agent instruction improvements are welcome via pull request.On-demand webinar: Maximize the Cost Efficiency of AI Agents on Azure
AI agents are quickly becoming central to how organizations automate work, engage customers, and unlock new insights. But as adoption accelerates, so do questions about cost, ROI, and long-term sustainability. Thatโs exactly what the Maximize the Cost Efficiency of AI Agents on Azure webinar is designed to address. The webinar will provide practical guidance on building and scaling AI agents on Azure with financial discipline in mind. Rather than focusing only on technology, the session helps learners connect AI design decisions to real business outcomesโcovering everything from identifying high-impact use cases and understanding cost drivers to forecasting ROI. Whether youโre just starting your AI journey or expanding AI agents across the enterprise, the session will equip you with strategies to make informed, cost-conscious decisions at every stageโfrom architecture and model selection to ongoing optimization and governance. Who should attend? If you are in one of these roles and are a decision maker or can influence decision makers in AI decisions or need to show ROI metrics on AI, this session is for you. Developer Administrator Solution Architect AI Engineer Business Analyst Business User Technology Manager Why attending the webinar? In the webinar, youโll hear how to translate theory into real-world scenarios, walk through common cost pitfalls, and show how organizations are applying these principles in practice. Most importantly, the webinar helps you connect the dots faster, turning what youโve learned into actionable insights you can apply immediately, ask questions live, and gain clarity on how to maximize ROI while scaling AI responsibly. If you care about building AI agents that are not only innovative but also efficient, governable, and financially sustainable, this trainingโand this webinar that complements itโare well worth your time. Missed it? Watch it on-demand Who will speak at the webinar? Your speakers will be: Carlotta Castelluccio: Carlotta is a Senior AI Advocate with the mission of helping every developer to succeed with AI, by building innovative solutions responsibly. To achieve this goal, she develops technical content, and she hosts skilling sessions, enabling her audience to take the most out of AI technologies and to have an impact on Microsoft AI productsโ roadmap. Nitya Narasimhan: Nitya is a PhD and Polyglot with 25+ years of software research & development experience spanning mobile, web, cloud and AI. She is an innovator (12+ patents), a visual storyteller (@sketchtedocs), and an experienced community builder in the Greater New York area. As a senior AI Advocate on the Core AI Developer Relations team, she acts as "developer 0" for the Microsoft Foundry platform, providing product feedback and empowering AI developers to build trustworthy AI solutions with code samples, open-source curricula and content-initiatives like Model Mondays. Prior to joining Microsoft, she spent a decade in Motorola Labs working on ubiquitous & mobile computing research, founded Google Developer Groups in New York, and consulted for startups building real-time experiences for enterprise. Her current interests span Model understanding & customization, E2E Observability & Safety, and agentic AI workflows for maintainable software. Moderator Lee Stott is a Principal Cloud Advocate at Microsoft, working in the Core AI Developer Relations Team. He helps developers and organizations build responsibly with AI and cloud technologies through open-source projects, technical guidance, and global developer programs. Based in the UK, Lee brings deep hands-on experience across AI, Azure, and developer tooling. Useful resources Microsoft Learn Training Path: https://aka.ms/maximize-cost-efficiency-ai-agents-training Session Deck: https://aka.ms/maximize-cost-efficiency-ai-agents-deckMicrosoft Agent Framework, Microsoft Foundry, MCP, Aspire๋ฅผ ํ์ฉํ ์ค์ ์์ ๋ง๋ค๊ธฐ
AI ์์ด์ ํธ๋ฅผ ๊ฐ๋ฐํ๋ ๊ฒ์ ์ ์ ์ฌ์์ง๊ณ ์์ต๋๋ค. ํ์ง๋ง ์ฌ๋ฌ ์๋น์ค, ์ํ ๊ด๋ฆฌ, ํ๋ก๋์ ์ธํ๋ผ๋ฅผ ๊ฐ์ถ ์ค์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ผ๋ถ๋ก ๋ฐฐํฌํ๋ ๊ฒ์ ์ฌ์ ํ ๋ณต์กํฉ๋๋ค. ์ค์ ๋ก .NET ๊ฐ๋ฐ์ ์ปค๋ฎค๋ํฐ์์๋ ๋ก์ปฌ ๋จธ์ ๊ณผ ํด๋ผ์ฐ๋ ๋ค์ดํฐ๋ธ ๋ฐฉ์์ ํด๋ผ์ฐ๋ ํ๊ฒฝ ๋ชจ๋์์ ์ค์ ๋ก ๋์ํ๋ ์ค์ ์์ ์ ๋ํ ์๊ตฌ๊ฐ ๋ง์์ต๋๋ค. ๊ทธ๋์ ์ค๋นํ์ต๋๋ค! Microsoft Agent Framework๊ณผ Microsoft Foundry, MCP(Model Context Protocol), Aspire๋ฑ์ ์ด๋ป๊ฒ ํ๋ก๋์ ์ํฉ์์ ์กฐํฉํ ์ ์๋์ง๋ฅผ ๋ณด์ฌ์ฃผ๋ ์คํ์์ค Interview Coach ์ํ์ ๋๋ค. AI ์ฝ์น๊ฐ ์ธ์ฑ ๋ฉด์ ์ง๋ฌธ๊ณผ ๊ธฐ์ ๋ฉด์ ์ง๋ฌธ์ ์๋ดํ ํ, ์์ฝ์ ์ ๊ณตํ๋ ํจ์จ์ ์ธ ๋ฉด์ ์๋ฎฌ๋ ์ดํฐ์ ๋๋ค. ์ด ํฌ์คํธ์์๋ ์ด๋ค ํจํด์ ์ฌ์ฉํ๊ณ ํด๋น ํจํด์ด ํด๊ฒฐํ ์ ์๋ ๋ฌธ์ ๋ฅผ ๋ค๋ฃน๋๋ค. Interview Coach ๋ฐ๋ชจ ์ฑ์ ๋ฐฉ๋ฌธํด ๋ณด์ธ์. ์ Microsoft Agent Framework์ ์จ์ผ ํ๋์? .NET์ผ๋ก AI ์์ด์ ํธ๋ฅผ ๊ตฌ์ถํด ๋ณธ ์ ์ด ์๋ค๋ฉด, Semantic Kernel์ด๋ AutoGen, ๋๋ ๋ ๊ฐ์ง ๋ชจ๋๋ฅผ ์ฌ์ฉํด ๋ณธ ์ ์ด ์์ ๊ฒ๋๋ค. Microsoft Agent Framework๋ ๊ทธ ๋ค์ ๋จ๊ณ๋ก์, ๊ฐ๊ฐ์ ํ๋ก์ ํธ์์ ํจ๊ณผ์ ์ด์๋ ๋ถ๋ถ์ ํ๋์ ํ๋ ์์ํฌ๋ก ํตํฉํ์ต๋๋ค. AutoGen์ ์์ด์ ํธ ์ถ์ํ์ Semantic Kernel์ ์ํฐํ๋ผ์ด์ฆ ๊ธฐ๋ฅ(์ํ ๊ด๋ฆฌ, ํ์ ์์ ์ฑ, ๋ฏธ๋ค์จ์ด, ํ ๋ ๋ฉํธ๋ฆฌ ๋ฑ)์ ํ๋๋ก ํตํฉํ์ต๋๋ค. ๋ํ ๋ฉํฐ ์์ด์ ํธ ์ค์ผ์คํธ๋ ์ด์ ์ ์ํ ๊ทธ๋ํ ๊ธฐ๋ฐ ์ํฌํ๋ก์ฐ๋ ์ถ๊ฐํ์ต๋๋ค. ๊ทธ๋ ๋ค๋ฉด .NET ๊ฐ๋ฐ์์๊ฒ ์ด๊ฒ์ด ์ด๋ค ์๋ฏธ๋ก ๋ค๊ฐ์ฌ๊น์? ํ๋์ ํ๋ ์์ํฌ. Semantic Kernel๊ณผ AutoGen ์ฌ์ด์์ ๋ ์ด์ ๊ณ ๋ฏผํ ํ์๊ฐ ์์ต๋๋ค. ์ต์ํ ํจํด. ์์ด์ ํธ๋ ์์กด์ฑ ์ฃผ์ , IChatClient , ๊ทธ๋ฆฌ๊ณ ASP.NET ์ฑ๊ณผ ๋์ผํ ํธ์คํ ๋ชจ๋ธ์ ์ฌ์ฉํฉ๋๋ค. ํ๋ก๋์ ์ ์ํ ์ค๊ณ. OpenTelemetry, ๋ฏธ๋ค์จ์ด ํ์ดํ๋ผ์ธ, Aspire ํตํฉ์ด ํฌํจ๋์ด ์์ต๋๋ค. ๋ฉํฐ ์์ด์ ํธ ์ค์ผ์คํธ๋ ์ด์ . ์์ฐจ ์คํ, ๋์ ์คํ, ํธ๋์คํ ํจํด, ๊ทธ๋ฃน ์ฑํ ๋ฑ ๋ค์ํ ๋ฉํฐ ์์ด์ ํธ ์ค์ผ์คํธ๋ ์ด์ ํจํด์ ์ง์ํฉ๋๋ค. Interview Coach๋ ์ด ๋ชจ๋ ๊ฒ์ Hello World๊ฐ ์๋ ์ค์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ฉํฉ๋๋ค. ์ Microsoft Foundry๋ฅผ ์จ์ผ ํ๋์? AI ์์ด์ ํธ์๋ ๋ชจ๋ธ ๋ง๊ณ ๋ ๋ ๋ง์ ๋ฌด์ธ๊ฐ๊ฐ ํ์ํฉ๋๋ค. ์ฐ์ ์ธํ๋ผ๊ฐ ํ์ํ๊ฒ ์ฃ . Microsoft Foundry๋ AI ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๊ณ ๊ด๋ฆฌํ๊ธฐ ์ํ Azure ํ๋ซํผ์ด๋ฉฐ, Microsoft Agent Framework์ ๊ถ์ฅ ๋ฐฑ์๋์ ๋๋ค. Foundry๋ ์์ฒด ํฌํธ์์ ์๋์ ๊ฐ์ ๋ด์ฉ์ ์ ๊ณตํฉ๋๋ค: ๋ชจ๋ธ ์ก์ธ์ค. OpenAI, Meta, Mistral ๋ฑ์ ๋ชจ๋ธ ์นดํ๋ก๊ทธ๋ฅผ ํ๋์ ์๋ํฌ์ธํธ๋ก ์ ๊ณตํฉ๋๋ค. ์ฝํ ์ธ ์ธ์ดํํฐ. ์์ด์ ํธ๊ฐ ๋ฒ์ด๋์ง ์๋๋ก ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํ๋ ์ฝํ ์ธ ์กฐ์ ๋ฐ PII ๊ฐ์ง ๊ธฐ๋ฅ์ด ์์ต๋๋ค. ๋น์ฉ ์ต์ ํ ๋ผ์ฐํ . ์์ด์ ํธ์ ์์ฒญ์ ์๋์ผ๋ก ์ต์ ์ ๋ชจ๋ธ๋ก ๋ผ์ฐํ ํฉ๋๋ค. ํ๊ฐ ๋ฐ ํ์ธํ๋. ์์ด์ ํธ ํ์ง์ ์ธก์ ํ๊ณ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ๊ฐ์ ํ ์ ์์ต๋๋ค. ์ํฐํ๋ผ์ด์ฆ ๊ฑฐ๋ฒ๋์ค. Entra ID์ Microsoft Defender๋ฅผ ํตํ ID, ์ก์ธ์ค ์ ์ด, ๊ท์ ์ค์๋ฅผ ์ง์ํฉ๋๋ค. Interview Coach์์ Foundry๋ ์์ด์ ํธ๋ฅผ ๊ตฌ๋ํ๋ ๋ชจ๋ธ ์๋ํฌ์ธํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์์ด์ ํธ ์ฝ๋๊ฐ IChatClient ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์, Foundry๋ LLM ์ ํ์ ์ํ ์ค์ ์ ๋ถ๊ณผํ ์๋ ์๊ฒ ์ง๋ง, ์์ด์ ํธ๊ฐ ํ์๋ก ํ๋ ๊ฐ์ฅ ๋ง์ ๋๊ตฌ๋ฅผ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ๋ ์ ํ์ง์ ๋๋ค. Interview Coach๋ ๋ฌด์์ ํ๋์? Interview Coach๋ ๋ชจ์ ๋ฉด์ ์ ์งํํ๋ ๋ํํ AI์ ๋๋ค. ์ด๋ ฅ์์ ์ฑ์ฉ ๊ณต๊ณ ๋ฅผ ์ ๊ณตํ๋ฉด, ์์ด์ ํธ๊ฐ ๋๋จธ์ง๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค: ์ ์. ์ด๋ ฅ์์ ๋ชฉํ ์ง๋ฌด ์ค๋ช ์ ์์งํฉ๋๋ค. ํ๋ ๋ฉด์ . ๊ฒฝํ์ ๋ง์ถ STAR ๊ธฐ๋ฒ ์ง๋ฌธ์ ํฉ๋๋ค. ๊ธฐ์ ๋ฉด์ . ์ง๋ฌด๋ณ ๊ธฐ์ ์ง๋ฌธ์ ํฉ๋๋ค. ์์ฝ. ๊ตฌ์ฒด์ ์ธ ํผ๋๋ฐฑ๊ณผ ํจ๊ป ์ฑ๊ณผ ๋ฆฌ๋ทฐ๋ฅผ ์์ฑํฉ๋๋ค. Blazor ์น UI๋ฅผ ํตํด ์ค์๊ฐ์ผ๋ก ์๋ต ์คํธ๋ฆฌ๋ฐ์ ์ ๊ณตํ๋ฉฐ ์ฌ์ฉ์์ ์์ด์ ํธ๊ฐ ์ํธ์์ฉํฉ๋๋ค. ์ํคํ ์ฒ ๊ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์ Aspire๋ฅผ ํตํด ๋ค์ํ ์๋น์ค๋ฅผ ์ค์ผ์คํธ๋ ์ด์ ํฉ๋๋ค: LLM ์ ๊ณต์. ๋ค์ํ ๋ชจ๋ธ ์ก์ธ์ค๋ฅผ ์ํ Microsoft Foundry (๊ถ์ฅ). WebUI. ๋ฉด์ ๋ํ๋ฅผ ์ํ Blazor ์ฑํ ์ธํฐํ์ด์ค. ์์ด์ ํธ. Microsoft Agent Framework๋ก ๊ตฌ์ถ๋ ๋ฉด์ ๋ก์ง. MarkItDown MCP ์๋ฒ. Microsoft์ MarkItDown์ ํตํด ์ด๋ ฅ์(PDF, DOCX)๋ฅผ ๋งํฌ๋ค์ด์ผ๋ก ๋ณํํฉ๋๋ค. InterviewData MCP ์๋ฒ. SQLite์ ์ธ์ ์ ์ ์ฅํ๋ .NET MCP ์๋ฒ. Aspire๊ฐ ์๋น์ค ๋์ค์ปค๋ฒ๋ฆฌ, ์ํ ํ์ธ, ํ ๋ ๋ฉํธ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค. ๊ฐ ์ปดํฌ๋ํธ๋ ๋ณ๋์ ํ๋ก์ธ์ค๋ก ์คํ์ํค๋ฉฐ, ํ๋์ ์ปค๋งจ๋ ๋ง์ผ๋ก ์ ์ฒด๋ฅผ ์์ํ ์ ์์ต๋๋ค. ํจํด 1: ๋ฉํฐ ์์ด์ ํธ ํธ๋์คํ ์ด ์ํ์์ ๊ฐ์ฅ ํฅ๋ฏธ๋ก์ด ๋ถ๋ถ์ด๊ธฐ๋ ํ ํธ๋์คํ ํจํด์ผ๋ก ๋ฉํฐ ์์ด์ ํธ ์๋๋ฆฌ์ค๋ฅผ ๊ตฌ์ฑํ์ต๋๋ค. ํ๋์ ์์ด์ ํธ๊ฐ ๋ชจ๋ ๊ฒ์ ์ฒ๋ฆฌํ๋ ๋์ , ๋ฉด์ ์ ๋ค์ฏ ๊ฐ์ ์ ๋ฌธ ์์ด์ ํธ๋ก ๋๋ฉ๋๋ค: ์์ด์ ํธ ์ญํ ๋๊ตฌ Triage ๋ฉ์์ง๋ฅผ ์ ์ ํ ์ ๋ฌธ๊ฐ์๊ฒ ๋ผ์ฐํ ์์ (์์ ๋ผ์ฐํ ) Receptionist ์ธ์ ์์ฑ, ์ด๋ ฅ์ ๋ฐ ์ฑ์ฉ ๊ณต๊ณ ์์ง MarkItDown + InterviewData Behavioral Interviewer STAR ๊ธฐ๋ฒ์ ํ์ฉํ ํ๋ ๋ฉด์ ์ง๋ฌธ ์งํ InterviewData Technical Interviewer ์ง๋ฌด๋ณ ๊ธฐ์ ์ง๋ฌธ ์งํ InterviewData Summarizer ์ต์ข ๋ฉด์ ์์ฝ ์์ฑ InterviewData ํธ๋์คํ ํจํด์์๋ ํ๋์ ์์ด์ ํธ๊ฐ ๋ํ์ ์ ์ฒด ์ ์ด๊ถ์ ๋ค์ ์์ด์ ํธ์๊ฒ ๋๊น๋๋ค. ๊ทธ๋ฌ๋ฉด ๋๊ฒจ ๋ฐ๋ ์์ด์ ํธ๊ฐ ๋ชจ๋ ์ ์ด๊ถ์ ์ธ์ํฉ๋๋ค. ์ด๋ ์ฃผ ์์ด์ ํธ๊ฐ ๋ค๋ฅธ ์์ด์ ํธ๋ฅผ ๋์ฐ๋ฏธ๋ก ํธ์ถํ๋ฉด์๋ ์ ์ด๊ถ์ ์ ์งํ๋ "agent-as-tools(๋๊ตฌ๋ก์์ ์์ด์ ํธ)" ๋ฐฉ์๊ณผ๋ ๋ค๋ฆ ๋๋ค. ํธ๋์คํ ์ํฌํ๋ก์ฐ๋ฅผ ์ด๋ป๊ฒ ๊ตฌ์ฑํ๋์ง ์ดํด๋ณด์์ฃ : var workflow = AgentWorkflowBuilder .CreateHandoffBuilderWith(triageAgent) .WithHandoffs(triageAgent, [receptionistAgent, behaviouralAgent, technicalAgent, summariserAgent]) .WithHandoffs(receptionistAgent, [behaviouralAgent, triageAgent]) .WithHandoffs(behaviouralAgent, [technicalAgent, triageAgent]) .WithHandoffs(technicalAgent, [summariserAgent, triageAgent]) .WithHandoff(summariserAgent, triageAgent) .Build(); ๋ฉด์ ์ํฉ์ ์์ํด ๋ณธ๋ค๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ์์ฐจ์ ์ธ ๋ฐฉ์์ผ๋ก ์งํํฉ๋๋ค: Receptionist โ Behavioral โ Technical โ Summarizer. ๊ฐ ์ ๋ฌธ๊ฐ๊ฐ ์ง์ ๋ค์์ผ๋ก ํธ๋์คํํฉ๋๋ค. ์์์น ๋ชปํ ์ํฉ์ด ๋ฐ์ํ๋ฉด, ์์ด์ ํธ๋ ์ฌ๋ผ์ฐํ ์ ์ํด Triage๋ก ๋์๊ฐ๋๋ค. ์ด ์ํ์๋ ๋ ๊ฐ๋จํ ๋ฐฐํฌ๋ฅผ ์ํ ๋จ์ผ ์์ด์ ํธ ๋ชจ๋๋ ํฌํจํ๊ณ ์์ด, ๋ ๊ฐ์ง ์ ๊ทผ ๋ฐฉ์์ ๋๋ํ ๋น๊ตํ ์ ์์ต๋๋ค. ํจํด 2: ๋๊ตฌ ํตํฉ์ ์ํ MCP ์ด ํ๋ก์ ํธ์์ ๋๊ตฌ๋ ์์ด์ ํธ ๋ด๋ถ์ ๊ตฌํํ๋ ๋์ MCP(Model Context Protocol) ์๋ฒ๋ฅผ ํตํด ํตํฉํฉ๋๋ค. ๋์ผํ MarkItDown ์๋ฒ๊ฐ ์์ ํ ๋ค๋ฅธ ์์ด์ ํธ ํ๋ก์ ํธ์์๋ ์ฐ์ผ ์ ์์ผ๋ฉฐ, ๋๊ตฌ ๊ฐ๋ฐํ์ ์์ด์ ํธ ๊ฐ๋ฐํ๊ณผ ๋ ๋ฆฝ์ ์ผ๋ก ๋ฐฐํฌํ ์ ์์ต๋๋ค. MCP๋ ๋ํ ์ธ์ด์ ๊ตฌ์ ๋ฐ์ง ์์ผ๋ฏ๋ก, ์ด ์ํ ์ฑ์์ ์ฐ์ธ MarkItDown์ Python ๊ธฐ๋ฐ์ ์๋ฒ์ด๊ณ , ์์ด์ ํธ๋ .NET ๊ธฐ๋ฐ์ผ๋ก ๋์ํฉ๋๋ค. ์์ด์ ํธ๋ ์์ ์ MCP ํด๋ผ์ด์ธํธ๋ฅผ ํตํด ๋๊ตฌ๋ฅผ ๋ฐ๊ฒฌํ๊ณ , ์ ์ ํ ์์ด์ ํธ์๊ฒ ์ ๋ฌํฉ๋๋ค: var receptionistAgent = new ChatClientAgent( chatClient: chatClient, name: "receptionist", instructions: "You are the Receptionist. Set up sessions and collect documents...", tools: [.. markitdownTools, .. interviewDataTools]); ๊ฐ ์์ด์ ํธ๋ ํ์ํ ๋๊ตฌ๋ง ๋ฐ์ต๋๋ค. Triage๋ ๋๊ตฌ๋ฅผ ๋ฐ์ง ์๊ณ (๋ผ์ฐํ ๋ง ์ํ), ๋ฉด์ ๊ด์ ์ธ์ ์ก์ธ์ค๋ฅผ, Receptionist๋ ๋ฌธ์ ํ์ฑ๊ณผ ์ธ์ ์ก์ธ์ค๋ฅผ ๋ฐ์ต๋๋ค. ์ด๋ ์ต์ ๊ถํ ์์น์ ๋ฐ๋ฆ ๋๋ค. ํจํด 3: Aspire ์ค์ผ์คํธ๋ ์ด์ Aspire๊ฐ ๋ชจ๋ ๊ฒ์ ํ๋๋ก ์ฐ๊ฒฐํฉ๋๋ค. ์ฑ ํธ์คํธ๋ ์๋น์ค ํ ํด๋ก์ง๋ฅผ ์ ์ํฉ๋๋ค: ์ด๋ค ์๋น์ค๊ฐ ์กด์ฌํ๋์ง, ์๋ก ์ด๋ป๊ฒ ์์กดํ๋์ง, ์ด๋ค ๊ตฌ์ฑ์ ๋ฐ๋์ง. ๋ค์์ ์ ๊ณตํฉ๋๋ค: ์๋น์ค ๋์ค์ปค๋ฒ๋ฆฌ. ์๋น์ค๊ฐ ํ๋์ฝ๋ฉ๋ URL์ด ์๋ ์ด๋ฆ์ผ๋ก ์๋ก๋ฅผ ์ฐพ์ต๋๋ค. ์ํ ํ์ธ. Aspire ๋์๋ณด๋์์ ๋ชจ๋ ์ปดํฌ๋ํธ์ ์ํ๋ฅผ ๋ณด์ฌ์ค๋๋ค. ๋ถ์ฐ ์ถ์ . ๊ณต์ ์๋น์ค ๊ธฐ๋ณธ๊ฐ์ ํตํด OpenTelemetry๊ฐ ์ฐ๊ฒฐ๋ฉ๋๋ค. ๋จ์ผ ์ปค๋งจ๋ ์์. aspire run --file ./apphost.cs ๋ก ๋ชจ๋ ๊ฒ์ ์์ํฉ๋๋ค. ๋ฐฐํฌ ์, azd up ์ผ๋ก ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์ Azure Container Apps์ ํธ์ํฉ๋๋ค. ์์ํ๊ธฐ ์ฌ์ ์๊ตฌ ์ฌํญ .NET 10 SDK ์ด์ Azure ๊ตฌ๋ Microsoft Foundry ํ๋ก์ ํธ Docker Desktop ๋๋ ๊ธฐํ ์ปจํ ์ด๋ ๋ฐํ์ ๋ก์ปฌ์์ ์คํํ๊ธฐ git clone https://github.com/Azure-Samples/interview-coach-agent-framework.git cd interview-coach-agent-framework # ์๊ฒฉ ์ฆ๋ช ๊ตฌ์ฑ dotnet user-secrets --file ./apphost.cs set MicrosoftFoundry:Project:Endpoint "<your-endpoint>" dotnet user-secrets --file ./apphost.cs set MicrosoftFoundry:Project:ApiKey "<your-key>" # ๋ชจ๋ ์๋น์ค ์์ aspire run --file ./apphost.cs Aspire ๋์๋ณด๋๋ฅผ ์ด๊ณ , ๋ชจ๋ ์๋น์ค๊ฐ Running์ผ๋ก ํ์๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ ํ, WebUI ์๋ํฌ์ธํธ๋ฅผ ํด๋ฆญํ์ฌ ๋ชจ์ ๋ฉด์ ์ ์์ํ์ธ์. ํธ๋์คํ ํจํด์ด ์ด๋ป๊ฒ ๋์ํ๋์ง DevUI์์ ์๊ฐํํ ๋ชจ์ต์ ๋๋ค. ์ด ์ฑํ UI๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉด์ ํ๋ณด์๋ก์ ์์ด์ ํธ์ ์ํธ์์ฉํ ์ ์์ต๋๋ค. Azure์ ๋ฐฐํฌํ๊ธฐ azd auth login azd up ๋ฐฐํฌ๋ฅผ ์ํด์๋ ์ด๊ฒ ์ฌ์ค์ ์ ๋ถ์ ๋๋ค! Aspire์ azd ๊ฐ ๋๋จธ์ง๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค. ๋ฐฐํฌ์ ํ ์คํธ๋ฅผ ์๋ฃํ ํ, ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํ์ฌ ๋ชจ๋ ๋ฆฌ์์ค๋ฅผ ์์ ํ๊ฒ ์ญ์ ํ ์ ์์ต๋๋ค: azd down --force --purge ์ด ์ํ์์ ๋ฐฐ์ธ ์ ์๋ ๊ฒ Interview Coach๋ฅผ ํตํด ๋ค์์ ๊ฒฝํํ๊ฒ ๋ฉ๋๋ค: Microsoft Foundry๋ฅผ ๋ชจ๋ธ ๋ฐฑ์๋๋ก ์ฌ์ฉํ๊ธฐ Microsoft Agent Framework๋ก ๋จ์ผ ์์ด์ ํธ ๋ฐ ๋ฉํฐ ์์ด์ ํธ ์์คํ ๊ตฌ์ถํ๊ธฐ ํธ๋์คํ ์ค์ผ์คํธ๋ ์ด์ ์ผ๋ก ์ ๋ฌธ ์์ด์ ํธ ๊ฐ ์ํฌํ๋ก์ฐ ๋ถํ ํ๊ธฐ ์์ด์ ํธ ์ฝ๋์ ๋ ๋ฆฝ์ ์ผ๋ก MCP ๋๊ตฌ ์๋ฒ ์์ฑ ๋ฐ ์ฌ์ฉํ๊ธฐ Aspire๋ก ๋ฉํฐ ์๋น์ค ์ ํ๋ฆฌ์ผ์ด์ ์ค์ผ์คํธ๋ ์ด์ ํ๊ธฐ ์ผ๊ด๋๊ณ ๊ตฌ์กฐํ๋ ๋์์ ์์ฑํ๋ ํ๋กฌํํธ ์์ฑํ๊ธฐ azd up ์ผ๋ก ๋ชจ๋ ๊ฒ ๋ฐฐํฌํ๊ธฐ ์ฌ์ฉํด ๋ณด์ธ์ ์ ์ฒด ์์ค ์ฝ๋๋ GitHub์ ์์ต๋๋ค: Azure-Samples/interview-coach-agent-framework Microsoft Agent Framework๊ฐ ์ฒ์์ด๋ผ๋ฉด, ํ๋ ์์ํฌ ๋ฌธ์์ Hello World ์ํ๋ถํฐ ์์ํ์ธ์. ๊ทธ๋ฐ ๋ค์ ์ฌ๊ธฐ๋ก ๋์์์ ๋ ํฐ ํ๋ก์ ํธ์์ ๊ฐ ๋ถ๋ถ์ด ์ด๋ป๊ฒ ๊ฒฐํฉ๋๋์ง ํ์ธํ์ธ์. ์ด๋ฌํ ํจํด์ผ๋ก ๋ฌด์ธ๊ฐ๋ฅผ ๋ง๋ค์๋ค๋ฉด, ์ด์๋ฅผ ์ด์ด ์๋ ค์ฃผ์ธ์. ๋ค์ ๊ณํ ๋ค์๊ณผ ๊ฐ์ ํตํฉ ์๋๋ฆฌ์ค๋ฅผ ํ์ฌ ์์ ์ค์ ๋๋ค. ์์ ์ด ๋๋๋ ๋๋ก ์ด ์ํ ์ฑ์ ์ ๋ฐ์ดํธ ํ๋๋ก ํ๊ฒ ์ต๋๋ค. Microsoft Foundry Agent Service GitHub Copilot A2A ์ฐธ๊ณ ์๋ฃ Microsoft Agent Framework ๋ฌธ์ Microsoft Agent Framework ํ๋ฆฌ๋ทฐ ์๊ฐ Microsoft Agent Framework, ๋ฆด๋ฆฌ์ค ํ๋ณด ๋๋ฌ Microsoft Foundry ๋ฌธ์ Microsoft Foundry Agent Service Microsoft Foundry ํฌํธ Microsoft.Extensions.AI Model Context Protocol ์ฌ์ Aspire ๋ฌธ์ ASP.NET BlazorIntegrating Microsoft Foundry with OpenClaw: Step by Step Model Configuration
Step 1: Deploying Models on Microsoft Foundry Let us kick things off in the Azure portal. To get our OpenClaw agent thinking like a genius, we need to deploy our models in Microsoft Foundry. For this guide, we are going to focus on deploying gpt-5.2-codex on Microsoft Foundry with OpenClaw. Navigate to your AI Hub, head over to the model catalog, choose the model you wish to use with OpenClaw and hit deploy. Once your deployment is successful, head to the endpoints section. Important: Grab your Endpoint URL and your API Keys right now and save them in a secure note. We will need these exact values to connect OpenClaw in a few minutes. Step 2: Installing and Initializing OpenClaw Next up, we need to get OpenClaw running on your machine. Open up your terminal and run the official installation script: curl -fsSL https://openclaw.ai/install.sh | bash The wizard will walk you through a few prompts. Here is exactly how to answer them to link up with our Azure setup: First Page (Model Selection): Choose "Skip for now". Second Page (Provider): Select azure-openai-responses. Model Selection: Select gpt-5.2-codex , For now only the models listed (hosted on Microsoft Foundry) in the picture below are available to be used with OpenClaw. Follow the rest of the standard prompts to finish the initial setup. Step 3: Editing the OpenClaw Configuration File Now for the fun part. We need to manually configure OpenClaw to talk to Microsoft Foundry. Open your configuration file located at ~/.openclaw/openclaw.json in your favorite text editor. Replace the contents of the models and agents sections with the following code block: { "models": { "providers": { "azure-openai-responses": { "baseUrl": "https://<YOUR_RESOURCE_NAME>.openai.azure.com/openai/v1", "apiKey": "<YOUR_AZURE_OPENAI_API_KEY>", "api": "openai-responses", "authHeader": false, "headers": { "api-key": "<YOUR_AZURE_OPENAI_API_KEY>" }, "models": [ { "id": "gpt-5.2-codex", "name": "GPT-5.2-Codex (Azure)", "reasoning": true, "input": ["text", "image"], "cost": { "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 }, "contextWindow": 400000, "maxTokens": 16384, "compat": { "supportsStore": false } }, { "id": "gpt-5.2", "name": "GPT-5.2 (Azure)", "reasoning": false, "input": ["text", "image"], "cost": { "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 }, "contextWindow": 272000, "maxTokens": 16384, "compat": { "supportsStore": false } } ] } } }, "agents": { "defaults": { "model": { "primary": "azure-openai-responses/gpt-5.2-codex" }, "models": { "azure-openai-responses/gpt-5.2-codex": {} }, "workspace": "/home/<USERNAME>/.openclaw/workspace", "compaction": { "mode": "safeguard" }, "maxConcurrent": 4, "subagents": { "maxConcurrent": 8 } } } } You will notice a few placeholders in that JSON. Here is exactly what you need to swap out: Placeholder Variable What It Is Where to Find It <YOUR_RESOURCE_NAME> The unique name of your Azure OpenAI resource. Found in your Azure Portal under the Azure OpenAI resource overview. <YOUR_AZURE_OPENAI_API_KEY> The secret key required to authenticate your requests. Found in Microsoft Foundry under your project endpoints or Azure Portal keys section. <USERNAME> Your local computer's user profile name. Open your terminal and type whoami to find this. Step 4: Restart the Gateway After saving the configuration file, you must restart the OpenClaw gateway for the new Foundry settings to take effect. Run this simple command: openclaw gateway restart Configuration Notes & Deep Dive If you are curious about why we configured the JSON that way, here is a quick breakdown of the technical details. Authentication Differences Azure OpenAI uses the api-key HTTP header for authentication. This is entirely different from the standard OpenAI Authorization: Bearer header. Our configuration file addresses this in two ways: Setting "authHeader": false completely disables the default Bearer header. Adding "headers": { "api-key": "<key>" } forces OpenClaw to send the API key via Azure's native header format. Important Note: Your API key must appear in both the apiKey field AND the headers.api-key field within the JSON for this to work correctly. The Base URL Azure OpenAI's v1-compatible endpoint follows this specific format: https://<your_resource_name>.openai.azure.com/openai/v1 The beautiful thing about this v1 endpoint is that it is largely compatible with the standard OpenAI API and does not require you to manually pass an api-version query parameter. Model Compatibility Settings "compat": { "supportsStore": false } disables the store parameter since Azure OpenAI does not currently support it. "reasoning": true enables the thinking mode for GPT-5.2-Codex. This supports low, medium, high, and xhigh levels. "reasoning": false is set for GPT-5.2 because it is a standard, non-reasoning model. Model Specifications & Cost Tracking If you want OpenClaw to accurately track your token usage costs, you can update the cost fields from 0 to the current Azure pricing. Here are the specs and costs for the models we just deployed: Model Specifications Model Context Window Max Output Tokens Image Input Reasoning gpt-5.2-codex 400,000 tokens 16,384 tokens Yes Yes gpt-5.2 272,000 tokens 16,384 tokens Yes No Current Cost (Adjust in JSON) Model Input (per 1M tokens) Output (per 1M tokens) Cached Input (per 1M tokens) gpt-5.2-codex $1.75 $14.00 $0.175 gpt-5.2 $2.00 $8.00 $0.50 Conclusion: And there you have it! You have successfully bridged the gap between the enterprise-grade infrastructure of Microsoft Foundry and the local autonomy of OpenClaw. By following these steps, you are not just running a chatbot; you are running a sophisticated agent capable of reasoning, coding, and executing tasks with the full power of GPT-5.2-codex behind it. The combination of Azure's reliability and OpenClaw's flexibility opens up a world of possibilities. Whether you are building an automated devops assistant, a research agent, or just exploring the bleeding edge of AI, you now have a robust foundation to build upon. Now it is time to let your agent loose on some real tasks. Go forth, experiment with different system prompts, and see what you can build. If you run into any interesting edge cases or come up with a unique configuration, let me know in the comments below. Happy coding!4KViews1like2CommentsMCP vs mcp-cli: Dynamic Tool Discovery for Token-Efficient AI Agents
Introduction The AI agent ecosystem is evolving rapidly, and with it comes a scaling challenge that many developers are hitting context window bloat. When building systems that integrate with multiple MCP (Model Context Protocol) servers, you're forced to load all tool definitions upfrontโconsuming thousands of tokens just to describe what tools could be available. mcp-cli: a lightweight tool that changes how we interact with MCP servers. But before diving into mcp-cli, it's essential to understand the foundational protocol itself, the design trade-offs between static and dynamic approaches, and how they differ fundamentally. Part 1: Understanding MCP (Model Context Protocol) What is MCP? The Model Context Protocol (MCP) is an open standard for connecting AI agents and applications to external tools, APIs, and data sources. Think of it as a universal interface that allows: AI Agents (Claude, Gemini, etc.) to discover and call tools Tool Providers to expose capabilities in a standardized way Seamless Integration between diverse systems without custom adapters New to MCP see https://aka.ms/mcp-for-beginners How MCP Works MCP operates on a simple premise: define tools with clear schemas and let clients discover and invoke them. Basic MCP Flow: Tool Provider (MCP Server) โ [Tool Definitions + Schemas] โ AI Agent / Client โ [Discover Tools] โ [Invoke Tools] โ [Get Results] Example: A GitHub MCP server exposes tools like: search_repositories - Search GitHub repos create_issue - Create a GitHub issue list_pull_requests - List open PRs Each tool comes with a JSON schema describing its parameters, types, and requirements. The Static Integration Problem Traditionally, MCP integration works like this: Startup: Load ALL tool definitions from all servers Context Window: Send every tool schema to the AI model Invocation: Model chooses which tool to call Execution: Tool is invoked and result returned The Problem: When you have multiple MCP servers, the token cost becomes substantial: Scenario Token Count 6 MCP Servers, 60 tools (static loading) ~47,000 tokens After dynamic discovery ~400 tokens Token Reduction 99% ๐ For a production system with 10+ servers exposing 100+ tools, you're burning through thousands of tokens just describing capabilities, leaving less context for actual reasoning and problem-solving. Key Issues: โ Reduced effective context length for actual work โ More frequent context compactions โ Hard limits on simultaneous MCP servers โ Higher API costs Part 2: Enter mcp-cli โ Dynamic Context Discovery What is mcp-cli? mcp-cli is a lightweight CLI tool (written in Bun, compiled to a single binary) that implements dynamic context discovery for MCP servers. Instead of loading everything upfront, it pulls in information only when needed. Static vs. Dynamic: The Paradigm Shift Traditional MCP (Static Context): AI Agent Says: "Load all tool definitions from all servers" โ Context Window Bloat โ โ Limited space for reasoning mcp-cli (Dynamic Discovery): AI Agent Says: "What servers exist?" โ mcp-cli responds AI Agent Says: "What are the params for tool X?" โ mcp-cli responds AI Agent Says: "Execute tool X" mcp-cli executes and responds Result: You only pay for information you actually use. โ Core Capabilities mcp-cli provides three primary commands: 1. Discover - What servers and tools exist? mcp-cli Lists all configured MCP servers and their tools. 2. Inspect - What does a specific tool do? mcp-cli info <server> <tool> Returns the full JSON schema for a tool (parameters, descriptions, types). 3. Execute - Run a tool mcp-cli call <server> <tool> '{"arg": "value"}' Executes the tool and returns results. Key Features of mcp-cli Feature Benefit Stdio & HTTP Support Works with both local and remote MCP servers Connection Pooling Lazy-spawn daemon avoids repeated startup overhead Tool Filtering Control which tools are available via allowedTools/disabledTools Glob Searching Find tools matching patterns: mcp-cli grep "*mail*" AI Agent Ready Designed for use in system instructions and agent skills Lightweight Single binary, minimal dependencies Part 3: Detailed Comparison Table Aspect Traditional MCP mcp-cli Protocol HTTP/REST or Stdio Stdio/HTTP (via CLI) Context Loading Static (upfront) Dynamic (on-demand) Tool Discovery All at once Lazy enumeration Schema Inspection Pre-loaded On-request Token Usage High (~47k for 60 tools) Low (~400 for 60 tools) Best For Direct server integration AI agent tool use Implementation Server-side focus CLI-side focus Complexity Medium Low (CLI handles it) Startup Time One call Multiple calls (optimized) Scaling Limited by context Unlimited (pay per use) Integration Custom implementation Pre-built mcp-cli Part 4: When to Use Each Approach Use Traditional MCP (HTTP Endpoints) when: โ Building a direct server integration โ You have few tools (< 10) and don't care about context waste โ You need full control over HTTP requests/responses โ You're building a specialized integration (not AI agents) โ Real-time synchronous calls are required Use mcp-cli when: โ Integrating with AI agents (Claude, Gemini, etc.) โ You have multiple MCP servers (> 2-3) โ Token efficiency is critical โ You want a standardized, battle-tested tool โ You prefer CLI-based automation โ Connection pooling and lazy loading are beneficial โ You're building agent skills or system instructions Conclusion MCP (Model Context Protocol) defines the standard for tool sharing and discovery. mcp-cli is the practical tool that makes MCP efficient for AI agents by implementing dynamic context discovery. The fundamental difference: MCP mcp-cli What The protocol standard The CLI tool Where Both server and client Client-side CLI Problem Solved Tool standardization Context bloat Architecture Protocol Implementation Think of it this way: MCP is the language, mcp-cli is the interpreter that speaks fluently. For AI agent systems, dynamic discovery via mcp-cli is becoming the standard. For direct integrations, traditional MCP HTTP endpoints work fine. The choice depends on your use case, but increasingly, the industry is trending toward mcp-cli for its efficiency and scalability. Resources MCP Specification mcp-cli GitHub New to MCP see https://aka.ms/mcp-for-beginners Practical demo: AnveshMS/mcp-cli-example