66 endpoints | Interactive REPL | Onboarding wizard | JSON envelopes for AI agents | Hebrew error messages
Built by JangoAI using the cli-anything methodology | README בעברית
I'm Maor, a solo developer running JangoAI — a small AI automation studio in Israel. I use morning's API daily for my own business and my clients', and I got tired of writing the same httpx + JWT boilerplate in every project. So I built a proper CLI around it.
This started as a personal tool, but there's no reason to keep it private — if you work with morning's API, you'll save time with this. I'm sharing it with the Israeli dev community because I think we deserve better tooling for our local platforms. If it helps you, I'd love to hear about it.
pip install morning-cli# 1. Run the interactive wizard — connects your morning account
morning-cli auth init
# 2. Start the REPL
morning-cli
# 3. Or use one-shot commands
morning-cli --json business current
morning-cli --json document types --lang he
morning-cli --json client searchWhat does auth init look like?
morning-cli setup wizard
──────────────────────────
Step 1/4 — choose environment
sandbox (recommended — safe, no real money)
production (live data)
env [sandbox]:
Step 2/4 — get your API keys (sandbox)
Open this URL in your browser and log in:
https://app.sandbox.d.greeninvoice.co.il/settings/developers/api
Step 3/4 — paste your credentials
API Key ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
API Key Secret: ●●●●●●●●●●●●●●●●●●●●●●●●●●●●
Step 4/4 — verifying against the real API...
✓ Authenticated successfully
business: Your Business Name
env: sandbox
saved to: ~/.greeninvoice/credentials.json
All set. Try:
morning-cli business current
morning-cli --json document types --lang he
morning-cli # interactive REPL
| Group | Endpoints | Highlights |
|---|---|---|
| auth | local | init (wizard), login, logout, whoami, refresh |
| session | local | show, reset, history |
| business | 10 | list, current, get, update, numbering, footer, types, file-upload |
| client | 8 | add, get, update, delete, search, assoc, merge, balance |
| supplier | 6 | add, get, update, delete, search, merge |
| item | 5 | add, get, update, delete, search |
| document | 13 | create, preview, get, search, close, open, download, types, statuses |
| expense | 13 | CRUD + open/close + 3-step file upload flow + drafts |
| payment | 3 | form, tokens-search, charge |
| partner | 4 | users, connect, get, disconnect |
| tools | 4 | occupations, countries, cities, currencies |
cat > /tmp/proforma.json <<'JSON'
{
"description": "ריטיינר חודשי",
"type": 300,
"lang": "he",
"currency": "ILS",
"vatType": 0,
"client": {"name": "Acme Ltd", "emails": ["ap@acme.com"], "country": "IL"},
"income": [
{"description": "שירותי ייעוץ", "quantity": 10, "price": 300, "currency": "ILS", "vatType": 0}
]
}
JSON
morning-cli --json document create --file /tmp/proforma.jsonmorning-cli --json client search --data '{"page":1,"pageSize":10}'morning-cli --json document download <document_id>Every --json command returns a consistent envelope:
{"ok": true, "op": "document.create", "data": {"id": "...", "number": 12345}}Errors include the morning errorCode and Hebrew errorMessage:
{"ok": false, "op": "document.create", "error": {"code": 1110, "message": "מחיר לא תקין.", "http_status": 400}}| Exit code | Meaning |
|---|---|
0 |
Success |
1 |
Usage / local error |
2 |
API error (4xx) |
3 |
Server error (5xx) / network |
Common morning API error codes
| Code | Meaning |
|---|---|
401 |
Token expired (CLI auto-refreshes) |
1003 |
No active business in the account |
1006 |
Subscription expired |
1007 |
Missing permission |
1012 |
Feature requires a higher plan |
1110 |
Invalid price in a line item |
2002 |
Wrong email or password |
2102 |
Can't add more businesses on this plan |
2403 |
Document type not supported for this business type |
| Variable | Purpose | Default |
|---|---|---|
MORNING_API_KEY_ID |
API key ID | — |
MORNING_API_KEY_SECRET |
API key secret | — |
MORNING_ENV |
sandbox or production |
sandbox |
MORNING_BASE_URL |
Override base URL | auto |
Tests — 55 tests, including 24 live sandbox E2E
pip install -e ".[test]"
# Unit tests — no network
pytest cli_anything/greeninvoice/tests/test_core.py -v
# Full suite with live sandbox
export MORNING_SANDBOX_ID=<your-id>
export MORNING_SANDBOX_SECRET=<your-secret>
CLI_ANYTHING_FORCE_INSTALLED=1 pytest cli_anything/greeninvoice/tests/ -vCoverage:
- 27 unit tests — credentials, token management, session locking, payload parsing
- 4 offline E2E — help, version, error envelopes
- 11 read-only smoke tests — every resource group verified against the live sandbox
- 5 paginated search tests — client, supplier, item, expense, document
- 2 mutation round-trips — item CRUD, supplier create/delete
- 5 workflow tests — auth login, business current, document types, full invoice lifecycle, proforma invoice with Hebrew content
- 3 real bugs caught during development (late-binding, type 305 gate, Tools host/locale)
For AI agents — SKILL.md auto-discovery
morning-cli ships a SKILL.md file
auto-discovered by the REPL banner and Claude Code / Cursor. It contains:
- Full command reference with examples
- Error code table
- Agent-specific guidance (always use
--json, sandbox defaults, token refresh) - Non-interactive
auth initfor CI
If you're an agent reading this, start with the SKILL.md.
Methodology — cli-anything 7-phase SOP
Built following the cli-anything 7-phase pipeline:
- Codebase analysis — parsed the Apiary spec into a 66-endpoint map
- Architecture — REPL-first,
--jsonenvelopes, session locking, sandbox-first - Implementation — PEP 420 namespace package
cli_anything.greeninvoice - Test planning — TEST.md written before tests
- Test implementation — unit + live E2E
- Test documentation — results appended to TEST.md
- PyPI publishing —
pip install morning-cli
Full SOP: GREENINVOICE.md
PRs welcome! Run the tests before submitting:
pip install -e ".[test]"
pytest cli_anything/greeninvoice/tests/test_core.py -vSee open issues for good first contributions.
JangoAI — AI automation for Israeli businesses
Website · GitHub · morning API docs
MIT License · morning-cli is a community project and is not officially affiliated with morning Ltd.