@yoonion/mimi-seed-mcp 0.3.18 → 0.3.19

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.
@@ -0,0 +1,2 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerPrompts(server: McpServer): void;
@@ -0,0 +1,71 @@
1
+ import { z } from 'zod';
2
+ export function registerPrompts(server) {
3
+ server.prompt('deploy', '앱 출시 전 체크 → 릴리즈 노트 생성 → 스토어 적용까지 한 번에 진행', {
4
+ packageName: z.string().optional().describe('Android 패키지명 (Play Store 출시 시)'),
5
+ appId: z.string().optional().describe('App Store 앱 ID (iOS 출시 시)'),
6
+ version: z.string().optional().describe('출시 버전 (예: 1.4.0)'),
7
+ locales: z.string().optional().describe('릴리즈 노트 언어 쉼표 구분 (기본: ko,en-US)'),
8
+ }, async ({ packageName, appId, version, locales }) => ({
9
+ messages: [{
10
+ role: 'user',
11
+ content: {
12
+ type: 'text',
13
+ text: [
14
+ `${packageName ?? appId ?? '앱'} 출시를 진행해줘.${version ? ` 버전: ${version}` : ''}`,
15
+ '',
16
+ '다음 순서로 진행해:',
17
+ '1. playstore_check_submission_risks 또는 appstore_check_submission_risks 로 블로커 먼저 확인',
18
+ '2. 블로커 있으면 목록 보여주고 수정 방법 제안. 없으면 다음 단계로',
19
+ '3. git log 최근 커밋을 가져와 generate_release_notes_from_commits 로 릴리즈 노트 생성',
20
+ ` 언어: ${locales ?? 'ko,en-US'} / 톤: 간결·상세·마케팅 3가지`,
21
+ '4. 생성된 노트 보여주고 적용 여부 확인 (비가역 — 반드시 동의 받을 것)',
22
+ '5. 확인 후 playstore_update_release_notes 또는 appstore_update_whats_new 로 적용',
23
+ '6. 최종 Readiness 상태 요약',
24
+ ].join('\n'),
25
+ },
26
+ }],
27
+ }));
28
+ server.prompt('health', '인증 상태 + 앱 출시 준비도 빠른 요약', {}, async () => ({
29
+ messages: [{
30
+ role: 'user',
31
+ content: {
32
+ type: 'text',
33
+ text: [
34
+ '현재 Mimi Seed 연결 상태와 앱 출시 준비도를 요약해줘.',
35
+ '',
36
+ '확인 순서:',
37
+ '1. mimi_seed_auth_status 로 Google OAuth 토큰 상태 확인',
38
+ '2. 인증 없으면 mimi_seed_auth_start 로 로그인 링크 발급',
39
+ '3. firebase_list_projects 로 연결된 Firebase 프로젝트 확인 (인증 있을 때)',
40
+ '4. playstore_check_submission_risks / appstore_check_submission_risks 로 등록 앱 블로커 점검',
41
+ '5. 다음 권장 액션 제안 (블로커 수정 / 릴리즈 노트 생성 / 출시 실행)',
42
+ ].join('\n'),
43
+ },
44
+ }],
45
+ }));
46
+ server.prompt('review-inbox', '미답변 스토어 리뷰 조회 → AI 답변 초안 생성', {
47
+ packageName: z.string().optional().describe('Android 패키지명'),
48
+ appId: z.string().optional().describe('App Store 앱 ID'),
49
+ tone: z.enum(['friendly', 'professional', 'empathetic', 'brief']).optional().describe('답변 톤 (기본: empathetic)'),
50
+ }, async ({ packageName, appId, tone }) => ({
51
+ messages: [{
52
+ role: 'user',
53
+ content: {
54
+ type: 'text',
55
+ text: [
56
+ `${packageName ?? appId ?? '등록된 앱'} 의 최근 스토어 리뷰를 가져와서 답변 초안을 작성해줘.`,
57
+ '',
58
+ '진행 순서:',
59
+ '1. playstore_list_reviews 또는 appstore_list_reviews 로 최근 리뷰 조회',
60
+ '2. 미답변 리뷰를 별점 낮은 순으로 정렬',
61
+ '3. 각 리뷰에 generate_review_reply 로 답변 초안 생성',
62
+ ` 톤: ${tone ?? 'empathetic'}`,
63
+ '4. 초안 보여주고 게시 여부 확인 (비가역 — 반드시 동의 받을 것)',
64
+ '5. 확인 후 playstore_reply_to_review 로 게시',
65
+ '',
66
+ '⚠️ AI 생성 답변은 초안입니다. 게시 전 반드시 검토하세요.',
67
+ ].join('\n'),
68
+ },
69
+ }],
70
+ }));
71
+ }
@@ -0,0 +1,2 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerAdmobTools(server: McpServer): void;
@@ -0,0 +1,96 @@
1
+ import { z } from 'zod';
2
+ import * as admob from '../admob/tools.js';
3
+ import { requireAuth } from '../helpers.js';
4
+ export function registerAdmobTools(server) {
5
+ server.tool('admob_list_accounts', 'AdMob 계정 목록 조회', {}, async () => {
6
+ const auth = requireAuth();
7
+ const accounts = await admob.listAccounts(auth);
8
+ return { content: [{ type: 'text', text: JSON.stringify(accounts, null, 2) }] };
9
+ });
10
+ server.tool('admob_list_apps', 'AdMob에 등록된 앱 목록', { accountId: z.string().describe('AdMob 계정 ID (예: accounts/pub-XXXX)') }, async ({ accountId }) => {
11
+ const auth = requireAuth();
12
+ const apps = await admob.listApps(auth, accountId);
13
+ return { content: [{ type: 'text', text: JSON.stringify(apps, null, 2) }] };
14
+ });
15
+ server.tool('admob_list_ad_units', 'AdMob 광고 단위 목록', { accountId: z.string().describe('AdMob 계정 ID') }, async ({ accountId }) => {
16
+ const auth = requireAuth();
17
+ const units = await admob.listAdUnits(auth, accountId);
18
+ return { content: [{ type: 'text', text: JSON.stringify(units, null, 2) }] };
19
+ });
20
+ server.tool('admob_get_today_earnings', '오늘 AdMob 수익 요약', { accountId: z.string().describe('AdMob 계정 ID') }, async ({ accountId }) => {
21
+ const auth = requireAuth();
22
+ const report = await admob.getTodayEarnings(auth, accountId);
23
+ return { content: [{ type: 'text', text: JSON.stringify(report, null, 2) }] };
24
+ });
25
+ server.tool('admob_get_report', 'AdMob 수익 리포트 (기간 지정)', {
26
+ accountId: z.string().describe('AdMob 계정 ID'),
27
+ startYear: z.number().describe('시작 연도'),
28
+ startMonth: z.number().describe('시작 월 (1-12)'),
29
+ startDay: z.number().describe('시작 일'),
30
+ endYear: z.number().describe('종료 연도'),
31
+ endMonth: z.number().describe('종료 월 (1-12)'),
32
+ endDay: z.number().describe('종료 일'),
33
+ }, async ({ accountId, startYear, startMonth, startDay, endYear, endMonth, endDay }) => {
34
+ const auth = requireAuth();
35
+ const report = await admob.getNetworkReport(auth, accountId, { year: startYear, month: startMonth, day: startDay }, { year: endYear, month: endMonth, day: endDay });
36
+ return { content: [{ type: 'text', text: JSON.stringify(report, null, 2) }] };
37
+ });
38
+ server.tool('admob_create_app', 'AdMob에 새 앱 등록 (v1beta — Limited Access)', {
39
+ accountId: z.string().describe('AdMob 계정 ID'),
40
+ platform: z.enum(['ANDROID', 'IOS']).describe('플랫폼'),
41
+ displayName: z.string().describe('앱 이름'),
42
+ }, async ({ accountId, platform, displayName }) => {
43
+ const auth = requireAuth();
44
+ try {
45
+ const result = await admob.createApp(auth, accountId, platform, displayName);
46
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
47
+ }
48
+ catch (err) {
49
+ if (err.code === 403) {
50
+ return {
51
+ content: [{
52
+ type: 'text',
53
+ text: [
54
+ '❌ AdMob 앱 생성 API 접근 불가 (403).',
55
+ '',
56
+ 'AdMob v1beta 쓰기 API는 Google Account Manager 승인이 필요합니다.',
57
+ '대신 AdMob 콘솔에서 수동 등록하세요:',
58
+ ' https://admob.google.com/home',
59
+ '',
60
+ '등록 후 admob_list_apps로 확인할 수 있습니다.',
61
+ ].join('\n'),
62
+ }],
63
+ };
64
+ }
65
+ throw err;
66
+ }
67
+ });
68
+ server.tool('admob_create_ad_unit', 'AdMob 광고 단위 생성 (v1beta — Limited Access)', {
69
+ accountId: z.string().describe('AdMob 계정 ID'),
70
+ appId: z.string().describe('AdMob 앱 ID'),
71
+ displayName: z.string().describe('광고 단위 이름'),
72
+ adFormat: z.enum(['BANNER', 'INTERSTITIAL', 'REWARDED', 'REWARDED_INTERSTITIAL', 'APP_OPEN', 'NATIVE']).describe('광고 형식'),
73
+ }, async ({ accountId, appId, displayName, adFormat }) => {
74
+ const auth = requireAuth();
75
+ try {
76
+ const result = await admob.createAdUnit(auth, accountId, appId, displayName, adFormat);
77
+ return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
78
+ }
79
+ catch (err) {
80
+ if (err.code === 403) {
81
+ return {
82
+ content: [{
83
+ type: 'text',
84
+ text: [
85
+ '❌ 광고 단위 생성 API 접근 불가 (403).',
86
+ '',
87
+ 'AdMob 콘솔에서 수동 생성하세요:',
88
+ ' https://admob.google.com/home',
89
+ ].join('\n'),
90
+ }],
91
+ };
92
+ }
93
+ throw err;
94
+ }
95
+ });
96
+ }
@@ -0,0 +1,2 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerAiTools(server: McpServer): void;
@@ -0,0 +1,55 @@
1
+ import { z } from 'zod';
2
+ import { generateReleaseNotesFromCommits, formatGeneratedNotes } from '../ai/notes.js';
3
+ import { generateReviewReply, formatReviewReply } from '../ai/review.js';
4
+ export function registerAiTools(server) {
5
+ server.tool('generate_release_notes_from_commits', [
6
+ 'git 커밋 내역을 받아 Claude AI로 앱 스토어용 릴리즈 노트를 생성합니다.',
7
+ '3가지 톤(간결/상세/마케팅)과 다국어 버전을 동시에 생성합니다.',
8
+ 'ANTHROPIC_API_KEY 환경변수가 필요합니다.',
9
+ 'commits: [{ message, author?, date? }] 형태로 전달하세요.',
10
+ 'locales: 다국어 생성할 로케일 배열 (예: ["ko", "en-US", "ja"])',
11
+ '생성 후 playstore_update_release_notes 또는 appstore_update_whats_new로 적용하세요.',
12
+ ].join(' '), {
13
+ commits: z.array(z.object({
14
+ message: z.string(),
15
+ hash: z.string().optional(),
16
+ author: z.string().optional(),
17
+ date: z.string().optional(),
18
+ })).describe('git 커밋 배열'),
19
+ appName: z.string().optional().describe('앱 이름 (프롬프트 맥락용)'),
20
+ locales: z.array(z.string()).optional().describe('다국어 로케일 목록 (예: ["ko", "en-US", "ja"])'),
21
+ }, async ({ commits, appName, locales }) => {
22
+ const result = await generateReleaseNotesFromCommits(commits, {
23
+ appName,
24
+ locales: locales ?? [],
25
+ });
26
+ const text = formatGeneratedNotes(result);
27
+ return { content: [{ type: 'text', text }] };
28
+ });
29
+ server.tool('generate_review_reply', [
30
+ 'Play Store / App Store 리뷰에 대한 AI 답변 초안을 생성합니다.',
31
+ 'ANTHROPIC_API_KEY 환경변수가 필요합니다.',
32
+ 'tone: friendly(친근) / professional(정중) / empathetic(공감) / brief(간결) — 기본: friendly',
33
+ 'language: ko / en / ja / zh 등 — 기본: ko',
34
+ '⚠ 생성된 답변은 초안입니다. 게시 전 반드시 검토하세요.',
35
+ '답변 게시는 playstore_reply_to_review 도구를 사용하세요.',
36
+ ].join(' '), {
37
+ reviewText: z.string().describe('리뷰 원문'),
38
+ rating: z.number().min(1).max(5).optional().describe('별점 (1~5)'),
39
+ appName: z.string().optional().describe('앱 이름'),
40
+ tone: z.enum(['friendly', 'professional', 'empathetic', 'brief']).optional().describe('답변 톤'),
41
+ language: z.string().optional().describe('답변 언어 코드 (기본: ko)'),
42
+ developerName: z.string().optional().describe('개발자/팀 이름'),
43
+ }, async ({ reviewText, rating, appName, tone, language, developerName }) => {
44
+ const result = await generateReviewReply({
45
+ reviewText,
46
+ rating,
47
+ appName,
48
+ tone: tone ?? 'friendly',
49
+ language: language ?? 'ko',
50
+ developerName,
51
+ });
52
+ const text = formatReviewReply(result);
53
+ return { content: [{ type: 'text', text }] };
54
+ });
55
+ }
@@ -0,0 +1,2 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerAppstoreTools(server: McpServer): void;