Skip to main content
Glama

Kernl

Agent teams that do your work — on your own machine.

Kernl is a self-hosted server that hands any LLM your real data — tasks, mail, calendar, finance, contacts — and runs teams of agents that act on it. No account. With a local model, nothing leaves the box.

Install · Watch them work · Why Kernl · MCP integration · Website · Discussions

🎬 Watch them work

A real instance. 84 agents across fourteen offices, plus a warehouse. Not a mockup and not a render — that is the /agents-flow view of a running Kernl, and the one-liner below gets you to it.


Related MCP server: Thalamus

⚡ Install in one line

curl -fsSL https://raw.githubusercontent.com/fastslack/kernl/stable/install.sh | sh

Debian/Ubuntu, Fedora/RHEL and macOS. The same command installs and updates — it reads the newest release and picks the build for your machine. On Windows, take the .msi from the latest release.

→ Dashboard at http://localhost:3086 · MCP endpoint at http://localhost:3086/mcp

Nothing to sign up for and no host paths to set. First run walks you through four steps, and one of them is connecting an AI — NVIDIA is free by default, or pick from eleven others, including local models through Ollama or LM Studio if you'd rather nothing left the machine at all. Chat and agents stay off until you connect one; the rest of the dashboard works either way.

git clone https://github.com/fastslack/kernl.git
cd kernl
docker compose up -d --build

# Kernl generates an API token on first boot. Grab it:
docker compose exec kernel cat /app/data/.kernel-auth-token

Paste that token once into the dashboard's login screen and you're in — it's kept in your browser and reused for every request. To pin your own instead, set KERNEL_AUTH_TOKEN (openssl rand -hex 32) in .env before the first up. Key-free web search comes bundled in this path; the graph brain is built into the kernel on every path.

To let the Filesystem Commander browse a folder of your machine, and to run claude_code agents on your Claude Code login, set KERNL_FS_ROOT in .env and add the host overlay — then name the same files on every later compose command:

docker compose -f docker-compose.yml -f docker-compose.host.yml up -d

Already running 0.4.x in Docker? Update with scripts/kernl.sh update (it pulls, builds while the old kernel keeps serving, and recreates with the offices drained). On its first start 0.5.0 moves your graph from Neo4j to the built-in one by itself: it keeps serving from Neo4j while it copies, checks the counts and switches over live. Leave Neo4j running until the log says Graph upgrade: caught up with what reached Neo4j during the copy; after that scripts/kernl.sh stop neo4j is safe and your data stays in its volume. The cinema catalogue stays out of the graph now, which makes the copy seconds instead of an hour on a large catalogue. To stay on Neo4j (for Graph Data Science), set KERNL_KEEP_NEO4J=1 first. Details in the changelog.

Your AI is brilliant — and amnesiac.

Every conversation starts from zero. Your LLM can't see your tasks, read your inbox, check your budget, or remember what you told it yesterday. And the cloud "AI assistants" that promise to fix that? They want your entire life uploaded to their servers.

Kernl fixes both.

What is Kernl?

Kernl is a self-hosted server that plugs your real life into any LLM through the Model Context Protocol (MCP) — tasks, contacts, email, finance, calendar, notes, health and more, behind one endpoint that Claude, Cursor or any MCP client can reach.

Then it goes past a data bridge: Kernl runs agents — autonomous teams (it calls them offices) that work in loops, call your tools, and finish jobs while you're away.

Kernl and your data live on your machine. The only thing that goes out is what the agents send to the LLM you pick, and with a local model (Ollama, LM Studio) nothing does.

For the depth, once you want a number: 103 tools live on a fresh install, rising past 290 as you enable more of the 71 bundled modules.

💬 Talk to your life

Point your AI at Kernl and ask it things it could never do before:

💸 "Did rent clear, and how much did I spend on food this month?" — reads your finance module.

📥 "Triage my inbox and draft replies to anything urgent." — reads your email, writes the drafts.

✅ "What's overdue, and what's due this week?" — straight from your real tasks + calendar.

🤖 "Spin up the dev office and clear the next three backlog items." — launches an agent team that works on its own.

Real data. Real actions. On your machine — not in someone else's cloud.

🔥 Why Kernl

🔒 Private by default

Self-hosted. Your tasks, email and finances never touch someone else's cloud.

🧠 Real memory

A built-in graph brain (Relate, embedded — no server to run) links every module and shares what your agents learn, so your AI finally remembers.

🤖 Agents that act

Not a chatbot — autonomous offices that work in loops and use your tools.

🔌 Any LLM, any client

NVIDIA (free), Gemini, Groq, OpenRouter, Anthropic, OpenAI, DeepSeek, Grok, MiniMax, Claude Code, or a local model via Ollama or LM Studio. Any MCP client connects.

🧩 Endlessly extensible

Everything is a module. Ship your own as a portable .kernl package.

📊 103 tools installed, 71 modules bundled

One surface for your whole life — not fifteen disconnected apps. Enable everything and you pass 290 tools.

⚔️ Kernl vs. the usual options

Cloud AI assistants

A single MCP server

"Second brain" apps

Kernl

Your data stays on your machine

❌

✅

⚠️

✅

Your real life — email, finance, tasks…

partial

one thing

❌

71 modules

Agents that act, not just chat

limited

❌

❌

✅

Works with any LLM & MCP client

❌

✅

❌

✅

Yours to extend & fork

❌

⚠️

❌

✅

🧩 What's inside

Your life, addressable by your AI — tasks & projects, contacts/CRM, reminders, email (IMAP/SMTP), finance & budgets, calendar, notes, goals, health & training, shopping, travel, documents… 71 modules, every one exposed as MCP tools.

A fleet of agents — cooperating agents with chains, schedules and their own workspaces. Package a whole team as an installable .kernl office, and watch them work in a live 3D office view.

Pluggable everything

  • LLM providers — 12 built in, connected from Settings → AI; keys stored encrypted.

  • Sandbox drivers — run agent code in Docker, CubeSandbox, or your own driver.

  • Channels — WhatsApp, Telegram, Slack, email, Mattermost and webchat on one notification bus.

Graph intelligence — a built-in graph (Relate, in-process Cypher) for memory and shared agent learning; optional Neo4j + GDS for heavy graph analytics.

🔌 MCP integration

Kernl speaks MCP over stdio and Streamable HTTP at the same time, so every client reaches the same tools.

{
  "mcpServers": {
    "kernl": {
      "command": "bun",
      "args": ["run", "bin/mcp-server.ts"],
      "cwd": "/absolute/path/to/kernl/services/kernel"
    }
  }
}

The MCP HTTP transport is at http://localhost:3086/mcp by default (the official Streamable HTTP spec).

🛠️ Build your own

An extension is a folder (or a packaged .kernl) with a manifest.json plus any of: a backend module (new MCP tools + HTTP routes), agents & offices, agent-scoped skills, a theme, a channel, or a sandbox driver.

Keep operator-specific material — named agents, your WhatsApp, regional scrapers — private under services/kernel/assets/personal-agents/ (gitignored, ideal for a private submodule).

Full guide → docs/architecture/extension-points.md

📦 More install options

WhatsApp no longer needs this: it is part of the standard docker compose up -d, which already runs the mtwRequest Rust server and the WhatsApp bridge, and the Linux, macOS and Windows packages bundle the same pair and run them as supervised children — no compose file needed there either. Either way, you link your phone from Settings → Channels → WhatsApp (QR or phone code) with nothing to configure. docker-compose.full.yml is only for building those two services from local source and for host-coupled mounts (so on-host claude_code agents can edit your sibling repos). Needs a few host paths in .env:

git clone https://github.com/fastslack/kernl.git
cd kernl
cp .env.example .env
$EDITOR .env   # set HOST_HOME, HOST_KERNEL_ROOT, HOST_PROJECTS_ROOT,
               # KERNEL_REQUEST_SRC, KERNEL_WHATSAPP_BRIDGE_SRC
docker compose -f docker-compose.full.yml up -d --build
git clone https://github.com/fastslack/kernl.git
cd kernl
bun install --cwd services/kernel   # requires bun >= 1.3
cp .env.example .env
bun run dev                # stdio MCP + HTTP router (delega a services/kernel)

Requirements

For the one-line install: none. The package ships its own runtime — no Bun, no Node, no Docker. A 64-bit Debian/Ubuntu, Fedora/RHEL or macOS machine is the whole list.

Only if you build from source or run the container stack instead:

  • Bun ≥ 1.3 (primary runtime) or Node ≥ 20 — source installs.

  • Docker + Compose — the container paths, and the only route to the full stack.

  • Neo4j 5.x + GDS (optional — the graph is built in. Add it with docker-compose.neo4j.yml for Graph Data Science analytics; budget 1–2 GB of RAM).

Configuration

Everything is environment-driven, and the install above needs none of it — Kernl boots with working defaults either way. Copy .env.example to .env only when you want to override something.

Two secrets are generated and persisted on first boot if you don't set them:

Variable

If unset

KERNEL_AUTH_TOKEN

A random token is generated and stored as data/.kernel-auth-token (mode 600). The API requires it; the desktop launchers hand it to the browser they open, so you only type it when signing in from a second browser or another device. Print it with kernl token (Linux), /Applications/Kernl.app/Contents/MacOS/kernl token (macOS), or type %LOCALAPPDATA%\Kernl\data\.kernel-auth-token (Windows). KERNEL_ALLOW_UNAUTH=1 runs open, but only ever on 127.0.0.1 — see API_DOCS for why that is still a worse trade than it looks.

KERNEL_ENCRYPTION_KEY

A random 32-byte key is generated and stored as data/.kernel-encryption-key. Back this file up — without it, encrypted secrets in the database are unrecoverable.

The host-path variables (HOST_HOME, HOST_KERNEL_ROOT, HOST_PROJECTS_ROOT) belong to the full stack in docker-compose.full.yml, not the default one. Everything else — LLM keys, Neo4j creds, feature toggles — is documented inline in .env.example.

Scripts

Command

What it does

bun run dev

Start the MCP server + HTTP router

bun run wizard

Interactive setup wizard

bun run doctor

Self-diagnostics (DB, providers, channels)

bun test

Run the test suite

bun run build

Bundle to services/kernel/dist/

bun run reload

Rebuild + restart the kernel container

Known limitations

Worth knowing before you commit your life to it. None of these are secret — we'd rather you read them here than discover them at an awkward moment.

  • Single user. One kernel, one person. There is user and password infrastructure inside, but no per-user data isolation: everyone who has the API token sees everything. Give each person their own instance; don't share one across a team. (docs/MULTI_USER.md)

  • Updates are checked, never automatic. Settings → About asks GitHub for the newest release (cached six hours) and can install it for you. Nothing happens unattended, and what "install" means depends on how you installed: an MSI install is upgraded by Windows' own installer (one UAC prompt, the progress bar you expect, Add/Remove Programs kept in step); a portable Windows or Linux copy is swapped in place, keeping the old one until the new one is running; and the rest update through their own channel — dnf/apt for the rpm and deb, docker compose pull for the stack, git pull from source. On macOS the button refuses while the build is unsigned, because Gatekeeper would not open the result: until the certificate is bought, that download is a manual one.

  • Installers are unsigned. macOS needs right-click → Open the first time, Windows needs "More info → Run anyway". The signing pipeline is wired but the certificates aren't bought yet. Docker and source installs are unaffected.

  • Back it up yourself, and check the exit code. backup.sh is solid and verifies its own output, but nothing runs it for you. See docs/DEPLOYMENT.md.

  • Neo4j is hungry, and optional. The built-in graph needs no server; the optional Neo4j (docker-compose.neo4j.yml) wants ~1–2 GB of RAM on its own.

  • No telemetry, which cuts both ways. Nothing phones home, so nothing tells us when your install breaks. Bug reports are the only signal we get.

Documentation

⭐ Contributing & community

Kernl is Apache-2.0 and built in the open. Star the repo if it's useful, open an issue for bugs and ideas, and say hi in Discussions. Contributions welcome — see docs/CONTRIBUTING.md.

License & credits

Created and maintained by Matias Aguirre — a Matware project. See AUTHORS and NOTICE.

Released under the Apache License 2.0 — fork it, build commercial plugins on top, redistribute, modify. © 2026 Matware.

Available Tools

149 tools
kernel_agents_add_learningA

Manually add a learning/insight to an agent. High-confidence learnings are injected into the agent's system prompt.

Inputs: type (required), content (required), agent_id (required), scope, +1 more.

kernel_agents_add_triggerB

Add an event trigger or schedule to an agent. Event triggers fire when a matching event occurs. Schedules run periodically. A schedule's runs work for project; without it they inherit the project of an office that serves exactly one, and otherwise run outside any project (and cannot draft from a project's accounts).

Inputs: type (required), agent_id (required), cron, filter, +5 more.

kernel_agents_ask_supervisorA

Ask the chief about a doubt you can't resolve alone: unclear requirements, priorities, or a decision you are not authorized to make. Give 2 to 4 concrete options, your preferred one first. The chief answers or escalates it to the human. Don't wait idle: keep working on what doesn't depend on it. The answer comes back as a new run or an inbox message. Never re-ask a question that was already answered.

Inputs: options (required), question (required), env, context, +5 more.

kernel_agents_call_meetingA

Call a group meeting with other agents. You (the caller) become the moderator. The meeting runs N structured rounds (default 2, capped at 20) where each attendee gives input, then you synthesize into decisions and action items. Use this when you need collaborative input from multiple agents before proceeding.

Inputs: topic (required), attendee_ids (required), rounds, context, +2 more.

kernel_agents_chainA

Create a declarative chain between two agents. When the source agent completes, the target agent is automatically triggered.

Inputs: source_agent_id (required), target_agent_id (required), label, delay_ms, +2 more.

kernel_agents_createC

Create a new autonomous agent definition with system prompt, goal template, tool permissions, and LLM config

Inputs: name (required), role, model, flow_id, +10 more.

kernel_agents_decision_policy_setA

Chief only. Set how a kind of question (category) is handled in an office: off, suggest (show what past decisions suggest), or auto (a precedent answers it alone while its measured precision holds). Only turn on auto when the operator asked for it.

Inputs: mode (required), flow_id (required), category (required), min_samples, +2 more.

kernel_agents_decision_statsB

Read-only. Per kind of question (category) in an office: the policy (off / suggest / auto), and how often the operator chose what past decisions suggested — the measured precision a category needs before a precedent may answer it alone.

Inputs: flow_id, __caller_agent_id.

kernel_agents_deleteA

Soft-delete an agent (sets active=0, preserves history)

Inputs: id (required), __caller_agent_id.

kernel_agents_directoryA

View the full office directory — all departments (flows) with their agents, roles, capabilities, and connections. Use this to find agents you can request help from or delegate work to.

Inputs: flow_id. Returns: flows, unassigned

kernel_agents_env_listA

Read-only. The environment problems open in your office, since when, and who is waiting on each.

Inputs: __caller_agent_id.

kernel_agents_env_reportA

Report that something in your office's environment blocks your work (DEV down, a missing credential, a broken deploy). Use the same short key every time for the same problem (dev-e2e, credential-dev-patient-jwt). If it is already open you just join it — nobody is asked again. You get a letter when it is fixed: park the work until then.

Inputs: key (required), subject, description, __caller_agent_id.

kernel_agents_env_resolveC

Close an environment problem of your office that is fixed. Everyone who joined it gets a letter to resume.

Inputs: key (required), note, __caller_agent_id.

kernel_agents_factory_finalizeA

Finalize an Agent Factory draft: validate the proposed tools against the real catalog, resolve/create the target office, guard against duplicates, and create the agent INACTIVE (active=0) for human review. Returns the activation command. Use AFTER you've researched the domain, synthesized the system prompt, and picked tools via kernel_tool_search.

Inputs: name (required), system_prompt (required), brief, provider, +6 more.

kernel_agents_feedbackC

Rate an agent run and provide feedback. The agent learns from feedback to improve future runs.

Inputs: rating (required), run_id (required), lesson, outcome.

kernel_agents_flows_createA

Create a new flow (department / office). Returns the new flow id, which you must pass to subsequent kernel_agents_create calls so the agents show up under this office in the 3D view.

Inputs: name (required), color, description.

kernel_agents_flows_listA

List active flows (offices / departments). Use this before creating a new one to avoid duplicates.

Inputs: no named parameters.

kernel_agents_flows_set_repoA

Promote an office (flow) to a host git repo all its agents work in, or revert it. Pass an absolute path to promote; omit/empty path to revert to the kernel workspace home. Agents without their own cwd_path override will use this directory as cwd.

Inputs: flow_id (required), path, git_init.

kernel_agents_get_skillsA

List the procedural skills attached to an agent, with descriptions and token estimates.

Inputs: agent_id (required).

kernel_agents_historyC

List past runs for an agent

Inputs: agent_id (required), limit, status.

kernel_agents_inboxA

Read an agent's office inbox (messages from colleagues). Defaults to the caller's own inbox and shows unread items only. Useful for the dashboard or to check what's pending before a run.

Inputs: limit, status, agent_id, __caller_agent_id.

kernel_agents_inbox_ackA

Acknowledge office-inbox letters you have finished handling. Unacknowledged letters are handed to you again by the inbox sweeper (up to 3 times), so ack every letter you completed.

Inputs: message_ids (required), __caller_agent_id.

kernel_agents_listA

List all agent definitions, optionally filtered by active status

Inputs: active. Returns: total, agents

kernel_agents_list_subscriptionsA

List active conversation subscriptions for an agent. Useful before subscribing (to avoid duplicates) or to audit what conversations an agent is watching.

Inputs: agent_id, __caller_agent_id.

kernel_agents_list_triggersB

List event triggers, schedules, and chains for an agent

Inputs: agent_id (required).

kernel_agents_memoryA

Read an agent's conversational memory — recent interactions with humans and other agents. Use this to check what another agent has been working on or said recently.

Inputs: agent_id (required), limit.

kernel_agents_post_to_colleagueA

Leave an async message in another agent's inbox. Works ACROSS offices — every agent can reach every other agent. The recipient does NOT run immediately — the message appears as a 'PENDING REQUESTS FROM COLLEAGUES' block in their system prompt the next time they run, then is marked read. Use this for blockers, clarifications and hand-backs between agents. For a doubt that needs a decision from above use kernel_agents_ask_supervisor. For blocking one-shot questions use kernel_agents_invoke; for group deliberation use kernel_agents_call_meeting. To continue a thread, pass in_reply_to_message_id (the conversation-message id of the turn you are replying to) or an explicit conversation_id. To signal disagreement with something the recipient (or a peer) said, set role: "counter" — 2+ counters from different agents on the same conversation auto-opens a debate.

Inputs: body (required), subject (required), role, to_agent_id, +4 more.

kernel_agents_question_contextA

Read-only. Everything about an escalated question: the question, the chief's reason, the 4 options, the full context, and the asking agent's run (its goal and steps up to the question).

Inputs: question_id (required).

kernel_agents_questions_answerA

Chief only. Answer a question in triage: pick one of its options by 0-based selected_index, or write text when none fits. The asking agent gets the answer and resumes.

Inputs: question_id (required), leaves_work_to_operator (required), text, selected_index, +1 more.

kernel_agents_questions_escalateA

Chief only. Hand a question in triage to the human, with a one-line reason they will read. Use for product or business decisions, money, irreversible actions, or anything you are not sure about.

Inputs: reason (required), question_id (required), __caller_agent_id.

kernel_agents_questions_triage_listA

Chief only. List the office agents' questions waiting for your triage, with their 4 options.

Inputs: __caller_agent_id.

kernel_agents_remove_triggerB

Remove an event trigger or schedule from an agent

Inputs: type (required), trigger_id (required).

kernel_agents_resumeA

Resume an interrupted agent run from its last checkpoint (native agents only). Use it on a run the kernel failed with 'resumable with kernel_agents_resume'. Tool calls whose outcome was lost are not repeated — the agent is told their result is unknown.

Inputs: run_id (required).

kernel_agents_runB

Manually trigger an agent run with a specific goal. Returns the run result.

Inputs: agent_id (required), goal, project, variables.

kernel_agents_set_skillsA

Attach (or replace) the procedural skills loaded by an agent. Each slug must reference an installed extension with type='skill'. Pass an empty array to detach all.

Inputs: skills (required), agent_id (required).

kernel_agents_statsB

Get performance stats for an agent: success rate, avg tokens, top tools, common errors, learnings

Inputs: agent_id (required).

kernel_agents_statusA

Get the status and step-by-step log of an agent run

Inputs: run_id (required).

kernel_agents_subject_historyA

Read-only. Everything asked and decided about an issue and all its parts (web#2653 covers web#2653:a-b…), oldest first: who asked, the answer, who decided it and through what channel, and which environment problems were open at the time. Read it before asking about a subject again.

Inputs: subject (required), limit.

kernel_agents_subscribe_conversationA

Subscribe an agent to a conversation. Once subscribed, every new turn in that conversation wakes the agent with a run (mode='responder') so it can read and reply without being explicitly invoked. Use this to keep an agent engaged in a thread after invoke/post/meeting hands the topic over. Idempotent — re-subscribing updates the mode/filter. Defaults: subscribe yourself unless agent_id is set.

Inputs: conversation_id (required), mode, agent_id, filter_role, +1 more.

kernel_agents_unchainC

Remove a chain between two agents

Inputs: chain_id (required).

kernel_agents_unsubscribe_conversationB

Cancel a conversation subscription so the agent stops being woken by new turns. Defaults to the caller unless agent_id is supplied.

Inputs: conversation_id (required), agent_id, __caller_agent_id.

kernel_agents_updateB

Update an agent definition (name, prompt, tools, config, active status)

Inputs: id (required), name, model, active, +10 more.

kernel_agents_workspace_applyA

Declare what an office's home folder must contain and prepare it now: git repos to clone (at a branch), files to seed, MCP servers and skills for every claude_code agent working in the home. Replaces the previous spec. Existing checkouts are never re-cloned or reset; seeded files only replace an existing one when overwrite is true. Runs of the office wait for the home to be ready and fail with the reason when it can't be prepared.

Inputs: spec (required), flow_id (required).

kernel_agents_workspace_getB

Show an office's declarative workspace spec and how its last preparation went.

Inputs: flow_id (required).

kernel_attest_identityA

Return this kernel's Ed25519 attestation identity (server_id) and whether attestation is currently enabled. Clients pin this fingerprint and verify every receipt against it.

Inputs: no named parameters. Returns: enabled, server_id

kernel_attest_verifyA

Verify a previously-issued attestation receipt against its embedded server_id. Stateless verification — does not check whether you actually trust that signing identity. Wire-compatible with the Rust mtw-attest crate.

Inputs: receipt (required). Returns: tool, ts_ms, valid, reason, +2 more

kernel_attest_verify_chainA

Verify a plan receipt + its child receipts as one chained audit. Returns valid only when (1) the plan receipt's own signature checks out, (2) every child verifies, and (3) the merkle root of the children matches the one inside the plan receipt. Stateless — works on chains from any peer.

Inputs: plan_receipt (required), child_receipts (required). Returns: valid, reason, plan_id, server_id, +1 more

kernel_audit_changesB

Recent tool calls that wrote something, newest first — by agent, run or tool — with the ids each touched.

Inputs: tool, limit, since, run_id, +1 more. Returns: object

kernel_audit_cost_reportA

Token consumption and cost analysis. Shows which agents burn the most tokens, failure rates, and wasted spend. Critical for budget monitoring.

Inputs: hours.

kernel_audit_logsA

Query the agent event log for security analysis. Shows agent activity, errors, tool calls, token consumption, and failure patterns.

Inputs: limit, since, agent_id, event_type, +1 more.

kernel_audit_who_changedA

Who changed this? Every tool call that wrote and named or returned this id (a task, contact, note, fact…): the agent and run or the MCP client that made it, the tool, when, whether it worked, and its arguments in short.

Inputs: id (required), limit. Returns: object

kernel_brain_askA

What do I know about X? Searches every memory at once — indexed tasks, notes, contacts and mail (brain), past chat messages, what agents have learned, and the people, tasks, mail, events and products in the graph — by meaning and by words, merges the findings into one ranked list, and shows what each result is connected to. Use it before answering a question about a person, project or topic.

Inputs: query (required), limit, related. Returns: object

kernel_brain_decayA

Maintenance: pull every learned weight a fraction back toward the 1.0 baseline so stale boosts/penalties fade. Run periodically.

Inputs: rate. Returns: adjusted

kernel_brain_feedbackA

Record a usage signal for a recalled item to teach the brain. open/correct promote it, ignore demotes it. This is the autoaprendizaje loop — future recalls rank adapted to your behaviour.

Inputs: signal (required), item_id (required). Returns: weight, item_id

kernel_brain_indexA

Index (or incrementally refresh) module rows into the unified semantic space. Only rows changed since the last run are touched (watermark). Pass kinds to backfill one module at a time. Embeds row text, so run it deliberately when the embeddings backend is healthy.

Inputs: kinds. Returns: indexed, removed, per_kind

kernel_brain_recallA

Unified semantic recall across ALL modules — tasks, notes, contacts, communications, reminders, calendar events — in one ranked result. Use this to surface everything related to a topic regardless of which module it lives in. Ranking blends embedding similarity with a learned per-item weight that adapts to how you use results.

Inputs: query (required), kinds, limit, hybrid, +3 more. Returns: object

kernel_brain_statsB

Coverage of the unified space: total items, count per kind, and per-source watermarks.

Inputs: no named parameters. Returns: object

kernel_chat_analyzeC

Run analytics on the concept graph. Shows top concepts by importance and community structure.

Inputs: no named parameters.

kernel_chat_archiveC

Archive a chat episode. In future phases, this also generates a summary embedding.

Inputs: episode_id (required).

kernel_chat_conceptsB

List extracted concepts from chat conversations, ordered by gravity (cross-conversation importance).

Inputs: limit, min_gravity.

kernel_chat_contextA

Preview the cognitive context that would be retrieved for a query. Useful for debugging the retrieval pipeline.

Inputs: query (required), budget, episode_id.

kernel_chat_historyC

Get message history for a chat episode.

Inputs: episode_id (required), limit, offset.

kernel_chat_listC

List chat episodes, optionally filtered by status.

Inputs: limit, status.

kernel_chat_messageB

Send a message in a chat episode and receive the LLM response. The system automatically retrieves relevant context from memory (when available).

Inputs: message (required), episode_id (required), context_budget.

kernel_chat_patternsC

View detected temporal and behavioral patterns from chat conversations.

Inputs: no named parameters.

kernel_chat_recallB

Reinforce a memory node manually, boosting its strength against decay. Use this to mark a memory as important.

Inputs: memory_id (required).

kernel_chat_startA

Start a new chat episode (conversation). Returns the episode ID to use with kernel_chat_message.

Inputs: model, title, provider.

kernel_code_readA

Read a source file from the project (read-only). Restricted to project src — cannot read .env, credentials, node_modules, or data.

Inputs: path (required), limit, offset.

kernel_code_runA

Run a small JS script that can call other kernel tools via tool(name, args). Use this to compose multiple tool calls in ONE inference round (e.g. list-then-filter, create-then-run). Sandbox: no FS, no network, no require, 5s default wall-clock. Available helpers: tool(name, args) (async), log(msg), input (the vars object). Example: const r = await tool("kernel_tasks_list", {}); return r.tasks.length.

Inputs: script (required), vars, timeoutMs. Returns: logs, result, durationMs

kernel_config_catalogB

List all known configurable settings with their descriptions, types, and categories. Use this to discover what can be configured.

Inputs: category.

kernel_config_getA

Get the current value of a specific configuration setting by its env-var key (e.g. ANTHROPIC_API_KEY, LIFE_CITY, CHAT_DEFAULT_PROVIDER). Sensitive values are masked.

Inputs: key (required).

kernel_config_listA

List all kernel configuration settings, optionally filtered by category. Sensitive values (API keys, tokens) are automatically masked.

Inputs: category.

kernel_config_setA

Set a configuration value. Changes take effect immediately (no restart needed) and are persisted to the .env file. Examples: set LIFE_CITY to 'Berlin', set CHAT_DEFAULT_PROVIDER to 'openai', set PROACTIVE_MORNING_TIME to '08:00'.

Inputs: key (required), value (required).

kernel_config_set_manyA

Set multiple configuration values at once. Useful when applying a group of related settings, e.g. changing location (latitude + longitude + city + timezone).

Inputs: settings (required).

kernel_dashboard_eveningB

Evening review: what was completed today, what's pending, and tasks for tomorrow.

Inputs: no named parameters.

kernel_dashboard_morningA

Morning briefing: today's tasks, overdue items, upcoming deadlines, contacts needing follow-up. Your daily overview.

Inputs: no named parameters.

kernel_dashboard_weeklyA

Weekly planning summary: tasks completed this week, open items, upcoming deadlines, contact activity.

Inputs: no named parameters.

kernel_extensions_activateA

Activate an installed-but-idle extension (those with manifest.requires_activation=true). Equivalent to enable() for that subset — exists as a separate tool so the consent step is auditable.

Inputs: id (required).

kernel_extensions_disableC

Disable an installed extension by id.

Inputs: id (required).

kernel_extensions_enableC

Enable an installed extension by id.

Inputs: id (required).

kernel_extensions_install_bundleB

Install an extension from a local .kernl bundle path.

Inputs: bundle_path (required).

kernel_extensions_listC

List installed extensions, optionally filtering by type or status.

Inputs: type, status.

kernel_extensions_receiptA

Get the install receipt for an extension — proves WHO installed it WHEN and from WHERE, with the kernel's Ed25519 signature. Includes a download watermark when fetched from a watermarking marketplace provider.

Inputs: id (required).

kernel_extensions_uninstallC

Remove an extension (deletes files + row).

Inputs: id (required).

kernel_extensions_updateC

Upgrade an installed extension in place from a local .kernl bundle path.

Inputs: bundle_path (required), force.

kernel_facts_as_ofA

The graph as it stood at a moment: every fact about a person or thing (subject ref or name) at at, each one classified by both timelines — known (true then and Kernl knew it), stale (Kernl believed it then but it was no longer true, or was a mistake) or unknown (true then, but Kernl had not learned it yet) — with the agent that wrote it and what it replaced. One traversal of the graph.

Inputs: at (required), subject (required). Returns: object

kernel_facts_assertA

Record a fact about a person, thing or the user — subject, predicate, value — with when it became true. A new value for the same subject and predicate ends the old one (mode change) or replaces it as a mistake (mode correction); the history is kept, so the memory does not hold two contradicting answers. Saying the same thing again changes nothing.

Inputs: object (required), subject (required), predicate (required), mode, +6 more. Returns: object

kernel_facts_explainA

Why did Kernl (or an agent) act that way? Give the person or thing (subject ref or name) and the moment of the decision — at, or action_ref, the id of what the action produced or touched (an email, a task…). Returns what Kernl believed then against what is now known to have been true then, fact by fact, who wrote each belief and from what source, and a verdict: consistent, late_information (the world changed but Kernl learned it after the decision) or wrong_belief (the stored fact was later corrected as a mistake).

Inputs: at, name, subject, predicate, +1 more. Returns: object

kernel_facts_queryA

Facts that are true now — or were true at as_of, or as Kernl believed them at known_at. history lists every value ever recorded with when it held and whether it was corrected.

Inputs: text, as_of, limit, history, +3 more. Returns: object

kernel_facts_retractB

A fact no longer holds (how=ended, from at) or never did (how=wrong). It stays in the history.

Inputs: id (required), at, how. Returns: object

kernel_graph_analyzeA

Graph analytics over the labels you name (and, optionally, only some relationship types): pagerank (who is central), communities (Louvain groups), components (what is connected at all), betweenness (who bridges groups). The result is written on each node as pageRank (pagerank), communityId (communities), componentId (components), betweenness (betweenness) — use it afterwards in kernel_graph_query, e.g. ORDER BY p.pageRank DESC. Runs on Graph Data Science when the graph has it or GDS_REMOTE_URI points at one (only numbered nodes and edges are sent), otherwise in the kernel, up to 200000 nodes.

Inputs: labels (required), algorithm (required), top, write, +2 more. Returns: object

kernel_graph_askA

Ask Kernl's graph a question in plain words ("which people did I email most last month?", "what tasks depend on the report?"). It writes a read-only query from the graph's schema, runs it, fixes it from its own errors, and returns the rows with the query it used.

Inputs: question (required), limit. Returns: object

kernel_graph_queryA

Run one READ-ONLY Cypher query on Kernl's graph and get rows back. It is checked before it runs: no writing, only db.* read procedures, bounded variable-length paths (at most 6 hops), connected patterns, and labels and relationship types that exist (wrong ones come back with suggestions). Rows are capped by limit.

Inputs: cypher (required), limit, params. Returns: object

kernel_graph_schemaA

What Kernl's graph holds: node labels with counts and properties, which relationships connect which labels, and the vector and full-text search indexes. Read it before kernel_graph_query.

Inputs: no named parameters. Returns: object

kernel_graph_scratchA

Run Cypher — reads AND writes — in your own private, in-memory scratch graph: a working space for plans, dependency maps or a slice of the main graph you want to reshape (see kernel_graph_slice). It belongs to your run, nobody else sees it, and it is wiped when the run ends or after 30 idle minutes. At most 20000 nodes; no LOAD CSV, no apoc/gds/dbms. The main graph is never touched.

Inputs: cypher (required), limit, params. Returns: object

kernel_graph_scratch_dropA

Wipe your scratch graph now (it also goes when your run ends).

Inputs: no named parameters. Returns: object

kernel_graph_sliceA

Take a slice of Kernl's main graph with a READ-ONLY query that returns nodes, relationships or paths (e.g. MATCH p = (:Person {name: $n})-[*1..2]-() RETURN p), checked like kernel_graph_query. into: "scratch" (default) copies it into your scratch graph, keeping labels and properties, with _src set to the original's element id; into: "json" returns it as nodes and relationships, for a sandboxed agent or a file. Embeddings are left out.

Inputs: cypher (required), into, rows, params. Returns: object

kernel_kernl_bug_reportA

Chief only. File a bug in Kernl itself — its code or behaviour — for Kernl's developers. Use it when a failure is Kernl's fault: a wrong result, a missing event, a crash, a tool that does not do what it says. Do NOT use it for an agent hitting its limits (steps, tokens, time), a provider outage or rate limit, expired auth, or an agent's prompt: those are fixed by the operator, not by changing Kernl. Give a precise title, the area of Kernl you believe is at fault, and your diagnosis with evidence. The report stays local until the operator publishes it.

Inputs: area (required), title (required), diagnosis (required), repro, +2 more.

kernel_kernl_bugs_listB

List Kernl's own bug reports (filed by the chief or the operator), newest activity first.

Inputs: status, __caller_agent_id.

kernel_marketplace_browseB

Browse the marketplace: list extensions, agents, flows, themes, and templates. Filter by type, category, or search query.

Inputs: sort, type, query, category.

kernel_marketplace_catalog_browseB

Browse the unified marketplace catalog (skills, plugins, modules, offices, themes, channels, etc.). Merges every catalog provider with installed status.

Inputs: type, limit, query, category.

kernel_marketplace_catalog_installB

Install a catalog item by id or slug. Routes through ExtensionService — works for skills, plugins, modules, offices, themes, etc.

Inputs: id (required).

kernel_marketplace_catalog_providersA

List configured catalog providers (bundled, remote, git, ...).

Inputs: no named parameters.

kernel_marketplace_catalog_uninstallB

Uninstall an installed extension by id or slug. Removes the install dir and the row in installed_extensions.

Inputs: id (required), force.

kernel_marketplace_exportC

Export a marketplace item as a JSON package for sharing.

Inputs: id (required).

kernel_marketplace_getB

Get detailed information about a marketplace item by slug or ID.

Inputs: identifier (required).

kernel_marketplace_importC

Import a marketplace package from JSON. Supports agents, flows, themes, templates.

Inputs: package_json (required).

kernel_marketplace_installC

Install a marketplace item (extension, agent, flow, theme, or template).

Inputs: id (required).

kernel_marketplace_reviewC

Add a review for a marketplace item (1-5 stars).

Inputs: rating (required), item_id (required), body, title.

kernel_marketplace_statsB

Get marketplace statistics: item counts by type, install stats, ratings.

Inputs: no named parameters.

kernel_marketplace_themeC

Manage themes: activate, deactivate, or preview a theme.

Inputs: action (required), item_id.

kernel_marketplace_uninstallC

Uninstall a marketplace item.

Inputs: id (required).

kernel_meta_cost_reportB

Top-N tools by accumulated dollar cost. Sourced from rolling p50 stats the cost router maintains across runs. Returns enabled=false when the cost router isn't wired in.

Inputs: limit. Returns: rows, enabled

kernel_meta_elicit_confirmA

Server-initiated elicitation demo. Asks the connected client to display a yes/no form and echoes the user's choice. Returns action: "unsupported" (with a reason) when the client didn't declare the elicitation capability — every real tool that uses elicitation must handle that branch explicitly.

Inputs: message (required), default_value. Returns: action, reason, confirmed

kernel_meta_render_cardA

Render a card as an MCP-application UI surface. Returns both a plaintext summary (for CLI / legacy clients) and an HTML body (for web-based clients that opt into the ui content type — Claude Desktop, ChatGPT, web harnesses). Use this as a template for any domain tool that wants to ship a real surface instead of pasting markdown — wire uiResult(...) from core/helpers.ts.

Inputs: title (required), body, items, accent. Returns: bytes, mimeType, rendered

kernel_models_apply_migrationA

Apply ONE model migration: replace a gone model with a new one in either a global config key or a per-agent model_chain. Exactly one of configKey / agentId must be given. This is the gated action behind the discovery cron's suggestions — nothing changes until you call it.

Inputs: to (required), from (required), slug (required), agentId, +1 more.

kernel_models_catalogA

List LLM models discovered per provider by the model-discovery cron. Filter by provider slug and/or status (available | gone). Shows when each model was first/last seen.

Inputs: slug, status.

kernel_models_pending_migrationsA

List configured model references (global config + per-agent model_chain) that point at a model the discovery cron has marked 'gone' upstream — these would 404/403 mid-run. Each entry includes a suggested successor. Read-only: apply with kernel_models_apply_migration.

Inputs: no named parameters.

kernel_office_createA

Create or refresh a whole office (department) in one declarative call: flow + agents + optional chains, cron and home repo. Agents get smart defaults — with repo set they become claude_code executors with native FS tools jailed to that cwd. Idempotent (flow matches by name, agents by slug). The office appears in the 3D agents-flow view immediately.

Inputs: name (required), agents (required), cron, repo, +4 more.

kernel_office_pack_exportA

Export what an office's agents learned (their active, general learnings above a confidence floor) as a knowledge pack: JSON or Markdown, sorted so exporting again gives a clean git diff. Emails, phone numbers, tokens and home paths are blanked unless redact=false. Returns the file's content.

Inputs: office (required), format, redact, min_confidence. Returns: object

kernel_office_pack_importA

Bring a knowledge pack (the JSON or Markdown that kernel_office_pack_export makes) into an office, for review. Lessons are matched to the office's agents by name (or by role when one agent has it; agent_map overrides), compared with what they already know, and staged — none reaches an agent until accepted with kernel_office_pack_review. Accepted lessons start at confidence 0.6 at most.

Inputs: pack (required), office (required), source, agent_map. Returns: object

kernel_office_pack_reviewA

Review staged pack lessons. With only import_id it lists them; accept and reject take item ids or "all" (every pending one). Without import_id it lists the imports, with how many lessons still wait. Accepting makes the lesson an ordinary learning of its agent.

Inputs: accept, office, reject, import_id. Returns: object

kernel_outbox_listB

List outbox drafts (default: pending). Approving happens only in the dashboard.

Inputs: status, project.

kernel_outbox_proposeA

Propose something that leaves Kernl (a post, an email, a message, a social-network post) as a DRAFT for the user to approve. Inside a project run the account must be linked to that project. Nothing is published until a human approves it. Social network post or reply: channel "social_post", account_ref "social:self", payload { text: string, reply_to?: string (post id), forum_id?: string, tags?: string[] }.

Inputs: channel (required), payload (required), account_ref (required), scheduled_for.

kernel_panel_record_appendB

Append one event to a collection of YOUR office's panel (e.g. a state change for the office timeline). The key is generated.

Inputs: data (required), collection (required).

kernel_panel_record_putB

Create or replace one record in a collection of YOUR office's panel (shown to the operator in the office panel). Use a stable key (e.g. the issue key).

Inputs: key (required), data (required), collection (required).

kernel_places_listC

Known places, newest first. missing: true lists items that name a place but have no coordinates yet.

Inputs: kind, limit, missing. Returns: object

kernel_places_nearA

What is near a place: events, trips, hotels and travel activities within a radius, nearest first, with the distance in km. where is coordinates ("-34.60, -58.38"), a map link, the name or address of a known place, or — when the geocoder is on — any address. Items only count once they have coordinates (from a map link, set by hand, or geocoded); kernel_places_list with missing=true shows the rest.

Inputs: where (required), to, from, kinds, +2 more. Returns: object

kernel_places_setA

Set where something is, by hand. For an item: kind + ref_id (an event, trip, accommodation or activity id). For a place of your own (home, office, a gym): kind 'manual' with a name. Takes lat/lng or a map link; a hand-set place is never overwritten by a sync.

Inputs: kind (required), lat, lng, link, +3 more. Returns: object

kernel_places_syncA

Re-read events and travel for places, take coordinates from their map links and — when the geocoder is on — look up up to geocode addresses that still have none.

Inputs: geocode. Returns: object

kernel_plan_executeA

Run a plan that previously passed kernel_plan_validate. When the plan touches non-reversible tools, the caller MUST either pass a matching approval_token (from validate) or set prompt_user: true to drive an interactive elicitation. Returns one outcome per node with status, duration, and the per-call receipt when attestation is on.

Inputs: plan (required), prompt_user, approval_token. Returns: object

kernel_plan_validateA

Validate + simulate a plan (DAG of tool calls). Pure: nothing executes. Returns issues (cycles, dangling deps, unknown tools), estimated_cost (sum of per-node p50s, latency = critical path), side_effects_preview, and requires_approval (true when any node calls a non-reversible tool). Pair with kernel_plan_execute.

Inputs: plan (required). Returns: object

kernel_projects_assign_officeC

Make an office serve a project (or pause/update its settings for it).

Inputs: flow_id (required), project (required), active, settings.

kernel_projects_createC

Create a project with its brief (value_prop and audience are required).

Inputs: name (required), slug (required), brief (required).

kernel_projects_getA

Show one project: brief, linked resources and the offices that serve it.

Inputs: project (required).

kernel_projects_listA

List projects (products/businesses offices work for) with status, connector state and pending drafts.

Inputs: flow_id.

kernel_projects_pullC

Pull the project's connector snapshot now (institutions, waitlist).

Inputs: project (required).

kernel_research_digestA

Summarize a large source (a kernel tool's output or an inline list) WITHOUT loading the raw rows into your context. Ranks to top-k (when query set), chunks, runs a bounded map-reduce with concurrency + cooldown caps, and returns a grounded digest with citations. Use this instead of listing a big inventory and summarizing it yourself.

Inputs: source (required), map_instruction (required), reduce_instruction (required), k, +7 more. Returns: digest, tokens, degraded, citations, +3 more

kernel_skill_loadA

Load the full body of a procedural skill the agent has attached. Call this when a user request matches a skill listed in the system_prompt's 'Available skills' section, to read the step-by-step playbook before acting.

Inputs: slug (required), file, query.

kernel_store_browseA

List the paid extensions available in the Kernl store and show which ones your current license already unlocks. Read-only.

Inputs: no named parameters. Returns: object

kernel_store_installA

Download and install a paid extension from the Kernl store. Requires a license that includes the extension; the license authenticates the download. Installs the signed .kernl and activates it if entitled.

Inputs: slug (required). Returns: object

kernel_store_updateA

Check the Kernl store for newer versions of your installed, licensed extensions and apply them in place. Only touches extensions you've already installed and your license covers — never installs anything new. Free (no license) is a no-op. Manual trigger; nothing runs automatically.

Inputs: no named parameters. Returns: object

kernel_today_cardA

One-call snapshot of your day, returned as TEXT + structured JSON + an HTML 'ui' block. Aggregates: today's events, overdue+due-today tasks, pending email drafts, open trades and active session PnL. Capable clients (Claude Desktop, web harnesses) render the HTML card; CLI clients see the markdown fallback. Use this whenever the agent or human asks 'what does today look like'.

Inputs: accent. Returns: date, tasks, events, trading, +1 more

kernel_tool_describeA

Fetch the full input/output schema for a tool by name. Use after kernel_tool_search to load only the schemas you'll actually call. Returns the same shape that tools/list would emit for this single tool — minus the host function: this is purely metadata.

Inputs: name (required). Returns: name, tags, description, inputSchema, +1 more

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3/5.0

    Scored across 149 tools

    Disambiguation2/5

    There are several overlapping clusters: kernel_store_*, kernel_marketplace_catalog_* and kernel_marketplace_* all browse/install marketplace items, while extensions also have their own install/enable/uninstall path. Multiple ask/query/recall tools (graph_ask, brain_ask, brain_recall, facts_query, agents_ask_supervisor) and dashboard_morning vs today_card create real misselection risk. Descriptions help, but boundaries are not clean enough for reliable selection across 149 tools.

    Naming Consistency4/5

    All tools use snake_case and a consistent kernel_ prefix, with clear module names such as config, agents, graph and brain. Most follow module_action_object or module_object_action, but verb placement varies (kernel_agents_list vs kernel_agents_add_trigger) and some are noun-only (kernel_today_card). These are minor deviations and remain readable.

    Tool Count1/5

    149 tools is far beyond a manageable tool surface; even with kernel_tool_search and kernel_tool_describe, the set is too large for reliable context management and discovery. This is an extreme mismatch for a single MCP server.

    Completeness3/5

    Broad coverage exists for agents, config, chat, graph facts, extensions/marketplace, projects, outbox and panels, with many CRUD/lifecycle operations. However, core domains repeatedly referenced by dashboards and brain tools—tasks, notes, contacts, calendar events and email approval—lack direct CRUD tools, leaving agents unable to complete those workflows through this surface. Marketplace/store/extension paths also overlap rather than forming one clean lifecycle.

    Maintenance

    ActivityActive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      A
      maintenance
      Self-hosted MCP server giving AI agents persistent memory for personalization and context across conversations.
      103 PyPI
      283
      Apache 2.0
    • A
      license
      Not graded
      quality
      B
      maintenance
      Self-hosted MCP server that gives coding agents persistent, code-aware memory with structural graph recall and blast-radius planning. It links experiential decisions to code locations and provides honest measurement instruments.
      Apache 2.0
    • A
      license
      Not graded
      quality
      C
      maintenance
      Self-hosted, local-first knowledge graph and memory server for AI agents. Enables agents to persist, recall, and organize knowledge through MCP with automatic distillation, deduplication, and cross-linking.
      MIT
    • A
      license
      B
      quality
      C
      maintenance
      A local-first open-source MCP server that acts as a personal secretary, memory manager, and automation hub—it syncs Calendar, Gmail, Canvas, GitHub, and Health into a typed temporal memory graph, and enables approval-gated write actions like creating events, drafting/sending mail, and filing issues, all with telegram/slack/CLI interfaces and a SQLite-backed audit trail.
      33
      Apache 2.0