Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,21 @@
<!--
---
name: Getting Started with Remote MCP Servers using Azure Functions (Python)
description: This is a quickstart template to easily build and deploy a custom remote MCP server to the cloud using Azure functions. You can clone/restore/run on your local machine with debugging, and `azd up` to have it in the cloud in a couple minutes. The MCP server is secured by design using keys and HTTPs, and allows more options for OAuth using EasyAuth and/or API Management as well as network isolation using VNET.
page_type: sample
products:
- azure-functions
- azure
- entra-id
- mcp
urlFragment: starter-http-trigger-python
languages:
- python
- bicep
- azdeveloper
---
-->

# Getting Started with Remote MCP Servers using Azure Functions (Python)

This is a quickstart template to easily build and deploy a custom remote MCP server to the cloud using Azure Functions with Python. You can clone/restore/run on your local machine with debugging, and `azd up` to have it in the cloud in a couple minutes. The MCP server is secured by design using keys and HTTPS, and allows more options for OAuth using EasyAuth and/or API Management as well as network isolation using VNET.
Expand Down
44 changes: 44 additions & 0 deletions architecture-diagram.drawio
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
<mxfile host="65bd71144e">
<diagram id="remote-mcp-architecture" name="MCP Server Solution Architecture">
<mxGraphModel dx="1007" dy="1077" grid="0" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1100" pageHeight="850" math="0" shadow="0">
<root>
<mxCell id="0"/>
<mxCell id="1" parent="0"/>
<mxCell id="client-container" value="MCP Clients" style="swimlane;whiteSpace=wrap;html=1;fillColor=#ffe6cc;strokeColor=#d79b00;startSize=30;fontSize=14;fontStyle=1;swimlaneFillColor=#F5F5F5;" parent="1" vertex="1">
<mxGeometry x="40" y="170" width="170" height="220" as="geometry"/>
</mxCell>
<mxCell id="vscode-client" value="VS Code &amp; Copilot" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f5f5f5;strokeColor=#666666;fontColor=#333333;" parent="client-container" vertex="1">
<mxGeometry x="20" y="50" width="130" height="60" as="geometry"/>
</mxCell>
<mxCell id="mcp-inspector" value="MCP Inspector" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f5f5f5;strokeColor=#666666;fontColor=#333333;" parent="client-container" vertex="1">
<mxGeometry x="20" y="130" width="130" height="60" as="geometry"/>
</mxCell>
<mxCell id="client-to-function" value="SSE Connection&#xa;/runtime/webhooks/mcp/sse" style="endArrow=classic;html=1;rounded=0;fontSize=11;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="1" source="client-container" target="11" edge="1">
<mxGeometry y="30" width="50" height="50" relative="1" as="geometry">
<mxPoint x="220" y="210" as="sourcePoint"/>
<mxPoint x="310" y="280" as="targetPoint"/>
<mxPoint as="offset"/>
</mxGeometry>
</mxCell>
<mxCell id="11" value="Azure Function App (Python 3.11)" style="swimlane;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;startSize=30;fontSize=14;fontStyle=1;swimlaneFillColor=#f5f5f5;" parent="1" vertex="1">
<mxGeometry x="360" y="110" width="470" height="340" as="geometry"/>
</mxCell>
<mxCell id="12" value="MCP Tools" style="swimlane;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;startSize=30;" parent="11" vertex="1">
<mxGeometry x="20" y="50" width="430" height="270" as="geometry"/>
</mxCell>
<mxCell id="13" value="&lt;span style=&quot;color: rgb(0, 0, 0); text-align: left;&quot;&gt;&lt;b&gt;hello_mcp&lt;/b&gt;&lt;/span&gt;&lt;br&gt;Simple hello world MCP Tool" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" parent="12" vertex="1">
<mxGeometry x="20" y="50" width="160" height="50" as="geometry"/>
</mxCell>
<mxCell id="14" value="&lt;b&gt;get_snippets&lt;/b&gt;&lt;br&gt;Gets code snippets from collection" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" parent="12" vertex="1">
<mxGeometry x="20" y="130" width="160" height="50" as="geometry"/>
</mxCell>
<mxCell id="15" value="&lt;b&gt;save_snippet&lt;/b&gt;&lt;br&gt;Saves code snippets to collection" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" parent="12" vertex="1">
<mxGeometry x="20" y="210" width="160" height="50" as="geometry"/>
</mxCell>
<mxCell id="18" value="SSE Endpoint&#xa;/runtime/webhooks/mcp/sse" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#e1d5e7;strokeColor=#9673a6;" parent="12" vertex="1">
<mxGeometry x="207" y="50" width="200" height="50" as="geometry"/>
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>
Binary file added architecture-diagram.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.