Raycast Quick Upload
Copy a screenshot, hit a hotkey, get a public URL and asset_id on your clipboard. Pair with Claude + the BlackOps MCP to attach images to posts, tweets, and threads without leaving the keyboard.
The flow
- 1. Copy any image (screenshot, paste, drag from Finder).
- 2. Trigger
Quick Upload Imagein Raycast (recommended hotkey: ⌘⇧U). - 3. A two-line payload lands on your clipboard:
asset_id=e89cf199-ef4a-428e-893d-a7be8c4faade url=https://.../site-assets/.../image.png - 4. Paste it into Claude. The MCP
attach_media_to_post/attach_media_to_tweet/attach_media_to_thread/attach_media_to_linkedin_posttools take theasset_iddirectly.
Why this exists
The MCP upload_media tool is URL-only — it fetches a publicly hosted URL into your media library. That works fine for assets already on the web, but a clipboard screenshot has no URL yet.
The Raycast command POSTs the bytes to POST /api/media/direct-upload, which:
- Authenticates with your existing extension API token (Bearer auth)
- Sniffs the content type from the bytes (no client-trust)
- Stores the image in the canonical media bucket
- Generates alt text server-side via Claude Haiku
- Inserts a row into
image_assetsso it shows up in your media library - Returns the
asset_id+ public URL in one round trip
Setup
Install the extension
The Quick Upload command lives inside the idea-vault Raycast extension (alongside Capture Idea). Clone the repo and run:
cd raycast-idea-vault
npm install
npm run devnpm run dev registers the extension with your local Raycast app. Once registered, you can stop the watcher — the command stays installed.
Configure preferences
In Raycast: Extensions → Idea Vault → Configure Command.
- API URL:
https://blackopscenter.com - API Token: your
boc_ext_…token (generate at Settings → Integrations; the same token powers Capture Idea and the Chrome extension).
Bind a hotkey
In Raycast settings, give Quick Upload Image a global shortcut. Recommended: ⌘⇧U.
Endpoint reference
POST /api/media/direct-upload is also callable directly from any HTTP client (iOS share-sheet, scripts, etc.).
Request
POST /api/media/direct-upload
Authorization: Bearer <boc_ext_…>
Content-Type: multipart/form-data
file: <binary> # required
filename_hint: <string> # optional
kind: <string> # optional, defaults to 'mcp-upload'
title: <string> # optionalResponse (200)
{
"asset_id": "uuid",
"url": "https://.../image.png",
"filename": "image-1234-abc.png",
"alt_text": "Server-generated alt text...",
"content_type": "image/png",
"size_bytes": 482910,
"site_id": "uuid",
"kind": "mcp-upload",
"created_at": "2026-05-09T...",
"thumbnail_url": "https://...",
"dimensions": { "width": 1920, "height": 1080 }
}Limits & errors
- Max body size: 50 MB
- Allowed types: jpeg, png, webp, gif, mp4, webm, quicktime (sniffed from magic bytes)
401— missing/invalid token403— token has no associated site413— body exceeds 50 MB415— unsupported / mismatched content type500— storage or DB failure
Test from the terminal
curl -X POST https://blackopscenter.com/api/media/direct-upload \
-H "Authorization: Bearer $BOC_EXT_TOKEN" \
-F "file=@/path/to/screenshot.png"Relationship to upload_media
upload_media (MCP)
URL-only. Pass file_url.
Use when an asset is already publicly hosted somewhere (CDN, GitHub, etc.).
/api/media/direct-upload (REST)
Bytes-in. Pass a multipart file.
Use when you have raw bytes (clipboard screenshots, share-sheet, scripts).