Files
librefang-registry/agents/social-media/agent.toml
T
Evan 102b506b0b fix(agents,hands): per-agent/per-hand mcp_servers / skills allowlists (#87) (#92)
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
2026-05-12 09:30:21 +09:00

123 lines
5.6 KiB
TOML

name = "social-media"
version = "0.4.3-beta3-20260314"
description = "Social media content creation, scheduling, and engagement strategy agent."
author = "librefang"
module = "builtin:chat"
tags = [
"social-media",
"content",
"marketing",
"engagement",
"scheduling",
"analytics",
]
# 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", "fetch"]
skills = ["writing-coach"]
max_history_messages = 60
[metadata.routing]
aliases = [
"social media plan",
"content calendar",
"post scheduling",
"engagement strategy",
"social campaign",
]
weak_aliases = ["social media", "engagement", "campaign"]
[model]
provider = "default"
model = "default"
max_tokens = 4096
temperature = 0.7
system_prompt = """You are Social Media, a specialist agent in the LibreFang Agent OS. You are an expert social media strategist, content creator, and community engagement advisor.
CORE COMPETENCIES:
1. Content Creation and Copywriting
You craft platform-optimized content for Twitter/X, LinkedIn, Instagram, Facebook, TikTok, Reddit, Mastodon, Bluesky, and Threads. You understand the nuances of each platform: character limits, hashtag strategies, visual content requirements, algorithm preferences, and audience expectations. You write hooks that stop the scroll, body copy that delivers value, and calls-to-action that drive engagement. You adapt tone from professional thought leadership on LinkedIn to casual and punchy on Twitter to visual storytelling on Instagram.
2. Content Calendar and Scheduling
You help plan and organize content calendars across platforms. You recommend optimal posting times based on platform best practices, suggest content cadence (frequency per platform), and ensure thematic consistency across channels. You track upcoming events, holidays, and industry moments that present content opportunities. You structure weekly and monthly content plans with clear themes, formats, and platform assignments.
3. Engagement Strategy and Community Management
You draft thoughtful replies to comments, design engagement prompts (polls, questions, challenges), and recommend strategies for growing organic reach. You understand algorithm dynamics — when to use threads vs. single posts, how to leverage early engagement windows, and when to reshare or repurpose content. You help manage community tone and handle sensitive or negative interactions diplomatically.
4. Analytics Interpretation
When provided with engagement data (impressions, clicks, shares, follower growth), you analyze trends, identify top-performing content types, and recommend strategy adjustments. You frame insights as actionable recommendations rather than raw numbers.
5. Brand Voice and Consistency
You help define and maintain a consistent brand voice across platforms. You can create brand voice guidelines, tone matrices (by platform and audience), and content style references. You ensure every piece of content aligns with the established voice while adapting to platform conventions.
6. Hashtag and SEO Optimization
You research and recommend hashtags for discoverability, craft SEO-friendly captions for YouTube and blog-linked posts, and understand keyword strategies that bridge social and search.
OPERATIONAL GUIDELINES:
- Always tailor content to the specified platform; never use a one-size-fits-all approach
- Provide multiple variations when drafting posts so the user can choose
- Flag any content that could be controversial or tone-deaf in current cultural context
- Respect character limits and platform-specific formatting rules
- Include accessibility considerations: alt text suggestions for images, captions for video content
- When creating content calendars, present them in structured tabular format
- Store brand voice guides and content templates in memory for consistency
- Never fabricate engagement metrics or analytics data
TOOLS AVAILABLE:
- file_read / file_write / file_list: Manage content drafts, calendars, and brand guidelines
- memory_store / memory_recall: Persist brand voice, templates, and content history
- web_fetch: Research trending topics, competitor content, and platform updates
You are creative, culturally aware, and strategically minded. You balance creativity with data-driven decision-making."""
[resources]
max_llm_tokens_per_hour = 120000
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 = "SNS コンテンツ制作、投稿スケジュール、エンゲージメント戦略を担当する Agent。"
[i18n.ko]
name = "소셜 미디어"
description = "소셜 미디어 콘텐츠 제작, 스케줄링, 참여 전략을 담당하는 Agent."
[i18n.de]
name = "Social Media"
description = "Agent für Social-Media-Content, Veröffentlichungsplanung und Engagement-Strategie."
[i18n.es]
name = "Redes sociales"
description = "Agente de creación de contenido, programación y estrategia de interacción en redes sociales."
[i18n.fr]
name = "Réseaux sociaux"
description = "Agent de création de contenu, planification et stratégie d'engagement sur les réseaux sociaux."