#!/usr/bin/env python3
"""Cliente MCP ClickUp via streamable HTTP (token OAuth do profile).

Uso:
  python3 mcp_clickup.py tools-list
  python3 mcp_clickup.py tools-call <tool_name> '<json_args>'
  python3 mcp_clickup.py get-list <list_id>
  python3 mcp_clickup.py get-task <task_id>
"""
import json, sys, urllib.request, urllib.error, os

TOKEN_FILE = '/opt/data/profiles/diretor_de_projetos/mcp-tokens/clickup.json'
URL = 'https://mcp.clickup.com/mcp'

def get_token():
    with open(TOKEN_FILE) as f:
        return json.load(f)['access_token']

def rpc(tok, method, params=None, _id=1):
    payload = {"jsonrpc": "2.0", "id": _id, "method": method}
    if params is not None:
        payload["params"] = params
    body = json.dumps(payload).encode()
    req = urllib.request.Request(URL, data=body, headers={
        'Authorization': 'Bearer ' + tok,
        'Content-Type': 'application/json',
        'Accept': 'application/json, text/event-stream',
    })
    try:
        with urllib.request.urlopen(req, timeout=90) as r:
            data = r.read().decode()
    except urllib.error.HTTPError as e:
        return {'_http_error': e.code, '_body': e.read().decode()[:1000]}
    out = None
    for line in data.splitlines():
        if line.startswith('data:'):
            try:
                out = json.loads(line[5:].strip())
            except Exception:
                pass
    return out

def main():
    cmd = sys.argv[1]
    tok = get_token()
    rpc(tok, 'notifications/initialized')
    if cmd == 'tools-list':
        res = rpc(tok, 'tools/list')
        tools = (res or {}).get('result', {}).get('tools', [])
        for t in tools:
            print(f"{t['name']} :: {t.get('description','')[:120]}")
            print('   schema:', json.dumps(t.get('inputSchema', {}), ensure_ascii=False)[:400])
        print('TOTAL:', len(tools))
    elif cmd == 'tools-call':
        name, args = sys.argv[2], json.loads(sys.argv[3])
        res = rpc(tok, 'tools/call', {"name": name, "arguments": args})
        print(json.dumps(res, ensure_ascii=False, indent=1)[:4000])
    elif cmd == 'get-list':
        lid = sys.argv[2]
        res = rpc(tok, 'tools/call', {"name": "clickup_get_list", "arguments": {"list_id": lid}})
        print(json.dumps(res, ensure_ascii=False, indent=1)[:6000])
    elif cmd == 'get-task':
        tid = sys.argv[2]
        res = rpc(tok, 'tools/call', {"name": "clickup_get_task", "arguments": {"task_id": tid}})
        print(json.dumps(res, ensure_ascii=False, indent=1)[:6000])
    elif cmd == 'filter-tasks':
        lid = sys.argv[2]
        res = rpc(tok, 'tools/call', {"name": "clickup_filter_tasks", "arguments": {"list_ids": [lid]}})
        print(json.dumps(res, ensure_ascii=False, indent=1)[:8000])
    else:
        print('cmd desconhecido')

if __name__ == '__main__':
    main()
