MCP in Copilot Studio?!?

Microsoft has just unveiled the Model Context Protocol (MCP) in Copilot Studio – and let me tell you this is amazing.

What’s New: Model Context Protocol Integration

So, what’s the big deal with MCP? Imagine being able to hook up your AI models directly to existing knowledge servers and APIs without breaking a sweat. MCP allows makers to connect to these resources seamlessly within Copilot Studio. Once connected, actions and knowledge are automatically added to your agent and kept up-to-date as functionalities evolve, reducing the time you spend on maintenance. ​Want your AI model to query a SQL server? Done. Want your AI model to consume some random Kafka topic? No sweat! Need AI to open a Github PR? Easy.

MCP servers utilize connector infrastructure, meaning they come equipped with enterprise security and governance controls like Virtual Network integration and Data Loss Prevention.Multiple authentication methods are also supported, ensuring that you aren’t a bonehead that uses anonymous access.

Getting Started with MCP

Ready to dive in? Here’s a quick guide to integrating MCP into your Copilot Studio experience:

  1. Create the Server: Use one of the available SDKs to set up your MCP server. This will act as the foundation for handling your data, models, and interactions.
  2. Publish Through a Connector: Develop a custom connector that links your Copilot Studio environment to your model or data source.
  3. Consume the Data via Copilot Studio: Once your server and connector are in place, start interacting with your models and data directly through Copilot Studio.

This process not only reduces manual effort but also minimizes the risk of errors from outdated tools. Plus, a single MCP server can manage multiple tools! This is simply amazing!

Log Analytics Simple Mode

Simple Mode – I have mixed feelings. Yes, Simple Mode in Azure Monitor Log Analytics is useful. Yes, it makes querying logs easier. But does it strip away too much of the power that Kusto Query Language (KQL) offers? Let’s break it down.


What is Simple Mode?

Simple Mode is Microsoft’s latest attempt to make Azure Monitor’s Log Analytics more accessible. Instead of writing KQL queries, you can now use a simplified, form-based approach to retrieve logs. This means:

No more KQL wrangling for simple queries
Drop-down selections to filter logs
Pre-built query templates for common scenarios

It’s perfect for beginners and those who just want quick answers without learning the intricacies of KQL. But for those of us who love the flexibility and depth of KQL, it feels a bit… underwhelming.


Where Simple Mode Shines

Okay, I’ll admit—it has its moments:

  1. Fast Troubleshooting – Need to check VM performance? Find failed logins? Simple Mode makes it quick.
  2. Less Query Anxiety – Not everyone wants to remember where TimeGenerated >= ago(7d). Fair enough.
  3. Better Team Accessibility – Non-technical users (like project managers or business analysts) can actually use Log Analytics now.

It’s a great tool for entry-level users, and it can certainly speed up basic troubleshooting.


Where It Falls Short (for Power Users)

If you’re used to writing KQL like a pro, Simple Mode will probably feel like training wheels on a motorcycle.

🔻 Limited Query Complexity – No advanced joins, unions, or calculated fields
🔻 Less Control Over Data Filtering – Drop-downs are great until you need a specific filter that isn’t there
🔻 Can Hide Critical Insights – Sometimes, the best debugging happens in the nitty-gritty details, which Simple Mode glosses over

It’s like being handed a “Dummies Guide to PowerShell” when you’ve been scripting automation for years. You appreciate the effort, but it’s just… not for you.


Can You Still Use KQL?

Thankfully YES. Microsoft isn’t forcing Simple Mode on us. You can toggle back to KQL mode whenever you want.

  1. Start with Simple Mode
  2. Switch to KQL Mode when you need more control
  3. Mix and match based on what you need

It’s a decent compromise, but I wouldn’t be surprised if Microsoft keeps nudging us toward using Simple Mode more in the future.

2024 Year End – Azure Monitor

Let’s take a look back at the year and see what major features the Program Groups delivered!

Cya, old AppInsights!

One of the most notable milestones was the retirement of Classic Application Insights on February 29, 2024. This move encouraged users to transition to workspace-based resources, offering improved integration and advanced features within Azure Monitor.

Farewell MMA/OMS

Although some people will say OMS was never a thing (Bwren – talking about you), August 31, 2024, marked the retirement of the Log Analytics Agent (MMA/OMS). Users were advised to migrate to the Azure Monitor Agent (AMA) to benefit from enhanced performance, security, and support for new data sources.

Classic Storage Metrics

On January 9, 2024, classic metrics in Azure Storage were retired.

Enhanced Logging for AKS

December 2024 brought significant enhancements to Azure Kubernetes Service (AKS) logging. New metadata and log severity levels were introduced in Azure Monitor Logs, providing more granular insights into AKS operations.

October PowerShell Updates

October was a busy month this time! Lots of updates!

Azure PowerShell 12.5.0

October 2024 saw the release of Azure PowerShell 12.5.0, introducing several enhancements and fixes:

  • Az.AnalysisServices 1.1.6: Migrated the AnalysisServices SDK to a generated SDK, streamlining development and maintenance. Additionally, references to ‘Microsoft.Azure.Management.AnalysisServices’ were removed, reducing potential conflicts.
  • Az.Storage 7.2.0: Upgraded ‘Microsoft.Azure.Storage.DataMovement’ to version 2.0.5, improving data transfer capabilities and performance.
  • Az.StorageSync 2.3.0: Addressed issues with ‘Register-AzStorageSyncServer’ when using Azure FileSync Agent v17 and enhanced performance for Managed Identity migration cmdlets.
  • Az.Accounts 3.0.1: Introduced several fixes, including disabling WAM for device code flow or username/password (ROPC) flow to prevent potential token cache issues, resolving ‘KeyNotFoundException’ warnings, and limiting promotional messages to interactive scenarios only.
  • Az.Resources: Added properties ‘Condition’, ‘ConditionVersion’, and ‘Description’ to ‘New-AzRoleAssignment’, providing more granular control over role assignments.

For a comprehensive list of updates, refer to the official release notes.

PowerShell Universal 5.0.x

The team at Ironman Software was on a roll in October 2024, releasing multiple updates to PowerShell Universal – these folks are machines!

  • Version 5.0.10 (October 8, 2024): Introduced various enhancements and bug fixes, improving overall stability and performance.
  • Version 5.0.11 (October 15, 2024): Continued the trend with additional improvements, addressing user-reported issues and refining existing features.
  • Version 5.0.12 (October 18, 2024): Focused on performance optimizations and minor feature enhancements, ensuring a smoother user experience.
  • Version 5.0.13 (October 22, 2024): Addressed specific bugs and introduced minor feature updates, further stabilizing the platform.
  • Version 5.0.14 (October 31, 2024): Wrapped up the month with a release that included various enhancements and bug fixes, setting the stage for future developments.

Azure Monitor Baseline Alerts

Monitoring without a solid strategy is like driving without a dashboard—sooner or later, something’s going to break, and you won’t see it coming. That’s where Azure Monitor Baseline Alerts (AMBA) steps in, acting as your pre-configured, expert-driven monitoring blueprint for Azure resources.

Instead of spending hours manually configuring alerts, AMBA provides ready-to-deploy alert recommendations, automation templates, and best practices to ensure your environment stays resilient and well-monitored from day one.

Expert Recommendations: AMBA offers a curated list of alert recommendations and expert guidance tailored for various Azure resources, ensuring you’re always ahead of potential issues.

Proactive Notifications: With near real-time alerts, AMBA ensures you can swiftly identify and address problems, minimizing downtime and maintaining optimal performance.

Seamless Automation: Deploying alert policies has never been easier. AMBA’s Azure Policy templates allow for consistent and efficient implementation across your environment.

There are three main sections in AMBA – Resources, Patterns/Scenarios, and Visualizations. AMBA will deploy the necessary alerts based on resource level guidance with patterns (for Azure Landing Zones), along with various workbooks, dashboards – Azure or Grafana. And to top it all off – there is an accelerator now available for it! (see the image below)

Private Preview – Dynamic Log Alerts!

Let’s face it—manually setting alert thresholds in Azure Monitor can feel like trying to hit a moving target while blindfolded. Just when you think you’ve nailed the perfect threshold, your application’s behavior decides to take a detour, leaving you drowning in false positives or, worse, missing critical alerts. Azure Monitor’s dynamic thresholds for log search alerts are here to save the day!

Why Dynamic Thresholds Are a Game-Changer

Dynamic thresholds in Azure Monitor analyze historical data to establish expected performance patterns, automatically adjusting alert thresholds as your application’s behavior changes.

  • Automatic Calibration – Say goodbye to manual tuning. Dynamic thresholds adjust themselves based on your system’s historical data
  • Intelligent Learning – By understanding patterns and trends—be it daily spikes or weekly lulls—dynamic thresholds adapt to your application’s changing situations.
  • Scalable Alerts – Dynamic thresholds allow for a single alert rule to handle multiple dimensions, defining specific alert bands for each combination.

It’s still in Private Preview (boo!), but it won’t be long before we get our hands on it in public preview!

So what does it look like? Here is a sample ARM template that sets a dynamic threshold on CPU percentage – notice the new criterionType of DynamicThresholdCriterion.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "scheduledqueryrules_PerfDemoRule_name": {
      "defaultValue": "PerfDemoRule",
      "type": "String"
    },
    "workspaces_PerfDemoWorkspace_externalid": {
      "defaultValue": "/subscriptions/XXXX-XXXX-XXXX-XXXX/resourceGroups/XXXX/providers/Microsoft.OperationalInsights/workspaces/PerfDemoWorkspace",
      "type": "String"
    }
  },
  "resources": [
    {
      "type": "microsoft.insights/scheduledqueryrules",
      "apiVersion": "2024-01-01-preview",
      "name": "[parameters('scheduledqueryrules_PerfDemoRule_name')]",
      "location": "eastus2",
      "properties": {
        "displayName": "[parameters('scheduledqueryrules_PerfDemoRule_name')]",
        "severity": 3,
        "enabled": true,
        "evaluationFrequency": "PT5M",
        "scopes": [
          "[parameters('workspaces_PerfDemoWorkspace_externalid')]"
        ],
        "targetResourceTypes": [
          "Microsoft.Compute/virtualMachines"
        ],
        "criteria": {
          "allOf": [
            {
              "criterionType": "DynamicThresholdCriterion",
              "metricName": "Percentage CPU",
              "timeAggregation": "Average",
              "dimensions": [
                {
                  "name": "Computer",
                  "operator": "Include",
                  "values": [ "*" ]
                }
              ],
              "alertSensitivity": "Medium"
            }
          ]
        }
      }
    }
  ]
}

Why Not? Logic Apps + Home Assistant to Automate Your Cats Treat Dispenser

Alright, buckle up, folks – we’re diving into the absurd side of automation. Sure, Home Assistant can make your home smarter, but what if it could make your cat happier and financially savvy? Let’s build a system that dispenses treats based on stock market performance. Because why not tie your feline friend’s snack schedule to the whims of Wall Street?

This is overkill. It’s ridiculous. It’s everything you didn’t know you needed.

The Plan: Cats, Treats, and Capitalism

Here’s what we’re doing:

  1. Stock Price Check – Use Azure Logic Apps to pull daily stock prices for your favorite company (or your cat’s favorite, obviously). I prefer something like Alpha Vantage – it’s got a free tier and it’s easy to setup. https://www.alphavantage.co/
  2. Treat Dispensing Logic – Determine whether the stock is up or down and decide if treats should rain upon your furry roomate.
  3. Home Assistant Integration – Trigger a smart treat dispenser via a webhook.

Let’s get started!

If you don’t have a smart treat dispenser, DIY it. A smart plug attached to a motorized dispenser (or a cheap automatic feeder) works perfectly. I prefer these TPLink Matter Plugs. Connect it to Home Assistant and set up an automation:

alias: "Dispense Treats"
trigger:
  - platform: webhook
    webhook_id: "dispense_treats"
action:
  - service: switch.turn_on
    target:
      entity_id: switch.treat_dispenser
  - delay: "00:00:05"  # Dispense treats for 5 seconds
  - service: switch.turn_off
    target:
      entity_id: switch.treat_dispenser

Make sure you note the “webhook_id” – you will need it soon.

Create the Logic App

In Azure Portal, create a new Logic App (Consumption). Call it something fun, like WallStreetKitty. Add a Reoccurrance Trigger – maybe every 5 minutes or something like that. If you use a different API for the stock prices, make sure you know the number of calls you can make on your pricing tier. These sample below just checks once a day at 5pm (after the market closes).

{
  "recurrence": {
    "frequency": "Day",
    "interval": 1,
    "schedule": {
      "hours": [17],
      "minutes": [0]
    }
  }
}

Fetch Stock Prices

Add an HTTP action to call a stock API (e.g., Alpha Vantage). Example setup:

  1. Method: GET
  2. URI: https://www.alphavantage.co/query?function=TIME_SERIES_INTRADAY&symbol=MSFT&interval=1min&apikey=YourAPIKey

Replace MSFT with the ticker symbol of your choice – or your cat’s favorite stock. The actual json you get from Alpha Vantage might be something like this:

{
  "Meta Data": {
    "1. Information": "Intraday (1min) open, high, low, close prices and volume",
    "2. Symbol": "MSFT",
    "3. Last Refreshed": "2024-05-01 16:00:00",
    "4. Interval": "1min",
    "5. Output Size": "Compact",
    "6. Time Zone": "US/Eastern"
  },
  "Time Series (1min)": {
    "2024-05-01 16:00:00": {
      "1. open": "309.6200",
      "2. high": "310.0000",
      "3. low": "309.1500",
      "4. close": "309.9200",
      "5. volume": "1234567"
    },
    "2024-05-01 15:59:00": {
      "1. open": "309.5000",
      "2. high": "309.8000",
      "3. low": "309.1000",
      "4. close": "309.6200",
      "5. volume": "987654"
    }
  }
}

So your next step is to parse the json – add a parse JSON step and use this schema:

{
  "type": "object",
  "properties": {
    "Meta Data": {
      "type": "object",
      "properties": {
        "2. Symbol": { "type": "string" },
        "3. Last Refreshed": { "type": "string" }
      }
    },
    "Time Series (1min)": {
      "type": "object",
      "additionalProperties": {
        "type": "object",
        "properties": {
          "1. open": { "type": "string" },
          "2. high": { "type": "string" },
          "3. low": { "type": "string" },
          "4. close": { "type": "string" },
          "5. volume": { "type": "string" }
        }
      }
    }
  }
}

We want 4 – the CLOSE value. We just need to extract it from the JSON –

@body('Parse_JSON')?['Time Series (1min)']?[body('Parse_JSON')?['Meta Data']?['3. Last Refreshed']]?['4. close']

Now we need to add a condition – we don’t want Tabby to get fat if the stocks aren’t doing well, right??

@greater(float(body('Extract_Stock_Price')),float(variables('Previous_Price')))

If True – continue. If False, well someones going to not be happy. Let’s assume that the stocks are going to do well, so let’s call out to Home Assistant.

Call Home Assistant

In the True branch, add an HTTP action to trigger the treat dispenser:

  1. Method – POST
  2. URI – https://your-homeassistant-instance/api/webhook/<<that webhook id I told you to remember>>. For example – https://your-homeassistant-instance/api/webhook/dispense_treats
  3. Headers – Add your Home Assistant authentication token.

Bonus Round: Go Big or Go Home

  • Track Multiple Stocks – Add a loop to monitor multiple ticker symbols and dispense extra treats for each one in the green.
  • Add Notifications – Send a Teams message or email with the stock performance and treat status.
  • Cat Mood Analytics – Track treat frequency and correlate it with your cat’s nap times in a Power BI dashboard.

Did we need to do this? Nope. Is this useful? Also No. Do I currently have a cat? Also No. Do I have too much time on my hands? I will let you decide.

Why Not? Automating Coffee Break Notifications with Azure Logic Apps

Let’s face it, folks: productivity peaks when caffeine flows. But how often do you lose track of time, only to realize you’ve been glued to your screen without your essential coffee break? Enter Azure Logic Apps, your caffeine accountability buddy.

Yes, we’re automating coffee break reminders. Is it silly? Absolutely. Is it also a fantastic way to show off your Logic Apps skills? You betcha. Let’s build it—with full code, because you deserve it.

The Plan

Here’s what we’re building:

  1. Trigger: The Logic App runs every workday at a specific time.
  2. Check Your Calendar: Ensure you’re not in a meeting during coffee time.
  3. Send a Reminder: Notify yourself to take a break and caffeinate responsibly.

Create the Logic App

First, create a Logic App in the Azure Portal (Consumption Plan) and name it something clever like CoffeeBreakBuddy. We are building a caffeine ally here afterall.


Full Code: Coffee Break Reminder Logic App

Here’s the complete code for your new caffeine buddy in JSON. Save it as a .json file and import it into the Azure Logic Apps designer

{
"definition": {
"$schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#",
"actions": {
"Check_Calendar": {
"inputs": {
"host": {
"connection": {
"name": "@parameters('$connections')['office365']['connectionId']"
}
},
"method": "get",
"path": "/v2/calendars/me/events",
"queries": {
"$filter": "start/dateTime ge '@{utcNow()}' and start/dateTime lt '@{addMinutes(utcNow(),30)}'"
}
},
"runAfter": {
"Recurrence": [
"Succeeded"
]
},
"type": "ApiConnection"
},
"Condition": {
"actions": {
"Send_Reminder": {
"inputs": {
"body": {
"Content": "It's coffee o'clock! Take a break and enjoy your brew. ☕"
},
"host": {
"connection": {
"name": "@parameters('$connections')['office365']['connectionId']"
}
},
"method": "post",
"path": "/v2/emails",
"headers": {
"Subject": "Coffee Break Reminder"
}
},
"type": "ApiConnection"
}
},
"expression": {
"and": [
{
"equals": [
"@empty(body('Check_Calendar')?['value'])",
true
]
}
]
},
"runAfter": {
"Check_Calendar": [
"Succeeded"
]
},
"type": "If"
}
},
"triggers": {
"Recurrence": {
"recurrence": {
"frequency": "Day",
"interval": 1,
"schedule": {
"hours": [
10
],
"minutes": [
0
]
}
},
"type": "Recurrence"
}
}
},
"parameters": {
"$connections": {
"defaultValue": {},
"type": "Object"
}
}
}

How It Works

Trigger: Recurrence

  • Runs every day at 10:00 AM. Adjust the time in the schedule property under Recurrence.

Check Your Calendar

  • Uses the Office 365 Outlook connector to check for events in the next 30 minutes.

Condition: Is It Coffee Time?

  • If your calendar is empty during the coffee break window, it sends a reminder.
  • If busy, skips the reminder because productivity comes first (sometimes).

Send Reminder

  • Sends an email through the Office 365 connector. You can change this to a Teams message or even a text with Twilio.

How to Deploy

  1. Import the JSON:
    • In the Logic Apps designer, click Import Logic App and upload the JSON file.
  2. Set Up Connections:
    • Add an Office 365 Outlook connection for email and calendar integration.
  3. Save and Run:
    • Save your Logic App and test it by running it manually or waiting for the next scheduled run.

Bonus Ideas

  • Add weather data to suggest iced or hot coffee.
  • Hook up Spotify to start a “Coffee Break” playlist.
  • Track your breaks in Azure Table Storage to analyze your caffeine habits.

Now go forth and caffeinate like a boss. And remember, this isn’t just about coffee—it’s about showing the world that no problem is too small to automate. Cheers!

Azure Communication Services: March 2024 Updates You Need to Know

Alright, folks, buckle up because Azure Communication Services (ACS) just dropped a batch of updates that’ll make your dev life a little smoother and your apps a lot smarter. Whether you’re building chat, voice, or video features, ACS has some shiny new tools to simplify your workflows and impress your users.

Let’s break it down.


Limited Access User Tokens: Now Generally Available

Ever wanted to give your users just enough access to get the job done without opening the floodgates? Meet Limited Access User Tokens. These beauties let you control what users can and can’t do—like joining a call but not starting one.

Think of it like a VIP pass that only gets you into the lounge, not backstage. Perfect for scenarios where security and controlled participation are a must. And yes, it’s available right now for you to play with.


“Try Phone Calling” (Public Preview)

Imagine this: you’re setting up telephony in your app, but you’re not 100% sure the setup actually works. Enter “Try Phone Calling”, now in public preview. This feature lets you make test calls directly from the Azure portal. No code. No app. Just you, a test call, and sweet, sweet confirmation that everything’s running smoothly.

This works with both PSTN (Public Switched Telephone Network) and direct routing setups. It’s like a “Hello, World” for phone calling.


UI Native Library Gets a Boost

The Native UI Library just got a couple of upgrades that’ll make your users love you even more (or at least blame you less when something goes wrong):

  1. User Facing Diagnostics (UFD): Think of this as your app whispering helpful tips to users. Muted mic? Bad network? UFD lets users know in real-time so they can fix issues themselves. No more “I can’t hear you” panic in the middle of a call. It’s available now, so start showing off your polished UX skills.
  2. iOS CallKit Integration: For all the Apple fans out there, ACS now integrates with iOS CallKit (in public preview). Your calls will feel native, with built-in notifications, call history, and even call hold. It’s like giving your app a little iOS magic wand.

PSTN Direct Offers Expanded

PSTN Direct Offers just leveled up with availability in 42 countries. That’s 400+ new cross-country offers, making it easier to integrate phone calling into your app no matter where your users are.

If you’ve been dreaming of adding PSTN calling for global users, this update is basically your green light.


Why These Updates Matter

Azure Communication Services just made it a lot easier to build reliable, secure, and scalable communication features into your apps. From tighter access controls to test calls and diagnostics, these tools are all about making your life easier and your apps better.

You can dive into the nitty-gritty here: Azure Communication Services Updates. Or just fire up the portal and start playing around. You’ll thank yourself later.

Now, go forth and communicate like the app-building rockstar you are.

Running PowerShell from a Logic App

Hola! Today let’s look at a simple way to get PowerShell scripts to run from a Logic App. It will involve a single extra tool, but this really adds versatility to an already versatile tool.

Start by creating a PowerShell script for your specific task. This script will be uploaded to an Azure Automation Runbook. For instance, if you aim to manage VMs, ensure the script includes Azure RM or Az module commands to start, stop, or monitor VM states. Here is an example:

# Sample PowerShell Script to Start a Specific Azure VM
Param(
    [string]$vmName,
    [string]$resourceGroupName
)

Connect-AzAccount -Identity
Start-AzVM -Name $vmName -ResourceGroupName $resourceGroupName

Obviously this is a short script that we can do with just Logic Apps (and not involve pwsh at all), but you get the point.

Now – Upload and publish your PowerShell script in an Azure Automation Runbook.

  1. In your Azure Automation Account, create a new Runbook.
  2. Choose “PowerShell” as the Runbook type.
  3. Import your script and publish the Runbook.

Go ahead test the runbook if you want.

Next – create a Logic App to trigger the Runbook. You might use a schedule, an HTTP request, or another event in Azure as a trigger.

  1. In the Logic App Designer, add a new step and search for the “Azure Automation” connector.
  2. Select “Create job” action.
  3. Fill in the necessary details: Automation Account, Runbook Name, and parameters (if your script requires them). In our example we might dynamically pass the VM name, or maybe look for only VMs that are off and loop through them.

For more complex scenarios, you might need to integrate with other Azure services before or after executing your PowerShell script:

  • Azure Functions: For custom logic that cannot be implemented directly in PowerShell or needs a specific runtime environment.
  • Azure Event Grid: To trigger your Logic App based on events from various Azure services.
  • Azure Monitor: To analyze logs and metrics from your Logic App and Automation Runbooks, enabling proactive management and optimization of your automated tasks.

And there you go! Go put PowerShell everywhere!