aikb
Programmatic CRUD for AI project knowledge bases (Claude Projects, Gemini Gems).
Dict-like access to knowledge files — store['notes.md'] = content — backed by
local files, Claude Projects (via ClaudeSync), or any custom provider.
To install: pip install aikb
Quick start
from aikb import LocalKb
store = LocalKb() # ~/.local/share/aikb/localkb_files/default/
store['ideas.md'] = '# Ideas\nFirst idea'
print(store['ideas.md'])
list(store) # ['ideas.md']
del store['ideas.md']
Every store is a standard Python MutableMapping (dict-like), so len(),
in, .keys(), .values(), .items(), and .update() all work.
Override the default directory with a path or the AIKB_LOCAL_DIR env var:
store = LocalKb('/path/to/my/knowledge')
store = LocalKb(project_id='research') # subfolder under default dir
Claude Projects
Manage knowledge files in Claude.ai Projects programmatically:
pip install aikb[claude]
Browse all your projects
from aikb import ClaudeProjects
projects = ClaudeProjects()
list(projects) # ['My Project', 'Another Project', ...]
files = projects['My Project'] # returns a dict-like store
list(files) # ['context.md', 'notes.md']
print(files['context.md'])
Direct access by project UUID
from aikb import ClaudeProject
store = ClaudeProject('your-project-uuid')
store['context.md'] = '# Project context\n...'
print(store['context.md'])
del store['context.md']
Getting your session key
aikb automatically looks for a Claude session key in this order:
- Explicit
session_keyparameter CLAUDE_SESSION_KEYenvironment variable- ClaudeSync stored credentials (
~/.claudesync/) - Browser cookies (requires
pip install aikb[cookies])
If none are found, you'll get a helpful error with instructions.
To get your session key manually:
- Open https://claude.ai and log in
- Open Developer Tools (F12) → Application → Cookies
- Copy the value of the
sessionKeycookie (starts withsk-ant-) - Set it:
export CLAUDE_SESSION_KEY='sk-ant-sid01-...'
Or use ClaudeSync to store credentials:
pip install claudesync
claudesync auth login
Syncing stores
aikb includes a sync engine that works with any two MutableMapping stores — plain dicts, LocalKb, ClaudeProject, or any custom store.
Push / Pull (one-directional)
from aikb import LocalKb, ClaudeProject, push, pull
local = LocalKb('/path/to/docs')
remote = ClaudeProject('project-uuid')
push(local, remote) # local → remote (source wins)
push(local, remote, delete=True) # also remove remote files not in local
pull(local, remote) # remote → local
Bidirectional sync (three-way reconciliation)
from aikb import sync, clone
# First time: clone to establish a manifest (baseline)
clone(local, remote, manifest_path='.aikb/manifest.json')
# Later: bidirectional sync detects who changed what
sync(local, remote, manifest_path='.aikb/manifest.json')
Status (dry run)
from aikb import status
for action in status(local, remote):
print(f"{action.action.value:8s} {action.direction:10s} {action.filename}")
Conflict resolution
from aikb import sync, ConflictPolicy
sync(a, b, manifest=m, on_conflict=ConflictPolicy.A_WINS) # local wins
sync(a, b, manifest=m, on_conflict=ConflictPolicy.SKIP) # skip conflicts
sync(a, b, manifest=m, on_conflict=my_resolver_function) # custom callable
Works with plain dicts too — no aikb stores required:
from aikb import push
src = {"readme.md": "# Hello", "notes.md": "..."}
tgt = {}
push(src, tgt) # tgt is now a copy of src
Custom providers
Implement the KnowledgeBaseProvider protocol to add new backends:
from aikb import KnowledgeFiles, KnowledgeBaseProvider
class MyProvider: # no inheritance needed — just implement the methods
def list_files(self, project_id: str): ...
def read_file(self, project_id: str, filename: str) -> str: ...
def upsert_file(self, project_id: str, filename: str, content: str): ...
def delete_file(self, project_id: str, filename: str): ...
store = KnowledgeFiles(MyProvider(), project_id='my-project')
MCP server
Expose knowledge base CRUD as MCP tools for Claude Desktop, Claude Code, or any MCP-compatible client:
pip install aikb[mcp]
python -m aikb.mcp_server
Tools exposed: list_files, read_file, write_file, delete_file — each
taking platform ("local" or "claude"), project, and file parameters.
dol compatibility
aikb stores implement collections.abc.MutableMapping, making them natively
compatible with dol:
pip install aikb[dol]
from dol import wrap_kvs
from aikb import LocalKb
store = wrap_kvs(
LocalKb('/tmp/kb'),
obj_of_data=lambda s: s.upper(), # transforms on read
)
Optional dependencies
| Extra | Install | Provides |
|---|---|---|
claude |
pip install aikb[claude] |
Claude Projects via ClaudeSync |
cookies |
pip install aikb[cookies] |
Auto-extract session keys from browser |
mcp |
pip install aikb[mcp] |
FastMCP server |
dol |
pip install aikb[dol] |
dol store transforms |
all |
pip install aikb[all] |
Everything |
Skills
This package ships agent skills you can install into any agent host with
gh skill (don't have it?
install gh):
gh skill install thorwhalen/aikb aikb-setup --agent claude-code
gh skill install thorwhalen/aikb aikb-sync
gh skill install thorwhalen/aikb aikb-maintain
| Skill | Use it when… |
|---|---|
aikb-setup |
installing, configuring, or starting to use aikb |
aikb-sync |
syncing knowledge files between platforms or directories |
aikb-maintain |
maintaining, extending, or debugging aikb |
Metadata
Release files for aikb 0.0.7
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| aikb-0.0.7.tar.gz | 43.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| aikb-0.0.7-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 57.0 kB
Release files / aikb-0.0.7.tar.gz
| Download URL | aikb-0.0.7.tar.gz |
|---|---|
| Size | 43.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
4bffd554418ca823185d9942309eff8cfede71cc8deac93c9f60317df5048d97
|
|
BLAKE2b-256 checksum How to use checksums |
6837d1476008dcd11cebda56f97fa8a3c8bbdc53569f8c13052acf44e9dbfbb3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.23 {"installer":{"name":"uv","version":"0.11.23","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / aikb-0.0.7-py3-none-any.whl
| Download URL | aikb-0.0.7-py3-none-any.whl |
|---|---|
| Size | 14.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
561ffe6b8a1d5cd863eef309d9ea583b45cd912bfcf72bfaa1350d9910e45735
|
|
BLAKE2b-256 checksum How to use checksums |
e2ea211323fb26bf69203f5e696eb42961610f24c85b062e8f60abd42f975bdc
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.11.23 {"installer":{"name":"uv","version":"0.11.23","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|