All 32 agent manifests and 17 hands shipped with empty mcp_servers /
skills lists, which the kernel interprets as "no filter" — every
globally-configured MCP server's tools and every installed skill get
injected into the prompt on every LLM call. On a typical instance (9
MCP servers, ~85 MCP tools + ~82 built-in tools) that's ~50k input
tokens per turn spent on definitions the agent never uses.
Changes
-------
32 agents/*/agent.toml:
- mcp_servers: 1-4 per agent. memory wherever state persists across
turns; fetch / exa-search / brave-search only where the prompt
actually calls for web; git / github / filesystem on engineering
agents; gmail / google-calendar / linear / jira on productivity
agents whose prompts mention them.
- skills: per-role allowlist driven by what the system_prompt names
(e.g. coder → rust/python/typescript/git/shell-scripting; devops-
lead → docker/kubernetes/terraform/ansible/ci-cd/helm/prometheus/
sysadmin). Generalists (assistant) keep skills = [] (see "Open
items" below).
- skills_disabled = true on the four short-conversational agents
(hello-world, recipe-assistant, health-tracker, home-automation).
Their system prompts never instruct the LLM to consult any skill,
so loading all 60 was pure waste. They also drop the explicit
max_history_messages override and inherit the kernel default (60).
- max_history_messages tiered by workload shape:
60 short conversational (hello-world, recipe, health-tracker,
home-automation) — inherits the rising kernel default
(`DEFAULT_MAX_HISTORY_MESSAGES = 60`); no override needed.
60 single-turn task agents (writer, translator, doc-writer,
email-assistant, customer-support, sales-assistant, recruit-
er, social-media, personal-finance, tutor, travel-planner,
meeting-assistant, ops, devops-lead, planner) — explicit
override at the same value to lock the cap if the kernel
default moves again.
80 multi-step / tool-heavy (coder, debugger, architect, code-
reviewer, test-engineer, security-auditor, analyst, data-
scientist, academic-researcher, researcher, legal-assistant)
120 coordinators (assistant, orchestrator) — long multi-agent
sessions where prompt-cache continuity is critical
All values sit at or above the kernel default. Pinning lower
would thrash the prompt cache (the failure mode #91 fixed for
the creator hand by *raising* the cap, not lowering it).
17 hands/*/HAND.toml:
- hand-level mcp_servers / skills now declared on every hand, so
every [agents.*] inside inherits a sensible allowlist.
- skills_disabled = true placed on each [agents.*] inside clip and
creator (pure media pipelines that don't benefit from any skill).
HandDefinitionRaw in librefang-hands does NOT have a top-level
skills_disabled field — declaring it at the hand top level would
be silently dropped by serde, so the setting must live on the
AgentManifest of each sub-agent role.
- devteam: expand existing mcp_servers = ["github"] to include
memory / git / filesystem; populate skills with the expected
dev-team expertise (replacing the placeholder skills = []).
- wiki: replace placeholder mcp_servers = [] with [memory, fetch,
filesystem]. Hand-level skills stays [].
- lead: hand-level skills was originally [email-writer, writing-
coach, interview-prep]; interview-prep is for job-interview
preparation, not lead generation. Replaced with data-analyst
(used by the qualification-scoring step in the prompt).
schema.toml: register mcp_servers / skills / max_history_messages on
the agent field schema so machine consumers (RegistrySchema in
librefang-types) see the new top-level fields. The
max_history_messages description now points at
librefang_runtime::agent_loop::DEFAULT_MAX_HISTORY_MESSAGES (60
today) by name, so the schema doesn't go stale when the constant
moves again.
agents/README.md: example block + "Adding a New Agent" checklist
mention the allowlists; max_history_messages example is shown
commented out with a prompt-cache caveat.
Open items
----------
`assistant` (the default user-facing agent) keeps `skills = []`
deliberately. It is the generalist entry point — capping its skill
surface at a small allowlist would defeat its "delegate to any
specialist" job. The trade-off is that this single agent still pays
the full skill-definition load on every turn; operators who want a
strict allowlist for `assistant` can override it after install.
Why not adopt PR #89's approach
-------------------------------
#89 covers similar ground but with three issues this PR avoids:
1. mcp_servers = ["_none"] sentinel. #89's body explicitly notes
it's pending upstream librefang#4808 (mcp_disabled). Shipping a
magic-string today means coming back later to clean it up. This
PR uses real allowlists.
2. max_history_messages = 8 / 12 / 15 / 20. Far below today's
kernel default (60) and #91's direction for long-workflow hands
(80–120). Every turn that hits the cap invalidates the cached
prompt prefix; the cost of cache misses exceeds the saving from
shorter history. This PR uses 60–120.
3. Doubling max_llm_tokens_per_hour (coder 200k→500k, assistant
300k→500k) widens the per-agent budget — the opposite direction
from #87's "reduce per-call cost" goal. Left to the operator's
instance-specific tuning.
Refs librefang/librefang-registry#87, librefang/librefang-registry#89
120 lines
5.3 KiB
TOML
120 lines
5.3 KiB
TOML
name = "email-assistant"
|
|
version = "0.4.3-beta3-20260314"
|
|
description = "Email triage, drafting, scheduling, and inbox management agent."
|
|
author = "librefang"
|
|
module = "builtin:chat"
|
|
tags = [
|
|
"email",
|
|
"communication",
|
|
"triage",
|
|
"drafting",
|
|
"scheduling",
|
|
"productivity",
|
|
]
|
|
|
|
# Per-agent resource allowlists (refs librefang/librefang-registry#87).
|
|
# Empty list = all available; explicit list filters the prompt surface
|
|
# so the LLM only sees what this agent actually uses.
|
|
mcp_servers = ["memory", "gmail"]
|
|
skills = ["email-writer", "writing-coach"]
|
|
|
|
|
|
max_history_messages = 60
|
|
[metadata.routing]
|
|
aliases = [
|
|
"draft email",
|
|
"email reply",
|
|
"inbox triage",
|
|
"email follow up",
|
|
"compose email",
|
|
]
|
|
weak_aliases = ["email", "inbox", "follow-up"]
|
|
|
|
[model]
|
|
provider = "default"
|
|
model = "default"
|
|
max_tokens = 8192
|
|
temperature = 0.4
|
|
system_prompt = """You are Email Assistant, a specialist agent in the LibreFang Agent OS. Your purpose is to manage, triage, draft, and schedule emails with expert precision and professionalism.
|
|
|
|
CORE COMPETENCIES:
|
|
|
|
1. Email Triage and Classification
|
|
You excel at rapidly processing incoming email to determine urgency, category, and required action. You classify messages into tiers: urgent/time-sensitive, requires-response, informational/FYI, and low-priority/archivable. You identify key stakeholders, extract deadlines, and flag messages that require escalation. When triaging, you always provide a structured summary: sender, subject, urgency level, category, recommended action, and estimated response time.
|
|
|
|
2. Email Drafting and Composition
|
|
You craft professional, clear, and contextually appropriate emails. You adapt tone and formality to the recipient and situation — concise and direct for internal team communication, polished and diplomatic for executive or client correspondence, warm and approachable for personal outreach. You structure emails with clear subject lines, purposeful opening lines, organized body content, and explicit calls to action. You avoid jargon unless the context warrants it, and you always proofread for grammar, tone, and clarity before presenting a draft.
|
|
|
|
3. Scheduling and Follow-up Management
|
|
You help manage email-based scheduling by identifying proposed meeting times, drafting acceptance or rescheduling responses, and tracking follow-up obligations. You maintain awareness of pending threads that need responses and can generate reminder summaries. When a user has multiple outstanding threads, you prioritize them by deadline and importance.
|
|
|
|
4. Template and Pattern Recognition
|
|
You recognize recurring email patterns — status updates, meeting requests, feedback requests, introductions, thank-yous, escalations — and can generate reusable templates customized to the user's voice and preferences. Over time, you learn the user's communication style and mirror it in drafts.
|
|
|
|
5. Summarization and Digest Creation
|
|
For long email threads or high-volume inboxes, you produce concise digests that capture the essential information: decisions made, action items assigned, questions outstanding, and next steps. You can summarize a 20-message thread into a structured briefing in seconds.
|
|
|
|
OPERATIONAL GUIDELINES:
|
|
- Always ask for clarification on tone and audience if not specified
|
|
- Never fabricate email addresses or contact information
|
|
- Flag potentially sensitive content (legal, HR, financial) for human review
|
|
- Preserve the user's voice and preferences in all drafted content
|
|
- When scheduling, always confirm timezone awareness
|
|
- Structure all output clearly: use headers, bullet points, and labeled sections
|
|
- Store recurring templates and user preferences in memory for future reference
|
|
- When handling multiple emails, process them in priority order and present a summary dashboard
|
|
|
|
TOOLS AVAILABLE:
|
|
- file_read / file_write / file_list: Read and write email drafts, templates, and logs
|
|
- memory_store / memory_recall: Persist user preferences, templates, and pending follow-ups
|
|
- web_fetch: Access calendar or scheduling links when provided
|
|
|
|
You are thorough, discreet, and efficient. You treat every email as an opportunity to communicate clearly and build professional relationships."""
|
|
|
|
[resources]
|
|
max_llm_tokens_per_hour = 150000
|
|
max_concurrent_tools = 5
|
|
|
|
[capabilities]
|
|
tools = [
|
|
"file_read",
|
|
"file_write",
|
|
"file_list",
|
|
"memory_store",
|
|
"memory_recall",
|
|
"web_fetch",
|
|
"web_search",
|
|
]
|
|
network = ["*"]
|
|
memory_read = ["*"]
|
|
memory_write = ["self.*", "shared.*"]
|
|
|
|
|
|
[i18n.zh]
|
|
name = "邮件助手"
|
|
description = "邮件分拣、起草、日程安排与收件箱管理 Agent。"
|
|
|
|
[i18n.zh-TW]
|
|
name = "郵件助手"
|
|
description = "郵件分揀、草擬、行程安排與收件匣管理 Agent。"
|
|
|
|
[i18n.ja]
|
|
name = "メールアシスタント"
|
|
description = "メールのトリアージ、下書き、スケジュール、受信トレイ管理を行う Agent。"
|
|
|
|
[i18n.ko]
|
|
name = "이메일 도우미"
|
|
description = "이메일 분류, 초안 작성, 일정 관리, 받은 편지함 관리를 담당하는 Agent."
|
|
|
|
[i18n.de]
|
|
name = "E-Mail-Assistent"
|
|
description = "Agent für E-Mail-Triage, Entwurfserstellung, Terminplanung und Postfach-Verwaltung."
|
|
|
|
[i18n.es]
|
|
name = "Asistente de correo"
|
|
description = "Agente para clasificación, redacción, agenda y gestión de la bandeja de entrada."
|
|
|
|
[i18n.fr]
|
|
name = "Assistant e-mail"
|
|
description = "Agent de triage, rédaction, planification et gestion de la boîte de réception."
|