40 lines
1.9 KiB
Python
40 lines
1.9 KiB
Python
#!/usr/bin/env python3
|
|
"""Minimal JSON-RPC client for the installed VCC Plus public STDIO MCP helper.
|
|
No grant contents, private sockets, memory mutation or emulator internals used.
|
|
"""
|
|
import json,subprocess,sys
|
|
from pathlib import Path
|
|
HELPER='/Applications/VCC Plus.app/Contents/Helpers/vcc-mcp'
|
|
class VCC:
|
|
def __init__(self,grant):
|
|
self.p=subprocess.Popen([HELPER,'--grant',str(grant)],stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE,text=True,bufsize=1)
|
|
self.i=0
|
|
self.request('initialize',{'protocolVersion':'2024-11-05','capabilities':{},'clientInfo':{'name':'capital-quiz-tests','version':'1.0'}})
|
|
self.p.stdin.write(json.dumps({'jsonrpc':'2.0','method':'notifications/initialized'})+'\n');self.p.stdin.flush()
|
|
def request(self,method,params):
|
|
self.i+=1
|
|
self.p.stdin.write(json.dumps({'jsonrpc':'2.0','id':self.i,'method':method,'params':params})+'\n');self.p.stdin.flush()
|
|
while True:
|
|
line=self.p.stdout.readline()
|
|
if not line:raise RuntimeError(self.p.stderr.read())
|
|
reply=json.loads(line)
|
|
if reply.get('id')==self.i:
|
|
if 'error' in reply:raise RuntimeError(reply['error'])
|
|
return reply['result']
|
|
def call(self,name,args=None):
|
|
r=self.request('tools/call',{'name':name,'arguments':args or {}})
|
|
for b in r.get('content',[]):
|
|
if b.get('type')=='text':
|
|
try:return json.loads(b['text'])
|
|
except ValueError:pass
|
|
return r
|
|
def close(self):
|
|
self.p.stdin.close();self.p.terminate();self.p.wait()
|
|
if __name__=='__main__':
|
|
v=VCC(sys.argv[1])
|
|
try:
|
|
if len(sys.argv)<3:result=v.request('tools/list',{})
|
|
else:result=v.call(sys.argv[2],json.loads(sys.argv[3]) if len(sys.argv)>3 else {})
|
|
print(json.dumps(result,indent=2))
|
|
finally:v.close()
|