Token导航 LogoToken导航TokenDH.com
runjs (Charlie Digital) logo
安全风控stdio官方级别未说明来源级核验

runjs (Charlie Digital)

MCP Server

RunJS是一个安全的MCP服务器,可在隔离沙盒中执行JavaScript并返回结果,适用于需要安全运行生成代码的场景。

工具数

0

提示词数

0

GitHub Stars

31

资源数

0
安全执行C#API集成

安装说明

本站只整理中文说明和来源信息,不托管安装包,也不代用户安装。

作者 / 组织

CharlieDigital

提供方

CharlieDigital

最后核验

2026/5/17 20:21

运行时

Docker

快速接入

先看主来源和安装命令,再打开仓库或文档;下面只保留这个条目的关键接入事实。

命令预览

docker run -p 5000:8080 \

详细介绍

RunJS-您需要的唯一MCP服务器

此项目包含一个可以执行JavaScript的MCP服务器 *安全地* 在隔离的沙箱中,并从脚本返回结果。它配备了 fetch 使用模拟实现 System.Net.HttpClient 它允许您生成的JavaScript发出web请求,并允许JSONPath操纵结果😎. 还提供了web API以安全地存储机密,从而可以使用使用API密钥的API调用。有了这个MCP服务器,您基本上可以与任何REST API交互。

主要特点

  • 集成机密管理器,可安全存储加密的API密钥
  • 无需基础设施的沙盒JavaScript执行(例如部署容器或无服务器功能)
  • 预装了a fetch 用于发出HTTP请求的模拟
  • 预装有 jsonpath-plus 处理JSON有效载荷
  • 集成弹性管道(通过Polly)用于重试HTTP请求

![Quick intro of the RunJS MCP server](https://youtu.be/S3NNgr1wMVI)

# To test locally
docker pull cdigs/runjs-mcp-server

# Other options can also be set via ENV
docker run -p 5000:8080 \
  -e RunJSConfig__Jint__LimitMemory=10000000 \
  -e RunJSConfig__Jint__TimeoutIntervalSeconds=30 \
  cdigs/runjs-mcp-server

# The default secret storage is ephemeral and disappears when
# the container restarts.  For persistent storage, set the
# connection string and flip it to use the database (see below).

RunJS MCP服务器使用 金特 --一个将JavaScript运行时嵌入其中的C#库。NET,并允许通过指定以下内容来控制执行沙盒:

  • 内存限制
  • 发言次数
  • 运行时
  • 调用深度(递归)

这是非常强大的,因为在许多情况下,你可能想运行JavaScript,但这样做 *安全地* 由于JavaScript和生成代码的性质,它具有挑战性。因为生成的JavaScript是在C#解释器中运行的,所以没有泄漏环境变量的机会,没有恶意软件包的机会,也没有JS崩溃服务器进程的机会。

使用此机制可以解锁许多需要JavaScript来处理某些JSON的用例,例如,返回文本或对传入数据运行一些转换逻辑。

以下是一个使用Vercel AI SDK的示例调用:

const mcpClient = await createMCPClient({
  transport: {
    type: "sse",
    url: "http://localhost:5000/sse",
  },
});

const tools = await mcpClient.tools();

const prompt = `
  Generate and execute JavaScript that can parse the following JSON
  The JavaScript should 'return' the value
  Return only the value of the name property:
  { "id": 12345, "name": "Charles Chen", "handle": "chrlschn" }`

try {
  const { text } = await generateText({
    model: openai("gpt-4.1-nano"),
    prompt,
    tools,
    maxSteps: 10, // 👈 Very, very important or you get no output!
  });

  console.log("Output:", text);
} finally {
  await mcpClient.close();
}

LLM将生成以下JavaScript:

const jsonString = '{ "id": 12345, "name": "Charles Chen", "handle": "chrlschn" }';
const obj = JSON.parse(jsonString);
return obj.name;

并使用RunJS MCP服务器来执行它🚀

架构和流程

RunJS architecture and flow

上图提供了架构和流程的概述。

  1. web API公开 秘密经理 安全地存储秘密,使其不会暴露给LLM。LLM通过ID引用机密,并在执行API调用时将其替换为实际值。
  2. 这些秘密被加密并存储在Postgres数据库中
  3. A. 秘密ID 返回给呼叫者;调用者会存储此值。
  4. 提示具有执行JavaScript或进行API调用的指令;如果需要任何秘密,它们将由 秘密ID.
  5. LLM生成JavaScript以进行API调用或以其他方式操作数据,并使用 RunJS MCP服务器 以执行JavaScript。这实际上是一个源自应用程序(而不是LLM)的工具调用,这就是为什么 localhost URL有效(以及为什么这将在您的专用网络上游有效)。
  6. SDK(例如Vercel AI SDK、语义内核)将调用与生成的JavaScript以及从调用中提取的任何秘密ID一起发送到MCP服务器。
  7. 如果a 秘密ID 如果提供了,服务器将用它来交换实际值。
  8. 实际值被返回并交给工具实现。
  9. 该工具使用 fetch 模拟(使用 System.Net.HttpClient)现在使用以下命令发出HTTP请求 机密值 注射!
  10. 结果从工具返回给LLM进行进一步处理(它实际上是通过SDK间接返回的(在这种情况下,这意味着它会返回到Nuxt应用程序,并作为对工具调用的响应交给LLM)。

如果这是你第一次使用MCP,这很复杂,但请记住,所有这些都是在本地工作的,它应该开始点击呼叫的流向和方式;法学硕士永远不会看到真正的秘密。

项目设置

该项目的结构如下:

📁 app                        # A sample Nuxt web app to make it easier to test
📁 cli                        # A sample client application using Vercel AI SDK
  📁 src
  .env                        # 👈 Make your own from the .env.sample
  .env.sample                 # Sample .envfile; make a copy as .env
📁 server
  📁 Data                     # Database artifacts for Secrets
  📁 Endpoints                # .NET Web API endpoints to register and manage
                                secrets which can be used by the HTTP client
  📁 Mcp                      # The MCP related artifacts
  📁 Migrations               # Migrations for the EF Core database
  📁 Setup                    # DI container setup
  Program.cs                  # A .NET MCP server exposing the Jint tool
📁 tests                      # Small suite of integration tests for HTTP API
                                calls and for the database access
builder-server.sh             # Simple script (command) to build the container
docker-compose.yaml           # Start the Aspire Dashboard container for OTEL and
                                a Postgres server for holding secrets.
Dockerfile                    # Dockerfile for the .NET server cli

配置本地环境

你需要 安装。NET SDK(如果没有);它适用于Windows、Linux和macOS。

安装后,您可以运行以下命令启动服务器:

dotnet run --project server

这将启动端口5000上的MCP服务器。对于本地使用或在专用网络中使用,您不需要做任何特殊的事情。要将本地MCP暴露给外部客户端(例如本地MCP和部署的应用程序),您需要映射代理。

要将其与来自远程源的LLM API调用一起使用,您需要使用代理(如ngrok或 VS代码端口工具.

👉 一定要将端口设置为公共端口

完成此操作后,您需要创建一份 .env.sample 文件和as .env 并设置您的OpenAI API密钥和URL:

OPENAI_API_KEY=sk-proj-kSZWV-M7.......K_MMv8JZRmIA
MCP_ENDPOINT=https://mhjt5hqd-5000.use.devtunnels.ms/sse

如果您只使用本地通话(如 /cli 目录):

OPENAI_API_KEY=sk-proj-kSZWV-M7.......K_MMv8JZRmIA
MCP_ENDPOINT=http://localhost:5000/sse

/cli 目录,运行以下命令:

cd cli
npm i
npm run cli -- "Use your echo tool with my name: ; write out your response"

这应该调用。NET MCP端点并输出您的名称!

安全

🚨 当前没有身份验证 🚨

请在此处查看工作流

目前,这仅适用于在专用网络中运行。

你为什么要用这个?如果你的运行时应用程序是Python、JavaScript或其他语言,你需要一个快速、简单、安全、可控的上下文来运行生成的代码。

运行服务器

# To start the server
dotnet run --project server

# To start the server with hot reload
dotnet watch run --project server --non-interactive

服务器限制通过配置 appsettings.json 文件。如果您选择部署此(再次,👉 *仅进入专用网络* 👈), 您可以在运行时使用在容器上覆盖这些。NET的环境变量:

RunJSConfig__Jint__LimitMemory=5000000
RunJSConfig__Jint__TimeoutIntervalSeconds=10
RunJSConfig__Jint__MaxStatements=100
RunJSConfig__Secrets__UseDatabase=false
RunJSConfig__Db__ConnectionString=YOUR_CONNECTION_STRING

这个。NET文档 有关运行时配置的更多详细信息。

运行Web应用程序

有一个Nuxt应用程序 /app 目录:

# Make a copy of the .env.sample as .env
cd app
npm run dev

这将在以下时间启动应用程序 http://localhost:3000

RunJS Nuxt web app

运行CLI客户端

如果您愿意,CLI客户端是一种无需UI即可从CLI进行测试的便捷方式:

# Make a copy of the .env.sample as .env
cd cli
npm run cli -- "My prompt goes here"

为了测试这一点,您可以运行两种类型的提示:

cd cli

# Just test the echo
npm run cli -- "Echo my name back to me: Charles"

# Generate and execute JavaScript
npm run cli -- "Generate some JavaScript that will lowercase and return the string 'Hello, World' and execute it.  Give me the results; ONLY THE RESULTS"

# Something more complex"
npm run cli -- 'Generate and execute JavaScript that can parse the following JSON and return the value of the name property: { "id": 12345, "name": "Charles Chen", "handle": "chrlschn" }'

测试提取

为了测试 fetch 使用端点进行模拟 https://jsonplaceholder.typicode.com/ 尝试以下提示:

cd cli

# Test a GET
npm run cli -- "Generate some JavaScript that will GET a post from https://jsonplaceholder.typicode.com/posts/1 and retrieve the name property"

# Test a POST
npm run cli -- 'Generate some JavaScript that will POST to https://jsonplaceholder.typicode.com/posts/ and create a new post: { "title": "Hello", "body": "World!", "userId": 1 }.  Return the id of the post from the result'

后者生成并执行以下JavaScript:

(async () => {
  const response = await fetch('https://jsonplaceholder.typicode.com/posts/', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({ title: 'Hello', body: 'World!', userId: 1 })
  });
  const data = await response.json();
  return data.id;
})()

并且应该返回结果 101 作为ID。

可观测性

如果运行以下命令:

docker compose up

你也会得到 Aspire仪表板http://localhost:18888 跟踪对工具的内部调用。

这是一个重要的工具,因为它将公开正在生成和执行的实际JavaScript(不包括秘密)。

OTEL tracing

______________________________________________________________________

秘密

您可能希望RunJS进行需要API机密的API调用。为了更安全,这样您就不必将API密钥传递给LLM,MCP服务器包括一个web API端点,可以让您注册“机密”。您将获得该秘密的ID,然后可以在运行时为实际的API密钥交换和注入该ID。为了实现这一点,只需进行一次正常的REST调用,首先注册您的秘密,然后使用返回的ID而不是实际的秘密。

如果有效载荷包含一个秘密ID,那么当LLM调用RunJS时,该秘密将纯粹在后端加载和替换;这个秘密永远不会泄露给法学硕士。

要创建秘密,请执行以下操作:

# A persistent secret
curl -X POST http://localhost:5000/secrets \
  -H "Content-Type: application/json" \
  -d '{
    "value": "abracadabra"
  }'

# A read-once secret
curl -X POST http://localhost:5000/secrets \
  -H "Content-Type: application/json" \
  -d '{
    "value": "abracadabra",
    "readOnce: true
  }'

这将产生一个秘密ID,如下所示:

runjs:secret:fc719aab80ac402fa14e36038d948437
💡 在调用方具有只能用于API调用一次的OAuth令牌的情况下,可以使用read-once机密。它一被阅读就会被丢弃。不过要小心:LLM可能会多次拨打电话!

为了测试它是否被请求中的实际值替换,您可以在正文的某个地方设置它(通常,它只会在头文件中被替换)。

然后按照以下提示进行测试:

npm run cli -- 'Generate some JavaScript that will POST to https://jsonplaceholder.typicode.com/posts/ and create a new post: { "title": "Hello", "body": "runjs:secret:fc719aab80ac402fa14e36038d948437", "userId": 1 }.  Include the Authorization header with the secret key runjs:secret:fc719aab80ac402fa14e36038d948437.  Return whether the JSON contains the phrase "abracadabra" anywhere in the response.'

建造集装箱

要构建容器,请执行以下步骤:

  1. 修改 ./server/appsettings.json 如果你愿意(或者在容器上设置环境变量)。
  2. 查看 ./Dockerfile 确定是否需要更改
  3. 跑吧 ./db-script.sh (如果您使用的是Windows,请复制命令并手动运行)

您的集装箱已准备好装运 *仅进入专用网络*.

目录标签

目录标签

安全执行C#API集成JavaScript沙盒本地部署REST交互秘密管理

接入字段

传输方式(transport,传输协议)

stdio

鉴权方式(authType,认证方式)

oauth

运行时(runtime,运行环境)

Docker

工具数量(toolCount,工具数)

0

资源数量(resourceCount,资源数)

0

提示词数量(promptCount,提示词数)

0

权限和风险

stdiooauth部署方式未说明

接入前请确认传输方式、认证方式和部署位置,并根据实际工具能力限制访问范围。

安装前确认

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

来源信息

继续浏览同类 MCP