Skip to main content
Glama
riseblyp

mobile_claude_connect

by riseblyp

mobile_claude_connect

Eine Phone-zu-PC-Brücke, die einer auf Ihrem PC laufenden Claude-Code-Sitzung Zugriff auf die Daten Ihres iPhones gibt — Fotos, Videos, Live-Standort, Kontakte, Kalender, Zwischenablage — plus ein Plugin-System, mit dem Claude eigene Browser-Automatisierungen gegen angemeldete Webdienste schreiben und ausführen kann.

Das Telefon ist nur ein Bildschirm. Jedes Byte bleibt auf Ihrer eigenen Maschine und reist über Ihr eigenes Tailscale-Tailnet. Es gibt keine Cloud-Komponente, keinen Drittanbieterdienst, und nichts wird irgendwo hochgeladen.

Drei Komponenten:

Komponente

Was es ist

server.py

Flask- + waitress-App auf Port 8778. Stellt die telefonseitige PWA bereit, nimmt Foto-Uploads und Share-Sheet-Ablagen entgegen und führt die Job-Warteschlange aus.

indexer.py

CLIP-Embedding + semantische Suche über die Foto-/Videobibliothek, gespeichert in SQLite.

mcp_server.py

Ein MCP-Server über stdio. Das ist es, womit Claude Code tatsächlich spricht.


Architektur

        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)

Die Firewall erlaubt nur 100.64.0.0/10 — den Tailscale-CGNAT-Bereich. Nichts ist vom öffentlichen Internet aus erreichbar.


Related MCP server: remote-control-mcp

MCP-Tooloberfläche

Das sind die Tools, die Claude Code sieht, sobald der MCP-Server registriert ist.

Tool

Was es tut

photos_stats

Indexgröße, Datumsbereich, wie viele Elemente noch nicht eingebettet sind, welche Ordner überwacht werden. Rufen Sie das zuerst auf, wenn es um Fotos geht.

photos_search

CLIP-semantische Suche über Fotos und Videos anhand einer kurzen englischen Phrase, filterbar nach Datumsbereich, GPS-Bounding-Box und kind.

photos_by_date

Assets nur nach Zeit und/oder Ort auflisten, neueste zuerst, ohne Inhaltsranking.

photos_places

Grobe GPS-Cluster (~55 km) mit Fotoanzahl und erstem/letztem Tag — "wo war ich, und wann".

photos_open

Assets als JPEGs rendern, die Claude tatsächlich ansehen kann: HEIC wird verkleinert, ein Video wird zu einem 6-Frame-Kontaktbogen.

index_update

Tresor und überwachte Ordner nach neuen Dateien durchsuchen und dann alles einbetten, was noch nicht eingebettet ist.

phone_actions

Die Aktionsnamen, die die telefonseitige Shortcut-Kurzbefehl ausführen kann.

phone_request

Einen Auftrag für das Telefon in die Warteschlange stellen (aktueller Standort, Kontakte, Kalender, Zwischenablage, Deep Link öffnen, benachrichtigen).

phone_job_status

Ergebnis eines eingereihten Telefon-Auftrags.

capability_list

Installierte Capability-Plugins und ob das Browserprofil von jedem angemeldet ist.

capability_howto

Der Vertrag zum Schreiben einer neuen Capability — gibt capabilities/_TEMPLATE.py und die Regeln zurück.

capability_run

Eine Capability nach Namen ausführen; args werden direkt an deren run() übergeben.

capability_login

Ein einmaliges menschliches Login öffnen: standardmäßig auf das Telefon gespiegelt, oder ein echtes Fenster auf dem PC.

records_query

Nicht-Foto-Daten lesen, die das Telefon gepusht hat: Standort, Kontakte, Kalender, Zwischenablage, Share-Sheet-Ablagen.


CLIP-semantische Suche

Fotos und Videos werden mit openai/clip-vit-large-patch14 eingebettet (konfigurierbar). Ein Foto trägt ein Bild-Embedding bei; ein Video wird an drei Frames über die mittleren 70 % des Clips abgetastet, und die Frame-Embeddings werden gemittelt und dann erneut normalisiert. Jeder Vektor ist L2-normalisiertes float32 und wird als roher BLOB in SQLite gespeichert, sodass eine Abfrage ein einziges numpy-Matmul über die nach Datum/Geo gefilterte Kandidatenmenge ist — zig Millisekunden über Zehntausende von Assets.

Eine Suche läuft so ab:

  1. In SQL nach taken_at-Bereich und/oder einer [lat_min, lat_max, lon_min, lon_max]-Bounding-Box filtern.

  2. Den englischen Text abfragen einbetten, gegen die Kandidatenmatrix matmulen, nach Kosinusähnlichkeit sortieren, die obersten k nehmen.

  3. Kandidaten zurückgeben, keine Antworten — Claude ruft dann photos_open auf und schaut sie sich an, bevor es etwas sagt.

Zwei Design-Anmerkungen, die aus der intensiven Nutzung entstanden sind:

  • Werte sind relativ. Die Kosinusähnlichkeit landet für alles in etwa bei 0,15–0,35. Das Ranking zählt; die Zahl nicht. Es gibt keinen Schwellenwert, ab dem ein Treffer "ein" Treffer ist.

  • Reisefragen sind Geografie, nicht Bilderkennung. "Finde Fotos von meiner Japan-Reise vor drei Jahren" sollte CLIP nicht fragen, wie Japan aussieht. photos_places clustert GPS-Tags auf ein 0,5°-Raster (~55 km) und meldet die Koordinaten und den Datumsbereich jedes Clusters, sodass Claude findet, wo Sie tatsächlich waren, und dann innerhalb dieses Fensters nach Inhalt eingrenzt. Eine naive ländergroße Bounding-Box ist hier wirklich gefährlich: Ein Japan-Rechteck von [24, 46, 123, 146] verschluckt auch den Südosten Koreas.

Videos werden aufrecht gespeichert: iPhones filmen Hochformat als 1920×1080-Querformatpuffer plus eine Display-Matrix-Rotation, die libav beim Dekodieren nicht anwendet, daher liest indexer._upright() frame.rotation und rotiert vor dem Einbetten.


Sicherheitsmodell

Das legt Ihre gesamte Fotobibliothek und mehrere angemeldete Konten auf einem HTTP-Port offen. Die Kontrollen sind bewusst einfach und mehrschichtig:

  • Nur Tailnet. open_firewall.ps1 erstellt eine eingehende Regel für TCP 8778, beschränkt auf -RemoteAddress 100.64.0.0/10, den Tailscale-CGNAT-Bereich. Der Datenverkehr berührt niemals das öffentliche Internet; er ist von Tailscale Ende-zu-Ende WireGuard-verschlüsselt.

  • Gemeinsames Bearer-Token. Jede Route außer der PWA-Hülle, /manifest.json und /health erfordert das Token aus config.json, verglichen mit hmac.compare_digest, damit die Prüfung konstante Laufzeit hat.

  • Token in der Abfragezeichenfolge ist ein bewusster Kompromiss. <img src> kann keinen Header transportieren, und die Shortcut-Aktionen des Telefons machen Header unhandlich. Das ist nur akzeptabel, weil der Datenverkehr das Tailnet nie verlässt. Setzen Sie diesen Port nicht öffentlich aus.

  • Pfad-Eindämmung. Jeder hochgeladene Dateiname läuft durch safe_name() (das Verzeichniskomponenten und unter Windows unzulässige Zeichen entfernt, aber Unicode behält, sodass koreanische und Emoji-Dateinamen überleben), und das aufgelöste Ziel wird mit is_relative_to(VAULT) geprüft, bevor etwas geschrieben wird.

  • Passwörter werden nie protokolliert. /login/input filtert explizit, was es weiterleitet, und login_session übergibt getippten Text direkt an den Browser.

  • Die telefonseitige PWA speichert das Token im localStorage, sodass Sie es nur einmal eingeben.


Die Job-Warteschlange

iOS bietet keine Möglichkeit für einen PC, ein Telefon aufzuwecken. Der Ablauf ist also umgekehrt:

  1. Claude ruft phone_request("location.current") auf, das eine Zeile in jobs mit dem Status pending einfügt und sofort eine Job-ID zurückgibt.

  2. Das Telefon führt den Claude-Bridge-Shortcut aus — per Tipp, über den Button der PWA oder aus einer geplanten Automation. Er macht ein GET auf /job/next, das einen Job atomar als taken markiert. Wenn nichts in der Warteschlange ist, antwortet der Server mit 204 und der Shortcut endet einfach.

  3. Der Shortcut verzweigt je nach action-Namen, sammelt die Daten und POSTet sie an /records?job=<id> oder /job/<id>/done.

  4. Claude fragt phone_job_status ab.

Ein Job, der als taken markiert, aber nie abgeschlossen wird, wird nach job_ttl_min Minuten wieder auf pending gesetzt, sodass ein mitten im Lauf abgebrochener Shortcut die Anfrage nicht verliert.

Claude muss Ihnen sagen, dass Sie den Shortcut ausführen sollen, statt still abzufragen — das steht in der Docstring des Tools.


Capability-Plugins

Eine Capability ist eine Python-Datei in capabilities/, die run(**kwargs) -> dict bereitstellt. Ihre Modul-Docstring ist die Spezifikation — das ist es, was Claude liest, um zu entscheiden, ob es sie aufrufen soll, sie dokumentiert also die Argumente, die Rückgabeform und ob ein Login nötig ist.

Module werden bei jedem Aufruf neu importiert (importlib.util.spec_from_file_location + exec_module), sodass eine Capability, die Claude vor dreißig Sekunden geschrieben oder bearbeitet hat, sofort aktiv ist. Kein MCP-Neustart, kein Server-Neustart.

Die Absicht ist, dass eine fehlende Integration keine Sackgasse ist. Claude hat Write und Bash auf der Maschine: Es ruft capability_howto auf, schreibt capabilities/<name>.py und führt es aus. Was es schreibt, bleibt erhalten und sammelt sich an.

Zwei sind im Repository enthalten: webpage.py (jede URL in einem echten Browser rendern und den lesbaren Text zurückgeben, optional als angemeldeter Benutzer) und naver_mail.py (ein ausführliches ausgearbeitetes Beispiel — es fängt die eigenen JSON-XHRs des Webclients ab, statt eine API zu raten).

Eine schreiben

"""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}
        ...

Vollständige annotierte Version in capabilities/_TEMPLATE.py. Die Regeln, die capability_howto wörtlich zurückgibt:

  • Immer über caps.browser(PROFILE) gehen. Playwright nie direkt starten.

  • Laut scheitern. Eine leere Liste nach einem Website-Redesign liest sich als "du hast nichts", worauf der Benutzer reagieren wird. Ein {"error": ...} zurückgeben, das den Selector nennt, der danebengegangen ist.

  • Zahlung, Bestellbestätigung oder Geldtransfer niemals automatisieren. Sammeln, entscheiden, den Bildschirm vorbereiten — den letzten Button tippt der Mensch.

  • Ein Login niemals automatisieren (siehe unten).

Logins sind bewusst manuell

Die Automatisierung einer Anmeldung scheitert an 2FA und Captchas, und ein Haufen fehlgeschlagener Versuche sperrt Ihr Konto. Das wird also nicht unterstützt. Stattdessen:

  1. Claude ruft capability_login(profile, login_url) auf.

  2. Standardmäßig startet ein headless Chromium auf dem PC, und sein Bildschirm wird auf Ihr Telefon gespiegelt unter /login — JPEG-Frames mit ~3 fps, Tipps und Tastatureingaben werden zurückgeschickt. Auf dem PC-Bildschirm erscheint nichts, sodass es einem Spiel nicht den Fokus stehlen kann. on_pc=True für Konten, die Sie lieber nicht über die Brücke eintippen möchten.

  3. Sie geben das Passwort selbst ein, einmal.

  4. Cookies bleiben erhalten, und jeder spätere Lauf verwendet sie wieder.

Die Persistenz ist subtiler als "ein persistentes Profil verwenden". Chromium verwirft Session-Cookies — die ohne Ablaufdatum — wenn der Kontext geschlossen wird, und für viele Dienste (Navers NID_AUT / NID_SES zum Beispiel) sind das das Login. Ein Profilverzeichnis kann voll bestückt aussehen und trotzdem abgemeldet sein. Also ruft caps.browser() beim Öffnen load_state() und beim Schließen save_state() auf und schleust die Cookies durch profiles/<service>/storage_state.json, und login_session macht etwa alle ~10 Sekunden Schnappschüsse, falls das Telefon mitten im Login weggeht.

caps.launch_kwargs() bevorzugt channel="chrome" (Ihr echtes installiertes Chrome) gegenüber dem mitgelieferten Chromium von Playwright, weil insbesondere Google das gebündelte Build beim Anmelden markiert.


Anforderungen

  • Windows (der Code verwendet ctypes.windll für Prozesspriorität und CREATE_NO_WINDOW)

  • Python 3.10+ (verwendet X | Y-Typsyntax und Path.is_relative_to)

  • Tailscale auf dem PC und dem Telefon, im selben Tailnet

  • Eine NVIDIA-GPU ist optional, aber stark empfohlen. CLIP läuft auf der CPU (setzen Sie "device": "cpu") — es ist nur für einen ersten vollständigen Index viel langsamer.

  • Ein iPhone. Alles Telefonseitige ist die integrierte Shortcuts-App plus eine PWA auf dem Startbildschirm; keine App zu installieren, kein Pairing, kein Jailbreak.

Installation

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

Wenn Google Chrome installiert ist, verwendet caps.launch_kwargs() es (channel="chrome") gegenüber dem gebündelten Chromium, und playwright install chromium wird optional.

Konfiguration

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

Bearbeiten Sie config.json:

  • token — fügen Sie das generierte Geheimnis ein. Das Telefon benötigt denselben Wert.

  • vault_dir — absoluter Pfad, in dem Telefon-Uploads landen.

  • watch_dirs — Ordner, die an Ort und Stelle nach Fotos durchsucht werden (es wird nichts kopiert). Weisen Sie dies auf Ihre iCloud für Windows-Bibliothek, z. B. C:\Users\YOUR_USERNAME\Pictures\iCloud Photos\Photos.

  • devicecuda oder cpu.

Wenn Sie ohne config.json ausführen, wird mit Anweisungen beendet, nicht mit einem Stack-Trace.

Firewall

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

Dies öffnet TCP 8778 nur für 100.64.0.0/10 und gibt die URL aus, die auf dem Telefon geöffnet werden soll. Halten Sie .ps1-Dateien rein ASCII — Windows PowerShell 5.1 liest sie in der System-ANSI-Codepage, und nicht-ASCII-Zeichen führen zu Korruption.

Ausführen

Doppelklicken Sie auf run_bridge.bat (oder python server.py). Das Schließen des Fensters stoppt die Brücke, und vom Telefon aus funktioniert nichts, solange sie nicht läuft.

Wenn die Brücke läuft, pflegt sich der Index selbst: Alle auto_index_minutes (Standard 15) startet der Server indexer.py als kurzlebigen Unterprozess, sodass die ~2 GB CLIP-VRAM zwischen den Läufen zurückgegeben werden, anstatt sie so lange zu halten, wie der Server lebt. Ein Leerlaufdurchlauf prüft nur den Dateibaum und berührt nie die GPU. Die Ausgabe geht an autoindex.log.

Für einen ersten Massenimport führt python backfill.py eine Schleife aus Scannen und Einbetten aus, bis der Quellordner nicht mehr wächst — nützlich, während iCloud noch eine große Bibliothek herunterlädt. Führen Sie es nicht gleichzeitig mit der automatischen Indizierung aus; zwei CLIP-Prozesse kämpfen um VRAM.

MCP-Server registrieren

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

Achtung: MCP-Server werden beim Start einer Sitzung geladen. Ein Server, der mit claude mcp add hinzugefügt wurde, erscheint nicht in der Sitzung, in der Sie sich gerade befinden. Starten Sie eine neue Sitzung.

Die Einrichtung auf der Telefonseite — die PWA, der Massenimport von Fotos und die Shortcut-Rezepte — finden Sie in SETUP.md.

Verwendung

Aus einer Claude-Code-Sitzung auf dem PC (einschließlich einer, die Sie vom Telefon aus über die Fernsteuerung der Claude-App steuern):

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

Was passiert: photos_stats zur Überprüfung der Abdeckung → photos_places um herauszufinden, wo Sie tatsächlich waren und wann → photos_search("a pump machine", date_from=..., date_to=...) zur Rangfolge der Kandidaten → photos_open auf die besten Treffer → Claude schaut sich die JPEGs an und antwortet basierend auf dem, was es sieht. CLIP grenzt ein; Claude bewertet.

Koreanische (oder beliebige nicht-englische) Abfragen werden vor der Suche in eine kurze englische Phrase übersetzt, da der Text-Encoder von CLIP nur Englisch unterstützt.


Was nicht enthalten ist

Dieses Repository enthält nur Code. Alles, was die laufende Instanz nützlich machte, sind persönliche Daten und ist nicht hier:

  • bridge.db — der Fotoindex. Sie beginnen mit einem leeren Index. Weisen Sie watch_dirs auf einen Fotoordner und führen Sie python indexer.py aus (oder lassen Sie die automatische Indizierung es tun), um Ihren eigenen zu erstellen. Der erste Lauf lädt das CLIP-Modell herunter, etwa 1,7 GB.

  • vault/ — hochgeladene Fotos, Videos und Share-Sheet-Ablagen.

  • preview/ — JPEGs, die von photos_open gerendert werden.

  • profiles/ — Playwright-Browserprofile, d. h. live angemeldete Sitzungen. Sie melden sich selbst an, einmal pro Dienst, über capability_login.

  • config.json — enthält das Bearer-Token. Kopieren Sie config.example.json.

Alle diese befinden sich in .gitignore. Lassen Sie sie dort.

Bekannte Einschränkungen

  • Anrufverlauf und SMS können nicht abgerufen werden. iOS bietet keine API für beides, für keine App. Eine native App würde nicht helfen; der einzige Weg ist die Extraktion aus lokalen Backups, die Lockdown-Pairing erfordert.

  • Der PC muss eingeschaltet sein. Das Telefon ist ein Bildschirm, kein Peer.

  • Der /login-Spiegel ist ~3 fps JPEG bei 1366×900 — gut für ein Anmeldeformular, nicht zum Browsen.

  • Die PWA-Oberfläche auf der Telefonseite ist auf Koreanisch (static/index.html, static/login.html). Der Server, die MCP-Tools und alles, was Claude liest, sind auf Englisch.

Lizenz

Dies ist ein reines Quellcode-Repository. Der Code hier ist MIT — siehe LICENSE — und es ist das Einzige, was dieses Repo tatsächlich verteilt. Alles andere gelangt auf Ihren Rechner von woanders: pip install -r requirements.txt zieht die Wheels von PyPI, die CLIP-Gewichte kommen von Hugging Face, und der Browser kommt von playwright install. Hier wird kein Drittanbieter-Binärprogramm weiterverteilt. Copyleft-Verpflichtungen gelten für die Weiterverteilung, also für den normalen Fall — klonen, installieren, auf dem eigenen PC ausführen — müssen Sie fast nichts von dem unten Stehenden tun, und der Rest ist für den Tag aufgeschrieben, an dem Sie dies zu etwas verpacken, das Sie jemand anderem geben.

Ausführen aus dem Quellcode (was fast jeder tut)

Es gibt nichts zu beachten. Die permissiven Lizenzen in der Tabelle verlangen nur, dass Hinweise erhalten bleiben, wenn Sie Code aus einer Abhängigkeit in Ihr eigenes Projekt kopieren. Zwei Dinge sind dennoch wissenswert, bevor Sie Pläne machen, und keines davon ist eine Copyleft-Frage.

Die CLIP-Gewichte haben keine Lizenz, und das ist nicht dasselbe wie permissiv. Dies ist das eine Element hier, das beeinflussen kann, was Sie mit dem Ding tun, während Sie es nur ausführen. Die Bibliothek transformers ist Apache-2.0, aber die Gewichte sind ein separates Artefakt mit separaten Bedingungen. Das Hugging-Face-Repo openai/clip-vit-large-patch14 enthält keine LICENSE-Datei und deklariert kein license-Feld in den Metadaten der Modellkarte. Das Upstream-Repository openai/CLIP ist MIT (© 2021 OpenAI), aber dieser Lizenztext deckt den Code in diesem Repository ab und sagt nichts über Checkpoints. Also: ob die kommerzielle Nutzung dieser Gewichte erlaubt ist, ist unverifiziert. Die Modellkarte gibt auch ihre eigene Position klar an — „Jeder Einsatzfall des Modells — ob kommerziell oder nicht — ist derzeit außerhalb des Rahmens", wobei das Modell für Forschung zu Robustheit und Generalisierung gedacht ist, und Überwachung und Gesichtserkennung als dauerhaft außerhalb des Rahmens genannt werden. Das ist die erklärte Absicht der Autoren und keine Lizenzgewährung oder -verbot, aber wenn Sie entscheiden, ob Sie ein Produkt darauf aufbauen, ist es das Direkteste, was sie gesagt haben. Das Austauschen von clip_model gegen ein Modell mit expliziten Lizenzmetadaten (es gibt mehrere offen lizenzierte CLIP-Varianten) ist der saubere Ausweg.

Die Automatisierung einer Drittanbieter-Website unterliegt den Bedingungen dieser Website, nicht dieser Lizenz. Die Fähigkeits-Plugins steuern angemeldete Websitzungen — naver_mail.py ist das mitgelieferte Beispiel, und die offensichtlichen nächsten (Coupang Eats, Gmail) haben die gleiche Form. Ob Sie ein Konto, das Sie besitzen, per Skript steuern dürfen, ist eine Frage der Nutzungsbedingungen dieses Dienstes und des geltenden Computerzugriffsrechts; die MIT-Lizenz auf diesem Code gewährt Ihnen dort nichts. Das Gleiche gilt für jeden Drittanbieter-MCP-Server, den Sie neben diesem registrieren: Er trägt seine eigene Lizenz und seine eigenen Dienstbedingungen.

Abhängigkeitslizenzen

Der Stack ist größtenteils permissiv, aber zwei der Wheels enthalten Copyleft-Binärdateien, eines enthält proprietäre NVIDIA-Bibliotheken, und eine Komponente hat überhaupt keine deklarierte Lizenz. Jedes „siehe unten" in der rechten Spalte ist eine Weiterverteilungsverpflichtung, keine Laufzeitverpflichtung.

Abhängigkeit

Lizenz (SPDX)

Wozu es dich verpflichtet

mcp (Model Context Protocol Python SDK)

MIT

Behalte den Hinweis.

Flask und seine Kette aus Werkzeug / Jinja2 / Click / itsdangerous / MarkupSafe / Blinker

durchgehend BSD-3-Clause, außer Blinker, das MIT ist

Behalte den Hinweis.

waitress

ZPL-2.1

Behalte den Hinweis; markiere alle Dateien, die du änderst, als geändert (ZPL-Klausel 5); die Lizenz gewährt keine Markenrechte.

NumPy

BSD-3-Clause (voller Ausdruck BSD-3-Clause AND 0BSD AND MIT AND Zlib AND CC0-1.0 für gebündelten Code)

Behalte den Hinweis. Seine Wheels bündeln außerdem OpenBLAS und unter Linux libgfortran (GPL-3.0-or-later WITH GCC-exception-3.1, was genau verhindert, dass es deinen Code erreicht) und libquadmath (LGPL-2.1-or-later).

Pillow

MIT-CMU (die HPND-artige PIL-Lizenz; die SPDX-ID änderte sich bei Pillow 11.0.0 von HPND, ohne dass sich der Text änderte — wissenswert, falls eine SBOM-Allowlist immer noch HPND erwartet)

Behalte den Hinweis.

transformers, huggingface_hub, tokenizers, safetensors

Apache-2.0

Behalte den Hinweis und die NOTICE-Datei; Apache-2.0 verlangt außerdem, dass du wesentliche Änderungen angibst.

PyTorch

BSD-3-Clause — aber ein CUDA-Wheel bündelt auch NVIDIAs CUDA-Laufzeit und cuDNN, deklariert als LicenseRef-NVIDIA-Proprietary

Siehe unten. Diese sind proprietär, nicht BSD.

pillow-heif

Quellcode unter BSD-3-Clause, aber die Wheels bündeln libheif und libde265 (LGPL-3.0) und x265 (GPL-2.0)

Siehe unten. PyPI klassifiziert das Paket selbst aus diesem Grund als GPLv2.

PyAV (av)

Binding unter BSD-3-Clause; der FFmpeg-Kern des Wheels ist LGPL-3.0-or-later, aber das Wheel enthält auch x264 und x265 (GPL-2.0-or-later)

Siehe unten.

Playwright

Apache-2.0 — aber auf x64 ist der Browser, den es herunterlädt, kein Open-Source-Chromium

Siehe unten.

CLIP-Gewichte, openai/clip-vit-large-patch14

Keine Lizenz deklariert für das Artefakt, das du herunterlädst

Siehe oben — die eine echte Unbekannte und der einzige Eintrag, der zur Laufzeit zählt.

Wenn du ein Binärpaket baust und weiterverteilst

Das Verpacken in einen Installer, ein Docker-Image oder ein anderes Artefakt, das du jemand anderem übergibst, ist das, was die oben markierten Zeilen zu Arbeit macht.

PyAVs Wheel ist LGPL-FFmpeg mit GPL-Encodern daneben – der Unterschied ist feiner, als es aussieht. FFmpeg ist standardmäßig LGPL-2.1-or-later und wird zu GPL, wenn es mit --enable-gpl gebaut wird, was upstream für x264 und x265 verlangt. PyAVs Wheels sind nicht mit diesem Flag gebaut: Das gebündelte avutil meldet libavutil license: LGPL version 3 or later und seine Configure-Zeile zeigt --enable-version3 --enable-libx264 --enable-libx265 ohne --enable-gpl. Das ist möglich, weil PyAV FFmpegs configure patcht, um libx264 und libx265 aus der GPL-Liste in die Version-3-Liste zu verschieben. Der FFmpeg-Kern ist daher LGPL-3.0-or-later – aber x264 und x265 sind selbst GPL-2.0-or-later, und av.libs/ liefert sie als libx264-165.dll und libx265.dll. Also bringt pip install av weiterhin GPL-Code in deinen Abhängigkeitsgraphen, egal was der FFmpeg-Kern sagt. Dieses Projekt liest nur Videodauer, Rotation und Beispielbilder und berührt nie einen Encoder, also ist die praktische Lösung, falls du weiterverteilst, diese beiden DLLs wegzulassen oder aus dem Sdist (pip install --no-binary av av) gegen dein eigenes FFmpeg zu bauen. Zwei kleinere Lücken, die man kennen sollte: Das licenses/-Verzeichnis des Wheels enthält nur PyAVs eigenen BSD-3-Clause-Text und keine der FFmpeg-, x264- oder x265-Hinweise, und delvewheel benennt die FFmpeg-DLLs mit Hash-Suffixen um, was FFmpegs eigener Compliance-Checkliste zuwiderläuft.

pillow-heif hat dieselbe Struktur, plus eine Patentfrage. Sein Python-Code ist BSD-3-Clause, aber das binäre Wheel bündelt libheif und libde265 unter LGPL-3.0 und den x265-Encoder unter GPL-2.0 – weshalb sein PyPI-Klassifikator „GNU General Public License v2" lautet, obwohl sein deklariertes Lizenzfeld BSD-3-Clause angibt. Dieses Projekt dekodiert HEIC nur vom Telefon, also wird der GPL-Encoder nie aufgerufen, aber er ist trotzdem im Wheel. Unabhängig vom Urheberrecht: HEVC/H.265, der Codec in HEIC, unterliegt Patentpools, deren Verwalter erklären, dass Produkte mit HEVC-Enkodier- oder -Dekodierfunktionalität typischerweise eine Lizenz benötigen. Das ist eine Patentangelegenheit, keine Software-Lizenzangelegenheit, und sie richtet sich an Produkte, die Decoder kommerziell vertreiben – ein persönlicher Server ist nicht das Ziel –, aber es ist eine echte Verpflichtung, die keine Open-Source-Lizenz für dich löst.

Playwright ist Apache-2.0, und auf x64 ist der Browser, den es herunterlädt, kein Open-Source-Chromium. Chromiums eigener Quellcode ist BSD-3-Clause über eine große Sammlung von Drittanbieter-Lizenzen (Blink unter BSD/LGPL, von Mozilla abgeleiteter Code unter MPL/GPL/LGPL und mehrere hundert weitere, zusammengefasst unter chrome://credits). Aber playwright install chromium lädt das auf x64 nicht mehr herunter. Playwrights browsers.json nennt den Download „Chrome for Testing", und cdn.playwright.dev leitet auf Googles eigenen chrome-for-testing-public-Bucket um. Das Artefakt ist von Google gebaut und mit Google-Markenzeichen versehen, und es bündelt das Widevine CDM, dessen Lizenz klar sagt, dass es „keine Open-Source-Software" ist und ohne separate Vereinbarung mit Google nicht weitergegeben werden darf. Nur der linux-arm64-Build ist weiterhin Playwrights eigenes schlichtes Chromium. Playwrights öffentliche Dokumentation beschreibt den Standard weiterhin als Open-Source-Chromium; der ausgelieferte Code sagt etwas anderes. Unabhängig davon bevorzugt caps.launch_kwargs() channel="chrome" – dein tatsächlich installiertes Google Chrome, das von den Google-Chrome-Nutzungsbedingungen geregelt wird und nicht von einer Open-Source-Lizenz. Das Fazit für die Weiterverteilung: Bündle keines von beiden. Lass den Benutzer seinen eigenen Browser installieren, was dieses Repo bereits tut. Unverifiziert: ob Google Chrome for Testing von den Chrome-Nutzungsbedingungen für Verbraucher ausnimmt.

Ein CUDA-PyTorch-Build ist nicht rein BSD. PyTorch selbst ist BSD-3-Clause, aber das CUDA-Wheel, das der Installationsschritt dieser README empfiehlt – das von download.pytorch.org/whl/cu128, nicht von PyPI, dessen Windows-Wheel nur CPU unterstützt – enthält NVIDIAs CUDA-Laufzeit- und cuDNN-Binärdateien. Eine Untersuchung eines installierten torch ...+cu128 zeigt 22 davon in torch/lib (cuBLAS, cuDNN, cuFFT, cuRAND, cuSOLVER, cuSPARSE und weitere). Ihre Wheel-Metadaten deklarieren LicenseRef-NVIDIA-Proprietary, und die CUDA-EULA erlaubt die Weiterverteilung der Laufzeit nur unter ihren eigenen Bedingungen: Deine Anwendung muss wesentliche Funktionalität hinzufügen, die Binärdateien dürfen nicht verändert werden, sie müssen nur für deine Anwendung erreichbar sein, und du darfst das SDK nicht in einer Weise verwenden, die es einer Open-Source-Lizenz unterwerfen würde. cuDNN fügt ein Supplement hinzu, das die Basisbedingungen überschreibt, wo sie in Konflikt stehen. Nichts davon ist BSD. Lokales Ausführen wird davon nicht berührt; das reine CPU-Wheel umgeht die Frage vollständig.

Nichts hiervon ist Rechtsberatung.

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