Skip to content
Conduit

mcp server

Founder-OS

Open-source, self-hosted AI sales assistant for solo founders. Flags deals going quiet, drafts the follow-up email, and works inside ChatGPT and Claude via MCP. A lightweight AI CRM alternative to Hub

rahulsinghnegiii/Founder-OScommunitylistedunreviewed

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

FounderOS: open-source AI sales assistant for solo founders

FounderOS watches your sales pipeline, flags the deals that have gone quiet, and drafts the follow-up email for you to send. Founders rarely lose deals to competitors. They lose them to silence: a proposal nobody chased, a warm lead nobody emailed back. FounderOS makes sure every open deal gets its next touch.

It is a self-hosted, open-source alternative to a full CRM like HubSpot or Pipedrive, built for one-person companies. It runs on your own Postgres, uses the AI provider you already pay for (Claude, OpenAI, OpenRouter, Groq, or a free local model through Ollama), and plugs into ChatGPT and Claude as an MCP server.

Built for solo founders, indie hackers, freelancers, consultants, and small agencies who sell but do not want to maintain a CRM.

Quick start · Features · Use it from ChatGPT or Claude · Gmail sync · FAQ · Roadmap

Features

  • Stale-deal detection. Every open lead has a silence allowance based on its stage: 3 days for new, 5 for contacted, 7 for qualified, 4 after a proposal. The Sales agent scans on boot and every six hours, flags anything past its limit, and marks it critical at double the limit.
  • AI follow-up drafts. Each quiet deal gets a short, human email written from the lead's notes, stage, and any proposal you sent. Copy it, send it from your own inbox, click "Mark sent", and the silence clock resets.
  • Optional Gmail sync. Connect Gmail and the silence clock keeps itself current. FounderOS reads message headers only, never bodies: emailing a lead or hearing back from them resets their clock, and drafts you've already acted on close themselves.
  • Lead scoring. New leads are scored 0 to 100 so the pipeline sorts itself. A heuristic takes over when no AI is available.
  • Proposal follow-through. Marking a proposal as sent moves the lead, records the contact, creates a follow-up task due in three days, and notifies you.
  • Daily pipeline brief. Open value, value at risk, three concrete moves for today, and the risks, refreshed hourly.
  • Chat with your pipeline. Ask "which deals are going quiet?" or "draft a follow-up for Priya" and the Sales agent answers from live data. It also captures leads, tasks, and projects from plain sentences.
  • Works inside ChatGPT and Claude. A built-in MCP server lets ChatGPT, Claude, Cursor, or any MCP client read your pipeline and act on it.
  • Bring your own AI. Anthropic Claude, OpenAI, OpenRouter, Groq, or Ollama. With no AI key at all, it still runs with template drafts and rule-based briefs.
  • Private by default. Your data stays in your own database. One password protects the app, and AI keys never reach the browser.

How it compares

FounderOSA typical hosted CRM
Notices when a deal goes quietAutomatically, per stageYou build a report or remember
Writes the follow-up emailYes, from the deal's contextTemplates you fill in
Where your data livesYour PostgresThe vendor's cloud
PriceFree and MIT licensed; you pay only your AI provider, or nothing with OllamaUsually per seat, per month
Works from ChatGPT or ClaudeYes, via MCPVaries
SetupOne docker compose upAccount, onboarding, field setup

FounderOS is deliberately small. If you need team permissions, marketing automation, or a hundred integrations, a full CRM is the better tool.

Quick start

Docker Compose (recommended)

git clone https://github.com/rahulsinghnegiii/Founder-OS.git founderos && cd founderos
cp .env.example .env
# Edit .env: set APP_PASSWORD and ONE AI key (ANTHROPIC_API_KEY is the default choice).
docker compose up --build

Open http://localhost:5000. Add SEED_DEMO=1 to .env before the first start if you want a sample pipeline to click around in.

Local development

Requirements: Node 24, pnpm 10, and a Postgres you can reach.

pnpm install
cp .env.example .env            # set DATABASE_URL and one AI key
pnpm run db:push                # apply the schema
pnpm run seed:demo              # or `pnpm run seed` for an empty workspace
pnpm run dev:api                # terminal 1, API on :5001
pnpm run dev:web                # terminal 2, app on :5000

No Postgres handy? Start one in Docker and point DATABASE_URL at it:

docker run -d --name founderos-db -e POSTGRES_USER=founderos -e POSTGRES_PASSWORD=founderos -e POSTGRES_DB=founderos -p 5432:5432 postgres:16-alpine

Windows note: in Git Bash, prefix commands with MSYS_NO_PATHCONV=1 or BASE_PATH=/ gets rewritten to a Windows path. PowerShell users can run .\start.ps1.

Configuration

All configuration is environment variables. .env.example documents every one. The important ones:

VariablePurpose
DATABASE_URLPostgres connection string. Required.
APP_PASSWORDProtects the whole app behind one password. Leave empty only on your own machine.
ANTHROPIC_API_KEYRecommended provider. Default model claude-opus-5-5; override with ANTHROPIC_MODEL.
OPENAI_API_KEY, OPENROUTER_API_KEY, GROQ_API_KEY, OLLAMA_BASE_URLAlternative providers. The first configured one wins; AI_PROVIDER forces a choice.
MCP_TOKENTurns on the MCP endpoint for ChatGPT and Claude. Off when empty.
GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRETTurn on optional Gmail sync. Off when empty.
FOUNDER_NAMEUsed in prompts and email sign-offs until a profile name is stored.

Keys are read on the server only. Settings → AI Provider shows which provider is active and has a "Test connection" button.

Connect ChatGPT or Claude (MCP)

FounderOS ships an MCP server at /mcp, so you can work your pipeline from the assistant you already use. Ask "which deals are going quiet?", "draft a follow-up for Priya", or "mark Daniel as won", and it calls FounderOS directly.

1. Turn it on. Generate a token, put it in .env, and restart. MCP stays off until the token is set.

node -e "console.log(require('crypto').randomBytes(24).toString('hex'))"
# .env
MCP_TOKEN=<the value printed above>

2. Connect a client.

ClientHow
ChatGPTSettings → Apps & Connectors → Advanced → enable Developer mode, then create a connector. URL https://<your-host>/mcp/<MCP_TOKEN>, authentication "No authentication". The token in the URL is the credential.
Claude Codeclaude mcp add --transport http founderos https://<your-host>/mcp --header "Authorization: Bearer <MCP_TOKEN>"
Claude Desktop, Cursor, othersStreamable HTTP at https://<your-host>/mcp with header Authorization: Bearer <MCP_TOKEN>.

ChatGPT connects from OpenAI's servers, so it needs a public HTTPS address; localhost will not work. Deploy FounderOS, or run a tunnel such as cloudflared tunnel --url http://localhost:5000, and set APP_URL to that address so links in tool results point at it. Claude Code runs on your machine and can use http://localhost:5001/mcp directly. Which ChatGPT plans allow custom connectors and write actions changes over time, so check OpenAI's current documentation.

Tools

ToolDoes
search, fetchFind leads and proposals by text, then read the full record. The shape ChatGPT connectors expect.
founderos_get_pipelineStage totals, value at risk, drafts waiting, and the Sales agent's brief with today's moves.
founderos_list_stale_dealsDeals past their stage's silence limit, most urgent first.
founderos_list_leads, founderos_get_leadFilter, sort, and page through leads; get one lead with proposals and follow-up history. Leads can be named instead of passing an id.
founderos_list_follow_up_draftsFollow-up emails waiting to be sent.
founderos_create_leadAdd a lead. Refuses duplicates by email.
founderos_update_lead_stage, founderos_log_contactMove a deal or record outreach, with an optional dated note.
founderos_draft_follow_up, founderos_mark_follow_up_sentHave the Sales agent write an email, then record that you sent it. FounderOS never sends email itself.
founderos_scan_pipelineRun the stale-deal scan now.
founderos_sync_gmailPull new Gmail headers now and update last-contact dates (when Gmail sync is connected).

Treat the connector URL like a password: anyone holding it can read and edit your pipeline. Rotate it by changing MCP_TOKEN. The token is redacted from request logs and never returned to the browser.

Gmail sync (optional)

Connect Gmail and you stop logging contacts by hand. Every 15 minutes FounderOS reads the headers of new mail and, for each lead's address:

  • an email you sent resets that lead's silence clock and moves a new lead to Contacted;
  • a reply from the lead resets the clock too;
  • an open follow-up draft closes itself: marked sent if you emailed them, dismissed if they wrote back first.

FounderOS asks Google only for the gmail.metadata scope. That covers headers (from, to, subject, date) and not message bodies, and Google's consent screen says so. It still never sends email. The refresh token is stored encrypted in your database, and Disconnect deletes it and asks Google to revoke it.

Setup (about five minutes). Google requires each self-hosted install to use its own OAuth client.

  1. In Google Cloud Console, create a project and enable the Gmail API.
  2. Configure the OAuth consent screen: user type External, an app name, your email, and yourself as a test user. Google Workspace accounts can pick Internal instead.
  3. Create an OAuth client ID of type Web application with the authorized redirect URI http://localhost:5000/api/integrations/gmail/callback, or https://<your-host>/api/integrations/gmail/callback once deployed.
  4. Set GOOGLE_CLIENT_ID and GOOGLE_CLIENT_SECRET in .env, restart, and open Settings → Gmail sync → Connect Gmail.

While an External app is in "Testing", Google expires the connection after seven days and FounderOS asks you to reconnect. Switching the app to "In production" avoids that; because it is your own unverified app, Google then shows an "unverified app" warning that you click through (Advanced → Continue). Google's rules for unverified apps change from time to time, so check its current documentation if a step looks different.

The first sync reads back 30 days (GMAIL_SYNC_LOOKBACK_DAYS); later syncs read only new mail. Mail that doesn't involve a lead's address changes nothing.

FAQ

Is FounderOS free? Yes. It is MIT licensed and self-hosted. You pay your AI provider for the drafts and briefs it writes, or nothing if you run a local model with Ollama.

Does it send emails for me? No. It writes the draft and you send it from your own inbox, so nothing goes out without you reading it. Click "Mark sent" afterwards, or let Gmail sync notice, and the deal's silence clock resets.

Which AI models does it support? Anthropic Claude (default claude-opus-5-5), OpenAI, any model on OpenRouter, Groq, and local models through Ollama. Set one key in .env.

Can I use it without an AI key? Yes. Stale-deal detection, the pipeline, and scoring all work. Drafts fall back to templates and the brief to a rule-based summary.

Where is my data stored? In your own Postgres. The only data that leaves your server is the context sent to the AI provider you configured. With Ollama, nothing leaves your machine.

Can I use it from ChatGPT or Claude? Yes, through the built-in MCP server. See Connect ChatGPT or Claude.

Does it read my email? Only if you connect Gmail, and then only headers: who emailed whom, when, and the subject line. It never reads message bodies and never sends anything. See Gmail sync.

Can I import from another CRM? Not yet; CSV import is on the roadmap. Today you add leads in the app, by chat, or through MCP.

Is it for teams? No. It is single-user by design, with one password. Teams are better served by a full CRM.

Roadmap

  • Stale-deal detection with per-stage silence limits
  • AI follow-up drafts, lead scoring, proposal follow-through
  • Multi-provider AI: Claude, OpenAI, OpenRouter, Groq, Ollama
  • Docker Compose deployment and password protection
  • MCP server for ChatGPT, Claude, and Cursor
  • Gmail sync: last-contact dates and replies update themselves (headers only)
  • Suggest new leads from email threads
  • Outlook and IMAP sync
  • Weekly pipeline email
  • CSV import

Marketing, Operations, and Strategy departments are planned but deliberately parked until Sales is proven. See docs/VISION.md for the longer arc.

Architecture

pnpm monorepo, TypeScript end to end.

  • lib/api-spec/openapi.yaml is the contract. Zod schemas (lib/api-zod) and React Query hooks (lib/api-client-react) are generated from it with Orval.
  • lib/db is the Drizzle schema for Postgres.
  • artifacts/api-server is an Express 5 API. The Sales agent lives in src/services/sales-agent.ts with its pure, tested rules in src/services/sales-rules.ts. The provider layer in src/lib/ai is the only place that talks to an AI vendor, src/mcp is the MCP server, and Gmail sync is src/services/gmail-sync.ts with its rules in gmail-rules.ts.
  • artifacts/founder-os is a React 19, Vite, and Tailwind app. The Sales Desk is src/pages/sales.tsx.

In production one process serves both the API and the built frontend. That is what the Docker image does.

Development

The README demo is a HyperFrames composition in videos/readme-demo. After a UI change, re-render it from that folder with npx hyperframes render --format gif --fps 15 -o ../../docs/demo.gif.

pnpm run typecheck     # all packages
pnpm run test          # unit tests (node:test via tsx)
pnpm --filter @workspace/api-spec run codegen   # after editing openapi.yaml

Contributing

Issues and pull requests are welcome, especially Outlook or IMAP sync, CSV import, and deployment recipes. Read CONTRIBUTING.md first. Ask questions in Discussions and report security problems privately as described in SECURITY.md.

If FounderOS saves you a deal, starring the repo helps other founders find it.

License

MIT © Rahul Singh Negi

↑↓ navigate openesc close