Skip to main content
Glama
yomi

yomi

Official
by RikaiDev

Yomi (読み) — der persönliche LINE-MCP-Server

Yomi ist ein Open-Source-LINE-MCP-Server für dein persönliches Konto. Lies, antworte, sende Bilder und durchsuche jede Unterhaltung von Claude oder einem beliebigen lokalen KI-Agenten — ohne Browser, Bot-Konto oder LINE-eigenen Client.

Der Name lässt sich auf mehr als eine Weise lesen. 読み (yomi) — eine Lesart: nicht nur das Parsen deiner Nachrichten, sondern das Lesen der Situation, so wie du es tust. 詠み (yomi) — rezitieren: es liest nicht still, es liest dir Dinge vor. Und 黄泉 (yomi) — das unerreichbare Reich; genau das yomi in 黄泉帰り (yomigaeri), „Rückkehr aus Yomi." Wie ein Bote, der zwischen zwei Reichen wandert, durchdringt Yomi Versiegelung und Stille, um Nachrichten, die tief in deinen Unterhaltungen noch lesbar sind, wieder ans Licht zu bringen. Es beschwört keine bereits verlorene Geschichte herauf; es hilft, dass das, was nicht verschwunden ist, wieder gesehen wird.

Im Gegensatz zum offiziellen LINE-Bot-MCP-Server, der KI-Agenten über die Messaging-API mit einem LINE-Official-Account verbindet, verbindet sich Yomi als sekundäres Gerät mit deinem bestehenden persönlichen LINE-Konto und deinen Unterhaltungen.

Yomi spricht direkt LINEs TCompact-über-HTTPS-Protokoll, entschlüsselt Letter-Sealing (E2EE)-Nachrichten und -Medien und stellt das Ergebnis jedem KI-Agenten über einen kleinen stdio-MCP-Server zur Verfügung. Richte Claude Desktop (oder einen beliebigen MCP-Client) darauf aus, und der Agent kann dein LINE so nachvollziehen, wie du es tust — lesen, antworten, ein Bild senden, jemanden erwähnen und deine gesamte Historie lokal durchsuchen — und mit get_insight die Situation lesen: welche Unterhaltungen auf deine Antwort warten, wer deine Welt zusammenhält und was überfällig ist.

Keine offizielle API, kein Bot-Konto, kein Webhook. Yomi meldet sich als sekundäres Gerät auf deinem eigenen Konto an.

Anleitungen: Was ist ein LINE-MCP-Server? · LINE MCP 是什麼?Yomi、官方 Bot 與桌面自動化的差異.

license runtime protocol npm

Inoffiziell. Yomi ist ein unabhängiges persönliches Projekt, das weder mit LINE verbunden ist noch von LINE unterstützt wird. Die Nutzung kann gegen die Nutzungsbedingungen von LINE verstoßen, und das Ausführen eines zusätzlichen Clients auf deinem Konto birgt das Risiko von Rate-Limiting oder Sperrung. Es ist für das Lesen deines eigenen Kontos gedacht. Nutzung auf eigenes Risiko. Siehe Haftungsausschluss.


Erste Schritte

Native-Desktop-Vorschau

Yomi Desktop bringt den LINE-Posteingang und den lokalen Agenten-Arbeitsbereich in einer nativen App zusammen. Es enthält eine eigene Laufzeit: Benutzer müssen Node nicht installieren, kein Terminal öffnen, dieses Repository nicht klonen oder YOMI_RUN_MJS konfigurieren. Native Desktop ist getrennt von der unten beschriebenen Claude-Desktop-MCPB-Erweiterung.

Plattform

Paket für allgemeine Benutzer

Signierstatus

Installationserfahrung

macOS 14+, Apple Silicon

Yomi-Desktop-macOS-arm64-<version>.dmg

Developer-ID-signiert und Apple-notarisiert

DMG öffnen → Yomi in Programme ziehen → Yomi öffnen

Windows 10/11 x64

Yomi-Desktop-Windows-x64-<version>-Setup.exe

Vertrauenswürdige OSS-Signieranwendung in Arbeit

Download bleibt bis zum Bestehen von Signierung und Installer-Smoke-Test nicht verfügbar

Das macOS-Paket wurde über den echten Download-Pfad getestet: quarantäniertes DMG, Installation in /Applications, Gatekeeper-Prüfung, erster Start, Nachrichtenaktualisierung mit gebündelter Laufzeit und LINE-Anmeldeformular ohne Terminal. Der Windows-Installer enthält den entsprechenden In-App-Telefon-/PIN- Anmeldeablauf und wird vor der Veröffentlichung auf einem nativen Windows-Runner getestet.

Desktop-Builds sind experimentell und inoffiziell. LINE-Änderungen können sie beschädigen, und das Ausführen eines zusätzlichen Clients kann ein Konto gefährden. Bevorzuge ein Testkonto und halte ein aktuelles Backup bereit. Vorschau-Installer werden nur als GitHub-Pre-Releases veröffentlicht, nachdem die Plattformsignierung verfügbar ist.

Siehe den Desktop-Release-Prozess, Code-Signierungsrichtlinie und Datenschutzrichtlinie.

MCP-Server und Desktop-Erweiterung

Du benötigst Node.js und ein LINE-Konto. Yomi läuft lokal über npx; du musst dieses Repository nicht klonen, Bun installieren oder etwas bauen. Führe zuerst node --version aus und installiere das aktuelle LTS, wenn der Befehl fehlt oder die Version nicht unterstützt wird.

Yomis lokaler Suchindex verwendet das in Node integrierte node:sqlite, daher benötigt es v22.13 oder neuer — außer v23.0–v23.3, die neuer als v22.13 sind, aber dieses Modul noch nicht enthalten (es wurde in 22.13.0 und 23.4.0 entflaggt). Jedes aktuelle LTS ist in Ordnung. Dies ist engines.node in package.json; der Rest von Yomi läuft auf älterem Node, aber Suche, Scope und Capture nicht.

⚠️ Yomi benötigt einen Client, der es auf deinem eigenen Rechner ausführt. Nur-Cloud-Tools (ChatGPT, Claude.ai-Web) können Yomi nicht ausführen. Konfiguriere Yomi in Claude Desktop oder Claude Code, und es funktioniert sowohl im Chat als auch in Cowork, weil Desktop Yomi auf deinem Rechner startet und Coworks lokale Sitzungen es laden. Bitte Cowork nicht, Yomi für dich zu installieren: Coworks Shell läuft in einer Wegwerf-VM, nicht auf deinem Rechner, also ist alles, was es dort installiert, verschwunden, wenn die Sitzung endet. Folge den Schritten unten selbst, in deinem eigenen Terminal.

Wähle den Client, den du tatsächlich verwendest, und folge nur diesem Abschnitt. Claude Code und Claude Desktop haben separate MCP-Einstellungen; das Konfigurieren des einen konfiguriert nicht das andere.

Der einfachste Weg und der einzige, der überhaupt keine Befehlszeile benötigt. Claude Desktop bringt eine eigene Node-Laufzeit mit, also muss nichts anderes installiert werden.

  1. Lade das Bundle für deinen Rechner vom neuesten Release herunter:

    Rechner

    Datei

    Windows (Intel/AMD)

    yomi-win32-x64.mcpb

    Mac (Apple Silicon)

    yomi-darwin-arm64.mcpb

    Linux (x64)

    yomi-linux-x64.mcpb

  2. Öffne in Claude Desktop Einstellungen → Erweiterungen und ziehe die heruntergeladene Datei auf diese Seite (oder doppelklicke einfach auf die Datei).

  3. Überprüfe, was verlangt wird, und klicke auf Installieren.

  4. Starte eine Unterhaltung und sage "bei LINE anmelden". Yomi zeigt ein Formular, du gibst deine Telefonnummer ein und bestätigst auf deinem Telefon. Kein Terminal zu irgendeinem Zeitpunkt.

Dies überspringt die Konfigurationsdatei vollständig, was auch den unten beschriebenen Windows-MSIX-Fehler umgeht.

Hinweis für Cowork-Benutzer: Bitte Cowork nicht, Yomi für dich zu installieren. Coworks Shell läuft in einer Wegwerf-VM — nicht auf deinem Rechner — und es wird nicht in dein echtes Terminal tippen. Installiere das Bundle selbst mit den drei Klicks oben; sobald es installiert ist, können Coworks lokale Sitzungen Yomi wie jedes andere Tool verwenden.

  1. Finde den vollständigen Pfad zu npx:

    macOS / Linux: which npx
    Windows:       where npx
  2. Öffne die Claude-Desktop-Konfigurationsdatei:

    macOS:   ~/Library/Application Support/Claude/claude_desktop_config.json
    Windows: %APPDATA%\Claude\claude_desktop_config.json

    ⚠️ Windows: Der dokumentierte Pfad ist möglicherweise nicht der, den Claude tatsächlich liest. Claude Desktop wird als MSIX-Paket ausgeliefert, dessen Dateisystem virtualisiert ist. Die App liest ihre Konfiguration von

    %LOCALAPPDATA%\Packages\Claude_pzs8sxrjxfjjc\LocalCache\Roaming\Claude\claude_desktop_config.json

    während Einstellungen → Entwickler → Konfiguration bearbeiten die unvirtualisierte %APPDATA%\Claude\-Datei öffnet. Es sind zwei verschiedene Dateien, die nie synchronisiert werden, also wird eine korrekte Yomi-Konfiguration, die in den dokumentierten Pfad geschrieben wird, still ignoriert — kein Fehler, kein Log, Yomi erscheint einfach nie. Dies ist claude-code#26073, noch offen. Wenn Yomi nach einem Neustart nicht erscheint, schreibe dieselbe Konfiguration auch in den LocalCache-Pfad oben. (Nicht anwendbar auf Claude Code oder auf Desktop, das außerhalb von MSIX installiert ist.)

  3. Füge Yomi unter mcpServers hinzu und ersetze den Beispiel-command durch den vollständigen Pfad aus Schritt 1. Unter Windows erfordert JSON, dass jedes \ im Pfad als \\ geschrieben wird:

{
  "mcpServers": {
    "yomi": {
      "command": "/opt/homebrew/bin/npx",
      "args": ["@rikaidev/yomi"]
    }
  }
}

Zum Beispiel kann ein Windows-Pfad wie "C:\\Program Files\\nodejs\\npx.cmd" aussehen. Verwende den Pfad, der auf deinem eigenen Rechner gemeldet wird, anstatt eines der Beispiele blind zu kopieren.

⚠️ Das npx, das du hier angibst, entscheidet nicht, welches Node Yomi ausführt. Auf macOS und Linux ist npx ein Skript, das mit #!/usr/bin/env node beginnt, also führt es das node aus, das zuerst auf Claude Desktops PATH kommt — nicht das Node, das neben dem npx installiert ist, auf das du gerade gezeigt hast. Desktop erbt seinen PATH von der Desktop-Sitzung, die oft nicht die deines Terminals ist, und Versionsmanager (nvm, fnm, asdf, volta, …) stellen ihr eigenes node vor alles andere. Also kann which npx eine perfekt moderne Installation melden, während Yomi trotzdem auf einem alten Node startet.

Das Symptom ist spezifisch: Anmelden, Lesen und Senden funktionieren alle, aber Suche, Scope und Capture schlagen fehl, und das Log sagt No such built-in module: node:sqlite. Yomi druckt die Laufzeit, die es tatsächlich erhalten hat, in diesem Fehler — lies es, anstatt anzunehmen.

Die Lösung besteht darin, dem Server einen PATH zu geben, dessen erster Eintrag ein unterstütztes node enthält:

"yomi": {
  "command": "<the npx path from step 1>",
  "args": ["-y", "@rikaidev/yomi"],
  "env": { "PATH": "<dir holding a supported node><sep><a base PATH>" }
}

Trennzeichen: : auf macOS/Linux, ; auf Windows. Behalte eine nutzbare Basis danach (/usr/local/bin:/usr/bin:/bin oder das Äquivalent deiner Plattform) — dies ersetzt den PATH des Servers, anstatt ihm voranzustellen, und npx benötigt die gewöhnlichen Werkzeuge.

Die Angabe eines absoluten node in command funktioniert nicht, so plausibel es auch aussieht: npx startet das eigene Bin des Pakets als Kindprozess und löst node erneut aus PATH dafür auf, also wählt command nur aus, wer npx ausführt, nicht wer Yomi ausführt. Das Setzen von PATH ist das, was tatsächlich den Server erreicht.

Konfigurierst du das mit einem KI-Agenten? MCP-Konfigurationen werden heutzutage meist von Agenten geschrieben statt von Hand, also sind die obigen Schritte für einen Menschen formuliert, der seinen eigenen Rechner liest. Ein Agent sollte die Werte auflösen, anstatt Platzhalter auszugeben, und dieses Setup hat eine Falle, die es wert ist, klar ausgesprochen zu werden: Das Benennen von npx in command pinnt die Laufzeit nicht. Vorgehen:

  1. Finden Sie eine Node, die tatsächlich das Modul hat, das Yomis Index benötigt – leiten Sie es nicht aus einer Versionsnummer ab:

    node -e 'require("node:sqlite")' && command -v node    # POSIX
    node -e "require('node:sqlite')" && where node         # Windows

    Wenn es einen Fehler wirft, ist diese Node für Suche/Scope/Capture unbrauchbar. Probieren Sie die anderen Installationen (which -a node, nvm ls, fnm list, …) aus, bis eine funktioniert; erst dann fahren Sie fort.

  2. Schreiben Sie das Verzeichnis dieser Node in env.PATH, gemäß dem obigen JSON, und behalten Sie danach ein Basis-PATH bei. Ermitteln Sie das Verzeichnis auf dem Zielrechner (dirname des Pfads aus Schritt 1); kopieren Sie kein Beispiel aus dieser README – es sind Apple-Silicon-Homebrew-Pfade und fast überall falsch.

    Setzen Sie stattdessen nicht ein absolutes node in command. Es liest sich wie die stärkere Lösung und ist es nicht: npx startet das Binärskript des Pakets als Kindprozess und löst node für dieses erneut aus PATH auf, sodass command nur entscheidet, wer npx ausführt. Das wurde gemessen, nicht angenommen – mit einem Node 20 zuerst in PATH ergab das Pinnen von command dem Server trotzdem Node 20.

    command -v kann auch einen Wrapper statt einer echten Binärdatei zurückgeben – Heap-Shims, lokale npx-Wrapper und Versionsmanager-Stubs sind alle üblich, und einige verhalten sich je nach Arbeitsverzeichnis des Clients unterschiedlich. Versuchen Sie nicht, sich zum „echten" durchzudenken. Schritt 3 klärt das.

  3. Verifizieren Sie mit einem Tool, das den Index berührt. yomi version ist keine Verifizierung – es gibt eine Zeichenkette aus, ohne SQLite zu öffnen, und funktioniert daher auf einer Node, die keine Suche ausführen kann. Rufen Sie get_scope_policy auf: Es benötigt SQLite und keinen LINE-Login. Wenn es den Richtlinientext zurückgibt, ist die Laufzeit korrekt. Wenn es fehlschlägt, nennt der Fehler die Node, die tatsächlich ausgeführt wurde, und was sie benötigte.

  4. Beenden Sie Claude Desktop vollständig und öffnen Sie es erneut. Bestätigen Sie, dass Yomi unter Einstellungen → Entwickler geladen ist, bevor Sie etwas anderes tun: Wenn Yomi dort nicht aufgeführt ist, hat Claude Ihre Konfiguration nie gelesen – unter Windows siehe die MSIX-Warnung in Schritt 2. Sobald es aufgeführt ist, sind die Tools sowohl im Chat als auch in Coworks lokalen Sitzungen verfügbar.

Sie müssen für dieses Setup nicht Claude Code installieren.

claude mcp add yomi -- npx @rikaidev/yomi

Starten Sie eine neue claude-Sitzung. Die Yomi-Tools sollten automatisch erscheinen. Dieser Befehl konfiguriert nur Claude Code; er konfiguriert nicht Claude Desktop.

Diese Form überlässt die Laufzeit PATH, was in Ordnung ist, solange das node, das Ihre claude-Sitzung auflöst, eine unterstützte Version ist – es ist derselbe PATH, den Sie sehen können, anders als bei Claude Desktop. Überprüfen Sie mit node -e 'require("node:sqlite")'. Wenn es einen Fehler wirft oder Sie überhaupt nicht von PATH abhängig sein möchten, benennen Sie die Node explizit:

claude mcp add yomi -e PATH="$(dirname "$(command -v node)"):$PATH" -- npx -y @rikaidev/yomi

Verifizieren Sie in jedem Fall mit get_scope_policy statt mit yomi version: Der Versionsbefehl gibt eine Zeichenkette aus, ohne SQLite zu öffnen, und besteht daher auf einer Node, die keine Suche ausführen kann.

Führen Sie Claude Code in einem Klon dieses Repos aus? Geben Sie die Spec als @rikaidev/yomi@latest an. Ohne Tag sucht npx zuerst nach einem lokalen Binärskript, und in diesem Repo deklariert package.json "bin": {"yomi": ...}, während nichts es in node_modules/.bin verlinkt – also überspringt npx die Installation und endet mit sh: yomi: command not found. Ein explizites Tag bewirkt, dass das veröffentlichte Paket abgerufen wird. Betrifft nur Arbeitskopien von Yomi selbst; überall sonst ist die Form ohne Tag in Ordnung.

Diese Standardkonfiguration funktioniert in den meisten MCP-Clients:

{
  "mcpServers": {
    "yomi": {
      "command": "npx",
      "args": ["@rikaidev/yomi"]
    }
  }
}

Cursor Settings → MCP → Add new MCP Server → benennen Sie es yomi, Befehlstyp, Wert: npx @rikaidev/yomi

Oder fügen Sie es zu .cursor/mcp.json in Ihrem Projektstamm hinzu.

Fügen Sie zu .vscode/mcp.json hinzu:

{
  "servers": {
    "yomi": {
      "command": "npx",
      "args": ["@rikaidev/yomi"]
    }
  }
}

Fügen Sie zu ~/.config/opencode/opencode.json hinzu:

{
  "mcp": {
    "yomi": {
      "type": "local",
      "command": ["npx", "@rikaidev/yomi"],
      "enabled": true
    }
  }
}
codex mcp add yomi npx @rikaidev/yomi

Oder fügen Sie zu ~/.codex/config.toml hinzu:

[mcp_servers.yomi]
command = "npx"
args = ["@rikaidev/yomi"]

Fügen Sie zu cline_mcp_settings.json hinzu:

{
  "mcpServers": {
    "yomi": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "@rikaidev/yomi"]
    }
  }
}

Fügen Sie zu ~/.codeium/windsurf/mcp_config.json hinzu — dieselbe JSON wie die Standardkonfiguration.

amp mcp add yomi -- npx @rikaidev/yomi

Advanced settings → Extensions → Add custom extension → benennen Sie yomi, Typ STDIO, Befehl: npx @rikaidev/yomi

grok mcp add yomi -- npx @rikaidev/yomi

Erste Anmeldung

Sobald die Verbindung hergestellt ist, sagen Sie dem Agenten:

„Loggen Sie sich bei LINE ein – meine Nummer ist +8869XXXXXXXX."

Bestätigen Sie das Gerät auf Ihrem Telefon (siehe Anmelden), und:

„Fassen Sie meine ungelesenen LINE-Nachrichten zusammen und sagen Sie mir, wer auf eine Antwort wartet."


Related MCP server: line-desktop-mcp

Was Sie tun können

Yomi stellt 20 Tools über MCP bereit (die, die es wert sind, genannt zu werden; siehe die Tabellen). Große Leseergebnisse verwenden token-effizientes TOON; kleine Status- und Schreibergebnisse verwenden kompaktes JSON. Fehler bleiben Klartext und Medien verwenden native MCP-Bild-/Audio-/Ressourceninhalte. „Ehrlicher Fehler" unten bedeutet einen expliziten Fehlschlag, der das Problem benennt (z. B. missing_decrypt_material) – Yomi erfindet nie einen Fallback, einen Platzhalter oder einen vorgetäuschten Erfolg.

Lesen

Tool

Funktion

get_unread_digest

Einmalig: jede Konversation mit ungelesenen Nachrichten, jeweils mit den neuesten Nachrichten, E2EE-entschlüsselt, Absendernamen aufgelöst. Entwickelt für „fasse meine ungelesenen zusammen und schlage nächste Schritte vor." Schreibgeschützt – markiert nie etwas als gelesen.

list_conversations

Chats/Gruppen/Räume mit Ungelesen-Zählern und einer entschlüsselten Vorschau der letzten Nachricht. Neueste zuerst.

get_chat_messages

Eine Konversation, entschlüsselt. Blättern Sie mit einem before-Cursor tiefer. Jede Nachricht trägt rohe MENTION-Metadaten, sodass Sie sehen können, wer @-erwähnt wurde (ein wörtliches @name im Text ist keine Erwähnung).

get_message_media / get_message_image

Jeder entschlüsselte Anhang (Bild/Video/Audio/Datei). Ehrlicher Fehler bei Nicht-Medien.

find_contact / list_contacts

Freundeslisten-Suche nach Namens-Teilstring oder die vollständige Liste. Rohe LINE-Daten – keine Fuzzy-Bewertung, keine Affinitäts-Rangfolge.

get_group_members

Mitglieder einer persistenten Gruppe. Ad-hoc-Räume ohne Gruppenaufzeichnung schlagen ehrlich fehl, anstatt eine gefälschte leere Liste zurückzugeben.

Einblick (die Situation lesen, nicht nur die Nachrichten)

Tool

Funktion

get_insight

Ein kompaktes Kontextnetzwerk über Ihren lokalen Index – Struktur, über die der Agent nachdenkt, kein Nachrichten-Dump. Gibt connectors zurück (Personen, die in ≥2 Ihrer Chats vorkommen, mit den strukturellen Brücken, deren Entfernung Ihren Kontaktgraphen teilen würde), relationships (Engagement pro Konversation und Ihren typischen Antwort-Rhythmus dort) und open (Konversationen, deren neueste Nachricht nicht von Ihnen ist, sortiert danach, wie überfällig sie relativ zu diesem Rhythmus sind, jeweils mit einer Vorschau). Es berechnet nur Struktur und Statistiken: Es entscheidet bewusst nicht, an wen eine Nachricht gerichtet ist, ob es eine offene Anfrage oder eine abschließende Bestätigung ist, oder die echte Identität eines Spitznamens – das ist Sprache, die der Agent aus jeder Vorschau liest, und get_chat_messages nur dann dereferenziert, wenn ein Thread eine Bewertung wert ist. Kodiert als TOON, ≈¼ der Tokens des äquivalenten JSON.

Schreiben (diese senden wirklich – keine Entwürfe)

Tool

Funktion

send_message

Sendet jetzt eine E2EE-Textnachricht (paarweiser Schlüssel für 1:1, Gruppenschlüssel für Gruppen/Räume). Optionale mentions fügen echte @-Erwähnungen hinzu, die LINE hervorhebt und benachrichtigt; lassen Sie sie weg und ein wörtliches @name ist nur Text, der niemanden benachrichtigt. Ein Senden pro Aufruf, keine Wiederholungen.

send_image

Verschlüsselt, lädt zu LINE OBS hoch und sendet jetzt ein E2EE-Bild. Funktioniert für 1:1, Gruppen und Räume. Ein Senden pro Aufruf. Ehrlicher Fehlschlag, wenn der Schlüssel nicht aufgelöst werden kann oder der Upload abgelehnt wird.

mark_read

Sendet eine Lesebestätigung, die die andere Partei sehen kann. Nur explizit – Lesen von Nachrichten und Hintergrund-Erfassung markieren nie etwas als gelesen.

Suche (lokal, konversationsübergreifend – LINE hat keine solche Grundoperation)

Tool

Funktion

search_messages

Hybride Suche über alle indizierten Unterhaltungen. Sammelt beim ersten Gebrauch automatisch, diversifiziert die Ergebnisse über Chats hinweg und gibt ein kleines Kontextfenster um jeden Treffer zurück. Gibt mode (hybrid/semantic/keyword) zurück, damit nichts verborgen bleibt.

collect_messages

Explizite Massenindizierung in die lokale DB + Einbettung für die semantische Suche. Das einzige Tool, das Massenabrufe durchführen darf; läuft einmal pro Aufruf, niemals zeitgesteuert.

Umfang & Datenschutz (alles funktioniert offline, keine LINE-Sitzung erforderlich)

Tool

Funktion

exclude_chats

Sperrt eine Unterhaltung und löscht ihre bereits indizierten Daten. Nicht nur zukünftige Erfassung — eine Sperrliste, die alte Daten im Index beließe, wäre vorgetäuschter Datenschutz.

include_chats

Erlaubt eine Unterhaltung wieder (stellt gelöschte Daten nicht wieder her).

list_excluded_chats / get_scope_policy

Zeigt die Sperrliste / die vollständige Datenschutzrichtlinie (gelesen aus PRIVACY.md).

Sitzung

Tool

Funktion

login / login_complete

Passwortloser Login als Zweitgerät. Siehe unten. login ist das einzige Tool, das ohne bestehende Sitzung aufgerufen werden kann.


Anmelden

Voraussetzung: Aktivieren Sie auf Ihrem Haupttelefon 設定 › 我的帳號 › 允許自其他裝置登入 (Einstellungen › Konto › Anmeldung auf anderen Geräten erlauben). Ohne diese Einstellung bietet LINE diesem Gerät niemals eine Anmeldeaufforderung an — dies ist der mit Abstand häufigste Grund, warum eine erste Anmeldung zu hängen scheint.

⚠️ Limit von einer Desktop-Sitzung: LINE erlaubt nur eine Desktop-Client-Sitzung gleichzeitig pro Konto. Da Yomi sich als Desktop-Zweitgerät (DESKTOPMAC) verbindet, wird durch die Anmeldung bei Yomi Ihre offizielle LINE-Desktop-App abgemeldet (und die erneute Anmeldung bei LINE Desktop macht Yomis Sitzung ungültig). Sie können Yomi und den offiziellen LINE-Desktop-Client nicht gleichzeitig verwenden.

Sie müssen dem Agenten lediglich Ihre Telefonnummer im E.164-Format geben — er liefert die Region selbst (z. B. TW für eine +886-Nummer), wenn er das Tool aufruft.

Yomi steuert den passwortlosen (Zweitgerät-) Ablauf von LINE. Wie die Anmeldung erscheint, hängt von Ihrem MCP-Client ab:

  • Clients mit der MCP-elicitation-Fähigkeit — login fragt Sie nach Ihrer Telefonnummer/Region, zeigt die PIN in einem Dialog an und blockiert bis zum Abschluss. Ein Aufruf, keine PIN, die durch das Modell geleitet wird. Ihre Telefonnummer gelangt nie ins Transkript.

  • Clients ohne diese Fähigkeit (z. B. Claude Desktop heute) — zwei Aufrufe. login (mit Ihrer Telefonnummer + Region) gibt die PIN in seinem Ergebnis zurück; geben Sie sie in LINE auf Ihrem Haupttelefon ein und genehmigen Sie das Gerät; rufen Sie dann login_complete auf, das blockiert, bis das Telefon bestätigt. Der Agent sollte login_complete sofort aufrufen — es übernimmt das Warten, sodass es für Sie nichts zurückzumelden gibt.

  • Vom Terminal aus — npx @rikaidev/yomi login führt den gesamten Ablauf auf stdout aus, PIN und alles. Immer als Fallback verfügbar.

Die einzige Frist, die zählt, ist die von LINE: Sie haben etwa 3 Minuten ab dem Zeitpunkt, an dem die PIN angezeigt wird, um sie einzugeben und das Gerät zu genehmigen. Yomis eigener Client hört noch viele Minuten darüber hinaus zu, sodass ein langsames Telefon nie der Fehler ist — nur LINEs 3-minütige Code-Lebensdauer ist es.

Sobald Sie angemeldet sind, wird die Sitzung — einschließlich eines Anmelde-Zertifikats — gespeichert (siehe unten), und zukünftige Anmeldungen überspringen die PIN vollständig.

Es gibt auch eine experimentelle MCP Apps-Oberfläche (eine ui://yomi/login-Karte) für Clients, die interaktive Ansichten rendern. Sie ist spezifikationskonform und rendert unter dem MCP Inspector, aber einige Hosts rufen die Ressource ab, ohne den Ansichts-Handshake abzuschließen, sodass sie nur zur Anzeige dient und nie auf dem kritischen Pfad liegt — die obigen Abläufe funktionieren immer, unabhängig davon.

Sitzungen und Anmeldedaten

Yomi besitzt seinen eigenen Login. Beim Start ruft es einmal resumeSession() auf, liest die LINE-Sitzung aus dem macOS-Schlüsselbund (Dienst dev.rikai.yomi.credentials, Konto line) und aktualisiert das Token bei Bedarf stillschweigend.

  • First-Party-Anmeldedaten. Der passwortlose Login speichert das Auth-Token, Refresh-Token, Zertifikat, die MID und das E2EE-Schlüsselpaar selbst — und liest sie dann zurück, um zu verifizieren, dass der Schreibvorgang tatsächlich angekommen ist. Ein Login, der nicht gespeichert werden kann, schlägt laut beim Login fehl, nicht stillschweigend beim nächsten Neustart.

  • Gemeinsame Sitzung. Die Sitzung wird im kanonischen dev.rikai.yomi.credentials- Schlüsselbund-Eintrag (oder im lokalen Anmeldedatenspeicher) gespeichert, sodass Yomi MCP und Yomi Desktop exakt dieselbe LINE-Anmeldesitzung nahtlos teilen können.

  • Plattformhinweis. Auf macOS befindet sich die Sitzung im Anmelde-Schlüsselbund. Auf Linux und Windows fällt Yomi derzeit auf eine lokale JSON-Datei zurück — funktional, aber weniger geschützt als ein OS-Geheimnisspeicher und weniger getestet als der macOS-Pfad. Native sichere Speicher-Backends (libsecret / DPAPI) sind geplant; behandeln Sie eine Nicht-macOS-Installation bis dahin entsprechend.

Jedes Tool außer login und den Offline-Umfang/Such-Tools gibt einen ehrlichen Fehler zurück, wenn keine Sitzung vorhanden ist. Yomi ist ansonsten ein reiner Abfrageserver — es pollt nie, füllt nie im Hintergrund nach; jeder Tool-Aufruf macht genau die LINE-Anfragen, die er benötigt, und collect_messages ist der einzige Pfad, der über viele Chats hinweg gleichzeitig abruft.


Suche

LINE hat keine unterhaltungsübergreifende Suche; Yomi baut eine lokal auf. Der Index ist eine gitignorierte SQLite-Datenbank (data/search-index.db) im Repository — nichts verlässt Ihren Rechner.

Die Suche ist hybrid konzipiert. Sie führt immer FTS5-Keyword-Suche aus (bm25 über bigramm-vorverarbeiteten Text, sodass CJK-Teilstrings ohne Wortgrenzen abgedeckt sind) und, wenn Einbettungen vorhanden sind, semantische Suche, und fusioniert dann die beiden Ranglisten per Reciprocal Rank Fusion. Reine semantische Suche lässt exakte Treffer, die in nicht eingebetteten Nachrichten liegen, stillschweigend weg; reine Keyword-Suche verfehlt Paraphrasen; die Fusion beider bringt einen exakten Begriff und eine Bedeutungstreffer zusammen. Das mode-Feld der Antwort meldet immer, welche Methoden beigetragen haben.

Die semantische Rangfolge behält jede Nachricht als eigenen Vektor. Tests mit real indizierten LINE-Unterhaltungen ergaben, dass das Einbetten überlappender Unterhaltungsfenster die mittlere Nachricht verwässerte und die Abrufqualität verringerte. Kontext wird daher erst nach der Rangfolge hinzugefügt: Yomi begrenzt, dass ein Chat die obersten Ergebnisse überflutet, und erweitert jeden Gewinner um zwei Nachrichten auf jeder Seite, sodass der Agent den Austausch sieht, der dem Treffer Bedeutung verlieh, ohne die Einbettung selbst zu schwächen.

Die semantische Rangfolge verwendet Xenova/bge-small-zh-v1.5 (BAAI-Allzweck-Einbettung, klein, chinesisch-primär, aber mehrsprachig) über transformers.js. Die Einbettungs-Inferenz läuft vollständig prozessintern auf der CPU — Ihr Nachrichtentext wird niemals irgendwohin gesendet.

Der einzige Vorbehalt ist ein einmaliger Modell-Download: Beim ersten collect_messages oder search_messages ruft transformers.js das Modell (~90 MB) von huggingface.co ab und speichert es lokal zwischen; jeder weitere Lauf danach ist vollständig offline. Dieser erste Abruf ist eine ausgehende HTTPS-Anfrage an HuggingFace für die Modellgewichte — sie überträgt Ihre IP und welches Modell heruntergeladen wird, aber keinen Nachrichteninhalt und keine LINE-Daten. Wenn Sie Yomi vollständig netzwerkisoliert benötigen, befüllen Sie den transformers.js-Cache (oder richten Sie ihn auf ein lokales Modellverzeichnis aus) vor der ersten Suche, sodass niemals ein Netzwerkaufruf erfolgt.


Die Zweitgeräte-Realität (lesen, bevor Sie „Ich kann keine alten Nachrichten abrufen" glauben)

Yomi läuft als Zweitgerät auf Ihrem Konto. Das bestimmt, was es sehen kann:

  • Gruppenchats ohne Letter Sealing sind auf dem LINE-Server im Klartext — vollständiger Verlauf und Medien, ohne Einschränkung.

  • Gruppenchats mit Letter Sealing sind E2EE-verschlüsselt, und dort kommt es auf die Epoche an. Eine solche Gruppe ist mit einem gemeinsamen Gruppenschlüssel verschlüsselt, der rotiert (bei Mitgliedschaftsänderungen oder wenn ein Client einen neuen bereitstellt). LINE gibt einem Gerät nur den aktuellen Gruppenschlüssel — es gibt keine API, um einen ersetzten abzurufen. Ein Zweitgerät entschlüsselt also Nachrichten ab der Epoche, deren Schlüssel es besitzt; Nachrichten, die unter einer älteren Epoche — bevor Yomi den aktuellen Schlüssel erhalten hat — gesendet wurden, können unentschlüsselbar zurückkommen, selbst in einer Gruppe, deren früheren Verlauf es lesen kann. Das ist der per-Epoche-Gruppenschlüssel von Letter Sealing inhärent, kein Fehler hier. Es kann auch quer schneiden: Die Epoche, die Ihr Telefon besitzt, und die Epoche, die Yomi besitzt, müssen nicht dieselbe sein, sodass die beiden Geräte jeweils einen anderen Ausschnitt derselben Gruppe lesen können.

  • Die Installation von Yomi rotiert selbst nichts, also ist „bevor ich Yomi installiert habe" die falsche Grenze. Yomi löst nur einen vorhandenen Gruppenschlüssel auf; es registriert (erzeugt) nie einen, weil das Erzeugen das gemeinsame Geheimnis der Gruppe für jedes Mitglied rotiert und jede Nachricht, die unter dem vorherigen verschlüsselt ist, stranden lässt. Eine frische Installation übernimmt also den aktuellen Schlüssel und liest bis zur letzten Rotation zurück — die Monate vor der Installation liegen kann. Die Grenze ist die letzte Neuverschlüsselung, nicht Ihr Installationsdatum. Und sobald Yomi eine Epoche gesehen hat, behält es diesen Schlüssel, sodass eine Rotation nach der Installation es in die Lage versetzt, beide Seiten zu lesen. Wenn eine Gruppe bis heute durchgehend unentschlüsselbar zurückkommt, ist das nicht diese Einschränkung — bitte melden Sie es.

  • 1:1-Medien verwenden den E2EE-Schlüsselbund auf Kontobene, den ein Zweitgerät vollständig besitzt (LINE synchronisiert ihn während der Kopplung) — Yomi kann 1:1-Bilder/Dateien entschlüsseln, die es sehen kann.

  • Das 1:1-Verlaufs-Backfill ist die eine echte Einschränkung. LINE übergibt einem Zweitgerät nicht den vergangenen 1:1-Nachrichtenverlauf, wie es das für Gruppen tut. Nachrichten, die empfangen werden, während Yomi verbunden ist, entschlüsseln normal; tiefes Scrollen in den 1:1-Verlauf, der vor der Kopplung liegt, kann leer zurückkommen. Das ist eine serverseitige Einschränkung von LINE, kein Fehler hier.

Wenn die Entschlüsselung tatsächlich fehlschlägt, gibt Yomi einen expliziten missing_decrypt_material- Fehler zurück — niemals eine gefälschte Karte oder einen Platzhalter. Stille ist ehrlich; ein fabrizierter Treffer ist es nicht.


Entwicklung

Für Mitwirkende, die am Yomi-Quellcode arbeiten (erfordert bun oder Node.js 24+ — .nvmrc pinnt dieselbe 24, die CI installiert, sodass nvm use in diesem Verzeichnis sie aufnimmt; beachten Sie, dass nvm engines nicht liest, weshalb die beiden getrennt angegeben und durch einen Test abgesichert sind):

bun install                 # install dependencies (or npm install)
bun run.mjs                 # run the stdio MCP server
bun run.mjs login           # run the login flow in a terminal
npm run build               # tsc --noEmit — type-check only (Yomi ships & runs from src/)
npm test                    # bun test

Der Build führt nur Typprüfung und Kompilierung durch; dieses Repository spricht nicht mit Live-LINE- Servern als Teil seines eigenen Builds. Das Verbinden eines MCP-Clients und das Aufrufen von login ist das, was tatsächlich eine Sitzung startet.

src/
  line/     LINE protocol core: TCompact/Thrift codec, E2EE (Letter-Sealing,
            group keys, media), Talk/Auth/Sync service clients, session state,
            passwordless login flow.
  auth/     Credential store (macOS Keychain, JSON-file fallback off-darwin).
  search/   Local cross-conversation index (SQLite + FTS5) and the offline
            embedding pipeline (transformers.js).
  mcp/      The stdio server: tool schemas, handlers, the privacy-policy loader,
            and the experimental MCP Apps login view (mcp/ui/).
  util/     [TAG]-prefixed logger (stderr only — stdout is the MCP JSON-RPC stream).

Alles, was Yomi für Menschen schreibt, geht an stderr; stdout ist für den MCP-JSON-RPC-Stream reserviert. Ein versehentliches console.log beschädigt das Protokoll — fügen Sie keins auf einem Pfad hinzu, den der Server erreichen kann.


Datenschutz

Standardmäßig indexiert Yomi alle deine Unterhaltungen in den lokalen, auf dem Gerät befindlichen Suchindex, damit ein Agent darin suchen kann – ein Alles-erfassen-Standard, pro Chat abwählbar. Es wird nie etwas hochgeladen; die einzigen Daten, die dein Gerät verlassen, sind das, was der Agent selbst in seinen Antworten preisgibt. (Der einzige Nicht-LINE-Netzwerkaufruf, den Yomi selbst tätigt, ist der einmalige Download des Embedding-Modells von HuggingFace bei der ersten Suche – Modellgewichte rein, keine Nachrichteninhalte raus; siehe Suche.) PRIVACY.md ist die maßgebliche Richtlinie, und Yomi zeigt dem Agenten bei der Verbindung denselben Text an (und über get_scope_policy), damit er den Standard vor jedem Massenlesen offenlegen kann.


Haftungsausschluss

Yomi ist ein unabhängiges, inoffizielles persönliches Projekt, das zum Lernen und für den Zugriff auf das eigene LINE-Konto entwickelt wurde. Es ist nicht mit der LINE Corporation verbunden, von ihr autorisiert oder unterstützt. „LINE" ist eine Marke des jeweiligen Inhabers.

Die Nutzung von Yomi kann gegen die Nutzungsbedingungen von LINE verstoßen, und der Betrieb eines zusätzlichen Clients auf einem Konto kann zu Rate-Limiting oder Sperrung dieses Kontos führen. Yomi ist für den Zugriff auf dein eigenes Konto und deine eigenen Daten gedacht. Du bist allein für die Nutzung verantwortlich. Die Software wird „wie besehen" ohne jegliche Gewährleistung bereitgestellt – siehe LICENSE.

Danksagungen

Yomis LINE-Protokollimplementierung wurde unter Bezugnahme auf drei Open-Source-Projekte geschrieben, deren Feldlayouts, E2EE-Chunk-Reihenfolge, Anforderungsformen und Thrift-Definitionen diese unabhängige Implementierung beeinflusst haben:

  • evex-dev/linejs (MIT) — Anforderungsformen und das Letter-Sealing-E2EE-Payload-Layout.

  • DeachSword/CHRLINE (BSD-3-Clause) — Protokoll-Feldlayouts und den passwortlosen Anmeldeablauf.

  • er1ce/LINE-Protocol (Apache-2.0) — Thrift-Enum-Definitionen (ContentType, MessageRelationType, ServiceCode).

Ihre Urheberrechtshinweise und vollständigen Lizenztexte sind in NOTICE wiedergegeben, wie es ihre Lizenzen verlangen.

Lizenz

MIT

Available Tools

41 tools
accept_invitationA

Accepts a group/chat invitation for your LINE account — you join the chat. Use for a group you were invited to (its chatId appears with invited status). One accept per call.

NameRequiredDescriptionDefault
chatIdYesLINE group/room MID whose invitation to accept, as returned by list_conversations.
add_friendA

Adds a person to your LINE friends by their MID (e.g. from get_group_members or find_contact). One add per call.

NameRequiredDescriptionDefault
midYesMID of the person to add as a friend, e.g. from get_group_members.
block_contactA

Blocks a contact for your LINE account — they can no longer message you. Reversible with unblock_contact. One block per call.

NameRequiredDescriptionDefault
midYesMID of the contact to block.
cancel_reactionA

Removes this account's reaction from a LINE message. Undoes a react_message. One cancellation per call.

NameRequiredDescriptionDefault
messageIdYesLINE message id whose reaction to remove, as returned by get_chat_messages.
collect_messagesA

Bulk-fetch recent messages from LINE conversations into Yomi's local cross-conversation search index (LINE has no native cross-chat search). Fetches up to perChat per chat (default 100) for chatIds, or all conversations when omitted, and best-effort embeds them for semantic search — re-running also repairs any messages still missing a vector. A background capture loop keeps the index current on its own, so call this only to force a reconcile or backfill specific chats. Undecryptable messages are skipped, not fabricated.

NameRequiredDescriptionDefault
chatIdsNoLINE chat/group/room MIDs to collect from, as returned by list_conversations. Omit to collect from all conversations.
perChatNoMaximum recent messages to fetch per chat (default 100).
create_groupA

Creates a new LINE group/room immediately with the given members (no message is sent). chatType 0 = group (invitees must accept before joining), 1 = room (members added directly); default 1. Provide name and mids (initial members, e.g. from find_contact). One create per call.

NameRequiredDescriptionDefault
midsYesMIDs of the initial members to add.
nameYesName for the new group.
chatTypeNoLINE chat type: 0 = group (invite-based), 1 = room (direct add). Default 1.
exclude_chatsA

Add conversations to Yomi's privacy denylist. Excluded chats are (1) skipped by future collect_messages/search_messages auto-collect — never fetched or indexed — and (2) PURGED now: their already-indexed messages and embeddings are deleted from the local index in the same call. A real privacy action, not just a future filter. Local-index operation; works without a live LINE session.

NameRequiredDescriptionDefault
chatIdsYesLINE chat/group/room MIDs to exclude, as returned by list_conversations.
find_contactA

Find LINE friends whose display name contains name (case-insensitive substring). Returns each match's mid for send_message. Raw friend-list lookup — no ranking, no fuzzy scoring.

NameRequiredDescriptionDefault
nameYesSubstring to match against friends' display names, case-insensitive.
get_chat_messagesA

Fetch messages from one LINE conversation. Text is E2EE-decrypted when keys are available; each message has fromName (resolved sender), a mediaType flag (image/video/audio/file) plus messageId for get_message_media, and mentions (LINE's raw contentMetadata.MENTION, or null — a literal "@name" in text is not itself a mention). Without before, returns the most recent count. With before (id/deliveredTime of the oldest message already seen), returns one older page — repeat to page further back.

NameRequiredDescriptionDefault
countNoMaximum number of messages to return (default 50).
beforeNoCursor to fetch messages older than this point. Use the id and/or deliveredTime of the oldest message already seen.
chatIdYesLINE chat/group/room MID, as returned by list_conversations.
get_group_membersA

List the members of one LINE group (mid + displayName each). Resolves persistent groups (c...); ad-hoc rooms (r...) without a group record return an honest error, never a fabricated empty list.

NameRequiredDescriptionDefault
chatIdYesLINE group chat MID, as returned by list_conversations.
get_insightA

A compact "what needs my attention" context network over the local index — you make the final call, this assembles the evidence cheaply. Nodes: connectors (people across ≥2 of your chats, with structural bridges) and relationships (per-conversation engagement, reply rhythm, recency). open: conversations whose latest message is NOT yours, ranked by how overdue they are relative to your usual reply rhythm there, each with fromName (last speaker), a preview of the latest message, overdueRatio/typicality, and a lastMessageId pointer. It carries NO message threads and makes NO judgement about addressee, nicknames, or open-request vs closing-ack — those are language understanding you do by reading each preview (a group message may be addressed to someone else, who then owns it), fetching the full thread with get_chat_messages only for the few worth it. Reads across all conversations (denylist-excluded dropped). Empty only when the index is empty.

NameRequiredDescriptionDefault
chatIdNoOptional focus: restrict `relationships` and `pending` to this chat (as returned by list_conversations). Omit to scan all conversations.
sinceHoursNoLookback window in hours, measured back from the newest captured message (not wall-clock). Default 504 (21 days).
get_message_imageA

Download and decrypt one LINE image message. Legacy alias of get_message_media restricted to images; prefer get_message_media for video/audio/file.

NameRequiredDescriptionDefault
chatIdYesLINE chat/group/room MID the message belongs to. Required to locate E2EE key material.
previewNoFetch the smaller preview object instead of the full-resolution original.
messageIdYesLINE message id, as returned by get_chat_messages.
get_message_mediaA

Download and decrypt one LINE media message of any downloadable type (image, video, audio, file). Returns image/audio MCP content, or an embedded resource blob (with filename when known) for video/file. Non-media messages (text, sticker refs, unsupported types) return an honest error naming the content type — never fabricated bytes.

NameRequiredDescriptionDefault
chatIdYesLINE chat/group/room MID the message belongs to. Required to locate E2EE key material.
previewNoFetch the smaller preview object instead of the full-resolution original (images/video only).
messageIdYesLINE message id, as returned by get_chat_messages.
get_scope_policyA

Return Yomi's data-capture privacy policy (the disclosure to show the user) plus the current list of excluded conversations. Call this to show the user, in concrete terms, what Yomi captures by default and how to exclude conversations.

NameRequiredDescriptionDefault

No parameters

get_unread_digestA

One-shot unread digest: every LINE conversation with unread messages (all pages of the inbox, newest activity first), each with its most recent messages (default 10), E2EE-decrypted, with resolved sender names. Saves calling list_conversations then get_chat_messages per chat. Read-only: never marks anything read, never touches the search index; denylist-excluded conversations are omitted. Returns an empty list when nothing is unread — never fabricated.

NameRequiredDescriptionDefault
limitNoMaximum number of unread conversations to return, most recently active first (default: all of them).
perChatNoMaximum recent messages to include per unread conversation (default 10).
include_chatsA

Remove conversations from Yomi's denylist, re-allowing future capture. Does NOT restore data purged when the chat was excluded — capture resumes from empty history going forward. Local-index operation; works without a live LINE session.

NameRequiredDescriptionDefault
chatIdsYesLINE chat/group/room MIDs to re-include.
invite_memberA

Invites members into a LINE group immediately. Invitees must accept before joining. Provide mids (from find_contact or get_group_members). One call per invite batch.

NameRequiredDescriptionDefault
midsYesMIDs of the people to invite.
chatIdYesLINE group/room MID to invite into, as returned by list_conversations.
kick_memberA

Removes (kicks) members from a LINE group immediately — they lose access at once (re-adding needs a fresh invite); visible to every member. Provide mids (from get_group_members). One call per removal batch.

NameRequiredDescriptionDefault
midsYesMIDs of the members to remove.
chatIdYesLINE group/room MID to remove members from, as returned by list_conversations.
leave_groupA

Makes THIS LINE account leave a group immediately — it loses access to the group and its history. One leave per call.

NameRequiredDescriptionDefault
chatIdYesLINE group/room MID to leave, as returned by list_conversations.
list_contactsA

List the authenticated user's full LINE friend list as-is (mid + displayName). No ranking, no interaction-frequency ordering.

NameRequiredDescriptionDefault

No parameters

list_conversationsA

List LINE conversations (chats, groups, rooms) with unread counts, a preview of the last message, and a human-readable name (group title, or the other party's display name for a 1:1).

NameRequiredDescriptionDefault
limitNoMaximum number of conversations to return (default 20).
list_excluded_chatsA

List the conversations currently on Yomi's privacy denylist. Returns [{ chatId, name }]; name is best-effort resolved when a live LINE session exists, otherwise null — never a fabricated placeholder. Local-index operation; works without a live LINE session.

NameRequiredDescriptionDefault

No parameters

list_stickersA

List the sticker packages this LINE account OWNS — the only stickers it can send. Returns each package's packageId (STKPKGID), title, and version (STKVER). Get individual sticker ids via search_stickers, then send_sticker. Read-only.

NameRequiredDescriptionDefault
languageNoLocale for package titles, e.g. 'en' or 'zh-Hant'. Defaults to 'en'.
loginA

Log in to LINE via the passwordless secondary-device flow. Requires 設定 > 我的帳號 > 允許自其他裝置登入 enabled on the primary phone — with it off LINE never prompts that phone and NO login can succeed, so raise this with the human up front rather than after a failure. On MCP clients with form elicitation, this call first confirms that setting, then prompts for phone/region and PIN and completes login by itself; if the human says the setting is off, it returns the enabling steps without starting a login (relay them verbatim, then call login again). On clients without it (e.g. Claude Desktop), phone/region come from the arguments or a persisted login, and this returns as soon as LINE issues the PIN (or reports none needed) — then call login_complete IMMEDIATELY (do not wait for the human). LINE gives ~3 minutes from PIN display to confirm on the phone; login_complete blocks past that, so calling it late only wastes that window.

NameRequiredDescriptionDefault
phoneNoPhone number in E.164 form, e.g. +8869XXXXXXXX. Omit to be prompted (elicitation) or to reuse a persisted number.
regionNoRegion code, e.g. TW, JP, TH, ID, US. Omit to be prompted (elicitation) or to reuse a persisted region.
login_completeA

Finish a passwordless login that login started on a client without form elicitation (not needed on form-elicitation-capable clients). No arguments. Call immediately after login returns — do not wait for the human. Blocks while they enter the PIN (skipped if a stored certificate is valid) and approve the device, then returns the profile. LINE's real deadline is ~3 minutes from PIN display. Errors if no login is pending.

NameRequiredDescriptionDefault

No parameters

mark_readA

Send a LINE read receipt (mark a conversation read up to messageId, or the latest when omitted) — a real action the other party can see. Use ONLY when the user explicitly wants to mark a chat read; reading (get_chat_messages, get_unread_digest) and background capture never mark read. Fails honestly if there is nothing to mark.

NameRequiredDescriptionDefault
chatIdYesLINE chat/group/room MID to mark read, as returned by list_conversations.
messageIdNoOptional message id to mark read up to. Omit to mark read up to the latest message.
preview_stickerA

Show sticker preview images (MCP image content from the public sticker CDN) so you and the user can SEE them before sending. Give a packageId (from list_stickers/search_stickers) to preview its first stickers, or add a stickerId to preview just one. Each image is labeled with its stickerId + packageId for send_sticker. Read-only.

NameRequiredDescriptionDefault
limitNoMax stickers to preview when no stickerId is given (default 8).
packageIdYesSticker package id (STKPKGID) to preview.
stickerIdNoOptional specific sticker id (STKID) to preview just that sticker.
react_messageA

Adds a reaction to a LINE message, visible to the conversation. reactionType: 2 = 👍 LIKE, 3 = ❤️ LOVE, 4 = 😆 LAUGH, 5 = 😮 SURPRISE, 6 = 😢 SAD, 7 = 😡 ANGRY (default 2). One reaction per call.

NameRequiredDescriptionDefault
messageIdYesLINE message id to react to, as returned by get_chat_messages.
reactionTypeNoPredefined reaction: 2=👍LIKE, 3=❤️LOVE, 4=😆LAUGH, 5=😮SURPRISE, 6=😢SAD, 7=😡ANGRY. Default 2.
rename_groupA

Renames a LINE group/chat immediately; the new name is visible to every member. Works on groups/rooms (chatId starting with c/r). One rename per call.

NameRequiredDescriptionDefault
nameYesNew group name.
chatIdYesLINE group/room MID to rename, as returned by list_conversations.
search_messagesA

Search across your LINE messages. Hybrid ranking: FTS5 keyword search (covers every indexed message, so exact matches are never dropped) fused with semantic similarity when embeddings are available — the mode field reports which contributed (hybrid | semantic | keyword). If the index is empty and a session is live, it auto-collects all conversations first; a populated index searches locally with no network. Empty index with no session returns an honest notice, never a fabricated match list.

NameRequiredDescriptionDefault
limitNoMaximum number of results to return (default 20).
queryYesSearch query. Plain keywords and natural-language descriptions both work — keyword matching catches exact terms, semantic matching catches paraphrases.
search_stickersA

Search the account's OWNED sticker packages by title and expand each match into its individual sticker ids (STKID), ready for send_sticker. Case-insensitive substring match on the package title. Read-only.

NameRequiredDescriptionDefault
limitNoMax matching packages to expand with sticker ids (default 8).
queryYesSubstring to match against owned package titles (case-insensitive).
languageNoLocale for package titles to match against, e.g. 'en' or 'zh-Hant'. Defaults to 'en'.
send_audioA

Sends an E2EE audio message to a LINE conversation immediately (same pipeline as send_file). Provide exactly one of filePath or audioBase64; optional durationMs sets the recipient player length. Works for 1:1/group/room. One send per call.

NameRequiredDescriptionDefault
chatIdYesLINE chat/group/room MID to send to, as returned by list_conversations.
fileNameNoOptional original filename (used for the upload name; defaults to the basename of filePath or audio.m4a).
filePathNoLocal filesystem path to the audio file. Mutually exclusive with audioBase64.
durationMsNoOptional audio duration in milliseconds, for the recipient player progress bar.
audioBase64NoBase64-encoded audio bytes. Mutually exclusive with filePath.
send_contactA

Shares a LINE contact card to a conversation immediately — the recipient sees a tappable card for contactMid (e.g. from find_contact or get_group_members). displayName is optional (resolved from the mid when omitted). Works for 1:1/group/room. One send per call.

NameRequiredDescriptionDefault
chatIdYesLINE chat/group/room MID to send to, as returned by list_conversations.
contactMidYesMID of the person whose contact card to share, as returned by find_contact or get_group_members.
displayNameNoOptional display name for the card. Resolved from contactMid when omitted.
send_fileA

Sends an E2EE file attachment (any type — .docx, .pdf, .zip, …) to a LINE conversation immediately (same pipeline as send_image; the original filename is sealed end-to-end). Works for 1:1/group/room; fails honestly if the key cannot be resolved or the upload is rejected. One send per call. Provide exactly one of filePath or fileBase64; fileName is required with fileBase64 (and overrides the basename when given with filePath).

NameRequiredDescriptionDefault
chatIdYesLINE chat/group/room MID to send to, as returned by list_conversations.
fileNameNoOriginal filename shown to the recipient (sealed E2EE). Required with fileBase64; optional with filePath (defaults to its basename).
filePathNoLocal filesystem path to the file. Mutually exclusive with fileBase64.
fileBase64NoBase64-encoded file bytes. Mutually exclusive with filePath; requires fileName.
send_imageA

Sends an E2EE image to a LINE conversation immediately (encrypt → upload to OBS → send). Works for 1:1/group/room; fails honestly if the key cannot be resolved or the upload is rejected. One send per call. Provide exactly one of imagePath or imageBase64.

NameRequiredDescriptionDefault
chatIdYesLINE chat/group/room MID to send to, as returned by list_conversations.
imagePathNoLocal filesystem path to the image file. Mutually exclusive with imageBase64.
imageBase64NoBase64-encoded image bytes. Mutually exclusive with imagePath.
send_locationA

Sends a location (map pin) to a LINE conversation immediately — latitude/longitude plus optional title (place name) and address. Works for 1:1/group/room. One send per call.

NameRequiredDescriptionDefault
titleNoOptional place name shown on the pin.
chatIdYesLINE chat/group/room MID to send to, as returned by list_conversations.
addressNoOptional address shown under the pin.
latitudeYesLatitude in decimal degrees.
longitudeYesLongitude in decimal degrees.
send_messageA

Sends a text message to a LINE conversation immediately (not a draft). Always E2EE (pairwise for 1:1, group key for group/room); fails honestly rather than sending plaintext if the key cannot be resolved. One send per call. To @mention someone, put the visible "@name " into text AND pass a matching mentions entry — without mentions, "@name" is plain text and notifies no one. Resolve MIDs via get_group_members or find_contact first.

NameRequiredDescriptionDefault
textYesPlain-text message body, including the literal "@name" text for any mentions — mentions only mark up text that is already there.
chatIdYesLINE chat/group/room MID to send to, as returned by list_conversations.
mentionsNoOptional @mentions. Each entry marks a span of `text` as a mention of one user, which LINE highlights and notifies. Omit to send `text` as plain, non-notifying text.
replyToMessageIdNoOptional message id (from get_chat_messages) this replies to — LINE renders a quoted reply. Omit for a normal message.
send_stickerA

Sends a LINE sticker to a conversation immediately, named by stickerId (STKID) + packageId (STKPKGID). Only OWNED stickers can be sent — get ids from search_stickers/list_stickers. Works for 1:1/group/room. One send per call.

NameRequiredDescriptionDefault
chatIdYesLINE chat/group/room MID to send to, as returned by list_conversations.
versionNoSticker version (STKVER). Defaults to "1".
packageIdYesLINE sticker package id (STKPKGID).
stickerIdYesLINE sticker id (STKID).
send_videoA

Sends an E2EE video to a LINE conversation immediately (same pipeline as send_file; uses LINE chunked video encryption so it plays and integrity-verifies on official clients). Provide exactly one of filePath or videoBase64; optional durationMs sets the scrubber length. Works for 1:1/group/room. One send per call.

NameRequiredDescriptionDefault
chatIdYesLINE chat/group/room MID to send to, as returned by list_conversations.
fileNameNoOptional original filename (used for the upload name; defaults to the basename of filePath or video.mp4).
filePathNoLocal filesystem path to the video file. Mutually exclusive with videoBase64.
durationMsNoOptional video duration in milliseconds, for the recipient player scrubber.
videoBase64NoBase64-encoded video bytes. Mutually exclusive with filePath.
unblock_contactA

Unblocks a previously blocked contact for your LINE account. Undoes block_contact. One unblock per call.

NameRequiredDescriptionDefault
midYesMID of the contact to unblock.
unsend_messageA

Retracts (unsends) one of YOUR OWN LINE messages for everyone — deletes it from the conversation for all participants and CANNOT be undone. LINE allows unsending only your own messages. SAFETY GATE: you must pass confirm: true, or the call refuses so it can never fire by accident. One unsend per call.

NameRequiredDescriptionDefault
confirmYesMust be true to proceed. Retraction is irreversible; the call refuses unless this is explicitly true.
messageIdYesLINE message id to retract (must be your own), as returned by get_chat_messages.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 1 tool updatev0.6.2
    • Changedget_unread_digest1 field changed
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum number of conversations to scan for unread (default 20)."New value: +"Maximum number of unread conversations to return, most recently active first (default: all of them)."
  2. 39 tool updatesv0.4.1
    • Addedaccept_invitation
    • Addedadd_friend
    • Addedcancel_reaction
    • Addedcollect_messages
    • Addedcreate_group
    • Addedexclude_chats
    • Addedfind_contact
    • Addedget_chat_messages
    • Addedget_group_members
    • Addedget_insight
    • Addedget_message_image
    • Addedget_message_media
    • Addedget_scope_policy
    • Addedget_unread_digest
    • Addedinclude_chats
    • Addedinvite_member
    • Addedkick_member
    • Addedleave_group
    • Addedlist_contacts
    • Addedlist_conversations
    • Addedlist_excluded_chats
    • Addedlist_stickers
    • Addedlogin_complete
    • Addedmark_read
    • Addedpreview_sticker
    • Addedreact_message
    • Addedrename_group
    • Addedsearch_messages
    • Addedsearch_stickers
    • Addedsend_audio
    • Addedsend_contact
    • Addedsend_file
    • Addedsend_image
    • Addedsend_location
    • Addedsend_message
    • Addedsend_sticker
    • Addedsend_video
    • Addedunblock_contact
    • Addedunsend_message
  3. 38 tool updatesv0.3.0
    • Removedaccept_invitation
    • Removedadd_friend
    • Removedcancel_reaction
    • Removedcollect_messages
    • Removedcreate_group
    • Removedexclude_chats
    • Removedfind_contact
    • Removedget_chat_messages
    • Removedget_group_members
    • Removedget_message_image
    • Removedget_message_media
    • Removedget_scope_policy
    • Removedget_unread_digest
    • Removedinclude_chats
    • Removedinvite_member
    • Removedkick_member
    • Removedleave_group
    • Removedlist_contacts
    • Removedlist_conversations
    • Removedlist_excluded_chats
    • Removedlist_stickers
    • Removedlogin_complete
    • Removedmark_read
    • Removedpreview_sticker
    • Removedreact_message
    • Removedrename_group
    • Removedsearch_messages
    • Removedsearch_stickers
    • Removedsend_audio
    • Removedsend_contact
    • Removedsend_file
    • Removedsend_image
    • Removedsend_location
    • Removedsend_message
    • Removedsend_sticker
    • Removedsend_video
    • Removedunblock_contact
    • Removedunsend_message
  4. 40 tool updatesv0.2.0
    • First observedaccept_invitation
    • First observedadd_friend
    • First observedblock_contact
    • First observedcancel_reaction
    • First observedcollect_messages
    • First observedcreate_group
    • First observedexclude_chats
    • First observedfind_contact
    • First observedget_chat_messages
    • First observedget_group_members
    • First observedget_message_image
    • First observedget_message_media
    • First observedget_scope_policy
    • First observedget_unread_digest
    • First observedinclude_chats
    • First observedinvite_member
    • First observedkick_member
    • First observedleave_group
    • First observedlist_contacts
    • First observedlist_conversations
    • First observedlist_excluded_chats
    • First observedlist_stickers
    • First observedlogin
    • First observedlogin_complete
    • First observedmark_read
    • First observedpreview_sticker
    • First observedreact_message
    • First observedrename_group
    • First observedsearch_messages
    • First observedsearch_stickers
    • First observedsend_audio
    • First observedsend_contact
    • First observedsend_file
    • First observedsend_image
    • First observedsend_location
    • First observedsend_message
    • First observedsend_sticker
    • First observedsend_video
    • First observedunblock_contact
    • First observedunsend_message

TDQS

A4.1/5.0

Scored across 41 tools

Disambiguation4/5

Most tools target a distinct resource+action, and descriptions actively disambiguate the tricky clusters (get_unread_digest vs list_conversations vs get_insight; find_contact vs list_contacts; search_stickers vs list_stickers). The only real overlaps are the explicitly-flagged legacy alias get_message_image vs get_message_media and collect_messages vs search_messages' auto-collect, both of which are documented so an agent won't misselect.

Naming Consistency5/5

Nearly every tool follows a clean snake_case verb_noun pattern (get_*, list_*, send_*, search_*, create_/rename_/invite_/kick_/leave_group, block_/unblock_contact). The send_* family, group-management family, and privacy family are each internally uniform. Only 'login' / 'login_complete' deviate slightly, which is negligible.

Tool Count3/5

41 tools is heavy and sits well above the comfortable 3-15 range, largely because seven distinct send_* variants (message/image/file/audio/video/location/contact/sticker) plus a full login pair inflate the surface. Each tool is genuinely distinct and earns its place in a rich LINE domain, but some consolidation (e.g. a single send_media with a type param) would be reasonable.

Completeness5/5

The surface covers the full lifecycle: auth (login/login_complete), conversation listing/search/digest/insight, message fetch and media download, all outbound message types, group CRUD and membership, contact add/block/find, reactions/unsend, stickers, and a complete privacy denylist lifecycle (exclude/include/list/policy). No obvious dead ends for the stated purpose.

Maintenance

ActivityNo data
ResponsivenessOutdated data

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI tools to read and send messages through LINE Desktop via MCP, supporting manual or automatic sending without official LINE API tokens.
    118 npm
    127
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI tools to read and send LINE messages by automating the LINE Desktop application, with macOS OCR-based reading and idle-aware scheduling.
    118 npm
    1
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI assistants to read, search, and reply to personal LINE messages, including end-to-end-encrypted chats and media, all decrypted locally.
    MIT