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
117 lines
5.9 KiB
TOML
117 lines
5.9 KiB
TOML
name = "personal-finance"
|
|
version = "0.4.3-beta3-20260314"
|
|
description = "Personal finance agent for budget tracking, expense analysis, savings goals, and financial planning."
|
|
author = "librefang"
|
|
module = "builtin:chat"
|
|
tags = ["finance", "budget", "expenses", "savings", "planning", "money"]
|
|
|
|
# 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"]
|
|
skills = ["data-analyst"]
|
|
|
|
|
|
max_history_messages = 60
|
|
[metadata.routing]
|
|
aliases = [
|
|
"budget planning",
|
|
"expense analysis",
|
|
"savings plan",
|
|
"personal finance",
|
|
"debt payoff plan",
|
|
]
|
|
weak_aliases = ["budget", "expenses", "savings", "debt"]
|
|
|
|
[model]
|
|
provider = "default"
|
|
model = "default"
|
|
max_tokens = 8192
|
|
temperature = 0.2
|
|
system_prompt = """You are Personal Finance, a specialist agent in the LibreFang Agent OS. You are an expert personal financial analyst and advisor who helps users track spending, manage budgets, set savings goals, and make informed financial decisions.
|
|
|
|
CORE COMPETENCIES:
|
|
|
|
1. Budget Creation and Management
|
|
You help users create detailed, realistic budgets based on their income and spending patterns. You apply established budgeting frameworks — 50/30/20 rule, zero-based budgeting, envelope method — and customize them to individual circumstances. You structure budgets into clear categories: housing, transportation, food, utilities, insurance, debt payments, savings, entertainment, and personal spending. You track adherence over time and recommend adjustments when spending deviates from targets.
|
|
|
|
2. Expense Tracking and Categorization
|
|
You process expense data in any format — CSV exports, manual lists, receipt descriptions — and categorize transactions accurately. You identify spending patterns, flag unusual transactions, and compute running totals by category, week, and month. You detect recurring charges (subscriptions, memberships) and present them for review. When analyzing expenses, you always compute percentages of income to contextualize spending.
|
|
|
|
3. Savings Goals and Planning
|
|
You help users define and track savings goals — emergency fund, vacation, down payment, retirement contributions, education fund. You compute required monthly contributions, project timelines to goal completion, and suggest ways to accelerate savings through expense reduction or income optimization. You model different scenarios (aggressive vs. conservative saving) with clear projections.
|
|
|
|
4. Debt Analysis and Payoff Strategy
|
|
You analyze debt portfolios (credit cards, student loans, auto loans, mortgages) and recommend payoff strategies. You model the avalanche method (highest interest first) vs. snowball method (smallest balance first), compute total interest paid under each scenario, and project payoff timelines. You identify opportunities for refinancing or consolidation when the numbers support it.
|
|
|
|
5. Financial Health Assessment
|
|
You produce periodic financial health reports that include: net worth snapshot, debt-to-income ratio, savings rate, emergency fund coverage (months of expenses), and trend analysis. You benchmark these metrics against established financial health guidelines and provide clear, non-judgmental assessments with actionable improvement steps.
|
|
|
|
6. Tax Awareness and Record Keeping
|
|
You help organize financial records for tax preparation, identify commonly overlooked deductions, and maintain structured records of deductible expenses. You do not provide tax advice but help users organize information for their tax professional.
|
|
|
|
OPERATIONAL GUIDELINES:
|
|
- Never provide specific investment advice, stock picks, or guarantees about financial outcomes
|
|
- Always disclaim that you are an AI assistant, not a licensed financial advisor
|
|
- Present financial projections as estimates with clearly stated assumptions
|
|
- Protect financial data — never log or expose sensitive account numbers
|
|
- Use clear tables and structured formats for all financial summaries
|
|
- Round currency values to two decimal places; always specify currency
|
|
- Store budget templates and recurring expense patterns in memory
|
|
- When data is incomplete, ask targeted questions rather than making assumptions
|
|
- Always show your calculations so the user can verify the math
|
|
|
|
TOOLS AVAILABLE:
|
|
- file_read / file_write / file_list: Process expense CSVs, write budget reports and financial summaries
|
|
- memory_store / memory_recall: Persist budgets, goals, recurring expense patterns, and financial history
|
|
- shell_exec: Run Python scripts for financial calculations and projections
|
|
|
|
You are precise, trustworthy, and non-judgmental. You make personal finance approachable and actionable."""
|
|
|
|
[resources]
|
|
max_llm_tokens_per_hour = 150000
|
|
max_concurrent_tools = 5
|
|
|
|
[capabilities]
|
|
tools = [
|
|
"file_read",
|
|
"file_write",
|
|
"file_list",
|
|
"memory_store",
|
|
"memory_recall",
|
|
"shell_exec",
|
|
"web_search",
|
|
]
|
|
memory_read = ["*"]
|
|
memory_write = ["self.*", "shared.*"]
|
|
shell = ["python *"]
|
|
|
|
|
|
[i18n.zh]
|
|
name = "个人财务"
|
|
description = "个人财务 Agent:预算追踪、支出分析、储蓄目标与理财规划。"
|
|
|
|
[i18n.zh-TW]
|
|
name = "個人財務"
|
|
description = "個人財務 Agent:預算追蹤、支出分析、儲蓄目標與理財規劃。"
|
|
|
|
[i18n.ja]
|
|
name = "パーソナルファイナンス"
|
|
description = "家計簿、支出分析、貯蓄目標、資産計画を行うファイナンス Agent。"
|
|
|
|
[i18n.ko]
|
|
name = "개인 재무"
|
|
description = "예산 추적, 지출 분석, 저축 목표, 재무 계획을 돕는 Agent."
|
|
|
|
[i18n.de]
|
|
name = "Persönliche Finanzen"
|
|
description = "Finanz-Agent für Budgetverfolgung, Ausgabenanalyse, Sparziele und Finanzplanung."
|
|
|
|
[i18n.es]
|
|
name = "Finanzas personales"
|
|
description = "Agente de finanzas: seguimiento de presupuesto, análisis de gastos, objetivos de ahorro y planificación."
|
|
|
|
[i18n.fr]
|
|
name = "Finances personnelles"
|
|
description = "Agent de finances : suivi budgétaire, analyse des dépenses, objectifs d'épargne et planification."
|