# 앱과 컴포넌트

> list_apps, run_app, list_components, run_component로 게시된 Nodaro 앱과 컴포넌트를 찾고, 입력을 확인하고, AI 어시스턴트에서 실행합니다.

Source: https://nodaro.ai/ko/docs/mcp/tools/apps-and-components

**앱과 컴포넌트 도구**를 사용하면 어시스턴트가 다른 사람들이 게시한 워크플로를 쓸 수 있습니다. [앱](https://nodaro.ai/docs/concepts/apps)은 사진 복원이나 테마 편집처럼 간단한 양식을 갖춘 게시된 워크플로이고, [컴포넌트](https://nodaro.ai/docs/concepts/components-and-sub-workflows)는 게시된 구성 요소입니다. 어시스턴트는 앱이나 컴포넌트를 찾아 입력을 읽은 다음, 내 크레딧으로 실행합니다.

앱은 새로운 변환, 테마 편집, 여러 단계의 파이프라인처럼 생성 도구 하나로는 처리할 수 없는 많은 요청을 다룹니다. 어시스턴트는 무언가를 할 수 없다고 답하기 전에 앱을 검색해야 합니다.

## `list_apps`
게시된 앱을 검색합니다. 공개 마켓플레이스나 내 앱에서 찾습니다.

**권한:** `apps:read`. **크레딧:** 무료.

| 매개변수 | 타입 | 설명 |
| --- | --- | --- |
| `scope` | string | `public`(기본값)은 마켓플레이스, `mine`은 내 앱입니다. |
| `search` | string | 검색할 주제로, 최대 100자입니다. |
| `category` | string | 카테고리로, 최대 50자입니다. |
| `limit` | integer | 1~50입니다. |
| `cursor` | string | 이전 페이지의 커서입니다. |

**반환값:** 일치하는 앱과 각 앱의 슬러그입니다. 각 앱의 `estimated_credits`는 앱이 표시하는 가격입니다. 가격이 내가 앱에 주는 녹화본의 길이에 따라 정해지는 경우, 예를 들어 에피소드 전체의 **EDL 적용** 렌더라면, `estimated_credits`는 고정 부분이고 `per_minute_credits`는 녹화본 1분당 크레딧입니다. 앱에 내가 채우는 목록 입력이 있으면, `per_item_credits`는 크리에이터가 저장한 항목을 넘는 항목마다 더해지는 크레딧입니다. 해당하지 않으면 둘 다 `0`이거나 없습니다.

표시되는 가격은 범위입니다. 위의 필드는 앱에 저장된 설정 기준의 “최소” 가격입니다. `max_estimated_credits`, `max_per_minute_credits`, `max_per_item_credits`는 “최대” 가격으로, 앱 사용자가 고를 수 있는 선택지 중에서 실행 한 번에 들 수 있는 가장 높은 비용입니다. “최소” 가격과 다를 때만 나타납니다. 범위가 생기기 전에 게시된 앱은 다음에 다시 게시한 뒤에야 이 필드를 가집니다.

## `get_app_inputs`
앱 페이지에 표시되는 것과 같은 양식으로 앱의 입력을 반환합니다. 입력 키를 알아보려면 `run_app` 전에 호출하세요.

**권한:** `apps:read`. **크레딧:** 무료.

| 매개변수 | 타입 | 설명 |
| --- | --- | --- |
| `slug` | string | **필수.** 앱의 슬러그입니다. 예: `photo-restoration`. |

**반환값:** 앱의 `slug`, `name`, `description`, 그리고 입력마다 항목 하나입니다. 각 항목에는 `key`, `label`, `type`(`image`, `video`, `audio`, `text`, `select`, `number`, `boolean`, `list` 또는 `color`), `required` 여부, 그리고 select의 `options`가 들어 있습니다.

- **앱이 노출하는 슬라이더**, 예를 들어 **텍스트 음성 변환**의 **안정성**, LLM의 **온도**, **길이**는 슬라이더 자체의 `min`, `max`, `step`을 가진 `type: "number"`입니다. `run_app`은 이 입력에 숫자나 숫자 문자열을 받습니다.
- **앱이 노출하는 빠른 설정**, 예를 들어 노드의 모델, 해상도, 길이, 화면 비율 또는 **초안** 선택은 받는 값에 따라 타입이 정해집니다. 값 목록을 `options`로 가진 `select`, 범위 안의 아무 값이나 받는 설정이면 `min`과 `max`를 가진 `number`, 또는 **초안**이나 **반주** 같은 `boolean`입니다. 선택지가 노드의 모델에 따라 달라지면 `options`에는 모든 모델의 값이 나열되고 `description`에 그렇다고 적혀 있습니다. 노드의 모델이 받는 값을 고르세요. 이 입력에서 `run_app`은 숫자 문자열을 숫자로, `"true"` 또는 `"false"`를 boolean으로 바꿉니다. 고정 목록에 없는 값은 `400 validation_error`로 거부됩니다.
- [**동영상 URL**](https://nodaro.ai/docs/nodes/automate/video-url) **입력**은 `type: "video"`이고 `required: true`입니다. 값은 동영상 링크로, YouTube, TikTok, Instagram, Facebook, X 게시물이나 다른 공개 웹 링크입니다. 웹 링크가 아닌 값은 `400 locked_field`로 거부됩니다. 4분 이상인 YouTube 동영상은 `inputOverrides`에서 노드에 `sectionStartSec`와 `sectionEndSec`로 지정한 부분만 다운로드됩니다. 부분을 지정하지 않은 실행은 아무것도 청구되기 전에 거부됩니다.

## `run_app`
게시된 앱을 실행합니다. 실행의 크레딧은 내가 냅니다.

**권한:** `workflows:execute`. **크레딧:** 앱 안에서 실행되는 노드의 크레딧입니다.

| 매개변수 | 타입 | 설명 |
| --- | --- | --- |
| `slug` | string | **필수.** 앱의 슬러그입니다. |
| `inputs` | object | `get_app_inputs`에서 받은 입력 키를 키로 쓰는 평면 객체입니다. 생략하면 기본값을 씁니다. |
| `inputOverrides` | object | 고급 옵션입니다. 노드 id와 필드를 키로 쓰는 노드 필드 원본 값으로, `inputs` 위에 적용됩니다. 예: `{ "n1": { "promptPrefix": "..." } }`. `null`로 지정한 필드는 이번 실행에서 비워집니다. 노드는 크리에이터가 저장한 값이 아니라 그 자리에 값이 없는 상태로 실행됩니다. |
| `client_request_id` | string | 재시도 토큰으로, 영문자, 숫자, `_ - . :`로 이루어진 8~128자입니다. 타임아웃 후 재시도할 때 같은 값을 다시 쓰면 실행이 두 번 시작되거나 두 번 청구되지 않습니다. |

**반환값:** 실행 ID입니다. 실행은 [`get_app_run`](https://nodaro.ai/docs/mcp/tools/gallery-and-assets#get_app_run)으로 확인하세요.

`inputOverrides`로는 **Webhook 출력** 노드의 URL, 게시 노드의 계정, 스크레이퍼의 대상처럼 출력이 가는 곳을 설정할 수 없습니다. 이를 시도하는 실행은 `400 locked_field`로 거부됩니다.

## `delete_app_run`
앱 실행을 보관함으로 옮깁니다. [app.nodaro.ai/archived-runs](https://app.nodaro.ai/archived-runs)에서 복원하거나 완전히 삭제할 수 있습니다. 실행은 끝났거나 중지된 뒤에만 완전히 삭제할 수 있습니다.

**권한:** `workflows:execute`. **크레딧:** 무료.

| 매개변수 | 타입 | 설명 |
| --- | --- | --- |
| `slug` | string | **필수.** 앱의 슬러그로, 앱 URL의 마지막 부분입니다. |
| `runId` | string | **필수.** 실행 id입니다. |

**반환값:** 확인 메시지입니다.

## `list_components`
게시된 컴포넌트를 검색합니다. 공개 마켓플레이스나 내 컴포넌트에서 찾습니다. 사용자가 컴포넌트 이름을 말하거나, 알려진 컴포넌트와 맞는 여러 단계의 파이프라인을 요청할 때 사용하세요.

**권한:** `workflows:read`. **크레딧:** 무료.

| 매개변수 | 타입 | 설명 |
| --- | --- | --- |
| `scope` | string | `public`(기본값)은 마켓플레이스, `mine`은 내 컴포넌트입니다. |
| `search` | string | 검색할 주제로, 최대 100자입니다. |
| `limit` | integer | 1~50입니다. |
| `cursor` | string | 이전 페이지의 커서입니다. |

**반환값:** 일치하는 컴포넌트와 각 컴포넌트의 슬러그입니다. 각 컴포넌트에는 `estimated_credits`, `per_minute_credits`, `per_item_credits`와 이에 대응하는 `max_` 필드가 있으며, `list_apps`와 같은 방식으로 읽습니다.

## `get_component_inputs`
컴포넌트의 입력을 반환합니다. 입력 키를 알아보려면 `run_component` 전에 호출하세요.

**권한:** `workflows:read`. **크레딧:** 무료.

| 매개변수 | 타입 | 설명 |
| --- | --- | --- |
| `component_id` | string | **필수.** 컴포넌트의 슬러그입니다. |

**반환값:** 입력마다 항목 하나이며, 각 항목에는 `key`, `label`, `type`, `required` 여부가 들어 있습니다.

## `run_component`
게시된 컴포넌트를 실행합니다.

**권한:** `workflows:execute`. **크레딧:** 컴포넌트 안에서 실행되는 노드의 크레딧입니다.

| 매개변수 | 타입 | 설명 |
| --- | --- | --- |
| `component_id` | string | **필수.** 컴포넌트의 슬러그입니다. |
| `inputs` | object | `get_component_inputs`에서 받은 입력 키를 키로 쓰는 평면 객체입니다. 생략하면 기본값을 씁니다. |
| `client_request_id` | string | 재시도 토큰으로, 영문자, 숫자, `_ - . :`로 이루어진 8~128자입니다. 타임아웃 후 재시도할 때 같은 값을 다시 쓰세요. |

**반환값:** 작업 ID입니다. 작업이 완료되면 `output_data`에 컴포넌트의 출력이 담깁니다. MCP Apps를 지원하는 클라이언트에서는 작업 카드에 출력이 위아래로 차례로 표시됩니다.

## 자주 묻는 질문

### 앱과 컴포넌트는 어떻게 다른가요?

앱은 간단한 양식으로 단독 실행되는 게시된 워크플로입니다. 컴포넌트는 다른 워크플로가 재사용하는 게시된 구성 요소입니다. 요청을 처리할 전용 도구가 없으면 어시스턴트는 먼저 앱을 찾습니다.

### 어시스턴트가 시작한 앱 실행의 비용은 누가 내나요?

내가 냅니다. run_app과 run_component는 앱이나 컴포넌트 안에 있는 노드의 가격대로 내 계정의 크레딧을 씁니다.

### 어시스턴트가 앱의 숨겨진 설정을 바꿀 수 있나요?

일부만 바꿀 수 있습니다. inputOverrides로 프롬프트 앞에 붙는 텍스트 같은 노드 필드를 직접 설정할 수 있지만, Webhook URL이나 소셜 계정처럼 출력이 가는 곳은 바꿀 수 없습니다. 그런 실행은 거부됩니다.

### 어시스턴트에서 앱 실행을 삭제하려면 어떻게 하나요?

앱의 슬러그와 실행 id로 delete_app_run을 호출하세요. 실행이 보관함으로 옮겨지며, 그곳에서 복원하거나 완전히 삭제할 수 있습니다.
