반응형

이 글은 WebKit 공식 글을 바탕으로 핵심 내용과 설정 방법을 한국어로 다시 구성한 해설이다.
원문 전체를 옮긴 번역문은 아니다.

Safari MCP 서버란?

Safari MCP 서버는 Safari와 MCP(Model Context Protocol) 호환 클라이언트를 연결하는 로컬 서버다. 코드를 작성하는 에이전트가 브라우저 바깥에서 추측만 하는 것이 아니라, Safari 창에서 페이지가 실제로 어떻게 렌더링되고 작동하는지 확인할 수 있게 한다.

특정 에이전트에 종속된 기능은 아니다. MCP를 지원하는 클라이언트라면 연결할 수 있으며, 연결된 에이전트는 Safari 탭의 페이지 콘텐츠와 상태를 조사해 더 많은 디버깅 과정을 스스로 수행할 수 있다.

기존에는 브라우저에서 문제를 발견한 뒤 콘솔과 스타일 패널을 확인하고, 코드 편집기로 돌아가 수정한 다음 다시 브라우저에서 검증하는 과정을 반복해야 했다. AI 에이전트를 사용하더라도 화면을 캡처하고 증상을 설명한 뒤 결과를 다시 확인하는 과정이 필요했다. Safari MCP 서버의 핵심은 이 반복 과정에서 에이전트가 브라우저 상태를 직접 조사하게 만드는 데 있다.

어떤 작업에 활용할 수 있나?

Safari에서 렌더링 결과 확인

에이전트가 작성하거나 수정한 코드가 Safari에서 실제로 어떻게 보이는지 직접 확인할 수 있다. 코드만 보고 렌더링 결과를 추정하는 것보다 브라우저의 DOM과 화면 상태를 함께 확인할 수 있다는 점이 중요하다.

Safari 호환성 점검

한 브라우저에서만 테스트하면 다른 브라우저에서 발생하는 문제를 놓칠 수 있다. 에이전트는 Safari에서 사이트를 열고 계산된 스타일(computed style)과 레이아웃을 조사한 뒤 예상 결과와 비교할 수 있다. 개발자가 브라우저와 터미널 사이를 계속 오가지 않아도 Safari 전용 문제를 찾는 데 필요한 정보를 수집할 수 있다.

성능 분석

페이지 안에서 JavaScript를 실행해 Navigation Timing이나 리소스 로딩 시간 같은 성능 정보를 확인할 수 있다. 이를 통해 느린 구간을 찾고, 어떤 부분을 우선 수정해야 하는지 판단하는 데 활용할 수 있다.

접근성 점검

레이블 누락, 잘못된 ARIA 속성, 낮은 색상 대비처럼 자주 발생하는 접근성 문제를 조사할 수 있다. 자동 점검만으로 모든 접근성 문제를 판정할 수 있는 것은 아니지만, 사용자에게 영향을 주는 기본적인 문제를 일찍 발견하는 데 도움이 된다.

사용자 상태와 상호작용 검증

폼의 현재 상태를 읽고, CSS 선택자로 요소를 찾고, 특정 상호작용이 정상적으로 수행됐는지 확인할 수 있다. 체크아웃 흐름의 여러 단계처럼 상태가 바뀌는 화면도 조사할 수 있어 반복적인 수동 확인을 줄이는 데 활용할 수 있다.

제공되는 도구

Safari MCP 서버는 탭 관리, 페이지 조사, 네트워크·콘솔 확인, 화면 캡처, DOM 상호작용을 위한 도구를 제공한다.

도구 역할
browser_console_messages 현재 탭 또는 지정한 탭에 버퍼링된 콘솔 로그를 반환한다.
browser_dialogs 브라우저 대화상자를 나열하고 확인·취소하거나 JavaScript prompt에 텍스트를 입력한다.
close_tab 탭 핸들을 사용해 브라우저 탭을 닫는다.
create_tab 새 탭을 만들고 필요하면 URL을 함께 연다.
evaluate_javascript 페이지 안에서 JavaScript를 실행하고 결과를 반환한다.
get_network_request 하나의 네트워크 요청에 대한 헤더, 본문, 타이밍 등 상세 정보를 가져온다.
get_page_content 페이지 콘텐츠를 Markdown, HTML, JSON 등의 형식으로 추출한다.
list_network_requests 현재 탭에서 기록된 요청의 URL, 메서드, 상태, 타이밍 요약을 나열한다.
list_tabs 열려 있는 탭의 핸들과 URL을 나열한다.
navigate_to_url 지정한 URL로 이동하고 로드된 페이지 콘텐츠를 반환한다.
page_info 현재 페이지의 URL, 제목, 로딩 상태를 확인한다.
page_interactions 클릭, 입력, 스크롤, 호버, 키 입력 등의 DOM 상호작용을 순서대로 수행한다.
screenshot 현재 페이지를 PNG 이미지로 캡처한다.
set_emulated_media 인쇄용처럼 특정 CSS 미디어 유형을 에뮬레이션한다.
set_viewport_size 브라우저 뷰포트를 CSS 픽셀 단위로 설정한다.
switch_tab 탭 핸들을 지정해 다른 탭으로 전환한다.
wait_for_navigation 현재 페이지의 탐색이 끝날 때까지 기다린 뒤 최종 URL과 제목을 반환한다.

 

이 도구들을 조합하면 에이전트가 오류 메시지만 받는 수준을 넘어 페이지의 구조, 화면, 요청, 로그를 함께 살펴볼 수 있다.

개발자가 브라우저에서 본 현상을 프롬프트로 세세하게 옮기지 않아도 에이전트가 필요한 정보를 직접 찾을 수 있게 되는 셈이다.

시작하기 전에 Safari 설정하기

먼저 Safari Technology Preview를 설치한다. 설치 후 다음 옵션을 켜야 한다.

  1. Safari 설정 → 고급 → 웹 개발자를 위한 기능 보기를 활성화한다.
  2. Safari 설정 → 개발자 → 원격 자동화 및 외부 에이전트 활성화를 켠다.

Safari 27을 사용한다면 시스템에 포함된 /usr/bin/safaridriver를 사용하고, Safari Technology Preview를 사용한다면 해당 앱 내부의 safaridriver를 사용한다.

Claude에 연결하기

Safari Technology Preview를 연결하는 명령은 다음과 같다.

claude mcp add safari-mcp-stp -- "/Applications/Safari Technology Preview.app/Contents/MacOS/safaridriver" --mcp

Safari 27을 연결할 때는 다음 명령을 사용한다.

claude mcp add safari-mcp -- "/usr/bin/safaridriver" --mcp

Codex에 연결하기

Safari Technology Preview를 연결하는 명령은 다음과 같다.

codex mcp add safari-mcp-stp -- "/Applications/Safari Technology Preview.app/Contents/MacOS/safaridriver" --mcp

Safari 27을 연결할 때는 다음 명령을 사용한다.

codex mcp add safari-mcp -- "/usr/bin/safaridriver" --mcp

다른 MCP 클라이언트에 연결하기

다른 에이전트에서는 mcp.json 또는 config.json에 서버 설정을 추가할 수 있다.

Safari Technology Preview 설정:

"safari-mcp-stp": {
  "command": "/Applications/Safari Technology Preview.app/Contents/MacOS/safaridriver",
  "args": ["--mcp"]
}

Safari 27 설정:

"safari-mcp": {
  "command": "/usr/bin/safaridriver",
  "args": ["--mcp"]
}

서버 이름은 예시처럼 safari-mcp-stp로 고정할 필요가 없다. 클라이언트 설정에 맞게 safari처럼 원하는 이름을 사용할 수 있다.

에이전트에는 어떻게 요청하면 되나?

설정이 끝나면 복잡하게 도구 사용을 지시하기보다 다음과 같이 목적을 바로 요청할 수 있다.

  • Safari에서 내 사이트의 버그를 찾아줘.
  • Safari에서 이 사이트의 접근성을 점검해줘.
  • Safari에서 웹사이트 성능을 확인해줘.

에이전트마다 동작 방식은 다르지만, 원문에서는 Safari MCP 서버를 사용하라고 매번 명시하지 않아도 에이전트가 필요한 도구를 판단할 수 있다고 설명한다. 초기 요청을 받은 에이전트가 Safari에서 문제를 조사하고, 발견한 여러 오류와 추가 확인 사항을 사용자에게 제안하는 흐름이다.

로컬에서 실행되지만 데이터 전달 경로는 확인해야 한다

Safari MCP 서버 자체는 로컬 컴퓨터에서만 실행되며 자체적으로 네트워크 요청을 만들지 않는다. Safari의 AutoFill이나 다른 브라우저 활동 같은 개인 정보에도 접근하지 않는다.

다만 서버가 수집한 페이지 콘텐츠, 스크린샷, 콘솔 로그는 현재 사용 중인 에이전트로 직접 전달된다. Apple로 전송되는 것은 아니지만, 그 이후 데이터를 어떻게 처리하는지는 연결한 에이전트와 AI 모델의 정책에 달려 있다. 브라우저 접근 권한을 주는 다른 도구와 마찬가지로 신뢰할 수 있는 에이전트만 연결하고, 민감한 페이지를 다룰 때는 전송 범위를 확인해야 한다.

왜 이 기능을 만들었나?

WebKit 팀은 AI 사용 여부와 관계없이 웹을 만드는 방법은 다양하다고 전제한다. AI가 개발 과정에 포함돼 있다면 Safari MCP 서버가 생산성을 높이고, AI를 사용하지 않는다면 기존 방식도 여전히 유효하다는 입장이다.

이 기능의 목표는 에이전트가 Safari에서 페이지가 어떻게 보이고 작동하는지 이해하게 해 Safari 테스트와 디버깅의 진입 장벽을 낮추는 것이다. 결국 중요한 변화는 에이전트가 코드를 수정하는 데서 그치지 않고 실제 브라우저의 결과까지 확인할 수 있게 됐다는 점이다.

정리

Safari MCP 서버는 AI 에이전트와 Safari의 실제 실행 상태 사이를 연결한다. DOM, 네트워크 요청, 콘솔 로그, 스크린샷, 사용자 상호작용을 에이전트가 직접 조사할 수 있어 Safari 호환성, 성능, 접근성, 화면 상태를 확인하는 반복 작업을 줄일 수 있다.

사용 전에는 Safari의 웹 개발 기능과 외부 에이전트용 원격 자동화를 활성화해야 한다. 또한 서버는 로컬에서 동작하지만 수집된 브라우저 데이터가 연결한 에이전트와 모델로 전달된다는 점도 함께 확인해야 한다.

참고로 Chrome DevTools MCP도 있다

참고로 Google도 Chrome DevTools MCP를 제공한다. AI 코딩 에이전트를 Chrome DevTools에 연결해 페이지 디버깅, 네트워크·콘솔 오류 확인, 사용자 흐름 재현, 성능 추적 등을 수행할 수 있게 해주는 MCP 서버다. Safari MCP와 함께 브라우저별 동작을 직접 확인하는 용도로 참고할 수 있다.

참고 자료

반응형
반응형

OpenClaw와 Hermes Agent는 모델과 도구, 메모리, 스킬을 연결해 사용하는 self-hosted AI 에이전트다. 둘 다 비슷한 기능을 제공하지만, 어디에 무게를 두는지는 조금 다르다. OpenClaw는 여러 메시징 채널과 기기를 연결하는 구조가 눈에 띄고, Hermes는 에이전트가 도구를 사용해 실제 작업을 이어가는 흐름이 잘 보인다.

OpenClaw를 먼저 사용하다 Hermes로 옮긴 경험을 바탕으로 두 도구의 차이를 정리해봤다.

이 글은 2026년 7월 19일 공식 문서를 기준으로 정리했다. 두 프로젝트 모두 빠르게 바뀌고 있어 실제 설치 전에는 최신 문서를 다시 확인하는 편이 좋다.

OpenClaw의 Gateway 구조와 Hermes Agent의 도구·메모리·스킬 구조를 비교한 대표 이미지
OpenClaw의 연결 구조와 Hermes의 작업 실행 흐름 비교

먼저 한눈에 비교하면

비교 항목 OpenClaw Hermes Agent
중심 성격 채널·기기·에이전트 연결 작업 실행·메모리·스킬
설치 Node.js·onboarding installer·기능별 설정
Codex OAuth·Codex app-server OAuth·AIAgent loop
메모리 Markdown·하이브리드 검색 핵심 메모리·세션 검색
스킬 ClawHub·Skill Workshop agent-managed skill
멀티에이전트 agent 격리·채널 연결 child agent 위임·profile
메시징 다중 채널·계정·기기 다중 gateway adapter
자동화 cron·heartbeat·hook cron·script·watchdog
UI CLI·Control UI·앱·모바일 CLI·TUI·Desktop·Dashboard
잘 맞는 경우 다채널·다기기 운영 반복 작업·작업 방식 축적

표에서는 차이를 짧게 보여주기 위해 특징을 단순화했다. OpenClaw에도 작업 도구와 subagent가 있고, Hermes에도 메시징 Gateway가 있다. 어느 한쪽에만 특정 기능이 있다는 뜻은 아니다.

OpenClaw는 어떤 도구인가

OpenClaw를 이해할 때는 Gateway를 먼저 보면 쉽다. 여기서 Gateway는 WhatsApp, Telegram, Slack 같은 메시징 채널과 에이전트, 기기를 연결하는 중간 서버라고 보면 된다.

예를 들어 업무용 Slack은 업무 에이전트로 보내고, 개인 Telegram은 개인 에이전트로 보내는 식으로 나눌 수 있다. 에이전트마다 작업 폴더와 인증 정보, 대화 기록도 따로 관리할 수 있다. macOS 앱, Windows Hub와 모바일 node도 제공한다.

OpenClaw에는 도구와 메모리, 스킬도 있다. 기억은 MEMORY.md와 날짜별 Markdown 파일에 저장하고, 필요할 때 검색한다. 스킬은 ClawHub에서 설치하거나 Skill Workshop을 통해 검토할 수 있다.

장점은 여러 채널과 기기, 여러 에이전트를 한곳에서 관리하기 좋다는 점이다. 반대로 로컬에서 에이전트 하나만 간단히 사용하려는 경우에는 Gateway, pairing, binding처럼 처음 알아야 할 개념이 조금 많게 느껴질 수 있다.

Hermes Agent는 어떤 도구인가

Hermes는 에이전트가 도구를 사용해 작업하는 흐름이 좀 더 앞에 보였다. 터미널에서 바로 시작할 수 있고, 필요하면 Desktop이나 Dashboard, Slack 같은 메시징 환경을 추가할 수 있다.

메모리의 역할도 비교적 단순하다. 자주 기억해야 하는 환경 정보와 사용자 선호는 작은 메모리에 저장한다. 긴 대화는 필요할 때 검색하고, 반복해서 사용할 작업 절차는 스킬로 따로 남긴다.

복잡한 작업은 child agent에 나눠 맡길 수 있다. 각 child agent는 별도의 대화 맥락과 터미널에서 작업하고, 마지막 결과만 부모 에이전트에 전달한다. 용도별로 설정과 메모리까지 나누고 싶다면 profile을 사용할 수 있다.

설치 이후에는 모델은 hermes model, 도구는 hermes tools, 메시징은 hermes gateway setup, 문제 확인은 hermes doctor처럼 목적별 명령을 사용할 수 있다.

다만 Hermes도 기능을 많이 붙이면 설정이 늘어난다. 브라우저 자동화나 메시징, 외부 서비스를 함께 사용하려면 인증 정보와 권한을 직접 관리해야 한다. 메모리와 스킬에 잘못된 내용이 쌓이지 않았는지도 가끔 확인하는 편이 좋다.

같은 Codex를 써도 결과가 다른 이유

두 도구 모두 Codex OAuth를 지원하지만, Codex를 사용하는 방식까지 똑같지는 않다. OpenClaw는 조건에 따라 Codex app-server를 에이전트 실행 환경으로 사용할 수 있다. Hermes는 자체 AIAgent가 Codex를 호출하고 도구 사용과 작업 반복을 관리한다.

쉽게 말하면 두 도구가 같은 엔진을 사용하더라도, 엔진에 일을 시키는 방식은 다를 수 있다는 뜻이다. 어떤 지시문을 함께 보내는지, 어떤 도구를 보여주는지, 실패했을 때 다시 시도하는지에 따라 결과가 달라질 수 있다.

OpenClaw에서 Hermes로 바꾸며 느낀 점

내 환경에서는 Hermes를 구축하는 과정이 조금 더 수월했다. 특히 같은 Codex를 연결했을 때도 Hermes가 내가 요청한 동작과 완료 조건을 더 잘 따라간다는 인상을 받았다.

다만 OpenClaw를 사용하면서 에이전트와 스킬 활용법을 먼저 익힌 영향도 있었을 것이다. 동일한 과제와 설정으로 반복 측정한 결과가 아니므로, 제품 자체의 차이라기보다 개인적인 사용 경험으로 보는 편이 맞다.

어떤 도구를 선택하면 좋을까

여러 메시징 채널과 계정, 모바일 기기를 연결하고 싶다면 OpenClaw를 먼저 살펴볼 만하다. 여러 에이전트를 채널별로 나눠 운영하는 구조도 잘 갖춰져 있다.

반대로 터미널이나 개발 환경에서 에이전트에게 파일, 코드, 조사 같은 작업을 맡기고 싶다면 Hermes가 잘 맞을 수 있다. 반복 작업을 스킬로 남기고 사용자 선호를 계속 반영하려는 경우에도 편하다.

이미 한쪽을 안정적으로 사용하고 있다면 기능표만 보고 바로 바꿀 필요는 없다. 작은 실제 작업을 같은 모델로 각각 실행해보고, 어느 쪽이 원하는 과정을 더 잘 따라가는지 확인하는 편이 낫다.

결론

OpenClaw와 Hermes Agent는 기능이 많이 겹치지만 시작점이 조금 다르다. OpenClaw는 여러 채널과 기기를 연결하는 데 강점이 있고, Hermes는 에이전트가 도구를 사용해 작업을 이어가고 그 방식을 메모리와 스킬로 남기는 흐름이 편하다.

어느 도구가 항상 더 좋다고 보기는 어렵다. 필요한 채널과 작업 방식에 맞춰 선택하면 된다.

참고 자료

반응형
반응형

ChatGPT 활용 관련 강의를 듣다가, 강사님이 아래 툴을 써서 UI를 만드시는 것을 보았다.

Flutter로 만들어진 노코드 UI 개발 툴이라고 하고, 드래그 드롭 방식으로 화면을 구현한다.

나중에 간단한 화면 코드짜기 귀찮으면 활용해봐도 괜찮을 것 같다.

예시 이미지 이쁘다. 하지만 예쁘고 심플한 UI가 간단히 뚝딱 될리가 없다는 것을 알고있지...

 

 

 

FlutterFlow - Build beautiful, modern apps incredibly fast

FlutterFlow lets you build apps incredibly fast in your browser. Build fully functional apps with Firebase integration, API support, animations, and more. Export your code or even easier deploy directly to the app stores!

flutterflow.io

 

로직도 이렇게 짤 수 있나보다.

 

반응형
반응형

우리 부서의 스파게티 코드를 볼 때마다 생각했던
내가 안좋은 부서에 들어왔나?
내가 운이 나쁜가?
하는 생각.
일반적인 일이었나보다...

특히 2번의 그림이 너무 맘에 들고 공감간다 ㅋㅋㅋ

 

10 hard-to-swallow truths they won't tell you about software engineer job

Last weekend I had a chance to talk with some students who just got their degree. They are pursuing their first software engineer job. In conversation with them, I learned that they have a pretty wrong perception of this job. This is because the reality fo

www.mensurdurakovic.com

 

반응형
반응형

클라이언트와 서버간의 응답 형식에 대한 규약을 명확히 하고, 해당 형식에 맞게 dataType을 지정해주자!

 

회사 프로젝트 기존 코드를 유지보수 하던 도중,
POST API를 호출하고 정상적으로 저장되면서 201 status로 상태코드도 성공했다고 응답이 왔는데
자꾸 프론트엔드 코드에서는 fail 콜백 함수가 호출되고 그 내부에서 처리되는 현상이 발생했다.
도대체 200대의 성공 상태코드가 오는데 왜 fail이 호출되는거지?

 

열심히 구글링을 해본 결과 나와 같은 문제를 겪은 스택오버플로우 글을 발견했다.

 

Callback success is not called with 201 status code

I work with API Rest. I would like created a ressource with AJAX and JQuery. My ressource is created correctly but the error callback is called. My code is : $.ajax({ url: "/api/skills.json",...

stackoverflow.com

즉, 응답에 빈 구문이 오는데 JSON으로 파싱하려고 시도하다가 안되니 fail 콜백이 호출되었다는 말이다.

나의 경우에도 이 경우와 동일하게 응답으로는 빈 구문을 받았는데, dataType을 지정해주지 않아서 fail 콜백이 호출되었다.

 

DataType이란?

api를 호출할 때 일반적으로 다음과 같은 형태로 호출하는데

$.ajax({
      type: 'POST',
      url: url,
      data: data,
      success: success,
      dataType: dataType
});

이 때 서버로부터 어떤 타입을 받을 것인지를 나타내는 속성이 dataType이다.

dataType은 'text', 'json', 'xml' 등 MIME 타입을 지정할 수 있고

선택적인 옵션이기 때문에 지정하지 않았을 경우 jQuery가 자동으로 결정한다.

 

  • xml - XML문서
  • html - HTML DOM형태
  • script - JavaScript코드
  • json - JSON형식 데이터로 평가. JavaScript의 개체로 변환합니다.
  • text - 일반 텍스트

 

MIME타입 참고

 

MIME types (IANA media types) - HTTP | MDN

A media type (also known as a Multipurpose Internet Mail Extensions or MIME type) indicates the nature and format of a document, file, or assortment of bytes. MIME types are defined and standardized in IETF's RFC 6838.

developer.mozilla.org

 

 

이를 알고 dataType을 text로 지정해주었더니 done() 콜백 함수가 정상적으로 호출되었다.

 

POST API의 응답은 서버에 따라 선택적으로 body를 담아줄 수도 있고 빈 구문이 올 수도 있다.

서버와의 규약을 확실히 하고 정확한 dataType을 지정해 주는 것이 안정적으로 API 요청을 수행하는 방법이다.

반응형