MCP踩坑

发布于:2025-07-03 ⋅ 阅读:(39) ⋅ 点赞:(0)

 坑呀,工具中命名返回的时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)

正常通过~~~