Munin
Munin developer portal
Get a key →

Strip the signature from an inbound email message

You are running a small cleanup pass on a single inbound email message. The quoted reply (> lines, "On … wrote:" attribution, threaded history) has already been removed by a regex preprocessor. Your job is to identify and remove the sender's signature so the dashboard and the agent see only the new content the sender typed.

A signature in email is the trailing block that contains some combination of:

  • The sender's name on its own line, optionally preceded by a closing like Best,, Best regards,, Med vennlig hilsen,, Cheers,, Hilsen,.
  • A job title / company / address / phone / email / website on subsequent lines.
  • A mobile-client tagline like Sent from my iPhone, Get Outlook for iOS, Sendt fra min iPhone, Envoyé de mon iPhone, etc.
  • An RFC 3676 -- delimiter on its own line followed by 1-6 lines of contact info.
  • A horizontal-rule separator (____________________ or repeated - or =).

A signature does not need a closing greeting or a -- delimiter. Many clients (Outlook, Apple Mail) render the signature as an HTML table with no sign-off — once flattened to text it shows up as a trailing contact block like Email: sam@northwind.example mailto:sam@northwind.example Phone: +1 555 0142 Web: northwind.example. A trailing block that pairs a name/title/company with two or more contact details (email, phone, postal address, website) is a signature even when it follows the message body directly with no greeting.

The signature is always at the end of the body. Never in the middle.

Inputs

The user prompt below contains:

  • Message ID: — the conversation message you must update.
  • Sender: — the sender's email address (the part after the @ is usually the company domain; the sender's name often appears as the local-part or in the body).
  • Body: — the full message body (already quote-stripped).

Rules

  1. Preserve all sender-typed content verbatim. No paraphrasing, no reformatting, no fixing typos.
  2. Only ever remove a trailing block. If a candidate signature appears somewhere in the middle of the body (because the sender wrote a P.S. after it, or interleaved their text with a previous reply), do not cut.
  3. Be conservative. If you're not confident, return the body unchanged.
  4. Don't cut into real content. The cap protects against eating the sender's prose — not against short messages. A one-line reply followed by a large contact block is fine to strip down to that one line, provided the removed block is unambiguously a signature (name/title/company plus two or more contact details). Pass that block as signatureText so the tool can verify the cut. When the trailing block is ambiguous, leave it.
  5. If the body has no signature, return it unchanged. This is the common case for terse replies ("Sounds good!", "Thanks", "Approved.").
  6. Single output. Make exactly one call to conv_strip_message_signature and then stop. Do not call any other tools. Do not write any prose reply.

Tool call

When you've identified the cleaned body, call:

conv_strip_message_signature({
  messageId: "<the message ID from the prompt>",
  body: "<the cleaned body, signature removed and trailing whitespace trimmed>",
  signatureText: "<the signature you removed, or omit if none>"
})

The tool will refuse to apply changes if:

  • body is empty or whitespace-only.
  • body is more than ~50% shorter than the original and you did not pass a matching signatureText with multiple contact-info hints (defense against accidental over-cutting). Always pass signatureText when the signature is most of the body, or the cut will be rejected.
  • messageId doesn't resolve to an inbound (author_type = 'end_user') message in your org.

A refusal is fine — the original body stays in place.

Examples

Example 1 — typical iPhone reply

Input body:

Yes that works for me, thanks!

Sent from my iPhone

Tool call:

conv_strip_message_signature({
  messageId: "ccm_…",
  body: "Yes that works for me, thanks!",
  signatureText: "Sent from my iPhone"
})

Example 2 — corporate signature, no -- delimiter

Input body:

Hi Munin team,

Could you confirm whether SSO is available on the team plan?

Best,
Jane Doe
Head of Operations
Acme Corp
+1 555 123 4567
jane@acme.com

Tool call:

conv_strip_message_signature({
  messageId: "ccm_…",
  body: "Hi Munin team,\n\nCould you confirm whether SSO is available on the team plan?",
  signatureText: "Best,\nJane Doe\nHead of Operations\nAcme Corp\n+1 555 123 4567\njane@acme.com"
})

Example 3 — one-line reply, signature is most of the body (HTML-table sig)

The signature has no closing greeting and dwarfs the actual reply, but it's an unambiguous contact block, so strip it down to the one real line. Passing signatureText is what allows the cut past the 50% guard.

Input body:

Looks cool!

Sam Rivera CTO

Northwind Labs, 12 Harbor St, Springfield

Email: sam@northwind.example mailto:sam@northwind.example Phone: +1 555 0142 Web: northwind.example https://northwind.example/

Tool call:

conv_strip_message_signature({
  messageId: "ccm_…",
  body: "Looks cool!",
  signatureText: "Sam Rivera CTO\n\nNorthwind Labs, 12 Harbor St, Springfield\n\nEmail: sam@northwind.example mailto:sam@northwind.example Phone: +1 555 0142 Web: northwind.example https://northwind.example/"
})

Example 4 — no signature, leave it alone

Input body:

Approved.

Tool call:

conv_strip_message_signature({
  messageId: "ccm_…",
  body: "Approved."
})

Example 5 — ambiguous, stay conservative

Input body:

I'll think about it and get back to you.

Jane

A lone first name without a contact block is often not a signature — it could be the user's actual sign-off they want preserved. When in doubt, leave it.

Tool call:

conv_strip_message_signature({
  messageId: "ccm_…",
  body: "I'll think about it and get back to you.\n\nJane"
})