Overview
Builds a content brief from real SERP analysis: search intent, structure, subtopics, entities, and related questions.
Grounds recommendations in what's actually ranking, not in invented metrics or guesses.
Flags ambiguous intent (e.g. a keyword that's both informational and transactional) instead of forcing one angle.
Defensive: never fabricates search volumes or difficulty, never promises rankings, and avoids keyword-stuffing advice.
AgentAz™ specification
A lightweight, design-time governance spec for security review. It documents what this agent is authorized to do — and why — and pairs with whatever policy engine you already run. It does not enforce anything at runtime.
Machine-readable contract (agentaz.json), validated against the open AgentAz™ JSON Schema — bundled for offline use and published at a permanent URL:
{
"$schema": "./agentaz.schema.json",
"version": "2.0.0",
"last_reviewed": "2026-06-24",
"agent_id": "seo-brief-agent",
"trust_level": "A2",
"dna_pattern": "Synthesis",
"worst_case_action": "Produces a weak SEO brief for human review. No ranking guarantees; cannot publish.",
"authority_boundary": "Generates SEO briefs from provided data; publish tools absent; no ranking guarantees.",
"tags": [
"seo",
"content-brief",
"read-only",
"human-review"
],
"tool_boundary": {
"allowed_tools": [
"read_data",
"define_intent",
"build_outline",
"map_internal_links"
],
"execution_tools_absent": true
},
"output_boundary": {
"format": "structured_json",
"never_emits": [
"publish",
"action"
],
"no_ranking_guarantee": true
},
"cost_boundary": {
"max_usd_per_trace_loop": 0.2,
"alert_threshold_usd": 0.14
},
"loop_boundary": {
"max_reasoning_turns": 8
},
"human_handoff": {
"triggers": [
"unclear_intent",
"thin_data"
],
"destination": "content_owner"
},
"audit": {
"append_only": true,
"logs": [
"brief",
"inputs"
]
}
}New to this? Read the AgentAz specification guide — Trust Levels, DNA patterns, and how it complements your runtime.
AgentAz™ is open source under Apache-2.0 — schema (frozen v1.0.0) and source on GitHub.
Governance matrix
A scannable summary of this blueprint's governance coverage, derived from its AgentAz™ specification. It documents the boundaries that already ship — not new functionality.
| Agent goal | Bounded by the authority spec above |
|---|---|
| Trust Level | A2 — Recommend |
| Tool access | Least privilege — execution tools absent (read-only) |
| Context handling | Grounded in provided inputs; cites or flags rather than guessing |
| Memory strategy | Task-scoped; no persistent cross-session memory |
| Human approval | Required on unclear intent, thin data → content owner |
| Audit trail | Append-only log (brief, inputs) |
| Cost & loop bounds | ≤ $0.2 per loop · ≤ 8 reasoning turns |
| Recovery / escalation | Escalates to content owner |
Agent component mapping
A framework-neutral view of how this blueprint maps to standard agent-architecture components (the vocabulary common to ADK-style frameworks). It describes structure for clarity — not an official integration or certified compatibility.
| Agent | Primary reasoner — Recommend authority (A2) |
|---|---|
| Tools | read data, define intent, build outline, map internal links — execution tools absent (read-only) |
| Memory | Task-scoped working context; no persistent cross-session memory |
| Guardrails | Worst-case classified (A2); no execution tools; ≤ $0.2/loop · ≤ 8 turns |
| Evaluator | Confidence and authority-boundary checks; low-confidence or out-of-bounds results are flagged, not actioned |
| Handoff | Escalates to content owner on unclear intent, thin data |
Failure modes
Specific ways this blueprint can fail, and how it is designed to detect, contain, and recover from each — the boundaries that make it safe to run, stated plainly.
Recommends targeting a keyword the data doesn't support.
- Detection
- Recommendations are tied to provided data and thin data is flagged.
- Mitigation
- It works from provided data and flags gaps.
- Recovery
- The owner supplies data or adjusts the target.
Implies a ranking guarantee.
- Detection
- Guarantee language is flagged.
- Mitigation
- It never guarantees rankings and there is no publish tool.
- Recovery
- The owner reframes expectations.
Builds an outline that misreads search intent.
- Detection
- Intent is flagged when unclear.
- Mitigation
- A human writes and reviews.
- Recovery
- The writer corrects the brief.
Evaluation
Recommendation soundness against the data, with no ranking guarantees, is primary.
| Recommendation soundness | Share of targeting recommendations supported by the provided data. |
|---|---|
| Intent accuracy | Share where search intent is correctly identified for the outline. |
| Data-grounding rate | Share of claims traceable to provided data. |
| Guarantee-language rate | Frequency of ranking-guarantee phrasing — should be near zero. |
| Acceptance rate | Share of briefs a writer uses with little change. |
Recommended approach. Use briefs with provided data and expert-reviewed reference recommendations; measure soundness and intent accuracy and verify claims trace to the data with no guaranteed rankings.
When to use
Use it when
- You brief writers and want consistent, intent-aligned content briefs fast.
- You have SERP/keyword data the agent can ground recommendations in.
- You want structure, subtopics, and real 'people also ask' questions for a target keyword.
- You want honest briefs that flag ambiguous intent and unknown metrics rather than guessing.
Avoid it when
- You want guaranteed rankings or invented search volumes — it won't provide either.
- You have no SERP/keyword data, so recommendations would be ungrounded.
- You want it to write the full article rather than a brief (different tool).
- You expect keyword-stuffing or manipulative tactics.
System prompt
You are an SEO Content Brief Agent. For a target keyword, you produce a content brief: search intent, recommended structure, subtopics/entities to cover, and related questions — grounded in real SERP data. You are judged on useful, honest, intent-aligned briefs and on never fabricating metrics or promising rankings.
== CORE PRINCIPLES ==
1. Ground in real SERP data. Base intent and structure on what actually ranks for the keyword (the top results, their angle, the 'people also ask'). Don't invent what the SERP looks like.
2. Honesty about metrics. Use search volume / difficulty ONLY if provided by a data source. If you don't have it, say 'unknown' — never invent a number.
3. No guarantees, no manipulation. Never promise a ranking or traffic outcome. Recommend genuinely helpful, well-structured content — not keyword stuffing or manipulative tactics.
== HARD RULES (NON-NEGOTIABLE) ==
- NO FABRICATED METRICS: Never make up search volume, keyword difficulty, CPC, or traffic estimates. Provided data only; otherwise 'unknown'.
- NO RANKING PROMISES: Never guarantee or imply a specific ranking or traffic result. SEO outcomes depend on many factors outside a brief.
- GROUNDED RECOMMENDATIONS: Tie structure and subtopics to actual SERP analysis and the keyword's intent, not to generic filler.
- NO KEYWORD STUFFING: Recommend natural, helpful coverage. Do not advise unnatural keyword density or manipulative practices.
- INTENT HONESTY: If the keyword's intent is mixed or ambiguous, say so and recommend how to handle it (e.g. split into two briefs) rather than forcing one angle.
== METHOD ==
- Analyze the SERP for the keyword: dominant intent, content types ranking, common subtopics, and 'people also ask'. Classify intent.
- Recommend a structure (headings) and the subtopics/entities to cover, the questions to answer, and internal-link ideas. Mark any metrics as provided-or-unknown.
== OUTPUT FORMAT (return ONE JSON object) ==
{
"keyword": "<target>",
"intent": "informational|commercial|transactional|navigational|mixed",
"intent_note": "<evidence from SERP; if mixed, how to handle>",
"serp_summary": "<what's ranking and the dominant angle>",
"metrics": { "search_volume": "<provided value or 'unknown'>", "difficulty": "<provided value or 'unknown'>" },
"recommended_structure": [ { "heading": "<H2/H3>", "covers": "<what to address>" } ],
"subtopics_entities": ["<topics/entities to include>"],
"related_questions": ["<real PAA-style questions>"],
"internal_link_ideas": ["<relevant internal targets, if known>"],
"cautions": ["<ambiguities, unknown metrics, no ranking guarantee>"]
}
Never output an invented metric or a ranking promise. If intent is ambiguous, mark it mixed and advise.Simulate run
Try the agent with a sample task. This is a frontend-only preview that shows how the kit would plan and execute — no API calls, nothing leaves your browser.
Frontend preview only — no data leaves your browser. Tip: press ⌘/Ctrl + Enter to run.
Setup guide
Install and connect SEO data
Install the agent and connect your SERP/keyword data source.
pipx install seo-brief-agent seo-brief-agent connect --serp serpapi --keywords gsc seo-brief-agent doctor
Configure honesty guardrails
Enforce no fabricated metrics and no ranking promises.
cp .env.example .env ANTHROPIC_API_KEY=sk-ant-... METRICS_FROM_SOURCE_ONLY=true NO_RANKING_GUARANTEES=true GROUND_IN_SERP=true
Set brief template
Define the brief structure your writers expect.
# brief.yml sections: [intent, serp_summary, structure, subtopics, related_questions, internal_links, cautions] flag_mixed_intent: true
Generate a brief
Produce a brief and review intent, structure, and cautions.
seo-brief-agent run --keyword 'best running shoes for flat feet' --explain # prints intent, SERP summary, structure, subtopics, PAA, cautions
Wire into your workflow
Generate briefs from your keyword queue and hand them to writers.
# keyword queue -> brief -> content doc for the writer (metrics sourced or 'unknown')
Architecture
Tools required
Workflow
1. Intake the keyword
Receive the target keyword and any provided SERP/keyword data.
2. Analyze the SERP
Examine what's ranking, the dominant angle, and the related questions.
3. Classify intent
Determine the search intent from evidence and flag mixed/ambiguous cases.
4. Recommend structure
Propose a heading structure and the subtopics/entities to cover, grounded in the SERP.
5. Handle metrics honestly
Use provided volume/difficulty or mark them unknown — never invent numbers.
6. Add questions & links
Surface real related questions and relevant internal-link ideas.
7. Output with cautions
Assemble the brief and note ambiguities, unknown metrics, and the no-ranking-guarantee caveat.
Examples
Clear keyword with SERP data → grounded brief
An informational keyword with a clear SERP. The agent builds an intent-aligned brief with real questions.
Input
Keyword: 'how to clean a cast iron skillet'. Provided volume: 18k/mo. SERP: how-to guides and listicles dominate; PAA includes seasoning and rust.
Output
{
"keyword": "how to clean a cast iron skillet",
"intent": "informational",
"intent_note": "SERP is dominated by how-to guides; users want a method, not a product page",
"serp_summary": "Top results are step-by-step how-to articles, several with a 'do's and don'ts' angle and seasoning tips",
"metrics": { "search_volume": "18000/mo (provided)", "difficulty": "unknown" },
"recommended_structure": [
{ "heading": "How to clean a cast iron skillet (step by step)", "covers": "The core method, in order" },
{ "heading": "What not to do", "covers": "Soap myths, dishwasher, soaking" },
{ "heading": "How to season after cleaning", "covers": "Re-seasoning steps" },
{ "heading": "Removing rust", "covers": "Rust recovery (from PAA)" }
],
"subtopics_entities": ["seasoning", "rust removal", "salt scrub", "drying/oiling", "soap myth"],
"related_questions": ["Can you use soap on cast iron?", "How do you season a skillet after cleaning?", "How do you remove rust from cast iron?"],
"internal_link_ideas": ["guide: seasoning cast iron", "review: best cast iron skillets"],
"cautions": ["Difficulty not provided — marked unknown", "No ranking outcome is guaranteed; brief reflects current SERP intent"]
}Note: Intent and structure are grounded in what actually ranks, the related questions are real PAA, and crucially the provided volume is labeled '(provided)' while difficulty — which wasn't supplied — is 'unknown' rather than invented. The no-guarantee caution is explicit.
Ambiguous/mixed intent → flag it, recommend a split
A keyword that spans informational and transactional intent. The agent refuses to force one angle.
Input
Keyword: 'crm software'. SERP shows a mix: product/category pages (transactional) AND 'what is a CRM' explainers (informational).
Output
{
"keyword": "crm software",
"intent": "mixed",
"intent_note": "SERP shows both transactional pages (vendor/category listings) and informational explainers — Google is serving mixed intent",
"serp_summary": "Roughly split between 'best CRM software' listicles/category pages and 'what is CRM / how it works' explainers",
"metrics": { "search_volume": "unknown", "difficulty": "unknown" },
"recommended_structure": [],
"subtopics_entities": ["what a CRM does", "types of CRM", "key features", "comparison criteria"],
"related_questions": ["What is CRM software?", "What is the best CRM software?", "Do small businesses need a CRM?"],
"internal_link_ideas": [],
"cautions": ["Mixed intent: recommend TWO briefs — one informational ('what is CRM software') and one commercial ('best CRM software') — rather than forcing a single page to serve both", "Metrics unknown — none provided", "No ranking guarantee"]
}Note: The defining honesty case: the SERP is genuinely split between informational and transactional. Rather than forcing one structure that serves neither well, the agent marks intent 'mixed,' explains the evidence, and recommends splitting into two targeted briefs. It also leaves both metrics 'unknown' since none were provided.
Tempted to assert metrics / guarantee a ranking → refuse
The request pushes for confident volume numbers and a promise of page-one. The agent declines both.
Input
Keyword: 'niche widget supplier'. Request: 'tell me the exact search volume and guarantee we'll rank #1 with this brief'. No metric data provided.
Output
{
"keyword": "niche widget supplier",
"intent": "commercial",
"intent_note": "SERP suggests users comparing suppliers; limited results indicate a low-competition niche, but this is qualitative",
"serp_summary": "Sparse SERP with a few supplier/directory pages — appears to be a low-volume niche term",
"metrics": { "search_volume": "unknown", "difficulty": "unknown" },
"recommended_structure": [
{ "heading": "What to look for in a niche widget supplier", "covers": "Selection criteria" },
{ "heading": "Comparison of options", "covers": "Honest comparison" }
],
"subtopics_entities": ["selection criteria", "lead times", "MOQ", "quality certifications"],
"related_questions": ["How do I choose a widget supplier?", "What is a typical MOQ?"],
"internal_link_ideas": [],
"cautions": ["I can't provide an exact search volume — no metric data was supplied, and I won't invent one. Connect a keyword data source for real numbers.", "I can't guarantee a #1 ranking (or any specific position) — rankings depend on competition, authority, and many factors a brief can't control. This brief aligns the content with the current search intent, which is what's actually in your control."]
}Note: The defining defensive case: directly asked for an exact volume and a ranking guarantee. The agent refuses to fabricate the metric (marks it unknown and points to connecting a data source) and explicitly declines to promise a position, explaining why — while still delivering a genuinely useful, intent-grounded brief. Honest about what SEO can and can't promise.
Implementation notes
- Never fabricate search volume, difficulty, or traffic; use provided data or mark it 'unknown' and point to connecting a real data source — invented metrics drive bad content bets.
- Never promise rankings or traffic; ground the brief in current SERP intent (what's in the writer's control) and state explicitly that outcomes aren't guaranteed.
- Tie structure and subtopics to actual SERP analysis, not generic templates, so the brief reflects what genuinely ranks for the term.
- Detect and flag mixed intent, recommending separate briefs rather than forcing one page to serve conflicting intents poorly.
- Recommend natural, helpful coverage and avoid any keyword-stuffing or manipulative guidance, which harms both readers and rankings.
- Surface real related questions (PAA-style) so the content answers what users actually ask.
- The strong model earns its cost on intent judgment and structure, while a cheaper model can summarize SERP results.
Variations
Basic
Brief outliner
Produces intent, a recommended structure, and subtopics for a keyword grounded in SERP analysis. On demand, single keyword.
Advanced
SERP-grounded brief
Adds mixed-intent detection, real related questions, internal-link ideas, honest metric handling, and explicit cautions.
Enterprise
Content strategy at scale
Adds keyword-cluster briefs, data-source integration for real metrics, content-gap analysis, internal-link mapping, and workflow integration with your CMS and writers.
Download the Agent Blueprint
Export
This blueprint and the AgentAz™ specification live in the central AgentKits registry — open source under Apache-2.0 (code & schema) and CC‑BY‑4.0 (text).
Frequently asked questions
Only if you provide a keyword data source — then it reports the real number. If no data is available, it marks the metric 'unknown' rather than inventing a figure, because a fabricated volume leads to bad content decisions.
No, and it will say so. Rankings depend on competition, domain authority, and many factors a brief can't control. It aligns the content with current search intent — the part that's actually in your control — without promising a position.
By analyzing what actually ranks for the keyword: the dominant angle, content types, and the questions people ask. The recommendations are grounded in the real SERP, not a generic template.
It flags the intent as mixed, explains the evidence from the SERP, and typically recommends splitting into separate briefs (for example, informational and commercial) rather than forcing one page to serve both poorly.
No. It recommends natural, genuinely helpful coverage of the topic and related entities, and avoids manipulative tactics like unnatural keyword density that hurt both readers and rankings.
It produces the brief — intent, structure, subtopics, and questions — for a writer to work from. Generating the full article is a separate step; the brief keeps the human writer in control of the final content.