{
  "markdown": "# Munin\n\n> Open-source, headless HubSpot alternative.\n\n<p align=\"left\">\n  <a href=\"https://github.com/getmunin/munin/blob/main/LICENSE\"><img src=\"https://img.shields.io/github/license/getmunin/munin?color=3fb950&labelColor=0F1419\" alt=\"MIT License\"></a>\n  <a href=\"https://github.com/getmunin/munin/commits/main\"><img src=\"https://img.shields.io/github/last-commit/getmunin/munin?color=3fb950&labelColor=0F1419\" alt=\"Last commit\"></a>\n  <a href=\"https://registry.modelcontextprotocol.io\"><img src=\"https://img.shields.io/badge/MCP%20Registry-com.getmunin%2Fmunin-0066FF?labelColor=0F1419\" alt=\"Listed in the MCP Registry\"></a>\n</p>\n\n<p align=\"left\">\n  <a href=\"https://www.getmunin.com\"><b>Website</b></a> ·\n  <a href=\"https://vimeo.com/1204180225?autoplay=0&utm_source=github&utm_medium=readme&utm_campaign=demo-video\"><b>See it in action</b></a> ·\n  <a href=\"https://www.getmunin.com/en/docs/\"><b>Documentation</b></a> ·\n  <a href=\"https://registry.modelcontextprotocol.io\"><b>MCP Registry</b></a>\n</p>\n\nCRM, conversations, outreach, CMS, knowledge base, and analytics on one Postgres schema — exposed as tools your agents drive, not screens you click through. Headless the way a headless CMS is: there's a thin dashboard for settings, auth, and human-in-the-loop review, but the apps themselves have no admin UI. Every action runs through MCP tools, callable from any MCP-compatible client (Claude, Cursor, ChatGPT, custom runners) — same tools, same permissions, same audit log, whether a human or an agent is driving. Munin even ships its own: an in-process, per-org agent runner that answers live conversations and works the curation queue against an LLM provider you configure — so the platform runs out of the box, with external MCP clients optional.\n\n<p align=\"center\">\n  <img src=\".github/assets/dashboard.png\" alt=\"The Munin dashboard — a thin shell over the MCP tool surface\" width=\"100%\"><br>\n  <sub><b>The dashboard</b> — a thin shell for settings, auth, and human-in-the-loop review. No admin UI for app data; it drives the same MCP tools your agents call.</sub>\n</p>\n\n<p align=\"center\">\n  <img src=\".github/assets/widget-demo.webp\" alt=\"The Munin chat widget answering a customer from the knowledge base\" width=\"100%\"><br>\n  <sub><b>The embeddable chat widget</b> — answering a live customer from the knowledge base, ready to hand off to a human and be picked back up by the agent.</sub>\n</p>\n\n## Modules at a glance\n\n| Module | Tools | What it does |\n|---|---|---|\n| Knowledge Base | `kb_*` | documents, hybrid search, audience scoping |\n| Conversations | `conv_*` | channels, messages, handover |\n| CRM | `crm_*` | contacts, companies, deals |\n| CMS | `cms_*` | collections, entries, assets |\n| Outreach | `outreach_*` | campaigns, drafts, propose-only |\n| Analytics | `analytics_*` | page-view + search events |\n\nThese six modules aren't separate products — they share one Postgres schema, one permission model, and one audit log. Watch how they tie together:\n\n<p align=\"center\">\n  <a href=\"https://vimeo.com/1202399440?autoplay=0&utm_source=github&utm_medium=readme&utm_campaign=promo-video\">\n    <img src=\".github/assets/video-thumbnail.png\" alt=\"Watch: what Munin is and how it works\" width=\"100%\">\n  </a>\n</p>\n\n## Core modules\n\n#### Knowledge Base\n- Markdown articles organized into spaces, each scoped to the audiences allowed to see it.\n- Hybrid search that blends keyword matching with meaning-based results.\n- Website import — crawl a public site and turn each page into an article in the background, automatically dropping articles when their source page disappears.\n- Full version history with restore, plus a review queue for proposed edits.\n\n#### Conversations\n- One inbox across email, chat widget, voice (Threll.ai / Vapi), and SMS (Twilio / MessageBird).\n- Inbound *and* outbound — agents answer conversations and can place outbound calls.\n- Assignable, organized by topic, and searchable across every message.\n- Built-in handoff to a human, with notifications to your own systems as conversations change.\n\n#### CRM\n- Contacts, companies, deals, activities, pipelines, and segments.\n- AI-written summaries and suggested next actions, kept separate from what people edit by hand.\n- Consent tracking — the lawful basis and source for each contact, required before they can be added to any outreach.\n- Automatic duplicate detection that proposes merges for review, plus bulk contact import.\n\n#### CMS\n- Content collections with structured fields, and entries you can publish in multiple languages.\n- Rich content blocks for article bodies — callouts, quotes, media, and more.\n- Scheduled publishing and a media library for images and files.\n- Full version history with restore, search, and cross-references between entries.\n- A public content API serves your site or app, with engagement tracking built into every entry.\n\n#### Outreach\n- Propose-only outbound email — campaigns, segments, and drafts for both first touches and replies.\n- Recipients are drawn only from contacts who have recorded consent (see CRM).\n- Every message waits for human approval; nothing is ever sent automatically.\n\n#### Analytics\n- Captures page views and on-site searches across anything you want to measure.\n- CMS pages are tracked automatically; for any other page, you add a small tracking snippet.\n- Conversion funnels and per-visitor journeys — once someone is identified, their visits link to a CRM contact, including the anonymous ones from before.\n- Breakdowns by traffic source, referrer, and country, plus \"what to write next\" signals (popular topics, engagement, and searches that came back empty).\n\n## Automation\n\n#### Conversation loop\nAn in-process, per-org agent runner answers live conversations on every channel (chat widget, email, SMS, voice) against the LLM provider you configure — drafting and sending replies, and handing off to a human when needed.\n\n#### Curator loop\nThe in-process agent runner also works a durable background job queue: scheduled KB curation, CRM hygiene, contact extraction, stale-content review, and outreach drafts, with retry and dead-letter handling.\n\n#### Playbooks & skills\nPackaged markdown procedures (`skill://module/<verb-object>`) for multi-step, cross-module workflows, surfaced over MCP — followed both by Munin's own runner and by any external AI agent operating on the platform.\n\n## Platform\n\n#### Data portability\nSymmetric `*_export` / `*_import` MCP tools (and `/v1/<module>/export|import` REST endpoints) per module, so an agent can move an org's data between a self-hosted server and the cloud in either direction. See `skill://playbooks/data-migration`.\n\n#### Audit & webhooks\nEvery action is written to an audit log, and webhooks fan those events out to your own endpoints with signed, replayable deliveries.\n\n#### Alerts & feedback\nOperational issues surface as system alerts the agent can list, acknowledge, and resolve. An in-product feedback channel lets you file feature requests and vote on Munin's public roadmap.\n\n#### Auth & access\nSign-in and access control run on BetterAuth, with OAuth 2.1 dynamic-client registration and team invites.\n\n## See it in action\n\n> Lovable builds your frontend. Munin spins up your operations. One prompt, one MCP endpoint — and the agents do the rest.\n\nWatch Lovable build a real website from a single prompt while Munin stands up everything behind it — the CMS the blog reads from, a seeded knowledge base, analytics, and a chat widget that already knows the business. No click-ops, no screens to wire up; the agent does the work, over one MCP endpoint. Then a real customer conversation plays out: answered from the knowledge base, handed off to a human when it matters, and picked back up by the agent to close.\n\n<p align=\"center\">\n  <a href=\"https://vimeo.com/1204180225?autoplay=0&utm_source=github&utm_medium=readme&utm_campaign=demo-video\">\n    <img src=\".github/assets/demo-thumbnail.png\" alt=\"Watch: Lovable builds the frontend while Munin stands up everything behind it\" width=\"100%\">\n  </a>\n</p>\n\n## Two ways to run\n\n**Self-host** (this repo): single-tenant, invite-only.\n\n```bash\ngit clone https://github.com/getmunin/munin.git\ncd munin\ncp .env.example .env\ndocker compose up\n```\n\nSecrets left at their `.env.example` placeholders are auto-generated on first boot and persisted in the `munin-data` volume — fine for local self-hosting. For shared or production deployments, set strong `MUNIN_AUTH_SECRET` + `MUNIN_KEY_PEPPER` + `MUNIN_ENCRYPTION_KEY` values (`openssl rand -base64 48`) in `.env` instead.\n\nThe first user to sign up becomes the org admin; subsequent users need an invitation token or an email whose domain is in `MUNIN_ALLOWED_EMAIL_DOMAINS`.\n\n**Hosted** (https://www.getmunin.com): multi-tenant, one signup per org.\n\n## Try it locally\n\nAfter `docker compose up`, the backend listens on `:3001` and the dashboard on `:3000`.\n\n1. Open `http://localhost:3000` and register the first user — they become the singleton org admin.\n2. In the dashboard, go to **Settings → API keys** and mint an admin key (`mn_admin_…`). Shown once; treat like a password.\n3. Poke at the API and tools:\n\n```sh\n# REST control plane — direct, no OAuth\ncurl -s http://localhost:3001/v1/kb/spaces \\\n  -H \"Authorization: Bearer mn_admin_...\" | jq\n\n# MCP tool browser (recommended for poking at tools/skills)\nnpx @modelcontextprotocol/inspector\n# In its UI: URL = http://localhost:3001/mcp, Auth = Bearer mn_admin_...\n\n# Raw curl over Streamable HTTP — useful for sanity-checking the transport\ncurl -N -X POST http://localhost:3001/mcp \\\n  -H \"Authorization: Bearer mn_admin_...\" \\\n  -H \"Content-Type: application/json\" \\\n  -H \"Accept: application/json, text/event-stream\" \\\n  -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/list\"}'\n```\n\nThe OpenAPI spec for the REST control plane is at `packages/backend-core/openapi.json`. To wire an MCP client like Claude or Cursor, see [Connect your AI agent](#connect-your-ai-agent) below.\n\n## Connect your AI agent\n\nOnce you've signed up (hosted) or run `docker compose up` (self-host), point your MCP client at the URL — `http://localhost:3001/mcp` for self-host, or `https://mcp.getmunin.com` for hosted.\n\n**Claude Code (CLI):**\n\n```sh\nclaude mcp add munin http://localhost:3001/mcp\n```\n\n**Claude Desktop** — add to your MCP config:\n\n```json\n{\n  \"mcpServers\": {\n    \"munin\": {\n      \"url\": \"http://localhost:3001/mcp\"\n    }\n  }\n}\n```\n\nThe first call triggers an OAuth consent screen in your browser, then your agent has the full tool surface — Knowledge Base, Conversations, CRM, CMS, Outreach, Analytics.\n\n## Two trust contexts, one MCP endpoint\n\nThe same `/mcp` endpoint serves two distinct callers, audience-aware:\n\n- **Admin agents** (Claude Desktop, Cursor, internal automation) — OAuth-authorized by you. Full tool surface, scope-gated per `kb:*`, `conv:*`, `crm:*`, `cms:*`, `outreach:*`, `analytics:*`.\n- **End-user agents** (your voice AI, web chatbot, mobile app helper) — short-lived delegated tokens minted server-side from your backend, scoped to one of your end-users. Only self-service tools (read your own contact, send a message in your own conversation).\n\nSee `packages/backend-core/src/control/delegated-token.controller.ts` for the token-mint API. The `@getmunin/sdk` Node client wraps it.\n\n## Stack\n\n| Layer | Tech |\n|---|---|\n| Language & runtime | TypeScript, Node 24 LTS |\n| Monorepo | Turborepo, pnpm |\n| Backend | NestJS |\n| Frontend | Next.js |\n| Data | Postgres + pgvector, Drizzle |\n| Protocol & auth | MCP Streamable HTTP, BetterAuth + OAuth 2.1 |\n\n## Documentation\n\nDeveloper docs live at **[getmunin.com/docs](https://www.getmunin.com/en/docs/)** — guides, the REST API reference, the full MCP tool list, and the skill library.\n\n## Contributing\n\nContributions are welcome. `pnpm install`, then `docker compose up` (or `pnpm dev`) gives you a full stack on `:3001` (backend) and `:3000` (dashboard). Branch from `main` as `<type>/<kebab-summary>` (e.g. `feat/website-import-reconcile`), keep PRs focused, and make sure CI (lint, typecheck, test, build) passes.\n\nSee [CONTRIBUTING.md](./CONTRIBUTING.md) for setup, commit conventions, and PR guidelines.\n\n## Security\n\nFound a vulnerability? Please **don't** open a public issue — email **security@getmunin.com** instead. See [SECURITY.md](./SECURITY.md) for scope and our response timeline.\n\n## License\n\nMIT. See [LICENSE](./LICENSE).\n\nBundled third-party dependencies retain their own licenses — see [THIRD_PARTY_LICENSES.md](./THIRD_PARTY_LICENSES.md) (generated by `pnpm licenses:generate`, verified in CI).\n",
  "bytes": 12546,
  "sha": "e12b7ab55105f5f04795039c04841bda98c6654b370d97b119195c9a5b83d799",
  "repo_slug": "getmunin/munin",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_com_getmunin_munin_8f6b7b85/readme"
}