Skip to content

CLI Capability Map

ChatZulip provides the Zulip integration CLI extracted from ChatTool. The CLI is a thin adapter over chatzulip.operations and chatzulip.client.

Registered command tree

Run chatzulip --tree for the real Click command surface with parameter signatures. chatzulip --tree-brief keeps the same nodes and descriptions without signatures. ChatStyle renders both directly from the CLI registry; ChatZulip does not maintain a local tree renderer.

chatzulip
├── --help  # Show this message and exit.
├── --version  # Show the version and exit.
├── --tree  # Print the registered CLI tree and exit.
├── --tree-brief  # Print the registered CLI tree without parameter signatures and exit.
├── messages [--anchor ANCHOR] [--before NUM-BEFORE] [--after NUM-AFTER] [--stream STREAM] [--topic TOPIC] [--sender SENDER] [--search SEARCH] [--json-output]  # Fetch messages with optional Zulip narrow filters.
├── news [--stream STREAMS] [--topic TOPICS] [--since-hours SINCE-HOURS] [--per-stream PER-STREAM] [--limit LIMIT] [--output OUTPUT] [--model MODEL] [--max-tokens MAX-TOKENS] [--temperature TEMPERATURE]  # Render recent Zulip updates to Markdown.
├── profile [--json-output]  # Show the authenticated bot/user profile.
├── search <QUERY> [--stream STREAMS] [--all-streams] [--since-hours SINCE-HOURS] [--per-stream PER-STREAM] [--limit LIMIT] [--json-output]  # Search message content using stream-scoped Zulip narrows.
├── search-topics <QUERY> [--stream STREAMS] [--all-streams] [--limit LIMIT] [--json-output]  # Search topic names across explicitly selected public streams.
├── streams [--all] [--json-output]  # List streams, subscribed by default.
├── topic [--stream STREAM] [--topic TOPIC-NAME] [--batch-size BATCH-SIZE] [--max-requests MAX-REQUESTS] [--output OUTPUT] [--json-output] [--interactive]  # Export a full stream/topic thread.
└── topics [--stream STREAM] [--json-output] [--interactive]  # List topics for a stream.

Brief output:

chatzulip
├── --help  # Show this message and exit.
├── --version  # Show the version and exit.
├── --tree  # Print the registered CLI tree and exit.
├── --tree-brief  # Print the registered CLI tree without parameter signatures and exit.
├── messages  # Fetch messages with optional Zulip narrow filters.
├── news  # Render recent Zulip updates to Markdown.
├── profile  # Show the authenticated bot/user profile.
├── search  # Search message content using stream-scoped Zulip narrows.
├── search-topics  # Search topic names across explicitly selected public streams.
├── streams  # List streams, subscribed by default.
├── topic  # Export a full stream/topic thread.
└── topics  # List topics for a stream.

search-topics and search require at least one repeatable --stream, or the explicit --all-streams switch. The latter may issue one API request per accessible public stream, so it is never an implicit default. Search results include canonical Zulip permalinks.

Configuration

ChatZulip registers a typed ChatEnv zulip provider with these service-oriented fields:

ZULIP_SITE
ZULIP_BOT_EMAIL
ZULIP_BOT_API_KEY
ZULIP_NEWS_STREAMS
ZULIP_NEWS_TOPICS
ZULIP_NEWS_SINCE_HOURS
ZULIP_NEWS_PER_STREAM

ZULIP_BOT_API_KEY is sensitive and must never be printed. Profiles are stored under $CHATARCH_HOME/envs/Zulip/.

Python API mapping

CLI Python API
streams chatzulip.operations.list_streams()
topics chatzulip.operations.list_topics()
search-topics chatzulip.operations.search_topics()
search chatzulip.operations.search_messages()
topic chatzulip.operations.get_topic_messages() + render_topic_markdown()
messages chatzulip.operations.get_messages()
profile chatzulip.client.ZulipClient.get_profile()
news chatzulip.operations.summarize_news()

chatzulip news uses the optional ChatTool LLM summarizer when available and falls back to a rule-based Markdown digest otherwise.

Write boundary

The default CLI remains read-oriented. Write operations are importable Python and MCP capabilities:

  • chatzulip.operations.send_message()
  • chatzulip.operations.react()
  • chatzulip.operations.upload_file()
  • chatzulip.mcp.register()

Adding write commands to the CLI requires a separate design for confirmation, dry-run behavior, permissions, and real Zulip smoke tests.