.claude/skills/exa-monitor/SKILL.md
Scheduled Exa web search monitor. Uses CronCreate to search configured topics every 4 hours via mcp__Exa__web_search_exa, deduplicates URLs via MemoryRecord, and stores summaries for morning briefing integration.
npx skillsauth add oimiragieo/agent-studio exa-monitorInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Polls the Exa search engine every 4 hours for topics configured in EXA_MONITOR_TOPICS. Deduplicates results against previously seen URLs, stores new summaries in named memory, and integrates with the morning briefing loop.
Set EXA_MONITOR_TOPICS in .env:
EXA_MONITOR_TOPICS=["Claude AI updates","agent frameworks","LLM tooling","AI safety"]
Start the monitor loop:
/loop 4h Skill({ skill: 'exa-monitor' })
Or via CronCreate:
CronCreate({
schedule: '0 */4 * * *',
task: "Invoke Skill({ skill: 'exa-monitor' }) to fetch new Exa search results",
});
let topics;
try {
topics = JSON.parse(process.env.EXA_MONITOR_TOPICS || '["Claude AI updates","agent frameworks"]');
} catch (_e) {
topics = ['Claude AI updates', 'agent frameworks'];
}
// Load previously seen URLs from memory
const seenRaw = await readMemory('exa-seen-urls');
const seenUrls = new Set(seenRaw ? JSON.parse(seenRaw) : []);
// Use Exa MCP tool (preferred — returns structured results)
// Skill({ skill: 'exa-monitor' }) invokes mcp__Exa__web_search_exa internally:
// mcp__Exa__web_search_exa({ query: topic, numResults: 5, useAutoprompt: true })
// Falls back to mcp__Exa__get_code_context_exa for technical topics
const newResults = [];
for (const result of exaResults) {
if (seenUrls.has(result.url)) continue;
seenUrls.add(result.url);
newResults.push({
title: result.title,
url: result.url,
summary: result.text?.slice(0, 400) || result.highlights?.join(' ') || '',
topic,
publishedDate: result.publishedDate,
});
}
// Persist seen URLs via named memory (cap at 2000)
const seenArr = [...seenUrls].slice(-2000);
await writeMemory('exa-seen-urls', JSON.stringify(seenArr));
if (newResults.length > 0) {
const digest = newResults
.map(
r =>
`## ${r.title}\n**Topic:** ${r.topic}\n**Published:** ${r.publishedDate || 'unknown'}\n${r.summary}...\n[Read →](${r.url})\n`
)
.join('\n---\n');
// Append to exa-digest.md
const existing = fs.existsSync('.claude/context/memory/named/exa-digest.md')
? fs.readFileSync('.claude/context/memory/named/exa-digest.md', 'utf8')
: '';
fs.writeFileSync(
'.claude/context/memory/named/exa-digest.md',
`${existing}\n\n## Exa Update — ${new Date().toISOString().slice(0, 10)}\n\n${digest}`
);
}
/loop at 8:00am Read .claude/context/memory/named/exa-digest.md and arxiv-digest.md. Summarize the most relevant news and papers for agent-studio development. Highlight any urgent developments.
| Variable | Default | Description |
| -------------------- | ----------------------- | ---------------------------------------- |
| EXA_MONITOR_TOPICS | ["Claude AI updates"] | JSON array of search topics |
| EXA_MAX_RESULTS | 5 | Max results per topic per run |
| EXA_AUTOPROMPT | true | Let Exa optimize the query automatically |
writeMemory('exa-seen-urls', ...) (named memory API)await writeMemory('exa-seen-urls', '[]')scheduled-tasks — CronCreate APIarxiv-monitor — ArXiv companion monitor for academic papersheartbeat — Full heartbeat ecosystem including this loopmemory-search — Search the exa-digest for specific topicstools
Comprehensive biosignal processing toolkit for analyzing physiological data including ECG, EEG, EDA, RSP, PPG, EMG, and EOG signals. Use this skill when processing cardiovascular signals, brain activity, electrodermal responses, respiratory patterns, muscle activity, or eye movements. Applicable for heart rate variability analysis, event-related potentials, complexity measures, autonomic nervous system assessment, psychophysiology research, and multi-modal physiological signal integration.
tools
Comprehensive toolkit for creating, analyzing, and visualizing complex networks and graphs in Python. Use when working with network/graph data structures, analyzing relationships between entities, computing graph algorithms (shortest paths, centrality, clustering), detecting communities, generating synthetic networks, or visualizing network topologies. Applicable to social networks, biological networks, transportation systems, citation networks, and any domain involving pairwise relationships.
data-ai
Molecular featurization for ML (100+ featurizers). ECFP, MACCS, descriptors, pretrained models (ChemBERTa), convert SMILES to features, for QSAR and molecular ML.
development
Run Python code in the cloud with serverless containers, GPUs, and autoscaling. Use when deploying ML models, running batch processing jobs, scheduling compute-intensive tasks, or serving APIs that require GPU acceleration or dynamic scaling.