Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этом начальном руководстве вы создадите настраиваемый удалённый сервер протокола контекста модели (MCP) на основе шаблонного проекта с помощью CLI разработчика Azure (azd). Этот сервер MCP использует расширение сервера MCP Функции Azure MCP для предоставления средств для моделей ИИ, агентов и помощников. Вы также можете использовать расширение сервера MCP для создания интерактивных приложений MCP.
После локального запуска проекта и проверки кода с помощью GitHub Copilot вы развернете его в новом бессерверном приложении-функции в Функции Azure, следуя текущим рекомендациям по безопасным и масштабируемым развертываниям.
Поскольку новое приложение работает на тарифном плане потребления Flex, который использует модель выставления счетов оплата за использование, выполнение этого краткого руководства может повлечь за собой небольшие расходы в размере нескольких центов или меньше на вашем аккаунте Azure.
Это важно
Хотя создание пользовательских серверов MCP поддерживается для всех языков функций, этот краткий сценарий в настоящее время содержит только примеры для C#, Java, JavaScript, Python и TypeScript. Чтобы завершить работу с этим кратким руководством, выберите один из этих поддерживаемых языков в верхней части статьи.
Эта статья поддерживает версию 4 модели программирования Node.js для Функции Azure.
Эта статья поддерживает версию 2 модели программирования Python для Функции Azure.
Предпосылки
Visual Studio Code с этими расширениями:
расширение Функции Azure. Для этого расширения требуется Функции Azure Core Tools и пытается установить его, если он недоступен.
расширение CLI для разработчиков Azure.
Azure CLI. Вы также можете выполнять команды Azure CLI в Azure Cloud Shell.
Учетная запись Azure с активной подпиской. Создайте учетную запись бесплатно .
Инициализируйте проект
Используйте команду azd init для создания локального проекта кода Функции Azure из шаблона.
- В Visual Studio Code откройте папку или рабочую область, в которой вы хотите создать проект.
В терминале выполните следующую
azd initкоманду:azd init --template remote-mcp-functions-dotnet -e mcpserver-dotnetЭта команда извлекает файлы проекта из репозитория template и инициализирует проект в текущей папке. Флаг
-eзадает имя текущей среды. Вazdсреде поддерживается уникальный контекст развертывания для вашего приложения, и вы можете определить более одного контекста. Это также часть имени группы ресурсов, создаваемой в Azure.
В локальном терминале или командной строке выполните следующую
azd initкоманду:azd init --template remote-mcp-functions-java -e mcpserver-javaЭта команда извлекает файлы проекта из репозитория template и инициализирует проект в текущей папке. Флаг
-eзадает имя текущей среды. Вazdсреде поддерживается уникальный контекст развертывания для вашего приложения, и вы можете определить более одного контекста. Это также часть имен ресурсов, создаваемых в Azure.
В локальном терминале или командной строке выполните следующую
azd initкоманду:azd init --template remote-mcp-functions-javascript -e mcpserver-jsЭта команда извлекает файлы проекта из репозитория template и инициализирует проект в текущей папке. Флаг
-eзадает имя текущей среды. Вazdсреде поддерживается уникальный контекст развертывания для вашего приложения, и вы можете определить более одного контекста. Это также часть имен ресурсов, создаваемых в Azure.
В локальном терминале или командной строке выполните следующую
azd initкоманду:azd init --template remote-mcp-functions-typescript -e mcpserver-tsЭта команда извлекает файлы проекта из репозитория template и инициализирует проект в текущей папке. Флаг
-eзадает имя текущей среды. Вazdсреде поддерживается уникальный контекст развертывания для вашего приложения, и вы можете определить более одного контекста. Это также часть имен ресурсов, создаваемых в Azure.
В локальном терминале или командной строке выполните следующую
azd initкоманду:azd init --template remote-mcp-functions-python -e mcpserver-pythonЭта команда извлекает файлы проекта из репозитория template и инициализирует проект в текущей папке. Флаг
-eзадает имя текущей среды. Вazdсреде поддерживается уникальный контекст развертывания для вашего приложения, и вы можете определить более одного контекста. Это также часть имен ресурсов, создаваемых в Azure.
Запуск эмулятора хранилища
Используйте эмулятор Azurite, чтобы имитировать подключение учетной записи служба хранилища Azure при локальном запуске проекта кода.
Если вы еще не сделали этого, установите Azurite.
Нажмите клавишу F1. В палитре команд найдите и запустите команду
Azurite: Start, чтобы запустить локальный эмулятор хранилища.
Локальное выполнение сервера MCP
В окне терминала перейдите в папку FunctionsMcpTool проекта:
cd src/FunctionsMcpTool
В окне терминала перейдите в папку FunctionsMcpTool проекта:
cd samples/FunctionsMcpTool
Visual Studio Code интегрируется с средствами Функции Azure Core, чтобы позволить запускать этот проект на локальном компьютере разработки. Чтобы запустить приложение "Функции" локально, нажмите клавишу F5 или щелкните значок запуска и отладки в левой строке действий.
На панели терминала отображаются выходные данные основных инструментов. Приложение запускается на панели терминала , и вы можете увидеть имена функций, выполняемых локально.
Проверка с помощью GitHub Copilot
Шаблон проекта включает файл .vscode/mcp.json, который уже определяет сервер local-mcp-function, указывающий на вашу локальную конечную точку MCP. Используйте эту конфигурацию для проверки кода с помощью GitHub Copilot в Visual Studio Code:
.vscode/mcp.jsonОткройте файл и нажмите кнопку "Пуск" надlocal-mcp-functionконфигурацией.В окне Copilot Chat убедитесь, что выбран режим Agent, выберите значок Configure tools, и проверьте, что
MCP Server:local-mcp-functionвключен в чате.Выполните следующую команду:
Say HelloПри появлении запроса на запуск средства нажмите кнопку "Разрешить в этой рабочей области ", чтобы вам не нужно предоставлять разрешение. Запрос выполняется и возвращает
Hello Worldответ, а информация о выполнении функции записывается в журналы.Теперь выберите код в одном из файлов проекта и выполните следующую команду:
Save this snippet as snippet1Copilot хранит фрагмент кода и отвечает на запрос с информацией о том, как получить фрагмент с помощью средства
getSnippets. Опять же, можно просмотреть выполнение функции в журналах и убедиться, что функция запущенаsaveSnippets.В чате Copilot выполните следующую команду:
Retrieve snippet1 and apply to NewFileCopilot извлекает фрагменты кода, добавляет его в файл с именем
NewFileи выполняет все остальные действия, необходимые для работы фрагмента кода в проекте. В журналах функций показано, чтоgetSnippetsконечная точка была вызвана.После завершения тестирования нажмите клавиши CTRL+C, чтобы остановить хост функций.
Просмотр кода (необязательно)
Вы можете просмотреть код, определяющий средства сервера MCP:
Код функции для средств сервера MCP определен в папке src/functions . Регистрация функции MCP предоставляет эти функции в качестве средств СЕРВЕРА MCP:
const PROPERTY_TYPE = "string";
// Hello function - responds with hello message
async function mcpToolHello(_toolArguments, context) {
console.log(_toolArguments);
// Get name from the tool arguments
const mcptoolargs = context.triggerMetadata.mcptoolargs;
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.',
const mcptoolargs = context.triggerMetadata.mcptoolargs;
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 GetSnippet tool
app.mcpTool("getSnippet", {
toolName: GET_SNIPPET_TOOL_NAME,
description: GET_SNIPPET_TOOL_DESCRIPTION,
toolProperties: {
[SNIPPET_NAME_PROPERTY_NAME]: arg.string().describe(SNIPPET_NAME_PROPERTY_DESCRIPTION)
},
extraInputs: [blobInputBinding],
handler: getSnippet,
});
Полный шаблон проекта можно посмотреть в репозитории GitHub Функции Azure JavaScript MCP Server.
Код функции для средств сервера MCP определен в папке src . Атрибут McpToolTrigger предоставляет функции в виде средств MCP Server:
[Function(nameof(SayHello))]
public string SayHello(
[McpToolTrigger(HelloToolName, HelloToolDescription)] ToolInvocationContext context
)
{
logger.LogInformation("C# MCP tool trigger function processed a request.");
return "Hello I am MCP Tool!";
}
public class SnippetsTool(ILogger<SnippetsTool> logger)
{
private const string BlobPath = "snippets/{mcptoolargs.Name}.json";
private static BlobServiceClient GetBlobServiceClient() =>
new(Environment.GetEnvironmentVariable("AzureWebJobsStorage"));
[Function(nameof(GetSnippet))]
public Snippet? GetSnippet(
[McpToolTrigger(GetSnippetToolName, GetSnippetToolDescription)]
ToolInvocationContext context,
[McpToolProperty(SnippetNamePropertyName, SnippetNamePropertyDescription, true)]
string name,
[BlobInput(BlobPath)] string? snippetContent
)
{
if (snippetContent is null)
{
return null;
}
return new Snippet { Name = name, Content = snippetContent };
}
Полный шаблон проекта можно просмотреть в репозитории Функции Azure .NET MCP Server GitHub.
Код функции для средств сервера MCP определен в папке samples/FunctionsMcpTool/src/main/java/com/function/ . Заметка @McpToolTrigger предоставляет функции в виде средств MCP Server:
@FunctionName("HelloWorld")
public String logCustomTriggerInput(
@McpToolTrigger(
name = "helloWorld",
description = "Says hello and logs the messages that are provided.")
McpToolInvocationContext mcpToolInvocationContext,
@McpToolProperty(
name = "messages",
propertyType = "string",
description = "The messages to be logged.",
isRequired = true,
isArray = true)
String messages,
final ExecutionContext functionExecutionContext
) {
@FunctionName("SaveSnippets")
@StorageAccount("AzureWebJobsStorage")
public String saveSnippet(
@McpToolTrigger(
name = "saveSnippets",
description = "Saves a text snippet to your snippets collection.")
String mcpToolInvocationContext,
@McpToolProperty(
name = SNIPPET_NAME_PROPERTY_NAME,
propertyType = "string",
description = "The name of the snippet.",
isRequired = true)
String snippetName,
@McpToolProperty(
name = SNIPPET_PROPERTY_NAME,
propertyType = "string",
description = "The content of the snippet.",
isRequired = true)
String snippet,
@BlobOutput(name = "outputBlob", path = BLOB_PATH)
OutputBinding<String> outputBlob,
final ExecutionContext functionExecutionContext
) {
// Log the entire incoming JSON for debugging
functionExecutionContext.getLogger().info(mcpToolInvocationContext);
// Log the snippet name and content
functionExecutionContext.getLogger().info("Saving snippet with name: " + snippetName);
functionExecutionContext.getLogger().info("Snippet content:\n" + snippet);
// Write the snippet content to the output blob
outputBlob.setValue(snippet);
return "Successfully saved snippet '" + snippetName + "' with " + snippet.length() + " characters.";
Полный шаблон проекта можно просмотреть в репозитории Функции Azure Java MCP Server GitHub.
Код функции для серверных средств MCP определен в src/function_app.py файле. Аннотации функций MCP представляют эти функции как инструменты сервера MCP.
from hello_tool_with_auth import bp as auth_bp
app.register_blueprint(auth_bp)
# Constants for the Azure Blob Storage container, file, and blob path
_SNIPPET_NAME_PROPERTY_NAME = "snippetname"
_BLOB_PATH = "snippets/{mcptoolargs." + _SNIPPET_NAME_PROPERTY_NAME + "}.json"
"""Hello world."""
return "Hello I am MCPTool!"
@app.mcp_tool()
@app.mcp_tool_property(arg_name="snippetname", description="The name of the snippet.")
@app.blob_input(arg_name="file", connection="AzureWebJobsStorage", path=_BLOB_PATH)
def get_snippet(file: func.InputStream, snippetname: str) -> str:
"""Retrieve a snippet by name from Azure Blob Storage."""
snippet_content = file.read().decode("utf-8")
logging.info(f"Retrieved snippet: {snippet_content}")
return snippet_content
@app.mcp_tool()
Полный шаблон проекта можно просмотреть в репозитории Функции Azure Python MCP Server GitHub.
Код функции для средств сервера MCP определен в папке mcp-tools/src . Регистрация функции MCP предоставляет эти функции в качестве средств СЕРВЕРА MCP:
// Hello function - responds with hello message
export async function mcpToolHello(_toolArguments: unknown, context: InvocationContext): Promise<string> {
const mcptoolargs = context.triggerMetadata.mcptoolargs as {
name?: string;
};
const name = mcptoolargs?.name;
context.log(`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 responds with a hello message.',
toolProperties: {
name: arg.string().describe('Required property to identify the caller.').optional()
},
handler: mcpToolHello
});
// Register the GetSnippet tool
app.mcpTool("getSnippet", {
toolName: GET_SNIPPET_TOOL_NAME,
description: GET_SNIPPET_TOOL_DESCRIPTION,
toolProperties: {
[SNIPPET_NAME_PROPERTY_NAME]: arg.string().describe(SNIPPET_NAME_PROPERTY_DESCRIPTION)
},
extraInputs: [blobInputBinding],
handler: getSnippet,
});
// Register the SaveSnippet tool
app.mcpTool("saveSnippet", {
toolName: SAVE_SNIPPET_TOOL_NAME,
description: SAVE_SNIPPET_TOOL_DESCRIPTION,
toolProperties: {
[SNIPPET_NAME_PROPERTY_NAME]: arg.string().describe(SNIPPET_NAME_PROPERTY_DESCRIPTION),
[SNIPPET_PROPERTY_NAME]: arg.string().describe(SNIPPET_PROPERTY_DESCRIPTION)
},
extraOutputs: [blobOutputBinding],
handler: saveSnippet,
});
Вы можете просмотреть полный шаблон проекта в репозитории Функции Azure TypeScript MCP Server GitHub.
После локальной проверки средств сервера MCP можно опубликовать проект в Azure.
Развертывание в Azure
Этот проект настроен для использования azd для развертывания этого проекта в новом приложении-функции в плане потребления Flex в Azure. Проект включает набор файлов Bicep, которые azd используются для создания безопасного развертывания в плане Flex Consumption, который следует передовым методам.
В Visual Studio Code нажмите клавишу F1, чтобы открыть палитру команд. Найдите и выполните команду
Azure Developer CLI (azd): Package, Provision and Deploy (up). Затем войдите с помощью учетной записи Azure.При появлении запроса выберите следующие необходимые параметры развертывания:
Параметр Description подписка Azure Подписка, в которой создаются ресурсы. расположение Azure Azure регионе, в котором создается группа ресурсов, содержащая новые Azure ресурсы. Отображаются только регионы, поддерживающие план потребления Flex. vnetEnabled False, чтобы пропустить создание ресурсов виртуальной сети, что упрощает развертывание.После успешного завершения команды вы увидите ссылки на созданные ресурсы.
Подключение к удаленному серверу MCP
Сервер MCP теперь работает в Azure. Шаблон проекта содержит запись remote-mcp-function, которая уже настроена для подключения к удаленному серверу .vscode/mcp.json. Так как встроенная авторизация MCP включена по умолчанию, Visual Studio Code автоматически обрабатывает поток входа OAuth при подключении.
Узнайте имя приложения-функции из сведений о развертывании, выполнив в терминале следующую команду:
azd env get-value AZURE_FUNCTION_NAMEВ
.vscode/mcp.jsonвыберите Пуск вышеremote-mcp-functionконфигурации.При появлении запроса введите имя приложения-функции из предыдущего шага.
Visual Studio Code предлагает вам войти через Microsoft Entra. Следуйте инструкциям проверки подлинности, чтобы авторизовать доступ к удаленному серверу MCP.
Проверьте ваше развертывание
Теперь вы можете использовать GitHub Copilot с удаленными средствами MCP так же, как и локально, но теперь код выполняется безопасно и защищенно в Azure. Воспроизвести те же команды, которые вы использовали ранее, чтобы убедиться, что все работает правильно.
Очистите ресурсы
Когда вы закончите работу с сервером MCP и связанными ресурсами, используйте эту команду, чтобы удалить приложение-функцию и связанные с ним ресурсы из Azure, чтобы избежать дополнительных затрат:
azd down