loading…
Search for a command to run...
loading…
A production-ready MCP server built with Node.js and Express that supports remote deployment via HTTP and SSE. It provides a modular framework for building and
A production-ready MCP server built with Node.js and Express that supports remote deployment via HTTP and SSE. It provides a modular framework for building and scaling tools while serving multiple clients concurrently.
A Python MCP server hosted with the Azure Functions MCP extension. The app exposes National Weather Service tools through Azure Functions MCP tool triggers.
This repository follows the Azure Functions MCP extension model, not the self-hosted custom-handler model.
| Tool | Description |
|---|---|
echo |
Returns a message unchanged |
get_weather_forecast |
Gets a NWS forecast for a US latitude and longitude |
get_current_conditions |
Gets current NWS observations for a US latitude and longitude |
get_weather_alerts |
Gets active NWS alerts for a two-letter US state |
The weather tools use the public National Weather Service API. No API key is required, but locations must be in the United States.
function_app.py # Azure Functions MCP tool triggers
host.json # Azure Functions host config with experimental MCP extension bundle
local.settings.example.json # Local settings template; copy to local.settings.json
requirements.txt # Azure deployment dependencies
pyproject.toml # Local uv project metadata
.funcignore # Files excluded from deployment packages
README.md
The important files for this deployment model are:
function_app.pyhost.jsonlocal.settings.jsonrequirements.txt.funcignoreCreate the Function App in the Azure Portal.
Use these settings:
| Setting | Value |
|---|---|
| Hosting plan | Flex Consumption |
| Operating system | Linux |
| Instance memory | 512 MB is fine for this sample |
| Runtime stack | Python |
| Python version | 3.11 or 3.12 |
| Storage | Create or select an Azure Storage account |
| Application Insights | Recommended |
| Authentication level | Function |
After creating the app, confirm the Overview page shows:
<your-function-name>.azurewebsites.netInstall prerequisites:
Copy local settings:
Copy-Item local.settings.example.json local.settings.json
Create the Python environment:
uv venv
uv pip install -r requirements.txt
If you prefer to add packages through uv:
uv add azure-functions httpx
Azure Functions needs storage even when running locally. This example uses Azurite through Podman.
Start the Podman machine:
podman machine start
Run Azurite:
podman run -d --name azurite `
-p 10000:10000 `
-p 10001:10001 `
-p 10002:10002 `
mcr.microsoft.com/azure-storage/azurite
Check the container:
podman ps -a
If the container already exists but is stopped:
podman start azurite
Start the function host:
func start
Expected output includes a line similar to:
MCP server SSE endpoint: http://localhost:7071/runtime/webhooks/mcp/sse
The local MCP endpoint is:
http://localhost:7071/runtime/webhooks/mcp/sse
Start MCP Inspector:
npx @modelcontextprotocol/inspector
Open the Inspector URL that prints in the terminal, usually:
http://127.0.0.1:6274
Connect to:
http://localhost:7071/runtime/webhooks/mcp/sse
Click List Tools. You should see the four tools listed above.
Sign in:
az login
Set the Function App values:
$FUNCTION_APP_NAME = "<your-function-name>"
$RESOURCE_GROUP = "<your-resource-group>"
$ZIP_FILE = "octo-mcp.zip"
Create the deployment zip:
Remove-Item $ZIP_FILE -Force -ErrorAction SilentlyContinue
$exclude = @(
".venv",
".git",
".vscode",
".azurite",
"local.settings.json",
"__pycache__",
$ZIP_FILE
)
Get-ChildItem -Force |
Where-Object { $exclude -notcontains $_.Name } |
Compress-Archive -DestinationPath $ZIP_FILE -Force
Confirm the zip contains the required files:
tar -tf $ZIP_FILE | Select-String "function_app.py|host.json|requirements.txt|.funcignore"
Deploy the zip with remote build:
az functionapp deployment source config-zip `
--src $ZIP_FILE `
--name $FUNCTION_APP_NAME `
--resource-group $RESOURCE_GROUP `
--build-remote true
After deployment, check the Function App in the Azure Portal. Under Functions, you should see:
echoget_weather_forecastget_current_conditionsget_weather_alertsIn the Azure Portal, open the Function App.
Go to:
Functions > App keys
Under System keys, copy the key named:
mcp_extension
The cloud MCP endpoint is:
https://<your-function-name>.azurewebsites.net/runtime/webhooks/mcp/sse?code=<mcp_extension_key>
Start MCP Inspector:
npx @modelcontextprotocol/inspector
Connect to the cloud endpoint above and click List Tools.
View Function App deployment logs:
az webapp log tail `
--name $FUNCTION_APP_NAME `
--resource-group $RESOURCE_GROUP
List app settings:
az functionapp config appsettings list `
--name $FUNCTION_APP_NAME `
--resource-group $RESOURCE_GROUP `
--output table
Restart the Function App:
az functionapp restart `
--name $FUNCTION_APP_NAME `
--resource-group $RESOURCE_GROUP
| Symptom | Fix |
|---|---|
func: command not found |
Install Azure Functions Core Tools v4 |
| Local storage error | Start Azurite with Podman and confirm AzureWebJobsStorage is UseDevelopmentStorage=true |
| Tools do not appear locally | Confirm func start shows the MCP SSE endpoint |
| Tools do not appear in Azure | Confirm deployment succeeded and the Functions list shows the tool functions |
| Cloud Inspector cannot connect | Confirm the URL includes /runtime/webhooks/mcp/sse?code=<mcp_extension_key> |
mcp_extension key missing |
Confirm host.json uses Microsoft.Azure.Functions.ExtensionBundle.Experimental |
FUNCTIONS_WORKER_RUNTIME in Azure app settings for Flex Consumption through CLI commands. The portal/runtime stack config handles the cloud runtime. Keep it in local.settings.json for local development./mcp endpoint for this repository. The MCP extension endpoint is /runtime/webhooks/mcp/sse.local.settings.json.Добавь это в claude_desktop_config.json и перезапусти Claude Desktop.
{
"mcpServers": {
"octo-mcp-server": {
"command": "npx",
"args": []
}
}
}