66 스타 · 한 명의 개발자가 만든 DeepSeek 웹버전 강화 패치. ChatGPT나 Claude 같은 "Memory · Skill · MCP 도구" 기능을 DeepSeek는 아직 정식 제공하지 않는데, 이 확장은 브라우저 단에서 fetch를 가로채 시스템 프롬프트를 끼워넣는 방식으로 그 기능들을 흉내 낸다. 백엔드 서버 한 줄 없이, 순수 클라이언트 사이드만으로 Agentic Memory, Skill 시스템, 시스템 프롬프트 프리셋, MCP 연결까지 다 구현했다.
네가 DeepSeek에 "내 이름은 인범이야"라고 치면, 확장이 그 메시지가 서버로 가기 전에 잡아서 "[지금까지 너에 대해 기억하는 것들: ...] + 인범이야"로 바꿔치고, AI가 답하면서 <memory_save>{...}</memory_save> 같은 XML 태그를 답변에 섞어 보내면 확장이 그걸 잘라내서 IndexedDB에 저장한다.
즉, DeepSeek 서버는 자기가 기억력이 있다고 착각하고, 사용자는 ChatGPT처럼 매끄러운 경험을 얻는다.
한 문장으로 정확히 무엇을 하는가
DeepSeek++ 는 chat.deepseek.com 페이지에서만 작동하는 Chrome MV3 확장이다. 페이지의 네트워크 요청(fetch / XHR)을 main world 스크립트로 후킹해, DeepSeek API로 나가는 prompt에 장기 기억 · 스킬 system prompt · 시스템 프리셋을 자동으로 끼워 넣고, 돌아오는 SSE 스트림에서 <memory_save> 같은 XML 태그를 파싱해 IndexedDB에 저장한다.
TrendShift 9위까지 올라온 이유
2026년 들어 ChatGPT의 Memory와 Custom Instructions, Claude의 Skills/MCP가 폭발적으로 주목받았다. DeepSeek는 비용 대비 성능이 가장 강력한 대안이지만, "기억력"과 "전문 모드" 같은 사용성 기능은 항상 한 발 늦었다. 이 프로젝트는 그 공백을 정확히 채웠다.
| 항목 | ChatGPT Memory | Claude Skills | DeepSeek++ |
|---|---|---|---|
| 설치 비용 | 유료 구독 | 유료 구독 | 무료 + 오픈소스 |
| 실행 위치 | 서버 측 | 서버 측 | 브라우저(클라이언트) |
| 데이터 저장 | OpenAI 서버 | Anthropic 서버 | 로컬 IndexedDB |
| 커스터마이즈 | 제한적 | 중간 | 완전 자유 |
| MCP 지원 | 제한적 | 완전 지원 | 부분 지원(v0.3) |
전통적인 접근이라면 "프록시 서버 → DeepSeek API"로 중계하면서 메모리를 관리하는 구조다. 그러나 이 프로젝트는 사용자 브라우저가 곧 미들웨어. 서버 운영비도, 사용자 토큰 보안 우려도 없다. DeepSeek의 공식 결제·로그인이 그대로 살아 있다.
이 프로젝트는 ChatGPT처럼 "전체 대화를 요약해서 통째로 저장"하지 않고, AI가 시스템 프롬프트에 명시된 규칙대로 직접 memory_save 도구를 호출하게 한다. 즉 메모리 저장 로직이 코드가 아니라 "프롬프트 + 정규식 파서" 조합으로 짜여 있다 — LLM 시대 새로운 설계 패턴의 좋은 사례.
"극치 심층 사고", "프론트엔드 디자인", "문서 협업", "브랜드 가이드라인", "알고리즘 아트", "PPT 디자인" 등 — Anthropic의 Skills 카탈로그를 벤치마크한 분야들. /만 치면 자동완성 패널이 뜨고, 선택하면 system prompt가 자동 주입된다.
왜 이런 조합을 골랐는지
WXT (wxt.dev)는 Vite 기반 크롬 확장 빌드 도구. "확장 개발계의 Next.js" 같은 위치다. entrypoints/ 폴더에 파일을 두면 자동으로 진입점으로 인식하고, MV3 매니페스트를 자동 생성한다.
그냥 크롬 확장을 만든다면 manifest.json을 손으로 짜고, content script · background script · sidepanel HTML을 각각 webpack으로 묶어야 한다. WXT는 그걸 "파일 이름만으로 자동 결정"하게 해준다. entrypoints/background.ts → 서비스 워커, entrypoints/content.ts → 콘텐츠 스크립트. Next.js의 pages/ 디렉토리 컨벤션과 똑같은 발상.
사이드 패널(chrome://extensions의 옆 패널)을 React로 짠다. React 19는 2026년 기준 안정 버전이고, Tailwind 4는 빌드 시간이 극단적으로 빠른 새 엔진을 쓴다(@tailwindcss/vite 플러그인). 이 정도 가벼운 UI에 정확히 어울리는 조합.
두 곳에 나눠 저장한다.
nativeMessaging 권한이 있다는 건 로컬에서 돌아가는 MCP 서버와 통신할 의도가 있다는 뜻이고, alarms가 있다는 건 스케줄된 자동화 태스크를 돌릴 수 있다는 의미다.
전체 데이터 흐름과 핵심 설계 패턴
일반적인 크롬 확장의 content.ts는 "격리된 컨텍스트(isolated world)"에서 실행돼서, 페이지의 window.fetch 같은 글로벌 객체를 직접 후킹할 수 없다. 그래서 이 프로젝트는 main-world.content.ts를 따로 만들어 "world: MAIN" 설정으로 실행한다.
window.fetch를 갈아치우는 같은 작업이 필요할 때만 쓴다. MV3에서 정식 지원된 지 얼마 안 된 기능.택배 차량(fetch 요청)을 가로채려면, 도로 위에서 직접 잡아야 한다(Main World). 차고지 옆 카페에 앉아서 보고만 있으면(Isolated World) 차는 그냥 지나가 버린다. 다만 도로 위에서 작업하려면 교통경찰의 허가(world:MAIN 설정)가 별도로 필요하다.
OpenAI 함수 호출이나 Anthropic의 tool_use는 표준화된 JSON 형식이다. 그런데 DeepSeek 웹 API는 그런 구조화된 입출력을 사용자가 제어할 방법이 없다. 그래서 이 프로젝트는 "AI 답변에 그냥 XML 태그를 박아넣게" 하고, 그걸 정규식으로 잘라낸다.
이 트릭의 핵심은 두 가지다.
TOOL_CALL_REGEX 하나로 memory_save, memory_update, memory_delete를 모두 잡는다.메모리가 1000개 쌓이면 매번 전부 주입할 수 없다. MEMORY_TOKEN_BUDGET = 1500 토큰 안에서 가장 관련 있는 것만 골라야 한다.
이건 사실 고전적인 검색 엔진(BM25)에 인간 직관 가중치를 합친 형태다. 벡터 임베딩을 쓰지 않고 단순 키워드 매칭으로 충분히 동작하게 만든 점이 실용적.
활성화된 시스템 프리셋은 새 대화의 첫 메시지 + 매 10번째 메시지마다 재주입된다. DeepSeek가 컨텍스트가 길어지면서 초기 system prompt를 "잊는" 현상을 막기 위함이다.
매 메시지마다 system prompt를 다시 넣으면 토큰을 그만큼 더 쓰게 되고, 모델이 매번 같은 지시를 다른 톤으로 해석할 수도 있다. 10턴 간격은 토큰 효율과 일관성 사이의 절충점이다.
어디서 어떤 일이 일어나는가
이 한 파일에 이 프로젝트의 모든 비밀이 다 들어 있다. SYSTEM_TEMPLATE_CHAT이 곧 "메모리 시스템의 두뇌"고, MEMORY_SAVE_SCHEMA가 도구 호출 계약이다. 읽으면 프로젝트의 절반을 이해한 셈.
fetch / XHR을 어떻게 후킹했는지가 들어 있다. SSE 스트림을 chunk 단위로 받으면서 어떻게 XML 태그 경계를 처리하는지 보면 "스트리밍 파서 만들기"의 좋은 예제.
메모리 스코어링 로직과 토큰 예산 관리. STOP_WORDS 세트가 어떻게 쓰이는지, tags 가중치를 어떻게 계산하는지 보면 "검색 점수 만들기"의 미니 튜토리얼.
이 레포에서 무엇을 배울 수 있는가
MV3로 넘어오면서 가장 헷갈리는 게 "background page가 사라졌고, content script로는 window.fetch를 못 가로챈다"는 점이다. 이 프로젝트는 main-world.content.ts 한 파일로 그 한계를 어떻게 우회하는지 정확히 보여준다.
같은 main-world 패턴을 그대로 가져다 유튜브의 /youtubei/v1/browse 응답을 가로채면, 추천 영상 메타데이터를 따로 모아 분석할 수 있다. 동일 패턴, 다른 도메인.
일반적으로 "prompt injection"은 보안 취약점 이름이다. 그런데 이 프로젝트는 의도된 prompt injection이 곧 기능이다. 시스템 프롬프트를 어떻게 설계해야 모델이 "주어진 규칙을 따라 도구를 호출"하게 만드는지가 핵심 학습 포인트.
OpenAI API + 시스템 프롬프트에 <preference_save>{json}</preference_save> 규칙을 박고, 응답에서 태그를 잘라내 로컬 JSON에 저장. 딱 50줄로 "기억하는 챗봇"을 흉내낼 수 있다.
크롬 확장 개발이 "configurator의 지옥"이었던 시절을 끝내려는 도구. Hot reload, 자동 매니페스트 생성, 크로스 브라우저 빌드(Chrome/Edge/Firefox 동시) 가 다 된다. 이 프로젝트의 build:all 스크립트가 좋은 사례.
웹 브라우저의 IndexedDB API는 콜백 지옥의 끝판왕으로 악명 높다. Dexie는 그걸 Promise/Observable 기반으로 깔끔하게 감싸준다. 이 프로젝트의 메모리 모듈이 미니 튜토리얼 격.
Chrome MV3의 sidePanel API를 React로 다루는 살아 있는 예제. 사이드 패널 ↔ Service Worker 메시지 핸드셰이크는 일반 SPA와 다른 패턴(chrome.runtime.sendMessage)이라 직접 보면 배우는 게 많다.
개발과 사용에 필요한 환경
chat.deepseek.com 접근npm run dev는 핫리로드 가능한 임시 Chrome 프로필을 띄운다 — 메인 Chrome 프로필을 건드리지 않음dist/chrome-mv3/)은 50MB 미만 — 확장 마켓 업로드 한도 안이 확장은 DeepSeek의 비공개 내부 API(/api/v0/chat/completion)에 의존한다. DeepSeek가 응답 SSE 포맷을 바꾸거나 인증 방식을 바꾸면, 확장이 동작을 멈출 수 있다. 공식 API가 아니라는 점은 늘 염두에 둬야 한다.
난이도별 다섯 가지
git clone → npm install → npm run build → dist/chrome-mv3/ 폴더를 크롬에 로드.
DeepSeek 페이지에서 "나는 Next.js를 주로 써. 타입스크립트 좋아하고." 같은 자기 소개를 보내고, 사이드 패널에서 자동으로 user 타입 메모리가 쌓이는지 확인. "AI가 스스로 저장 결정"이라는 패턴을 눈으로 확인하는 게 목표.
사이드 패널 → 스킬 → 새 스킬. 예를 들어 /ko-review 라는 이름으로 "코드를 한국어로 라인 단위 리뷰" system prompt를 작성. 채팅창에 /ko-review를 치고 자동완성이 뜨는지, 선택 후 system prompt가 자동 주입되는지 확인. Markdown 한 장으로 AI 페르소나를 박제하는 경험.
현재는 user / feedback / topic / reference 4종류. 5번째로 project 타입을 추가해 보자. core/constants.ts의 enum 수정 + SYSTEM_TEMPLATE_CHAT 안내 문구 추가 + 사이드 패널 UI에 필터 옵션 추가. "기능 하나를 끝부터 끝까지 따라가는" 첫 풀스택 실습으로 적당.
host_permissions를 *://chatgpt.com/*로 바꾸고, DEEPSEEK_API_URL을 ChatGPT의 내부 API 엔드포인트로 바꾼다. SSE 포맷이 다르므로 core/interceptor/의 파서를 ChatGPT 응답 구조에 맞게 수정. "main world fetch 후킹" 패턴이 다른 사이트에서도 통한다는 걸 직접 증명해 보는 챌린지.
매니페스트의 nativeMessaging 권한이 이미 있다. Native Messaging Host로 동작하는 작은 Node.js MCP 서버를 짜고, core/mcp/를 통해 DeepSeek 답변에서 <mcp_tool_call> 태그를 추출하면 그 서버로 라우팅한다. "DeepSeek가 내 컴퓨터의 파일 시스템을 조작하게 만드는" 종합 실습.
4주 코스로 정리
chrome.runtime.sendMessage로 컨텍스트 간 통신entrypoints/ 컨벤션, 자동 매니페스트 생성--browser firefox --mv3)npx wxt init으로 새 확장 만들고, sidepanel 화면에 "Hello"만 띄우기<memory_save> 태그 추출하는 미니 챗봇 만들기알아두면 다른 LLM 도구 레포 읽을 때도 도움이 되는 단어들
core/mcp/는 그 표준을 클라이언트 측에서 지원하려는 시도.constants.ts의 STOP_WORDS 세트가 좋은 예 — 중국어와 영어를 모두 포함.더 깊이 파고들고 싶다면
| 분류 | 제목 | 설명 |
|---|---|---|
| 레포 | zhu1090093659/deepseek-pp | 본 프로젝트 소스 |
| 프레임워크 | wxt.dev | WXT 공식 문서. 크롬 확장 개발 표준이 될 듯. |
| 스토리지 | dexie.org | Dexie 공식 가이드. IndexedDB 쓰려면 거의 필수. |
| 크롬 API | chrome.sidePanel | 사이드 패널 API 레퍼런스 |
| 크롬 API | Native Messaging | 로컬 프로그램과 통신하는 법 |
| 표준 | modelcontextprotocol.io | MCP 표준 명세 |
| 대안 | Letta (전 MemGPT) | 서버 측 에이전트 메모리 시스템의 정석 |
| 대안 | OpenAI Function Calling | "표준 도구 호출"이 어떻게 생겼는지의 비교 기준 |