Skip to main content
Glama
riseblyp

mobile_claude_connect

by riseblyp

mobile_claude_connect

PC에서 실행 중인 Claude Code 세션iPhone의 데이터 — 사진, 비디오, 실시간 위치, 연락처, 캘린더, 클립보드 — 에 접근할 수 있게 해주는 폰-PC 브리지로, Claude가 로그인된 웹 서비스를 대상으로 자체 브라우저 자동화를 작성하고 실행할 수 있는 플러그인 시스템도 포함합니다.

폰은 단지 화면일 뿐입니다. 모든 바이트는 여러분 자신의 머신에 남으며, 여러분 자신의 Tailscale tailnet을 통해서만 이동합니다. 클라우드 구성 요소도, 제3자 서비스도 없으며, 어디에도 업로드되지 않습니다.

세 가지 구성 요소:

구성 요소

역할

server.py

포트 8778에서 실행되는 Flask + waitress 앱. 폰 측 PWA를 제공하고, 사진 업로드와 공유 시트 드롭을 받으며, 작업 큐를 실행합니다.

indexer.py

SQLite에 저장된 사진/비디오 라이브러리에 대한 CLIP 임베딩 + 시맨틱 검색.

mcp_server.py

stdio 기반 MCP 서버. Claude Code가 실제로 대화하는 대상입니다.


아키텍처

        iPhone                      Tailscale                    Windows PC
 ┌────────────────────┐            ┌───────────┐      ┌──────────────────────────────┐
 │ Claude app         │            │           │      │  Claude Code                 │
 │  (Remote Control)  │───────────────────────────────>│      │                       │
 │                    │            │           │      │      │ stdio                  │
 │ Bridge PWA :8778   │  upload    │  100.x    │      │  mcp_server.py  ── MCP tools  │
 │  - photo picker    │───────────>│ WireGuard │─────>│      │                       │
 │  - run Shortcut    │            │  CGNAT    │      │  server.py  :8778             │
 │  - /login mirror   │            │  range    │      │   /ingest  ──> vault/         │
 │                    │            │           │      │   /drop    ──> vault/drop/    │
 │ Shortcuts app      │  location  │           │      │   /records ──> records table  │
 │  - Claude Bridge   │  contacts  │           │      │   /job/*   ──> job queue      │
 │  - Send to Claude  │───────────>│           │      │   /login/* ──> login_session  │
 └────────────────────┘            └───────────┘      │                              │
                                                      │  indexer.py ── CLIP ── GPU    │
   iCloud for Windows                                 │  caps.py ── Playwright ──┐    │
   photo library  ─────────────────────────────────────> watch_dirs             │    │
                                                      │  bridge.db (SQLite)     │    │
                                                      └─────────────────────────┼────┘
                                                                                │
                                                                  profiles/<service>/
                                                                  (persistent cookies)

방화벽은 100.64.0.0/10 — Tailscale CGNAT 범위 — 만 허용합니다. 공개 인터넷에서는 아무것도 접근할 수 없습니다.


Related MCP server: remote-control-mcp

MCP 도구 목록

MCP 서버가 등록되면 Claude Code가 보게 되는 도구들입니다.

도구

기능

photos_stats

인덱스 크기, 날짜 범위, 아직 임베딩되지 않은 항목 수, 감시 중인 폴더. 사진 관련 작업은 무엇이든 먼저 호출하세요.

photos_search

짧은 영어 문구로 사진 비디오를 대상으로 하는 CLIP 시맨틱 검색. 날짜 범위, GPS 경계 상자 및 kind로 필터링할 수 있습니다.

photos_by_date

콘텐츠 순위 없이 시간 및/또는 장소만으로 자산을 최신순으로 나열합니다.

photos_places

사진 수와 첫/마지막 날짜가 포함된 대략적인 GPS 클러스터(~55 km) — "내가 어디에 있었고 언제였는지".

photos_open

Claude가 실제로 볼 수 있는 JPEG로 자산을 렌더링합니다: HEIC는 다운스케일되고, 비디오는 6프레임 콘택트 시트가 됩니다.

index_update

볼트와 감시 폴더에서 새 파일을 스캔한 다음, 아직 임베딩되지 않은 것을 모두 임베딩합니다.

phone_actions

폰 측 Shortcut이 수행할 수 있는 작업 이름.

phone_request

폰에 대한 작업을 큐에 넣습니다(현재 위치, 연락처, 캘린더, 클립보드, 딥 링크 열기, 알림).

phone_job_status

큐에 넣은 폰 작업의 결과.

capability_list

설치된 capability 플러그인과 각각의 브라우저 프로필이 로그인되어 있는지 여부.

capability_howto

새 capability 작성 규약 — capabilities/_TEMPLATE.py와 규칙을 반환합니다.

capability_run

이름으로 capability를 실행합니다. args는 해당 run()에 그대로 전달됩니다.

capability_login

일회성 수동 로그인을 엽니다: 기본적으로 폰에 미러링되거나, PC에서 실제 창으로 열립니다.

records_query

폰이 푸시한 비사진 페이로드를 읽습니다: 위치, 연락처, 캘린더, 클립보드, 공유 시트 드롭.


CLIP 시맨틱 검색

사진과 비디오는 openai/clip-vit-large-patch14 (구성 가능)로 임베딩됩니다. 사진은 이미지 임베딩 하나를 생성하고, 비디오는 클립 중간 70%에 걸쳐 분포된 세 프레임에서 샘플링되며 해당 프레임 임베딩은 평균화된 다음 다시 정규화됩니다. 모든 벡터는 L2 정규화된 float32이며 SQLite에 원시 BLOB로 저장되므로, 쿼리 하나는 날짜/지리 필터링된 후보 집합에 대한 numpy matmul 한 번입니다 — 수만 개의 자산에 대해 수십 밀리초가 걸립니다.

검색 과정은 다음과 같습니다:

  1. SQL에서 taken_at 범위 및/또는 [lat_min, lat_max, lon_min, lon_max] 경계 상자로 필터링합니다.

  2. 영어 텍스트 쿼리를 임베딩하고, 후보 행렬과 matmul을 수행하고, 코사인 유사도로 정렬한 다음 상위 k개를 가져옵니다.

  3. 답변이 아니라 후보를 반환합니다 — 그러면 Claude는 photos_open을 호출하고 아무 말 하기 전에 그것들을 봅니다.

이것을 실제로 사용하면서 얻은 두 가지 설계 메모:

  • 점수는 상대적입니다. 코사인 유사도는 모든 것에 대해 대략 0.15–0.35 범위에 머뭅니다. 순위가 중요합니다. 숫자는 그렇지 않습니다. 어떤 결과가 "일치"라고 판정되는 임계값은 없습니다.

  • 여행 질문은 비전이 아니라 지리입니다. "3년 전 일본 여행 사진 찾아줘"는 CLIP에게 일본이 어떻게 생겼는지 묻는 방식이어서는 안 됩니다. photos_places는 GPS 태그를 0.5° 그리드(~55 km)로 클러스터링하고 각 클러스터의 좌표와 날짜 범위를 보고하므로, Claude는 실제로 있었던 곳을 찾은 다음 그 창 안에서 콘텐츠로 범위를 좁힙니다. 여기서 순진한 국가 크기의 경계 상자는 정말로 위험합니다. [24, 46, 123, 146]의 일본 사각형은 한국 남동부까지 삼켜버리기 때문입니다.

비디오는 똑바른 방향으로 저장됩니다. iPhone은 세로 촬영을 1920×1080 가로 버퍼에 디스플레이 매트릭스 회전을 더한 형태로 기록하며, libav는 디코드 시 이 회전을 적용하지 않습니다. 따라서 indexer._upright()frame.rotation을 읽어 임베딩 전에 회전시킵니다.


보안 모델

이것은 HTTP 포트에서 여러분의 전체 사진 라이브러리와 여러 로그인된 계정을 노출합니다. 통제 수단은 의도적으로 단순하고 계층적입니다:

  • Tailnet 전용. open_firewall.ps1은 TCP 8778에 대한 인바운드 규칙을 -RemoteAddress 100.64.0.0/10인 Tailscale CGNAT 범위로 제한하여 생성합니다. 트래픽은 공개 인터넷에 닿지 않으며, Tailscale에 의해 WireGuard로 종단 간 암호화됩니다.

  • 공유 베어러 토큰. PWA 셸, /manifest.json/health를 제외한 모든 라우트는 config.json의 토큰을 요구하며, 이 토큰은 hmac.compare_digest로 비교되므로 검사가 일정 시간에 수행됩니다.

  • 쿼리 문자열의 토큰은 의도적인 절충입니다. <img src>는 헤더를 담을 수 없고, 폰의 Shortcuts 동작에서는 헤더를 다루기가 어렵습니다. 트래픽이 tailnet을 벗어나지 않기 때문에 이것이 허용될 뿐입니다. 이 포트를 공개적으로 노출하지 마십시오.

  • 경로 격리. 업로드된 모든 파일 이름은 safe_name()을 거칩니다(디렉터리 구성 요소와 Windows에서 허용되지 않는 문자를 제거하지만 Unicode는 유지하므로 한국어와 이모지 파일 이름이 살아남습니다). 그리고 무엇이든 쓰기 전에 확인된 대상 경로가 is_relative_to(VAULT)로 검사됩니다.

  • 비밀번호는 절대 로깅되지 않습니다. /login/input은 전달하는 내용을 명시적으로 필터링하며, login_session은 입력된 텍스트를 브라우저에 직접 전달합니다.

  • 폰 측 PWA는 토큰을 localStorage에 저장하므로, 한 번만 입력하면 됩니다.


작업 큐

iOS는 PC가 폰을 깨울 방법을 제공하지 않습니다. 그래서 흐름이 반대입니다:

  1. Claude가 phone_request("location.current")를 호출하면 jobs에 상태가 pending인 행이 삽입되고 작업 id가 즉시 반환됩니다.

  2. 폰은 탭, PWA의 버튼, 또는 예약된 자동화를 통해 Claude Bridge Shortcut을 실행합니다. 이 Shortcut은 /job/nextGET하며, 이는 하나의 작업을 원자적으로 taken으로 표시합니다. 대기 중인 것이 없으면 서버는 204로 응답하고 Shortcut은 그냥 종료됩니다.

  3. Shortcut은 action 이름에 따라 분기하여 데이터를 모은 다음 /records?job=<id> 또는 /job/<id>/done으로 POST합니다.

  4. Claude는 phone_job_status를 폴링합니다.

taken으로 표시되었지만 완료되지 않은 작업은 job_ttl_min분 후에 pending으로 돌아가므로, 실행 중에 중단된 Shortcut이 요청을 잃지 않습니다.

Claude는 조용히 폴링하는 대신 Shortcut을 실행하라고 여러분에게 말해야 합니다 — 이것은 도구의 docstring에 적혀 있습니다.


Capability 플러그인

capability는 capabilities/ 안의 Python 파일 하나이며 run(**kwargs) -> dict를 노출합니다. 모듈 docstring이 바로 스펙입니다 — Claude는 호출 여부를 결정하기 위해 이것을 읽으므로, 인자, 반환 형태, 로그인 필요 여부를 문서화합니다.

모듈은 호출마다 다시 임포트되므로(importlib.util.spec_from_file_location + exec_module), Claude가 30초 전에 작성하거나 편집한 capability가 즉시 적용됩니다. MCP 재시작도, 서버 재시작도 필요 없습니다.

의도는 누락된 통합이 막다른 길이 아니라는 것입니다. Claude는 머신에서 WriteBash를 사용할 수 있습니다. capability_howto를 호출하고, capabilities/<name>.py를 작성하고, 실행합니다. Claude가 작성한 것은 유지되고 축적됩니다.

저장소에는 두 가지가 포함되어 있습니다: webpage.py (실제 브라우저에서 임의의 URL을 렌더링하고 읽을 수 있는 텍스트를 반환, 선택적으로 로그인된 사용자로) 및 naver_mail.py (실질적인 작업 예제 — API를 추측하는 대신 웹 클라이언트 자체의 JSON XHR을 가로챕니다).

하나 작성하기

"""One line saying what this does - this line is what Claude sees in the list.

Args:
    since (str): 'YYYY-MM-DD'. Optional, defaults to 30 days ago.
    limit (int): max rows. Optional, default 20.

Returns:
    {"orders": [{"date","title","price","url"}], "count": int}

Notes:
    Requires a one-time manual login (PROFILE below).
"""

PROFILE = "example"                       # omit for capabilities needing no login
LOGIN_URL = "https://example.com/login"


def run(since: str = "", limit: int = 20) -> dict:
    from caps import browser

    with browser(PROFILE) as page:
        page.goto("https://example.com/orders", wait_until="domcontentloaded")
        if "login" in page.url:
            return {"error": "logged out",
                    "fix": f"call capability_login('{PROFILE}', '{LOGIN_URL}')"}
        rows = page.query_selector_all("li.order")
        if not rows:
            return {"error": "no rows matched 'li.order' - selector likely stale",
                    "url": page.url}
        ...

전체 주석 버전은 capabilities/_TEMPLATE.py를 참조하세요. capability_howto가 그대로 반환하는 규칙:

  • 항상 caps.browser(PROFILE)을 거치세요. Playwright를 직접 실행하지 마십시오.

  • 크게 실패하세요. 사이트 개편 후의 빈 목록은 "아무것도 없다"로 읽히며, 사용자는 그에 따라 행동하게 됩니다. 놓친 선택자를 지칭하는 {"error": ...}를 반환하세요.

  • 결제, 주문 확인 또는 송금을 자동화하지 마십시오. 수집하고, 결정하고, 화면을 준비하세요 — 사람이 마지막 버튼을 누릅니다.

  • 로그인을 자동화하지 마십시오 (아래 참조).

로그인은 의도적으로 수동입니다

로그인 자동화는 2FA와 캡차에 패배하며, 실패한 시도가 쌓이면 여러분의 계정이 잠깁니다. 그래서 지원되지 않습니다. 대신:

  1. Claude가 capability_login(profile, login_url)을 호출합니다.

  2. 기본적으로 PC에서 headless Chromium이 시작되고 그 화면이 /login에서 여러분의 폰으로 미러링됩니다 — 약 3fps로 JPEG 프레임이 나가고, 탭과 키 입력이 다시 전달됩니다. PC 화면에는 아무것도 나타나지 않으므로 게임에서 포커스를 빼앗지 않습니다. 브리지를 통해 입력하고 싶지 않은 계정에는 on_pc=True를 전달하세요.

  3. 여러분이 비밀번호를 직접 한 번 입력합니다.

  4. 쿠키는 유지되며 이후의 모든 실행에서 재사용됩니다.

"영구 프로필 사용"보다 미묘합니다. Chromium은 컨텍스트가 닫힐 때 세션 쿠키 — 만료 기한이 없는 쿠키 — 를 폐기하며, 많은 서비스(예: Naver의 NID_AUT / NID_SES)에서는 그것들이 바로 로그인입니다. 프로필 디렉터리는 완전히 채워진 것처럼 보여도 여전히 로그아웃된 상태일 수 있습니다. 그래서 caps.browser()는 열 때 load_state()를, 닫을 때 save_state()를 호출하여 쿠키를 profiles/<service>/storage_state.json으로 저장했다가 다시 불러오며, login_session은 로그인 도중 폰이 자리를 비울 경우를 대비해 약 10초마다 쿠키 스냅샷을 만듭니다.

caps.launch_kwargs()는 Playwright에 번들된 Chromium보다 channel="chrome" (실제 설치된 Chrome)을 선호합니다. 특히 Google이 로그인 중에 번들 빌드를 의심스러운 것으로 표시하기 때문입니다.


요구 사항

  • Windows (코드는 프로세스 우선순위와 CREATE_NO_WINDOWctypes.windll을 사용합니다)

  • Python 3.10+ (X | Y 타입 구문과 Path.is_relative_to를 사용합니다)

  • PC와 폰 양쪽에 **Tailscale**이 있어야 하며, 동일한 tailnet에 속해야 합니다

  • NVIDIA GPU는 선택 사항이지만 강력히 권장됩니다. CLIP은 CPU에서도 실행됩니다("device": "cpu"로 설정) — 단지 첫 전체 인덱스에서는 훨씬 느릴 뿐입니다.

  • iPhone. 폰 측의 모든 것은 내장 Shortcuts 앱과 홈 화면 PWA입니다. 설치할 앱도, 페어링도, 탈옥도 없습니다.

설치

git clone <this repo>
cd mobile_claude_connect

# CUDA build of torch first, if you have an NVIDIA GPU:
pip install torch --index-url https://download.pytorch.org/whl/cu128

pip install -r requirements.txt

# Browser engine for the capability plugins. Separate step - pip does not do this.
playwright install chromium

Google Chrome이 설치되어 있다면 caps.launch_kwargs()는 번들된 Chromium보다 그것(`

구성

copy config.example.json config.json
python -c "import secrets; print(secrets.token_urlsafe(24))"

config.json을 편집하세요:

  • token — 생성된 시크릿을 붙여넣으세요. 휴대폰에도 동일한 값이 필요합니다.

  • vault_dir — 휴대폰 업로드가 저장되는 절대 경로입니다.

  • watch_dirs — 사진을 제자리에서 스캔할 폴더입니다 (아무것도 복사되지 않음). iCloud for Windows 라이브러리를 가리키세요. 예: C:\Users\YOUR_USERNAME\Pictures\iCloud Photos\Photos.

  • devicecuda 또는 cpu.

config.json 없이 실행하면 스택 트레이스 대신 안내 메시지와 함께 종료됩니다.

방화벽

# Run as Administrator
powershell -ExecutionPolicy Bypass -File open_firewall.ps1

이것은 TCP 8778 포트를 100.64.0.0/10에만 열고 휴대폰에서 열 URL을 출력합니다. .ps1 파일은 ASCII 전용으로 유지하세요 — Windows PowerShell 5.1은 시스템 ANSI 코드 페이지로 읽으며, 비ASCII 문자가 있으면 손상됩니다.

실행

run_bridge.bat (또는 python server.py)을 더블클릭하세요. 창을 닫으면 브리지가 중지되고, 브리지가 내려가 있는 동안 휴대폰에서는 아무것도 작동하지 않습니다.

브리지가 켜져 있으면 인덱스는 스스로 유지됩니다: auto_index_minutes(기본값 15)마다 서버는 indexer.py단기 하위 프로세스로 생성하므로, 약 2GB의 CLIP VRAM은 서버가 살아있는 동안 계속 보유하는 대신 실행 사이에 반환됩니다. 유휴 패스는 파일 트리만 검사하고 GPU는 건드리지 않습니다. 출력은 autoindex.log로 이동합니다.

첫 대량 가져오기의 경우 python backfill.py는 소스 폴더가 더 이상 커지지 않을 때까지 스캔-임베드 루프를 반복합니다 — iCloud가 대용량 라이브러리를 아직 다운로드하는 동안 유용합니다. 자동 인덱싱과 동시에 실행하지 마세요; 두 CLIP 프로세스가 VRAM을 두고 경쟁하게 됩니다.

MCP 서버 등록

claude mcp add phone -s user -- python C:\path\to\mobile_claude_connect\mcp_server.py

주의: MCP 서버는 세션이 시작될 때 로드됩니다. claude mcp add로 추가된 서버는 현재 있는 세션에는 나타나지 않습니다. 새 세션을 시작하세요.

휴대폰 측 설정 — PWA, 대량 사진 가져오기, Shortcut 레시피 — 은 SETUP.md에 있습니다.

사용 방법

PC의 Claude Code 세션에서 (Claude 앱의 원격 제어를 통해 휴대폰에서 구동하는 세션 포함):

Find the photos from my trip three years ago that show a pump machine.

작동 방식: photos_stats로 적용 범위 확인 → photos_places로 실제 위치와 시기 확인 → photos_search("a pump machine", date_from=..., date_to=...)로 후보 순위 지정 → 상위 결과에 photos_openClaude가 JPEG를 보고 보이는 것에서 답변합니다. CLIP이 좁히고, Claude가 판단합니다.

한국어(또는 비영어) 쿼리는 검색 전에 짧은 영어 문구로 번역됩니다. CLIP의 텍스트 인코더는 영어 전용이기 때문입니다.


포함되지 않은 것

이 저장소는 코드만 포함합니다. 실행 중인 인스턴스를 유용하게 만든 모든 것은 개인 데이터이며 여기에 없습니다:

  • bridge.db — 사진 인덱스. 빈 인덱스로 시작합니다. watch_dirs를 사진 폴더로 지정하고 python indexer.py를 실행(또는 자동 인덱싱에 맡김)하여 직접 구축하세요. 첫 실행은 CLIP 모델(약 1.7GB)을 다운로드합니다.

  • vault/ — 업로드된 사진, 비디오 및 공유 시트 드롭.

  • preview/photos_open이 렌더링한 JPEG.

  • profiles/ — Playwright 브라우저 프로필, 즉 로그인된 활성 세션. capability_login을 통해 서비스별로 직접 로그인합니다.

  • config.json — 베어러 토큰을 보관합니다. config.example.json을 복사하세요.

이 모든 것은 .gitignore에 있습니다. 그대로 두세요.

알려진 제한 사항

  • 통화 기록과 SMS는 검색할 수 없습니다. iOS는 어떤 앱에도 이 둘에 대한 API를 제공하지 않습니다. 네이티브 앱도 도움이 되지 않습니다; 유일한 방법은 로컬 백업 추출이며, 이는 lockdown 페어링이 필요합니다.

  • PC가 켜져 있어야 합니다. 휴대폰은 화면일 뿐, 피어가 아닙니다.

  • /login 미러는 1366×900에서 약 3fps JPEG입니다 — 로그인 양식에는 충분하지만, 브라우징에는 적합하지 않습니다.

  • 휴대폰 측 PWA UI는 한국어입니다 (static/index.html, static/login.html). 서버, MCP 도구 및 Claude가 읽는 모든 것은 영어입니다.

라이선스

이것은 소스 전용 저장소입니다. 여기의 코드는 MIT입니다 — LICENSE 참조 — 그리고 이것이 이 저장소가 실제로 배포하는 유일한 것입니다. 다른 모든 것은 다른 곳에서 여러분의 기계로 도착합니다: pip install -r requirements.txt는 PyPI에서 휠을 가져오고, CLIP 가중치는 Hugging Face에서, 브라우저는 playwright install에서 옵니다. 여기서 타사 바이너리를 재배포하지 않습니다. 카피레프트 의무는 재배포에 붙으므로, 일반적인 경우 — 복제하고, 설치하고, 자신의 PC에서 실행 — 아래에서 해야 할 일은 거의 없으며, 나머지는 이 패키지를 다른 사람에게 전달할 때를 위해 기록해 둔 것입니다.

소스에서 실행 (대부분의 사람들이 하는 방식)

준수할 것이 없습니다. 표의 허용적 라이선스는 의존성에서 코드를 복사하여 자신의 프로젝트에 넣을 때 고지 사항이 유지되도록 요청할 뿐입니다. 계획을 세우기 전에 알아둘 두 가지가 있으며, 둘 다 카피레프트 문제는 아닙니다.

CLIP 가중치에는 라이선스가 없으며, 이는 허용적이라는 것과 같지 않습니다. 이것은 단순히 실행하는 동안에도 여러분이 하는 일에 영향을 줄 수 있는 유일한 항목입니다. transformers 라이브러리는 Apache-2.0이지만, 가중치는 별도의 조건이 있는 별도의 산출물입니다. Hugging Face 저장소 openai/clip-vit-large-patch14에는 LICENSE 파일이 없고 모델 카드 메타데이터에 license 필드도 선언되어 있지 않습니다. 업스트림 openai/CLIP 코드 저장소는 MIT(© 2021 OpenAI)이지만, 그 라이선스 텍스트는 해당 저장소의 코드를 다루며 체크포인트에 대해서는 언급하지 않습니다. 따라서: 이 가중치의 상업적 사용이 허용되는지 여부는 확인되지 않았습니다. 모델 카드도 자체 입장을 명확히 밝힙니다 — "모델의 배포된 사용 사례(상업적이든 아니든)는 현재 범위를 벗어납니다"라고 하며, 모델은 견고성과 일반화에 대한 연구를 위한 것이고, 감시 및 얼굴 인식은 영구적으로 범위를 벗어난다고 명명합니다. 이것은 라이선스 부여나 금지가 아닌 저자의 명시된 의도이지만, 이 위에 제품을 구축할지 결정한다면 그들이 말한 가장 직접적인 것입니다. clip_model을 명시적 라이선스 메타데이터가 있는 모델(공개 라이선스 CLIP 변형이 여러 개 존재)로 바꾸는 것이 깔끔한 해결책입니다.

타사 사이트 자동화는 이 라이선스가 아니라 해당 사이트의 약관에 따릅니다. 기능 플러그인은 로그인된 웹 세션을 구동합니다 — naver_mail.py가 제공된 예시이고, 명백한 다음 것들(Coupang Eats, Gmail)도 같은 형태입니다. 보유한 계정을 스크립트로 제어할 수 있는지 여부는 해당 서비스의 이용 약관과 적용 가능한 컴퓨터 접근 법률의 문제입니다; 이 코드의 MIT 라이선스는 거기서 아무것도 부여하지 않습니다. 이와 함께 등록하는 타사 MCP 서버도 마찬가지입니다: 자체 라이선스와 자체 서비스 약관을 지닙니다.

의존성 라이선스

스택은 대부분 허용적이지만, 두 개의 휠은 카피레프트 바이너리를, 하나는 독점 NVIDIA 라이브러리를, 한 구성 요소는 선언된 라이선스가 전혀 없습니다. 오른쪽 열의 모든 "아래 참조"는 재배포 의무이지 실행 시 의무가 아닙니다.

Dependency

Licence (SPDX)

What it obliges you to do

mcp (Model Context Protocol Python SDK)

MIT

고지문을 유지하십시오.

Flask 및 관련 체인(Werkzeug / Jinja2 / Click / itsdangerous / MarkupSafe / Blinker)

전체가 BSD-3-Clause이며, Blinker만 MIT입니다.

고지문을 유지하십시오.

waitress

ZPL-2.1

고지문을 유지하십시오. 수정한 파일은 변경되었음을 표시해야 합니다(ZPL 조항 5). 이 라이선스는 상표권을 부여하지 않습니다.

NumPy

BSD-3-Clause (번들된 코드의 전체 표현식은 BSD-3-Clause AND 0BSD AND MIT AND Zlib AND CC0-1.0)

고지문을 유지하십시오. 해당 wheel에는 OpenBLAS도 함께 번들되며, Linux에서는 libgfortran(GPL-3.0-or-later + GCC-exception-3.1 덕분에 귀하의 코드에 전파되지 않음) 및 libquadmath(LGPL-2.1-or-later)도 포함됩니다.

Pillow

MIT-CMU (HPND 스타일의 PIL 라이선스. Pillow 11.0.0에서 텍스트 변경 없이 SPDX 식별자가 HPND에서 변경되었습니다. SBOM 허용 목록이 여전히 HPND를 기대하는 경우 알아두면 유용합니다)

고지문을 유지하십시오.

transformers, huggingface_hub, tokenizers, safetensors

Apache-2.0

고지문과 NOTICE 파일을 유지하십시오. Apache-2.0은 또한 중요한 변경 사항을 명시하도록 요구합니다.

PyTorch

BSD-3-Clause — 단, CUDA wheel에는 NVIDIA CUDA 런타임 및 cuDNN도 번들로 포함되며, 이는 LicenseRef-NVIDIA-Proprietary로 선언됩니다

아래를 참조하십시오. 해당 항목은 BSD가 아닌 독점 소프트웨어입니다.

pillow-heif

소스는 BSD-3-Clause이지만, wheel에는 libheif 및 libde265(LGPL-3.0)와 x265(GPL-2.0) 이 번들되어 있습니다.

아래를 참조하십시오. PyPI는 이러한 이유로 패키지 자체를 GPLv2로 분류합니다.

PyAV (av)

바인딩은 BSD-3-Clause. wheel의 FFmpeg 코어는 LGPL-3.0-or-later이지만, wheel은 x264 및 x265(GPL-2.0-or-later) 도 함께 포함합니다.

아래를 참조하십시오.

Playwright

Apache-2.0 — 단, x64에서 다운로드되는 브라우저는 오픈소스 Chromium이 아닙니다

아래를 참조하십시오.

CLIP 가중치, openai/clip-vit-large-patch14

다운로드하는 아티팩트에 라이선스가 명시되어 있지 않습니다.

위 참조 — 유일한 진짜 미지수이며, 런타임에 중요한 유일한 항목입니다.

바이너리를 빌드하여 재배포하는 경우

이것을 설치 관리자, Docker 이미지 또는 다른 사람에게 전달하는 다른 형태의 아티팩트로 패키징하는 것이 위 표의 강조된 행들을 실제 작업으로 만들게 됩니다.

PyAV의 wheel은 LGPL FFmpeg와나란히 놓인 GPL 인코더로 구성됩니다 — 그 구분은 보이는 것보다 더 세밀합니다. FFmpeg는 기본적으로 LGPL-2.1-or-later이며, x264와 x265에 대해 업스트림이 요구하는 --enable-gpl 플래그로 빌드되면 GPL이 됩니다. PyAV의 wheel은 해당 플래그로 빌드되지 않았습니다: 번들된 avutillibavutil license: LGPL version 3 or later을 보고하며, configure 라인에는 --enable-gpl 없이 --enable-version3 --enable-libx264 --enable-libx265가 표시됩니다. 이것이 가능한 이유는 PyAV가 FFmpeg의 configure를 패치하여 libx264와 libx265를 GPL 목록에서 버전-3 목록으로 옮기기 때문입니다. 따라서 FFmpeg 코어는 LGPL-3.0-or-later입니다(?) avaliable in containers. However, x264 및 x265 자체는 GPL-2.0-or-later이며, av.libs/는 이를 libx264-165.dlllibx265.dll로 제공합니다. 따라서 pip install av는 FFmpeg 코어가 무엇이라고 말하든 여전히 GPL 코드를 시이 dependency graph에 넣습니다. 이 프로젝트는 비디오 길이, 회전 및 샘플 프레임만 읽고 인코더는 전혀 건드리지 않으므로, 재배포 시 실제 해결책은 이 두 DLL을 제거하거나 자체 FFmpeg에 대체하여 sdist (pip install --no-binary av av)에서 빌드하는 것입니다. 알아두면 좋은 두 가지 작은 공백이 있습니다: wheel의 licenses/ 디렉터리에는 PyAV 자체의 BSD-3-Clause 라이선스 텍스트만 있고 FFmpeg, x264 또는 x265 고지문은 없으며, delvewheel은 FFmpeg DLL의 이름에 해시 접미사를 추가합니다. 이 것은 FFmpeg 자체의 규정 준수 체크리스트에 배치됩니다.

pillow-heif는 동일한 구조에 더욱이 특허 문제가 있습니다. Python 코드는 BSD-3-Clause이지만, 바이너리 wheel은 libheif와 libde265(LGPL-3.0) 및 x265 인코더(GL-2.0)를 번들합니다. 이 때문에 PyPI 분류자는 선언된 라이선스 필드가 BSD-3-Clause로 되어 있음에도 불구하고 "GNU General Public License v2"로 표시합니다. 이 프로젝트는 훈드폰에서 HEIC를 디코딩만 하므로 GPL 인코더는 절대 호출되지 않지만, 여전히 wheel에 포함되어 있습니다. 저작권과는 별개로 독립적으로: HEIC 내부의 코덱인 HEVC/H.265는 특허 풀의 적용을 받으며, 관리 기관은 HEVC 인코딩 차이는 디코딩 기능이 있는 제품이 일반적으로 라이선스가 필요하다고 명시합니다. 이는 소소프트웨어 라이선스가 아니라 특허 문제이며, 디코더를 상업적으로 제품에 포함하는 제품을 겨재하는 것입니다—개인 서버는 대상이 아니지만—그러한 후자적인 의건이며 오픈소스 라이선스로 해결해 주지 않습니다.

Playwright는 Apache-2.0이며, x64에서 가져오는 브라우저는 오픈소스 Chromium이 아닙니다. Chromium 소스 자체는 많은 타사 라이선스 세트(Blink는 BSD/LGPL, Mozilla 파생 코드는 MPL/GPL/LLGPL, 그리고 chrome://credits에 집계된 수백 개 더)를 기반으로 한 BSD-3-Clause입니다. 그러나 playwright install chromium은 이제 x86에서 더 이상 해당 항목을 다운로드하지 않습니다. Playwright의 browsers.json은 다운로드를 "Chrome for Testing" 이라고 명명하며, cdn.playwright.dev는 Google의 자체 chrome-for-testing-public 버킷으로 리디렉션됩니다. 아티팩트는 Google이 빌드하고 Google 브랜드가 적용된 기술이며 Widevine CDM을 포함하는데, 해당 라이선스는 "오픈소스 소프트웨어가 아닙니다"라고 명백히 밝히고, Google과 별도 계약 없이 배포할 수 없습니다. linux-arm64 빌드만이 여전히 Playwright 자체의 순수 Chromium입니다. Playwright의 공식 문서는 기본값을 여전히 오픈소스 Chromium으로 설명하지만, 실제 배포 코드는 그렇지 않습니다. 별도로, caps.launch_kwargs()channel="chrome"을 선호합니다 — 즉 실제 설치된 Google Chrome은 오픈소스 라이선스가 아닌 Google Chrome 서비스 약관에 적용됩니다. 재배포에 대한 결론: 둘 다 번들하지 마십시오. 사용자가 자신의 브라우저를 설치하도록 하는 것이 이 저장소가 이미 하는 방식입니다. 검증되지 않음: Google이 Chrome for Testing을 소비자용 Chrome 약관에서 제외하는지 여부는 확인되지 않았습니다.

CUDA PyTorch 빌드는 순수한 BSD가 아닙니다. PyTorch 자체는 BSD-3-Clause이지만, 이 README의 설치 단계에서 권장하는 CUDA wheel — PyPI(Windows wheel은 CPU 전용)가 아닌 download.pytorch.org/whl/cu128에서 받는 파일 — NVIDIA CUDA 런타임 및 cuDNN 바이너리를 포함합니다. 설치된 torch ...+cu128을 검사하면 torch/lib에서 22개의 라이브러리가 확니다(cuBLAS, cuDNN, cuFFT, cuANAD, cuSOLVER, cuSPARSE 및 관련 라이브러리) 해당 wheel 메타데이터는 LicenseRef-NVIDIA-Proprietary를 선언하며, CUDA EULA는 다음과 같은 조것에서만 런타임을 재배포하 수 있습니다: 애프리케이션가 실질적인 기여를 해야 하고, 이이너리를수정하지 말고, 애프리케이션만 접근할 수 있어야 하며, SDK를 오소스 라이선스의 적용을 받도록 사용하지 말아야 합니다. cuDNN는 기조_항목과 충돌하는 부에 분 내에서 추가 조건을 둡니다. 어느 것도 BSD가 아입니다. 로컬 실행은 이러한 어떤 것의 영향도 받지 않습니다. CPU 전용 wheel은 그 문제를 피합니다.

여기 있는 어떤 것도 법적 조도가 아입니다.

A
license - permissive license
Not graded
quality - not tested
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI services like Claude and Cursor to remotely control a Mac by executing shell commands, managing files, and running AppleScript for UI automation. Access is secured through OAuth 2.0 authentication and encrypted tunnels to protect remote interactions.
    2
    MIT
  • A
    license
    B
    quality
    A
    maintenance
    Enables Claude to interact with Apple apps on macOS including Mail, Calendar, Contacts, Reminders, Notes, and iCloud Drive for personal productivity tasks like triaging email, managing calendar, and cross-app context.
    76
    5
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables Claude to access and search local messages and contacts across multiple platforms (iMessage, Discord, Gmail, Slack) via a local-first datastore, ensuring data never leaves the Mac.
    MIT

View all related MCP servers

Related MCP Connectors

  • Let ChatGPT, Claude & Cursor use your Mac: email, calendar, iMessage, Teams, files. Local, free.

  • Search, read, and write your Apple Notes from ChatGPT/Claude via a local Mac agent + MCP relay.

  • MCP connector for iMessage & Contacts via a local Mac agent + Vercel relay

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/riseblyp/mobile_claude_connect'

If you have feedback or need assistance with the MCP directory API, please join our Discord server