@yoonion/mimi-seed-mcp 0.11.0 → 0.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
- import { readFileSync } from 'node:fs';
3
2
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
4
3
  import { buildServer } from './server.js';
5
- // dist/index.js 기준 ../package.json — npm 패키지 루트의 버전을 단일 출처로 사용.
4
+ import { readPackageRootText } from './lib/package-root.js';
5
+ // npm 패키지 루트의 버전을 단일 출처로 사용.
6
6
  // 하드코딩하면 publish 때마다 serverInfo.version 이 드리프트하므로 런타임에 읽는다.
7
- const { version } = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8'));
7
+ const { version } = JSON.parse(readPackageRootText('package.json'));
8
8
  // `npx -y @yoonion/mimi-seed-mcp <subcommand>` 처리.
9
9
  // npx는 스코프 패키지의 basename(`mimi-seed-mcp`)을 매치해 이 bin을 실행하므로,
10
10
  // 추가 인자(`mimi-seed-auth` 등)는 여기 argv로 흘러들어온다. 이전엔 MCP 서버가
@@ -0,0 +1,24 @@
1
+ /**
2
+ * 패키지 루트의 파일을 읽는다 (없거나 못 읽으면 throw).
3
+ * src/lib/ 와 dist/lib/ 모두 패키지 루트에서 두 단계 아래라 `../../` 가 같은 곳을 가리킨다 —
4
+ * dev(tsx)·vitest·배포본(npm) 어디서 실행해도 동일하게 동작한다.
5
+ * 개별 `new URL('../..', import.meta.url)` 복사본을 만들지 말고 이 헬퍼를 쓸 것
6
+ * (빌드 레이아웃이 바뀌면 여기 한 곳만 고치면 된다).
7
+ */
8
+ export declare function readPackageRootText(relativePath: string): string;
9
+ export type DomainEntry = {
10
+ /** 사람이 읽는 도메인 이름 (예: "Google Play") */
11
+ label: string;
12
+ /** 이 도메인을 쓰기 위해 필요한 자격증명 + 연결 명령 힌트 */
13
+ credential: string;
14
+ /** 도메인이 하는 일 한 줄 요약 */
15
+ summary: string;
16
+ tools: string[];
17
+ };
18
+ /** tool-manifest.json 의 형태 — 도구 인벤토리 + 도메인 메타데이터의 SSOT. */
19
+ export type ToolManifest = {
20
+ total: number;
21
+ domains: Record<string, DomainEntry>;
22
+ };
23
+ /** tool-manifest.json 을 읽고 최소 형태를 검증한다. 손상/형태이상이면 throw. */
24
+ export declare function readToolManifest(): ToolManifest;
@@ -0,0 +1,21 @@
1
+ import { readFileSync } from 'node:fs';
2
+ /**
3
+ * 패키지 루트의 파일을 읽는다 (없거나 못 읽으면 throw).
4
+ * src/lib/ 와 dist/lib/ 모두 패키지 루트에서 두 단계 아래라 `../../` 가 같은 곳을 가리킨다 —
5
+ * dev(tsx)·vitest·배포본(npm) 어디서 실행해도 동일하게 동작한다.
6
+ * 개별 `new URL('../..', import.meta.url)` 복사본을 만들지 말고 이 헬퍼를 쓸 것
7
+ * (빌드 레이아웃이 바뀌면 여기 한 곳만 고치면 된다).
8
+ */
9
+ export function readPackageRootText(relativePath) {
10
+ return readFileSync(new URL(`../../${relativePath}`, import.meta.url), 'utf8');
11
+ }
12
+ /** tool-manifest.json 을 읽고 최소 형태를 검증한다. 손상/형태이상이면 throw. */
13
+ export function readToolManifest() {
14
+ const manifest = JSON.parse(readPackageRootText('tool-manifest.json'));
15
+ if (typeof manifest?.total !== 'number' ||
16
+ typeof manifest?.domains !== 'object' ||
17
+ manifest.domains === null) {
18
+ throw new Error('tool-manifest.json 의 형태가 예상과 다릅니다');
19
+ }
20
+ return manifest;
21
+ }
@@ -1,4 +1,3 @@
1
- import { readFileSync } from 'node:fs';
2
1
  import { z } from 'zod';
3
2
  import { getMcpOAuthClient } from '../auth/constants.js';
4
3
  import { classifyError } from '../auth/errors.js';
@@ -12,6 +11,7 @@ import { loadFacebookConfig } from '../facebook/config.js';
12
11
  import { loadInstagramConfig } from '../instagram/config.js';
13
12
  import { loadThreadsConfig } from '../threads/config.js';
14
13
  import { metaTokenFreshness } from '../lib/meta-auth.js';
14
+ import { readPackageRootText } from '../lib/package-root.js';
15
15
  import { resolveBigQueryAuth } from '../auth/bigquery-auth.js';
16
16
  import { syncRemoteCredentials } from '../remote-sync.js';
17
17
  import { findProjectManifest, manifestServiceEntries, } from '../lib/project-manifest.js';
@@ -68,7 +68,7 @@ const MANIFEST_FIX = {
68
68
  };
69
69
  // 두 MCP 가 모두 'mimi-seed' 로 등록되는 환경에서 에이전트가 프로그램적으로
70
70
  // 어느 서버인지 판별할 수 있도록 status 첫 줄에 자기소개를 넣는다.
71
- const { version: PKG_VERSION } = JSON.parse(readFileSync(new URL('../../package.json', import.meta.url), 'utf8'));
71
+ const { version: PKG_VERSION } = JSON.parse(readPackageRootText('package.json'));
72
72
  /** 서비스별 식별자를 한 줄 detail 로 (예: "ads-coffee / analytics_530080532"). */
73
73
  function manifestServiceDetail(id, svc) {
74
74
  const parts = [];
@@ -1,7 +1,2 @@
1
1
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
- /** tool-manifest.json 의 형태. 테스트들도 이 타입을 import 해 캐스트 드리프트를 막는다. */
3
- export type ToolManifest = {
4
- total: number;
5
- domains: Record<string, string[]>;
6
- };
7
2
  export declare function registerResources(server: McpServer): void;
package/dist/resources.js CHANGED
@@ -1,5 +1,5 @@
1
- import { readFileSync } from 'node:fs';
2
1
  import { ensureFreshAccessToken } from './auth/google-auth.js';
2
+ import { readPackageRootText, readToolManifest } from './lib/package-root.js';
3
3
  // assets/agent-guide.md = docs/agent-guide.md 의 배포용 사본 (npm 배포본에는 docs/ 가 없다).
4
4
  // 갱신은 `npm run plugin:sync`, 드리프트는 prompts-resources.test.ts 가 잡는다.
5
5
  // 읽기 실패는 정상 설치에서 불가능하다(files 화이트리스트에 포함) — 그래서 폴백은 가이드
@@ -13,109 +13,6 @@ const AGENT_GUIDE_FALLBACK = [
13
13
  '가이드 전문: https://github.com/jeonghwanko/mimi-seed-sdk/blob/main/docs/agent-guide.md',
14
14
  '최소 안전수칙: 스토어 제출·승격·삭제·공개 게시는 사용자 명시 동의 없이 실행하지 않는다.',
15
15
  ].join('\n');
16
- function readPackageAsset(relativePath) {
17
- try {
18
- // src/ 와 dist/ 모두 패키지 루트 바로 아래라 ../ 가 같은 곳을 가리킨다 (index.ts 의 package.json 읽기와 동일 패턴).
19
- return readFileSync(new URL(relativePath, import.meta.url), 'utf8');
20
- }
21
- catch {
22
- return null;
23
- }
24
- }
25
- /** 도메인 id → 라벨·필요 자격증명·한줄 요약. 키 집합은 tool-manifest.json 의 domains 와
26
- * 일치해야 한다 (prompts-resources.test.ts 가 강제) — 도메인을 추가하면 여기도 추가할 것. */
27
- const DOMAIN_SUMMARY = {
28
- playstore: {
29
- label: 'Google Play',
30
- credential: 'Google OAuth (CI/헤드리스는 Play 서비스 계정)',
31
- summary: '리스팅·트랙 릴리스·이미지·리뷰 답변·통계·서비스 계정 등록',
32
- },
33
- appstore: {
34
- label: 'App Store Connect',
35
- credential: 'ASC API 키 (mimi-seed auth appstore)',
36
- summary: '버전·빌드 attach·What\'s New·스크린샷·IAP 심사 메타데이터·심사 제출',
37
- },
38
- firebase: {
39
- label: 'Firebase',
40
- credential: 'Google OAuth',
41
- summary: '프로젝트/앱 생성·설정 파일 다운로드·서비스 활성화',
42
- },
43
- admob: {
44
- label: 'AdMob',
45
- credential: 'Google OAuth',
46
- summary: '앱·광고 단위 생성, 오늘 수익·기간 리포트',
47
- },
48
- iam: {
49
- label: 'Google Cloud IAM',
50
- credential: 'Google OAuth',
51
- summary: '서비스 계정 생성·키 발급·IAM 정책 바인딩',
52
- },
53
- bigquery: {
54
- label: 'BigQuery',
55
- credential: 'Google OAuth (또는 BigQuery 서비스 계정)',
56
- summary: '쿼리 실행·데이터셋/테이블/스키마 조회',
57
- },
58
- ga4: {
59
- label: 'Google Analytics 4',
60
- credential: 'Google OAuth',
61
- summary: '계정/속성·데이터 스트림 관리, 리포트 실행',
62
- },
63
- gsc: {
64
- label: 'Search Console',
65
- credential: 'Google OAuth',
66
- summary: 'URL 검사·검색 성과 분석·사이트맵 제출',
67
- },
68
- googleads: {
69
- label: 'Google Ads',
70
- credential: 'Google Ads 설정 (mimi-seed auth googleads, adwords 스코프)',
71
- summary: '캠페인 목록·캠페인/UAC 리포트',
72
- },
73
- ci: {
74
- label: 'CI (GitHub Actions / GitLab)',
75
- credential: 'GitHub/GitLab 토큰 (mimi-seed auth ci)',
76
- summary: '워크플로 조회·빌드 트리거/상태/취소 — Jenkins 빌드는 대상 아님',
77
- },
78
- jenkins: {
79
- label: 'Jenkins',
80
- credential: 'Jenkins URL + API 토큰 (mimi-seed auth jenkins)',
81
- summary: '크리덴셜·keystore 업로드·잡 생성/수정 — 빌드 트리거 도구는 없음',
82
- },
83
- android: {
84
- label: 'Android 서명',
85
- credential: '없음 (로컬 파일 작업)',
86
- summary: 'keystore 생성·서명 설정·Jenkins 로 Play SA 업로드',
87
- },
88
- facebook: {
89
- label: 'Facebook',
90
- credential: 'Facebook 페이지 토큰 (mimi-seed auth facebook)',
91
- summary: '페이지 텍스트/사진/링크 포스팅',
92
- },
93
- instagram: {
94
- label: 'Instagram',
95
- credential: 'Instagram 토큰 (mimi-seed auth instagram)',
96
- summary: '사진·캐러셀·릴스 포스팅',
97
- },
98
- threads: {
99
- label: 'Threads',
100
- credential: 'Threads 토큰 (mimi-seed auth threads)',
101
- summary: '텍스트/이미지 포스팅·토큰 갱신',
102
- },
103
- checks: {
104
- label: '출시 점검',
105
- credential: '점검 대상 스토어의 자격증명',
106
- summary: '제출 전 위험 점검·스크린샷 규격 검증·릴리스 상태',
107
- },
108
- ai: {
109
- label: 'AI 생성',
110
- credential: 'ANTHROPIC_API_KEY 환경변수',
111
- summary: '커밋 기반 릴리스 노트·리뷰 답변 초안 생성',
112
- },
113
- auth: {
114
- label: '연결/진단',
115
- credential: '없음 (이것이 셋업 도구)',
116
- summary: '전체 연결 상태 스캔(mimi_seed_status)·OAuth 시작·원격 크리덴셜 동기화',
117
- },
118
- };
119
16
  export function registerResources(server) {
120
17
  server.resource('auth-status', 'mimi-seed://auth/status', { description: 'Google OAuth 인증 상태 — fresh / refreshed / expired / unauthenticated', mimeType: 'application/json' }, async () => {
121
18
  const r = await ensureFreshAccessToken();
@@ -137,35 +34,42 @@ export function registerResources(server) {
137
34
  server.resource('agent-guide', 'mimi-seed://agent/guide', {
138
35
  description: 'Mimi Seed 에이전트 운영 규약 전문 (docs/agent-guide.md) — deferred 도구 로딩·ToolSearch select: 배치·호출 순서·비가역 액션 안전수칙',
139
36
  mimeType: 'text/markdown',
140
- }, async () => ({
141
- contents: [{
142
- uri: 'mimi-seed://agent/guide',
143
- mimeType: 'text/markdown',
144
- text: readPackageAsset('../assets/agent-guide.md') ?? AGENT_GUIDE_FALLBACK,
145
- }],
146
- }));
37
+ }, async () => {
38
+ let text;
39
+ try {
40
+ text = readPackageRootText('assets/agent-guide.md');
41
+ }
42
+ catch {
43
+ text = AGENT_GUIDE_FALLBACK;
44
+ }
45
+ return {
46
+ contents: [{
47
+ uri: 'mimi-seed://agent/guide',
48
+ mimeType: 'text/markdown',
49
+ text,
50
+ }],
51
+ };
52
+ });
147
53
  server.resource('tools-catalog', 'mimi-seed://tools/catalog', {
148
54
  description: '150+ 도구 전체 카탈로그 — 도메인별 도구 목록·필요 자격증명·한줄 요약. "mimi-seed 로 뭘 할 수 있어?" 에는 이 리소스를 읽고 답하세요.',
149
55
  mimeType: 'application/json',
150
56
  }, async () => {
151
57
  // LLM 이 읽는 페이로드라 compact 로 직렬화한다 (pretty 들여쓰기는 ~40% 바이트 낭비).
58
+ // 도메인 메타데이터(label·credential·summary)는 tool-manifest.json 이 SSOT —
59
+ // 여기서는 그대로 서빙만 한다.
152
60
  let payload;
153
61
  try {
154
- const raw = readFileSync(new URL('../tool-manifest.json', import.meta.url), 'utf8');
155
- const manifest = JSON.parse(raw);
156
- if (typeof manifest?.total !== 'number' || typeof manifest?.domains !== 'object' || manifest.domains === null) {
157
- throw new Error('tool-manifest.json 의 형태가 예상과 다릅니다');
158
- }
62
+ const manifest = readToolManifest();
159
63
  payload = JSON.stringify({
160
64
  total: manifest.total,
161
65
  deferredHint: 'Claude Code 에서는 도구 schema 가 lazy 로드됩니다 — 호출 전 ToolSearch(query="select:<tool,...>") 로 선로드하세요. 상세: mimi-seed://agent/guide',
162
- domains: Object.entries(manifest.domains).map(([id, tools]) => ({
66
+ domains: Object.entries(manifest.domains).map(([id, d]) => ({
163
67
  id,
164
- label: DOMAIN_SUMMARY[id]?.label ?? id,
165
- credential: DOMAIN_SUMMARY[id]?.credential ?? '알 수 없음',
166
- summary: DOMAIN_SUMMARY[id]?.summary ?? '',
167
- toolCount: tools.length,
168
- tools,
68
+ label: d.label,
69
+ credential: d.credential,
70
+ summary: d.summary,
71
+ toolCount: d.tools.length,
72
+ tools: d.tools,
169
73
  })),
170
74
  });
171
75
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yoonion/mimi-seed-mcp",
3
- "version": "0.11.0",
3
+ "version": "0.11.1",
4
4
  "description": "Mimi Seed MCP server — Firebase + AdMob + Google Play + App Store management for Claude Code / Codex / Cursor / any MCP client.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,205 +1,295 @@
1
1
  {
2
- "$comment": "등록된 MCP 도구의 SSOT. src/__tests__/tool-manifest.test.ts 가 실제 서버 등록 목록과 diff 하여 강제한다. 도구 추가/삭제/개명 시 이 파일을 함께 갱신할 것 — 산문 문서에는 정확한 개수를 쓰지 말고 이 파일을 가리킬 것.",
2
+ "$comment": "등록된 MCP 도구 + 도메인 메타데이터(label·credential·summary)의 SSOT. src/__tests__/tool-manifest.test.ts 가 실제 서버 등록 목록과 diff 하고 메타데이터 정합성을 검사한다. 도구 추가/삭제/개명 시 이 파일을 함께 갱신할 것 — 산문 문서에는 정확한 개수를 쓰지 말고 이 파일을 가리킬 것. mimi-seed://tools/catalog 리소스가 이 파일을 그대로 서빙한다.",
3
3
  "total": 163,
4
4
  "domains": {
5
- "admob": [
6
- "admob_list_accounts",
7
- "admob_list_apps",
8
- "admob_list_ad_units",
9
- "admob_get_today_earnings",
10
- "admob_get_report",
11
- "admob_create_app",
12
- "admob_create_ad_unit"
13
- ],
14
- "ai": [
15
- "generate_release_notes_from_commits",
16
- "generate_review_reply"
17
- ],
18
- "android": [
19
- "android_signing_setup",
20
- "android_generate_keystore",
21
- "jenkins_upload_playstore_sa"
22
- ],
23
- "appstore": [
24
- "appstore_list_apps",
25
- "appstore_verify_credentials",
26
- "appstore_get_app",
27
- "appstore_list_versions",
28
- "appstore_create_version",
29
- "appstore_attach_build",
30
- "appstore_attach_latest_build",
31
- "appstore_get_metadata",
32
- "appstore_update_localization",
33
- "appstore_list_screenshots",
34
- "appstore_upload_screenshot",
35
- "appstore_delete_screenshot",
36
- "appstore_delete_screenshot_set",
37
- "appstore_update_whats_new",
38
- "appstore_update_review_notes",
39
- "appstore_get_review_notes",
40
- "appstore_list_builds",
41
- "appstore_list_beta_groups",
42
- "appstore_get_app_info",
43
- "appstore_list_app_info_localizations",
44
- "appstore_update_app_info_localization",
45
- "appstore_create_app_info_localization",
46
- "appstore_list_reviews",
47
- "appstore_reply_review",
48
- "appstore_create_inapp_purchase",
49
- "appstore_create_subscription",
50
- "appstore_list_products",
51
- "appstore_update_product_review_note",
52
- "appstore_upload_product_review_screenshot",
53
- "appstore_update_product",
54
- "appstore_delete_product",
55
- "appstore_plan_release",
56
- "appstore_submit_for_review",
57
- "appstore_cancel_review"
58
- ],
59
- "auth": [
60
- "mimi_seed_status",
61
- "mimi_seed_auth_start",
62
- "mimi_seed_auth_status",
63
- "mimi_seed_remote_sync_credentials"
64
- ],
65
- "bigquery": [
66
- "bigquery_run_query",
67
- "bigquery_list_datasets",
68
- "bigquery_list_tables",
69
- "bigquery_get_table_schema",
70
- "bigquery_auth_status"
71
- ],
72
- "checks": [
73
- "playstore_check_submission_risks",
74
- "appstore_check_submission_risks",
75
- "screenshot_validate",
76
- "release_status"
77
- ],
78
- "ci": [
79
- "ci_save_config",
80
- "ci_list_workflows",
81
- "ci_trigger_build",
82
- "ci_get_build_status",
83
- "ci_list_recent_builds",
84
- "ci_cancel_build"
85
- ],
86
- "facebook": [
87
- "facebook_save_config",
88
- "facebook_list_pages",
89
- "facebook_get_page",
90
- "facebook_post_photo",
91
- "facebook_post_multi_photo",
92
- "facebook_current_config"
93
- ],
94
- "firebase": [
95
- "firebase_list_projects",
96
- "firebase_get_project",
97
- "firebase_create_project",
98
- "firebase_list_android_apps",
99
- "firebase_create_android_app",
100
- "firebase_get_android_config",
101
- "firebase_delete_android_app",
102
- "firebase_list_ios_apps",
103
- "firebase_create_ios_app",
104
- "firebase_get_ios_config",
105
- "firebase_delete_ios_app",
106
- "firebase_list_web_apps",
107
- "firebase_create_web_app",
108
- "firebase_get_web_config",
109
- "firebase_delete_web_app",
110
- "firebase_enable_service",
111
- "firebase_enable_common_services",
112
- "firebase_list_enabled_services",
113
- "firebase_link_analytics",
114
- "firebase_get_analytics_details"
115
- ],
116
- "ga4": [
117
- "ga4_list_account_summaries",
118
- "ga4_list_properties",
119
- "ga4_create_property",
120
- "ga4_create_data_stream",
121
- "ga4_list_data_streams",
122
- "ga4_run_report"
123
- ],
124
- "googleads": [
125
- "googleads_save_config",
126
- "googleads_list_campaigns",
127
- "googleads_get_campaign_report",
128
- "googleads_get_uac_report",
129
- "googleads_list_accessible_customers",
130
- "googleads_config_status"
131
- ],
132
- "gsc": [
133
- "gsc_list_sites",
134
- "gsc_list_sitemaps",
135
- "gsc_get_sitemap",
136
- "gsc_submit_sitemap",
137
- "gsc_inspect_url",
138
- "gsc_search_analytics"
139
- ],
140
- "iam": [
141
- "iam_list_service_accounts",
142
- "iam_create_service_account",
143
- "iam_list_keys",
144
- "iam_create_key",
145
- "iam_add_iam_policy_binding"
146
- ],
147
- "instagram": [
148
- "instagram_save_config",
149
- "instagram_get_account",
150
- "instagram_post_image",
151
- "instagram_post_carousel"
152
- ],
153
- "jenkins": [
154
- "jenkins_status",
155
- "jenkins_save_config",
156
- "jenkins_list_credentials",
157
- "jenkins_create_credential",
158
- "jenkins_upload_keystore",
159
- "jenkins_delete_credential",
160
- "jenkins_list_jobs",
161
- "jenkins_get_job_config",
162
- "jenkins_create_job",
163
- "jenkins_update_job"
164
- ],
165
- "playstore": [
166
- "playstore_get_app",
167
- "playstore_update_details",
168
- "playstore_get_listing",
169
- "playstore_update_listing",
170
- "playstore_list_tracks",
171
- "playstore_get_statistics",
172
- "playstore_list_images",
173
- "playstore_upload_image",
174
- "playstore_delete_all_images",
175
- "playstore_replace_images",
176
- "playstore_update_release_notes",
177
- "playstore_update_latest_release_notes",
178
- "playstore_list_reviews",
179
- "playstore_reply_review",
180
- "playstore_list_inapp_products",
181
- "playstore_list_subscriptions",
182
- "playstore_create_onetime_product",
183
- "playstore_create_subscription",
184
- "playstore_verify_service_account",
185
- "playstore_register_service_account",
186
- "playstore_list_service_accounts",
187
- "playstore_delete_service_account",
188
- "playstore_plan_release",
189
- "playstore_submit_release",
190
- "playstore_promote_release",
191
- "playstore_list_products",
192
- "playstore_update_product",
193
- "playstore_delete_product",
194
- "setup_playstore_connection"
195
- ],
196
- "threads": [
197
- "threads_save_config",
198
- "threads_refresh_token",
199
- "threads_get_account",
200
- "threads_post",
201
- "threads_post_carousel",
202
- "threads_current_config"
203
- ]
5
+ "admob": {
6
+ "label": "AdMob",
7
+ "credential": "Google OAuth",
8
+ "summary": "앱·광고 단위 생성, 오늘 수익·기간 리포트",
9
+ "tools": [
10
+ "admob_list_accounts",
11
+ "admob_list_apps",
12
+ "admob_list_ad_units",
13
+ "admob_get_today_earnings",
14
+ "admob_get_report",
15
+ "admob_create_app",
16
+ "admob_create_ad_unit"
17
+ ]
18
+ },
19
+ "ai": {
20
+ "label": "AI 생성",
21
+ "credential": "ANTHROPIC_API_KEY 환경변수",
22
+ "summary": "커밋 기반 릴리스 노트·리뷰 답변 초안 생성",
23
+ "tools": [
24
+ "generate_release_notes_from_commits",
25
+ "generate_review_reply"
26
+ ]
27
+ },
28
+ "android": {
29
+ "label": "Android 서명",
30
+ "credential": "없음 (로컬 파일 작업)",
31
+ "summary": "keystore 생성·서명 설정·Jenkins 로 Play SA 업로드",
32
+ "tools": [
33
+ "android_signing_setup",
34
+ "android_generate_keystore",
35
+ "jenkins_upload_playstore_sa"
36
+ ]
37
+ },
38
+ "appstore": {
39
+ "label": "App Store Connect",
40
+ "credential": "ASC API 키 (mimi-seed auth appstore)",
41
+ "summary": "버전·빌드 attach·What's New·스크린샷·IAP 심사 메타데이터·심사 제출",
42
+ "tools": [
43
+ "appstore_list_apps",
44
+ "appstore_verify_credentials",
45
+ "appstore_get_app",
46
+ "appstore_list_versions",
47
+ "appstore_create_version",
48
+ "appstore_attach_build",
49
+ "appstore_attach_latest_build",
50
+ "appstore_get_metadata",
51
+ "appstore_update_localization",
52
+ "appstore_list_screenshots",
53
+ "appstore_upload_screenshot",
54
+ "appstore_delete_screenshot",
55
+ "appstore_delete_screenshot_set",
56
+ "appstore_update_whats_new",
57
+ "appstore_update_review_notes",
58
+ "appstore_get_review_notes",
59
+ "appstore_list_builds",
60
+ "appstore_list_beta_groups",
61
+ "appstore_get_app_info",
62
+ "appstore_list_app_info_localizations",
63
+ "appstore_update_app_info_localization",
64
+ "appstore_create_app_info_localization",
65
+ "appstore_list_reviews",
66
+ "appstore_reply_review",
67
+ "appstore_create_inapp_purchase",
68
+ "appstore_create_subscription",
69
+ "appstore_list_products",
70
+ "appstore_update_product_review_note",
71
+ "appstore_upload_product_review_screenshot",
72
+ "appstore_update_product",
73
+ "appstore_delete_product",
74
+ "appstore_plan_release",
75
+ "appstore_submit_for_review",
76
+ "appstore_cancel_review"
77
+ ]
78
+ },
79
+ "auth": {
80
+ "label": "연결/진단",
81
+ "credential": "없음 (이것이 셋업 도구)",
82
+ "summary": "전체 연결 상태 스캔(mimi_seed_status)·OAuth 시작·원격 크리덴셜 동기화",
83
+ "tools": [
84
+ "mimi_seed_status",
85
+ "mimi_seed_auth_start",
86
+ "mimi_seed_auth_status",
87
+ "mimi_seed_remote_sync_credentials"
88
+ ]
89
+ },
90
+ "bigquery": {
91
+ "label": "BigQuery",
92
+ "credential": "Google OAuth (또는 BigQuery 서비스 계정)",
93
+ "summary": "쿼리 실행·데이터셋/테이블/스키마 조회",
94
+ "tools": [
95
+ "bigquery_run_query",
96
+ "bigquery_list_datasets",
97
+ "bigquery_list_tables",
98
+ "bigquery_get_table_schema",
99
+ "bigquery_auth_status"
100
+ ]
101
+ },
102
+ "checks": {
103
+ "label": "출시 점검",
104
+ "credential": "점검 대상 스토어의 자격증명",
105
+ "summary": "제출 전 위험 점검·스크린샷 규격 검증·릴리스 상태",
106
+ "tools": [
107
+ "playstore_check_submission_risks",
108
+ "appstore_check_submission_risks",
109
+ "screenshot_validate",
110
+ "release_status"
111
+ ]
112
+ },
113
+ "ci": {
114
+ "label": "CI (GitHub Actions / GitLab)",
115
+ "credential": "GitHub/GitLab 토큰 (mimi-seed auth ci)",
116
+ "summary": "워크플로 조회·빌드 트리거/상태/취소 — Jenkins 빌드는 대상 아님",
117
+ "tools": [
118
+ "ci_save_config",
119
+ "ci_list_workflows",
120
+ "ci_trigger_build",
121
+ "ci_get_build_status",
122
+ "ci_list_recent_builds",
123
+ "ci_cancel_build"
124
+ ]
125
+ },
126
+ "facebook": {
127
+ "label": "Facebook",
128
+ "credential": "Facebook 페이지 토큰 (mimi-seed auth facebook)",
129
+ "summary": "페이지 텍스트/사진/링크 포스팅",
130
+ "tools": [
131
+ "facebook_save_config",
132
+ "facebook_list_pages",
133
+ "facebook_get_page",
134
+ "facebook_post_photo",
135
+ "facebook_post_multi_photo",
136
+ "facebook_current_config"
137
+ ]
138
+ },
139
+ "firebase": {
140
+ "label": "Firebase",
141
+ "credential": "Google OAuth",
142
+ "summary": "프로젝트/앱 생성·설정 파일 다운로드·서비스 활성화",
143
+ "tools": [
144
+ "firebase_list_projects",
145
+ "firebase_get_project",
146
+ "firebase_create_project",
147
+ "firebase_list_android_apps",
148
+ "firebase_create_android_app",
149
+ "firebase_get_android_config",
150
+ "firebase_delete_android_app",
151
+ "firebase_list_ios_apps",
152
+ "firebase_create_ios_app",
153
+ "firebase_get_ios_config",
154
+ "firebase_delete_ios_app",
155
+ "firebase_list_web_apps",
156
+ "firebase_create_web_app",
157
+ "firebase_get_web_config",
158
+ "firebase_delete_web_app",
159
+ "firebase_enable_service",
160
+ "firebase_enable_common_services",
161
+ "firebase_list_enabled_services",
162
+ "firebase_link_analytics",
163
+ "firebase_get_analytics_details"
164
+ ]
165
+ },
166
+ "ga4": {
167
+ "label": "Google Analytics 4",
168
+ "credential": "Google OAuth",
169
+ "summary": "계정/속성·데이터 스트림 관리, 리포트 실행",
170
+ "tools": [
171
+ "ga4_list_account_summaries",
172
+ "ga4_list_properties",
173
+ "ga4_create_property",
174
+ "ga4_create_data_stream",
175
+ "ga4_list_data_streams",
176
+ "ga4_run_report"
177
+ ]
178
+ },
179
+ "googleads": {
180
+ "label": "Google Ads",
181
+ "credential": "Google Ads 설정 (mimi-seed auth googleads, adwords 스코프)",
182
+ "summary": "캠페인 목록·캠페인/UAC 리포트",
183
+ "tools": [
184
+ "googleads_save_config",
185
+ "googleads_list_campaigns",
186
+ "googleads_get_campaign_report",
187
+ "googleads_get_uac_report",
188
+ "googleads_list_accessible_customers",
189
+ "googleads_config_status"
190
+ ]
191
+ },
192
+ "gsc": {
193
+ "label": "Search Console",
194
+ "credential": "Google OAuth",
195
+ "summary": "URL 검사·검색 성과 분석·사이트맵 제출",
196
+ "tools": [
197
+ "gsc_list_sites",
198
+ "gsc_list_sitemaps",
199
+ "gsc_get_sitemap",
200
+ "gsc_submit_sitemap",
201
+ "gsc_inspect_url",
202
+ "gsc_search_analytics"
203
+ ]
204
+ },
205
+ "iam": {
206
+ "label": "Google Cloud IAM",
207
+ "credential": "Google OAuth",
208
+ "summary": "서비스 계정 생성·키 발급·IAM 정책 바인딩",
209
+ "tools": [
210
+ "iam_list_service_accounts",
211
+ "iam_create_service_account",
212
+ "iam_list_keys",
213
+ "iam_create_key",
214
+ "iam_add_iam_policy_binding"
215
+ ]
216
+ },
217
+ "instagram": {
218
+ "label": "Instagram",
219
+ "credential": "Instagram 토큰 (mimi-seed auth instagram)",
220
+ "summary": "사진·캐러셀·릴스 포스팅",
221
+ "tools": [
222
+ "instagram_save_config",
223
+ "instagram_get_account",
224
+ "instagram_post_image",
225
+ "instagram_post_carousel"
226
+ ]
227
+ },
228
+ "jenkins": {
229
+ "label": "Jenkins",
230
+ "credential": "Jenkins URL + API 토큰 (mimi-seed auth jenkins)",
231
+ "summary": "크리덴셜·keystore 업로드·잡 생성/수정 — 빌드 트리거 도구는 없음",
232
+ "tools": [
233
+ "jenkins_status",
234
+ "jenkins_save_config",
235
+ "jenkins_list_credentials",
236
+ "jenkins_create_credential",
237
+ "jenkins_upload_keystore",
238
+ "jenkins_delete_credential",
239
+ "jenkins_list_jobs",
240
+ "jenkins_get_job_config",
241
+ "jenkins_create_job",
242
+ "jenkins_update_job"
243
+ ]
244
+ },
245
+ "playstore": {
246
+ "label": "Google Play",
247
+ "credential": "Google OAuth (CI/헤드리스는 Play 서비스 계정)",
248
+ "summary": "리스팅·트랙 릴리스·이미지·리뷰 답변·통계·서비스 계정 등록",
249
+ "tools": [
250
+ "playstore_get_app",
251
+ "playstore_update_details",
252
+ "playstore_get_listing",
253
+ "playstore_update_listing",
254
+ "playstore_list_tracks",
255
+ "playstore_get_statistics",
256
+ "playstore_list_images",
257
+ "playstore_upload_image",
258
+ "playstore_delete_all_images",
259
+ "playstore_replace_images",
260
+ "playstore_update_release_notes",
261
+ "playstore_update_latest_release_notes",
262
+ "playstore_list_reviews",
263
+ "playstore_reply_review",
264
+ "playstore_list_inapp_products",
265
+ "playstore_list_subscriptions",
266
+ "playstore_create_onetime_product",
267
+ "playstore_create_subscription",
268
+ "playstore_verify_service_account",
269
+ "playstore_register_service_account",
270
+ "playstore_list_service_accounts",
271
+ "playstore_delete_service_account",
272
+ "playstore_plan_release",
273
+ "playstore_submit_release",
274
+ "playstore_promote_release",
275
+ "playstore_list_products",
276
+ "playstore_update_product",
277
+ "playstore_delete_product",
278
+ "setup_playstore_connection"
279
+ ]
280
+ },
281
+ "threads": {
282
+ "label": "Threads",
283
+ "credential": "Threads 토큰 (mimi-seed auth threads)",
284
+ "summary": "텍스트/이미지 포스팅·토큰 갱신",
285
+ "tools": [
286
+ "threads_save_config",
287
+ "threads_refresh_token",
288
+ "threads_get_account",
289
+ "threads_post",
290
+ "threads_post_carousel",
291
+ "threads_current_config"
292
+ ]
293
+ }
204
294
  }
205
295
  }