ต้นแบบ · รุ่นทดลอง: มีทุก server ในทะเบียนทางการ อัปเดตทุก 30 นาที รีวิวและบัญชีผู้ใช้จะมาในขั้นถัดไป
PopNx MCPที่รวม MCP สำหรับคนใช้ AI · อธิบายเป็นภาษาคน

chatmux

โดย echoedinvokerรุ่น 0.1.0i★ –i–
ชื่อใน registryio.github.echoedinvoker/chatmux

ติดตั้ง

ภาพรวม

คำอธิบายจากผู้ทำ (ภาษาอังกฤษตามต้นฉบับ)

Local-first MCP server for your own LINE and Telegram chats. Data stays on your machine.

สามเสาของ PopNx MCP

สามเรื่องนี้ไม่รวมเป็นคะแนนเดียว เพราะความเห็น การวัด และความนิยม เป็นคนละเรื่องกัน

ใช้ทำอะไรได้

ตัวนี้ยังไม่ได้เรียบเรียงเป็นภาษาไทย ด้านล่างคือข้อเท็จจริงที่เราอ่านจาก registry

  • การเชื่อมต่อ: –
  • ช่องทาง (transport):
  • หมวด: แชตและอีเมล

ติดตั้ง

เลือกโปรแกรม AI ที่คุณใช้ แล้วคัดลอกค่าตั้งไปวาง

ก่อนติดตั้ง

ผู้ทำยังไม่ได้ใส่วิธีติดตั้งใน registry ให้ดู README ของผู้ทำด้านล่าง

ทำอะไรได้บ้าง

รันในเครื่องคุณ รายการเครื่องมือจะขึ้นในแอป AI หลังติดตั้ง

ผลตรวจเบื้องต้นi

เราตรวจจากข้อมูลที่ใครก็เปิดดูได้ ยังไม่ได้อ่านโค้ด ข้อที่ไม่เกี่ยวกับตัวนี้ไม่นับในตัวหาร · ตรวจเมื่อ 6 พ.ย. 2569

  • ✓ ผ่าน

    ตัวตนผู้ทำตรงกับ repo

    ชื่อใน registry ยืนยันด้วยบัญชี GitHub echoedinvoker ซึ่งเป็นเจ้าของ repo

  • … ยังไม่ตรวจ

    ยังมีคนดูแล

    ยังไม่ได้อ่านข้อมูล repo จาก GitHub

  • … ยังไม่ตรวจ

    มีสัญญาอนุญาต (license)

    ยังไม่ได้อ่านข้อมูล repo จาก GitHub

  • – ไม่เกี่ยว

    endpoint ตอบ

    ตัวนี้รันบนเครื่องคุณ ไม่มี endpoint บนอินเทอร์เน็ต

  • – ไม่เกี่ยว

    ล็อกอินแบบ OAuth

    ตัวนี้รันบนเครื่อง ใช้ค่าที่ตั้งในเครื่องแทน

  • … ยังไม่ตรวจ

    คำอธิบายเครื่องมือไม่มีคำสั่งแอบแฝง

    รันในเครื่องคุณ เราอ่านรายการเครื่องมือได้เฉพาะตัวที่มี endpoint บนอินเทอร์เน็ต

เทียบกับตัวอื่นในหมวด แชตและอีเมลi

  • ดาวมากกว่า 0% ของอีก 1766 ตัวในหมวดนี้
  • ส่งรุ่นใหม่เข้า registry ล่าสุดกว่า 19% ของอีก 1766 ตัวในหมวดนี้
  • ผลตรวจเบื้องต้นดีกว่าหรือเท่ากับ 100% ของอีก 1766 ตัวในหมวดนี้

เทียบกับทุก server ที่ยังใช้งานในหมวดนี้ทั้งทะเบียน ดาวนับเฉพาะเมื่อผู้ลงทะเบียนเป็นเจ้าของ repo

คำถามที่พบบ่อย

chatmux ปลอดภัยไหม?

จากการตรวจเบื้องต้นของเรา ผ่าน 1 จาก 1 ข้อที่ตรวจได้ เรายังไม่ได้อ่านโค้ด ก่อนใส่กุญแจหรือ token ให้ดูว่า server ขอสิทธิ์อะไร และเลือกกุญแจที่ทำได้เท่าที่จำเป็น

ต้องใช้กุญแจหรือรหัสอะไรบ้าง?

registry ไม่ได้ระบุว่าต้องใช้กุญแจ แต่บางตัวจะขอให้ล็อกอินตอนใช้ครั้งแรก

ตัวนี้รันบนเครื่องหรือบนคลาวด์?

รันบนเครื่องของคุณ โปรแกรม AI จะเปิด server ขึ้นมาเองเมื่อใช้ ข้อมูลไม่ต้องผ่านเซิร์ฟเวอร์ของผู้ทำ (ยกเว้นตัวที่ไปเรียกบริการออนไลน์ต่อ)

ยังมีคนดูแลอยู่ไหม?

repo บน GitHub มีการแก้โค้ดล่าสุด – และส่งรุ่นล่าสุด (0.1.0) เข้า registry 3 เดือนที่ผ่านมา

ใช้กับโปรแกรมไหนได้บ้าง?

โปรแกรมที่รองรับ MCP เช่น Claude Desktop, Claude Code, Cursor และ VS Code

มีตัวไหนใช้แทนได้บ้าง?

ในหมวดเดียวกันมี Vexa, emailmd, MCP WhatsApp Cloud

ตัวที่ใช้แทนได้

server หมวดเดียวกันจากผู้ทำคนอื่น เรียงตามดาว

อ่านการ์ด:★ ดาว GitHubiสามเสา: รีวิว · ผลตรวจ · การใช้งานiอัปเดต = วันที่ส่งรุ่นล่าสุดเข้า registryi

Vexa

โดย Vexa-ai

Meeting bot and transcripts for Google Meet, Teams and Zoom. Live or after, speakers labelled.

รันบนคลาวด์★ 2,949Apache-2.0อัปเดต 2 เดือนที่ผ่านมา
ติดตั้ง

emailmd

โดย anypost

Render markdown into email-safe HTML, lint drafts for deliverability problems, and preview emails.

บนเครื่องหรือคลาวด์★ 1,385MITอัปเดต 31 วันที่ผ่านมา
ติดตั้ง

MCP WhatsApp Cloud

โดย codespar

MCP server for WhatsApp Cloud API (Meta) — messages, media, and templates via Graph API

รันบนเครื่อง★ 277MITอัปเดต 5 เดือนที่ผ่านมา
ติดตั้ง

README จากผู้ทำ

เปิดอ่าน README

ส่วนนี้คัดจาก repo ของผู้ทำตามต้นฉบับ PopNx MCP ไม่ได้ตรวจหรือรับรองเนื้อหา ตัด HTML รูปภาพ และสคริปต์ออกแล้ว ลิงก์จะพาออกนอกเว็บ

chatmux

Local-first personal chat data layer daemon. Connects IM platforms (v0.1: LINE) via child-process adapters, stores messages to JSONL + SQLite/FTS5, exposes MCP tools for AI clients.

The three repos

chatmux is the core. Platforms plug in below it, consumers sit above it, and both sides of that boundary live in their own repos:

RepoRole
chatmux (this one)Core daemon: storage, safety rail, MCP server, LINE adapter
chatmux-adapter-telegramSecond platform adapter (Telegram, MTProto user session)
chat.nvimReference consumer: read and reply to chats inside Neovim

Adapters speak the adapter protocol; consumers speak MCP. Either side can be replaced without touching the other.

Quickstart

1. Install
git clone https://github.com/echoedinvoker/chatmux.git

cd chatmux bun install

2. Decide whether to connect an account yet

With no adapters.json, bun run start launches the LINE adapter, which means step 3 puts your LINE account on the line — read Account Risk Warning before you run it. If you would rather look around first, start with no adapter at all:

mkdir -p ~/.local/share/chatmux

cat > ~/.local/share/chatmux/adapters.json <<'JSON' { "adapters": [], "mcp": { "port": 7717 } } JSON bun run start

The daemon comes up with storage and the full MCP interface — you can initialize, list tools, and read resources. There is simply no chat data behind them until an adapter is connected. Set CHATMUX_DATA_DIR to keep this trial run out of your real data directory:

CHATMUX_DATA_DIR=/tmp/chatmux-trial bun run start

Each entry in adapters takes platform, a command string, and an args array (plus optional cwd and env):

{ "platform": "telegram", "command": "python", "args": ["-m", "chatmux_adapter_telegram"] }

For Telegram, follow the setup in chatmux-adapter-telegram — it has its own credentials and login flow, and does not involve LINE.

3. First login (QR code)
bun run start

A QR code will appear in the terminal

Open LINE on your phone → open the QR scanner → scan

iOS: Home → the scan icon

Android: Home → Add friends → QR code

After successful login, authToken is saved for future auto-login

4. Connect Claude Code

Register the daemon's MCP endpoint with Claude Code:

claude mcp add --transport http chatmux http://127.0.0.1:7717/mcp

claude mcp list # chatmux: ... - ✔ Connected

The daemon listens on two transports at once: a TCP port on `127.0.0.1` (default 7717) for standard MCP clients like Claude Code, and a unix socket for same-host sidecar consumers like chat.nvim. Use the TCP url for Claude Code — the MCP spec only defines stdio and streamable HTTP transports, so no MCP client accepts a unix socket path.

Port is configurable via CHATMUX_MCP_PORT, or mcp.port in adapters.json; set it to 0 to disable the TCP listener. See docs/mcp-interface.md.

Architecture

LINE adapter ←── stdio JSON-RPC ──→ core daemon ←── MCP Streamable HTTP ──→ Claude Code

(Node+tsx) (child process) (Bun) (127.0.0.1 TCP / unix) (MCP client) ├─ SafetyRail ├─ Storage (JSONL → SQLite/FTS5) ├─ Adapter Runner └─ MCP Server

  • Core daemon (Bun): central process managing storage, safety, and MCP server
  • LINE adapter (Node+tsx): child process connecting to LINE via IOSIPAD slot
  • Storage: JSONL append-only truth source + SQLite/FTS5 queryable view
  • MCP server: Streamable HTTP over TCP (standard MCP clients; loopback by default, settable for containers) + unix socket (same-host sidecars), 8 tools + 4 resources

MCP Tools

ToolDescription
list_chatsList chats with last message preview, search, pagination
read_messagesRead messages from a chat, paginated by timestamp
read_eventsTail the event log from an opaque cursor — resumable, survives backfill reordering, and re-delivers a message when it is edited or retracted
search_messagesFull-text search (CJK supported via FTS5 trigram + LIKE fallback)
send_messageSend message through SafetyRail (rate-limited, error-tracked)
get_mediaLocal file path for a message's image or sticker; downloads and caches on first call
probe_latestDiagnostic, read-only: ask the adapter for a chat's newest N messages without landing them
get_statusSystem status: adapter connection + storage stats

MCP Resources

URIDescription
chat://chatsAll chat list
chat://chats/{id}/messagesRecent messages for a chat
chat://chats/{id}/infoChat details with members
chat://statusSystem status

Writing a consumer

Core exposes primitives, not policy. Anything that decides *what matters* — which chats are worth surfacing, where a notification goes, when to stay quiet — belongs in a consumer, on the far side of the MCP boundary.

examples/notifier/ is a working reference: it tails the event log with a persisted cursor and hands each message to a hook you fill in. Its mcp-client.ts uses raw fetch rather than the TypeScript SDK, so it doubles as a wire-protocol reference for consumers in any language.

systemd Service

cp config/chatmux.service ~/.config/systemd/user/

systemctl --user daemon-reload systemctl --user enable --now chatmux

Edit WorkingDirectory to point at your clone before copying it.

How it comes back

The unit ships Restart=always, not on-failure. A chat backend is supposed to be there all day, and there are three ways it can stop being there — it crashes, something sends it a signal, or it exits cleanly — of which on-failure only recovers from the first. systemctl --user stop still stops it: a stop you asked for is not a failure, under either setting.

⚠️ **If you are on an older unit with Restart=on-failure, kill -TERM will not bring

it back — and that is not a missing restart policy.** systemd counts SIGTERM, SIGHUP,

SIGINT and SIGPIPE as an intended stop, so on-failure leaves the service sitting in

inactive after any of them. Only kill -9 (SIGKILL) counts as a failure there.

With the Restart=always this unit now ships, TERM comes back too — measured

2026-08-02: kill -TERM $MainPID moved NRestarts 1 → 2 and produced a new MainPID

within the 10s RestartSec. That makes TERM the useful test: kill -9 restarts under

*either* setting, so it cannot tell you which one is in effect. If you want to confirm

always is live, send TERM and watch systemctl --user show chatmux -p MainPID,NRestarts

change.

StartLimitIntervalSec=300 / StartLimitBurst=5 cap a crash loop: five starts inside five minutes and systemd stops trying, leaving the unit failed for you to look at rather than restarting into the same wall forever. Clear it with systemctl --user reset-failed chatmux.

Containers

A systemd user service is the intended way to run chatmux. If you want it in a container instead, deploy/container/ is a reference that builds and answers — not an official image, and it runs zero adapters, because adapters hold logged-in sessions and a container you rebuild is the wrong home for those.

The one thing you cannot skip is CHATMUX_MCP_HOST. The daemon binds 127.0.0.1 by default, which inside a container is the container's own loopback — a published port then maps to a socket nobody is listening on, and every connection is refused while the logs look perfectly healthy. Read deploy/container/README.md before assuming your port mapping is broken.

Development

bun run dev     # Start with --watch (auto-reload)

bun test # Run all tests bun run start # Start daemon

See docs/ for detailed architecture and protocol documentation.

Limitations

Known and accepted, with what would make each worth revisiting.

  • The chat list caps at 1000, silently. chat://chats is hard-coded to that limit. Consumers can detect an overflow by comparing the total field against what arrived, so it will not bite you without saying so. Worth raising once a vault approaches ~500 chats, or the first time that completeness check fires.
  • The JSONL log holds duplicate history. Backfill re-ingested some messages many times over, leaving the event log several times larger than the messages in it. This has stopped: recent growth is almost entirely new distinct messages, and the worst-case duplicate count has been frozen across repeated measurements. It is not a correctness problem — ingestion is idempotent and the SQLite projection is unaffected — so the fix, if ever needed, is a one-off compaction rather than a code change. Worth doing if the log passes ~500 MB, if the duplicate count starts climbing again, or if cold start slows noticeably.
  • Retractions in Telegram one-to-one chats are missed. Group retractions land; direct ones do not, because the adapter cannot recover the chat id for those events from its entity cache, and core will not match a message on id alone — that ambiguity is exactly what the storage key was widened to remove. So a message you retracted on your phone can stay visible here. Worth fixing once the adapter can resolve the chat id itself, or as soon as retraction accuracy matters to a consumer.
  • Reactions are not stored at all. The platforms send them; no layer reads them. Nothing in core, the schema, or the MCP surface represents a reaction, so a consumer cannot show what a phone shows. Worth building when reactions carry meaning you would otherwise miss — it is new storage, not a display tweak.
  • `read_receipt` is declared but never emitted. The LINE adapter advertises the capability and core is ready to ingest it; nothing constructs the event. Whether read state should reach a UI at all is an open product question, not a pending bug — but the declaration is wrong today, so do not branch on supported_events for this one. Worth fixing as soon as any consumer does branch on it, or once that product question gets an answer.

⚠️ Account Risk Warning

This project uses @evex/linejs, an unofficial LINE client library. Using unofficial APIs may violate LINE's Terms of Service. Your LINE account may be restricted, suspended, or permanently banned. Use at your own risk.

The IOSIPAD device slot is used to avoid interfering with your phone's LINE app, but LINE may change their multi-device policy at any time.

⚠️ Legal Disclaimer

This software is provided "as is", without warranty of any kind. The author is not responsible for any consequences of using this software, including but not limited to account restrictions, data loss, or violations of third-party terms of service.

This is a personal tool for personal use. Do not use it for spam, harassment, unauthorized access to others' messages, or any illegal activity.

🔒 Privacy Disclosure

chatmux stores decrypted message content in plaintext on your local machine:

  • ~/.local/share/chatmux/events.jsonl — all events (append-only)
  • ~/.local/share/chatmux/chatmux.db — SQLite database with messages, contacts, chats
  • ~/.local/share/chatmux/adapters/line/auth.json — LINE auth token
  • ~/.local/share/chatmux/adapters/line/storage.json — E2EE key storage

These files are protected by filesystem permissions (o

ตัดมาแค่ช่วงต้น อ่านต่อใน repo

ถาม PopNx