strands-emotiv
An agent that can feel the person it's talking to.
EPOC X → Cortex → Strands tools · live brain dashboard · LeRobot v3 datasets.
docs · soul · dataset
2019: how do I control X with my mind? Blink = click. A slower keyboard. 2026: what does an agent become when it can feel you?
It notices when you tense up, go quiet, or light up, and changes how it talks.
Run
pip install strands-emotiv # or: uv tool install strands-emotiv
export EMOTIV_CLIENT_ID=… EMOTIV_CLIENT_SECRET=… # free Basic license
strands-emotiv doctor # Cortex ✓ headset ✓ streams ✓
strands-emotiv dashboard # → localhost:8765
Use the USB dongle; the cable only charges. No headset: --fake replays 865 real samples.
What the agent sees
One line per turn. The dashboard shows the exact same line.
[brain: focus 0.71↑ · stress 0.22↓ · alpha dominant O1/O2 · still 38s · CQ 13/14 good]
| you | it |
|---|---|
| stress ↑, build failed | 3 lines, 1 next step, no questions |
| alpha up, still 40 s | stays quiet |
| CQ < 10/14 | "I can't see your brain right now" |
Three speeds, never mixed: reflex ≤100 ms (blink · clench = veto) · ambient ~10 s (the line) · intent opt-in (one trained yes).
Dashboard
Left = you: skull with 14 live electrodes, 5 band topomaps, 10-min waterfall, head trail. Right = the agent: the line it reads, event river, metric radar, sonification, consent. Bottom: streaming chat. Under each message, the line it saw when you sent it.
The dataset
▶ 1 min: recording an episode on the dashboard
Embodied chain-of-thought, brain edition: observation = band power · CQ · motion · metrics · facial · events @ 8 Hz. action = what the agent said. reward = your brain after the answer (Δstress, Δengagement across the turn boundary). LeRobot v3.0, trains with stock tooling.
from lerobot.datasets.lerobot_dataset import LeRobotDataset
ds = LeRobotDataset("cagataydev/emotiv-ecot") # private
ds[80]["observation.state"].shape # [70] 14 ch × θ α βL βH γ
ds[80]["task"]
# TASK: One sentence: how does my brain look right now? | AMBIENT: [brain: theta dominant · CQ 13/14 good]
# | PLAN: Calm and settled… | TOOL: none | ACT: Calm and settled… | REWARD: Δstress=…
That's a real frame from the first live episode. ● REC in the header → talk → Publish.
Tools
from strands_emotiv.tools import brain_snapshot, brain_bands, head_pose, contact_quality, wait_for_brain_event
agent("wait until I blink twice, then tell me what my alpha did")
Every agent action stamps the EEG record (injectMarker). The loop closes both ways.
MCP
Any MCP client can feel the person wearing the headset. Claude Desktop, Cursor, Kiro, another agent:
{ "mcpServers": { "brain": { "command": "uvx", "args": ["strands-emotiv", "mcp"] } } }
13 tools: brain_line (the one line), brain_snapshot, brain_bands, head_pose, contact_quality, wait_for_brain_event, recent_brain_events, brain_status, mental_approval, and the four record_* tools. Add --http 8000 for streamable HTTP at /mcp, --fake to try it without a headset. Built on strands-mcp-server.
MIT · Cagatay Cali · 2019 → 2026
Metadata
Release files for strands-emotiv 0.2.1
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 | |
|---|---|---|---|---|
| strands_emotiv-0.2.1.tar.gz | 455.0 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| strands_emotiv-0.2.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 801.8 kB
Release files / strands_emotiv-0.2.1.tar.gz
| Download URL | strands_emotiv-0.2.1.tar.gz |
|---|---|
| Size | 455.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
2fc3dc6fd141b35cc4c19c60cf68b2a9827408b81c8b3b6ff52d40dd5da86cf5
|
|
BLAKE2b-256 checksum How to use checksums |
024c5dc2fd321933c6dd291894e7b5e0d1ec057024729160ece76b2407abe942
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.9 {"installer":{"name":"uv","version":"0.12.9","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 / strands_emotiv-0.2.1-py3-none-any.whl
| Download URL | strands_emotiv-0.2.1-py3-none-any.whl |
|---|---|
| Size | 346.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
8d7c823d931c249565fc90300f990c4ce9171c698a01f6089483d2832fa4c389
|
|
BLAKE2b-256 checksum How to use checksums |
f7d909a7a8f3800603c8d1b6e1512d49d9748e8adc89885a9b4188e63d7ea831
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.12.9 {"installer":{"name":"uv","version":"0.12.9","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}
|
Security for strands-emotiv 0.2.1
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.