Token导航 LogoToken导航

MCP Server · 运维云端

Remote MCP Functions Typescript

This is a quickstart template to easily build and deploy a custom remote MCP server to the cloud using Azure functions. You can clone/restore/run on your local machine with debugging, and azd up to have it in the cloud in a couple minutes. The MCP server is secured by design.

stdio官方级别未说明来源级核验工具 4
Bicep开发工具DockerVS Code云部署

快速开始

作者 / 组织
Azure-Samples
提供方
Azure-Samples
运行时
Docker

工具数量

4

来源目录标注

资源数量

0

来源目录标注

提示词数量

0

来源目录标注

GitHub Star

57

仓库热度

收录来源

3 个

MCP.so

选型结论

Remote MCP Functions Typescript 属于运维云端类 MCP Server,公开资料标注 4 个工具,通过stdio 本地进程接入,适配 VS Code,有可以直接复制的安装命令;接入前先确认权限范围。

分类

运维云端

传输方式

stdio

认证方式

无需认证

部署方式

公开资料未说明

安装与配置

安装命令

docker run -p 10000:10000 -p 10001:10001 -p 10002:10002 \

公开命令不是通用的启动方式,拼不出可靠配置示例;请在客户端 MCP 配置里按官方文档填写 command 和 args。

上手步骤

  1. 1

    准备运行环境

    stdio 服务在本地起进程,需要先装好 Docker,再按安装命令拉取依赖。

  2. 2

    安装服务

    复制下面的安装命令执行;命令里带占位符的位置换成自己的密钥或路径。

  3. 3

    写入客户端配置

    在客户端的 MCP 配置里填启动命令和参数,保存后完全退出客户端再打开,让新配置生效。

  4. 4

    验证是否可用

    连接成功后客户端会列出 4 个工具,随便调一个只读工具确认能返回结果。

接入前确认

不要直接授予不必要的文件、网络或账号权限;先核对安装命令和配置内容。

详细介绍

使用Azure函数(Node.js/TypeScript)开始使用远程MCP服务器

这是一个快速入门模板,可以使用Azure函数轻松构建自定义远程MCP服务器并将其部署到云端。您可以通过调试在本地计算机上克隆/还原/运行,以及 azd up 几分钟后就可以把它放在云端了。

MCP服务器配置了 内置身份验证 使用Microsoft Entra作为身份提供者。

你也可以使用 API管理 以保护服务器以及使用VNET进行网络隔离。

观看视频概述

以下是使用Azure Functions的远程MCP服务器的架构图:

存储库布局

此存储库现在包括两个可独立部署的功能应用程序:

  1. mcp工具包含mcp工具触发器、丰富内容示例和代码段存储示例。
  2. mcp天气应用程序包含mcp应用程序天气样本(资源+天气工具)。

每个应用程序都有自己的azure.yaml、package.json和README.md。从每个应用程序文件夹中运行azd命令以独立配置和部署它。

存储库布局

此存储库现在包括两个可独立部署的功能应用程序:

  1. mcp工具包含mcp工具触发器、丰富内容示例和代码段存储示例。
  2. mcp天气应用程序包含mcp应用程序天气样本(资源+天气工具)。

每个应用程序都有自己的azure.yaml、package.json和README.md。从每个应用程序文件夹中运行azd命令以独立配置和部署它。

先决条件

- Visual Studio Code - Azure功能扩展

  • 码头工人 要运行Azure存储模拟器Azurite(可选)

准备好当地环境

此特定示例需要Azure存储模拟器,因为我们将从blob存储中保存和获取代码段。

  1. 开始Azurite
   docker run -p 10000:10000 -p 10001:10001 -p 10002:10002 \
       mcr.microsoft.com/azure-storage/azurite
备注 如果你使用来自VS Code扩展的Azurite,你需要运行 Azurite: Start 现在,否则你会看到错误。

从终端本地运行MCP服务器

此存储库包含多个可独立运行的功能应用程序。每个应用程序在默认的Functions端口上公开自己的MCP端点(7071).要同时运行多个应用程序,请从单独的终端启动每个应用程序并通过 --port 以避免碰撞。

根代码片段/工具应用程序(此文件夹)

  1. 安装依赖项
   npm install
  1. 构建项目
   npm run build
  1. 在本地启动Functions主机:
   func start

mcp工具应用程序

包含用于丰富内容示例(图像、资源链接、结构化内容)和代码段示例(通过blob绑定保存/获取代码段)的MCP工具触发器。看 mcp工具/README.md 了解详情。

cd mcp-tools
npm install
npm run build
func start

mcp天气应用程序

包含MCP应用程序示例:一个服务于交互式天气小部件的MCP资源触发器,以及一个调用Open Meteo的MCP工具触发器。看 mcp天气应用程序/README.md 了解详情。

cd mcp-weather-app
npm install
npm run build:app   # bundle the widget UI
npm run build
func start

mcp提示应用程序

包含MCP提示触发器(代码审查清单、总结内容、生成文档)。看 mcp提示 了解详情。

cd mcp-prompts
npm install
npm run build
func start
备注 默认情况下,这将使用webhooks路由: /runtime/webhooks/mcp稍后,我们将在Azure中使用它来设置客户端/主机调用的密钥: /runtime/webhooks/mcp?code= 如果你想同时运行多个应用程序,请为每个应用程序分配自己的端口,例如。 func start --port 7072,并在配置客户端时使用该端口。

使用 *本地* 客户端/主机内的MCP服务器

下面的示例URL指向端口上的根应用程序 7071。要连接到 mcp工具 应用程序, mcp天气应用程序,或 mcp提示 应用程序,使用相同的 /runtime/webhooks/mcp 应用程序正在侦听的端口的路径(请参见 mcp工具/README.md, mcp天气应用程序/README.md,以及 mcp提示 每个应用程序公开的工具、天气小部件和提示的文件夹)。

VS代码-副本编辑

  1. 添加MCP服务器 从命令面板中,将URL添加到正在运行的Function应用程序的mcp端点:
   http://0.0.0.0:7071/runtime/webhooks/mcp
  1. 选择 HTTP(服务器发送事件) 用于添加MCP服务器的类型。
  1. 输入运行函数应用程序mcp端点的URL
  1. 输入服务器ID。(这可以是您想要的任何名称)
  1. 选择是要在用户设置(适用于所有应用程序)中运行此操作,还是在工作区设置(仅适用于此应用程序)下运行此操作
  1. 列出MCP服务器 从命令面板启动服务器。上一步可能已经启动了您的本地服务器。如果是这样,您可以跳过此步骤。
  1. 在Copilot聊天代理模式下,输入提示以触发工具,例如,选择一些代码并输入此提示
   Say Hello
   Save this snippet as snippet1 
   Retrieve snippet1 and apply to newFile.ts
  1. 当系统提示运行该工具时,点击同意 继续
  1. 完成后,在终端窗口中按Ctrl+C停止 func.exe 主机进程,以及 列出MCP服务器 从命令面板中选择并停止本地服务器。

MCP检查员

  1. 在一个 新终端窗口,安装并运行MCP检查器
   npx @modelcontextprotocol/inspector node build/index.js
  1. 如果您之前停止了功能应用程序,请在本地启动功能主机:
   func start
  1. 按CTRL键单击可从应用程序显示的URL加载MCP Inspector web应用程序(例如。http://0.0.0.0:5173/#resources)
  1. 将运输类型设置为 http
  1. 将URL设置为正在运行的Function应用程序的mcp端点,然后 连接:
   http://0.0.0.0:7071/runtime/webhooks/mcp
  1. 列出工具。单击工具,然后 运行工具.
  1. 完成后,在终端窗口中按Ctrl+C停止 func.exe 主机进程,在终端窗口中按Ctrl+C停止 @modelcontextprotocol/inspector 主机进程。

验证Azurite中的本地blob存储

在本地测试代码段保存功能后,您可以验证blob是否正确存储在本地Azurite存储模拟器中。

使用Azure存储资源管理器

  1. 打开Azure存储资源管理器
  2. 在左侧面板中,展开 模拟器和附件 → 存储帐户 → (模拟器-默认端口)(按键)
  3. 导航至 Blob容器 → 片段
  4. 您应该看到此容器中所有保存的代码段都是blob文件
  5. 双击任何blob以查看其内容并验证代码段数据是否已正确保存

使用Azure CLI(替代方案)

如果您更喜欢使用命令行,还可以使用Azure CLI和存储模拟器验证blob:

# List blobs in the snippets container
az storage blob list --container-name snippets --connection-string "DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1;"
# Download a specific blob to view its contents
az storage blob download --container-name snippets --name  --file  --connection-string "DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1;"

此验证步骤可确保您的MCP服务器与本地存储模拟器正确交互,并且blob存储功能在部署到Azure之前按预期工作。

部署到Azure以实现远程MCP

azd env new 

将VS Code配置为允许的客户端应用程序,以从Microsoft Entra请求访问令牌:

azd env set PRE_AUTHORIZED_CLIENT_IDS aebc6443-996d-45c2-90f0-388ff96faa56

您也可以选择加入示例中正在使用的ExpressRoute。(如果您选择此项,请先执行此操作 azd up)

azd env set VNET_ENABLED true

运行这些 azd 命令来为功能应用程序配置任何所需的Azure资源,并部署您的代码:

azd provision

等待几分钟以使访问权限生效,然后运行

azd deploy
备注 API管理 可用于提高MCP服务器的安全性和策略。

独立部署mcp工具或mcp天气应用程序

这 mcp-tools, mcp-weather-app,以及 mcp-prompts 每个文件夹都包含自己的 azure.yaml 并且可以作为单独的功能应用程序进行配置和部署。运行相同 azd 从要部署的应用程序文件夹内部进行流:

cd mcp-tools          # or: cd mcp-weather-app  |  cd mcp-prompts
azd init              # first time only
azd env new           # first time only
azd provision
azd deploy

每个应用程序都重用共享的infrastructure 红外线/ 而是作为其自己的功能应用程序部署。看 mcp工具/README.md 和 mcp天气应用程序/README.md 针对特定应用程序的注释。

备注 API管理 可用于提高MCP服务器的安全性和策略,以及 App Service内置身份验证 可用于设置您最喜欢的OAuth提供程序,包括Entra。

在VS Code中连接到远程MCP服务器-GitHub Copilot

对于VS Code中的GitHub Copilot,您可以使用 https://.azurewebsites.net/runtime/webhooks/mcp 以下示例来自 mcp.json 该文件包含在此存储库中,并使用输入提示您在从VS Code启动服务器时提供函数名。服务器配置了内置的MCP身份验证,因此您也会被要求登录。你的 mcp.json 文件看起来像这样:

连接到您的 *远程* 来自客户端的MCP服务器功能应用程序

您的客户端将需要一个密钥来调用新的托管SSE端点,其格式为 https://.azurewebsites.net/runtime/webhooks/mcp默认情况下,托管功能需要一个系统密钥,可以从 门户 或CLI(az functionapp keys list --resource-group --name ).获取名为的系统密钥 mcp_extension.

在MCP Inspector中连接到远程MCP服务器

对于MCP检查器,您可以在URL中包含密钥:

https://.azurewebsites.net/runtime/webhooks/mcp?code=

在VS Code中连接到远程MCP服务器-GitHub Copilot

对于VS Code中的GitHub Copilot,您应该将密钥设置为 x-functions-key 标题在 mcp.json,你会使用 https://.azurewebsites.net/runtime/webhooks/mcp 以下示例来自 mcp.json 该文件包含在此存储库中,并使用输入提示您在从VS Code启动服务器时提供密钥。你的 mcp.json 文件看起来像这样:

{
    "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": "http",
            "url": "https://${input:functionapp-name}.azurewebsites.net/runtime/webhooks/mcp",
            "headers": {
                "x-functions-key": "${input:functions-mcp-extension-system-key}"
            }
        },
        "local-mcp-function": {
            "type": "http",
            "url": "http://0.0.0.0:7071/runtime/webhooks/mcp"
        }
    }
}
  1. 在服务器上单击“开始” remote-mcp-function,里面 mcp.json 文件:
  1. 当VS Code提示时,输入您在Azure门户中创建的功能应用程序的名称。
  1. 输入 Azure Functions MCP Extension System Key 进入提示。您可以通过转到“功能”菜单项,然后单击“应用密钥”,并复制 mcp_extension 从系统密钥中选择密钥。
  1. 在Copilot聊天代理模式下,输入提示以触发工具,例如,选择一些代码并输入此提示
   Say Hello
   Save this snippet as snippet1 
   Retrieve snippet1 and apply to newFile.ts

重新部署代码

你可以运行 azd deploy 根据需要多次执行命令,将代码更新部署到功能应用程序。

\[!注意\] 部署的代码文件总是被最新的部署包覆盖。

清理资源

使用完功能应用程序和相关资源后,您可以使用此命令从Azure中删除功能应用程序及其相关资源,从而避免产生任何进一步的成本:

azd down

源代码

的功能代码 getSnippet 和 saveSnippet 端点在TypeScript文件中定义 src 目录。MCP函数注释将这些函数作为MCP服务器工具公开。

这显示了一些MCP服务器示例的代码(获取字符串、获取对象、保存对象):

// Hello function - responds with hello message
export async function mcpToolHello(context: InvocationContext): Promise {
    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 {
    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 {
    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
});

结果模式(UseResultSchema)

TypeScript MCP工具触发器现在支持显式定义 resultSchema 上 app.mcpTool(...) 选项。 当存在有效的JSON时,它将与 useResultSchema: true 因此,宿主可以使用您声明的结果形状。

const imageInfoSchema = JSON.stringify({
    type: "object",
    properties: {
        imageId: { type: "string" },
        format: { type: "string" },
        tags: { type: "array", items: { type: "string" } }
    },
    required: ["imageId", "format", "tags"],
    additionalProperties: false
});

app.mcpTool("GetImageInfo", {
    toolName: "GetImageInfo",
    description: "Get image information",
    toolProperties: {
        imageId: arg.string().describe("Optional image identifier").optional()
    },
    resultSchema: imageInfoSchema,
    handler: getImageInfo
});

请注意 host.json 文件还包括对扩展包的引用,这是使用此功能的应用程序所必需的:

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

天气应用程序示例

一个示例MCP应用程序,通过交互式UI显示天气信息。

什么是MCP应用程序?

MCP应用程序 让工具返回交互式界面而不是纯文本。当工具声明UI资源时,主机会在沙盒iframe中呈现它,用户可以在其中直接交互。

MCP应用程序=工具+UI资源

该架构依赖于两个MCP原语:

  1. 工具 UI元数据指向资源URI
  2. 资源 包含通过 ui:// 方案

Azure Functions使两者都易于构建。

天气应用程序的先决条件

天气应用程序入门

本节中的所有命令都必须从 mcp天气应用程序/ 文件夹。先导航到那里: ``shell cd mcp-weather-app ``
1.构建UI

在运行功能应用程序之前,必须捆绑UI:

cd src/app npm install npm run build

这将创建一个捆绑 src/app/dist/index.html 函数所服务的文件。

2.构建并运行功能应用程序
  1. 安装Function应用程序的依赖项:
   cd ../../
   npm install
  1. 构建项目:
   npm run build
  1. 在本地启动Functions主机:
   func start
3.从VS代码连接

打开 .vcode/mcp.json.查找被调用的服务器 _本地mcp功能_ 然后单击 开始 名字之上。服务器已经设置了正在运行的Function应用程序的MCP端点:

http://0.0.0.0:7071/runtime/webhooks/mcp

4.提示代理人

问Copilot:“西雅图的天气怎么样?”

它是如何协同工作的
  1. 用户问:“西雅图的天气怎么样?”
  2. 代理人致电 getWeather 工具
  3. 工具返回天气数据(JSON) 和 主机看到 ui.resourceUri 元数据
  4. 主机从以下位置获取UI资源 ui://weather/index.html
  5. 主机在沙盒iframe中呈现HTML,并将工具结果作为上下文传递
  6. 用户看到的是交互式天气小部件,而不是纯文本
用户界面(TypeScript)

前端在 src/app/src/weatherMcpApp.ts 接收工具结果并呈现天气显示。它与Vite捆绑在一起 index.html 资源所服务的。

下一步

工具与能力

工具数量

4

资源数量

0

提示词数量

0

能力标签

cloud-platformsBicep本地部署AzureFunctionsMCP服务器开发者工具自动化任务云部署

支持客户端

VS Code

数量来自来源目录的标注,具体工具清单以官方文档为准。

典型使用场景

看服务状态

查询容器、日志和监控指标,定位异常。

执行部署变更

在权限范围内触发发布、回滚和环境切换。

核对资源用量

汇总用量,找出闲置和超额的部分。

选择建议

值得选的地方

  • 只提供 4 个工具,职责集中,接入后不容易误操作。
  • 有现成的安装命令,不用自己找入口,照着跑就能起服务。
  • 3 个目录同时收录,信息可以交叉核对。

先想清楚的地方

  • stdio 方式要求本地装好 Docker,换机器要重新装一遍。
  • 第三方目录整理,版本更新和行为细节以官方仓库为准。

更适合

  • 需要在运维云端场景里让模型直接调用外部能力的人。
  • 已经在用 VS Code 的用户,接入路径最短。
  • 想先快速试一下、能接受在本地跑服务的人。

不太适合

  • 完全不想在本地装环境的人。
  • 需要厂商级 SLA 和技术支持的生产环境。

同类对比

5 个同类
MCP Server工具数传输方式安装命令收录来源最后核验
Remote MCP Functions Typescript

MCP.so · 本页

4stdio有3 个2026-05-17
Ui Tars Desktop 8a825770

MCP World

0stdio有1 个2026-05-17
Elie222 MCP

MCP World

0未说明未标注1 个2026-05-17
Arizeai Phoenix MCP

MCP World

0stdio有3 个2026-05-17
Unity MCP 87ee506e

MCP World

42HTTP有2 个2026-05-17

按同分类和工具数量挑出最接近的几条,字段以各自详情页为准。

常见问题

5 条

Remote MCP Functions Typescript 怎么安装?

公开资料给出的安装命令是 docker run -p 10000:10000 -p 10001:10001 -p 10002:10002 \,运行环境为 Docker。装完后按客户端要求写进 MCP 配置,重启客户端生效。

Remote MCP Functions Typescript 怎么在 Claude Desktop、Cursor 里配置?

它是stdio 本地进程,客户端配置里要写启动命令和参数,运行环境是 Docker;保存后完全退出客户端再打开,配置才会生效。

Remote MCP Functions Typescript 收费吗?

本站只整理公开资料,不代收费用,也没有标注具体价格。是否收费取决于服务本身和背后的接口额度,正式使用前按官方说明确认。

Remote MCP Functions Typescript 需要 API Key 吗?

公开资料标注为无需认证,装好就能连;如果实际调用时报鉴权错误,按官方文档补上凭据。

Remote MCP Functions Typescript 支持哪些客户端?

公开资料标注支持 VS Code;其他客户端只要能配置 MCP Server,也能用同样的命令或地址接入。

来源信息

继续浏览同类 MCP