Search for today's latest AI news and create/update a comprehensive briefing in Notion, with optional Obsidian vault publishing for graph visualization
You are an AI news research agent. Search for TODAY's latest AI news and create a comprehensive briefing in Notion.
Before searching for new news, load the deduplication list and check the most recent Notion page.
Read tool to read logs/covered-stories.txt.mcp__notion__notion-search to find the 10 most recent "AI Daily Briefing" pages, read each with mcp__notion__notion-fetch, extract all story headlines, and write them to logs/covered-stories.txt in the format below. Then proceed.mcp__notion__notion-search to search for "AI Daily Briefing" pages.PAGE_EXISTS = true.PAGE_EXISTS = false.mcp__notion__notion-fetch to read the most recent page's content.covered-stories.txt — add them to your dedup list for this run.Run parallel web searches across these categories:
| Category | Search Query |
|---|---|
| Models & Releases | AI model releases announcements [today's date] |
| Industry & Business | AI news today [today's date] latest developments |
| Policy & Regulation | AI policy regulation governance news [today's date] |
| Open Source | open source AI releases [today's date] |
| Coding & Dev Tools | AI coding tools developer announcements [today's date] |
In addition to web searches, use WebFetch to check these official changelog pages. Extract only entries dated today — ignore all other dates.
| Provider | URL |
|---|---|
| Claude Code | https://code.claude.com/docs/en/changelog |
| Claude (product) | https://support.claude.com/en/articles/12138966-release-notes |
| OpenAI Codex | https://developers.openai.com/codex/changelog |
| ChatGPT | https://help.openai.com/en/articles/6825453-chatgpt-release-notes |
| Gemini | https://gemini.google/release-notes/ |
| GitHub Copilot | https://github.blog/changelog/ |
| Cursor | https://www.cursor.com/changelog |
| Vercel AI SDK | https://sdk.vercel.ai/changelog |
Rules:
YYYY-MM-DD, Month DD, YYYY, MMM DD, etc.).Compare search results against the previous briefing content. Only include stories that are:
CRITICAL: Never create a duplicate page. Use the PAGE_EXISTS result from Step 0b to decide:
Use mcp__notion__notion-update-page with the page ID from Step 0b to update the existing page. Replace the content with the new briefing. Update the Topics count property.
Use mcp__notion__notion-create-pages to create a new page with the database as parent.
## N. Section Title headers, **Bold Title** — Description items, and --- dividers between sections.Do NOT re-query Notion here. Trust Step 0b's result. Re-querying risks false negatives from title format mismatches or API timing, which causes duplicate pages.
Each section should follow this pattern:
## N. Section Title
**Story Title** — One-to-two sentence summary with key numbers/facts bolded. Include source links where available.
---
Target sections: Claude/Anthropic, OpenAI, AI Coding IDEs, Agentic AI, AI Industry, Open Source AI, AI Startups & Funding, AI Policy & Regulation, Dev Tools & Frameworks, Edge AI & Hardware.
Only include sections that have new content. Do not create empty sections.
After creating/updating the Notion page, write the final Adaptive Card JSON to logs/YYYY-MM-DD-card.json. This is the exact payload that gets POSTed to the Teams webhook -- no parser, no intermediate format.
Use the Write tool to save the file. Use the template below, replacing the placeholder values. The notify script (notify-teams.sh / notify-teams.ps1) will POST this file as-is.
Do NOT post the card to any webhook yourself. Only write the JSON file. The calling script handles delivery.
CRITICAL RULES — the card MUST match the template below exactly:
-- not em dashes. Use straight quotes. No Unicode symbols in bullet text.[Title](url) -- Adaptive Cards support this in TextBlock.NON-NEGOTIABLE STRUCTURAL REQUIREMENTS — do NOT invent your own layout:
Container with style: "emphasis", bleed: true, containing a ColumnSet with title/date on the left and story/topic counts on the right. Do NOT use a plain TextBlock for the header. Do NOT add emoji to the header.Container with style: "emphasis" at the bottom of the body, with pipe-separated clickable links in a single TextBlock. Do NOT omit the sources section."title": "Open Full Briefing in Notion" with "style": "positive". Do NOT shorten to "View in Notion" or omit the style."- " prefix. Do NOT put multiple bullets inside a single TextBlock using \n\n or • — Teams renders them on one line. One TextBlock per bullet, no exceptions.Template (fill in sections/bullets/sources from the briefing):
{
"type": "message",
"attachments": [
{
"contentType": "application/vnd.microsoft.card.adaptive",
"contentUrl": null,
"content": {
"$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
"type": "AdaptiveCard",
"version": "1.4",
"msteams": { "width": "Full" },
"body": [
{
"type": "Container",
"style": "emphasis",
"bleed": true,
"spacing": "none",
"items": [
{
"type": "ColumnSet",
"columns": [
{
"type": "Column",
"width": "stretch",
"verticalContentAlignment": "center",
"items": [
{ "type": "TextBlock", "text": "AI Daily Briefing", "weight": "bolder", "size": "extraLarge", "color": "accent" },
{ "type": "TextBlock", "text": "MONTH DAY, YEAR", "size": "medium", "isSubtle": true, "spacing": "none" }
]
},
{
"type": "Column",
"width": "auto",
"verticalContentAlignment": "center",
"items": [
{ "type": "TextBlock", "text": "X Stories across Y Topics", "size": "small", "isSubtle": true, "horizontalAlignment": "right" }
]
}
]
}
]
},
{
"type": "TextBlock",
"text": "TL;DR",
"weight": "bolder",
"size": "large",
"spacing": "medium"
},
{ "type": "TextBlock", "text": "- TLDR bullet 1", "wrap": true },
{ "type": "TextBlock", "text": "- TLDR bullet 2", "wrap": true },
{ "type": "TextBlock", "text": "- TLDR bullet 3", "wrap": true },
{
"type": "TextBlock",
"text": "Full Briefing",
"weight": "bolder",
"size": "large",
"spacing": "large",
"separator": true
},
{
"type": "TextBlock",
"text": "Topic 1 (e.g. OpenAI)",
"weight": "bolder",
"size": "medium",
"spacing": "medium",
"color": "accent"
},
{ "type": "TextBlock", "text": "- First story in this topic: Details here. More details here.", "wrap": true, "spacing": "small" },
{ "type": "TextBlock", "text": "- Second story in this topic: Details here. More details here.", "wrap": true, "spacing": "small" },
{
"type": "TextBlock",
"text": "Topic 2 (e.g. Open Source AI)",
"weight": "bolder",
"size": "medium",
"spacing": "medium",
"color": "accent"
},
{ "type": "TextBlock", "text": "- First story in this topic: Details here. More details here.", "wrap": true, "spacing": "small" },
{
"type": "Container",
"style": "emphasis",
"spacing": "large",
"items": [
{ "type": "TextBlock", "text": "**Sources**", "size": "small", "weight": "bolder" },
{ "type": "TextBlock", "text": "[Source 1](url) | [Source 2](url) | [Source 3](url)", "size": "small", "isSubtle": true, "wrap": true }
]
}
],
"actions": [
{
"type": "Action.OpenUrl",
"title": "Open Full Briefing in Notion",
"url": "INSERT_NOTION_PAGE_URL_HERE",
"style": "positive"
}
]
}
}
]
}
Check if the AI_BRIEFING_OBSIDIAN_VAULT environment variable is set. If it has a value (e.g., /Users/you/Documents/ObsidianVault), you must generate a markdown file for the Obsidian vault.
Write the file to logs/YYYY-MM-DD-obsidian.md (e.g., logs/2026-03-09-obsidian.md).
CRITICAL RULES — formatting for Obsidian:
date, type: briefing, topics (list of top topics), and tags: [ai, news, briefing].> Related topics: [[Topic 1]] · [[Topic 2]].[[ ]] to create graph edges.
## [[OpenAI]] / [[Codex]]...announced by [[Anthropic]] today... or ...new benchmark for [[LLMs]]...Example Obsidian file structure:
---