mcp server
opennous
The open-source revenue context graph. One source of truth for your pipeline and customers.
Set up
Runs on your computer. Pick your agent and operating system.
This project does not publish an install method we can turn into a config. Follow the README instead.
README
synced Oct 22, 2026Key capabilities
- Unified account records: Resolve emails, meetings, transcripts, product activity and CRM fields to the right person, company and deal. Uncertain matches go to review, never to a guess.
- Buying signals from every activity: Extract pain, goals, objections, competitors, buying intent, risk, expansion and staff changes, each linked to its account.
- Source citations: Each claim carries its source, confidence and validity. New evidence updates it, conflicts stay reviewable, manual entries stay protected, and the whole graph can be rebuilt from its raw history.
- Built for agents: 35 REST endpoints and an MCP server. One
get_contextcall returns the account, shaped for meeting prep, follow-ups or account reviews. - Self-hosted and secure by default: Run on your own database and model keys. Raw emails and transcripts stay with their participants, API keys can be read-only, and webhooks are signed.
- Works with your stack: 16 integrations across CRM, email, calendar, calls and outbound, plus LinkedIn.
Quickstart
Self-host the full stack with Docker. The database and sign-in (Supabase's open-source Postgres, auth and API) run inside it, so there is no Supabase account to create.
You need Docker (Compose v2.24+), Node 18+, git, three DNS records (app, api, mcp) pointing at the machine, and an AI provider key: one OpenRouter key runs every model (recommended), or use an Anthropic key, or any OpenAI-compatible endpoint, a local Ollama included. Linux servers use Docker Engine; macOS and Windows use Docker Desktop (or Colima / OrbStack on a Mac). Intel and ARM both work. On Windows, run the commands in WSL2 (recommended) or PowerShell; ./update.sh needs WSL2 or Git Bash.
git clone https://github.com/NousC/opennous.git && cd opennous
cp nous.env.example nous.env
# in nous.env, set APP_DOMAIN, API_DOMAIN, MCP_DOMAIN and OPENROUTER_API_KEY (or ANTHROPIC_API_KEY)
node scripts/selfhost-keys.mjs nous.env
docker compose --env-file nous.env up -d --build
The key script generates the database password, JWT secret, Supabase keys, ENCRYPTION_KEY and WORKER_SECRET, and ends by printing the owner's setup link:
then create the owner account at https://app.yourdomain.com/signup?setup=<token>
Open it and create the first account; it becomes the owner. Sign-ups without the token are refused, so the instance is closed from the start. Add teammates with a join link from Settings → Members → Create invite. Lost the link? docker compose --env-file nous.env logs db-schema prints it until an owner exists.
The stack runs Postgres with pgvector, Supabase Auth (GoTrue), PostgREST, the app containers and Caddy for TLS. To try it on a laptop, set the domains to localhost, api.localhost and mcp.localhost; Caddy then signs with its own local certificate, so your browser warns once and the CLI needs that certificate (Trying it on a laptop). ./update.sh pulls, rebuilds and applies new database migrations. The self-host guide covers email, backups and running against your own Supabase project instead.
To look around with fictional data first, load the demo workspace ("Fernpoint", 40 invented companies on .example domains):
docker compose --env-file nous.env cp supabase/seed/demo.sql db:/tmp/demo.sql
docker compose --env-file nous.env exec db psql -U postgres -v ON_ERROR_STOP=1 -1 -f /tmp/demo.sql
Everyone who has signed up is added to it as an admin; switch to it from the workspace menu. To remove it again (it touches nothing but the demo workspace, its team and its users):
docker compose --env-file nous.env cp supabase/seed/demo-reset.sql db:/tmp/demo-reset.sql
docker compose --env-file nous.env exec db psql -U postgres -v ON_ERROR_STOP=1 -f /tmp/demo-reset.sql
A self-hosted install has one workspace per team: creating a second one is refused (self_hosted_workspace_limit). The demo workspace has its own team, so it does not use yours up.
Then point your agent at your instance:
npx @opennous/cli@latest init --url https://api.yourdomain.com
How it works
- Observations. Every email, meeting, CRM change and event from your tools lands as immutable evidence, with its source and time.
- Identity resolution. Observations resolve to entities: one record per person, company and deal.
- Claims and signals. From the evidence on each entity, OpenNous derives claims (the current value of a fact, with confidence and freshness) and extracts signals.
- Permission-aware answers. Agents and your team read the result over MCP, the REST API and the app. Replies, meetings and closed deals come back as new observations, so the graph gets more accurate as you use it.
The repository is a pnpm workspace:
| Path | What it is |
|---|---|
packages/core | Identity resolution, observations, entities, claims, reconcile, governance |
apps/api | REST API, integrations, webhooks, automations |
apps/worker | Ingestion, extraction, scoring and scheduled jobs |
apps/frontend | Accounts, Graph, Activity, API keys, Integrations, Webhooks, Usage, Settings, automations |
apps/mcp | @opennous/mcp, the MCP server |
apps/cli | @opennous/cli, sign-in and agent setup |
More detail: The context graph.
Integrations
| Category | Tools |
|---|---|
| CRM | HubSpot, Salesforce, Attio |
| Email and calendar | Gmail, Google Calendar, any SMTP/IMAP mailbox |
| Calls and meetings | Fathom, Fireflies, Granola, Calendly, Cal.com |
| Outbound | Instantly, Smartlead, lemlist, HeyReach, EmailBison |
| Through Unipile |
On self-host, Gmail and Google Calendar connect through your own Google OAuth app: set GOOGLE_CLIENT_ID and GOOGLE_CLIENT_SECRET in nous.env and register https://<API_DOMAIN>/api/oauth/google/callback on the client (the redirect is derived from API_DOMAIN). Access is read-only (gmail.readonly, calendar.readonly). Composio is optional: set COMPOSIO_API_KEY to connect through it instead.
Setup for each one is in the provider docs.
Use it from your agent
npx @opennous/cli@latest init signs you in, saves a key to ~/.nous/config.json and registers the MCP server with your agent. To wire it up by hand, add this to your MCP host config:
{
"mcpServers": {
"opennous": {
"command": "npx",
"args": ["-y", "@opennous/mcp"],
"env": {
"NOUS_API_KEY": "your-workspace-key",
"NOUS_API_URL": "https://api.yourdomain.com"
}
}
}
}
Leave out NOUS_API_URL to use Cloud. Create keys under API keys in the sidebar (/keys).
The same data is on the REST API:
curl -X POST https://api.yourdomain.com/v2/context \
-H "Authorization: Bearer $NOUS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"focus": "acme.com", "intent": "meeting_prep"}'
Insights are read and written over MCP (get_insights, record_insight) and REST (GET and POST /v2/insights). See the MCP docs and the REST API reference.
Contributing
Read the contributing guide before you open a pull request. Questions go to Discord. Security issues go through SECURITY.md.
License
The server is AGPL-3.0. The MCP server and CLI (apps/mcp, apps/cli) are Apache-2.0, so installing them puts no obligations on your code. Details in LICENSING.md.