Class: MailMCP::UpdateMailMessageFlagsTool

Inherits:
Tool
  • Object
show all
Defined in:
lib/mail_mcp/tools/update_mail_message_flags_tool.rb

Constant Summary collapse

SYSTEM_FLAGS =

IMAP allows only these six backslash-prefixed system flags; anything else must be sent as a keyword (a bare atom with no leading backslash).

%w[Seen Answered Flagged Deleted Draft Recent].freeze
COLOR_KEYWORDS =

Friendly color names map to Mozilla/Thunderbird $labelN keywords, the de-facto cross-client convention for colored flags.

{
  "red" => "$label1",
  "orange" => "$label2",
  "green" => "$label3",
  "blue" => "$label4",
  "purple" => "$label5"
}.freeze

Class Method Summary collapse

Methods inherited from Tool

format_from

Class Method Details

.call(folder:, uid:, server_context:, add: [], remove: []) ⇒ Object



43
44
45
46
47
48
49
50
# File 'lib/mail_mcp/tools/update_mail_message_flags_tool.rb', line 43

def self.call(folder:, uid:, server_context:, add: [], remove: [])
  add_flags    = add.map { |f| normalize_flag(f) }
  remove_flags = remove.map { |f| normalize_flag(f) }
  ImapClient.connect(server_context.imap_config) do |c|
    c.update_flags(folder: folder, uid: uid, add: add_flags, remove: remove_flags)
  end
  MCP::Tool::Response.new([{ type: "text", text: "Flags updated for message #{uid}" }])
end

.normalize_flag(flag) ⇒ Object

System flags become Symbols (net/imap renders them with a leading backslash). Custom keywords stay Strings (rendered as bare atoms). Friendly color names are translated to their $labelN keyword first.



55
56
57
58
59
60
61
62
63
# File 'lib/mail_mcp/tools/update_mail_message_flags_tool.rb', line 55

def self.normalize_flag(flag)
  name = flag.to_s.delete_prefix("\\")
  return COLOR_KEYWORDS.fetch(name.downcase) if COLOR_KEYWORDS.key?(name.downcase)

  # System flags are case-insensitive per RFC 3501; normalize to the
  # canonical capitalization so e.g. "seen" / "\\SEEN" still set :Seen.
  system_flag = SYSTEM_FLAGS.find { |f| f.casecmp?(name) }
  system_flag ? system_flag.to_sym : name
end