# OAuth 동의와 앱별 권한

> Pumati OAuth 동의 화면에서 고르는 것, 앱별 읽기·작성·게시 권한, 연결 철회 방법.

클라이언트가 연결하면 pumati.app에 클라이언트 이름과 돌아갈 곳(Claude Code·Codex·Cursor는 내 컴퓨터에서 실행 중인 프로그램, claude.ai·ChatGPT는 각자의 사이트)이 적힌 동의 화면이 열려요. 요청은 15분 동안 유효해요. 여기서 고르는 것:

- **앱마다 허용할 권한.** 고르지 않은 앱은 목록에 나오지 않고 이 연결로 쓸 수 없어요.
- **새 앱을 만들어도 되는지**와 새 앱에 줄 권한. 만들려면 작성 권한이 필요해요.
- **지출 한도**(크레딧, [지출 한도](https://pumati.app/ko/developers/spend-limit.md)).

## 권한

| 권한 | 할 수 있는 일 |
| --- | --- |
| `read` 읽기 | `list_apps`, `list_app_tests`, `get_test`, `wait_for_updates`, `list_feedback`, `get_feedback`: 미션, 결과, 피드백 조회 |
| `write` 작성 | `upsert_app`(이름 바꾸기), `register_build`, `create_test`, `create_comparison`, `update_test`, `record_resolution`, `create_retest`: 초안과 기록, 지출 없음 |
| `publish` 게시 | `publish_test`, `adjust_test`, `cancel_test`: 크레딧을 예약하거나 돌려받고 모집을 시작·변경·종료. `review_feedback`: 제출물 판정(승인하면 보상 지급) |

작성과 게시에는 항상 읽기가 함께 들어가요. 무언가를 바꾸는 에이전트는 바꾼 결과를 볼 수 있어야 해요.

## 토큰 권한

클라이언트는 OAuth 요청에서 더 좁은 권한(`read`, `write`, `publish`)만 요청할 수도 있어요. 토큰과 앱 허용 범위에 모두 있는 권한만 쓸 수 있고, 아니면 `FORBIDDEN`이에요. 연결은 자기 앱만 볼 수 있어요. 허용 범위에 없는 앱과 그 앱의 미션·피드백은 없는 것과 똑같이 `NOT_FOUND`예요.

## 철회

[pumati.app/dev/mcp](https://pumati.app/dev/mcp)에 내 연결과 앱, 권한, 지출이 나와요. 철회하면 다음 호출부터 `FORBIDDEN`이에요. 도구를 부를 때마다 허용 범위를 다시 읽으니 남아 있는 접근이 없어요.
