How it works

Connect a tool to your AI in three steps

Each tool is an MCP server that runs on your machine. Add it to your AI app's config, and the AI can read and write through it, with every answer tied to its source.

Three steps

Pick, connect, ask

Your setup
  • OpenCRMCustomers, deals and every email or call transcript behind them.
  • OpenLedgerAccounts and double-entry transactions, with an audit row for every write.
  • OpenWatchAI sessions, prompts, tool calls and spend, each tied to a person. Claude today; other AI platforms on request.
{
  "mcpServers": {
    "opencrm": {
      "command": "/path/to/open-crm/node_modules/.bin/tsx",
      "args": [
        "/path/to/open-crm/src/mcp.ts"
      ],
      "env": {
        "CRM_DB_PATH": "/path/to/open-crm/data/crm.db"
      }
    },
    "openledger": {
      "command": "/path/to/open-ledger/.venv/bin/python",
      "args": [
        "/path/to/open-ledger/run_mcp.py"
      ]
    }
  }
}

~/Library/Application Support/Claude/claude_desktop_config.json on macOS, %APPDATA%\Claude\claude_desktop_config.json on Windows · Replace /path/to with where you cloned each repository.

Your AI

Questions you can ask with this setup

  • What's disputed on the renewal, and which emails say what?
  • Show me everything we know about this account, with sources.
  • Post this invoice, then show me the trial balance.
  • Reverse last Tuesday's duplicate payment.
  • Who used Claude most this month, and on which projects?
  • Show me the session behind yesterday's cost spike.
  • Which renewals have an open conflict, and has their revenue been posted?
  • What did the team spend on Claude last month, and is it booked?
  • Which Claude sessions this week mentioned this account?
  • Before the renewal call: what's disputed, what's been paid, and who has been working on it in Claude?

Install

Install the tools you picked. From each project's README. The seed step loads sample data so you can try it straight away.

OpenCRMREADME
$ git clone https://github.com/Attri-Inc/open-crm.git
$ cd open-crm
$ npm install
$ cp .env.example .env
$ npm run seed
OpenLedgerREADME
$ git clone https://github.com/Attri-Inc/open-ledger.git
$ cd open-ledger
$ python3 -m venv .venv && source .venv/bin/activate
$ pip install -r requirements.txt
$ python scripts/seed.py
OpenWatchREADME
$ git clone https://github.com/Attri-Inc/openwatch.git
$ cd openwatch
$ python -m venv .venv && source .venv/bin/activate
$ pip install -e ".[dev]"
$ cp .env.example .env
$ python scripts/seed.py

Connect

Where the config goes. Pick your AI app in the config panel above; it writes the right format. These are the files it goes into.

Claude Desktop
~/Library/Application Support/Claude/claude_desktop_config.json on macOS, %APPDATA%\Claude\claude_desktop_config.json on Windows
Claude Code
Run in your terminal. --scope user makes the tool available in every project.
Cursor
~/.cursor/mcp.json for every project, or .cursor/mcp.json in one project
VS Code
.vscode/mcp.json in your workspace. VS Code uses a "servers" key and a type field.
Gemini CLI
~/.gemini/settings.json, or .gemini/settings.json in one project

Config locations from each vendor's documentation, checked 24 September 2026.

Guarantees

Separate tools, the same promises. They share no code. Each one keeps these rules in its own repository.

a.riveratool call · Bash7f3a.jsonl:48211
j.chenpromptc91e.jsonl:2204
m.okafortool call · Edit0b7d.jsonl:15630
a.riverasession end7f3a.jsonl:90377
s.patelprompte4a2.jsonl:880

OpenWatch

Every answer shows its source

Each event keeps the file and byte offset it was read from, so an answer can be traced to the exact line.

  1. Artifact
  2. Observation
  3. Brief
  4. Conflict
open until a person resolves it

OpenCRM

Disagreements get flagged, not settled

When two sources disagree, OpenCRM opens a conflict and keeps both. A person resolves it, not the newest write.

  • 2 or more entry lines
  • Debits equal credits
  • Positive whole-cent amounts
  • Audit row in the same transaction

Posted · balanced · audited

Refused: A transaction needs at least 2 entry lines

OpenLedger

Bad writes are refused

Every posting is checked before it lands. One that fails is refused with the reason, and nothing is written.

#0117Cash sale$250.00
#0118Reverses #0117−$250.00
#0117 unchanged

OpenLedger

History is never edited

Corrections are new records. A mistaken transaction is reversed, and the original stays where it was.

ingest_artifactadd_observationsupersede_observationcreate_conflictresolve_conflictcreate_brieftraverse_graph
post_transactionreverse_transactionget_trial_balanceget_profit_lossget_balance_sheetget_audit_log
list_sessionsget_session_detailget_cost_breakdownsearch_messagesget_tool_usage_statssearch_audit_events

All three

They speak MCP

56 tools between them, each named for what it does.

OpenCRMbetter-sqlite3
OpenLedgeraiosqlite
OpenWatchaiosqlite

All three

Your data stays in one file

Each tool keeps its data in a SQLite file wherever you run it. No database server, no vendor cloud.

Apache License 2.03. Grant of Patent License

All three

Apache 2.0

Includes a patent grant. No copyleft terms for a procurement team to clear.

Together

Better together. Connect two or three and ask across them. Your AI decides which tools to call.

Example questions. The tool names are real; the answers depend on your data.

OpenCRM+OpenLedger

“Which renewals have an open conflict, and has their revenue been posted?”

Your AI calls

  1. list_conflictsOpenCRM
  2. search_transactionsOpenLedger
OpenWatch+OpenLedger

“What did the team spend on Claude last month, and is it booked?”

Your AI calls

  1. get_cost_breakdownOpenWatch
  2. search_transactionsOpenLedger
OpenWatch+OpenCRM

“Which Claude sessions this week mentioned this account?”

Your AI calls

  1. search_messagesOpenWatch
  2. search_entitiesOpenCRM
OpenCRM+OpenLedger+OpenWatch

“Before the renewal call: what's disputed, what's been paid, and who has been working on it?”

Your AI calls

  1. list_conflictsOpenCRM
  2. get_account_ledgerOpenLedger
  3. search_messagesOpenWatch

Start with one tool. Connect it to your AI today.

Clone it from GitHub and add it to your MCP client. When your team needs it hosted, with login, talk to Attri.