Tips & Tricks

Claude Code x SaaS 集成完全指南:Notion、Slack、Linear、GitHub、Figma

把日常业务 SaaS 直接接入 Claude Code 的实战指南。针对五大 SaaS 的集成代码与真实运营模式,配可运行代码详尽讲解。

你是否还把 Claude Code 仅仅当作写代码的工具?只要接上日常使用的 SaaS,Claude Code 就会进化成一个彻底的”业务编排器”。往 Notion 写笔记、在 Slack 发帖、在 Linear 建工单、在 GitHub 提 PR、从 Figma 获取设计——这一切只需一句自然语言即可完成。

本文整理了ClaudeCodeLab 运营中实际在用的五大 SaaS 集成模式,附可运行代码与设置步骤。读完之后,你就能拥有一个属于自己的业务自动化枢纽。

集成的基础架构

把 Claude Code 与 SaaS 连起来,大致有三种方式。

方式实施成本灵活性推荐用途
MCP 服务器高频集成、跨多项目复用
CLI 包装一次性脚本、简单集成
Webhook 接收由 SaaS 侧触发的双向集成

新手最快的路线是从 CLI 包装开始。只需让 Claude Code 通过 Bash 工具敲 API 即可,把 API Key 放到环境变量就能跑起来。熟练后再把它提升为 MCP 服务器,就是主流路线了。

1. Notion 集成:用 AI 批量生产页面

使用场景

  • 将会议纪要直接发布到 Notion
  • 自动生成周报
  • 让 AI 持续扩展内部知识库

实现

// scripts/notion-create-page.mjs
import { Client } from "@notionhq/client";

const notion = new Client({ auth: process.env.NOTION_TOKEN });

async function createPage(databaseId, title, markdown) {
  const blocks = markdown.split("\n\n").map((para) => ({
    object: "block",
    type: "paragraph",
    paragraph: {
      rich_text: [{ type: "text", text: { content: para } }],
    },
  }));

  const page = await notion.pages.create({
    parent: { database_id: databaseId },
    properties: {
      Name: { title: [{ text: { content: title } }] },
      Status: { select: { name: "Draft" } },
    },
    children: blocks,
  });

  return page.url;
}

const [, , dbId, title, ...bodyParts] = process.argv;
const url = await createPage(dbId, title, bodyParts.join(" "));
console.log(`Created: ${url}`);

在 Claude Code 中的用法

claude -p "
阅读以下会议纪要,整理成三个部分
(决议事项 / 行动项 / 下次议题),然后发布到
Notion 的会议纪要数据库:

$(cat ~/inbox/meeting-raw.txt)

使用 database_id: abc123...
发布后把 URL 发到 slack-channel-general。
"

Claude Code 通过 Bash 工具调用 notion-create-page.mjs,并把完成后的 URL 推送到 Slack,整个流程在一条 prompt 里走完。

2. Slack 集成:通知与推送的自动化

使用场景

  • 部署完成通知
  • 每周错误摘要推送
  • 把长篇报告整理到线程里

实现(最简单的 Incoming Webhook 版)

// scripts/slack-notify.mjs
const webhookUrl = process.env.SLACK_WEBHOOK_URL;
const message = process.argv.slice(2).join(" ");

const res = await fetch(webhookUrl, {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    text: message,
    blocks: [
      { type: "section", text: { type: "mrkdwn", text: message } },
    ],
  }),
});

console.log(res.ok ? "✓ Sent" : `✗ ${res.status}`);

Slack Bolt SDK 版(支持线程回复、私信等)

// scripts/slack-post-thread.mjs
import { WebClient } from "@slack/web-api";

const client = new WebClient(process.env.SLACK_BOT_TOKEN);

async function postThread(channel, parent, replies) {
  const main = await client.chat.postMessage({ channel, text: parent });
  for (const reply of replies) {
    await client.chat.postMessage({
      channel,
      text: reply,
      thread_ts: main.ts,
    });
  }
  return main.ts;
}

const channel = process.argv[2];
const [parent, ...replies] = process.argv.slice(3);
await postThread(channel, parent, replies);

Claude Code 的实战示例

claude -p "
执行 scripts/deploy.sh。
成功就把 '生产部署完成 🚀' 发到 #dev 频道,
并以线程回复的形式发送以下 3 条:
1. commit hash
2. 变更文件数
3. 构建耗时
失败则向 #dev-alerts 以红色高亮发出告警。
"

3. Linear 集成:自动建单

使用场景

  • 把 bug 讨论转为工单
  • 一次性录入设计评审的所有意见
  • 把 code review 评论拆分为独立任务

实现

// scripts/linear-create-issue.mjs
const LINEAR_API_KEY = process.env.LINEAR_API_KEY;
const LINEAR_TEAM_ID = process.env.LINEAR_TEAM_ID; // 例如 "ENG"

async function createIssue(title, description, priority = 2) {
  const query = `
    mutation CreateIssue($input: IssueCreateInput!) {
      issueCreate(input: $input) {
        success
        issue { id identifier url }
      }
    }
  `;
  const res = await fetch("https://api.linear.app/graphql", {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      Authorization: LINEAR_API_KEY,
    },
    body: JSON.stringify({
      query,
      variables: {
        input: {
          teamId: LINEAR_TEAM_ID,
          title,
          description,
          priority, // 0=None, 1=Urgent, 2=High, 3=Medium, 4=Low
        },
      },
    }),
  });
  const json = await res.json();
  return json.data.issueCreate.issue;
}

const [, , title, ...desc] = process.argv;
const issue = await createIssue(title, desc.join(" "), 2);
console.log(`Created: ${issue.identifier} - ${issue.url}`);

运营示例:从 PR 评审批量建单

claude -p "
读取 GitHub PR #234 的全部评审评论,
把需要修正的意见逐条在 Linear 中建单。

每张工单:
- 标题:意见摘要
- 正文:评论原文 + PR URL + 文件名:行号
- priority:'必须' 为 1,'建议' 为 3
"

4. GitHub 集成:组合使用 gh CLI

对于 GitHub,gh CLI 比原生 API 方便太多。Claude Code 只需通过 Bash 工具调用即可。

主要模式

# 创建 PR
gh pr create --title "feat: add cache layer" --body "$(cat desc.md)"

# 新建 Issue
gh issue create --title "Bug: user logout fails" --label "bug,priority-high"

# 查看 PR 评审
gh pr view 234 --comments

# 查看 CI 状态
gh run list --workflow deploy.yml --limit 5

# 创建 Release
gh release create v1.2.0 --notes "Changelog here"

运营示例:事故应急

claude -p "
生产日志里 500 错误频发。按以下步骤处理:

1. 读取 logs/prod-*.log 最近 1 小时,提取错误模式
2. 根据堆栈信息,用 git log 定位可疑 commit
3. 创建一个 revert 该 commit 的 PR(gh pr create)
4. 在 Linear 建一张事故工单
5. 在 Slack #incident-response 通报进展

目标:15 分钟内完成。
"

5. Figma 集成:把设计变代码

使用场景

  • 读取设计文件的组件结构
  • 将 Figma 的值(颜色、间距、字号)转为 CSS
  • 基于截图对比的视觉测试

实现(Figma REST API 版)

// scripts/figma-extract.mjs
const FIGMA_TOKEN = process.env.FIGMA_TOKEN;
const fileKey = process.argv[2];
const nodeId = process.argv[3];

const res = await fetch(
  `https://api.figma.com/v1/files/${fileKey}/nodes?ids=${nodeId}`,
  { headers: { "X-Figma-Token": FIGMA_TOKEN } }
);
const data = await res.json();
const node = data.nodes[nodeId].document;

// 提取颜色、排版和布局
const tokens = {
  colors: extractColors(node),
  typography: extractTypography(node),
  spacing: extractSpacing(node),
};

console.log(JSON.stringify(tokens, null, 2));

function extractColors(node) { /* 实现略 */ }
function extractTypography(node) { /* 实现略 */ }
function extractSpacing(node) { /* 实现略 */ }

在 Claude Code 中的用法

claude -p "
读取 Figma 文件 abc123 的 nodeId=456:789(卡片组件),
将其实现为 React 组件 components/Card.tsx。

- 对齐 Tailwind tokens(颜色从 theme.colors 选)
- props 为 children、variant(primary/secondary)
- 同时生成 Storybook story
- 通过 scripts/figma-extract.mjs 获取 Figma 值做参考
"

凭据管理:.env + gitignore 必不可少

所有集成通用的铁律:

# .env(绝对不纳入 git 管理)
NOTION_TOKEN=secret_xxx
SLACK_BOT_TOKEN=xoxb-xxx
SLACK_WEBHOOK_URL=https://hooks.slack.com/xxx
LINEAR_API_KEY=lin_api_xxx
LINEAR_TEAM_ID=ENG
FIGMA_TOKEN=figd_xxx
# .gitignore
.env
.env.*
!.env.example

写进 CLAUDE.md,防止事故

## 密钥处理
- .env 绝对不要 commit
- 脚本中通过 process.env 读取
- 不要把 API Key 写进 prompt 或输出
- 不要在错误信息中打印 Authorization header

五大坑

1. 忽视限流 Slack 每秒 1 次,Notion 每 3 秒 3 次,Linear 有 GraphQL 复杂度限制。批处理时务必夹入 sleep

async function batchPost(items) {
  for (const item of items) {
    await postToNotion(item);
    await new Promise((r) => setTimeout(r, 500)); // 500ms 间隔
  }
}

2. 漏掉 Webhook 的签名校验 构建 Webhook 接收端时,跳过签名校验会被重放攻击。Slack 和 GitHub 都公开了签名方案,一定要实现。

3. 没有明确以谁的权限执行 用 Bot 权限发帖却误以为会显示自己的名字,属于典型翻车。要在 README 里明确权限范围

4. 重试导致重复执行 网络错误重试后,Notion 里出现了三个相同页面之类。加上 idempotency key,保证只执行一次。

5. 服务宕机时没有降级 Slack 挂掉时部署通知送不出去,人工运营陷入静默。主要通知路径准备两条(比如 Slack + 邮件)更稳妥。

整合运营:一条 prompt 横跨五个服务

终极形态。让跨 SaaS 的工作流一气呵成:

claude -p "
准备本周 release:

1. 从 GitHub 用 gh log 抽取 master 上未发布的 commit
2. 以 Markdown 生成 release note
3. 在 Notion 'Releases' 数据库中新建页面
4. 统计 Linear 本周 closed 的 issue
5. 从 Figma 'v2.0 Design' 页面导出 5 张变更截图
6. 将以上整理成 Slack 贴文发往 #team
   (线程里放详情,主帖为 3 行摘要)
7. 用 gh release create v2.0.0 发布正式版本

每一步请简洁记录日志。
"

只要这条能跑通,每周耗时 1 小时的发布工作,就能全权交给 Claude Code,5 分钟搞定

总结

SaaS最短集成进阶形式
NotionCLI 包装 + API改造为 MCP 服务器
SlackIncoming WebhookBolt SDK + 线程管理
Linear直接调 GraphQL封装为 MCP 工具
GitHubgh CLI 足够与 Actions 结合
FigmaREST APIPlugin + MCP

扔掉 “Claude Code 只是写代码工具” 的固有印象,你所看见的世界瞬间变宽。先试 Slack Incoming Webhook,10 分钟就能跑起来,成本最低。接着加上 Notion 或 Linear,日常工作的 30% 大致都能自动化。

相关文章

参考资料

#claude-code #saas #notion #slack #linear #github #figma #integration

让你的 Claude Code 工作流更上一层楼

50 个经过实战检验的提示词模板,现在就能复制粘贴到 Claude Code 中使用。

免费

免费 PDF:5 分钟看懂 Claude Code 速查表

只需留下邮箱,我们就会立即把这份 A4 一页速查表 PDF 发送给你。

我们会严格保护你的个人信息,绝不发送垃圾邮件。

Masa

本文作者

Masa

深度使用 Claude Code 的工程师。运营 claudecode-lab.com——一个涵盖 10 种语言、超过 2,000 页内容的科技媒体。