콘텐츠로 이동

04. 통합 카탈로그

CALL 노드가 할 수 있는 일의 전체 목록입니다. integration:에 아래 id를 적고, input:에 그 통합이 요구하는 값을 채우면 됩니다.

- id: 노드id
  name: 노드 이름
  type: CALL
  integration: llm_chat      # ← 여기
  input:                     # ← 통합마다 요구하는 항목이 다릅니다
    ...

전체 목록

연결 없이 바로 쓰는 것

id 이름 분류 하는 일
http_request HTTP 요청 HTTP 아무 HTTP API나 직접 호출
llm_chat LLM Chat AI AI에게 요약·분류·작문 시키기 (API 키는 시크릿으로)
transform_jmespath Transform (JMESPath) DATA JSON 데이터 가공·필터링
dataset Dataset DATA 워크스페이스 데이터셋 읽고 쓰기

연결이 필요한 것

id 이름 분류 연결 발송
slack_post_message Slack 메시지 발송 MESSAGING Slack ⚠️
kakao_send_memo 카카오톡 나에게 보내기 MESSAGING 카카오톡 ⚠️
github_list_workflow_runs GitHub Actions 실행 목록 조회 HTTP GitHub
github_get_workflow_run GitHub Actions 실행 상세 조회 HTTP GitHub
github_list_run_jobs GitHub Actions 실행 job 목록 조회 HTTP GitHub
github_rerun_failed_jobs GitHub Actions 실패 job 재실행 HTTP GitHub ⚠️
github_dispatch_workflow GitHub Actions 워크플로우 실행 HTTP GitHub ⚠️
github_list_pull_requests GitHub PR 목록 조회 HTTP GitHub
github_create_issue_comment GitHub 이슈·PR 코멘트 작성 HTTP GitHub ⚠️

발송 ⚠️ 표시는 부수효과(side effect) 가 있다는 뜻입니다 — 실제로 메시지가 나가거나, 외부에 글이 남거나, CI가 돌아갑니다. AI 비서(MCP)로 실행할 때 이런 워크플로우는 바로 돌지 않고 승인을 한 번 묻습니다.

연결이 필요 없는 것부터 쓰세요. http_request · llm_chat · transform_jmespath 이 셋만으로 웬만한 자동화는 처음부터 끝까지 만들 수 있습니다. OAuth 연결은 정말 그 서비스가 필요할 때만 하면 됩니다.

최신 목록 확인: 이 카탈로그는 늘어납니다. 지금 워크스페이스에서 쓸 수 있는 목록은 비주얼 에디터의 노드 팔레트에서, 또는 AI 비서를 연결했다면 "쓸 수 있는 통합 알려줘"로 확인할 수 있습니다.


http_request

아무 HTTP API나 직접 호출합니다. 가장 자유도가 높고, 가장 많이 쓰게 될 통합입니다.

입력

항목 필수 설명
uri 호출할 주소. 표현식 사용 가능
method GET · POST · PUT · DELETE · PATCH
mediaType Content-Type. 기본값 application/json
queryParams 쿼리 스트링 (?a=1&b=2)
body 요청 본문
authenticate 인증 헤더 묶음 (아래 참고)

예제 — 조회

- id: fetch-orders
  name: 주문 조회
  type: CALL
  integration: http_request
  timeout: 10s
  input:
    uri: "https://api.example.com/v1/orders"
    method: GET
    queryParams:
      status: "PAID"
      from: "${nodes.trigger.response.body.windowStart}"
    authenticate:
      authMethod: HEADERS
      data:
        Authorization: "Bearer ${secrets.EXAMPLE_API_TOKEN}"

예제 — 전송

- id: post-hook
  name: 외부 시스템에 통보
  type: CALL
  integration: http_request
  input:
    uri: "https://hooks.example.com/notify"
    method: POST
    body:
      orderId: "${nodes.trigger.response.body.orderId}"
      status: "confirmed"

출력

응답 본문이 그대로 출력됩니다.

${nodes.fetch-orders.response.body.data}          # 응답 본문의 data 필드
${nodes.fetch-orders.response.body.items.0.name}  # 배열 첫 번째 원소의 name

리다이렉트(3xx) 처리

301 · 302 · 303 · 307 · 308이음새가 알아서 따라갑니다 (최대 5번). 따라갈 수 없는 3xx — Location 헤더가 없거나 300 · 304 — 는 노드 실패로 처리됩니다.

성공으로 흘려보내면 응답 본문이 비어 있어서, 진짜 원인이 한 노드 뒤의 표현식 에러로 나타나기 때문입니다. 이 에러를 만나면 최종 주소를 직접 uri에 적으세요.

API 키는 반드시 ${secrets.*} 로. YAML에 토큰을 그대로 적으면 워크플로우를 복사·공유할 때 함께 새어나갑니다. → 08. 변수와 시크릿


llm_chat

AI를 부릅니다. 요약, 분류, 말투 바꾸기, 초안 쓰기 등에 씁니다.

특정 회사에 묶이지 않고 API 형식(계약) 을 고르는 방식입니다. 형식만 맞으면 어느 제공사든 쓸 수 있습니다.

입력

항목 필수 설명
apiContract OPENAI_CHAT 또는 ANTHROPIC_MESSAGES
model 모델 id. 예: gpt-4o-mini, claude-sonnet-4-6
apiKey API 키. ${secrets.*} 로 넣으세요
userPrompt AI에게 시킬 내용
systemPrompt 역할·규칙 지정
endpoint 생략 시 계약별 기본 주소
maxTokens 최대 응답 길이. ANTHROPIC_MESSAGES는 생략 시 4096으로 전송
temperature 0~2. 지정했을 때만 전달됩니다

endpoint를 생략하면 이렇게 갑니다.

apiContract 기본 주소
OPENAI_CHAT https://api.openai.com/v1/chat/completions
ANTHROPIC_MESSAGES https://api.anthropic.com/v1/messages

계약만 호환되면 다른 곳도 됩니다 (Fireworks, Together, 직접 띄운 vLLM 등). endpoint에 주소를 적으세요.

예제

- id: summarize
  name: 매출 요약
  type: CALL
  integration: llm_chat
  timeout: 30s
  input:
    apiContract: OPENAI_CHAT
    model: gpt-4o-mini
    apiKey: "${secrets.OPENAI_API_KEY}"
    systemPrompt: "너는 이커머스 운영 담당자다. 숫자를 과장하지 말고 사실만 간결하게 전달한다."
    userPrompt: |
      아래 주문 데이터를 3줄로 요약해줘.
      총 매출과 주문 건수를 반드시 포함하고, 눈에 띄는 변화가 있으면 한 줄 덧붙여.

      데이터: ${nodes.aggregate.response.body.summary}

출력

필드 설명
${nodes.summarize.response.body.content} AI가 쓴 텍스트
${nodes.summarize.response.body.tokenUsage.totalTokens} 사용 토큰 수
${nodes.summarize.response.body.tokenUsage.promptTokens} 입력 토큰
${nodes.summarize.response.body.tokenUsage.completionTokens} 출력 토큰

temperature 주의: 최신 Claude 모델 등 일부는 이 값을 받지 않고 400 에러를 냅니다. 필요 없으면 아예 빼세요.

비용은 본인 부담입니다. 이음새는 여러분의 API 키로 대신 호출해줄 뿐이고, 요금은 OpenAI·Anthropic 등에 직접 청구됩니다. 토큰이 걱정되면 maxTokens로 상한을 두세요.

AI 응답으로 분기하고 싶다면 → 06. 흐름 제어contains 연산자


transform_jmespath

JSON 데이터를 원하는 모양으로 바꿉니다. 필요한 필드만 뽑기, 조건에 맞는 것만 거르기, 개수 세기 등.

JMESPath 문법을 씁니다.

입력

항목 필수 설명
expression JMESPath 표현식
data 변환할 대상. 생략하면 expression을 뺀 나머지 input 전체

⚠️ 결과는 반드시 객체여야 합니다

CALL 노드의 출력은 JSON 객체여야 합니다. 배열이나 숫자를 그대로 내보내면 실패합니다. 중괄호로 감싸세요.

expression: "items[*].id"              # ❌ 배열 → 실패
expression: "{ids: items[*].id}"       # ✅ 객체 → 성공

expression: "length(items)"            # ❌ 숫자 → 실패
expression: "{count: length(items)}"   # ✅ 성공

자주 쓰는 패턴

# 특정 필드만 뽑아 배열로
expression: "{ids: data[*].orderId}"

# 조건으로 거르기 (백틱 주의)
expression: "{active: items[?status == `active`]}"

# 개수 세기 + 합계
expression: "{count: length(orders), total: sum(orders[*].amount)}"

# 필드 이름 바꾸기
expression: "{이름: customer.name, 금액: payment.total}"

# 여러 개를 한 번에
expression: "{건수: length(orders), 매출: sum(orders[*].amount), 첫주문: orders[0]}"

예제

- id: aggregate
  name: 주문 집계
  type: CALL
  integration: transform_jmespath
  input:
    expression: "{건수: length(@), 매출합계: sum([*].amount)}"
    data: "${nodes.fetch-orders.response.body.data | raw}"

| raw 를 꼭 붙이세요. 배열이나 객체를 다른 노드에 넘길 때 이 표시가 없으면 문자열로 변환되어 버립니다. → 05. 표현식으로 데이터 잇기

출력

expression 평가 결과가 그대로 출력됩니다.

${nodes.aggregate.response.body.건수}
${nodes.aggregate.response.body.매출합계}

dataset

워크스페이스 데이터셋에 행을 읽고 씁니다. 실행 사이에 값을 기억해야 할 때 씁니다 (예: 이미 처리한 주문 번호, 누적 집계).

데이터셋은 미리 만들어 두어야 합니다. → 09. 데이터셋

입력

항목 필수 설명
datasetTitle 대상 데이터셋 제목 (워크스페이스 안에서 고유)
operation QUERY · INSERT · UPDATE · DELETE
data INSERT/UPDATE 저장할 값. 데이터셋 컬럼에 없는 키는 버려집니다
rowId UPDATE/DELETE 대상 행 id
limit QUERY 최대 행 수. 기본 100, 최대 1000
offset QUERY 시작 위치

예제

# 읽기
- id: load-log
  type: CALL
  integration: dataset
  input:
    datasetTitle: "처리이력"
    operation: QUERY
    limit: 50

# 쓰기
- id: save-log
  type: CALL
  integration: dataset
  input:
    datasetTitle: "처리이력"
    operation: INSERT
    data:
      주문번호: "${nodes.trigger.response.body.orderId}"
      처리시각: "${nodes.trigger.response.body.windowEnd}"

출력

operation 출력 모양 참조 예
QUERY { rows: [ {id, ...컬럼}, ... ] } ${nodes.load-log.response.body.rows \| raw}
INSERT / UPDATE { id, ...컬럼 } ${nodes.save-log.response.body.id}
DELETE { deleted: true, id } ${nodes.del.response.body.deleted}

slack_post_message

연결된 Slack 워크스페이스의 채널에 메시지를 보냅니다.

사전 준비

  1. 연결 화면에서 Slack을 연결합니다. → 07. 연결 관리
  2. 메시지를 보낼 채널에 이음새 봇을 초대합니다. 채널에서 /invite @이음새. 이 단계를 빠뜨리면 not_in_channel 에러가 납니다.

입력

항목 필수 설명
channel 채널 ID (예: C0123ABCDEF) 또는 채널명
text 메시지 본문

비주얼 에디터에서는 channel을 연결된 Slack의 채널 목록에서 골라서 넣을 수 있습니다.

예제

- id: notify
  name: Slack 발송
  type: CALL
  integration: slack_post_message
  input:
    channel: "C0123ABCDEF"
    text: |
      📊 오늘의 매출 요약

      ${nodes.summarize.response.body.content}

출력

필드 설명
${nodes.notify.response.body.ok} 성공 여부
${nodes.notify.response.body.channel} 발송된 채널
${nodes.notify.response.body.ts} 메시지 타임스탬프

⚠️ 이 통합은 "실제로 발송"합니다

slack_post_message부수효과(side effect) 가 있는 통합으로 표시되어 있습니다. AI 비서(MCP)로 실행할 때 이런 워크플로우는 바로 돌지 않고 승인을 한 번 묻습니다. AI가 실수로 고객에게 메시지를 뿌리는 일을 막기 위한 장치입니다.


kakao_send_memo

연결한 카카오 계정의 "나와의 채팅방"으로 알림을 보냅니다. 슬랙을 쓰지 않는 1인 사업자가 휴대폰으로 바로 알림을 받고 싶을 때 가장 간단한 방법입니다.

사전 준비

연결 화면에서 카카오톡을 연결합니다. → 07. 연결 관리

입력

항목 필수 설명
text 보낼 메시지 본문. 최대 200자

예제

- id: notify-me
  name: 카카오톡 알림
  type: CALL
  integration: kakao_send_memo
  input:
    text: |
      [매출 리포트]
      ${nodes.summarize.response.body.content}

출력

필드 설명
${nodes.notify-me.response.body.resultCode} 카카오 응답 코드 (성공 시 0)

⚠️ 받는 사람은 본인 한 명입니다

카카오 메모 API에는 수신자 지정이 없습니다. 연결한 카카오 계정 본인에게만 갑니다. 팀 알림이 아니라 운영자 1인 알림 용도입니다. 여러 사람에게 보내야 한다면 Slack을 쓰세요.

200자 제한은 스키마로 강제됩니다. 넘으면 저장 또는 실행이 거부됩니다. AI 요약을 보낼 때는 systemPrompt에 "200자 이내로" 를 넣어두세요.


GitHub 통합

GitHub Actions와 Pull Request를 다룹니다. CI·배포 결과를 폴링해서 알리거나, 실패한 job을 자동으로 재실행하거나, 리뷰 대기 PR을 리마인드하는 자동화에 씁니다.

사전 준비

연결 화면에서 GitHub을 연결합니다. 7개 통합이 이 연결 하나를 함께 씁니다. → 07. 연결 관리

공통 입력

모든 GitHub 통합이 owner · repo를 받습니다.

항목 설명
owner 리포지토리 소유자 (사용자 또는 조직 이름). 예: boboc-app
repo 리포지토리 이름. 예: weaver

조회

id 추가 입력 출력
github_list_workflow_runs status (기본 completed) · perPage (기본 20, 최대 100) runs (배열) · totalCount
github_get_workflow_run runId id · name · status · conclusion · htmlUrl · headBranch · headSha · runStartedAt
github_list_run_jobs runId ✅ · filter (latest 기본 / all) · perPage (기본 30) jobs (배열) · totalCount
github_list_pull_requests state (open 기본) · sort (updated 기본) · direction (desc 기본) · perPage pullRequests (배열)

발송 ⚠️

id 추가 입력 하는 일
github_rerun_failed_jobs runId 실패한 job만 다시 실행
github_dispatch_workflow workflowFileName ✅ · ref workflow_dispatch로 워크플로우 수동 실행
github_create_issue_comment issueNumber ✅ · body 이슈·PR에 코멘트 작성 (출력: id · htmlUrl)

github_dispatch_workflow는 대상 워크플로우에 workflow_dispatch 트리거가 선언되어 있어야 합니다.

예제 — 실패한 CI를 카카오톡으로 알리기

- id: runs
  name: 최근 CI 실행 조회
  type: CALL
  integration: github_list_workflow_runs
  timeout: 10s
  input:
    owner: "${vars.GH_OWNER}"
    repo: "${vars.GH_REPO}"
    status: "failure"
    perPage: 5

- id: summarize
  name: 실패 요약
  type: CALL
  integration: transform_jmespath
  input:
    expression: "{건수: length(runs), 최근: runs[0].name}"
    data: "${nodes.runs.response.body | raw}"

예제 — 실패한 job 재실행

- id: rerun
  name: 실패 job 재실행
  type: CALL
  integration: github_rerun_failed_jobs
  input:
    owner: "${vars.GH_OWNER}"
    repo: "${vars.GH_REPO}"
    runId: "${nodes.trigger.response.body.workflow_run.id}"

GitHub 웹훅과 함께 쓰면 좋습니다. GitHub 리포지토리 설정에서 웹훅 주소를 이음새 워크플로우로 걸어두면, workflow_run 이벤트가 올 때마다 runId를 바로 받을 수 있습니다. GitHub이 보내는 서명 헤더도 그대로 인식합니다. → 03. 트리거 설정하기


모든 CALL 노드가 함께 쓸 수 있는 옵션

통합 종류와 상관없이 CALL 노드에 붙일 수 있습니다.

- id: fetch
  type: CALL
  integration: http_request
  timeout: 10s              # 이 시간 넘으면 실패 처리
  retry-policy:             # 실패하면 다시 시도
    max-attempts: 3
    backoff:
      type: EXPONENTIAL
      initial-delay: 500ms
    retry-on: ["429", "5xx", "connect-error"]
  input:
    ...

⚠️ retry-onHTTP 상태타임아웃·연결 오류를 각각 따로 거릅니다. retry-on: ["5xx"] 라고만 적으면 타임아웃은 여전히 재시도됩니다. 자세한 규칙은 → 10. 실행과 모니터링


다음05. 표현식으로 데이터 잇기