readdle/spark-cli-skills/use-spark

Claude Code and agent skill by readdle/spark-cli-skills

Trust tier 2
  • community
LLM review pending
Source check pending

Checking that the SKILL.md file is still in the repository.

Use the spark CLI to access the user's Spark email data - list emails, search by topic, read threads, check calendar events, find availability, look up contacts, and view team info. Use when the user asks about their emails, calendar, contacts, meetings, or scheduling.

Install

npx vskill@latest install readdle/spark-cli-skills/use-spark

SKILL.md

Using spark

spark is a CLI for the Spark email client. Use it to query the user's mailbox, calendar, contacts, meetings, and team data.

Running spark

bash
spark <command> [options]

Environment: spark is a thin client that talks over IPC to the user's running Spark Desktop app - it does not ship its own mailbox, network stack, or credentials. Run it directly on the user's computer against the live Spark Desktop process. Do not try to execute it inside a sandbox, container, CI runner, or any environment isolated from the user's desktop session - it will fail to connect. If Spark Desktop is not running, ask the user to launch it instead of retrying.

JSON output: add --json to any command to get its result as JSON instead of text - the same data, with full (untruncated) values, snake_case keys, and ISO 8601 dates. A failure prints {"error": {"message": "…"}} on stdout and exits non-zero. Prefer the default text when you only need to read the result; use --json when you need to process it (e.g. spark emails --json | jq '.emails[].id'). Fields are only ever added, never renamed or removed.

Commands

CommandDescription
accountsList accounts, calendars, teams, shared inboxes, and access levels
foldersList folders/labels with message counts
emailsList emails with filters and pagination
searchHybrid keyword + semantic search with full bodies
threadRead full thread - headers, bodies, attachments
attachmentRead a single email attachment by its ID (auto-downloads)
draftCreate, edit, or delete an email draft (new, reply, forward, from template), or list account signatures
templatesList saved message templates (personal and team)
templateShow a single template by ID or name with its placeholders
commentPost a team comment on a thread
eventsList calendar events for a time range
eventCreate, update, delete, or RSVP to a calendar event, including managing attendees / invitations
availabilityFind free time slots, optionally with attendees
contactsSearch contacts by name or email, or list the most-used ones
contactShow one contact's details and settings
teamShow team info, members, shared inboxes, assignments
meetingsList meeting transcripts
meetingRead a single meeting transcript
actionPerform actions on emails (archive, pin, snooze, assign, etc.)
contact-actionPerform actions on contacts (block, accept, categorize, etc.)
accounts

List all configured accounts with their aliases, calendars, teams, and shared inboxes. Each account and shared inbox shows its access level in parentheses, which controls what operations Spark can perform.

bash
spark accounts

Run this first to discover what accounts, calendars, and teams are available, and to check their access levels.

Access levels:

LevelAllowed operations
read-onlyList, search, and read emails, threads, folders, events, contacts, meetings, teams
triageEverything in read-only plus all write operations: drafts, team comments, email actions (archive, move, pin, snooze, assign, etc.), contact actions (block, accept, categorize, etc.)
sendEverything in triage plus mail-emitting operations: sending drafts (action send, including scheduled "Send Later"), and the entire event command: event create / event update / event delete / event rsvp, including attaching or detaching attendees via --add / --remove and the iTIP REQUEST / UPDATE / CANCEL / REPLY mail that goes with them.

Access levels are configured separately for each account and each shared inbox in Spark Desktop under Settings -> AI Agents. Shared inboxes can have a different access level than the parent account - for example, a personal account may have triage access while a shared inbox under the same team is read-only or disabled.

If a command requires a higher access level than the account or shared inbox has, it returns an error with instructions on how to change the level.

folders

List folders with message counts. Output includes folder identifiers in parentheses - use these as arguments to emails and search. Mailboxes backed by a Google account show (Gmail labels) on the Email Account or Shared Inbox header. Teams show the team name as a usable identifier for emails.

bash
spark folders # all accounts
spark folders user@example.com # single account
emails

List emails with metadata (ID, From, Date, Subject, Flags). Supports pagination and Gmail-style filters.

bash
spark emails # Unified Inbox
spark emails user@example.com:Archive # specific folder
spark emails "My Team" # all shared threads in a team
spark emails --filter "from:alice@co.com is:unread" # filtered
spark emails --filter "newer_than:7d has:attachment" # recent with attachments
spark emails --page 2 --page-size 20 # pagination
spark emails --order ascending # oldest first
spark emails --new-senders # show only new sender emails

GateKeeper filtering: When viewing the Inbox with GateKeeper in explicit mode, new sender emails are automatically filtered out and a "New Senders" count is shown at the top. Use --new-senders to view those emails. Use contact-action acceptContact <email> or contact-action blockContact <email> to accept or block a sender.

Folder identifier formats (run folders to see available ones):

FormatExampleMeaning
Bare nameInbox, ArchiveUnified folder (cross-account)
emailuser@example.comAccount inbox shorthand
email:Folderuser@example.com:ArchiveSpecific account folder
"Team Name""My Team"All shared threads in a team (quote if spaces)
shared@email:Inboxshared@co.com:InboxShared inbox open items (conversation view, matches Desktop)
shared@email:Archiveshared@co.com:ArchiveShared inbox done/archived items (conversation view)
shared@email:Foldershared@co.com:LabelOther shared inbox folder / label

Filter operators (combinable, Gmail-style):

OperatorExample
from:<addr>from:alice@co.com
to:<addr>to:bob@co.com
cc:<addr>cc:team@co.com
subject:<text>subject:"quarterly report"
before:yyyy/MM/ddbefore:2026/03/01
after:yyyy/MM/ddafter:2026/01/01
newer_than:Xdnewer_than:7d (also w, m, y)
older_than:Xdolder_than:30d
has:attachmentalso document, spreadsheet, presentation, reminder
is:unreadalso read, starred, pinned, unreplied
is:sharedemails shared to any team (alias for is:shared_email)
is:shared_inbox_openopen items in shared inbox
is:shared_inbox_donecompleted/closed items in shared inbox
category:personalalso priority, notification, newsletter, invitation, invitation_response
assigned_to:meemails assigned to current user
assigned_to:<email>emails assigned to specific teammate
assigned_to:unassignedshared inbox items with no assignee
assigned_to:otheremails assigned to someone else (not me)
assigned_by:meemails delegated by current user
filename:<name>filename:report.pdf
search

Two modes:

  • With a topic (keyword mode): Hybrid keyword + semantic search returning up to 20 emails with full bodies, sorted by relevance.
  • Without a topic (list mode): Paged compact table of every email matching --filter / --in across all folders and all accounts, sorted newest first. Same output as emails, but the default scope is "all folders" instead of the Unified Inbox. Trash, Spam, and Blocked are excluded (matching Spark's search field) unless --in explicitly targets one of those folders.
bash
spark search "quarterly report"
spark search "API integration" --filter "from:alice@co.com"
spark search "budget" --in user@example.com:Archive
spark search "vacation" --in user@example.com # all folders in account
# Keywordless list mode - filter across every folder
spark search --filter "from:alice@co.com" # every email from alice, all folders
spark search --filter "from:alice@co.com" --in user@example.com
spark search --filter "is:unread newer_than:7d" --page 2
ParameterRequiredDescription
<about>NoSearch topic (positional). Omit to switch to list mode.
--filterNoGmail-style filter (same operators as emails)
--inNoScope: account, team, folder, or shared inbox. All folders if omitted.
--pageNoPage number, 1-based (default: 1). List mode only.
--page-sizeNoEmails per page (default: 50). List mode only.
--orderNoSort order: ascending or descending. List mode only.

Use `search` with a topic when the user asks about content - it returns email bodies so you can answer questions. Use `search` without a topic when you need to filter emails (especially by `from:`) across every folder - emails only sees the Unified Inbox so it can't answer questions like "every email from alice@co.com, anywhere". Use emails for plain browsing of Inbox / one folder.

thread

Print every message in a thread - headers, full plain-text bodies, and attachment info. After the thread summary line, lists custom (non-system) folder labels once for the whole thread, using qualified names like account@domain.com:MyLabel (same style as folders).

bash
spark thread 1114 # by message ID from emails/search output
spark thread --download-attachments 1114 # also fetch attachments via IMAP
spark thread "https://sparkmailapp.com/dpl/bl?token=ABC..." # by Spark deep link

The positional argument accepts either a numeric message ID (the ID: line) or a Spark deep link (the Link: line) printed by a previous run - https://sparkmailapp.com/dpl/bl?token=..., readdle-spark://bl=..., or readdlespark://bl=....

A Reply-To: line appears only when that header points somewhere other than From - mailing lists and website contact forms carry the real correspondent there. draft --reply-to already addresses the reply to it, so don't pass --to yourself.

Each message's Attachments: block is a table with columns ID, Name, Size, MIME Type, and Path. The ID column is the attachment's stable pk - feed it to attachment to read the file contents (auto-downloads if necessary). The Path column shows the local file or (not downloaded, ...) for attachments not yet fetched.

Use emails or search to find message IDs (the ID column), then thread to read the full conversation. Use folders to list valid label identifiers for action attachLabel / detachLabel.

attachment

Read a single email attachment by its ID (pk) from the thread Attachments table. The file is auto-downloaded if it isn't cached locally yet.

bash
spark attachment 42 # print metadata (ID, Name, Size, MIME Type, Path, Message ID)
spark attachment 42 --stream > report.pdf # write raw file bytes to stdout

This is the start of the file. Read the full SKILL.md on GitHub.

Security

  • Security scanPassed, 100 of 100Pattern checks on the skill's files.
  • Model reviewNot runA model review is scheduled for the next rescan.

Quality evaluation

  • Task evaluationNot runNo evaluation yet. Run one in Skill Studio.

Source

Popularity

Repository stars
125
Repository forks
6
7-day trend score
24

Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.

Works with

Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.

  • Claude Code
  • Cursor
  • GitHub Copilot
  • Windsurf
  • Codex
  • Gemini CLI
  • Cline
  • Amp
  • Roo Code
  • Goose
  • Continue
  • Kilo Code
  • Junie
  • Trae
  • OpenHands
  • Qwen Code
  • AI Agent
  • Tabnine Chat
  • Sourcegraph Cody
  • Amazon Q
  • Firebase Genkit
  • Sweep
  • Devin
  • Phind
  • Mentat
  • Claude Desktop
  • Aider
  • GPT Pilot
  • Plandex
  • bolt.new
  • v0
  • Replit Agent
  • Anse
  • TypingMind
  • BetterChatGPT
  • LibreChat
  • Warp AI
  • Pieces
  • Fig AI
Embed badge
vskill VERIFIED badge
[![vskill VERIFIED](https://verified-skill.com/api/v1/skills/readdle/spark-cli-skills/use-spark/badge)](https://verified-skill.com/skills/readdle/spark-cli-skills/use-spark)

Something wrong with this skill or its page? Tell us.