Image Search
Search the public web for real images.
When to Use
- You need real logos, transparent PNGs, or brand assets from the web
- You need real-world photos or reference images from the public web
When NOT to Use
- Generating new images or illustrations (use the
media-generation skill)
- General fact lookup or webpage text retrieval (use the
web-search skill)
- Extracting brand colors, fonts, and other official tokens from a website (use
extractBranding first)
Available Function
imageSearch({ query, count })
Search for public web images and return the raw provider response body.
Parameters:
query (str, required): Search text for the desired images
count (int, optional): Maximum number of results to return
Returns: Dict with optional results list. For each result, rely on result.title and result.properties?.url; other provider-specific fields may also be present.
Example response:
{
"type": "images",
"query": {
"original": "mid-century chair",
"spellcheck_off": false,
"show_strict_warning": false
},
"results": [
{
"type": "image_result",
"title": "Mid-century chair in walnut",
"url": "https://example.com/chairs",
"source": "example.com",
"page_fetched": "2026-04-17T23:51:41Z",
"thumbnail": {
"src": "https://imgs.example.com/thumb.jpg",
"width": 500,
"height": 333
},
"properties": {
"url": "https://imgs.example.com/full.jpg",
"placeholder": "https://imgs.example.com/placeholder.jpg",
"width": 1200,
"height": 800
},
"meta_url": {
"scheme": "https",
"netloc": "example.com",
"hostname": "example.com",
"favicon": "https://example.com/favicon.ico",
"path": "› chairs"
},
"confidence": "high"
}
],
"extra": {
"might_be_offensive": false
}
}
Example:
const response = await imageSearch({
query: "vintage travel posters",
count: 6,
})
const items = response.results ?? []
for (const item of items.slice(0, 4)) {
console.log(item.title, item.properties?.url)
}
Present Results
When showing image results to the user:
- Pick up to 4 strong results
- Download each image URL into
attached_assets/image_search/
- Call
presentAsset({awaitUserInput: false}) for each saved file
const fs = await import('node:fs/promises')
const path = await import('node:path')
const response = await imageSearch({
query: "mid-century chair",
count: 4,
})
const items = (response.results ?? []).slice(0, 4)
await fs.mkdir('attached_assets/image_search', {recursive: true})
for (const [index, item] of items.entries()) {
const imageUrl = item.properties?.url
if (!imageUrl) continue
const download = await fetch(imageUrl)
if (!download.ok) continue
const filePath = path.join(
'attached_assets/image_search',
'result_' + String(index + 1) + '.jpg',
)
await fs.writeFile(filePath, Buffer.from(await download.arrayBuffer()))
await presentAsset({
filePath,
title: item.title ?? 'Image search result',
awaitUserInput: false,
})
}
Best Practices
- Use
imageSearch, not provider-specific passthrough callbacks, so the implementation can change underneath without changing your code.
- For logos, search
"<company> logo png" or "<company> logo transparent" and prefer official domains, press kits, or brand asset pages.
- Present a small shortlist of the best results instead of dumping the full response body.
- Use
extractBranding first for official brand tokens, then fall back to imageSearch only when the logo is missing, low quality, or clearly wrong.
- Keep
count small when you are manually reviewing results. 4 to 8 is usually enough.
- Save chosen image URLs into
attached_assets/ before presenting or reusing them elsewhere.
- Remember that
count is the maximum number of results, not the total number of results. When presenting to the user, there may be less results presented than how many you requested.
1---2name: image-search3description: Find real web images, logos, and public photos for brand work, reports, and artifacts. Use when you need a few relevant results with a title and image URL you can inspect, present, or download.4---56# Image Search78Search the public web for real images.910## When to Use1112- You need real logos, transparent PNGs, or brand assets from the web13- You need real-world photos or reference images from the public web1415## When NOT to Use1617- Generating new images or illustrations (use the `media-generation` skill)18- General fact lookup or webpage text retrieval (use the `web-search` skill)19- Extracting brand colors, fonts, and other official tokens from a website (use `extractBranding` first)2021## Available Function2223### `imageSearch({ query, count })`2425Search for public web images and return the raw provider response body.2627**Parameters:**2829- `query` (str, required): Search text for the desired images30- `count` (int, optional): Maximum number of results to return3132**Returns:** Dict with optional `results` list. For each result, rely on `result.title` and `result.properties?.url`; other provider-specific fields may also be present.3334**Example response:**3536```json37{38 "type": "images",39 "query": {40 "original": "mid-century chair",41 "spellcheck_off": false,42 "show_strict_warning": false43 },44 "results": [45 {46 "type": "image_result",47 "title": "Mid-century chair in walnut",48 "url": "https://example.com/chairs",49 "source": "example.com",50 "page_fetched": "2026-04-17T23:51:41Z",51 "thumbnail": {52 "src": "https://imgs.example.com/thumb.jpg",53 "width": 500,54 "height": 33355 },56 "properties": {57 "url": "https://imgs.example.com/full.jpg",58 "placeholder": "https://imgs.example.com/placeholder.jpg",59 "width": 1200,60 "height": 80061 },62 "meta_url": {63 "scheme": "https",64 "netloc": "example.com",65 "hostname": "example.com",66 "favicon": "https://example.com/favicon.ico",67 "path": "› chairs"68 },69 "confidence": "high"70 }71 ],72 "extra": {73 "might_be_offensive": false74 }75}76```7778**Example:**7980```javascript81const response = await imageSearch({82 query: "vintage travel posters",83 count: 6,84})8586const items = response.results ?? []87for (const item of items.slice(0, 4)) {88 console.log(item.title, item.properties?.url)89}90```9192## Present Results9394When showing image results to the user:95961. Pick up to 4 strong results972. Download each image URL into `attached_assets/image_search/`983. Call `presentAsset({awaitUserInput: false})` for each saved file99100```javascript101const fs = await import('node:fs/promises')102const path = await import('node:path')103104const response = await imageSearch({105 query: "mid-century chair",106 count: 4,107})108109const items = (response.results ?? []).slice(0, 4)110await fs.mkdir('attached_assets/image_search', {recursive: true})111112for (const [index, item] of items.entries()) {113 const imageUrl = item.properties?.url114 if (!imageUrl) continue115116 const download = await fetch(imageUrl)117 if (!download.ok) continue118119 const filePath = path.join(120 'attached_assets/image_search',121 'result_' + String(index + 1) + '.jpg',122 )123124 await fs.writeFile(filePath, Buffer.from(await download.arrayBuffer()))125126 await presentAsset({127 filePath,128 title: item.title ?? 'Image search result',129 awaitUserInput: false,130 })131}132```133134## Best Practices1351361. Use `imageSearch`, not provider-specific passthrough callbacks, so the implementation can change underneath without changing your code.1372. For logos, search `"<company> logo png"` or `"<company> logo transparent"` and prefer official domains, press kits, or brand asset pages.1383. Present a small shortlist of the best results instead of dumping the full response body.1394. Use `extractBranding` first for official brand tokens, then fall back to `imageSearch` only when the logo is missing, low quality, or clearly wrong.1405. Keep `count` small when you are manually reviewing results. `4` to `8` is usually enough.1416. Save chosen image URLs into `attached_assets/` before presenting or reusing them elsewhere.1427. Remember that `count` is the maximum number of results, not the total number of results. When presenting to the user, there may be less results presented than how many you requested.