“The difference between a clipping service and a briefing is judgement: knowing what to leave out. The prompt is where you encode that judgement.”
The synthesis prompt
Treat the prompt as a contract: state who you are, what to keep, what to drop, and the exact output shape. The more specific your "what matters to me" line, the less generic the brief. Start from this and tighten it over a week:
You are my morning research analyst. Below are raw web search
results on the topics I track. Produce a 5-minute brief.
Who I am: [one line: your role and what you're trying to decide].
What matters: [2-4 concrete criteria, e.g. "funding rounds over $10M",
"shipping AI-security features", "regulatory moves in US/Canada"].
Rules:
- Keep only items that meet my criteria. Drop the rest, silently.
- Merge duplicates that cover the same event into one entry.
- Rank by importance to me, most important first.
- For each: one-line headline, two-sentence why-it-matters, and the
source URL. No filler, no hedging, no "as an AI".
- If nothing meaningful happened, say so in one line. Don't pad.
Output: a markdown note titled "{{today}} Brief".The two lines that do the most work are Who I am and What matters: they turn a summariser into a filter. "Drop the rest, silently" is what stops the brief from listing everything it found just to look thorough.
Cost: it's cheaper than it looks, but watch three things
- Brave: one brief a day is far inside the free plan (2,000/month). You only approach the limit if you watch many topics or run multiple times a day.
- Claude tokens: the input is your prompt plus the search results; the output is short. A daily Sonnet brief is a small cost. Use Haiku to cut it further if quality holds.
- Prompt caching: your instructions (the contract above) are identical every day while only the results change. Marking the stable instruction block as cacheable charges the repeated prefix at a fraction of the input rate, the single biggest lever if you run this often or across many topics. (See the API caching docs for current multipliers.)
Troubleshooting: the failures that actually happen
- Brief fires at the wrong time. The Schedule Trigger uses the instance timezone: set `GENERIC_TIMEZONE` (self-host) or the Cloud timezone, not just the cron expression.
- File never appears in Obsidian. Almost always a path problem: the MCP Filesystem scope doesn't include the folder, or containerised n8n wrote inside the container. Check the absolute path and any volume mount.
- Brave returns errors or nothing. Wrong package (use @brave/brave-search-mcp-server), missing `X-Subscription-Token` header, or you tripped the 1 q/s limit by firing topic queries back-to-back; space them out.
- Brief is generic / lists everything. Your prompt is too vague. Make "What matters" concrete and keep "drop the rest, silently."
- Claude call fails. Check the headers (`x-api-key`, `anthropic-version: 2023-06-01`) and that the model ID is current.
Where to take it next
- Add more sources beside Brave (an RSS node, a specific API) and merge them before the synthesis step.
- Deliver the brief where you'll see it: append a Slack or email node after the write so it's waiting in your inbox too.
- Add a second pass that links today's brief to yesterday's so the agent tracks ongoing stories, not just snapshots.
In one line each
- Quality lives in the prompt: state who you are, your concrete criteria, "drop the rest silently", ranking, and a cited output shape.
- Costs are small for a daily brief; prompt-cache the stable instructions if you run it often or across many topics.
- Most failures are timezone (wrong hour), path/scope (file doesn't appear), wrong Brave package, the 1 q/s limit, or a vague prompt.
- Extend with more sources, Slack/email delivery, and day-over-day story tracking, but tune the prompt before adding nodes.