in-progress macos orchestrator
built with rust for macos automation through mcp protocol and http api
- mcp protocol server (works with claude desktop)
- http rest api
- 13 skills: music control, system ops, browser automation
- message-based architecture
- capability permissions
- async execution with timeouts
- skill chaining (unique - not in system)
monday supports chaining multiple skills in sequence, something system doesn't have. execute workflows like:
{
"chain": [
{"skill": "music.play", "params": {"query": "lofi"}},
{"skill": "system.volume", "params": {"level": 30}},
{"skill": "system.notify", "params": {"title": "ready", "message": "music started"}}
]
}each skill's output can feed into the next skill's input.
requires rust 1.70+
git clone https://github.com/sanjaibalajee/monday.git
cd monday
./scripts/setup.shhttp mode:
cd engine
cargo run --releasemcp mode:
cd engine
cargo run --release -- --mcpadd to ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"monday": {
"command": "/path/to/monday/engine/target/release/monday-engine",
"args": ["--mcp"]
}
}
}list skills:
curl -H "Authorization: Bearer YOUR_TOKEN" \
http://localhost:7777/skillsexecute skill:
curl -X POST http://localhost:7777/execute \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"skill": "music.play",
"params": {"query": "beatles"}
}'chain skills:
curl -X POST http://localhost:7777/chain \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"chain": [
{"skill": "browser.open", "params": {"url": "https://youtube.com"}},
{"skill": "system.notify", "params": {"title": "opened", "message": "youtube ready"}}
]
}'music (6):
- music.play - search and play track
- music.pause - pause playback
- music.next - next track
- music.previous - previous track
- music.current - get current track info
- music.volume - set music volume
system (4):
- system.notify - send notification
- system.screenshot - take screenshot
- system.clipboard - read clipboard
- system.volume - set system volume
browser (3):
- browser.open - open url
- browser.current_url - get current safari url
- browser.new_tab - open new tab
edit config/monday.toml:
[engine]
max_concurrent = 10
timeout_seconds = 30
[security]
auth_token = "your-token-here"
capability_level = "standard" # unrestricted | standard | strict | minimalmonday/
├── engine/ # rust engine
│ └── src/
│ ├── core/ # message, result, capability types
│ ├── skills/ # skill implementations
│ ├── orchestrator/ # execution orchestrator
│ └── auth/ # authentication
├── config/ # configuration files
└── scripts/ # build scripts
create new skill in engine/src/skills/:
use crate::core::{Capability, ExecutionResult, Message};
use crate::skills::{Skill, SkillCategory, SkillSchema, ParameterType};
use async_trait::async_trait;
struct MySkill;
#[async_trait]
impl Skill for MySkill {
fn id(&self) -> &str { "category.action" }
fn name(&self) -> &str { "My Skill" }
fn description(&self) -> &str { "does something" }
fn capabilities(&self) -> Vec<Capability> { vec![] }
fn category(&self) -> SkillCategory { SkillCategory::Custom }
fn schema(&self) -> SkillSchema { SkillSchema::new() }
async fn execute(&self, message: Message) -> anyhow::Result<ExecutionResult> {
Ok(ExecutionResult::success("done"))
}
}register in engine/src/orchestrator/mod.rs:
registry.register(Arc::new(MySkill))?;