Agent skill
atlas
Automate control of the ChatGPT Atlas desktop app on macOS via AppleScript. Manage tabs (list, open, close, focus, reload), search bookmarks, and query browsing history from Chromium-style local storage. Trigger when the user explicitly asks to control Atlas tabs, bookmarks, or history on macOS and the ChatGPT Atlas app is installed. Do not trigger for general browser tasks, non-macOS environments, or when the Atlas app is not present.
Install this agent skill to your Project
npx add-skill https://github.com/majiayu000/claude-skill-registry/tree/main/skills/other/atlas
Metadata
Additional technical details for this skill
- tags
-
automation macos applescript browser
- author
- platxa-skill-generator
- version
- 1.0.0
- provenance
-
{ "upstream_sha": "c0e08fdaa8ed6929110c97d1b867d101fd70218f", "regenerated_at": "2026-02-04T15:20:06+00:00", "upstream_source": "atlas", "generator_version": "1.0.0", "intent_confidence": 0.77 }
SKILL.md
Atlas Control (macOS)
Automate tab management, bookmark queries, and history search for the ChatGPT Atlas desktop app using a bundled Python CLI that drives AppleScript on macOS.
Overview
This skill wraps the ChatGPT Atlas desktop application with a Python CLI (atlas_cli.py) that communicates via osascript (AppleScript) for window/tab control and reads Chromium-style local storage for bookmarks and history.
What it automates:
- Tab listing, opening, closing, focusing, and reloading across Atlas windows
- Bookmark retrieval with folder hierarchy and text search
- Browsing history queries with date filtering and keyword search
- Atlas app detection and AppleScript capability probing
Prerequisites:
- macOS with
osascripton PATH - ChatGPT Atlas installed in
/Applicationsor~/Applications - Automation permission granted in System Settings > Privacy & Security > Automation
- Python 3.12+ (invoked via
uv run --python 3.12)
Triggers
When to Use
Invoke this skill when:
- The user asks to list, open, close, focus, or reload Atlas tabs
- The user wants to search or list Atlas bookmarks
- The user wants to query Atlas browsing history
- The user asks about Atlas app status or installed version
When Not to Use
Do not invoke when:
- The user refers to a standard web browser (Chrome, Safari, Firefox)
- The environment is not macOS (AppleScript is unavailable)
- The user asks about ChatGPT the web app (not the Atlas desktop client)
Process
Step 1: Set Up the CLI Path
Resolve the path to atlas_cli.py relative to the skill installation directory:
SKILL_DIR="${SKILL_DIR:-$HOME/.claude/skills/atlas}"
ATLAS_CLI="$SKILL_DIR/scripts/atlas_cli.py"
All CLI commands use uv run --python 3.12 python "$ATLAS_CLI" as the invocation prefix.
Step 2: Verify Atlas Is Installed
uv run --python 3.12 python "$ATLAS_CLI" app-name
This prints ChatGPT Atlas if the app bundle exists in /Applications or ~/Applications. If it fails, the user must install Atlas first.
Step 3: Execute the Requested Operation
Tab operations:
# List all open tabs (table format)
uv run --python 3.12 python "$ATLAS_CLI" tabs
# List tabs as JSON (for programmatic processing)
uv run --python 3.12 python "$ATLAS_CLI" tabs --json
# Open a new tab
uv run --python 3.12 python "$ATLAS_CLI" open-tab "https://chatgpt.com/"
# Focus a specific tab (window_id and tab_index from tabs output)
uv run --python 3.12 python "$ATLAS_CLI" focus-tab <window_id> <tab_index>
# Close a tab
uv run --python 3.12 python "$ATLAS_CLI" close-tab <window_id> <tab_index>
# Reload a tab
uv run --python 3.12 python "$ATLAS_CLI" reload-tab <window_id> <tab_index>
Bookmark operations:
# List bookmarks (default limit: 200)
uv run --python 3.12 python "$ATLAS_CLI" bookmarks --limit 100
# Search bookmarks by text
uv run --python 3.12 python "$ATLAS_CLI" bookmarks --search "docs"
# Output as JSON
uv run --python 3.12 python "$ATLAS_CLI" bookmarks --search "openai" --json
History operations:
# Search history by keywords
uv run --python 3.12 python "$ATLAS_CLI" history --search "openai docs" --limit 50
# History for today only (local time)
uv run --python 3.12 python "$ATLAS_CLI" history --today --limit 200 --json
# Full history dump
uv run --python 3.12 python "$ATLAS_CLI" history --limit 500
Verification
Success Indicators
app-namereturnsChatGPT Atlaswithout errortabsproduces a table with columns:A,window_id,tab,title,urlbookmarksreturns rows with:folder,name,url,date_addedhistoryreturns rows with:last_visited_at,title,url- Tab manipulation commands (
open-tab,focus-tab,close-tab,reload-tab) print a confirmation message
Failure Handling
| Error | Cause | Resolution |
|---|---|---|
osascript is not available on PATH |
Not running macOS | This skill requires macOS; cannot run on Linux/Windows |
Could not find ChatGPT Atlas |
App not installed | Install ChatGPT Atlas from OpenAI |
AppleScript error -1743 |
Missing Automation permission | Grant permission: System Settings > Privacy & Security > Automation |
does not appear to expose window/tab scripting |
Atlas version lacks AppleScript support | Update Atlas or check version compatibility |
SQLite database not found |
No browsing history yet | Open Atlas and browse pages first to populate history |
Local State file not found |
Atlas profile data missing | Launch Atlas at least once to create profile data |
Data Paths
Atlas stores Chromium-style profile data under:
~/Library/Application Support/com.openai.atlas/browser-data/host/
Key locations:
- Local State:
browser-data/host/Local State(JSON, containsprofile.last_used) - History:
browser-data/host/<profile>/History(SQLite, tableurls) - Bookmarks:
browser-data/host/<profile>/Bookmarks(JSON, Chromium format)
The active profile is resolved from profile.last_used in Local State, falling back to Default.
If history appears stale, check the beta data root as well:
~/Library/Application Support/com.openai.atlas.beta/browser-data/host/
The CLI copies the SQLite History database to a temporary location before querying to avoid lock contention with the running Atlas process.
Examples
Example 1: List Open Tabs and Find Duplicates
User: List all my Atlas tabs and call out duplicates.
Assistant: Let me list the open Atlas tabs.
[Runs: uv run --python 3.12 python "$ATLAS_CLI" tabs --json]
You have 12 tabs across 2 windows:
Window 1 (id: 4201):
1. ChatGPT — https://chatgpt.com/
2. OpenAI Docs — https://platform.openai.com/docs
3. ChatGPT — https://chatgpt.com/ [DUPLICATE of tab 1]
Window 2 (id: 4205):
1. GitHub — https://github.com/
...
Found 1 duplicate: "ChatGPT" appears in window 4201 tabs 1 and 3.
Example 2: Search History for Recent Visits
User: What OpenAI pages did I visit today?
Assistant: Searching today's Atlas history for "openai"...
[Runs: uv run --python 3.12 python "$ATLAS_CLI" history --today --search "openai" --limit 50]
Today's OpenAI visits (3 results):
2026-02-04 09:12 OpenAI Platform Docs https://platform.openai.com/docs
2026-02-04 10:45 API Reference https://platform.openai.com/docs/api-reference
2026-02-04 14:30 Pricing https://openai.com/pricing
Example 3: Close a Specific Tab
User: Close the pricing tab.
Assistant: I'll find and close that tab.
[Runs: uv run --python 3.12 python "$ATLAS_CLI" tabs --json]
Found "Pricing" at window_id=4205, tab_index=3.
[Runs: uv run --python 3.12 python "$ATLAS_CLI" close-tab 4205 3]
Closed window id 4205, tab 3.
Safety
Idempotency
Tab listing, bookmark queries, and history searches are read-only and fully idempotent. Tab manipulation operations (open, close, focus, reload) are not idempotent:
close-tabon an already-closed tab raises an AppleScript erroropen-tabcreates a new tab each time it runs
Reversibility
- Closed tabs cannot be reopened to the same position (use
open-tabwith the URL) - Bookmark and history queries are read-only and leave no side effects
- Tab focus changes are immediately reversible by focusing a different tab
Prerequisites Checklist
- Running on macOS
- ChatGPT Atlas installed in
/Applicationsor~/Applications - Terminal has Automation permission for Atlas in System Settings
- Python 3.12+ available via
uv
CLI Reference
| Command | Arguments | Description |
|---|---|---|
app-name |
(none) | Print detected Atlas app name |
tabs |
--json |
List open tabs across all windows |
open-tab |
<url> |
Open a new tab with the given URL |
focus-tab |
<window_id> <tab_index> |
Bring a tab to focus |
close-tab |
<window_id> <tab_index> |
Close a specific tab |
reload-tab |
<window_id> <tab_index> |
Reload a specific tab |
bookmarks |
--search <text> --limit <n> --json |
List or search bookmarks |
history |
--search <text> --today --limit <n> --json |
Search browsing history |
Notes
- The
window_idandtab_indexvalues come from thetabscommand output. Always list tabs first before operating on specific ones. - History timestamps use Chrome's epoch (microseconds since 1601-01-01). The CLI converts them to local time automatically.
- The
--jsonflag ontabs,bookmarks, andhistoryoutputs machine-readable JSON arrays for programmatic processing.
Recommended Agent Skills
Expand your agent's capabilities with these related and highly-rated skills.
agent-ops-spec
Manage specification documents in .agent/specs/. Use when user provides requirements, acceptance criteria, or feature descriptions that need to be tracked and validated against implementation.
agent-ops-state
Maintain .agent state files. Use at session start, after meaningful steps, and before concluding: read/update constitution/memory/focus/issues/baseline consistently.
agent-ops-spec
Manage specification documents in .agent/specs/. Use when user provides requirements, acceptance criteria, or feature descriptions that need to be tracked and validated against implementation.
agent-ops-testing
Test strategy, execution, and coverage analysis. Use when designing tests, running test suites, or analyzing test results beyond baseline checks.
agent-ops-testing
Test strategy, execution, and coverage analysis. Use when designing tests, running test suites, or analyzing test results beyond baseline checks.
agent-ops-state
Maintain .agent state files. Use at session start, after meaningful steps, and before concluding: read/update constitution/memory/focus/issues/baseline consistently.
Didn't find tool you were looking for?