Skip to main content
Glama

Remote MCP Server

MIT License
32
  • Linux
  • Apple

Introducción a servidores MCP remotos mediante Azure Functions (Node.js/TypeScript)

Esta es una plantilla de inicio rápido para crear e implementar fácilmente un servidor MCP remoto personalizado en la nube con Azure Functions. Puede clonar, restaurar y ejecutar en su equipo local con depuración, y azd up para tenerlo en la nube en cuestión de minutos. El servidor MCP está protegido por diseño mediante claves y HTTPS, y permite más opciones de OAuth mediante EasyAuth o API Management, así como aislamiento de red mediante VNET.

Vea el video resumen

Si está buscando este ejemplo en más idiomas, consulte las versiones .NET/C# y Python .

A continuación se muestra el diagrama de arquitectura para el servidor MCP remoto que utiliza Azure Functions:

Diagrama de arquitectura

Prerrequisitos

Prepare su entorno local

Se necesita un emulador de almacenamiento de Azure para este ejemplo en particular porque guardaremos y obtendremos fragmentos del almacenamiento de blobs.

  1. Iniciar Azurita
    docker run -p 10000:10000 -p 10001:10001 -p 10002:10002 \ mcr.microsoft.com/azure-storage/azurite

Tenga en cuenta que si usa Azurite desde la extensión VS Code, debe ejecutar Azurite: Start ahora o verá errores.

Ejecute su servidor MCP localmente desde la terminal

  1. Instalar dependencias
    npm install
  2. Construir el proyecto
    npm run build
  3. Inicie el host de Funciones localmente:
    func start

Tenga en cuenta que, de forma predeterminada, se usará la ruta de webhooks: /runtime/webhooks/mcp/sse . Más adelante, la usaremos en Azure para configurar la clave en las llamadas de cliente/host: /runtime/webhooks/mcp/sse?code=<system_key>

Utilice el servidor MCP local desde un cliente/host

VS Code - Ediciones de copiloto

  1. Agregue el servidor MCP desde la paleta de comandos y agregue la URL al punto final SSE de su aplicación de función en ejecución:
    http://0.0.0.0:7071/runtime/webhooks/mcp/sse
  2. Seleccione HTTP (Server-Sent-Events) para el tipo de servidor MCP que desea agregar.
  3. Ingrese la URL del punto final SSE de su aplicación de función en ejecución
  4. Ingrese el ID del servidor. (Puede ser cualquier nombre que desee)
  5. Elija si desea ejecutar esto en su configuración de usuario (disponible para todas las aplicaciones) o en su configuración de espacio de trabajo (disponible solo para esta aplicación)
  6. Enumere los servidores MCP desde la paleta de comandos e inicie el servidor. Es posible que el paso anterior ya haya iniciado su servidor local. De ser así, puede omitir este paso.
  7. En el modo de agente de chat de Copilot, ingrese un mensaje para activar la herramienta, por ejemplo, seleccione un código e ingrese este mensaje
    Say Hello
    Save this snippet as snippet1
    Retrieve snippet1 and apply to newFile.ts
  8. Cuando se le solicite ejecutar la herramienta, dé su consentimiento haciendo clic en Continuar
  9. Cuando haya terminado, presione Ctrl+C en la ventana de terminal para detener el proceso de host func.exe y seleccione Listar servidores MCP desde la paleta de comandos y detenga el servidor local.

Inspector de MCP

  1. En una nueva ventana de terminal , instale y ejecute MCP Inspector
    npx @modelcontextprotocol/inspector node build/index.js
  2. Si detuvo su aplicación de funciones anteriormente, inicie el host de funciones localmente:
    func start
  3. Mantenga presionada la tecla CTRL y haga clic para cargar la aplicación web MCP Inspector desde la URL que muestra la aplicación (por ejemplo, http://0.0.0.0:5173/#resources )
  4. Establezca el tipo de transporte en SSE
  5. Establezca la URL del punto final SSE de la aplicación de función en ejecución y conéctese :
    http://0.0.0.0:7071/runtime/webhooks/mcp/sse
  6. Lista de herramientas . Haga clic en una herramienta y seleccione Ejecutar herramienta .
  7. Cuando haya terminado, presione Ctrl+C en la ventana de terminal para detener el proceso de host func.exe , y presione Ctrl+C en la ventana de terminal para detener el proceso de host @modelcontextprotocol/inspector .

Implementar en Azure para MCP remoto

Opcionalmente, puede optar por usar una red virtual en la muestra. (Si lo desea, hágalo antes de azd up ).

azd env set VNET_ENABLED true

Ejecute este comando azd para aprovisionar la aplicación de función, con todos los recursos de Azure necesarios, e implementar su código:

azd up

Nota: La administración de API se puede utilizar para mejorar la seguridad y las políticas de su servidor MCP, yla autenticación integrada de App Service se puede usar para configurar su proveedor OAuth favorito, incluido Entra.

Conéctese a la aplicación de función de servidor MCP remoto desde un cliente

Su cliente necesitará una clave para invocar el nuevo punto de conexión SSE alojado, que tendrá el formato https://<funcappname>.azurewebsites.net/runtime/webhooks/mcp/sse . La función alojada requiere una clave de sistema predeterminada, que puede obtenerse desde el portal o la CLI ( az functionapp keys list --resource-group <resource_group> --name <function_app_name> ). Obtenga la clave de sistema llamada mcp_extension .

Conectarse al servidor MCP remoto en MCP Inspector

Para MCP Inspector, puede incluir la clave en la URL:

https://<funcappname>.azurewebsites.net/runtime/webhooks/mcp/sse?code=<your-mcp-extension-system-key>

Conectarse a un servidor MCP remoto en VS Code - GitHub Copilot

Para GitHub Copilot en VS Code, debe establecer la clave como el encabezado x-functions-key en mcp.json y usar https://<funcappname>.azurewebsites.net/runtime/webhooks/mcp/sse como URL. El siguiente ejemplo proviene del archivo mcp.json incluido en este repositorio y utiliza una entrada para solicitarle que proporcione la clave al iniciar el servidor desde VS Code. Su archivo mcp.json tiene este aspecto:

{ "inputs": [ { "type": "promptString", "id": "functions-mcp-extension-system-key", "description": "Azure Functions MCP Extension System Key", "password": true }, { "type": "promptString", "id": "functionapp-name", "description": "Azure Functions App Name" } ], "servers": { "remote-mcp-function": { "type": "sse", "url": "https://${input:functionapp-name}.azurewebsites.net/runtime/webhooks/mcp/sse", "headers": { "x-functions-key": "${input:functions-mcp-extension-system-key}" } }, "local-mcp-function": { "type": "sse", "url": "http://0.0.0.0:7071/runtime/webhooks/mcp/sse" } } }
  1. Haga clic en Iniciar en el servidor remote-mcp-function , dentro del archivo mcp.json :
  2. Ingrese el nombre de la aplicación de función que creó en Azure Portal, cuando VS Code lo solicite.
  3. Introduzca la Azure Functions MCP Extension System Key en el mensaje. Puede copiarla desde el portal de Azure para su aplicación de funciones. Para ello, vaya al menú Funciones, seleccione Claves de la aplicación y copie la clave mcp_extension de Claves del sistema.
  4. En el modo de agente de chat de Copilot, ingrese un mensaje para activar la herramienta, por ejemplo, seleccione un código e ingrese este mensaje
    Say Hello
    Save this snippet as snippet1
    Retrieve snippet1 and apply to newFile.ts

Reimplementar su código

Puede ejecutar el comando azd up tantas veces como necesite para aprovisionar sus recursos de Azure e implementar actualizaciones de código en su aplicación de funciones.

[!NOTA] Los archivos de código implementados siempre se sobrescriben con el último paquete de implementación.

Limpiar recursos

Cuando haya terminado de trabajar con su aplicación de función y los recursos relacionados, puede usar este comando para eliminar la aplicación de función y sus recursos relacionados de Azure y evitar incurrir en costos adicionales:

azd down

Código fuente

El código de función para los puntos finales getSnippet y saveSnippet se define en los archivos TypeScript del directorio src . Las anotaciones de las funciones MCP exponen estas funciones como herramientas del servidor MCP.

Esto muestra el código para algunos ejemplos de servidor MCP (obtener cadena, obtener objeto, guardar objeto):

// Hello function - responds with hello message export async function mcpToolHello(context: InvocationContext): Promise<string> { return "Hello I am MCP Tool!"; } // Register the hello tool app.mcpTool('hello', { toolName: 'hello', description: 'Simple hello world MCP Tool that responses with a hello message.', handler: mcpToolHello }); // GetSnippet function - retrieves a snippet by name export async function getSnippet(_message: unknown, context: InvocationContext): Promise<string> { console.info('Getting snippet'); // Get snippet name from the tool arguments const mcptoolargs = context.triggerMetadata.mcptoolargs as { snippetname?: string }; const snippetName = mcptoolargs?.snippetname; console.info(`Snippet name: ${snippetName}`); if (!snippetName) { return "No snippet name provided"; } // Get the content from blob binding - properly retrieving from extraInputs const snippetContent = context.extraInputs.get(blobInputBinding); if (!snippetContent) { return `Snippet '${snippetName}' not found`; } console.info(`Retrieved snippet: ${snippetName}`); return snippetContent as string; } // Register the GetSnippet tool app.mcpTool('getsnippet', { toolName: GET_SNIPPET_TOOL_NAME, description: GET_SNIPPET_TOOL_DESCRIPTION, toolProperties: [ { propertyName: SNIPPET_NAME_PROPERTY_NAME, propertyValue: PROPERTY_TYPE, description: SNIPPET_NAME_PROPERTY_DESCRIPTION, } ], extraInputs: [blobInputBinding], handler: getSnippet }); // SaveSnippet function - saves a snippet with a name export async function saveSnippet(_message: unknown, context: InvocationContext): Promise<string> { console.info('Saving snippet'); // Get snippet name and content from the tool arguments const mcptoolargs = context.triggerMetadata.mcptoolargs as { snippetname?: string; snippet?: string; }; const snippetName = mcptoolargs?.snippetname; const snippet = mcptoolargs?.snippet; if (!snippetName) { return "No snippet name provided"; } if (!snippet) { return "No snippet content provided"; } // Save the snippet to blob storage using the output binding context.extraOutputs.set(blobOutputBinding, snippet); console.info(`Saved snippet: ${snippetName}`); return snippet; } // Register the SaveSnippet tool app.mcpTool('savesnippet', { toolName: SAVE_SNIPPET_TOOL_NAME, description: SAVE_SNIPPET_TOOL_DESCRIPTION, toolProperties: [ { propertyName: SNIPPET_NAME_PROPERTY_NAME, propertyValue: PROPERTY_TYPE, description: SNIPPET_NAME_PROPERTY_DESCRIPTION, }, { propertyName: SNIPPET_PROPERTY_NAME, propertyValue: PROPERTY_TYPE, description: SNIPPET_PROPERTY_DESCRIPTION, } ], extraOutputs: [blobOutputBinding], handler: saveSnippet });

Tenga en cuenta que el archivo host.json también incluye una referencia al paquete experimental, que es necesario para las aplicaciones que usan esta función:

"extensionBundle": { "id": "Microsoft.Azure.Functions.ExtensionBundle.Experimental", "version": "[4.*, 5.0.0)" }

Próximos pasos

-
security - not tested
A
license - permissive license
-
quality - not tested

hybrid server

The server is able to function both locally and remotely, depending on the configuration or use case.

Un servidor MCP personalizado basado en la nube que utiliza Azure Functions y que permite guardar y recuperar fragmentos de código con comunicación segura a través de claves, HTTPS, OAuth y opciones de aislamiento de red.

  1. Prerrequisitos
    1. Prepare su entorno local
      1. Ejecute su servidor MCP localmente desde la terminal
        1. Utilice el servidor MCP local desde un cliente/host
          1. VS Code - Ediciones de copiloto
          2. Inspector de MCP
        2. Implementar en Azure para MCP remoto
          1. Conéctese a la aplicación de función de servidor MCP remoto desde un cliente
            1. Conectarse al servidor MCP remoto en MCP Inspector
            2. Conectarse a un servidor MCP remoto en VS Code - GitHub Copilot
          2. Reimplementar su código
            1. Limpiar recursos
              1. Código fuente
                1. Próximos pasos

                  Related MCP Servers

                  • A
                    security
                    A
                    license
                    A
                    quality
                    A MCP server for managing and storing code snippets in various programming languages, allowing users to create, list, and delete snippets via a standardized interface.
                    Last updated -
                    3
                    4
                    JavaScript
                    MIT License
                  • -
                    security
                    A
                    license
                    -
                    quality
                    An MCP server that wraps the Azure CLI. As LLMs are very good at generating Azure CLI commands, this server allows your LLM to list resources, update/create/delete them, fix errors (by looking at the logs), fix security issues...
                    Last updated -
                    61
                    MIT License
                    • Linux
                    • Apple
                  • -
                    security
                    A
                    license
                    -
                    quality
                    An MCP server for interacting with Azure. Contains some common Compute and Networking actions, and extensible to add many more.
                    Last updated -
                    Python
                    Apache 2.0

                  View all related MCP servers

                  MCP directory API

                  We provide all the information about MCP servers via our MCP API.

                  curl -X GET 'https://glama.ai/api/mcp/v1/servers/Azure-Samples/remote-mcp-functions-typescript'

                  If you have feedback or need assistance with the MCP directory API, please join our Discord server