chore(email): sharpen tool descriptions and rename email_list_inbox

- Rename email_list_inbox → email_list_folder (works on any folder, not just inbox)
- email_list_folder / email_search: distinguish browse-by-recency vs filter-by-query
- email_move / email_delete: clarify single-email scope; point to email_bulk_action for multiple
- email_bulk_action: clarify it handles multiple emails; point to move/delete for single
- email_create_folder: remove redundant "ask user" instruction (requires_approval handles it)
- Update tests to reflect renamed tool

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
curo1305
2026-05-19 23:50:24 +02:00
parent d3fc4e2d42
commit fac6e7e77e
2 changed files with 15 additions and 11 deletions
+13 -9
View File
@@ -927,8 +927,9 @@ class EmailPlugin(BasePlugin):
def tools(self) -> list[Tool]:
return [
Tool(
"email_list_inbox",
"List recent emails from a folder. Returns sender, subject, date, read status.",
"email_list_folder",
"List recent emails from a folder by recency. Returns sender, subject, date, read status. "
"Use this to browse a folder. For filtering by sender, subject, or keyword, use email_search instead.",
{
"type": "object",
"properties": {
@@ -950,7 +951,7 @@ class EmailPlugin(BasePlugin):
"type": "object",
"required": ["uid"],
"properties": {
"uid": {"type": "string", "description": "Email UID from email_list_inbox"},
"uid": {"type": "string", "description": "Email UID from email_list_folder or email_search"},
"folder": {"type": "string", "default": "INBOX"},
},
},
@@ -1007,8 +1008,9 @@ class EmailPlugin(BasePlugin):
),
Tool(
"email_move",
"Move an email to another folder. Returns an error message if the folder "
"does not exist — call email_create_folder first (with user approval).",
"Move a single email to another folder. Returns an error message if the folder "
"does not exist — call email_create_folder first (with user approval). "
"For multiple emails, use email_bulk_action.",
{
"type": "object",
"required": ["uid", "to_folder"],
@@ -1023,7 +1025,7 @@ class EmailPlugin(BasePlugin):
),
Tool(
"email_delete",
"Move an email to the Trash.",
"Move a single email to the Trash. For multiple emails, use email_bulk_action.",
{
"type": "object",
"required": ["uid"],
@@ -1052,8 +1054,9 @@ class EmailPlugin(BasePlugin):
),
Tool(
"email_search",
"Search emails by a natural language query. Examples: "
"'from:boss@company.com', 'unread invoices', 'subject:meeting'.",
"Search emails by filtering on sender, subject, or keyword. Examples: "
"'from:boss@company.com', 'unread invoices', 'subject:meeting'. "
"For browsing a folder by recency without a filter, use email_list_folder instead.",
{
"type": "object",
"required": ["query"],
@@ -1075,7 +1078,7 @@ class EmailPlugin(BasePlugin):
),
Tool(
"email_create_folder",
"Create a new email folder. Always ask the user for confirmation before calling.",
"Create a new email folder.",
{
"type": "object",
"required": ["name"],
@@ -1142,6 +1145,7 @@ class EmailPlugin(BasePlugin):
Tool(
"email_bulk_action",
"Apply an action to all emails matching a search query. "
"Use for multiple emails; for a single email use email_move or email_delete. "
"Actions: 'delete', 'mark_read', 'move:<folder_name>'.",
{
"type": "object",
+2 -2
View File
@@ -351,7 +351,7 @@ def test_plugin_exposes_16_tools():
assert len(tools) == 16
expected = {
"email_list_inbox", "email_read", "email_send", "email_reply",
"email_list_folder", "email_read", "email_send", "email_reply",
"email_forward", "email_move", "email_delete", "email_mark_read",
"email_search", "email_list_folders", "email_create_folder",
"email_inbox_summary", "email_list_rules", "email_create_rule",
@@ -378,7 +378,7 @@ def test_read_tools_no_approval():
plugin.on_load(lambda _: None)
tools = {t.name: t for t in plugin.tools()}
for name in ["email_list_inbox", "email_read", "email_mark_read",
for name in ["email_list_folder", "email_read", "email_mark_read",
"email_search", "email_list_folders", "email_inbox_summary",
"email_list_rules"]:
assert not tools[name].requires_approval, f"{name} should NOT require approval"