#!/usr/bin/env python3
"""ANKLE OS stdio-to-Streamable-HTTP adapter. Python 3.10+, no packages needed.

Set ANKLE_AGENT_KEY in your MCP client's environment. This program never opens
local account databases, browser cookies, or environment files. It uses the
canonical HTTPS endpoint only. Download: https://aleqth.com/downloads/ankle-mcp.py
"""
import json
import os
import sys
import urllib.request
import urllib.error

ENDPOINT = 'https://aleqth.com/api/mcp'
MAX_BYTES = 12 * 1024 * 1024

class NoRedirect(urllib.request.HTTPRedirectHandler):
    def redirect_request(self,req,fp,code,msg,headers,newurl):return None


def main():
    key=os.environ.get('ANKLE_AGENT_KEY','')
    version='2025-11-25'
    opener=urllib.request.build_opener(urllib.request.ProxyHandler({}),NoRedirect())
    for line in sys.stdin:
        id=None
        try:
            message=json.loads(line);id=message.get('id')
            if not key or any(c.isspace() for c in key):raise ValueError('Set ANKLE_AGENT_KEY in the client environment.')
            raw=json.dumps(message).encode()
            if len(raw)>6*1024*1024:raise ValueError('Message exceeds 6 MiB.')
            request=urllib.request.Request(ENDPOINT,data=raw,headers={'Content-Type':'application/json','Accept':'application/json, text/event-stream','MCP-Protocol-Version':version,'Authorization':'Bearer '+key})
            with opener.open(request,timeout=180) as response:
                body=response.read(MAX_BYTES+1)
                if len(body)>MAX_BYTES:raise ValueError('Response too large; outcome unknown. Retry mutations with the same key.')
            if not body:continue
            result=json.loads(body)
            if message.get('method')=='initialize':version=result.get('result',{}).get('protocolVersion',version)
            print(json.dumps(result),flush=True)
        except Exception as exc:
            # Never include upstream bodies or request objects containing the key.
            reason=f'HTTP {exc.code}; check key permissions or revocation.' if isinstance(exc,urllib.error.HTTPError) else 'Connection failed or configuration invalid. A write may have committed; retry with the identical idempotency key.'
            if id is not None:print(json.dumps({'jsonrpc':'2.0','id':id,'error':{'code':-32000,'message':reason}}),flush=True)
            else:print(reason,file=sys.stderr,flush=True)

if __name__=='__main__':main()
