Zeph Docs
MCP 서버

도구와 리소스

Zeph MCP 서버가 노출하는 모든 도구의 파라미터와 반환 형태.

푸시 제목에는 프로젝트 디렉터리 이름이 자동으로 붙는다 — myapp · Build complete — 그래서 여러 세션이 동시에 푸시해도 폰 피드를 훑어보기 좋다.

단방향 도구

zeph_notify

단방향 푸시 알림을 보낸다. URL을 넣으면 푸시 유형이 link로 자동 전환된다.

title:          "Build complete"
body:           "All 42 tests passed"
url:            "https://github.com/org/repo/actions/runs/123"  (선택)
priority:       "low" | "normal" | "high" | "urgent"
targetDeviceId: "dev_..."  (선택, ZEPH_DEVICE_ID를 덮는다)

zeph_clipboard

사용자 디바이스의 클립보드로 텍스트를 복사한다.

text:           "npm install @zeph-to/mcp-server"
targetDeviceId: "dev_..."  (선택)

zeph_file

사용자 디바이스로 파일을 보낸다. 디스크에 이미 있는 파일이면 filePath, 생성한 텍스트면 content 중 하나가 필요하다.

filePath:       "/abs/path/screenshot.png"  (이미지·PDF·로그 등 디스크의 모든 것)
content:        "{\"status\": \"ok\"}"       (텍스트 전용; fileName 필요)
fileName:       "report.json"               (content와 함께 필수; 없으면 filePath의 basename)
title:          "Build Report"              (선택, 없으면 fileName)
targetDeviceId: "dev_..."                   (선택)

이미지는 실제 mime 타입으로 전달돼 디바이스에서 인라인으로 렌더된다. 바이너리 파일을 base64로 만들어 content에 넣지 말 것 — filePath를 넘기면 서버가 디스크에서 바이트를 읽는다.

{ pushId: "...", fileKey: "...", fileSize: 42 }를 반환한다.

zeph_broadcast

채널 구독자 전원에게 알림을 보낸다.

channelId: "ch_..."
title:     "Deploy complete"
body:      "v2.1.0 is live"
url:       "https://..."  (선택)
priority:  "normal"

대화형 도구

아래 셋은 사용자가 응답하거나 타임아웃이 될 때까지 블로킹하며, 전부 ZEPH_HOOK_ID가 필요하다.

zeph_ask

빠른 응답 버튼과 텍스트 입력창을 한 알림에 함께 담아 질문한다.

title:       "What should we do?"
body:        "3 tests failed in auth module"  (선택)
actions:     [{ id: "fix", label: "Fix now", style: "primary" },
              { id: "skip", label: "Skip", style: "secondary" }]  (선택, 1-4개)
placeholder: "Or type a custom response..."  (선택)
inputType:   "text" | "multiline"  (기본값: text)
timeout:     120    (초, 기본값 120, 최대 600)
fallback:    "skip" (타임아웃 시 자동 선택, 선택)

{ actionId: "fix", timedOut: false } 또는 { value: "custom text", timedOut: false }를 반환한다.

사용자는 답에 스크린샷이나 파일을 첨부할 수도 있다. 첨부는 ~/.zeph/attachments/hook-<eventId>/로 내려받아지고, 결과에 로컬 절대 경로 배열 attachments가 버튼이나 텍스트와 함께 실린다:

{ value: "look at this", attachments: ["/Users/you/.zeph/attachments/hook-hevt_1/screen.png"],
  attachmentsNote: "The user attached 1 file(s) to this answer. Read each path above to see them.",
  timedOut: false }

그 경로들을 읽는 것까지가 답을 읽는 것이다. hook 첨부는 종단간 암호화되지 않는다 — hook 경로가 발신자 키를 실어 나르지 않으므로, 질문 자체와 같은 한계다.

zeph_prompt

2~4개 선택지 중에서 고르게 한다.

title:    "Deploy to production?"
body:     "3 migrations pending"
actions:  [{ id: "yes", label: "Deploy", style: "primary" },
           { id: "no",  label: "Cancel", style: "danger" }]
timeout:  120        (초, 기본값 120, 최대 300)
fallback: "no"       (타임아웃 시 자동 선택, 선택)

{ actionId: "yes", timedOut: false }를 반환한다.

zeph_input

자유 형식 텍스트 입력을 요청한다.

title:       "Commit message"
body:        "Summarize the changes"
placeholder: "feat: ..."
inputType:   "text" | "password" | "multiline"
timeout:     120    (초, 기본값 120, 최대 600)

{ value: "feat: add clipboard sync", timedOut: false }를 반환하며, 사용자가 파일을 첨부하면 zeph_ask와 똑같이 attachments가 함께 온다.

클라이언트 타임아웃

zeph_ask·zeph_prompt·zeph_input은 사용자가 응답할 때까지, 최대 600초의 timeout까지 블로킹한다. ZEPH_WS_URL이 설정돼 있으면 제출 즉시 WebSocket으로 응답이 오고, 아니면 서버가 폴링한다. 어느 쪽이든 MCP 요청은 그동안 계속 열려 있다.

클라이언트가 먼저 포기하지 않도록 서버는 대기 중 5초마다 notifications/progress를 보낸다. 클라이언트는 요청별 타임아웃을 도구의 timeout보다 크게 잡거나, progress 알림마다 타임아웃을 재설정해야 한다. Claude Code는 기본적으로 후자를 한다.

관리용 도구

zeph_list

최근 푸시 알림을 나열한다.

limit: 5         (1-20, 기본값 5)
type:  "note"    (선택 필터: note, link, file, clipboard, hook)

{ pushes: [...], total: 5, hasMore: true }를 반환한다.

zeph_dismiss

특정 푸시를 읽음으로 표시한다.

pushId: "push_01HX..."

zeph_dismiss_all

모든 알림을 한 번에 지운다. 파라미터 없음. { dismissed: 12, badge: 0 }을 반환한다.

zeph_session_rename

Zeph 앱의 Streams → Agents에 표시될 현재 에이전트 세션의 이름을 설정한다. 에이전트가 지금 무슨 일을 하는지 스스로 이름 붙일 수 있게 해준다 — "Prod deploy", "Auth refactor" — 그래서 병렬 세션을 폰에서 구별하기 쉬워진다.

이 서버가 도는 세션의 이름을 바꾸며, listener 디바이스 id와 tmux 세션 이름으로 대상을 정한다. 이름은 바꿀 때까지 유지된다.

alias: "Prod deploy watcher"   (1-60자)

{ renamed: true, session: "zeph-myapp", alias: "Prod deploy watcher" }를 반환하거나, 이름을 바꿀 활성 세션이 없을 때 — 즉 zeph listener tmux 세션 안에서 돌고 있지 않을 때 — { renamed: false, reason: "..." }를 반환한다.

리소스

zeph://devices

연결된 디바이스와 온라인 상태를 나열한다. 어떤 디바이스가 알림을 받을지 확인할 때 쓴다.

zeph://channels

사용자가 소유하거나 구독한 채널을 나열한다. zeph_broadcast에 쓸 channelId를 찾을 때 쓴다.

이 페이지에서