admob-mcp-server 0.1.0
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/LICENSE +21 -0
- package/README.ko.md +410 -0
- package/README.md +409 -0
- package/dist/admob/client.js +21 -0
- package/dist/admob/constants.js +86 -0
- package/dist/admob/reports.js +81 -0
- package/dist/auth/index.js +70 -0
- package/dist/auth/oauth-flow.js +123 -0
- package/dist/config.js +115 -0
- package/dist/index.js +30 -0
- package/dist/prompts.js +46 -0
- package/dist/resources.js +60 -0
- package/dist/server.js +33 -0
- package/dist/toolsets/accounts.js +33 -0
- package/dist/toolsets/adunits.js +62 -0
- package/dist/toolsets/apps.js +52 -0
- package/dist/toolsets/common.js +49 -0
- package/dist/toolsets/index.js +17 -0
- package/dist/toolsets/mediation.js +259 -0
- package/dist/toolsets/reports.js +108 -0
- package/dist/version.js +4 -0
- package/package.json +66 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Ted Park
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.ko.md
ADDED
|
@@ -0,0 +1,410 @@
|
|
|
1
|
+
# AdMob MCP Server
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/admob-mcp-server)
|
|
4
|
+
[](https://github.com/ParkSangGwon/admob-mcp-server/actions/workflows/ci.yml)
|
|
5
|
+
[](LICENSE)
|
|
6
|
+
|
|
7
|
+
[English](README.md) | **한국어**
|
|
8
|
+
|
|
9
|
+
AI 어시스턴트에게 내 AdMob 앱과 수익을 일상 언어로 물어보세요:
|
|
10
|
+
|
|
11
|
+
> - "지난 7일 동안 내 앱들이 나라별로 얼마나 벌었어?"
|
|
12
|
+
> - "이번 달 eCPM이 가장 좋은 미디에이션 광고 소스는 어디야?"
|
|
13
|
+
> - "배너 광고랑 보상형 광고의 RPM을 비교해줘."
|
|
14
|
+
> - "새 게임에 쓸 보상형 광고 단위를 만들어줘."
|
|
15
|
+
|
|
16
|
+

|
|
17
|
+
|
|
18
|
+
[Google AdMob API](https://developers.google.com/admob/api?hl=ko)를 위한 [Model Context Protocol (MCP)](https://modelcontextprotocol.io) 서버입니다.\
|
|
19
|
+
Claude Code, Claude Desktop, Cursor, Gemini CLI 등 MCP를 지원하는 모든 AI 클라이언트에서 사용할 수 있습니다.
|
|
20
|
+
|
|
21
|
+
## 아키텍처
|
|
22
|
+
|
|
23
|
+
```mermaid
|
|
24
|
+
flowchart LR
|
|
25
|
+
C["MCP 클라이언트<br/>Claude Code · Claude Desktop · Cursor · Gemini CLI"]
|
|
26
|
+
|
|
27
|
+
subgraph S["admob-mcp-server — 내 컴퓨터에서 실행"]
|
|
28
|
+
direction TB
|
|
29
|
+
T["18개 tool / 5개 toolset<br/>accounts · apps · adunits · reports · mediation<br/>(--toolsets / --read-only로 필터)"]
|
|
30
|
+
A["자격증명 해석<br/>환경변수 → token.json → gcloud ADC"]
|
|
31
|
+
R["리포트 가공<br/>청크 스트림 → 행 테이블 · micros → 통화 단위"]
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
G["Google AdMob API<br/>v1beta"]
|
|
35
|
+
|
|
36
|
+
C <-->|"MCP over stdio"| T
|
|
37
|
+
T --> A
|
|
38
|
+
A <-->|"OAuth 2.0 / HTTPS"| G
|
|
39
|
+
G -.->|"리포트 청크"| R
|
|
40
|
+
R -.-> T
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
자격증명과 수익 데이터는 내 컴퓨터와 Google 사이에서만 오갑니다 — 중간에 제3자 서버는 없습니다.
|
|
44
|
+
|
|
45
|
+
## 특징
|
|
46
|
+
|
|
47
|
+
- **AdMob API v1beta 전체 커버리지** — 계정·앱·광고 단위·리포트·미디에이션에 걸친 18개 tool, v1 API에는 없는 쓰기 기능 포함
|
|
48
|
+
- **읽기 좋은 리포트** — 스트리밍 리포트 응답을 단순한 행 테이블로 변환하고, 화폐 값(micros)을 실제 통화 단위로 환산
|
|
49
|
+
- **원하면 읽기 전용 모드** — `--read-only`를 주면 쓰기 tool(생성/수정)이 모두 숨겨지고 수정 불가능한 토큰만 발급됨
|
|
50
|
+
- **Toolsets** — 필요한 tool 그룹만 활성화 가능, 예: `--toolsets reports,accounts`
|
|
51
|
+
- **3가지 인증 방식** — 원커맨드 브라우저 로그인(`npx admob-mcp-server auth`), 환경변수 refresh token, gcloud Application Default Credentials
|
|
52
|
+
- **내장 분석 prompt**와 리포트 스펙 레퍼런스 resource 제공
|
|
53
|
+
|
|
54
|
+
## 설정 한눈에 보기
|
|
55
|
+
|
|
56
|
+
최초 1회, 약 10분이면 끝납니다:
|
|
57
|
+
|
|
58
|
+
| 단계 | 하는 일 | 위치 |
|
|
59
|
+
| --------------------------------------------------- | ---------------------------------------------- | -------- |
|
|
60
|
+
| [1. Google Cloud 준비](#1단계--google-cloud-준비) | 내 데이터에 접근할 개인용 "앱"을 Google에 등록 | 브라우저 |
|
|
61
|
+
| [2. 로그인](#2단계--로그인) | 명령 하나 실행하고 Google 로그인 | 터미널 |
|
|
62
|
+
| [3. AI 클라이언트 연결](#3단계--ai-클라이언트-연결) | 설정 한 줄 추가하고 클라이언트 재시작 | 터미널 |
|
|
63
|
+
|
|
64
|
+
### 요구 사항
|
|
65
|
+
|
|
66
|
+
- **Node.js 18 이상** — `node --version`으로 확인, 없으면 [nodejs.org](https://nodejs.org)에서 설치
|
|
67
|
+
- [AdMob](https://admob.google.com) 계정과 그 계정을 소유한 Google 계정
|
|
68
|
+
|
|
69
|
+
## 설정
|
|
70
|
+
|
|
71
|
+
### 1단계 — Google Cloud 준비
|
|
72
|
+
|
|
73
|
+
왜 필요할까요?\
|
|
74
|
+
AdMob API는 단순 API 키를 지원하지 않고, 내 데이터에 접근하는 모든 프로그램을 "OAuth 앱"으로 등록하도록 요구합니다.\
|
|
75
|
+
여기서는 나만 사용할 개인용 앱을 하나 등록합니다.\
|
|
76
|
+
무료이고 결제 설정도 필요 없습니다.
|
|
77
|
+
|
|
78
|
+
1. **Google Cloud 프로젝트 생성(또는 선택)**: [console.cloud.google.com/projectcreate](https://console.cloud.google.com/projectcreate) — 이름은 아무거나, 기존 프로젝트 재사용도 OK.
|
|
79
|
+
2. **AdMob API 활성화**: [console.cloud.google.com/apis/library/admob.googleapis.com](https://console.cloud.google.com/apis/library/admob.googleapis.com) → 상단 바에서 내 프로젝트가 선택돼 있는지 확인 → **사용(Enable)**.
|
|
80
|
+
3. **OAuth 동의 화면 구성**: [console.cloud.google.com/auth/overview](https://console.cloud.google.com/auth/overview) — 처음 방문하면 짧은 마법사가 열립니다:
|
|
81
|
+
- 앱 이름: 아무거나 (예: `admob-mcp`), 지원/연락처 이메일에 본인 이메일
|
|
82
|
+
- 대상(Audience): **외부(External)**
|
|
83
|
+
- 마법사를 완료하세요 — Google 심사에 제출할 필요는 **없습니다**
|
|
84
|
+
- 이어서 **대상 → 테스트 사용자 → Add users**에서 **AdMob 계정을 소유한 Google 계정**을 추가
|
|
85
|
+
4. **OAuth 클라이언트 생성**: [console.cloud.google.com/apis/credentials](https://console.cloud.google.com/apis/credentials) → **사용자 인증 정보 만들기 → OAuth 클라이언트 ID**
|
|
86
|
+
- 애플리케이션 유형: **데스크톱 앱(Desktop app)**
|
|
87
|
+
- 생성 후 **JSON 다운로드** 클릭 — 이 파일을 2단계에서 사용합니다
|
|
88
|
+
|
|
89
|
+
> [!WARNING]
|
|
90
|
+
> 동의 화면이 **테스트(Testing)** 상태인 동안에는 로그인이 **7일** 후 만료되어 매주 다시 로그인해야 합니다.\
|
|
91
|
+
> 이게 번거로우면 앱을 게시하세요(**대상 → 앱 게시**).\
|
|
92
|
+
> 본인만 사용할 경우 Google 심사는 필요 없고, 로그인할 때 "확인되지 않은 앱" 경고만 표시되는데 정상입니다.
|
|
93
|
+
|
|
94
|
+
### 2단계 — 로그인
|
|
95
|
+
|
|
96
|
+
다운로드한 JSON 파일을 서버가 찾는 위치로 옮기고, 로그인 명령을 실행합니다:
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
mkdir -p ~/.admob-mcp
|
|
100
|
+
mv ~/Downloads/client_secret_*.json ~/.admob-mcp/oauth_client.json
|
|
101
|
+
|
|
102
|
+
npx admob-mcp-server auth
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
(Windows는 탐색기에서 파일을 `C:\Users\<사용자>\.admob-mcp\oauth_client.json`으로 옮긴 뒤 `npx` 명령을 실행하세요.)
|
|
106
|
+
|
|
107
|
+
브라우저가 열리면 **AdMob 계정을 소유한 Google 계정**을 선택하고 접근을 허용하세요.\
|
|
108
|
+
**"Google에서 확인하지 않은 앱"** 경고가 보이면 1단계에서 만든 본인 앱이니 "계속"을 누르면 됩니다.\
|
|
109
|
+
터미널에 `Setup complete`가 출력되면 로그인 정보가 `~/.admob-mcp/token.json`에 저장되고 이후 재사용됩니다.
|
|
110
|
+
|
|
111
|
+
기본 로그인은 쓰기 tool까지 모든 tool을 커버합니다.\
|
|
112
|
+
리포트 조회만 필요하면 `npx admob-mcp-server auth --read-only`로 실행하세요.
|
|
113
|
+
|
|
114
|
+
`auth` 명령이 하는 일:
|
|
115
|
+
|
|
116
|
+
```mermaid
|
|
117
|
+
sequenceDiagram
|
|
118
|
+
autonumber
|
|
119
|
+
participant T as 터미널
|
|
120
|
+
participant S as admob-mcp-server
|
|
121
|
+
participant B as 브라우저
|
|
122
|
+
participant G as Google
|
|
123
|
+
|
|
124
|
+
T->>S: npx admob-mcp-server auth
|
|
125
|
+
S->>S: ~/.admob-mcp/oauth_client.json 읽기
|
|
126
|
+
S->>B: 동의 URL 열기 (루프백 리다이렉트, 랜덤 포트)
|
|
127
|
+
B->>G: 로그인 & 스코프 허용
|
|
128
|
+
G-->>S: authorization code → refresh token
|
|
129
|
+
S->>S: ~/.admob-mcp/token.json 저장 (이후 호출에 재사용)
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
<details>
|
|
133
|
+
<summary><b>고급: 환경변수 (헤드리스 / CI)</b></summary>
|
|
134
|
+
|
|
135
|
+
refresh token을 이미 갖고 있다면 파일 없이 사용할 수 있습니다 (쓰기 tool을 쓰려면 토큰이 `admob.monetization` 스코프도 포함해야 함):
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
export GOOGLE_CLIENT_ID="....apps.googleusercontent.com"
|
|
139
|
+
export GOOGLE_CLIENT_SECRET="..."
|
|
140
|
+
export GOOGLE_REFRESH_TOKEN="..."
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
</details>
|
|
144
|
+
|
|
145
|
+
<details>
|
|
146
|
+
<summary><b>고급: gcloud Application Default Credentials</b></summary>
|
|
147
|
+
|
|
148
|
+
Google 공식 Analytics/Ads MCP 서버와 동일한 패턴입니다:
|
|
149
|
+
|
|
150
|
+
```bash
|
|
151
|
+
gcloud auth application-default login \
|
|
152
|
+
--scopes=https://www.googleapis.com/auth/admob.readonly,https://www.googleapis.com/auth/admob.report,https://www.googleapis.com/auth/admob.monetization,https://www.googleapis.com/auth/cloud-platform \
|
|
153
|
+
--client-id-file=path/to/oauth_client.json
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
리포트 조회만 필요하면 `admob.monetization` 스코프는 빼도 됩니다.
|
|
157
|
+
|
|
158
|
+
</details>
|
|
159
|
+
|
|
160
|
+
자격증명 적용 우선순위: **환경변수 → `token.json`(`auth`로 생성) → ADC**
|
|
161
|
+
|
|
162
|
+
### 3단계 — AI 클라이언트 연결
|
|
163
|
+
|
|
164
|
+
사용하는 클라이언트를 골라 설정하세요.\
|
|
165
|
+
MCP 서버는 클라이언트 시작 시점에 로드되므로, 설정을 추가한 뒤 **클라이언트를 재시작**해야 합니다.
|
|
166
|
+
|
|
167
|
+
**Claude Code**
|
|
168
|
+
|
|
169
|
+
```bash
|
|
170
|
+
claude mcp add admob -- npx -y admob-mcp-server
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
`claude mcp list`로 확인하면 `admob: ... - ✔ Connected`가 보여야 합니다.
|
|
174
|
+
|
|
175
|
+
**Claude Desktop** — **설정 → 개발자 → 구성 편집**을 열면 `claude_desktop_config.json`이 열립니다 (macOS: `~/Library/Application Support/Claude/`, Windows: `%APPDATA%\Claude\`).\
|
|
176
|
+
다음을 추가하세요:
|
|
177
|
+
|
|
178
|
+
```json
|
|
179
|
+
{
|
|
180
|
+
"mcpServers": {
|
|
181
|
+
"admob": {
|
|
182
|
+
"command": "npx",
|
|
183
|
+
"args": ["-y", "admob-mcp-server"]
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
앱을 재시작하면 채팅 입력창의 tool 메뉴에 admob이 나타납니다.
|
|
190
|
+
|
|
191
|
+
**Cursor** — 같은 `mcpServers` 블록을 `~/.cursor/mcp.json`에 추가하고, **Settings → MCP**에서 admob이 활성화됐는지 확인하세요.
|
|
192
|
+
|
|
193
|
+
**Gemini CLI** — 같은 `mcpServers` 블록을 `~/.gemini/settings.json`에 추가하고, CLI 안에서 `/mcp`로 확인하세요.
|
|
194
|
+
|
|
195
|
+
> [!TIP]
|
|
196
|
+
> 환경변수 로그인을 사용했다면 클라이언트의 `env` 설정으로 변수를 전달하세요 (Claude Code: `--` 앞에 `--env KEY=value` 반복, JSON 설정: `"args"` 옆에 `"env": { ... }` 객체 추가).
|
|
197
|
+
|
|
198
|
+
## 사용해 보기
|
|
199
|
+
|
|
200
|
+
tool을 직접 호출할 필요는 없습니다 — 일상 언어로 물어보면 어시스턴트가 알맞은 tool을 알아서 고릅니다.\
|
|
201
|
+
시작해볼 만한 질문들:
|
|
202
|
+
|
|
203
|
+
- _"지난주 내 앱 수익 얼마야?"_
|
|
204
|
+
- _"이번 달 수익을 나라별·앱별로 쪼개서 보여줘."_
|
|
205
|
+
- _"최근 30일 기준 RPM이 가장 높은 광고 형식은 뭐야?"_
|
|
206
|
+
- _"미디에이션 상태 어때? 광고 소스별 observed eCPM 비교해줘."_
|
|
207
|
+
- _"내 앱이랑 광고 단위 목록 보여줘."_
|
|
208
|
+
- _"게임 앱에 'shop_reward'라는 보상형 광고 단위 만들어줘."_
|
|
209
|
+
|
|
210
|
+
대부분의 클라이언트는 tool을 실행하기 전에 허락을 물어보므로, 특히 쓰기 작업은 승인 없이 실행되지 않습니다.
|
|
211
|
+
|
|
212
|
+
## 설정 옵션
|
|
213
|
+
|
|
214
|
+
모든 설정은 선택 사항입니다 — AdMob 계정이 하나라면 기본값 그대로 동작합니다.
|
|
215
|
+
|
|
216
|
+
### 환경변수
|
|
217
|
+
|
|
218
|
+
| 변수 | 설명 | 기본값 |
|
|
219
|
+
| ------------------------- | ------------------------------------------------------------------------------------- | ------------------------------------- |
|
|
220
|
+
| `ADMOB_ACCOUNT` | 퍼블리셔 ID (`pub-XXXXXXXXXXXXXXXX`). 로그인 계정이 여러 계정에 접근 가능할 때만 필요 | 자동 발견 |
|
|
221
|
+
| `ADMOB_TOOLSETS` | 활성화할 toolset (쉼표 구분) | 전체 |
|
|
222
|
+
| `ADMOB_READ_ONLY` | `true`면 쓰기 tool 제외 | `false` |
|
|
223
|
+
| `ADMOB_CREDENTIALS_DIR` | `oauth_client.json` / `token.json` 디렉토리 | `~/.admob-mcp` |
|
|
224
|
+
| `ADMOB_OAUTH_CLIENT_FILE` | `auth`에서 사용할 OAuth 클라이언트 JSON 경로 | `<credentials dir>/oauth_client.json` |
|
|
225
|
+
| `GOOGLE_CLIENT_ID` | OAuth 클라이언트 ID (환경변수 로그인; `auth`에서 JSON 파일 대신 사용 가능) | — |
|
|
226
|
+
| `GOOGLE_CLIENT_SECRET` | OAuth 클라이언트 시크릿 (환경변수 로그인) | — |
|
|
227
|
+
| `GOOGLE_REFRESH_TOKEN` | OAuth refresh token (환경변수 로그인) | — |
|
|
228
|
+
|
|
229
|
+
### CLI 플래그
|
|
230
|
+
|
|
231
|
+
| 플래그 | 설명 |
|
|
232
|
+
| ---------------------- | ------------------------------------------------------ |
|
|
233
|
+
| `--toolsets <names>` | `ADMOB_TOOLSETS`와 동일, 예: `--toolsets reports,apps` |
|
|
234
|
+
| `--read-only` | `ADMOB_READ_ONLY=true`와 동일 |
|
|
235
|
+
| `--account <pub-id>` | `ADMOB_ACCOUNT`와 동일 |
|
|
236
|
+
| `--client-file <path>` | `ADMOB_OAUTH_CLIENT_FILE`과 동일 (`auth`용) |
|
|
237
|
+
|
|
238
|
+
CLI 플래그가 환경변수보다 우선합니다.\
|
|
239
|
+
플래그는 클라이언트 설정의 명령 뒤에 붙입니다.\
|
|
240
|
+
예: `npx -y admob-mcp-server --read-only`
|
|
241
|
+
|
|
242
|
+
## Tools
|
|
243
|
+
|
|
244
|
+
"tool"은 AI 어시스턴트가 나 대신 호출하는 함수입니다.\
|
|
245
|
+
Tool은 5개 toolset으로 그룹화되며, 기본으로 전체가 활성화되고 `--read-only`를 주면 쓰기 tool이 제외됩니다:
|
|
246
|
+
|
|
247
|
+
| Toolset | 읽기 tool | 쓰기 tool (`--read-only` 시 제외) |
|
|
248
|
+
| ----------- | ------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
249
|
+
| `accounts` | `list_accounts`, `get_account` | — |
|
|
250
|
+
| `apps` | `list_apps` | `create_app` |
|
|
251
|
+
| `adunits` | `list_ad_units` | `create_ad_unit` |
|
|
252
|
+
| `reports` | `generate_network_report`, `generate_mediation_report`, `generate_campaign_report` | — |
|
|
253
|
+
| `mediation` | `list_ad_sources`, `list_adapters`, `list_mediation_groups`, `list_ad_unit_mappings` | `create_mediation_group`, `update_mediation_group`, `create_ad_unit_mapping`, `create_mediation_ab_experiment`, `stop_mediation_ab_experiment` |
|
|
254
|
+
|
|
255
|
+
읽기 tool은 `admob.readonly` / `admob.report` 스코프, 쓰기 tool은 `admob.monetization` 스코프(`auth`가 기본으로 요청)가 필요합니다.
|
|
256
|
+
|
|
257
|
+
### accounts
|
|
258
|
+
|
|
259
|
+
| Tool | 설명 |
|
|
260
|
+
| --------------- | ---------------------------------------------------- |
|
|
261
|
+
| `list_accounts` | 접근 가능한 퍼블리셔 계정 목록 — `pub-...` ID 확인용 |
|
|
262
|
+
| `get_account` | 계정 상세: 퍼블리셔 ID, 리포트 통화, 리포트 시간대 |
|
|
263
|
+
|
|
264
|
+
### apps
|
|
265
|
+
|
|
266
|
+
| Tool | 설명 |
|
|
267
|
+
| ------------ | ------------------------------------------------------------------------------- |
|
|
268
|
+
| `list_apps` | 등록된 앱 목록: 앱 ID, 플랫폼, 스토어 연결·승인 상태 |
|
|
269
|
+
| `create_app` | 앱 생성 — `appStoreId`로 스토어 등록 정보 연결 또는 `displayName`으로 수동 등록 |
|
|
270
|
+
|
|
271
|
+
### adunits
|
|
272
|
+
|
|
273
|
+
| Tool | 설명 |
|
|
274
|
+
| ---------------- | ---------------------------------------------------------------------------------------- |
|
|
275
|
+
| `list_ad_units` | 광고 단위 목록: ID, 형식, 소속 앱 |
|
|
276
|
+
| `create_ad_unit` | 광고 단위 생성 (`appId`, `displayName`, `adFormat`, 선택적 `adTypes` / `rewardSettings`) |
|
|
277
|
+
|
|
278
|
+
### reports
|
|
279
|
+
|
|
280
|
+
모든 리포트 tool은 `startDate` / `endDate`(`YYYY-MM-DD`), `metrics`와 선택적 `dimensions`, `dimensionFilters`, `sortConditions`, `maxReportRows`(기본 1000), `currencyCode`를 받습니다.\
|
|
281
|
+
응답은 평평한 테이블이며 화폐 지표는 micros에서 통화 단위로 환산됩니다.
|
|
282
|
+
|
|
283
|
+
| Tool | 설명 |
|
|
284
|
+
| --------------------------- | ---------------------------------------------------------------------------------- |
|
|
285
|
+
| `generate_network_report` | AdMob 네트워크 성과: 수익, 노출, 클릭, 매치율, RPM 등 |
|
|
286
|
+
| `generate_mediation_report` | 광고 소스별 미디에이션 성과: `AD_SOURCE` / `MEDIATION_GROUP`별 수익, observed eCPM |
|
|
287
|
+
| `generate_campaign_report` | 교차 홍보 캠페인 통계 (최근 30일만): 노출, 클릭, 설치, 비용 |
|
|
288
|
+
|
|
289
|
+
리포트별 유효 dimension/metric은 MCP resource(어시스턴트가 참고할 수 있는 레퍼런스 문서)로 제공됩니다: `admob://reference/network-report-spec`, `mediation-report-spec`, `campaign-report-spec`.
|
|
290
|
+
|
|
291
|
+
### mediation
|
|
292
|
+
|
|
293
|
+
| Tool | 설명 |
|
|
294
|
+
| -------------------------------- | --------------------------------------------------------- |
|
|
295
|
+
| `list_ad_sources` | 사용 가능한 미디에이션 광고 소스(광고 네트워크)와 ID 목록 |
|
|
296
|
+
| `list_adapters` | 광고 소스의 어댑터 목록 (필수 설정 키 포함) |
|
|
297
|
+
| `list_mediation_groups` | 미디에이션 그룹 목록: 타겟팅·라인 정보 (`filter` 지원) |
|
|
298
|
+
| `list_ad_unit_mappings` | 광고 단위에 매핑된 서드파티 지면 목록 |
|
|
299
|
+
| `create_ad_unit_mapping` | 어댑터를 통해 광고 단위를 서드파티 지면에 매핑 |
|
|
300
|
+
| `create_mediation_group` | 미디에이션 그룹 생성 (타겟팅 + 미디에이션 라인) |
|
|
301
|
+
| `update_mediation_group` | `updateMask`로 미디에이션 그룹 부분 수정 |
|
|
302
|
+
| `create_mediation_ab_experiment` | 미디에이션 그룹 A/B 실험 시작 |
|
|
303
|
+
| `stop_mediation_ab_experiment` | 승자 variant를 선택하며 실험 종료 |
|
|
304
|
+
|
|
305
|
+
## Prompts
|
|
306
|
+
|
|
307
|
+
Prompt는 미리 만들어진 분석 요청입니다.\
|
|
308
|
+
클라이언트에서 슬래시 명령이나 prompt 선택기로 나타납니다 (예: Claude Code에서 `/top_performing_apps`).\
|
|
309
|
+
모두 선택적 `days` 인자를 받습니다:
|
|
310
|
+
|
|
311
|
+
| Prompt | 하는 일 |
|
|
312
|
+
| --------------------- | ----------------------------------------------- |
|
|
313
|
+
| `top_performing_apps` | 앱을 수익순으로 랭킹 (RPM·매치율 컨텍스트 포함) |
|
|
314
|
+
| `revenue_summary` | 일별 수익 추이와 이상치 하이라이트 |
|
|
315
|
+
| `compare_ad_formats` | 광고 형식별 수익·효율 비교 |
|
|
316
|
+
|
|
317
|
+
## 보안 & 프라이버시
|
|
318
|
+
|
|
319
|
+
- 서버는 전부 내 컴퓨터에서 실행됩니다.\
|
|
320
|
+
데이터는 내 컴퓨터와 Google API 사이에서만 오가며, 제3자 서버를 거치지 않습니다.
|
|
321
|
+
- 로컬에 저장되는 파일은 두 개뿐이고 둘 다 내 계정만 읽을 수 있습니다: `~/.admob-mcp/oauth_client.json`(내 OAuth 앱), `~/.admob-mcp/token.json`(로그인 정보).
|
|
322
|
+
- **로그아웃하려면**: `~/.admob-mcp/token.json`을 삭제하고, 필요하면 [myaccount.google.com/permissions](https://myaccount.google.com/permissions)에서 앱 접근 권한을 회수하세요.
|
|
323
|
+
- 실수로 뭔가 바뀔까 걱정된다면 `--read-only`로 실행하세요.\
|
|
324
|
+
쓰기 tool이 아예 사라지고 로그인도 읽기 스코프만 요청합니다.
|
|
325
|
+
|
|
326
|
+
## 문제 해결
|
|
327
|
+
|
|
328
|
+
### 설치 · 클라이언트 연결
|
|
329
|
+
|
|
330
|
+
#### `command not found: npx` / `spawn npx ENOENT`
|
|
331
|
+
|
|
332
|
+
- **원인**: Node.js가 설치되지 않았거나 클라이언트가 찾지 못하는 상태입니다.
|
|
333
|
+
- **해결**: [nodejs.org](https://nodejs.org)에서 Node 18+를 설치하고 클라이언트를 재시작하세요.
|
|
334
|
+
|
|
335
|
+
#### 클라이언트에 서버가 안 보임
|
|
336
|
+
|
|
337
|
+
- **원인**: MCP 서버는 클라이언트 시작 시점에 로드되며, 서버가 실행에 실패했을 수도 있습니다.
|
|
338
|
+
- **해결**: 먼저 클라이언트를 재시작하세요.\
|
|
339
|
+
그다음 MCP 상태를 확인하고(Claude Code: `claude mcp list`, Gemini CLI: `/mcp`), 터미널에서 `npx -y admob-mcp-server`가 에러 없이 실행되는지 확인하세요.
|
|
340
|
+
|
|
341
|
+
### 로그인 · 인증
|
|
342
|
+
|
|
343
|
+
#### "No usable Google credentials found"
|
|
344
|
+
|
|
345
|
+
- **원인**: 로그인이 아직 설정되지 않았습니다.
|
|
346
|
+
- **해결**: [2단계 — 로그인](#2단계--로그인)을 따라 하세요.
|
|
347
|
+
|
|
348
|
+
#### `invalid_grant` / "token has been expired or revoked"
|
|
349
|
+
|
|
350
|
+
- **원인**: 로그인이 만료됐습니다.\
|
|
351
|
+
동의 화면이 **테스트(Testing)** 상태면 7일마다 발생합니다.
|
|
352
|
+
- **해결**: `npx admob-mcp-server auth`를 다시 실행하세요.\
|
|
353
|
+
반복을 없애려면 앱을 게시하세요(**대상 → 앱 게시**).
|
|
354
|
+
|
|
355
|
+
#### 브라우저 로그인 중 `access_denied`
|
|
356
|
+
|
|
357
|
+
- **원인**: 선택한 Google 계정이 동의 화면의 테스트 사용자가 아닙니다.
|
|
358
|
+
- **해결**: **대상 → 테스트 사용자**에 추가하거나 앱을 게시하세요.
|
|
359
|
+
|
|
360
|
+
#### "The publisher could not be authenticated"
|
|
361
|
+
|
|
362
|
+
- **원인**: 활성 AdMob 계정이 없는 Google 계정으로 로그인했습니다.
|
|
363
|
+
- **해결**: `npx admob-mcp-server auth`를 다시 실행하고 계정 선택 화면에서 AdMob 계정을 소유한 계정을 고르세요.
|
|
364
|
+
|
|
365
|
+
### API 오류
|
|
366
|
+
|
|
367
|
+
#### 403 `PERMISSION_DENIED`
|
|
368
|
+
|
|
369
|
+
- **원인**: AdMob API 미활성화, 다른 Google 계정으로 로그인, 또는 쓰기 스코프 누락입니다.
|
|
370
|
+
- **해결**: 다음 세 가지를 확인하세요:
|
|
371
|
+
1. OAuth 클라이언트와 같은 프로젝트에서 [AdMob API가 활성화](https://console.cloud.google.com/apis/library/admob.googleapis.com)됐는지
|
|
372
|
+
2. AdMob 계정을 소유한 계정으로 로그인했는지
|
|
373
|
+
3. 쓰기 tool이라면 토큰에 `admob.monetization` 스코프가 있는지 — `auth --read-only`로 만든 토큰은 쓰기 불가, `npx admob-mcp-server auth` 재실행
|
|
374
|
+
|
|
375
|
+
#### 429 `RESOURCE_EXHAUSTED`
|
|
376
|
+
|
|
377
|
+
- **원인**: AdMob API 쿼터 초과입니다 ([사용량 한도](https://developers.google.com/admob/api/limits?hl=ko)).
|
|
378
|
+
- **해결**: 잠시 후 재시도하거나 요청을 줄이세요 — 날짜 범위 축소, dimension 수 감소.
|
|
379
|
+
|
|
380
|
+
#### "Multiple AdMob accounts found"
|
|
381
|
+
|
|
382
|
+
- **원인**: 로그인 계정이 여러 퍼블리셔 계정에 접근할 수 있습니다.
|
|
383
|
+
- **해결**: `ADMOB_ACCOUNT=pub-...`을 설정하세요 (`list_accounts`로 ID 확인).
|
|
384
|
+
|
|
385
|
+
## 개발
|
|
386
|
+
|
|
387
|
+
```bash
|
|
388
|
+
git clone https://github.com/ParkSangGwon/admob-mcp-server.git
|
|
389
|
+
cd admob-mcp-server
|
|
390
|
+
npm install
|
|
391
|
+
npm test
|
|
392
|
+
npm run build
|
|
393
|
+
|
|
394
|
+
# MCP Inspector로 디버깅
|
|
395
|
+
npm run inspect
|
|
396
|
+
```
|
|
397
|
+
|
|
398
|
+
로컬 빌드를 클라이언트에서 쓰려면 npx 대신 빌드된 엔트리를 지정하세요: `node /path/to/admob-mcp-server/dist/index.js`
|
|
399
|
+
|
|
400
|
+
릴리스: `v*` 태그를 push하면 CI가 실행되고 provenance와 함께 npm에 배포됩니다 (`.github/workflows/release.yml` 참고).
|
|
401
|
+
|
|
402
|
+
## 기여
|
|
403
|
+
|
|
404
|
+
이슈와 PR을 환영합니다.\
|
|
405
|
+
큰 변경은 방향 논의를 위해 먼저 이슈를 열어주세요.\
|
|
406
|
+
`npm run lint`, `npm run format:check`, `npm test`가 통과해야 합니다.
|
|
407
|
+
|
|
408
|
+
## 라이선스
|
|
409
|
+
|
|
410
|
+
[MIT](LICENSE)
|