Comulytic
by @chenbaochao
Query Comulytic meetings, contacts, action items, and conversation history. Use when: user asks about meetings, notes, call summaries, contacts, pending task...
clawhub install comulyticπ About This Skill
name: comulytic description: "Query Comulytic meetings, contacts, action items, and conversation history. Use when: user asks about meetings, notes, call summaries, contacts, pending tasks, or wants to search conversation content. NOT for: scheduling new meetings, sending messages, or editing contacts." metadata: { "openclaw": { "emoji": "ποΈ", "requires": { "bins": ["curl", "jq", "python3"] }, "install": [ { "id": "brew-jq", "kind": "brew", "formula": "jq", "bins": ["jq"], "label": "Install jq (brew)", }, { "id": "apt-jq", "kind": "apt", "package": "jq", "bins": ["jq"], "label": "Install jq (apt)", }, { "id": "apt-curl", "kind": "apt", "package": "curl", "bins": ["curl"], "label": "Install curl (apt)", }, { "id": "apt-python3", "kind": "apt", "package": "python3", "bins": ["python3"], "label": "Install python3 (apt)", }, ], }, }
Comulytic Skill
Query meetings, contacts, action items, and conversations from Comulytic.
When to Use
β USE this skill when:
When NOT to Use
β DON'T use this skill when:
Setup (one-time)
~/.openclaw/skills/comulytic/scripts/comulytic-login.py
User enters email + password, script auto-completes OAuth and saves the token.
Auth Token
Read the token before making any call. Check env var first, then file:
COMULYTIC_MCP_TOKEN="${COMULYTIC_MCP_TOKEN:-$(python3 -c "import json; print(json.load(open('$HOME/.comulytic/mcp-token.json'))['access_token'])" 2>/dev/null)}"
If empty, tell the user to run the login command above, or set the COMULYTIC_MCP_TOKEN environment variable.
API Pattern
All calls use one endpoint with JSON-RPC 2.0. Always read the token first using the Auth Token pattern above:
COMULYTIC_MCP_TOKEN="${COMULYTIC_MCP_TOKEN:-$(python3 -c "import json; print(json.load(open('$HOME/.comulytic/mcp-token.json'))['access_token'])" 2>/dev/null)}"
curl -s -X POST https://api.comulytic.ai/mcp \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $COMULYTIC_MCP_TOKEN" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"TOOL","arguments":{ARGS}}}' \
| jq '.result.content[0].text' -r | jq '.'
Tools
meetings/search β Search meetings
COMULYTIC_MCP_TOKEN="${COMULYTIC_MCP_TOKEN:-$(python3 -c "import json; print(json.load(open('$HOME/.comulytic/mcp-token.json'))['access_token'])" 2>/dev/null)}"Recent meetings
curl -s -X POST https://api.comulytic.ai/mcp \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $COMULYTIC_MCP_TOKEN" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"meetings/search","arguments":{"limit":10}}}' \
| jq '.result.content[0].text' -r | jq '.'By keyword
curl -s -X POST https://api.comulytic.ai/mcp \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $COMULYTIC_MCP_TOKEN" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"meetings/search","arguments":{"query":"KEYWORD","limit":5}}}' \
| jq '.result.content[0].text' -r | jq '.'By date range
curl -s -X POST https://api.comulytic.ai/mcp \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $COMULYTIC_MCP_TOKEN" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"meetings/search","arguments":{"date_from":"2025-03-01","date_to":"2025-03-31"}}}' \
| jq '.result.content[0].text' -r | jq '.'
Args: query, date_from/date_to (YYYY-MM-DD), contact_id, limit (max 50), cursor.
meetings/detail β Meeting detail or transcript
COMULYTIC_MCP_TOKEN="${COMULYTIC_MCP_TOKEN:-$(python3 -c "import json; print(json.load(open('$HOME/.comulytic/mcp-token.json'))['access_token'])" 2>/dev/null)}"Summary
curl -s -X POST https://api.comulytic.ai/mcp \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $COMULYTIC_MCP_TOKEN" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"meetings/detail","arguments":{"meeting_id":"ID"}}}' \
| jq '.result.content[0].text' -r | jq '.'Full transcript
curl -s -X POST https://api.comulytic.ai/mcp \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $COMULYTIC_MCP_TOKEN" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"meetings/detail","arguments":{"meeting_id":"ID","detail_level":"full"}}}' \
| jq '.result.content[0].text' -r | jq '.'
Args: meeting_id (required), detail_level (summary|detailed|full).
contacts/profile β Contact info
COMULYTIC_MCP_TOKEN="${COMULYTIC_MCP_TOKEN:-$(python3 -c "import json; print(json.load(open('$HOME/.comulytic/mcp-token.json'))['access_token'])" 2>/dev/null)}"
curl -s -X POST https://api.comulytic.ai/mcp \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $COMULYTIC_MCP_TOKEN" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"contacts/profile","arguments":{"contact_id":"ID","include_insights":true}}}' \
| jq '.result.content[0].text' -r | jq '.'
Args: contact_id (required), include_insights (boolean).
contacts/history β Meeting history with a contact
COMULYTIC_MCP_TOKEN="${COMULYTIC_MCP_TOKEN:-$(python3 -c "import json; print(json.load(open('$HOME/.comulytic/mcp-token.json'))['access_token'])" 2>/dev/null)}"
curl -s -X POST https://api.comulytic.ai/mcp \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $COMULYTIC_MCP_TOKEN" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"contacts/history","arguments":{"contact_id":"ID","limit":10}}}' \
| jq '.result.content[0].text' -r | jq '.'
Args: contact_id (required), date_from, limit (max 30).
conversations/search β Full-text search
COMULYTIC_MCP_TOKEN="${COMULYTIC_MCP_TOKEN:-$(python3 -c "import json; print(json.load(open('$HOME/.comulytic/mcp-token.json'))['access_token'])" 2>/dev/null)}"
curl -s -X POST https://api.comulytic.ai/mcp \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $COMULYTIC_MCP_TOKEN" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"conversations/search","arguments":{"query":"KEYWORD","limit":10}}}' \
| jq '.result.content[0].text' -r | jq '.'
Args: query (required), date_from/date_to, contact_id, limit (max 20).
actions/pending β Pending action items
COMULYTIC_MCP_TOKEN="${COMULYTIC_MCP_TOKEN:-$(python3 -c "import json; print(json.load(open('$HOME/.comulytic/mcp-token.json'))['access_token'])" 2>/dev/null)}"All pending
curl -s -X POST https://api.comulytic.ai/mcp \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $COMULYTIC_MCP_TOKEN" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"actions/pending","arguments":{"status":"pending","limit":20}}}' \
| jq '.result.content[0].text' -r | jq '.'Overdue only
curl -s -X POST https://api.comulytic.ai/mcp \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $COMULYTIC_MCP_TOKEN" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"actions/pending","arguments":{"status":"overdue"}}}' \
| jq '.result.content[0].text' -r | jq '.'
Args: status (pending|overdue|all), contact_id, priority, limit (max 50).
Workflow
1. meetings/search β find meetings β get meeting_id
2. meetings/detail with meeting_id β get summary or transcript
3. contacts/history with contact_id β all meetings with that person
4. conversations/search β find what was said about a topic
Error Handling
~/.openclaw/skills/comulytic/scripts/comulytic-login.pymeeting_id or contact_id β always get from search results