坑呀,工具中命名返回的时str类型但是报一下的错误
Error from MCP server: SyntaxError: Expected property name or '}' in JSON at position 2 (line 1 column 3)
at JSON.parse (<anonymous>)
def _extract_span_info(spans) -> str:
if not spans:
return ""
return "".join(
f"{span.operation} "
f""
f" tags: {span.tags}"
# for span in sorted(spans, key=lambda x: x.startTime)
for span in spans
)
调用skywaling的工具
@app.tool(name="query_skywalking_spans")
async def query_skywalking_spans(trace_id: str) -> str:
"""
通过 trace_id 查询 SkyWalking GraphQL 接口,返回调用链spans中的 数据。
"""
config = skywalking_config()
url = config["endpoint"] + "/graphql"
query ="query queryTrace($traceId: ID!) {\n trace: queryTrace(traceId: $traceId) {\n spans {\n traceId\n segmentId\n spanId\n parentSpanId\n refs {\n traceId\n parentSegmentId\n parentSpanId\n type\n }\n serviceCode\n serviceInstanceName\n startTime\n endTime\n endpointName\n type\n peer\n component\n isError\n layer\n tags {\n key\n value\n }\n logs {\n time\n data {\n key\n value\n }\n }\n }\n }\n}",
variables = {"traceId": trace_id}
async with httpx.AsyncClient() as client:
response = await client.post(url, json={"query": query, "variables": variables})
data = response.json()
spans = data.get("data", {}).get("trace", {}).get("spans", [])
spansStr = _extract_span_info(_transform_spans(spans))
print(type(spansStr))
return str(spansStr)
调试中出错:于是在js中打印了日志
![]()
export function deserializeMessage(line) {
console.log("data:"+line);
return JSONRPCMessageSchema.parse(JSON.parse(line));
}
显示数据是数组类型,很奇怪,为什么呢?
最终发现了原因,原来是我的schema描述有问题
@app.tool(name="query_skywalking_spans")
async def query_skywalking_spans(trace_id: str) -> str:
"""
通过 trace_id 查询 SkyWalking GraphQL 接口,返回调用链中的 数据。
"""
config = skywalking_config()
url = config["endpoint"] + "/graphql"
query ="query queryTrace($traceId: ID!) {\n trace: queryTrace(traceId: $traceId) {\n spans {\n traceId\n segmentId\n spanId\n parentSpanId\n refs {\n traceId\n parentSegmentId\n parentSpanId\n type\n }\n serviceCode\n serviceInstanceName\n startTime\n endTime\n endpointName\n type\n peer\n component\n isError\n layer\n tags {\n key\n value\n }\n logs {\n time\n data {\n key\n value\n }\n }\n }\n }\n}",
variables = {"traceId": trace_id}
async with httpx.AsyncClient() as client:
response = await client.post(url, json={"query": query, "variables": variables})
data = response.json()
spans = data.get("data", {}).get("trace", {}).get("spans", [])
spansStr = _extract_span_info(_transform_spans(spans))
print(type(spansStr))
return str(spansStr)
正常通过~~~