Comulytic Skill
name: comulytic
by chenbaochao · published 2026-03-22
$ claw add gh:chenbaochao/chenbaochao-comulytic---
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.pyUser 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
More tools from the same signal band
Order food/drinks (点餐) on an Android device paired as an OpenClaw node. Uses in-app menu and cart; add goods, view cart, submit order (demo, no real payment).
Sign plugins, rotate agent credentials without losing identity, and publicly attest to plugin behavior with verifiable claims and authenticated transfers.
The philosophical layer for AI agents. Maps behavior to Spinoza's 48 affects, calculates persistence scores, and generates geometric self-reports. Give your...