How your agent works.
Markdown procedures the agent can read at runtime, written by humans who know the domain.
analytics 3
Analytics: Identify visitors and link tracking to CRM contacts
Link an anonymous analytics visitor to a known end-user / CRM contact so page-views and searches show up on the contact's journey.
Analytics: Track CMS entry views
Use the `_tracking` block that every CMS delivery response already ships to record per-entry views, keyed by stable entry id, without minting any key.
Analytics: Track website traffic
Mint a public `mn_track_*` API key, drop the one-line tracker script into your site, and query view events to understand what readers engage with.
cms 7
CMS: Author content with blocks
Define typed block types on a collection and author rich in-article content (callouts, galleries, product cards) whose embedded assets and entry references are validated, expanded on read, and tracked for deletion safety.
CMS: Design a collection
Turn "I need a blog / product catalog / FAQ / landing-page content store" into a working `cms_create_collection` call — pick field types deliberately, order fields for the editor, decide localization up front, and avoid the field-migration paper cuts.
CMS: Localize an entry
Configure locales, author entries per language, and switch the org's default locale without breaking already-published entries.
CMS: Migrate content in bulk
Move entries from an external CMS (or between Munin collections) idempotently — preserve references, rewrite assets, reconcile schema drift.
CMS: Publish an entry
Move a CMS entry through draft → published — immediate, scheduled, or rolled back — without losing work to optimistic-lock conflicts.
CMS: Review stale entries
Periodic curator pass — find drafts that have stalled, published entries that haven't been touched in months, and orphaned assets. Reports findings with recommended actions. No persistence layer; the operator reviews the curator-runner's log/reply and acts manually via existing CMS tools.
CMS: Upload an asset and embed it
Two-phase asset upload (request presigned upload → send binary → complete), embed in entries, and audit unused assets.
conv 6
Conv: Escalate a conversation to a human
How an external chat-widget bot detects that a human/agent in Munin has replied and yields the conversation.
Set a conversation's topic and title
When a new inbound conversation is created, read its first end-user message, tag it with the best-fitting topic (creating one only when confident none fit), and give it a short title if it doesn't already have one. Fires on every `conversation.created` event so the inbox is triaged the moment a message lands — without operator intervention.
Conv: Set up a chat widget
Provision a per-channel widget API key, push transcripts via POST /v1/widget/messages, and wire the human-handoff webhook.
Conv: Set up email and chat-widget channels together
Stand up email + widget conversation channels for a new tenant in one pass — configure, test, hand off.
Conv: Set up an email channel
Configure SMTP outbound and optional IMAP inbound for an email channel, then verify the credentials.
Conv: Strip the signature from an inbound email message
Cleanup pass that removes the sender's sign-off and contact block from an inbound email body that has already had its quoted reply stripped, then writes the cleaned body back via `conv_strip_message_signature`.
crm 6
CRM: Clean up contact data
Periodic curator pass — find duplicate / inconsistent contacts, file high-confidence pairs as structured merge proposals via crm_propose_merge. Designed to be run on a cadence by an admin agent (weekly is a good default). The operator reviews via crm_list_merge_proposals and resolves with crm_apply_merge_proposal / crm_dismiss_merge_proposal.
CRM: Deduplicate contacts
Find duplicate contacts (same person, multiple rows) and consolidate them. There is no merge tool — this skill documents the manual reconcile pattern.
CRM: Extract a contact from a message
When a conversation closes, read the thread for identifying info the end-user volunteered (name, email, phone, company, title) and persist it to the CRM as a contact — auto-applied, no proposal queue. Designed to fire on every `conversation.closed` event so visitor-volunteered identity becomes structured CRM data without operator intervention.
CRM: Import and score leads
Bulk-import contacts, attach them to companies and a deal pipeline, log the source touchpoint, and seed AI summaries for downstream prioritization.
CRM: Onboard a new customer
Recommended sequence for capturing a new customer, attaching them to a company, and seeding the AI summary that drives later prioritization.
CRM: Progress a deal through the pipeline
Move a deal through pipeline stages with the right activity log at each gate, then refresh AI summary so prioritization stays fresh.
kb 4
KB: Create the first space
Stand up a fresh org's knowledge base — pick a space taxonomy, create the first space, optionally seed a welcome doc.
KB: Import articles in bulk from CSV or JSON
Generalized bulk import pipeline for KB articles from any structured source. Companion to import-from-google-docs — that one covers chunking; this one covers source handling and idempotency.
KB: Import knowledge from Google Docs (or any text source)
Bulk-load articles into the knowledge base, sized for vector search and FTS to perform well.
KB: Review and curate content
How an admin agent turns resolved-handover conversations into KB documents, so the next end-user with the same question gets a real answer instead of another handover.
outreach 3
Outreach: Draft an initial email
Periodic curator pass that drafts personalised first-touch outreach emails for every enabled campaign. One pending proposal per (campaign, contact). Drafts go into the operator review queue — never auto-send. Runs weekly by default; the operator approves each draft before it leaves the org.
Outreach: Draft a reply
Per-message curator pass that drafts a suggested reply when an inbound message lands on an outreach-originated conversation. Drafts go to the operator review queue — never auto-send. Triggered event-driven from `conversation.message.received` whenever the conversation has an `outreachCampaignId` and `agentMode='draft_only'`.
Outreach: Review pending proposals
Operator review pass over drafted outreach proposals — approve (which sends) or dismiss each pending draft. In MCP App hosts this renders the interactive Munin Inspector panel; elsewhere, drive the same decision tools directly.
playbooks 5
Playbook: Customer acquisition (CRM + Conv)
End-to-end flow from a fresh lead list to first conversation — bulk-import contacts, send a welcome email, log the touchpoint, hand off to a human if interest signals fire.
Playbook: Data migration (self-host ⇄ cloud)
Move one org's data between two Munin servers (self-hosted and cloud, either direction) using the per-module export/import tools — in foreign-key order, threading the returned idMap so dependent records resolve their parents on the target.
Playbook: Frontend integration (Conv widget + Analytics + CMS)
Wire a freshly-scaffolded frontend (Lovable, Bolt, Replit, v0, Cursor, Claude Code, …) to a Munin tenant — chat widget, page-view tracker, and live CMS content — without rediscovering the same five gotchas every time.
Playbook: Publish and distribute (CMS + KB + Conv)
Author content in the CMS, mirror the parts that should be searchable to the KB, and announce the publish to a conversation channel.
Playbook: Support desk launch (Conv + CRM + KB)
Stand up a working support desk for a new tenant — channels, contacts, knowledge base — so the first ticket has tooling around it.