Extending Microsoft Copilot
Out of the box, Copilot works with Microsoft 365 data. But what about your custom line-of-business systems, external APIs, and third-party data? That's where Copilot extensibility comes in.
Extensibility Options
| Method | Best For | Complexity |
|---|---|---|
| Graph Connectors | Bringing external data into Microsoft 365 | Low |
| Message Extensions | Interactive cards in Teams + Copilot | Medium |
| API Plugins | Connecting to REST APIs | Medium |
| Copilot Studio | Low-code custom copilots | Low |
1. Microsoft Graph Connectors
Graph connectors ingest external data into the Microsoft 365 Graph, making it searchable by Copilot alongside your emails, files, and chats.
How It Works
External System (Jira, Salesforce, wiki, etc.)
↓ Graph Connector
Microsoft 365 Graph Index
↓
Copilot can search & reference this data
Built-In Connectors
Microsoft provides 100+ pre-built connectors for popular systems:
- Jira, ServiceNow, Salesforce
- Confluence, MediaWiki
- Azure DevOps, Azure SQL
Custom Connectors
Build your own connector for proprietary systems:
// Create a connection
var connection = new ExternalConnection
{
Id = "contosoproducts",
Name = "Contoso Products",
Description = "Product catalog from Contoso ERP"
};
await graphClient.External.Connections.PostAsync(connection);
// Define schema
var schema = new Schema
{
BaseType = "microsoft.graph.externalItem",
Properties = new List<Property>
{
new() { Name = "productName", Type = PropertyType.String, IsSearchable = true },
new() { Name = "price", Type = PropertyType.Double },
new() { Name = "category", Type = PropertyType.String, IsSearchable = true }
}
};
2. Message Extension Plugins
Teams message extensions can be used as Copilot plugins. When a user asks Copilot something, it can invoke your message extension to search external data and return rich Adaptive Cards.
Building a Plugin with Teams Toolkit
// teamsapp.yml - Plugin definition
{
"composeExtensions": [{
"botId": "${{ BOT_ID }}",
"commands": [{
"id": "searchProducts",
"description": "Search the product catalog",
"parameters": [{
"name": "query",
"description": "Product name or category",
"inputType": "text"
}]
}]
}]
}
When a user asks Copilot: "Find the pricing for Widget Pro in our product catalog", Copilot will invoke your plugin's search command and display the results.
3. API Plugins (OpenAPI)
Connect Copilot to any REST API using an OpenAPI specification.
# openapi.yaml
openapi: 3.0.0
info:
title: Contoso Inventory API
version: 1.0.0
paths:
/products:
get:
operationId: searchProducts
summary: Search products in inventory
parameters:
- name: query
in: query
schema:
type: string
responses:
200:
description: List of products
Register this with Copilot, and it can call your API autonomously when users ask about inventory.
4. Testing Your Plugin
- Use Teams Toolkit in VS Code for local development
- Sideload your app in Teams
- Open Copilot in Teams and test with prompts that should trigger your plugin
- Check the Developer Portal for logs and debugging
Deployment & Governance
- Submit to the Teams App Store for org-wide distribution
- Admins control which plugins are available via the Microsoft 365 Admin Center
- Data Loss Prevention (DLP) policies apply to plugin data
Resources
- Copilot Extensibility Documentation
- Graph Connectors Overview
- Build Message Extensions for Copilot
- Microsoft Learn Training
Video: Search for "Extend Microsoft 365 Copilot" on Microsoft 365 Developer YouTube


