A simple workflow CLI your agents can use.
Tutti is an open-source workflow manager. Claude Code, Codex and ChatGPT use its CLI and MCP server to turn what you ask into workflows that run on their own.
Claude Code · ~/sales
› Every weekday at 08:00, score new leads and post the hot ones to #sales.
$ tutti workflows create --file morning-leads.json
id wf_8f2k1
name Morning leads
…
$ tutti workflows show "Morning leads"
workflow: Morning leads
◆ Weekdays · Schedule
└─→ ● New leads · records/list-people
└─→ ● For each lead · system/loop
├─→ ● Score the lead · anthropic/generate-text
├─→ ● Hot leads only · system/condition
│ └─→ ● Post to #sales · slack/send-message
│ └─→ ● Create a customer · stripe/create-customer
│ └─→ ● Send the digest · google-gmail/send-gmail
└─→ ● Add to nurture list · records/upsert-person
└─→ ↩ Send the digest
Morning leads
Weekdays at 08:00
Weekdays 08:00Schedule
+
New leadsLibrary
+
For each lead
Score the leadClaude
+
Hot leads onlyCondition
+
Post to #salesSlack
+
Create a customerStripe
Add to nurture listLibrary
+
Send the digestGmail
Your agent does a job once. A workflow does it every day.
Your agent alone
MondayYou ask it
TuesdayYou ask again
WednesdayYou ask again
ThursdayYou forget
FridayYou ask again
Your agent with Tutti
MondayYou ask it once
TuesdayRan at 08:00 · Done in 4.6 s
WednesdayRan at 08:00 · Done in 4.2 s
ThursdayRan at 08:00 · Done in 4.9 s
FridayRan at 08:00 · Done in 4.4 s
Two ways in: a CLI and an MCP server.
The CLI
For agents that work in a terminal, like Claude Code and Codex.
npm i -g @darkmatter-ai/tutti
tutti workflows create --file wf.json
tutti run "Morning leads"
The MCP server
For agents you chat with, like Claude and ChatGPT. 90 tools.
create_workflow
execute_workflow
get_execution_logs
It answers in JSON, so agents never have to guess.
Terminal
$ tutti run "Morning leads" --raw
{ "executionId": "exec_3kq9", "workflowId": "wf_8f2k1", "workflowName": "Morning leads", "status": "success", "duration": "4612" }
Piped output is always JSON.Errors come back as JSON, with an exit code.Anything destructive needs --yes.
When a run fails, your agent can fix it.
Claude Code
$ tutti executions logs exec_7m2p --status error
{ "nodeName": "Post to #sales", "status": "error", "error": "Slack replied channel_not_found" }
$ tutti workflows node patch "Morning leads" post --set 'slackChannel=#sales-team'
{ "id": "post", "label": "Post to #sales", ... }
$ tutti run "Morning leads"
{ "status": "success", "duration": "4418", ... }
Anything you can do in Tutti, your agent can do too.
Team database13
create_custom_table
query_rows
kv_set
Records12
search_people
create_record
update_record
Workflow10
create_workflow
get_workflow
update_node
Execution8
execute_workflow
get_execution_logs
cancel_execution
Reference7
get_workflow_guide
list_actions
list_provider_models
Folders6
create_folder
list_folders
move_workflows_to_folder
Integration6
create_integration
list_integrations
test_integration
Email templates6
create_email_template
update_email_template
duplicate_email_template
Connectors5
list_connector_catalog
create_connector
test_connector
Custom columns5
create_custom_column
list_custom_columns
set_record_custom_field
Schedules4
list_scheduled_workflows
toggle_schedule
update_schedule
Browser sessions4
list_browser_sessions
get_browser_session
cancel_browser_session
WhatsApp3
list_whatsapp_templates
create_whatsapp_template
delete_whatsapp_template
Actions1
execute_action