{
  "markdown": "# Kernal\n\nOpen-source knowledge graph for professionals. Auto-extracts entities and relationships from natural conversation via [MCP](https://modelcontextprotocol.io).\n\nTalk to Claude naturally about your meetings, calls, and interactions. Kernal stores people, organizations, topics, and relationships — building a knowledge graph you own.\n\n## What's Included (Open Source)\n\nEverything you need to run Kernal locally on your own machine:\n\n- **13 MCP tools** — ingestion, CRUD, query, corrections (see full list below)\n- **SQLite database** — local-first, your data never leaves your machine\n- **LLM-driven extraction** — Claude reads your text, decides what to extract, and calls structured write tools\n- **Entity resolution** — fuzzy matching + Levenshtein distance prevents duplicates\n- **CLI** — `init`, `serve`, `status`, `export`\n- **Cloud server** — Express.js with API key auth, rate limiting, CORS, session management\n- **Dashboard** — React app with network graph, timeline, action items, overview\n- **50 tests** — comprehensive test suite\n\nThis is a fully functional knowledge graph you can run yourself, for free, forever.\n\n## What Andes Provides (Managed Service)\n\nFor teams and professionals who want more, [Andes](https://andes.no) offers:\n\n- **Cloud hosting** — access your knowledge graph from any device, no self-hosting\n- **Dashboard** — hosted interactive visualizations powered by your data\n- **Multi-user** — team features, shared knowledge bases, role-based access\n- **Onboarding & support** — we set it up for you and help your team get value from day one\n- **Industry workflows** — pre-built patterns for executive search, consulting, professional services\n\nThe open-source core is the engine. Andes wraps it with infrastructure, UX, and support.\n\n---\n\n## Quick Start\n\n```bash\nnpx kernal-mcp init\n```\n\nThis creates a SQLite database at `~/.kernal/kernal.db` and prints the config to add to Claude Desktop.\n\nAdd to your `claude_desktop_config.json`:\n\n```json\n{\n  \"mcpServers\": {\n    \"kernal\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"kernal-mcp\", \"serve\"]\n    }\n  }\n}\n```\n\nRestart Claude Desktop. Then talk naturally:\n\n> \"I had lunch with Jonas Lindberg from Nordvik Energy today. He's their VP of Digital. We discussed their cloud migration — targeting Q3.\"\n\nClaude extracts Jonas, Nordvik Energy, the cloud migration topic, and stores them via Kernal's write tools. Then ask:\n\n- *\"What do I know about Nordvik Energy?\"* → Full briefing with people, interactions, topics\n- *\"Who should I follow up with?\"* → Open action items with owners and due dates\n- *\"Show me everyone at Nordvik Energy\"* → Contact list filtered by organization\n\n## How It Works\n\nKernal uses an **LLM-driven extraction pattern**:\n\n1. You tell Claude about a meeting, call, or interaction\n2. Claude calls `kernal_remember` with the raw text\n3. Kernal stores the text as a note and returns extraction instructions + existing entities (for dedup)\n4. Claude reads the text intelligently and calls structured write tools (`kernal_add_person`, `kernal_add_org`, `kernal_add_activity`, etc.)\n5. Each write goes through entity resolution to prevent duplicates\n6. The LLM makes all extraction decisions — no regex guessing\n\nThe MCP server is a clean data store. The LLM is the brain.\n\n## MCP Tools\n\n### Ingestion (write)\n\n| Tool | Description |\n|------|-------------|\n| `kernal_remember` | Store raw text, get extraction instructions and existing entity list for dedup |\n| `kernal_add_person` | Create or update a person (auto-deduplicates by fuzzy name match) |\n| `kernal_add_org` | Create or update an organization (auto-deduplicates) |\n| `kernal_add_activity` | Log an interaction with participant and org linking |\n| `kernal_add_action` | Create a follow-up or task, optionally assigned to a person |\n| `kernal_link` | Create a relationship between any two entities (person, org, or topic) |\n\n### Query (read)\n\n| Tool | Description |\n|------|-------------|\n| `kernal_recall` | Search the knowledge base by keyword across all entity types |\n| `kernal_people` | List/search contacts — filter by name, org, role |\n| `kernal_orgs` | List/search organizations — filter by type, industry |\n| `kernal_activities` | Recent interactions — filter by type, person, date |\n| `kernal_actions` | Open follow-ups — filter by status, owner, due date |\n| `kernal_context` | Full briefing on a person or org — timeline, network, topics |\n\n### Corrections\n\n| Tool | Description |\n|------|-------------|\n| `kernal_correct` | Update fields, delete entities, merge duplicates, or reset the database |\n\n## What Gets Stored\n\nFrom a single paragraph like *\"Had coffee with Sofia Andersen from Arctura Tech. She's their VP of Sales. We discussed their expansion into APAC. I need to send her the partner proposal by Friday.\"*, Claude will call:\n\n- `kernal_add_person` — Sofia Andersen, VP of Sales, at Arctura Tech\n- `kernal_add_org` — Arctura Tech\n- `kernal_add_activity` — Coffee meeting, today, participants: [Sofia Andersen], orgs: [Arctura Tech]\n- `kernal_add_action` — \"Send partner proposal to Sofia\", due Friday, owner: Sofia Andersen\n- `kernal_link` — Sofia → works_at → Arctura Tech\n\nEach call is a deliberate, structured decision by the LLM — not a regex guess.\n\n## CLI Commands\n\n```\nkernal init      Create database + print Claude Desktop config\nkernal serve     Start MCP server (stdio transport)\nkernal status    Show database stats\nkernal export    Export database to a file\nkernal help      Show help\n```\n\n## Dashboard\n\nThe repo includes a React dashboard (`dashboard/`) with four views:\n\n- **Overview** — entity counts, most connected people, activity breakdown\n- **Network** — interactive force-directed graph (people + organizations)\n- **Timeline** — chronological activity feed with participants and summaries\n- **Actions** — follow-ups grouped by urgency (overdue, this week, upcoming)\n\nNatural language command bar routes queries to views (\"Show me my network\" → graph).\n\n```bash\n# Start the cloud API server\nKERNAL_API_KEY=your-key KERNAL_DB_PATH=~/.kernal/kernal.db npm run cloud\n\n# Start the dashboard (separate terminal)\ncd dashboard && npm run dev\n```\n\n## Data Model\n\nKernal stores 6 entity types connected by a generic relationship graph:\n\n```\nPeople ←→ Organizations\n  ↕           ↕\nActivities ←→ Topics\n  ↕\nActions ←→ Notes\n```\n\nAll entities can link to any other entity via the `relationships` table, enabling queries like:\n- \"Who has Sofia met with?\" (person → activities → other people)\n- \"What topics come up with Nordvik Energy?\" (org → people → activities → topics)\n- \"What's the connection between Jonas and Arctura Tech?\" (path through graph)\n\n## Security\n\n- All SQL queries use parameterized statements (no injection risk)\n- API key auth with constant-time comparison (`crypto.timingSafeEqual`)\n- CORS restricted to configured origins\n- Rate limiting (120 req/min per IP, configurable)\n- MCP session timeout (30 min idle eviction)\n- No secrets in code — all config via environment variables\n- React dashboard auto-escapes all rendered data (no XSS)\n\n## Development\n\n```bash\ngit clone https://github.com/pintomatic/kernal.git\ncd kernal\nnpm install\nnpm run build\nnpm test        # 50 tests\n```\n\n### Self-Hosting the Cloud Server\n\n```bash\nKERNAL_API_KEY=your-secret KERNAL_DB_PATH=~/.kernal/kernal.db npm run cloud\n```\n\nA Dockerfile is included. Environment variables:\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| `KERNAL_DB_PATH` | `~/.kernal/kernal.db` | SQLite database path |\n| `KERNAL_API_KEY` | *(required for cloud)* | API key for authentication |\n| `KERNAL_CORS_ORIGIN` | `http://localhost:5174` | Allowed CORS origins (comma-separated) |\n| `KERNAL_RATE_LIMIT` | `120` | Max requests per minute per IP |\n| `PORT` | `3001` | Server port |\n\n### Seed Demo Data\n\n```bash\nnpx tsx scripts/seed-demo.ts\n```\n\nCreates 12 contacts, 18 orgs, 19 activities with 123 relationships — a realistic professional services scenario.\n\n## License\n\nMIT\n",
  "bytes": 7979,
  "sha": "16db9adb2b3f8ee6f0a5417b3827695a27ce8c04a323af09d5b1562c55571d08",
  "repo_slug": "pintomatic/kernal",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_pintomatic_kernal_mcp_ff5c0f0b/readme"
}