Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx skills add bowlofarugula/texting --skill texting-messagesgit clone --depth 1 https://github.com/bowlofarugula/textingWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/bowlofarugula/texting/texting-messages)<a href="https://agentmods.dev/skills/bowlofarugula/texting/texting-messages"><img src="https://agentmods.dev/badge/skills/bowlofarugula/texting/texting-messages.svg" alt="Measured on agentmods" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00046 | $0.00815 |
| Opus 5 | $0.00023 | $0.00407 |
| Sonnet 5 | $0.00009 | $0.00163 |
| Haiku 4.5 | $0.00005 | $0.00081 |
Grade A, and why
texting-messages scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 7d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 70 lines — stays where its author put it; the contents beside it link to each section on GitHub.
/texting-messages — read iMessages
Arguments passed: $ARGUMENTS (free-form, e.g. "anything new from Sam?")
Reading happens through the read_messages MCP tool (from this plugin's
iMessage server), with list_chats for an inbox-style overview and
search_messages for keyword lookups. read_messages returns threads
labelled DM/Group with timestamped messages — any conversation, like a mail
connector reads any email. If the tools are missing or error with
authorization denied, run /texting-setup.
Resolve who they mean
Resolution happens through the tools — the engine integrates macOS Contacts itself, and chat rows come back already labelled with contact and display names. Don't query the AddressBook/Contacts databases directly; everything below is faster and stays inside the tool surface.
- A handle in the arguments → use it directly.
- A name → find it in the tool output:
list_chatsrows show contact names, group names, and participants alongside thechat_idand handles. Match the name there (check nicknames/partial matches), then read with the handle orchat_idyou found. Someone the user texts has a thread; if no row matches, there is usually nothing to read anyway. - Multiple matches → ask which one. No match → ask for the number/email,
then offer to add them to macOS Contacts properly (so Messages,
their phone, and the engine all learn the name at once):
First use triggers a one-time Automation prompt for Contacts — tell the user to click Allow. Never create a card without asking.osascript "<skill-base-dir>/../../scripts/add-contact.applescript" "<Name>" "<handle>" - No specific person ("catch me up") → call
read_messageswith nochatfor the most recently active threads (orlist_chatsfor a lighter overview) — threads arrive already labelled with names. - A group ("the family group", "the thread with Sarah and Tom") → find it
with
list_chats: group rows show the group's name, participants, andchat_id. Match by name or member set; pass that numericchat_idaschatto drill in. For a person, just pass their handle aschat— it covers their iMessage and SMS threads at once.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 7d ago First seen · 70 lines · 46 tokens per session scan A 55aa332738e4
texting-messages is a skill published in the GitHub repository bowlofarugula/texting (1 stars, last pushed 2mo ago), licensed Apache-2.0. It adds 46 tokens to every session and 815 once invoked, about $0.0002 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.
Other skills, from other repositories
c-messaging
Send and read messages via imsg (iMessage) and wacli (WhatsApp). Supports sending to individuals or groups, reading recent conversations, and checking unread messages across both platforms.
imsg
Read and send iMessages and SMS from the terminal via the imsg CLI.
imessage-inbox
Show the inbox/conversation list using imessage-tools.
imsg
Use imsg to read and send iMessage/SMS via macOS Messages.app.
anti-sleep
Keep a Mac awake with caffeinate during long builds, downloads, or supervised automation runs.
onlyswitch-deeplink
Invoke OnlySwitch built-in switches or buttons via deeplink. Use when the user asks to toggle or trigger an OnlySwitch action (e.g. empty trash, keep awake, dark mode, mute, hide desktop, clear clipboard, eject discs, Xcode derived data, and any other built-in switch or button). Resolve the request to the correct…