Bagikan melalui


Mulai cepat: Membangun server MCP jarak jauh kustom menggunakan Azure Functions

Dalam panduan memulai cepat ini, Anda membuat server Protokol Konteks Model (MCP) kustom jarak jauh dari proyek templat menggunakan Azure Developer CLI (azd). Server MCP menggunakan ekstensi server MCP Azure Functions untuk menyediakan alat untuk model, agen, dan asisten AI. Setelah menjalankan proyek secara lokal dan memverifikasi kode Anda menggunakan GitHub Copilot, Anda menyebarkannya ke aplikasi fungsi tanpa server baru di Azure Functions yang mengikuti praktik terbaik saat ini untuk penyebaran yang aman dan dapat diskalakan.

Tip

Functions juga memungkinkan Anda untuk menyebarkan proyek kode server MCP yang ada ke aplikasi paket Konsumsi Flex tanpa harus membuat perubahan pada proyek kode Anda. Untuk informasi selengkapnya, lihat Mulai Cepat: Menghosting server MCP yang ada di Azure Functions.

Karena aplikasi baru berjalan pada paket Konsumsi Flex, yang mengikuti model penagihan bayar untuk apa yang Anda gunakan, menyelesaikan panduan memulai cepat ini hanya menghabiskan biaya kecil beberapa sen USD atau kurang di akun Azure Anda.

Penting

Membuat server MCP kustom didukung untuk semua bahasa pemrograman Functions, namun skenario mulai cepat ini contohnya hanya ada untuk C#, Python, dan TypeScript. Untuk menyelesaikan panduan cepat ini, di bagian atas artikel, pilih salah satu bahasa yang didukung.

Artikel ini mendukung model pemrograman Node.js versi 4 untuk Azure Functions.

Artikel ini mendukung model pemrograman Python versi 2 untuk Azure Functions.

Prasyarat

  • Kit Pengembang Java 17
    • Jika Anda menggunakan versi Java lain yang didukung, Anda harus memperbarui file pom.xml proyek.
    • Atur JAVA_HOME variabel lingkungan ke lokasi penginstalan versi Java Development Kit (JDK) yang benar.
  • Apache Maven 3.8.x

Menginisialisasi proyek

azd init Gunakan perintah untuk membuat proyek kode Azure Functions lokal dari templat.

  1. Di Visual Studio Code, buka folder atau ruang kerja tempat Anda ingin membuat proyek.
  1. Di Terminal, jalankan perintah ini azd init :

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

    Perintah ini menarik file proyek dari repositori templat dan menginisialisasi proyek di folder saat ini. Bendera -e menetapkan nama untuk lingkungan saat ini. Di azd, lingkungan mempertahankan konteks penyebaran unik untuk aplikasi Anda, dan Anda dapat menentukan lebih dari satu. Ini juga digunakan dalam nama grup sumber daya yang Anda buat di Azure.

  1. Di terminal lokal atau prompt perintah Anda, jalankan perintah ini azd init :

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

    Perintah ini menarik file proyek dari repositori templat dan menginisialisasi proyek di folder saat ini. Bendera -e menetapkan nama untuk lingkungan saat ini. Di azd, lingkungan mempertahankan konteks penyebaran unik untuk aplikasi Anda, dan Anda dapat menentukan lebih dari satu. Ini juga digunakan dalam nama sumber daya yang Anda buat di Azure.

  1. Di terminal lokal atau prompt perintah Anda, jalankan perintah ini azd init :

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

    Perintah ini menarik file proyek dari repositori templat dan menginisialisasi proyek di folder saat ini. Bendera -e menetapkan nama untuk lingkungan saat ini. Di azd, lingkungan mempertahankan konteks penyebaran unik untuk aplikasi Anda, dan Anda dapat menentukan lebih dari satu. Ini juga digunakan dalam nama sumber daya yang Anda buat di Azure.

  1. Di terminal lokal atau prompt perintah Anda, jalankan perintah ini azd init :

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

    Perintah ini menarik file proyek dari repositori templat dan menginisialisasi proyek di folder saat ini. Bendera -e menetapkan nama untuk lingkungan saat ini. Di azd, lingkungan mempertahankan konteks penyebaran unik untuk aplikasi Anda, dan Anda dapat menentukan lebih dari satu. Ini juga digunakan dalam nama sumber daya yang Anda buat di Azure.

Memulai emulator penyimpanan

Gunakan emulator Azurite untuk mensimulasikan koneksi akun Azure Storage saat menjalankan proyek kode Anda secara lokal.

  1. Jika Anda belum melakukannya, instal Azurite.

  2. Tekan F1. Di palet perintah, cari dan jalankan perintah Azurite: Start untuk memulai emulator penyimpanan lokal.

Jalankan server MCP Anda secara lokal

Visual Studio Code terintegrasi dengan alat Azure Functions Core untuk memungkinkan Anda menjalankan proyek ini di komputer pengembangan lokal Anda dengan menggunakan emulator Azurite.

  1. Untuk memulai fungsi secara lokal, tekan F5 atau ikon Jalankan dan Debug di bilah Aktivitas sisi kiri. Panel Terminal menampilkan output dari Core Tools. Aplikasi Anda dimulai di panel Terminal , dan Anda dapat melihat nama fungsi yang berjalan secara lokal.

  2. Catat titik akhir server MCP lokal (seperti http://localhost:7071/runtime/webhooks/mcp), yang Anda gunakan untuk mengonfigurasi GitHub Copilot di Visual Studio Code.

Verifikasi menggunakan GitHub Copilot

Untuk memverifikasi kode Anda, tambahkan proyek yang sedang berjalan sebagai server MCP untuk GitHub Copilot di Visual Studio Code:

  1. Tekan F1. Di palet perintah, cari dan jalankan MCP: Tambahkan Server.

  2. Pilih HTTP (Server-Sent Events) untuk jenis transport.

  3. Masukkan URL titik akhir MCP yang Anda salin di langkah sebelumnya.

  4. Gunakan ID Server yang dihasilkan dan pilih Ruang Kerja untuk menyimpan koneksi server MCP ke pengaturan Ruang Kerja Anda.

  5. Buka palet perintah dan jalankan MCP: Daftar Server dan verifikasi bahwa server yang Anda tambahkan tercantum dan berjalan.

  6. Di obrolan Copilot, pilih mode Agen dan jalankan perintah ini:

    Say Hello
    

    Saat diminta untuk menjalankan alat, pilih Izinkan di Ruang Kerja ini sehingga Anda tidak perlu terus memberikan izin. Perintah dijalankan, mengembalikan Hello World respons, dan informasi mengenai eksekusi fungsi ditulis ke dalam log.

  7. Sekarang, pilih beberapa kode di salah satu file proyek Anda dan jalankan perintah ini:

    Save this snippet as snippet1
    

    Copilot menyimpan cuplikan dan merespons permintaan Anda dengan informasi tentang cara mengambil cuplikan dengan menggunakan getSnippets alat . Sekali lagi, Anda dapat meninjau eksekusi fungsi di log dan memverifikasi bahwa saveSnippets fungsi berjalan.

  8. Di Obrolan Copilot, jalankan prompt ini:

    Retrieve snippet1 and apply to NewFile
    

    Copilot mengambil cuplikan, menambahkannya ke file yang disebut NewFile, dan melakukan apa pun yang menurutnya diperlukan untuk membuat cuplikan kode berfungsi dalam proyek Anda. Log Functions menunjukkan bahwa endpoint getSnippets telah dipanggil.

  9. Setelah selesai menguji, tekan Ctrl+C untuk menghentikan host Functions.

Meninjau kode (opsional)

Anda dapat meninjau kode yang menentukan alat server MCP:

Kode fungsi untuk alat server MCP didefinisikan dalam src folder. Atribut McpToolTrigger mengekspos fungsi sebagai alat MCP Server:

[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;
    }
}

Anda dapat melihat templat proyek lengkap di repositori GitHub Azure Functions .NET MCP Server .

Kode fungsi untuk alat server MCP didefinisikan dalam src/main/java/com/function/ folder. Anotasi @McpToolTrigger mengekspos fungsi sebagai alat MCP Server:

            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

Anda dapat melihat templat proyek lengkap di repositori GitHub Azure Functions Java MCP Server .

Kode fungsi untuk alat server MCP didefinisikan dalam src/function_app.py file. Anotasi fungsi MCP mengekspos fungsi-fungsi ini sebagai alat MCP Server:

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"

Anda dapat melihat templat proyek lengkap di repositori GitHub Azure Functions Python MCP Server .

Kode fungsi untuk alat server MCP didefinisikan dalam src folder. Pendaftaran fungsi MCP mengekspos fungsi-fungsi ini sebagai alat MCP Server:

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;
}

Anda dapat melihat templat proyek lengkap di repositori GitHub Azure Functions TypeScript MCP Server .

Setelah memverifikasi alat server MCP secara lokal, Anda dapat menerbitkan proyek ke Azure.

Sebarkan ke Azure

Proyek ini dikonfigurasi untuk menggunakan azd up perintah untuk menyebarkan proyek ini ke aplikasi fungsi baru dalam paket Konsumsi Flex di Azure. Proyek ini mencakup sekumpulan file Bicep yang azd digunakan untuk membuat penyebaran aman ke dalam rencana konsumsi Flex yang mengikuti praktik terbaik.

  1. Di Visual Studio Code, tekan F1 untuk membuka palet perintah. Cari dan jalankan perintah Azure Developer CLI (azd): Package, Provison and Deploy (up). Kemudian, masuk dengan menggunakan akun Azure Anda.

  2. Jika Anda belum masuk, autentikasi dengan akun Azure Anda.

  3. Saat diminta, berikan parameter penyebaran yang diperlukan ini:

    Pengaturan Description
    langganan Azure Langganan tempat sumber daya Anda dibuat.
    Lokasi Azure Wilayah Azure untuk membuat grup sumber daya yang berisi sumber daya Azure baru. Hanya wilayah yang saat ini mendukung paket Konsumsi Flex yang ditampilkan.

    Setelah perintah berhasil diselesaikan, Anda akan melihat tautan ke sumber daya yang Anda buat.

Menyambungkan ke server MCP jarak jauh Anda

Server MCP Anda sekarang berjalan di Azure. Saat mengakses alat, Anda perlu menyertakan kunci sistem dalam permintaan Anda. Kunci ini menyediakan tingkat kontrol akses untuk klien yang mengakses server MCP jarak jauh Anda. Setelah mendapatkan kunci ini, Anda dapat menyambungkan GitHub Copilot ke server jarak jauh Anda.

  1. Jalankan skrip ini yang menggunakan azd dan Azure CLI untuk mencetak URL server MCP dan kunci sistem (mcp_extension) yang diperlukan untuk mengakses alat:

    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. Di Visual Studio Code, tekan F1 untuk membuka palet perintah, cari dan jalankan perintah MCP: Open Workspace Folder MCP Configuraton, yang membuka mcp.json file konfigurasi.

  3. mcp.json Dalam konfigurasi, temukan server MCP bernama yang Anda tambahkan sebelumnya, ubah url nilai ke URL server MCP jarak jauh Anda, dan tambahkan headers.x-functions-key elemen, yang berisi kunci akses server MCP yang disalin, seperti dalam contoh ini:

    {
        "servers": {
            "remote-mcp-function": {
                "type": "http",
                "url": "https://contoso.azurewebsites.net/runtime/webhooks/mcp",
                "headers": {
                    "x-functions-key": "A1bC2dE3fH4iJ5kL6mN7oP8qR9sT0u..."
                }
            }
        }
    }
    
  4. Pilih tombol Mulai di atas nama server Anda di tempat terbuka mcp.json untuk memulai ulang server MCP jarak jauh, kali ini menggunakan aplikasi yang Anda sebarkan.

Verifikasi penerapan Anda

Anda sekarang dapat meminta GitHub Copilot menggunakan alat MCP jarak jauh seperti yang Anda lakukan secara lokal, tetapi sekarang kode berjalan dengan aman di Azure. Putar ulang perintah yang sama dengan yang Anda gunakan sebelumnya untuk memastikan semuanya berfungsi dengan benar.

Membersihkan sumber daya

Setelah selesai bekerja dengan server MCP dan sumber daya terkait, gunakan perintah ini untuk menghapus aplikasi fungsi dan sumber daya terkait dari Azure untuk menghindari timbulnya biaya lebih lanjut:

azd down --no-prompt

Nota

Opsi ini --no-prompt menginstruksikan azd untuk menghapus grup sumber daya Anda tanpa konfirmasi dari Anda. Perintah ini tidak memengaruhi proyek kode lokal Anda.

Langkah selanjutnya