zulip
Fetch messages from FUTO Zulip channels. Use when the user asks about Zulip messages, feedback, bug reports, or wants to check what's been discussed on Zulip.
Files1
View on GitHubSKILL.md.claude/skills/zulip/SKILL.md
GitHubFetch messages from the FUTO self-hosted Zulip instance and present them to the user.
Configuration
- Zulip URL: https://zulip.futo.org
- Email: justin@futo.org
- API Key: sourced from
$ZULIP_API_KEYenvironment variable (runsource ~/.zshrcfirst)
Instructions
- Source the API key:
source ~/.zshrc - Fetch messages from the requested channel (default:
notes-appif no argument given) - Use the channel name from
$ARGUMENTSif provided, otherwise default tonotes-app
Fetch command:
source ~/.zshrc && curl -sSX GET -G "https://zulip.futo.org/api/v1/messages" \
-u "justin@futo.org:$ZULIP_API_KEY" \
--data-urlencode 'anchor=oldest' \
--data-urlencode 'num_before=0' \
--data-urlencode 'num_after=5000' \
--data-urlencode 'narrow=[{"operator": "channel", "operand": "CHANNEL_NAME"}]'
Replace CHANNEL_NAME with the target channel.
- Parse the JSON response and present messages grouped by topic, in chronological order
- For each message show: topic, sender name, timestamp, and content (strip HTML tags for readability)
- Summarize the key themes/issues at the end
If the response has found_newest: false, paginate by using the last message ID as the next anchor with num_before=0, num_after=5000 until all messages are fetched.
Zulip API Reference
- Auth: HTTP Basic Auth with
email:api_key - Endpoint:
GET /api/v1/messages - Narrow syntax:
[{"operator": "channel", "operand": "channel-name"}] - Anchor values:
oldest,newest, or a message ID - Max per request: 5000 messages