{"id":15654,"date":"2023-10-18T08:00:31","date_gmt":"2023-10-18T15:00:31","guid":{"rendered":"https:\/\/devblogs.microsoft.com\/microsoft365dev\/?p=15654"},"modified":"2023-10-18T07:06:42","modified_gmt":"2023-10-18T14:06:42","slug":"build-message-extensions-for-microsoft-teams-and-copilot","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/microsoft365dev\/build-message-extensions-for-microsoft-teams-and-copilot\/","title":{"rendered":"Build message extensions for Microsoft Teams and Copilot"},"content":{"rendered":"<h2>What are message extensions?<\/h2>\n<p>Message extensions are a way to enhance the messaging functionality of Microsoft Teams beyond what is available out-of-the-box. It enables users to easily search for and share information through rich cards, capture data, and preview app content right within Teams. This enhances the overall user experience while using your app within Teams.<\/p>\n<p><strong>\ud83d\udca1Did you know?<\/strong> <strong>If you already have a Teams message extension, then you have a plugin that works with Copilot. Read more at the end of this article.<\/strong><\/p>\n<h2>Why use message extensions?<\/h2>\n<p>So, the golden question is: Why use message extensions at all?<\/p>\n<p><strong>Imagine<\/strong> you&#8217;re a project manager and you are in a team chat. You need a specific update on a work item in Azure DevOps. Typically, you&#8217;d open your browser, search for the item, copy the link, return to the chat, and share it. Then you&#8217;d write a message to ask for the update.<\/p>\n<p>Your teammate, perhaps out walking her dog, clicks the link. Her mobile browser opens, but she&#8217;s not logged into Azure DevOps, so it prompts her to sign in. Frustrated, she gives up due to a forgotten password. Later, she abandons the task, planning to try again at home but forgets.<\/p>\n<p><img decoding=\"async\" width=\"1100\" height=\"619\" class=\"wp-image-15655 aligncenter\" src=\"https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-1.png\" srcset=\"https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-1.png 1100w, https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-1-300x169.png 300w, https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-1-1024x576.png 1024w, https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-1-768x432.png 768w\" sizes=\"(max-width: 1100px) 100vw, 1100px\" \/><\/p>\n<p><strong>Reimagine <\/strong>this with message extension for Azure DevOps (which you can also build).<\/p>\n<p>As a project manager in a team chat, you need an update on an Azure DevOps work item. You use the Azure DevOps message extension in the channel to find the item, insert an actionable card with edit\/view buttons into the chat, and mention your teammate responsible for it. Your teammate sees the mention, clicks &#8220;Edit,&#8221; updates the status to &#8220;done,&#8221; shares the updated card, and informs you. Task complete!<\/p>\n<p>As seen in the above scenario, <strong>message extensions <\/strong>help streamline communication and workflows by allowing users to easily access and interact with external apps and services directly within Teams. With over 300 million MAU in Teams, this is also a great way for your app to reach a bigger audience organically.<\/p>\n<p><img decoding=\"async\" width=\"1100\" height=\"619\" class=\"wp-image-15656 aligncenter\" src=\"https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-2.png\" srcset=\"https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-2.png 1100w, https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-2-300x169.png 300w, https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-2-1024x576.png 1024w, https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-2-768x432.png 768w\" sizes=\"(max-width: 1100px) 100vw, 1100px\" \/><\/p>\n<h2>What are the capabilities of message extensions?<\/h2>\n<p>Message extensions can have <strong>two main capabilities<\/strong>:<\/p>\n<p><strong>Search commands<\/strong>: allow users to search for information or content from your app or service and insert the results into their conversations as rich cards.<\/p>\n<p><img decoding=\"async\" width=\"1099\" height=\"632\" class=\"wp-image-15657 aligncenter\" src=\"https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-3.jpeg\" srcset=\"https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-3.jpeg 1099w, https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-3-300x173.jpeg 300w, https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-3-1024x589.jpeg 1024w, https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-3-768x442.jpeg 768w\" sizes=\"(max-width: 1099px) 100vw, 1099px\" \/><\/p>\n<p><strong>Action commands<\/strong>: allow users to perform an action or a task from your app or service and optionally insert the results into their conversations as rich cards. You can also use message extensions to initiate a task module, which is a modal dialog that can display an Adaptive Card or a web page and collect user inputs.<\/p>\n<p><img decoding=\"async\" width=\"1099\" height=\"548\" class=\"wp-image-15658 aligncenter\" src=\"https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-4.jpeg\" srcset=\"https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-4.jpeg 1099w, https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-4-300x150.jpeg 300w, https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-4-1024x511.jpeg 1024w, https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-4-768x383.jpeg 768w\" sizes=\"(max-width: 1099px) 100vw, 1099px\" \/><\/p>\n<p>Another capability of message extensions is <strong>link unfurling<\/strong>: enrich the user experience by offering previews of the contents. This capability can be seen in most messaging apps, social media platforms, and various online communication tools to make shared links more informative and visually appealing.<\/p>\n<p><img decoding=\"async\" width=\"1099\" height=\"642\" class=\"wp-image-15659 aligncenter\" src=\"https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-5.jpeg\" srcset=\"https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-5.jpeg 1099w, https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-5-300x175.jpeg 300w, https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-5-1024x598.jpeg 1024w, https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-5-768x449.jpeg 768w\" sizes=\"(max-width: 1099px) 100vw, 1099px\" \/><\/p>\n<h2>How to build message extensions?<\/h2>\n<p>If you want to try out a sample, you\u2019ll only need <strong>Teams Toolkit<\/strong> and a <strong>developer tenant <\/strong>to develop one today.<\/p>\n<p>Typically to build your own based on your app\/webservice, you\u2019ll need <strong>Teams Toolkit<\/strong>, a <strong>developer tenant<\/strong> to test your app and <strong>your API endpoint<\/strong> to search\/add \/update information from your app.<\/p>\n<h2>Let\u2019s build?<\/h2>\n<p>This blog focuses on building <strong>search command<\/strong> message extension application using <strong>Visual Studio Code\u2019s <\/strong>extension <strong>Teams Toolkit<\/strong>. If you prefer V<strong>isual Studio,<\/strong> scroll down to References to see the documentation for Visual Studio\u2019s Teams Toolkit extension.<\/p>\n<ul>\n<li>Make sure you have a <strong>developer tenant for Microsoft 365<\/strong>, you\u2019ll need this to configure and test your app using Teams toolkit.<\/li>\n<li>Make sure your node version is set to <strong>18<\/strong> or <strong>16<\/strong> to support Teams Toolkit.<\/li>\n<\/ul>\n<p>Open your Visual Studio Code and install the <strong>Teams Toolkit extension<\/strong>.<\/p>\n<p><img decoding=\"async\" width=\"1101\" height=\"716\" class=\"wp-image-15660 aligncenter\" src=\"https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-6.jpeg\" srcset=\"https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-6.jpeg 1101w, https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-6-300x195.jpeg 300w, https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-6-1024x666.jpeg 1024w, https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-6-768x499.jpeg 768w\" sizes=\"(max-width: 1101px) 100vw, 1101px\" \/><\/p>\n<h2>Create a message extension from existing app template<\/h2>\n<p>Start the app scaffolding by selecting \u201cCreate an app using the extension\u201d<\/p>\n<p><img decoding=\"async\" width=\"1100\" height=\"523\" class=\"wp-image-15661\" src=\"https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-7.jpeg\" srcset=\"https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-7.jpeg 1100w, https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-7-300x143.jpeg 300w, https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-7-1024x487.jpeg 1024w, https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-7-768x365.jpeg 768w\" sizes=\"(max-width: 1100px) 100vw, 1100px\" \/><\/p>\n<ul>\n<li>\n<ol>\n<li>For <em>New Project<\/em>, select option <strong>message extension<\/strong><\/li>\n<li>For <em>App features using Message extensions<\/em>, select option <strong>Custom Search Results<\/strong><\/li>\n<li>For <em>Programming language<\/em>, select <strong>JavaScript<\/strong><\/li>\n<li>For <em>Workspace folder<\/em>, select <strong>Default<\/strong><\/li>\n<li>For <em>Application name<\/em>, type <strong>npm search app<\/strong> and select <strong>Enter <\/strong>to kick-off app scaffold<\/li>\n<\/ol>\n<\/li>\n<\/ul>\n<p>The app template we chose here is a search command. This app as-is searches within npm packages and insert the selected package information in the form of a card into the conversation. You can re-imagine this with your API endpoint\/webservice.<\/p>\n<p><strong>\ud83d\udca1Did you know? Teams Toolkit has many samples you can pick and scaffold as your base app. <\/strong><\/p>\n<h2>Prepare to run your application<\/h2>\n<p>Once app project is scaffolded, using the Microsoft 365 developer tenant account login to Teams Toolkit<\/p>\n<p><img decoding=\"async\" width=\"1094\" height=\"1101\" class=\"wp-image-15662\" src=\"https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-8.jpeg\" srcset=\"https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-8.jpeg 1094w, https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-8-298x300.jpeg 298w, https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-8-1017x1024.jpeg 1017w, https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-8-150x150.jpeg 150w, https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-8-768x773.jpeg 768w, https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-8-24x24.jpeg 24w, https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-8-48x48.jpeg 48w, https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-8-96x96.jpeg 96w\" sizes=\"(max-width: 1094px) 100vw, 1094px\" \/><\/p>\n<p>Ensure that your tenant has <a href=\"https:\/\/learn.microsoft.com\/en-us\/microsoftteams\/platform\/concepts\/deploy-and-publish\/apps-upload\">sideloading enabled<\/a>, allowing the Teams Toolkit to locally install your app while it runs, providing an F5 development experience.<\/p>\n<h2>Run your app<\/h2>\n<p>Press F5 and see the magic happen. The browser will open your app in an install dialog. Select<strong> Add <\/strong>and start testing.<\/p>\n<p><img decoding=\"async\" width=\"1100\" height=\"744\" class=\"wp-image-15663\" src=\"https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-9.jpeg\" srcset=\"https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-9.jpeg 1100w, https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-9-300x203.jpeg 300w, https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-9-1024x693.jpeg 1024w, https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-9-768x519.jpeg 768w\" sizes=\"(max-width: 1100px) 100vw, 1100px\" \/><\/p>\n<p><strong>\ud83d\udca1<\/strong>Your app is named <strong>npm search app,<\/strong> but it appears as <strong>npm search app-local<\/strong> due to the Teams Toolkit adding a suffix to indicate its local hosting status.<\/p>\n<p>To test the search command, once the app added, you can start searching. Let\u2019s search for the npm package \u201creact\u201d.<\/p>\n<p><img decoding=\"async\" width=\"1101\" height=\"871\" class=\"wp-image-15664\" src=\"https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-10.jpeg\" srcset=\"https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-10.jpeg 1101w, https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-10-300x237.jpeg 300w, https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-10-1024x810.jpeg 1024w, https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-10-768x608.jpeg 768w\" sizes=\"(max-width: 1101px) 100vw, 1101px\" \/><\/p>\n<p>You can select \u201creact\u201d as shown above and it will insert the card into the message compose area, ready to be shared in the conversation.<\/p>\n<p><img decoding=\"async\" width=\"1100\" height=\"831\" class=\"wp-image-15665\" src=\"https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-11.jpeg\" srcset=\"https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-11.jpeg 1100w, https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-11-300x227.jpeg 300w, https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-11-1024x774.jpeg 1024w, https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-11-768x580.jpeg 768w\" sizes=\"(max-width: 1100px) 100vw, 1100px\" \/><\/p>\n<p><strong>\ud83d\udca1Did you know? The search command message extensions like this developed using Teams Toolkit also work on Outlook compose area. <\/strong><\/p>\n<h2>Behind the scenes<\/h2>\n<p>In the project scaffolded, the file <code><strong><em>teamsBot.js<\/em><\/strong><\/code> contains the bot code for the message extension.<\/p>\n<p>When a user searches \u201creact\u201d:<\/p>\n<ol>\n<li>The <code><strong>handleTeamsMessagingExtensionQuery <\/strong><\/code>method is invoked.<\/li>\n<li>This method receives the query parameter, which is \u201creact\u201d.<\/li>\n<li>The method then calls the npmjs.com registry search API to search for packages that match text \u201creact\u201d.<\/li>\n<li>The method then returns a list of hero cards to be displayed in the search results.<\/li>\n<li>The tap handler is set on the preview card.<\/li>\n<li>The tap handler invokes the <strong><code>handleTeamsMessagingExtensionSelectItem<\/code>.<\/strong><\/li>\n<\/ol>\n<p>When a user taps on \u201creact\u201d:<\/p>\n<ol>\n<li>The <code><strong>handleTeamsMessagingExtensionSelectItem<\/strong><\/code> method is invoked.<\/li>\n<li>This method returns the selected hero card only which is for \u201creact\u201d.<\/li>\n<\/ol>\n<p>How did Teams know about the query parameter and how to invoke activities?<\/p>\n<ol>\n<li>Your teams app is basically a zip file containing a <code><strong>manifest.json<\/strong><\/code> file and two icons. You can find these under folder <strong><em><code>appPackage<\/code>.<\/em><\/strong><\/li>\n<li>Manifest file contains all the definitions needed to interact with Teams client app and your web service.<\/li>\n<li>The message extension definition is under the <code><strong>composeExtensions <\/strong><\/code>property<\/li>\n<\/ol>\n<p><img decoding=\"async\" width=\"1099\" height=\"1070\" class=\"wp-image-15666\" src=\"https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-12.jpeg\" srcset=\"https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-12.jpeg 1099w, https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-12-300x292.jpeg 300w, https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-12-1024x997.jpeg 1024w, https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-12-768x748.jpeg 768w, https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-12-24x24.jpeg 24w, https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-12-48x48.jpeg 48w\" sizes=\"(max-width: 1099px) 100vw, 1099px\" \/>\nInside the <code>composeExtension<\/code> property, Command id (1) <code>\"searchQuery\"<\/code> is the property denoting a search command message extension of type (2)<code> \u201cquery\u201d<\/code>.<\/p>\n<p>The (3) <code>\u201csearchQuery\u201d<\/code> in the parameters object is the query parameter.<\/p>\n<p>The context (4) where the search command can be invoked are <code>\"compose\"<\/code> and <code>\"commandBox\"<\/code>.<\/p>\n<h2>Why a BOT is necessary<\/h2>\n<p>The project here creates the bot code in <code><em>teamsBot.js<\/em><\/code> file. Now you must wonder, why does this app template create a bot for my message extension feature? A bot serves as the intermediary that enables communication between the user (via the messaging platform like Teams) and webservices\/app (In our case the npm search API).<\/p>\n<p>When a user initiates a search within the message extension, the bot is responsible for processing that request and relaying it to the webservice via the <strong>Azure Bot Channel.<\/strong><\/p>\n<p>The bot also handles the processing of data received from your webservice, such as formatting data into a rich card that can be inserted into the chat as a response.<\/p>\n<h2>Azure DevOps sample<\/h2>\n<p>Did you like our screenshots showing the Azure DevOps work items which has all three capabilities like search, action commands and link unfurling?<\/p>\n<p>If you do, head to <a href=\"https:\/\/aka.ms\/me-sample\">https:\/\/aka.ms\/me-sample<\/a> where you can download the source or clone and run the app within Teams Toolkit.<\/p>\n<p><img decoding=\"async\" width=\"1920\" height=\"1080\" class=\"wp-image-15667\" src=\"https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-content\/uploads\/sites\/73\/2023\/10\/word-image-15654-13.gif\" \/><\/p>\n<p>\ud83d\udca1 <strong>Did you know?<\/strong> <strong>While message extensions can bring your application data into Teams, it can also power Microsoft 365 Copilot to bring the same data to you in response to your natural language queries. Learn more<\/strong>: <a href=\"https:\/\/learn.microsoft.com\/en-us\/microsoftteams\/platform\/copilot\/how-to-extend-copilot\">How to Extend Microsoft 365 Copilot &#8211; Teams | Microsoft Learn<\/a><\/p>\n<h2>References<\/h2>\n<p><a href=\"https:\/\/learn.microsoft.com\/en-us\/microsoftteams\/platform\/messaging-extensions\/what-are-messaging-extensions?tabs=dotnet\">Message extensions &#8211; Teams | Microsoft Learn<\/a><\/p>\n<p><a href=\"https:\/\/learn.microsoft.com\/en-us\/microsoftteams\/platform\/toolkit\/teams-toolkit-fundamentals?pivots=visual-studio-code-v5\">Teams Toolkit Overview &#8211; Teams | Microsoft Learn<\/a><\/p>\n<p><a href=\"https:\/\/learn.microsoft.com\/en-us\/microsoftteams\/platform\/toolkit\/toolkit-v4\/install-teams-toolkit-vs?pivots=visual-studio-v17-7\">Install Teams Toolkit in Visual Studio &#8211; Teams | Microsoft Learn<\/a><\/p>\n<p><a href=\"https:\/\/learn.microsoft.com\/en-us\/microsoftteams\/platform\/concepts\/deploy-and-publish\/apps-upload\">Upload your custom app &#8211; Teams | Microsoft Learn<\/a><\/p>\n<p>Follow us on <a href=\"https:\/\/twitter.com\/Microsoft365Dev\">X (@Microsoft365Dev)<\/a> for the latest news and updates<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Enhance the messaging functionality of Microsoft Teams to easily search for and share information through rich cards, capture data, and preview app content right within Teams.<\/p>\n","protected":false},"author":71938,"featured_media":15670,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[128],"tags":[241,251],"class_list":["post-15654","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-microsoft-teams","tag-message-extensions","tag-microsoft-365-copilot"],"acf":[],"blog_post_summary":"<p>Enhance the messaging functionality of Microsoft Teams to easily search for and share information through rich cards, capture data, and preview app content right within Teams.<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-json\/wp\/v2\/posts\/15654","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-json\/wp\/v2\/users\/71938"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-json\/wp\/v2\/comments?post=15654"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-json\/wp\/v2\/posts\/15654\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-json\/wp\/v2\/media\/15670"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-json\/wp\/v2\/media?parent=15654"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-json\/wp\/v2\/categories?post=15654"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/microsoft365dev\/wp-json\/wp\/v2\/tags?post=15654"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}