Author once in Claude Code. Run autonomously on your own infra with Hermes Agent.
A complete, working stack for automating the six repeating tasks that eat every agency operator's week.
Quick start Β· Architecture Β· The six skills Β· MCP servers Β· FAQ Β· Article
- What this is
- Quick start
- Architecture
- What's included
- The six skills
- How the two tools split the job
- MCP servers
- Memory layer
- Configuration reference
- Example output
- Roadmap
- FAQ
- Contributing
- Acknowledgments
- License
Most agencies run on six repeating tasks:
| Task | What it eats |
|---|---|
| Status updates for clients | 4-6 hours per account lead per week |
| Briefs on new leads | 30-60 min per inbound lead |
| First drafts of content | 2-4 hours per piece |
| Daily mention + competitor checks | 30 min per morning per operator |
| Internal handoffs and retros | 2-3 hours per week per team |
| Final QA before things ship | 30-90 min per deliverable |
This repo automates all six on a stack of two free, open tools.
βββββββββββββββββββββββ βββββββββββββββββββββββ
β β SKILL.md (open β β
β Claude Code β agentskills.io β Hermes Agent β
β (build environ.) β ββββ format βββββΊ β (autonomous β
β β β runtime) β
β β’ Authors skills β β β
β β’ Writes MCP svrs β Skills move β β’ Cron scheduler β
β β’ Iterates fast β between freely β β’ Persistent mem β
β β’ Reviews diffs β β β’ Slack/TG/Discord β
β β β β’ Self-hosted, MIT β
βββββββββββββββββββββββ βββββββββββββββββββββββ
β² β
β βΌ
You sit here Your team sees this
refining skills. in Slack every day.
Stack at a glance:
- π€ Six working skills. Drop them into Hermes and they run.
- π Generic CRM template. Adapt to HubSpot, Salesforce, Pipedrive, Close, Folk, Attio, or any CRM.
- π§± Two complete MCP servers. Pipedrive (CRM) and Notion (project tracker).
- π Setup guide. End-to-end walkthrough from zero to one running skill.
- π Self-hosted, MIT-licensed. Your data stays on your infrastructure.
# 1. Install both tools (one curl each)
curl -fsSL https://claude.ai/install.sh | bash
curl -fsSL https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash
# 2. Clone this repo
git clone https://github.com/thoughtpilot99/agency-ops-stack.git
cd agency-ops-stack
# 3. Install the six skills into Hermes
./install.sh
# 4. Open Claude Code in the repo
claudeπ For the full walkthrough, see docs/setup.md.
After bootstrap, you'll have all six skills available in Hermes:
$ hermes skills list
NAME CADENCE DELIVERY
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
weekly-client-status-digest Mon 07:00 #client-status
lead-enrichment-brief on CRM event DM to account lead
content-draft-from-brief on brief ready thread on writer's task
cross-platform-monitor daily 09:00 #radar
weekly-retro-prep Fri 16:00 #leadership
deliverable-qa-check on task review thread on taskflowchart LR
Dev[You + Claude Code] -->|writes SKILL.md| Folder[Shared skill folder]
Folder -->|symlinked into| Hermes[Hermes runtime]
Hermes -->|cron / event triggers| Skill[Skill executes]
Skill <-->|MCP tools| CRM[(Your CRM)]
Skill <-->|MCP tools| PT[(Project tracker)]
Skill <-->|reads/writes| Mem[(Per-client memory)]
Skill -->|posts result| Slack[Slack / Telegram / Discord]
Slack -->|edits + feedback| Mem
classDef build fill:#7C3AED,color:#fff,stroke:none
classDef runtime fill:#10B981,color:#fff,stroke:none
classDef store fill:#3B82F6,color:#fff,stroke:none
classDef output fill:#F59E0B,color:#fff,stroke:none
class Dev,Folder build
class Hermes,Skill runtime
class CRM,PT,Mem store
class Slack output
sequenceDiagram
autonumber
participant Cron as Hermes cron
participant Skill as weekly-client-status-digest
participant Mem as Memory (FTS5)
participant CRM as CRM MCP
participant PT as Project tracker MCP
participant Slack
Cron->>Skill: Monday 07:00 fires
Skill->>Mem: load client.acme_corp namespace
Mem-->>Skill: voice rules, banned topics, account lead
Skill->>PT: list_tasks_for_project(acme_corp, since=7d)
Skill->>CRM: list_deals(status=all, since=7d)
Skill->>Slack: channel_history(#client-acme, since=7d)
PT-->>Skill: 14 task updates
CRM-->>Skill: 6 deal updates
Slack-->>Skill: 23 messages
Skill->>Skill: synthesize 200-word note
Skill->>Slack: post to #client-status
Slack-->>Mem: account lead's edits feed back in
The skills never reference vendor names. They call MCP tools by standard names. The mapping happens inside each MCP server.
flowchart TB
subgraph Skills["Skills (vendor-agnostic)"]
S1[weekly-client-status-digest]
S2[lead-enrichment-brief]
S3[weekly-retro-prep]
end
subgraph Contract["Standard tool contract"]
T1[list_deals]
T2[get_deal]
T3[list_contacts]
T4[get_contact]
end
subgraph Servers["One MCP server per CRM"]
M1[pipedrive-mcp]
M2[hubspot-mcp]
M3[salesforce-mcp]
M4[your-crm-mcp]
end
Skills --> Contract
Contract --> Servers
M1 -.-> P1[(Pipedrive API)]
M2 -.-> P2[(HubSpot API)]
M3 -.-> P3[(Salesforce API)]
M4 -.-> P4[(Your CRM API)]
classDef skill fill:#7C3AED,color:#fff,stroke:none
classDef contract fill:#F59E0B,color:#fff,stroke:none
classDef server fill:#10B981,color:#fff,stroke:none
classDef api fill:#3B82F6,color:#fff,stroke:none
class S1,S2,S3 skill
class T1,T2,T3,T4 contract
class M1,M2,M3,M4 server
class P1,P2,P3,P4 api
Swap CRMs by writing one new MCP server. Skills do not change.
agency-ops-stack/
βββ π README.md βββ you are here
βββ π article.md The long-form piece this repo accompanies
βββ βοΈ install.sh Bootstrap script
βββ π LICENSE MIT
β
βββ π€ skills/ Six agentskills.io-compliant skills
β βββ weekly-client-status-digest/
β β βββ SKILL.md Skill instructions + frontmatter
β β βββ scripts/ Optional helper scripts
β β βββ pull_context.py
β βββ lead-enrichment-brief/
β β βββ SKILL.md
β β βββ scripts/enrich.py
β βββ content-draft-from-brief/
β β βββ SKILL.md
β βββ cross-platform-monitor/
β β βββ SKILL.md
β βββ weekly-retro-prep/
β β βββ SKILL.md
β βββ deliverable-qa-check/
β βββ SKILL.md
β
βββ π mcp-servers/ MCP server templates + worked examples
β βββ README.md Pattern overview + tool contracts
β βββ _crm-template/ Generic CRM skeleton (adapt to any vendor)
β β βββ server.py FastMCP scaffold with CHANGEME markers
β β βββ requirements.txt
β β βββ README.md Step-by-step adaptation guide
β βββ pipedrive-mcp/ Complete Pipedrive example
β β βββ server.py
β β βββ requirements.txt
β β βββ README.md
β βββ notion-projects-mcp/ Complete Notion projects example
β βββ server.py
β βββ requirements.txt
β βββ README.md
β
βββ π examples/
β βββ clients.yml.example Client list schema with comments
β βββ cron-commands.md Exact hermes cron create commands
β
βββ π docs/
βββ setup.md End-to-end install walkthrough
βββ claude-code-vs-hermes.md When to use which tool
βββ verified-sources.md Citation trail for every technical claim
Each skill is one folder with one SKILL.md file following the agentskills.io spec. The frontmatter requires only name and description; everything else is optional.
| # | Skill | Trigger | Delivery | What it does |
|---|---|---|---|---|
| 1 | weekly-client-status-digest |
Cron Β· Mon 7am | Slack #client-status |
One status note per active client from project tracker + CRM + Slack |
| 2 | lead-enrichment-brief |
Event Β· new CRM lead | Slack DM to account lead | One-page brief with TL;DR, prior touches, why-now, risk flags |
| 3 | content-draft-from-brief |
Event Β· brief ready | Slack thread on task | Three rough drafts differing in hook, thesis, and structure |
| 4 | cross-platform-monitor |
Cron Β· daily 9am | Slack #radar |
Ranked digest of mentions, competitor moves, buying signals |
| 5 | weekly-retro-prep |
Cron Β· Fri 4pm | Slack #leadership |
Retro doc with wins, misses, snapshots, questions for Monday |
| 6 | deliverable-qa-check |
Event Β· task to review | Slack thread on task | Link integrity, voice rules, banned words, naming, version |
π‘ Sequencing tip: Start with skill 1 (status digests). High payoff per hour, low risk, obvious failure modes from the first run. The memory-heavy skills (lead enrichment, content drafting) get better over weeks as the team's edits feed back into memory.
| Task | Use Claude Code | Use Hermes Agent |
|---|---|---|
| Write a new skill | β | |
| Iterate on a skill's prompt | β | |
| Scaffold an MCP server | β | |
| Debug an existing skill | β | |
| Run a skill on cron | β | |
| Run from Slack / Telegram / Discord | β | |
| Maintain per-client memory across runs | β | |
| Process paying-client data on your own infra | β | |
| Internal team automation (PR reviews, dep audits) | β (Routines) |
Claude Code is the build environment. Hermes is the runtime. They share the same skill format, so skills move between them without rewriting.
π For the long form, see docs/claude-code-vs-hermes.md.
The skills call a small set of standard tool names. Each MCP server translates those names into its vendor's actual API calls.
Every skill that touches the CRM calls these four tools:
| Tool | Purpose |
|---|---|
list_deals(status, limit) |
List deals filtered by status |
get_deal(deal_id) |
Fetch one deal with custom fields |
list_contacts(query, limit) |
List or search contacts |
get_contact(contact_id) |
Fetch one contact |
Every skill that reads project state calls these four:
| Tool | Purpose |
|---|---|
list_projects(filter_status) |
List projects, optionally filtered |
get_project(project_id) |
Fetch one project page |
list_tasks_for_project(project_id, status) |
List tasks under a project |
recent_updates(project_id, since_iso) |
Tasks edited since a timestamp |
| Vendor | CRM | Project Tracker | Auth pattern | Status |
|---|---|---|---|---|
| Pipedrive | β (worked example) | API key in api_token query param |
Shipped | |
| Notion | β (worked example) | Bearer (integration token) | Shipped | |
| HubSpot | π§ (adapt template) | Bearer (Private App token) | Template ready | |
| Salesforce | π§ (adapt template) | OAuth bearer | Template ready | |
| Close | π§ (adapt template) | Bearer | Template ready | |
| Folk | π§ (adapt template) | Bearer | Template ready | |
| Attio | π§ (adapt template) | Bearer | Template ready | |
| ActiveCampaign | π§ (adapt template) | API key in Api-Token header |
Template ready | |
| Copper | π§ (adapt template) | API key + email in headers | Template ready | |
| Zoho CRM | π§ (adapt template) | OAuth bearer | Template ready | |
| Linear | π§ (adapt pattern) | API key in header | Pattern in repo | |
| Airtable | π§ (adapt pattern) | Bearer | Pattern in repo | |
| Asana | π§ (adapt pattern) | Bearer | Pattern in repo | |
| ClickUp | π§ (adapt pattern) | API key in header | Pattern in repo |
π§ Legend: β ready to use as-is Β· π§ use
_crm-template/and follow the adaptation guide
cp -r mcp-servers/_crm-template mcp-servers/my-crm-mcp
cd mcp-servers/my-crm-mcp
# Edit server.py:
# 1. Rename env var (CRM_API_KEY β HUBSPOT_API_KEY, etc.)
# 2. Set API_BASE
# 3. Swap auth pattern in _call()
# 4. Fill four endpoint placeholders
# Test:
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
python server.py
# Register with Hermes:
hermes config set # or hermes dashboardNo skill edits required.
flowchart LR
Skill[Skill execution] -->|reads at start| NS[Client namespace]
NS --> AL[Account lead]
NS --> AC[Active campaigns]
NS --> VR[Voice rules]
NS --> BT[Banned topics]
NS --> RW[What account lead rewrites]
NS --> RW2[Recent winners]
Skill -->|produces draft| Slack
Slack -->|account lead edits| Feedback[Diff: kept vs cut]
Feedback -->|FTS5 + LLM summary| NS
classDef skill fill:#7C3AED,color:#fff,stroke:none
classDef store fill:#3B82F6,color:#fff,stroke:none
classDef out fill:#F59E0B,color:#fff,stroke:none
class Skill skill
class NS,AL,AC,VR,BT,RW,RW2,Feedback store
class Slack out
Hermes keeps cross-session memory using FTS5 full-text search plus an LLM summarization pass. Each client gets its own namespace.
client.acme_corp:
account_lead: "Sarah Mitchell"
active_campaigns:
- "Q3 outbound to mid-market SaaS"
- "Lifecycle email series for product activation"
voice_rules:
max_sentence_length: 18
banned_phrases: ["synergy", "best in class", "next-gen"]
em_dashes: forbidden
banned_topics:
- "competitor X"
- "the partnership with Y (under NDA)"
what_sarah_rewrites:
- "She always rewrites the deal-movement section. Keeps it shorter, drops 'pipeline'."
- "She cuts forward-looking commitments unless they're in the tracker."
recent_winners:
- <link to last week's note Sarah barely edited>π Why this works: Week one's draft reads like a competent intern's first try. Week ten reads closer to what Sarah herself would have written, because the agent has watched her edit nine drafts and learned what she keeps and what she cuts.
| Variable | Required by | Purpose |
|---|---|---|
HERMES_HOME |
install.sh |
Override Hermes config dir (default ~/.hermes) |
PIPEDRIVE_API_KEY |
pipedrive-mcp |
Pipedrive API token |
NOTION_TOKEN |
notion-projects-mcp |
Notion integration token |
NOTION_PROJECTS_DB_ID |
notion-projects-mcp |
Notion projects database ID |
NOTION_TASKS_DB_ID |
notion-projects-mcp |
Notion tasks database ID |
CRM_API_KEY |
_crm-template |
Generic CRM API key (rename when adapting) |
CRM_API_BASE |
_crm-template |
Generic CRM API base URL (rename when adapting) |
# Skills
hermes skills list # show installed skills
hermes skills install <url-or-id> # install from registry or URL
hermes skills update # pull upstream changes
hermes skills uninstall <skill> # remove
# Cron
hermes cron create --skill <name> "<prompt>" # schedule a skill
hermes cron list # show all scheduled jobs
hermes cron edit <job-id> # update schedule
hermes cron pause <job-id> # suspend without deleting
hermes cron resume <job-id> # resume
hermes cron run <job-id> # trigger on next tick
hermes cron remove <job-id> # delete
# One-shot execution
hermes chat -s <skill> -q "<prompt>" # run a skill once
# Memory
hermes memory setup # interactive provider selection
hermes memory status # show current config
hermes memory off # disable external provider
# Platforms
hermes gateway setup # connect Slack/Telegram/Discord
hermes slack manifest --write # generate Slack app manifest
hermes whatsapp # WhatsApp pairing
hermes auth # manage OAuth credentials
# Diagnostics
hermes doctor # diagnose issues
hermes dashboard # web UIA real client status digest as it lands in Slack:
## Acme Corp
π© Two deliverables slipped past target this week.
Sarah's team closed the homepage rebuild and the lifecycle email series on
schedule. The Q3 outbound campaign launched on time, but Acme paused after
two days when their head of growth flagged inbox-warming concerns.
Pipedrive shows the renewal call set for May 22 with their CMO. Three new
tickets opened this week, two from the Acme product team asking for
custom dashboards we haven't scoped or quoted. The slipped deliverables
are the analytics audit (target May 8, now in review) and the H2 content
calendar (target May 12, still in draft, stuck on a stakeholder review
that didn't happen Wednesday). Sarah is meeting Acme's head of growth on
Friday to walk through both. The outbound team has a remediation plan
ready for the campaign restart on Monday.
Account team reads it, edits it in the channel, sends it to the client. The agent watches what they kept and what they cut. Next Monday's draft moves a little closer.
- β Six core agency-ops skills following agentskills.io spec
- β Generic CRM MCP template + Pipedrive worked example
- β Notion projects MCP (worked example)
- β Setup guide + cron command reference
- β Vendor-agnostic tool contracts (skills swap CRMs without edits)
- π
_project-tracker-template/for generic project-tracker adaptation - π HubSpot + Salesforce worked examples
- π Linear MCP example
- π Webhook receiver helper (Cloudflare Worker / Vercel function template) for event-triggered skills
- π
clients-onboardingskill (auto-build a client namespace from a public website)
- β³
invoice-followupskill (payments + reminders) - β³
proposal-draftskill (from discovery notes + similar past deals) - β³ Stripe MCP for invoicing data
- β³ Gmail / Outlook MCP for email thread context
- β³ A skill self-review eval suite
- π Multi-CRM support per agency (different CRMs for different clients)
- π Notion-native client list (replace
clients.yml) - π A "what changed this quarter" skill that diffs successive memory snapshots
- π Web dashboard that wraps the cron jobs and memory namespaces
π‘ Want one of the wishlist items sooner? Open an issue or submit a PR.
Do I need both Claude Code AND Hermes Agent?
Yes for the full pattern. Claude Code is the build environment (writing and iterating on skills, scaffolding MCP servers). Hermes is the runtime (running skills on cron, maintaining memory, reaching into Slack). You can technically run skills inside Claude Code Routines if you want a single-tool setup, but you give up self-hosting, persistent memory across sessions, and the messaging gateway. For agency-ops work, both tools earn their keep.
What does "vendor-agnostic" actually mean here?
Every skill in this repo calls MCP tools by their standard names (list_deals, list_projects, etc.). They never reference a vendor name like pipedrive.list_deals. The mapping from "standard name" to "vendor's actual API call" happens inside each MCP server. If you swap CRMs, you write one new MCP server. Every skill keeps working without any edits to the skill files themselves.
How much does this cost to run?
Both tools install for free. Costs:
- Hermes Agent: $0/month for the runtime itself (MIT licensed, you host it)
- LLM tokens: you pick the provider. Estimate $20-100/month for a 10-client agency depending on model choice and skill frequency.
- Claude Code: your existing Claude subscription
- Infrastructure: $5-20/month if you run Hermes on a small VPS, or $0 on a Mac mini you already own
What if a skill outputs something bad?
Every client-facing skill in this repo has a human-in-the-loop step. The agent drafts; the human edits and ships. Status digests land in a Slack channel the account team reviews before sending. Lead briefs land in deal records that sales leads read before the call. Content drafts go to writers, not directly to clients. The pattern is "agent drafts, human ships," not "agent ships."
Can I run this without exposing my CRM data to a third-party LLM?
Yes. Hermes supports local LLM endpoints (vLLM, llama.cpp, Ollama, any OpenAI-compatible endpoint). Configure the LLM provider during hermes setup and point it at your local model. Your CRM data, project tracker data, and client memory never leaves your infrastructure.
How long does the memory take to start paying off?
Depends on how often the skill runs and how much the team edits the drafts. Weekly skills (status digests, retro prep) typically need 6-10 cycles before the agent's draft requires minor edits instead of major rewrites. Daily skills (cross-platform monitor) get there faster. Event-triggered skills (lead enrichment) improve based on volume. High-traffic agencies see meaningful improvement faster.
What if Hermes ships a breaking change to its CLI?
The skill format (agentskills.io) is the stable surface. CLI commands (hermes cron create, hermes skills install, etc.) may evolve. Watch the Hermes Agent releases for breaking changes, and consult hermes <command> --help for the current syntax. The skills in this repo do not depend on CLI specifics. They only depend on the open skill format.
Can multiple people on the team trigger skills?
Yes. Once hermes slack manifest --write is configured and the Slack app is installed, every skill exposes as a Slack slash command. Any team member in the workspace can run /skill-name. For cron-triggered skills, no one needs to do anything; they fire on schedule.
Is this production-ready?
It's working code that real agencies use. It is not "enterprise" software (no SLAs, no dedicated support, no compliance certifications). Two reasonable patterns: (1) run it on a single VPS for your own agency, ship it, iterate, or (2) fork it, harden it for your environment, and maintain your own copy. The MIT license allows both.
How do I contribute a new MCP server?
See Contributing below. The short version: copy _crm-template/, adapt it, test it locally, and open a PR with the new server folder + README. Same for project trackers, billing systems, or any other vendor.
PRs welcome for:
- π New MCP servers for CRMs, project trackers, billing, support, or anything else with an HTTP API
- π€ New skills for agency-ops workflows we haven't covered (proposal generation, invoice followups, churn alerts)
- π Bug fixes in existing skills or servers
- π Documentation improvements, especially in
docs/and the per-skill SKILL.md files - π Translations of the docs
- Open an issue describing what you want to add (skip for typo fixes)
- Fork the repo
- Make the change in a feature branch
- Test locally (run the skill in Claude Code, deploy to Hermes if applicable)
- Open a PR with:
- A short description of what changed
- Why it matters
- How you tested it
- Prose: plain language. No em dashes. No "it's not X, it's Y" constructions. No architectural buzzphrases. Match the voice of article.md.
- Code: type hints on every public function. Docstrings that explain when and why to use the function. Format with
blackfor Python. - SKILL.md files: follow the agentskills.io spec exactly.
nameanddescriptionare required; everything else is optional. Keep the body under 500 lines.
This stack exists because of these projects:
- Anthropic Claude Code. The build environment.
- Nous Research Hermes Agent. The autonomous runtime.
- agentskills.io. The open skill spec that lets skills move freely between agents.
- Model Context Protocol. The standard for connecting agents to tools.
- FastMCP. The Python helper that makes MCP servers small.
Plus the open-source CRM and project-tracker APIs we map to: Pipedrive, HubSpot, Salesforce, Close, Folk, Attio, ActiveCampaign, Copper, Zoho, Notion, Linear, Airtable, Asana, ClickUp.
MIT Β© 2026 Agency Ops Stack contributors
π Want the long-form rationale? Read the article that this repo accompanies.
Made for agency operators who want to ship outcomes, not status updates.
Quick start Β· Architecture Β· The six skills Β· Article Β· Setup