/ 目录 / 演练场 / Unla
● 社区 AmoyLab ⚡ 即开即用

Unla

作者 AmoyLab · AmoyLab/Unla

通过 YAML 将任何 REST API 转换为 MCP server — 无需改代码,支持热加载、多租户、SSE + Streamable HTTP

Unla (AmoyLab) 是一个轻量级 Go gateway,通过 YAML 配置将 REST API 和现有 MCP 服务转换为 MCP endpoint。支持 Web UI 管理、多租户、OAuth 预认证、Docker-first 部署

为什么要用

核心特性

实时演示

实际使用效果

unla.replay ▶ 就绪
0/0

安装

选择你的客户端

~/Library/Application Support/Claude/claude_desktop_config.json  · Windows: %APPDATA%\Claude\claude_desktop_config.json
{
  "mcpServers": {
    "unla": {
      "command": "npx",
      "args": [
        "-y",
        "Unla"
      ],
      "_inferred": true
    }
  }
}

打开 Claude Desktop → Settings → Developer → Edit Config。保存后重启应用。

~/.cursor/mcp.json · .cursor/mcp.json
{
  "mcpServers": {
    "unla": {
      "command": "npx",
      "args": [
        "-y",
        "Unla"
      ],
      "_inferred": true
    }
  }
}

Cursor 使用与 Claude Desktop 相同的 mcpServers 格式。项目级配置优先于全局。

VS Code → Cline → MCP Servers → Edit
{
  "mcpServers": {
    "unla": {
      "command": "npx",
      "args": [
        "-y",
        "Unla"
      ],
      "_inferred": true
    }
  }
}

点击 Cline 侧栏中的 MCP Servers 图标,然后选 "Edit Configuration"。

~/.codeium/windsurf/mcp_config.json
{
  "mcpServers": {
    "unla": {
      "command": "npx",
      "args": [
        "-y",
        "Unla"
      ],
      "_inferred": true
    }
  }
}

格式与 Claude Desktop 相同。重启 Windsurf 生效。

~/.continue/config.json
{
  "mcpServers": [
    {
      "name": "unla",
      "command": "npx",
      "args": [
        "-y",
        "Unla"
      ]
    }
  ]
}

Continue 使用服务器对象数组,而非映射。

~/.config/zed/settings.json
{
  "context_servers": {
    "unla": {
      "command": {
        "path": "npx",
        "args": [
          "-y",
          "Unla"
        ]
      }
    }
  }
}

加入 context_servers。Zed 保存后热重载。

claude mcp add unla -- npx -y Unla

一行命令搞定。用 claude mcp list 验证,claude mcp remove 卸载。

使用场景

实战用法: Unla

如何在不编写 server 的情况下将内部 REST API 暴露为 MCP

👤 平台工程师、内部工具团队 ⏱ ~30 min intermediate

何时使用: 你有公司的 REST API,希望 Claude/Cursor 能使用它,但不想构建定制的 MCP

前置条件
  • Docker — docker.com/get-started
  • API 的 OpenAPI/Swagger 规范(可选但有帮助) — 大多数内部 API 都已经有了
步骤
  1. 部署 Unla
    docker run -d --name unla -p 8080:80 -p 5234:5234 -p 5235:5235 ghcr.io/amoylab/unla/allinone:latest✓ 已复制
    → Web UI 运行在 :8080
  2. 添加 YAML server 定义
    在 UI 中创建一个名为 'internal-api' 的 server,包含 /users (GET) 和 /orders (GET, POST) 端点,映射到 https://api.internal/v1✓ 已复制
    → 工具出现:get_users、get_orders、create_order
  3. 指向客户端
    在 Claude Desktop 中添加 https://gateway.internal/mcp/internal-api✓ 已复制
    → 新工具出现在客户端

结果: 在一小时内使内部 API 可被任何 MCP 客户端使用

注意事项
  • 如果不受限制地映射敏感 header,会发生 Auth 泄露 — 使用 Unla 的 OAuth 预认证进行用户级别的控制;不要在 YAML 中硬编码 admin token
  • Write endpoint 会暴露破坏性调用 — 将 POST/DELETE endpoint 标记为 'confirm',以便需要显式的用户批准
搭配使用: mcphub

如何为每个客户提供专属的 MCP namespace

👤 为客户提供 MCP 访问的 SaaS 团队 ⏱ ~45 min advanced

何时使用: 你运营一个平台,希望实现租户级别的工具隔离

步骤
  1. 在 Unla 中创建租户
    在管理员界面中创建租户 'acme' 和 'globex',每个租户都有自己的 API 密钥映射✓ 已复制
    → 两个隔离的 namespace
  2. 按租户路由
    Acme 用户访问 /mcp/acme,globex 访问 /mcp/globex✓ 已复制
    → 工具显示租户范围的数据

结果: 无需运行多个 gateway 即可实现多租户 MCP

注意事项
  • 通过共享 YAML 模板导致跨租户泄露 — 使用租户范围的变量,不要使用跨租户解析的 $ENV 引用

如何将现有 MCP 放在单个认证 URL 后面

👤 具有分散 MCP 部署的团队 ⏱ ~20 min intermediate

何时使用: 多个 stdio MCP 分散在不同位置,你希望有一个带 OAuth 的公开 URL

步骤
  1. 注册每个下游 MCP
    在 Unla 中添加 github-mcp (stdio) 和 postgres-mcp (HTTP) 作为代理服务器✓ 已复制
    → 两个都显示为健康状态
  2. 启用 OAuth
    为 gateway 开启 GitHub OAuth✓ 已复制
    → 登录流程端到端工作

结果: 一个 endpoint,一次登录,所有 MCP

组合

与其他 MCP 搭配,撬动十倍杠杆

unla + mcphub

使用 Unla 进行 REST-to-MCP 转换,MCPHub 用于路由/分组

在 MCPHub 中的 'internal' 组下注册由 Unla 暴露的工具✓ 已复制
unla + proxy

使用 mcp-proxy 作为最后一英里的 stdio bridge,Unla 作为面向公众的 gateway

使用 mcp-proxy 将本地 stdio MCP 桥接到 HTTP,然后在 Unla 中注册它✓ 已复制

工具

此 MCP 暴露的能力

工具输入参数何时调用成本
(gateway) yaml-defined REST tools 按 YAML 中声明的方式 任何暴露的 REST endpoint 所做的事 1 request to upstream API
(gateway) proxied MCP tools Pass-through 与下游相同 Same as downstream MCP

成本与限制

运行它的成本

API 配额
gateway 层没有配额限制;上游 API 配额仍然适用
每次调用 Token 数
gateway 开销最小
费用
免费(Apache 2.0)
提示
在 gateway 缓存 GET endpoint,以避免重复的上游计费

安全

权限、密钥、影响范围

最小权限: OAuth 发行方配置 + 租户范围的 API 密钥
凭据存储: Gateway 配置存储在磁盘(通过密钥管理器加密);租户 token 通过数据库存储
数据出站: gateway 转发到你配置的任何上游 URL
切勿授予: 不要在没有认证的情况下公开暴露 admin UI 不要在 git 中对生产 token 进行 YAML 编码

故障排查

常见错误与修复

每次调用上游都返回 401

Gateway 没有转发 auth header。在 YAML 中添加 Authorization 映射规则

验证: curl gateway with -v; check upstream headers
热加载没有获取我的 YAML 更改

首先在 UI 的 Lint 标签页中验证 YAML;热加载会悄无声息地拒绝无效配置

OAuth redirect_uri mismatch

在 OAuth 提供方中注册确切的 gateway URL

SSE 在 60 秒后断开连接

负载均衡器空闲超时。将其提高到 3600s 或使用 Streamable HTTP

替代方案

Unla 对比其他方案

替代方案何时用它替代权衡
MCPHub你希望有一个支持智能向量路由的 TypeScript hub对 REST-to-MCP 转换的关注度较低
ToolHive你希望进行容器化的逐 MCP 隔离不是一个 REST-to-MCP 转换器

更多

资源

📖 阅读 GitHub 上的官方 README

🐙 查看未解决的 issue

🔍 浏览全部 400+ MCP 服务器和 Skills