[Skip to main content](#main-content)     [Kevin Lewis](/)  [Blog](/blog)      # Living With an Agent That Controls My Daily Tools

 [2026-09-11]    I run [Hermes Agent](https://hermes-agent.nousresearch.com/) on my Mac mini. An agent is only as useful as the systems it can reach into, so I’ve been hooking it up to my daily tools. Here’s how I’ve connected them all and what each one gives the agent.

Each integration works the same way: a CLI or API wrapper wrapped in a Hermes skill. The agent invokes the skill, the tool talks to the outside world. Here’s how each one works.

## [Skills: where the instructions live](#skills-where-the-instructions-live)

A skill is how I teach Hermes a new tool. It’s a configuration file that gives the agent a tool definition, usage examples, the CLI manual page or API reference, and context specific to my setup.

Hermes reads the skill, learns what flags to pass, when to use which subcommand, and what the output looks like. Without a skill, the agent knows it has access to `icalbuddy` but has to guess the syntax or waste tokens pulling up a manual. With a skill, it reads the instructions and proceeds.

Skills are also where I encode constraints - which calendar ID maps to which label, whether the agent should draft or send, what flags to always include. They’re the bridge between raw tool access and how the agent actually uses it in my life.

## [Email](#email)

[mail-app-cli](https://github.com/intelligrit/mail-app-cli) wraps macOS Mail.app. Accounts, mailboxes, messages, search, send, attachments. I run it from `~/mail-app-cli/mail-app-cli` and wrap it in a skill with the CLI manual page. Every call uses `--no-cache` to keep results fresh.

Hermes can search my inbox, draft replies, read thread context, organize messages. Same stack I use. If I ask it to find all emails from someone last week, it constructs the right search command, parses the output, and summarizes the results across all inboxes.

The skill tells it to land emails in drafts and NEVER to send email itself. I sign off on any outgoing message.

## [Calendar](#calendar)

[icalbuddy](https://hasseg.org/icalBuddy/) (`brew install ical-buddy`). Read-only.

I’ve documented each calendar, what it’s for, my conventions for event naming and scheduling patterns. The manual is in the skill along with specific rules. Hermes can check my schedule and finds open slots, knowing my work calendar from my personal one. Knows what “busy” means in each. Understands my conventions for marking my babysitter’s unavailability, which isn’t an actual event for me but tracked in my calendar regardless.

## [Slack](#slack)

[slackcli](https://github.com/shaharia-lab/slackcli). Hermes reads threads, sends messages, searches conversations. I use it in my freelance practice and community workspaces and not in my day job. There’s nothing technically stopping me from doing this, but internal policy is such that I do not.

## [Beeper](#beeper)

[Beeper](https://www.beeper.com/) is a unified messaging platform that bridges multiple chat services (WhatsApp, Signal, Telegram, LinkedIn Messages) into a single interface. It runs as a local daemon and provides an official CLI that I can call from Hermes. Same pattern as the others: read, write, search.

I use this to make sure I’m not dropping the ball on anyone I’ve promised to follow up with. This is how Hermes can see the conversations I’m having with friends, family, and colleagues outside of Slack.

## [Linear &#x26; Google Docs](#linear--google-docs)

Via the [`mcpc`](https://github.com/apify/mcpc) CLI MCP client maintained by [Apify](https://apify.com). Hermes checks ticket status, updates issues, reads project boards. I use the same pattern for Google Docs.

## [Obsidian](#obsidian)

My Obsidian vault lives in iCloud. Hermes can search my knowledge base, write notes, reference stored ideas. It’s the memory layer that syncs across my devices. I’ve created a folder called `Agents` where I allow my agents to do their work, but it has context access over my whole vault.

## [What it can actually do](#what-it-can-actually-do)

The agent does all of this already:

- My Hermes agent has access to a separate email inbox via [Agentmail](https://www.agentmail.to/). An email comes in, and I can forward it to the agent with instructions as simple as “add this to Linear” or more complex like “work in progress is in Obsidian in the client folder - create a Google Doc and draft an email reply with the link”

- I ask it to find all emails from a specific client, summarize the thread, and check if I’ve scheduled anything with them. It searches across all inboxes, pulls messages I might have had elsewhere with them, scans my calendar for related events, and gives me a one-page summary.

- I asked it to draft a response to a Slack thread I missed. It reads the thread context, checks my Obsidian notes for relevant project details, and drafts a reply I can review and send.

- I ask it to prepare a status update for a client meeting. It pulls the latest Linear ticket status for the project, checks Google Docs for recently-edited documents, and compiles it into a draft note.

Each of these requires the agent to cross at least two systems. That’s where the value lives.

## [The daily brief](#the-daily-brief)

The most useful application so far is a daily brief. Every morning, Hermes pulls together:

- New emails since last night, grouped by thread, with anything that needs a reply flagged

- Any emails I said I would take action on that are still in my inbox

- Today’s calendar events, including any conflicts or back-to-back blocks

- Slack messages that were @-mentioned or dropped into priority channels overnight

- Linear tickets that moved or were assigned since I last checked

It helps me prioritize what to tackle across the multiple fronts of my life. I get it daily on Telegram before I wake up. It’s not everything, just the things that need my attention. The rest stays in the tools, where I can dig if I want.

## [Access control](#access-control)

Access control is critical. I give my agent broad access. Here’s what each tool provides at the permission level:

ToolReadWriteDeleteSendEmail (mail-app-cli)Inbox, mailboxes, messagesDrafts, eventsMessages, threadsEmailsCalendar (icalbuddy)All calendarsEvents——Slack (slackcli)Threads, messages, searchMessagesMessagesMessagesBeeperAll channels, DMsMessages—MessagesLinear (mcpc)Tickets, projects, boardsTickets, commentsTickets—Google Docs (mcpc)All docsAll docs——ObsidianAll vault notesAllAllAll
Every row shows what the agent could do with that tool’s access.

For most tools, I’ve constrained the agent via skill instructions - don’t send emails, only draft. Don’t send Slack messages without review. These are soft guardrails: good instructions, but nothing that physically prevents the agent from ignoring them.

For the hardest edge cases, I layer additional controls. My agent reads a `SOUL.md` file that is very explicit about what it should and shouldn’t be able to do. It’s a direct instruction to the agent itself, telling it exactly where the boundaries are. The skill tells the agent how to use the tool. The `SOUL.md` tells the agent whether it should use the tool at all.

Some of the tools above provide blanket access, and I’m actively working on tighter constraints.

All of my reasoning runs on local models. I don’t send my emails, my calendar, my Slack messages, or my notes to a datacenter. Everything runs on my Mac mini, where these tools have their authentication. You can read the full setup at [My Local Model Setup](https://lws.io/blog/my-local-model-setup/). The agent acts, but the data never leaves the box.

     Kevin Lewis &copy; 2016-2026