Skip to content

McpError: MCP error -32603: keyValidator._parse is not a function #291

@mmdctjj

Description

@mmdctjj

Describe the bug
when I run node ./client.js, it return Tool call error: McpError: MCP error -32603: keyValidator._parse is not a function

please checkzod version!
please checkzod version!
please checkzod version!

const facts = [
  "公理1: 生存是文明的第一需要.",
  "公理2: 文明不断增长和扩张,但宇宙中的物质总量保持不变.",
].map((f) => f.toLowerCase());

server.tool(
    "search_local_database",
    z.object({ query: z.string() }),
    async ({ query }) => {
      console.log("Tool called with query:", query);
      const queryTerms = query.toLowerCase().split(/\s+/);
      const results = facts.filter((fact) =>
        queryTerms.some((term) => fact.includes(term))
      );
      return {
        content: [
          {
            type: "text",
            text: results.length === 0 ? "未找到相关公理" : results.join("\n"),
          },
        ],
      };
    }
  );

To Reproduce
Steps to reproduce the behavior:
1.

Expected behavior

Logs

Tool call error: McpError: MCP error -32603: keyValidator._parse is not a function
    at Client._onresponse (file:///Users/xxx/Documents/mcp_llm/node_modules/@modelcontextprotocol/sdk/dist/esm/shared/protocol.js:205:27)
    at _transport.onmessage (file:///Users/xxx/Documents/mcp_llm/node_modules/@modelcontextprotocol/sdk/dist/esm/shared/protocol.js:76:22)
    at StdioClientTransport.processReadBuffer (file:///Users/xxx/Documents/mcp_llm/node_modules/@modelcontextprotocol/sdk/dist/esm/client/stdio.js:118:79)
    at Socket.<anonymous> (file:///Users/xxx/Documents/mcp_llm/node_modules/@modelcontextprotocol/sdk/dist/esm/client/stdio.js:93:22)
    at Socket.emit (node:events:514:28)
    at addChunk (node:internal/streams/readable:545:12)
    at readableAddChunkPushByteMode (node:internal/streams/readable:495:3)
    at Readable.push (node:internal/streams/readable:375:5)
    at Pipe.onStreamRead (node:internal/stream_base_commons:190:23) {
  code: -32603,
  data: undefined
}

Additional context
Add any other context about the problem here.

import {
  McpServer,
  ResourceTemplate,
} from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";

const facts = [
  "公理1: 生存是文明的第一需要.",
  "公理2: 文明不断增长和扩张,但宇宙中的物质总量保持不变.",
].map((f) => f.toLowerCase());
try {
  const server = new McpServer({
    name: "mcp-cli-server",
    version: "1.0.0",
  });

  // 使用 Zod 定义工具的输入模式
  server.tool(
    "search_local_database",
    z.object({ query: z.string() }),
    async ({ query }) => {
      console.log("Tool called with query:", query);
      const queryTerms = query.toLowerCase().split(/\s+/);
      const results = facts.filter((fact) =>
        queryTerms.some((term) => fact.includes(term))
      );
      return {
        content: [
          {
            type: "text",
            text: results.length === 0 ? "未找到相关公理" : results.join("\n"),
          },
        ],
      };
    }
  );

  // 定义资源
  server.resource(
    "current_time",
    new ResourceTemplate("time://current", { list: undefined }),
    async (uri) => ({
      contents: [{ uri: uri.href, text: new Date().toLocaleString() }],
    })
  );

  await server.connect(new StdioServerTransport());
  console.log("Server is running...");
  console.log("Registered resources:", server.resources);
  console.log("Registered tools:", server.tools);
} catch (err) {
  console.error("Server connection failed:", err);
}

async function getContext(client, question) {
  let currentTime = "";
  let additionalContext = "";

  try {
    const resources = await client.readResource(
      { uri: "time://current" },
      { timeout: 15000 }
    ); 
    console.log("Resources response:", resources);
    currentTime = resources.contents[0]?.text || new Date().toLocaleString();
  } catch (err) {
    console.error("Resource read error:", err);
    currentTime = new Date().toLocaleString();
  }

  if (question.toLowerCase().includes("公理")) {
    console.log("Searching for axioms...", question);
    try {
      const toolResult = await client.callTool({
        name: "search_local_database",
        arguments: { query: question },
      });
      console.log("Tool result:", toolResult);
      additionalContext = toolResult.content[0]?.text || "No results found.";
    } catch (err) {
      console.error("Tool call error:", err);
      additionalContext = "Error searching database.";
    }
  }

  return { currentTime, additionalContext };
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions