Skip to main content
Glama

Remote MCP with Azure Functions

MIT License
function_app.py4.36 kB
import json import logging import azure.functions as func app = func.FunctionApp(http_auth_level=func.AuthLevel.FUNCTION) # Constants for the Azure Blob Storage container, file, and blob path _SNIPPET_NAME_PROPERTY_NAME = "snippetname" _SNIPPET_PROPERTY_NAME = "snippet" _BLOB_PATH = "snippets/{mcptoolargs." + _SNIPPET_NAME_PROPERTY_NAME + "}.json" class ToolProperty: def __init__(self, property_name: str, property_type: str, description: str): self.propertyName = property_name self.propertyType = property_type self.description = description def to_dict(self): return { "propertyName": self.propertyName, "propertyType": self.propertyType, "description": self.description, } # Define the tool properties using the ToolProperty class tool_properties_save_snippets_object = [ ToolProperty(_SNIPPET_NAME_PROPERTY_NAME, "string", "The name of the snippet."), ToolProperty(_SNIPPET_PROPERTY_NAME, "string", "The content of the snippet."), ] tool_properties_get_snippets_object = [ToolProperty(_SNIPPET_NAME_PROPERTY_NAME, "string", "The name of the snippet.")] # Convert the tool properties to JSON tool_properties_save_snippets_json = json.dumps([prop.to_dict() for prop in tool_properties_save_snippets_object]) tool_properties_get_snippets_json = json.dumps([prop.to_dict() for prop in tool_properties_get_snippets_object]) @app.generic_trigger( arg_name="context", type="mcpToolTrigger", toolName="hello_mcp", description="Hello world.", toolProperties="[]", ) def hello_mcp(context) -> None: """ A simple function that returns a greeting message. Args: context: The trigger context (not used in this function). Returns: str: A greeting message. """ return "Hello I am MCPTool!" @app.generic_trigger( arg_name="context", type="mcpToolTrigger", toolName="get_snippet", description="Retrieve a snippet by name.", toolProperties=tool_properties_get_snippets_json, ) @app.generic_input_binding(arg_name="file", type="blob", connection="AzureWebJobsStorage", path=_BLOB_PATH) def get_snippet(file: func.InputStream, context) -> str: """ Retrieves a snippet by name from Azure Blob Storage. Args: file (func.InputStream): The input binding to read the snippet from Azure Blob Storage. context: The trigger context containing the input arguments. Returns: str: The content of the snippet or an error message. """ snippet_content = file.read().decode("utf-8") logging.info(f"Retrieved snippet: {snippet_content}") return snippet_content @app.generic_trigger( arg_name="context", type="mcpToolTrigger", toolName="save_snippet", description="Save a snippet with a name.", toolProperties=tool_properties_save_snippets_json, ) @app.generic_output_binding(arg_name="file", type="blob", connection="AzureWebJobsStorage", path=_BLOB_PATH) def save_snippet(file: func.Out[str], context) -> str: content = json.loads(context) snippet_name_from_args = content["arguments"][_SNIPPET_NAME_PROPERTY_NAME] snippet_content_from_args = content["arguments"][_SNIPPET_PROPERTY_NAME] if not snippet_name_from_args: return "No snippet name provided" if not snippet_content_from_args: return "No snippet content provided" file.set(snippet_content_from_args) logging.info(f"Saved snippet: {snippet_content_from_args}") return f"Snippet '{snippet_content_from_args}' saved successfully" @app.route(route="HelloFunction", auth_level=func.AuthLevel.ANONYMOUS) def HelloFunction(req: func.HttpRequest) -> func.HttpResponse: logging.info('Python HTTP trigger function processed a request.') name = req.params.get('name') if not name: try: req_body = req.get_json() except ValueError: pass else: name = req_body.get('name') if name: return func.HttpResponse(f"Hello, {name}. This HTTP triggered function executed successfully.") else: return func.HttpResponse( "This HTTP triggered function executed successfully. Pass a name in the query string or in the request body for a personalized response.", status_code=200 )

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/pravin22kumar/MCP'

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