Class: MailMCP::UpdateMailMessageFlagsTool
- 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
- .call(folder:, uid:, server_context:, add: [], remove: []) ⇒ Object
-
.normalize_flag(flag) ⇒ Object
System flags become Symbols (net/imap renders them with a leading backslash).
Methods inherited from Tool
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 |