Pulls calls, emails, notes, meetings, and tasks from HubSpot for any contact, deal, company, or ticket. The pre-call brief pattern is the standout: pipe together contact details, associated company, open deals, and recent activity into a single view before hopping on a call. Activities come back as flat JSON rows with timestamp, type, title, and body, newest first. You can filter by activity type, grab the last N items, or do client-side date filtering since the ISO timestamps sort lexicographically. It also fetches call transcripts by engagement ID or dumps them in bulk, though you're capped at 100 records per list with no cursor pagination for longer histories.
npx -y skills add hubspot/agent-cli-skills --skill communication-history --agent claude-codeInstalls into .claude/skills of the current project.
Read bulk-operations/SKILL.md first — JSONL piping, batch read, and jq reshape patterns (resources/json-patterns.md) apply. hubspot activities list --help is the source of truth.
activities list returns one flat row per activity, sorted newest-first: {id, type, timestamp, title, body, status, owner_id}. timestamp is ISO 8601; type is CALL|EMAIL|NOTE|MEETING|TASK. Different from the raw hs_call_* / hs_timestamp (Unix ms) on the underlying objects — fetch those with hubspot objects get --type calls if needed.
Pass exactly one of --contact, --deal, --company, --ticket. Use --type CALL|EMAIL|NOTE|MEETING|TASK to filter, --limit N for the most recent N:
hubspot activities list --contact 73235
hubspot activities list --deal 67890 --type CALL
hubspot activities list --contact 73235 --limit 10
ISO 8601 strings compare lexicographically.
CUTOFF=$(date -v-30d +%Y-%m-%dT%H:%M:%SZ) # macOS
# CUTOFF=$(date -u -d '30 days ago' +%Y-%m-%dT%H:%M:%SZ) # Linux
hubspot activities list --contact 73235 \
| jq -c --arg cutoff "$CUTOFF" 'select(.timestamp > $cutoff)'
hubspot activities list --contact 73235 --limit 20 \
| jq -r '"\(.timestamp[0:10]) \(.type) \(.title)"'
Four piped commands: contact + company + open deals + activity. Use batch objects get over stdin — never xargs -I{} (see bulk-operations/SKILL.md).
cid=73235
echo "=== Contact ==="
hubspot objects get --type contacts $cid \
--properties email,firstname,lastname,phone,jobtitle,lifecyclestage --format table
echo "=== Company ==="
hubspot associations list --from contacts:$cid --to companies \
| jq -c '{id}' \
| hubspot objects get --type companies --properties name,domain,industry,annualrevenue --format table
echo "=== Open Deals ==="
hubspot associations list --from contacts:$cid --to deals \
| jq -c '{id}' \
| hubspot objects get --type deals --properties dealname,amount,dealstage,closedate,hs_is_closed \
| jq -c 'select(.properties.hs_is_closed != "true")'
echo "=== Recent Activity ==="
hubspot activities list --contact $cid --limit 10 \
| jq -r '"\(.timestamp[0:10]) \(.type) \(.title)"'
Fetch the transcript for a single call by engagement ID:
hubspot activities calls transcript get --call 54321
Dump all call transcripts to a file:
hubspot objects list --type calls --limit 100 --properties hs_call_title \
| jq -r '.id' \
| while read -r call_id; do
hubspot activities calls transcript get --call "$call_id"
done > /tmp/transcripts.jsonl
Output shape: {"transcriptId":"...","engagementId":...,"transcriptSource":"...","utterances":[...],"createdAt":...}. The utterances array contains the speech content; it will be empty if no transcript was recorded or uploaded.
--limit max 100 and no --after cursor — long histories can't be paged. body can be long; use the compact timeline for skimming.sickn33/antigravity-awesome-skills
moizibnyousaf/ai-agent-skills
github/awesome-copilot