Skip to content
Conduit

mcp server

opennous

The open-source revenue context graph. One source of truth for your pipeline and customers.

NousC/opennouscommunitylistedunreviewed

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, 2026

License: AGPL v3 npm Discord

Key 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_context call 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

  1. Observations. Every email, meeting, CRM change and event from your tools lands as immutable evidence, with its source and time.
  2. Identity resolution. Observations resolve to entities: one record per person, company and deal.
  3. 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.
  4. 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:

PathWhat it is
packages/coreIdentity resolution, observations, entities, claims, reconcile, governance
apps/apiREST API, integrations, webhooks, automations
apps/workerIngestion, extraction, scoring and scheduled jobs
apps/frontendAccounts, 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

CategoryTools
CRMHubSpot, Salesforce, Attio
Email and calendarGmail, Google Calendar, any SMTP/IMAP mailbox
Calls and meetingsFathom, Fireflies, Granola, Calendly, Cal.com
OutboundInstantly, Smartlead, lemlist, HeyReach, EmailBison
LinkedInThrough 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.

Star history

Star History Chart

↑↓ navigate openesc close