<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Microsoft Azure</title>
    <description>The latest articles on DEV Community by Microsoft Azure (azure).</description>
    <link>https://dev.to/azure</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F512%2F64ce0b82-730d-4ca0-8359-2c21513a0063.jpg</url>
      <title>DEV Community: Microsoft Azure</title>
      <link>https://dev.to/azure</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/azure"/>
    <language>en</language>
    <item>
      <title>Getting started with GitHub Copilot part 2, streamable responses</title>
      <dc:creator>Chris Noring</dc:creator>
      <pubDate>Mon, 16 Mar 2026 20:14:28 +0000</pubDate>
      <link>https://dev.to/azure/getting-started-with-github-copilot-part-2-streamable-responses-49a8</link>
      <guid>https://dev.to/azure/getting-started-with-github-copilot-part-2-streamable-responses-49a8</guid>
      <description>&lt;p&gt;I'm sure you've seen many AI apps where you sit tight for 30s or and you wonder if things are stuck? Not a great experience right? Yes, you're right, you deserve better, so how do we fix it?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Type your prompt&amp;gt; Tell me a joke
.
.
.
.
.
.
.
.
Why could I never find the atoms, cause they split..
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;

  &lt;iframe src="https://www.youtube.com/embed/T4p-C2v_0wU"&gt;
  &lt;/iframe&gt;


&lt;/p&gt;

&lt;h2&gt;
  
  
  Series on Copilot SDK
&lt;/h2&gt;

&lt;p&gt;This series is about Copilot SDK and how you can leverage your existing GitHub Copilot license to integrate AI into your apps&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/azure/get-started-with-github-copilot-sdk-1ijm/"&gt;Part 1 - install and your first app&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Part 2 - streamable response, &lt;strong&gt;you're here&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Addressing the problem
&lt;/h2&gt;

&lt;p&gt;By streaming the response, the response now arrives in chunks, pieces that you can show as soon as they arrive. How can we do that though and how can GitHub Copilot SDK help out?&lt;/p&gt;

&lt;p&gt;Well, there's two things you need to do:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enable streaming. You need to set &lt;code&gt;streaming&lt;/code&gt; to &lt;code&gt;True&lt;/code&gt; when you call &lt;code&gt;create_session&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Listen for events that contains a chunk. Specifically, you need to listen to &lt;code&gt;ASSISTANT_MESSAGE_DELTA&lt;/code&gt; and print out the chunk.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 1. Enable streaming
&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_session&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;on_permission_request&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;PermissionHandler&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;approve_all&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;streaming&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Starting streamed response:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Listen for response chunks
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;handle_event&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;SessionEventType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ASSISTANT_MESSAGE_DELTA&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="mf"&gt;2.&lt;/span&gt; &lt;span class="n"&gt;Chunk&lt;/span&gt; &lt;span class="n"&gt;arrived&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;
        &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;delta_content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;flush&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;SessionEventType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SESSION_IDLE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c1"&gt;# New line when done
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here's what the full application looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;copilot&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;CopilotClient&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;PermissionHandler&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;copilot.generated.session_events&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;SessionEventType&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;CopilotClient&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="n"&gt;session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_session&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;on_permission_request&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;PermissionHandler&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;approve_all&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;streaming&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Starting streamed response:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Listen for response chunks
&lt;/span&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;handle_event&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;SessionEventType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ASSISTANT_MESSAGE_DELTA&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;delta_content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;flush&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;SessionEventType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SESSION_IDLE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c1"&gt;# New line when done
&lt;/span&gt;
    &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;handle_event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Sending prompt...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send_and_wait&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prompt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Tell me a short joke&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;

    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it folks, now go out and build better experiences for your users.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/github/copilot-sdk/blob/main/docs/getting-started.md#step-3-add-streaming-responses" rel="noopener noreferrer"&gt;Streamed response&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>githubcopilot</category>
      <category>copilotsdk</category>
      <category>python</category>
    </item>
    <item>
      <title>Get started with GitHub Copilot CLI: A free, hands-on course</title>
      <dc:creator>Renee Noble</dc:creator>
      <pubDate>Thu, 05 Mar 2026 04:44:08 +0000</pubDate>
      <link>https://dev.to/azure/get-started-with-github-copilot-cli-a-free-hands-on-course-3beg</link>
      <guid>https://dev.to/azure/get-started-with-github-copilot-cli-a-free-hands-on-course-3beg</guid>
      <description>&lt;p&gt;GitHub Copilot has grown well beyond code completions in your editor. It now lives in your terminal, too. &lt;a href="https://docs.github.com/copilot/how-tos/copilot-cli" rel="noopener noreferrer"&gt;GitHub Copilot CLI&lt;/a&gt; lets you review code, generate tests, debug issues, and ask questions about your projects without ever leaving the command line.&lt;/p&gt;

&lt;p&gt;To help developers get up to speed, we put together a free, open source course: &lt;a href="https://github.com/github/copilot-cli-for-beginners" rel="noopener noreferrer"&gt;GitHub Copilot CLI for Beginners&lt;/a&gt;. It’s 8 chapters, hands-on from the start, and designed so you can go from installation to building real workflows in a few hours. &lt;strong&gt;Already have a GitHub account&lt;/strong&gt;? GitHub Copilot CLI works with &lt;a href="https://github.com/features/copilot/plans" rel="noopener noreferrer"&gt;GitHub Copilot Free&lt;/a&gt;, which is available to all personal GitHub accounts.&lt;/p&gt;

&lt;p&gt;In this post, I’ll walk through what the course covers and how to get started.&lt;/p&gt;

&lt;h2&gt;
  
  
  What GitHub Copilot CLI can do
&lt;/h2&gt;

&lt;p&gt;If you haven’t tried it yet, GitHub Copilot CLI is a conversational AI assistant that runs in your terminal. You point it at files using @ references, and it reads your code and responds with analysis, suggestions, or generated code.&lt;/p&gt;

&lt;p&gt;You can use it to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Review a file and get feedback on code quality&lt;/li&gt;
&lt;li&gt;Generate tests based on existing code&lt;/li&gt;
&lt;li&gt;Debug issues by pointing it at a file and asking what’s wrong&lt;/li&gt;
&lt;li&gt;Explain unfamiliar code or confusing logic&lt;/li&gt;
&lt;li&gt;Generate commit messages, refactor functions, and more&lt;/li&gt;
&lt;li&gt;Write new app features (front-end, APIs, database interactions, and more)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It remembers context within a conversation, so follow-up questions build on what came before.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the course covers
&lt;/h2&gt;

&lt;p&gt;The course is structured as 8 progressive chapters. Each one builds on the last, and you work with the same project throughout: a book collection management app. Instead of jumping between isolated snippets, you keep improving one codebase as you go.&lt;/p&gt;

&lt;p&gt;Here’s what using GitHub Copilot CLI looks like in practice. Say you want to review a Python file for potential issues. Start up Copilot CLI and ask what you’d like done:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ copilot
&amp;gt; Review @samples/book-app-project/books.py for potential improvements. Focus on error handling and code quality.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Copilot reads the file, analyzes the code, and gives you specific feedback right in your terminal.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F68z8p0e37osyv69md339.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F68z8p0e37osyv69md339.gif" alt="code review demo gif" width="760" height="456"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here are the chapters covered in the course:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quick Start&lt;/strong&gt; — Installation and authentication&lt;br&gt;
&lt;strong&gt;First Steps&lt;/strong&gt; — Learn the three interaction modes: interactive, plan, and one-shot (programmatic)&lt;br&gt;
&lt;strong&gt;Context and Conversations&lt;/strong&gt; — Using @ references to point Copilot at files and directories, plus session management with --continue and --resume&lt;br&gt;
&lt;strong&gt;Development Workflows&lt;/strong&gt; — Code review, refactoring, debugging, test generation, and Git integration&lt;br&gt;
&lt;strong&gt;Custom Agents&lt;/strong&gt; — Building specialized AI assistants with .agent.md files (for example, a Python reviewer that always checks for type hints)&lt;br&gt;
&lt;strong&gt;Skills&lt;/strong&gt; — Creating task-specific instructions that auto-trigger based on your prompt&lt;br&gt;
&lt;strong&gt;MCP Servers&lt;/strong&gt; — Connecting Copilot to external services like GitHub repos, file systems, and documentation APIs via the Model Context Protocol&lt;br&gt;
&lt;strong&gt;Putting It All Together&lt;/strong&gt; — Combining agents, skills, and MCP servers into complete development workflows&lt;br&gt;
learning path image&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F381r15kd6bohcuu878jj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F381r15kd6bohcuu878jj.png" alt="learning path image" width="800" height="116"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every command in the course can be copied and run directly. No AI or machine learning background is required.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who this is for
&lt;/h2&gt;

&lt;p&gt;The course is built for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Developers using terminal workflows:&lt;/strong&gt; If you’re already running builds, checking git status, and SSHing into servers from the command line, Copilot CLI fits right into that flow.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Teams looking to standardise AI-assisted practices:&lt;/strong&gt; Custom agents and skills can be shared across a team through a project’s &lt;code&gt;.github/agents&lt;/code&gt; and &lt;code&gt;.github/skills&lt;/code&gt; directories.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Students and early-career developers:&lt;/strong&gt; The course explains AI terminology as it comes up, and every chapter includes assignments with clear success criteria.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You don’t need prior experience with AI tools. If you can run commands in a terminal, you learn and apply the concepts in this course.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the course teaches
&lt;/h2&gt;

&lt;p&gt;Each chapter follows a consistent pattern: a real-world analogy to ground the concept, then the core technical material, then hands-on exercises. For instance, the three interaction modes are compared to ordering food at a restaurant. Plan mode is more like mapping your route to the restaurant before you start driving. Interactive mode is a back-and-forth conversation with a waiter. And one-shot mode (programmatic mode) is like going through the drive-through.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffsorjdhrhn758c638mps.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffsorjdhrhn758c638mps.png" alt="ordering food analogy image" width="800" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Later chapters use different comparisons: agents are like hiring specialists, skills work like attachments for a power drill, and MCP servers are compared to browser extensions. The goal is to provide you with a visual and mental model before the technical details land.&lt;/p&gt;

&lt;p&gt;The course also focuses on a question that’s harder than it looks: when should I use which tool? Knowing the difference between reaching for an agent, a skill, or an MCP server takes practice, and the final chapter walks through that decision-making in a realistic workflow.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1cfcllljwbgovlf9qfc6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1cfcllljwbgovlf9qfc6.png" alt="integration pattern image" width="749" height="881"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Get started
&lt;/h2&gt;

&lt;p&gt;The course is free and open source. You can clone the repo, or &lt;a href="https://codespaces.new/github/copilot-cli-for-beginners?hide_repo_select=true&amp;amp;ref=main&amp;amp;quickstart=true" rel="noopener noreferrer"&gt;open it in GitHub Codespaces&lt;/a&gt; for a fully configured environment. Jump right in, get Copilot CLI running, and see if it fits your workflow.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/github/copilot-cli-for-beginners" rel="noopener noreferrer"&gt;GitHub Copilot CLI for Beginners&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For a quick reference, see the &lt;a href="https://docs.github.com/copilot/reference/cli-command-reference" rel="noopener noreferrer"&gt;CLI command reference&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Subscribe to &lt;a href="https://resources.github.com/newsletter/" rel="noopener noreferrer"&gt;GitHub Insider&lt;/a&gt; for more developer tips and guides.&lt;/p&gt;

</description>
      <category>githubcopilot</category>
      <category>cli</category>
      <category>vscode</category>
      <category>terminal</category>
    </item>
    <item>
      <title>Get started with GitHub Copilot SDK, part 1</title>
      <dc:creator>Chris Noring</dc:creator>
      <pubDate>Wed, 04 Mar 2026 20:48:00 +0000</pubDate>
      <link>https://dev.to/azure/get-started-with-github-copilot-sdk-1ijm</link>
      <guid>https://dev.to/azure/get-started-with-github-copilot-sdk-1ijm</guid>
      <description>&lt;p&gt;Did you know GitHub Copilot now has an SDK and that you can leverage your existing license to build AI integrations into your app? No, well I hope I have you attention now.&lt;/p&gt;

&lt;p&gt;

  &lt;iframe src="https://www.youtube.com/embed/hvwGZqS4qF0"&gt;
  &lt;/iframe&gt;


&lt;/p&gt;

&lt;h2&gt;
  
  
  Series on Copilot SDK
&lt;/h2&gt;

&lt;p&gt;This series is about Copilot SDK and how you can leverage your existing GitHub Copilot license to integrate AI into your apps&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Part 1 - install and your first app, &lt;strong&gt;you're here&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/azure/getting-started-with-github-copilot-part-2-streamable-responses-49a8"&gt;Part 2 - streamable responses&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;

&lt;p&gt;You need two pieces here to get started:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub Copilot CLI&lt;/li&gt;
&lt;li&gt;A supported runtime, which at present means either Node.js, .NET, Python or Go&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then you need to install the SDK for your chosen runtime like so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;github-copilot-sdk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The parts
&lt;/h2&gt;

&lt;p&gt;So what do you need to know to get started? There are three concepts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Client&lt;/strong&gt;, you need to create and instance of it. Additionally you need to start and stop it when you're done with it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Session&lt;/strong&gt;. The session takes an object where you can set things like model, system prompt and more. Also, the session is what you talk when you  want to carry out a request. &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Response&lt;/strong&gt;. The response contains your LLM response.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Below is an example program using these three concepts. As you can see we choose "gpt-4.1" as model but this can be changed. See also how we pass the prompt to the function &lt;code&gt;send_and_wait&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;copilot&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;CopilotClient&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;CopilotClient&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="n"&gt;session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_session&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send_and_wait&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prompt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;What is 2 + 2?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ok, now that we know what a simple program looks like, let's make something interesting, an FAQ responder.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your first app
&lt;/h2&gt;

&lt;p&gt;An FAQ for a web page, is often a pretty boring read. A way to make that more interesting for the end user is if they can instead chat with the FAQ, let's make that happen. &lt;/p&gt;

&lt;p&gt;Here's the plan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Define a static FAQ&lt;/li&gt;
&lt;li&gt;Add the FAQ as part of the prompt.&lt;/li&gt;
&lt;li&gt;Make a request to to the LLM and print out the response.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's build out the code little by little. First, let's define the FAQ information.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;-1- FAQ information&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# faq.py
&lt;/span&gt;
&lt;span class="n"&gt;faq&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;warranty&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Our products come with a 1-year warranty covering manufacturing defects. Please contact our support team for assistance.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;return_policy&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;We offer a 30-day return policy for unused products in their original packaging. To initiate a return, please visit our returns page and follow the instructions.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;     
  &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;shipping&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;We offer free standard shipping on all orders over $50. Expedited shipping options are available at checkout for an additional fee.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, let's add the call to the Copilot SDK&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;-2  Adding the LLM call&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;copilot&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;CopilotClient&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;faq_to_string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;faq&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;faq&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;()])&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_prompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Tell me about shipping&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;CopilotClient&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="n"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Here&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s the FAQ, &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;faq_to_string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;faq&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s"&gt;User question: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;user_prompt&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;Answer:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;   

    &lt;span class="n"&gt;session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_session&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gpt-4.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send_and_wait&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prompt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;My first app using the GitHub Copilot SDK!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[LOG] Asking the model about shipping information...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Tell me about shipping&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note how we concatenate the FAQ data with the user's prompt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt; &lt;span class="n"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Here&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s the FAQ, &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;faq_to_string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;faq&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s"&gt;User question: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;user_prompt&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;Answer:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;   
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;-3- Let's run it&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now run it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uv run faq.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see output like so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;My first app using the GitHub Copilot SDK!
[LOG] Asking the model about shipping information...
We offer free standard shipping on all orders over $50. Expedited shipping options are available at checkout for an additional fee.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;Check out the &lt;a href="https://github.com/github/copilot-sdk/blob/main/docs/getting-started.md" rel="noopener noreferrer"&gt;official docs&lt;/a&gt;&lt;/p&gt;

</description>
      <category>githubcopilot</category>
      <category>python</category>
      <category>ai</category>
      <category>programming</category>
    </item>
    <item>
      <title>The JavaScript AI Build-a-thon Season 2 starts March 2!</title>
      <dc:creator>Julia Muiruri</dc:creator>
      <pubDate>Wed, 25 Feb 2026 04:09:06 +0000</pubDate>
      <link>https://dev.to/azure/the-javascript-ai-build-a-thon-season-2-starts-march-2-1e92</link>
      <guid>https://dev.to/azure/the-javascript-ai-build-a-thon-season-2-starts-march-2-1e92</guid>
      <description>&lt;p&gt;Most applications used by millions of people every single day are powered by JavaScript/TypeScript. But when it comes to AI, most learning resources and code samples assume you're working in Python and will leave you trying to stitch scattered tutorials together to build AI into your stack.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;JavaScript AI Build-a-thon&lt;/strong&gt; is a free, hands-on program designed to close that gap. Over the course of four weeks &lt;strong&gt;(March 2 - March 31, 2026)&lt;/strong&gt;, you'll move from running AI 100% on-device (Local AI), to designing multi-service, multi-agentic systems, all in JavaScript/ TypeScript and using tools you are already familiar with.&lt;br&gt;
The series will culminate in a &lt;strong&gt;hackathon&lt;/strong&gt;, where you will create, compete and turn what you'll have learnt into working projects you can point to, talk about and extend.&lt;/p&gt;

&lt;p&gt;Register now at &lt;a href="https://aka.ms/JSAIBuildathon" rel="noopener noreferrer"&gt;aka.ms/JSAIBuildathon&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How the program works!
&lt;/h2&gt;

&lt;p&gt;The program is organized around 2 phases: -&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase I: Learn &amp;amp; Skill Up Schedule (Mar 2 - 13)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Self-paced quests that teach core AI patterns,&lt;/li&gt;
&lt;li&gt;Interactive Expert-led sessions on Microsoft Reactor (Livestreams) and Discord (Office hours &amp;amp; QnA)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1779ztlhwqxtoxdxq6d3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1779ztlhwqxtoxdxq6d3.png" alt="JavaScript AI Build-a-thon Roadmap" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Day/Time (PT)&lt;/th&gt;
&lt;th&gt;Topic&lt;/th&gt;
&lt;th&gt;Links to join&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Mon 3/2, 8:00 AM PST&lt;/td&gt;
&lt;td&gt;Local AI Development with Foundry Local&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://developer.microsoft.com/en-us/reactor/events/26772/" rel="noopener noreferrer"&gt;Livestream&lt;/a&gt; &lt;br&gt; &lt;a href="https://discord.gg/microsoftfoundry?event=1465380906842853666" rel="noopener noreferrer"&gt;Discord Office Hour&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wed 3/4, 8:00 AM PST&lt;/td&gt;
&lt;td&gt;End-to-End Model Development on Microsoft Foundry&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://developer.microsoft.com/en-us/reactor/events/26773/" rel="noopener noreferrer"&gt;Livestream&lt;/a&gt; &lt;br&gt; &lt;a href="https://discord.gg/microsoftfoundry?event=1470927803888173109" rel="noopener noreferrer"&gt;Discord Office Hour&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fri 3/6, 9:00 AM PST&lt;/td&gt;
&lt;td&gt;Advanced RAG Deep Dive + Guided Project&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://developer.microsoft.com/en-us/reactor/events/26775" rel="noopener noreferrer"&gt;Livestream&lt;/a&gt; &lt;br&gt; &lt;a href="https://discord.gg/microsoftfoundry?event=1465381686362509323" rel="noopener noreferrer"&gt;Discord Office Hour&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mon 3/9, 8:00 AM PST&lt;/td&gt;
&lt;td&gt;Design &amp;amp; Build an Agent E2E with Agent Builder (AITK)&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://developer.microsoft.com/en-us/reactor/events/26776/" rel="noopener noreferrer"&gt;Livestream&lt;/a&gt; &lt;br&gt; &lt;a href="https://discord.gg/microsoftfoundry?event=1465382167894036481" rel="noopener noreferrer"&gt;Discord Office Hour&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wed 3/11, 8:00 AM PST&lt;/td&gt;
&lt;td&gt;Build, Scale &amp;amp; Govern AI Agents + Guided project&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://developer.microsoft.com/en-us/reactor/events/26786/" rel="noopener noreferrer"&gt;Livestream&lt;/a&gt; &lt;br&gt; &lt;a href="https://discord.gg/microsoftfoundry?event=1465382908687814840" rel="noopener noreferrer"&gt;Discord Office Hour&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The Build-a-thon prioritizes practical learning, so you'll complete &lt;strong&gt;2 guided projects&lt;/strong&gt; by the end of this phase:-&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. A Local Serverless AI chat with RAG&lt;/strong&gt;&lt;br&gt;
Concepts covered include: -&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;RAG Architecture&lt;/li&gt;
&lt;li&gt;RAG Ingestion pipeline&lt;/li&gt;
&lt;li&gt;Query &amp;amp; Retrieval&lt;/li&gt;
&lt;li&gt;Response Generation (LLM Chains)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc733enuiuhxw2cx3jde7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc733enuiuhxw2cx3jde7.png" alt="Serverless Chat LangChain.js CodeTour" width="800" height="611"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. A Burger Ordering AI Agent&lt;/strong&gt;&lt;br&gt;
Concepts covered include: -&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Designing AI Agents&lt;/li&gt;
&lt;li&gt;Building MCP Tools (Backend API Design)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl74vmkvwp1c3m1k6g08m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl74vmkvwp1c3m1k6g08m.png" alt="Contoso Burger Ordering Agent" width="800" height="456"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase II: Global Hack! (Mar 13 - 31)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Product demo series to showcase the latest product features that will accelerate your builder experience&lt;/li&gt;
&lt;li&gt;A Global hackathon to apply what you learn into real, working AI solutions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where you'll build something that matters using everything learnt in the quests, and beyond, to create an AI-powered project that solves a real problem, delights users, or pushes what's possible.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The hackathon launches on March 13, 2026.&lt;/strong&gt; Full details on registration, submission, judging criteria, award categories, prizes, and the hack phase schedule will be published when the hack goes live. Stay tuned!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But, here's what we can tell you now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🏆 &lt;strong&gt;6 award categories&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;💻 &lt;strong&gt;Product demo showcases&lt;/strong&gt; throughout the hack phase to keep you building with the latest tools&lt;/li&gt;
&lt;li&gt;👥 Teams of up to 4 or solo. Your call&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Start Now (Join the Community)
&lt;/h2&gt;

&lt;p&gt;Join our community to connect with other participants and experts from Microsoft &amp;amp;. GitHub to support your builder journey.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Foundry Discord (#js-ai-build-a-thon channel):&lt;/strong&gt; &lt;a href="https://aka.ms/JSAIonDiscord" rel="noopener noreferrer"&gt;Our platform for office hours, live QnA, quick questions, community &amp;amp; expert support&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Discussions:&lt;/strong&gt; &lt;a href="https://aka.ms/JSAI_Discussions" rel="noopener noreferrer"&gt;This is where you'll share ideas, ask questions, find teammates&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Social:&lt;/strong&gt; Share your progress online using &lt;strong&gt;#JSAIBuildathon&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Register now at &lt;a href="https://aka.ms/JSAIBuildathon" rel="noopener noreferrer"&gt;aka.ms/JSAIBuildathon&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;See you soon!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>typescript</category>
      <category>langchain</category>
      <category>ai</category>
    </item>
    <item>
      <title>Host Your Node.js MCP Server on Azure Functions in 1 Simple Step</title>
      <dc:creator>Yohan Lasorsa</dc:creator>
      <pubDate>Tue, 09 Dec 2025 15:44:53 +0000</pubDate>
      <link>https://dev.to/azure/host-your-nodejs-mcp-server-on-azure-functions-in-3-simple-steps-3ao8</link>
      <guid>https://dev.to/azure/host-your-nodejs-mcp-server-on-azure-functions-in-3-simple-steps-3ao8</guid>
      <description>&lt;p&gt;Building AI agents with the Model Context Protocol (MCP) is powerful, but when it comes to hosting your MCP server in production, you need a solution that's reliable, scalable, and cost-effective. What if you could deploy your regular Node.js MCP server to a serverless platform that handles scaling automatically while you only pay for what you use?&lt;/p&gt;

&lt;p&gt;Let's explore how Azure Functions now supports hosting MCP servers built with the official Anthropic MCP SDK, giving you serverless scaling with almost no changes in your code.&lt;/p&gt;

&lt;p&gt;Grab your favorite hot beverage, and let's dive in!&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR key takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Azure Functions now supports hosting Node.js MCP servers using the official Anthropic SDK&lt;/li&gt;
&lt;li&gt;Only 1 simple configuration needed: adding &lt;code&gt;host.json&lt;/code&gt; file&lt;/li&gt;
&lt;li&gt;Currently supports HTTP Streaming protocol with stateless servers&lt;/li&gt;
&lt;li&gt;Serverless hosting means automatic scaling and pay-per-use pricing&lt;/li&gt;
&lt;li&gt;Deploy with one command using Infrastructure as Code&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What will you learn here?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Understand how MCP servers work on Azure Functions&lt;/li&gt;
&lt;li&gt;Configure a Node.js MCP server for Azure Functions hosting&lt;/li&gt;
&lt;li&gt;Test your MCP server locally and with real AI agents&lt;/li&gt;
&lt;li&gt;Deploy your MCP server with Infrastructure as Code and AZD&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Reference links for everything we use
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://modelcontextprotocol.io/" rel="noopener noreferrer"&gt;Model Context Protocol&lt;/a&gt; - Official MCP documentation&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://learn.microsoft.com/azure/azure-functions/functions-overview" rel="noopener noreferrer"&gt;Azure Functions&lt;/a&gt; - Serverless compute platform&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/modelcontextprotocol/typescript-sdk" rel="noopener noreferrer"&gt;Anthropic MCP SDK&lt;/a&gt; - Official TypeScript SDK&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://learn.microsoft.com/azure/developer/azure-developer-cli/overview" rel="noopener noreferrer"&gt;Azure Developer CLI&lt;/a&gt; - One-command deployment tool&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/Azure-Samples/mcp-agent-langchainjs" rel="noopener noreferrer"&gt;Full sample project&lt;/a&gt; - Complete burger ordering system with MCP&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/Azure-Samples/mcp-sdk-functions-hosting-node" rel="noopener noreferrer"&gt;Simple example&lt;/a&gt; - Minimal MCP server starter&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/anthonychu/create-functions-mcp-server" rel="noopener noreferrer"&gt;GitHub Copilot prompt helper&lt;/a&gt; - Automated setup by Anthony Chu&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Requirements
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Node.js 22 or higher&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://azure.microsoft.com/free" rel="noopener noreferrer"&gt;Azure account&lt;/a&gt; (free signup, or if you're a student, &lt;a href="https://azure.microsoft.com/free/students" rel="noopener noreferrer"&gt;get free credits here&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://aka.ms/azure-dev/install" rel="noopener noreferrer"&gt;Azure Developer CLI&lt;/a&gt; (for deployment)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/signup" rel="noopener noreferrer"&gt;GitHub account&lt;/a&gt; (optional, for using Codespaces)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What is MCP and why does it matter?
&lt;/h2&gt;

&lt;p&gt;Model Context Protocol is an open standard that enables AI models to securely interact with external tools and data sources. Instead of hardcoding tool integrations, you build an MCP server that exposes capabilities (like browsing a menu, placing orders, or querying a database) as tools that any MCP-compatible AI agent can discover and use. MCP is model-agnostic, meaning it can work with any LLM that supports the protocol, including models from Anthropic, OpenAI, and others. It's also worth noting that MCP supports more than just tool calls, though that's its most common use case.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkujo718hq9m24ouev5zl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkujo718hq9m24ouev5zl.png" alt="Schema showing MCP interfacing with different tool servers" width="722" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The challenge? &lt;strong&gt;Running MCP servers in production requires infrastructure&lt;/strong&gt;. You need to handle scaling, monitoring, and costs. That's where Azure Functions comes in.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🚨 Free course alert!&lt;/strong&gt; If you're new to MCP, check out the &lt;a href="https://github.com/microsoft/mcp-for-beginners" rel="noopener noreferrer"&gt;MCP for Beginners&lt;/a&gt; course to get up to speed quickly.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Why Azure Functions for MCP servers?
&lt;/h2&gt;

&lt;p&gt;Azure Functions is a serverless compute platform that's perfect for MCP servers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero infrastructure management&lt;/strong&gt;: No servers to maintain&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatic scaling&lt;/strong&gt;: Handles traffic spikes seamlessly&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cost-effective&lt;/strong&gt;: Pay only for actual execution time (with generous free grant)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Built-in monitoring&lt;/strong&gt;: Application Insights integration out of the box&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Global distribution&lt;/strong&gt;: Deploy to regions worldwide&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The new Azure Functions support means you can take your existing Node.js MCP server and deploy it to a production-ready serverless environment with minimal changes. This comes up as an additional option for native Node.js MCP hosting, but you can still use the &lt;a href="https://learn.microsoft.com/azure/azure-functions/functions-bindings-mcp?pivots=programming-language-typescript" rel="noopener noreferrer"&gt;Azure Functions MCP bindings&lt;/a&gt; that were available before.&lt;/p&gt;

&lt;h2&gt;
  
  
  1 simple step to enable Functions hosting
&lt;/h2&gt;

&lt;p&gt;Let's break down what you need to add to your existing Node.js MCP server to run it on Azure Functions. I'll use a &lt;a href="https://github.com/Azure-Samples/mcp-agent-langchainjs/tree/main/packages/burger-mcp" rel="noopener noreferrer"&gt;real-world example&lt;/a&gt; from our burger ordering system.&lt;/p&gt;

&lt;p&gt;If you already have a working Node.js MCP server, you can just follow this to make it compatible with Azure Functions hosting.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Add the &lt;code&gt;host.json&lt;/code&gt; configuration
&lt;/h3&gt;

&lt;p&gt;Create a &lt;code&gt;host.json&lt;/code&gt; file at the root of your Node.js project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"configurationProfile"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mcp-custom-handler"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"customHandler"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"defaultExecutablePath"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"node"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"arguments"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"lib/server.js"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"http"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"DefaultAuthorizationLevel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"anonymous"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"port"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"3000"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Adjust the &lt;code&gt;arguments&lt;/code&gt; array to point to your compiled server file (e.g., &lt;code&gt;lib/server.js&lt;/code&gt; or &lt;code&gt;dist/server.js&lt;/code&gt;), depending on your build setup. You can also change the port if needed to match your server configuration.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The &lt;code&gt;hosts.json&lt;/code&gt; file holds &lt;a href="https://learn.microsoft.com/azure/azure-functions/functions-host-json" rel="noopener noreferrer"&gt;metadata configuration&lt;/a&gt; for the Functions runtime. The most important part here is the &lt;code&gt;customHandler&lt;/code&gt; section. It configures the Azure Functions runtime to run your Node.js MCP server as a &lt;em&gt;custom handler&lt;/em&gt;, which allows you to use any HTTP server framework (like Express, Fastify, etc.) without modification (&lt;strong&gt;tip: it can do more than MCP servers!&lt;/strong&gt; 😉).&lt;/p&gt;

&lt;p&gt;There's no step 2 or 3. That's it! 😎&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; We're not covering the authentication and authorization aspects of Azure Functions here, but you can easily &lt;a href="https://learn.microsoft.com/azure/azure-functions/functions-mcp-tutorial?tabs=self-hosted&amp;amp;pivots=programming-language-typescript#enable-built-in-server-authorization-and-authentication" rel="noopener noreferrer"&gt;add those later if needed&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Real-world example: Burger MCP Server
&lt;/h2&gt;

&lt;p&gt;Let's look at how this works in practice with a &lt;a href="https://github.com/Azure-Samples/mcp-agent-langchainjs/tree/main/packages/burger-mcp" rel="noopener noreferrer"&gt;burger ordering MCP server&lt;/a&gt;. This server exposes 9 tools for AI agents to interact with a burger API:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;get_burgers&lt;/code&gt; - Browse the menu&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;get_burger_by_id&lt;/code&gt; - Get burger details&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;place_order&lt;/code&gt; - Place an order&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;get_orders&lt;/code&gt; - View order history&lt;/li&gt;
&lt;li&gt;And more...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here's the complete server implementation using Express and the MCP SDK:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Response&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;StreamableHTTPServerTransport&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@modelcontextprotocol/sdk/server/streamableHttp.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;getMcpServer&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./mcp.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;express&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

&lt;span class="c1"&gt;// Handle all MCP Streamable HTTP requests&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/mcp&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;transport&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;StreamableHTTPServerTransport&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;sessionIdGenerator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="c1"&gt;// Connect the transport to the MCP server&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getMcpServer&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;transport&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Handle the request with the transport&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;transport&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;handleRequest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Clean up when the response is closed&lt;/span&gt;
  &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;close&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;transport&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="c1"&gt;// Note: error handling not shown for brevity&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// The port configuration&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;PORT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Burger MCP server listening on port &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The MCP tools are defined using the official SDK:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;McpServer&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@modelcontextprotocol/sdk/server/mcp.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;zod&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getMcpServer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;McpServer&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;burger-mcp&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1.0.0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;registerTool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;get_burgers&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Get a list of all burgers in the menu&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;burgerApiUrl&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/burgers`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;burgers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;burgers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}]&lt;/span&gt;
      &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// ... more tools&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As you can see, the actual implementation of the tool is forwarding an HTTP request to the burger API and returning the result in the MCP response format. This is a common pattern for MCP tools in enterprise contexts, that act as wrappers around one or more existing APIs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Current limitations
&lt;/h3&gt;

&lt;p&gt;Note that this Azure Functions MCP hosting currently has some limitations: &lt;strong&gt;it only supports stateless servers using the HTTP Streaming protocol&lt;/strong&gt;. The legacy SSE protocol is not supported as it requires stateful connections, so you'll either have to migrate your client to use HTTP Streaming or use another hosting option, like using containers for example.&lt;/p&gt;

&lt;p&gt;For most use cases, HTTP Streaming is the recommended approach anyway as it's more scalable and doesn't require persistent connections. Stateful MCP servers comes with additional complexity challenges and have limited scalability if you need to handle many concurrent connections.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing the MCP server locally
&lt;/h2&gt;

&lt;p&gt;First let's run the MCP server locally and play a bit with it.&lt;/p&gt;

&lt;p&gt;If you don't want to bother with setting up a local environment, you can use the following link or open it in a new tab to launch a GitHub Codespace:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://codespaces.new/Azure-Samples/mcp-agent-langchainjs?hide_repo_select=true&amp;amp;ref=main&amp;amp;quickstart=true" rel="noopener noreferrer"&gt;Create Codespace&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This will open a VS Code environment in your browser with the repo already cloned and all the tools installed and ready to go. Otherwise you can just &lt;a href="https://github.com/Azure-Samples/mcp-agent-langchainjs" rel="noopener noreferrer"&gt;clone the repo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Once you have the code ready, open a terminal and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install dependencies&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt;

&lt;span class="c"&gt;# Start the burger MCP server and API&lt;/span&gt;
npm start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will start multiple services locally, including the Burger API and the MCP server, which will be available at &lt;code&gt;http://localhost:3000/mcp&lt;/code&gt;. This may take a few seconds, wait until you see this message in the terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;🚀 All services ready 🚀
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We're only interested in the MCP server for now, so let's focus on that.&lt;/p&gt;

&lt;h3&gt;
  
  
  Using MCP Inspector
&lt;/h3&gt;

&lt;p&gt;The easiest way to test the MCP server is with the MCP Inspector tool:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;npx &lt;span class="nt"&gt;-y&lt;/span&gt; @modelcontextprotocol/inspector
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open the URL shown in the console in your browser, then:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Set transport type to &lt;strong&gt;Streamable HTTP&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Enter your local server URL: &lt;code&gt;http://localhost:3000/mcp&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Connect&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After you're connected, go to the &lt;strong&gt;Tools&lt;/strong&gt; tab to list available tools. You can then try the &lt;code&gt;get_burgers&lt;/code&gt; tool to see the burger menu.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuo3lgw3v80we4v31p57u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuo3lgw3v80we4v31p57u.png" alt="MCP Inspector Screenshot" width="800" height="299"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Using GitHub Copilot (with remote MCP)
&lt;/h3&gt;

&lt;p&gt;Configure GitHub Copilot to use your deployed MCP server by adding this to your project's &lt;code&gt;.vscode/mcp.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"servers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"burger-mcp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:3000/mcp"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Click on "Start" button that will appear in the JSON file to activate the MCP server connection.&lt;/p&gt;

&lt;p&gt;Now you can use Copilot in agent mode and ask things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"What spicy burgers do you have?"&lt;/li&gt;
&lt;li&gt;"Place an order for two cheeseburgers"&lt;/li&gt;
&lt;li&gt;"Show my recent orders"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Copilot will automatically discover and use the MCP tools! 🎉&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; If Copilot doesn't call the burger MCP tools, try checking if it's enabled by clicking on the tool icon in the chat input box and ensuring that "burger-mcp" is selected. You can also force tool usage by adding &lt;code&gt;#burger-mcp&lt;/code&gt; in your prompt.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  (Bonus) Deploying to Azure with Infrastructure as Code
&lt;/h2&gt;

&lt;p&gt;Deploying an application to Azure is usually not the fun part, especially when it involves multiple resources and configurations.&lt;br&gt;
With the &lt;a href="https://learn.microsoft.com/azure/developer/azure-developer-cli/overview" rel="noopener noreferrer"&gt;Azure Developer CLI (AZD)&lt;/a&gt;, you can define your entire application infrastructure and deployment process as code, and deploy everything with a single command.&lt;/p&gt;

&lt;p&gt;If you've used the automated setup with GitHub Copilot, you should already have the necessary files. Our burger example also comes with these files pre-configured. The MCP server is defined as a service in &lt;code&gt;azure.yaml&lt;/code&gt;, and the files under the &lt;code&gt;infra&lt;/code&gt; folder defines the Azure Functions app and related resources.&lt;/p&gt;

&lt;p&gt;Here's the relevant part of &lt;code&gt;azure.yaml&lt;/code&gt; that defines the burger MCP service:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mcp-agent-langchainjs&lt;/span&gt;

&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;burger-mcp&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;project&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./packages/burger-mcp&lt;/span&gt;
    &lt;span class="na"&gt;language&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ts&lt;/span&gt;
    &lt;span class="na"&gt;host&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;function&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;While the infrastructure files can look intimidating at first, you don't need to understand all the details to get started. There are tons of templates and examples available to help you get going quickly, the important part is that everything is defined as code, so you can version control it and reuse it.&lt;/p&gt;

&lt;p&gt;Now let's deploy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Login to Azure&lt;/span&gt;
azd auth login

&lt;span class="c"&gt;# Provision resources and deploy&lt;/span&gt;
azd up
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pick your preferred Azure region when prompted (if you're not sure, choose &lt;strong&gt;East US2&lt;/strong&gt;), and voilà! In a few minutes, you'll have a fully deployed MCP server running on Azure Functions.&lt;/p&gt;

&lt;p&gt;Once the deployment is finished, the CLI will show you the URL of the deployed resources, including the MCP server endpoint.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F95d7ypphekrsa5v8ecn3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F95d7ypphekrsa5v8ecn3.png" alt="AZD deployment output for the burger MCP example app" width="800" height="271"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Example projects
&lt;/h2&gt;

&lt;p&gt;The burger MCP server is actually part of a larger example project that demonstrates building an AI agent with LangChain.js, that uses the burger MCP server to place orders. If you're interested in the next steps of building an AI agent on top of MCP, this is a great resource as it includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI agent web API using LangChain.js&lt;/li&gt;
&lt;li&gt;Web app interface built with Lit web components&lt;/li&gt;
&lt;li&gt;MCP server on Functions (the one we just saw)&lt;/li&gt;
&lt;li&gt;Burger ordering API (used by the MCP server)&lt;/li&gt;
&lt;li&gt;Live order visualization&lt;/li&gt;
&lt;li&gt;Complete Infrastructure as Code, to deploy everything with one command&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But if you're only interested in the MCP server part, then you might want to look at this simpler example that you can use as a starting point for your own MCP servers: &lt;a href="https://github.com/Azure-Samples/mcp-sdk-functions-hosting-node" rel="noopener noreferrer"&gt;mcp-sdk-functions-hosting-node&lt;/a&gt; is a server template for a Node.js MCP server using TypeScript and MCP SDK.&lt;/p&gt;

&lt;h2&gt;
  
  
  What about the cost?
&lt;/h2&gt;

&lt;p&gt;Azure Functions Flex Consumption pricing is attractive for MCP servers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Free grant&lt;/strong&gt;: 1 million requests and 400,000 GB-s execution time per month&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;After free grant&lt;/strong&gt;: Pay only for actual execution time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatic scaling&lt;/strong&gt;: From zero to hundreds of instances&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The free grant is generous enough to allow running a typical MCP server with moderate usage, and all the experimentation you might need. It's easy to configure the scaling limits to control costs as needed, with an option to scale down to zero when idle. This flexibility is why Functions is my personal go-to choice for TypeScript projects on Azure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrap up
&lt;/h2&gt;

&lt;p&gt;Hosting MCP servers on Azure Functions gives you the best of both worlds: the simplicity of serverless infrastructure and the power of the official Anthropic SDK. With just &lt;strong&gt;one simple configuration step&lt;/strong&gt;, you can take your existing Node.js MCP server and deploy it to a production-ready, auto-scaling platform.&lt;/p&gt;

&lt;p&gt;The combination of MCP's standardized protocol and Azure's serverless platform means you can focus on building amazing AI experiences instead of managing infrastructure. Boom. 😎&lt;/p&gt;

&lt;p&gt;Star the repos ⭐️ if you found this helpful! Try deploying your own MCP server and share your experience in the comments. If you run into any issues or have questions, you can reach for help on the &lt;a href="https://aka.ms/foundry/discord" rel="noopener noreferrer"&gt;Azure AI community on Discord&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>ai</category>
      <category>azure</category>
    </item>
    <item>
      <title>Serverless MCP Agent with LangChain.js v1 — Burgers, Tools, and Traces 🍔</title>
      <dc:creator>Yohan Lasorsa</dc:creator>
      <pubDate>Tue, 21 Oct 2025 16:09:46 +0000</pubDate>
      <link>https://dev.to/azure/serverless-mcp-agent-with-langchainjs-v1-burgers-tools-and-traces-25oo</link>
      <guid>https://dev.to/azure/serverless-mcp-agent-with-langchainjs-v1-burgers-tools-and-traces-25oo</guid>
      <description>&lt;p&gt;AI agents that can actually do stuff (not just chat) are the fun part nowadays, but wiring them cleanly into real APIs, keeping things observable, and shipping them to the cloud can get... messy. So we built a fresh end‑to‑end sample to show how to do it right with the brand new &lt;strong&gt;LangChain.js v1&lt;/strong&gt; and &lt;strong&gt;Model Context Protocol (MCP)&lt;/strong&gt;. In case you missed it, MCP is a recent open standard that makes it easy for LLM agents to consume tools and APIs, and LangChain.js, a great framework for building GenAI apps and agents, has first-class support for it.&lt;/p&gt;

&lt;p&gt;This new sample gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A LangChain.js v1 agent that streams its result, along reasoning + tool steps&lt;/li&gt;
&lt;li&gt;An MCP server exposing real tools (burger menu + ordering) from a business API&lt;/li&gt;
&lt;li&gt;A web interface with authentication, sessions history, and a debug panel (for developers)&lt;/li&gt;
&lt;li&gt;A production-ready multi-service architecture&lt;/li&gt;
&lt;li&gt;Serverless deployment on Azure in one command (&lt;code&gt;azd up&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flyd3ybr83tyyogakr7ou.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flyd3ybr83tyyogakr7ou.gif" alt="GIF animation of the agent in action" width="760" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Yes, it’s a burger ordering system. Who doesn't like burgers? Grab your favorite beverage ☕, and let’s dive in for a quick tour!&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR key takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;New sample: full-stack Node.js AI agent using LangChain.js v1 + MCP tools&lt;/li&gt;
&lt;li&gt;Architecture: web app → agent API → MCP server → burger API&lt;/li&gt;
&lt;li&gt;Runs locally with a single &lt;code&gt;npm start&lt;/code&gt;, deploys with &lt;code&gt;azd up&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Uses streaming (NDJSON) with intermediate tool + LLM steps surfaced to the UI&lt;/li&gt;
&lt;li&gt;Ready to fork, extend, and plug into your own domain / tools&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What will you learn here?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;What this sample is about and its high-level architecture&lt;/li&gt;
&lt;li&gt;What LangChain.js v1 brings to the table for agents&lt;/li&gt;
&lt;li&gt;How to deploy and run the sample&lt;/li&gt;
&lt;li&gt;How MCP tools can expose real-world APIs&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Reference links for everything we use
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Azure-Samples/mcp-agent-langchainjs" rel="noopener noreferrer"&gt;GitHub repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.langchain.com/oss/javascript/langchain/overview" rel="noopener noreferrer"&gt;LangChain.js docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://modelcontextprotocol.io" rel="noopener noreferrer"&gt;Model Context Protocol&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/azure/developer/azure-developer-cli/" rel="noopener noreferrer"&gt;Azure Developer CLI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.npmjs.com/package/@modelcontextprotocol/inspector" rel="noopener noreferrer"&gt;MCP Inspector&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Use case
&lt;/h2&gt;

&lt;p&gt;You want an AI assistant that can take a natural language request like “Order two spicy burgers and show me my pending orders” and:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Understand intent (query menu, then place order)&lt;/li&gt;
&lt;li&gt;Call the right MCP tools in sequence, calling in turn the necessary APIs&lt;/li&gt;
&lt;li&gt;Stream progress (LLM tokens + tool steps)&lt;/li&gt;
&lt;li&gt;Return a clean final answer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Swap “burgers” for “inventory”, “bookings”, “support tickets”, or “IoT devices” and you’ve got a reusable pattern!&lt;/p&gt;

&lt;h2&gt;
  
  
  Sample overview
&lt;/h2&gt;

&lt;p&gt;Before we play a bit with the sample, let's have a look at the main services implemented here:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Service&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;th&gt;Tech&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Agent Web App (&lt;code&gt;agent-webapp&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Chat UI + streaming + session history&lt;/td&gt;
&lt;td&gt;Azure Static Web Apps, Lit web components&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agent API (&lt;code&gt;agent-api&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;LangChain.js v1 agent orchestration + auth + history&lt;/td&gt;
&lt;td&gt;Azure Functions, Node.js&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Burger MCP Server (&lt;code&gt;burger-mcp&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Exposes burger API as tools over MCP (Streamable HTTP + SSE)&lt;/td&gt;
&lt;td&gt;Azure Functions, Express, MCP SDK&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Burger API (&lt;code&gt;burger-api&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Business logic: burgers, toppings, orders lifecycle&lt;/td&gt;
&lt;td&gt;Azure Functions, Cosmos DB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Here's a simplified view of how they interact:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuzs3kcdu4b537q2yx3hl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuzs3kcdu4b537q2yx3hl.png" alt="Architecture Diagram" width="800" height="276"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are also other supporting components like databases and storage not shown here for clarity.&lt;/p&gt;

&lt;p&gt;For this quickstart we'll only interact with the &lt;strong&gt;Agent Web App&lt;/strong&gt; and the &lt;strong&gt;Burger MCP Server&lt;/strong&gt;, as they are the main stars of the show here.&lt;/p&gt;

&lt;h3&gt;
  
  
  LangChain.js v1 agent features
&lt;/h3&gt;

&lt;p&gt;The recent release of LangChain.js v1 is a huge milestone for the JavaScript AI community! It marks a significant shift from experimental tools to a production-ready framework. The new version doubles down on what’s needed to build robust AI applications, with a strong focus on &lt;strong&gt;agents&lt;/strong&gt;. This includes first-class support for streaming not just the final output, but also intermediate steps like tool calls and agent reasoning. This makes building transparent and interactive agent experiences (like the one in this sample) much more straightforward.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quickstart
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Requirements
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/signup" rel="noopener noreferrer"&gt;GitHub account&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://azure.microsoft.com/free" rel="noopener noreferrer"&gt;Azure account&lt;/a&gt; (free signup, or if you're a student, &lt;a href="https://azure.microsoft.com/free/students" rel="noopener noreferrer"&gt;get free credits here&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://learn.microsoft.com/azure/developer/azure-developer-cli/install-azd?tabs=winget-windows%2Cbrew-mac%2Cscript-linux&amp;amp;pivots=os-windows" rel="noopener noreferrer"&gt;Azure Developer CLI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Deploy and run the sample
&lt;/h3&gt;

&lt;p&gt;We'll use GitHub Codespaces for a quick zero-install setup here, but if you prefer to run it locally, check the &lt;a href="https://github.com/Azure-Samples/mcp-agent-langchainjs?tab=readme-ov-file#getting-started" rel="noopener noreferrer"&gt;README&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Click on the following link or open it in a new tab to launch a Codespace:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://codespaces.new/Azure-Samples/mcp-agent-langchainjs?hide_repo_select=true&amp;amp;ref=main&amp;amp;quickstart=true" rel="noopener noreferrer"&gt;Create Codespace&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This will open a VS Code environment in your browser with the repo already cloned and all the tools installed and ready to go.&lt;/p&gt;

&lt;h4&gt;
  
  
  Provision and deploy to Azure
&lt;/h4&gt;

&lt;p&gt;Open a terminal and run these commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install dependencies&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt;

&lt;span class="c"&gt;# Login to Azure&lt;/span&gt;
azd auth login

&lt;span class="c"&gt;# Provision and deploy all resources&lt;/span&gt;
azd up
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Follow the prompts to select your Azure subscription and region. If you're unsure of which one to pick, choose &lt;code&gt;East US 2&lt;/code&gt;.&lt;br&gt;
The deployment will take about 15 minutes the first time, to create all the necessary resources (Functions, Static Web Apps, Cosmos DB, AI Models).&lt;/p&gt;

&lt;p&gt;If you're curious about what happens under the hood, you can take a look at the &lt;code&gt;main.bicep&lt;/code&gt; file in the &lt;code&gt;infra&lt;/code&gt; folder, which defines the infrastructure as code for this sample.&lt;/p&gt;
&lt;h3&gt;
  
  
  Test the MCP server
&lt;/h3&gt;

&lt;p&gt;While the deployment is running, you can run the MCP server and API locally (even in Codespaces) to see how it works. Open another terminal and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will start all services locally, including the Burger API and the MCP server, which will be available at &lt;code&gt;http://localhost:3000/mcp&lt;/code&gt;. This may take a few seconds, wait until you see this message in the terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;🚀 All services ready 🚀
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When these services are running without Azure resources provisioned, they will use in-memory data instead of Cosmos DB so you can experiment freely with the API and MCP server, though the agent won't be functional as it requires a LLM resource.&lt;/p&gt;

&lt;h4&gt;
  
  
  MCP tools
&lt;/h4&gt;

&lt;p&gt;The MCP server exposes the following tools, which the agent can use to interact with the burger ordering system:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool Name&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_burgers&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Get a list of all burgers in the menu&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_burger_by_id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Get a specific burger by its ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_toppings&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Get a list of all toppings in the menu&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_topping_by_id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Get a specific topping by its ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_topping_categories&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Get a list of all topping categories&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_orders&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Get a list of all orders in the system&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_order_by_id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Get a specific order by its ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;place_order&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Place a new order with burgers (requires &lt;code&gt;userId&lt;/code&gt;, optional &lt;code&gt;nickname&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;delete_order_by_id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Cancel an order if it has not yet been started (status must be &lt;code&gt;pending&lt;/code&gt;, requires &lt;code&gt;userId&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;You can test these tools using the MCP Inspector. Open another terminal and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx &lt;span class="nt"&gt;-y&lt;/span&gt; @modelcontextprotocol/inspector
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then open the URL printed in the terminal in your browser and connect using these settings:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Transport&lt;/strong&gt;: Streamable HTTP&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;URL&lt;/strong&gt;: &lt;a href="http://localhost:3000/mcp" rel="noopener noreferrer"&gt;http://localhost:3000/mcp&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Connection Type&lt;/strong&gt;: Via Proxy (should be default)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Click on &lt;strong&gt;Connect&lt;/strong&gt;, then try listing the tools first, and run &lt;code&gt;get_burgers&lt;/code&gt; tool to get the menu info.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo1x7jghzwa5rvdi32lfa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo1x7jghzwa5rvdi32lfa.png" alt="MCP Inspector Screenshot" width="800" height="299"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Test the Agent Web App
&lt;/h3&gt;

&lt;p&gt;After the deployment is completed, you can run the command &lt;code&gt;npm run env&lt;/code&gt; to print the URLs of the deployed services. Open the Agent Web App URL in your browser (it should look like &lt;code&gt;https://&amp;lt;your-web-app&amp;gt;.azurestaticapps.net&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;You'll first be greeted by an authentication page, you can sign in either with your GitHub or Microsoft account and then you should be able to access the chat interface.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv3hhz6xv0g1djbendzrd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv3hhz6xv0g1djbendzrd.png" alt="Agent chat interface screenshot" width="800" height="429"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From there, you can start asking any question or use one of the suggested prompts, for example try asking: &lt;code&gt;Recommend me an extra spicy burger&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;As the agent processes your request, you'll see the response streaming in real-time, along with the intermediate steps and tool calls. Once the response is complete, you can also unfold the debug panel to see the full reasoning chain and the tools that were invoked:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjrk3nr22ypq4jm0qfaum.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjrk3nr22ypq4jm0qfaum.png" alt="Intermediate steps debug panel screenshot" width="800" height="556"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; Our agent service also sends detailed tracing data using OpenTelemetry. You can explore these either in Azure Monitor for the deployed service, or locally using an OpenTelemetry collector. We'll cover this in more detail in a future post.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Wrap it up
&lt;/h2&gt;

&lt;p&gt;Congratulations, you just finished spinning up a full-stack serverless AI agent using LangChain.js v1, MCP tools, and Azure’s serverless platform. Now it's your turn to dive in the code and extend it for your use cases! 😎 And don't forget to &lt;code&gt;azd down&lt;/code&gt; once you're done to avoid any unwanted costs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Going further
&lt;/h2&gt;

&lt;p&gt;This was just a quick introduction to this sample, and you can expect more in-depth posts and tutorials soon.&lt;/p&gt;

&lt;p&gt;Since we're in the era of AI agents, we've also made sure that this sample can be explored and extended easily with code agents like GitHub Copilot.&lt;br&gt;
We even built a custom chat mode to help you discover and understand the codebase faster! Check out the &lt;a href=".https://github.com/Azure-Samples/mcp-agent-langchainjs/blob/main/docs/copilot.md"&gt;Copilot setup guide&lt;/a&gt; in the repo to get started.&lt;/p&gt;

&lt;p&gt;If you like this sample, don't forget to star the repo ⭐️! You can also join us in the &lt;a href="https://aka.ms/foundry/discord" rel="noopener noreferrer"&gt;Azure AI community Discord&lt;/a&gt; to chat and ask any questions.&lt;/p&gt;

&lt;p&gt;Happy coding and burger ordering! 🍔&lt;/p&gt;

</description>
      <category>ai</category>
      <category>javascript</category>
      <category>langchain</category>
      <category>azure</category>
    </item>
    <item>
      <title>What’s in a Name? Fuzzy Matching for Real-World Data</title>
      <dc:creator>Renee Noble</dc:creator>
      <pubDate>Fri, 17 Oct 2025 00:47:36 +0000</pubDate>
      <link>https://dev.to/azure/whats-in-a-name-fuzzy-matching-for-real-world-data-5b5o</link>
      <guid>https://dev.to/azure/whats-in-a-name-fuzzy-matching-for-real-world-data-5b5o</guid>
      <description>&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.youtube.com/watch?v=-AQBJTt1qR4" rel="noopener noreferrer"&gt;🎥&amp;nbsp;Watch the full PyCon AU 2025 talk here&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;

  &lt;iframe src="https://www.youtube.com/embed/-AQBJTt1qR4"&gt;
  &lt;/iframe&gt;


&lt;/p&gt;

&lt;p&gt;When you work with human-entered data (registrations, surveys, customer forms, you name it!) you soon discover that &lt;strong&gt;people are very creative typists&lt;/strong&gt;. Names, schools, companies, and addresses come in with abbreviations, nicknames, missing words, and typos galore.&lt;/p&gt;

&lt;p&gt;That mess makes it hard to answer even simple questions like: &lt;em&gt;“Do these two records refer to the same person?”&lt;/em&gt; or &lt;em&gt;“How many participants came from this organisation?”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;At PyCon AU 2025, I explored how different fuzzy matching techniques, from traditional algorithms to generative AI, can help make sense of that chaos.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Fuzzy Matching Challenge
&lt;/h2&gt;

&lt;p&gt;String comparison looks straightforward until you meet real-world data. “PLC Sydney” might really be “Presbyterian Ladies’ College Sydney.” “Certain Collage” is obviously a typo for “Certain College” (hopefully). And nicknames like Liz, Lizzy, and Elizabeth might all belong to the same person.&lt;/p&gt;

&lt;p&gt;That’s where &lt;strong&gt;fuzzy matching&lt;/strong&gt; comes in, using a variety of techniques we can rank how similar different non-identical words are to try and find the most likely match. But the question is, what fuzzy matching algorithms are best suited for matching what types of data? And can generative AI play a part in this matching game?&lt;/p&gt;

&lt;h3&gt;
  
  
  Comparing Algorithmic Approaches
&lt;/h3&gt;

&lt;p&gt;I put six Python libraries to the test:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;TextDistance&lt;/strong&gt; and &lt;strong&gt;Python-Levenshtein&lt;/strong&gt; – classic edit-distance approaches.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FuzzyWuzzy&lt;/strong&gt; and &lt;strong&gt;RapidFuzz&lt;/strong&gt; – hybrids that combine multiple distance metrics.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nicknames&lt;/strong&gt; and &lt;strong&gt;PyNameMatcher&lt;/strong&gt; – specialised tools for given-name variations.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To test them, I generated around 100 fake student names with nicknames, misspellings, and swapped orderings. Then I measured how accurately each library matched them to their correct counterparts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RapidFuzz&lt;/strong&gt; came out ahead, matching almost every record correctly, and doing it fast! The edit-distance methods struggled most with multicultural names where order or character sets varied, and the nickname libraries were strong but less consistent overall.&lt;/p&gt;

&lt;h3&gt;
  
  
  When Generative AI Shines
&lt;/h3&gt;

&lt;p&gt;Algorithmic fuzzy matching is fast and accurate, but it only looks at characters, not meaning. That’s where I turned to &lt;strong&gt;Azure OpenAI Service&lt;/strong&gt; for a different kind of help.&lt;/p&gt;

&lt;p&gt;By feeding in real school-name data, I found that straight out of the box &lt;strong&gt;GPT-5 was exceptionally good at recognising and correcting school names&lt;/strong&gt;, especially when they were abbreviated, misspelled, or included local school nicknames.&lt;/p&gt;

&lt;p&gt;For example, it could confidently map:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“PLC Syd” → “Presbyterian Ladies’ College Sydney”&lt;/li&gt;
&lt;li&gt;“Cerdon Collage” → “Cerdon College”&lt;/li&gt;
&lt;li&gt;“St Cats” → “St Catherine’s School, Waverley”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That level of contextual correction is almost impossible to achieve with pure algorithmic matching unless you maintain a custom dictionary of every possible variation. And who has time for that!&lt;/p&gt;

&lt;p&gt;The trade-off, of course, is performance. Generative models are slower and costlier to run at scale. But when used selectively, just for ambiguous or hard-to-match cases, they can dramatically improve accuracy. And of course this is something this specifically works well for names, like schools, that are well documented on the internet – something that doesn’t apply to the names of individual school students.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can we have the best of both worlds?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;hybrid AI + Algorithmic matching!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In practice, the best results came from a &lt;strong&gt;hybrid approach&lt;/strong&gt;, using traditional fuzzy-matching algorithms for most cases, and bringing in &lt;strong&gt;Azure OpenAI&lt;/strong&gt; only when the names got tricky. For example, RapidFuzz could quickly match “Lizzy Wong” to “Elizabeth Wong,” while the generative model was better at reasoning through ambiguous inputs like “Sally-Anne W.” or reversed multicultural name orders. By combining both, I could match almost every student record accurately, keeping the speed of algorithmic methods while adding the contextual understanding of generative AI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It Yourself
&lt;/h2&gt;

&lt;p&gt;🎥 You can watch my full PyCon AU 2025 talk here:&lt;br&gt;
&lt;strong&gt;&lt;a href="https://www.youtube.com/watch?v=-AQBJTt1qR4" rel="noopener noreferrer"&gt;What’s in a Name: Fuzzy Matching Techniques for Proper Nouns&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;📁 If you’d like to explore this further you can check out my &lt;strong&gt;&lt;a href="https://aka.ms/rn-whats-in-a-name" rel="noopener noreferrer"&gt;fuzzy matching repo&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Take a look at the libraries and tool I mentioned above, they’re easy to install and experiment with in Python. If you’re already using Azure OpenAI, it’s worth testing how a small retrieval-augmented setup might complement your existing matching logic.&lt;/p&gt;
&lt;h2&gt;
  
  
  Chat to us!
&lt;/h2&gt;

&lt;p&gt;💬 To chat more about AI solutions you can join the AI Foundry Discord, where advocates like me are chatting about the latest tools all the time. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://aka.ms/AI-Discord-rn-FM-blog" class="crayons-btn crayons-btn--primary" rel="noopener noreferrer"&gt;Join the Azure AI Foundry Discord here&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Good luck on your fuzzy matching adventures!&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>azure</category>
      <category>ai</category>
      <category>datascience</category>
    </item>
    <item>
      <title>A Better Way to Tune the JVM in Dockerfiles and Kubernetes Manifests</title>
      <dc:creator>Bruno Borges</dc:creator>
      <pubDate>Fri, 12 Sep 2025 03:36:26 +0000</pubDate>
      <link>https://dev.to/azure/a-better-way-to-tune-the-jvm-in-dockerfiles-and-kubernetes-manifests-329c</link>
      <guid>https://dev.to/azure/a-better-way-to-tune-the-jvm-in-dockerfiles-and-kubernetes-manifests-329c</guid>
      <description>&lt;p&gt;When tuning the JVM inside containers, I often see Dockerfiles and Kubernetes manifests with long, hard-to-read java commands packed with -Xmx, -XX:+UseG1GC, and other flags. Every time you want to tweak memory or GC settings, you have to edit those commands and rebuild or redeploy.&lt;/p&gt;




&lt;h3&gt;
  
  
  Free webinar Java on Kubernetes Performance Engineering
&lt;/h3&gt;

&lt;p&gt;Running Java on Kubernetes? It's harder - and more critical - than you think. Join us September 25th, 2025, for a live webinar with Akamas &amp;amp; Microsoft on tuning Java apps at scale. JVM tips, GC tuning, JDK 25, Project Leyden &amp;amp; more.&lt;/p&gt;

&lt;p&gt;Register at &lt;a href="https://akamas.io/events/java-on-kubernetes-lessons-in-performance-engineering-with-akamas-and-microsoft/" rel="noopener noreferrer"&gt;https://akamas.io/events/java-on-kubernetes-lessons-in-performance-engineering-with-akamas-and-microsoft/&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  What about JAVA_OPTS?
&lt;/h1&gt;

&lt;p&gt;This flag is not read by the JVM itself. It only works if the launch script explicitly uses it and expands its content into the call to the java launcher. It behaves exactly the same as Apache Tomcat's CATALINA_OPTS, which is read by catalina.sh.&lt;/p&gt;

&lt;p&gt;There’s a much cleaner way to do this... and it’s built into the JDK. It’s the most modern, well-scoped solution, playing well with deployment orchestration solutions like Kubernetes.&lt;/p&gt;

&lt;h1&gt;
  
  
  🚀 Enter JDK_JAVA_OPTIONS
&lt;/h1&gt;

&lt;p&gt;JDK_JAVA_OPTIONS is an environment variable that the JVM reads automatically. Whatever you put there gets appended to the command line of every JDK tool (java, javac, jshell, etc.) This means you can move all your tuning flags out of your launcher command, keeping your Dockerfiles and manifests clean and maintainable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cleaned-up Dockerfile
&lt;/h2&gt;

&lt;p&gt;Before (messy):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["java", "-Xmx512m", "-XX:+UseG1GC", "-jar", "app.jar"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After (clean):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; JDK_JAVA_OPTIONS="-Xmx512m -XX:+UseG1GC"&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["java", "-jar", "app.jar"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, if you need to change heap size or GC settings, you just update the environment variable. No need to touch the command.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kubernetes Example
&lt;/h2&gt;

&lt;p&gt;If your container is likely to end up on Kubernetes, don't even tune the JVM in the Dockerfile. Consider leaving this as an external configuration, coming from the Kubernetes manifest. &lt;/p&gt;

&lt;p&gt;This is because the container image doesn't know what memory limits will be applied during runtime. And even if you set a MaxRAMPercentage for the heap, the amount you set may not be ideal if the container ends up with too much memory, potentially wasting memory from the delta not used, for example.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;myapp&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;myapp:latest&lt;/span&gt;
    &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;JDK_JAVA_OPTIONS&lt;/span&gt;
        &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-Xmx512m&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-XX:+UseG1GC"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your deployment YAML stays clean and your operations team can tune JVM behavior at deploy time without changing the image.&lt;/p&gt;

&lt;h1&gt;
  
  
  Why JDK_JAVA_OPTIONS Is Better
&lt;/h1&gt;

&lt;p&gt;✅ Cleaner Manifests – fewer arguments to maintain&lt;br&gt;
🔄 Configurable at Runtime – no rebuild required&lt;br&gt;
🛠 Debug-Friendly – JVM prints the options it picked up&lt;br&gt;
🐳 Perfect for Containers – works across Docker, Kubernetes, ECS, etc.&lt;br&gt;
🎯 Applies to All JDK Tools – not just java, but also javac, jshell, etc.&lt;/p&gt;

&lt;p&gt;If you’re running Java apps in Docker or Kubernetes, stop hardcoding JVM flags into your command line. Use JDK_JAVA_OPTIONS instead. It makes your images cleaner, your manifests easier to read, and your JVM tuning more flexible.&lt;/p&gt;
&lt;h1&gt;
  
  
  Precedence, Order of Priority, and Scope
&lt;/h1&gt;

&lt;p&gt;The HotSpot JVM supports, in practice, three environment variables. And for many historical reasons we ended up in this situation. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgkl535gcb2dgp018an66.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgkl535gcb2dgp018an66.png" alt=" " width="800" height="264"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But in what order are they processed, and where? The rule of thumb is below. Except that in JDK 8, the variable JDK_JAVA_OPTIONS is not supported.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
_JAVA_OPTIONS &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; JDK_JAVA_OPTIONS &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; JAVA_TOOL_OPTIONS

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Besides the order they are processed, there is also where they are processed and how this impacts what parameters are effective. &lt;/p&gt;

&lt;p&gt;According to the bug &lt;a href="https://bugs.openjdk.org/browse/JDK-8170832" rel="noopener noreferrer"&gt;JDK-8170832&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;_JAVA_OPTIONS&lt;/code&gt; and &lt;code&gt;JAVA_TOOL_OPTIONS&lt;/code&gt; environment variable are interpreted by the VM, not the launcher [java], hence no @-files or launcher-only options. The former is undocumented and unsupported but widely used; the latter is documented and supported.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You can see for yourself the behaviour of these environment variables with this little project I built (with GitHub Copilot): &lt;a href="https://github.com/brunoborges/jdk-env-vars" rel="noopener noreferrer"&gt;github.com/brunoborges/jdk-env-vars&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Thoughts?
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;What JVM tuning tricks are you using in containers today?&lt;/li&gt;
&lt;li&gt;Have you tried JDK_JAVA_OPTIONS yet? &lt;/li&gt;
&lt;li&gt;Did you know about it? &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Comment below.&lt;/p&gt;

&lt;h1&gt;
  
  
  Resources
&lt;/h1&gt;

&lt;p&gt;Resources&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.oracle.com/en/java/javase/21/troubleshoot/environment-variables-and-system-properties.html#GUID-A91E7E21-2E91-48C4-89A4-836A7C0EE93B" rel="noopener noreferrer"&gt;OpenJDK 21: JAVA_TOOL_OPTIONS documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.oracle.com/en/java/javase/21/docs/specs/man/java.html#using-the-jdk_java_options-launcher-environment-variable" rel="noopener noreferrer"&gt;OpenJDK 21: JDK_JAVA_OPTIONS documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://bugs.openjdk.org/browse/JDK-8170832" rel="noopener noreferrer"&gt;JDK-8170832&lt;/a&gt;: Add a new launcher environment variables&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>kubernetes</category>
      <category>java</category>
      <category>docker</category>
      <category>performance</category>
    </item>
    <item>
      <title>Model Mondays S2E04 - AI Developer Experiences</title>
      <dc:creator>Nitya Narasimhan, Ph.D</dc:creator>
      <pubDate>Fri, 11 Jul 2025 03:25:13 +0000</pubDate>
      <link>https://dev.to/azure/model-mondays-s2e04-ai-developer-experiences-41mf</link>
      <guid>https://dev.to/azure/model-mondays-s2e04-ai-developer-experiences-41mf</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fifnd5j9v3lbqzkctlvx1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fifnd5j9v3lbqzkctlvx1.png" alt="Model Mondays Banner"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;🧪 | Some parts of this blog were generated with AI assistance, and reviewed manually before publishing. To learn more about the why and the how, please refer to &lt;a href="https://github.com/microsoft/model-mondays/blob/main/docs/README.ai.md" rel="noopener noreferrer"&gt;this document&lt;/a&gt; in our website.&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Model Mondays is a weekly series that helps you build your AI Model IQ with 5-min news recaps, 15-min tech spotlights and 30-min AMA sessions with subject matter experts. Join us!&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://aka.ms/model-mondays/rsvp" rel="noopener noreferrer"&gt;Register&lt;/a&gt;&lt;/strong&gt; for upcoming livestreams (Mon @1:30pm ET) &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://aka.ms/model-mondays/forum" rel="noopener noreferrer"&gt;Register&lt;/a&gt;&lt;/strong&gt; for upcoming AMAs (Fri @1:30pm ET) &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://aka.ms/model-mondays/newsletter" rel="noopener noreferrer"&gt;Subscribe&lt;/a&gt;&lt;/strong&gt; to the weekly newsletter&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://aka.ms/model-mondays" rel="noopener noreferrer"&gt;Explore&lt;/a&gt;&lt;/strong&gt; Season 1 &amp;amp; Season 2 episodes on our repo!&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;⁉️ | Have questions on the &lt;strong&gt;AI TOOLKIT EXTENSION FOR VS CODE&lt;/strong&gt; &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://aka.ms/aitoolkit" rel="noopener noreferrer"&gt;Download the AI Toolkit&lt;/a&gt; and try it!&lt;/li&gt;
&lt;li&gt;Join the AMA on Friday, Jul 11 on the &lt;a href="https://discord.gg/azureaifoundry?event=1382861578201858058" rel="noopener noreferrer"&gt;Azure AI Foundry Discord&lt;/a&gt;. &lt;/li&gt;
&lt;li&gt;Visit recaps &amp;amp; resources &lt;a href="https://github.com/orgs/azure-ai-foundry/discussions/90" rel="noopener noreferrer"&gt;on the Forum&lt;/a&gt; to keep learning.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Spotlight On: AI Developer Experiences
&lt;/h2&gt;

&lt;p&gt;In this episode we got to see a hands-on demo from Leo Yao, a Product Manager for the AI Toolkit, who took us through the various tools and capabilities that this extension brings to Visual Studio Code, to streamline our AI development journey. If you missed the livestream, you can catch up on the recap here:&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/tNiFbf3XP6k"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;




&lt;h2&gt;
  
  
  What You'll Learn
&lt;/h2&gt;

&lt;p&gt;So why should you watch this episode? Simple! If you wanted to see how you could streamline your AI Developer Experience without ever leaving Visual Studio Code, then the AI Toolkit is the extension you want to explore. In the space of just 15 minutes, I got to see Leo complete the following tasks, all within the IDE!&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Discover &amp;amp; use GitHub Models with a built-in playground feature.&lt;/li&gt;
&lt;li&gt;Deploy models (GPT-4) to Azure AI Foundry directly from VS Code.&lt;/li&gt;
&lt;li&gt;Build AI agents with Agent Builder (to createa a math tutor)&lt;/li&gt;
&lt;li&gt;Configure agents with prompts &amp;amp; tools (for an escape room helper)&lt;/li&gt;
&lt;li&gt;Integrate MCP servers to extend functionality (custom Python code)&lt;/li&gt;
&lt;li&gt;Deploy agents locally, and to Azure AI Foundry (for flexibility)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And that was just in 15-minutes. I can only imagine what other features and tools we are yet to discover if we try this out ourselves. Want to get links to the extension, documentation and key resources to skill up? You'll find the links in the deck below:&lt;/p&gt;

&lt;p&gt;&lt;iframe class="speakerdeck-iframe ltag_speakerdeck" src="https://speakerdeck.com/player/f33b97a07e65480797877c5168edbe17"&gt;
&lt;/iframe&gt;
&lt;/p&gt;




&lt;h2&gt;
  
  
  How to Get Started
&lt;/h2&gt;

&lt;p&gt;Looking back, my first introduction to the AI Toolkit was in Model Mondays Season 1, from Microsoft Product PM Rong Lu. She gave us a comprehensive overview of the various features including support for data generation and evaluation. I recommend taking 15 minutes to review her demo in this episode:&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/MgIfvEEZN7o"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Once you're familiar with the basics, I recommend you check out these three links to dive deeper into the process of building agent-based solutions on Azure AI Foundry with AI Toolkit and Visual Studio Code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. &lt;a href="https://learn.microsoft.com/en-us/windows/ai/toolkit/toolkit-getting-started" rel="noopener noreferrer"&gt;AI Toolkit for Visual Studio Code - Getting Started Guide&lt;/a&gt;&lt;/strong&gt; - This is my recommended starting point. The tutorial covers installation, then walks you through the steps for downloading models from the catalog, then testing and integrating models into your application. You can then keep going with more tutorials to learn other features like fine-tuning support.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. &lt;a href="https://learn.microsoft.com/en-us/azure/ai-foundry/how-to/develop/get-started-projects-vs-code" rel="noopener noreferrer"&gt;Azure AI Foundry Extension for Visual Studio Code&lt;/a&gt;&lt;/strong&gt; - This extension now lets you work with the Azure AI Foundry platform capabilities directly from VS Code. This screenshot from the docs gives you a sense of the tasks you can achieve from your IDE - including project setup and model deployments.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd60mt0hydl8pa93htabd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd60mt0hydl8pa93htabd.png" alt="Menu"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. &lt;a href="https://code.visualstudio.com/docs/intelligentapps/agentbuilder" rel="noopener noreferrer"&gt;Agent Builder in AI Toolkit&lt;/a&gt;&lt;/strong&gt; -The Agent Builder in AI Toolkit simplifies and streamlines your workflow for building agents - from prompt engineering to tool integration (including with MCP servers). Get an intuitive sense for going from model to prompt to agentic workflows with tooling help.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvx7wyimzlfce8p9skhos.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvx7wyimzlfce8p9skhos.gif" alt="Agent Builder"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⁉️ | Have questions? Don't forget to join us for the AMA on Friday (Jul 11) on the &lt;a href="https://discord.gg/azureaifoundry?event=1382861578201858058" rel="noopener noreferrer"&gt;Azure AI Foundry Discord&lt;/a&gt;. Post your questions early &lt;a href="https://github.com/orgs/azure-ai-foundry/discussions/90" rel="noopener noreferrer"&gt;on the Forum&lt;/a&gt; or revisit it later to get the transcript and resources from the discussion!&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Read The Blog
&lt;/h2&gt;

&lt;p&gt;Want an easy way to catch up on all the news? Check out complete blog series written by our resident student blogger &lt;a href="https://aka.ms/model-mondays/blog" rel="noopener noreferrer"&gt;here on Tech Community&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;You can also follow her posts, right here on dev.to:&lt;/p&gt;


&lt;div class="ltag__user ltag__user__id__1940688"&gt;
    &lt;a href="/sharda_kaur" class="ltag__user__link profile-image-link"&gt;
      &lt;div class="ltag__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1940688%2F8406e1c5-5e99-4711-9ca5-f3bae3dde4fa.jpg" alt="sharda_kaur image"&gt;
      &lt;/div&gt;
    &lt;/a&gt;
  &lt;div class="ltag__user__content"&gt;
    &lt;h2&gt;
&lt;a class="ltag__user__link" href="/sharda_kaur"&gt;Sharda Kaur&lt;/a&gt;Follow
&lt;/h2&gt;
    &lt;div class="ltag__user__summary"&gt;
      &lt;a class="ltag__user__link" href="/sharda_kaur"&gt;Gold @Microsoft MLSA  || Technical Content Writer || Open Source Contributor || Web Developer || CUIET MCA'26&lt;/a&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;





&lt;h2&gt;
  
  
  Build Your Model IQ!
&lt;/h2&gt;

&lt;p&gt;Model Mondays Season 2 is currently scheduled to go from June to September, covering the 12 key topics shown below.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;👉🏽👉🏽 &lt;a href="https://aka.ms/model-mondays/rsvp" rel="noopener noreferrer"&gt;Register for Upcoming Livestreams&lt;/a&gt; to get reminders&lt;/li&gt;
&lt;li&gt;👉🏽👉🏽 &lt;a href="https://github.com/orgs/azure-ai-foundry/discussions/90" rel="noopener noreferrer"&gt;Register for Upcoming AMAs&lt;/a&gt; to get reminders&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fetcnia5e90rhttuw3n13.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fetcnia5e90rhttuw3n13.png" alt="Season 2"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>azureaifoundry</category>
      <category>ama</category>
      <category>modelmondays</category>
    </item>
    <item>
      <title>Using LlamaIndex.TS to Orchestrate MCP Servers</title>
      <dc:creator>Wassim Chegham</dc:creator>
      <pubDate>Mon, 07 Jul 2025 15:49:59 +0000</pubDate>
      <link>https://dev.to/azure/using-llamaindexts-to-orchestrate-mcp-servers-413k</link>
      <guid>https://dev.to/azure/using-llamaindexts-to-orchestrate-mcp-servers-413k</guid>
      <description>&lt;p&gt;In this post, we’ll demonstrate how to orchestrate Model Context Protocol (MCP) servers using &lt;a href="https://ts.llamaindex.ai/" rel="noopener noreferrer"&gt;llamaindex.TS&lt;/a&gt; in a real-world TypeScript application. We’ll use the &lt;a href="https://aka.ms/azure-ai-travel-agents" rel="noopener noreferrer"&gt;Azure AI Travel Agents&lt;/a&gt; project as our base, focusing on best practices for secure, scalable, and maintainable orchestration. Feel free to star the repo to get notified with the latest changes.&lt;/p&gt;

&lt;p&gt;If you are interested in an overview of the Azure AI Travel Agents project, please read &lt;a href="https://techcommunity.microsoft.com/blog/AzureDevCommunityBlog/introducing-azure-ai-travel-agents-a-flagship-mcp-powered-sample-for-ai-travel-s/4416683" rel="noopener noreferrer"&gt;our announcement blog&lt;/a&gt;!&lt;/p&gt;




&lt;h2&gt;
  
  
  Why llamaindex.TS and MCP?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;llamaindex.TS&lt;/strong&gt; provides a modular, composable framework for building LLM-powered applications in TypeScript.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP&lt;/strong&gt; enables tool interoperability and streaming, making it ideal for orchestrating multiple AI services.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Project Structure
&lt;/h2&gt;

&lt;p&gt;The Llamaindex.TS orchestrator lives in &lt;a href="https://github.com/Azure-Samples/azure-ai-travel-agents/tree/main/src/api/src/orchestrator/llamaindex/" rel="noopener noreferrer"&gt;&lt;code&gt;src/api/src/orchestrator/llamaindex&lt;/code&gt;&lt;/a&gt;, with provider modules for different LLM backends and MCP clients. We currently support:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Azure OpenAI&lt;/li&gt;
&lt;li&gt;Docker Models&lt;/li&gt;
&lt;li&gt;Azure AI Foundry Local&lt;/li&gt;
&lt;li&gt;Github Model&lt;/li&gt;
&lt;li&gt;Ollama&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Feel free to explore the code base and suggest more providers.&lt;/p&gt;




&lt;h2&gt;
  
  
  Setting Up the MCP Client with Streamable HTTP
&lt;/h2&gt;

&lt;p&gt;To interact with MCP servers, without using Llamaindex.TS, we can write a custom implementation using the &lt;code&gt;StreamableHTTPClientTransport&lt;/code&gt; for efficient, authenticated, and streaming communication.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// filepath: src/api/src/mcp/mcp-http-client.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;EventEmitter&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;node:events&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Client&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@modelcontextprotocol/sdk/client/index.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;StreamableHTTPClientTransport&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@modelcontextprotocol/sdk/client/streamableHttp.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MCPClient&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;EventEmitter&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;transport&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;StreamableHTTPClientTransport&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;serverName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;serverUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;accessToken&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;transport&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;StreamableHTTPClientTransport&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;serverUrl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;accessToken&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;Authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;accessToken&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;serverName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;transport&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;initialize&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;listTools&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listTools&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;callTool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;toolArgs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;callTool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;toolArgs&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;closeGracefully&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Best Practice:&lt;/strong&gt; Always pass the &lt;code&gt;Authorization&lt;/code&gt; header for secure access, as shown above.&lt;/p&gt;

&lt;h2&gt;
  
  
  Calling manually an MCP Tool from the Orchestrator
&lt;/h2&gt;

&lt;p&gt;Suppose you want to get destination recommendations from the MCP server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;MCPClient&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../../mcp/mcp-http-client&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;DESTINATION_SERVER_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;MCP_DESTINATION_RECOMMENDATION_URL&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ACCESS_TOKEN&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;MCP_DESTINATION_RECOMMENDATION_ACCESS_TOKEN&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mcpClient&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;MCPClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;destination-recommendation&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;DESTINATION_SERVER_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ACCESS_TOKEN&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;mcpClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;mcpClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listTools&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Available tools:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;mcpClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;callTool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;getDestinationsByPreferences&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;activity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;CULTURAL&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;budget&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;MODERATE&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;season&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;SUMMER&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;familyFriendly&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Recommended destinations:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;mcpClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; Always close the MCP client gracefully to release resources.&lt;/p&gt;




&lt;h2&gt;
  
  
  Orchestrating LLMs and MCP Tools with Llamaindex.TS
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;mcp&lt;/code&gt; client from &lt;code&gt;@llamaindex/tools&lt;/code&gt; makes it easy to connect to MCP servers and retrieve tool definitions dynamically. Below is a sample from the project’s orchestrator setup, showing how to use &lt;code&gt;mcp&lt;/code&gt; to fetch tools and create agents for each MCP server.&lt;/p&gt;

&lt;p&gt;Here is an example of what an &lt;code&gt;mcpServerConfig&lt;/code&gt; object might look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mcpServerConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;http://localhost:5007&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// MCP server endpoint&lt;/span&gt;
  &lt;span class="na"&gt;accessToken&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;MCP_ECHO_PING_ACCESS_TOKEN&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Secure token from env&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;echo-ping&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Logical name for the server&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can then use this config with the &lt;code&gt;mcp&lt;/code&gt; client:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;mcp&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@llamaindex/tools&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;multiAgent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ToolCallLLM&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;llamaindex&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// ...existing code...&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mcpServerConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;mcpToolsConfig&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;echo-ping&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;mcp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mcpServerConfig&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;echoAgent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;EchoAgent&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;systemPrompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Echo back the received input. Do not respond with anything else. Always call the tools.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;llm&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;verbose&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;agentsList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;echoAgent&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;handoffTargets&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;echoAgent&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;toolsList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(...&lt;/span&gt;&lt;span class="nx"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// ...other code...&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;travelAgent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;TravelAgent&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;systemPrompt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Acts as a triage agent to determine the best course of action for the user's query. If you cannot handle the query, please pass it to the next agent. If you can handle the query, please do so.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[...&lt;/span&gt;&lt;span class="nx"&gt;toolsList&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;canHandoffTo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;handoffTargets&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getAgents&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;flat&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="nx"&gt;llm&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;verbose&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="nx"&gt;agentsList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;travelAgent&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Create the multi-agent workflow&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;multiAgent&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;agents&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;agentsList&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;rootAgent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;travelAgent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;verbose&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can repeat this pattern to compose a multi-agent workflow where each agent is powered by tools discovered at runtime from the MCP server. See project for &lt;a href="https://github.com/Azure-Samples/azure-ai-travel-agents/blob/main/src/api/src/orchestrator/llamaindex/index.ts" rel="noopener noreferrer"&gt;a full example&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can then use this LLM instance to orchestrate calls to MCP tools, such as itinerary planning or destination recommendation.&lt;/p&gt;




&lt;h2&gt;
  
  
  Security Considerations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Always use access tokens and secure headers.&lt;/li&gt;
&lt;li&gt;Never hardcode secrets; use environment variables and secret managers.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Join the Community:
&lt;/h2&gt;

&lt;p&gt;We encourage you to join our Azure AI Foundry Developer Community​ to share your experiences, ask questions, and get support:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Join our &lt;a href="https://discord.gg/NcwHpz6bRW" rel="noopener noreferrer"&gt;Discord community&lt;/a&gt; for real-time discussions and support.&lt;/li&gt;
&lt;li&gt;Visit our &lt;a href="//aka.ms/foundry/forum"&gt;Azure AI Foundry Developer Forum&lt;/a&gt; to ask questions and share your knowledge.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;By combining llamaindex.TS with MCP’s Streamable HTTP transport, you can orchestrate powerful, secure, and scalable AI workflows in TypeScript. The Azure AI Travel Agents project provides a robust template for building your own orchestrator.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;References:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://ts.llamaindex.ai/" rel="noopener noreferrer"&gt;llamaindex.TS Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://modelcontextprotocol.io/specification/2025-03-26/basic/transports#streamable-http" rel="noopener noreferrer"&gt;MCP Streamable HTTP Spec&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aka.ms/azure-ai-travel-agents" rel="noopener noreferrer"&gt;Azure AI Travel Agents Sample&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>mcp</category>
      <category>programming</category>
      <category>cloud</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Model Mondays S2E03 - SLMs and Reasoning</title>
      <dc:creator>Nitya Narasimhan, Ph.D</dc:creator>
      <pubDate>Thu, 03 Jul 2025 03:01:19 +0000</pubDate>
      <link>https://dev.to/azure/model-mondays-s2e03-ama-on-slms-and-reasoning-25dg</link>
      <guid>https://dev.to/azure/model-mondays-s2e03-ama-on-slms-and-reasoning-25dg</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fifnd5j9v3lbqzkctlvx1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fifnd5j9v3lbqzkctlvx1.png" alt="Model Mondays Banner"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Model Mondays is a weekly series that helps you build your AI Model IQ with 5-min news recaps, 15-min tech spotlights and 30-min AMA sessions with subject matter experts. Join us!&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://aka.ms/model-mondays/rsvp" rel="noopener noreferrer"&gt;Register&lt;/a&gt;&lt;/strong&gt; for upcoming livestreams (Mon @1:30pm ET) &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://aka.ms/model-mondays/forum" rel="noopener noreferrer"&gt;Register&lt;/a&gt;&lt;/strong&gt; for upcoming AMAs (Fri @1:30pm ET) &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://aka.ms/model-mondays/newsletter" rel="noopener noreferrer"&gt;Subscribe&lt;/a&gt;&lt;/strong&gt; to the weekly newsletter&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://aka.ms/model-mondays" rel="noopener noreferrer"&gt;Explore&lt;/a&gt;&lt;/strong&gt; Seasom 1 &amp;amp; Season 2 episodes on our repo!&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Spotlight On: SLMs and Reasoning
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;🧪 | This section was generated with AI help and human revision &amp;amp; review. To learn more, please refer to &lt;a href="https://github.com/microsoft/model-mondays/blob/main/docs/README.ai.md" rel="noopener noreferrer"&gt;this document&lt;/a&gt; in our website.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;How can you bring advanced reasoning to resource-constrained devices? This session explores the latest in Small Language Models (SLMs) like Phi-4, which are redefining what’s possible for agentic apps. &lt;/p&gt;

&lt;p&gt;Mojan Javaheripi, a Senior Microsoft Researcher, will discuss how SLMs leverage inference-time scaling and chain-of-thought reasoning to deliver powerful results on smaller hardware. Discover use cases, deployment strategies, and how SLMs are making AI more accessible and efficient for everyone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Download The Deck With Key Resource Links:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;iframe class="speakerdeck-iframe ltag_speakerdeck" src="https://speakerdeck.com/player/cefcc8825d3c48fca1beb91a02cfd76d"&gt;
&lt;/iframe&gt;
&lt;/p&gt;




&lt;h2&gt;
  
  
  Phi-4 Reasoning: Power Through Precision
&lt;/h2&gt;

&lt;p&gt;In her spotlight talk, Mojan introduced the Phi-4-reasoning model and a Phi-4-reasoning-plus model and walked us through the techniques used to create these variants in a manner that allows them to work in resource-constrained environments, while providing comparable accuracy to larger language models. The motivation for this work comes from wanting to &lt;em&gt;bridge the gap between large frontier models and smaller, more efficient models that can run on commodity hardware&lt;/em&gt; including personal devices like laptops, but also edge devices at industry scale.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Watch The Replay From Her Livestream&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/VLQKZq8L9Uk"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why is this important?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The Phi-4 reasoning models are designed for explicit, step-by-step problem solving, with a focus on explainability and logical decomposition. Mojan details the training pipeline, including data curation, supervised fine-tuning, and reinforcement learning, and shares benchmarking results that show Phi-4 models outperforming much larger models in math, science, and coding tasks. The discussion covers community adoption, quantization for edge devices, and the importance of fine-tuning for domain-specific applications. Real-world use cases include intelligent tutoring, autonomous agents, code generation, and strategic planning.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Takeaways From The Session&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Phi-4 reasoning models deliver state-of-the-art reasoning and efficiency at a fraction of the size of frontier models.&lt;/li&gt;
&lt;li&gt;SLMs are ideal for edge, local, and resource-constrained deployments, with strong support for quantization and customization.&lt;/li&gt;
&lt;li&gt;Fine-tuning &amp;amp; reinforcement learning enable adaptation to new domains &amp;amp; tasks.&lt;/li&gt;
&lt;li&gt;Open-source and community contributions accelerate innovation and adoption.&lt;/li&gt;
&lt;li&gt;Responsible AI, safety, and explainability are core to Phi-4 model design.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Sidebar: AI &amp;amp; Content Generation
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;You may have noticed the 🧪 annotation about AI-generated content. Let's talk about how this was done, and why.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Model Mondays is a series about building your AI model IQ - and learning how to find the right model for the task. And the best way to learn something is by applying it to a real problem. Starting this week, I'm using AI to streamline many content-related tasks for Model Mondays. And I wanted to share not just the reasoning for this, but the process and tooling I use - in the hopes that it helps others find productive uses for the same workflows.&lt;/p&gt;

&lt;h3&gt;
  
  
  Motivation: Efficiency
&lt;/h3&gt;

&lt;p&gt;On a weekly basis I have to plan for two different sessions (livestream and AMA), coordinate across speakers and hosts, then publish pre- and post- event content writeups that provide promotion and recap value respectively.&lt;/p&gt;

&lt;p&gt;Writing these manually is not just time-consuming, it is also complicated by the fact that each week has new topics to research - and new discussions to summarize that require cognitive bandwidth. My a-ha moment was in recognizing that &lt;em&gt;prompt creation is also content creation&lt;/em&gt; and crafting a well-written prompt to create content can be as rewarding and effective as authoring the content from scratch.&lt;/p&gt;

&lt;h3&gt;
  
  
  Workflow: Agent Mode + MCP
&lt;/h3&gt;

&lt;p&gt;How am I doing this? I'm using &lt;a href="https://code.visualstudio.com/docs/copilot/chat/chat-agent-mode" rel="noopener noreferrer"&gt;Visual Studio Code Agent Mode&lt;/a&gt; in a GitHub Codespaces environment launched on the Model Mondays repo. Every task is reduced to a &lt;em&gt;custom prompt&lt;/em&gt; that is stored in the codebase for reuse. &lt;/p&gt;

&lt;p&gt;Here are some examples:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Give it the YouTube transcript &lt;a href="https://github.com/orgs/azure-ai-foundry/discussions/76#discussioncomment-13620279" rel="noopener noreferrer"&gt;and have it summarize it&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Give it the AMA transcript &lt;a href="https://github.com/orgs/azure-ai-foundry/discussions/76#discussioncomment-13678554" rel="noopener noreferrer"&gt;and have it generate a recap&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Detect key terms and &lt;a href="https://code.visualstudio.com/docs/copilot/chat/mcp-servers" rel="noopener noreferrer"&gt;use MCP Servers&lt;/a&gt; to find resource links.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fggitmtq6vv8xtclfl6e6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fggitmtq6vv8xtclfl6e6.png" alt="MCP Servers"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can simplify this further if you &lt;a href="https://code.visualstudio.com/mcp" rel="noopener noreferrer"&gt;use MCP Servers to extend Agent Mode&lt;/a&gt; as shown - adding new "tools" to help the agent perform key tasks. &lt;/p&gt;

&lt;p&gt;In my case, there were 3 tools that were immediately helpful:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://github.com/microsoftdocs/mcp" rel="noopener noreferrer"&gt;Microsoft Docs MCP Server&lt;/a&gt; - for related resources&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://hf.co/mcp" rel="noopener noreferrer"&gt;Hugging Face MCP Server&lt;/a&gt; - for Model Hub links&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://ai.azure.com/labs/projects/mcp-server" rel="noopener noreferrer"&gt;Azure AI Foundry MCP Server&lt;/a&gt; - for Azure AI Foundry Models catalog&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Want to see these in action? Check out the &lt;a href="https://github.com/orgs/azure-ai-foundry/discussions/76#discussioncomment-13620279" rel="noopener noreferrer"&gt;"Related Resources"&lt;/a&gt; in this post, populated by using the three MCP servers above.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keep reading this series for more updates and learnings from our AI experiments!&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Read The Recap
&lt;/h2&gt;

&lt;p&gt;Want an easy way to catch up on all the news? Check out complete blog series written by our resident student blogger &lt;a href="https://aka.ms/model-mondays/blog" rel="noopener noreferrer"&gt;here on Tech Community&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;You can also catch her recap for this week, right here on dev.to:&lt;/p&gt;


&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/sharda_kaur/i-wrote-about-slms-in-model-mondays-easy-explanation-inside-2le9" class="crayons-story__hidden-navigation-link"&gt;I Wrote About SLMs in Model Mondays: Easy Explanation Inside!&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/sharda_kaur" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1940688%2F8406e1c5-5e99-4711-9ca5-f3bae3dde4fa.jpg" alt="sharda_kaur profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/sharda_kaur" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Sharda Kaur
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Sharda Kaur
                
              
              &lt;div id="story-author-preview-content-2658461" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/sharda_kaur" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1940688%2F8406e1c5-5e99-4711-9ca5-f3bae3dde4fa.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Sharda Kaur&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/sharda_kaur/i-wrote-about-slms-in-model-mondays-easy-explanation-inside-2le9" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jul 5 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/sharda_kaur/i-wrote-about-slms-in-model-mondays-easy-explanation-inside-2le9" id="article-link-2658461"&gt;
          I Wrote About SLMs in Model Mondays: Easy Explanation Inside!
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/microsoft"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;microsoft&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/beginners"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;beginners&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/sharda_kaur/i-wrote-about-slms-in-model-mondays-easy-explanation-inside-2le9#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            1 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;





&lt;h2&gt;
  
  
  Build Your Model IQ!
&lt;/h2&gt;

&lt;p&gt;Model Mondays Season 2 is currently scheduled to go from June to September, covering the 12 key topics shown below.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;👉🏽👉🏽 &lt;a href="https://aka.ms/model-mondays/rsvp" rel="noopener noreferrer"&gt;Register for Upcoming Livestreams&lt;/a&gt; to get reminders&lt;/li&gt;
&lt;li&gt;👉🏽👉🏽 &lt;a href="https://github.com/orgs/azure-ai-foundry/discussions/54" rel="noopener noreferrer"&gt;Register for Upcoming AMAs&lt;/a&gt; to get reminders&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fetcnia5e90rhttuw3n13.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fetcnia5e90rhttuw3n13.png" alt="Season 2"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>azureaifoundry</category>
      <category>ama</category>
      <category>modelmondays</category>
    </item>
    <item>
      <title>Model Mondays S2E02 - AMA on Model Context Protocol</title>
      <dc:creator>Nitya Narasimhan, Ph.D</dc:creator>
      <pubDate>Tue, 24 Jun 2025 17:50:47 +0000</pubDate>
      <link>https://dev.to/azure/model-mondays-s2e02-ama-on-model-context-protocol-e9i</link>
      <guid>https://dev.to/azure/model-mondays-s2e02-ama-on-model-context-protocol-e9i</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fifnd5j9v3lbqzkctlvx1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fifnd5j9v3lbqzkctlvx1.png" alt="Model Mondays Banner"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Model Mondays is a weekly series that helps you come up to speed with the fast-moving world of AI models. Here are 3 actions you can take to build your model IQ:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Watch&lt;/strong&gt; &lt;a href="https://aka.ms/model-mondays/live" rel="noopener noreferrer"&gt;Model Mondays Live&lt;/a&gt; - for news roundup &amp;amp; tech spotlights in 30 mins&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Join&lt;/strong&gt; &lt;a href="https://aka.ms/model-mondays/forum" rel="noopener noreferrer"&gt;Foundry Friday AMA&lt;/a&gt; - for discussions with Q&amp;amp;A featuring AI experts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Subscribe&lt;/strong&gt; &lt;a href="https://aka.ms/model-mondays/newsletter" rel="noopener noreferrer"&gt;Model Mondays Newsletter&lt;/a&gt; - a weekly pulse on AI innovation &amp;amp; tech&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Spotlight On: Model Context Protocol
&lt;/h2&gt;

&lt;p&gt;We put the spotlight on &lt;strong&gt;Model Context Protocol&lt;/strong&gt; (MCP) with a deep-dive from Den Delimarsky, a member of the MCP Steering Committee.&lt;/p&gt;

&lt;p&gt;👉🏽👉🏽   &lt;a href="https://discord.gg/azureaifoundry?event=1382860621137317948" rel="noopener noreferrer"&gt;Register for the AMA&lt;/a&gt; on our Azure AI Foundry Discord&lt;br&gt;
👉🏽👉🏽   &lt;a href="https://github.com/orgs/azure-ai-foundry/discussions/64" rel="noopener noreferrer"&gt;Post Your Questions&lt;/a&gt; on our Discussion Forum&lt;/p&gt;

&lt;p&gt;Then check out the slides from the presentation, for resource links!&lt;/p&gt;

&lt;p&gt;&lt;iframe class="speakerdeck-iframe ltag_speakerdeck" src="https://speakerdeck.com/player/deb9d604f14a48169438d85f5451186a"&gt;
&lt;/iframe&gt;
&lt;/p&gt;




&lt;h2&gt;
  
  
  About Model Context Protocol (MCP)
&lt;/h2&gt;

&lt;p&gt;MCP is a protocol that standardizes how AI applications connect the underlying AI models to required knowledge sources (data) and interaction APIs (functions) for more effective task execution. Because these models are pre-trained, they lack access to real-time or proprietary data sources (for knowledge) and real-world environments (for interaction). MCP allows them to "discover and use" relevant knowledge and action tools to &lt;em&gt;add relevant context&lt;/em&gt; to the model for task execution.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Explore: &lt;a href="https://modelcontextprotocol.io" rel="noopener noreferrer"&gt;The MCP Specification&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;Learn: &lt;a href="https://aka.ms/mcp-for-beginners" rel="noopener noreferrer"&gt;MCP For Beginners&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Watch: Anthropic Workshop on MCP (below), AI Engineer Summit NY 2025&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/kQmXtrmQ5Zg"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;




&lt;h2&gt;
  
  
  Securing MCP
&lt;/h2&gt;

&lt;p&gt;As MCP started gaining traction, the conversation turned to the topic of secure MCP usage, particularly in enterprise environments. How should MCP clients &lt;em&gt;authenticate&lt;/em&gt; with MCP servers, and get &lt;em&gt;authorization&lt;/em&gt; for access to the right resources? In early 2025, the conversation began on an MCP Authorization spec - here are the three documents that help you understand the issues &amp;amp; proposal process.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Aaron Parecki, &lt;a href="https://aaronparecki.com/2025/04/03/15/oauth-for-model-context-protocol" rel="noopener noreferrer"&gt;Let's Fix OAuth in MCP&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Den Delimarsky, &lt;a href="https://den.dev/blog/model-context-protocol-oauth-rfc/" rel="noopener noreferrer"&gt;Improving The MCP Authorization Spec - One RFC At A Time&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;MCP Specification, &lt;a href="https://modelcontextprotocol.io/specification/draft/basic/authorization" rel="noopener noreferrer"&gt;Authorization&lt;/a&gt; protocol draft&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;On Monday, Den joined us live to talk about the work he did for the authorization protocol. &lt;strong&gt;Watch the session now&lt;/strong&gt; to get a sense for what the MCP Authorization protocol does, how it works, and why it matters. Have questions? &lt;a href="https://github.com/orgs/azure-ai-foundry/discussions/64" rel="noopener noreferrer"&gt;Submit them to the forum&lt;/a&gt; or &lt;a href="https://discord.gg/azureaifoundry?event=1382860621137317948" rel="noopener noreferrer"&gt;Jon the Foundry Friday AMA&lt;/a&gt; on Jun 27 at 1:30pm ET.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/cPS3cWRZTps"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;




&lt;h2&gt;
  
  
  Learning MCP
&lt;/h2&gt;

&lt;p&gt;Want to get hands-on experience with MCP from fundamentals to best practices? Explore the "MCP For Beginners" curriculum - a 10-lesson open-source curriculum that is constantly being updated to reflect the latest progress and examples of MCP in action. Go from fundamental concepts to best practices, with hands-on exercises.&lt;/p&gt;

&lt;p&gt;👉🏽👉🏽   &lt;a href="https://aka.ms/mcp-for-beginners" rel="noopener noreferrer"&gt;Explore the Curriculum&lt;/a&gt; on GitHub&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Finzzk62y8lju66hrlpbq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Finzzk62y8lju66hrlpbq.png" alt="MCP For Beginners"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Read The Recap
&lt;/h2&gt;

&lt;p&gt;Want an easy way to catch up on all the news? Check out complete blog series written by our resident student blogger &lt;a href="https://aka.ms/model-mondays/blog" rel="noopener noreferrer"&gt;here on Tech Community&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;You can also catch her recap for this week, right here on dev.to:&lt;/p&gt;


&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/sharda_kaur/model-mondays-s2e2-understanding-model-context-protocol-mcp-a-beginner-friendly-guide-3fd3" class="crayons-story__hidden-navigation-link"&gt;🚀 Model Mondays S2E2: Understanding Model Context Protocol (MCP) – A Beginner-Friendly Guide&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/sharda_kaur" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1940688%2F8406e1c5-5e99-4711-9ca5-f3bae3dde4fa.jpg" alt="sharda_kaur profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/sharda_kaur" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Sharda Kaur
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Sharda Kaur
                
              
              &lt;div id="story-author-preview-content-2636115" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/sharda_kaur" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1940688%2F8406e1c5-5e99-4711-9ca5-f3bae3dde4fa.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Sharda Kaur&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/sharda_kaur/model-mondays-s2e2-understanding-model-context-protocol-mcp-a-beginner-friendly-guide-3fd3" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jun 29 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/sharda_kaur/model-mondays-s2e2-understanding-model-context-protocol-mcp-a-beginner-friendly-guide-3fd3" id="article-link-2636115"&gt;
          🚀 Model Mondays S2E2: Understanding Model Context Protocol (MCP) – A Beginner-Friendly Guide
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/opensource"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;opensource&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/mcp"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;mcp&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/microsoft"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;microsoft&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/beginners"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;beginners&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/sharda_kaur/model-mondays-s2e2-understanding-model-context-protocol-mcp-a-beginner-friendly-guide-3fd3#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            1 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;





&lt;h2&gt;
  
  
  Continue Building Model IQ
&lt;/h2&gt;

&lt;p&gt;Check out the upcoming episodes and register for livestreams &amp;amp; AMA:&lt;/p&gt;

&lt;p&gt;👉🏽👉🏽   &lt;a href="https://aka.ms/model-mondays/rsvp" rel="noopener noreferrer"&gt;Register for Livestreams&lt;/a&gt; to get reminders&lt;br&gt;
👉🏽👉🏽   &lt;a href="https://github.com/orgs/azure-ai-foundry/discussions/54" rel="noopener noreferrer"&gt;Register for AMAs&lt;/a&gt; to get reminders&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F797dc7f85wv8n9ute2bb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F797dc7f85wv8n9ute2bb.png" alt="Season 2"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>azureaifoundry</category>
      <category>ama</category>
      <category>modelmondays</category>
    </item>
  </channel>
</rss>
