mcpField
W
workspaces

workspaces

github.com/stahura数据与数据库24178 次安装26 周前更新
代码仓库

关于 workspaces

这是一份通过未公开的 REST API 管理 Domo 工作区的逆向参考,适用于整理工作区内容的开发者。它介绍添加、移除、列出和搜索工作区项目的端点。

主要功能

  1. 01添加卡片及其他内容
  2. 02移除内容但不删除原项目
  3. 03列出工作区内容及元数据
  4. 04列出可访问的工作区
  5. 05搜索工作区内容

适用场景

  1. 01整理工作区中的卡片
  2. 02查看工作区内容和标题
  3. 03从工作区移除项目

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/stahura/domo-ai-vibe-rules --skill workspaces

安装后在 Claude Code 中输入/workspaces确认已加载。

详细介绍

Domo Workspace API(逆向工程)

CLI 与 API:Java CLI 没有 workspace 命令。所有 workspace 操作都需要通过 curl 调用 REST API。

状态:截至 2026 年 3 月,未公开文档 / 逆向工程 Base URL:https://<instance>.domo.com 认证:X-DOMO-Developer-Token 请求头

概述

Domo 中的 Workspace 是组织性容器,将相关内容——卡片、页面、数据集、应用及其他资产——归入一个可导航的集合。Workspace API 没有由 Domo 公开文档化。这些端点是从 Domo Web 客户端逆向工程得来,并通过测试验证。

支持的操作:

  • 向 workspace 添加内容(卡片、页面、数据集)
  • 从 workspace 移除内容
  • 列出 workspace 的所有内容
  • 在 workspace 内搜索特定内容

端点

1. 向 Workspace 添加内容(推荐)

向 workspace 添加单个内容项。这是已确认可用的端点。

字段值
方法POST
路径/nav/v1/workspaces/:guid/contents
Content-Typeapplication/json

请求体:

{
  "entityId": "728638278",
  "entityType": "CARD"
}

响应(成功):

{
  "id": 6,
  "entityType": "CARD",
  "entityId": "728638278",
  "addedAt": "2026-03-04 16:37:52",
  "addedBy": 149955692
}

支持的 entityType 值:CARD、PAGE、DATASET、DATA_APP、WORKSPACE_URL

已验证:该端点于 2026 年 3 月通过向一个 workspace 添加 22 张卡片进行了测试。全部 22 张均成功。

1b. 向 Workspace 添加内容(批量 - 不可靠)

批量端点存在,但在测试中,无论采用何种格式变体,都返回 400 Bad Request。请改用上面的单项端点。

字段值
方法POST
路径/nav/v1/workspaces/bulk/execute
Content-Typeapplication/json

请求体(有文档记载但不可靠):

{
  "operations": [
    {
      "operation": "ADD",
      "workspace": "99bf62b4-21f8-474b-985b-9bb83c773998",
      "contents": [
        {
          "id": "CARD_OR_CONTENT_ID",
          "type": "CARD"
        }
      ]
    }
  ]
}

警告:在 2026 年 3 月的测试中,无论 id/entityId 格式、字符串/数字类型,还是内容类型值(CARD、card、KPI_CARD)如何,该端点都返回 400 错误。单项 /contents 端点是可靠的替代方案。


2. 从 Workspace 移除内容

从 workspace 移除内容,但不会将其从 Domo 中删除。请使用内容在 workspace 内部的 id(添加时返回的数字 ID,或从列出 workspace 内容中获得),而不是卡片/数据集 ID。

字段值
方法DELETE
路径/nav/v1/workspaces/:guid/contents/:contentId

其中 :contentId 是 workspace 内部的数字 ID(列表/添加响应中的 id 字段)。

替代方案(批量端点 - 可能不可靠,见第 1b 节的说明):

字段值
方法POST
路径/nav/v1/workspaces/bulk/execute
Content-Typeapplication/json
{
  "operations": [
    {
      "operation": "REMOVE",
      "workspace": "99bf62b4-21f8-474b-985b-9bb83c773998",
      "contents": [
        {
          "id": "CARD_OR_CONTENT_ID",
          "type": "CARD"
        }
      ]
    }
  ]
}

3. 列出 Workspace 内容

返回 workspace 中的所有内容对象,可选包含详细信息。

字段值
方法GET
路径/nav/v1/workspaces/:guid/walk?includeDetails=true

路径参数:

  • :guid -- Workspace GUID(例如 99bf62b4-21f8-474b-985b-9bb83c773998)

查询参数:

  • includeDetails(布尔值)-- 当为 true 时,返回每个内容项的完整元数据

响应结构:

{
  "current": null,
  "pins": [],
  "sorts": [],
  "folders": [],
  "contents": [
    {
      "id": 6,
      "entityType": "CARD",
      "entityId": "728638278",
      "addedAt": "2026-03-04 16:37:52",
      "addedBy": 149955692,
      "attributes": {
        "entityType": "card",
        "databaseId": "728638278",
        "winnerText": "Revenue by Department",
        ...
      }
    }
  ]
}

每个内容项的关键字段:

  • id -- Workspace 内部数字 ID(用于移除操作)
  • entityType -- CARD、DATA_APP、WORKSPACE_URL 等
  • entityId -- Domo 实体 ID(卡片 ID、数据集 ID 等)
  • attributes.winnerText -- 显示名称/标题
3b. 列出所有 Workspace

返回已认证用户有权访问的所有 workspace。

字段值
方法GET
路径/nav/v1/workspaces

响应结构:

{
  "results": [
    {
      "guid": "579394f2-5ec2-4152-b2b7-7e2c6c7a1305",
      "name": "Claude",
      "createdAt": "2026-03-04 16:31:32",
      "createdBy": 149955692,
      "icon": "ai",
      "iconColor": "#e4715d",
      "members": [...],
      "contents": [],
      "folders": []
    }
  ]
}

4. 搜索工作区内容

在工作区内搜索与查询匹配的内容。

字段值
方法POST
路径/nav/v1/workspaces/:guid/addContentQuery
Content-Typeapplication/json

路径参数:

  • :guid -- 工作区 GUID

示例:

POST /nav/v1/workspaces/99bf62b4-21f8-474b-985b-9bb83c773998/addContentQuery

身份验证

所有请求都需要将 Domo Developer Token 作为标头传递:

X-DOMO-Developer-Token: your_token_here

在 Domo UI 中通过 Admin > Security > Access Tokens 生成令牌。


代码示例

Python (requests)
import requests

DOMO_BASE = "https://your-instance.domo.com/api"
TOKEN = "your_domo_developer_token"
WORKSPACE_GUID = "579394f2-5ec2-4152-b2b7-7e2c6c7a1305"

headers = {
    "X-DOMO-Developer-Token": TOKEN,
    "Content-Type": "application/json",
}


def add_card_to_workspace(card_id: str) -> dict:
    """Add a single card to the workspace (confirmed working)."""
    url = f"{DOMO_BASE}/nav/v1/workspaces/{WORKSPACE_GUID}/contents"
    body = {"entityId": card_id, "entityType": "CARD"}
    resp = requests.post(url, json=body, headers=headers)
    resp.raise_for_status()
    return resp.json()


def add_multiple_cards_to_workspace(card_ids: list[str]) -> list[dict]:
    """Add multiple cards one at a time."""
    results = []
    for card_id in card_ids:
        result = add_card_to_workspace(card_id)
        results.append(result)
    return results


def list_workspace_contents() -> dict:
    """List all contents of the workspace with details."""
    url = f"{DOMO_BASE}/nav/v1/workspaces/{WORKSPACE_GUID}/walk"
    params = {"includeDetails": "true"}
    resp = requests.get(url, params=params, headers=headers)
    resp.raise_for_status()
    return resp.json()


def list_all_workspaces() -> dict:
    """List all workspaces the user has access to."""
    url = f"{DOMO_BASE}/nav/v1/workspaces"
    resp = requests.get(url, headers=headers)
    resp.raise_for_status()
    return resp.json()


def search_workspace(query_body: dict) -> dict:
    """Search for content within the workspace."""
    url = f"{DOMO_BASE}/nav/v1/workspaces/{WORKSPACE_GUID}/addContentQuery"
    resp = requests.post(url, json=query_body, headers=headers)
    resp.raise_for_status()
    return resp.json()
curl

向工作区添加卡片(已验证可用):

curl -X POST "https://your-instance.domo.com/api/nav/v1/workspaces/WORKSPACE_GUID/contents" \
  -H "X-DOMO-Developer-Token: $DOMO_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"entityId": "123456789", "entityType": "CARD"}'

列出所有工作区:

curl -X GET "https://your-instance.domo.com/api/nav/v1/workspaces" \
  -H "X-DOMO-Developer-Token: $DOMO_TOKEN"

列出工作区内容:

curl -X GET "https://your-instance.domo.com/api/nav/v1/workspaces/WORKSPACE_GUID/walk?includeDetails=true" \
  -H "X-DOMO-Developer-Token: $DOMO_TOKEN"

搜索工作区:

curl -X POST "https://your-instance.domo.com/api/nav/v1/workspaces/WORKSPACE_GUID/addContentQuery" \
  -H "X-DOMO-Developer-Token: $DOMO_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{}'

注意事项和已知问题

问题详情
批量端点返回 400在 2026 年 3 月的测试中,/nav/v1/workspaces/bulk/execute 端点在所有格式变体(id/entityId、字符串/数字、CARD/card/KPI_CARD)下均返回 400 Bad Request。请改用 /nav/v1/workspaces/:guid/contents —— 该端点已验证可用。
使用 /contents 而非 /bulk/execute单项 POST /nav/v1/workspaces/:guid/contents 端点搭配 {"entityId": "...", "entityType": "CARD"} 是添加内容的可靠方式。已在单次会话中用 22 张卡片验证。
entityType 值从现有工作区数据中确认:CARD、DATA_APP、WORKSPACE_URL。另有文档记载:PAGE、DATASET。
未记录的 API这些端点不在官方 Domo API 文档中。它们是从 Domo Web 客户端逆向工程得出的,可能随时更改,恕不另行通知。
GUID 格式工作区标识符使用 UUID/GUID 格式(例如 579394f2-5ec2-4152-b2b7-7e2c6c7a1305),而非数字 ID。
响应包含内部 ID添加内容时,响应中包含一个 id 字段(例如 6)。这是工作区内部的内容 ID,与卡片/数据集 ID 不同。请使用此 ID 进行删除操作。
URL 必须包含 /api 前缀工作区端点使用 /api/nav/v1/... 路径。省略 /api 会返回 404。

评论

支持 Markdown