🧮 Step by step Implementation of MCP Server and Integration into Microsoft Copilot Studio and Github Copilot Agent
This is a demo Node.js + TypeScript MCP SDK using
- ✅ SSE (Server-Sent Events) Support
- ✅ BMI Calculator Tool
- ✅ Addition Tool
- ✅ MCP Tool + Github Copilot Agent Integration
- ✅ MCP Tool + Microsoft Copilot Studio Integration
- ✅ Azure App Service Ready
npm install # Install dependencies
npm run build # Compile TypeScript
npm run start # Start server (http://localhost:3001)
The app will run at
Input:
{
"weightKg": 70,
"heightM": 1.75
}
Response:
{
"content": [{ "type": "text", "text": "22.86" }]
}
Input
{
"a": 5,
"b": 3
}
Response:
{
"content": [{ "type": "text", "text": "8" }]
}
The server supports Server-Sent Events (SSE) via:
GET /sse
- Open the Command Palette (
Ctrl+Shift+P
orCmd+Shift+P
). - Type "Add MCP Server" and select it.
- Update
.vscode/mcp.json
with the following:
{
"servers": {
"my-mcp-server": {
"type": "sse",
"url": "http://localhost:3001/sse"
}
}
}
Result in Github Copilot Agent
The server appears and is connected successfully.For details on integrating Model Context Protocol (MCP) tools into Microsoft Copilot Studio using custom connectors, check out the official Microsoft documentation: 🔗
It shows how to set up the MCP Tools for actions to work with custom connectors in Copilot Studio.
swagger: '2.0'
info:
title: MCPCalculatorDemo
description: Calculate BMI and Calculate sum using MCP SSE server
version: '1.0'
host: calculatormcp-dummyurl.azurewebsites.net
basePath: /
schemes:
- https
definitions:
QueryResponse:
type: object
properties:
jsonrpc:
type: string
id:
type: string
method:
type: string
params:
type: object
result:
type: object
error:
type: object
paths:
/sse:
get:
summary: MCP Server Actions for calculating BMI and sum
parameters:
- in: query
name: sessionId
type: string
required: false
produces:
- application/json
responses:
'200':
description: Immediate Response
schema:
$ref: '#/definitions/QueryResponse'
'201':
description: Created and will follow callback
operationId: CalculatorDemo
tags:
- Agentic
- McpSse
securityDefinitions: {}
security: []
-
Open Copilot Studio
Navigate to yourCopilot Studio workspace. -
Go to Actions
Click on the Action menu in the left sidebar. -
Select "Custom connector"
Under the Action menu, choose Custom connector. -
Locate the MCP Server Action
The system will automatically display available tools. Select the MCP Server Action from the list. -
MCP Server Action Preview
You will be able to view the details of the selected MCP Server Action as shown below:
-
✅ The
/sse
endpoint should return the full URI (including protocol and host) when initializing the MCP transport. This ensures compatibility when deploying across environments (e.g., localhost vs Azure). It establishes a live connection for streaming MCP interactions.Example:
const protocol = req.protocol; const host = req.get('host'); const fullUri = `${protocol}://${host}/mcp`;
Ensure your custom connector supports SSE (Server-Sent Events) and returns the full URI as shown:
tags:
- Agentic
- McpSse
Do not use "InvokeMCP"
as your operationId
.
Choose a more specific and descriptive name to reflect the purpose of the action and avoid conflicts.
Create an Azure App Service (Node.js 18+) Set the startup command (if needed):
npm run build && npm run start
The SSE deployment to Azure with the West US 2 region using the Basic plan was successful and tested without issues.
Follow these steps to verify that your SSE (Server-Sent Events) server is functioning correctly:
-
Open your browser and navigate to:
http://localhost:3000/sse
(if running locally), or- Your deployed Azure URL.
-
Open Developer Tools → Network tab.
-
Look for an EventStream connection.
-
Under the
Event
section, you should see:- Endpoint: SSE endpoint
- Data: Your Full URI endpoint
- Copy the Full URI (from the EventStream
data
). - Use Postman to send a
POST
request to that URI.
Example URL:
http://calculatormcp-dummyurl.azurewebsites.net/mcpfy/v1/calculatordemo?sessionId=620c84e1-81e2-484d-8737-a7fbc93165b1
Example Request Payload:
{
"jsonrpc": "2.0",
"id": "2",
"method": "tools/call",
"params": {
"name": "calculate-bmi",
"arguments": {
"weightKg": 180,
"heightM": 1.8
}
}
}
If successful, you'll receive a response with a "message"
confirming that the server is working correctly.
Alternatively, you can use MCP Inspector to test, https://github.com/modelcontextprotocol/inspector
This is an unsupported, experimental, and not an official Microsoft product. It is provided "as is", without support and without any warranties, whether express or implied. This includes, but is not limited to, warranties of merchantability, fitness for a particular purpose, and non-infringement.
In no event shall the authors or copyright holders be liable for any claims, damages, or other liabilities, whether in contract, tort, or otherwise, arising from, out of, or in connection with the Software or the use or other dealings in the Software.
⚠️ Important Note:
This is a sample demo custom MCP server created for demonstration purposes. It is deployed into Microsoft Azure and intended solely for integration with Copilot Studio during prototyping or sample scenarios.
This component is not part of any official Microsoft product and is not available for production use.