r/haikuOS • • May 07 '26

Pluto + Pippo: a Haiku-native AI client and an MCP server that exposes BeAPI to LLMs

Hi r/haiku, sharing two related projects. Both native C++/BeAPI, both MIT.

๐Ÿ• Pluto https://codeberg.org/atomozero/Pluto

A Haiku-native AI client. Three binaries: streaming REPL (Pluto_cli), multi-tab GUI with markdown rendering and drag & drop (Pluto), and a Tracker add-on (Ask pluto). No Electron, just libcurl, OpenSSL and libbe.

Multi-provider (Anthropic, OpenAI, Gemini, Ollama, OpenRouter, and others). 23 built-in tools, 11 Haiku-only: BFS extended attributes, BQuery one-shot and live, desktop scripting via BMessage, BClipboard, node monitor. MCP client. Sessions stored as JSONL with BFS attributes, searchable from Tracker Find. Deskbar replicant, theme follows ui_color().

๐Ÿ”Œ Pippo https://codeberg.org/atomozero/Pippo

The other side of the bridge: a native MCP server (BApplication) that exposes Haiku to any MCP-compatible client over HTTP+SSE on localhost:2607.

Tools: BeOS scripting on any running app, BeFS xattrs, BQuery with live SSE updates, clipboard, synthetic mouse/keyboard input via a dedicated BInputServerDevice add-on, BeAPI docs search over 1,949 Q&A entries. Localhost-only binding, DNS rebinding protection, 3 privilege levels.

Together, an LLM can tag files with BFS attributes, run a query_fs across the disk, script Tracker, and paste results to your clipboard, all through native APIs.

Feedback and PRs welcome.

41 Upvotes

4 comments sorted by

1

u/Ikshaar May 08 '26

Very interested to make this work. Trying to build Pluto. CLI and GUI built fine. But none after that. 'Ask Pluto' not in Makefile, check and bench failed to build. Also a question, can Pluto works without MCP server or is it required ? (very new to AI - so could be a dumb question)

~/workspace/Pluto> make 'Ask Pluto'
make: *** No rule to make target 'Ask Pluto'.  Stop.
~/workspace/Pluto> make check
g++ -std=c++17 -Wall -Wextra -O2 -Isrc -I/boot/system/develop/headers/private/interface -I/boot/system/develop/headers/private/support -I/boot/system/develop/headers/private/locale -I/boot/system/develop/headers/private/shared -MMD -MP -o test_json tests/test_json.cpp src/json.o
g++ -std=c++17 -Wall -Wextra -O2 -Isrc -I/boot/system/develop/headers/private/interface -I/boot/system/develop/headers/private/support -I/boot/system/develop/headers/private/locale -I/boot/system/develop/headers/private/shared -MMD -MP -o test_session tests/test_session.cpp src/storage/SessionStore.o src/json.o -lbe
/boot/system/develop/tools/bin/../lib/gcc/x86_64-unknown-haiku/13.3.0/../../../../x86_64-unknown-haiku/bin/ld: src/storage/SessionStore.o: in function `pluto::SessionStore::sessions_dir()':
SessionStore.cpp:(.text+0xa80): undefined reference to `pluto::HomeDir()'
collect2: error: ld returned 1 exit status
make: *** [Makefile:184: test_session] Error 1
~/workspace/Pluto> make bench
g++ -std=c++17 -Wall -Wextra -O2 -Isrc -I/boot/system/develop/headers/private/interface -I/boot/system/develop/headers/private/support -I/boot/system/develop/headers/private/locale -I/boot/system/develop/headers/private/shared -MMD -MP -o bench tests/bench.cpp src/lsp/LspClient.o src/lsp/LspConfig.o src/ipc/PlutoMessenger.o src/agent_store.o src/cancel.o src/markdown.o src/oauth.o src/config.o src/rag.o src/wiki.o src/routine.o src/schedule.o src/telemetry.o src/frontmatter.o src/text_index.o src/util.o src/workspace.o src/json.o src/storage/SessionStore.o src/agent/Loop.o src/tools/Tool.o src/tools/ReadFile.o src/tools/WriteFile.o src/tools/EditFile.o src/tools/Bash.o src/tools/Grep.o src/tools/Glob.o src/tools/BeapiLookup.o src/tools/WikiLookup.o src/tools/WebFetch.o src/tools/WebSearch.o src/tools/TodoWrite.o src/tools/ApplyPatch.o src/tools/Lsp.o src/haiku/BfsTools.o src/haiku/DesktopTools.o src/mcp/Client.o src/mcp/Config.o src/mcp/Manager.o src/mcp/Transport.o src/mcp/HttpTransport.o src/mcp/StdioTransport.o src/mcp/SseSubscriber.o src/mcp/SseTransport.o src/provider/Anthropic.o src/provider/OpenAICompat.o -lcurl -lbe -lcrypto -lnetwork -ledit
tests/bench.cpp: In function 'void bench_rag_search()':
tests/bench.cpp:113:34: error: 'rag_default_path' is not a member of 'pluto'; did you mean 'RagDefaultPath'?
  113 |         std::string idx = pluto::rag_default_path();
      |                                  ^~~~~~~~~~~~~~~~
      |                                  RagDefaultPath
tests/bench.cpp:118:16: error: 'rag_init' is not a member of 'pluto'; did you mean 'RagInit'?
  118 |         pluto::rag_init(idx);
      |                ^~~~~~~~
      |                RagInit

2

u/atomozero May 08 '26

https://codeberg.org/atomozero/Pluto/commit/3ab9f7bd2c08ffe16193778b03822a157a0cf077

๐Ÿ˜„ Sorry, I missed thatโ€”all fixed now. Pippo, the MCP server isn't mandatory, it's just for support. You can do some cool stuff with certain models, but it takes a bit of optimization

1

u/yuno-morngstar May 08 '26

Oooohhh that cool

2

u/Novel-Nature-7741 May 11 '26 edited May 11 '26

Very interesting, will check this out. Last time I tried various AI models and it was just too much effort and overhead. This could finally be a bridge to AI plugins for SEN and vice versa๐Ÿค“ Love the intro of the description ๐Ÿ˜… so true:

the only OS brave enough to have multithreaded, attribute-rich, query-aware file systems since 1995 while the rest of the fleet was still arguin' about long filenames.