Comulytic

v1.0.3

Query Comulytic meetings, contacts, action items, and conversation history. Use when: user asks about meetings, notes, call summaries, contacts, pending task...

0· 183·0 current·0 all-time

Install

OpenClaw Prompt Flow

Install with OpenClaw

Best for remote or guided setup. Copy the exact prompt, then paste it into OpenClaw for chenbaochao/comulytic.

Previewing Install & Setup.
Prompt PreviewInstall & Setup
Install the skill "Comulytic" (chenbaochao/comulytic) from ClawHub.
Skill page: https://clawhub.ai/chenbaochao/comulytic
Keep the work scoped to this skill only.
After install, inspect the skill metadata and help me finish setup.
Required binaries: curl, jq, python3
Use only the metadata you can verify from ClawHub; do not invent missing requirements.
Ask before making any broader environment changes.

Command Line

CLI Commands

Use the direct CLI path if you want to install manually and keep every step visible.

OpenClaw CLI

Bare skill slug

openclaw skills install comulytic

ClawHub CLI

Package manager switcher

npx clawhub@latest install comulytic
Security Scan
VirusTotalVirusTotal
Benign
View report →
OpenClawOpenClaw
Benign
high confidence
Purpose & Capability
Name/description (querying meetings, contacts, transcripts) match the included code and runtime instructions. Required binaries (curl, jq, python3) are used by the curl/jq command examples and the provided Python login script.
Instruction Scope
Runtime instructions are limited to: reading a COMULYTIC_MCP_TOKEN from an environment variable or $HOME/.comulytic/mcp-token.json, prompting the user to run the provided login script if missing, and making JSON-RPC POSTs to https://api.comulytic.ai/mcp. The instructions do not attempt to read unrelated files or exfiltrate data to unexpected endpoints.
Install Mechanism
No external download URLs or risky installers are used. The registry lists only a brew formula for jq; SKILL.md also mentions apt packages for curl/python3/jq. This mismatch is benign but worth noting: install metadata only guarantees installing jq via brew, while the instructions assume curl and python3 are present (they usually are on most systems).
Credentials
The skill requests no global secrets; it optionally uses COMULYTIC_MCP_TOKEN and otherwise stores an OAuth token at ~/.comulytic/mcp-token.json (saved with 0o600 permissions). The login flow asks for email/password interactively to obtain an access token — this is consistent with the stated need to access user Comulytic data.
Persistence & Privilege
always is false and the skill does not attempt to modify other skills or system-wide settings. It writes a token file to ~/.comulytic/, which is expected and scoped to the user's home directory.
Assessment
This skill appears to do what it says: it will prompt you for your Comulytic email/password once (via the included script) to obtain an OAuth token and then use that token (from an env var or ~/.comulytic/mcp-token.json) to call api.comulytic.ai. Before installing, verify you trust Comulytic and are comfortable entering credentials into the provided login script; the token is stored locally with restrictive permissions (600). Note the registry only auto-installs jq via brew — the instructions also expect curl and python3 to exist (common on most systems). If you ever want to revoke access, use the Comulytic account settings or remove ~/.comulytic/mcp-token.json. If you want extra assurance, review the provided Python script yourself before running it.

Like a lobster shell, security has layers — review code before you run it.

Runtime requirements

🎙️ Clawdis
Binscurl, jq, python3

Install

Install jq (brew)
Bins: jq
brew install jq
latestvk97ctdb129y5dkv3etk23sw2ex83407t
183downloads
0stars
4versions
Updated 1mo ago
v1.0.3
MIT-0

Comulytic Skill

Query meetings, contacts, action items, and conversations from Comulytic.

When to Use

USE this skill when:

  • "Show my recent meetings"
  • "What did we discuss with [person]?"
  • "Any overdue action items?"
  • "Search conversations about [topic]"
  • "Get the transcript for [meeting]"
  • "What's [contact]'s profile?"

When NOT to Use

DON'T use this skill when:

  • Scheduling new meetings → use calendar
  • Sending messages → use messaging tools
  • Editing contacts → use Comulytic app

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

  • If token read fails → tell user to run ~/.openclaw/skills/comulytic/scripts/comulytic-login.py
  • If API returns 401 → token expired, run login again
  • Empty results are normal (user has no matching data)
  • Never guess meeting_id or contact_id — always get from search results

Comments

Loading comments...