callman-mcp 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +26 -0
- package/README.md +27 -7
- package/dist/client/api.d.ts +59 -1
- package/dist/client/api.d.ts.map +1 -1
- package/dist/client/api.js +67 -0
- package/dist/client/api.js.map +1 -1
- package/dist/client/errors.d.ts.map +1 -1
- package/dist/client/errors.js +18 -11
- package/dist/client/errors.js.map +1 -1
- package/dist/client/types.d.ts +105 -0
- package/dist/client/types.d.ts.map +1 -1
- package/dist/config.d.ts +2 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +5 -1
- package/dist/config.js.map +1 -1
- package/dist/context.d.ts +8 -0
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +1 -0
- package/dist/context.js.map +1 -1
- package/dist/domain/requestShape.d.ts +4 -4
- package/dist/index.js +10 -2
- package/dist/index.js.map +1 -1
- package/dist/resources/docs/mocks.d.ts +2 -0
- package/dist/resources/docs/mocks.d.ts.map +1 -0
- package/dist/resources/docs/mocks.js +210 -0
- package/dist/resources/docs/mocks.js.map +1 -0
- package/dist/resources/docs/overview.d.ts +1 -1
- package/dist/resources/docs/overview.d.ts.map +1 -1
- package/dist/resources/docs/overview.js +7 -1
- package/dist/resources/docs/overview.js.map +1 -1
- package/dist/resources/generated/aiPacks.d.ts +1 -1
- package/dist/resources/generated/aiPacks.js +2 -2
- package/dist/resources/index.d.ts.map +1 -1
- package/dist/resources/index.js +2 -0
- package/dist/resources/index.js.map +1 -1
- package/dist/run/executeCollection.d.ts.map +1 -1
- package/dist/run/executeCollection.js +5 -1
- package/dist/run/executeCollection.js.map +1 -1
- package/dist/run/loadBundle.d.ts.map +1 -1
- package/dist/run/loadBundle.js +49 -2
- package/dist/run/loadBundle.js.map +1 -1
- package/dist/run/summarize.d.ts +28 -4
- package/dist/run/summarize.d.ts.map +1 -1
- package/dist/run/summarize.js +19 -1
- package/dist/run/summarize.js.map +1 -1
- package/dist/run/types.d.ts +2 -1
- package/dist/run/types.d.ts.map +1 -1
- package/dist/server.d.ts +6 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +16 -4
- package/dist/server.js.map +1 -1
- package/dist/tools/catalog.d.ts +1 -1
- package/dist/tools/catalog.d.ts.map +1 -1
- package/dist/tools/catalog.js +18 -0
- package/dist/tools/catalog.js.map +1 -1
- package/dist/tools/index.d.ts +9 -2
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +27 -3
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/meta.d.ts.map +1 -1
- package/dist/tools/meta.js +29 -2
- package/dist/tools/meta.js.map +1 -1
- package/dist/tools/mockShared.d.ts +983 -0
- package/dist/tools/mockShared.d.ts.map +1 -0
- package/dist/tools/mockShared.js +387 -0
- package/dist/tools/mockShared.js.map +1 -0
- package/dist/tools/mocks.d.ts +4 -0
- package/dist/tools/mocks.d.ts.map +1 -0
- package/dist/tools/mocks.js +331 -0
- package/dist/tools/mocks.js.map +1 -0
- package/dist/tools/mocksLocal.d.ts +24 -0
- package/dist/tools/mocksLocal.d.ts.map +1 -0
- package/dist/tools/mocksLocal.js +169 -0
- package/dist/tools/mocksLocal.js.map +1 -0
- package/dist/tools/run.d.ts +0 -1
- package/dist/tools/run.d.ts.map +1 -1
- package/dist/tools/run.js +7 -26
- package/dist/tools/run.js.map +1 -1
- package/dist-cjs/client/api.js +67 -0
- package/dist-cjs/client/errors.js +18 -11
- package/dist-cjs/config.js +5 -1
- package/dist-cjs/context.js +1 -0
- package/dist-cjs/resources/docs/mocks.js +212 -0
- package/dist-cjs/resources/docs/overview.js +7 -1
- package/dist-cjs/resources/generated/aiPacks.js +2 -2
- package/dist-cjs/resources/index.js +2 -0
- package/dist-cjs/run/executeCollection.js +5 -1
- package/dist-cjs/run/loadBundle.js +49 -2
- package/dist-cjs/run/summarize.js +19 -1
- package/dist-cjs/server.js +16 -4
- package/dist-cjs/tools/catalog.js +18 -0
- package/dist-cjs/tools/index.js +30 -6
- package/dist-cjs/tools/meta.js +28 -1
- package/dist-cjs/tools/mockShared.js +414 -0
- package/dist-cjs/tools/mocks.js +334 -0
- package/dist-cjs/tools/mocksLocal.js +179 -0
- package/dist-cjs/tools/run.js +7 -26
- package/package.json +2 -2
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { ToolInputError } from "../client/errors.js";
|
|
3
|
+
import { resolvedSummary } from "../domain/resolve.js";
|
|
4
|
+
import { jsonPreview, LIMITS, safeStringify } from "../lib/truncate.js";
|
|
5
|
+
import { curlLine, duplicateRoutes, findMock, loadMocks, logView, mockDetailView, mockListView, mockRefArg, mockRouteInputSchema, mockRoutePatchSchema, requireTarget, resolveRoute, routeView, targetArg, toServerRoute, toServerRoutePatch } from "./mockShared.js";
|
|
6
|
+
import { localCreate, localDelete, localGet, localList, localLogs, localUpdate, registerLocalMockTools } from "./mocksLocal.js";
|
|
7
|
+
import { workspaceTag, workspacesForListing } from "./lookups.js";
|
|
8
|
+
import { confirmArg, DESTRUCTIVE, dryRunArg, failureOf, guarded, IDEMPOTENT_WRITE, ok, READ, refArg, requireConfirm, WRITE, workspaceArg } from "./shared.js";
|
|
9
|
+
// Mock APIs. Server mocks (/api/mocks) are fake HTTP APIs with a public URL
|
|
10
|
+
// (`<server>/mock/<slug>/…`) that stay up until they expire. Routes answer
|
|
11
|
+
// with a static body, a template, or a builder preset (list / detail / create
|
|
12
|
+
// / update / delete over the mock's own state); read callman://docs/mocks.
|
|
13
|
+
// Tools that take `target: "desktop"` act on the local mocks of the user's own
|
|
14
|
+
// desktop app instead, through the local-mock relay (mocksLocal.ts).
|
|
15
|
+
const MOCK_TOKEN_HEADER = "X-Mock-Token";
|
|
16
|
+
const mockArg = mockRefArg("Mock");
|
|
17
|
+
const authArg = z.enum(["public", "token"]).describe('"public" (default): anyone with the URL can call it. "token": callers must send the X-Mock-Token header; the token is shown once, when it is generated.');
|
|
18
|
+
const authView = (mock, token, note) => mock.auth.type === "token"
|
|
19
|
+
? { type: "token", header: MOCK_TOKEN_HEADER, ...(token ? { token } : { tokenMasked: true }), ...(note ? { note } : {}) }
|
|
20
|
+
: { type: "public" };
|
|
21
|
+
const callsOf = (mock, token) => (mock.routes ?? []).map((route) => ({
|
|
22
|
+
route: `${route.method} ${route.path}`,
|
|
23
|
+
curl: curlLine(mock.publicUrl, route, mock.auth.type === "token" ? (token ?? null) : undefined),
|
|
24
|
+
}));
|
|
25
|
+
export const registerMockTools = (server, ctx) => {
|
|
26
|
+
const detail = async (wsId, mockId, reveal = false) => {
|
|
27
|
+
let includeSecrets = false;
|
|
28
|
+
if (reveal)
|
|
29
|
+
includeSecrets = (await ctx.getTokenScopes()).includes("environments:reveal");
|
|
30
|
+
const mock = await ctx.api.getMock(wsId, mockId, includeSecrets);
|
|
31
|
+
return { mock, token: mock.auth.type === "token" ? (mock.auth.token ?? null) : null, masked: mock.auth.type === "token" && !mock.auth.token };
|
|
32
|
+
};
|
|
33
|
+
server.registerTool("list_mocks", {
|
|
34
|
+
title: "List mock APIs",
|
|
35
|
+
description: "List mock APIs. Default target \"server\": the mocks of your workspaces (name, slug, public URL, requests served, expiry) — across ALL your workspaces unless `workspace` narrows it; they answer at <server>/mock/<slug>/… and expire (expiresAt). target \"desktop\": the local mocks inside the user's Callman desktop app (port, running, baseUrl). Read callman://docs/mocks first.",
|
|
36
|
+
inputSchema: { workspace: workspaceArg, target: targetArg, query: z.string().max(200).optional().describe("Filter by name or slug") },
|
|
37
|
+
annotations: READ,
|
|
38
|
+
}, guarded(async ({ workspace, target, query }) => {
|
|
39
|
+
if (target === "desktop")
|
|
40
|
+
return localList(ctx, workspace, query);
|
|
41
|
+
const workspaces = await workspacesForListing(ctx, workspace);
|
|
42
|
+
const needle = query?.trim().toLowerCase();
|
|
43
|
+
const perWorkspace = await Promise.all(workspaces.map(async (ws) => {
|
|
44
|
+
try {
|
|
45
|
+
const mocks = (await loadMocks(ctx, ws.id)).filter((mock) => !needle || mock.name.toLowerCase().includes(needle) || mock.mockId.toLowerCase().includes(needle));
|
|
46
|
+
return { workspace: workspaceTag(ws), mocks: mocks.map(mockListView), total: mocks.length };
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
if (workspaces.length === 1)
|
|
50
|
+
throw error;
|
|
51
|
+
return { workspace: workspaceTag(ws), mocks: [], total: 0, error: failureOf(error) };
|
|
52
|
+
}
|
|
53
|
+
}));
|
|
54
|
+
return ok(perWorkspace.length === 1 ? perWorkspace[0] : { workspaces: perWorkspace });
|
|
55
|
+
}));
|
|
56
|
+
server.registerTool("get_mock", {
|
|
57
|
+
title: "Get a mock API",
|
|
58
|
+
description: "Read one mock (target \"desktop\": a local mock — port, running, baseUrl and its static routes in the shape update_mock takes). Server: public URL, auth mode, limits, expiry and every route in the SAME shape create_mock / add_mock_route accept (response, variants, delay, requestValidation), plus a ready curl line per route. The mock's state is not included (get_mock_state). The access token of a token-protected mock stays masked unless reveal: true AND the token holds environments:reveal.",
|
|
59
|
+
inputSchema: { workspace: workspaceArg, mock: mockArg, target: targetArg, reveal: z.boolean().optional().describe("Server mocks: show the access token of a token-protected mock (needs environments:reveal)") },
|
|
60
|
+
annotations: READ,
|
|
61
|
+
}, guarded(async ({ workspace, mock, target, reveal }) => {
|
|
62
|
+
if (target === "desktop")
|
|
63
|
+
return localGet(ctx, workspace, mock);
|
|
64
|
+
const { ws, value: resolved, note } = await findMock(ctx, workspace, mock);
|
|
65
|
+
const { mock: fresh, token, masked } = await detail(ws.id, resolved.item.id, reveal);
|
|
66
|
+
return ok({
|
|
67
|
+
mock: mockDetailView(fresh, ctx.config.apiUrl, authView(fresh, token, masked && reveal ? "The token stayed masked: this token lacks environments:reveal. Ask the user for it, or switch auth off/on with update_mock to get a new one." : undefined)),
|
|
68
|
+
calls: callsOf(fresh, token),
|
|
69
|
+
workspace: workspaceTag(ws),
|
|
70
|
+
resolved: [resolvedSummary(mock, resolved), ...(note ? [{ input: mock, note }] : [])],
|
|
71
|
+
});
|
|
72
|
+
}));
|
|
73
|
+
server.registerTool("create_mock", {
|
|
74
|
+
title: "Create a mock API",
|
|
75
|
+
description: "Create a mock API, optionally with its routes in one call, and get the URL to call plus a curl line per route. Default target \"server\": a mock on the Callman server with a public URL. target \"desktop\": a local mock inside the user's Callman desktop app on 127.0.0.1:<port> (static routes only; it is started right away). Turn the user's request into routes: each route is { method, path, response } — response is static ({ type: \"static\", statusCode, headers?, body }), template ({{request.params.id}}, {{faker.email}}, {{state.key}} …) or builder (list/detail/create/update/delete over the mock's state). Shorthand for a static response: statusCode / headers / body directly on the route. Routes are added one by one; if the server rejects one, the new mock is deleted again (rollback) and the error names the route. The mock expires after ttlHours (default 48). Read callman://docs/mocks for every shape and the limits.",
|
|
76
|
+
inputSchema: {
|
|
77
|
+
workspace: workspaceArg,
|
|
78
|
+
target: targetArg,
|
|
79
|
+
name: z.string().trim().min(1).max(50),
|
|
80
|
+
slug: z.string().min(3).max(48).optional().describe("Readable URL name: lowercase letters, digits, single dashes, starts with a letter (my-orders-api). Taken or reserved slugs are refused; omit for a random one."),
|
|
81
|
+
description: z.string().max(200).optional(),
|
|
82
|
+
ttlHours: z.union([z.literal(1), z.literal(6), z.literal(24), z.literal(48)]).optional().describe("Lifetime in hours: 1, 6, 24 or 48 (default 48)"),
|
|
83
|
+
auth: authArg.optional(),
|
|
84
|
+
routes: z.array(mockRouteInputSchema).max(50).optional(),
|
|
85
|
+
port: z.number().int().min(1024).max(65_535).optional().describe("target desktop: the port on 127.0.0.1 (omit: the app picks a free one)"),
|
|
86
|
+
autoStart: z.boolean().optional().describe("target desktop: start this mock whenever the desktop app launches"),
|
|
87
|
+
start: z.boolean().optional().describe("target desktop: start it right away (default true)"),
|
|
88
|
+
dryRun: dryRunArg,
|
|
89
|
+
},
|
|
90
|
+
annotations: WRITE,
|
|
91
|
+
}, guarded(async ({ workspace, target, name, slug, description, ttlHours, auth, routes, port, autoStart, start, dryRun }) => {
|
|
92
|
+
requireTarget(target ?? "server", { slug, description, ttlHours, auth }, "server", "a local mock has a name, a port and static routes only.");
|
|
93
|
+
requireTarget(target ?? "server", { port, autoStart, start }, "desktop", 'pass target: "desktop" for a mock on the user\'s computer.');
|
|
94
|
+
if (target === "desktop")
|
|
95
|
+
return localCreate(ctx, workspace, { name: name.trim(), port, autoStart, routes, start: start ?? true, dryRun });
|
|
96
|
+
const ws = await ctx.resolveWorkspace(workspace);
|
|
97
|
+
const bodies = (routes ?? []).map((route, index) => toServerRoute(route, `routes[${index}]`));
|
|
98
|
+
const duplicates = duplicateRoutes(bodies);
|
|
99
|
+
if (duplicates.length > 0)
|
|
100
|
+
throw new ToolInputError("ROUTE_PATH_CONFLICT", `Two routes share the same method and path: ${duplicates.join(", ")}. One route per method + path.`, { duplicates });
|
|
101
|
+
if (dryRun)
|
|
102
|
+
return ok({ dryRun: true, mock: { name, ...(slug ? { slug } : {}), ttlHours: ttlHours ?? 48, auth: auth ?? "public" }, routes: bodies, workspace: workspaceTag(ws) });
|
|
103
|
+
const created = await ctx.api.createMock(ws.id, { name: name.trim(), ...(description ? { description } : {}), ...(ttlHours ? { ttlHours } : {}), ...(slug ? { slug } : {}), auth: { type: auth ?? "public" } });
|
|
104
|
+
ctx.invalidate("mocks");
|
|
105
|
+
const mockId = created.mock.mockId;
|
|
106
|
+
let current = created.mock;
|
|
107
|
+
for (const [index, body] of bodies.entries()) {
|
|
108
|
+
try {
|
|
109
|
+
current = await ctx.api.addMockRoute(ws.id, mockId, body);
|
|
110
|
+
}
|
|
111
|
+
catch (error) {
|
|
112
|
+
const scopes = await ctx.getTokenScopes();
|
|
113
|
+
let rollback;
|
|
114
|
+
if (scopes.length > 0 && !scopes.includes("mocks:delete"))
|
|
115
|
+
rollback = "not possible: the token lacks mocks:delete";
|
|
116
|
+
else {
|
|
117
|
+
try {
|
|
118
|
+
await ctx.api.deleteMock(ws.id, mockId);
|
|
119
|
+
rollback = "deleted";
|
|
120
|
+
}
|
|
121
|
+
catch (deleteError) {
|
|
122
|
+
rollback = `failed (${deleteError instanceof Error ? deleteError.message : String(deleteError)})`;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
ctx.invalidate("mocks");
|
|
126
|
+
const kept = rollback !== "deleted";
|
|
127
|
+
throw new ToolInputError("MOCK_ROUTE_REJECTED", `The server rejected route ${index + 1} of ${bodies.length} (${body.method} ${body.path})${kept ? "" : `; the new mock "${name}" was removed again`}.`, {
|
|
128
|
+
failedRoute: { index, method: body.method, path: body.path },
|
|
129
|
+
reason: failureOf(error),
|
|
130
|
+
routesAdded: index,
|
|
131
|
+
rollback,
|
|
132
|
+
...(kept ? { mock: { mockId, publicUrl: created.mock.publicUrl }, hint: `The mock "${mockId}" exists with the first ${index} route(s). Fix the failed route and add it with add_mock_route, or remove the mock with delete_mock.` } : { hint: "Fix the route (callman://docs/mocks) and call create_mock again." }),
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
const token = created.mock.auth.token ?? null;
|
|
137
|
+
return ok({
|
|
138
|
+
mock: mockDetailView(current, ctx.config.apiUrl, authView(current, token, "Shown once: only a user with environments:reveal can read it again.")),
|
|
139
|
+
publicUrl: created.publicUrl,
|
|
140
|
+
calls: callsOf(current, token),
|
|
141
|
+
workspace: workspaceTag(ws),
|
|
142
|
+
note: `Live now at ${created.publicUrl}. It expires ${current.expiresAt}.`,
|
|
143
|
+
});
|
|
144
|
+
}));
|
|
145
|
+
server.registerTool("update_mock", {
|
|
146
|
+
title: "Update a mock API",
|
|
147
|
+
description: "Server mock: rename, change the description, or switch auth between public and token (switching to token generates a new access token, shown once); its routes are changed with add_mock_route / update_mock_route / delete_mock_route; slug and lifetime cannot change. target \"desktop\" (local mock): name, port, autoStart, and `routes` which REPLACES all routes.",
|
|
148
|
+
inputSchema: {
|
|
149
|
+
workspace: workspaceArg,
|
|
150
|
+
mock: mockArg,
|
|
151
|
+
target: targetArg,
|
|
152
|
+
name: z.string().trim().min(1).max(50).optional(),
|
|
153
|
+
description: z.string().max(200).optional(),
|
|
154
|
+
auth: authArg.optional(),
|
|
155
|
+
port: z.number().int().min(1024).max(65_535).optional().describe("target desktop: move the mock to another port"),
|
|
156
|
+
autoStart: z.boolean().optional().describe("target desktop: start whenever the desktop app launches"),
|
|
157
|
+
routes: z.array(mockRouteInputSchema).max(50).optional().describe("target desktop: REPLACES all routes of the local mock (read them with get_mock, change, send all back)"),
|
|
158
|
+
},
|
|
159
|
+
annotations: IDEMPOTENT_WRITE,
|
|
160
|
+
}, guarded(async ({ workspace, mock, target, name, description, auth, port, autoStart, routes }) => {
|
|
161
|
+
requireTarget(target ?? "server", { description, auth }, "server", "a local mock has a name, a port and static routes only.");
|
|
162
|
+
requireTarget(target ?? "server", { port, autoStart, routes }, "desktop", target === undefined || target === "server" ? "change a server mock's routes with add_mock_route / update_mock_route / delete_mock_route." : "");
|
|
163
|
+
if (target === "desktop")
|
|
164
|
+
return localUpdate(ctx, workspace, mock, { name: name?.trim(), port, autoStart, routes });
|
|
165
|
+
if (name === undefined && description === undefined && auth === undefined)
|
|
166
|
+
throw new ToolInputError("NOTHING_TO_UPDATE", "Pass name, description or auth.");
|
|
167
|
+
const { ws, value: resolved } = await findMock(ctx, workspace, mock);
|
|
168
|
+
const updated = await ctx.api.updateMock(ws.id, resolved.item.id, { ...(name !== undefined ? { name: name.trim() } : {}), ...(description !== undefined ? { description } : {}), ...(auth ? { auth: { type: auth } } : {}) });
|
|
169
|
+
ctx.invalidate("mocks");
|
|
170
|
+
const token = updated.auth.type === "token" ? (updated.auth.token ?? null) : null;
|
|
171
|
+
return ok({ mock: mockDetailView(updated, ctx.config.apiUrl, authView(updated, token, token ? "A new token was generated; shown once." : undefined)), workspace: workspaceTag(ws), resolved: [resolvedSummary(mock, resolved)] });
|
|
172
|
+
}));
|
|
173
|
+
server.registerTool("delete_mock", {
|
|
174
|
+
title: "Delete a mock API",
|
|
175
|
+
description: "Permanently delete a mock (target \"desktop\": a local mock of the desktop app, which also stops it) with its routes, state and request logs; a server mock's public URL stops answering at once. Needs the exact name, slug or id.",
|
|
176
|
+
inputSchema: { workspace: workspaceArg, mock: mockArg, target: targetArg, confirm: confirmArg },
|
|
177
|
+
annotations: DESTRUCTIVE,
|
|
178
|
+
}, guarded(async ({ workspace, mock, target, confirm }) => {
|
|
179
|
+
requireConfirm(confirm, "a mock");
|
|
180
|
+
if (target === "desktop")
|
|
181
|
+
return localDelete(ctx, workspace, mock);
|
|
182
|
+
const { ws, value: resolved } = await findMock(ctx, workspace, mock, { exact: true });
|
|
183
|
+
await ctx.api.deleteMock(ws.id, resolved.item.id);
|
|
184
|
+
ctx.invalidate("mocks");
|
|
185
|
+
return ok({ deleted: { mockId: resolved.item.id, name: resolved.item.name }, workspace: workspaceTag(ws) });
|
|
186
|
+
}));
|
|
187
|
+
// ── routes ──────────────────────────────────────────────────────────
|
|
188
|
+
server.registerTool("add_mock_route", {
|
|
189
|
+
title: "Add a route to a mock API",
|
|
190
|
+
description: "Add one route to a server mock: { method, path, response } (or the static shorthand statusCode / headers / body), optional variants (other responses chosen by a condition on the request), delay and requestValidation (JSON Schema gate). One route per method + path; a mock holds up to 50 routes. Returns the route and its curl line.",
|
|
191
|
+
inputSchema: { workspace: workspaceArg, mock: mockArg, route: mockRouteInputSchema, dryRun: dryRunArg },
|
|
192
|
+
annotations: WRITE,
|
|
193
|
+
}, guarded(async ({ workspace, mock, route, dryRun }) => {
|
|
194
|
+
const { ws, value: resolved } = await findMock(ctx, workspace, mock);
|
|
195
|
+
const body = toServerRoute(route, "route");
|
|
196
|
+
if (dryRun)
|
|
197
|
+
return ok({ dryRun: true, route: body });
|
|
198
|
+
const updated = await ctx.api.addMockRoute(ws.id, resolved.item.id, body);
|
|
199
|
+
ctx.invalidate("mocks");
|
|
200
|
+
const added = updated.routes.find((candidate) => candidate.method === body.method && candidate.path === body.path) ?? updated.routes[updated.routes.length - 1];
|
|
201
|
+
return ok({ route: routeView(added), curl: curlLine(updated.publicUrl, added, updated.auth.type === "token" ? null : undefined), routeCount: updated.routes.length, publicUrl: updated.publicUrl, workspace: workspaceTag(ws) });
|
|
202
|
+
}));
|
|
203
|
+
server.registerTool("update_mock_route", {
|
|
204
|
+
title: "Change a route of a mock API",
|
|
205
|
+
description: "Change fields of one route; fields you leave out stay. `route` is the routeId, \"METHOD /path\", the path or the route name. Shorthand statusCode / headers / body change just those parts of a static or template response; `response` or `variants` replace the whole thing; requestValidation: null removes the body gate.",
|
|
206
|
+
inputSchema: { workspace: workspaceArg, mock: mockArg, route: refArg("Route", "(routeId, \"GET /users/:id\", path or name)"), changes: mockRoutePatchSchema },
|
|
207
|
+
annotations: IDEMPOTENT_WRITE,
|
|
208
|
+
}, guarded(async ({ workspace, mock, route, changes }) => {
|
|
209
|
+
const { ws, value: resolved } = await findMock(ctx, workspace, mock);
|
|
210
|
+
const current = await ctx.api.getMock(ws.id, resolved.item.id);
|
|
211
|
+
const target = resolveRoute(current, route);
|
|
212
|
+
const updated = await ctx.api.updateMockRoute(ws.id, resolved.item.id, target.routeId, toServerRoutePatch(changes, target, "changes"));
|
|
213
|
+
ctx.invalidate("mocks");
|
|
214
|
+
const next = updated.routes.find((candidate) => candidate.routeId === target.routeId) ?? target;
|
|
215
|
+
return ok({ route: routeView(next), curl: curlLine(updated.publicUrl, next, updated.auth.type === "token" ? null : undefined), workspace: workspaceTag(ws) });
|
|
216
|
+
}));
|
|
217
|
+
server.registerTool("delete_mock_route", {
|
|
218
|
+
title: "Delete a route of a mock API",
|
|
219
|
+
description: "Remove one route from a server mock (its URL then answers 404 no-route). `route` is the routeId, \"METHOD /path\", the path or the route name.",
|
|
220
|
+
inputSchema: { workspace: workspaceArg, mock: mockArg, route: refArg("Route", "(routeId, \"GET /users/:id\", path or name)"), confirm: confirmArg },
|
|
221
|
+
annotations: DESTRUCTIVE,
|
|
222
|
+
}, guarded(async ({ workspace, mock, route, confirm }) => {
|
|
223
|
+
requireConfirm(confirm, "a mock route");
|
|
224
|
+
const { ws, value: resolved } = await findMock(ctx, workspace, mock);
|
|
225
|
+
const current = await ctx.api.getMock(ws.id, resolved.item.id);
|
|
226
|
+
const target = resolveRoute(current, route);
|
|
227
|
+
const updated = await ctx.api.deleteMockRoute(ws.id, resolved.item.id, target.routeId);
|
|
228
|
+
ctx.invalidate("mocks");
|
|
229
|
+
return ok({ deleted: { routeId: target.routeId, method: target.method, path: target.path }, routeCount: updated.routes.length, workspace: workspaceTag(ws) });
|
|
230
|
+
}));
|
|
231
|
+
server.registerTool("reorder_mock_routes", {
|
|
232
|
+
title: "Reorder the routes of a mock API",
|
|
233
|
+
description: "Set the order of a server mock's routes. List EVERY route exactly once (routeId, \"METHOD /path\", path or name). The most specific matching path wins regardless of order; order only breaks ties and decides how the routes are listed.",
|
|
234
|
+
inputSchema: { workspace: workspaceArg, mock: mockArg, order: z.array(z.string().min(1).max(500)).min(1).max(500) },
|
|
235
|
+
annotations: IDEMPOTENT_WRITE,
|
|
236
|
+
}, guarded(async ({ workspace, mock, order }) => {
|
|
237
|
+
const { ws, value: resolved } = await findMock(ctx, workspace, mock);
|
|
238
|
+
const current = await ctx.api.getMock(ws.id, resolved.item.id);
|
|
239
|
+
const ids = order.map((reference) => resolveRoute(current, reference).routeId);
|
|
240
|
+
if (new Set(ids).size !== ids.length || ids.length !== current.routes.length) {
|
|
241
|
+
throw new ToolInputError("MOCK_ROUTE_REORDER_INVALID", `List every route of the mock exactly once (${current.routes.length} routes, ${ids.length} given).`, {
|
|
242
|
+
routes: current.routes.map((route) => ({ routeId: route.routeId, method: route.method, path: route.path })),
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
const updated = await ctx.api.reorderMockRoutes(ws.id, resolved.item.id, ids);
|
|
246
|
+
ctx.invalidate("mocks");
|
|
247
|
+
return ok({ routes: updated.routes.map((route) => ({ routeId: route.routeId, method: route.method, path: route.path })), workspace: workspaceTag(ws) });
|
|
248
|
+
}));
|
|
249
|
+
// ── logs, stats, state ──────────────────────────────────────────────
|
|
250
|
+
server.registerTool("get_mock_logs", {
|
|
251
|
+
title: "Read a mock API's request log",
|
|
252
|
+
description: "The requests a mock received (target \"desktop\": a local mock's latest requests), newest first: method, path, query, bodies (clipped), status, duration, which route/variant answered, and why a request failed (no-route, auth-failed, rate-limited, request-validation-failed …). Use it to see what a client really sent. Page with the returned nextCursor (`before`).",
|
|
253
|
+
inputSchema: {
|
|
254
|
+
workspace: workspaceArg,
|
|
255
|
+
mock: mockArg,
|
|
256
|
+
target: targetArg,
|
|
257
|
+
limit: z.number().int().min(1).max(100).optional().describe("Entries per page (default 20)"),
|
|
258
|
+
before: z.string().max(64).optional().describe("Cursor: the previous result's nextCursor"),
|
|
259
|
+
statusCode: z.number().int().min(100).max(599).optional(),
|
|
260
|
+
method: z.string().max(10).optional(),
|
|
261
|
+
},
|
|
262
|
+
annotations: READ,
|
|
263
|
+
}, guarded(async ({ workspace, mock, target, limit, before, statusCode, method }) => {
|
|
264
|
+
if (target === "desktop") {
|
|
265
|
+
requireTarget("desktop", { before, statusCode, method }, "server", "a local mock's log has the latest requests only.");
|
|
266
|
+
return localLogs(ctx, workspace, mock, limit);
|
|
267
|
+
}
|
|
268
|
+
const { ws, value: resolved } = await findMock(ctx, workspace, mock);
|
|
269
|
+
const page = await ctx.api.listMockLogs(ws.id, resolved.item.id, { limit: limit ?? 20, before, statusCode, method });
|
|
270
|
+
return ok({ mock: { mockId: resolved.item.id, name: resolved.item.name }, logs: page.items.map((entry) => logView(entry)), ...(page.nextCursor ? { nextCursor: page.nextCursor } : {}), workspace: workspaceTag(ws) });
|
|
271
|
+
}));
|
|
272
|
+
server.registerTool("get_mock_stats", {
|
|
273
|
+
title: "Get a mock API's statistics",
|
|
274
|
+
description: "Requests served in total and in the last 24 hours, rate-limit hits, the busiest routes and the distribution of response status codes.",
|
|
275
|
+
inputSchema: { workspace: workspaceArg, mock: mockArg },
|
|
276
|
+
annotations: READ,
|
|
277
|
+
}, guarded(async ({ workspace, mock }) => {
|
|
278
|
+
const { ws, value: resolved } = await findMock(ctx, workspace, mock);
|
|
279
|
+
return ok({ mock: { mockId: resolved.item.id, name: resolved.item.name }, stats: await ctx.api.getMockStats(ws.id, resolved.item.id), workspace: workspaceTag(ws) });
|
|
280
|
+
}));
|
|
281
|
+
server.registerTool("get_mock_state", {
|
|
282
|
+
title: "Read a mock API's state",
|
|
283
|
+
description: "The data the builder routes (create / update / delete / list from state) work on: `state` (live, changes with requests) and `initialState` (what reset_mock_state restores). Pass `key` for one top-level key; a big state comes back clipped with its size.",
|
|
284
|
+
inputSchema: { workspace: workspaceArg, mock: mockArg, key: z.string().max(120).optional().describe("Return only this top-level key of the state") },
|
|
285
|
+
annotations: READ,
|
|
286
|
+
}, guarded(async ({ workspace, mock, key }) => {
|
|
287
|
+
const { ws, value: resolved } = await findMock(ctx, workspace, mock);
|
|
288
|
+
const { state, initialState } = await ctx.api.getMockState(ws.id, resolved.item.id);
|
|
289
|
+
const pick = (value) => (key ? { [key]: value?.[key] } : value);
|
|
290
|
+
const view = (value) => {
|
|
291
|
+
const picked = pick(value ?? {});
|
|
292
|
+
const text = safeStringify(picked);
|
|
293
|
+
return text.length > LIMITS.FULL_BODY ? { truncated: true, sizeBytes: text.length, preview: jsonPreview(picked, LIMITS.FULL_BODY), keys: Object.keys(value ?? {}) } : picked;
|
|
294
|
+
};
|
|
295
|
+
return ok({ mock: { mockId: resolved.item.id, name: resolved.item.name }, state: view(state), initialState: view(initialState), workspace: workspaceTag(ws) });
|
|
296
|
+
}));
|
|
297
|
+
server.registerTool("set_mock_state", {
|
|
298
|
+
title: "Set a mock API's state",
|
|
299
|
+
description: "Replace the mock's live `state` and/or its `initialState` (the starting data reset_mock_state returns to) with a JSON object — e.g. { users: [{ id: 1, name: \"Ada\" }] } for builder routes with source { kind: \"state\", stateKey: \"users\" }. The whole object is replaced, not merged; limit 1 MB.",
|
|
300
|
+
inputSchema: { workspace: workspaceArg, mock: mockArg, state: z.record(z.unknown()).optional(), initialState: z.record(z.unknown()).optional() },
|
|
301
|
+
annotations: IDEMPOTENT_WRITE,
|
|
302
|
+
}, guarded(async ({ workspace, mock, state, initialState }) => {
|
|
303
|
+
if (state === undefined && initialState === undefined)
|
|
304
|
+
throw new ToolInputError("NOTHING_TO_UPDATE", "Pass state and/or initialState.");
|
|
305
|
+
const { ws, value: resolved } = await findMock(ctx, workspace, mock);
|
|
306
|
+
const written = [];
|
|
307
|
+
if (initialState !== undefined) {
|
|
308
|
+
await ctx.api.replaceMockInitialState(ws.id, resolved.item.id, initialState);
|
|
309
|
+
written.push("initialState");
|
|
310
|
+
}
|
|
311
|
+
if (state !== undefined) {
|
|
312
|
+
await ctx.api.replaceMockState(ws.id, resolved.item.id, state);
|
|
313
|
+
written.push("state");
|
|
314
|
+
}
|
|
315
|
+
ctx.invalidate("mocks");
|
|
316
|
+
return ok({ mock: { mockId: resolved.item.id, name: resolved.item.name }, written, workspace: workspaceTag(ws) });
|
|
317
|
+
}));
|
|
318
|
+
server.registerTool("reset_mock_state", {
|
|
319
|
+
title: "Reset a mock API's state",
|
|
320
|
+
description: "Restore the mock's live state to its initialState (undo what create / update / delete requests changed).",
|
|
321
|
+
inputSchema: { workspace: workspaceArg, mock: mockArg },
|
|
322
|
+
annotations: IDEMPOTENT_WRITE,
|
|
323
|
+
}, guarded(async ({ workspace, mock }) => {
|
|
324
|
+
const { ws, value: resolved } = await findMock(ctx, workspace, mock);
|
|
325
|
+
const { state } = await ctx.api.resetMockState(ws.id, resolved.item.id);
|
|
326
|
+
ctx.invalidate("mocks");
|
|
327
|
+
return ok({ mock: { mockId: resolved.item.id, name: resolved.item.name }, reset: true, stateKeys: Object.keys(state ?? {}), workspace: workspaceTag(ws) });
|
|
328
|
+
}));
|
|
329
|
+
registerLocalMockTools(server, ctx);
|
|
330
|
+
};
|
|
331
|
+
//# sourceMappingURL=mocks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mocks.js","sourceRoot":"","sources":["../../src/tools/mocks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
|
|
3
|
+
import type { LocalMockOp, Workspace } from "../client/types.js";
|
|
4
|
+
import type { ToolContext } from "../context.js";
|
|
5
|
+
import { type MockRouteInput } from "./mockShared.js";
|
|
6
|
+
export declare const runLocalMock: (ctx: ToolContext, ws: Workspace, op: LocalMockOp, payload: Record<string, unknown>) => Promise<unknown>;
|
|
7
|
+
export declare const localList: (ctx: ToolContext, workspace: string | undefined, query: string | undefined) => Promise<CallToolResult>;
|
|
8
|
+
export declare const localGet: (ctx: ToolContext, workspace: string | undefined, ref: string) => Promise<CallToolResult>;
|
|
9
|
+
export interface LocalWrite {
|
|
10
|
+
name?: string;
|
|
11
|
+
port?: number;
|
|
12
|
+
autoStart?: boolean;
|
|
13
|
+
routes?: MockRouteInput[];
|
|
14
|
+
}
|
|
15
|
+
export declare const localCreate: (ctx: ToolContext, workspace: string | undefined, input: LocalWrite & {
|
|
16
|
+
name: string;
|
|
17
|
+
start: boolean;
|
|
18
|
+
dryRun?: boolean;
|
|
19
|
+
}) => Promise<CallToolResult>;
|
|
20
|
+
export declare const localUpdate: (ctx: ToolContext, workspace: string | undefined, ref: string, input: LocalWrite) => Promise<CallToolResult>;
|
|
21
|
+
export declare const localDelete: (ctx: ToolContext, workspace: string | undefined, ref: string) => Promise<CallToolResult>;
|
|
22
|
+
export declare const localLogs: (ctx: ToolContext, workspace: string | undefined, ref: string, limit: number | undefined) => Promise<CallToolResult>;
|
|
23
|
+
export declare const registerLocalMockTools: (server: McpServer, ctx: ToolContext) => void;
|
|
24
|
+
//# sourceMappingURL=mocksLocal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mocksLocal.d.ts","sourceRoot":"","sources":["../../src/tools/mocksLocal.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAGzE,OAAO,KAAK,EAAE,WAAW,EAAyC,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACxG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAGjD,OAAO,EAAuF,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AA0B3I,eAAO,MAAM,YAAY,GAAU,KAAK,WAAW,EAAE,IAAI,SAAS,EAAE,IAAI,WAAW,EAAE,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,OAAO,CAAC,OAAO,CAgCtI,CAAC;AAUF,eAAO,MAAM,SAAS,GAAU,KAAK,WAAW,EAAE,WAAW,MAAM,GAAG,SAAS,EAAE,OAAO,MAAM,GAAG,SAAS,KAAG,OAAO,CAAC,cAAc,CAKlI,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAU,KAAK,WAAW,EAAE,WAAW,MAAM,GAAG,SAAS,EAAE,KAAK,MAAM,KAAG,OAAO,CAAC,cAAc,CAKnH,CAAC;AAEF,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,cAAc,EAAE,CAAC;CAC3B;AAiBD,eAAO,MAAM,WAAW,GAAU,KAAK,WAAW,EAAE,WAAW,MAAM,GAAG,SAAS,EAAE,OAAO,UAAU,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,KAAG,OAAO,CAAC,cAAc,CAwBjL,CAAC;AAEF,eAAO,MAAM,WAAW,GAAU,KAAK,WAAW,EAAE,WAAW,MAAM,GAAG,SAAS,EAAE,KAAK,MAAM,EAAE,OAAO,UAAU,KAAG,OAAO,CAAC,cAAc,CAiBzI,CAAC;AAEF,eAAO,MAAM,WAAW,GAAU,KAAK,WAAW,EAAE,WAAW,MAAM,GAAG,SAAS,EAAE,KAAK,MAAM,KAAG,OAAO,CAAC,cAAc,CAKtH,CAAC;AAEF,eAAO,MAAM,SAAS,GAAU,KAAK,WAAW,EAAE,WAAW,MAAM,GAAG,SAAS,EAAE,KAAK,MAAM,EAAE,OAAO,MAAM,GAAG,SAAS,KAAG,OAAO,CAAC,cAAc,CAK/I,CAAC;AAIF,eAAO,MAAM,sBAAsB,GAAI,QAAQ,SAAS,EAAE,KAAK,WAAW,KAAG,IAqB5E,CAAC"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { CallmanApiError, ToolInputError } from "../client/errors.js";
|
|
2
|
+
import { resolvedSummary } from "../domain/resolve.js";
|
|
3
|
+
import { LIMITS } from "../lib/truncate.js";
|
|
4
|
+
import { localBaseUrl, localCalls, localMockView, mockRefArg, resolveLocalMock, toLocalRoute } from "./mockShared.js";
|
|
5
|
+
import { guarded, ok, WRITE, workspaceArg } from "./shared.js";
|
|
6
|
+
// Local mocks: the mock servers inside the user's own Callman desktop app
|
|
7
|
+
// (plain HTTP listeners on 127.0.0.1). The MCP only talks to the backend, so
|
|
8
|
+
// every operation is a command: queued through POST /api/local-mock-commands,
|
|
9
|
+
// picked up by the desktop app (which must be open, signed in, with "Let AI
|
|
10
|
+
// tools manage local mock APIs on this computer" on), executed against its
|
|
11
|
+
// local mock manager, and answered through the same command record, which this
|
|
12
|
+
// module polls (every second, up to 25 s).
|
|
13
|
+
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
14
|
+
// Local mocks belong to the user's computer, not to a workspace, but the relay
|
|
15
|
+
// is workspace-scoped: use the named / default / only workspace, else the first.
|
|
16
|
+
const relayWorkspace = async (ctx, explicit) => {
|
|
17
|
+
const picked = await ctx.resolveWorkspaceOrNull(explicit);
|
|
18
|
+
if (picked)
|
|
19
|
+
return picked;
|
|
20
|
+
const [first] = await ctx.listWorkspaces();
|
|
21
|
+
if (!first)
|
|
22
|
+
throw new ToolInputError("WORKSPACE_NONE", "You are not a member of any workspace.");
|
|
23
|
+
return first;
|
|
24
|
+
};
|
|
25
|
+
const DESKTOP_HINT = "Open the Callman desktop app, sign in, and turn on Settings → AI tools → \"Let AI tools manage local mock APIs on this computer\". Then try again.";
|
|
26
|
+
export const runLocalMock = async (ctx, ws, op, payload) => {
|
|
27
|
+
const queued = await ctx.api.queueLocalMockCommand(ws.id, { op, payload });
|
|
28
|
+
const { intervalMs, timeoutMs } = ctx.localMockPoll;
|
|
29
|
+
const started = Date.now();
|
|
30
|
+
for (;;) {
|
|
31
|
+
await sleep(intervalMs);
|
|
32
|
+
let state;
|
|
33
|
+
try {
|
|
34
|
+
state = await ctx.api.getLocalMockCommand(ws.id, queued.id);
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
// A hiccup while polling must not lose a command that is already running.
|
|
38
|
+
if (error instanceof CallmanApiError && error.status < 500 && error.status !== 429)
|
|
39
|
+
throw error;
|
|
40
|
+
if (Date.now() - started >= timeoutMs)
|
|
41
|
+
throw error;
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
if (state.status === "done")
|
|
45
|
+
return state.result;
|
|
46
|
+
if (state.status === "failed") {
|
|
47
|
+
const failure = state.error ?? { code: "LOCAL_MOCK_FAILED", message: "The desktop app could not do that." };
|
|
48
|
+
throw new ToolInputError(failure.code || "LOCAL_MOCK_FAILED", failure.message, { target: "desktop", op });
|
|
49
|
+
}
|
|
50
|
+
if (state.status === "expired") {
|
|
51
|
+
throw new ToolInputError("LOCAL_MOCK_NOT_PICKED_UP", "No desktop app picked up the request.", { target: "desktop", op, hint: DESKTOP_HINT });
|
|
52
|
+
}
|
|
53
|
+
if (Date.now() - started >= timeoutMs) {
|
|
54
|
+
throw new ToolInputError("LOCAL_MOCK_TIMEOUT", `The desktop app did not answer within ${Math.round(timeoutMs / 1000)} s.`, {
|
|
55
|
+
target: "desktop",
|
|
56
|
+
op,
|
|
57
|
+
commandId: queued.id,
|
|
58
|
+
hint: "The command may still run once the app wakes up. Check with list_mocks { target: \"desktop\" } before repeating a create/update/delete; reading and start/stop are safe to repeat. Make sure the app is open and not asleep.",
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
const loadLocal = async (ctx, ws) => (await runLocalMock(ctx, ws, "list", {})).mocks ?? [];
|
|
64
|
+
const mockOf = (result) => result.mock;
|
|
65
|
+
const target = { target: "desktop" };
|
|
66
|
+
// ── operations (called by the shared tools when target is "desktop") ───
|
|
67
|
+
export const localList = async (ctx, workspace, query) => {
|
|
68
|
+
const ws = await relayWorkspace(ctx, workspace);
|
|
69
|
+
const needle = query?.trim().toLowerCase();
|
|
70
|
+
const mocks = (await loadLocal(ctx, ws)).filter((mock) => !needle || mock.name.toLowerCase().includes(needle));
|
|
71
|
+
return ok({ ...target, mocks: mocks.map((mock) => localMockView(mock, { routes: false })), total: mocks.length });
|
|
72
|
+
};
|
|
73
|
+
export const localGet = async (ctx, workspace, ref) => {
|
|
74
|
+
const ws = await relayWorkspace(ctx, workspace);
|
|
75
|
+
const resolved = resolveLocalMock(await loadLocal(ctx, ws), ref);
|
|
76
|
+
const fresh = mockOf(await runLocalMock(ctx, ws, "get", { mockId: resolved.item.id }));
|
|
77
|
+
return ok({ ...target, mock: localMockView(fresh), calls: localCalls(fresh), resolved: [resolvedSummary(ref, resolved)], ...(fresh.running ? {} : { note: "Not running — start_mock starts it." }) });
|
|
78
|
+
};
|
|
79
|
+
const localRoutes = (routes) => routes?.map((route, index) => toLocalRoute(route, `routes[${index}]`));
|
|
80
|
+
const dedupe = (routes) => {
|
|
81
|
+
const seen = new Set();
|
|
82
|
+
for (const route of routes ?? []) {
|
|
83
|
+
const key = `${route.method} ${route.path}`;
|
|
84
|
+
if (seen.has(key))
|
|
85
|
+
throw new ToolInputError("ROUTE_PATH_CONFLICT", `Two routes share the same method and path: ${key}. One route per method + path.`);
|
|
86
|
+
seen.add(key);
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
const portProblem = (port) => {
|
|
90
|
+
if (port !== undefined && (port < 1024 || port > 65_535))
|
|
91
|
+
throw new ToolInputError("LOCAL_MOCK_PORT_INVALID", "A local mock port is 1024–65535 (omit it to let the app pick a free one).");
|
|
92
|
+
};
|
|
93
|
+
export const localCreate = async (ctx, workspace, input) => {
|
|
94
|
+
const routes = localRoutes(input.routes);
|
|
95
|
+
dedupe(routes);
|
|
96
|
+
portProblem(input.port);
|
|
97
|
+
const payload = { name: input.name, ...(input.port !== undefined ? { port: input.port } : {}), ...(input.autoStart !== undefined ? { autoStart: input.autoStart } : {}), ...(routes ? { routes } : {}) };
|
|
98
|
+
if (input.dryRun)
|
|
99
|
+
return ok({ ...target, dryRun: true, mock: payload });
|
|
100
|
+
const ws = await relayWorkspace(ctx, workspace);
|
|
101
|
+
let mock = mockOf(await runLocalMock(ctx, ws, "create", payload));
|
|
102
|
+
let startError;
|
|
103
|
+
if (input.start && !mock.running) {
|
|
104
|
+
try {
|
|
105
|
+
mock = mockOf(await runLocalMock(ctx, ws, "start", { mockId: mock.id }));
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
if (error instanceof ToolInputError)
|
|
109
|
+
startError = { code: error.code, message: error.message };
|
|
110
|
+
else
|
|
111
|
+
throw error;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return ok({
|
|
115
|
+
...target,
|
|
116
|
+
mock: localMockView(mock),
|
|
117
|
+
baseUrl: localBaseUrl(mock),
|
|
118
|
+
calls: localCalls(mock),
|
|
119
|
+
...(startError ? { startError, note: `Created but not running: ${startError.message}. Fix it (another port?) and call start_mock.` } : { note: mock.running ? `Listening on ${localBaseUrl(mock)} (this computer only) while the desktop app is open.` : "Created; start_mock starts it." }),
|
|
120
|
+
});
|
|
121
|
+
};
|
|
122
|
+
export const localUpdate = async (ctx, workspace, ref, input) => {
|
|
123
|
+
const routes = localRoutes(input.routes);
|
|
124
|
+
dedupe(routes);
|
|
125
|
+
portProblem(input.port);
|
|
126
|
+
if (input.name === undefined && input.port === undefined && input.autoStart === undefined && routes === undefined)
|
|
127
|
+
throw new ToolInputError("NOTHING_TO_UPDATE", "Pass name, port, autoStart or routes.");
|
|
128
|
+
const ws = await relayWorkspace(ctx, workspace);
|
|
129
|
+
const resolved = resolveLocalMock(await loadLocal(ctx, ws), ref);
|
|
130
|
+
const mock = mockOf(await runLocalMock(ctx, ws, "update", {
|
|
131
|
+
mockId: resolved.item.id,
|
|
132
|
+
...(input.name !== undefined ? { name: input.name } : {}),
|
|
133
|
+
...(input.port !== undefined ? { port: input.port } : {}),
|
|
134
|
+
...(input.autoStart !== undefined ? { autoStart: input.autoStart } : {}),
|
|
135
|
+
...(routes ? { routes } : {}),
|
|
136
|
+
}));
|
|
137
|
+
return ok({ ...target, mock: localMockView(mock), baseUrl: localBaseUrl(mock), calls: localCalls(mock), resolved: [resolvedSummary(ref, resolved)] });
|
|
138
|
+
};
|
|
139
|
+
export const localDelete = async (ctx, workspace, ref) => {
|
|
140
|
+
const ws = await relayWorkspace(ctx, workspace);
|
|
141
|
+
const resolved = resolveLocalMock(await loadLocal(ctx, ws), ref, { exact: true });
|
|
142
|
+
await runLocalMock(ctx, ws, "delete", { mockId: resolved.item.id });
|
|
143
|
+
return ok({ ...target, deleted: { id: resolved.item.id, name: resolved.item.name } });
|
|
144
|
+
};
|
|
145
|
+
export const localLogs = async (ctx, workspace, ref, limit) => {
|
|
146
|
+
const ws = await relayWorkspace(ctx, workspace);
|
|
147
|
+
const resolved = resolveLocalMock(await loadLocal(ctx, ws), ref);
|
|
148
|
+
const result = (await runLocalMock(ctx, ws, "logs", { mockId: resolved.item.id, limit: Math.min(limit ?? 20, 200) }));
|
|
149
|
+
return ok({ ...target, mock: { id: resolved.item.id, name: resolved.item.name }, logs: (result.logs ?? []).slice(0, LIMITS.LIST_MAX * 2) });
|
|
150
|
+
};
|
|
151
|
+
// ── start / stop (desktop only: server mocks are always on) ────────────
|
|
152
|
+
export const registerLocalMockTools = (server, ctx) => {
|
|
153
|
+
for (const op of ["start", "stop"]) {
|
|
154
|
+
server.registerTool(`${op}_mock`, {
|
|
155
|
+
title: op === "start" ? "Start a local mock API" : "Stop a local mock API",
|
|
156
|
+
description: op === "start"
|
|
157
|
+
? "Start a local mock of the user's Callman desktop app: it then listens on http://127.0.0.1:<port> (this computer only). Server mocks are always on and need no start. Needs the desktop app open with \"Let AI tools manage local mock APIs on this computer\" on."
|
|
158
|
+
: "Stop a local mock of the user's Callman desktop app (its routes are kept; start_mock starts it again). Server mocks cannot be stopped — delete_mock removes them.",
|
|
159
|
+
inputSchema: { workspace: workspaceArg, mock: mockRefArg("Local mock") },
|
|
160
|
+
annotations: WRITE,
|
|
161
|
+
}, guarded(async ({ workspace, mock }) => {
|
|
162
|
+
const ws = await relayWorkspace(ctx, workspace);
|
|
163
|
+
const resolved = resolveLocalMock(await loadLocal(ctx, ws), mock);
|
|
164
|
+
const result = mockOf(await runLocalMock(ctx, ws, op, { mockId: resolved.item.id }));
|
|
165
|
+
return ok({ ...target, mock: localMockView(result, { routes: false }), baseUrl: localBaseUrl(result), ...(op === "start" && result.lastError ? { note: `Could not start: ${result.lastError}` } : {}), resolved: [resolvedSummary(mock, resolved)] });
|
|
166
|
+
}));
|
|
167
|
+
}
|
|
168
|
+
};
|
|
169
|
+
//# sourceMappingURL=mocksLocal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mocksLocal.js","sourceRoot":"","sources":["../../src/tools/mocksLocal.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/run.d.ts
CHANGED
|
@@ -14,7 +14,6 @@ interface PreparedRun {
|
|
|
14
14
|
} | null;
|
|
15
15
|
warnings: string[];
|
|
16
16
|
redaction: RedactorOptions;
|
|
17
|
-
skipped: Map<string, string[]>;
|
|
18
17
|
}
|
|
19
18
|
export declare const prepareRun: (ctx: ToolContext, ws: string, collectionId: string, environmentRef: string | undefined) => Promise<PreparedRun>;
|
|
20
19
|
export declare const registerRunTools: (server: McpServer, ctx: ToolContext) => void;
|