Koskamo

Mergewell Mail Merge MCP

Mergewell Mail Merge allows users to perform mail merges from Excel or CSV files into personalized PDFs, such as letters, certificates, and envelopes, directly within the chat interface. It supports field formatting, default values, and conditional logic, generating a combined print-ready PDF and a merge report CSV.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

Mergewell Mail Merge MCP logo, by ZovoCommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-01Published by Zovo
MCP endpoint (Streamable HTTP)
https://mail-merge.zovo.one/mcp
Vendor documentation

What you can do with it

  • Mail merge letters from a spreadsheet into personalized PDFs
  • Generate bulk certificates of completion from a name list
  • Create #10 business envelopes with return and delivery addresses
  • Check merge templates for unmatched fields or empty values

Source and maintenance

Community listingRegistry 1.0.1

Protocol and capabilities

Server
mail-merge 1.0.1
MCP protocol
2025-06-18
Tools
2 advertised
Resources
1 advertised
Resource templates
1 advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": true
  },
  "resources": {
    "listChanged": true
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

Mergewell Mail Merge merges a spreadsheet (CSV/XLSX upload, pasted CSV, typed records or a list of names) with a template into one print-ready PDF: personalized letters, certificates or envelopes. Call preview_mail_merge first when the template or columns are uncertain (it reports unmatched fields and records with empty values), then generate_merged_documents for the PDF and merge report CSV.

Tools

2 advertised

preview_mail_merge — Preview mail merge
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

preview_mail_merge input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "document_type"
  ],
  "properties": {
    "date": {
      "type": "string",
      "maxLength": 30,
      "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."
    },
    "file": {
      "type": "object",
      "required": [
        "download_url",
        "file_id"
      ],
      "properties": {
        "file_id": {
          "type": "string",
          "description": "ChatGPT file id, e.g. file_abc123."
        },
        "file_name": {
          "type": "string",
          "description": "Original file name if known, e.g. statement.pdf."
        },
        "mime_type": {
          "type": "string",
          "description": "Media type if known, e.g. application/pdf."
        },
        "download_url": {
          "type": "string",
          "description": "Temporary download link for the file, supplied by ChatGPT."
        }
      },
      "description": "The spreadsheet with one row per recipient: Excel .xlsx, CSV or TSV, first row = column headers, e.g. donors.xlsx."
    },
    "names": {
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 200
      },
      "maxItems": 5000,
      "description": "Shortcut for a plain list of names (one column called Name), e.g. [\"Ana Lopez\", \"Ben Okafor\"]. Handy for certificates."
    },
    "sheet": {
      "type": "string",
      "maxLength": 100,
      "description": "For an .xlsx file: the sheet (tab) name to use, e.g. Donors. Defaults to the first sheet that has data."
    },
    "style": {
      "enum": [
        "classic",
        "gold",
        "modern",
        "deco"
      ],
      "type": "string",
      "description": "Certificates: design style: classic (navy double border), gold (cream with gold seal), modern (teal geometric), deco (burgundy art deco). Default classic."
    },
    "sender": {
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 120
      },
      "maxItems": 6,
      "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\"]."
    },
    "closing": {
      "type": "string",
      "maxLength": 60,
      "description": "Letters: closing line, e.g. \"With gratitude,\". Defaults to \"Sincerely,\" unless the template already ends with a closing. Use \"\" for none."
    },
    "records": {
      "type": "array",
      "items": {
        "type": "object",
        "propertyNames": {
          "type": "string"
        },
        "additionalProperties": {
          "type": [
            "string",
            "number",
            "boolean",
            "null"
          ]
        }
      },
      "maxItems": 5000,
      "description": "Alternative to a file: the recipients typed as objects with the same keys, e.g. [{\"First Name\": \"Ana\", \"Last Name\": \"Lopez\", \"Amount\": 250}]."
    },
    "signers": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "name"
        ],
        "properties": {
          "name": {
            "type": "string",
            "maxLength": 80,
            "description": "Signer name, e.g. Dr. Alan Brooks."
          },
          "title": {
            "type": "string",
            "maxLength": 80,
            "description": "Signer title, e.g. Principal."
          }
        }
      },
      "maxItems": 3,
      "description": "Certificates: up to 3 signature lines, e.g. [{\"name\": \"Alan Brooks\", \"title\": \"Principal\"}]."
    },
    "subject": {
      "type": "string",
      "maxLength": 300,
      "description": "Letters: optional subject line printed as \"Re: ...\", may contain fields, e.g. \"Your {{Year}} giving statement\"."
    },
    "csv_text": {
      "type": "string",
      "maxLength": 400000,
      "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\"."
    },
    "template": {
      "type": "string",
      "maxLength": 20000,
      "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."
    },
    "field_map": {
      "type": "object",
      "description": "Optional explicit links from template fields to column names when names differ, e.g. {\"Gift\": \"Donation Amount (USD)\"}.",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": "string"
      }
    },
    "has_header": {
      "type": "boolean",
      "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."
    },
    "usps_style": {
      "type": "boolean",
      "description": "Envelopes: print the delivery address in USPS style (uppercase, no periods or commas). Default false."
    },
    "organization": {
      "type": "string",
      "maxLength": 120,
      "description": "Certificates: issuing organization printed at the top, e.g. Lincoln Elementary School."
    },
    "preview_from": {
      "type": "integer",
      "maximum": 20000,
      "minimum": 1,
      "description": "Record number to start the preview at, e.g. 1 (default) or 25 to check later rows."
    },
    "body_template": {
      "type": "string",
      "maxLength": 600,
      "description": "Certificates: the line under the name, may contain fields, e.g. \"for completing {{Course}} ({{Hours}} hours) on {{Completed:date}}\"."
    },
    "document_type": {
      "enum": [
        "letter",
        "certificate",
        "envelope"
      ],
      "type": "string",
      "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."
    },
    "envelope_size": {
      "enum": [
        "10",
        "a7"
      ],
      "type": "string",
      "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."
    },
    "missing_values": {
      "enum": [
        "leave_blank",
        "skip_record",
        "placeholder"
      ],
      "type": "string",
      "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)."
    },
    "presented_line": {
      "type": "string",
      "maxLength": 120,
      "description": "Certificates: the line above the name. Default \"This certificate is proudly presented to\" (\"This certifies that\" for completion)."
    },
    "signature_name": {
      "type": "string",
      "maxLength": 100,
      "description": "Letters: name printed under the closing, e.g. Maria Chen."
    },
    "include_address": {
      "type": "boolean",
      "description": "Letters: print the recipient address block above the salutation. Default true when the sheet has address columns."
    },
    "signature_title": {
      "type": "string",
      "maxLength": 120,
      "description": "Letters: title under the signature name, e.g. Executive Director."
    },
    "address_template": {
      "type": "string",
      "maxLength": 1000,
      "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."
    },
    "certificate_kind": {
      "enum": [
        "achievement",
        "completion",
        "participation",
        "appreciation",
        "recognition",
        "excellence"
      ],
      "type": "string",
      "description": "Certificates: sets the default title and wording, e.g. completion -> \"Certificate of Completion\". Default achievement."
    },
    "certificate_title": {
      "type": "string",
      "maxLength": 80,
      "description": "Certificates: custom title, e.g. \"Certificate of Appreciation\" or \"Volunteer of the Year\"."
    },
    "recipient_template": {
      "type": "string",
      "maxLength": 200,
      "description": "Certificates: the name line, e.g. \"{{First Name}} {{Last Name}}\". Defaults to the Name column (or First + Last)."
    }
  }
}
preview_mail_merge output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "document_type",
    "summary",
    "source",
    "fields",
    "unmatched_fields",
    "needs_confirmation",
    "counts",
    "batch",
    "missing",
    "missing_total",
    "preview",
    "style",
    "paper",
    "warnings",
    "downloads"
  ],
  "properties": {
    "batch": {
      "type": "object",
      "required": [
        "from",
        "to",
        "next_start"
      ],
      "properties": {
        "to": {
          "type": "number"
        },
        "from": {
          "type": "number"
        },
        "next_start": {
          "type": [
            "number",
            "null"
          ]
        }
      },
      "additionalProperties": false
    },
    "paper": {
      "type": "string"
    },
    "style": {
      "type": [
        "string",
        "null"
      ]
    },
    "counts": {
      "type": "object",
      "required": [
        "records",
        "in_batch",
        "merged",
        "skipped",
        "with_missing",
        "documents",
        "pages"
      ],
      "properties": {
        "pages": {
          "type": "number"
        },
        "merged": {
          "type": "number"
        },
        "records": {
          "type": "number"
        },
        "skipped": {
          "type": "number"
        },
        "in_batch": {
          "type": "number"
        },
        "documents": {
          "type": "number"
        },
        "with_missing": {
          "type": "number"
        }
      },
      "additionalProperties": false
    },
    "fields": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "field",
          "column",
          "match",
          "formats",
          "has_default"
        ],
        "properties": {
          "field": {
            "type": "string"
          },
          "match": {
            "type": "string"
          },
          "column": {
            "type": [
              "string",
              "null"
            ]
          },
          "formats": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "has_default": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      }
    },
    "source": {
      "type": "object",
      "required": [
        "type",
        "name",
        "sheet",
        "sheets",
        "columns",
        "rows",
        "blank_rows_ignored"
      ],
      "properties": {
        "name": {
          "type": "string"
        },
        "rows": {
          "type": "number"
        },
        "type": {
          "type": "string"
        },
        "sheet": {
          "type": [
            "string",
            "null"
          ]
        },
        "sheets": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "columns": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "blank_rows_ignored": {
          "type": "number"
        }
      },
      "additionalProperties": false
    },
    "missing": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "record",
          "label",
          "fields"
        ],
        "properties": {
          "label": {
            "type": "string"
          },
          "fields": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "record": {
            "type": "number"
          }
        },
        "additionalProperties": false
      }
    },
    "preview": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "record",
          "label",
          "text"
        ],
        "properties": {
          "text": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "record": {
            "type": "number"
          }
        },
        "additionalProperties": false
      }
    },
    "summary": {
      "type": "string"
    },
    "warnings": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "downloads": {
      "type": "object",
      "properties": {
        "csv": {
          "type": "string"
        },
        "pdf": {
          "type": "string"
        }
      },
      "additionalProperties": false
    },
    "document_type": {
      "type": "string"
    },
    "missing_total": {
      "type": "number"
    },
    "unmatched_fields": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "field",
          "suggestion"
        ],
        "properties": {
          "field": {
            "type": "string"
          },
          "suggestion": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "additionalProperties": false
      }
    },
    "needs_confirmation": {
      "type": "array",
      "items": {
        "type": "string"
      }
    }
  },
  "additionalProperties": false
}
preview_mail_merge annotations
{
  "title": "Preview mail merge",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
generate_merged_documents — Generate merged documents
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

generate_merged_documents input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "document_type"
  ],
  "properties": {
    "date": {
      "type": "string",
      "maxLength": 30,
      "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."
    },
    "file": {
      "type": "object",
      "required": [
        "download_url",
        "file_id"
      ],
      "properties": {
        "file_id": {
          "type": "string",
          "description": "ChatGPT file id, e.g. file_abc123."
        },
        "file_name": {
          "type": "string",
          "description": "Original file name if known, e.g. statement.pdf."
        },
        "mime_type": {
          "type": "string",
          "description": "Media type if known, e.g. application/pdf."
        },
        "download_url": {
          "type": "string",
          "description": "Temporary download link for the file, supplied by ChatGPT."
        }
      },
      "description": "The spreadsheet with one row per recipient: Excel .xlsx, CSV or TSV, first row = column headers, e.g. donors.xlsx."
    },
    "names": {
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 200
      },
      "maxItems": 5000,
      "description": "Shortcut for a plain list of names (one column called Name), e.g. [\"Ana Lopez\", \"Ben Okafor\"]. Handy for certificates."
    },
    "sheet": {
      "type": "string",
      "maxLength": 100,
      "description": "For an .xlsx file: the sheet (tab) name to use, e.g. Donors. Defaults to the first sheet that has data."
    },
    "style": {
      "enum": [
        "classic",
        "gold",
        "modern",
        "deco"
      ],
      "type": "string",
      "description": "Certificates: design style: classic (navy double border), gold (cream with gold seal), modern (teal geometric), deco (burgundy art deco). Default classic."
    },
    "sender": {
      "type": "array",
      "items": {
        "type": "string",
        "maxLength": 120
      },
      "maxItems": 6,
      "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\"]."
    },
    "closing": {
      "type": "string",
      "maxLength": 60,
      "description": "Letters: closing line, e.g. \"With gratitude,\". Defaults to \"Sincerely,\" unless the template already ends with a closing. Use \"\" for none."
    },
    "records": {
      "type": "array",
      "items": {
        "type": "object",
        "propertyNames": {
          "type": "string"
        },
        "additionalProperties": {
          "type": [
            "string",
            "number",
            "boolean",
            "null"
          ]
        }
      },
      "maxItems": 5000,
      "description": "Alternative to a file: the recipients typed as objects with the same keys, e.g. [{\"First Name\": \"Ana\", \"Last Name\": \"Lopez\", \"Amount\": 250}]."
    },
    "signers": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "name"
        ],
        "properties": {
          "name": {
            "type": "string",
            "maxLength": 80,
            "description": "Signer name, e.g. Dr. Alan Brooks."
          },
          "title": {
            "type": "string",
            "maxLength": 80,
            "description": "Signer title, e.g. Principal."
          }
        }
      },
      "maxItems": 3,
      "description": "Certificates: up to 3 signature lines, e.g. [{\"name\": \"Alan Brooks\", \"title\": \"Principal\"}]."
    },
    "subject": {
      "type": "string",
      "maxLength": 300,
      "description": "Letters: optional subject line printed as \"Re: ...\", may contain fields, e.g. \"Your {{Year}} giving statement\"."
    },
    "csv_text": {
      "type": "string",
      "maxLength": 400000,
      "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\"."
    },
    "template": {
      "type": "string",
      "maxLength": 20000,
      "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."
    },
    "field_map": {
      "type": "object",
      "description": "Optional explicit links from template fields to column names when names differ, e.g. {\"Gift\": \"Donation Amount (USD)\"}.",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": "string"
      }
    },
    "has_header": {
      "type": "boolean",
      "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."
    },
    "usps_style": {
      "type": "boolean",
      "description": "Envelopes: print the delivery address in USPS style (uppercase, no periods or commas). Default false."
    },
    "organization": {
      "type": "string",
      "maxLength": 120,
      "description": "Certificates: issuing organization printed at the top, e.g. Lincoln Elementary School."
    },
    "start_record": {
      "type": "integer",
      "maximum": 20000,
      "minimum": 1,
      "description": "For lists over 2,000 records: first record of this batch, e.g. 2001 for the second batch. Default 1."
    },
    "body_template": {
      "type": "string",
      "maxLength": 600,
      "description": "Certificates: the line under the name, may contain fields, e.g. \"for completing {{Course}} ({{Hours}} hours) on {{Completed:date}}\"."
    },
    "document_type": {
      "enum": [
        "letter",
        "certificate",
        "envelope"
      ],
      "type": "string",
      "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."
    },
    "envelope_size": {
      "enum": [
        "10",
        "a7"
      ],
      "type": "string",
      "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."
    },
    "max_documents": {
      "type": "integer",
      "maximum": 2000,
      "minimum": 1,
      "description": "How many records to put in this PDF (1-2000), e.g. 500. Default all, up to 2,000 per PDF."
    },
    "missing_values": {
      "enum": [
        "leave_blank",
        "skip_record",
        "placeholder"
      ],
      "type": "string",
      "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)."
    },
    "presented_line": {
      "type": "string",
      "maxLength": 120,
      "description": "Certificates: the line above the name. Default \"This certificate is proudly presented to\" (\"This certifies that\" for completion)."
    },
    "signature_name": {
      "type": "string",
      "maxLength": 100,
      "description": "Letters: name printed under the closing, e.g. Maria Chen."
    },
    "include_address": {
      "type": "boolean",
      "description": "Letters: print the recipient address block above the salutation. Default true when the sheet has address columns."
    },
    "signature_title": {
      "type": "string",
      "maxLength": 120,
      "description": "Letters: title under the signature name, e.g. Executive Director."
    },
    "address_template": {
      "type": "string",
      "maxLength": 1000,
      "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."
    },
    "certificate_kind": {
      "enum": [
        "achievement",
        "completion",
        "participation",
        "appreciation",
        "recognition",
        "excellence"
      ],
      "type": "string",
      "description": "Certificates: sets the default title and wording, e.g. completion -> \"Certificate of Completion\". Default achievement."
    },
    "certificate_title": {
      "type": "string",
      "maxLength": 80,
      "description": "Certificates: custom title, e.g. \"Certificate of Appreciation\" or \"Volunteer of the Year\"."
    },
    "recipient_template": {
      "type": "string",
      "maxLength": 200,
      "description": "Certificates: the name line, e.g. \"{{First Name}} {{Last Name}}\". Defaults to the Name column (or First + Last)."
    }
  }
}
generate_merged_documents output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "document_type",
    "summary",
    "source",
    "fields",
    "unmatched_fields",
    "needs_confirmation",
    "counts",
    "batch",
    "missing",
    "missing_total",
    "preview",
    "style",
    "paper",
    "warnings",
    "downloads"
  ],
  "properties": {
    "batch": {
      "type": "object",
      "required": [
        "from",
        "to",
        "next_start"
      ],
      "properties": {
        "to": {
          "type": "number"
        },
        "from": {
          "type": "number"
        },
        "next_start": {
          "type": [
            "number",
            "null"
          ]
        }
      },
      "additionalProperties": false
    },
    "paper": {
      "type": "string"
    },
    "style": {
      "type": [
        "string",
        "null"
      ]
    },
    "counts": {
      "type": "object",
      "required": [
        "records",
        "in_batch",
        "merged",
        "skipped",
        "with_missing",
        "documents",
        "pages"
      ],
      "properties": {
        "pages": {
          "type": "number"
        },
        "merged": {
          "type": "number"
        },
        "records": {
          "type": "number"
        },
        "skipped": {
          "type": "number"
        },
        "in_batch": {
          "type": "number"
        },
        "documents": {
          "type": "number"
        },
        "with_missing": {
          "type": "number"
        }
      },
      "additionalProperties": false
    },
    "fields": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "field",
          "column",
          "match",
          "formats",
          "has_default"
        ],
        "properties": {
          "field": {
            "type": "string"
          },
          "match": {
            "type": "string"
          },
          "column": {
            "type": [
              "string",
              "null"
            ]
          },
          "formats": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "has_default": {
            "type": "boolean"
          }
        },
        "additionalProperties": false
      }
    },
    "source": {
      "type": "object",
      "required": [
        "type",
        "name",
        "sheet",
        "sheets",
        "columns",
        "rows",
        "blank_rows_ignored"
      ],
      "properties": {
        "name": {
          "type": "string"
        },
        "rows": {
          "type": "number"
        },
        "type": {
          "type": "string"
        },
        "sheet": {
          "type": [
            "string",
            "null"
          ]
        },
        "sheets": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "columns": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "blank_rows_ignored": {
          "type": "number"
        }
      },
      "additionalProperties": false
    },
    "missing": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "record",
          "label",
          "fields"
        ],
        "properties": {
          "label": {
            "type": "string"
          },
          "fields": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "record": {
            "type": "number"
          }
        },
        "additionalProperties": false
      }
    },
    "preview": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "record",
          "label",
          "text"
        ],
        "properties": {
          "text": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "record": {
            "type": "number"
          }
        },
        "additionalProperties": false
      }
    },
    "summary": {
      "type": "string"
    },
    "warnings": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "downloads": {
      "type": "object",
      "properties": {
        "csv": {
          "type": "string"
        },
        "pdf": {
          "type": "string"
        }
      },
      "additionalProperties": false
    },
    "document_type": {
      "type": "string"
    },
    "missing_total": {
      "type": "number"
    },
    "unmatched_fields": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "field",
          "suggestion"
        ],
        "properties": {
          "field": {
            "type": "string"
          },
          "suggestion": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "additionalProperties": false
      }
    },
    "needs_confirmation": {
      "type": "array",
      "items": {
        "type": "string"
      }
    }
  },
  "additionalProperties": false
}
generate_merged_documents annotations
{
  "title": "Generate merged documents",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

1 advertised

mail-merge-widget — Mergewell Mail Merge view

Advertised by the server during the last successful anonymous check.

Interactive view for Mergewell Mail Merge.

mail-merge-widget URI
ui://widget/mail-merge-v1-1.0.1-eb15df8346c0066bc7ec27d20b41318d9960352ed07bf13dfe000924e8896322.html

MIME type: text/html;profile=mcp-app

mail-merge-widget-legacy — Mergewell Mail Merge view (previous versions)

Advertised by the server during the last successful anonymous check.

mail-merge-widget-legacy URI template
ui://widget/mail-merge-{version}.html

MIME type: text/html;profile=mcp-app

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
614 ms
95th percentile latency
614 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 614 ms · metadata changed · 2 tool(s), 1 resource(s), 1 resource template(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http mergewell-mail-merge-mcp https://mail-merge.zovo.one/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add mergewell-mail-merge-mcp --url https://mail-merge.zovo.one/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable mergewell-mail-merge-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "mergewell-mail-merge-mcp": {
      "url": "https://mail-merge.zovo.one/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "mergewell-mail-merge-mcp": {
      "type": "streamableHttp",
      "url": "https://mail-merge.zovo.one/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start mergewell-mail-merge-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "mergewell-mail-merge-mcp": {
      "type": "http",
      "url": "https://mail-merge.zovo.one/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http mergewell-mail-merge-mcp https://mail-merge.zovo.one/mcp

Claude Desktop

Merge this into claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), then restart Claude Desktop.
Claude Desktop configuration
{
  "mcpServers": {
    "mergewell-mail-merge-mcp": {
      "url": "https://mail-merge.zovo.one/mcp"
    }
  }
}

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "mergewell-mail-merge-mcp": {
      "serverUrl": "https://mail-merge.zovo.one/mcp"
    }
  }
}

Let your agent find its tools

Find servers like Mergewell Mail Merge MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.