proton-mail-bridge-client 2.1.9 → 2.1.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +32 -6
- package/dist/index.js.map +1 -1
- package/dist/utils/helpers.d.ts +1 -0
- package/dist/utils/helpers.d.ts.map +1 -1
- package/dist/utils/helpers.js +54 -2
- package/dist/utils/helpers.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -404,7 +404,7 @@ All commands support `--json` for machine-readable output, and any MCP tool is d
|
|
|
404
404
|
All flags work in both the MCP server and CLI:
|
|
405
405
|
|
|
406
406
|
```bash
|
|
407
|
-
PROTONMAIL_TOOL_TIER=core # expose
|
|
407
|
+
PROTONMAIL_TOOL_TIER=core # expose 25 core tools instead of all 96 — saves context window
|
|
408
408
|
PROTONMAIL_READ_ONLY=true # disable all write operations
|
|
409
409
|
PROTONMAIL_ALLOW_SEND=false # disable SMTP sends only (other writes still work)
|
|
410
410
|
PROTONMAIL_CONFIRM_DESTRUCTIVE=true # require confirmed:true on send, reply, forward, delete
|
|
@@ -438,7 +438,7 @@ PROTONMAIL_PASSWORD_COMMAND='pass proton/password'
|
|
|
438
438
|
PROTONMAIL_DATA_DIR="$HOME/.proton-mail-bridge-client"
|
|
439
439
|
|
|
440
440
|
# Tools
|
|
441
|
-
PROTONMAIL_TOOL_TIER='full' # 'core' exposes
|
|
441
|
+
PROTONMAIL_TOOL_TIER='full' # 'core' exposes 25 essential tools, incl. draft review/edit and list_accounts (saves context window); 'full' exposes all 96
|
|
442
442
|
|
|
443
443
|
# Safety
|
|
444
444
|
PROTONMAIL_READ_ONLY='false'
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AASA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAYnE,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAC9E,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAA2H,iBAAiB,EAA+B,MAAM,mCAAmC,CAAC;AAC5N,OAAO,EAAmC,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC1F,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAE7D,OAAO,KAAK,EAMV,mBAAmB,EACnB,cAAc,EACd,WAAW,EAIX,WAAW,EAIX,gBAAgB,EAChB,cAAc,EAGf,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -13,7 +13,7 @@ import { isMainModule } from "./is-main.js";
|
|
|
13
13
|
import { AnalyticsService } from "./services/analytics-service.js";
|
|
14
14
|
import { BULK_ITEM_TIMEOUT_MS, describeImapError, isLikelyAuthenticationError, isLikelyConnectionError, isLikelyTlsMismatchError, UID_VALIDITY_MISMATCH_ERROR } from "./services/simple-imap-service.js";
|
|
15
15
|
import { applySignature, plainTextToHtml } from "./services/smtp-service.js";
|
|
16
|
-
import { ensureValidEmails, foldQuotedHistory, isTextLikeMimeType, isValidEmail, lowerCaseAddress, normalizeBoolean, normalizeLimit, normalizeJsonValue, parseEmailId, parseEmails, projectFields, renderMarkdown, slugifyAccountAddress, splitAccountPrefix, stringifyForJson, withAccountPrefix, } from "./utils/helpers.js";
|
|
16
|
+
import { ensureValidEmails, foldQuotedHistory, isTextLikeMimeType, isValidEmail, lowerCaseAddress, normalizeBoolean, normalizeLimit, normalizeJsonValue, parseEmailId, parseEmails, projectFields, trimAttachmentsForListing, renderMarkdown, slugifyAccountAddress, splitAccountPrefix, stringifyForJson, withAccountPrefix, } from "./utils/helpers.js";
|
|
17
17
|
import { AccountManager } from "./services/account-manager.js";
|
|
18
18
|
import { logger } from "./utils/logger.js";
|
|
19
19
|
import { ensureDestructiveConfirmed, ensureEmailActionAllowed, ensureMailboxWriteAllowed, ensureOutboundRecipientsAllowed, ensureRemoteDraftSyncAllowed, ensureSendAllowed, resolveRemoteDraftSync, sanitizeRuntimeConfig, } from "./utils/runtime-policy.js";
|
|
@@ -518,7 +518,7 @@ const TOOLS = [
|
|
|
518
518
|
},
|
|
519
519
|
{
|
|
520
520
|
name: "get_emails",
|
|
521
|
-
description: "Fetch emails from a mailbox folder via live IMAP, defaults to newest first; set sortByUid to asc for oldest first. Use to browse or paginate recent messages in a specific folder. Prefer search_emails to filter by sender, subject, or date. Prefer search_indexed_emails for fast repeated queries when the local SQLite index is populated and Bridge availability is uncertain.",
|
|
521
|
+
description: "Fetch emails from a mailbox folder via live IMAP, defaults to newest first; set sortByUid to asc for oldest first. Use to browse or paginate recent messages in a specific folder. Prefer search_emails to filter by sender, subject, or date. Prefer search_indexed_emails for fast repeated queries when the local SQLite index is populated and Bridge availability is uncertain. Each email's attachments are metadata only (id/filename/contentType/size/disposition) — use list_attachments or get_email_by_id for full attachment detail.",
|
|
522
522
|
annotations: { readOnlyHint: true },
|
|
523
523
|
inputSchema: {
|
|
524
524
|
type: "object",
|
|
@@ -567,7 +567,7 @@ const TOOLS = [
|
|
|
567
567
|
},
|
|
568
568
|
{
|
|
569
569
|
name: "search_emails",
|
|
570
|
-
description: "Search emails via live IMAP filters with optional local post-processing for attachments and labels. Use when you need real-time results or must find messages received after the last sync. Prefer search_indexed_emails when the local index is current — it is significantly faster and works even when Bridge IMAP is unavailable.",
|
|
570
|
+
description: "Search emails via live IMAP filters with optional local post-processing for attachments and labels. Use when you need real-time results or must find messages received after the last sync. Prefer search_indexed_emails when the local index is current — it is significantly faster and works even when Bridge IMAP is unavailable. Each email's attachments are metadata only (id/filename/contentType/size/disposition) — use list_attachments or get_email_by_id for full attachment detail.",
|
|
571
571
|
annotations: { readOnlyHint: true },
|
|
572
572
|
inputSchema: {
|
|
573
573
|
type: "object",
|
|
@@ -1318,7 +1318,7 @@ const TOOLS = [
|
|
|
1318
1318
|
},
|
|
1319
1319
|
{
|
|
1320
1320
|
name: "search_indexed_emails",
|
|
1321
|
-
description: "Search the local SQLite mailbox index without making any IMAP connection. Supports free-text and field shortcuts inline: from:alice@example.com, to:bob, subject:invoice, label:Archive, domain:acme.com. Use for fast, offline-capable searches when the index is populated. Prefer search_emails when you need live IMAP results or when the index is stale or empty. Prefer this over search_emails when the index is current. Use search_emails if messages were received after the last sync.",
|
|
1321
|
+
description: "Search the local SQLite mailbox index without making any IMAP connection. Supports free-text and field shortcuts inline: from:alice@example.com, to:bob, subject:invoice, label:Archive, domain:acme.com. Use for fast, offline-capable searches when the index is populated. Prefer search_emails when you need live IMAP results or when the index is stale or empty. Prefer this over search_emails when the index is current. Use search_emails if messages were received after the last sync. Each email's attachments are metadata only (id/filename/contentType/size/disposition) — use list_attachments or get_email_by_id for full attachment detail.",
|
|
1322
1322
|
annotations: { readOnlyHint: true },
|
|
1323
1323
|
inputSchema: {
|
|
1324
1324
|
type: "object",
|
|
@@ -1708,8 +1708,22 @@ export const CORE_TOOL_NAMES = new Set([
|
|
|
1708
1708
|
"search_indexed_emails",
|
|
1709
1709
|
"send_email",
|
|
1710
1710
|
"reply_to_email",
|
|
1711
|
+
// reply_all_email/forward_email were missing here despite reply_to_email
|
|
1712
|
+
// being core — an asymmetry with no real reason behind it (all three are
|
|
1713
|
+
// equally routine day-to-day sends, confirmed by this session's own
|
|
1714
|
+
// multi-account/daily-scenarios testing).
|
|
1715
|
+
"reply_all_email",
|
|
1716
|
+
"forward_email",
|
|
1711
1717
|
"create_draft",
|
|
1712
1718
|
"send_draft",
|
|
1719
|
+
// list_drafts/get_draft/update_draft — found live: these are exactly as
|
|
1720
|
+
// routine as create_draft/send_draft (already core), just for the
|
|
1721
|
+
// review-before-sending step in between. Leaving them full-tier-only meant
|
|
1722
|
+
// "core" covered composing and sending a draft but not looking at or
|
|
1723
|
+
// editing it first.
|
|
1724
|
+
"list_drafts",
|
|
1725
|
+
"get_draft",
|
|
1726
|
+
"update_draft",
|
|
1713
1727
|
"trash_email",
|
|
1714
1728
|
"archive_email",
|
|
1715
1729
|
"mark_email_read",
|
|
@@ -1722,6 +1736,10 @@ export const CORE_TOOL_NAMES = new Set([
|
|
|
1722
1736
|
"get_folders",
|
|
1723
1737
|
"sync_emails",
|
|
1724
1738
|
"get_connection_status",
|
|
1739
|
+
// list_accounts — found live: with multi-account support (v2.1.0+), core
|
|
1740
|
+
// had no way to even see which accounts were configured or check their
|
|
1741
|
+
// connection status without switching to the full tier.
|
|
1742
|
+
"list_accounts",
|
|
1725
1743
|
]);
|
|
1726
1744
|
function citationToResourceLink(source) {
|
|
1727
1745
|
return {
|
|
@@ -4315,7 +4333,10 @@ export function createServer(config, options = {}) {
|
|
|
4315
4333
|
// Scope limitation (follow-up round): stays scoped to the primary account's
|
|
4316
4334
|
// remote Drafts mailbox only — see list_drafts' identical note.
|
|
4317
4335
|
const result = await imapService.listRemoteDrafts(normalizeLimit(args.limit, 50), normalizeLimit(args.offset, 0, 0, 10_000));
|
|
4318
|
-
|
|
4336
|
+
// projectFields (called with no fields arg) still trims each email's
|
|
4337
|
+
// attachments to the essentials — same fix as every other list-style
|
|
4338
|
+
// tool, this one just didn't route through projectFields at all before.
|
|
4339
|
+
return createTextResult({ ...result, emails: projectFields(result.emails) }, false, result.emails.map(emailSource));
|
|
4319
4340
|
}
|
|
4320
4341
|
case "get_draft": {
|
|
4321
4342
|
const { bundle: getDraftBundle, rest: getDraftIdRest } = resolveAccountForDraftId(requireString(args, "draftId"));
|
|
@@ -6589,7 +6610,7 @@ export function createServer(config, options = {}) {
|
|
|
6589
6610
|
messageIds: rawThread.messageIds.map((id) => withAccountPrefix(threadAccountSlug, id)),
|
|
6590
6611
|
}
|
|
6591
6612
|
: rawThread;
|
|
6592
|
-
const
|
|
6613
|
+
const filteredThread = threadFolders && threadFolders.length > 0
|
|
6593
6614
|
? {
|
|
6594
6615
|
...thread,
|
|
6595
6616
|
messages: thread.messages.filter((message) => threadFolders.includes(message.folder)),
|
|
@@ -6597,6 +6618,11 @@ export function createServer(config, options = {}) {
|
|
|
6597
6618
|
unreadCount: thread.messages.filter((message) => threadFolders.includes(message.folder) && !message.isRead).length,
|
|
6598
6619
|
}
|
|
6599
6620
|
: thread;
|
|
6621
|
+
// Same per-call attachment trimming as every search/list tool — see
|
|
6622
|
+
// projectFields' comment. get_thread_by_id's messages carry full
|
|
6623
|
+
// MailboxMessage/EmailSummary objects (unlike get_threads' lean
|
|
6624
|
+
// ThreadSummary list, which has no per-message attachments at all).
|
|
6625
|
+
const result = { ...filteredThread, messages: filteredThread.messages.map(trimAttachmentsForListing) };
|
|
6600
6626
|
return createTextResult(result, false, [threadSource(result), ...result.messages.map((message) => emailSource({
|
|
6601
6627
|
id: message.primaryEmailId,
|
|
6602
6628
|
subject: message.subject,
|