mobile_claude_connect
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 |
| Flask- + waitress-App auf Port |
| CLIP-Embedding + semantische Suche über die Foto-/Videobibliothek, gespeichert in SQLite. |
| 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 |
| Indexgröße, Datumsbereich, wie viele Elemente noch nicht eingebettet sind, welche Ordner überwacht werden. Rufen Sie das zuerst auf, wenn es um Fotos geht. |
| CLIP-semantische Suche über Fotos und Videos anhand einer kurzen englischen Phrase, filterbar nach Datumsbereich, GPS-Bounding-Box und |
| Assets nur nach Zeit und/oder Ort auflisten, neueste zuerst, ohne Inhaltsranking. |
| Grobe GPS-Cluster (~55 km) mit Fotoanzahl und erstem/letztem Tag — "wo war ich, und wann". |
| Assets als JPEGs rendern, die Claude tatsächlich ansehen kann: HEIC wird verkleinert, ein Video wird zu einem 6-Frame-Kontaktbogen. |
| Tresor und überwachte Ordner nach neuen Dateien durchsuchen und dann alles einbetten, was noch nicht eingebettet ist. |
| Die Aktionsnamen, die die telefonseitige Shortcut-Kurzbefehl ausführen kann. |
| Einen Auftrag für das Telefon in die Warteschlange stellen (aktueller Standort, Kontakte, Kalender, Zwischenablage, Deep Link öffnen, benachrichtigen). |
| Ergebnis eines eingereihten Telefon-Auftrags. |
| Installierte Capability-Plugins und ob das Browserprofil von jedem angemeldet ist. |
| Der Vertrag zum Schreiben einer neuen Capability — gibt |
| Eine Capability nach Namen ausführen; |
| Ein einmaliges menschliches Login öffnen: standardmäßig auf das Telefon gespiegelt, oder ein echtes Fenster auf dem PC. |
| 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:
In SQL nach
taken_at-Bereich und/oder einer[lat_min, lat_max, lon_min, lon_max]-Bounding-Box filtern.Den englischen Text abfragen einbetten, gegen die Kandidatenmatrix matmulen, nach Kosinusähnlichkeit sortieren, die obersten k nehmen.
Kandidaten zurückgeben, keine Antworten — Claude ruft dann
photos_openauf 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_placesclustert 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.ps1erstellt 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.jsonund/healtherfordert das Token ausconfig.json, verglichen mithmac.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 mitis_relative_to(VAULT)geprüft, bevor etwas geschrieben wird.Passwörter werden nie protokolliert.
/login/inputfiltert explizit, was es weiterleitet, undlogin_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:
Claude ruft
phone_request("location.current")auf, das eine Zeile injobsmit dem Statuspendingeinfügt und sofort eine Job-ID zurückgibt.Das Telefon führt den Claude-Bridge-Shortcut aus — per Tipp, über den Button der PWA oder aus einer geplanten Automation. Er macht ein
GETauf/job/next, das einen Job atomar alstakenmarkiert. Wenn nichts in der Warteschlange ist, antwortet der Server mit204und der Shortcut endet einfach.Der Shortcut verzweigt je nach
action-Namen, sammelt die Daten undPOSTet sie an/records?job=<id>oder/job/<id>/done.Claude fragt
phone_job_statusab.
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:
Claude ruft
capability_login(profile, login_url)auf.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=Truefür Konten, die Sie lieber nicht über die Brücke eintippen möchten.Sie geben das Passwort selbst ein, einmal.
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.windllfür Prozesspriorität undCREATE_NO_WINDOW)Python 3.10+ (verwendet
X | Y-Typsyntax undPath.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 chromiumWenn Google Chrome installiert ist, verwendet
caps.launch_kwargs()es (channel="chrome") gegenüber dem gebündelten Chromium, undplaywright install chromiumwird 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.device—cudaodercpu.
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.ps1Dies ö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.pyAchtung: MCP-Server werden beim Start einer Sitzung geladen. Ein Server, der mit
claude mcp addhinzugefü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 Siewatch_dirsauf einen Fotoordner und führen Siepython indexer.pyaus (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 vonphotos_opengerendert werden.profiles/— Playwright-Browserprofile, d. h. live angemeldete Sitzungen. Sie melden sich selbst an, einmal pro Dienst, übercapability_login.config.json— enthält das Bearer-Token. Kopieren Sieconfig.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 |
|
| Behalte den Hinweis. |
Flask und seine Kette aus Werkzeug / Jinja2 / Click / itsdangerous / MarkupSafe / Blinker | durchgehend | Behalte den Hinweis. |
|
| Behalte den Hinweis; markiere alle Dateien, die du änderst, als geändert (ZPL-Klausel 5); die Lizenz gewährt keine Markenrechte. |
NumPy |
| Behalte den Hinweis. Seine Wheels bündeln außerdem OpenBLAS und unter Linux |
Pillow |
| Behalte den Hinweis. |
|
| Behalte den Hinweis und die |
PyTorch |
| Siehe unten. Diese sind proprietär, nicht BSD. |
| Quellcode unter | Siehe unten. PyPI klassifiziert das Paket selbst aus diesem Grund als GPLv2. |
PyAV ( | Binding unter | Siehe unten. |
Playwright |
| Siehe unten. |
CLIP-Gewichte, | 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.
This server cannot be installed
Maintenance
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
- AlicenseNot gradedqualityDmaintenanceEnables remote control and monitoring of Claude Code sessions from mobile devices through ChatGPT Custom Connectors. Allows creating, managing, and interacting with multiple Claude Code sessions via natural language commands from anywhere.3MIT
- AlicenseNot gradedqualityDmaintenanceEnables 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.2MIT
- AlicenseBqualityAmaintenanceEnables 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.765MIT
- AlicenseNot gradedqualityCmaintenanceEnables 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
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
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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