skype-archive-mcp

skype-archive-mcp

Enables local browsing and searching of Skype export archives through MCP tools for messages, conversations, participants, and attachment extraction, with privacy-focused local processing.

Category
访问服务器

README

Skype Archive CLI

Overview

Skype Archive CLI imports one uncompressed Skype export TAR into a local SQLite index, then provides fast local message, conversation, participant, and attachment browsing. The source archive is never modified and the application performs no network requests.

Privacy

All processing is local. The index and extracted-attachment cache under ~/.skype-archive-cli are unencrypted plaintext local data and can contain message text, names, identifiers, archive metadata, and attachment content. Protect them with the same care as the original export. The application uses private POSIX permissions where supported, but disk encryption and account security remain your responsibility. It performs no telemetry, update checks, or runtime network requests.

Prerequisites

  • Node.js 24
  • One uncompressed Skype export TAR
  • A platform supported by better-sqlite3

Install

npm install -g skype-archive-cli --ignore-scripts=false

Quick Start

npm install -g skype-archive-cli --ignore-scripts=false
skype-archive import ~/Downloads/8_example_export.tar
skype-archive status
skype-archive messages "project update, deadline" --conv "=Synthetic Chat"
skype-archive convs Synthetic

CLI

Command reference

Command Alias Purpose JSON result
import <export.tar> - Safely replace the active index from one uncompressed export TAR. Object containing archivePath, exportDate, importedAt, conversations, participants, messages, mediaParts, attachmentReferences, structuralFingerprint, and peakHeapBytes.
status - Report index compatibility and source state. Object containing indexed, compatible, and sourceState, plus paths, dates, schema version, and counts when a compatible index exists.
messages [query] msg Browse or search messages with filters and optional context. `{ "messages": [...], "total": number, "conversationName": string
convs [query] - List conversations or select by ID, exact name, or partial text. { "conversations": [...] }
participants [query] - List participants or search IDs and display names. { "participants": [...] }
message <id> - Show one normalized message and its attachment metadata. { "message": {...} }
attachments <message-id> - List attachment parts referenced by a message. { "attachments": [...] }
attachment <id> [--output <path>] - Extract one attachment to managed cache or an explicit destination. { "attachment": { "path": string, "cached": boolean } }

Global options

Option Meaning
--json Write exactly one JSON document to stdout. Progress and diagnostics remain on stderr.
-n, --limit <number> Set the maximum message, conversation, or participant results. Defaults to 20; accepts integers from 1 through 1,000.
-V, --version Print the package version to stdout.
-h, --help Print help to stdout.

messages options

Option Meaning
--conv <selector> Conversation ID, =exact display name, or literal partial ID/name.
--participant <selector> Literal partial participant ID/display name.
--from <date> Inclusive ISO date/timestamp or relative duration such as 3d.
--to <date> Inclusive ISO date/timestamp or relative duration. A date-only value includes that UTC day.
--incoming Return only incoming messages; conflicts with --outgoing.
--outgoing Return only outgoing messages; conflicts with --incoming.
--type <type> Match an exact Skype message type, for example RichText.
--has-attachment Return only messages with indexed attachment references.
-A, --after <number> Include 0 through 100 messages after each search match.
-B, --before <number> Include 0 through 100 messages before each search match.
-C, --context <number> Supply both context sides unless that side has an explicit -A or -B.

Context options require a non-empty search query.

attachment options

Option Meaning
--output <path> Write exclusively to a new file, or place the safe filename in an existing directory. Existing files and symlinks are not replaced or followed.

Human output is terminal-sanitized. Import progress and diagnostics use stderr. Interactive terminals receive one live progress line across scanning, message parsing, search indexing, finalization, and completion. Redirected stderr receives newline-delimited phase changes plus at most one ordinary update every five seconds. Progress contains only validated-offset archive percentage during scanning/message parsing and aggregate counts; --json stdout remains exactly one JSON document.

Message search treats spaces as OR and comma-separated groups as AND: hello world, deadline means (hello OR world) AND deadline. Filters include --conv, --participant, --from, --to, mutually exclusive --incoming/--outgoing, --type, and --has-attachment. -A, -B, and -C add 0 through 100 context messages around non-empty searches; -C supplies both sides unless -A or -B overrides that side.

Conversation selectors use an ID for an exact ID match, =Synthetic Chat for a case-insensitive exact display-name match, or plain Synthetic for a literal partial match. Exact names that identify multiple conversations report ambiguity instead of guessing.

Default attachment extraction uses the private managed cache and can reuse a validated cached file. --output accepts a new file path or an existing directory; destinations are created exclusively, so existing files and symlinks are never overwritten or followed.

JSON examples

With no active index, skype-archive status --json returns:

{"indexed":false,"compatible":false,"sourceState":"missing"}

A message search without context returns the exact top-level envelope below. Message objects contain the normalized list fields shown here:

{"messages":[{"rowId":42,"id":"synthetic-message-id","conversationId":"19:synthetic-thread","conversationName":"Synthetic Chat","senderId":"8:synthetic","senderName":"Synthetic User","timestamp":"2026-07-11T10:00:00.000Z","direction":"incoming","messageType":"Text","body":"Project update","attachmentCount":0,"isMatch":true}],"total":1,"conversationName":"Synthetic Chat"}

Context mode changes only the command envelope to grouped timelines:

{"groups":[{"conversationId":"19:synthetic-thread","messages":[{"rowId":42,"id":"synthetic-message-id","conversationId":"19:synthetic-thread","conversationName":"Synthetic Chat","senderId":"8:synthetic","senderName":"Synthetic User","timestamp":"2026-07-11T10:00:00.000Z","direction":"incoming","messageType":"Text","body":"Project update","attachmentCount":0,"isMatch":true}]}],"total":1,"conversationName":"Synthetic Chat"}

Inventory and extraction commands use command-specific envelopes. Each line below is a separate JSON document:

{"conversations":[]}
{"participants":[]}
{"attachments":[]}
{"attachment":{"path":"/tmp/synthetic-report.pdf","cached":false}}

Version 0.1 intentionally does not provide dedicated calls, unread state, or unanswered state. It supports one active archive only: there is no multi-archive merge or import through MCP.

See docs/MANUAL.md for the exact behavior and managed paths.

MCP

Import the export with the CLI before browsing it through MCP. The server still starts without an index so a client can list tools and call get_archive_status.

Run the published stdio executable without a global install:

npx -y --ignore-scripts=false -p skype-archive-cli skype-archive-mcp

Claude Desktop, Cursor, Codex, and other clients that accept stdio MCP JSON can use this configuration:

{
  "mcpServers": {
    "skype-archive": {
      "command": "npx",
      "args": ["-y", "--ignore-scripts=false", "-p", "skype-archive-cli", "skype-archive-mcp"]
    }
  }
}

The server registers exactly seven tools:

Tool Purpose Writes data
get_archive_status Report index compatibility and source state. No
get_messages Browse or search messages with filters and context. No
get_conversations List/search conversations and filter their type. No
get_participants List/search participants. No
get_message_by_id Return one full, untruncated message. No
get_attachments List attachment metadata and availability. No
extract_attachment Copy one validated attachment into the managed private cache. Cache only

The six query tools advertise read-only, non-destructive, idempotent, closed-world annotations. extract_attachment differs only by advertising readOnlyHint: false; it has no destination argument and can write only below ~/.skype-archive-cli/attachments.

MCP list limits default to 20 and accept 1 through 200. Context values accept 0 through 100. Bodies in get_messages results are limited to 8,000 Unicode code points and include bodyTruncated: true when shortened; use get_message_by_id for the full body and raw content. For example, an MCP client can call get_messages with invented arguments { "query": "synthetic deadline", "context": 2, "limit": 10 }, then call get_message_by_id with the returned invented ID.

MCP does not expose import, arbitrary extraction destinations, dedicated calls, unread state, or unanswered state.

If status reports indexed: true and compatible: false, the index schema does not match this release. Re-import the export with the CLI before browsing it; MCP never imports archives.

The TAR reader accepts conventional zero-block trailers and producer-compatible clean EOF exactly after a complete 512-byte-aligned entry. It still rejects partial headers, truncated entry data, invalid sizes and checksums, unsafe paths, links, and special entries.

Testing

npm install --ignore-scripts=false
npm test
npm run lint
npm run pack:check

Private-safe manual checks are documented in test/AI_MANUAL_TESTING.md.

Releases

Maintainers publish a stable GitHub Release whose tag exactly matches v<package version>. A token-free verification job repeats the Node 24 install, lint, test, and package checks; a separate minimal OIDC job then publishes a missing version to npm. Existing npm versions are skipped safely, and prereleases are never published to the stable npm channel.

License

AGPL-3.0-only. See LICENSE.

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选