CLI Quick Start
Get the full workflow running from the command line in 5 minutes.
Install
npm install -g puppyoneVerify the installation:
puppyone --versionSign in
puppyone auth login -e [email protected] -p passwordAfter you sign in successfully, the CLI stores your credentials automatically, so you do not need to authenticate again for later commands.
Set your organization and project
puppyone org use "My Organization"
puppyone project use "My Project"Once set, all later operations will target the current project by default.
Browse and create content
Content operations are performed via the REST API at /api/v1/content/{project_id}/.... Set up your variables first:
BASE_URL="https://api.puppyone.ai/api/v1/content/YOUR_PROJECT_ID"
TOKEN="YOUR_ACCESS_TOKEN"List files
curl "$BASE_URL/ls" -H "Authorization: Bearer $TOKEN"View the directory tree
curl "$BASE_URL/tree" -H "Authorization: Bearer $TOKEN"Create directories
curl -X POST "$BASE_URL/mkdir" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"path": "docs"}'
curl -X POST "$BASE_URL/mkdir" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"path": "products"}'Write content
# Write a Markdown file
curl -X POST "$BASE_URL/write" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"path": "docs/readme.md",
"content": "# Hello World",
"node_type": "markdown",
"message": "Add readme"
}'
# Write a JSON file
curl -X POST "$BASE_URL/write" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"path": "products/catalog.json",
"content": [{"name": "Widget", "price": 99}],
"node_type": "json",
"message": "Add catalog"
}'You can also create and edit content through the Dashboard web UI.
Connect a data source
Sync data from external platforms into your content tree.
# Connect a Notion database to a target folder
puppyone access add notion https://notion.so/your-database-id --folder /docsPuppyOne supports 15+ platforms including Notion, GitHub, Gmail, Google Drive, Linear, and Airtable.
Create an MCP endpoint
Create an entry point for MCP clients such as Cursor and Claude Desktop.
puppyone access add mcp "My API"After creation, PuppyOne returns an MCP Server URL and API key that you can add to your client.
Sync a local folder
Sync a local folder to the cloud using the MUT protocol with version control.
# Already have a folder you want to sync? One shot:
puppyone access add filesystem docs --link ~/my-docs
# Or create the AP first, then choose: clone fresh or connect existing
puppyone access add filesystem docs
# Output shows two paths — pick whichever fits:
mut clone <url> --credential <key> # A) new folder
cd ~/my-docs && mut connect <url> --credential <key> # B) existing folder
# Then edit, commit, push
cd ~/my-docs
echo "# Hello" > readme.md
mut commit -m "init"
mut pushInstall the MUT CLI
The simple way:
pip install mutaiUbuntu 24.04 / Debian 12+ — "pip not found" or "externally-managed-environment"
Recent Ubuntu/Debian releases ship without pip and forbid global installs through the system Python (PEP 668). Pick one of these:
# Recommended: install CLI tools with pipx into an isolated environment
sudo apt update && sudo apt install -y pipx
pipx ensurepath
pipx install mut
# Alternative: install pip and use a venv
sudo apt install -y python3-pip python3-venv
python3 -m venv ~/.venvs/mut
source ~/.venvs/mut/bin/activate
pip install mutai
# Not recommended: bypass PEP 668 (pollutes system Python)
pip install --break-system-packages mutVerify with
mut --version. Ifwhich mutreturns nothing, add~/.local/binto PATH:export PATH="$HOME/.local/bin:$PATH".
Large files / slow networks: bump MUT_TIMEOUT
mut push uses a 60-second socket timeout by default. Large commits (multi-MB PDFs/videos) or a slow link will hit the wall and report "cannot reach server". Raise the limit:
# One-shot push (5 minutes)
MUT_TIMEOUT=300 mut push
# Or persist for the current shell
export MUT_TIMEOUT=300Server-side limits: 200 MB per push, 50 MB per file. Exceeding either returns 413 with a hint on how to split the commit.
Check project status
# Project overview
puppyone status
# List all access points (sync, MCP, agent, local folder, and more)
puppyone access lsFull example
Here is a complete flow from scratch:
# Install and sign in
npm install -g puppyone
puppyone auth login -e [email protected] -p password
# Select your project
puppyone org use "My Organization"
puppyone project use "My Project"
# Create content via REST API (or use the Dashboard)
BASE_URL="https://api.puppyone.ai/api/v1/content/YOUR_PROJECT_ID"
TOKEN="YOUR_ACCESS_TOKEN"
curl -X POST "$BASE_URL/mkdir" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"path": "docs"}'
curl -X POST "$BASE_URL/write" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"path": "docs/readme.md",
"content": "# Product Knowledge Base",
"node_type": "markdown",
"message": "Initial readme"
}'
# Connect Notion data
puppyone access add notion https://notion.so/db-id --folder /docs/notion
# Create an MCP endpoint for an agent
puppyone access add mcp "Production API"
# Sync a local folder (one-shot — links an existing folder)
puppyone access add filesystem workspace --link ~/workspace
# Or, if you don't have it locally yet, run `mut clone` from the printed output
# Check the results
puppyone access ls
puppyone statusNext steps
- Core Concepts - Learn the key ideas behind the content tree and access points
- Connect more data sources - Bring in more platforms
- Distribute to Agents - Use MCP, OpenClaw, and the REST API
- CLI Reference - See all commands and flags