{"id":"18060d13-3196-4155-9616-c5fe1daf960c","entityType":"agent","slug":"clawhub-dazzle-dazzle-photo-intelligence","name":"Dazzle Photo Intelligence","canonicalUrl":"https://www.xpersona.co/agent/clawhub-dazzle-dazzle-photo-intelligence","canonicalPath":"/agent/clawhub-dazzle-dazzle-photo-intelligence","generatedAt":"2026-10-11T04:35:00.143Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-11T02:10:33.482Z","emptyReason":null},"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... Skill: Dazzle Photo Intelligence Owner: dazzle Summary: 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... Tags: latest:0.1.9 Version history: v0.1.9 | 2026-05-21T01:06:47.494Z | user Clarify usage guidance v0.1.8 | 2026-05-20T23:04:40.284Z | user Clarify usage guidance v0.1.7 | 2026-05-20T22:45:47.544Z | use","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.2K downloads reported by the source. Last updated 10/11/2026.","installCommand":"clawhub skill install s17e3jhtejw51927f93bqcfd5986jqqq:dazzle-photo-intelligence","sourceUrl":"https://clawhub.ai/dazzle/dazzle-photo-intelligence","homepage":"https://clawhub.ai/dazzle/skills/dazzle-photo-intelligence","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/dazzle/dazzle-photo-intelligence","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/dazzle/skills/dazzle-photo-intelligence","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":62,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"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..."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-11T02:10:33.482Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T02:10:33.482Z","emptyReason":null},"stars":null,"forks":null,"downloads":1194,"packageName":null,"latestVersion":"0.1.9","tractionLabel":"1.2K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T02:10:33.420Z","emptyReason":null},"lastUpdatedAt":"2026-10-11T02:10:33.482Z","lastCrawledAt":"2026-10-11T02:10:33.420Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-12T02:10:33.420Z","lastVerifiedAt":null,"highlights":[{"version":"0.1.9","createdAt":"2026-05-21T01:06:47.494Z","changelog":"Clarify usage guidance","fileCount":11,"zipByteSize":14058},{"version":"0.1.8","createdAt":"2026-05-20T23:04:40.284Z","changelog":"Clarify usage guidance","fileCount":10,"zipByteSize":12731},{"version":"0.1.7","createdAt":"2026-05-20T22:45:47.544Z","changelog":"Clarify usage guidance","fileCount":10,"zipByteSize":12730},{"version":"0.1.6","createdAt":"2026-05-19T03:27:36.221Z","changelog":"Fix API host resolution to always use dazzle.ai, remove stale cached host from storage","fileCount":10,"zipByteSize":12575},{"version":"0.1.5","createdAt":"2026-05-19T02:12:42.194Z","changelog":"Update OAuth client ID to openclaw-dazzle-skill","fileCount":10,"zipByteSize":12585},{"version":"0.1.4","createdAt":"2026-05-19T01:54:20.647Z","changelog":"Exclude tests from published package","fileCount":10,"zipByteSize":12581},{"version":"0.1.3","createdAt":"2026-05-19T01:28:40.262Z","changelog":"Update description and switch API host to dazzle.ai","fileCount":13,"zipByteSize":17399},{"version":"0.1.2","createdAt":"2026-05-14T23:10:30.009Z","changelog":"- Updated SKILL.md to clarify Dazzle as a consulting agent and streamlined descriptions of authentication (now described as transparent). - Improved explanation of tool surfacing: only callable tools are listed depending on sign-in state. - Modified instructions: preflight auth checks and explicit sign-in prompts are not needed; the bridge handles all logic. - General copy edits: more concise language, clearer separation of usage, data access, and uninstall instructions.","fileCount":9,"zipByteSize":12201}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17e3jhtejw51927f93bqcfd5986jqqq:dazzle-photo-intelligence","setupComplexity":"medium","setupSteps":["Python environment detected. Create a strict virtual environment (`python -m venv .venv`) before installing dependencies to prevent system-level package conflicts.","Setup complexity is classified as HIGH. You must provision dedicated cloud infrastructure or an isolated VM. Do not run this directly on your local workstation.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-dazzle-dazzle-photo-intelligence/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-dazzle-dazzle-photo-intelligence/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-dazzle-dazzle-photo-intelligence/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-dazzle-dazzle-photo-intelligence/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-dazzle-dazzle-photo-intelligence/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-dazzle-dazzle-photo-intelligence/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-11T04:35:00.141Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-dazzle-dazzle-photo-intelligence/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-dazzle-dazzle-photo-intelligence/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-dazzle-dazzle-photo-intelligence/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-dazzle-dazzle-photo-intelligence/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-11T02:10:33.482Z","emptyReason":null},"readme":"Skill: Dazzle Photo Intelligence\n\nOwner: dazzle\n\nSummary: 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...\n\nTags: latest:0.1.9\n\nVersion history:\n\nv0.1.9 | 2026-05-21T01:06:47.494Z | user\n\nClarify usage guidance\n\nv0.1.8 | 2026-05-20T23:04:40.284Z | user\n\nClarify usage guidance\n\nv0.1.7 | 2026-05-20T22:45:47.544Z | user\n\nClarify usage guidance\n\nv0.1.6 | 2026-05-19T03:27:36.221Z | user\n\nFix API host resolution to always use dazzle.ai, remove stale cached host from storage\n\nv0.1.5 | 2026-05-19T02:12:42.194Z | user\n\nUpdate OAuth client ID to openclaw-dazzle-skill\n\nv0.1.4 | 2026-05-19T01:54:20.647Z | user\n\nExclude tests from published package\n\nv0.1.3 | 2026-05-19T01:28:40.262Z | user\n\nUpdate description and switch API host to dazzle.ai\n\nv0.1.2 | 2026-05-14T23:10:30.009Z | auto\n\n- Updated SKILL.md to clarify Dazzle as a consulting agent and streamlined descriptions of authentication (now described as transparent).\n- Improved explanation of tool surfacing: only callable tools are listed depending on sign-in state.\n- Modified instructions: preflight auth checks and explicit sign-in prompts are not needed; the bridge handles all logic.\n- General copy edits: more concise language, clearer separation of usage, data access, and uninstall instructions.\n\nv0.1.1 | 2026-05-14T21:48:43.610Z | auto\n\n- Initial public release of dazzle-photo-intelligence.\n- Added Python package structure and core modules (`__init__.py`, `cli.py`, `proxy.py`, `storage.py`).\n- Included setup files: `pyproject.toml`, `LICENSE`, and `README.md`.\n- SKILL.md expanded with detailed setup, data access, and uninstall instructions.\n- Outlines OAuth2 sign-in flow and local bridge registration for secure and user-owned data handling.\n\nv0.1.0 | 2026-05-14T20:58:19.077Z | auto\n\n- Initial release of dazzle-photo-intelligence skill.\n- Enables deep personalization by leveraging the user's photos, places visited, and inferred preferences for more relevant responses.\n- Integrates with Dazzle through OpenClaw with seamless, bridge-managed authentication and token caching.\n- Designed to improve queries involving memories, locations, recommendations, summaries, and context-aware decisions.\n- Includes detailed setup instructions for auto-installation and usage best practices.\n\nArchive index:\n\nArchive v0.1.9: 11 files, 14058 bytes\n\nFiles: dazzle_photo_intelligence/__init__.py (94b), dazzle_photo_intelligence/cli.py (716b), dazzle_photo_intelligence/proxy.py (18885b), dazzle_photo_intelligence/storage.py (3739b), LICENSE (1072b), Makefile (357b), pyproject.toml (777b), README.md (418b), skill-card.md (2229b), SKILL.md (6224b), _meta.json (144b)\n\nFile v0.1.9:SKILL.md\n\n---\nname: dazzle-photo-intelligence\ndescription: 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.\nmetadata: {\"openclaw\": {\"requires\": {\"bins\": [\"uv\"]}}}\n---\n\n# Dazzle Photo Intelligence\n\nConnects OpenClaw to Dazzle, an AI agent that deeply understands the user through their\nphotos. Through a companion iOS app, Dazzle accesses their photos and can understand who\nthey are, where they live, their preferences, people in their lives, places they've been,\nand other personal choices. Consult Dazzle for any query where personalization would\nmeaningfully improve the answer.\n\n## When to use this skill\n\nConsult Dazzle whenever knowing the user — their likes, places they've been, what piques\ntheir attention — would improve the answer. Concrete categories:\n\n- **Photos & memories** — \"find food photos from today\", \"show sunsets from last weekend\",\n  \"send pictures from the user's last family vacation?\"\n- **Places** — \"where does the user live\", \"what restaurants does the user enjoy\", \"where\n  has the user been\"\n- **Recommendations** — \"where should the user go for his/her next vacation?\", \"suggest a\n  restaurant for tonight given what he/she usually likes\"\n- **Personal facts and summaries** — \"What is the user's daughter's name?\", \"what did the\n  user do last weekend?\", \"summarize events and activities from my year so far\"\n- **Context-aware decisions** — \"what gift would the user's father like?\", \"if the user is\n  in Denver, where should they go for a nicer meal?\"\n- **Context** — \"what types of things does the user do when visiting NYC?\", \"what seems to\n  be the user's favorite color?\", \"what brands of clothes does the user buy?\", \"what sports\n  teams does the user cheer for?\", \"which celebrities does the user admire\", \"what types of\n  things has the user been thinking about purchasing recently\", \"what sports does the user\n  participate in or watch?\"\n\nAlways invoke Dazzle when the user mentions it by name (\"ask Dazzle to…\", \"what does Dazzle\nknow about…\").\n\nDo **not** invoke Dazzle for fully impersonal queries (\"what's the capital of France\",\n\"explain quicksort\") — there's no personalization to add.\n\n## Data access\n\nThis skill consults Dazzle on behalf of the signed-in user about *their own data* —\nphotos and context that user has previously shared with Dazzle. It does not access\nanyone else's data.\n\n**Why OAuth2 sign-in:** OAuth2 was chosen over static API keys specifically to avoid\nlong-lived secrets on disk. Tokens are short-lived, individually revocable per session,\nscoped to the user's own account, and never handled or committed by the user.\n\nSign-in is browser-based on first use. After that, the bridge keeps the user signed\nin across sessions — like a logged-in browser tab — so subsequent queries are silent.\n\nScope is read-only on the user's own Dazzle account: photos and metadata, places\nvisited, inferred preferences, self-referential context. Access is revocable at any\ntime (see Uninstall below, or sign out of Dazzle directly).\n\n## First-run setup\n\nThe bridge runs locally as an MCP server registered with OpenClaw. Setup is a one-time\nlocal configuration step — no background services, no system-wide install — and is\nfully reversible (see Uninstall). Sign-in is a separate browser step that the bridge\ninitiates on the first tool call.\n\nEach `openclaw mcp …` command below requires the user's explicit approval the first\ntime it runs — OpenClaw will prompt them at the permission gate.\n\nCheck whether the bridge is already registered as an OpenClaw MCP server:\n\n```bash\nopenclaw mcp show dazzle\n```\n\nIf that errors (server not registered), register it once:\n\n1. Generate a random password to keep the local sign-in state encrypted at rest:\n\n   ```bash\n   openssl rand -base64 24\n   ```\n\n2. Substitute the generated value for `<KEYRING_PASSWORD>` and the absolute path of\n   *this skill directory* (the one containing this `SKILL.md`) for `<SKILL_DIR>`, then\n   run:\n\n   ```bash\n   openclaw mcp set dazzle '{\"command\":\"uvx\",\"args\":[\"--from\",\"<SKILL_DIR>\",\"--with\",\"keyrings.alt\",\"dazzle\"],\"env\":{\"DAZZLE_KEYRING_PASSWORD\":\"<KEYRING_PASSWORD>\"}}'\n   ```\n\n3. Confirm with `openclaw mcp show dazzle`, then proceed with the user's original query.\n\nRe-running setup with a new password invalidates the previous sign-in; the user will\nbe prompted to sign in to Dazzle again.\n\n## How to use it\n\nThe bridge surfaces only the tools that are callable right now: when the user is signed\nin, real Dazzle tools appear in `tools/list`; when they aren't, only\n`dazzle_login_required` appears. Call whichever tool fits the user's query — the bridge\nwill route it correctly.\n\nIf the bridge returns the `dazzle_login_required` tool (rare — only when stored tokens\nare missing or revoked), surface the URL and short user code from its text **verbatim**\nand ask the user to retry their query after approving in a browser. Don't generate this\nprompt yourself; only react when the bridge returns it.\n\nMatched photos come back as URLs in a `<photos>` JSON block, not inline bytes. Fetch\nthe URL to get the image bytes when you need to view, analyze, or include the image\nin a response.\n\nPhoto lookups work best over short time windows — a day, a week, a single trip.\nYear-spanning queries (\"every food photo\", \"all sunsets from 2024\") take significantly\nlonger; narrow the window when you can.\n\nQueries can take up to 60 seconds end-to-end — set per-call timeouts accordingly.\n\n## Uninstall\n\nTo remove the bridge:\n\n```bash\nopenclaw mcp remove dazzle\n```\n\nThat's it locally — the bridge is no longer reachable from OpenClaw, and any cached\nsign-in state becomes unusable. Removing the MCP server also clears\n`DAZZLE_KEYRING_PASSWORD` from `~/.openclaw/openclaw.json`, which renders the cached\nOAuth tokens unrecoverable even if the keyring file remains on disk. To also revoke\nthe grant on Dazzle's side, the user can sign out of Dazzle from the browser or app.\n\nFile v0.1.9:README.md\n\n# OpenClaw Bridge\n\nStdio MCP server that authenticates with [Dazzle](https://dazzle.ai) over OAuth2 and\nforwards calls from your local agent to Dazzle's hosted MCP endpoint.\n\n## Signing in\n\nThe first time your agent queries Dazzle you'll receive a sign-in URL and a short code.\nOpen the URL, enter the code, approve. Your tokens are kept in your OS keyring;\nsubsequent sessions are silent.\n\n## License\n\n[MIT](LICENSE)\n\nFile v0.1.9:_meta.json\n\n{\n  \"ownerId\": \"kn7fp4hetweckhrknegq2yzba986ktj0\",\n  \"slug\": \"dazzle-photo-intelligence\",\n  \"version\": \"0.1.9\",\n  \"publishedAt\": 1779325607494\n}\n\nFile v0.1.9:skill-card.md\n\n## Description:\n\nConnects OpenClaw to Dazzle, an AI agent that deeply understands the user through their photos.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[dazzle](https://clawhub.ai/user/dazzle)\n\n### License/Terms of Use:\n\nMIT\n\n## Use Case:\n\nExternal users and agent operators use this skill to let an MCP-capable agent query Dazzle for photo-derived personal context, memories, places, preferences, and recommendations after the user signs in.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Dazzle receives sensitive personalization queries and can use photo-derived account context after a one-time sign-in.\n\nMitigation: Use the skill only when photo-derived personalization is intended, prefer explicit prompts such as 'ask Dazzle' for sensitive topics, and revoke Dazzle account access when it is no longer needed.\n\nRisk: Matched photos are returned as URLs that an agent may fetch for viewing, analysis, or inclusion in responses.\n\nMitigation: Fetch returned photo URLs only when the user request requires the image content, and treat those URLs as sensitive personal data.\n\nRisk: Subsequent sessions can be silent after the first browser-based sign-in.\n\nMitigation: Review the registered MCP server configuration and remove the Dazzle bridge or sign out of Dazzle when silent access is no longer appropriate.\n\n## Reference(s):\n\n- [ClawHub skill listing](https://clawhub.ai/dazzle/skills/dazzle-photo-intelligence)\n- [Dazzle](https://dazzle.ai)\n\n## Skill Output:\n\n**Output Type(s):** [text, json, shell commands, configuration, guidance]\n\n**Output Format:** [MCP text responses, JSON photo URL blocks, and Markdown setup guidance with inline shell commands]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May require a browser-based OAuth sign-in; queries can take up to 60 seconds.]\n\n## Skill Version(s):\n\n0.1.9 (source: pyproject.toml and server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v0.1.9:pyproject.toml\n\n[project]\nname = \"dazzle-photo-intelligence\"\nversion = \"0.1.9\"\ndescription = \"OAuth device-flow CLI and stdio MCP server that lets agents query Dazzle's remote photo intelligence MCP endpoint\"\nlicense = { file = \"LICENSE\" }\nrequires-python = \">=3.12\"\ndependencies = [\n    \"mcp>=1.27\",\n    \"httpx>=0.28\",\n    \"keyring>=25.7\",\n    \"keyrings.alt>=5\",\n]\n\n[project.optional-dependencies]\ndev = [\n    \"pytest>=9.0\",\n    \"pytest-asyncio>=1.3\",\n    \"ruff>=0.15\",\n]\n\n[project.scripts]\ndazzle = \"dazzle_photo_intelligence.cli:main\"\n\n[build-system]\nrequires = [\"hatchling\"]\nbuild-backend = \"hatchling.build\"\n\n[tool.hatch.build.targets.wheel]\npackages = [\"dazzle_photo_intelligence\"]\n\n[tool.ruff]\nline-length = 120\ntarget-version = \"py312\"\n\n[tool.pytest.ini_options]\nasyncio_mode = \"auto\"\n\nFile v0.1.9:LICENSE\n\nMIT License\n\nCopyright (c) 2026 Hemanth Sunkara\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\nArchive v0.1.8: 10 files, 12731 bytes\n\nFiles: dazzle_photo_intelligence/__init__.py (94b), dazzle_photo_intelligence/cli.py (716b), dazzle_photo_intelligence/proxy.py (18885b), dazzle_photo_intelligence/storage.py (3739b), LICENSE (1072b), Makefile (357b), pyproject.toml (777b), README.md (418b), SKILL.md (6006b), _meta.json (144b)\n\nFile v0.1.8:SKILL.md\n\n---\nname: dazzle-photo-intelligence\ndescription: 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.\nmetadata: {\"openclaw\": {\"requires\": {\"bins\": [\"uv\"]}}}\n---\n\n# Dazzle Photo Intelligence\n\nConnects OpenClaw to Dazzle, an AI agent that deeply understands the user through their\nphotos. Through a companion iOS app, Dazzle accesses their photos and can understand who\nthey are, where they live, their preferences, people in their lives, places they've been,\nand other personal choices. Consult Dazzle for any query where personalization would\nmeaningfully improve the answer.\n\n## When to use this skill\n\nConsult Dazzle whenever knowing the user — their likes, places they've been, what piques\ntheir attention — would improve the answer. Concrete categories:\n\n- **Photos & memories** — \"find food photos from today\", \"show sunsets from 2024\", \"send\n  pictures from the user's last family vacation?\"\n- **Places** — \"where does the user live\", \"what restaurants does the user enjoy\", \"where\n  has the user been\"\n- **Recommendations** — \"where should the user go for his/her next vacation?\", \"suggest a\n  restaurant for tonight given what he/she usually likes\"\n- **Personal facts and summaries** — \"What is the user's daughter's name?\", \"what did the\n  user do last weekend?\", \"summarize events and activities from my year so far\"\n- **Context-aware decisions** — \"what gift would the user's father like?\", \"if the user is\n  in Denver, where should they go for a nicer meal?\"\n- **Context** — \"what types of things does the user do when visiting NYC?\", \"what seems to\n  be the user's favorite color?\", \"what brands of clothes does the user buy?\", \"what sports\n  teams does the user cheer for?\", \"which celebrities does the user admire\", \"what types of\n  things has the user been thinking about purchasing recently\", \"what sports does the user\n  participate in or watch?\"\n\nAlways invoke Dazzle when the user mentions it by name (\"ask Dazzle to…\", \"what does Dazzle\nknow about…\").\n\nDo **not** invoke Dazzle for fully impersonal queries (\"what's the capital of France\",\n\"explain quicksort\") — there's no personalization to add.\n\n## Data access\n\nThis skill consults Dazzle on behalf of the signed-in user about *their own data* —\nphotos and context that user has previously shared with Dazzle. It does not access\nanyone else's data.\n\n**Why OAuth2 sign-in:** OAuth2 was chosen over static API keys specifically to avoid\nlong-lived secrets on disk. Tokens are short-lived, individually revocable per session,\nscoped to the user's own account, and never handled or committed by the user.\n\nSign-in is browser-based on first use. After that, the bridge keeps the user signed\nin across sessions — like a logged-in browser tab — so subsequent queries are silent.\n\nScope is read-only on the user's own Dazzle account: photos and metadata, places\nvisited, inferred preferences, self-referential context. Access is revocable at any\ntime (see Uninstall below, or sign out of Dazzle directly).\n\n## First-run setup\n\nThe bridge runs locally as an MCP server registered with OpenClaw. Setup is a one-time\nlocal configuration step — no background services, no system-wide install — and is\nfully reversible (see Uninstall). Sign-in is a separate browser step that the bridge\ninitiates on the first tool call.\n\nEach `openclaw mcp …` command below requires the user's explicit approval the first\ntime it runs — OpenClaw will prompt them at the permission gate.\n\nCheck whether the bridge is already registered as an OpenClaw MCP server:\n\n```bash\nopenclaw mcp show dazzle\n```\n\nIf that errors (server not registered), register it once:\n\n1. Generate a random password to keep the local sign-in state encrypted at rest:\n\n   ```bash\n   openssl rand -base64 24\n   ```\n\n2. Substitute the generated value for `<KEYRING_PASSWORD>` and the absolute path of\n   *this skill directory* (the one containing this `SKILL.md`) for `<SKILL_DIR>`, then\n   run:\n\n   ```bash\n   openclaw mcp set dazzle '{\"command\":\"uvx\",\"args\":[\"--from\",\"<SKILL_DIR>\",\"--with\",\"keyrings.alt\",\"dazzle\"],\"env\":{\"DAZZLE_KEYRING_PASSWORD\":\"<KEYRING_PASSWORD>\"}}'\n   ```\n\n3. Confirm with `openclaw mcp show dazzle`, then proceed with the user's original query.\n\nRe-running setup with a new password invalidates the previous sign-in; the user will\nbe prompted to sign in to Dazzle again.\n\n## How to use it\n\nThe bridge surfaces only the tools that are callable right now: when the user is signed\nin, real Dazzle tools appear in `tools/list`; when they aren't, only\n`dazzle_login_required` appears. Call whichever tool fits the user's query — the bridge\nwill route it correctly.\n\nIf the bridge returns the `dazzle_login_required` tool (rare — only when stored tokens\nare missing or revoked), surface the URL and short user code from its text **verbatim**\nand ask the user to retry their query after approving in a browser. Don't generate this\nprompt yourself; only react when the bridge returns it.\n\nMatched photos come back as URLs in a `<photos>` JSON block, not inline bytes. Fetch\nthe URL to get the image bytes when you need to view, analyze, or include the image\nin a response.\n\nQueries can take up to 60 seconds end-to-end — set per-call timeouts accordingly.\n\n## Uninstall\n\nTo remove the bridge:\n\n```bash\nopenclaw mcp remove dazzle\n```\n\nThat's it locally — the bridge is no longer reachable from OpenClaw, and any cached\nsign-in state becomes unusable. Removing the MCP server also clears\n`DAZZLE_KEYRING_PASSWORD` from `~/.openclaw/openclaw.json`, which renders the cached\nOAuth tokens unrecoverable even if the keyring file remains on disk. To also revoke\nthe grant on Dazzle's side, the user can sign out of Dazzle from the browser or app.\n\nFile v0.1.8:README.md\n\n# OpenClaw Bridge\n\nStdio MCP server that authenticates with [Dazzle](https://dazzle.ai) over OAuth2 and\nforwards calls from your local agent to Dazzle's hosted MCP endpoint.\n\n## Signing in\n\nThe first time your agent queries Dazzle you'll receive a sign-in URL and a short code.\nOpen the URL, enter the code, approve. Your tokens are kept in your OS keyring;\nsubsequent sessions are silent.\n\n## License\n\n[MIT](LICENSE)\n\nFile v0.1.8:_meta.json\n\n{\n  \"ownerId\": \"kn7fp4hetweckhrknegq2yzba986ktj0\",\n  \"slug\": \"dazzle-photo-intelligence\",\n  \"version\": \"0.1.8\",\n  \"publishedAt\": 1779318280284\n}\n\nFile v0.1.8:pyproject.toml\n\n[project]\nname = \"dazzle-photo-intelligence\"\nversion = \"0.1.8\"\ndescription = \"OAuth device-flow CLI and stdio MCP server that lets agents query Dazzle's remote photo intelligence MCP endpoint\"\nlicense = { file = \"LICENSE\" }\nrequires-python = \">=3.12\"\ndependencies = [\n    \"mcp>=1.27\",\n    \"httpx>=0.28\",\n    \"keyring>=25.7\",\n    \"keyrings.alt>=5\",\n]\n\n[project.optional-dependencies]\ndev = [\n    \"pytest>=9.0\",\n    \"pytest-asyncio>=1.3\",\n    \"ruff>=0.15\",\n]\n\n[project.scripts]\ndazzle = \"dazzle_photo_intelligence.cli:main\"\n\n[build-system]\nrequires = [\"hatchling\"]\nbuild-backend = \"hatchling.build\"\n\n[tool.hatch.build.targets.wheel]\npackages = [\"dazzle_photo_intelligence\"]\n\n[tool.ruff]\nline-length = 120\ntarget-version = \"py312\"\n\n[tool.pytest.ini_options]\nasyncio_mode = \"auto\"\n\nFile v0.1.8:LICENSE\n\nMIT License\n\nCopyright (c) 2026 Hemanth Sunkara\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\nArchive v0.1.7: 10 files, 12730 bytes\n\nFiles: dazzle_photo_intelligence/__init__.py (94b), dazzle_photo_intelligence/cli.py (716b), dazzle_photo_intelligence/proxy.py (18885b), dazzle_photo_intelligence/storage.py (3739b), LICENSE (1072b), Makefile (357b), pyproject.toml (777b), README.md (418b), SKILL.md (6006b), _meta.json (144b)\n\nFile v0.1.7:SKILL.md\n\n---\nname: dazzle-photo-intelligence\ndescription: 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.\nmetadata: {\"openclaw\": {\"requires\": {\"bins\": [\"uv\"]}}}\n---\n\n# Dazzle Photo Intelligence\n\nConnects OpenClaw to Dazzle, an AI agent that deeply understands the user through their\nphotos. Through a companion iOS app, Dazzle accesses their photos and can understand who\nthey are, where they live, their preferences, people in their lives, places they've been,\nand other personal choices. Consult Dazzle for any query where personalization would\nmeaningfully improve the answer.\n\n## When to use this skill\n\nConsult Dazzle whenever knowing the user — their likes, places they've been, what piques\ntheir attention — would improve the answer. Concrete categories:\n\n- **Photos & memories** — \"find food photos from today\", \"show sunsets from 2024\", \"send\n  pictures from the user's last family vacation?\"\n- **Places** — \"where does the user live\", \"what restaurants does the user enjoy\", \"where\n  has the user been\"\n- **Recommendations** — \"where should the user go for his/her next vacation?\", \"suggest a\n  restaurant for tonight given what he/she usually likes\"\n- **Personal facts and summaries** — \"What is the user's daughter's name?\", \"what did the\n  user do last weekend?\", \"summarize events and activities from my year so far\"\n- **Context-aware decisions** — \"what gift would the user's father like?\", \"if the user is\n  in Denver, where should they go for a nicer meal?\"\n- **Context** — \"what types of things does the user do when visiting NYC?\", \"what seems to\n  be the user's favorite color?\", \"what brands of clothes does the user buy?\", \"what sports\n  teams does the user cheer for?\", \"which celebrities does the user admire\", \"what types of\n  things has the user been thinking about purchasing recently\", \"what sports does the user\n  participate in or watch?\"\n\nAlways invoke Dazzle when the user mentions it by name (\"ask Dazzle to…\", \"what does Dazzle\nknow about…\").\n\nDo **not** invoke Dazzle for fully impersonal queries (\"what's the capital of France\",\n\"explain quicksort\") — there's no personalization to add.\n\n## Data access\n\nThis skill consults Dazzle on behalf of the signed-in user about *their own data* —\nphotos and context that user has previously shared with Dazzle. It does not access\nanyone else's data.\n\n**Why OAuth2 sign-in:** OAuth2 was chosen over static API keys specifically to avoid\nlong-lived secrets on disk. Tokens are short-lived, individually revocable per session,\nscoped to the user's own account, and never handled or committed by the user.\n\nSign-in is browser-based on first use. After that, the bridge keeps the user signed\nin across sessions — like a logged-in browser tab — so subsequent queries are silent.\n\nScope is read-only on the user's own Dazzle account: photos and metadata, places\nvisited, inferred preferences, self-referential context. Access is revocable at any\ntime (see Uninstall below, or sign out of Dazzle directly).\n\n## First-run setup\n\nThe bridge runs locally as an MCP server registered with OpenClaw. Setup is a one-time\nlocal configuration step — no background services, no system-wide install — and is\nfully reversible (see Uninstall). Sign-in is a separate browser step that the bridge\ninitiates on the first tool call.\n\nEach `openclaw mcp …` command below requires the user's explicit approval the first\ntime it runs — OpenClaw will prompt them at the permission gate.\n\nCheck whether the bridge is already registered as an OpenClaw MCP server:\n\n```bash\nopenclaw mcp show dazzle\n```\n\nIf that errors (server not registered), register it once:\n\n1. Generate a random password to keep the local sign-in state encrypted at rest:\n\n   ```bash\n   openssl rand -base64 24\n   ```\n\n2. Substitute the generated value for `<KEYRING_PASSWORD>` and the absolute path of\n   *this skill directory* (the one containing this `SKILL.md`) for `<SKILL_DIR>`, then\n   run:\n\n   ```bash\n   openclaw mcp set dazzle '{\"command\":\"uvx\",\"args\":[\"--from\",\"<SKILL_DIR>\",\"--with\",\"keyrings.alt\",\"dazzle\"],\"env\":{\"DAZZLE_KEYRING_PASSWORD\":\"<KEYRING_PASSWORD>\"}}'\n   ```\n\n3. Confirm with `openclaw mcp show dazzle`, then proceed with the user's original query.\n\nRe-running setup with a new password invalidates the previous sign-in; the user will\nbe prompted to sign in to Dazzle again.\n\n## How to use it\n\nThe bridge surfaces only the tools that are callable right now: when the user is signed\nin, real Dazzle tools appear in `tools/list`; when they aren't, only\n`dazzle_login_required` appears. Call whichever tool fits the user's query — the bridge\nwill route it correctly.\n\nIf the bridge returns the `dazzle_login_required` tool (rare — only when stored tokens\nare missing or revoked), surface the URL and short user code from its text **verbatim**\nand ask the user to retry their query after approving in a browser. Don't generate this\nprompt yourself; only react when the bridge returns it.\n\nMatched photos come back as URLs in a `<photos>` JSON block, not inline bytes. Fetch\nthe URL to get the image bytes when you need to view, analyze, or include the image\nin a response.\n\nQueries can take up to 60 seconds end-to-end — set per-call timeouts accordingly.\n\n## Uninstall\n\nTo remove the bridge:\n\n```bash\nopenclaw mcp remove dazzle\n```\n\nThat's it locally — the bridge is no longer reachable from OpenClaw, and any cached\nsign-in state becomes unusable. Removing the MCP server also clears\n`DAZZLE_KEYRING_PASSWORD` from `~/.openclaw/openclaw.json`, which renders the cached\nOAuth tokens unrecoverable even if the keyring file remains on disk. To also revoke\nthe grant on Dazzle's side, the user can sign out of Dazzle from the browser or app.\n\nFile v0.1.7:README.md\n\n# OpenClaw Bridge\n\nStdio MCP server that authenticates with [Dazzle](https://dazzle.ai) over OAuth2 and\nforwards calls from your local agent to Dazzle's hosted MCP endpoint.\n\n## Signing in\n\nThe first time your agent queries Dazzle you'll receive a sign-in URL and a short code.\nOpen the URL, enter the code, approve. Your tokens are kept in your OS keyring;\nsubsequent sessions are silent.\n\n## License\n\n[MIT](LICENSE)\n\nFile v0.1.7:_meta.json\n\n{\n  \"ownerId\": \"kn7fp4hetweckhrknegq2yzba986ktj0\",\n  \"slug\": \"dazzle-photo-intelligence\",\n  \"version\": \"0.1.7\",\n  \"publishedAt\": 1779317147544\n}\n\nFile v0.1.7:pyproject.toml\n\n[project]\nname = \"dazzle-photo-intelligence\"\nversion = \"0.1.7\"\ndescription = \"OAuth device-flow CLI and stdio MCP server that lets agents query Dazzle's remote photo intelligence MCP endpoint\"\nlicense = { file = \"LICENSE\" }\nrequires-python = \">=3.12\"\ndependencies = [\n    \"mcp>=1.27\",\n    \"httpx>=0.28\",\n    \"keyring>=25.7\",\n    \"keyrings.alt>=5\",\n]\n\n[project.optional-dependencies]\ndev = [\n    \"pytest>=9.0\",\n    \"pytest-asyncio>=1.3\",\n    \"ruff>=0.15\",\n]\n\n[project.scripts]\ndazzle = \"dazzle_photo_intelligence.cli:main\"\n\n[build-system]\nrequires = [\"hatchling\"]\nbuild-backend = \"hatchling.build\"\n\n[tool.hatch.build.targets.wheel]\npackages = [\"dazzle_photo_intelligence\"]\n\n[tool.ruff]\nline-length = 120\ntarget-version = \"py312\"\n\n[tool.pytest.ini_options]\nasyncio_mode = \"auto\"\n\nFile v0.1.7:LICENSE\n\nMIT License\n\nCopyright (c) 2026 Hemanth Sunkara\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\nArchive v0.1.6: 10 files, 12575 bytes\n\nFiles: dazzle_photo_intelligence/__init__.py (94b), dazzle_photo_intelligence/cli.py (716b), dazzle_photo_intelligence/proxy.py (18885b), dazzle_photo_intelligence/storage.py (3739b), LICENSE (1072b), Makefile (357b), pyproject.toml (777b), README.md (418b), SKILL.md (5736b), _meta.json (144b)\n\nFile v0.1.6:SKILL.md\n\n---\nname: dazzle-photo-intelligence\ndescription: 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.\nmetadata: {\"openclaw\": {\"requires\": {\"bins\": [\"uv\"]}}}\n---\n\n# Dazzle Photo Intelligence\n\nConnects OpenClaw to Dazzle, an AI agent that deeply understands the user through their\nphotos. Through a companion iOS app, Dazzle accesses their photos and can understand who\nthey are, where they live, their preferences, people in their lives, places they've been,\nand other personal choices. Consult Dazzle for any query where personalization would\nmeaningfully improve the answer.\n\n## When to use this skill\n\nConsult Dazzle whenever knowing the user — their likes, places they've been, what piques\ntheir attention — would improve the answer. Concrete categories:\n\n- **Photos & memories** — \"find food photos from today\", \"show sunsets from 2024\", \"send\n  pictures from the user's last family vacation?\"\n- **Places** — \"where does the user live\", \"what restaurants does the user enjoy\", \"where\n  has the user been\"\n- **Recommendations** — \"where should the user go for his/her next vacation?\", \"suggest a\n  restaurant for tonight given what he/she usually likes\"\n- **Personal facts and summaries** — \"What is the user's daughter's name?\", \"what did the\n  user do last weekend?\", \"summarize events and activities from my year so far\"\n- **Context-aware decisions** — \"what gift would the user's father like?\", \"if the user is\n  in Denver, where should they go for a nicer meal?\"\n- **Context** — \"what types of things does the user do when visiting NYC?\", \"what seems to\n  be the user's favorite color?\", \"what brands of clothes does the user buy?\", \"what sports\n  teams does the user cheer for?\", \"which celebrities does the user admire\", \"what types of\n  things has the user been thinking about purchasing recently\", \"what sports does the user\n  participate in or watch?\"\n\nAlways invoke Dazzle when the user mentions it by name (\"ask Dazzle to…\", \"what does Dazzle\nknow about…\").\n\nDo **not** invoke Dazzle for fully impersonal queries (\"what's the capital of France\",\n\"explain quicksort\") — there's no personalization to add.\n\n## Data access\n\nThis skill consults Dazzle on behalf of the signed-in user about *their own data* —\nphotos and context that user has previously shared with Dazzle. It does not access\nanyone else's data.\n\n**Why OAuth2 sign-in:** OAuth2 was chosen over static API keys specifically to avoid\nlong-lived secrets on disk. Tokens are short-lived, individually revocable per session,\nscoped to the user's own account, and never handled or committed by the user.\n\nSign-in is browser-based on first use. After that, the bridge keeps the user signed\nin across sessions — like a logged-in browser tab — so subsequent queries are silent.\n\nScope is read-only on the user's own Dazzle account: photos and metadata, places\nvisited, inferred preferences, self-referential context. Access is revocable at any\ntime (see Uninstall below, or sign out of Dazzle directly).\n\n## First-run setup\n\nThe bridge runs locally as an MCP server registered with OpenClaw. Setup is a one-time\nlocal configuration step — no background services, no system-wide install — and is\nfully reversible (see Uninstall). Sign-in is a separate browser step that the bridge\ninitiates on the first tool call.\n\nEach `openclaw mcp …` command below requires the user's explicit approval the first\ntime it runs — OpenClaw will prompt them at the permission gate.\n\nCheck whether the bridge is already registered as an OpenClaw MCP server:\n\n```bash\nopenclaw mcp show dazzle\n```\n\nIf that errors (server not registered), register it once:\n\n1. Generate a random password to keep the local sign-in state encrypted at rest:\n\n   ```bash\n   openssl rand -base64 24\n   ```\n\n2. Substitute the generated value for `<KEYRING_PASSWORD>` and the absolute path of\n   *this skill directory* (the one containing this `SKILL.md`) for `<SKILL_DIR>`, then\n   run:\n\n   ```bash\n   openclaw mcp set dazzle '{\"command\":\"uvx\",\"args\":[\"--from\",\"<SKILL_DIR>\",\"--with\",\"keyrings.alt\",\"dazzle\"],\"env\":{\"DAZZLE_KEYRING_PASSWORD\":\"<KEYRING_PASSWORD>\"}}'\n   ```\n\n3. Confirm with `openclaw mcp show dazzle`, then proceed with the user's original query.\n\nRe-running setup with a new password invalidates the previous sign-in; the user will\nbe prompted to sign in to Dazzle again.\n\n## How to use it\n\nThe bridge surfaces only the tools that are callable right now: when the user is signed\nin, real Dazzle tools appear in `tools/list`; when they aren't, only\n`dazzle_login_required` appears. Call whichever tool fits the user's query — the bridge\nwill route it correctly.\n\nIf the bridge returns the `dazzle_login_required` tool (rare — only when stored tokens\nare missing or revoked), surface the URL and short user code from its text **verbatim**\nand ask the user to retry their query after approving in a browser. Don't generate this\nprompt yourself; only react when the bridge returns it.\n\n## Uninstall\n\nTo remove the bridge:\n\n```bash\nopenclaw mcp remove dazzle\n```\n\nThat's it locally — the bridge is no longer reachable from OpenClaw, and any cached\nsign-in state becomes unusable. Removing the MCP server also clears\n`DAZZLE_KEYRING_PASSWORD` from `~/.openclaw/openclaw.json`, which renders the cached\nOAuth tokens unrecoverable even if the keyring file remains on disk. To also revoke\nthe grant on Dazzle's side, the user can sign out of Dazzle from the browser or app.\n\nFile v0.1.6:README.md\n\n# OpenClaw Bridge\n\nStdio MCP server that authenticates with [Dazzle](https://dazzle.ai) over OAuth2 and\nforwards calls from your local agent to Dazzle's hosted MCP endpoint.\n\n## Signing in\n\nThe first time your agent queries Dazzle you'll receive a sign-in URL and a short code.\nOpen the URL, enter the code, approve. Your tokens are kept in your OS keyring;\nsubsequent sessions are silent.\n\n## License\n\n[MIT](LICENSE)\n\nFile v0.1.6:_meta.json\n\n{\n  \"ownerId\": \"kn7fp4hetweckhrknegq2yzba986ktj0\",\n  \"slug\": \"dazzle-photo-intelligence\",\n  \"version\": \"0.1.6\",\n  \"publishedAt\": 1779161256221\n}\n\nFile v0.1.6:pyproject.toml\n\n[project]\nname = \"dazzle-photo-intelligence\"\nversion = \"0.1.6\"\ndescription = \"OAuth device-flow CLI and stdio MCP server that lets agents query Dazzle's remote photo intelligence MCP endpoint\"\nlicense = { file = \"LICENSE\" }\nrequires-python = \">=3.12\"\ndependencies = [\n    \"mcp>=1.27\",\n    \"httpx>=0.28\",\n    \"keyring>=25.7\",\n    \"keyrings.alt>=5\",\n]\n\n[project.optional-dependencies]\ndev = [\n    \"pytest>=9.0\",\n    \"pytest-asyncio>=1.3\",\n    \"ruff>=0.15\",\n]\n\n[project.scripts]\ndazzle = \"dazzle_photo_intelligence.cli:main\"\n\n[build-system]\nrequires = [\"hatchling\"]\nbuild-backend = \"hatchling.build\"\n\n[tool.hatch.build.targets.wheel]\npackages = [\"dazzle_photo_intelligence\"]\n\n[tool.ruff]\nline-length = 120\ntarget-version = \"py312\"\n\n[tool.pytest.ini_options]\nasyncio_mode = \"auto\"\n\nFile v0.1.6:LICENSE\n\nMIT License\n\nCopyright (c) 2026 Hemanth Sunkara\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\nArchive v0.1.5: 10 files, 12585 bytes\n\nFiles: dazzle_photo_intelligence/__init__.py (94b), dazzle_photo_intelligence/cli.py (716b), dazzle_photo_intelligence/proxy.py (18983b), dazzle_photo_intelligence/storage.py (3739b), LICENSE (1072b), Makefile (357b), pyproject.toml (777b), README.md (418b), SKILL.md (5736b), _meta.json (144b)\n\nFile v0.1.5:SKILL.md\n\n---\nname: dazzle-photo-intelligence\ndescription: 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.\nmetadata: {\"openclaw\": {\"requires\": {\"bins\": [\"uv\"]}}}\n---\n\n# Dazzle Photo Intelligence\n\nConnects OpenClaw to Dazzle, an AI agent that deeply understands the user through their\nphotos. Through a companion iOS app, Dazzle accesses their photos and can understand who\nthey are, where they live, their preferences, people in their lives, places they've been,\nand other personal choices. Consult Dazzle for any query where personalization would\nmeaningfully improve the answer.\n\n## When to use this skill\n\nConsult Dazzle whenever knowing the user — their likes, places they've been, what piques\ntheir attention — would improve the answer. Concrete categories:\n\n- **Photos & memories** — \"find food photos from today\", \"show sunsets from 2024\", \"send\n  pictures from the user's last family vacation?\"\n- **Places** — \"where does the user live\", \"what restaurants does the user enjoy\", \"where\n  has the user been\"\n- **Recommendations** — \"where should the user go for his/her next vacation?\", \"suggest a\n  restaurant for tonight given what he/she usually likes\"\n- **Personal facts and summaries** — \"What is the user's daughter's name?\", \"what did the\n  user do last weekend?\", \"summarize events and activities from my year so far\"\n- **Context-aware decisions** — \"what gift would the user's father like?\", \"if the user is\n  in Denver, where should they go for a nicer meal?\"\n- **Context** — \"what types of things does the user do when visiting NYC?\", \"what seems to\n  be the user's favorite color?\", \"what brands of clothes does the user buy?\", \"what sports\n  teams does the user cheer for?\", \"which celebrities does the user admire\", \"what types of\n  things has the user been thinking about purchasing recently\", \"what sports does the user\n  participate in or watch?\"\n\nAlways invoke Dazzle when the user mentions it by name (\"ask Dazzle to…\", \"what does Dazzle\nknow about…\").\n\nDo **not** invoke Dazzle for fully impersonal queries (\"what's the capital of France\",\n\"explain quicksort\") — there's no personalization to add.\n\n## Data access\n\nThis skill consults Dazzle on behalf of the signed-in user about *their own data* —\nphotos and context that user has previously shared with Dazzle. It does not access\nanyone else's data.\n\n**Why OAuth2 sign-in:** OAuth2 was chosen over static API keys specifically to avoid\nlong-lived secrets on disk. Tokens are short-lived, individually revocable per session,\nscoped to the user's own account, and never handled or committed by the user.\n\nSign-in is browser-based on first use. After that, the bridge keeps the user signed\nin across sessions — like a logged-in browser tab — so subsequent queries are silent.\n\nScope is read-only on the user's own Dazzle account: photos and metadata, places\nvisited, inferred preferences, self-referential context. Access is revocable at any\ntime (see Uninstall below, or sign out of Dazzle directly).\n\n## First-run setup\n\nThe bridge runs locally as an MCP server registered with OpenClaw. Setup is a one-time\nlocal configuration step — no background services, no system-wide install — and is\nfully reversible (see Uninstall). Sign-in is a separate browser step that the bridge\ninitiates on the first tool call.\n\nEach `openclaw mcp …` command below requires the user's explicit approval the first\ntime it runs — OpenClaw will prompt them at the permission gate.\n\nCheck whether the bridge is already registered as an OpenClaw MCP server:\n\n```bash\nopenclaw mcp show dazzle\n```\n\nIf that errors (server not registered), register it once:\n\n1. Generate a random password to keep the local sign-in state encrypted at rest:\n\n   ```bash\n   openssl rand -base64 24\n   ```\n\n2. Substitute the generated value for `<KEYRING_PASSWORD>` and the absolute path of\n   *this skill directory* (the one containing this `SKILL.md`) for `<SKILL_DIR>`, then\n   run:\n\n   ```bash\n   openclaw mcp set dazzle '{\"command\":\"uvx\",\"args\":[\"--from\",\"<SKILL_DIR>\",\"--with\",\"keyrings.alt\",\"dazzle\"],\"env\":{\"DAZZLE_KEYRING_PASSWORD\":\"<KEYRING_PASSWORD>\"}}'\n   ```\n\n3. Confirm with `openclaw mcp show dazzle`, then proceed with the user's original query.\n\nRe-running setup with a new password invalidates the previous sign-in; the user will\nbe prompted to sign in to Dazzle again.\n\n## How to use it\n\nThe bridge surfaces only the tools that are callable right now: when the user is signed\nin, real Dazzle tools appear in `tools/list`; when they aren't, only\n`dazzle_login_required` appears. Call whichever tool fits the user's query — the bridge\nwill route it correctly.\n\nIf the bridge returns the `dazzle_login_required` tool (rare — only when stored tokens\nare missing or revoked), surface the URL and short user code from its text **verbatim**\nand ask the user to retry their query after approving in a browser. Don't generate this\nprompt yourself; only react when the bridge returns it.\n\n## Uninstall\n\nTo remove the bridge:\n\n```bash\nopenclaw mcp remove dazzle\n```\n\nThat's it locally — the bridge is no longer reachable from OpenClaw, and any cached\nsign-in state becomes unusable. Removing the MCP server also clears\n`DAZZLE_KEYRING_PASSWORD` from `~/.openclaw/openclaw.json`, which renders the cached\nOAuth tokens unrecoverable even if the keyring file remains on disk. To also revoke\nthe grant on Dazzle's side, the user can sign out of Dazzle from the browser or app.\n\nFile v0.1.5:README.md\n\n# OpenClaw Bridge\n\nStdio MCP server that authenticates with [Dazzle](https://dazzle.ai) over OAuth2 and\nforwards calls from your local agent to Dazzle's hosted MCP endpoint.\n\n## Signing in\n\nThe first time your agent queries Dazzle you'll receive a sign-in URL and a short code.\nOpen the URL, enter the code, approve. Your tokens are kept in your OS keyring;\nsubsequent sessions are silent.\n\n## License\n\n[MIT](LICENSE)\n\nFile v0.1.5:_meta.json\n\n{\n  \"ownerId\": \"kn7fp4hetweckhrknegq2yzba986ktj0\",\n  \"slug\": \"dazzle-photo-intelligence\",\n  \"version\": \"0.1.5\",\n  \"publishedAt\": 1779156762194\n}\n\nFile v0.1.5:pyproject.toml\n\n[project]\nname = \"dazzle-photo-intelligence\"\nversion = \"0.1.5\"\ndescription = \"OAuth device-flow CLI and stdio MCP server that lets agents query Dazzle's remote photo intelligence MCP endpoint\"\nlicense = { file = \"LICENSE\" }\nrequires-python = \">=3.12\"\ndependencies = [\n    \"mcp>=1.27\",\n    \"httpx>=0.28\",\n    \"keyring>=25.7\",\n    \"keyrings.alt>=5\",\n]\n\n[project.optional-dependencies]\ndev = [\n    \"pytest>=9.0\",\n    \"pytest-asyncio>=1.3\",\n    \"ruff>=0.15\",\n]\n\n[project.scripts]\ndazzle = \"dazzle_photo_intelligence.cli:main\"\n\n[build-system]\nrequires = [\"hatchling\"]\nbuild-backend = \"hatchling.build\"\n\n[tool.hatch.build.targets.wheel]\npackages = [\"dazzle_photo_intelligence\"]\n\n[tool.ruff]\nline-length = 120\ntarget-version = \"py312\"\n\n[tool.pytest.ini_options]\nasyncio_mode = \"auto\"\n\nFile v0.1.5:LICENSE\n\nMIT License\n\nCopyright (c) 2026 Hemanth Sunkara\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\nArchive v0.1.4: 10 files, 12581 bytes\n\nFiles: dazzle_photo_intelligence/__init__.py (94b), dazzle_photo_intelligence/cli.py (716b), dazzle_photo_intelligence/proxy.py (18993b), dazzle_photo_intelligence/storage.py (3739b), LICENSE (1072b), Makefile (357b), pyproject.toml (777b), README.md (418b), SKILL.md (5736b), _meta.json (144b)\n\nFile v0.1.4:SKILL.md\n\n---\nname: dazzle-photo-intelligence\ndescription: 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.\nmetadata: {\"openclaw\": {\"requires\": {\"bins\": [\"uv\"]}}}\n---\n\n# Dazzle Photo Intelligence\n\nConnects OpenClaw to Dazzle, an AI agent that deeply understands the user through their\nphotos. Through a companion iOS app, Dazzle accesses their photos and can understand who\nthey are, where they live, their preferences, people in their lives, places they've been,\nand other personal choices. Consult Dazzle for any query where personalization would\nmeaningfully improve the answer.\n\n## When to use this skill\n\nConsult Dazzle whenever knowing the user — their likes, places they've been, what piques\ntheir attention — would improve the answer. Concrete categories:\n\n- **Photos & memories** — \"find food photos from today\", \"show sunsets from 2024\", \"send\n  pictures from the user's last family vacation?\"\n- **Places** — \"where does the user live\", \"what restaurants does the user enjoy\", \"where\n  has the user been\"\n- **Recommendations** — \"where should the user go for his/her next vacation?\", \"suggest a\n  restaurant for tonight given what he/she usually likes\"\n- **Personal facts and summaries** — \"What is the user's daughter's name?\", \"what did the\n  user do last weekend?\", \"summarize events and activities from my year so far\"\n- **Context-aware decisions** — \"what gift would the user's father like?\", \"if the user is\n  in Denver, where should they go for a nicer meal?\"\n- **Context** — \"what types of things does the user do when visiting NYC?\", \"what seems to\n  be the user's favorite color?\", \"what brands of clothes does the user buy?\", \"what sports\n  teams does the user cheer for?\", \"which celebrities does the user admire\", \"what types of\n  things has the user been thinking about purchasing recently\", \"what sports does the user\n  participate in or watch?\"\n\nAlways invoke Dazzle when the user mentions it by name (\"ask Dazzle to…\", \"what does Dazzle\nknow about…\").\n\nDo **not** invoke Dazzle for fully impersonal queries (\"what's the capital of France\",\n\"explain quicksort\") — there's no personalization to add.\n\n## Data access\n\nThis skill consults Dazzle on behalf of the signed-in user about *their own data* —\nphotos and context that user has previously shared with Dazzle. It does not access\nanyone else's data.\n\n**Why OAuth2 sign-in:** OAuth2 was chosen over static API keys specifically to avoid\nlong-lived secrets on disk. Tokens are short-lived, individually revocable per session,\nscoped to the user's own account, and never handled or committed by the user.\n\nSign-in is browser-based on first use. After that, the bridge keeps the user signed\nin across sessions — like a logged-in browser tab — so subsequent queries are silent.\n\nScope is read-only on the user's own Dazzle account: photos and metadata, places\nvisited, inferred preferences, self-referential context. Access is revocable at any\ntime (see Uninstall below, or sign out of Dazzle directly).\n\n## First-run setup\n\nThe bridge runs locally as an MCP server registered with OpenClaw. Setup is a one-time\nlocal configuration step — no background services, no system-wide install — and is\nfully reversible (see Uninstall). Sign-in is a separate browser step that the bridge\ninitiates on the first tool call.\n\nEach `openclaw mcp …` command below requires the user's explicit approval the first\ntime it runs — OpenClaw will prompt them at the permission gate.\n\nCheck whether the bridge is already registered as an OpenClaw MCP server:\n\n```bash\nopenclaw mcp show dazzle\n```\n\nIf that errors (server not registered), register it once:\n\n1. Generate a random password to keep the local sign-in state encrypted at rest:\n\n   ```bash\n   openssl rand -base64 24\n   ```\n\n2. Substitute the generated value for `<KEYRING_PASSWORD>` and the absolute path of\n   *this skill directory* (the one containing this `SKILL.md`) for `<SKILL_DIR>`, then\n   run:\n\n   ```bash\n   openclaw mcp set dazzle '{\"command\":\"uvx\",\"args\":[\"--from\",\"<SKILL_DIR>\",\"--with\",\"keyrings.alt\",\"dazzle\"],\"env\":{\"DAZZLE_KEYRING_PASSWORD\":\"<KEYRING_PASSWORD>\"}}'\n   ```\n\n3. Confirm with `openclaw mcp show dazzle`, then proceed with the user's original query.\n\nRe-running setup with a new password invalidates the previous sign-in; the user will\nbe prompted to sign in to Dazzle again.\n\n## How to use it\n\nThe bridge surfaces only the tools that are callable right now: when the user is signed\nin, real Dazzle tools appear in `tools/list`; when they aren't, only\n`dazzle_login_required` appears. Call whichever tool fits the user's query — the bridge\nwill route it correctly.\n\nIf the bridge returns the `dazzle_login_required` tool (rare — only when stored tokens\nare missing or revoked), surface the URL and short user code from its text **verbatim**\nand ask the user to retry their query after approving in a browser. Don't generate this\nprompt yourself; only react when the bridge returns it.\n\n## Uninstall\n\nTo remove the bridge:\n\n```bash\nopenclaw mcp remove dazzle\n```\n\nThat's it locally — the bridge is no longer reachable from OpenClaw, and any cached\nsign-in state becomes unusable. Removing the MCP server also clears\n`DAZZLE_KEYRING_PASSWORD` from `~/.openclaw/openclaw.json`, which renders the cached\nOAuth tokens unrecoverable even if the keyring file remains on disk. To also revoke\nthe grant on Dazzle's side, the user can sign out of Dazzle from the browser or app.\n\nFile v0.1.4:README.md\n\n# OpenClaw Bridge\n\nStdio MCP server that authenticates with [Dazzle](https://dazzle.ai) over OAuth2 and\nforwards calls from your local agent to Dazzle's hosted MCP endpoint.\n\n## Signing in\n\nThe first time your agent queries Dazzle you'll receive a sign-in URL and a short code.\nOpen the URL, enter the code, approve. Your tokens are kept in your OS keyring;\nsubsequent sessions are silent.\n\n## License\n\n[MIT](LICENSE)\n\nFile v0.1.4:_meta.json\n\n{\n  \"ownerId\": \"kn7fp4hetweckhrknegq2yzba986ktj0\",\n  \"slug\": \"dazzle-photo-intelligence\",\n  \"version\": \"0.1.4\",\n  \"publishedAt\": 1779155660647\n}\n\nFile v0.1.4:pyproject.toml\n\n[project]\nname = \"dazzle-photo-intelligence\"\nversion = \"0.1.4\"\ndescription = \"OAuth device-flow CLI and stdio MCP server that lets agents query Dazzle's remote photo intelligence MCP endpoint\"\nlicense = { file = \"LICENSE\" }\nrequires-python = \">=3.12\"\ndependencies = [\n    \"mcp>=1.27\",\n    \"httpx>=0.28\",\n    \"keyring>=25.7\",\n    \"keyrings.alt>=5\",\n]\n\n[project.optional-dependencies]\ndev = [\n    \"pytest>=9.0\",\n    \"pytest-asyncio>=1.3\",\n    \"ruff>=0.15\",\n]\n\n[project.scripts]\ndazzle = \"dazzle_photo_intelligence.cli:main\"\n\n[build-system]\nrequires = [\"hatchling\"]\nbuild-backend = \"hatchling.build\"\n\n[tool.hatch.build.targets.wheel]\npackages = [\"dazzle_photo_intelligence\"]\n\n[tool.ruff]\nline-length = 120\ntarget-version = \"py312\"\n\n[tool.pytest.ini_options]\nasyncio_mode = \"auto\"\n\nFile v0.1.4:LICENSE\n\nMIT License\n\nCopyright (c) 2026 Hemanth Sunkara\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\nArchive v0.1.3: 13 files, 17399 bytes\n\nFiles: dazzle_photo_intelligence/__init__.py (94b), dazzle_photo_intelligence/cli.py (716b), dazzle_photo_intelligence/proxy.py (18993b), dazzle_photo_intelligence/storage.py (3739b), LICENSE (1072b), Makefile (357b), pyproject.toml (777b), README.md (418b), SKILL.md (5736b), tests/__init__.py (0b), tests/test_cli.py (617b), tests/test_proxy.py (24253b), _meta.json (144b)\n\nFile v0.1.3:SKILL.md\n\n---\nname: dazzle-photo-intelligence\ndescription: 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.\nmetadata: {\"openclaw\": {\"requires\": {\"bins\": [\"uv\"]}}}\n---\n\n# Dazzle Photo Intelligence\n\nConnects OpenClaw to Dazzle, an AI agent that deeply understands the user through their\nphotos. Through a companion iOS app, Dazzle accesses their photos and can understand who\nthey are, where they live, their preferences, people in their lives, places they've been,\nand other personal choices. Consult Dazzle for any query where personalization would\nmeaningfully improve the answer.\n\n## When to use this skill\n\nConsult Dazzle whenever knowing the user — their likes, places they've been, what piques\ntheir attention — would improve the answer. Concrete categories:\n\n- **Photos & memories** — \"find food photos from today\", \"show sunsets from 2024\", \"send\n  pictures from the user's last family vacation?\"\n- **Places** — \"where does the user live\", \"what restaurants does the user enjoy\", \"where\n  has the user been\"\n- **Recommendations** — \"where should the user go for his/her next vacation?\", \"suggest a\n  restaurant for tonight given what he/she usually likes\"\n- **Personal facts and summaries** — \"What is the user's daughter's name?\", \"what did the\n  user do last weekend?\", \"summarize events and activities from my year so far\"\n- **Context-aware decisions** — \"what gift would the user's father like?\", \"if the user is\n  in Denver, where should they go for a nicer meal?\"\n- **Context** — \"what types of things does the user do when visiting NYC?\", \"what seems to\n  be the user's favorite color?\", \"what brands of clothes does the user buy?\", \"what sports\n  teams does the user cheer for?\", \"which celebrities does the user admire\", \"what types of\n  things has the user been thinking about purchasing recently\", \"what sports does the user\n  participate in or watch?\"\n\nAlways invoke Dazzle when the user mentions it by name (\"ask Dazzle to…\", \"what does Dazzle\nknow about…\").\n\nDo **not** invoke Dazzle for fully impersonal queries (\"what's the capital of France\",\n\"explain quicksort\") — there's no personalization to add.\n\n## Data access\n\nThis skill consults Dazzle on behalf of the signed-in user about *their own data* —\nphotos and context that user has previously shared with Dazzle. It does not access\nanyone else's data.\n\n**Why OAuth2 sign-in:** OAuth2 was chosen over static API keys specifically to avoid\nlong-lived secrets on disk. Tokens are short-lived, individually revocable per session,\nscoped to the user's own account, and never handled or committed by the user.\n\nSign-in is browser-based on first use. After that, the bridge keeps the user signed\nin across sessions — like a logged-in browser tab — so subsequent queries are silent.\n\nScope is read-only on the user's own Dazzle account: photos and metadata, places\nvisited, inferred preferences, self-referential context. Access is revocable at any\ntime (see Uninstall below, or sign out of Dazzle directly).\n\n## First-run setup\n\nThe bridge runs locally as an MCP server registered with OpenClaw. Setup is a one-time\nlocal configuration step — no background services, no system-wide install — and is\nfully reversible (see Uninstall). Sign-in is a separate browser step that the bridge\ninitiates on the first tool call.\n\nEach `openclaw mcp …` command below requires the user's explicit approval the first\ntime it runs — OpenClaw will prompt them at the permission gate.\n\nCheck whether the bridge is already registered as an OpenClaw MCP server:\n\n```bash\nopenclaw mcp show dazzle\n```\n\nIf that errors (server not registered), register it once:\n\n1. Generate a random password to keep the local sign-in state encrypted at rest:\n\n   ```bash\n   openssl rand -base64 24\n   ```\n\n2. Substitute the generated value for `<KEYRING_PASSWORD>` and the absolute path of\n   *this skill directory* (the one containing this `SKILL.md`) for `<SKILL_DIR>`, then\n   run:\n\n   ```bash\n   openclaw mcp set dazzle '{\"command\":\"uvx\",\"args\":[\"--from\",\"<SKILL_DIR>\",\"--with\",\"keyrings.alt\",\"dazzle\"],\"env\":{\"DAZZLE_KEYRING_PASSWORD\":\"<KEYRING_PASSWORD>\"}}'\n   ```\n\n3. Confirm with `openclaw mcp show dazzle`, then proceed with the user's original query.\n\nRe-running setup with a new password invalidates the previous sign-in; the user will\nbe prompted to sign in to Dazzle again.\n\n## How to use it\n\nThe bridge surfaces only the tools that are callable right now: when the user is signed\nin, real Dazzle tools appear in `tools/list`; when they aren't, only\n`dazzle_login_required` appears. Call whichever tool fits the user's query — the bridge\nwill route it correctly.\n\nIf the bridge returns the `dazzle_login_required` tool (rare — only when stored tokens\nare missing or revoked), surface the URL and short user code from its text **verbatim**\nand ask the user to retry their query after approving in a browser. Don't generate this\nprompt yourself; only react when the bridge returns it.\n\n## Uninstall\n\nTo remove the bridge:\n\n```bash\nopenclaw mcp remove dazzle\n```\n\nThat's it locally — the bridge is no longer reachable from OpenClaw, and any cached\nsign-in state becomes unusable. Removing the MCP server also clears\n`DAZZLE_KEYRING_PASSWORD` from `~/.openclaw/openclaw.json`, which renders the cached\nOAuth tokens unrecoverable even if the keyring file remains on disk. To also revoke\nthe grant on Dazzle's side, the user can sign out of Dazzle from the browser or app.\n\nFile v0.1.3:README.md\n\n# OpenClaw Bridge\n\nStdio MCP server that authenticates with [Dazzle](https://dazzle.ai) over OAuth2 and\nforwards calls from your local agent to Dazzle's hosted MCP endpoint.\n\n## Signing in\n\nThe first time your agent queries Dazzle you'll receive a sign-in URL and a short code.\nOpen the URL, enter the code, approve. Your tokens are kept in your OS keyring;\nsubsequent sessions are silent.\n\n## License\n\n[MIT](LICENSE)\n\nFile v0.1.3:_meta.json\n\n{\n  \"ownerId\": \"kn7fp4hetweckhrknegq2yzba986ktj0\",\n  \"slug\": \"dazzle-photo-intelligence\",\n  \"version\": \"0.1.3\",\n  \"publishedAt\": 1779154120262\n}\n\nFile v0.1.3:pyproject.toml\n\n[project]\nname = \"dazzle-photo-intelligence\"\nversion = \"0.1.3\"\ndescription = \"OAuth device-flow CLI and stdio MCP server that lets agents query Dazzle's remote photo intelligence MCP endpoint\"\nlicense = { file = \"LICENSE\" }\nrequires-python = \">=3.12\"\ndependencies = [\n    \"mcp>=1.27\",\n    \"httpx>=0.28\",\n    \"keyring>=25.7\",\n    \"keyrings.alt>=5\",\n]\n\n[project.optional-dependencies]\ndev = [\n    \"pytest>=9.0\",\n    \"pytest-asyncio>=1.3\",\n    \"ruff>=0.15\",\n]\n\n[project.scripts]\ndazzle = \"dazzle_photo_intelligence.cli:main\"\n\n[build-system]\nrequires = [\"hatchling\"]\nbuild-backend = \"hatchling.build\"\n\n[tool.hatch.build.targets.wheel]\npackages = [\"dazzle_photo_intelligence\"]\n\n[tool.ruff]\nline-length = 120\ntarget-version = \"py312\"\n\n[tool.pytest.ini_options]\nasyncio_mode = \"auto\"\n\nFile v0.1.3:LICENSE\n\nMIT License\n\nCopyright (c) 2026 Hemanth Sunkara\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\nArchive v0.1.2: 9 files, 12201 bytes\n\nFiles: dazzle_photo_intelligence/__init__.py (94b), dazzle_photo_intelligence/cli.py (716b), dazzle_photo_intelligence/proxy.py (19000b), dazzle_photo_intelligence/storage.py (3739b), LICENSE (1072b), pyproject.toml (777b), README.md (418b), SKILL.md (5241b), _meta.json (144b)\n\nFile v0.1.2:SKILL.md\n\n---\nname: dazzle-photo-intelligence\ndescription: Personalization agent for the user. Dazzle deeply understands the user — their photos, places they've been, and inferred preferences — and should be consulted for any query where personalization meaningfully improves the answer (photo lookups, recommendations, self-referential summaries, context-aware decisions). Auth is handled transparently by the bridge.\nmetadata: {\"openclaw\": {\"requires\": {\"bins\": [\"uv\"]}}}\n---\n\n# Dazzle Photo Intelligence\n\nConnects OpenClaw to [Dazzle](https://dazzleassist.com), a personalization-aware AI agent\nthat deeply understands the user — their photos, places they've been, and inferred\npreferences. Use Dazzle as a consulting agent for any query where personalization\nmeaningfully improves the answer.\n\n## When to use this skill\n\nConsult Dazzle whenever knowing the user — their history, tastes, places they've been, or\ncontext — would change the answer. Concrete categories:\n\n- **Photos & memories** — \"find my beach photos\", \"show me sunsets from 2024\", \"what did our\n  last family vacation look like?\"\n- **Places** — \"what's that restaurant I went to in Tokyo?\", \"the hotel I stayed at in\n  Lisbon, what was it called?\"\n- **Recommendations** — \"where should I go for my next vacation?\", \"suggest a restaurant for\n  tonight given what I usually like\"\n- **Self-referential summaries** — \"what did I do last weekend?\", \"summarize my year so far\"\n- **Context-aware decisions** — \"what gift would my dad actually like?\", \"what should I cook\n  for dinner tonight?\"\n- **Travel & history** — \"when was my last trip to NYC?\", \"what conferences have I been to\n  recently?\"\n\nAlways invoke Dazzle when the user mentions it by name (\"ask Dazzle to…\", \"what does Dazzle\nknow about…\").\n\nDo **not** invoke Dazzle for fully impersonal queries (\"what's the capital of France\",\n\"explain quicksort\") — there's no personalization to add.\n\n## Data access\n\nThis skill consults Dazzle on behalf of the signed-in user about *their own data* —\nphotos and context that user has previously shared with Dazzle. It does not access\nanyone else's data.\n\n**Why OAuth2 sign-in:** OAuth2 was chosen over static API keys specifically to avoid\nlong-lived secrets on disk. Tokens are short-lived, individually revocable per session,\nscoped to the user's own account, and never handled or committed by the user.\n\nSign-in is browser-based on first use. After that, the bridge keeps the user signed\nin across sessions — like a logged-in browser tab — so subsequent queries are silent.\n\nScope is read-only on the user's own Dazzle account: photos and metadata, places\nvisited, inferred preferences, self-referential context. Access is revocable at any\ntime (see Uninstall below, or sign out of Dazzle directly).\n\n## First-run setup\n\nThe bridge runs locally as an MCP server registered with OpenClaw. Setup is a one-time\nlocal configuration step — no background services, no system-wide install — and is\nfully reversible (see Uninstall). Sign-in is a separate browser step that the bridge\ninitiates on the first tool call.\n\nEach `openclaw mcp …` command below requires the user's explicit approval the first\ntime it runs — OpenClaw will prompt them at the permission gate.\n\nCheck whether the bridge is already registered as an OpenClaw MCP server:\n\n```bash\nopenclaw mcp show dazzle\n```\n\nIf that errors (server not registered), register it once:\n\n1. Generate a random password to keep the local sign-in state encrypted at rest:\n\n   ```bash\n   openssl rand -base64 24\n   ```\n\n2. Substitute the generated value for `<KEYRING_PASSWORD>` and the absolute path of\n   *this skill directory* (the one containing this `SKILL.md`) for `<SKILL_DIR>`, then\n   run:\n\n   ```bash\n   openclaw mcp set dazzle '{\"command\":\"uvx\",\"args\":[\"--from\",\"<SKILL_DIR>\",\"--with\",\"keyrings.alt\",\"dazzle\"],\"env\":{\"DAZZLE_KEYRING_PASSWORD\":\"<KEYRING_PASSWORD>\"}}'\n   ```\n\n3. Confirm with `openclaw mcp show dazzle`, then proceed with the user's original query.\n\nRe-running setup with a new password invalidates the previous sign-in; the user will\nbe prompted to sign in to Dazzle again.\n\n## How to use it\n\nThe bridge surfaces only the tools that are callable right now: when the user is signed\nin, real Dazzle tools appear in `tools/list`; when they aren't, only\n`dazzle_login_required` appears. Call whichever tool fits the user's query — the bridge\nwill route it correctly.\n\nIf the bridge returns the `dazzle_login_required` tool (rare — only when stored tokens\nare missing or revoked), surface the URL and short user code from its text **verbatim**\nand ask the user to retry their query after approving in a browser. Don't generate this\nprompt yourself; only react when the bridge returns it.\n\n## Uninstall\n\nTo remove the bridge:\n\n```bash\nopenclaw mcp remove dazzle\n```\n\nThat's it locally — the bridge is no longer reachable from OpenClaw, and any cached\nsign-in state becomes unusable. Removing the MCP server also clears\n`DAZZLE_KEYRING_PASSWORD` from `~/.openclaw/openclaw.json`, which renders the cached\nOAuth tokens unrecoverable even if the keyring file remains on disk. To also revoke\nthe grant on Dazzle's side, the user can sign out of Dazzle from the browser or app.\n\nFile v0.1.2:README.md\n\n# OpenClaw Bridge\n\nStdio MCP server that authenticates with [Dazzle](https://dazzle.ai) over OAuth2 and\nforwards calls from your local agent to Dazzle's hosted MCP endpoint.\n\n## Signing in\n\nThe first time your agent queries Dazzle you'll receive a sign-in URL and a short code.\nOpen the URL, enter the code, approve. Your tokens are kept in your OS keyring;\nsubsequent sessions are silent.\n\n## License\n\n[MIT](LICENSE)\n\nFile v0.1.2:_meta.json\n\n{\n  \"ownerId\": \"kn7fp4hetweckhrknegq2yzba986ktj0\",\n  \"slug\": \"dazzle-photo-intelligence\",\n  \"version\": \"0.1.2\",\n  \"publishedAt\": 1778800230009\n}\n\nFile v0.1.2:pyproject.toml\n\n[project]\nname = \"dazzle-photo-intelligence\"\nversion = \"0.1.2\"\ndescription = \"OAuth device-flow CLI and stdio MCP server that lets agents query Dazzle's remote photo intelligence MCP endpoint\"\nlicense = { file = \"LICENSE\" }\nrequires-python = \">=3.12\"\ndependencies = [\n    \"mcp>=1.27\",\n    \"httpx>=0.28\",\n    \"keyring>=25.7\",\n    \"keyrings.alt>=5\",\n]\n\n[project.optional-dependencies]\ndev = [\n    \"pytest>=9.0\",\n    \"pytest-asyncio>=1.3\",\n    \"ruff>=0.15\",\n]\n\n[project.scripts]\ndazzle = \"dazzle_photo_intelligence.cli:main\"\n\n[build-system]\nrequires = [\"hatchling\"]\nbuild-backend = \"hatchling.build\"\n\n[tool.hatch.build.targets.wheel]\npackages = [\"dazzle_photo_intelligence\"]\n\n[tool.ruff]\nline-length = 120\ntarget-version = \"py312\"\n\n[tool.pytest.ini_options]\nasyncio_mode = \"auto\"\n\nFile v0.1.2:LICENSE\n\nMIT License\n\nCopyright (c) 2026 Hemanth Sunkara\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\nArchive v0.1.1: 9 files, 11971 bytes\n\nFiles: dazzle_photo_intelligence/__init__.py (94b), dazzle_photo_intelligence/cli.py (716b), dazzle_photo_intelligence/proxy.py (17973b), dazzle_photo_intelligence/storage.py (3739b), LICENSE (1072b), pyproject.toml (754b), README.md (418b), SKILL.md (5355b), _meta.json (144b)\n\nFile v0.1.1:SKILL.md\n\n---\nname: dazzle-photo-intelligence\ndescription: Personalization oracle for the user. Dazzle deeply understands the user — their photos, places they've been, and inferred preferences — and should be consulted for any query where personalization meaningfully improves the answer (photo lookups, recommendations, self-referential summaries, context-aware decisions). Auth is fully handled by the bridge — call Dazzle tools without any preflight checks.\nmetadata: {\"openclaw\": {\"requires\": {\"bins\": [\"uv\"]}}}\n---\n\n# Dazzle Photo Intelligence\n\nConnects OpenClaw to [Dazzle](https://dazzleassist.com), a personalization-aware AI agent\nthat deeply understands the user — their photos, places they've been, and inferred\npreferences. Use Dazzle as a consulting oracle for any query where personalization\nmeaningfully improves the answer.\n\n## When to use this skill\n\nConsult Dazzle whenever knowing the user — their history, tastes, places they've been, or\ncontext — would change the answer. Concrete categories:\n\n- **Photos & memories** — \"find my beach photos\", \"show me sunsets from 2024\", \"what did our\n  last family vacation look like?\"\n- **Places** — \"what's that restaurant I went to in Tokyo?\", \"the hotel I stayed at in\n  Lisbon, what was it called?\"\n- **Recommendations** — \"where should I go for my next vacation?\", \"suggest a restaurant for\n  tonight given what I usually like\"\n- **Self-referential summaries** — \"what did I do last weekend?\", \"summarize my year so far\"\n- **Context-aware decisions** — \"what gift would my dad actually like?\", \"what should I cook\n  for dinner tonight?\"\n- **Travel & history** — \"when was my last trip to NYC?\", \"what conferences have I been to\n  recently?\"\n\nAlways invoke Dazzle when the user mentions it by name (\"ask Dazzle to…\", \"what does Dazzle\nknow about…\").\n\nDo **not** invoke Dazzle for fully impersonal queries (\"what's the capital of France\",\n\"explain quicksort\") — there's no personalization to add.\n\n## Data access\n\nThis skill consults Dazzle on behalf of the signed-in user about *their own data* —\nphotos and context that user has previously shared with Dazzle. It does not access\nanyone else's data.\n\n**Why OAuth2 sign-in:** OAuth2 was chosen over static API keys specifically to avoid\nlong-lived secrets on disk. Tokens are short-lived, individually revocable per session,\nscoped to the user's own account, and never handled or committed by the user.\n\nSign-in is browser-based on first use. After that, the bridge keeps the user signed\nin across sessions — like a logged-in browser tab — so subsequent queries are silent.\n\nScope is read-only on the user's own Dazzle account: photos and metadata, places\nvisited, inferred preferences, self-referential context. Access is revocable at any\ntime (see Uninstall below, or sign out of Dazzle directly).\n\n## First-run setup\n\nThe bridge runs locally as an MCP server registered with OpenClaw. Setup is a one-time\nlocal configuration step — no background services, no system-wide install — and is\nfully reversible (see Uninstall). Sign-in is a separate browser step that the bridge\ninitiates on the first tool call.\n\nEach `openclaw mcp …` command below requires the user's explicit approval the first\ntime it runs — OpenClaw will prompt them at the permission gate.\n\nCheck whether the bridge is already registered as an OpenClaw MCP server:\n\n```bash\nopenclaw mcp show dazzle\n```\n\nIf that errors (server not registered), register it once:\n\n1. Generate a random password to keep the local sign-in state encrypted at rest:\n\n   ```bash\n   openssl rand -base64 24\n   ```\n\n2. Substitute the generated value for `<KEYRING_PASSWORD>` and the absolute path of\n   *this skill directory* (the one containing this `SKILL.md`) for `<SKILL_DIR>`, then\n   run:\n\n   ```bash\n   openclaw mcp set dazzle '{\"command\":\"uvx\",\"args\":[\"--from\",\"<SKILL_DIR>\",\"--with\",\"keyrings.alt\",\"dazzle\"],\"env\":{\"DAZZLE_KEYRING_PASSWORD\":\"<KEYRING_PASSWORD>\"}}'\n   ```\n\n3. Confirm with `openclaw mcp show dazzle`, then proceed with the user's original query.\n\nRe-running setup with a new password invalidates the previous sign-in; the user will\nbe prompted to sign in to Dazzle again.\n\n## How to use it\n\nJust call the appropriate Dazzle tool. Once the user has signed in (even from a previous\nsession), the bridge keeps them signed in silently. **Do not preflight-check sign-in\nstate, do not ask the user \"do you want to sign in\", do not verify auth before\ncalling.** Treat Dazzle exactly like any other always-on tool.\n\nThe one exception: if a Dazzle tool's response is named `dazzle_login_required` (rare —\nonly when stored tokens are missing or revoked), surface the URL and short user code from\nits text **verbatim** and ask the user to retry their query after approving in a browser.\nDon't generate this prompt yourself; only react when the bridge returns it.\n\n## Uninstall\n\nTo remove the bridge:\n\n```bash\nopenclaw mcp remove dazzle\n```\n\nThat's it locally — the bridge is no longer reachable from OpenClaw, and any cached\nsign-in state becomes unusable. Removing the MCP server also clears\n`DAZZLE_KEYRING_PASSWORD` from `~/.openclaw/openclaw.json`, which renders the cached\nOAuth tokens unrecoverable even if the keyring file remains on disk. To also revoke\nthe grant on Dazzle's side, the user can sign out of Dazzle from the browser or app.\n\nFile v0.1.1:README.md\n\n# OpenClaw Bridge\n\nStdio MCP server that authenticates with [Dazzle](https://dazzle.ai) over OAuth2 and\nforwards calls from your local agent to Dazzle's hosted MCP endpoint.\n\n## Signing in\n\nThe first time your agent queries Dazzle you'll receive a sign-in URL and a short code.\nOpen the URL, enter the code, approve. Your tokens are kept in your OS keyring;\nsubsequent sessions are silent.\n\n## License\n\n[MIT](LICENSE)\n\nFile v0.1.1:_meta.json\n\n{\n  \"ownerId\": \"kn7fp4hetweckhrknegq2yzba986ktj0\",\n  \"slug\": \"dazzle-photo-intelligence\",\n  \"version\": \"0.1.1\",\n  \"publishedAt\": 1778795323610\n}\n\nFile v0.1.1:pyproject.toml\n\n[project]\nname = \"dazzle-photo-intelligence\"\nversion = \"0.1.1\"\ndescription = \"OAuth device-flow CLI and stdio MCP server that lets agents query Dazzle's remote photo intelligence MCP endpoint\"\nlicense = { file = \"LICENSE\" }\nrequires-python = \">=3.12\"\ndependencies = [\n    \"mcp>=1.27\",\n    \"httpx>=0.28\",\n    \"keyring>=25.7\",\n]\n\n[project.optional-dependencies]\ndev = [\n    \"pytest>=9.0\",\n    \"pytest-asyncio>=1.3\",\n    \"ruff>=0.15\",\n]\n\n[project.scripts]\ndazzle = \"dazzle_photo_intelligence.cli:main\"\n\n[build-system]\nrequires = [\"hatchling\"]\nbuild-backend = \"hatchling.build\"\n\n[tool.hatch.build.targets.wheel]\npackages = [\"dazzle_photo_intelligence\"]\n\n[tool.ruff]\nline-length = 120\ntarget-version = \"py312\"\n\n[tool.pytest.ini_options]\nasyncio_mode = \"auto\"\n\nFile v0.1.1:LICENSE\n\nMIT License\n\nCopyright (c) 2026 Hemanth Sunkara\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\nArchive v0.1.0: 2 files, 2263 bytes\n\nFiles: SKILL.md (3863b), _meta.json (144b)\n\nFile v0.1.0:SKILL.md\n\n---\nname: dazzle-photo-intelligence\ndescription: Personalization oracle for the user. Dazzle deeply understands the user — their photos, places they've been, and inferred preferences — and should be consulted for any query where personalization meaningfully improves the answer (photo lookups, recommendations, self-referential summaries, context-aware decisions). Auth is fully handled by the bridge — call Dazzle tools without any preflight checks.\nmetadata: {\"openclaw\": {\"requires\": {\"bins\": [\"uv\"]}}}\n---\n\n# Dazzle Photo Intelligence\n\nConnects OpenClaw to [Dazzle](https://dazzleassist.com), a personalization-aware AI agent\nthat deeply understands the user — their photos, places they've been, and inferred\npreferences. Use Dazzle as a consulting oracle for any query where personalization\nmeaningfully improves the answer.\n\n## When to use this skill\n\nConsult Dazzle whenever knowing the user — their history, tastes, places they've been, or\ncontext — would change the answer. Concrete categories:\n\n- **Photos & memories** — \"find my beach photos\", \"show me sunsets from 2024\", \"what did our\n  last family vacation look like?\"\n- **Places** — \"what's that restaurant I went to in Tokyo?\", \"the hotel I stayed at in\n  Lisbon, what was it called?\"\n- **Recommendations** — \"where should I go for my next vacation?\", \"suggest a restaurant for\n  tonight given what I usually like\"\n- **Self-referential summaries** — \"what did I do last weekend?\", \"summarize my year so far\"\n- **Context-aware decisions** — \"what gift would my dad actually like?\", \"what should I cook\n  for dinner tonight?\"\n- **Travel & history** — \"when was my last trip to NYC?\", \"what conferences have I been to\n  recently?\"\n\nAlways invoke Dazzle when the user mentions it by name (\"ask Dazzle to…\", \"what does Dazzle\nknow about…\").\n\nDo **not** invoke Dazzle for fully impersonal queries (\"what's the capital of France\",\n\"explain quicksort\") — there's no personalization to add.\n\n## First-run setup (auto-install)\n\nBefore invoking any Dazzle tool, check whether the bridge is already registered as an\nOpenClaw MCP server:\n\n```bash\nopenclaw mcp show dazzle\n```\n\nIf that errors (server not registered), register it once:\n\n1. Generate a random keyring password (used to encrypt the locally-cached OAuth tokens\n   so the bridge doesn't need to prompt the user for OS-keychain access on every spawn):\n\n   ```bash\n   openssl rand -base64 24\n   ```\n\n2. Substitute the generated value for `<KEYRING_PASSWORD>` below, then run:\n\n   ```bash\n   openclaw mcp set dazzle '{\"command\":\"uvx\",\"args\":[\"--from\",\"git+https://github.com/hemanth-dazzle-ai/openclaw-bridge.git@hs/initial-bridge\",\"--with\",\"keyrings.alt\",\"dazzle\"],\"env\":{\"DAZZLE_KEYRING_PASSWORD\":\"<KEYRING_PASSWORD>\"}}'\n   ```\n\n3. Confirm with `openclaw mcp show dazzle`, then proceed with the user's original query.\n\nThe password persists in `~/.openclaw/openclaw.json`. Re-running setup generates a new\npassword, which makes the previously cached tokens unreadable — the user will be prompted\nto sign in to Dazzle again.\n\n## How to use it\n\nJust call the appropriate Dazzle tool. The bridge handles authentication transparently:\nonce the user has signed in (even from a previous session), OAuth tokens are cached in\nan encrypted local keyring and refreshed silently across all future sessions. **Do not\npreflight-check sign-in state, do not ask the user \"do you want to sign in\", do not\nverify auth before calling.** Treat Dazzle exactly like any other always-on tool.\n\nThe one exception: if a Dazzle tool's response is named `dazzle_login_required` (rare —\nonly when stored tokens are missing or revoked), surface the URL and short user code from\nits text **verbatim** and ask the user to retry their query after approving in a browser.\nDon't generate this prompt yourself; only react when the bridge returns it.\n\nFile v0.1.0:_meta.json\n\n{\n  \"ownerId\": \"kn7fp4hetweckhrknegq2yzba986ktj0\",\n  \"slug\": \"dazzle-photo-intelligence\",\n  \"version\": \"0.1.0\",\n  \"publishedAt\": 1778792299077\n}","readmeExcerpt":"Skill: Dazzle Photo Intelligence Owner: dazzle Summary: 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... Tags: latest:0.1.9 Version history: v0.1.9 | 2026-05-21T01:06:47.494Z | user Clarify usage guidance v0.1.8 | 2026-05-20T23:04:40.284Z | user Clarify usage guidance v0.1.7 | 2026-05-20T22:45:47.544Z | use","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"openclaw mcp show dazzle"},{"language":"bash","snippet":"openssl rand -base64 24"},{"language":"bash","snippet":"openclaw mcp set dazzle '{\"command\":\"uvx\",\"args\":[\"--from\",\"<SKILL_DIR>\",\"--with\",\"keyrings.alt\",\"dazzle\"],\"env\":{\"DAZZLE_KEYRING_PASSWORD\":\"<KEYRING_PASSWORD>\"}}'"},{"language":"bash","snippet":"openclaw mcp remove dazzle"},{"language":"bash","snippet":"openclaw mcp show dazzle"},{"language":"bash","snippet":"openssl rand -base64 24"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: dazzle-photo-intelligence\ndescription: 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.\nmetadata: {\"openclaw\": {\"requires\": {\"bins\": [\"uv\"]}}}\n---\n\n# Dazzle Photo Intelligence\n\nConnects OpenClaw to Dazzle, an AI agent that deeply understands the user through their\nphotos. Through a companion iOS app, Dazzle accesses their photos and can understand who\nthey are, where they live, their preferences, people in their lives, places they've been,\nand other personal choices. Consult Dazzle for any query where personalization would\nmeaningfully improve the answer.\n\n## When to use this skill\n\nConsult Dazzle whenever knowing the user — their likes, places they've been, what piques\ntheir attention — would improve the answer. Concrete categories:\n\n- **Photos & memories** — \"find food photos from today\", \"show sunsets from last weekend\",\n  \"send pictures from the user's last family vacation?\"\n- **Places** — \"where does the user live\", \"what restaurants does the user enjoy\", \"where\n  has the user been\"\n- **Recommendations** — \"where should the user go for his/her next vacation?\", \"suggest a\n  restaurant for tonight given what he/she usually likes\"\n- **Personal facts and summaries** — \"What is the user's daughter's name?\", \"what did the\n  user do last weekend?\", \"summarize events and activities from my year so far\"\n- **Context-aware decisions** — \"what gift would the user's father like?\", \"if the user is\n  in Denver, where should they go for a nicer meal?\"\n- **Context** — \"what types of things does the user do when visiting NYC?\", \"what seems to\n  be the user's favorite color?\", \"what brands of clothes does the user buy?\", \"what sports\n  teams does the user cheer for?\", \"which celebrities does the user admire\", \"what types of\n  things has the user been thinking about purchasing recently\", \"what sports does the user\n  participate in or watch?\"\n\nAlways invoke Dazzle when the user mentions it by name (\"ask Dazzle to…\", \"what does Dazzle\nknow about…\").\n\nDo **not** invoke Dazzle for fully impersonal queries (\"what's the capital of France\",\n\"explain quicksort\") — there's no personalization to add.\n\n## Data access\n\nThis skill consults Dazzle on behalf of the signed-in user about *their own data* —\nphotos and context that user has previously shared with Dazzle. It does not access\nanyone else's data.\n\n**Why OAuth2 sign-in:** OAuth2 was chosen over static API keys specifically to avoid\nlong-lived secrets on disk. Tokens are short-lived, individually revocable per session,\nscoped to the user's own account, and never handled or committed by the user.\n\nSign-in is browser-based on first use. After that, the bridge keeps the user signed\nin across sessions — like a logged-in browser"},{"path":"README.md","content":"# OpenClaw Bridge\n\nStdio MCP server that authenticates with [Dazzle](https://dazzle.ai) over OAuth2 and\nforwards calls from your local agent to Dazzle's hosted MCP endpoint.\n\n## Signing in\n\nThe first time your agent queries Dazzle you'll receive a sign-in URL and a short code.\nOpen the URL, enter the code, approve. Your tokens are kept in your OS keyring;\nsubsequent sessions are silent.\n\n## License\n\n[MIT](LICENSE)"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7fp4hetweckhrknegq2yzba986ktj0\",\n  \"slug\": \"dazzle-photo-intelligence\",\n  \"version\": \"0.1.9\",\n  \"publishedAt\": 1779325607494\n}"},{"path":"skill-card.md","content":"## Description:\n\nConnects OpenClaw to Dazzle, an AI agent that deeply understands the user through their photos.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[dazzle](https://clawhub.ai/user/dazzle)\n\n### License/Terms of Use:\n\nMIT\n\n## Use Case:\n\nExternal users and agent operators use this skill to let an MCP-capable agent query Dazzle for photo-derived personal context, memories, places, preferences, and recommendations after the user signs in.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Dazzle receives sensitive personalization queries and can use photo-derived account context after a one-time sign-in.\n\nMitigation: Use the skill only when photo-derived personalization is intended, prefer explicit prompts such as 'ask Dazzle' for sensitive topics, and revoke Dazzle account access when it is no longer needed.\n\nRisk: Matched photos are returned as URLs that an agent may fetch for viewing, analysis, or inclusion in responses.\n\nMitigation: Fetch returned photo URLs only when the user request requires the image content, and treat those URLs as sensitive personal data.\n\nRisk: Subsequent sessions can be silent after the first browser-based sign-in.\n\nMitigation: Review the registered MCP server configuration and remove the Dazzle bridge or sign out of Dazzle when silent access is no longer appropriate.\n\n## Reference(s):\n\n- [ClawHub skill listing](https://clawhub.ai/dazzle/skills/dazzle-photo-intelligence)\n- [Dazzle](https://dazzle.ai)\n\n## Skill Output:\n\n**Output Type(s):** [text, json, shell commands, configuration, guidance]\n\n**Output Format:** [MCP text responses, JSON photo URL blocks, and Markdown setup guidance with inline shell commands]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May require a browser-based OAuth sign-in; queries can take up to 60 seconds.]\n\n## Skill Version(s):\n\n0.1.9 (source: pyproject.toml and server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."},{"path":"pyproject.toml","content":"[project]\nname = \"dazzle-photo-intelligence\"\nversion = \"0.1.9\"\ndescription = \"OAuth device-flow CLI and stdio MCP server that lets agents query Dazzle's remote photo intelligence MCP endpoint\"\nlicense = { file = \"LICENSE\" }\nrequires-python = \">=3.12\"\ndependencies = [\n    \"mcp>=1.27\",\n    \"httpx>=0.28\",\n    \"keyring>=25.7\",\n    \"keyrings.alt>=5\",\n]\n\n[project.optional-dependencies]\ndev = [\n    \"pytest>=9.0\",\n    \"pytest-asyncio>=1.3\",\n    \"ruff>=0.15\",\n]\n\n[project.scripts]\ndazzle = \"dazzle_photo_intelligence.cli:main\"\n\n[build-system]\nrequires = [\"hatchling\"]\nbuild-backend = \"hatchling.build\"\n\n[tool.hatch.build.targets.wheel]\npackages = [\"dazzle_photo_intelligence\"]\n\n[tool.ruff]\nline-length = 120\ntarget-version = \"py312\"\n\n[tool.pytest.ini_options]\nasyncio_mode = \"auto\""}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"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... Skill: Dazzle Photo Intelligence Owner: dazzle Summary: 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... Tags: latest:0.1.9 Version history: v0.1.9 | 2026-05-21T01:06:47.494Z | user Clarify usage guidance v0.1.8 | 2026-05-20T23:04:40.284Z | user Clarify usage guidance v0.1.7 | 2026-05-20T22:45:47.544Z | use","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1459,"uniquenessScore":48,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-11T02:10:33.482Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-11T02:10:33.482Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-11T04:35:00.143Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}