

























@@ -1,8 +1,20 @@
11import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
22import { getFreePortBlockWithPermissionFallback } from "../test-utils/ports.js";
334+type MockGatewayTool = {
5+name: string;
6+description: string;
7+parameters: Record<string, unknown>;
8+execute: (...args: unknown[]) => Promise<{ content: Array<{ type: string; text: string }> }>;
9+};
10+11+type MockGatewayScopedTools = {
12+agentId: string;
13+tools: MockGatewayTool[];
14+};
15+416const resolveGatewayScopedToolsMock = vi.hoisted(() =>
5-vi.fn(() => ({
17+vi.fn<(...args: unknown[]) => MockGatewayScopedTools>(() => ({
618agentId: "main",
719tools: [
820{
@@ -112,6 +124,43 @@ describe("mcp loopback server", () => {
112124);
113125});
114126127+it("adds empty properties for object schemas that omit properties", async () => {
128+resolveGatewayScopedToolsMock.mockReturnValue({
129+agentId: "main",
130+tools: [
131+{
132+name: "schema_probe",
133+description: "exercise no-argument MCP schemas",
134+parameters: { type: "object" },
135+execute: async () => ({
136+content: [{ type: "text", text: "ok" }],
137+}),
138+},
139+],
140+});
141+server = await startMcpLoopbackServer(0);
142+const runtime = getActiveMcpLoopbackRuntime();
143+144+const response = await sendRaw({
145+port: server.port,
146+token: runtime ? resolveMcpLoopbackBearerToken(runtime, false) : undefined,
147+headers: {
148+"content-type": "application/json",
149+"x-session-key": "agent:main:main",
150+},
151+body: JSON.stringify({ jsonrpc: "2.0", id: 1, method: "tools/list" }),
152+});
153+const payload = (await response.json()) as {
154+result?: { tools?: Array<{ inputSchema?: Record<string, unknown> }> };
155+};
156+157+expect(response.status).toBe(200);
158+expect(payload.result?.tools?.[0]?.inputSchema).toEqual({
159+type: "object",
160+properties: {},
161+});
162+});
163+115164it("derives senderIsOwner from the loopback bearer token", async () => {
116165server = await startMcpLoopbackServer(0);
117166const activeServer = server;
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。