Sr. Content Developer at Microsoft, working remotely in PA, TechBash conference organizer, former Microsoft MVP, Husband, Dad and Geek.
151338 stories
·
33 followers

Build and Host MCP Apps on Azure App Service

1 Share

MCP Apps are here, and they're a game-changer for building AI tools with interactive UIs. If you've been following the Model Context Protocol (MCP) ecosystem, you've probably heard about the MCP Apps spec — the first official MCP extension that lets your tools return rich, interactive UIs that render directly inside AI chat clients like Claude Desktop, ChatGPT, VS Code Copilot, Goose, and Postman.

And here's the best part: you can host them on Azure App Service. In this post, I'll walk you through building a weather widget MCP App and deploying it to App Service. You'll have a production-ready MCP server serving interactive UIs in under 10 minutes.

What Are MCP Apps?

MCP Apps extend the Model Context Protocol by combining tools (the functions your AI client can call) with UI resources (the interactive interfaces that display the results). The pattern is simple:

  1. A tool declares a _meta.ui.resourceUri in its metadata
  2. When the tool is invoked, the MCP host fetches that UI resource
  3. The UI renders in a sandboxed iframe inside the chat client

The key insight? MCP Apps are just web apps — HTML, JavaScript, and CSS served through MCP. And that's exactly what App Service does best.

The MCP Apps spec supports cross-client rendering, so the same UI works in Claude Desktop, VS Code Copilot, ChatGPT, and other MCP-enabled clients. Your weather widget, map viewer, or data dashboard becomes a universal component in the AI ecosystem.

Why App Service for MCP Apps?

Azure App Service is a natural fit for hosting MCP Apps. Here's why:

  • Always On — No cold starts. Your UI resources are served instantly, every time.
  • Easy Auth — Secure your MCP endpoint with Entra ID authentication out of the box, no code required.
  • Custom domains + TLS — Professional MCP server endpoints with your own domain and managed certificates.
  • Deployment slots — Canary and staged rollouts for MCP App updates without downtime.
  • Sidecars — Run backend services (Redis, message queues, monitoring agents) alongside your MCP server.
  • App Insights — Built-in telemetry to see which tools and UIs are being invoked, response times, and error rates.

Now, these are all capabilities you can add to a production MCP App, but the sample we're building today keeps things simple. We're focusing on the core pattern: serving MCP tools with interactive UIs from App Service. The production features are there when you need them.

When to Use Functions vs App Service for MCP Apps

Before we dive into the code, let's talk about Azure Functions. The Functions team has done great work with their MCP Apps quickstart, and if serverless is your preferred model, that's a fantastic option. Functions and App Service both host MCP Apps beautifully — they just serve different needs.

 Azure FunctionsAzure App Service
Best forNew, purpose-built MCP Apps that benefit from serverless scalingMCP Apps that need always-on hosting, persistent state, or are part of larger web apps
ScalingScale to zero, pay per invocationDedicated plans, always running
Cold startPossible (mitigated by premium plan)None (Always On)
Deploymentazd up with Functions templateazd up with App Service template
MCP Apps quickstartAvailableThis blog post!
Additional capabilitiesEvent-driven triggers, durable functionsEasy Auth, custom domains, deployment slots, sidecars

Think of it this way: if you're building a new MCP App from scratch and want serverless economics, go with Functions. If you're adding MCP capabilities to an existing web app, need zero cold starts, or want production features like Easy Auth and deployment slots, App Service is your friend.

Build the Weather Widget MCP App

Let's build a simple MCP App that fetches weather data from the Open-Meteo API and displays it in an interactive widget. The sample uses ASP.NET Core for the MCP server and Vite for the frontend UI.

Here's the structure:

app-service-mcp-app-sample/
├── src/
│   ├── Program.cs              # MCP server setup
│   ├── WeatherTool.cs          # Weather tool with UI metadata
│   ├── WeatherUIResource.cs    # MCP resource serving the UI
│   ├── WeatherService.cs       # Open-Meteo API integration
│   └── app/                    # Vite frontend (weather widget)
│       └── src/
│           └── weather-app.ts  # MCP Apps SDK integration
├── .vscode/
│   └── mcp.json                # VS Code MCP server config
├── azure.yaml                  # Azure Developer CLI config
└── infra/                      # Bicep infrastructure

Program.cs — MCP Server Setup

The MCP server is an ASP.NET Core app that registers tools and UI resources:

using ModelContextProtocol;

var builder = WebApplication.CreateBuilder(args);

// Register WeatherService
builder.Services.AddSingleton<WeatherService>(sp =>
    new WeatherService(WeatherService.CreateDefaultClient()));

// Add MCP Server with HTTP transport, tools, and resources
builder.Services.AddMcpServer()
    .WithHttpTransport(t => t.Stateless = true)
    .WithTools<WeatherTool>()
    .WithResources<WeatherUIResource>();

var app = builder.Build();

// Map MCP endpoints (no auth required for this sample)
app.MapMcp("/mcp").AllowAnonymous();

app.Run();

AddMcpServer() configures the MCP protocol handler. WithHttpTransport() enables Streamable HTTP with stateless mode (no session management needed). WithTools<WeatherTool>() registers our weather tool, and WithResources<WeatherUIResource>() registers the UI resource that the MCP host will fetch and render. MapMcp("/mcp") maps the MCP endpoint at /mcp.

WeatherTool.cs — Tool with UI Metadata

The WeatherTool class defines the tool and uses the [McpMeta] attribute to declare a ui metadata block containing the resourceUri. This tells the MCP host where to fetch the interactive UI:

using System.ComponentModel;
using ModelContextProtocol.Server;

[McpServerToolType]
public class WeatherTool
{
    private readonly WeatherService _weatherService;

    public WeatherTool(WeatherService weatherService)
    {
        _weatherService = weatherService;
    }

    [McpServerTool]
    [Description("Get current weather for a location via Open-Meteo. Returns weather data that displays in an interactive widget.")]
    [McpMeta("ui", JsonValue = """{"resourceUri": "ui://weather/index.html"}""")]
    public async Task<object> GetWeather(
        [Description("City name to check weather for (e.g., Seattle, New York, Miami)")]
        string location)
    {
        var result = await _weatherService.GetCurrentWeatherAsync(location);
        return result;
    }
}

The key line is the [McpMeta("ui", ...)] attribute. This adds _meta.ui.resourceUri to the tool definition, pointing to the ui://weather/index.html resource. When the AI client calls this tool, the host fetches that resource and renders it in a sandboxed iframe alongside the tool result.

WeatherUIResource.cs — UI Resource

The UI resource class serves the bundled HTML as an MCP resource with the ui:// scheme and text/html;profile=mcp-app MIME type required by the MCP Apps spec:

using ModelContextProtocol.Protocol;
using ModelContextProtocol.Server;

[McpServerResourceType]
public class WeatherUIResource
{
    [McpServerResource(
        UriTemplate = "ui://weather/index.html",
        Name = "weather_ui",
        MimeType = "text/html;profile=mcp-app")]
    public static ResourceContents GetWeatherUI()
    {
        var filePath = Path.Combine(
            AppContext.BaseDirectory, "app", "dist", "index.html");
        var html = File.ReadAllText(filePath);

        return new TextResourceContents
        {
            Uri = "ui://weather/index.html",
            MimeType = "text/html;profile=mcp-app",
            Text = html
        };
    }
}

The [McpServerResource] attribute registers this method as the handler for the ui://weather/index.html resource. When the host fetches it, the bundled single-file HTML (built by Vite) is returned with the correct MIME type.

WeatherService.cs — Open-Meteo API Integration

The WeatherService class handles geocoding and weather data from the Open-Meteo API. Nothing MCP-specific here — it's just a standard HTTP client that geocodes a city name and fetches current weather observations.

The UI Resource (Vite Frontend)

The app/ directory contains a TypeScript app built with Vite that renders the weather widget. It uses the @modelcontextprotocol/ext-apps SDK to communicate with the host:

import { App } from "@modelcontextprotocol/ext-apps";

const app = new App({ name: "Weather Widget", version: "1.0.0" });

// Handle tool results from the server
app.ontoolresult = (params) => {
  const data = parseToolResultContent(params.content);
  if (data) render(data);
};

// Adapt to host theme (light/dark)
app.onhostcontextchanged = (ctx) => {
  if (ctx.theme) applyTheme(ctx.theme);
};

await app.connect();

The SDK's App class handles the postMessage communication with the host. When the tool returns weather data, ontoolresult fires and the widget renders the temperature, conditions, humidity, and wind. The app also adapts to the host's theme so it looks native in both light and dark mode.

The frontend is bundled into a single index.html file using Vite and the vite-plugin-singlefile plugin, which inlines all JavaScript and CSS. This makes it easy to serve as a single MCP resource.

Run Locally

To run the sample locally, you'll need the .NET 9 SDK and Node.js 18+ installed. Clone the repo and run:

# Clone the repo
git clone https://github.com/seligj95/app-service-mcp-app-sample.git
cd app-service-mcp-app-sample

# Build the frontend
cd src/app
npm install
npm run build

# Run the MCP server
cd ..
dotnet run

The server starts on http://localhost:5000. Now connect from VS Code Copilot:

  1. Open your workspace in VS Code
  2. The sample includes a .vscode/mcp.json that configures the local MCP server:
    {
      "servers": {
        "local-mcp-appservice": {
          "type": "http",
          "url": "http://localhost:5000/mcp"
        }
      }
    }
  3. Open the GitHub Copilot Chat panel
  4. Ask: "What's the weather in Seattle?"

Copilot will invoke the GetWeather tool, and the interactive weather widget will render inline in the chat:

Weather widget MCP App rendering inline in VS Code Copilot Chat

Deploy to Azure

Deploying to Azure is even easier. The sample includes an azure.yaml file and Bicep templates for App Service, so you can deploy with a single command:

cd app-service-mcp-app-sample
azd auth login
azd up

azd up will:

  1. Provision an App Service plan and web app in your subscription
  2. Build the .NET app and Vite frontend
  3. Deploy the app to App Service
  4. Output the public MCP endpoint URL

After deployment, azd will output a URL like https://app-abc123.azurewebsites.net. Update your .vscode/mcp.json to point to the remote server:

{
  "servers": {
    "remote-weather-app": {
      "type": "http",
      "url": "https://app-abc123.azurewebsites.net/mcp"
    }
  }
}

From that point forward, your MCP App is live. Any AI client that supports MCP Apps can invoke your weather tool and render the interactive widget — no local server required.

What's Next?

You've now built and deployed an MCP App to Azure App Service. Here's what you can explore next:

And remember: App Service gives you a full production hosting platform for your MCP Apps. You can add Easy Auth to secure your endpoints with Entra ID, wire up App Insights for telemetry, configure custom domains and TLS certificates, and set up deployment slots for blue/green rollouts. These features make App Service a great choice when you're ready to take your MCP App to production.

If you build something cool with MCP Apps and App Service, let me know — I'd love to see what you create!

Read the whole story
alvinashcraft
just a second ago
reply
Pennsylvania, USA
Share this story
Delete

Hello, World - Welcome to the Copilot Studio Blog!

1 Share

We’re so excited you’re here.

Today marks the launch of the Copilot Studio Tech Community Blog, a space for the builders and admins shaping the agent era in the real world.

Agents are moving from demos to production, so we’ll focus on practical patterns for building, shipping, and governing at scale, beyond what docs and product announcements cover. Makers will find templates and build tactics; IT and security will get governance guidance; developers will get deeper dives on extensibility and production operations.

Hit Follow at the top of the page and introduce yourself in the https://aka.ms/MCSdiscussions with what you’re building

What Is Microsoft Copilot Studio?

Microsoft Copilot Studio is Microsoft’s platform for building and governing AI agents across the enterprise, from prototyping to production. For the full product overview and getting-started guidance, visit the Copilot Studio website.

What’s New in Copilot Studio

We’re not starting this blog quietly. Here’s a look at three of the biggest updates that have shipped recently.

1. Agent Evaluation — Now Generally Available

Testing agents manually, one conversation at a time, doesn’t scale. Agent Evaluation gives makers a built-in, no-code way to test and monitor agent quality, safety, and reliability at scale. Create evaluation sets using AI-generated queries, past test sessions, or your own QA pairs — then run them automatically to catch regressions before they reach users.

2. Computer-using agents — more secure UI automation at scale

Computer-using agents (CUA) can now automate tasks through user interfaces—clicking, typing, and navigating apps when an API isn’t available—while delivering a more secure approach for UI automation at scale (with stronger controls for admin governance and credential handling).

3. Multi-agent orchestration, connected experiences, and faster prompt iteration

One of the biggest recent updates is improved multi-agent orchestration, alongside new connected experiences and faster prompt iteration—so you can coordinate specialized agents more effectively and refine behavior faster as you move from prototype to production.

Resources to Bookmark

Resource

What It's For

Copilot Studio Documentation

Official product docs, tutorials, and references

2026 Release Wave 1 Plan

What's shipping April–September 2026

Copilot Studio Discussion Space

Ask questions, share ideas, connect with peers

Next steps

1. Hit Follow at the top of the page and introduce yourself in the https://aka.ms/MCSdiscussions  with what you’re building

2. New to Copilot Studio? Sign up for the free trial and bookmark the resources below for docs, release plans, training, and governance guidance.

We can’t wait to see what you create.

Read the whole story
alvinashcraft
14 seconds ago
reply
Pennsylvania, USA
Share this story
Delete

Microsoft ODBC Driver 18.6.2 for SQL

1 Share

What Is the Microsoft ODBC Driver for SQL?

The Microsoft ODBC Driver for SQL provides native connectivity from Windows, Linux, and macOS applications to SQL Server, Azure SQL Database, Azure SQL Managed Instance, and Microsoft Fabric. It is the recommended driver for new application development using the ODBC API, and it supports , Always Encrypted, distributed transactions, and modern authentication methods including Microsoft Entra ID (formerly Azure Active Directory).

Whether you're building high-throughput data pipelines, managing enterprise databases, or developing cloud-native applications on Microsoft Fabric, the ODBC driver is a foundational component of the SQL Server connectivity stack.

What's New in 18.6.2

Improved Vector Parameter Handling for Prepared Statements

Version 18.6.2 improves the handling of output and input/output vector parameters when using prepared statements. This enhancement benefits applications that rely on parameterized queries with array bindings — a common pattern in batch processing and high-performance data access layers.

Microsoft Fabric Redirection Support (Up to 10 Redirections)

The driver now allows up to 10 server redirections per connection attempt, up from previous limits. This change directly supports Microsoft Fabric redirection scenarios, where connections may be transparently routed through multiple endpoints before reaching the target workspace. If your applications connect to Fabric SQL endpoints, this update ensures more reliable connectivity in complex routing topologies.

Alpine Linux Packaging Improvements

Architecture detection and packaging have been improved for Alpine Linux environments, making it easier to deploy the driver in lightweight, container-based workloads that use Alpine as a base image.

Bug Fixes

This release addresses several important issues reported by the community and identified through internal testing:

Parameter Array Processing

  • SQL_ATTR_PARAMS_PROCESSED_PTR accuracy — Fixed an issue where the number of processed parameter sets was not reported correctly when executing parameter arrays. Applications that inspect SQL_ATTR_PARAMS_PROCESSED_PTR after batch execution will now see the correct count.
  • SQL_PARAM_IGNORE handling — Fixed SQL_ATTR_PARAMS_PROCESSED_PTR and row counting when SQL_PARAM_IGNORE is used within parameter arrays, ensuring that ignored parameters are accounted for properly.

Crash Fixes

  • SQLNumResultCols segmentation fault — Resolved a segfault that occurred when calling SQLNumResultCols in describe-only scenarios where no parameter bindings are present.
  • Table-valued parameter (TVP) NULL handling — Fixed a segmentation fault triggered by NULL values in TVP arguments. Applications passing TVPs with nullable columns should no longer experience unexpected crashes.

bcp_bind Consecutive Field Terminators (Known Issue from 18.6.1)

  • bcp_bind fix — Corrected bcp_bind to properly handle consecutive field terminators without misinterpreting them as empty fields. This resolves a known issue introduced in version 18.6.1, where consecutive terminators were incorrectly interpreted as NULL values instead of empty strings. If you deferred upgrading to 18.6.1 because of this issue, 18.6.2 is the recommended target version.

Linux Packaging

  • Debian EULA acceptance — Fixed Debian package installation to correctly honor EULA acceptance and complete successfully, eliminating a friction point for automated deployments.
  • RPM side-by-side installation — Fixed RPM packaging rules to allow installing multiple driver versions side by side, which is important for environments that need to maintain backward compatibility or perform staged rollouts.

Distributed Transactions

  • XA recovery — Fixed XA recovery to compute transaction IDs correctly, avoiding scenarios where recoverable transactions could be missed during the recovery process. This is a critical fix for applications using distributed transactions with XA transaction managers.

Upgrading from Older Versions

If you are upgrading from a version prior to 18.6.1, you will also benefit from the features introduced in that release:

  • Vector data type support — Native support for the vector data type (float32), enabling AI and machine learning scenarios directly through ODBC.
  • ConcatNullYieldsNull property — Connection-level control over null concatenation behavior.
  • New platform support — Azure Linux 3.0 ARM, Debian 13, Red Hat 10, and Ubuntu 25.10.

Version 18.6.2 builds on these additions with the stability and correctness fixes described above.

Download & Installation

Windows

PlatformDownload Link
x64Download
x86Download
ARM64Download

Linux & macOS

Installation packages for supported Linux distributions and macOS are available on Microsoft Learn:

Documentation & Release Notes

For the full list of changes, platform support details, and known issues, see the official release notes:

Get Started

We encourage all users to upgrade to version 18.6.2.1 to take advantage of the fixes and improvements in this release — particularly if you are using parameter arrays, table-valued parameters, bcp operations, or connecting to Microsoft Fabric endpoints.

As always, we welcome your feedback. If you encounter issues, please report them through the SQL Server feedback channel or open an issue on the Microsoft ODBC Driver GitHub repository.

Happy coding!

Read the whole story
alvinashcraft
21 seconds ago
reply
Pennsylvania, USA
Share this story
Delete

Expanding Swift's IDE Support

1 Share

You can now write Swift in a broader range of popular IDEs, including Cursor, VSCodium, AWS’s Kiro, and Google’s Antigravity. By leveraging VS Code extension compatibility, these editors tap directly into the Open VSX Registry, where the official Swift extension is now live.

Swift has long supported development using multiple IDEs including VS Code, Xcode, Neovim, and Emacs. Swift is also compatible with editors that implement the Language Server Protocol (LSP). This growing ecosystem of editor support is particularly significant as Swift continues to show its versatility across platforms and development environments, including agentic IDEs.

Swift on Open VSX

The Swift extension for VS Code is now officially available on the Open VSX Registry, the vendor-neutral, open source extension registry hosted by the Eclipse Foundation. The extension adds first-class language support for projects built with Swift Package Manager, enabling seamless cross-platform development on macOS, Linux, and Windows. This milestone brings Swift support, including code completion, refactoring, full debugging support, a test explorer, as well as DocC support, to a broader ecosystem of compatible editors and allows agentic IDEs like Cursor and Antigravity to automatically install Swift, with no manual download required.


Swift in Cursor, powered by the Swift extension on Open VSX.

Swift in Cursor, powered by the Swift extension on Open VSX.


Get Started

To start using the Swift extension in any Open VSX-compatible editor, simply open the Extensions panel, search for ‘Swift’ and install the extension.

If you’re using Cursor, getting started is easier than ever. Check out our new dedicated guide: Setting up Cursor for Swift Development. It walks you through the setup, features and includes how to configure custom Swift skills for your AI workflows.

Swift now has support for a wider range of modern editors and IDEs to meet developers where they are. Download the extension, try it out in your editor of choice, and don’t forget to share your feedback!

Read the whole story
alvinashcraft
33 seconds ago
reply
Pennsylvania, USA
Share this story
Delete

Swift 6.3 officially brings Android support

1 Share

Swift 6.3 officially brings Android support

Swift 6.3 has been released, and it includes the first official Swift SDK for Android. This release moves Swift on Android from nightly preview builds into the official Swift release line.

With Swift 6.3, developers can target Android with Swift, update Swift packages to build for Android, and integrate Swift code into existing Android apps written in Kotlin or Java by using Swift Java and Swift Java JNI Core. Swift.org describes this as a significant milestone for cross platform development in the language.

This release follows the Android SDK preview announced in October 2025. At that stage, Swift introduced nightly preview releases of the Swift SDK for Android and positioned the Android Workgroup as the group driving the platform forward.

Swift has also published official setup documentation for the Android SDK. The documented setup requires three components: the Swift toolchain, the Swift SDK for Android, and the Android NDK. The same guide explains that Android builds are cross compiled from a desktop host such as macOS or Linux to an Android target.

Here is the guide:
https://www.swift.org/documentation/articles/swift-sdk-for-android-getting-started.html

Swift’s platform support page currently lists Android as a deployment only platform, with a minimum deployment target of Android 9, API 28. That means Swift can officially target Android, but Android is not listed as a platform that runs the Swift development tools themselves.

From a runtime perspective, Swift compiles directly to native machine code on Android and bundles the native runtime needed for the standard library and core libraries such as Dispatch and Foundation. Swift also relies on Java interoperability tooling to work with Android APIs exposed through Java and Kotlin.

Read the whole story
alvinashcraft
39 seconds ago
reply
Pennsylvania, USA
Share this story
Delete

Available for Xbox Insiders: New Improvements to Achievements

1 Share

Available for Xbox Insiders: New Improvements to Achievements

Starting today, select Xbox Insiders can begin testing improvements to Achievements that make it easier to celebrate your accomplishments and curate how they appear on your profile. These features will roll out to more Insiders over time, with broader availability coming later to all players. We’re excited to hear what you think, and we’ll keep bringing you more of the features you’ve been asking for.

Achievements Get a Visual Refresh

We’ve refreshed achievement notifications with a new look and feel, including updated icons and animations when you unlock classic or rare achievements. Notifications will also match your custom color, making each unlock feel more personal. Happy achievement hunting!

Hide Games from Your Achievement List

Coming later this month, you will be able hide any game from your Achievement history on your profile, giving you more control over how your accomplishments are presented. Whether you want a cleaner look or just want to highlight what matters most to you, this puts your profile in your hands. This only affects how your profile appears, hidden games will still count towards your total Gamerscore and your activity in these games will still be reported across Xbox.

This has been one of the most requested features from Xbox Insiders and we’re excited to finally get it into your hands very soon.

Highlight Your 100% Completed Games

When you’ve earned all available Gamerscore for a title, you’ll now see it highlighted in your achievements list, so your hard work is easy to spot. This gives you a quick, at-a-glance way to celebrate full completion.

We’ve also added new filter options to this view, making it easier to find your fully completed games alongside any titles you’ve chosen to hide.

This is a small but meaningful step in a broader set of improvements we’re making to Achievements. We’re continuing to explore new ways to recognize completion and milestone moments over time, and this update is one of our first steps towards celebrating those moments.

How to Get Xbox Insider Support and Share Your Feedback

We want to thank all the Xbox Insiders for the feedback you share with us. If you’re an Xbox Insider looking for support, please join our community on the Xbox Insider subreddit, where official Xbox staff, moderators, and fellow Xbox Insiders are there to help. We recommend adding to threads with the same topic before posting a brand new one. This helps us support you the best we can! 

If you aren’t part of the Xbox Insider Program yet and want to help create the future of Xbox and get early access to new features, join the Program today by downloading the Xbox Insider Hub for Xbox Series X|S & Xbox One or Windows PC. For more information on the Xbox Insider Program, follow us on Twitter at @XboxInsider and keep an eye on this blog for all the latest news. 

Thank you for being part of Xbox Insiders. We can’t wait to hear what you think. 

Other resources:

For more information: follow us on X/Twitter at @XboxInsider and this blog for announcements and more. And feel free to interact with the community on the Xbox Insider SubReddit.

The post Available for Xbox Insiders: New Improvements to Achievements appeared first on Xbox Wire.

Read the whole story
alvinashcraft
49 seconds ago
reply
Pennsylvania, USA
Share this story
Delete
Next Page of Stories