Connects OpenClaw to Dazzle, an AI agent that deeply understands the user through their photos. Through a companion iOS app, Dazzle accesses their photos and...
---
name: dazzle-photo-intelligence
description: Connects OpenClaw to Dazzle, an AI agent that deeply understands the user through their photos. Through a companion iOS app, Dazzle accesses their photos and can understand who they are, where they live, their preferences, people in their lives, places they've been, and other personal choices. Auth is handled transparently by the bridge.
metadata: {"openclaw": {"requires": {"bins": ["uv"]}}}
---
# Dazzle Photo Intelligence
Connects OpenClaw to Dazzle, an AI agent that deeply understands the user through their
photos. Through a companion iOS app, Dazzle accesses their photos and can understand who
they are, where they live, their preferences, people in their lives, places they've been,
and other personal choices. Consult Dazzle for any query where personalization would
meaningfully improve the answer.
## When to use this skill
Consult Dazzle whenever knowing the user — their likes, places they've been, what piques
their attention — would improve the answer. Concrete categories:
- **Photos & memories** — "find food photos from today", "show sunsets from last weekend",
"send pictures from the user's last family vacation?"
- **Places** — "where does the user live", "what restaurants does the user enjoy", "where
has the user been"
- **Recommendations** — "where should the user go for his/her next vacation?", "suggest a
restaurant for tonight given what he/she usually likes"
- **Personal facts and summaries** — "What is the user's daughter's name?", "what did the
user do last weekend?", "summarize events and activities from my year so far"
- **Context-aware decisions** — "what gift would the user's father like?", "if the user is
in Denver, where should they go for a nicer meal?"
- **Context** — "what types of things does the user do when visiting NYC?", "what seems to
be the user's favorite color?", "what brands of clothes does the user buy?", "what sports
teams does the user cheer for?", "which celebrities does the user admire", "what types of
things has the user been thinking about purchasing recently", "what sports does the user
participate in or watch?"
Always invoke Dazzle when the user mentions it by name ("ask Dazzle to…", "what does Dazzle
know about…").
Do **not** invoke Dazzle for fully impersonal queries ("what's the capital of France",
"explain quicksort") — there's no personalization to add.
## Data access
This skill consults Dazzle on behalf of the signed-in user about *their own data* —
photos and context that user has previously shared with Dazzle. It does not access
anyone else's data.
**Why OAuth2 sign-in:** OAuth2 was chosen over static API keys specifically to avoid
long-lived secrets on disk. Tokens are short-lived, individually revocable per session,
scoped to the user's own account, and never handled or committed by the user.
Sign-in is browser-based on first use. After that, the bridge keeps the user signed
in across sessions — like a logged-in browser tab — so subsequent queries are silent.
Scope is read-only on the user's own Dazzle account: photos and metadata, places
visited, inferred preferences, self-referential context. Access is revocable at any
time (see Uninstall below, or sign out of Dazzle directly).
## First-run setup
The bridge runs locally as an MCP server registered with OpenClaw. Setup is a one-time
local configuration step — no background services, no system-wide install — and is
fully reversible (see Uninstall). Sign-in is a separate browser step that the bridge
initiates on the first tool call.
Each `openclaw mcp …` command below requires the user's explicit approval the first
time it runs — OpenClaw will prompt them at the permission gate.
Check whether the bridge is already registered as an OpenClaw MCP server:
```bash
openclaw mcp show dazzle
```
If that errors (server not registered), register it once:
1. Generate a random password to keep the local sign-in state encrypted at rest:
```bash
openssl rand -base64 24
```
2. Substitute the generated value for `<KEYRING_PASSWORD>` and the absolute path of
*this skill directory* (the one containing this `SKILL.md`) for `<SKILL_DIR>`, then
run:
```bash
openclaw mcp set dazzle '{"command":"uvx","args":["--from","<SKILL_DIR>","--with","keyrings.alt","dazzle"],"env":{"DAZZLE_KEYRING_PASSWORD":"<KEYRING_PASSWORD>"}}'
```
3. Confirm with `openclaw mcp show dazzle`, then proceed with the user's original query.
Re-running setup with a new password invalidates the previous sign-in; the user will
be prompted to sign in to Dazzle again.
## How to use it
The bridge surfaces only the tools that are callable right now: when the user is signed
in, real Dazzle tools appear in `tools/list`; when they aren't, only
`dazzle_login_required` appears. Call whichever tool fits the user's query — the bridge
will route it correctly.
If the bridge returns the `dazzle_login_required` tool (rare — only when stored tokens
are missing or revoked), surface the URL and short user code from its text **verbatim**
and ask the user to retry their query after approving in a browser. Don't generate this
prompt yourself; only react when the bridge returns it.
Matched photos come back as URLs in a `<photos>` JSON block, not inline bytes. Fetch
the URL to get the image bytes when you need to view, analyze, or include the image
in a response.
Photo lookups work best over short time windows — a day, a week, a single trip.
Year-spanning queries ("every food photo", "all sunsets from 2024") take significantly
longer; narrow the window when you can.
Queries can take up to 60 seconds end-to-end — set per-call timeouts accordingly.
## Uninstall
To remove the bridge:
```bash
openclaw mcp remove dazzle
```
That's it locally — the bridge is no longer reachable from OpenClaw, and any cached
sign-in state becomes unusable. Removing the MCP server also clears
`DAZZLE_KEYRING_PASSWORD` from `~/.openclaw/openclaw.json`, which renders the cached
OAuth tokens unrecoverable even if the keyring file remains on disk. To also revoke
the grant on Dazzle's side, the user can sign out of Dazzle from the browser or app.
don't have the plugin yet? install it then click "run inline in claude" again.
restructured into six explicit components (intent, inputs, procedure with numbered steps, decision points, output contract, outcome signal), made OAuth2 flow and edge cases (token expiry, timeouts, empty results) explicit, clarified when to invoke dazzle with concrete examples and counter-examples, and documented external connection details with revocation guidance.
Consult Dazzle when personalizing an answer with the user's own photos, places, preferences, or context would meaningfully improve the response. Dazzle is an AI agent with read-only access to the signed-in user's photo library and inferred metadata (places visited, preferences, people in their life). Use it for photo lookups, location history, personalized recommendations, and context-aware decisions. Do not use it for fully impersonal queries where the user is not the subject.
External connection: Dazzle API
DAZZLE_KEYRING_PASSWORDopenclaw mcp remove dazzleLocal dependencies
uv (required by OpenClaw MCP bridge)Runtime context
Check if Dazzle bridge is already registered as an OpenClaw MCP server:
openclaw mcp show dazzle
Input: none. Output: success message (bridge registered) or error (not registered).
If not registered, generate a random 24-byte base64 string to encrypt the keyring at rest:
openssl rand -base64 24
Input: none. Output: random password string (e.g., aBcDeFgHiJkLmNoPqRsTuVwXyZ==).
Identify the absolute filesystem path to this skill directory (the one containing this SKILL.md).
Input: none. Output: absolute path (e.g., /home/user/skills/dazzle-photo-intelligence).
Register the bridge with OpenClaw, substituting the password from step 2 and the path from step 3:
openclaw mcp set dazzle '{"command":"uvx","args":["--from","<SKILL_DIR>","--with","keyrings.alt","dazzle"],"env":{"DAZZLE_KEYRING_PASSWORD":"<KEYRING_PASSWORD>"}}'
Input: <KEYRING_PASSWORD> (from step 2), <SKILL_DIR> (from step 3). Output: MCP server registered (no error).
Confirm registration:
openclaw mcp show dazzle
Input: none. Output: server details (confirms bridge is live).
Proceed with the user's original query (step 7 below). OpenClaw will prompt the user for permission the first time this skill is invoked.
Evaluate the user's query against decision points below to determine whether to invoke Dazzle. Input: user query text. Output: boolean (invoke Dazzle: yes or no).
If invoking Dazzle, call the appropriate tool from tools/list that the bridge surfaced. If the user is signed in, real Dazzle tools appear; if not, only dazzle_login_required appears.
Input: tool name (e.g., search_photos, get_places, get_personal_facts), query parameters (e.g., time window, query string). Output: tool response (photo URLs, place names, facts, or login prompt).
If the response is dazzle_login_required (rare, indicates stored OAuth token is missing or revoked), surface the URL and short user code verbatim from the response text. Ask the user to approve the grant in a browser, then retry the original query.
Input: dazzle_login_required response. Output: user-facing message with login URL and code.
If the response contains photo matches, URLs are returned in a <photos> JSON block (not inline bytes). Fetch each URL via HTTP GET if you need to view, analyze, or include the image in a response.
Input: <photos> block with URL list. Output: binary image data (via HTTP fetch) or URL pass-through to user.
Await the tool response (up to 60 seconds end-to-end). If timeout occurs (network issue, Dazzle API latency, or query complexity), inform the user and suggest narrowing the time window (e.g., "try photos from today instead of all of 2024") or retrying. Input: tool call (HTTP to Dazzle API). Output: response data or timeout error.
Return the result to the user in plain language, incorporating photos, places, or facts as appropriate. Input: tool response. Output: human-readable answer (text, plus photo URLs or inline images if relevant).
Invoke Dazzle if:
Concrete examples to invoke:
Do NOT invoke Dazzle if:
If token is expired or revoked:
dazzle_login_required.If query takes longer than expected (approaching 60 seconds):
On success (user signed in, query matched):
<photos> JSON block, place names/metadata as JSON, personal facts as text, or recommendations as JSON.On auth required (OAuth token missing/revoked):
dazzle_login_required with a text field containing a login URL and short user code.On timeout or API error:
On query not matched:
{"photos":[]}, {"places":[]}).The skill worked if:
The skill failed if:
Uninstall: To remove the bridge, run openclaw mcp remove dazzle. This clears the local MCP registration and renders cached OAuth tokens unrecoverable (even if the keyring file remains on disk). To also revoke access on Dazzle's side, sign out of Dazzle in the browser or app.