aionai
A shared working-state layer for your AI coding tools. Claude, Cursor, and other MCP clients read and write one small notebook, so they stay on the same page — and you stop being the copy-paste bus between them.
One-click install for Cursor (activates once aionai is published to PyPI). Remember to set
AIONAI_SOURCE=cursorin the server's env afterwards.
The problem
You use more than one AI assistant on a project. They don't know what each other did: you tell Claude a decision, switch to Cursor, and Cursor has no idea. You end up re-explaining and copy-pasting context by hand.
What aionai does
aionai is a tiny local MCP server that keeps a shared, persistent notebook every tool can read and write. It does three jobs:
- Remember — decisions, changes, questions, and notes, organized by project.
- Track — a lightweight roadmap/to-do list with progress rollup.
- Hand off — post a task to another tool's inbox (with an optional "doorbell").
It does not replace your repo, docs, or git — those stay the source of truth. aionai just holds the live working state and hands each tool the slice it needs.
Install
pipx install aionai # or: uv tool install aionai
No install step at all, if you use uv:
uvx aionai --help
Connect your tools
Point each client at the aionai command. Give each client a distinct AIONAI_SOURCE
(so handoffs route correctly) and set AIONAI_SEGMENT to your project name.
Claude Code
claude mcp add aionai --env AIONAI_SOURCE=claude-code --env AIONAI_SEGMENT=myproject -- aionai
# or with uv: claude mcp add aionai --env AIONAI_SOURCE=claude-code -- uvx aionai
Cursor — .cursor/mcp.json:
{
"mcpServers": {
"aionai": { "command": "aionai", "env": { "AIONAI_SOURCE": "cursor", "AIONAI_SEGMENT": "myproject" } }
}
}
Claude Desktop — Settings → Developer → Edit Config:
{
"mcpServers": {
"aionai": { "command": "aionai", "env": { "AIONAI_SOURCE": "claude-desktop", "AIONAI_SEGMENT": "myproject" } }
}
}
Restart the client after editing its config — MCP servers are launched (and their env read) when the client connects.
Use it
Add this to each tool's rules (CLAUDE.md, Cursor rules) so they do it reflexively:
Before working, call
context_pull(segment="myproject")and treat the result as the current truth. As you work,context_log(...)your decisions/changes/questions/tasks. When something is settled,context_resolve(id).
That's the whole loop: pull first, write back. Now open Cursor and it already knows what you and Claude decided — no paste.
Segments
State is organized by a dotted segment path whose first element is the project:
myproject # the whole project
myproject/backend # a layer
myproject/backend/auth # a workstream
Pulling a parent includes all descendants. That one mechanism keeps an always-on space from turning into an undifferentiated blob.
The tools
| tool | purpose |
|---|---|
context_pull(segment) |
current working state + your inbox |
context_log(segment, type, content, refs) |
append a decision/change/question/task/note |
context_resolve(id) |
close a question or task |
context_search(query, segment) |
full-text recall over history |
context_verify(segment) |
check change entries against git (merged vs. bare claim) |
context_handoff(segment, content, to) |
post a handoff to another tool's inbox |
roadmap_add_node / roadmap_update / roadmap_block |
build & manage the roadmap |
roadmap_view / roadmap_progress |
see the tree / how far along |
constraints_for_task(segment) |
decisions + open questions that constrain a task |
project_lookup(query, project) |
reuse an approach from another project |
They also surface as slash commands (/mcp__aionai__pull, …log, …resolve, …search,
…handoff) in clients that support MCP prompts.
Optional extras
- Auto-ingest commits — copy
hooks/post-commitinto a repo's.git/hooks/(setAIONAI_SEGMENT) and every commit logs itself as achange. - Doorbell — set
AIONAI_DELIVERY=1in a sender's env and acontext_handoffto Cursor also summons Cursor via its deeplink (you confirm before it runs). Without it, handoffs are inbox-only. Onlycursorhas a verified deeplink today.
How it works
One SQLite database, one append-only table. Every decision, task, handoff, and
roadmap node is a row tagged with a segment and a type. History is free because
nothing is overwritten. Full-text search uses FTS5 with a LIKE fallback. The MCP
tools are thin wrappers over a plain-Python storage layer (src/aionai/store.py).
Configuration
| var | default | purpose |
|---|---|---|
AIONAI_DB |
~/.aionai/aionai.db |
database path (share explicitly if clients don't hit the default) |
AIONAI_SOURCE |
agent |
who is writing (cursor / claude-code / claude-desktop); routes the inbox |
AIONAI_SEGMENT |
project |
default project segment |
AIONAI_DELIVERY |
(unset) | 1 enables the doorbell in the sender |
Development
git clone https://github.com/imsm/aionai && cd aionai
pip install -e ".[dev]"
pytest
ruff check .
License
Apache-2.0 © Ismail Saleh.
Metadata
Release files for aionai 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| aionai-0.1.0.tar.gz | 19.1 kB | Without provenance | Details for aionai-0.1.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| aionai-0.1.0-py3-none-any.whl | Python 3 | none | any | Details for aionai-0.1.0-py3-none-any.whl |
Total release size: 39.7 kB
Release files / aionai-0.1.0.tar.gz
| Download URL | aionai-0.1.0.tar.gz |
|---|---|
| Size | 19.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
cb72df8fca51fb069092711b50189bad038d7a10327b359a01ed70a122cdf138
|
|
BLAKE2b-256 checksum How to use checksums |
a017b3d9bc9d99f96ecccd14aa237ebff551dcdc2f2726fa0a84563a079c7a4d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.3
|
Release files / aionai-0.1.0-py3-none-any.whl
| Download URL | aionai-0.1.0-py3-none-any.whl |
|---|---|
| Size | 20.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
c740a9861555dad5d4c1291073805c5647f5a512ab03d2b6db731090aa3ca1fe
|
|
BLAKE2b-256 checksum How to use checksums |
bda43ee546b1d5eafec15199a4d169932178a5f3adc12b9c49bfe1c35b18c3f4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.3
|
Security for aionai 0.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.