MCP

이미 로그인한 Safari로 이 기기를 자동화하기(macOS만)

macOS에서 이미 로그인한 Safari를 구동해 페이지를 읽고 참조로 클릭·입력하려는 사람을 위한 것이다. 전제는 Node.js 20+와 Safari 개발자 기능 및 Apple Events를 켜는 것이다.

Official source · safari-mcp

Install

npx safari-mcp

누구에게 맞나

이미 열어 두고 이미 로그인한 Safari 안에서 도우미가 먼저 페이지를 분명히 보고, 그다음 참조로 클릭하거나 채우게 하려면 이 경로가 맞다. 구동하는 것은 macOS에 딸린 안정판 Safari이며, 따로 띄운 깨끗한 격리 브라우저가 아니다. 단단한 전제: 기기는 macOS여야 하고 이 기기에 Node.js 20+가 이미 설치되어 있어야 한다. Windows 또는 Linux에는 기존 설명에 쓸 수 있는 단계가 없다.

저장소는 스스로를 「이미 로그인한 Gmail, GitHub, Ahrefs, Slack, 인터넷뱅킹 세션을 계속 쓰는」 선에 두고, 네이티브 WebKit과 백그라운드 실행을 언급한다. 도우미는 빈 데모 세션이 아니라 실제 로그인 상태를 만난다. 호출하는 사람은 그 탭에 이미 나타난 내용을 봐도 된다고 여겨진다.

격리 환경에서 페이지만 한 번 누르고 싶거나 도우미에게 실제 계정을 보이고 싶지 않은 사람에게는 맞지 않는다. 애플이 아닌 시스템에도 두 번째 설치 길은 없다. 목표가 「새롭고, 로그아웃되어 있으며, 쓰고 버리는 세션」이라면 기존 설명이 쓰는 것은 이 경로가 아니다.

3분 만에 첫 시도

공식 주 경로는 하나뿐이다. 전제를 충족한 Mac에서 실행한다

npx safari-mcp

저장소는 먼저 전역 설치를 할 필요가 없다고 쓴다. 선택적 영구 설치는 npm install -g safari-mcp다. 첫 시도에서는 그 길을 가지 마라.

시작 전에 이 네 가지를 대조한다. 시스템은 Safari가 있는 임의의 macOS; Node.js는 20 이상; Safari에서 Settings → Advanced → Show features for web developers를 켠다; 그다음 Develop → Allow JavaScript from Apple Events를 켠다. 하나라도 빠지면 이후 호출에 근거가 없다.

설정 위치는 이 시작 명령 자체다. MCP 호스트에 넘겨 서비스를 띄운다. 기존 설명은 특정 클라이언트의 JSON 필드 이름을 주지 않았으므로 여기서 설정 템플릿을 보태지 않고 추가 시작 인자도 만들지 않는다.

처음에는 관찰만 한다. safari_snapshot을 호출해 현재 페이지의 accessibility tree를 읽는다. 성공 신호는 페이지 상태가 반환되는 것이며 오류나 빈 트리가 아니다. 이번 읽기는 보고 있는 실제 페이지 구조를 본다. 로그인한 사이트의 보이는 컨트롤도 포함한다. 위험이 0이 아니며 「로컬을 읽지 않고 네트워크를 건드리지 않는다」로 이해하면 안 된다.

같은 기기에서 여러 도우미가 동시에 Safari를 쓰면 설명의 공유 방식은:

SAFARI_MCP_HTTP=1 SAFARI_MCP_HTTP_PORT=9225 npx safari-mcp

혼자 처음 써 볼 때는 이 항목을 켤 필요가 없다.

사용 사례

사례 1: 현재 탭을 본 뒤 다음을 정한다. 이미 열린 Safari 페이지에 safari_snapshot을 호출해 accessibility tree와 페이지 상태를 받는다. 설명은 이를 권장 워크플로의 첫 단계로 두고 목적은 Get page state다. 어느 페이지에 멈췄는지, 어떤 컨트롤을 참조할 수 있는지 확인하는 데 맞다. 반환 필드의 완전한 구조는 펼쳐져 있지 않다. 확인할 수 있는 것은 페이지 상태와 accessibility tree를 받을 수 있다는 것뿐이다. 이 단계를 탐색이나 페이지 변경으로 이해하지 마라. 기존 설명에 탐색류 명령은 없다.

사례 2: 참조로 한 번 상호작용하고 다시 읽는다. 두 번째는 safari_click/fill/...로 ref에 따라 클릭하거나 채운다. 세 번째는 safari_snapshot을 다시 실행해 결과를 대조한다. 사례 1의 ref가 먼저 있어야 한다. 좌표를 허공에서 누르지 마라. 클릭과 입력은 페이지를 바꾸며 부작용이 있다. 손대기 전에 확인점을 정한다——두 번째 snapshot에서 해당 컨트롤이나 문구가 예상대로 변했는지. 도구 이름은 safari_click/fill/...로 쓰여 있고 나머지 상호작용 이름은 조목조목 없다. 나타나지 않은 명령을 보태지 마라.

사용 한계

macOS만 덮는다. Node.js 20+여야 하고 Safari 개발자 기능과 Apple Events의 JavaScript를 켜야 한다. 서비스가 여는 것은 이미 로그인한 안정판 Safari다. 메일, 코드 호스팅, 분석 백엔드, 메신저, 인터넷뱅킹 세션이 도우미 시야에 들어올 수 있다. 네트워크 격리나 로컬 읽기 전용 샌드박스가 있다고 가정하지 마라.

동시에는 SAFARI_MCP_HTTP=1로 데몬을 공유한다. 설명은 탭 추적이 실패하면 닫힌다고 쓰며, 쓰고 있는 활성 탭을 치지 않는다고 한다. 실패 코드, 실행 취소 단계, safari_snapshot과 safari_click/fill 밖의 도구 매개변수는 기존 설명에 없다. 백그라운드 실행과 더 낮은 CPU는 저장소 자신의 대비 말이지 이 기기에 대한 보장이 아니다. 처음이 snapshot만 하더라도 실제 페이지를 읽는 것이다. 먼저 인터넷뱅킹이나 노출하지 않으려는 탭을 피해라.