ProactiveAgent π§
August 18, 2026 Β· View on GitHub
Teach once, use everywhere. Let Claude Code / Kimi Code / Cline / Cursor / Proma share the same "proactive memory" β it doesn't just remember what you taught; it proactively speaks up at the right moment. One MCP mount, every agent instantly gains proactive abilities.
Unlike memory tools that only "remember": ProactiveAgent remembers, and also speaks up when it should β five kinds of proactive suggestions: correction, follow-up, automation, todo, skill.
π¬ The 30-second Story
Everything below is real output from 2026-08-05, not a demo animation: Claude Code writes memory β Kimi Code recalls it (100% hit); behavior corrections / recurring requests β proactive suggestions hit and are accepted.
π Open the interactive story page: Live demo (English Β· GitHub Pages) Β· δΈζη
β οΈ GitHub
blobpages are code viewers and do not execute HTML scripts β use the Pages link above for the interactive demo.
| Scenario | Measured Result |
|---|---|
| Cross-tool sharing | Claude Code memory_capture writes β Kimi Code memory_recall hits (100% relevance, zero config) |
| Proactive suggestion: correction | "Always write unit tests before committing" β suggest_now detects correction β suggest_accept β feedback loops back |
| Proactive suggestion: automation | "Check project progress at 5pm daily" β suggest_now detects automation β accepted β scheduled |
| Kimi one-command install (2026-08-12) | /plugins install .../kimi-plugin.zip β plain kimi sessions get proactive memory automatically (model proactively captures per plugin instructions β recall hits in new sessions, no --agent needed) |
| Kimi three-way proactivity (2026-08-12) | Full hooks chain after 0.35 restored: session-start injection (today-push) β mid-session <notification> relay (kimi-user-prompt) β session-end memory settle (kimi-session-end, pending by default) |
| UMP interop (2026-08-12) | ump-export β official @universalmemoryprotocol/core loads 5/5 + recall (scope.owner) hits β memory is never locked to any tool |
Why It's Worth Using
π― Memory is a "user-level asset", not a "tool-level asset"
Preferences you teach Claude Code automatically work in Kimi Code, Cline, etc. β because memory lives in ~/.proma-proactive/, and every agent reads/writes the same memory through the same MCP server.
Stop re-teaching every tool. Teach once β every agent remembers.
π‘ Proactive suggestions: silent when it should be silent
Not a noisy pusher β it speaks only when there's a signal, with restraint that has parameters:
- You corrected the agent β suggest persisting the rule into long-term memory (prevent recurrence)
- You keep repeating the same task β suggest automation / SOP
- Small talk, rejections, quiet hours β silent (that's the skill)
- Restraint is tunable: 6 notifications/day cap, 15-min cooldown, DND hours (suggestions are kept, not dropped), persona-level "don't bother me" β auto down-rate
π It speaks even with the terminal closed: daemon + desktop notifications
proactive-mcp daemon --install runs persistently (launchd/systemd): even with no agent open, it reviews pending suggestions and speaks up via desktop notification (macOS Notification Center / Windows tray / Linux notify-send); clicking the notification opens the proactive center, one-click accept lands the task.
π Memory is not locked in: UMP interop
proactive-mcp ump-export exports memory as a standard Universal Memory Protocol file β loadable and recallable by the official UMP SDK. Your memory is your asset; take it anywhere UMP goes.
π‘οΈ Poisoning-resistant design, memory safety as a baseline
- Auto-extracted memory defaults to pending (awaiting confirmation) β blocks malicious/incorrect injections before recall
- Same-source principle for LLM config: apiKey decides the trust source, never mixes across sources (anti key-hijack)
- Every memory/correction can be viewed, confirmed, rejected, deleted
π Plug-and-play, one MCP for all
Standard MCP protocol (stdio), zero code change to mount on any MCP-capable agent. Already validated on three different hosts: Claude Code, Kimi Code, Proma (8/12: Kimi additionally gets a one-command plugin); also on Smithery: npx -y smithery mcp add 1797650355/proactive-agent.
Quick Start (< 1 min, no clone / no bun required)
β Published to npm! One command.
Option A (recommended): install via npm
# One-command version (no install, pulls directly from npm)
npx -y @proactive-agent/mcp init
# Or install first, then use the local bin
npm install @proactive-agent/mcp
npx proactive-mcp init
Only requires node >= 18.
initgenerates a.mcp.jsonpointing to your local install, zero extra deps.
Or mount manually (no install, pull via npx):
# Claude Code
claude mcp add proactive-agent -- npx -y @proactive-agent/mcp
Option B (Kimi Code users, one command):
/plugins install https://github.com/ConradLu2740/ProactiveAgent/releases/latest/download/kimi-plugin.zip
/reload
Plain kimi sessions get proactive memory automatically (no --agent needed); optionally kimi --agent proactive for the aggressive mode. See the Kimi Code usage guide.
Option C: clone the repo (development / customization)
git clone https://github.com/ConradLu2740/ProactiveAgent.git && cd ProactiveAgent
npm install
npm run start:mcp
β οΈ
npm run start:mcpkeeps running in the foreground β this is the expected blocking behavior of a stdio MCP server (waiting for agent connections), not a hang. Keep it running and connect from your agent.
Option D: start a local proactive center panel
# Works whether installed or not
npx -y @proactive-agent/mcp --today
# Open http://127.0.0.1:8737/today β suggestions, scenes, persona, stats at a glance
(When developing from a clone, npm run start:today also works)

Today panel: pending suggestions + hot scenes + memory stats + user persona (15s auto refresh)
Verify right after mounting (~1 minute):
- Open Claude Code (or your agent; Kimi users:
init --kimi) and start a session - Type:
always write unit tests before committing from now onβ you should get a "persist this rule to long-term memory?" suggestion (suggest_now) - Then type:
I prefer TypeScript and Bun, then ask:what are my preferences?β recalling the memory above = cross-tool memory works
Not working? Run
proactive-mcp doctorfor one-click diagnostics.
LLM requirements
| Feature | Needs LLM key? | Notes |
|---|---|---|
memory_capture / memory_recall / persona_* / scene_summary / suggest_* / daily_review / onboarding_guide | No | Deterministic local rules, works out of the box |
memory_extract | Optional | Set MEMORY_LLM_* for LLM extraction (DeepSeek-compatible by default); without it, auto-degrades to rule mode, zero outbound traffic |
memory_recall synonym expansion | Optional enhancement | With LLM, auto-adds synonym recall; without it, rule-based synonyms are used |
Optional config example (only needed for memory_extract):
# ~/.proma-proactive/.env (or project .env, prefer chmod 600)
MEMORY_LLM_API_KEY=sk-xxx
MEMORY_LLM_BASE_URL=https://api.deepseek.com/v1
MEMORY_LLM_MODEL=deepseek-chat
Host configuration differences
| Host | Generated by init | Proactive push mechanism | Extra manual steps |
|---|---|---|---|
| Claude Code | .mcp.json + .claude/settings.json hooks | 3-layer hooks (SessionStart / UserPromptSubmit / Stop) | None (interactive TUI; claude -p needs --allowedTools) |
| Kimi Code | .mcp.json + ~/.kimi-code/mcp.json + agents/proactive.md (via init --kimi) | Prompt-driven (kimi --agent proactive) | Needs kimi login/API key; pick either this or kimi-plugin, not both |
| Cursor | .mcp.json | Official mapping of Claude hooks | Confirm .mcp.json is detected; enable third-party hooks compat* |
| Cline | .mcp.json | Manual | Wire event-capture.js manually (optional)* |
| Codex | .mcp.json | Manual | Wire event-capture.js manually (optional)* |
* Only Claude Code / Kimi Code / Proma are verified in this repo; Cursor / Cline / Codex entries follow official docs.
β οΈ Claude Code non-interactive note: hooks only fire in interactive TUI sessions;
claude -pscript/CI mode does not trigger hooks. In scripts, useclaude -p --allowedTools "mcp__proactive-agent__*"to explicitly authorize MCP tools and let the model callsuggest_now/memory_capturedirectly (note:--permission-mode acceptEditsdoes NOT grant MCP tool permissions β explicit--allowedToolsis required).
Capabilities
Tools (20, available on any host)
| Category | Tool | What it does |
|---|---|---|
| π§ Memory write | memory_capture | Explicitly remember a preference/fact/correction/SOP (immediate effect; scope: project/global) |
| π§ Memory extract | memory_extract | Extract memory from a conversation via the engine (pending by default, anti-poisoning) |
| π Memory recall | memory_recall | Keyword/hybrid retrieval, injected before task start (auto: project + global merge) |
| β Memory loop | memory_pending / memory_confirm / memory_reject / correction_confirm / correction_reject | Confirm/reject pending memories + behavior corrections |
| π€ Persona | persona_get / persona_save | Read merged persona (global base + project override) / manually save persona |
| π₯ Scenes | scene_summary | Recent hot scenes ("what you've been busy with") |
| π Stats | memory_stats | Memory system statistics |
| π‘ Suggestions | suggest_now / suggest_list / suggest_accept / suggest_ignore | Proactive suggestion evaluation + feedback loop (frequency learning) |
| π ActionCards | card_list / card_get | Unified cross-source ActionCard protocol view (current source: suggestion; future: agent/automation/bridge) |
| π Templates | daily_review / onboarding_guide | Daily review / getting-started guide |
Resources & Prompts
memory://todayβ today's suggestions + hot scenesmemory://statsγmemory://persona- Prompts:
daily_review(daily review),onboarding(cold-start guide)
Additional capabilities
- /today Web panel: local proactive center (15s auto refresh), any host can open it in a browser;
POST /api/evaluatelets a host push recent messages to trigger mid-session evaluation - Claude Code hooks (three layers):
SessionStart(today-push): push pending suggestions + hot scenes at session startUserPromptSubmit(user-prompt): mid-session real-time evaluation β say "always use pnpm from now on", get a correction suggestion immediately; weak signals stay silentStop(session-end): settle memory + evaluate suggestions at session end
- Kimi Code hooks (proactive relay):
UserPromptSubmitoutputs<notification>XML aligned with Kimi's task notification convention β the Kimi model sees the notification and proactively relays the suggestion ("You said X last time, want to remember it?"), reusing the Kimi externalHooks channel.β οΈ Prerequisite: Kimi Code must be logged in or have an API key configured (
kimifirst run/login, or set[providers.<name>]+api_keyin config.toml). Without it,kimi -pfails withNo model configured. Diagnose with:kimi doctor/kimi provider list. Kimi hooks config is TOML (not JSON), written in~/.kimi-code/config.toml:[[hooks]] event = "UserPromptSubmit" command = "node <mcp install path>/dist/hooks/kimi-user-prompt.js" timeout = 10Only
event/matcher/command/timeoutare allowed;UserPromptSubmitfires when the user sends a message, hook stdout is appended to the context, and the model relays the suggestion after seeing the<notification>.
Use Cases
Scenario 1: Cross-tool shared long-term memory
Today: In Claude Code say "I prefer TypeScript"
Tomorrow: Open Kimi Code to write code β it auto-recalls your preference and follows it
Scenario 2: From "correction" to "never again"
You say: "always write unit tests before committing from now on"
β suggest_now detects it as a correction suggestion
β you click "accept": the rule is written into memory + flows back into the persona
β every agent obeys from then on
Scenario 3: Mid-session proactive suggestion (0.5.0)
In Claude Code you type: "run tests before committing from now on"
β UserPromptSubmit hook evaluates in real time (evaluateNow, session_mid)
β suggestion injected into the current session: "Remember this correction? Accept: suggest_accept"
β on accept, the rule is written into memory, obeyed by every host next time
Scenario 4: Time-aware scheduled task suggestion (0.5.0)
You say: "check release status at 5pm every day"
β time parser recognizes the period β cron: 0 17 * * *
β suggestion prefills a real cron, accept to create the scheduled task directly
Architecture
flowchart LR
A[Claude Code] -->|MCP stdio| S[proactive-mcp]
B[Kimi Code] -->|MCP stdio| S
C[Cline / Cursor] -->|MCP stdio| S
D[Proma] -->|dogfooding| E[proactive-core]
S --> E[proactive-core engine]
E --> F[(~/.proma-proactive memory)]
@proactive-agent/core: headless engine (memory + suggestions), zero runtime deps, consumable by any host@proactive-agent/mcp: MCP Server wrapper (tools/resources/prompts + panel + hooks)
Memory layering model
L1 Atom structured memory entries (LLM-extracted + dedup + priority)
L2 Scene scene blocks (recent topic aggregation, proactivity timing signal)
L3 Persona user persona markdown (stable preferences, source-traced)
Correction behavior-correction candidates (need confirmation to take effect)
Security & Privacy
| Design | Description |
|---|---|
| Pending by default | Auto-extracted memory needs confirmation before recall β blocks injection chains |
| LLM same-source | apiKey decides the primary trust source; baseUrl/model only from the same source; baseUrl https-only |
| Local-first data | Memory lives on your machine at ~/.proma-proactive/, no cloud sync |
| User control | Every memory/correction can be confirmed, rejected, deleted, cleared |
| Quiet hours | DND (default 22:30-08:00) produces no new suggestions |
| Restraint principle | At most 1 suggestion per evaluation, same-session budget, "silent when it should be" |
FAQ
Q: Which agents are supported? A: Any MCP-capable agent: Claude Code, Kimi Code, Cline, Cursor, Windsurf, VS Code, etc. Proma is natively supported (dogfooding).
Q: Where is memory stored?
A: Default ~/.proma-proactive/, overridable with PROACTIVE_DATA_DIR. Pure local files (JSONL/markdown), easy to back up/migrate.
Q: Do I need an API key?
A: No β core features (memory_capture / memory_recall / suggest_*, etc.) work fully locally out of the box; only memory_extract's LLM extraction is optional. See the LLM requirements table in Quick Start.
Q: How is this different from other memory solutions? A: Most are "single-tool passive memory". ProactiveAgent is cross-tool shared + proactive suggestions β teach once use everywhere, and only speak proactively at the right moment.
Q: Does it send my conversations externally?
A: Only memory_extract in LLM mode sends the current conversation snippet to the LLM you configured (default DeepSeek-compatible). Rule mode is zero outbound. Explicit capture/recall is purely local.
Q: Does performance degrade with large memory?
A: Since 0.5.4, memory_recall uses an inverted index (term β atoms, cached + auto-invalidation + fail-open) that only scans candidate atoms containing query terms β imperceptible for personal/small projects, and stays low-latency even at 10k+ memories. Also watch memory size with proactive-mcp stats and use proactive-mcp archive for TTL archiving.
Roadmap
- Core engine (memory + suggestions + scenes + persona)
- MCP Server + panel + hooks
- Proma / Claude Code / Kimi Code real validation
- npm release (@proactive-agent/core + @proactive-agent/mcp)
- Per-project memory (0.3.0: project isolation + explicit global sharing + migration + escape hatch)
- Proactive push loop (0.5.0: evaluateNow unified entry + mid-session UserPromptSubmit hooks + Today push endpoint)
- Kimi proactive relay (0.5.0:
<notification>XML convention, model proactively speaks) - Action Executor (0.5.2: accept = execute β built-in local task queue default executor,
suggest_acceptreally creates scheduled tasks/todos; host-injected real executor auto-overrides) - SessionStart memory injection (0.5.2: today-push auto-injects persona summary + high-priority memory)
- Suggestion ROI metrics (0.5.0: funnel + type accept rate + auto budget reduction)
- Time/period parsing (0.5.0: zh/en time expressions β cron/dueAt prefill)
- English signals (0.5.0: correction/automation/followup/todo in English)
- Kimi turn.steer idle self-start (requires internal Kimi agent API, waiting on upstream)
- Metrics panel: accept rate / disturb rate (0.5.0:
suggestionRoiStatsfunnel + type accept rate + auto budget reduction, shown in Today ROI section) - Local embeddings (0.1.x: local node-llama-cpp + embeddinggemma / api dual mode, default off fail-open)
- Bilingual README (0.5.3: README.en.md + language switch)
- Memory indexing (0.5.4: inverted index + cache invalidation + fail-open, supports 10k+ entries)
- Auto-archive / TTL memory management (0.5.4: per-type TTL + env override + archive CLI)
Contributing
PRs / Issues welcome! Dev environment: Node 22 + TypeScript + Vitest + esbuild. npm install && npm test && npm run build