AdMob 광고 단위 생성 (v1beta — Limited Access)

AdMob 계정 ID

광고 형식

BANNER INTERSTITIAL REWARDED REWARDED_INTERSTITIAL APP_OPEN NATIVE

AdMob 앱 ID

광고 단위 이름

AdMob에 새 앱 등록 (v1beta — Limited Access). appStoreId 를 주면 스토어 게시 앱과 링크(Android=패키지명, iOS=App Store 숫자 ID), 없으면 manual(unlinked) 앱.

AdMob 계정 ID

스토어 링크용 ID — Android는 패키지명(com.x.y), iOS는 App Store 숫자 ID

앱 이름

플랫폼

AdMob 수익 리포트 (기간 지정)

AdMob 계정 ID

종료 일

종료 월 (1-12)

종료 연도

시작 일

시작 월 (1-12)

시작 연도

accountId startYear startMonth startDay endYear endMonth endDay

오늘 AdMob 수익 요약

AdMob 계정 ID

AdMob 계정 목록 조회

AdMob 광고 단위 목록

AdMob 계정 ID

AdMob에 등록된 앱 목록

AdMob 계정 ID (예: accounts/pub-XXXX)

새 Android upload keystore (.jks)를 자동 생성합니다. Java JDK의 keytool이 설치돼 있어야 합니다. 생성 후 반환된 keystoreBase64 / storePassword / keyAlias / keyPassword를 jenkins_upload_keystore 와 jenkins_create_credential 로 Jenkins에 등록하세요. 비밀번호는 이 응답에서만 확인 가능하니 반드시 Jenkins에 즉시 등록하세요.

앱 이름 — keystore dname CN에 사용 (예: MyApp)

국가 코드 (기본: KR)

조직명 — dname O (생략 시 app_name)

⭐ Android 앱 서명/빌드 설정을 시작할 때 가장 먼저 호출하세요. Play Console 업로드 이력을 확인해 신규 앱인지 기존 앱인지 판별하고, Jenkins credential 등록과 Play Store SA 연결까지 단계별 액션 플랜을 반환합니다. "Jenkins에 keystore 등록해줘", "Android 빌드 설정 해줘", "서명 키 설정" 요청 시 이 도구를 먼저 호출하세요.

Android 패키지명 (예: com.example.app)

GCP 프로젝트 ID (SA 생성 시 필요, 선택)

베타 그룹에 테스터를 초대한다 — POST /v1/betaTesters. 이메일별로 개별 호출하며, 이미 등록된 주소는 실패로 표시하고 나머지는 계속 진행한다. ⚠ 초대 메일이 즉시 발송된다 — 주소를 사용자에게 확인받고 실행할 것. confirm 필요.

true 명시 시에만 초대 발송

베타 그룹 ID (appstore_list_beta_groups 결과)

초대할 테스터 목록

테스터 이메일

App Store IAP/구독 상품을 **단독으로** 심사에 제출한다 — consumable/non_consumable 은 POST /v1/inAppPurchaseSubmissions, subscription 은 POST /v1/subscriptionSubmissions. ⚠ 호출 즉시 제출된다 ("묶음에 담기"가 아니다 — 그런 공개 API 는 존재하지 않는다. reviewSubmissionItems 는 appStoreVersion 계열 관계만 받는다, 2026-07 실측). 이미 승인된 적 있는 상품의 변경분 제출용. **앱 첫 심사** 상품은 Apple 이 "no pending version" 409 로 거부한다 — 그 경우 ASC 웹 버전 페이지의 "앱 내 구입 및 구독" 섹션에서 담아 버전과 함께 제출해야 한다 (도구가 에러에 안내 첨부). 상품 상태가 READY_TO_SUBMIT 이어야 한다 (MISSING_METADATA 면 appstore_update_product_localization 먼저).

App Store 앱 ID (숫자형, appstore_list_apps 결과)

상품 ID (appstore_list_products 결과)

상품 유형

이미 존재하는 심사 묶음에 앱 버전을 항목으로 추가한다 (POST /reviewSubmissionItems). ⚠ 앱 첫 심사 필수 절차 — 웹에서 IAP/구독을 담으면 "상품만 든 묶음"이 새로 생기는데, 그대로 제출하면 409 "an appStoreVersions must be included in this review submission" 로 막힌다. reviewSubmissionItems 는 상품 관계는 거부하지만 appStoreVersion 관계는 받으므로, 버전을 이 묶음으로 옮기면 된다. 버전이 다른 묶음에 물려 있으면 먼저 풀 것: 미제출 묶음이면 appstore_remove_review_submission_item, 제출된 묶음이면 항목 제거가 막히므로 appstore_cancel_review 로 묶음째 취소. 추가 후 appstore_submit_for_review 로 제출하면 버전+상품이 한 묶음으로 나간다.

대상 reviewSubmission ID (appstore_list_review_submissions 결과)

추가할 App Store 버전 ID (appstore_list_versions 결과)

App Store 버전에 업로드된 빌드를 연결 — PATCH /v1/appStoreVersions/{id}/relationships/build. TestFlight에 업로드되어 processingState=VALID 상태인 빌드만 연결 가능. 편집 가능한 버전(PREPARE_FOR_SUBMISSION 등)에서만 변경됨. buildId는 appstore_list_builds 결과 사용.

빌드 ID (appstore_list_builds 결과)

App Store 버전 ID (appstore_list_versions 또는 appstore_create_version 결과)

App Store 버전에 최신 VALID 빌드를 자동으로 attach — list_builds → 필터 → attach 의 3-step 을 1회로 단축. 내부: versionId 로 appId 역추적 → listBuilds 에서 processingState=VALID 만 필터 → buildNumber 숫자 최대값 선택 → attach. PROCESSING 중인 빌드를 실수로 attach 해서 심사 제출 시 깨지는 케이스를 차단. minBuildNumber 옵션으로 floor 지정 가능 (예: 1.4.x 빌드만 attach).

attach 후보 최소 buildNumber (예: 186 — 이전 빌드 무시)

App Store 버전 ID (appstore_create_version 또는 list_versions 결과)

TestFlight 외부 테스트 제출 전 점검 — 읽기 전용. 빌드의 internal/external 상태, 베타 심사 제출 상태, What to Test 가 채워진 로케일을 보여준다. appId 를 함께 주면 앱 단위 항목(베타 심사 연락처·데모 계정, 테스트 정보 로케일)까지 검사해 빠진 필드를 알려준다. 외부 배포가 막히면 여기부터 본다 — 대부분 수출 규정 미선언이나 심사 정보 공란이다.

앱 ID — 주면 앱 단위 항목까지 함께 점검

빌드 ID (appstore_list_builds 결과)

App Store 심사 제출을 철회 — WAITING_FOR_REVIEW 상태에서만 가능. PATCH attributes.canceled=true → state 가 CANCELING 으로 바뀌고 수십 초 뒤 COMPLETE(항목 REMOVED), 버전은 편집 가능 상태로 복귀해 메타데이터/빌드 수정 가능. CANCELING 은 비동기라 호출 직후엔 아직 COMPLETE 가 아니다 — 이어서 작업하려면 상태를 폴링할 것. ⚠ IN_REVIEW 이상이면 Apple API가 409로 거부함 — 이 경우 App Store Connect 웹에서 직접 처리하거나 심사 결과를 기다려야 함. 제출된 묶음에서 항목만 빼내는 것(removed)은 막히므로, 버전을 다른 묶음으로 옮기려면 이 도구로 묶음째 취소한다. 철회 후 수정 완료 시 appstore_submit_for_review로 재제출 가능.

App Store 버전 ID (appstore_list_versions 결과)

App Store 제출 전 위험 요소를 자동으로 점검합니다. 블로커(반드시 수정)와 경고(권장 수정)로 분류하여 반환합니다. 점검 항목: 메타데이터 완성도(설명/What's New/키워드), 스크린샷, TestFlight 빌드, 개인정보처리방침 URL. App Store 인증이 필요합니다 (appstore_* 도구 사용 가능 상태여야 함).

App Store 앱 ID (appstore_list_apps 결과의 id 필드)

appInfo 로컬라이제이션(스토어 언어) 추가 — POST /appInfoLocalizations. 편집 가능 appInfo를 자동으로 찾아 새 locale의 앱 이름/부제/개인정보 URL을 생성. 이미 존재하는 locale이면 409 DUPLICATE — 그땐 appstore_update_app_info_localization 사용. 생성하면 같은 locale의 버전 로컬라이제이션(설명/키워드/whatsNew)도 함께 생길 수 있음(2026-07 실측) — 내용 채우기는 appstore_update_localization. 제한: name 30자, subtitle 30자. locale 예: "en-US", "ja", "zh-Hans", "zh-Hant".

앱 ID (appstore_list_apps 결과)

추가할 언어 (예: "en-US", "ja", "zh-Hans", "zh-Hant")

앱 이름 (30자 이내)

개인정보 처리방침 텍스트

개인정보 처리방침 URL

부제 (30자 이내)

App Store에 일회성 인앱 구매(IAP)를 생성 — CONSUMABLE (소비성) / NON_CONSUMABLE (비소비성). 생성 후 App Store Connect에서 스크린샷·리뷰 노트를 추가해야 심사 제출 가능.

App Store 앱 ID (appstore_list_apps 결과의 id, 숫자형)

번들 ID (appId 대신 사용 가능)

ISO 4217 통화 코드 (기본 USD)

추가 지역별 명시 가격

ISO 4217 통화 코드 (예: KRW)

가격 (최소 단위)

상품 이름 (스토어 노출, 최대 30자)

가격 (최소 단위: USD cents. 예: $0.99 → 99, ₩1,100 → 1100)

상품 ID (글로벌 unique 권장: 예 com.example.coins_100)

IAP 유형 (소비성/비소비성)

App Store에 자동 갱신 구독을 생성 — Subscription Group 자동 생성 포함. 생성 후 App Store Connect에서 스크린샷·리뷰 노트를 추가해야 심사 제출 가능.

App Store 앱 ID

번들 ID (appId 대신 사용 가능)

ISO 4217 통화 코드 (기본 USD)

추가 지역별 명시 가격

ISO 4217 통화 코드 (예: KRW)

가격 (최소 단위)

구독 이름 (스토어 노출)

구독 주기

가격 (최소 단위: USD cents. 예: $9.99 → 999, ₩9,900 → 9900)

구독 productId (예: com.example.premium.monthly)

App Store 새 버전 레코드 생성 — POST /v1/appStoreVersions. 새 versionString(예: "1.2.3")으로 PREPARE_FOR_SUBMISSION 상태의 버전을 만듦. buildId를 함께 주면 생성과 동시에 빌드 연결. 나중에 붙이려면 appstore_attach_build 사용. releaseType: MANUAL(개발자가 출시) / AFTER_APPROVAL(승인 후 자동) / SCHEDULED(earliestReleaseDate 필요).

연결할 빌드 ID (appstore_list_builds 결과). 생략 시 버전만 생성하고 나중에 attach.

저작권 표기 (예: "© 2026 Foo Inc.")

SCHEDULED일 때 가장 빠른 출시 시각 (ISO 8601, 예: "2026-05-01T00:00:00Z")

플랫폼 (기본 IOS)

출시 방식 (생략 시 Apple 기본값)

버전 문자열 (예: "1.2.3")

수출 규정(암호화) 선언을 만들고 선택한 빌드에 연결한다 — POST /v1/appEncryptionDeclarations. Info.plist 의 ITSAppUsesNonExemptEncryption 이 있으면 보통 이 선언이 필요 없다 — 그게 없어서 ASC 가 "수출 규정 정보 누락"으로 제출을 막을 때 쓰는 경로다. ⚠ 법적 신고 성격의 선언이다. 값은 반드시 사용자에게 확인받고 넣을 것.

앱이 사용하는 암호화에 대한 설명 (심사용)

App Store 앱 ID

프랑스 스토어에 배포하는가 (프랑스는 별도 신고 규정)

이 선언을 연결할 빌드 ID들 (appstore_list_builds 결과). 생략 시 선언만 생성

자체 개발한 암호화를 포함하는가

서드파티 암호화를 포함하는가

appId appDescription containsProprietaryCryptography containsThirdPartyCryptography availableOnFrenchStore

미리보기 동영상 또는 세트를 삭제한다 — DELETE /v1/appPreviews/{id} 또는 /appPreviewSets/{id}. ⚠ 되돌릴 수 없다. 세트를 지우면 그 안의 동영상이 모두 사라진다. confirm 필요.

true 명시 시에만 삭제

삭제할 미리보기 ID (set 과 둘 중 하나)

삭제할 미리보기 세트 ID (안의 동영상 전부 삭제)

⚠ 비가역. App Store IAP 상품 삭제. MISSING_METADATA / WAITING_FOR_REVIEW 상태만 가능 — 이미 승인(READY_FOR_SALE)된 상품은 Console에서 "Remove from sale" 해야 함.

App Store 앱 ID

번들 ID (appId 대신 사용 가능)

상품 ID

상품 유형

App Store 개별 스크린샷 삭제

스크린샷 ID (appstore_list_screenshots 결과)

App Store 스크린샷 셋 전체 삭제 (디스플레이 타입 교체 시 먼저 정리)

스크린샷 셋 ID (appstore_list_screenshots 결과)

앱의 연령 등급 설문(ageRatingDeclaration) 현재 값을 읽는다 — 읽기 전용. appInfo 에 딸린 단일 리소스이며, 편집 가능한 appInfo 를 자동으로 고른다. 수정 전에 이걸로 현재 답변을 먼저 확인할 것.

App Store 앱 ID (appstore_list_apps 결과)

App Store Connect 앱 상세 정보

앱 ID (숫자)

App Store 앱 정보 (카테고리, 연령 등급, state). state=READY_FOR_DISTRIBUTION이 라이브, 그 외가 편집 가능 appInfo.

앱 ID

앱의 판매 지역 상태를 읽는다 — GET /v1/apps/{id}/appAvailabilityV2. 판매 중/중지 지역 수와 신규 지역 자동 포함 여부를 보여준다. includeTerritories=true 면 지역별 행(id·available·releaseDate)까지 — 이 id 가 변경 도구의 입력이다.

App Store 앱 ID

지역 목록까지 반환 (기본 false)

재무(정산) 리포트 — GET /v1/financeReports. 실제로 지급되는 금액 기준이라 Sales and Trends(판매 시점 집계)와 숫자가 다를 수 있다. ⚠ **reportDate 는 Apple 회계월이다** — 달력월과 어긋난다(회계연도가 9월 말에 시작). 요청한 달과 다른 기간이 돌아오면 버그가 아니라 이것이다. 매출 건수를 세는 목적이면 appstore_get_sales_report(달력 날짜 기준)를 쓰는 편이 낫다. regionCode 는 ZZ(전 지역 통합)가 기본이고, FINANCE_DETAIL 은 보통 Z1 을 쓴다. 컬럼 구성이 리포트마다 달라 파싱한 행을 그대로 돌려준다.

지역 코드 (기본 ZZ = 전 지역 통합)

YYYY-MM (Apple 회계월)

기본 FINANCIAL

판매자 번호. 생략 시 ~/.mimi-seed/appstore.json 의 vendorNumber 사용

App Store 버전 메타데이터 (설명문, 키워드, What's New)

버전 ID

App Store 심사 리뷰어 노트(Notes for App Review) 조회. 현재 등록된 notes, contactEmail 확인용.

버전 ID (appstore_list_versions 결과)

Sales and Trends 리포트 = **실매출의 기준선** — GET /v1/salesReports (gzip TSV 를 파싱해 돌려준다). 분석 이벤트(GA4 in_app_purchase 등)로 매출을 세면 안 되는 이유가 여기 있다: TestFlight·Xcode 설치의 결제는 **sandbox 라 청구가 0원인데도** 클라이언트에는 성공한 결제로 보여 이벤트가 그대로 나간다. 이 리포트에는 sandbox 가 애초에 들어오지 않으므로, 둘을 비교하면 "진짜 돈이 들어온 건수"가 곧바로 갈린다. ⚠ **Developer Proceeds 는 1개당 금액이다** — 총액은 units 를 곱해야 한다(이 도구는 곱해서 준다). ⚠ 환불은 units 가 **음수**로 들어와 합계에서 상쇄된다. 즉 합계는 순매출이다. ⚠ 데이터가 없는 날짜는 Apple 이 404 를 주므로 datesWithoutData 로 따로 돌려준다 — "매출 0" 과 "리포트 미생성/설정 오류"를 섞지 말 것. 당일치는 보통 아직 없다. vendorNumber 는 ~/.mimi-seed/appstore.json 에 저장해두면 생략 가능. ⚠ **리포트는 요구 롤이 다르다** — Admin/Finance/Sales and Reports 중 하나여야 하고, 배포에 흔히 쓰는 App Manager 키는 여기서만 403 이 난다. 발급된 키의 롤은 수정할 수 없으므로, 읽기 전용 Finance 키를 발급해 appstore.json 의 **reportsKey** 에 넣으면 배포 키를 건드리지 않아도 된다.

종료일 YYYY-MM-DD (포함). DAILY 에서만 의미가 있고 최대 62일

집계 단위 (기본 DAILY)

기본 SUMMARY. 상세는 DETAILED

기본 SALES. 구독 분석은 SUBSCRIPTION / SUBSCRIPTION_EVENT / SUBSCRIBER

시작일 YYYY-MM-DD (DAILY 가 아니면 이 값이 곧 reportDate)

리포트 버전 (기본 1_0). SUBSCRIPTION 계열은 1_3 등 다른 버전을 요구할 수 있다

편집 가능한 appInfo의 로컬라이제이션 목록 조회 — 앱 이름(name), 부제(subtitle), 개인정보 URL/텍스트. appInfo.relationships.appInfoLocalizations가 빈 배열로 오는 케이스를 우회하려고 /appInfos/{id}/appInfoLocalizations 직접 호출. locale을 주면 해당 언어만 반환 (예: "ko", "en-US"). ※ versionLocalization(설명/키워드/whatsNew)과 다름 — 그건 appstore_get_metadata 사용.

앱 ID (appstore_list_apps 결과)

언어 필터 (예: "ko", "en-US"). 생략 시 전체 반환.

App Store Connect 앱 목록 조회

TestFlight 베타 그룹 목록

앱 ID

TestFlight 빌드 목록

앱 ID

버전 로케일의 미리보기 동영상 세트를 조회한다 — 읽기 전용. 세트별 previewType 과 각 동영상의 처리 상태(assetDeliveryState)·포스터 프레임·videoUrl 을 보여준다. 업로드 직후 인코딩이 끝났는지 확인할 때도 이걸 쓴다.

appStoreVersionLocalization ID (appstore_get_metadata 결과의 로케일별 id)

App Store IAP/구독 상품의 현지화(표시 이름·설명) 목록 조회. locale / name / description / state 반환.

App Store 앱 ID (숫자형, appstore_list_apps 결과)

상품 ID (appstore_list_products 결과)

상품 유형

App Store의 모든 IAP 상품(구독 + 일회성) 통합 조회. productId / internalId / name / status / type 반환.

App Store 심사 제출 묶음(reviewSubmissions) + 내부 항목 조회 — 읽기 전용. 각 묶음의 state(READY_FOR_REVIEW=초안 / WAITING_FOR_REVIEW=큐 / UNRESOLVED_ISSUES=거절 미해결 / COMPLETE) 와 항목별 state·연결 리소스(appStoreVersion 이면 versionString 포함)를 보여준다. 재제출이 "appStoreVersions ... is not in valid state" 로 막힐 때 첫 번째로 볼 것 — 진범은 대개 UNRESOLVED_ISSUES 묶음이 버전을 REJECTED 항목으로 물고 있는 것이다 (버전 자체는 PREPARE_FOR_SUBMISSION 으로 멀쩡해 보인다, 2026-07 실측). 해제는 appstore_remove_review_submission_item.

조회할 묶음 수 (기본 5, 최신순)

플랫폼 (기본 IOS)

App Store 받은 고객 리뷰 조회 (최신순). response 필드에 개발자 답변 존재 여부와 내용이 함께 포함됨 (없으면 null). territory(예: KOR/USA — ISO 3166 alpha-3) / rating(1~5)으로 필터 가능.

App Store 앱 ID (appstore_list_apps 결과)

가져올 개수 (기본 50, 최대 200)

별점 필터 (1~5)

국가 코드 (예: 'KOR', 'USA' — alpha-3)

App Store 스크린샷 셋 + 이미지 목록 조회 (로컬라이제이션 단위). 디스플레이 타입별로 그룹핑됨

로컬라이제이션 ID (appstore_get_metadata 결과의 id)

App Store 버전 목록 (심사 상태 포함)

앱 ID

이미 배포된 빌드에 대해 테스터에게 알림을 다시 보낸다 — POST /v1/buildBetaNotifications. 자동 알림(autoNotifyEnabled)이 꺼져 있거나, 배포 후 다시 알리고 싶을 때. ⚠ 테스터 전원에게 푸시/메일이 나간다. confirm 필요.

빌드 ID

true 명시 시에만 발송

iOS 단계적 출시(7일 램프)를 제어한다 — appStoreVersionPhasedReleases. action: status(조회) / enable(켜기·PAUSED면 재개) / pause(일시중지) / resume(재개) / complete(즉시 전체 공개) / disable(단계적 출시 제거). Play 의 userFraction·halted 에 해당하는 iOS 쪽 장치다. ⚠ complete 와 disable 은 남은 사용자 전체에게 즉시 공개되며 되돌릴 수 없다 — confirm: true 필요. pause/resume/enable 은 되돌릴 수 있어 confirm 없이 실행된다.

수행할 동작

status enable pause resume complete disable

complete / disable 에만 필요. 생략/false 면 현재 상태만 반환하는 dry-run.

App Store 버전 ID

App Store 배포 플랜 — 편집 가능한 버전/빌드 attach/메타/스크린샷/정책 위험을 한 번에 점검하고 체크리스트로 반환합니다 (read-only). ⚠ AI 호출자 지시: 응답의 미완료 항목을 반드시 TodoWrite로 사용자에게 먼저 보여주고, 사용자 동의 후 단계별로 기존 도구(appstore_update_localization, appstore_update_whats_new, appstore_submit_for_review 등)를 호출하세요. submit_for_review는 비가역이므로 반드시 명시 동의 필요.

App Store 앱 ID (appstore_list_apps 결과의 id)

대상 버전 (예: 1.3.0). 미지정 시 가장 최근 편집 가능 버전

버전의 출시 상태를 한 번에 읽는다 — 읽기 전용. appStoreState(PENDING_DEVELOPER_RELEASE / READY_FOR_SALE …), releaseType(MANUAL / AFTER_APPROVAL / SCHEDULED), earliestReleaseDate, 그리고 단계적 출시가 켜져 있으면 그 상태(ACTIVE/PAUSED/COMPLETE)와 현재 며칠째인지. 출시 관련 쓰기 도구를 부르기 전에 이걸로 먼저 확인할 것.

App Store 버전 ID (appstore_list_versions 결과)

심사를 통과해 개발자 출시 대기(PENDING_DEVELOPER_RELEASE) 중인 버전을 지금 출시한다 — POST /v1/appStoreVersionReleaseRequests. 콘솔의 "이 버전 출시" 버튼과 같은 동작. ⚠ 비가역: 실행 즉시 App Store 에 공개된다. 되돌리려면 새 버전을 내거나 판매 중단해야 한다. 안전 가드: confirm 생략/false 면 현재 상태만 보여주는 dry-run. releaseType=AFTER_APPROVAL 로 만든 버전은 승인 시 자동 출시되므로 이 도구가 필요 없다 — MANUAL 로 대기 중인 버전용이다.

true 명시 시에만 실제 출시. 생략/false 면 dry-run.

심사 제출 묶음에서 항목을 제거한다 (removed=true PATCH) — ASC 웹 "재제출" 버튼이 내부적으로 하는 동작. 거절된 옛 묶음(UNRESOLVED_ISSUES)이 버전을 물고 있어 재제출이 ENTITY_STATE_INVALID 로 막힐 때 해제용. 항목이 풀리면 옛 묶음은 COMPLETE 로 정리된다. itemId 는 appstore_list_review_submissions 결과. (appstore_submit_for_review 는 이 해제를 자동으로 시도한다 — 수동 개입이 필요할 때만 직접 호출.)

reviewSubmissionItem ID (appstore_list_review_submissions 결과)

App Store 고객 리뷰에 개발자 답변을 등록 (또는 갱신). 동일 리뷰에 한 번만 답변 가능 — 기존 답변이 있으면 Apple이 새 응답으로 대체함. reviewId는 appstore_list_reviews 결과의 id. 답변 본문은 5970자 이내.

답변 본문 (5970자 이내)

리뷰 ID (appstore_list_reviews 결과)

베타 그룹에 빌드를 붙이거나 뗀다 — POST/DELETE /v1/betaGroups/{id}/relationships/builds. ⚠ 외부 그룹에 붙이는 것은 **실제 배포**다 (심사 통과 후에만 가능). 떼면 테스터가 더 이상 받지 못한다. groupId 는 appstore_list_beta_groups 결과. confirm 생략/false 면 dry-run.

붙이기 / 떼기

빌드 ID

true 명시 시에만 실행

베타 그룹 ID

지역별 판매 여부·출시일을 바꾼다 — PATCH /v1/territoryAvailabilities/{id}. id 는 appstore_get_availability(includeTerritories=true) 결과에서 가져올 것 — 지역 코드를 추측해 넣지 말 것. 한 지역이 실패해도 나머지는 계속 진행하고, 지역별 성공/실패를 그대로 보고한다. ⚠ available=false 는 그 지역에서 앱을 내리는 동작이다.

true 명시 시에만 실제 변경. 생략/false 면 변경 예정 목록만 반환.

변경할 지역 목록

판매 여부

territoryAvailability 리소스 id

사전주문 활성화

출시일 (YYYY-MM-DD)

빌드를 TestFlight 베타 심사에 제출한다 — POST /v1/betaAppReviewSubmissions. 외부 테스터에게 배포하려면 이 심사를 통과해야 한다 (내부 테스터는 불필요). 사전 조건: 외부 상태가 READY_FOR_BETA_SUBMISSION, What to Test 채움, 베타 심사 정보 채움. appstore_beta_status 로 먼저 점검할 것. confirm 생략/false 면 현재 상태만 보여주는 dry-run.

앱 ID — dry-run 점검을 앱 단위 항목까지 확장

빌드 ID

true 명시 시에만 실제 제출

App Store 버전을 심사에 제출 — 새 reviewSubmissions API 사용 (옛 /appStoreVersionSubmissions는 2024-01 deprecated). 내부 흐름: POST /reviewSubmissions(또는 CREATED 상태 재사용) → POST /reviewSubmissionItems(version attach) → PATCH submitted=true. appId와 platform은 versionId에서 자동 조회 — 별도 입력 불필요. ⚠ 비가역 작업: 제출 후엔 Apple 심사가 시작되며, 메타데이터/스크린샷/빌드를 더 못 바꿈 (REJECTED/METADATA_REJECTED 시 다시 편집 가능). 안전 가드: confirm 생략/false 시 dry-run preview 만 반환 (versionString·빌드·whatsNew 발췌). 실제 제출은 confirm: true 로 재호출. 사전 조건: 버전이 PREPARE_FOR_SUBMISSION 또는 DEVELOPER_REJECTED 상태, 빌드 attached, 모든 필수 메타데이터 채워짐. 거절된 옛 묶음(UNRESOLVED_ISSUES)이 버전을 물고 있어 attach 가 막히면 자동으로 항목을 해제(removed=true)하고 재시도한다 — 진단은 appstore_list_review_submissions. appstore_check_submission_risks로 사전 점검 권장.

true 명시 시에만 실제 심사 제출. 생략/false 면 dry-run preview 만 반환 (비가역 사고 차단).

연령 등급 설문을 갱신한다 — PATCH /v1/ageRatingDeclarations/{id}. 넘긴 필드만 바뀐다 (부분 갱신). 전체를 다시 보낼 필요 없다. 미완성이면 심사 제출이 막히므로 첫 출시 전 반드시 채워야 한다. Play 의 콘텐츠 등급 설문과 달리 Apple 은 이렇게 API 로 답변할 수 있다.

광고 포함

연령 확인 장치 제공

산출 등급을 더 높게 덮어쓸 때만

음주/흡연/약물 — NONE / INFREQUENT_OR_MILD / FREQUENT_OR_INTENSE

App Store 앱 ID

경품/콘테스트 — NONE / INFREQUENT_OR_MILD / FREQUENT_OR_INTENSE

등급 근거 안내 URL

실제 도박 포함 여부

모의 도박 — NONE / INFREQUENT_OR_MILD / FREQUENT_OR_INTENSE

총기·무기 — NONE / INFREQUENT_OR_MILD / FREQUENT_OR_INTENSE

건강/웰니스 주제

공포/공포 유발 주제 — NONE / INFREQUENT_OR_MILD / FREQUENT_OR_INTENSE

키즈 카테고리 대상 연령대 (키즈 앱만)

한국 등급 별도 지정 (게임물관리위원회 등급을 반영해야 할 때)

확률형 아이템(루트박스) 포함 여부

성인/암시적 주제 — NONE / INFREQUENT_OR_MILD / FREQUENT_OR_INTENSE

의료/치료 정보 — NONE / INFREQUENT_OR_MILD / FREQUENT_OR_INTENSE

메시지/채팅 기능

자녀 보호 기능 제공

욕설/저속한 유머 — NONE / INFREQUENT_OR_MILD / FREQUENT_OR_INTENSE

노골적 성적 콘텐츠·노출 — NONE / INFREQUENT_OR_MILD / FREQUENT_OR_INTENSE

성적 콘텐츠 또는 노출 — NONE / INFREQUENT_OR_MILD / FREQUENT_OR_INTENSE

제한 없는 웹 접근

사용자 생성 콘텐츠

만화/판타지 폭력 — NONE / INFREQUENT_OR_MILD / FREQUENT_OR_INTENSE

사실적 폭력 — NONE / INFREQUENT_OR_MILD / FREQUENT_OR_INTENSE

지속적·잔혹한 사실적 폭력 — NONE / INFREQUENT_OR_MILD / FREQUENT_OR_INTENSE

appInfo 로컬라이제이션(앱 이름/부제/개인정보 URL/텍스트) 수정 — PATCH /appInfoLocalizations/{id}. localizationId는 appstore_list_app_info_localizations 결과의 id. 편집 가능 상태(PREPARE_FOR_SUBMISSION / DEVELOPER_REJECTED 등)에서만 반영됨. 제한: name 30자, subtitle 30자.

appInfoLocalization ID

앱 이름 (30자 이내)

개인정보 처리방침 텍스트

개인정보 처리방침 URL

부제 (30자 이내)

TestFlight 베타 심사 정보(연락처·데모 계정·심사 노트)를 채운다 — PATCH /v1/betaAppReviewDetails/{id}. 앱 단위 단일 리소스이며 외부 테스트 심사 제출 전 필수다. 넘긴 필드만 바뀐다. 로그인이 필요한 앱이면 demoAccountRequired=true 와 계정/비밀번호를 반드시 함께 넣는다 — 없으면 반려된다.

App Store 앱 ID

심사 연락처 이메일

심사 연락처 이름

심사 연락처 성

심사 연락처 전화번호

데모 계정 ID

데모 계정 비밀번호

심사에 데모 계정이 필요한가

심사자에게 남길 메모

TestFlight 테스트 정보(피드백 이메일·앱 설명 등)를 로케일별로 저장한다 — betaAppLocalizations upsert. 해당 로케일이 있으면 PATCH, 없으면 POST 한다. 외부 테스트에는 feedbackEmail 과 description 이 필요하다.

App Store 앱 ID

테스터에게 보여줄 앱 설명

테스터 피드백 수신 이메일

로케일 (예: ko, en-US)

마케팅 URL

개인정보처리방침 URL

App Store 버전 로컬라이제이션(메타데이터) 수정 — localizationId 직접 지정. 이 버전의 새로운 기능(whatsNew), 설명(description), 키워드, 프로모션 텍스트를 편집. 수정 가능한 상태(PREPARE_FOR_SUBMISSION 등)인 버전에서만 반영됨

앱 설명 (4000자 이내)

키워드 (쉼표 구분, 100자 이내)

로컬라이제이션 ID (appstore_get_metadata 결과의 id)

마케팅 URL

프로모션 텍스트 (170자 이내)

지원 URL

이 버전의 새로운 기능 (4000자 이내)

App Store IAP 상품의 reference name 변경. productId / 유형은 변경 불가. 스토어에 보이는 표시 이름·설명은 appstore_update_product_localization 을 쓴다.

App Store 앱 ID

번들 ID (appId 대신 사용 가능)

새 reference name

상품 ID

상품 유형

App Store IAP/구독 상품의 현지화(표시 이름·설명)를 로케일 단위로 upsert — 있으면 수정, 없으면 생성. 현지화가 비면 상품이 MISSING_METADATA 에서 안 풀려 심사에 넣을 수 없다 (리뷰 노트·스크린샷과는 별개 리소스). locale 은 App Store 표기(ko, en-US, ja, zh-Hant)를 쓴다. 길이 상한은 리소스마다 다르고 Apple 이 강제한다 — 구독은 실측으로 name 35 / description 55 다. 초과하면 Apple 이 "Max number of characters is (N)" 으로 실제 상한을 알려주므로 그 값에 맞춰 줄이면 된다. ⚠ 심사 중인 상품은 현지화가 잠겨 UNMODIFIABLE 로 거부된다 — 결과를 기다리거나 철회 후 수정한다.

App Store 앱 ID (숫자형, appstore_list_apps 결과)

설명. 생략하면 기존 값 유지 (구독 실측 상한 55자)

로케일 (예: ko, en-US, ja, zh-Hant)

표시 이름. 새 로케일 생성 시 필수 (구독 실측 상한 35자)

상품 ID (appstore_list_products 결과)

상품 유형

기존 App Store IAP/구독 상품의 App Review 노트를 수정. appstore_list_products의 productId/type을 사용.

상품 ID (appstore_list_products 결과)

상품 유형

Apple 심사용 노트 (4000자 이하, 빈 문자열은 초기화)

이미 만들어진 버전의 출시 방식을 바꾼다 — PATCH /v1/appStoreVersions/{id}. MANUAL(개발자가 직접 출시) / AFTER_APPROVAL(승인되면 자동 출시) / SCHEDULED(지정 시각 출시). SCHEDULED 는 earliestReleaseDate(ISO 8601, 미래 시각)가 함께 필요하다. 편집 가능한 상태에서만 통한다 — 이미 READY_FOR_SALE 이면 바꿀 수 없다. MANUAL 로 만들어 둔 버전을 "승인되면 알아서 나가게" 바꾸는 용도가 대부분이다.

SCHEDULED 일 때 필수. ISO 8601 UTC (예: 2026-08-01T09:00:00Z)

출시 방식

App Store 버전 ID

App Store 심사 리뷰어 노트(Notes for App Review) 등록/수정. versionId 버전에 appStoreReviewDetail.notes를 PATCH하거나 없으면 POST로 생성. 심사 시 리뷰어에게 전달되는 테스트 계정·기능 안내 텍스트 작성에 사용. 4000자 권장 한도.

리뷰어에게 전달할 메모 (테스트 계정, 주요 변경사항, 접근 방법 등). 4000자 이내.

버전 ID (appstore_list_versions 결과)

기존 App Store 버전 레코드의 versionString 을 변경 (예: 2.0.5 → 2.0.6). ⚠ 편집 가능한 버전이 이미 있으면 appstore_create_version 이 409 "cannot create a new version in the current state" 로 막힌다 — 거절/철회된 버전으로 다음 릴리스를 내보내려면 새로 만들지 말고 이 도구로 **같은 레코드의 이름을 올린다**. 빌드는 CFBundleShortVersionString 이 같은 버전에만 붙으므로, 새 버전의 빌드를 attach 하려면 먼저 이걸 맞춰야 한다. PREPARE_FOR_SUBMISSION / DEVELOPER_REJECTED 등 편집 가능 상태에서만 통한다.

App Store 버전 ID (appstore_list_versions 결과)

새 버전 문자열 (예: "2.0.6")

App Store '이 버전의 새로운 기능' 편집 — versionId + locale만 주면 자동으로 로컬라이제이션을 찾아 PATCH. 가장 흔한 사용 케이스. 수정 가능한 상태(PREPARE_FOR_SUBMISSION 등)인 버전에서만 반영됨

로캘 (예: ko, en-US, ja)

버전 ID (appstore_list_versions 결과)

'이 버전의 새로운 기능' 텍스트 (4000자 이내)

빌드의 What to Test 를 로케일별로 저장한다 — betaBuildLocalizations upsert. 외부 테스터 배포에는 필수다. 비어 있으면 베타 심사에서 막힌다. 버전 릴리스 노트(appstore_update_whats_new)와는 별개다 — 이건 TestFlight 전용이다.

빌드 ID

로케일 (예: ko, en-US)

이번 빌드에서 테스트할 내용

제품 페이지 미리보기 **동영상**을 업로드한다 — appPreviewSets/appPreviews 4단계 업로드. previewType 세트가 없으면 만들고, 예약 → 조각 업로드 → 커밋까지 한 번에 처리한다. ⚠ 커밋 후 Apple 인코딩이 남는다 — 성공 응답이 곧 노출 가능은 아니다. appstore_list_previews 로 확인할 것. Apple 제약: 길이 15~30초, previewType 별 해상도 고정, 로케일·타입당 최대 3개. 어기면 인코딩 단계에서 거부된다. previewFrameTimeCode(HH:MM:SS:FF)로 포스터 프레임을 지정할 수 있다. 파일은 절대경로로 넘긴다 (대용량이라 조각 업로드하며, 동영상 바이트는 대화에 싣지 않는다).

동영상 파일 절대경로 (.mp4 / .mov / .m4v)

appStoreVersionLocalization ID

포스터 프레임 시각 HH:MM:SS:FF (예: 00:00:03:00)

미리보기 타입 (기기군)

기존 App Store IAP/구독 상품의 심사용 스크린샷을 reserve → upload → commit. 상품당 1장, 절대 파일 경로 필요. 이미 있으면 409 "Screenshot already exists" — 갈아끼우려면 replace: true (기존 것을 지우고 올린다).

업로드할 PNG/JPG의 절대 파일 경로

상품 ID (appstore_list_products 결과)

상품 유형

이미 스크린샷이 있으면 지우고 새로 올린다 (기본 false)

App Store 스크린샷 업로드 (자동 4단계: 셋 확보 → 예약 → 청크 업로드 → 커밋). 파일 경로는 로컬 절대경로. displayType은 Apple 공식 enum: APP_IPHONE_69 (6.9", 1290x2796) / APP_IPHONE_67 (6.7", 1290x2796) / APP_IPHONE_65 (6.5", 1242x2688) / APP_IPHONE_61 (6.1", 1170x2532) / APP_IPHONE_58 (5.8") / APP_IPHONE_55 (5.5", 1242x2208) / APP_IPAD_PRO_3GEN_129 (13", 2064x2752) / APP_IPAD_PRO_3GEN_11 (11", 1668x2388) / APP_IPAD_PRO_129 (12.9", 2048x2732) / APP_DESKTOP (2560x1600+). 해상도 틀리면 검수에서 리젝됨. 수정 가능한 버전 상태에서만 반영됨.

Apple 스크린샷 디스플레이 타입 (예: APP_IPHONE_69)

업로드할 이미지 파일의 절대경로

로컬라이제이션 ID

App Store Connect API 키(appstore.json) 유효성 검증 — JWT 서명 + GET /apps 호출로 creds/sign/auth/api 단계별 진단. 첫 도구 호출에서 401로 늦게 터지기 전에 setup 직후 확인용. 매출 리포트 접근 가능 여부도 함께 확인한다 — 그쪽만 요구 롤이 달라서 (Admin/Finance/Sales and Reports) 앱 메타데이터는 다 되는데 매출만 403 인 키가 흔하다. 인자 없음.

현재 BigQuery 인증 상태 조회 — 어떤 인증(서비스 계정/OAuth)이 사용되는지 확인

BigQuery 테이블 스키마(컬럼 정보) 조회

데이터셋 ID

GCP 프로젝트 ID

테이블 ID

BigQuery 프로젝트의 데이터셋 목록 조회

GCP 프로젝트 ID

BigQuery 데이터셋의 테이블 목록 조회

데이터셋 ID (예: analytics_123456789)

GCP 프로젝트 ID

BigQuery SQL 쿼리 실행 (SELECT). GA4 analytics_* 테이블 분석에 사용. 서비스 계정(권장) 또는 사용자 OAuth 로 인증.

최대 행 수 (기본 1000)

GCP 프로젝트 ID (예: my-app-analytics)

실행할 StandardSQL 쿼리

진행 중인 빌드를 취소합니다. (GitHub Actions run / GitLab pipeline)

빌드 ID (ci_trigger_build 또는 ci_list_recent_builds 반환값)

특정 빌드(GitHub Actions run / GitLab pipeline)의 현재 상태를 조회합니다.

최근 빌드 목록을 조회합니다. 특정 브랜치나 워크플로로 필터링 가능.

최대 개수 (기본: 10)

GitLab 전용: 브랜치 필터

GitHub 전용: 워크플로 파일명 또는 ID

GitHub Actions 워크플로 목록 또는 GitLab 파이프라인 스케줄/트리거 목록을 조회합니다. ci_trigger_build의 workflow 파라미터에 파일명(deploy.yml)을 사용하세요.

GitHub Actions 또는 GitLab CI 연결 설정을 저장합니다. 저장 위치: ~/.mimi-seed/ci.json (mode 0600). GitHub: provider="github", token="ghp_..." (repo+workflow 스코프 필요) GitHub Enterprise: host="https://github.example.com" 추가 GitLab.com: provider="gitlab", token="glpat-..." Self-hosted GitLab: host="https://gitlab.example.com" 추가

GitHub Enterprise 또는 GitLab self-hosted URL

GitHub org/user 또는 GitLab namespace

CI 프로바이더

저장소 이름 (경로 없이 repo명만)

Personal Access Token

빌드를 트리거합니다. GitHub: workflow 필수 (파일명 "deploy.yml" 또는 숫자 ID). workflow_dispatch 트리거가 설정된 워크플로만 실행 가능. GitLab: workflow 불필요 — ref(브랜치)만 지정하면 .gitlab-ci.yml 즉시 실행. 완료 직후 최신 빌드 정보를 반환합니다. run_id를 ci_get_build_status에 사용하세요.

워크플로 입력값 (GitHub inputs / GitLab variables)

브랜치 또는 태그 (기본: main)

GitHub 전용: 워크플로 파일명 또는 ID (예: deploy.yml)

현재 저장된 Facebook 페이지 설정을 확인합니다.

저장/사용할 소셜 프로필 ID. 생략 시 .mimi-seed.json의 socialProfiles.facebook, 없으면 기존 기본 설정

Facebook 페이지 정보 조회 + 저장된 토큰 유효성 검증.

User Access Token으로 접근 가능한 Facebook 페이지 목록을 조회합니다. 페이지별 Page Access Token도 함께 반환.

Facebook User Access Token (EAA...)

여러 이미지를 하나의 게시물로 Facebook 페이지에 게시합니다. 2~10장. 모든 이미지는 public URL이어야 합니다. 각 이미지를 unpublished photo로 업로드한 뒤 하나의 feed 게시물로 묶습니다.

게시글 본문

이미지 URL 배열 (2~10장)

단일 이미지를 Facebook 페이지에 게시합니다. imageUrl은 public URL이어야 합니다.

게시글 본문

이미지의 public URL (HTTPS 권장)

Facebook 페이지 액세스 토큰을 ~/.mimi-seed/facebook.json (mode 0600)에 저장합니다. pageAccessToken: Graph API Explorer 또는 /me/accounts로 발급한 Page Access Token (EAA...). pageId 미입력 시 토큰으로 자동 조회 (/me → id 필드). profile 지정 시 ~/.mimi-seed/social-profiles/<profile>.json에 저장합니다. 저장 직후 페이지 정보를 조회해 토큰 유효성도 자동 검증.

Facebook Page Access Token (EAA..., long-lived 권장)

Facebook Page ID (생략 시 토큰에서 자동 조회)

Firebase에 새 Android 앱 등록

앱 표시 이름

Android 패키지명 (예: com.example.myapp)

Firebase 프로젝트 ID

Firebase에 새 iOS 앱 등록

iOS Bundle ID (예: com.example.myapp)

앱 표시 이름

Firebase 프로젝트 ID

새 GCP 프로젝트를 만들고 Firebase를 추가한다 (앱 하나당 전용 Firebase 프로젝트 컨벤션 — 기존 프로젝트에 앱만 추가하려면 firebase_create_android_app/firebase_create_ios_app 사용). 두 개의 long-running operation(프로젝트 생성 → Firebase 추가)을 순서대로 완료까지 폴링하므로 최악의 경우 2분 정도 걸릴 수 있다. projectId는 6-30자, 소문자로 시작, 소문자/숫자/하이픈만 가능(끝에 하이픈 금지).

프로젝트 표시 이름

조직/폴더 소속이 필요한 계정일 때만: 'organizations/<id>' 또는 'folders/<id>'. 생략 시 계정 기본 정책대로 생성

새로 만들 GCP/Firebase 프로젝트 ID (예: my-app-prod)

Firebase에 새 Web 앱 등록

앱 표시 이름

Firebase 프로젝트 ID

Firebase Android 앱 삭제

삭제할 Firebase 앱 ID

Firebase 프로젝트 ID

Firebase iOS 앱 삭제

삭제할 Firebase 앱 ID

Firebase 프로젝트 ID

Firebase Web 앱 삭제

삭제할 Firebase 앱 ID

Firebase 프로젝트 ID

Firebase 기본 서비스 일괄 활성화 (Firestore, Auth, Storage, FCM 등)

프로젝트 ID

GCP 서비스 활성화 (예: firestore.googleapis.com)

프로젝트 ID

서비스 ID (예: firestore.googleapis.com)

프로젝트의 GA4 링크 상세 — 연결된 analyticsProperty + 앱↔data stream 매핑 조회.

Firebase 프로젝트 ID

google-services.json 다운로드

Firebase 앱 ID

Firebase 프로젝트 ID

GoogleService-Info.plist 다운로드

Firebase 앱 ID

Firebase 프로젝트 ID

Firebase 프로젝트 상세 정보 조회

Firebase 프로젝트 ID

Firebase Web 설정 (firebaseConfig 객체) 조회

Firebase 앱 ID

Firebase 프로젝트 ID

Firebase 프로젝트에 Google Analytics(GA4) 링크 → 앱별 measurement 자동 활성화. analyticsAccountId(그 계정에 GA4 property 신규 생성) 또는 analyticsPropertyId(기존 property 링크) 중 하나 필수. 먼저 firebase_enable_common_services 로 firebaseanalytics 활성화 권장. property 이름/web stream 까지 직접 제어하려면 ga4_create_property/ga4_create_data_stream 사용.

GA 계정 ID (신규 property 생성 위치) — 예: 123456

기존 GA4 property ID 에 링크할 경우

Firebase 프로젝트 ID

Firebase 프로젝트의 Android 앱 목록

Firebase 프로젝트 ID

프로젝트에서 활성화된 GCP 서비스 목록

프로젝트 ID

Firebase 프로젝트의 iOS 앱 목록

Firebase 프로젝트 ID

내 Firebase 프로젝트 목록 조회

Firebase 프로젝트의 Web 앱 목록

Firebase 프로젝트 ID

GA4 → BigQuery export 링크 생성. confirm 생략/false 시 읽기 전용 계획만 반환하고, confirm: true 일 때만 계획을 재검사한 뒤 생성한다. 기존 링크가 있으면 no-op.

true 명시 시에만 원격 링크 생성. 생략/false 면 계획만 반환

일일 내보내기 활성화 (기본 true)

생성할 BigQuery 데이터셋 위치 (예: 'asia-northeast3', 'US', 'EU'). 생성 후 변경 불가

Fresh Daily 내보내기 활성화 (기본 false, 지원 속성만 가능)

모바일 광고 식별자 포함 (기본 false, 개인정보 정책 확인 필요)

Google Cloud 프로젝트 ID — 'my-project' 또는 'projects/my-project'

GA4 property ID — '123456789' 또는 'properties/123456789'

스트리밍 내보내기 활성화 (기본 false, 추가 비용 가능)

GA4 property 에 data stream 생성. web → measurementId(G-XXXX) 반환, android/ios → firebaseAppId 반환(Firebase 링크 시). RN 앱은 android/ios 스트림 사용.

ios 전용 — Bundle ID (예: com.example.app)

web 전용 — 사이트 URL (예: https://example.com)

스트림 표시 이름

android 전용 — 패키지명 (예: com.example.app)

스트림 플랫폼

새 GA4 property 생성. 생성 후 ga4_create_data_stream 으로 플랫폼별 stream(웹=measurement ID, 앱=firebaseAppId)을 붙인다.

GA 계정 ID — '123' 또는 'accounts/123'

ISO 4217 통화코드 (기본 'USD', 예: 'KRW')

property 표시 이름 (예: SpeakReward)

IANA 타임존 (기본 'America/Los_Angeles', 예: 'Asia/Seoul')

접근 가능한 Google Analytics 계정 + 각 계정의 GA4 property 요약. accountId / propertyId 를 확인할 때 먼저 호출. analytics.edit 스코프 필요(없으면 재로그인 안내).

GA4 property 의 data stream 목록 (measurementId / firebaseAppId 평탄화).

특정 GA 계정 하위 GA4 property 목록.

GA 계정 ID — '123' 또는 'accounts/123'

GA4 → BigQuery export 링크 생성 계획을 읽기 전용으로 점검. 기존 링크, 대상 프로젝트, 데이터셋 위치와 export 옵션을 반환하며 원격 상태를 변경하지 않는다.

일일 내보내기 활성화 (기본 true)

모바일 광고 식별자 포함 (기본 false, 개인정보 정책 확인 필요)

스트리밍 내보내기 활성화 (기본 false, 추가 비용 가능)

GA4 Data API 리포트 (활성 사용자·이벤트 등). dimensions/metrics 는 쉼표 구분 GA4 API 이름.

쉼표 구분 dimension (예: date,country). 생략 시 전체 합계

종료일 (YYYY-MM-DD 또는 'today')

쉼표 구분 metric (기본 activeUsers,eventCount)

시작일 (YYYY-MM-DD 또는 'NdaysAgo', 'today')

예산 + 알림 임계 생성. ⚠ **예산은 알림만 한다. 지출을 막지 않는다.** 하드 차단은 Pub/Sub→결제해제 함수뿐이고 그건 앱을 죽인다. 실질 방어는 각 서비스의 상한(예: Cloud Functions maxInstances)이고 예산은 트립와이어다. ⚠ GCP 에 **일 예산은 없다** — 기간은 월(기본)/분기/연/사용자지정뿐. "하루 N원"을 원하면 월 환산하거나, 실사용이 적을 때는 작은 월 예산을 알람으로 쓰는 게 더 빨리 잡힌다. projectIds 를 반드시 고려할 것 — 공용 결제 계정에서 생략하면 알림이 소음이 된다(gcp_list_billing_projects 로 먼저 확인). 권한은 결제 계정 레벨 IAM 이라 서비스 계정 키로는 대개 403 — 사용자 OAuth 로 호출된다.

통화 단위 정수 금액. KRW 는 소수 없음 — 10000 = ₩10,000

결제 계정 ID

통화 코드 (기본 KRW). 결제 계정 통화와 일치해야 한다

예산 이름 (예: "my-app functions 감시")

감시할 프로젝트 ID 목록. 생략하면 결제 계정 전체 — 공용 계정이면 권장하지 않음

quota 주체 프로젝트 — Cloud Billing/Budget API 를 켜 둔 프로젝트 ID. 생략하면 OAuth 클라이언트 프로젝트로 quota 가 잡혀 403 이 난다(에러 메시지의 프로젝트 번호는 조회 대상이 아니라 OAuth 쪽이다).

알림 임계 비율 0~1 (기본 [0.5, 0.9, 1.0])

프로젝트의 결제 상태 조회 — Blaze(결제 계정 연결) 여부와 연결된 결제 계정 ID. Cloud Functions/Run 배포 전 필수 확인. ⚠ Cloud Billing API 가 꺼져 있으면 403 이 난다 — 그건 "Spark 이라서"가 아니라 조회 자체가 막힌 것이다. 그 경우 firebase_enable_service(projectId, "cloudbilling.googleapis.com") 로 먼저 켠 뒤 다시 호출.

GCP/Firebase 프로젝트 ID

결제 계정에 붙은 프로젝트 목록 = **비용 범위 확인**. 프로젝트가 2개 이상이면(shared=true) 그 계정은 공용이므로 **계정 전체 예산은 쓰지 말 것** — 기존 지출만으로 임계를 즉시 넘겨 알림이 소음이 된다. gcp_create_budget 에 projectIds 를 넘겨 범위를 좁힌다.

결제 계정 ID (예: 01F1F4-FD007B-2973A7 또는 billingAccounts/01F1F4-...)

결제 계정의 예산 목록 (금액·프로젝트 필터·알림 임계). 중복 생성 전 확인용.

결제 계정 ID

git 커밋 내역을 받아 Claude AI로 앱 스토어용 릴리즈 노트를 생성합니다. 3가지 톤(간결/상세/마케팅)과 다국어 버전을 동시에 생성합니다. ANTHROPIC_API_KEY 환경변수가 필요합니다. commits: [{ message, author?, date? }] 형태로 전달하세요. locales: 다국어 생성할 로케일 배열 (예: ["ko", "en-US", "ja"]) 생성 후 playstore_update_release_notes 또는 appstore_update_whats_new로 적용하세요.

앱 이름 (프롬프트 맥락용)

git 커밋 배열

다국어 로케일 목록 (예: ["ko", "en-US", "ja"])

Play Store / App Store 리뷰에 대한 AI 답변 초안을 생성합니다. ANTHROPIC_API_KEY 환경변수가 필요합니다. tone: friendly(친근) / professional(정중) / empathetic(공감) / brief(간결) — 기본: friendly language: ko / en / ja / zh 등 — 기본: ko ⚠ 생성된 답변은 초안입니다. 게시 전 반드시 검토하세요. 답변 게시는 playstore_reply_review 도구를 사용하세요.

앱 이름

개발자/팀 이름

답변 언어 코드 (기본: ko)

별점 (1~5)

리뷰 원문

답변 톤

Google Ads 연동 설정 현황 확인

기간별 캠페인 성과 리포트 (클릭, 노출, 비용, 전환수, CPI, CTR)

종료일 (YYYY-MM-DD)

시작일 (YYYY-MM-DD)

앱 캠페인(UAC) 리포트 — 앱 설치 캠페인별 설치수, CPI, ROAS 집계

종료일 (YYYY-MM-DD)

시작일 (YYYY-MM-DD)

OAuth 토큰으로 접근 가능한 Google Ads 계정 목록 (API 연결 확인용)

Google Ads 캠페인 목록 조회 (상태, 채널 타입, 일일 예산 포함)

Google Ads API 설정 저장 (Developer Token + 계정 ID). 최초 1회만 필요.

Google Ads 계정 ID (예: 123-456-7890)

Google Ads 콘솔 → 관리자 → API 센터에서 발급한 Developer Token

MCC(관리자) 계정 ID — 하위 계정 접근 시 필요

특정 사이트맵 1개의 상세(타입별 submitted/indexed, 경고/오류, 처리 시각) 조회.

사이트맵 전체 URL (예: https://example.com/sitemap.xml)

Search Console 속성 식별자. 도메인 속성은 'sc-domain:example.com', URL 접두어 속성은 'https://example.com/' 형식.

URL 1개의 실제 색인 상태 검사 (coverageState, robots.txt 허용 여부, 마지막 크롤 시각, 정규 URL, 리치 결과). 사이트맵 리포트보다 정확한 색인 진단의 단일 출처.

검사할 전체 URL — 반드시 siteUrl 속성 하위여야 함 (예: 'https://example.com/page')

이슈 메시지 언어 (BCP-47, 예: 'ko', 'en-US'). 기본 en-US

속성에 제출된 사이트맵 목록 (마지막 다운로드 시각, 경고/오류 수, submitted/indexed 카운트). ⚠ 사이트맵 리포트의 indexed 수치는 신뢰도 낮음 — 실제 색인 여부는 gsc_inspect_url 로 확인.

사이트맵 인덱스 URL — 인덱스 하위 사이트맵만 보고 싶을 때

Search Console에 등록된(권한 있는) 속성 목록 + 권한 레벨 조회. siteUrl 값을 확인할 때 먼저 호출.

검색 성과 데이터 조회 (클릭·노출·CTR·평균순위). dimensions로 query/page/country/device/date/searchAppearance 별 분해. 요약(가중 평균순위 포함) + rows 반환.

쉼표 구분 분해 차원: query,page,country,device,date,searchAppearance (생략 시 전체 합계)

종료일 (YYYY-MM-DD)

최대 행 수 (기본 1000, 최대 25000)

시작일 (YYYY-MM-DD)

검색 유형 필터 (기본 web)

web image video news discover googleNews

사이트맵을 Search Console에 제출(또는 재제출)해 재크롤을 유도. webmasters read-write 스코프 필요.

제출할 사이트맵 전체 URL (예: https://example.com/sitemap.xml)

프로젝트 IAM 정책에 (member → role) 바인딩 추가. 이미 같은 조합이 있으면 no-op. member 형식: `serviceAccount:<email>` / `user:<email>` / `group:<email>`. 주의: 이건 Google Cloud IAM 역할입니다. Play Console의 "View financial data" 권한은 별도 — Play Console → Users and permissions에서 부여.

권한 받을 주체 (예: serviceAccount:my-sa@my-project.iam.gserviceaccount.com)

Google Cloud 프로젝트 ID

IAM 역할 (예: roles/iam.serviceAccountTokenCreator)

주어진 서비스 계정의 새 JSON 키를 발급. 응답에 전체 JSON 포함 — 그대로 onesub의 GOOGLE_SERVICE_ACCOUNT_KEY 환경변수로 쓸 수 있음. 주의: 반환된 JSON은 영구 자격증명이므로 안전하게 보관. 한 서비스 계정당 키 최대 10개 (기존 키 회수 후 발급 필요하면 iam_list_keys로 먼저 확인).

서비스 계정 이메일

새 서비스 계정 생성. accountId는 이메일의 로컬 파트 (예: "onesub-play-verifier" → onesub-play-verifier@<project>.iam.gserviceaccount.com).

서비스 계정 ID (이메일 로컬 파트)

사람이 읽을 표시 이름 (예: "onesub Play verifier")

Google Cloud 프로젝트 ID

주어진 서비스 계정의 기존 키 목록. keyId / keyType / 만료시간 반환. 회수할 키 찾을 때 사용.

서비스 계정 이메일

주어진 projectId의 서비스 계정 목록. 이메일 / displayName / disabled 상태 반환.

Google Cloud 프로젝트 ID

Instagram 계정 정보 조회 + 저장된 토큰 유효성 검증.

저장/사용할 소셜 프로필 ID. 생략 시 .mimi-seed.json의 socialProfiles.instagram, 없으면 기존 기본 설정

여러 이미지를 캐러셀(swipe)로 게시합니다. 2~10장. 모든 이미지는 public URL이어야 함. 3-step API: 각 이미지 children container → carousel container → publish. 일부 이미지에서 실패하면 전체 실패 (이미 만든 children container는 자동 삭제 안 됨 — Instagram이 알아서 처리).

캡션

이미지 URL 배열 (2~10장)

단일 이미지를 Instagram에 게시합니다. imageUrl은 public URL이어야 합니다 (Graph API 제약). 로컬 파일은 미리 S3/R2/Cloudinary 등에 업로드 필요. 캡션에는 해시태그(#)와 멘션(@) 포함 가능. 줄바꿈 \n 사용. 2-step API: container 생성 → media_publish.

캡션 — 해시태그/멘션/줄바꿈 포함 가능

이미지의 public URL (HTTPS 권장)

Instagram 토큰을 ~/.mimi-seed/instagram.json (mode 0600)에 저장합니다. accessToken은 두 형식 모두 자동 감지:   IGAA... = Instagram API with Instagram Login (Meta 신규, FB Page 불필요)   EAA...  = Instagram Graph API via Facebook Login (FB Page+IG Business 연결 필요) userId 미입력 시 토큰으로 자동 조회 (/me 또는 /me/accounts). profile 지정 시 ~/.mimi-seed/social-profiles/<profile>.json에 저장합니다. 저장 직후 토큰 유효성도 자동 검증.

Long-lived access token (60일)

expiresAt = 지금 + 60일 자동 계산

Instagram Business Account ID (생략 시 자동 조회)

Jenkins에 Secret Text credential을 생성하거나 업데이트합니다. 비밀번호, API 키, 앱 시크릿 등 문자열 값에 사용하세요. 같은 id가 이미 존재하면 자동으로 업데이트합니다. 설정이 없으면 jenkins_status를 먼저 호출하세요.

설명 (선택)

Credential ID (예: my-app-android-key-password)

저장할 비밀값

config.xml 로 새 Jenkins 잡을 생성합니다 (createItem). 같은 이름의 잡이 이미 있으면 실패합니다. 덮어쓰려면 overwrite=true 를 주거나 jenkins_update_job 을 쓰세요. 폴더 안에 만들려면 job 에 "folder/name" 을 넘깁니다 (폴더는 미리 존재해야 합니다). config_xml 은 Pipeline job 이면 flow-definition 루트 엘리먼트를 갖는 XML 전문입니다.

잡 정의 config.xml 전문

잡 경로 (예: my-app, team-folder/my-app)

이미 존재하면 덮어쓸지 여부 (기본 false)

Jenkins credential을 삭제합니다. 비가역 작업입니다. 설정이 없으면 jenkins_status를 먼저 호출하세요.

삭제할 Credential ID

잡의 config.xml 원문을 가져옵니다. 잡을 수정하기 전에 현재 설정을 확인하거나 백업할 때 사용하세요. 폴더 안의 잡은 "folder/job" 형태로 경로를 넘깁니다.

잡 경로 (예: my-app, team-folder/my-app)

Jenkins에 등록된 credential 목록을 조회합니다 (id / displayName / type). 설정이 없으면 jenkins_status를 먼저 호출해 연결 정보를 확인하세요.

Jenkins 잡 목록을 조회합니다 (이름 / URL / 상태색). folder를 주면 그 폴더 안만 조회합니다. 재귀하지 않고 한 단계만 봅니다. 설정이 없으면 jenkins_status를 먼저 호출하세요.

폴더 경로 (예: team-folder). 생략하면 루트

Jenkins 서버 연결 설정을 저장합니다 (~/.mimi-seed/jenkins.json, mode 0600). 이 도구를 호출하기 전에 사용자에게 URL / username / token을 먼저 확인하세요. 로컬 Jenkins가 없어도 회사·원격 서버의 URL을 그대로 사용할 수 있습니다. API Token 발급: Jenkins 대시보드 → [사용자 이름] → 설정 → API Token → "Add new Token". 저장 후 jenkins_list_credentials 로 연결을 검증하세요.

Jenkins API Token

Jenkins 기본 URL (예: https://jenkins.company.com)

Jenkins 사용자 ID

⭐ Jenkins 관련 작업을 시작하기 전에 반드시 이 도구를 먼저 호출하세요. 현재 Jenkins 연결 설정(~/.mimi-seed/jenkins.json) 유무를 확인합니다. 설정이 없으면 사용자에게 Jenkins URL / 사용자 ID / API Token을 물어본 뒤 jenkins_save_config를 호출해 저장하세요. API Token 발급: Jenkins 대시보드 → [사용자 이름] → 설정 → API Token → "Add new Token". 로컬 Jenkins 없이 회사·외부 서버도 URL만 맞으면 연결 가능합니다.

기존 Jenkins 잡의 config.xml 을 통째로 교체합니다. 잡이 없으면 실패합니다 (생성은 jenkins_create_job). 기존 설정이 사라지므로 jenkins_get_job_config 로 먼저 백업하는 것을 권장합니다.

교체할 config.xml 전문

잡 경로 (예: my-app, team-folder/my-app)

Jenkins에 Android keystore 파일을 Secret File credential로 업로드합니다. keystore_base64에 .jks/.p12 파일을 base64로 인코딩한 값을 전달하세요. 같은 id가 이미 존재하면 자동으로 교체합니다. 설정이 없으면 jenkins_status를 먼저 호출하세요.

설명 (선택)

파일명 (기본: keystore.jks)

Credential ID (예: my-app-android-keystore)

keystore 파일 내용을 base64로 인코딩한 값

setup_playstore_connection으로 생성한 Play Store 서비스 계정 JSON을 Jenkins Secret File credential로 업로드합니다. ~/.mimi-seed/play-service-accounts/{package_name}.json 을 읽어 base64로 변환 후 등록합니다. setup_playstore_connection 실행 후 반드시 이 도구를 호출하세요.

Jenkins Credential ID (생략 시 "<앱>-playstore-sa")

Android 패키지명 (예: com.example.app)

Google OAuth 로그인 링크를 발급하고 백그라운드 콜백 서버를 시작. 응답에 포함된 URL을 브라우저에서 열고 승인하면 localhost:9876으로 자동 콜백 → 토큰이 ~/.mimi-seed/tokens.json에 저장됨. 이후 playstore_*, firebase_*, admob_* 등 다른 MCP 도구 바로 호출 가능. domains 로 필요한 권한 도메인만 골라 요청 가능 (미지정 시 전체). 재로그인 시 기존 부여 권한은 유지되고 새 권한만 추가됨(incremental). 토큰 만료(invalid_rapt) / 재인증 필요 시 사용. 10분 내 완료해야 함.

요청할 권한 도메인 서브셋 (미지정 시 전체). 가능한 값: firebase, gcp, admob, playstore, googleads, gsc, ga4, youtube. 예: ["ga4","googleads"] — 기존에 부여된 다른 도메인 권한은 유지된다.

firebase gcp admob playstore googleads gsc ga4 youtube

Mimi Seed MCP 인증 상태 확인 (만료 시 refresh_token으로 자동 갱신 시도)

로컬 ~/.mimi-seed의 App Store Connect 키와 패키지별 Google Play 서비스 계정을 Mimi Seed 원격 MCP에 검증 후 암호화 동기화합니다. 기본은 미리보기이며 실제 비밀값 전송에는 confirm=true가 필요합니다. 로컬 Google OAuth tokens.json은 보안 및 OAuth 클라이언트 호환성 때문에 복사하지 않습니다.

true일 때만 원격에 비밀값을 전송하고 저장

App Store 키 포함 (기본 true)

Play 서비스 계정 포함 (기본 true)

특정 Play 패키지만 동기화

⭐ 새 세션을 시작하거나 "뭐가 연결됐지?" 라는 질문엔 이 도구를 먼저 호출하세요. 전체 서비스(Google OAuth / Play SA / App Store / Jenkins / CI / Google Ads / Facebook / Instagram / Threads / TikTok Business / BigQuery) 설정 상태를 한 번에 스캔해 ✅ / ❌ 트래픽 라이트 리포트와 번호 매긴 다음 단계를 반환합니다. 미설정 서비스마다 어떤 도구를 호출하면 되는지 구체적으로 알려줍니다.

진행 중인 복구 액션을 취소한다 — apprecovery.cancel. 아직 받지 않은 기기에는 더 이상 나가지 않는다. 이미 적용된 기기는 되돌아가지 않는다. confirm 필요.

복구 액션 ID

true 명시 시에만 취소

패키지명

Google Play 제출 전 위험 요소를 자동으로 점검합니다. 블로커(반드시 수정)와 경고(권장 수정)로 분류하여 반환합니다. 점검 항목: 리스팅 완성도(제목/설명/짧은설명), 스크린샷 수, 아이콘, 빌드 존재 여부, 연락처.

언어 코드 (기본: ko-KR)

Android 패키지명 (예: com.example.myapp)

Google Play에 일회성 인앱 상품(소비성 또는 비소비성)을 생성. Play Console 권한: "Manage store presence" 필요. 생성 후 Console에서 활성화 필요.

ISO 4217 통화 코드 (기본 USD)

추가 지역별 명시 가격. 자동 환산이 부정확한 KRW/JPY 등에 직접 지정.

ISO 4217 통화 코드 (예: KRW, JPY, GBP)

가격 (최소 단위: KRW ₩1,100 → 1100, USD $0.99 → 99)

상품 이름 (스토어 노출 제목)

패키지명 (예: com.example.app)

주 통화 기준 가격 (최소 단위: USD/EUR이면 cents, KRW/JPY이면 원화 정수. 예: USD $4.99 → 499, KRW ₩5,900 → 5900)

상품 ID (소문자/숫자/언더스코어/점, 예: premium_unlock). 한 번 정하면 변경 불가.

상품 유형 (소비성/비소비성). 앱이 consumePurchase 호출하면 소비성.

앱 복구 액션을 DRAFT 상태로 만든다 — apprecovery.create. 만들기만 하고 배포하지 않는다 (배포는 playstore_deploy_recovery_action). 대상은 allUsers 또는 versionCodes / versionRange 중 하나로 정한다 — allUsers 와 버전 지정은 함께 못 쓴다. ⚠ 배포 후에는 대상을 만들 때 고른 기준 안에서만 넓힐 수 있다. 범위를 신중히 잡을 것. 이건 롤백이 아니라 "고친 버전으로 강제 업데이트"다 — 먼저 정상 빌드를 올려 둬야 의미가 있다.

전체 사용자 대상 (버전 지정과 함께 쓸 수 없음)

true 명시 시에만 생성. 생략/false 면 계획만 반환.

패키지명

지역 코드 (예: KR, US)

Android SDK 레벨

대상 버전 코드 목록

대상 버전 범위 끝

대상 버전 범위 시작

Google Play에 자동 갱신 구독을 생성하고 baseplan을 활성화. 구독 생성 → baseplan(가격·주기) 추가 → 자동 활성화. 이미 같은 productId가 있으면 생성 실패 (Play API 특성상 upsert 미지원).

ISO 4217 통화 코드 (기본 USD)

추가 지역별 명시 가격

ISO 4217 통화 코드 (예: KRW, JPY)

가격 (최소 단위)

구독 제목 (스토어 노출)

패키지명

청구 주기

주 통화 기준 가격 (최소 단위: USD cents. 예: $4.99 → 499, ₩5,900 → 5900)

구독 상품 ID (소문자/숫자/언더스코어/점, 예: premium_monthly)

Google Play 리스팅 특정 imageType의 이미지 전체 삭제 (교체 전 정리). ⚠ commit이 Play Console의 미게시 리스팅 변경을 덮어쓸 수 있음.

featureGraphic icon phoneScreenshots promoGraphic sevenInchScreenshots tenInchScreenshots tvBanner tvScreenshots wearScreenshots

언어 코드

패키지명

⚠ 비가역. Google Play IAP 상품 삭제. 활성 baseplan + 구독자 있는 구독은 삭제 불가.

패키지명

상품 ID

상품 유형

등록된 패키지별 서비스 계정 삭제. default(레거시) SA는 영향 없음.

삭제할 패키지명

DRAFT 복구 액션을 실제로 배포한다 — apprecovery.deploy. ⚠ 대상 사용자 기기에 원격 인앱 업데이트가 나간다. 되돌리려면 취소해야 하고, 이미 적용된 기기는 되돌아가지 않는다. 배포 전 playstore_list_recovery_actions 로 대상 범위를 반드시 재확인할 것. confirm 필요.

복구 액션 ID

true 명시 시에만 배포

패키지명

Google Play 앱 세부정보 조회 — 개발자 연락처(이메일·전화·웹사이트)·기본 언어 등 (edits.details). 수정은 playstore_update_details.

패키지명 (예: com.findthem.app)

Play 재무 리포트를 내려받아 파싱·집계한다 = **Play 실매출의 기준선**. 분석 이벤트로는 라이선스 테스터·내부 테스트 결제를 실결제와 구분할 수 없다 (둘 다 install_source 가 com.android.vending 이다). 청구가 0원인 테스터 주문은 이 리포트에 **아예 나타나지 않으므로**, 여기 없으면 실매출이 아니다. earnings: Transaction Type 이 Charge/Google fee/Tax/환불로 나뉘고 수수료·세금이 음수로 들어와 netByMerchantCurrency 는 이미 순액이다. **Charge 행만이 실제 구매다.** sales: 주문 번호 단위라 개별 주문을 짚을 때 쓴다. ⚠ 정산 통화마다 파일이 따로 떨어지므로 한 달치가 여러 파일일 수 있다 — 전부 합쳐서 집계한다.

버킷 이름 또는 gs:// URI. 생략 시 저장된 설정 사용

원본 행까지 전부 반환. 건수가 많으면 응답이 매우 커진다

패키지명 — 패키지별 서비스 계정·버킷 설정을 고를 때 사용

기본 earnings(정산). 주문 단위로 보려면 sales

YYYYMM 또는 YYYY-MM

Google Play 스토어 리스팅 조회 (제목, 설명문 등)

언어 코드 (기본: ko-KR)

패키지명

Google Play Developer Reporting API / Android vitals 통계 조회. ANR/Crash/Error count를 기간·버전·기기·국가 등으로 분해해 확인

집계 단위

분해 차원. 기본: ["versionCode"] (errorCount는 ["reportType","versionCode"]). reportType/issueId는 errorCount 전용, countryCode/deviceBrand는 anrRate/crashRate 전용

reportType issueId osBuild apiLevel versionCode deviceModel deviceBrand deviceType countryCode deviceRamBucket deviceSocMake deviceSocModel deviceCpuMake deviceCpuModel deviceGpuMake deviceGpuModel deviceGpuVersion deviceVulkanVersion deviceGlEsVersion deviceScreenSize deviceScreenDpi

종료일 YYYY-MM-DD (보통 exclusive처럼 다음날 지정 권장)

AIP-160 필터. 예: versionCode = 42

조회할 Vitals metric set. 기본: anrRate

조회 metric. 기본은 metricSet별 핵심 metric + distinctUsers

패키지명 (예: com.example.app)

최대 행 수

다음 페이지 토큰

시작일 YYYY-MM-DD (포함)

날짜 기준 timezone. 기본: America/Los_Angeles (Play Reporting API 샘플/지원 기준)

사용자 cohort

Play 재무 리포트 파일 목록 (Cloud Storage 버킷). ⚠ **Play Developer API 에는 매출 엔드포인트가 없다.** purchases.* 는 구매 토큰을 이미 알아야 하고 Reporting API 는 vitals 뿐이다. 실제 정산 데이터는 Play Console 이 매달 개발자 소유 GCS 버킷에 떨궈주는 CSV 가 유일한 소스라, 이 도구는 그 버킷을 훑는다. 버킷 이름(gs://pubsite_prod_...)은 Play Console > 다운로드 보고서 > 재무 에만 있고 API 로 못 얻는다 — ~/.mimi-seed/play-financials.json 에 한 번 저장해두면 이후 생략 가능. ⚠ 접근 권한은 **GCP IAM 이 아니다.** 이 버킷은 Google 소유라 프로젝트에 roles/storage.* 를 줘도 닿지 않는다 — Play Console > 사용자 및 권한 에서 서비스 계정 이메일을 초대하고 "재무 데이터 보기"를 전체(Global)로 줘야 열린다. 앱 게시용 Play Developer API 권한과 별개라, 릴리스가 되는 계정이라고 리포트가 열려 있지는 않다. 재무 리포트는 월 마감 후에 올라오므로 이번 달 파일이 없는 것은 정상이다.

버킷 이름 또는 gs:// URI. 생략 시 저장된 설정 사용

패키지명 — 패키지별 서비스 계정·버킷 설정을 고를 때 사용

생략하면 버킷 전체. earnings=정산(수수료·세금 포함), sales=주문 단위

Google Play 리스팅 이미지 목록 조회 (imageType별)

이미지 타입

언어 코드 (예: ko-KR)

패키지명

Google Play 인앱 상품 목록

패키지명

Google Play의 모든 IAP 상품(구독 + 일회성) 통합 조회. productId / name / status / type / price / currency 반환.

패키지명

앱 복구 액션 목록을 조회한다 — 읽기 전용 (apprecovery.list). 이미 배포된 앱이 치명적으로 망가졌을 때 특정 버전 사용자에게 원격 인앱 업데이트를 밀어 넣는 장치다. 상태(DRAFT/ACTIVE/CANCELED)·생성·배포·취소 시각과 대상을 보여준다.

패키지명

특정 버전 코드로 필터

Google Play 리뷰 목록 조회

패키지명

등록된 패키지별 서비스 계정 + default(레거시) SA 정보 요약. clientEmail / projectId 만 노출 (private_key 미노출).

Google Play 구독 상품 목록

패키지명

Google Play 릴리스 트랙 현황 (프로덕션/베타/알파/내부)

패키지명

Google Play 배포 플랜 — 인증/빌드/메타데이터/스크린샷/정책 위험을 한 번에 점검하고 체크리스트로 반환합니다 (read-only, 아무것도 변경하지 않음). ⚠ AI 호출자 지시: 응답을 받으면 미완료 항목을 반드시 TodoWrite로 사용자에게 먼저 보여주고, 사용자 동의 후 단계별로 기존 도구(playstore_update_listing, playstore_update_release_notes, playstore_submit_release 등)를 호출하세요. submit_release(status=completed)는 비가역이므로 반드시 명시 동의 필요.

점검할 리스팅 언어 (기본: ko-KR)

Android 패키지명 (예: com.example.app)

대상 트랙 (기본: production)

확인할 versionCode. 미지정 시 트랙 최신 release 검사

Google Play 트랙 간 release promote — fromTrack(예: internal)의 versionCode를 toTrack(예: production)에 새 release로 추가. 단일 edit session에서 source 조회 → target 업데이트 → commit 까지 한 번에 처리. source의 releaseNotes를 자동 복사 (copyReleaseNotes=false 또는 releaseNotes로 덮어쓰기 가능). status="completed" + production 으로 전체 출시, status="inProgress" + userFraction 으로 단계 출시(예: 0.1 = 10%). target에 같은 versionCode가 이미 있으면 해당 항목을 교체. status="completed"면 target 활성 release를 통째로 새 것으로 대체. ⚠ status="completed"는 비가역에 가까움. playstore_check_submission_risks로 사전 점검 권장. Play 가 자동 심사 전송을 거부하는 앱이면 changesNotSentForReview=true 로 자동 폴백해 커밋한다 — 이때 응답의 changesNotSentForReview=true 와 nextAction 을 사용자에게 전달할 것(콘솔에서 "심사를 위해 전송"을 눌러야 심사 시작). source 트랙 노트가 버전 문자열뿐인 플레이스홀더면 warnings 로 알린다 — 그대로 승격하면 대상 트랙의 다국어 노트가 덮인다.

source releaseNotes 복사 여부 (기본 true)

출처 트랙 (예: internal)

패키지명 (예: com.example.app)

release 이름 (미지정 시 source 이름 그대로)

대상 트랙용 릴리스 노트 (미지정 + copyReleaseNotes=true면 source 그대로)

언어 코드 (예: ko-KR, en-US)

릴리스 노트 본문 (500자 이내)

대상 트랙에서의 status (기본 completed)

대상 트랙 (예: production)

status="inProgress"일 때 단계 출시 비율 (0~1, 예: 0.1)

promote할 versionCode (문자열)

packageName fromTrack toTrack versionCode

Google Play 서비스 계정 JSON을 패키지 단위로 등록 (~/.mimi-seed/play-service-accounts/{packageName}.json, 0600 mode). 여러 앱이 서로 다른 GCP 프로젝트의 SA를 쓰는 환경 지원. 등록 후 해당 packageName으로 호출하는 모든 playstore_* 도구가 이 SA를 사용 (등록 안 된 패키지는 ~/.mimi-seed/play-service-account.json 의 default SA로 폴백). 먼저 playstore_verify_service_account 로 권한 확인 후 등록을 권장.

Android 패키지명 (예: com.example.app)

서비스 계정 JSON 전체 내용 (문자열)

true면 사전 검증 건너뜀 (기본 false: 등록 전 verifyServiceAccountJson 실행)

Google Play 리스팅 이미지 일괄 교체 (한 edit 세션: deleteall → 순서대로 upload → commit). 스크린샷 5~8장 한 번에 교체 시 효율적. 업로드 순서가 스토어 노출 순서. ⚠ commit이 Play Console의 미게시 리스팅 변경을 덮어쓸 수 있음.

업로드할 이미지 절대 경로 배열 (순서 = 노출 순서)

언어 코드

패키지명

packageName language imageType filePaths

Google Play 리뷰에 답변

패키지명

답변 내용

리뷰 ID

Google Play 트랙의 release status를 변경 — 일반적으로 draft → completed로 바꿔 검토/배포 큐에 진입시킬 때 사용. ⚠ status="completed"는 비가역에 가까움 (전체 출시 또는 Google 검토 시작). halted로 일시 중단은 가능하나 한 번 라이브된 release는 되돌리기 어려움. status 옵션: draft(검토 미시작) / inProgress(단계 출시) / completed(전체 출시) / halted(중단). playstore_check_submission_risks로 사전 점검 권장.

패키지명 (예: com.example.app)

새 status (기본: completed)

릴리스 트랙

대상 versionCode (문자열)

Google Play 앱 세부정보(개발자 연락처·기본 언어) 수정 — 연락처 이메일/전화/웹사이트, 기본 언어. 스토어 리스팅(제목·설명)과는 별개이며, 넘긴 필드만 부분 갱신(edits.details.patch). ⚠ Console 에서 같은 앱을 편집·미게시 중이면 충돌할 수 있음.

개발자 연락처 이메일 (스토어 등록정보에 공개)

개발자 연락처 전화번호 (선택)

개발자 웹사이트 URL (예: https://example.com)

기본 언어 코드 (예: ko-KR, en-US)

패키지명 (예: com.example.app)

Google Play 트랙의 최신 릴리스(versionCode 최대) '최근 변경사항' 업데이트 — versionCode를 모를 때 편의용. ⚠ 지정한 단일 트랙에만 적용 — 다른 트랙에는 자동 복사되지 않음 (Google Play 정책: promote_release 시점에 노트 캐리됨). 동일 노트를 여러 트랙에 즉시 반영하려면 syncTracks 옵션 사용 — 지정 트랙들에 대해 순차로 같은 노트 적용.

언어 코드 (예: ko-KR)

패키지명

추가로 동일 노트 적용할 트랙 배열 (예: ["production"]). 지정 시 1차 track 반영 후 순차 동기화.

릴리스 노트 본문 (500자 이내)

1차 적용 트랙

Google Play 스토어 리스팅 수정 또는 새 언어 생성. 기존 언어는 넘긴 필드만 부분 갱신(edits.listings.patch)해 생략한 필드와 프로모 영상(video)을 보존한다. 새 언어는 title·shortDescription·fullDescription을 모두 전달해야 하며 전체 리스팅을 생성한다. ⚠ Play API 편집과 Console 동시 편집은 충돌 — Console에서 같은 리스팅을 편집·미게시 중이면 그 변경이 덮어써질 수 있음.

전체 설명 (4000자 이내)

언어 코드 (예: ko-KR, en-US)

패키지명

짧은 설명 (80자 이내)

앱 제목 (30자 이내)

Google Play IAP 상품의 표시 이름 변경 (현재 name 필드만 수정 가능). productId / type / 가격은 변경 불가. 언어별 제목·설명은 playstore_update_product_listing / playstore_update_subscription_listing 을 쓴다.

새 표시 이름

패키지명

상품 ID

상품 유형

Google Play 인앱 상품(소모성/비소모성)의 언어별 제목·설명을 갱신. 넘긴 로케일만 덮어쓰고 나머지 언어는 보존한다. 리스팅이 없는 언어의 사용자에게는 앱 기본 언어 리스팅이 대신 보인다 — 번역을 넣어야 그 나라 결제창이 그 나라 말로 나온다. 구독은 playstore_update_subscription_listing 을 쓴다.

갱신할 언어별 리스팅

설명 (200자 이하)

언어 코드 (예: ko-KR, en-US, ja-JP, zh-TW)

제목 (55자 이하). 새 언어 추가 시 필수

패키지명

상품 ID (playstore_list_inapp_products 결과)

Google Play 인앱 상품의 구매 옵션을 활성화/비활성화 — Play Console 의 DRAFT → 활성 토글. DRAFT 인 상품은 가격이 앱에 안 내려오므로 만들고 활성화하지 않으면 상점 화면이 비어 보인다. purchaseOptionId 는 playstore_list_inapp_products 의 purchaseOptions[].purchaseOptionId (보통 "base").

활성화 / 비활성화

패키지명

상품 ID

구매 옵션 ID (기본 "base")

Google Play 트랙 릴리스의 '최근 변경사항'(releaseNotes) 업데이트. versionCode로 타겟 릴리스 지정. 다른 언어/release는 보존. 이미 라이브(completed) 상태도 noteOnly 편집 가능

언어 코드 (예: ko-KR, en-US)

패키지명 (예: com.example.app)

릴리스 노트 본문 (500자 이내)

릴리스 트랙

대상 versionCode (문자열, 예: "40")

packageName track versionCode language text

Google Play 구독 상품의 언어별 제목·설명·혜택(benefits)을 갱신. 넘긴 로케일만 덮어쓰고 나머지 언어는 보존한다. benefits 는 스토어 구매창에 불릿으로 나오는 항목이라 한 줄에 몰아넣지 말고 항목을 나눠 넣는다 (최대 4개).

갱신할 언어별 리스팅

혜택 항목 (각 40자 이하, 최대 4개). 생략하면 기존 값 유지

설명 (200자 이하)

언어 코드 (예: ko-KR, en-US, ja-JP, zh-TW)

제목 (55자 이하). 새 언어 추가 시 필수

패키지명

구독 상품 ID (playstore_list_subscriptions 결과)

Play 데이터 안전(Safety Labels) 선언을 업로드한다 — POST applications/{packageName}/dataSafety. 오래 Console 전용으로 알려졌던 항목이지만 API 가 있다. 입력은 Play Console 이 내려주는 **CSV 원문**이다 (Console > 앱 콘텐츠 > 데이터 안전 > 내보내기). ⚠ 기존 제출을 통째로 덮어쓴다 — 부분 갱신이 아니므로 항상 최신 전체 CSV 를 보낼 것. 콘텐츠 등급·타깃 연령 설문은 여전히 API 가 없다 (Console 전용).

true 명시 시에만 업로드. 생략/false 면 요약만 반환.

CSV 원문 문자열. csvPath 와 둘 중 하나는 필수

데이터 안전 CSV 파일의 절대경로. csv 와 둘 중 하나는 필수

패키지명 (예: com.example.app)

Google Play 리스팅 이미지 단일 업로드 (기존 이미지 유지). featureGraphic 1024x500 / icon 512x512 / phoneScreenshots 320~3840px. ⚠ 이 작업은 edit을 commit하므로 Play Console의 미게시(저장 전) 리스팅 변경을 덮어쓸 수 있음 — Console에서 같은 앱을 편집 중이면 먼저 저장·게시하거나 텍스트도 update_listing으로 처리하세요.

업로드할 이미지 절대 경로

언어 코드

패키지명

서비스 계정 JSON이 주어진 packageName에 대해 Play Developer API 호출 가능한지 + 'View financial data' 권한까지 있는지 검증. onesub 같은 서버가 Play 영수증을 백그라운드로 검증하려면 OAuth 토큰 대신 서비스 계정 JSON이 필요 — 이 도구로 붙여넣기 전에 유효성 확인. 성공 시 clientEmail + projectId 반환. 실패 시 어느 단계(parse/auth/api)에서 왜 막혔는지 단계별로 안내. (이 도구는 서비스 계정 자격증명만 사용 — 로그인한 사용자의 OAuth 토큰은 건드리지 않음)

검증할 Android 앱의 패키지명 (예: com.findthem.app)

서비스 계정 JSON 전체 내용 (문자열). Google Cloud Console → IAM & Admin → Service Accounts → Keys → Create new key → JSON으로 다운받은 파일의 내용

양 스토어의 동일 버전 상태를 한 번에 조회 — 1.4.x 배포 시 "Play 는 production?", "ASC 는 심사중?" 을 list_versions + list_tracks 2회 호출 + grep 으로 합치던 멘탈 부담을 단일 응답으로 줄임. App Store: appId 가 있을 때 listVersions 에서 version 일치 항목의 state/releaseType/attached build/createdDate. Play Store: packageName 이 있을 때 listTracks 에서 동일 versionName 또는 versionCode 가 있는 모든 트랙의 status/versionCodes. appId 또는 packageName 둘 다 비어 있으면 에러. 둘 중 하나만 줘도 그 스토어 상태만 조회 가능.

App Store appId (appstore_list_apps 결과). 없으면 App Store 영역 skip.

Play 패키지명 (예: com.example.app). 없으면 Play 영역 skip.

조회할 버전명 (예: "1.4.9"). App Store versionString + Play release.name 매칭에 사용.

로컬 스크린샷 파일의 해상도·파일크기·종횡비를 App Store / Play Store 규격과 비교 검증합니다. PNG/JPEG 파일 경로를 배열로 받아 각 파일의 통과 여부와 문제점을 반환합니다. platform: "ios" 또는 "android" (기본: ios) iOS displayType 예시: APP_IPHONE_69, APP_IPHONE_67, APP_IPHONE_65, APP_IPAD_PRO_3GEN_129 Android imageType 예시: phoneScreenshots, sevenInchScreenshots, tenInchScreenshots, featureGraphic 업로드 전 미리 검사하여 리젝 방지에 활용하세요.

iOS 디스플레이 타입 (예: APP_IPHONE_67)

검증할 이미지 파일 절대경로 배열

Android 이미지 타입 (예: phoneScreenshots)

플랫폼 (기본: ios)

Play Store 서비스 계정을 한 번에 설정합니다 (SA 생성 → JSON 키 발급 → 로컬 등록). iam_create_service_account → iam_create_key → playstore_register_service_account 를 순서대로 자동 실행. 완료 후 Play Console에서 서비스 계정 이메일을 초대하는 안내(수동 1단계)가 포함됩니다. 이미 같은 accountId의 SA가 존재하면 키만 새로 발급하고 등록합니다.

서비스 계정 ID (기본: mimi-play-publisher)

Android 패키지명 (예: com.example.app)

Google Cloud 프로젝트 ID (예: my-project-123). Firebase 콘솔 → 프로젝트 설정에서 확인.

현재 선택된 Threads 연결 설정을 확인합니다. 프로젝트 매핑 또는 profile 인자를 따릅니다.

저장/사용할 소셜 프로필 ID. 생략 시 .mimi-seed.json의 socialProfiles.threads, 없으면 기존 기본 설정

Threads 계정 정보 조회 + 저장된 토큰 유효성 검증.

Threads에 게시합니다. 텍스트 전용이 기본이며, imageUrl을 주면 이미지 게시. text에는 링크·멘션(@)·해시태그를 포함할 수 있고 줄바꿈 \n 사용. 게시물당 최대 500자. imageUrl은 public URL이어야 합니다 (Graph API 제약). 로컬 파일은 미리 S3/R2/Cloudinary 등에 업로드 필요. 2-step API: container 생성(/threads) → threads_publish. 이미지는 처리 완료까지 자동 대기.

이미지의 public URL (생략 시 텍스트 전용 게시)

게시할 텍스트 (최대 500자, 멘션/해시태그/줄바꿈 가능)

여러 이미지를 캐러셀로 Threads에 게시합니다. 2~20장 (인스타는 10장, Threads는 20장). 모든 이미지는 public URL이어야 함. 각 이미지 처리 완료까지 자동 대기. 3-step API: 각 이미지 children container → carousel container → publish.

이미지 URL 배열 (2~20장)

캡션 텍스트 (최대 500자)

public URL의 영상을 Threads에 게시합니다. Meta가 videoUrl을 직접 가져가므로 외부에서 인증 없이 접근 가능한 URL이어야 합니다. 3-step API: VIDEO container 생성 → 처리 완료 자동 대기 → threads_publish. 공개 게시 작업이므로 같은 턴에 사용자의 명시 승인을 받은 뒤 호출하세요.

영상 접근성 대체 텍스트 (선택)

게시할 텍스트 (선택, 최대 500자)

Threads가 가져갈 영상의 public URL

저장된 Threads long-lived 토큰을 만료 전에 공식 refresh_access_token endpoint로 갱신합니다. 성공하면 새 토큰과 실제 expires_in을 저장하고 계정을 다시 검증합니다. 이미 만료·철회된 토큰은 갱신할 수 없으므로 mimi-seed auth threads로 재연결하세요.

Threads 토큰을 ~/.mimi-seed/threads.json (mode 0600)에 저장합니다. accessToken은 Threads Graph API long-lived 토큰 (약 60일). userId 미입력 시 토큰으로 자동 조회 (GET /me). profile 지정 시 ~/.mimi-seed/social-profiles/<profile>.json에 저장합니다. 저장 직후 토큰 유효성도 자동 검증. Instagram 과 별개 계정·별개 토큰입니다 (threads_basic, threads_content_publish 권한 필요).

Threads Graph API long-lived access token (약 60일)

expiresAt = 지금 + 60일 자동 계산

Threads user ID (생략 시 자동 조회)

TikTok API for Business Organic API 연결과 권한 상태를 확인합니다. 만료 5분 전이면 refresh token으로 access token을 자동 갱신합니다. 토큰·앱 시크릿은 응답하지 않습니다. 미연결이면 `mimi-seed auth tiktok`을 실행하세요.

연결된 owned TikTok Business Account 프로필을 조회하고 현재 토큰으로 접근 가능한지 검증합니다.

TikTok 게시 처리 상태를 조회하고 로컬 감사 로그의 pending/published/failed 상태를 갱신합니다.

publish 응답의 share_id 또는 publish_id

게시 전에 계정별 최대 영상 길이와 댓글·듀엣·스티치 설정을 조회합니다.

로컬 TikTok 게시 감사 로그를 최신순으로 조회합니다. 토큰·앱 시크릿·서명 URL 쿼리는 저장하거나 반환하지 않습니다.

TikTok 공개 게시 전용 계획을 만들고 30분 동안 로컬에 보관합니다. 로컬 원본을 ffprobe로 검사하고 SHA-256으로 중복 게시를 차단하며 계정별 영상 설정과 대조합니다. videoUrl은 TikTok 앱에서 검증한 도메인의 HTTPS URL이어야 하고 최소 30분 이상 유효해야 합니다. 이 도구는 TikTok에 게시하지 않습니다. 검토 후 tiktok_business_publish_video를 별도로 호출하세요.

UTF-16 기준 최대 2,200자, 멘션 최대 30개

선택 썸네일 HTTPS URL

FFmpeg 절대경로. 생략하면 PATH의 ffprobe 사용

AI 생성·변형 영상 고지

브랜드 자체 홍보 콘텐츠 여부

유료 파트너십/브랜디드 콘텐츠 여부

검증·중복 판정할 로컬 .mp4/.mov/.webm 절대경로

영상 시작 기준 썸네일 오프셋(ms)

TikTok 서버가 가져갈 영상의 검증된 HTTPS URL

검증된 30분짜리 계획을 owned TikTok Business Account에 공개 게시합니다. 외부 공개 작업이므로 같은 턴에 사용자의 명시 승인을 받은 뒤 confirmPublish=true로 호출해야 합니다. POST 타임아웃은 결과 불명으로 감사 로그에 남고 자동 재시도를 막습니다. 성공 응답은 보통 pending이며 tiktok_business_get_publish_status로 완료를 확인하세요.

사용자의 공개 게시 명시 승인 확인

사용자 소유 또는 별도 라이선스를 확보한 로컬 이미지·영상·오디오를 프로젝트에 복사해 등록합니다. filePath는 절대경로여야 하며 license와 출처 정보가 assets.json에 기록됩니다. reference-only 자료는 이 도구로 등록하지 마세요.

소유권 또는 라이선스 근거

절대경로. 상대경로는 허용하지 않습니다.

projectDir filePath kind sourceType license

등록된 이미지·영상 자산을 장면 순서와 길이에 맞춰 timeline.json으로 조합합니다. assets.json에서 allowedForRendering=true이고 reference-only가 아닌 자산만 허용합니다. 화면 문구는 최종 렌더에서 쇼츠 스타일 자막(굵은 폰트·흰 글자·검정 외곽선)으로 번인되며, onScreenText 안의 **단어** 마크업은 하이라이트 컬러(기본 노랑)로 강조됩니다. 한 장면 자막은 3~5어절·최대 2줄로 짧게 쓰고, 하이라이트는 문장당 한 단어만 지정하세요.

자막 스타일. 생략하면 쇼츠 기본 스타일

설치된 굵은 한글 고딕 폰트명(예: Pretendard, 에스코어드림). 생략 시 Malgun Gothic Bold

생략 시 세로 영상은 높이의 4.2%(1080×1920 기준 81px)

**단어** 마크업 색. 기본 #FFD400

생략 시 9:16은 lower-middle(하단-중앙 1/3, 쇼츠 UI 안전영역)

shorts(기본): 외곽선 자막+하이라이트 / box: 반투명 박스 자막(튜토리얼용)

절대경로. 상대경로는 허용하지 않습니다.

번인 자막. **단어**로 키워드 1개 하이라이트, \n으로 의미 단위 줄바꿈

선택한 Pexels 스톡 영상을 프로젝트로 다운로드하고 출처·라이선스·해시를 assets.json에 기록합니다. confirm=false는 다운로드 계획만 반환합니다. 외부 파일 다운로드 전 사용자 승인을 받은 뒤 confirm=true로 다시 호출하세요. Pexels 공식 미디어 호스트만 허용하며 파일당 100MB, 호출당 5개로 제한합니다.

절대경로. 상대경로는 허용하지 않습니다.

OpenAI Image API로 장면 이미지를 생성하고 프로젝트 자산으로 등록합니다. OPENAI_API_KEY가 필요합니다. 기본 모델은 gpt-image-2이며 이미지 바이트는 도구 응답에 넣지 않고 로컬 절대경로만 반환합니다. confirm=false는 생성 계획만 반환합니다. 비용이 발생하므로 사용자 승인 후 confirm=true로 호출하세요.

출력 파일명 힌트(확장자 제외)

절대경로. 상대경로는 허용하지 않습니다.

video_render가 시작한 비동기 FFmpeg 작업의 상태와 결과 절대경로를 조회합니다. 실패한 경우 로그 마지막 부분을 함께 반환합니다.

절대경로. 상대경로는 허용하지 않습니다.

정리된 story를 장면별 스토리보드로 변환하고 로컬 영상 프로젝트를 만듭니다. ANTHROPIC_API_KEY가 필요합니다. projectDir에는 project.json과 자산/리서치/렌더 폴더가 생성됩니다. 기존 project.json은 overwrite=true 없이는 덮어쓰지 않습니다.

출력 화면비

내레이션과 화면 문구 언어

기존 메타데이터를 .history에 보관하고 새 프로젝트로 덮어쓸지 여부

절대경로. 상대경로는 허용하지 않습니다.

영상으로 만들 story 원문

시각 스타일과 톤

목표 영상 길이(초)

영상 제목

timeline.json과 등록 자산을 FFmpeg로 합성해 MP4 렌더 작업을 시작합니다. 이미지/영상 크롭, 장면 연결, 쇼츠 스타일 자막 번인(timeline.json의 captionStyle 적용), 선택적 배경음, H.264/yuv420p 출력을 지원합니다. confirm=false는 계획만 반환합니다. CPU를 사용하는 로컬 쓰기 작업이므로 승인 후 confirm=true로 호출하세요. 즉시 jobId를 반환하므로 video_job_status로 완료 여부를 확인하세요.

FFmpeg 실행 파일 경로. 생략하면 MIMI_SEED_FFMPEG_PATH 또는 PATH 사용

기존 출력 MP4 덮어쓰기 여부

절대경로. 상대경로는 허용하지 않습니다.

스토리보드 검색어나 지정 검색어로 YouTube 유사 영상을 조사합니다. YOUTUBE_API_KEY가 필요하며 결과는 research/youtube.json에 저장됩니다. 결과는 reference-only로 기록되어 영상 파일 다운로드나 렌더링 소스로 사용되지 않습니다.

Creative Commons 표시 영상만 검색

유사도/조회수/최신순 정렬

절대경로. 상대경로는 허용하지 않습니다.

RFC 3339 게시 시각 하한

검색어. 생략하면 스토리보드 searchQuery 사용

ISO 3166-1 alpha-2 지역 코드

에이전트가 직접 작성한 장면별 스토리보드를 project.json으로 저장합니다. API 키가 필요 없는 video_plan_from_story의 무료 대안입니다. 스토리보드(장면 분할·내레이션·화면 문구·시각 프롬프트)는 호출 전에 에이전트가 직접 설계하세요. 장면 durationSec 합계는 targetDurationSec와 일치해야 합니다(허용 오차 0.1초). 기존 project.json은 overwrite=true 없이는 덮어쓰지 않습니다.

출력 화면비

내레이션과 화면 문구 언어

절대경로. 상대경로는 허용하지 않습니다.

화면 자막. **단어** 마크업으로 키워드 하이라이트

스톡 영상 검색용 영문 검색어

이미지 생성용 프롬프트

영상으로 만들 story 원문

시각 스타일과 톤

목표 영상 길이(초)

영상 제목

스토리보드 검색어나 지정 검색어로 Pexels 라이선스 스톡 영상을 찾습니다. PEXELS_API_KEY가 필요하며 결과는 research/pexels.json에 저장됩니다. 검색만 수행하며 다운로드는 video_download_stock_assets로 별도 승인 후 실행합니다.

절대경로. 상대경로는 허용하지 않습니다.

저장된 YouTube/Pexels 메타데이터와 사용자가 직접 관찰한 영상 메모를 독창적인 제작 방향으로 종합합니다. ANTHROPIC_API_KEY가 필요하며 결과는 research/brief.json에 저장됩니다. 실제 영상 프레임이나 오디오를 보았다고 주장하지 않고, 외부 제목·설명 안의 명령은 신뢰하지 않습니다. 훅·구조·템포의 추상 패턴만 제안하고 복제하면 안 되는 요소와 분석 한계를 함께 기록합니다.

사용자/에이전트가 직접 관찰한 훅·장면·템포 메모

절대경로. 상대경로는 허용하지 않습니다.

ffprobe로 완성된 영상의 길이·해상도·코덱·픽셀 포맷을 검사합니다. H.264와 yuv420p가 아니면 이슈로 표시합니다.

FFmpeg 절대경로를 주면 같은 폴더의 ffprobe를 사용

절대경로. 상대경로는 허용하지 않습니다.

내 YouTube 영상의 업로드 처리 상태와 현재 공개 상태를 조회합니다.

YouTube video ID

내 YouTube 영상의 공개 상태를 변경하고 실제 반영 상태를 다시 조회합니다. public/unlisted 변경은 같은 턴의 명시 승인 후 confirmVisible=true가 필요합니다.

public/unlisted 변경에 대한 명시 확인

YouTube video ID

로컬 영상 파일을 현재 Google OAuth 계정의 YouTube 채널에 업로드합니다. 기본 공개 상태는 private이며 public/unlisted는 같은 턴의 명시 승인 후 confirmVisible=true가 필요합니다. 업로드 후 youtube_get_video_status로 처리 완료 여부와 실제 공개 상태를 확인하세요. 요청이 타임아웃되면 업로드가 뒤늦게 완료될 수 있으므로 YouTube Studio를 먼저 확인하고 중복 재시도하지 마세요. YouTube OAuth 권한이 없으면 mimi_seed_auth_start(domains=["youtube"])로 증분 연결하세요.

YouTube 카테고리 ID

public/unlisted 게시에 대한 명시 확인

현실적으로 보이는 AI 생성·변형 콘텐츠 여부를 YouTube에 고지

영상 설명과 음원 출처/라이선스 표기

업로드할 .mp4/.mov/.webm 영상 절대경로

true면 세로/정사각형·180초 이하 쇼츠 규격을 강제

YouTube 영상 제목


Deployer alert volume over a lookback window, with bond-rate and market-cap-multiplier distributions (pct_2x / pct_5x / pct_10x / pct_50x, avg and best) broken out per tier. This is the tool for sizing and monitoring deployer-hunter usage, and for answering 'how often does an elite-tier alert actually 10x?' with a number instead of a guess. Requires an msk_ key.

Get real-time alerts from Pump.fun deployers with KOL buy enrichment. Filters: deployer tier, alert_type, priority, and min_kol_buys to gate out noise. Cursor-paginated via 'before' (preferred over 'offset' at scale).

Filter by alert_type (e.g. 'new_deploy', 'bonded').

Cursor — ISO 8601 timestamp; returns alerts strictly older than this. Pass next_before from the previous response.

Number of deployer alerts to return (1-100)

Only alerts where at least N KOLs bought the token (1-100).

Legacy offset pagination (prefer 'before' for polling)

Filter by alert priority.

Only alerts after this ISO 8601 timestamp.

Filter by deployer tier. PRO/ULTRA only — BASIC callers receive HTTP 403.

Best-performing recent tokens launched by RANKED (non-unranked) Pump.fun deployers, by peak market cap multiple over the alert price. Each row carries the deployer wallet and tier alongside mc_at_bond, peak_market_cap and mc_multiplier. Requires an msk_ key.

Rows to return (default 5)

Lookback window, e.g. '24h', '7d', '30d' (default '7d')

Pump.fun deployer reputation leaderboard, ranked by bonding rate, recent form, total bonded, or last deploy. Unranked deployers are excluded. IMPORTANT: compare bonding_rate (LIFETIME) against recent_bond_rate (ROLLING) — the gap between them is the signal, not either number alone; a deployer at 0.40 lifetime and 0.05 recent is cooling off. runner_rate (share of labeled tokens that ran rather than dumped) is only meaningful once labeled_tokens >= 3. Requires an msk_ key.

Page size (1-100, default 20)

Pagination offset

Ranking axis

Restrict to one reputation grade

elite good rising neutral spammer unranked

One Pump.fun deployer's profile — tier, lifetime bonding_rate, recent_bond_rate, total deployed/bonded, first seen, last deploy, average time-to-bond, and runner_rate. NOTE: an untracked wallet returns a profile with zeroed counters, NOT a 404, so check total_deployed before concluding anything about a wallet. Gate runner_rate on labeled_tokens >= 3. Requires an msk_ key.

Deployer wallet address (base58)

Tokens from tracked Pump.fun deployers that just graduated to Raydium, newest first, each with time_to_bond_minutes, mc_at_bond, peak market cap and the full deployer reputation block. POLL INCREMENTALLY: pass the previous response's next_since back as `since` to get only what bonded after it — do not re-fetch the whole window. Requires an msk_ key.

Page size (1-100, default 20)

Floor on peak market cap (USD)

Incremental cursor — the previous response's next_since

Restrict to one deployer grade

Ecosystem-wide Pump.fun deployer stats — tracked_count (how many deployers we grade), signals_today, bonds_detected, the chain-wide bond_rate, and a per-tier count (elite/good/rising). Use this to size expectations before reading the leaderboard: a bond_rate of ~0.02 chain-wide is what makes an elite deployer's 0.30 meaningful. Requires an msk_ key.

Every token deployed by one Pump.fun wallet, paginated — each row with deployed_at, bonded_at, time-to-bond and peak market cap. Use only_bonded to see just the graduations. Pair with madeonsol_deployer_profile to check whether a deployer's record comes from a few big winners or a consistent rate. Requires an msk_ key.

Page size (1-100, default 50)

Pagination offset

Return only tokens that graduated

Deployer wallet address (base58)

Deployer skill curve — streaks, rolling bond rate, improvement trend, and deployment cadence for a Pump.fun deployer. Works with an msk_ key (Pro/Ultra) or keyless via x402 ($0.01/call).

Deployer wallet address (base58)

List all available MadeOnSol API endpoints with prices and parameter docs. Free, no auth required. The keyless x402 catalog now covers 25 endpoints — recent additions: token candles ($0.01), almost-bonded ($0.01), top-traders ($0.02), cap-table ($0.02), sniper recent deploys ($0.01), token flow ($0.01), and deployer trajectory ($0.01).

Live KOL alert feed — consensus clusters, fresh-token KOL buys, and heating-up wallets in one unified stream.

Max alerts to return

Minimum severity to include

Filter to specific alert types

Lookback window

Side-by-side comparison of 2-5 KOL wallets — strategy, winrates, ROI, percentile. PRO+ adds 30d overlap tokens (bought by 2+ of the wallets).

2-5 wallet addresses. BASIC=2, PRO=4, ULTRA=5.

KOL convergence signals (v1.2) — tokens being accumulated by multiple KOLs. Response includes peak_kols/peak_buys (busiest window slice), exited_count (net-flow-negative wallets), 0-100 coordination_score, and (v1.2 / 2026-05-06) market_cap_usd_at_first_buy + market_cap_usd + last_price_usd so you can see whether the cluster formed at micro-cap or after the chart was already running. Blacklist filters WIF/BONK/stables by default.

v1.1: include major memecoins (WIF/BONK/POPCAT). Default false.

Number of coordination signals to return

PRO+: require cluster avg winrate_7d >= N (0-100)

Minimum number of KOLs converging on the same token

v1.1: minimum composite coordination_score (0-100).

Time period for coordination analysis

PRO+: require >= N distinct strategies in cluster

v1.1: peak-density window (1-60). Default 15.

Get real-time Solana KOL trades from 1,000+ tracked wallets. Each trade includes the token's market cap (USD) at the moment of trade — sourced from our in-memory price tracker, accurate to the millisecond, faster than Dexscreener spot. PRO+ adds size/age/strategy/winrate filters.

Filter by trade type: buy or sell

Cursor — ISO 8601 timestamp; returns trades strictly older than this. Pass next_before from the previous response for polling.

PRO+: drop sell-side trades

Filter by specific KOL wallet address (base58)

Number of trades to return (1-100)

PRO+: minimum 7d winrate of the KOL (0-100)

PRO+: minimum SOL size per trade

PRO+: filter by auto-tagged strategy

PRO+: max token age in minutes at time of trade

KOL momentum tokens — tokens with accelerating KOL buy interest, early signals before coordination triggers. PRO+ adds buyer-quality filters.

Number of hot tokens to return

PRO+: require avg winrate_7d of buyers >= N (0-100)

Minimum KOL buyers to include a token

Time period: 1h or 6h

PRO+: require >= N distinct strategies among buyers

Get KOL performance rankings by PnL and win rate. PRO+ can sort by alternative axes (winrate/roi/profit_factor/early_entry).

Number of KOLs to return in ranking

PRO+: minimum winrate cutoff (0-100)

Time period (trade retention is 180d)

PRO+: sort axis (default 'pnl')

PRO+: filter by strategy tag

KOL affinity matrix — discover which KOLs frequently co-trade the same tokens within a time window.

Number of KOL pairs to return

Minimum number of shared tokens to qualify as a pair

Time period: 7d or 30d

Deep per-wallet PnL breakdown — realized PnL, win rate, profit factor, max drawdown, daily equity curve, closed/open positions. BASIC: summary only. PRO: + curve + closed. ULTRA: + open positions.

Time period for PnL calculation

KOL wallet address (base58)

KOL entry/exit timing profile — hold duration, exit speed, and activity patterns for a specific KOL.

Time period: 7d or 30d

KOL wallet address (base58)

Ranked KOL first-buyers for a specific token, ordered by entry timestamp. PRO+ adds percentile_pnl_7d per entry.

Max ranked entries to return

Token mint address (base58)

Tokens ranked by KOL buy volume — pure capital-flow signal. Sub-hour periods (5m/15m/30m) require PRO/ULTRA.

Number of trending tokens to return

Minimum KOL buyers

Time window

Deshred pre-confirm deploys filtered to a single deployer wallet — audit a deployer's recent launches before tracking them. ULTRA only.

Max results

Deployer wallet address (base58)

Deshred pre-confirm pump.fun deploy feed — new launches surface ~500ms before they confirm on-chain (reconstructed from shred-level data). Each deploy now carries footprint — the slot-window snipe rollup ({ buys, buyers, sol, supply_pct|null, sniper_wallet_buys, data_available, as_of } | null; buys in slots deploy-1..deploy+3). footprint is null for deploys younger than the ~10-min settle window or outside the trade-pipeline write-gate — absent, not zero. PRO (msk_ key) sees elite/good deployers; ULTRA sees every tier; also callable keyless via x402 ($0.01/call, elite/good scope).

Filter by deployer reputation tier (ULTRA)

elite good moderate rising cold unranked

Max results

Minimum deployer lifetime bond rate (0-1)

ISO-8601 — only deploys detected after this timestamp

ULTRA (msk_ key only): narrow to your custom deployer watchlist (any tier)


Create or resume an Assembly, optionally uploading files and waiting for completion.

Create or resume an Assembly

Fetch the latest Assembly status by URL or ID.

Get Assembly status

Returns a robot summary and parameter details.

Get robot parameter help

Lint Assembly Instructions without creating an Assembly. Returns structured issues.

Lint Assembly Instructions

Returns a filtered list of robots with short summaries.

List Transloadit robots

List Assembly Templates (owned and/or builtin). Tip: pass include_builtin: "exclusively-latest" to list builtins only.

all latest exclusively-all exclusively-latest

List templates

Polls until the Assembly completes or timeout is reached.

Wait for Assembly completion


Generate the SQL DDL statement for an IBM i database object. Use this to see the full CREATE definition of a table, view, index, procedure, function, or other object.

The library where the database object is located. Defaults to QSYS2.

The name of the IBM i database object to generate DDL for.

The type of database object to generate DDL for. Valid types include TABLE, VIEW, INDEX, PROCEDURE, FUNCTION, etc.

ALIAS CONSTRAINT FUNCTION INDEX MASK PERMISSION PROCEDURE SCHEMA SEQUENCE TABLE TRIGGER TYPE VARIABLE VIEW XSR

Error information if the DDL generation failed.

Error code

Error details

Error message

DDL generation execution time in milliseconds.

The library of the object the DDL was generated for.

The name of the object the DDL was generated for.

The type of the object the DDL was generated for.

The generated DDL SQL statements for the specified database object.

Whether the DDL generation was successful.

Generate SQL DDL


get-cargo-package-details

Get detailed information about a specific Cargo package

get-golang-package-details

Get detailed information about a specific Go module/package

get-npm-package-details

Get detailed information about a specific NPM package

get-nuget-package-details

Get detailed information about a specific NuGet package

get-pypi-package-details

Get detailed information about a specific PyPI package

list-cargo-package-versions

List all versions of a specific Cargo package

list-golang-package-versions

List all versions of a specific Go module/package

list-npm-package-versions

List all versions of a specific NPM package

list-nuget-package-versions

List all versions of a specific NuGet package

list-pypi-package-versions

List all versions of a specific PyPI package

search-cargo-packages

Search the Cargo registry for packages

search-npm-packages

Search the NPM registry for packages

search-nuget-packages

Search the NuGet registry for packages


access-shared-mailbox

Shared Mailbox

List emails from a shared mailbox the signed-in user has been granted access to (read-only). Returns paged messages from the named `sharedMailbox` (or alias `email`) and `folder` (default `inbox`) with id/subject/from/receivedDateTime/preview — same shape as `search-emails` list mode. Requires that the shared mailbox has been delegated to the signed-in user in Exchange (admin-configured). Use `outputVerbosity` to control field count and `count` (default 25, max 50) for page size. For full search/filter capability over a shared mailbox, prefer `search-emails` with a folder path scoped to the shared mailbox.

Number of emails to retrieve (default: 25, max: 50)

Alias for `sharedMailbox` (more intuitive name for the same value).

Folder to read from (default: inbox)

Output detail level (default: standard)

Email address of the shared mailbox (required)

apply-category

Apply Categories

Tag or untag email messages with master categories (those created via `manage-category`). action=`set` (default) replaces the message's category set with the supplied `categories` array. action=`add` appends categories to whatever's already on the message. action=`remove` removes only the named categories, leaving the rest. Accepts either `messageId` (single) or `messageIds` (batch via Graph `$batch`). `categories` are matched by display name — names must already exist in the master list (create via `manage-category` first). Returns per-message confirmation.

set (replace all), add (append), remove (remove specific). Default: set

Category display names to apply/remove (required)

Single message ID to categorise

Array of message IDs to categorise (batch operation)

attachments

Attachments

Inspect or retrieve email attachments. action=`list` (default) returns metadata for all attachments on `messageId` (id, name, contentType, size, isInline) — read-only. action=`view` returns inline content for text/JSON/XML attachments via `attachmentId`; binary types require download. action=`download` saves the attachment to disk at `outputDir` (default system tmpdir, auto-created) and returns the saved file path. `messageId` is required for all actions; `attachmentId` is required for view/download. Use `outputVerbosity` to control list field count.

Action to perform (default: list)

Attachment ID (action=view/download, required)

Email message ID (required)

Directory to save file (action=download, default: system tmpdir). Auto-created if missing.

DEPRECATED alias for `outputDir`. Will be removed in a future release.

auth

Authentication

Manage authentication with the Microsoft Graph API. action=`status` (default) returns the current auth state and auto-refreshes the access token if it's expired but the refresh token is still valid (~90-day window) — call this first to check before other tools. action=`authenticate` starts the OAuth flow: with `method: "device-code"` (default, works headlessly) it returns a code + URL for the user to visit; with `method: "browser"` it opens the local auth server on :3333 (run `npm run auth-server` first). Pass `force: true` to re-authenticate over an existing valid session. action=`device-code-complete` finishes device-code auth after the user enters the code in their browser — call this once authentication shows as successful in the browser. action=`about` returns server version, configured audience, scope list, and other diagnostic info. Tokens persist to `~/.outlook-assistant-tokens.json` and survive server restarts.

Action to perform (default: status)

status authenticate device-code-complete about

Force re-authentication even if already authenticated (action=authenticate only)

Auth method for action=authenticate. device-code (default): no auth server needed, works remotely. browser: traditional OAuth redirect via port 3333.

create-event

Create Calendar Event

Create a new calendar event on the signed-in user's default calendar. Returns the created event with its `id`, `webLink`, and (if attendees are present) an auto-generated online-meeting URL — attendees receive invitations on save. Times use the configured timezone (default Australia/Melbourne; override with `OUTLOOK_DEFAULT_TIMEZONE`); omit the `Z` suffix to send local time. Use `manage-event` action=`update` to modify an event after creation, or `manage-event` action=`cancel`/`delete` to remove it.

List of attendee email addresses

Optional body content for the event

The end time of the event in ISO 8601 format

The start time of the event in ISO 8601 format

The subject of the event

draft

Draft Operations

Full draft lifecycle for review-before-send workflows (destructive: covers `send` and `delete`). action=`create` saves a new draft in the Drafts folder and returns its id (use `dryRun: true` to preview without saving; `checkRecipients: true` runs mail-tips first). action=`update` patches an existing draft by `id` (only fields passed are changed). action=`send` dispatches an existing draft — shares the rate limit with `send-email`. action=`delete` removes a draft permanently. action=`reply`/`reply-all` creates a reply draft from a message `id` (use `comment` to prepend text — mutually exclusive with `body`). action=`forward` creates a forward draft (requires `id` and `to`). Recipient allowlist applies to create/update/forward. Returns the draft object on create/update/reply/forward; status confirmation on send/delete.

Action to perform (required)

create update send delete reply reply-all forward

Comma-separated BCC email addresses

Email body (plain text or HTML)

Comma-separated CC email addresses

Check recipients for out-of-office, delivery restrictions before saving (action=create, default: false)

Comment text for reply/forward (prepended to original message). Cannot combine with body.

Preview draft without saving (action=create only, default: false)

Draft or message ID. Required for update/send/delete/reply/reply-all/forward.

Email importance (default: normal)

Email subject

Comma-separated recipient email addresses (optional for create/update, required for forward)

export

Export Emails

Export emails to file formats for archival, forensics, or programmatic processing. target=`message` (default) exports a single email by `id` to `savePath` — accepts `mime`/`eml`/`markdown`/`json`/`csv`. target=`messages` batch-exports either an explicit `emailIds` array or messages matching `searchQuery` (or `query` shortcut) into `outputDir` — accepts `markdown`/`json`/`csv`. target=`conversation` exports a full thread by `conversationId` into `outputDir` (chronological by default; pass `order: "reverse"` for newest-first) — accepts `eml`/`mbox`/`markdown`/`json`/`html`/`csv`. target=`mime` returns raw RFC-822 MIME bytes for `id` (use `headersOnly` for just headers, `base64` for encoded transport, `maxSize` to cap at default 1MB). `includeAttachments` defaults to true for single-message exports and false for batch. Format support varies by target — see the format param enum.

Return base64 encoded (target=mime)

Conversation ID (target=conversation, required)

Email IDs to export (target=messages)

Export format. Valid values vary by target: target=message accepts mime/eml/markdown/json/csv (mbox and html are conversation-only). target=conversation accepts eml/mbox/markdown/json/html/csv. target=messages (batch) accepts markdown/json/csv. mime is an alias for eml (same RFC822 bytes, .eml extension on disk).

MIME headers only, no body (target=mime)

Email ID (target=message/mime, required)

Include attachments (default: true for single, false for batch)

Max content size in bytes (target=mime, default: 1MB)

Message order (target=conversation, default: chronological)

Output directory (target=messages/conversation, required)

Free-text search shortcut (target=messages). Equivalent to passing searchQuery: { subject: <query> }. Convenience alias for callers used to search-emails.

File path or directory (target=message)

Search query to find emails (target=messages, alternative to emailIds)

Export target (default: message)

find-meeting-rooms

Meeting Rooms

Discover bookable meeting rooms in the user's organisation via the Graph rooms endpoint (read-only). Returns room resources with displayName, emailAddress, building, floor, capacity, and bookingType — suitable for piping into `create-event` as attendees. Filter by `query` (matches name/email), `building`, `floor`, or minimum `capacity`. Returns empty list on personal accounts (the rooms endpoint is M365-only). Use `outputVerbosity` to control field count.

Filter by building name

Minimum capacity required

Filter by floor number

Output detail level (default: standard)

Search query (room name, email)

folders

Mail Folders

Manage mail folders (tool-level destructiveHint=true because `delete` permanently removes a folder; `list` and `stats` are read-only sub-actions despite the annotation). Folders can be addressed by name, by a slash-separated PATH for nested folders (e.g. `Triage/Delete`, `Inbox/Clients/Acme`, case-insensitive), or by explicit ID; `list` output includes each folder's full path and `[id: …]`. A bare name resolves a unique top-level folder first, then searches nested folders (ambiguous names return the candidates — disambiguate with a path or ID). action=`list` (default) returns the folder tree (toggle `includeItemCounts` for unread/total, `includeChildren` for hierarchy). action=`create` makes a new folder under the root, or under `parentFolder` (name/path) / `parentFolderId`, and returns its id. action=`move` relocates emails (`emailIds`) into `targetFolder` (name/path) or `targetFolderId`. action=`stats` returns counts (totalItemCount/unreadItemCount) for `folder` (name/path) or `folderId`, suitable for pagination planning. action=`delete` removes a folder (by `folderName`/path or `folderId`) and its contents — on Outlook.com the folder is moved to Deleted Items (recoverable until you empty it); M365/Exchange accounts may hard-delete per retention policy.

Action to perform (default: list)

Comma-separated list of email IDs to move (action=move, required)

Folder name or path (inbox, sent, "Triage/Delete", etc.). Default: inbox (action=stats)

Folder ID (action=stats/delete)

Folder name or path to delete — resolved to ID (action=delete). Cannot delete protected folders (Inbox, Drafts, Sent, etc.)

Include child folders in hierarchy (action=list)

Include counts of total and unread items (action=list)

Name of the folder to create (action=create, required)

Output detail level (action=stats, default: standard)

Parent folder name or path (e.g. "Clients/Acme"); default is root (action=create)

Parent folder ID — alternative to parentFolder for unambiguous targeting (action=create)

Source folder name, default is inbox (action=move)

Destination folder name or path, e.g. "Triage/Delete" (action=move; or use targetFolderId)

Destination folder ID — alternative to targetFolder for unambiguous/nested targeting (action=move)

get-mail-tips

Mail Tips

Pre-send recipient validation via Graph `POST /me/getMailTips` (read-only; uses the existing `Mail.Read` scope — no extra permissions). Returns per-recipient tips covering automatic replies (out-of-office), mailbox full status, custom admin mail tips, delivery restrictions, moderation requirements, external-vs-internal scope, max message size, and group member counts (total + external). Use ahead of `send-email` or `draft` action=`create` to catch issues like OOO replies or external-recipient warnings before the message goes out; `send-email`/`draft` accept `checkRecipients: true` to invoke this automatically. Accepts either a comma-separated string or an array of addresses; `tipTypes` filters which tips are requested (defaults to all).

Email addresses to check for mail tips

Array of email addresses to check

Comma-separated email addresses to check

Comma-separated tip types to request (default: all). Options: automaticReplies, mailboxFullStatus, customMailTip, externalMemberCount, totalMemberCount, maxMessageSize, deliveryRestriction, moderationStatus, recipientScope, recipientSuggestions

list-events

List Calendar Events

List upcoming calendar events for the signed-in user (read-only). Returns an array of events with id, subject, start/end, attendees, location, organiser, and webLink. Use `count` (default 10, max 50) to control page size; this tool does not filter — use the Outlook UI or specific date ranges via Graph for filtered queries. Each start/end is returned as a canonical UTC ISO-8601 instant (e.g. `2026-04-02T22:00:00.000Z`) followed by a labelled local rendering in the configured display timezone (default Australia/Melbourne; override with `OUTLOOK_DEFAULT_TIMEZONE`) — the UTC value is authoritative, so consumers never have to guess the zone.

Number of events to retrieve (default: 10, max: 50)

mailbox-settings

Mailbox Settings

Read or update mailbox-level settings (idempotent — safe to retry; sets are PATCH-style and merge with existing state). action=`get` (default) returns settings — use `section` to filter (`language`, `timeZone`, `workingHours`, `automaticRepliesSetting`, or `all`). action=`set-auto-replies` configures out-of-office: `enabled` true/false, optional `startDateTime`/`endDateTime` (ISO 8601) for scheduled mode, `internalReplyMessage` and (optionally) `externalReplyMessage`. action=`set-working-hours` updates the schedule: `startTime`/`endTime` (HH:MM) and `daysOfWeek` (array of `monday`..`sunday`). Returns the updated settings object on set actions.

Action to perform (default: get)

Work days, e.g. ['monday','tuesday','wednesday','thursday','friday'] (action=set-working-hours)

sunday monday tuesday wednesday thursday friday saturday

Enable (true) or disable (false) automatic replies (action=set-auto-replies)

End date/time for scheduled mode, ISO 8601 format (action=set-auto-replies)

Work end time in HH:MM format, e.g. '17:00' (action=set-working-hours)

Who receives external reply (action=set-auto-replies)

Reply message for external senders (action=set-auto-replies)

Reply message for internal senders (action=set-auto-replies)

Specific section to retrieve (action=get, default: all)

all language timeZone workingHours automaticRepliesSetting

Start date/time for scheduled mode, ISO 8601 format (action=set-auto-replies)

Work start time in HH:MM format, e.g. '09:00' (action=set-working-hours)

Time zone name, e.g. 'Australia/Melbourne' (action=set-working-hours)

manage-category

Master Categories

Manage the user's master category list (the colour-coded labels available across mail/calendar/contacts). action=`list` (default) returns categories with id/displayName/color. action=`create` adds a new category — `displayName` required, `color` optional (preset0-preset24, e.g. preset0=Red, preset7=Blue). action=`update` (alias `set` — deprecated) changes name/colour by `id`. action=`delete` removes a category — this does NOT untag messages already labelled with it; existing messages retain the orphaned label until manually cleaned. Use `apply-category` to tag/untag specific messages.

Action to perform (default: list). 'set' is a deprecated alias for 'update'.

DEPRECATED: alias for `id`. Will be removed in a future release.

Color preset, e.g. preset0=Red, preset7=Blue (action=create/update)

Category name (action=create required, action=update optional)

Category ID (action=update/delete, required)

Output detail level (action=list, default: standard)

manage-contact

Contacts

Full CRUD over the signed-in user's personal Outlook contacts (destructive: covers `delete` action). action=`list` (default) returns contacts with pagination via `skip`/`count` (default 50). action=`search` returns contacts matching `query` against name/email (default 25). action=`get` returns full contact detail by `id`. action=`create` adds a new contact and returns its `id`. action=`update` patches the given fields by `id` (only fields passed are changed). action=`delete` permanently removes the contact by `id`. Use `outputVerbosity` (minimal/standard/full) on list/search to control field count. Prefer `search-people` for cross-source relevance ranking (contacts + directory + recent comms) — this tool only searches your personal contact store.

Action to perform (default: list)

Company name (action=create/update)

Number of results (action=list default: 50, action=search default: 25)

Full name (action=create/update)

Primary email address (action=create/update)

Multiple email addresses (action=create/update). First entry is primary.

Given name (action=create/update). Maps to Graph `givenName`. If displayName not provided, will be combined with lastName.

Contact folder ID (action=list)

Contact ID (action=get/update/delete, required)

Job title (action=create/update)

Surname (action=create/update). Maps to Graph `surname`.

Mobile phone number (action=create/update)

Personal notes (action=create/update)

Output detail level (action=list/search, default: standard)

Search query for name or email (action=search, required)

Pagination offset for action=list (default: 0). Use the value suggested by the previous page response.

manage-event

Manage Calendar Event

Manage an existing calendar event (destructive: covers update/decline/cancel/delete — use dryRun where supported to preview). action=`update` edits fields in place via PATCH (subject, start, end, attendees, body, location, isOnlineMeeting, sensitivity, showAs, importance, categories, reminderMinutesBeforeStart) — only fields you pass are changed; pass `dryRun: true` to preview the PATCH payload. action=`decline` declines an invitation (optional `comment`). action=`cancel` cancels an event you organised and notifies attendees. action=`delete` permanently removes the event. Returns the updated event on update; status confirmation otherwise. Note: there is no `accept` action — accept invitations in the Outlook UI (Graph's accept verb is unreliable across personal/M365).

Action to perform (required)

Full replacement attendee list — pass complete desired list, or [] to clear (action=update only)

New body content (action=update only)

Full replacement category list — pass [] to clear (action=update only)

Optional comment for declining or cancelling the event

Preview the PATCH without applying it (action=update only). Returns the body that would be sent to Graph.

New end time as ISO 8601 string or {dateTime, timeZone} object (action=update only)

The ID of the event

Alias for `eventId` (canonical per the v3.7.3 alias pass).

Event importance flag (action=update only)

Toggle online meeting flag (action=update only)

New location display name (action=update only)

Minutes before start to fire the reminder (action=update only)

Event sensitivity classification (action=update only)

Free/busy status shown to others (action=update only)

free tentative busy oof workingElsewhere unknown

New start time as ISO 8601 string or {dateTime, timeZone} object (action=update only)

New subject (action=update only)

manage-focused-inbox

Focused Inbox

Manage Focused Inbox sender overrides — explicit rules that force messages from a given sender into Focused or Other regardless of the ML classifier. action=`list` (default) returns existing overrides with id/sender/classifyAs. action=`set` creates or updates an override for `emailAddress` (optional `name`), routing future mail to `focused` (default) or `other`. action=`delete` removes the override for `emailAddress`. Note: this only works on accounts that have Focused Inbox enabled — personal Outlook.com accounts without it return an empty list.

Action to perform (default: list)

Where to put emails from this sender (action=set, default: focused)

Sender email address (action=set/delete, required)

Sender display name (action=set)

Output detail level (action=list, default: standard)

manage-rules

Inbox Rules

Server-side inbox rule CRUD (destructive: covers `delete`; supports `dryRun` on create/update for preview). Rules run on the Exchange server regardless of which client is open. action=`list` (default) returns rules with id/name/sequence — pass `includeDetails: true` to expand conditions/actions/exceptions. action=`create` builds a new rule from condition params (12 supported: fromAddresses, containsSubject, bodyContains, hasAttachments, importance, sentTo, sensitivity, etc.), action params (9 supported: moveToFolder, forwardTo, redirectTo, assignCategories, markAsRead, delete, etc.), and optional `except*` exceptions. action=`update` patches the named fields by `ruleId`. action=`reorder` changes execution priority via `sequence` (lower = earlier). action=`delete` removes a rule. Recipient allowlist applies to forwardTo/redirectTo. `permanentDelete` action is intentionally omitted (too dangerous for AI use — use the Outlook UI). Subject to session rate limits (`OUTLOOK_MAX_MANAGE_RULES_PER_SESSION`).

Action to perform (default: list)

Comma-separated Outlook categories to assign (action=create/update)

Comma-separated body text keywords (OR logic) (action=create/update)

Comma-separated keywords matching body OR subject (OR logic) (action=create/update)

Comma-separated subject keywords (OR logic). e.g. "invoice, receipt, payment" (action=create/update)

Folder name to copy matching emails to (action=create/update)

Move matching emails to Deleted Items (action=create/update)

Alias for `name` (matches Graph's own `displayName` field).

Preview rule without creating/updating (action=create, action=update)

Comma-separated body keywords to exclude (action=create/update)

Comma-separated sender emails to exclude (action=create/update)

Exclude emails with attachments (action=create/update)

Comma-separated partial sender matches to exclude (action=create/update)

Comma-separated subject keywords to exclude (action=create/update)

Comma-separated emails to forward matching messages to (action=create/update)

Comma-separated sender emails to match (action=create/update)

Match emails with attachments (action=create/update)

Match emails with this importance (action=create/update)

Include detailed conditions, actions, and exceptions (action=list)

Match automatic reply emails (action=create/update)

Enable/disable rule (action=create default: true, action=update)

Mark matching emails as read (action=create/update)

Set importance on matching emails (action=create/update)

Folder name to move matching emails to (action=create/update)

Rule name (action=create required, action=update to rename)

Comma-separated partial recipient matches (action=create/update)

Comma-separated emails to redirect matching messages to (action=create/update)

ID of existing rule (action=update/delete)

Name of existing rule (action=update/reorder/delete)

Comma-separated partial sender matches (action=create/update)

Match emails with this sensitivity (action=create/update)

Match emails where I am in CC (action=create/update)

Match emails where I am the only recipient (action=create/update)

Comma-separated recipient emails to match (action=create/update)

Match emails sent to me (action=create/update)

Execution order, lower = higher priority (action=create default: auto, action=reorder required)

Stop evaluating subsequent rules (action=create/update)

read-email

Read Email

Read a single email by id (read-only). Default: returns the full message body (HTML stripped to text by default), subject, from/to/cc, receivedDateTime, conversationId, attachments metadata, and webLink as Markdown. With `headersMode: true`: returns RFC-822 forensic headers instead (DKIM, SPF, DMARC, Received chain, Message-ID, Authentication-Results) — pair with `importantOnly: true` for the security-relevant subset, `groupByType: true` for category-bucketed view, or `raw: true` for JSON instead of Markdown. With `includeHeaders: true` (non-headers-mode): adds basic headers alongside body. Use `outputVerbosity` (minimal/standard/full) to control field count.

Group headers by category (headersMode only, default: false)

Return forensic headers instead of email content (default: false)

ID of the email to read

Show only important headers (headersMode only, default: false)

Include basic headers alongside email content (default: false)

Output detail level (default: standard)

Return raw JSON instead of Markdown (headersMode only, default: false)

search-emails

Search Emails

Search, list, delta-sync, or thread-group emails — six modes selected by parameters (read-only). With no params: lists recent emails in `folder` (default `inbox`). With `query`/`from`/`to`/`subject`/date filters: full search (combines via OData filter). With `searchExpression` (deprecated alias `kqlQuery`): a raw Microsoft Graph `$search` expression for advanced server-side search. With `deltaMode: true`: returns current state plus a `deltaToken`; pass the token back on the next call for incremental changes only — ideal for inbox monitoring. With `groupByConversation: true`: returns conversation threads. With `conversationId`: returns all messages in a single thread. With `internetMessageId`: looks up a message by its RFC Message-ID header. Personal Outlook.com accounts have limited `$search` support — this tool falls back through OData filters / boolean filters / recent listing automatically, but structured filters (`from`/`subject`/`receivedAfter`/`hasAttachments`/`unreadOnly`) return cleaner results. Returns paged messages with id/subject/from/receivedDateTime/preview by default; use `outputVerbosity` to expand.

Get all messages in a conversation thread by conversationId.

Number of results (list default: 25, search default: 10, max: 50)

Enable delta sync mode. Returns only changes since last sync. Use deltaToken for subsequent calls.

Token from previous delta call for incremental sync (deltaMode only)

Email folder (default: 'inbox')

Filter by sender email/name

List conversations (threads) grouped by conversationId instead of individual emails.

Filter to emails with attachments

Include email headers for each message (conversationId only)

Look up email by Message-ID header (e.g. <abc123@example.com>). For threading/deduplication.

DEPRECATED alias for `searchExpression` (this was never full KQL — it is a Graph `$search` expression). Prefer `searchExpression`.

Max results per page for delta sync (default: 100, max: 200)

Output detail level (default: standard)

Search query text. Omit for list mode.

Filter emails received after date (ISO 8601)

Filter emails received before date (ISO 8601)

Search across all mail folders

Raw Microsoft Graph `$search` expression for advanced server-side search, e.g. `subject:"invoice"`, `from:github.com`, or `foo OR bar`. Quote your own phrases; a single bare token is auto-quoted. Pair with `searchAllFolders: true` for cross-folder search. Bypasses other search params. NOTE: on personal Outlook.com accounts field-scoped `$search` is best-effort and may return nothing — prefer `query` there (it has progressive fallback).

Filter by subject

Filter by recipient email/name

Filter to unread emails only

search-people

People Search

Relevance-ranked search across personal contacts, organisation directory, and recent communications via the Microsoft Graph People API (read-only). Returns people objects with `displayName`, `emailAddresses`, `companyName`, `jobTitle`, and relevance metadata — ideal for "who is X?" or "who do I email about Y?" lookups. Use `manage-contact` action=`search` instead when you specifically need entries from your personal contact store only.

Maximum results to return (default: 25, max: 50)

Search query (name, email, company)

send-email

Send Email

Compose and send an email immediately (destructive: sends external comms). Returns a confirmation with the saved-message id. Safety controls: `dryRun: true` returns the composed message for review without sending; `checkRecipients: true` runs `get-mail-tips` first to flag out-of-office / mailbox-full / delivery-restricted / external recipients; combine both for a full pre-send review. Subject to session rate limits (`OUTLOOK_MAX_EMAILS_PER_SESSION` env) and recipient allowlist (`OUTLOOK_ALLOWED_RECIPIENTS` env) when configured — calls outside the allowlist fail before any Graph request. For multi-step compose/review workflows prefer `draft` (action=`create` → `update` → `send`) since drafts can be inspected in Outlook before sending. Comma-separated recipient strings or arrays both accepted.

Comma-separated BCC email addresses

Email body (plain text or HTML)

Comma-separated CC email addresses

Check recipients for out-of-office, mailbox full, delivery restrictions before sending (default: false). Combine with dryRun=true for pre-send review.

Preview email without sending (default: false). Returns composed email for review.

Email importance (default: normal)

Save to sent items (default: true)

Email subject

Comma-separated recipient email addresses

update-email

Update Email

Update message state without modifying content (idempotent — safe to retry). action=`mark-read`/`mark-unread` toggles the `isRead` flag on a single message by `id`. action=`flag` sets a follow-up flag with optional `dueDateTime`/`startDateTime` (ISO 8601). action=`unflag` clears the flag. action=`complete` marks the flag as done. Flag/unflag/complete accept either `id` (single) or `ids` (batch array) — batch operations use Graph `$batch` for efficiency. Returns status confirmation per message.

Action to perform (required)

mark-read mark-unread flag unflag complete

Due date/time for follow-up, ISO 8601 (action=flag)

Single message ID (required for mark-read/mark-unread, or use instead of ids for flag actions)

Array of message IDs for batch flag/unflag/complete operations

Start date/time for follow-up, ISO 8601 (action=flag)