---
name: office-link
description: 通过 MorphixAI 统一链接和管理第三方账号（GitHub、GitLab、Gmail、Outlook、Jira、Slack 等），并通过代理安全调用第三方 API。
metadata:
  openclaw:
    emoji: "🔗"
    requires:
      env: [MORPHIXAI_API_KEY]
---

# Office Link — 第三方账号链接与 API 代理

通过 `mx_link` 工具，统一管理第三方平台的账号链接和 API 调用。Bot 不直接持有 OAuth token，所有请求通过 MorphixAI 服务端代理，自动管理凭据。

> **重要：优先使用已有的专用 skill。** 对于已有专用 skill 的平台，**必须优先使用对应 skill**（如 `jira-workflow`、`gitlab-workflow`、`outlook-email` 等）而非 `mx_link` 的 `proxy`。专用 skill 自动处理 URL 构建、认证、数据格式转换，更可靠且更简洁。`mx_link` 仅用于：
> 1. **账号管理**（查看/链接账号）
> 2. **调用尚未有专用 skill 的平台 API**（如 Slack、Discord、Zoom、Google Sheets 等）

## 前置条件

1. **安装插件**: `openclaw plugins install openclaw-morphixai`
2. **获取 API Key**: 访问 [morphix.app/api-keys](https://morphix.app/api-keys) 生成 `mk_xxxxxx` 密钥
3. **配置环境变量**: `export MORPHIXAI_API_KEY="mk_your_key_here"`
4. **链接账号**: 访问 [morphix.app/connections](https://morphix.app/connections) 管理账号，或使用下方 `mx_link: connect` 操作

## 工具选择规则

```
用户请求操作某个平台
  ├── 有专用 skill？ → 使用专用 skill（见下方列表）
  ├── 账号未链接？ → mx_link: connect 引导授权
  └── 无专用 skill？ → mx_link: proxy 兜底代理调用
```

## 核心能力

1. **账号管理** — 查看已链接账号、引导用户链接新账号
2. **API 代理** — 通过已链接账号安全调用第三方 API（仅用于无专用工具的平台）
3. **统一入口** — 支持 40+ 第三方平台，无需各自配置

## 支持的平台

| 类别 | 平台 | app 标识 |
|------|------|----------|
| 开发工具 | GitHub | `github` |
| | GitLab | `gitlab` |
| | Jira | `jira` |
| | Linear | `linear` |
| 邮箱 | Gmail | `gmail` |
| | Outlook | `outlook` |
| 即时通讯 | Slack | `slack` |
| | Discord | `discord` |
| 文档协作 | Notion | `notion` |
| | Google Sheets | `google_sheets` |
| | Confluence | `confluence` |
| 设计 | Figma | `figma` |
| 日历 | Google Calendar | `google_calendar` |
| | Zoom | `zoom` |
| 其他 | HubSpot | `hubspot` |
| | Trello | `trello` |
| | Asana | `asana` |

> 完整列表可通过 `mx_link` 的 `list_apps` action 获取。

## 使用流程

### 1. 检查已链接账号

```
使用 mx_link 工具:
  action: list_accounts
  app_name: "github"  (可选，筛选特定平台)
```

### 2. 引导用户链接新账号

如果用户需要的平台尚未链接：

```
使用 mx_link 工具:
  action: connect
  app: "github"  (必须指定目标应用)
```

返回一个 OAuth 授权链接，发送给用户在浏览器中完成授权。链接有效期 4 小时。

> **重要：`app` 参数必须提供。** 后端返回的链接格式为：
> ```
> https://pipedream.com/_static/connect.html?token=ctok_xxx&connectLink=true
> ```
> 该链接如果缺少 `app` 参数则无法访问。当传入 `app` 参数后，生成的链接会包含 `&app=<app_name>`，例如：
> ```
> https://pipedream.com/_static/connect.html?token=ctok_xxx&connectLink=true&app=gitlab
> ```
> 只有带 `app` 参数的链接才能正常打开授权页面。

### 3. 通过代理调用第三方 API（仅限无专用 skill 的平台）

> **再次强调：** 对于已有专用 skill 的平台（见下方完整列表），**必须使用专用 skill**。`proxy` 仅作为无专用 skill 时的兜底方案。

用户授权完成后，对于没有专用 skill 的平台，用 `proxy` action 调用第三方 API：

**示例：查询 Slack 频道消息（无专用工具，使用 proxy）**
```
使用 mx_link 工具:
  action: proxy
  account_id: "apn_xxx"   (从 list_accounts 获取)
  method: "GET"
  url: "https://slack.com/api/conversations.history"
  params: { "channel": "C01234567", "limit": 10 }
```

**示例：创建 Google Sheets 行（无专用工具，使用 proxy）**
```
使用 mx_link 工具:
  action: proxy
  account_id: "apn_xxx"
  method: "POST"
  url: "https://sheets.googleapis.com/v4/spreadsheets/{spreadsheetId}/values/{range}:append"
  params: { "valueInputOption": "USER_ENTERED" }
  body: {
    "values": [["2026-02-25", "完成 SDK 集成", "通过"]]
  }
```

## 已有专用 Skill（必须优先使用）

以下平台已有专用 skill，**禁止使用 `mx_link: proxy` 替代**：

| 专用 skill | 平台 | app 标识 | 使用的工具 |
|-----------|------|----------|-----------|
| `jira-workflow` | Jira Cloud | `jira` | `mx_jira` |
| `gitlab-workflow` | GitLab | `gitlab` | `mx_gitlab` |
| `github-workflow` | GitHub | `github` | `mx_github` |
| `outlook-email` | Outlook 邮箱 | `microsoft_outlook` | `mx_outlook` |
| `outlook-calendar` | Outlook 日历 | `microsoft_outlook_calendar` | `mx_outlook_calendar` |
| `ms-todo` | Microsoft To Do | `microsofttodo` | `mx_ms_todo` |
| `gmail` | Gmail | `gmail` | `mx_gmail` |
| `google-tasks` | Google Tasks | `google_tasks` | `mx_google_tasks` |
| `notion` | Notion | `notion` | `mx_notion` |
| `confluence` | Confluence Cloud | `confluence` | `mx_confluence` |
| `figma` | Figma | `figma` | `mx_figma` |

专用 skill 的优势：
- **自动账号检测** — 无需手动查 account_id
- **自动 URL 构建** — 无需知道 API 端点
- **自动格式转换** — 如 Jira Markdown→ADF、Confluence Storage Format
- **语义化参数** — `jql: "..."` 比手写 REST URL 更直观
- **内置工作流** — 每个 skill 包含常见场景的操作步骤

`mx_link` 的 `proxy` action **仅适用于**上述列表之外的应用（如 Slack、Discord、Zoom、Google Sheets 等）。

## 常见场景

### 有专用 skill → 直接使用对应 skill

```
# 查 Jira 待办 → 使用 jira-workflow skill
mx_jira: action: search_issues,
  jql: "assignee = currentUser() AND status != Done ORDER BY updated DESC"

# 查 GitLab MR → 使用 gitlab-workflow skill
mx_gitlab: action: list_merge_requests, state: "opened"

# 查 GitHub 仓库 → 使用 github-workflow skill
mx_github: action: list_repos, sort: "updated", per_page: 5

# 查今日日程 → 使用 outlook-calendar skill
mx_outlook_calendar: action: get_calendar_view,
  start_date_time: "2026-02-25T00:00:00Z", end_date_time: "2026-02-25T23:59:59Z"
```

### 无专用 skill → 兜底使用 mx_link proxy

```
# Slack 消息（无专用 skill）→ 使用 proxy
1. mx_link: list_accounts, app_name="slack"
2. mx_link: proxy, account_id="apn_xxx", method="GET",
   url="https://slack.com/api/conversations.history",
   params={"channel":"C01234567","limit":10}

# Google Sheets（无专用 skill）→ 使用 proxy
1. mx_link: list_accounts, app_name="google_sheets"
2. mx_link: proxy, account_id="apn_xxx", method="GET",
   url="https://sheets.googleapis.com/v4/spreadsheets/{id}/values/Sheet1"
```

### 账号未链接 → 引导连接

```
1. mx_link: list_accounts, app_name="slack"
     → 返回空列表
2. mx_link: connect, app: "slack"
     → 返回 OAuth 授权链接，发给用户
3. 用户完成授权后，重新操作
```

## 错误处理

- **401** — API Key 无效或已过期，提示用户到 MorphixAI 控制台 (https://morphix.app/api-keys) 重新创建
- **403** — API Key 缺少权限范围，需要全选 scope（`user:profile:read`、`link`）
- **账号未链接** — 使用 `connect` action 引导用户授权
- **第三方 API 错误** — proxy 返回第三方原始错误，根据各平台文档处理

## 配置

### 环境变量

```bash
# ~/.openclaw/.env
MORPHIXAI_API_KEY=mk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```

### 或通过 openclaw.json

```json
{
  "morphix": {
    "apiKey": "mk_xxx"
  }
}
```

### 获取 API Key

1. 登录 MorphixAI 控制台 https://morphix.app/api-keys
2. 点击「创建 API Key」，**Scope 全选**
3. 复制保存 Key（只显示一次）

## 最佳实践

1. **专用 skill 优先** — 有专用 skill 的平台**必须用对应 skill**，`proxy` 只作为无专用 skill 时的兜底
2. **先查后连** — 总是先用 `list_accounts` 检查是否已链接，避免重复引导用户授权
3. **缓存 account_id** — 在对话中缓存 `account_id`，无需每次都查询
4. **组合使用** — 一个对话中可以跨 skill 操作（先用 `jira-workflow` 查任务，再用 `mx_link: proxy` 发 Slack 通知）
5. **优雅降级** — 如果 API Key 未配置，提示用户设置环境变量

---

> 文档与源码：[GitHub](https://github.com/Morphicai/openclaw-morphixai)
