Aracılığıyla paylaş


Hızlı Başlangıç: Azure İşlevleri kullanarak özel bir uzak MCP sunucusu oluşturma

Bu hızlı başlangıçta, Azure Geliştirici CLI'sını () kullanarak bir şablon projesinden özel bir uzak Model Bağlam Protokolü (azdMCP) sunucusu oluşturacaksınız. MCP sunucusu, yapay zeka modelleri, aracıları ve yardımcıları için araçlar sağlamak üzere Azure İşlevleri MCP sunucu uzantısını kullanır. Projeyi yerel olarak çalıştırdıktan ve GitHub Copilot kullanarak kodunuzu doğruladıktan sonra, güvenli ve ölçeklenebilir dağıtımlar için geçerli en iyi yöntemleri izleyen Azure İşlevleri'nde yeni bir sunucusuz işlev uygulamasına dağıtırsınız.

Tip

İşlevler ayrıca, kod projenizde değişiklik yapmak zorunda kalmadan mevcut bir MCP sunucu kodu projesini Flex Consumption plan uygulamasına dağıtmanıza da olanak tanır. Daha fazla bilgi için bkz . Hızlı Başlangıç: Azure İşlevleri'ne mevcut MCP sunucularını barındırma.

Yeni uygulama kullandığın kadar öde faturalama modelini izleyen Flex Tüketim planında çalıştığından, bu hızlı başlangıcı tamamlamak Azure hesabınızda birkaç ABD sentinden daha az bir maliyete neden olur.

Önemli

Özel MCP sunucuları oluşturma tüm İşlevler dilleri için destekleniyor olsa da, bu hızlı başlangıç senaryosu şu anda yalnızca C#, Python ve TypeScript örneklerine sahiptir. Bu hızlı başlangıcı tamamlamak için makalenin üst kısmındaki desteklenen dillerden birini seçin.

Bu makale, Azure İşlevleri için Node.js programlama modelinin 4. sürümünü destekler.

Bu makale, Azure İşlevleri için Python programlama modelinin 2. sürümünü destekler.

Önkoşullar

  • .NET 8.0 SDK

Projeyi başlatma

azd init Komutunu kullanarak şablondan yerel bir Azure İşlevleri kod projesi oluşturun.

  1. Visual Studio Code'da, projenizi oluşturmak istediğiniz klasörü veya çalışma alanını açın.
  1. Terminalde şu azd init komutu çalıştırın:

    azd init --template remote-mcp-functions-dotnet -e mcpserver-dotnet
    

    Bu komut , proje dosyalarını şablon deposundan çeker ve projeyi geçerli klasörde başlatır. bayrağı geçerli -e ortam için bir ad ayarlar. ortamında azd, ortamınız uygulamanız için benzersiz bir dağıtım bağlamı tutar ve birden fazla dağıtım bağlamı tanımlayabilirsiniz. Ayrıca Azure'da oluşturduğunuz kaynak grubunun adında da kullanılır.

  1. Yerel terminalinizde veya komut isteminizde şu azd init komutu çalıştırın:

    azd init --template remote-mcp-functions-java -e mcpserver-java 
    

    Bu komut , proje dosyalarını şablon deposundan çeker ve projeyi geçerli klasörde başlatır. bayrağı geçerli -e ortam için bir ad ayarlar. ortamında azd, ortamınız uygulamanız için benzersiz bir dağıtım bağlamı tutar ve birden fazla dağıtım bağlamı tanımlayabilirsiniz. Ayrıca Azure'da oluşturduğunuz kaynakların adlarında da kullanılır.

  1. Yerel terminalinizde veya komut isteminizde şu azd init komutu çalıştırın:

    azd init --template remote-mcp-functions-typescript -e mcpserver-ts
    

    Bu komut , proje dosyalarını şablon deposundan çeker ve projeyi geçerli klasörde başlatır. bayrağı geçerli -e ortam için bir ad ayarlar. ortamında azd, ortamınız uygulamanız için benzersiz bir dağıtım bağlamı tutar ve birden fazla dağıtım bağlamı tanımlayabilirsiniz. Ayrıca Azure'da oluşturduğunuz kaynakların adlarında da kullanılır.

  1. Yerel terminalinizde veya komut isteminizde şu azd init komutu çalıştırın:

    azd init --template remote-mcp-functions-python -e mcpserver-python
    

    Bu komut , proje dosyalarını şablon deposundan çeker ve projeyi geçerli klasörde başlatır. bayrağı geçerli -e ortam için bir ad ayarlar. ortamında azd, ortamınız uygulamanız için benzersiz bir dağıtım bağlamı tutar ve birden fazla dağıtım bağlamı tanımlayabilirsiniz. Ayrıca Azure'da oluşturduğunuz kaynakların adlarında da kullanılır.

Depolama öykünücüsunu başlatma

Kod projenizi yerel olarak çalıştırırken Azure Depolama hesabı bağlantısının benzetimini yapmak için Azurite öykünücüsü kullanın.

  1. Henüz yapmadıysanız Azurite'yi yükleyin.

  2. F1 tuşuna basın. Komut paletinde, yerel depolama öykünücüsü başlatmak için komutunu Azurite: Start arayın ve çalıştırın.

MCP sunucunuzu yerel olarak çalıştırma

Visual Studio Code, Azurite öykünücüsü kullanarak bu projeyi yerel geliştirme bilgisayarınızda çalıştırmanıza olanak sağlamak için Azure functions core araçlarıyla tümleştirilir.

  1. İşlevi yerel olarak başlatmak için F5 tuşuna veya sol taraftaki Etkinlik çubuğundaki Çalıştır ve Hata Ayıkla simgesine basın. Terminal panelinde Core Tools'un çıkışı görüntülenir. Uygulamanız Terminal panelinde başlar ve yerel olarak çalışan işlevlerin adını görebilirsiniz.

  2. Visual Studio Code'da GitHub Copilot'ı yapılandırmak için kullandığınız yerel MCP sunucu uç noktasını (gibi http://localhost:7071/runtime/webhooks/mcp) not edin.

GitHub Copilot kullanarak doğrulama

Kodunuzu doğrulamak için, çalışan projeyi Visual Studio Code'da GitHub Copilot için MCP sunucusu olarak ekleyin:

  1. F1 tuşuna basın. Komut paletinde MCP: Sunucu Ekle'yi arayın ve çalıştırın.

  2. Aktarım türü için HTTP (Server-Sent Olaylar) öğesini seçin.

  3. Önceki adımda kopyaladığınız MCP uç noktasının URL'sini girin.

  4. Oluşturulan Sunucu Kimliğini kullanın ve Çalışma Alanı'nı seçerek MCP sunucusu bağlantısını Çalışma Alanı ayarlarınıza kaydedin.

  5. Komut paletini açın ve MCP: Sunucuları Listele'yi çalıştırın ve eklediğiniz sunucunun listelendiğini ve çalıştığını doğrulayın.

  6. Copilot sohbetinde Aracı modu'nu seçin ve şu istemi çalıştırın:

    Say Hello
    

    Aracı çalıştırmanız istendiğinde, izin vermek zorunda kalmamak için Bu Çalışma Alanında İzin Ver'i seçin. İstem çalışır ve bir Hello World yanıt döndürür ve işlev yürütme bilgileri günlüklere yazılır.

  7. Şimdi proje dosyalarınızdan bir kod seçin ve şu istemi çalıştırın:

    Save this snippet as snippet1
    

    Copilot, kod parçacığını depolar ve getSnippets aracını kullanarak parçacığı nasıl alacağınıza dair bilgiyle isteğinize yanıt verir. Yine günlüklerde işlev yürütmesini gözden geçirebilir ve işlevin saveSnippets çalıştığını doğrulayabilirsiniz.

  8. Copilot sohbetinde şu istemi çalıştırın:

    Retrieve snippet1 and apply to NewFile
    

    Copilot kod parçacıklarını alır, adlı NewFilebir dosyaya ekler ve kod parçacığının projenizde çalışması için gereken her şeyi yapar. Functions günlükleri, getSnippets uç noktasının çağrıldığını gösteriyor.

  9. Sınamayı bitirdiğinizde, İşlevler ana bilgisayarını durdurmak için Ctrl+C tuşlarına basın.

Kodu gözden geçirme (isteğe bağlı)

MCP sunucu araçlarını tanımlayan kodu gözden geçirebilirsiniz:

MCP sunucu araçlarının işlev kodu klasörde src tanımlanır. özniteliği, McpToolTrigger işlevleri MCP Server araçları olarak kullanıma sunar:

[Function(nameof(SayHello))]
public string SayHello(
    [McpToolTrigger(HelloToolName, HelloToolDescription)] ToolInvocationContext context
)
{
    logger.LogInformation("Saying hello");
    return "Hello I am MCP Tool!";
}
    [Function(nameof(GetSnippet))]
    public object GetSnippet(
        [McpToolTrigger(GetSnippetToolName, GetSnippetToolDescription)]
            ToolInvocationContext context,
        [BlobInput(BlobPath)] string snippetContent
    )
    {
        return snippetContent;
    }

    [Function(nameof(SaveSnippet))]
    [BlobOutput(BlobPath)]
    public string SaveSnippet(
        [McpToolTrigger(SaveSnippetToolName, SaveSnippetToolDescription)]
            ToolInvocationContext context,
        [McpToolProperty(SnippetNamePropertyName, SnippetNamePropertyDescription, true)]
            string name,
        [McpToolProperty(SnippetPropertyName, SnippetPropertyDescription, true)]
            string snippet
    )
    {
        return snippet;
    }
}

Proje şablonunun tamamını Azure İşlevleri .NET MCP Sunucusu GitHub deposunda görüntüleyebilirsiniz.

MCP sunucu araçlarının işlev kodu klasörde src/main/java/com/function/ tanımlanır. Ek @McpToolTrigger açıklama, işlevleri MCP Server araçları olarak kullanıma sunar:

            description = "The messages to be logged.",
            isRequired = true,
            isArray = true)
        String messages,
        final ExecutionContext functionExecutionContext
) {
    functionExecutionContext.getLogger().info("Hello, World!");
    functionExecutionContext.getLogger().info("Tool Name: " + mcpToolInvocationContext.getName());
    functionExecutionContext.getLogger().info("Transport Type: " + mcpToolInvocationContext.getTransportType());
    
    // Handle different transport types
    if (mcpToolInvocationContext.isHttpStreamable()) {
        functionExecutionContext.getLogger().info("Session ID: " + mcpToolInvocationContext.getSessionid());
    } else if (mcpToolInvocationContext.isHttpSse()) {
        if (mcpToolInvocationContext.getClientinfo() != null) {
            functionExecutionContext.getLogger().info("Client: " + 
                mcpToolInvocationContext.getClientinfo().get("name").getAsString() + " v" +
    // Write the snippet content to the output blob
    outputBlob.setValue(snippet);
    
    return "Successfully saved snippet '" + snippetName + "' with " + snippet.length() + " characters.";
}

/**
 * Azure Function that handles retrieving a text snippet from Azure Blob Storage.
 * <p>
 * The function is triggered by an MCP Tool Trigger. The snippet name is provided
 * as an MCP tool property, and the snippet content is read from the blob at the 
 * path derived from the snippet name.
 *
 * @param mcpToolInvocationContext The JSON input from the MCP tool trigger.
 * @param snippetName   The name of the snippet to retrieve, provided as an MCP tool property.
 * @param inputBlob     The Azure Blob input binding that fetches the snippet content.
 * @param functionExecutionContext       The execution context for logging.
 */
@FunctionName("GetSnippets")
@StorageAccount("AzureWebJobsStorage")
public String getSnippet(
        @McpToolTrigger(
            name = "getSnippets",
            description = "Gets a text snippet from your snippets collection.")
        String mcpToolInvocationContext,
        @McpToolProperty(
            name = SNIPPET_NAME_PROPERTY_NAME,
            propertyType = "string",
            description = "The name of the snippet.",
            isRequired = true)
        String snippetName,
        @BlobInput(name = "inputBlob", path = BLOB_PATH)
        String inputBlob,
        final ExecutionContext functionExecutionContext
) {
    // Log the entire incoming JSON for debugging
    functionExecutionContext.getLogger().info(mcpToolInvocationContext);

    // Log the snippet name and the fetched snippet content from the blob

Proje şablonunun tamamını Azure İşlevleri Java MCP Sunucusu GitHub deposunda görüntüleyebilirsiniz.

MCP sunucu araçlarının işlev kodu dosyasında tanımlanır src/function_app.py . MCP işlevi ek açıklamaları şu işlevleri MCP Server araçları olarak kullanıma sunar:

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:
    """

@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"

Proje şablonunun tamamını Azure İşlevleri Python MCP Sunucusu GitHub deposunda görüntüleyebilirsiniz.

MCP sunucu araçlarının işlev kodu klasörde src tanımlanır. MCP işlev kaydı, şu işlevleri MCP Server araçları olarak kullanıma sunar:

export async function mcpToolHello(_toolArguments:unknown, context: InvocationContext): Promise<string> {
    console.log(_toolArguments);
    // Get name from the tool arguments
    const mcptoolargs = context.triggerMetadata.mcptoolargs as {
        name?: string;
    };
    const name = mcptoolargs?.name;

    console.info(`Hello ${name}, I am MCP Tool!`);
    
    return `Hello ${name || 'World'}, 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.',
    toolProperties:{
        name: arg.string().describe('Required property to identify the caller.').optional()
    },
    handler: mcpToolHello
});
// SaveSnippet function - saves a snippet with a name
export async function saveSnippet(
  _toolArguments: 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;
}

Proje şablonunun tamamını Azure İşlevleri TypeScript MCP Sunucusu GitHub deposunda görüntüleyebilirsiniz.

MCP sunucu araçlarını yerel olarak doğruladıktan sonra projeyi Azure'da yayımlayabilirsiniz.

Azure’a dağıtın

Bu proje, bu projeyi Azure'daki Flex Consumption planındaki yeni bir işlev uygulamasına dağıtmak için komutunu kullanacak azd up şekilde yapılandırılmıştır. Proje, en iyi yöntemleri izleyen azd bir Flex tüketim planına güvenli dağıtım oluşturmak için kullanan bir bicep dosyaları kümesi içerir.

  1. Visual Studio Code'da F1 tuşuna basarak komut paletini açın. komutunu Azure Developer CLI (azd): Package, Provison and Deploy (up)arayın ve çalıştırın. Ardından Azure hesabınızı kullanarak oturum açın.

  2. Henüz oturum açmadıysanız Azure hesabınızla kimlik doğrulaması.

  3. İstendiğinde şu gerekli dağıtım parametrelerini sağlayın:

    Parametre Description
    Azure aboneliği Kaynaklarınızın oluşturulduğu abonelik.
    Azure konumu Yeni Azure kaynaklarını içeren kaynak grubunun oluşturulacağı Azure bölgesi. Yalnızca şu anda Esnek Tüketim planını destekleyen bölgeler gösterilir.

    Komut başarıyla tamamlandıktan sonra, oluşturduğunuz kaynakların bağlantılarını görürsünüz.

Uzak MCP sunucunuza bağlanma

MCP sunucunuz artık Azure'da çalışıyor. Araçlara eriştiğinizde isteğinize bir sistem anahtarı eklemeniz gerekir. Bu anahtar, uzak MCP sunucunuza erişen istemciler için bir erişim denetimi derecesi sağlar. Bu anahtarı aldıktan sonra GitHub Copilot'ı uzak sunucunuza bağlayabilirsiniz.

  1. Araçlara erişmek için gereken hem MCP sunucu URL'sini hem de sistem anahtarını yazdırmak amacıyla azd ve Azure CLI kullanan bu betiği çalıştırın:

    eval $(azd env get-values --output dotenv)
    MCP_EXTENSION_KEY=$(az functionapp keys list --resource-group $AZURE_RESOURCE_GROUP \
        --name $AZURE_FUNCTION_NAME --query "systemKeys.mcp_extension" -o tsv)
    printf "MCP Server URL: %s\n" "https://$SERVICE_API_NAME.azurewebsites.net/runtime/webhooks/mcp"
    printf "MCP Server key: %s\n" "$MCP_EXTENSION_KEY"
    
  2. Visual Studio Code'da F1 tuşuna basarak komut paletini açın, komutunu arayın ve komutunu çalıştırın MCP: Open Workspace Folder MCP Configuraton. Bu komut, yapılandırma dosyasını açar mcp.json .

  3. Yapılandırmada, daha önce eklediğiniz adlandırılmış mcp.json MCP sunucusunu bulun. Uzak MCP sunucu URL'nizi url değeri yerine yazın ve kopyalanan MCP sunucu erişim anahtarınızı içerecek şekilde bir headers.x-functions-key öğesi ekleyin, örnek olarak:

    {
        "servers": {
            "remote-mcp-function": {
                "type": "http",
                "url": "https://contoso.azurewebsites.net/runtime/webhooks/mcp",
                "headers": {
                    "x-functions-key": "A1bC2dE3fH4iJ5kL6mN7oP8qR9sT0u..."
                }
            }
        }
    }
    
  4. Bu kez dağıtılan uygulamanızı kullanarak uzak MCP sunucusunu yeniden başlatmak için açıkta sunucu adınızın üzerindeki mcp.json düğmesini seçin.

Dağıtımınızı doğrulayın

GitHub Copilot'un artık yerel ortamda yaptığınız gibi uzak MCP araçlarınızı kullanmasını sağlayabilirsiniz, ancak artık kod Azure'da güvenli bir şekilde çalışır. Her şeyin düzgün çalıştığından emin olmak için daha önce kullandığınız komutları yeniden yürütebilirsiniz.

Kaynakları temizle

MCP sunucunuzla ve ilgili kaynaklarla çalışmayı bitirdiğinizde, daha fazla maliyet oluşmasını önlemek için bu komutu kullanarak işlev uygulamasını ve ilgili kaynaklarını Azure'dan silin:

azd down --no-prompt

Uyarı

--no-prompt seçeneği, azd'e kaynak grubunuzu sizden onay almadan silmesi talimatını verir. Bu komut yerel kod projenizi etkilemez.

Sonraki Adımlar