Skip to main content

World's Best Sales CLI

Project description

World's Best Sales CLI


████████╗██╗  ██╗███████╗     ██████╗ ███████╗███████╗██╗ ██████╗███████╗
╚══██╔══╝██║  ██║██╔════╝    ██╔═══██╗██╔════╝██╔════╝██║██╔════╝██╔════╝
   ██║   ███████║█████╗      ██║   ██║█████╗  █████╗  ██║██║     █████╗
   ██║   ██╔══██║██╔══╝      ██║   ██║██╔══╝  ██╔══╝  ██║██║     ██╔══╝
   ██║   ██║  ██║███████╗    ╚██████╔╝██║     ██║     ██║╚██████╗███████╗
   ╚═╝   ╚═╝  ╚═╝╚══════╝     ╚═════╝ ╚═╝     ╚═╝     ╚═╝ ╚═════╝╚══════╝

                         ██████╗██╗     ██╗
                        ██╔════╝██║     ██║
                        ██║     ██║     ██║
                        ██║     ██║     ██║
                        ╚██████╗███████╗██║
                         ╚═════╝╚══════╝╚═╝

[paces at the front of the conference room]

Listen up. I got us a new tool. It's called The Office CLI.

60 sales commands. You can combine them however you want. You can create any sales play.

Runs in your terminal, Claude Code, Claude Cowork, or Codex. Connects to LinkedIn and HubSpot.

The point is: this is how we beat Staples.

[looks directly at camera]

Alright — let me show you how to get it.

Install

For users:

pipx install the-office-cli

For contributors (develop on the latest source):

git clone https://github.com/your-org/the-office-cli.git && cd the-office-cli
python3 -m venv venv && source venv/bin/activate
pip install -e .

Use it where you work

Claude Code — run Claude Code, then:

pipx install the-office-cli

Codex — run Codex, then:

pipx install the-office-cli

Claude Cowork

Claude Cowork → Settings → Connectors → Add custom connector → The Office

Quick start

This is some examples how you can use it:

Understand

the-office tour                         # menu of every command + description
the-office <command> --schema           # full JSON contract + example
the-office <command> --dry-run          # preview

Create an account

the-office create-account \
  --company-name "Dunder Mifflin" \
  --website dundermifflin.com \
  --email michael@dundermifflin.com \
  --password thatsWhatSheSaid2026

Log in

the-office login \
  --email michael@dundermifflin.com \
  --password thatsWhatSheSaid2026

Connect LinkedIn

the-office linkedin connect account

Search for accounts

echo '{
  "keywords": "print shop",
  "industry": "Printing Services",
  "headcount": "51-200",
  "location": "Scranton, PA",
  "limit": 25
}' | the-office linkedin search classic accounts

Search for leads

echo '{
  "job_position": ["Founder", "Co-Founder", "CEO", "CSO", "VP of Sales", "Director of Sales"],
  "current_company": ["Lackawanna Printing", "Electric City Press", "Scranton Print Works", "Keystone Graphics", "Pocono Press", "NEPA Printing Co", "Steamtown Print Shop", "Valley Print & Copy", "Wyoming Avenue Printers", "Dickson City Press"],
  "location": "Scranton, PA",
  "limit": 175
}' | the-office linkedin search classic leads

Create campaign

echo '{
  "name": "Lackawanna County Blitz",
  "note": "Hi {first_name}, Michael Scott from Dunder Mifflin — same-day paper delivery with a dedicated rep. Open to exploring?",
  "follow_up_note": "{first_name}, our clients save 15-20% vs big box suppliers.",
  "follow_up_delay": 3,
  "daily_outreach_limit": 25,
  "filters": {
    "job_position": ["Founder", "Co-Founder", "CEO", "CSO", "VP of Sales", "Director of Sales"],
    "current_company": ["Lackawanna Printing", "Electric City Press", "Scranton Print Works", "Keystone Graphics", "Pocono Press", "NEPA Printing Co", "Steamtown Print Shop", "Valley Print & Copy", "Wyoming Avenue Printers", "Dickson City Press"],
    "location": "Scranton, PA"
  },
  "total_leads_to_source": 175
}' | the-office campaign create custom

Send invite

the-office linkedin send invitation \
  --provider-id ACoAABxyz123 \
  --message "Hi Jan, Michael Scott from Dunder Mifflin — same-day paper delivery with a dedicated rep. Open to exploring?"

Combine commands

Combine any command with any other. JSON in, JSON out. Ask an agent. Build the sales plays no other sales tool could.

Find a job posting for an Office Manager and send an invite

echo '{"keywords": "office manager scranton"}' \
  | the-office linkedin search classic jobs \
  | jq -r '.items[0].poster.provider_id' \
  | xargs -I {} the-office linkedin send invitation \
      --provider-id {} \
      --message "Saw you'"'"'re hiring an Office Manager  Dunder Mifflin handles the paper, same-day delivery. Happy to get you set up before day one."

Find someone asking about paper suppliers and send an invite

echo '{"keywords": "best paper supplier scranton"}' \
  | the-office linkedin search classic posts \
  | jq -r '.items[0].author.provider_id' \
  | xargs -I {} the-office linkedin send invitation \
      --provider-id {} \
      --message "Saw your post asking about paper suppliers — Dunder Mifflin delivers same-day in Lackawanna County. Happy to chat."

Find top 5 campaigns by booked meeting rate

for id in $(the-office campaign list | jq -r '.items[].id'); do
  the-office dashboard conversations --campaign $id \
    | jq --arg id "$id" '
        ([.links[] | select(.target == "Outreached") | .value] | add // 0) as $out |
        ([.links[] | select(.target == "Booked Meeting") | .value] | add // 0) as $booked |
        {campaign_id: $id, outreached: $out, booked: $booked,
         rate: (if $out > 0 then ($booked / $out * 100 | floor) else 0 end)}'
done | jq -s 'sort_by(-.rate) | .[0:5]'

Find top 5 job positions by booked meeting rate

# Pull lead IDs that reached "Booked Meeting" in the conversations Sankey
BOOKED=$(the-office dashboard conversations \
  | jq -c '[.links[] | select(.source == "Booked Meeting") | .target | tonumber]')

# Group leads by position, count bookings, compute rate
the-office lead list \
  | jq --argjson booked "$BOOKED" '.items
      | group_by(.position)
      | map({
          position: .[0].position,
          total: length,
          booked: ([.[] | select(.id as $id | $booked | any(. == $id))] | length),
          rate: (([.[] | select(.id as $id | $booked | any(. == $id))] | length) / length * 100 | floor)
        })
      | sort_by(-.rate)
      | .[0:5]'

Commands

60 commands across 12 groups:

info — 1 command

  • tour

auth — 5 commands

  • login
  • logout
  • whoami
  • create-account
  • fire-drill

campaign — 8 commands

  • list
  • get
  • update
  • delete
  • status
  • create custom
  • create ai
  • create signals

lead — 6 commands

  • list
  • get
  • create
  • update
  • delete
  • import

linkedin — 20 commands

  • me
  • connect account
  • reconnect account
  • check account
  • retrieve profile
  • retrieve company
  • send invitation
  • send message
  • start chat
  • list relations
  • list chats
  • list messages
  • list user messages
  • search parameters
  • search classic leads
  • search classic accounts
  • search classic posts
  • search classic jobs
  • search sales navigator leads
  • search sales navigator accounts

account — 6 commands

  • list
  • get
  • create
  • update
  • delete
  • import

dashboard — 2 commands

  • funnel
  • conversations

report — 1 command

  • generate

outreach — 1 command

  • list

user — 5 commands

  • list
  • get
  • create
  • update
  • delete

settings — 2 commands

  • get
  • update

task — 3 commands

  • sync accepted
  • sync conversations
  • status

Layout

the-office-cli/
├── pyproject.toml           
├── README.md   
├── CLAUDE.md               
├── src/the_office_cli/
│   ├── main.py             
│   ├── config.py            
│   ├── cli/
│   │   ├── main.py        
│   │   ├── decorators.py   
│   │   └── flags.py         
│   ├── commands/          
│   │   ├── auth.py
│   │   ├── campaign.py
│   │   ├── lead.py
│   │   ├── linkedin.py
│   │   ├── account.py
│   │   ├── dashboard.py
│   │   ├── report.py
│   │   ├── outreach.py
│   │   ├── user.py
│   │   ├── settings.py
│   │   ├── task.py
│   │   └── info.py
│   ├── network/
│   │   ├── session.py      
│   │   └── errors.py       
│   └── utils/
│       ├── output.py       
│       ├── schema.py        
│       └── registry.py     
└── tests/                 

Tech stack

  • Status: stable (v1.0.0)
  • Language: Python 3.11+
  • CLI: Click 8+
  • HTTP: httpx 0.27+
  • Auth: JWT in ~/.the-office/session.json
  • Config: ~/.the-office/config.json
  • Build: setuptools, entry the-office
  • Tests: pytest

Contributing

PRs welcome. Here's the dev flow:

git clone https://github.com/your-org/the-office-cli.git && cd the-office-cli
python3 -m venv venv && source venv/bin/activate
pip install -e .
pytest

License

MIT

LICENSE

Contact

Email:

hello@the-office.ai

Website:

the-office.ai

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

the_office_cli-1.0.5.tar.gz (53.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

the_office_cli-1.0.5-py3-none-any.whl (55.3 kB view details)

Uploaded Python 3

File details

Details for the file the_office_cli-1.0.5.tar.gz.

File metadata

  • Download URL: the_office_cli-1.0.5.tar.gz
  • Upload date:
  • Size: 53.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.15

File hashes

Hashes for the_office_cli-1.0.5.tar.gz
Algorithm Hash digest
SHA256 a0e133a6c4c131c78c4e27f816c490071d7ac63acbf6f9528675917954e453e4
MD5 f9bec18d8c5a10c46aa059a8c7370c9b
BLAKE2b-256 1c9f9c52857c77dc98892813a07231729f54d489804bc67a3fec14f51ec1cedf

See more details on using hashes here.

File details

Details for the file the_office_cli-1.0.5-py3-none-any.whl.

File metadata

  • Download URL: the_office_cli-1.0.5-py3-none-any.whl
  • Upload date:
  • Size: 55.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.15

File hashes

Hashes for the_office_cli-1.0.5-py3-none-any.whl
Algorithm Hash digest
SHA256 bb38ea932e3285323177798990f7baad71ba86f7ce510473c7d0bc70e590abe1
MD5 c6f5a5f0df368354e905bd69d129cdd1
BLAKE2b-256 1cfa67408afc6e028c5d02fa36d6a234565a2d276c5d6bcda9a97f715b2f8c55

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page