← 개발 노트

DeepSRT에 내장 MCP 지원이 곧 등장합니다

2026년 8월 · DeepSRT 개발 노트

당신의 AI 에이전트가 이제 YouTube를 봅니다. 여섯 개의 도구 — 검색, 채널 목록, 자막 정보, 자막 전문, 요약, 재생 — 그 어느 것도 Mac을 떠나지 않습니다.

DeepSRT는 이미 이런 일을 한다: 영상을 재생하고, 요약을 만들고, 자막 전문을 가져온다. 그렇다면 — 이것이 모습을 바꿔, 이 기기만을 위한 MCP 서버가 된다면 어떻게 될까?

Claude Code, Kiro, Codex, Cursor — MCP를 말하는 에이전트라면 무엇이든, DeepSRT를 통해 어떤 YouTube 영상의 요약과 자막도 얻을 수 있다. 나아가 DeepSRT 자체를 조작해서 영상을 화면에 띄우게 할 수도 있다.

야, Big Bang 이번 주 최신 영상 찾아서 가장 인기 있는 걸 바로 재생해줘.
야, Fox News 오늘 뉴스 전부 확인해서 상위 다섯 개가 무슨 이야기인지 알려줘.

「DeepSRT에 서버가 없는 이유」의 마지막에, 사실은 약속이었던 한 문장을 썼다. 프라이빗 MCP 지원을 준비 중이며, AI 에이전트가 DeepSRT와 직접 대화할 수 있게 된다.

다 만들었다. 다음 버전에 도착한다.

실제로는 이렇게 작동한다

에이전트의 MCP 설정에 DeepSRT를 한 번 추가하면 된다. 그다음부터는 이런 일이 가능하다:

위의 두 개는 우리가 목표로 삼았던 모습이다. 아래 두 개는 실제로 돌아간 기록이다.

swift 6 strict concurrency를 검색해서 가장 관련 있는 것을 고르고, 자막이 있는지 확인하고, 있으면 불릿 모드로 요약해줘.

도구 호출 세 번, 36초. 돌아온 불릿에는 영상의 그 순간을 가리키는 타임스탬프가 붙어 있다. 더 직설적으로 말하면:

그 채널 최신 영상 재생해줘.

에이전트가 그 채널의 업로드를 나열하고, 최신 것을 골라, 영상이 화면에 열린다. 이 요청에는 URL이 한 번도 등장하지 않는다.

여섯 개의 도구

도구필수선택설명
search_videosquerylimit(1–50, 기본 20)키워드로 YouTube 검색. 무료이고 빠름. video id, 제목, 채널, 길이를 반환.
list_channel_videoschannel
(URL, @handle, UC… id)
limit(1–50, 기본 30)채널의 최근 업로드. 해석된 채널 제목을 반환 — 핸들은 오해를 부를 수 있으니 반드시 확인.
get_video_infovideo
(URL 또는 11자 id)
제목, 채널, 그리고 어떤 언어의 자막이 존재하는지. 자막은 내려받지 않음. 무료.
get_transcriptvideolang문장 단위로 합쳐진 블록의 자막 전문. 각 블록에 시작 시간과 길이.
open_in_appvideot(시작 초, 기본 0)DeepSRT 창에서 영상을 열고 앱을 앞으로 가져온다.
summarize_videovideolang, mode(narrative / bullet)자막으로 AI 요약; bullet 모드는 [MM:SS] 타임스탬프 포함. 당신의 AI 키를 사용, 긴 영상은 10–30초.

이 중 다섯 개는 무료이고 빠르다. 하나만이 당신의 AI 크레딧을 쓴다. 이 비대칭이 이 기능 전체에서 가장 중요한 설계 결정이 되었다.

모델에게 절약을 가르치기

그냥 두면, 「X를 다루는 영상을 찾아서 내용을 알려줘」라는 요청을 받은 모델은 검색 결과 전부에 대해 비싼 요약 도구를 호출한다. 그건 당신의 돈이다.

그래서 서버는 모델에게 명시적으로 안내한다: 싼 것에서 비싼 것 순으로, 먼저 무료 도구로 범위를 좁히고, 살아남은 것만 요약하라. get_video_info가 존재하는 주된 이유는, 읽기로 결정하기 전에 「이 영상에 자막이 있기는 한가, 어떤 언어인가」를 물어볼 수 있게 하는 것이다. 실제로 에이전트들은 그렇게 한다 — 우리가 묻기 전에 「이 영상에는 자막이 없어서 요약은 실패합니다」라고 스스로 덧붙인 적도 있다.

이 엔드포인트는 첫날부터 인증을 요구한다

DeepSRT는 원래 브라우저 확장 프로그램을 위해 loopback에서 작은 로컬 API를 돌리고 있었다. 여기에 에이전트 도구를 더하면 위험의 성질이 바뀐다. 이 도구들은 당신의 AI 크레딧을 쓰기 때문에, 인증 없는 엔드포인트는 이 Mac의 어떤 프로그램이든 당신에게 청구할 수 있다는 뜻이 된다.

그래서 MCP 엔드포인트는 첫 요청부터 bearer 토큰을 요구한다. 토큰은 macOS 키체인에 저장된다. 설정 화면에서 설정 블록 전체를 한 번의 클릭으로 복사할 수 있어서, JSON을 손으로 조립할 필요가 없다.

비용은 0이지만 실재하는 구멍을 막는 규칙이 하나 더 있다. Origin 헤더를 지닌 요청은 전부 거부한다. 진짜 MCP 클라이언트는 브라우저가 아니므로 이 헤더를 보내지 않는다. 보냈다면 웹 페이지가 당신의 loopback 포트를 탐색하고 있다는 뜻이다 — MCP 명세가 서버에게 방어를 명문으로 요구하는 DNS 리바인딩 공격이 바로 그것이다. 예외 목록을 관리하는 것보다 이 부류 전체를 거부하는 편이 깔끔하다.

명세가 착수 6일 전에 바뀌었다

MCP의 2026-07-28 개정은 이 작업 일주일 전에 확정됐다. 프로토콜이 무상태가 되고, initialize 핸드셰이크와 프로토콜 수준 세션, 장시간 서버 스트림이 삭제됐다. 구현자에게는 좋은 소식이다 — 들고 있어야 할 것이 훨씬 적다.

명세 자신의 호환성 지침은 MCP-Protocol-Version 헤더의 유무로 세대를 구분하라고 시사한다. 우리는 그대로 만들었다. 그것은 틀렸고, 실패하는 방식이 기록할 가치가 있다.

그 헤더는 2025-06-18부터 존재한다. 즉 2025년 세대 클라이언트는 헤더를 보내면서 동시에 옛 핸드셰이크를 쓰고, 2026년 규칙이 요구하는 요청별 메타데이터도 붙이지 않는다. 실제 에이전트로 시험해보니, 먼저 헤더 없는 initialize를 보내고 그 이후 모든 요청에 MCP-Protocol-Version: 2025-11-25를 찍었다. 우리 서버는 그것을 최신 세대로 판정해 필드 누락으로 거부했고 — 결과적으로 클라이언트에는 도구가 0개, 게다가 어디에도 오류 메시지가 없었다. 연결은 성공했고, 그저 아무것도 없었다.

수정은 판단 하나다: 세대는 버전 으로 정하고, 헤더의 유무로는 정하지 않는다. 두 세대 모두를 처리하고, 모르는 버전은 세대를 고르기 전에 거부한다 — 그렇지 않으면 조용히 구세대 경로로 흘러 들어간다. 지금은 그 클라이언트의 순서를 그대로 재생하는 회귀 테스트가 있다.

프로토콜 세대를 「헤더가 있는지」로 나누지 말 것 — 버전 값으로 나눈다. 그리고 「연결은 깔끔한데 도구가 0개」는 가장 비싼 종류의 버그다: 명세를 이해했다고 믿기 전에, 진짜 클라이언트를 붙이고 자기 로그를 읽어라.

현실은 핸들보다 지저분하다

에이전트가 가르쳐준 것이 하나 더 있다. 「그 크리에이터의 최신 영상」이라고 하면 모델은 표시 이름에서 채널 핸들을 추측한다. 그 추측은 자주 틀리고, 아무도 알아차리지 못하는 방식으로 틀린다. 시도한 어떤 핸들은 완전히 다른 채널의 것이었고 그 채널에는 영상이 하나도 없었다. 두 번째 추측은 그 크리에이터의 부계정이었다.

이 도구는 전에는 채널 id만 돌려줬기 때문에 잘못된 해석이 보이지 않았다. 지금은 해석된 채널의 이름을 돌려주고, 목록이 비었을 때는 두 가지 가능성을 모두 설명한다. 에이전트가 같은 호출을 끝없이 재시도하는 일은 이제 없다. 작은 변경이지만, 「실패하는 도구」와 「이유를 알려주는 도구」의 차이가 여기에 있다.

왜 이 이야기가 여기 실리는가

DeepSRT에는 서버가 없다. 할 수 있는 모든 일을 당신의 기기에서, 당신의 키로 한다. 이것은 줄곧 프라이버시와 신뢰성의 논거로 이야기해왔지만, 더 마음에 드는 결과가 하나 있다. 모든 것이 로컬에서 돌기 때문에, 모든 것이 당신의 도구에서 닿는다.

신청할 API도, 요율 제한 등급도, 어딘가에서 요약되기 위해 Mac을 떠나는 데이터도 없다. 에이전트는 당신과 같은 접근 권한을 얻는다 — 그것이 「당신 쪽에서 돌아간다」는 말의 전부다.

다음 업데이트에서 만나요.