friday 기반 Python MCP/voice 스택 위에 Electron 데스크톱 셸을 얹은 로컬 AI 비서 프로토타입입니다. 이 저장소는 지금 실제로 실행되는 코드만 남겨둔 상태이며, 텍스트 명령, Electron 보조 음성 입력, LiveKit 음성 에이전트, 브라우저 자동화, 앱 자동화, OCR, OBS 제어, 파일 작업, 자격증명 저장소를 하나의 자비스 경험으로 묶는 것이 목적입니다.
- Electron 팝업에서 자연어 명령을 받아 대화하거나 로컬 작업을 수행합니다.
- Electron 설정창에서 웨이크워드와 1회성 음성 입력으로 명령을 받아 같은 오케스트레이터로 보냅니다.
- LiveKit 기반 음성 에이전트가 별도의 음성 세션에서 같은
fridayMCP 도구들을 사용합니다. - 로컬 데스크톱 자동화와 Python MCP 도구를 분리해 두어서, 데스크톱 셸과 음성 에이전트가 같은 기능 축을 공유할 수 있습니다.
- 자격증명, TTS 설정, 브라우저 프로필, OBS 연결, OCR, 파일 작업을 전부 실사용 기준으로 엮어둔 상태입니다.
- Electron 비서는 사용자 선호, 프로젝트, 관계, 장기 목표를 별도 메모리로 축적해 후속 대화에 재사용합니다.
- 게임 설치와 관리
- 자연어로
스팀에서 PUBG 설치해줘,에픽에서 포트나이트 업데이트해줘,설치된 게임 목록 보여줘같은 요청을 처리합니다. - Steam은 설치 / 업데이트 URI를 바로 열고, Epic은 런처와 스토어 검색 흐름을 연결합니다.
- 자연어로
- Jarvis 음성 음소거
F4또는 UI의Jarvis Voice버튼으로 자비스 응답 음성을 즉시 끄고 다시 켤 수 있습니다.- 메인 데스크톱 UI와 빠른 패널이 같은 음소거 상태를 공유합니다.
- 기억 기능
- 사용자 이름, 선호, 프로젝트, 관계, 장기 목표 같은 장기 기억을 추출해 이후 대화에 반영합니다.
- 키보드 인터페이스
- 마이크 없이도 팝업과 데스크톱 앱에서 텍스트로 같은 자비스 오케스트레이터를 사용할 수 있습니다.
- 코딩 프로젝트 생성
스네이크 게임 만들어줘,간단한 todo 앱 만들어줘같은 요청을 받아generated-projects/아래에 실제 프로젝트를 생성합니다.- 가능하면 바로 VS Code까지 열어 이어서 작업하게 합니다.
- 앱 이름 우선 해석
YouTube에서 음악 틀어줘,Spotify 열어줘,Steam 켜줘같은 요청에서 앱 / 사이트 이름을 일반 키워드보다 우선 해석하도록 라우팅을 보강했습니다.
- 사용자가 입력합니다.
- Electron 팝업 텍스트 입력
- 데스크톱 앱 메인 화면 입력
- 웨이크워드 / 1회성 음성 입력
- LiveKit 기반 음성 세션
- 입력이 Electron 메인 프로세스 또는 Python 음성 에이전트로 들어갑니다.
- 라우터가 요청을 분류합니다.
- 일반 대화
- 앱 열기 / 앱 내부 제어
- 브라우저 작업 / 저장 로그인
- 화면 OCR / 학습 설명
- OBS 제어
- 파일 읽기 / 쓰기 / 목록
- Spotify 제어
- Steam / Epic 게임 작업
- 코드 프로젝트 생성
- 필요하면 플래너가 짧은 실행 계획을 만듭니다.
- 브라우저 단계 계획
- 앱 내부 단축키 / 입력 / 메뉴 클릭 계획
- 코드 프로젝트 스캐폴드 계획
- 실제 실행 서비스가 작업을 수행합니다.
- Playwright 브라우저 자동화
- AppleScript / System Events 기반 데스크톱 자동화
- 로컬 파일 시스템
- OBS WebSocket
- 장기 메모리 저장소
- 결과를 정리해 응답합니다.
- 화면 메시지
- 필요 시 음성 합성
- 실행 액션 로그
- 후속 질문 또는 다음 단계 제안
.
├── server.py # FastMCP 서버 엔트리
├── agent_friday.py # LiveKit 음성 에이전트 엔트리
├── main.py # Python 통합 실행기
├── friday/ # Python MCP / voice package
├── src/main/ # Electron 메인 프로세스 서비스
├── src/renderer/ # Electron 팝업 / 설정 UI
├── scripts/ # smoke / E2E 보조 스크립트
├── tests/ # Python + Node 검증
└── docs/ # 구조 / 보안 문서
Electron 36ipcMain/ipcRenderer/contextBridge기반 IPC- 고정형 팝업 창 + 고급 설정 창
- 전역 단축키
Cmd/Ctrl + Shift + Space: 팝업 표시Cmd/Ctrl + ,: 설정 창 열기
- 렌더러 음성 입력
SpeechRecognition/webkitSpeechRecognition- 웨이크워드:
jarvis,자비스
- 렌더러 음성 출력 fallback
- 브라우저
speechSynthesis
- 브라우저
- Electron 빠른 계층 LLM
autoprovider selectionGemini우선OpenAI-compatible차선Ollama로컬 fallback
- Electron 복잡 작업용 LLM
autoprovider selectionGeminiOpenAI-compatibleOllamafallback
- OpenAI-compatible API
LM StudioJanAnythingLLMOpenWebUI- 공식
OpenAI - 기타 OpenAI 호환 서버
- Electron 라우터 / 플래너 / 일반 대화 분리
- intent routing
- browser planning
- app planning
- general chat tiering
- long-term memory extraction and reuse
- LiveKit voice LLM
GeminiOpenAIGroq- OpenAI-compatible endpoint
FastMCPSSE 서버LiveKit Agents- LiveKit plugins
Groq STTOpenAI STT / LLM / TTSGoogle Gemini LLMGoogle TTSSarvam STT / TTSmacOS saylocal TTS fallbackSilero VAD
python-dotenvhttpx
Playwright- Chromium 번들 브라우저 fallback
- Google Chrome 저장 프로필 재사용 / 미러링
- 검색 / 링크 클릭 / 페이지 읽기 / 로그인 자동화
- macOS 기준
AppleScriptSystem Events- Spotlight + 파일시스템 기반 앱 카탈로그
- Discord/워크스페이스 OCR 클릭 보조
- Windows 기준
- 앱 열기
- URL 열기
- Linux 기준
- URL 열기
screenshot-desktoptesseractCLI- Python 측
pytesseract+Pillow - macOS
screencapture - macOS
say
- Electron TTS provider chain
ElevenLabsCartesia SonicNAVER CLOVA VoiceGoogle Cloud TTSsystem fallback
- Voice agent TTS
macOS sayOpenAI TTSGoogle TTSSarvam Bulbul
- Electron:
obs-websocket-js - Python MCP:
obs-websocket-py
- Electron
safeStorage - macOS
securityCLI - Electron 장기 메모리 저장소
~/Library/Application Support/<app>/jarvis-memory.json
- Python
keyring - 공유 vault 인덱스 파일
~/.friday-jarvis/credentials.json
- 민감 작업 audit log
~/.friday-jarvis/audit.log
- Node syntax check
- Node tests
- Python smoke tests
- Python end-to-end smoke script
- LiveKit token generator
- MCP SSE health check
- Desktop LLM configuration smoke
- Browser login smoke
- OBS TCP reachability check
- Electron 앱은 이제 패키징 가능한 구조를 가집니다.
- Assistant UI는 Next standalone 산출물로 빌드되어 앱 리소스 안에 함께 포함됩니다.
- 패키징된 앱은 자체 로컬 UI 서버를 띄운 뒤 Electron 설정 창에 연결합니다.
- 같은 Next 코드베이스로 공개용 다운로드 랜딩 페이지도 만들 수 있습니다.
NEXT_PUBLIC_JARVIS_SITE_MODE=download이면 루트/가 다운로드 사이트처럼 동작합니다./download경로는 항상 공개용 다운로드 페이지를 제공합니다.
- 별도 정적 설치 사이트도 함께 포함됩니다.
- 위치:
site/install-web - 목적: Cloudflare Pages로 공개 배포하는 설치 전용 홍보 / 다운로드 사이트
- 특징: Apple 스타일 랜딩, 다크 / 라이트 모드, 설치 마법사, 이용 약관/권한 동의, 자동 업데이트 조건 안내, 실제 릴리스 자산 기준 다운로드 분기
- 명령:
npm run site:install:sync,npm run site:install:dev,npm run site:install:deploy
- 위치:
electron-updater+electron-builder기반 자동 업데이트 흐름을 지원합니다.- 중요한 점: GitHub에 커밋만 한다고 이미 설치된 앱이 바뀌지는 않습니다. 새 버전 태그와 실제 릴리스 파일이 배포되어야 앱이 업데이트를 감지합니다.
- 기본 업데이트 피드가 없는 빌드이거나 mac 환경에서 네이티브 업데이트가 막히는 경우를 대비해, 앱이 GitHub 최신 릴리스를 직접 확인하고 설치 파일을 열어주는 fallback도 포함됩니다.
- 자동 릴리스용 GitHub Actions 워크플로우도 포함됩니다.
- 파일:
.github/workflows/release-desktop.yml - 역할:
v*태그 기준으로 macOS / Windows / Linux 패키지를 빌드하고 GitHub Releases에 게시
- 파일:
- 배포 / 릴리스 절차는 DISTRIBUTION.md 에 정리되어 있습니다.
현재 Python MCP 서버는 다음 표면을 제공합니다.
- Web tools 5개
get_world_newssearch_webfetch_urlopen_browserautomate_login
- System tools 6개
get_current_timeget_system_inforun_shell_commandlist_directoryread_filewrite_file
- Utility tools 4개
format_jsonword_countbase64_encodebase64_decode
- Media tools 7개
capture_screenocr_imageobs_start_recordingobs_stop_recordingobs_start_streamingobs_stop_streamingtext_to_speech
- File / credential tools 8개
store_credentialget_credentiallist_saved_credentialsdelete_saved_credentialcopy_filemove_filedelete_filecreate_directory
summarizeexplain_codetranslateanalyze_sentiment
friday://infofriday://capabilities
- 사용자가 팝업 창에 텍스트를 입력합니다.
- 렌더러는
assistant:submit-commandIPC로 메인 프로세스에 명령을 전달합니다. AssistantService가 최근 대화 히스토리와 현재 입력을 보고 intent를 분류합니다.- 분류 결과에 따라 다음 중 하나로 보냅니다.
- 일반 대화
- 앱 열기
- 앱 내부 작업
- 브라우저 작업
- 브라우저 로그인
- 화면 요약
- 화면 학습 보조
- OBS 작업
- 파일 읽기 / 쓰기 / 목록
- 스트림 준비
- Spotify 작업
- 일반 대화는 fast/complex LLM tier 중 하나를 선택해 응답을 생성합니다.
- 로컬 작업은 브라우저 서비스, 파일 서비스, OBS 서비스, 화면 OCR 서비스, 데스크톱 자동화 어댑터 등으로 실행됩니다.
- 작업이 끝나면
polishCommandReply가 결과를 자연스러운 자비스 말투로 다듬습니다. - 결과는 팝업 UI에 텍스트로 표시됩니다.
- 사용자가 응답 읽기를 켜 두었으면 TTS 서비스가
ElevenLabs / NAVER CLOVA / Gemini TTS / OpenAI TTS / Cartesia / Google Cloud순서의 클라우드 음성을 시도하고, 실패하면 브라우저speechSynthesis로 fallback 합니다.
- 사용자가 설정창에서 웨이크워드를 켜거나 1회성 음성 버튼을 누릅니다.
- 렌더러는
SpeechRecognition/webkitSpeechRecognition으로 마이크 입력을 받습니다. - 웨이크워드
jarvis또는자비스를 감지하면 팝업을 띄우고 후속 명령을 기다리거나 바로 실행합니다. - 인식된 텍스트는 결국
assistant:submit-command로 들어가므로, 이후 파이프라인은 팝업 텍스트 입력과 동일합니다. - 응답은 설정창 메시지 로그와 음성 출력으로 돌아옵니다.
설정창은 일반 대화 라우팅을 거치지 않고 특정 도구를 바로 부를 수 있습니다.
- 앱 목록 조회
- 앱 열기
- 화면 OCR
- 화면 학습 보조
- 브라우저 열기 / 검색 / 읽기 / 로그인
- 자격증명 저장 / 목록 / 삭제
- OBS 연결 / 상태 / 시작 / 종료 / 씬 전환
- 파일 읽기 / 쓰기 / 목록
이 경로는 디버깅, 고급 설정, 즉시 실행 버튼 성격에 가깝습니다.
- 사용자가 LiveKit 룸에 접속합니다.
- 마이크 오디오는 STT provider로 전달됩니다.
- 기본 조합은
Groq STT + OpenAI STT fallback
- 기본 조합은
- 텍스트로 변환된 사용자 발화는
AgentSession으로 들어갑니다. FridayAgent는 선택된 LLM provider를 사용해 응답을 생성합니다.- LLM은 필요할 때 Python FastMCP 서버를 SSE로 호출합니다.
- MCP 서버는 웹, 파일, OBS, OCR, 시스템, 자격증명 등의 도구를 실행합니다.
- 실행 결과는 다시 LLM 컨텍스트로 돌아갑니다.
- 최종 응답은 TTS provider로 음성 합성되어 LiveKit 세션에 재생됩니다.
- macOS에서는 유료 TTS 키가 없어도
sayfallback으로 바로 말할 수 있습니다.
- macOS에서는 유료 TTS 키가 없어도
- 브라우저 요청은 먼저 간단한 heuristic plan 또는 LLM planner를 거쳐 step list로 바뀝니다.
BrowserService가 Playwright persistent context를 확보합니다.- 가능하면 저장된 Chrome 프로필 또는 미러링된 시스템 프로필을 사용합니다.
- 실패하면 Playwright 번들 브라우저로 fallback 합니다.
open_url,search_google,search_youtube,click_text,click_search_result,read_page를 순서대로 실행합니다.- 마지막 페이지 스냅샷과 실행 로그가 assistant에 반환됩니다.
- Electron 또는 Python 도구가 서비스명 / URL 기준으로 site key를 정규화합니다.
- 메타데이터는
~/.friday-jarvis/credentials.json에 저장됩니다. - 실제 비밀번호는 OS secure store에 저장됩니다.
- Electron:
safeStorage+ macOSsecurity - Python:
keyring+ macOSsecurity
- Electron:
- 브라우저 로그인이나 MCP credential tool이 같은 저장소를 공유합니다.
chatbrowserbrowser_loginscreen_summaryscreen_academicobs_connectobs_statusobs_startobs_stopobs_scenefile_readfile_writefile_liststream_prepapp_openapp_actionapp_listspotify_play
아래 역할들은 현재 코드 기준으로 실제 구현되어 있는 역할입니다. 다만 표면과 플랫폼에 따라 범위가 다릅니다.
| 역할 | 어디서 동작 | 현재 가능한 일 |
|---|---|---|
| 일반 대화형 자비스 | Electron 팝업, Electron 설정창, LiveKit voice | 한국어/영어 대화, 짧은 추천, 후속 질문, 자연스러운 보좌관 응답 |
| LLM 라우터 / 플래너 | Electron | 요청을 채팅/브라우저/앱/파일/OBS/화면 분석 등으로 분기 |
| 데스크톱 앱 런처 | Electron | 설치된 앱 목록 조회, 앱 열기, 최근 앱 컨텍스트 기억 |
| 범용 앱 조작자 | Electron, macOS 중심 | 앱 포커스, 텍스트 입력, 키 입력, 단축키 실행, 메뉴 클릭 |
| Spotify 보조자 | Electron, macOS | Spotify 열기, 검색, 다음 곡, 이전 곡, 일시정지, 재생 재개 |
| Finder 보조자 | Electron, macOS | 경로 열기, 새 창 열기, Finder 검색 |
| Notes 보조자 | Electron, macOS | 새 노트 생성, 노트 검색 |
| Chrome 보조자 | Electron, macOS | 지정 대상 열기, 새 탭, 뒤로/앞으로, 새로고침 |
| 워크스페이스 메시지 보조자 | Electron, macOS | Slack/Discord 대상 전환, 메시지 전송, 후속 질문으로 메시지 슬롯 채우기 |
| Discord DM 읽기 보조자 | Electron, macOS | 현재 화면에 보이는 1:1 DM OCR 읽기 |
| 브라우저 조작자 | Electron, Electron direct tools, MCP/voice 일부 | URL 열기, Google/YouTube 검색, 검색 결과 클릭, 현재 페이지 읽기 |
| 브라우저 로그인 보조자 | Electron, MCP/voice | 저장된 자격증명으로 로그인 페이지에 아이디/비밀번호 입력 |
| 화면 읽기 보조자 | Electron, MCP/voice | 화면 캡처, OCR, 요약 |
| 화면 학습 / 튜터 역할 | Electron | 현재 화면 OCR을 바탕으로 문제 풀이, 문장 설명, 공부 방향 안내 |
| 파일 보조자 | Electron, MCP/voice | 파일 읽기, 쓰기, 디렉터리 목록, 복사, 이동, 삭제, 폴더 생성 |
| OBS 보조자 | Electron, MCP/voice | Electron에서 OBS 연결/상태/스트림 시작/중지/씬 전환, Python MCP에서 녹화/스트리밍 시작/중지 |
| 스트림 준비 보조자 | Electron | OBS 열기, Steam 열기, Twitch 열기, OBS 상태 점검 |
| 뉴스 / 정보 브리퍼 | MCP/voice | 월드 뉴스 RSS 수집, 웹 검색, URL fetch |
| 시스템 유틸리티 보조자 | MCP/voice | 현재 시간, 시스템 정보, 셸 명령 실행, JSON 포맷팅, 단어 수, Base64 인코딩/디코딩 |
| 보안 자격증명 매니저 | Electron, MCP/voice | 로그인 정보 저장, 조회, 목록, 삭제, 브라우저 로그인에 재사용 |
| 음성 세션 에이전트 | LiveKit voice | STT → LLM → MCP tool → TTS 전체 루프 |
- 가장 실사용성이 높은 표면입니다.
- 로컬 앱 조작, 브라우저 조작, OCR, OBS, 파일 작업, TTS 설정, 자격증명 관리가 여기에 집중되어 있습니다.
- LLM은 fast tier와 complex tier로 나뉘어 있습니다.
- 실시간 음성 세션용 표면입니다.
fridayMCP 도구를 폭넓게 사용할 수 있습니다.- Electron 전용 앱 자동화보다는 Python MCP 도구 축에 가깝습니다.
- 음성 에이전트가 쓰는 백엔드이자, 별도 MCP 클라이언트가 붙을 수 있는 도구 서버입니다.
- 웹 / 시스템 / 파일 / OCR / OBS / 자격증명 / 유틸리티 도구를 제공합니다.
- 가장 많이 구현되어 있습니다.
- 앱 카탈로그 검색
- AppleScript/System Events 기반 앱 조작
- Finder / Notes / Chrome / Spotify / Discord 워크플로
- macOS Keychain 연동
say기반 시스템 음성screencapture기반 화면 캡처
- 현재는 기본 열기 동작 위주입니다.
- 앱 열기
- URL 열기
- 고급 앱 내부 자동화는 아직 충분히 연결되지 않았습니다.
- 현재는 URL 열기 중심입니다.
- 데스크톱 앱 제어는 제한적입니다.
다음 계열 작업은 기본적으로 바로 열리지 않도록 가드가 있습니다.
- 셸 명령 실행
- 브라우저 자동 로그인
- 저장된 자격증명 삭제
- 파일 복사 / 이동 / 삭제 / 디렉터리 생성
민감 작업은 다음 조건을 만족해야 실행됩니다.
- 도구 호출 시
confirmed=True - 환경 변수
FRIDAY_ENABLE_SENSITIVE_TOOLS=1
민감 작업 로그는 ~/.friday-jarvis/audit.log에 남습니다.
uv sync
uv run friday
uv run friday_voice또는:
python main.py server
python main.py voice
python main.py token --room friday-dev --identity jyh-local
python main.py doctornpm install
npm run install:browsers
npm run devnpm run check
npm run test:node
.venv/bin/python -m unittest -v tests/test_friday_smoke.py
npm run e2e:smoke현재 검증 계층은 다음을 포함합니다.
- Electron 주요 서비스 syntax check
- BrowserService / CredentialStore / OBS / assistant tier routing Node tests
- Python voice preflight smoke tests
- MCP SSE 서버 연결 smoke
- Desktop LLM 설정 smoke
- 브라우저 로그인 smoke
- OBS TCP reachability check
- MCP 서버: server.py
- 음성 에이전트: agent_friday.py
- 통합 실행기: main.py
- Electron 메인: main.cjs
- 명령 오케스트레이터: assistant-service.cjs
- 브라우저 자동화: browser-service.cjs
- 데스크톱 자동화 어댑터: platform-adapters.cjs
- 화면 OCR: screen-service.cjs
- OBS 서비스: obs-service.cjs
- TTS 서비스: tts-service.cjs
- 공용 자격증명 저장소: credential-store.cjs
전체 목록과 예시는 .env.example를 기준으로 보는 것이 가장 정확합니다. 여기에는 실제로 자주 만지는 축만 정리합니다.
LIVEKIT_URLLIVEKIT_API_KEYLIVEKIT_API_SECRETFRIDAY_STT_PROVIDERFRIDAY_STT_FALLBACK_PROVIDERFRIDAY_LLM_PROVIDERFRIDAY_LLM_MODELFRIDAY_LLM_BASE_URLFRIDAY_LLM_API_KEYFRIDAY_TTS_PROVIDERGROQ_API_KEYOPENAI_API_KEYGEMINI_API_KEYGOOGLE_API_KEYSARVAM_API_KEY
JARVIS_FAST_LLM_PROVIDERJARVIS_FAST_LLM_MODELJARVIS_FAST_ROUTER_MODELJARVIS_FAST_PLANNER_MODELJARVIS_COMPLEX_LLM_PROVIDERJARVIS_COMPLEX_LLM_MODELJARVIS_COMPLEX_LLM_URLJARVIS_COMPLEX_LLM_API_KEYOLLAMA_URL
JARVIS_FAST_LLM_PROVIDER, JARVIS_COMPLEX_LLM_PROVIDER는 auto, gemini, openai-compatible, ollama를 받을 수 있고, auto일 때는 구성된 키를 기준으로 Gemini -> OpenAI-compatible -> Ollama 순서로 선택합니다.
FRIDAY_TTS_PROVIDERFRIDAY_TTS_FALLBACK_PROVIDERELEVENLABS_API_KEYCARTESIA_API_KEYNAVER_CLOVA_CLIENT_IDNAVER_CLOVA_CLIENT_SECRETGEMINI_TTS_MODELGEMINI_TTS_VOICE_ENGEMINI_TTS_VOICE_KOOPENAI_TTS_MODEL_DESKTOPOPENAI_TTS_VOICE_ENOPENAI_TTS_VOICE_KOGOOGLE_APPLICATION_CREDENTIALSOBS_HOSTOBS_PORTOBS_PASSWORD
이 README는 “장기적으로 하고 싶은 것”이 아니라 “지금 코드에 연결되어 있는 것”을 기준으로 작성되어 있습니다.
- Electron 팝업은 텍스트 명령 중심으로 바로 사용 가능합니다.
- Electron 설정창은 웨이크워드/1회성 음성 입력, TTS 설정, 직접 툴 실행, 자격증명 관리까지 담당합니다.
- LiveKit voice agent는 별도 환경 키와 LiveKit 세션이 준비되면 음성 세션으로 동작합니다.
- macOS에서는 LiveKit voice agent의 음성 출력이
macOS say로 fallback 가능해서 유료 TTS 없이도 말하기 테스트가 가능합니다. - macOS가 가장 구현 범위가 넓고, Windows/Linux는 기본 동작 위주입니다.