Mergewell Mail Merge
Mail merge from Excel or CSV to PDF, right in the chat.
我該用這個嗎
品質與安全性
發現項目(3)
- HIGH
- MEDIUM在 generate_merged_documents 中
- INFO在 generate_merged_documents 中
根據工具定義與協定合規性的自動化分析。
上下文成本
這是每次將伺服器的工具載入模型上下文時所消耗的約略 token 數量。數量越高,可用於其他工作的注意力就越少。
安裝
一鍵安裝
將以下內容加入你的 `claude_desktop_config.json` 檔案:
{
"mcpServers": {
"mail-merge": {
"url": "https://mail-merge.zovo.one/mcp"
}
}
}遠端端點
https://mail-merge.zovo.one/mcpstreamable-http它能做什麼
工具清單
工具(2)
🟢preview_mail_merge(document_type, file, sheet, csv_text, records, ...)
Use this when the user wants to check a mail merge before printing: see how their spreadsheet (CSV or Excel) or list fills a letter, certificate or envelope template, which template fields like {{First Name}} have no matching column, which columns were matched by a similar name (first_name for First Name), and which records have empty values. Returns the first 3 merged records (or from preview_from) and a missing-field report; no files. Does not send email, print, or make labels. Do not use for Outlook or Gmail email merges.
輸入結構描述
{
"type": "object",
"properties": {
"document_type": {
"type": "string",
"enum": [
"letter",
"certificate",
"envelope"
],
"description": "What to merge into: letter (US business letter, one per row), certificate (landscape award/completion/participation certificate, one per row), or envelope (#10 envelope with recipient and return address). Example: letter."
},
"file": {
"type": "object",
"properties": {
"download_url": {
"type": "string",
"description": "Temporary download link for the file, supplied by ChatGPT."
},
"file_id": {
"type": "string",
"description": "ChatGPT file id, e.g. file_abc123."
},
"mime_type": {
"description": "Media type if known, e.g. application/pdf.",
"type": "string"
},
"file_name": {
"description": "Original file name if known, e.g. statement.pdf.",
"type": "string"
}
},
"required": [
"download_url",
"file_id"
],
"description": "The spreadsheet with one row per recipient: Excel .xlsx, CSV or TSV, first row = column headers, e.g. donors.xlsx."
},
"sheet": {
"description": "For an .xlsx file: the sheet (tab) name to use, e.g. Donors. Defaults to the first sheet that has data.",
"type": "string",
"maxLength": 100
},
"csv_text": {
"description": "Alternative to a file: the list pasted as CSV or tab-separated text with a header row, e.g. \"First Name,Last Name,City\\nAna,Lopez,Austin\".",
"type": "string",
"maxLength": 400000
},
"records": {
"description": "Alternative to a file: the recipients typed as objects with the same keys, e.g. [{\"First Name\": \"Ana\", \"Last Name\": \"Lopez\", \"Amount\": 250}].",
"maxItems": 5000,
"type": "array",
"items": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": [
"string",
"number",
"boolean",
"null"
]
}
}
},
"names": {
"description": "Shortcut for a plain list of names (one column called Name), e.g. [\"Ana Lopez\", \"Ben Okafor\"]. Handy for certificates.",
"maxItems": 5000,
"type": "array",
"items": {
"type": "string",
"maxLength": 200
}
},
"has_header": {
"description": "Set false if the first row of the file is data, not column names (columns are then called Column A, Column B, ...). Default true.",
"type": "boolean"
},
"template": {
"description": "Letters: the letter text from the salutation to the last paragraph, with merge fields, e.g. \"Dear {{First Name|Friend}},\\n\\nThank you for your gift of {{Amount:currency}} on {{Gift Date:date}}.{{#if Company}} Please thank everyone at {{Company}}.{{/if}}\". Syntax: {{Field}}, {{Field|default}}, {{Field:format}} with formats currency, number, integer, ordinal, date, short_date, iso_date, upper, lower, title, first_word, last_word; {{#if Field}}...{{else}}...{{/if}}, {{#if Field = value}}, {{#if Gift > 0}} (also !=, <, >=, <=; numbers or dates), {{#unless Field}}...{{/unless}}; {{today}} is the document date.",
"type": "string",
"maxLength": 20000
},
"subject": {
"description": "Letters: optional subject line printed as \"Re: ...\", may contain fields, e.g. \"Your {{Year}} giving statement\".",
"type": "string",
"maxLength": 300
},
"address_template": {
"description": "Optional recipient address block (letters: inside address; envelopes: delivery address), one line per row, e.g. \"{{First Name}} {{Last Name}}\\n{{Street}}\\n{{City}}, {{State}} {{ZIP}}\". Defaults to one built from the name, company and address columns.",
"type": "string",
"maxLength": 1000
},
"include_address": {
"description": "Letters: print the recipient address block above the salutation. Default true when the sheet has address columns.",
"type": "boolean"
},
"sender": {
"description": "Letters: your name/organization and address at the top. Envelopes: the return address. One line per entry, e.g. [\"Riverbend Animal Shelter\", \"120 Elm St\", \"Springfield, IL 62701\"].",
"maxItems": 6,
"type": "array",
"items": {
"type": "string",
"maxLength": 120
}
},
"date": {
"description": "Date printed on letters and certificates and used for {{today}}, as YYYY-MM-DD, e.g. 2026-10-03. Defaults to today (US Eastern time); pass the user's local date when known.",
"type": "string",
"maxLength": 30
},
"closing": {
"description": "Letters: closing line, e.g. \"With gratitude,\". Defaults to \"Sincerely,\" unless the template already ends with a closing. Use \"\" for none.",
"type": "string",
"maxLength": 60
},
"signature_name": {
"description": "Letters: name printed under the closing, e.g. Maria Chen.",
"type": "string",
"maxLength": 100
},
"signature_title": {
"description": "Letters: title under the signature name, e.g. Executive Director.",
"type": "string",
"maxLength": 120
},
"certificate_kind": {
"description": "Certificates: sets the default title and wording, e.g. completion -> \"Certificate of Completion\". Default achievement.",
"type": "string",
"enum": [
"achievement",
"completion",
"participation",
"appreciation",
"recognition",
"excellence"
]
},
"certificate_title": {
"description": "Certificates: custom title, e.g. \"Certificate of Appreciation\" or \"Volunteer of the Year\".",
"type": "string",
"maxLength": 80
},
"recipient_template": {
"description": "Certificates: the name line, e.g. \"{{First Name}} {{Last Name}}\". Defaults to the Name column (or First + Last).",
"type": "string",
"maxLength": 200
},
"body_template": {
"description": "Certificates: the line under the name, may contain fields, e.g. \"for completing {{Course}} ({{Hours}} hours) on {{Completed:date}}\".",
"type": "string",
"maxLength": 600
},
"presented_line": {
"description": "Certificates: the line above the name. Default \"This certificate is proudly presented to\" (\"This certifies that\" for completion).",
"type": "string",
"maxLength": 120
},
"organization": {
"description": "Certificates: issuing organization printed at the top, e.g. Lincoln Elementary School.",
"type": "string",
"maxLength": 120
},
"signers": {
"description": "Certificates: up to 3 signature lines, e.g. [{\"name\": \"Alan Brooks\", \"title\": \"Principal\"}].",
"maxItems": 3,
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"maxLength": 80,
"description": "Signer name, e.g. Dr. Alan Brooks."
},
"title": {
"description": "Signer title, e.g. Principal.",
"type": "string",
"maxLength": 80
}
},
"required": [
"name"
]
}
},
"style": {
"description": "Certificates: design style: classic (navy double border), gold (cream with gold seal), modern (teal geometric), deco (burgundy art deco). Default classic.",
"type": "string",
"enum": [
"classic",
"gold",
"modern",
"deco"
]
},
"envelope_size": {
"description": "Envelopes: \"10\" for a #10 business envelope 4-1/8 x 9-1/2 in (default) or \"a7\" for a 5-1/4 x 7-1/4 in invitation envelope.",
"type": "string",
"enum": [
"10",
"a7"
]
},
"usps_style": {
"description": "Envelopes: print the delivery address in USPS style (uppercase, no periods or commas). Default false.",
"type": "boolean"
},
"field_map": {
"description": "Optional explicit links from template fields to column names when names differ, e.g. {\"Gift\": \"Donation Amount (USD)\"}.",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string"
}
},
"missing_values": {
"description": "What to do when a record has an empty value for a field with no default: leave_blank (default), skip_record (leave that record out), or placeholder (print [Field Name] for proofreading).",
"type": "string",
"enum": [
"leave_blank",
"skip_record",
"placeholder"
]
},
"preview_from": {
"description": "Record number to start the preview at, e.g. 1 (default) or 25 to check later rows.",
"type": "integer",
"minimum": 1,
"maximum": 20000
}
},
"required": [
"document_type"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}輸出結構描述
{
"type": "object",
"properties": {
"document_type": {
"type": "string"
},
"summary": {
"type": "string"
},
"source": {
"type": "object",
"properties": {
"type": {
"type": "string"
},
"name": {
"type": "string"
},
"sheet": {
"type": [
"string",
"null"
]
},
"sheets": {
"type": "array",
"items": {
"type": "string"
}
},
"columns": {
"type": "array",
"items": {
"type": "string"
}
},
"rows": {
"type": "number"
},
"blank_rows_ignored": {
"type": "number"
}
},
"required": [
"type",
"name",
"sheet",
"sheets",
"columns",
"rows",
"blank_rows_ignored"
],
"additionalProperties": false
},
"fields": {
"type": "array",
"items": {
"type": "object",
"properties": {
"field": {
"type": "string"
},
"column": {
"type": [
"string",
"null"
]
},
"match": {
"type": "string"
},
"formats": {
"type": "array",
"items": {
"type": "string"
}
},
"has_default": {
"type": "boolean"
}
},
"required": [
"field",
"column",
"match",
"formats",
"has_default"
],
"additionalProperties": false
}
},
"unmatched_fields": {
"type": "array",
"items": {
"type": "object",
"properties": {
"field": {
"type": "string"
},
"suggestion": {
"type": [
"string",
"null"
]
}
},
"required": [
"field",
"suggestion"
],
"additionalProperties": false
}
},
"needs_confirmation": {
"type": "array",
"items": {
"type": "string"
}
},
"counts": {
"type": "object",
"properties": {
"records": {
"type": "number"
},
"in_batch": {
"type": "number"
},
"merged": {
"type": "number"
},
"skipped": {
"type": "number"
},
"with_missing": {
"type": "number"
},
"documents": {
"type": "number"
},
"pages": {
"type": "number"
}
},
"required": [
"records",
"in_batch",
"merged",
"skipped",
"with_missing",
"documents",
"pages"
],
"additionalProperties": false
},
"batch": {
"type": "object",
"properties": {
"from": {
"type": "number"
},
"to": {
"type": "number"
},
"next_start": {
"type": [
"number",
"null"
]
}
},
"required": [
"from",
"to",
"next_start"
],
"additionalProperties": false
},
"missing": {
"type": "array",
"items": {
"type": "object",
"properties": {
"record": {
"type": "number"
},
"label": {
"type": "string"
},
"fields": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"record",
"label",
"fields"
],
"additionalProperties": false
}
},
"missing_total": {
"type": "number"
},
"preview": {
"type": "array",
"items": {
"type": "object",
"properties": {
"record": {
"type": "number"
},
"label": {
"type": "string"
},
"text": {
"type": "string"
}
},
"required": [
"record",
"label",
"text"
],
"additionalProperties": false
}
},
"style": {
"type": [
"string",
"null"
]
},
"paper": {
"type": "string"
},
"warnings": {
"type": "array",
"items": {
"type": "string"
}
},
"downloads": {
"type": "object",
"properties": {
"pdf": {
"type": "string"
},
"csv": {
"type": "string"
}
},
"additionalProperties": false
}
},
"required": [
"document_type",
"summary",
"source",
"fields",
"unmatched_fields",
"needs_confirmation",
"counts",
"batch",
"missing",
"missing_total",
"preview",
"style",
"paper",
"warnings",
"downloads"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟢generate_merged_documents(document_type, file, sheet, csv_text, records, ...)
Use this when the user wants to mail merge from Excel or CSV to PDF: personalized letters from a spreadsheet (thank-you letters for each donor, the same letter to 200 people with their names), certificates in bulk from a name list (award, completion, participation), or envelopes from a contact list (#10 with return address). Fills {{Field}} placeholders with defaults, formats and {{#if}} conditions for each row and returns ONE combined PDF (one document per record, up to 2,000 per batch) plus a per-record merge report CSV. Does not send email, mail, or print anything, and does not make mailing labels. Do not use for Outlook or Gmail bulk email.
輸入結構描述
{
"type": "object",
"properties": {
"document_type": {
"type": "string",
"enum": [
"letter",
"certificate",
"envelope"
],
"description": "What to merge into: letter (US business letter, one per row), certificate (landscape award/completion/participation certificate, one per row), or envelope (#10 envelope with recipient and return address). Example: letter."
},
"file": {
"type": "object",
"properties": {
"download_url": {
"type": "string",
"description": "Temporary download link for the file, supplied by ChatGPT."
},
"file_id": {
"type": "string",
"description": "ChatGPT file id, e.g. file_abc123."
},
"mime_type": {
"description": "Media type if known, e.g. application/pdf.",
"type": "string"
},
"file_name": {
"description": "Original file name if known, e.g. statement.pdf.",
"type": "string"
}
},
"required": [
"download_url",
"file_id"
],
"description": "The spreadsheet with one row per recipient: Excel .xlsx, CSV or TSV, first row = column headers, e.g. donors.xlsx."
},
"sheet": {
"description": "For an .xlsx file: the sheet (tab) name to use, e.g. Donors. Defaults to the first sheet that has data.",
"type": "string",
"maxLength": 100
},
"csv_text": {
"description": "Alternative to a file: the list pasted as CSV or tab-separated text with a header row, e.g. \"First Name,Last Name,City\\nAna,Lopez,Austin\".",
"type": "string",
"maxLength": 400000
},
"records": {
"description": "Alternative to a file: the recipients typed as objects with the same keys, e.g. [{\"First Name\": \"Ana\", \"Last Name\": \"Lopez\", \"Amount\": 250}].",
"maxItems": 5000,
"type": "array",
"items": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": [
"string",
"number",
"boolean",
"null"
]
}
}
},
"names": {
"description": "Shortcut for a plain list of names (one column called Name), e.g. [\"Ana Lopez\", \"Ben Okafor\"]. Handy for certificates.",
"maxItems": 5000,
"type": "array",
"items": {
"type": "string",
"maxLength": 200
}
},
"has_header": {
"description": "Set false if the first row of the file is data, not column names (columns are then called Column A, Column B, ...). Default true.",
"type": "boolean"
},
"template": {
"description": "Letters: the letter text from the salutation to the last paragraph, with merge fields, e.g. \"Dear {{First Name|Friend}},\\n\\nThank you for your gift of {{Amount:currency}} on {{Gift Date:date}}.{{#if Company}} Please thank everyone at {{Company}}.{{/if}}\". Syntax: {{Field}}, {{Field|default}}, {{Field:format}} with formats currency, number, integer, ordinal, date, short_date, iso_date, upper, lower, title, first_word, last_word; {{#if Field}}...{{else}}...{{/if}}, {{#if Field = value}}, {{#if Gift > 0}} (also !=, <, >=, <=; numbers or dates), {{#unless Field}}...{{/unless}}; {{today}} is the document date.",
"type": "string",
"maxLength": 20000
},
"subject": {
"description": "Letters: optional subject line printed as \"Re: ...\", may contain fields, e.g. \"Your {{Year}} giving statement\".",
"type": "string",
"maxLength": 300
},
"address_template": {
"description": "Optional recipient address block (letters: inside address; envelopes: delivery address), one line per row, e.g. \"{{First Name}} {{Last Name}}\\n{{Street}}\\n{{City}}, {{State}} {{ZIP}}\". Defaults to one built from the name, company and address columns.",
"type": "string",
"maxLength": 1000
},
"include_address": {
"description": "Letters: print the recipient address block above the salutation. Default true when the sheet has address columns.",
"type": "boolean"
},
"sender": {
"description": "Letters: your name/organization and address at the top. Envelopes: the return address. One line per entry, e.g. [\"Riverbend Animal Shelter\", \"120 Elm St\", \"Springfield, IL 62701\"].",
"maxItems": 6,
"type": "array",
"items": {
"type": "string",
"maxLength": 120
}
},
"date": {
"description": "Date printed on letters and certificates and used for {{today}}, as YYYY-MM-DD, e.g. 2026-10-03. Defaults to today (US Eastern time); pass the user's local date when known.",
"type": "string",
"maxLength": 30
},
"closing": {
"description": "Letters: closing line, e.g. \"With gratitude,\". Defaults to \"Sincerely,\" unless the template already ends with a closing. Use \"\" for none.",
"type": "string",
"maxLength": 60
},
"signature_name": {
"description": "Letters: name printed under the closing, e.g. Maria Chen.",
"type": "string",
"maxLength": 100
},
"signature_title": {
"description": "Letters: title under the signature name, e.g. Executive Director.",
"type": "string",
"maxLength": 120
},
"certificate_kind": {
"description": "Certificates: sets the default title and wording, e.g. completion -> \"Certificate of Completion\". Default achievement.",
"type": "string",
"enum": [
"achievement",
"completion",
"participation",
"appreciation",
"recognition",
"excellence"
]
},
"certificate_title": {
"description": "Certificates: custom title, e.g. \"Certificate of Appreciation\" or \"Volunteer of the Year\".",
"type": "string",
"maxLength": 80
},
"recipient_template": {
"description": "Certificates: the name line, e.g. \"{{First Name}} {{Last Name}}\". Defaults to the Name column (or First + Last).",
"type": "string",
"maxLength": 200
},
"body_template": {
"description": "Certificates: the line under the name, may contain fields, e.g. \"for completing {{Course}} ({{Hours}} hours) on {{Completed:date}}\".",
"type": "string",
"maxLength": 600
},
"presented_line": {
"description": "Certificates: the line above the name. Default \"This certificate is proudly presented to\" (\"This certifies that\" for completion).",
"type": "string",
"maxLength": 120
},
"organization": {
"description": "Certificates: issuing organization printed at the top, e.g. Lincoln Elementary School.",
"type": "string",
"maxLength": 120
},
"signers": {
"description": "Certificates: up to 3 signature lines, e.g. [{\"name\": \"Alan Brooks\", \"title\": \"Principal\"}].",
"maxItems": 3,
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string",
"maxLength": 80,
"description": "Signer name, e.g. Dr. Alan Brooks."
},
"title": {
"description": "Signer title, e.g. Principal.",
"type": "string",
"maxLength": 80
}
},
"required": [
"name"
]
}
},
"style": {
"description": "Certificates: design style: classic (navy double border), gold (cream with gold seal), modern (teal geometric), deco (burgundy art deco). Default classic.",
"type": "string",
"enum": [
"classic",
"gold",
"modern",
"deco"
]
},
"envelope_size": {
"description": "Envelopes: \"10\" for a #10 business envelope 4-1/8 x 9-1/2 in (default) or \"a7\" for a 5-1/4 x 7-1/4 in invitation envelope.",
"type": "string",
"enum": [
"10",
"a7"
]
},
"usps_style": {
"description": "Envelopes: print the delivery address in USPS style (uppercase, no periods or commas). Default false.",
"type": "boolean"
},
"field_map": {
"description": "Optional explicit links from template fields to column names when names differ, e.g. {\"Gift\": \"Donation Amount (USD)\"}.",
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string"
}
},
"missing_values": {
"description": "What to do when a record has an empty value for a field with no default: leave_blank (default), skip_record (leave that record out), or placeholder (print [Field Name] for proofreading).",
"type": "string",
"enum": [
"leave_blank",
"skip_record",
"placeholder"
]
},
"start_record": {
"description": "For lists over 2,000 records: first record of this batch, e.g. 2001 for the second batch. Default 1.",
"type": "integer",
"minimum": 1,
"maximum": 20000
},
"max_documents": {
"description": "How many records to put in this PDF (1-2000), e.g. 500. Default all, up to 2,000 per PDF.",
"type": "integer",
"minimum": 1,
"maximum": 2000
}
},
"required": [
"document_type"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}輸出結構描述
{
"type": "object",
"properties": {
"document_type": {
"type": "string"
},
"summary": {
"type": "string"
},
"source": {
"type": "object",
"properties": {
"type": {
"type": "string"
},
"name": {
"type": "string"
},
"sheet": {
"type": [
"string",
"null"
]
},
"sheets": {
"type": "array",
"items": {
"type": "string"
}
},
"columns": {
"type": "array",
"items": {
"type": "string"
}
},
"rows": {
"type": "number"
},
"blank_rows_ignored": {
"type": "number"
}
},
"required": [
"type",
"name",
"sheet",
"sheets",
"columns",
"rows",
"blank_rows_ignored"
],
"additionalProperties": false
},
"fields": {
"type": "array",
"items": {
"type": "object",
"properties": {
"field": {
"type": "string"
},
"column": {
"type": [
"string",
"null"
]
},
"match": {
"type": "string"
},
"formats": {
"type": "array",
"items": {
"type": "string"
}
},
"has_default": {
"type": "boolean"
}
},
"required": [
"field",
"column",
"match",
"formats",
"has_default"
],
"additionalProperties": false
}
},
"unmatched_fields": {
"type": "array",
"items": {
"type": "object",
"properties": {
"field": {
"type": "string"
},
"suggestion": {
"type": [
"string",
"null"
]
}
},
"required": [
"field",
"suggestion"
],
"additionalProperties": false
}
},
"needs_confirmation": {
"type": "array",
"items": {
"type": "string"
}
},
"counts": {
"type": "object",
"properties": {
"records": {
"type": "number"
},
"in_batch": {
"type": "number"
},
"merged": {
"type": "number"
},
"skipped": {
"type": "number"
},
"with_missing": {
"type": "number"
},
"documents": {
"type": "number"
},
"pages": {
"type": "number"
}
},
"required": [
"records",
"in_batch",
"merged",
"skipped",
"with_missing",
"documents",
"pages"
],
"additionalProperties": false
},
"batch": {
"type": "object",
"properties": {
"from": {
"type": "number"
},
"to": {
"type": "number"
},
"next_start": {
"type": [
"number",
"null"
]
}
},
"required": [
"from",
"to",
"next_start"
],
"additionalProperties": false
},
"missing": {
"type": "array",
"items": {
"type": "object",
"properties": {
"record": {
"type": "number"
},
"label": {
"type": "string"
},
"fields": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"record",
"label",
"fields"
],
"additionalProperties": false
}
},
"missing_total": {
"type": "number"
},
"preview": {
"type": "array",
"items": {
"type": "object",
"properties": {
"record": {
"type": "number"
},
"label": {
"type": "string"
},
"text": {
"type": "string"
}
},
"required": [
"record",
"label",
"text"
],
"additionalProperties": false
}
},
"style": {
"type": [
"string",
"null"
]
},
"paper": {
"type": "string"
},
"warnings": {
"type": "array",
"items": {
"type": "string"
}
},
"downloads": {
"type": "object",
"properties": {
"pdf": {
"type": "string"
},
"csv": {
"type": "string"
}
},
"additionalProperties": false
}
},
"required": [
"document_type",
"summary",
"source",
"fields",
"unmatched_fields",
"needs_confirmation",
"counts",
"batch",
"missing",
"missing_total",
"preview",
"style",
"paper",
"warnings",
"downloads"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}社群
證據