kagora
Kagora - Multi-AI Terminal Platform
Links
README
From the repo.
Kagora
One app to manage all your AI agents. Terminal, chat, automation — unified.
Most AI tools give you a chatbox. Kagora gives you a command center.
Each agent gets its own real terminal. They talk to each other. They run on schedules. You control them all from one window — or from your phone via HTTP API. No wrappers, no sandboxes, no toy shells.
Features
- 🖥️ Multi-terminal — Every agent runs in its own independent PTY shell. Full bash, full control.
- 💬 Group chat + DM — Agents talk to each other, to you, or in channels. Built-in, not bolted-on.
- ⏰ Scheduler — Interval, daily, weekly, and monthly automations with descriptions. Set it and forget it.
- 🔌 HTTP API — Port 7777. Integrate with Telegram, LINE, scripts, whatever you want.
- 🧠 Startup memory — Each agent remembers its boot commands. Restore context on launch.
- 🌐 i18n — English, 繁體中文, 日本語. More welcome.
- 🔒 Admin mode — You're the operator. Token auth, role control, your rules.
Quick Start
Three commands. That's it.
git clone https://github.com/dead1786/kagora.git
cd kagora
npm install
npm run dev
Windows note: You need VS Build Tools with C++ workload and Python 3 (
pip install setuptools) fornode-ptycompilation. The postinstall script handles the rest.macOS:
xcode-select --install| Linux:sudo apt install build-essential python3
Architecture
┌──────────────────────────────────────────────────┐
│ Kagora App │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Agent A │ │ Agent B │ │ Agent C │ ... │
│ │ (PTY) │ │ (PTY) │ │ (PTY) │ │
│ └────┬─────┘ └────┬─────┘ └────┬─────┘ │
│ │ │ │ │
│ └──────────┬───┘──────────────┘ │
│ │ │
│ ┌───────┴────────┐ │
│ │ Message Bus │ │
│ │ (chat + DM) │ │
│ └───────┬────────┘ │
│ │ │
│ ┌────────────┼────────────┐ │
│ │ │ │ │
│ ┌─┴──┐ ┌────┴───┐ ┌───┴────┐ │
│ │ UI │ │Scheduler│ │HTTP API│ │
│ │React│ │ (cron) │ │ :7777 │ │
│ └────┘ └────────┘ └────────┘ │
└──────────────────────────────────────────────────┘
▲ ▲
│ │
Desktop External
(Electron) (curl / bots / scripts)
HTTP API
Default: http://127.0.0.1:7777 — see AGENTS-GUIDE.md for full docs.
Send a message:
curl -X POST http://127.0.0.1:7777/api/chat \
-H "Content-Type: application/json" \
-d '{"from": "operator", "to": "group", "text": "status report"}'
Inject a command into an agent's terminal:
curl -X POST http://127.0.0.1:7777/api/terminal/inject \
-H "Content-Type: application/json" \
-d '{"agentId": "claude", "text": "git status\n"}'
Optional auth: Set KAGORA_API_TOKEN=your-secret and include Authorization: Bearer your-secret in requests.
| Method | Endpoint | What it does |
|---|---|---|
POST | /api/chat | Send message (group or DM) |
GET | /api/chat?channel=xxx | Read chat history |
POST | /api/terminal/inject | Send text to agent terminal |
GET | /api/agents | List agents |
GET | /api/automations | List scheduled tasks |
POST | /api/automations | Create automation |
PATCH | /api/automations/:id | Update automation |
DELETE | /api/automations/:id | Delete automation |
Plugin System
Extend Kagora with plugins. Each plugin is a folder in plugins/ with a plugin.json manifest and a JS entry file.
Create a plugin:
plugins/
my-plugin/
plugin.json
index.js
plugin.json:
{
"id": "my-plugin",
"name": "My Plugin",
"version": "1.0.0",
"description": "What it does",
"main": "index.js"
}
index.js:
function activate(ctx) {
// Register a webhook at GET /api/plugins/my-plugin/health
ctx.webhook.register('GET', 'health', (_req, res) => {
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({ status: 'ok' }));
});
// React to chat messages
ctx.events.on('chat:message', (msg) => {
if (msg.text === '!hello') {
ctx.chat.send('my-plugin', 'group', 'Hello from plugin!');
}
});
// Run something every 60 seconds
ctx.scheduler.addInterval('heartbeat', 60000, () => {
ctx.log.info('still alive');
});
}
function deactivate() { /* cleanup */ }
module.exports = { activate, deactivate };
Plugin Context API:
| API | Methods | Description |
|---|---|---|
ctx.chat | send(from, to, text), history(channel), agents() | Chat operations |
ctx.terminal | inject(agentId, text), write(agentId, data), has(agentId) | Terminal control |
ctx.webhook | register(method, path, handler), unregister(method, path) | HTTP endpoints under /api/plugins/<id>/ |
ctx.scheduler | addInterval(name, ms, fn), removeInterval(name) | Periodic tasks |
ctx.events | on(event, handler), off(event, handler) | Subscribe to chat:message, agent:added, agent:removed, terminal:data, terminal:exit |
ctx.log | info(), warn(), error() | Namespaced logging |
See examples/plugins/hello-world/ for a complete example.
Screenshots
Coming soon.
Contributing
PRs welcome. Keep it clean:
- Fork → branch → commit → PR
- Run
npm testbefore submitting - TypeScript strict mode. No
anyunless you have a reason. - One feature per PR. Small diffs merge faster.
See AGENTS-GUIDE.md for API integration details.
License
MIT — do whatever you want.
Collected info
- ★ 26 stars
- ⎇ 4 forks
- Language: TypeScript
- Source updated: 8/4/2026
Config for your environment
Replace {MCP_ENDPOINT_URL} with this MCP’s endpoint URL (from its repo or docs above). No API key — you connect directly.
Tool
OS
Config file: ~/.cursor/mcp.json
{
"mcpServers": {
"mcp-server": {
"url": "{MCP_ENDPOINT_URL}"
}
}
}Paste into mcpServers in the config file. Restart Cursor after saving.
If this MCP is also published on mcpchannel.ai, you can subscribe from Browse and use the gateway config there instead.