Skip to main content
Glama
BigCactusLabs

dead-letter

dead-letter

PyPI package Python versions License: PolyForm Noncommercial

あなたの .eml ファイルには、セカンドライフが必要です。

dead-letter は、メールのエクスポートを、YAML フロントマター付きのクリーンな Markdown に変換します。スレッドの分割、署名の除去、添付ファイルの抽出、カレンダーの解析に対応。1 ファイルでも 1 万ファイルでも同じように処理します。

✨ 機能

  • 忠実度の高い変換 — HTML のサニタイズ、Gmail/Outlook のスレッド分割、インライン画像の処理、カレンダーイベントの要約

  • CLI — ファイルまたはディレクトリを指定するだけで実行できます

  • ローカル Web UI — ドラッグ&ドロップインポート、ウォッチモード、変換グレードバッジ、処理履歴、ジョブごとの診断情報を備えたダークなコマンドセンター風インターフェース

  • Inbox/Cabinet ワークフロー.eml ファイルを Inbox にドロップすると、dead-letter が Markdown バンドルを Cabinet に整理します

  • インストール検証dead-letter doctor が実行環境をチェックします

  • 変換レポート — ファイルごとの診断情報を含むオプトインの JSON レポート。添付ファイルの参照数/保持数を自動化や監査に利用できます

  • MCP サーバー — Claude Desktop、Claude Code、Codex、その他の MCP クライアントと連携できます

  • Claude プラグイン — Claude Code または Cowork に 1 コマンドでインストールでき、4 つのスラッシュコマンド (/dead-letter:convert, /dead-letter:summarize, /dead-letter:triage, /dead-letter:cabinet) を提供します

  • Python APIfrom dead_letter import convert ですぐに使えます

Related MCP server: DingusMail

🧠 LLM パイプライン向けに設計

生の .eml ファイルは、後段の LLM や検索パイプラインにとってノイズの多い入力です。MIME ヘッダー、マルチパート境界、重複した HTML/プレーンテキスト本文、エンコードされた添付ファイルがすべてテキスト経路に混ざり込みます。

dead-letter はこれらを YAML フロントマター付きの Markdown に正規化するため、MIME 解析や base64 の後処理をしなくても、メッセージ本文とメタデータをチャンキングやインデックス作成に利用できます。デフォルトの convert()convert_dir() は、メッセージごとに 1 つの .md を書き出し、添付ファイル名をフロントマターに保持します。

ファイルシステム上の成果物も分離したい場合は、バンドルおよび Cabinet ワークフローが message.md と、保持されたデコード済みファイルを attachments/ の下に書き出します。Markdown はテキスト取り込みにそのまま使え、PDF、スプレッドシート、カレンダーファイル、その他の保持されたバイナリ添付ファイルは、既存の後段パーサー向けにきれいに分離されたままになります。

LLM との直接統合には、MCP サーバーを使うと、Claude Desktop、Claude Code、Codex、その他の MCP クライアントがシェルを介さずに dead-letter の変換ツールを呼び出せます。

📊 トークンコストのベンチマーク

dead-letter の価値は、あらゆる代替手段よりトークン数が少ないことではありません。トークンあたりの忠実度、つまりメールを完全に保つ最も安価な表現であることです。HTML スレッド、添付ファイル、ニュースレターからなる合成コーパスで測定しました(トークナイザー o200k_base、中央値)。

  • 生の .eml よりトークン数が約 88% 少ない — PDF 添付ファイル付きのメール 1 通は、生の状態で約 126k トークン、変換後は約 180 トークンです。

  • メールを完全に保つ唯一の表現 — スレッド構造、メッセージごとの送信者属性、リンク、添付ファイルのメタデータがすべて保持されます。単純なテキスト抽出がより安価なのは、まさにこれらを捨てるからです(添付ファイルの保持は 0/2 に対して dead-letter は 2/2)。

このベンチマークは、どこで劣るのかも正直に示しています。添付ファイル、リンク、スレッド構造を捨てても構わないのであれば、単純な抽出の方がトークン数は少なくなります。完全な方法、完全なテーブル(それらの行を含む)、トークナイザーの開示、ワンコマンドでの再現手順は benchmarks/ にあります。

📦 インストール

Apple silicon macOS で Homebrew を使う場合:

brew tap BigCactusLabs/tap
brew install dead-letter

Homebrew フォーミュラはコア CLI のみをインストールします: dead-letter convertdead-letter doctor。オプションの Web UI や MCP サーバーの依存関係スタックは意図的にバンドルしていません。

pip を使う場合:

pip install dead-letter            # core + CLI
pip install dead-letter[cli]       # + watchfiles (used by backend/UI watch mode)
pip install dead-letter[ui]        # + web UI, API server, and watch mode
pip install dead-letter[mcp]       # + MCP server

UI や MCP を分離してインストールするには pipx を使います:

pipx install 'dead-letter[ui]'    # installs dead-letter and dead-letter-ui
pipx install 'dead-letter[mcp]'   # installs dead-letter and dead-letter-mcp

ソースからインストールする場合:

git clone https://github.com/BigCactusLabs/dead-letter.git
cd dead-letter
uv sync --extra dev     # all extras
uv sync --extra ui      # UI only
uv sync --extra mcp     # MCP only

🚀 クイックスタート

CLI — 単一ファイルを変換:

dead-letter convert message.eml

ディレクトリ全体を変換:

dead-letter convert inbox/ --output out/

出力と一緒に JSON 変換レポートを生成:

dead-letter convert inbox/ --output out/ --report

--output を指定すると、レポートはその出力ディレクトリに .dead-letter-report.json として書き込まれます。--output を指定しない場合、ファイル変換ではソースメッセージの隣に、ディレクトリ変換では入力ディレクトリのルートにレポートが書き込まれます。

実行環境をチェック:

dead-letter doctor

ディレクトリ変換は .eml ファイルを再帰的にスキャンし、拡張子を大文字小文字を区別せずに照合します。解決後のターゲットが指定された入力ツリーの外に出るシンボリックリンクのファイルはスキップし、同じメッセージファイルに解決されるツリー内のシンボリックリンクエイリアスは重複排除します。

Web UI — ローカルサーバーを起動:

dead-letter-ui --host 127.0.0.1 --port 8765

http://127.0.0.1:8765 を開きます。初回起動時にはセットアップ画面が表示され、デフォルトの Inbox フォルダと Cabinet フォルダが提案されます。設定するかスキップして変換を開始します。.eml ファイルはドラッグ&ドロップまたはファイルピッカーでインポートします。単一ファイルのインポートはファイルモード、複数ファイルのドロップはディレクトリモードのバッチジョブとして 1 つ作成されます。混在したドロップでは、非 .eml ファイルをスキップする前に確認を求められます。バックエンドは単一・バッチの両方のアップロードで、ファイルあたり 100 MB のインポート上限を適用します。

ソースチェックアウトから実行する場合は、uv run を前置します:

uv run dead-letter convert message.eml
uv run --extra ui dead-letter-ui --host 127.0.0.1 --port 8765

🐍 Python API

from dead_letter import convert

result = convert("message.eml")
print(result.subject, result.sender)
print(result.output)  # path to the generated .md

オプション付き:

from dead_letter import convert, ConvertOptions

result = convert("message.eml", options=ConvertOptions(
    strip_signatures=True,
    strip_quoted_headers=True,
))

署名画像(ロゴ、ソーシャルアイコン)とトラッキングピクセルを除去:

result = convert("message.eml", options=ConvertOptions(
    strip_signature_images=True,
    strip_tracking_pixels=True,
))

有効にすると、これらのフィルターはレンダリングされた Markdown から一致する画像を削除し、除去されたインライン署名/トラッキングアセットをバンドル添付ファイルの出力から除外します。

バンドル変換(Markdown + 添付ファイル + ソースを 1 つのディレクトリに):

from dead_letter import convert_to_bundle

bundle = convert_to_bundle("message.eml", bundle_root="cabinet/", source_handling="copy")
print(bundle.markdown)     # cabinet/message/message.md
print(bundle.attachments)  # retained extracted files under cabinet/message/attachments/

source_handling="copy" は元の .eml をその場に保持します。省略した場合、convert_to_bundle() はデフォルトで source_handling="move" となり、ソースメッセージをバンドル内に移動します。

保持された抽出添付ファイルのファイル名は、attachments/ の下に書き込まれる前に、安全なベース名に正規化されます。

品質診断には、保持対象となる添付ファイルがあるメッセージについて、参照/保持された添付ファイル数が含まれるため、破棄された成果物を機械的に検出できます。Quality Diagnostics を参照してください。

バッチ:

from dead_letter import convert_dir

for r in convert_dir("inbox/", output="out/"):
    print(f"{'✓' if r.success else '✗'} {r.source.name}")

🔌 MCP サーバー

dead-letter には MCP サーバーが同梱されており、LLM クライアントはシェルを介さずに .eml ファイルを直接変換できます。

インストールして起動:

pip install dead-letter[mcp]
dead-letter-mcp

ソースチェックアウトから:

uv run --extra mcp dead-letter-mcp

Claude Desktopclaude_desktop_config.json に追加:

{
  "mcpServers": {
    "dead-letter": {
      "command": "uv",
      "args": ["--directory", "/path/to/dead-letter", "run", "--extra", "mcp", "dead-letter-mcp"]
    }
  }
}

Claude Code または Cowork(推奨 — Claude プラグイン):

/plugin marketplace add BigCactusLabs/bigcactuslabs-plugins
/plugin install dead-letter

このプラグインは MCP サーバーをバンドルしており(uvx 経由、pip install は不要 — PATHuv があればよい)、4 つのスラッシュコマンドを追加します: /dead-letter:convert/dead-letter:summarize/dead-letter:triage/dead-letter:cabinet。プラグインを通じて処理されるメールコンテンツは命令ではなく信頼できないデータとして扱われるため、メッセージに埋め込まれたツール使用、資格情報、外部送信の要求には従いません。ソースは plugin/ にあります。

マーケットプレイスは、公開された各プラグインのタグとコミットを固定します。リリース自動化は、バンドルされた MCP サーバーの正確な PyPI バージョンが公開された後にのみそのポインタを更新するため、Claude Code と Cowork は同じ再現可能なリリースを解決します。

Claude Code(手動 MCP 追加 — 代替手段):

claude mcp add dead-letter -- uv run --extra mcp dead-letter-mcp

Codex:

codex mcp add dead-letter -- uv run --extra mcp dead-letter-mcp
codex mcp list

codex mcp add コマンドでローカルの dead-letter MCP サーバーを登録し、codex mcp list で利用可能かどうかを確認します。

ツール

ツール

必須引数

戻り値

convert_eml

eml_path

Markdown テキスト。output_path が指定された場合はファイルも書き出します。

convert_eml_to_bundle

eml_path, bundle_root

bundle_pathmarkdown_pathattachment_paths を含む JSON。コピーのみ: 元の .eml は移動も削除もされません。

convert_directory

directory, output_directory

JSON サマリー。1 回の呼び出しにつき最大 50 個の .eml ファイル。

get_diagnostics

eml_path

品質と構造の JSON。永続的なものは書き込みません。

4 つすべてが presetdefaultcleanverboseraw)とフラグごとの上書きを受け付けます。MCP 専用の制約とエラーテキストの表を含む完全な契約は、docs/reference/v4-runtime-contracts.md を参照してください。

🗂 プロジェクト構成

src/dead_letter/
├── core/           # conversion pipeline (MIME, HTML, threads, rendering)
├── backend/        # CLI, API server, job runner, watch mode, MCP server
└── frontend/       # static web UI (Alpine.js ES modules + vanilla fetch)
tests/
├── core/           # conversion pipeline tests with .eml fixtures
├── backend/        # API, job, and watch tests
├── plugin/         # Claude plugin manifest, skill, and command tests
└── frontend/       # JS unit tests

🧪 テスト

uv run pytest -q tests/core        # conversion pipeline
uv run pytest -q tests/backend     # API and job runner
uv run pytest -q tests/plugin      # Claude plugin manifest, skill, and command surfaces
node --test tests/frontend/*.test.js     # frontend

CI は PR と main または feat/** ブランチへのプッシュで、同じコマンドを使って 4 つすべてを実行します。さらに npx --yes @anthropic-ai/claude-code@2.1.145 plugin validate plugin/node --check src/dead_letter/frontend/static/app.js も実行します。

📚 ドキュメント

🔧 お気に入りのツール

  • MarkEdit — Markdown 向け TextEdit、macOS ネイティブ、約 4 MB。dead-letter の出力を、まるで最初からそこにあるかのように開きます。

  • mo — ブラウザでファイルをライブリロード付きでレンダリングするローカル Markdown ビューア。Cabinet を指定すれば、変換済みメールをフィードのように読めます。

⚠️ 既知の制限

  • ローカルのみ — リモートサーバーなし、認証なし

  • インメモリのジョブレジストリ(再起動すると状態はリセットされます)

  • シングルユーザー、シングルマシン

ライセンス

PolyForm Noncommercial 1.0.0 — 個人、教育、非営利での使用は無料です。商用利用には Big Cactus Labs からの別途ライセンスが必要です。

Available Tools

4 tools
convert_directoryA

Batch convert all .eml files in a directory to Markdown.

Recursively finds all .eml files and converts them. Returns a JSON summary with total, successes, failures, output_paths, and errors.

Use convert_eml to retrieve individual converted file content.

ParametersJSON Schema
NameRequiredDescriptionDefault
presetNodefault
dry_runNo
directoryYes
thread_modeNolatest
thread_orderNooldest-first
include_raw_htmlNo
output_directoryNo
strip_signaturesNo
strip_disclaimersNo
embed_inline_imagesNo
include_all_headersNo
no_calendar_summaryNo
strip_quoted_headersNo
strip_tracking_pixelsNo
strip_signature_imagesNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Without annotations, the description adds value by stating batch conversion, recursion, and JSON summary structure, but lacks info on side effects, permissions, or limitations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three concise sentences, front-loaded with purpose, no fluff, and ends with a helpful alternative reference.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (15 parameters), the description covers only basic behavior and output, leaving the agent without insight into key configuration options.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage and 15 parameters, the description provides no explanation for any parameter beyond the directory. Agent has no guidance on presets, dry_run, etc.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool batch converts .eml files in a directory to Markdown, with recursive behavior, and distinguishes itself from sibling convert_eml by mentioning individual file retrieval.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a clear alternative: use convert_eml for individual file content. However, it does not explicitly state when not to use this tool or mention the sibling convert_eml_to_bundle.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

convert_emlA

Convert a .eml email file to Markdown with YAML front matter.

Returns the full Markdown content (front matter + body). When output_path is provided, also writes the file to disk.

Presets bundle common flag combinations:

  • default: strips signatures, tracking pixels, signature images

  • clean: default + strips disclaimers and quoted headers

  • verbose: includes all headers and raw HTML

  • raw: no stripping, preserves everything

Individual flags override the preset when provided.

ParametersJSON Schema
NameRequiredDescriptionDefault
presetNodefault
eml_pathYes
output_pathNo
thread_modeNolatest
thread_orderNooldest-first
include_raw_htmlNo
strip_signaturesNo
strip_disclaimersNo
embed_inline_imagesNo
include_all_headersNo
no_calendar_summaryNo
strip_quoted_headersNo
strip_tracking_pixelsNo
strip_signature_imagesNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It discloses the return value (Markdown with front matter), the optional disk write, and the behavior of presets and flag overrides. However, it does not explain the thread_mode and thread_order parameters, leaving some behavioral aspects unexplained.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise with six sentences, front-loaded with the core action, and uses a clear bullet-like list for presets. Every sentence adds value without repetition or fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (14 parameters, presets, output schema), the description covers the main purpose, return value, presets, and override logic. It lacks explanation for thread_mode and thread_order, but overall provides sufficient context for most use cases.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must add meaning. It explains presets and mentions several flags (signatures, tracking pixels, etc.), and notes that individual flags override presets. However, it omits details for thread_mode, thread_order, and some boolean flags. The presets bundling compensates partially.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool converts .eml to Markdown with YAML front matter, specifying the output format and the optional file write. It implicitly distinguishes from siblings like convert_directory and convert_eml_to_bundle by focusing on a single file conversion.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear guidance on preset usage and flag overrides, but it does not explicitly state when to use this tool versus sibling tools like convert_directory or convert_eml_to_bundle, which would help an agent choose correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

convert_eml_to_bundleB

Convert a .eml file to a self-contained bundle with markdown and attachments.

Creates a directory containing the converted markdown, extracted attachments, and optionally the original .eml source.

source_handling only accepts 'copy' over MCP: the original .eml is copied into the bundle and left untouched. The 'move' and 'delete' modes are rejected here — use the CLI or the Python API for those.

Returns JSON with bundle_path, markdown_path, attachment_paths, and optional diagnostics.

ParametersJSON Schema
NameRequiredDescriptionDefault
presetNodefault
eml_pathYes
bundle_rootYes
thread_modeNolatest
thread_orderNooldest-first
source_handlingNocopy
include_raw_htmlNo
strip_signaturesNo
strip_disclaimersNo
embed_inline_imagesNo
include_all_headersNo
no_calendar_summaryNo
strip_quoted_headersNo
strip_tracking_pixelsNo
strip_signature_imagesNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It states that the tool creates a directory, copies the .eml, leaves the source untouched, and returns a JSON structure with specific fields. It also discloses that move/delete modes are rejected. However, it does not mention potential side effects like overwriting existing directories, error handling, or permissions. Still, the core mutation and side-effect profile is clear, warranting a 4.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is about 120 words, organized into a brief purpose statement, a note on source_handling, and a return-value summary. It is not excessively verbose and front-loads the core action. Some redundancy exists (e.g., stating the return format), but it remains appropriately sized for the complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite an output schema (which the description partially covers by naming returned fields), the tool has 15 parameters and 0% schema description coverage. The description only addresses source_handling, leaving the meaning of presets, thread modes, and all boolean flags unexplained. This is a significant gap for an agent to invoke the tool correctly with the full range of options.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It only explains source_handling, noting the 'copy' limitation. The other 14 parameters (preset, thread_mode, thread_order, boolean flags) are left undefined. The description adds value for one parameter but fails to clarify the vast majority, leaving agents without essential meaning for the options they may set.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: converting an .eml file into a self-contained bundle with markdown and attachments. It uses a specific verb and resource, but does not differentiate from sibling tools like convert_eml or convert_directory. The purpose is unambiguous, earning a 4 rather than a 5 because it lacks explicit sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a constraint on source_handling (only 'copy' is accepted over MCP, with guidance to use CLI/API for other modes) but does not explain when to choose this tool over its siblings. There is no mention of convert_eml, convert_directory, or get_diagnostics as alternatives for different scenarios. The guidance is parameter-specific rather than tool-selection-focused.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_diagnosticsA

Inspect email quality and structure without writing permanent files.

Use this to assess conversion quality before committing, or to troubleshoot problematic .eml files.

Always returns JSON with: state (normal/degraded/review_recommended), selected_body, segmentation_path, client_hint, confidence, fallback_used, and warnings. Two keys are conditional: stripped_images appears only when images were removed, and attachments only when the message had attachments eligible for retention.

ParametersJSON Schema
NameRequiredDescriptionDefault
presetNodefault
eml_pathYes
thread_modeNolatest
thread_orderNooldest-first
include_raw_htmlNo
strip_signaturesNo
strip_disclaimersNo
embed_inline_imagesNo
include_all_headersNo
no_calendar_summaryNo
strip_quoted_headersNo
strip_tracking_pixelsNo
strip_signature_imagesNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of disclosing behavior. It explicitly states the operation is non-destructive ('without writing permanent files'), and thoroughly describes the return structure: 'Always returns JSON with: state (normal/degraded/review_recommended), selected_body, segmentation_path, client_hint, confidence, fallback_used, and warnings.' It also details conditional keys (stripped_images only when images removed, attachments only when eligible), providing comprehensive insight into output behavior without relying on annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and concise: it opens with the core purpose, then provides usage guidance, and ends with a precise list of return keys and conditional behaviors. Each sentence adds value, there is no fluff, and the most critical information (non-destructive, purpose, use cases) is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

While the description thoroughly explains the return format and gives usage context, it leaves the 13 parameters completely undocumented. Given the tool's complexity (multiple enums, boolean toggles) and the lack of schema descriptions, an agent would not be able to correctly configure parameters without external knowledge. The output schema exists (per context signals) and the description explains return values, but the absence of parameter semantics makes the definition incomplete for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters1/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 0% description coverage, and the description provides no explanation of any of the 13 parameters. While the description mentions some related behaviors (e.g., conditional keys for stripped images and attachments), it does not explain what parameters like 'preset', 'thread_mode', 'strip_signatures', or 'include_raw_html' actually control. The agent is left to infer from parameter names alone, which is insufficient for a tool with this many options. The description fails to compensate for the schema's lack of parameter descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Inspect email quality and structure without writing permanent files.' It specifies the verb ('inspect'), the resource ('email quality and structure'), and the non-destructive nature. It also names use cases ('assess conversion quality before committing, or to troubleshoot problematic .eml files'), which effectively distinguishes it from the sibling conversion tools (convert_eml, convert_eml_to_bundle, convert_directory) that perform transformations rather than inspection.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides explicit usage scenarios: 'Use this to assess conversion quality before committing, or to troubleshoot problematic .eml files.' This gives clear context for when to use the tool. However, it does not explicitly state when not to use it or mention the sibling conversion tools as alternatives, relying on the implicit inference that conversion tools are for transforming files while this inspects them. A slight improvement would be naming the alternatives directly, so 4.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 4 tool updatesv0.2.4
    • First observedconvert_directory
    • First observedconvert_eml
    • First observedconvert_eml_to_bundle
    • First observedget_diagnostics

TDQS

A3.7/5.0
Disambiguation4/5

The tools have distinct purposes: batch conversion, single conversion, bundle conversion, and diagnostics. However, convert_eml and convert_eml_to_both overlap as single-file converters, though descriptions clarify the difference in output. No tools are truly ambiguous.

Naming Consistency4/5

All conversion tools follow a consistent 'convert_' prefix, while get_diagnostics uses 'get_'. The pattern is clear and logical for each tool's function, with only one deviation that is still fitting.

Tool Count5/5

With 4 tools, the server is well-scoped for an email conversion utility. Each tool serves a distinct and necessary function without redundancy or bloat.

Completeness4/5

The set covers batch conversion, single conversion, bundle creation, and diagnostics. A possible gap is the lack of a tool to manage or list existing bundles, but the core conversion workflow is complete.

Maintenance

ActivityMaintained
ResponsivenessResponsive

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    A local MCP server that provides LLM clients with read/write access to email and calendar data from Gmail, iCloud, and generic IMAP providers. It runs entirely on your machine, keeping data private while enabling email management, calendar operations, and task handling through natural language.
    39
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    MCP server for parsing .eml email files, extracting metadata, content, and attachments with smart organization into folders. Enables AI to read and handle email files offline without triggering trackers.
    2
    2
    AGPL 3.0
  • F
    license
    Not graded
    quality
    B
    maintenance
    A private, single-user MCP server that unifies Gmail, Microsoft 365/Outlook, and IMAP mailboxes for LLMs to search and read emails live, without storing or caching mailbox contents.
    -
  • A
    license
    C
    quality
    B
    maintenance
    A local-first Python MCP server that turns Gmail, Outlook/Microsoft 365, iCloud Mail, and generic IMAP/SMTP mailboxes into a synchronized, searchable OKF knowledge layer, exposing 38 tools and four resources for mailbox actions, synchronization, retrieval, attachments, and optional semantic search while keeping the provider mailbox authoritative.
    38
    MIT

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/BigCactusLabs/dead-letter'

If you have feedback or need assistance with the MCP directory API, please join our Discord server