dead-letter
dead-letter
Ваши файлы .eml заслуживают второй жизни.
dead-letter преобразует экспортированные письма в чистый Markdown с YAML front matter — разбивает цепочки, удаляет подписи, извлекает вложения, разбирает календари. Один файл или десять тысяч.
✨ Возможности
Преобразование с полной точностью — очистка HTML, сегментация цепочек Gmail/Outlook, обработка встроенных изображений и сводки событий календаря
CLI — укажите файл или каталог — и готово
Локальный веб-интерфейс — тёмная командная панель с перетаскиванием файлов, режимом наблюдения, значками оценки преобразования, историей обработки и диагностикой по каждой задаче
Рабочий процесс Inbox/Cabinet — поместите файлы
.emlв Inbox, и dead-letter организует пакеты Markdown в CabinetПроверка установки —
dead-letter doctorпроверяет ваше окружениеОтчёт о преобразовании — опциональный JSON-отчёт с диагностикой по каждому файлу, включая счётчики прикреплённых/сохранённых вложений для автоматизации и аудита
MCP-сервер — интеграция с Claude Desktop, Claude Code, Codex и другими MCP-клиентами
Плагин для Claude — установка одной командой в Claude Code или Cowork с четырьмя слэш-командами (
/dead-letter:convert,/dead-letter:summarize,/dead-letter:triage,/dead-letter:cabinet)Python API —
from dead_letter import convert— и вперёд
Related MCP server: DingusMail
🧠 Создан для LLM-пайплайнов
Сырые файлы .eml — шумный вход для downstream LLM и retrieval-пайплайнов: MIME-заголовки, границы multipart, дублированные HTML/plain тела и закодированные вложения — всё смешивается в текстовом пути.
dead-letter нормализует это в Markdown с YAML front matter, так что текст сообщения и метаданные готовы к чанкованию или индексации без MIME-парсинга или очистки base64. По умолчанию convert() и convert_dir() записывают один .md на сообщение и сохраняют имена вложений в front matter.
Если вы хотите также разделить артефакты файловой системы, рабочие процессы bundle и Cabinet записывают message.md плюс сохранённые декодированные файлы в attachments/. Markdown готов для текстовой обработки, а PDF, электронные таблицы, файлы календаря и другие сохранённые бинарные вложения остаются чисто отделёнными для любого downstream-парсера, который вы уже используете.
Для прямой интеграции с LLM MCP-сервер позволяет Claude Desktop, Claude Code, Codex и другим MCP-клиентам вызывать инструменты преобразования dead-letter без обращения к оболочке.
📊 Бенчмарки стоимости токенов
Ценность dead-letter не в меньшем количестве токенов, чем у любой альтернативы — это точность на токен: самое дешёвое представление, которое сохраняет письмо целым. Измерено на синтетическом корпусе HTML-цепочек, вложений и рассылок (токенизатор o200k_base, медианы):
~88% меньше токенов, чем сырой
.eml— одно письмо с PDF-вложением — это ~126k токенов в сыром виде против ~180 после преобразования.Единственное представление, которое сохраняет письмо целиком — структура цепочки, атрибуция отправителя по каждому сообщению, ссылки и метаданные вложений — всё сохраняется. Наивное извлечение текста дешевле именно потому, что отбрасывает их (0/2 вложений сохранено против 2/2 у dead-letter).
Бенчмарк честно признаёт, где проигрывает: наивное извлечение даёт меньше токенов, если вам не жалко выбрасывать вложения, ссылки и структуру цепочки. Полный метод, полная таблица (включая эти строки), раскрытие токенизатора и воспроизведение одной командой — в benchmarks/.
📦 Установка
С Homebrew на Apple silicon macOS:
brew tap BigCactusLabs/tap
brew install dead-letterФормула Homebrew устанавливает только основной CLI: dead-letter convert и
dead-letter doctor. Она намеренно не включает опциональные зависимости веб-интерфейса или 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Используйте pipx для изолированной установки UI или MCP:
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, сопоставляет суффикс без учёта регистра, пропускает символические ссылки, чьи разрешённые цели выходят за пределы запрошенного входного дерева, и дедуплицирует псевдонимы символьных ссылок внутри дерева, которые указывают на один и тот же файл сообщения.
Веб-интерфейс — запуск локального сервера:
dead-letter-ui --host 127.0.0.1 --port 8765Откройте http://127.0.0.1:8765 — при первом запуске появится подсказка с предложением папок Inbox и Cabinet по умолчанию. Настройте или пропустите, чтобы начать преобразование. Импортируйте файлы .eml перетаскиванием или через выбор файлов. Импорт одного файла использует файловый режим, а перетаскивание нескольких файлов создаёт одно пакетное задание в режиме каталога. Смешанные перетаскивания запрашивают подтверждение перед пропуском файлов, не являющихся .eml.
Бэкенд ограничивает импорт 100 МБ на файл как для одиночных, так и для пакетных загрузок.
Из исходного кода добавьте префикс 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 + вложения + исходник в одном каталоге):
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/.
Диагностика качества включает счётчики прикреплённых/сохранённых вложений, когда сообщение имеет вложения, подлежащие сохранению, так что отброшенные артефакты можно обнаружить машинно. См. Диагностика качества.
Пакетная обработка:
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-mcpClaude Desktop — добавьте в claude_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 — нужен только uv в PATH) и добавляет четыре слэш-команды: /dead-letter:convert, /dead-letter:summarize, /dead-letter:triage, /dead-letter:cabinet. Содержимое писем, обрабатываемое через плагин, считается ненадёжными данными, а не инструкциями, поэтому запросы на использование инструментов, учётные данные и эксфильтрацию, встроенные в сообщения, не выполняются. Исходный код в plugin/.
Маркетплейс закрепляет каждый опубликованный тег и коммит плагина. Автоматизация релизов обновляет этот указатель только после того, как точная версия PyPI встроенного MCP-сервера становится доступной, так что Claude Code и Cowork разрешают один и тот же воспроизводимый релиз.
Claude Code (ручное добавление MCP — альтернатива):
claude mcp add dead-letter -- uv run --extra mcp dead-letter-mcpCodex:
codex mcp add dead-letter -- uv run --extra mcp dead-letter-mcp
codex mcp listКоманда codex mcp add регистрирует локальный MCP-сервер dead-letter, а codex mcp list проверяет его доступность.
Инструменты
Инструмент | Обязательные аргументы | Возвращает |
|
| Текст Markdown. Также записывает файл, если указан |
|
| JSON с |
|
| JSON-сводка. Ограничено 50 файлами |
|
| JSON качества и структуры. Ничего постоянного не записывает. |
Все четыре принимают preset (default, clean, verbose, raw) и переопределения по флагам. Полный контракт, включая ограничения только для 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 # frontendCI запускает все четыре на PR и на пушах в ветки main или feat/** с теми же
командами, плюс
npx --yes @anthropic-ai/claude-code@2.1.145 plugin validate plugin/ и
node --check src/dead_letter/frontend/static/app.js.
📚 Документация
Индекс документации — публичная страница документации
Контракты времени выполнения — полная спецификация API и основного поведения
Руководство для агентов — операционное руководство для ИИ-агентов, работающих в этом репозитории
🔧 Инструменты, которые мы любим
MarkEdit — TextEdit для Markdown, нативный macOS, ~4 МБ. Открывает вывод dead-letter так, будто он всегда должен был там жить.
mo — локальный просмотрщик Markdown, который рендерит файлы в браузере с живой перезагрузкой. Укажите на ваш Cabinet и читайте преобразованные письма как ленту.
⚠️ Известные ограничения
Только локально — нет удалённого сервера, нет аутентификации
Реестр заданий в памяти (состояние сбрасывается при перезапуске)
Однопользовательский, одна машина
Лицензия
PolyForm Noncommercial 1.0.0 — бесплатно для личного, образовательного и некоммерческого использования. Коммерческое использование требует отдельной лицензии от Big Cactus Labs.
Available Tools
4 toolsconvert_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.
| Name | Required | Description | Default |
|---|---|---|---|
| preset | No | default | |
| dry_run | No | ||
| directory | Yes | ||
| thread_mode | No | latest | |
| thread_order | No | oldest-first | |
| include_raw_html | No | ||
| output_directory | No | ||
| strip_signatures | No | ||
| strip_disclaimers | No | ||
| embed_inline_images | No | ||
| include_all_headers | No | ||
| no_calendar_summary | No | ||
| strip_quoted_headers | No | ||
| strip_tracking_pixels | No | ||
| strip_signature_images | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| preset | No | default | |
| eml_path | Yes | ||
| output_path | No | ||
| thread_mode | No | latest | |
| thread_order | No | oldest-first | |
| include_raw_html | No | ||
| strip_signatures | No | ||
| strip_disclaimers | No | ||
| embed_inline_images | No | ||
| include_all_headers | No | ||
| no_calendar_summary | No | ||
| strip_quoted_headers | No | ||
| strip_tracking_pixels | No | ||
| strip_signature_images | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| preset | No | default | |
| eml_path | Yes | ||
| bundle_root | Yes | ||
| thread_mode | No | latest | |
| thread_order | No | oldest-first | |
| source_handling | No | copy | |
| include_raw_html | No | ||
| strip_signatures | No | ||
| strip_disclaimers | No | ||
| embed_inline_images | No | ||
| include_all_headers | No | ||
| no_calendar_summary | No | ||
| strip_quoted_headers | No | ||
| strip_tracking_pixels | No | ||
| strip_signature_images | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| preset | No | default | |
| eml_path | Yes | ||
| thread_mode | No | latest | |
| thread_order | No | oldest-first | |
| include_raw_html | No | ||
| strip_signatures | No | ||
| strip_disclaimers | No | ||
| embed_inline_images | No | ||
| include_all_headers | No | ||
| no_calendar_summary | No | ||
| strip_quoted_headers | No | ||
| strip_tracking_pixels | No | ||
| strip_signature_images | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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.
4 tool updates
v0.2.4- First observed
convert_directory - First observed
convert_eml - First observed
convert_eml_to_bundle - First observed
get_diagnostics
TDQS
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.
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.
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.
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
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
Document-to-Markdown MCP server — convert PDF, Office and HTML into LLM-ready Markdown.
Email infrastructure for AI agents — send, receive, search, and reply to email over MCP.
Hosted MCP server: convert PDFs to clean, LLM-ready Markdown with tables, formulas and OCR.
Email safety MCP server. Detects phishing, prompt injection, CEO fraud for AI agents.
Related MCP Servers
- AlicenseBqualityDmaintenanceA 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.39MIT
- AlicenseAqualityDmaintenanceMCP 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.22AGPL 3.0
- FlicenseNot gradedqualityBmaintenanceA 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.-
- AlicenseCqualityBmaintenanceA 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.38MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/BigCactusLabs/dead-letter'
If you have feedback or need assistance with the MCP directory API, please join our Discord server