@savvy-web/mcp 3.4.20 → 3.4.22

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/errors.js CHANGED
@@ -1,4 +1,4 @@
1
- import { ToolFailure, ToolRefusal } from "@effected/mcp";
1
+ import { ToolFailure, ToolRefusal } from "@effected/mcp-kit";
2
2
  import { Schema } from "effect";
3
3
 
4
4
  // src/errors.ts
package/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { Distribution } from "@effected/engine";
2
- import { ToolRefusal } from "@effected/mcp";
1
+ import { Distribution } from "@effected/kit";
2
+ import { ToolRefusal } from "@effected/mcp-kit";
3
3
  import { FileSystem, Layer, Path, Schema, Stdio } from "effect";
4
4
  import { ToolDiscovery } from "@effected/commands";
5
5
  import { Git } from "@effected/git";
@@ -71,7 +71,7 @@ export type McpToolError = typeof McpToolError.Type;
71
71
  * `gitmodules` mode can read `.gitmodules` through the ambient service
72
72
  * (mirroring `Repos.ReposDrift.check`) rather than a bare `node:fs` import —
73
73
  * {@link makeSilkRuntimeLayer} passes both through onto its own output via an
74
- * `Effect.context` identity layer, so they survive `main.ts`'s
74
+ * `Effect.context` layer narrowed with `Context.pick`, so they survive `main.ts`'s
75
75
  * `Layer.provide(NodeServices.layer)` instead of being fully discharged by
76
76
  * it. `ChildProcessSpawner` is passed through the same way, and `Git` (from the
77
77
  * kit graph) plus the shared `ToolDiscovery` are exposed, because
@@ -128,7 +128,7 @@ interface ServerOptions {
128
128
  }
129
129
  /**
130
130
  * The whole server as one layer: the ten-tool toolkit, the silk-effects
131
- * runtime discharging its dependencies, over `@effected/mcp`'s
131
+ * runtime discharging its dependencies, over `@effected/mcp-kit`'s
132
132
  * `McpStdio.layer`.
133
133
  *
134
134
  * `McpStdio.layer` is `McpServer.layerStdio` with the kit's default
@@ -142,8 +142,9 @@ export declare const ServerLayer: (cwd: string, options?: ServerOptions) => Laye
142
142
  /**
143
143
  * The `biome_check` tool value. Mutating when `write`/`unsafe` is set, so it is
144
144
  * annotated non-read-only and non-idempotent. `dependencies` lists what the
145
- * handler yields: `Git` (worktree containment), `ToolDiscovery` (the Biome
146
- * binary) and core's `ChildProcessSpawner` (`Run.collect`).
145
+ * handler yields: `Git` (worktree containment), `FileSystem` and `Path`
146
+ * (`PathContainment`), `ToolDiscovery` (the Biome binary) and core's
147
+ * `ChildProcessSpawner` (`Run.collect`).
147
148
  */
148
149
  declare const biomeCheckTool: Tool.Tool<"biome_check", {
149
150
  readonly parameters: Schema.Struct<{
@@ -175,7 +176,7 @@ declare const biomeCheckTool: Tool.Tool<"biome_check", {
175
176
  }>;
176
177
  readonly failure: Schema.Union<readonly [typeof WorkspaceNotFound, typeof EngineError, typeof BiomeFailed, typeof ToolRefusal]>;
177
178
  readonly failureMode: "error";
178
- }, ChildProcessSpawner.ChildProcessSpawner | Git | ToolDiscovery>;
179
+ }, ChildProcessSpawner.ChildProcessSpawner | FileSystem.FileSystem | Git | Path.Path | ToolDiscovery>;
179
180
  /** The `changeset_deps_detect` tool value. */
180
181
  declare const changesetDepsDetectTool: Tool.Tool<"changeset_deps_detect", {
181
182
  readonly parameters: Schema.Struct<{
@@ -203,7 +204,7 @@ declare const changesetDepsDetectTool: Tool.Tool<"changeset_deps_detect", {
203
204
  readonly packages: Schema.$Array<Schema.String>;
204
205
  }>>;
205
206
  }>;
206
- readonly failure: Schema.Union<readonly [typeof WorkspaceNotFound, typeof EngineError, typeof BiomeFailed, typeof import("@effected/mcp").ToolRefusal]>;
207
+ readonly failure: Schema.Union<readonly [typeof WorkspaceNotFound, typeof EngineError, typeof BiomeFailed, typeof import("@effected/mcp-kit").ToolRefusal]>;
207
208
  readonly failureMode: "error";
208
209
  }, Changesets.DepsRegen | WorkspaceRoot>;
209
210
  /** The `changeset_deps_regen` tool value. Mutating: not read-only, not idempotent. */
@@ -227,7 +228,7 @@ declare const changesetDepsRegenTool: Tool.Tool<"changeset_deps_regen", {
227
228
  }>>;
228
229
  readonly dryRun: Schema.Boolean;
229
230
  }>;
230
- readonly failure: Schema.Union<readonly [typeof WorkspaceNotFound, typeof EngineError, typeof BiomeFailed, typeof import("@effected/mcp").ToolRefusal]>;
231
+ readonly failure: Schema.Union<readonly [typeof WorkspaceNotFound, typeof EngineError, typeof BiomeFailed, typeof import("@effected/mcp-kit").ToolRefusal]>;
231
232
  readonly failureMode: "error";
232
233
  }, Changesets.DepsRegen | WorkspaceRoot>;
233
234
  /** The `changeset_inspect` tool value. */
@@ -301,7 +302,7 @@ declare const changesetInspectTool: Tool.Tool<"changeset_inspect", {
301
302
  }>, Schema.Null]>;
302
303
  }>>;
303
304
  }>]>;
304
- readonly failure: Schema.Union<readonly [typeof WorkspaceNotFound, typeof EngineError, typeof BiomeFailed, typeof import("@effected/mcp").ToolRefusal]>;
305
+ readonly failure: Schema.Union<readonly [typeof WorkspaceNotFound, typeof EngineError, typeof BiomeFailed, typeof import("@effected/mcp-kit").ToolRefusal]>;
305
306
  readonly failureMode: "error";
306
307
  }, Changesets.BranchAnalyzer | Changesets.ConfigInspector | WorkspaceRoot>;
307
308
  /** The `changeset_preview` tool value. */
@@ -328,7 +329,7 @@ declare const changesetPreviewTool: Tool.Tool<"changeset_preview", {
328
329
  }>>;
329
330
  }>>;
330
331
  }>;
331
- readonly failure: Schema.Union<readonly [typeof WorkspaceNotFound, typeof EngineError, typeof BiomeFailed, typeof import("@effected/mcp").ToolRefusal]>;
332
+ readonly failure: Schema.Union<readonly [typeof WorkspaceNotFound, typeof EngineError, typeof BiomeFailed, typeof import("@effected/mcp-kit").ToolRefusal]>;
332
333
  readonly failureMode: "error";
333
334
  }, Changesets.ReleasePlanner | WorkspaceRoot>;
334
335
  /** The `changeset_validate` tool value. */
@@ -412,7 +413,7 @@ declare const reposInspectTool: Tool.Tool<"repos_inspect", {
412
413
  }>>;
413
414
  readonly parseError: Schema.optionalKey<Schema.String>;
414
415
  }>]>;
415
- readonly failure: Schema.Union<readonly [typeof WorkspaceNotFound, typeof EngineError, typeof BiomeFailed, typeof import("@effected/mcp").ToolRefusal]>;
416
+ readonly failure: Schema.Union<readonly [typeof WorkspaceNotFound, typeof EngineError, typeof BiomeFailed, typeof import("@effected/mcp-kit").ToolRefusal]>;
416
417
  readonly failureMode: "error";
417
418
  }, FileSystem.FileSystem | Path.Path | Repos.ReposConfigStore | Repos.ReposDrift | Repos.ReposManager | WorkspaceRoot>;
418
419
  /**
@@ -421,7 +422,7 @@ declare const reposInspectTool: Tool.Tool<"repos_inspect", {
421
422
  * call is rejected as invalid parameters before the handler runs. Mutating:
422
423
  * not read-only, not idempotent.
423
424
  */
424
- declare const reposManageTool: import("@effected/mcp").UnionTool<"repos_manage", Schema.Union<readonly [Schema.Struct<{
425
+ declare const reposManageTool: import("@effected/mcp-kit").UnionTool<"repos_manage", Schema.Union<readonly [Schema.Struct<{
425
426
  readonly action: Schema.Literal<"sync">;
426
427
  readonly cwd: Schema.optionalKey<Schema.String>;
427
428
  }>, Schema.Struct<{
@@ -617,7 +618,7 @@ declare const turboInspectTool: Tool.Tool<"turbo_inspect", {
617
618
  readonly dependents: Schema.$Array<Schema.String>;
618
619
  }>;
619
620
  }>]>;
620
- readonly failure: Schema.Union<readonly [typeof WorkspaceNotFound, typeof EngineError, typeof BiomeFailed, typeof import("@effected/mcp").ToolRefusal]>;
621
+ readonly failure: Schema.Union<readonly [typeof WorkspaceNotFound, typeof EngineError, typeof BiomeFailed, typeof import("@effected/mcp-kit").ToolRefusal]>;
621
622
  readonly failureMode: "error";
622
623
  }, Turbo.TurboInspector | WorkspaceRoot>;
623
624
  /**
@@ -652,7 +653,7 @@ declare const workspaceInfoTool: Tool.Tool<"workspace_info", {
652
653
  readonly fixed: Schema.$Array<Schema.String>;
653
654
  }>>;
654
655
  }>;
655
- readonly failure: Schema.Union<readonly [typeof WorkspaceNotFound, typeof EngineError, typeof BiomeFailed, typeof import("@effected/mcp").ToolRefusal]>;
656
+ readonly failure: Schema.Union<readonly [typeof WorkspaceNotFound, typeof EngineError, typeof BiomeFailed, typeof import("@effected/mcp-kit").ToolRefusal]>;
656
657
  readonly failureMode: "error";
657
658
  }, SilkWorkspaceAnalyzer | WorkspaceRoot>;
658
659
  /**
package/main.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { Distribution } from "@effected/engine";
1
+ import { Distribution } from "@effected/kit";
2
2
  /**
3
3
  * Options for {@link main}.
4
4
  *
package/main.js CHANGED
@@ -1,4 +1,4 @@
1
- import { McpGuard } from "@effected/mcp/guard";
1
+ import { McpGuard } from "@effected/mcp-kit/guard";
2
2
 
3
3
  // src/main.ts
4
4
  /**
@@ -21,7 +21,7 @@ const main = (options = {}) => McpGuard.run({
21
21
  const NodeRuntime = await import("@effect/platform-node/NodeRuntime");
22
22
  const NodeServices = await import("@effect/platform-node/NodeServices");
23
23
  const { Layer } = await import("effect");
24
- const { LaunchContext } = await import("@effected/engine");
24
+ const { LaunchContext } = await import("@effected/kit");
25
25
  const { ServerLayer } = await import("./server.js");
26
26
  return {
27
27
  layer: ServerLayer(LaunchContext.projectDir({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@savvy-web/mcp",
3
- "version": "3.4.20",
3
+ "version": "3.4.22",
4
4
  "private": false,
5
5
  "description": "The savvy MCP server — Silk Suite tooling and library knowledge for coding agents",
6
6
  "homepage": "https://github.com/savvy-web/systems/tree/main/packages/mcp",
@@ -36,14 +36,14 @@
36
36
  "savvy-mcp": "bin/savvy-mcp.js"
37
37
  },
38
38
  "dependencies": {
39
- "@effect/platform-node": "~4.1.1",
40
- "@effected/commands": "^0.19.0",
41
- "@effected/engine": "^0.11.0",
42
- "@effected/git": "^0.29.0",
43
- "@effected/mcp": "^0.12.0",
44
- "@effected/templates": "^0.16.0",
45
- "@effected/workspaces": "^0.41.0",
46
- "@savvy-web/silk-effects": "^11.0.0",
47
- "effect": "~4.1.1"
39
+ "@effect/platform-node": "~4.1.2",
40
+ "@effected/commands": "^0.20.0",
41
+ "@effected/git": "^0.30.0",
42
+ "@effected/kit": "^0.13.0",
43
+ "@effected/mcp-kit": "^0.14.0",
44
+ "@effected/templates": "^0.18.0",
45
+ "@effected/workspaces": "^0.43.0",
46
+ "@savvy-web/silk-effects": "^11.0.2",
47
+ "effect": "~4.1.2"
48
48
  }
49
49
  }
package/runtime.js CHANGED
@@ -1,7 +1,8 @@
1
- import { Effect, Layer } from "effect";
1
+ import { Context, Effect, FileSystem, Layer, Path } from "effect";
2
2
  import { ToolDiscovery } from "@effected/commands";
3
3
  import { Workspaces } from "@effected/workspaces";
4
4
  import { ChangesetConfig, ChangesetConfigReader, Changesets, Repos, SilkPublishability, SilkWorkspaceAnalyzer, Turbo } from "@savvy-web/silk-effects";
5
+ import { ChildProcessSpawner } from "effect/process";
5
6
 
6
7
  // src/runtime.ts
7
8
  /**
@@ -72,7 +73,7 @@ const makeSilkRuntimeLayer = (cwd) => {
72
73
  * `repos_inspect`'s drift mode resolves it directly.
73
74
  */
74
75
  const repos = Layer.mergeAll(Repos.ReposConfigStore.layer, Repos.ReposManager.layer.pipe(Layer.provide(Repos.ReposConfigStore.layer), Layer.provide(Repos.ReposLockdown.layer)), Repos.ReposDrift.layer.pipe(Layer.provide(Repos.ReposConfigStore.layer)));
75
- const platformPassthrough = Layer.effectContext(Effect.context());
76
+ const platformPassthrough = Layer.effectContext(Effect.map(Effect.context(), Context.pick(FileSystem.FileSystem, Path.Path, ChildProcessSpawner.ChildProcessSpawner)));
76
77
  return Layer.mergeAll(SilkWorkspaceAnalyzer.layer.pipe(Layer.provide(analyzerDeps)), Turbo.TurboInspector.layer.pipe(Layer.provide(toolDiscovery)), toolDiscovery, inspectorAndAnalyzer, depsRegen, repos, platformPassthrough).pipe(Layer.provideMerge(kitGraph));
77
78
  };
78
79
 
package/server.js CHANGED
@@ -1,10 +1,9 @@
1
1
  import { makeSilkRuntimeLayer } from "./runtime.js";
2
2
  import { SilkToolkit, ToolsLayer } from "./toolkit.js";
3
3
  import { CURRENT_MCP_VERSION } from "./version.js";
4
- import { McpStdio, McpToolkit } from "@effected/mcp";
5
- import { Effect, Layer, Option } from "effect";
6
- import { distributionSuffix } from "@effected/engine";
7
- import { McpServer } from "effect/ai";
4
+ import { McpStdio, McpToolkit } from "@effected/mcp-kit";
5
+ import { Layer, Option } from "effect";
6
+ import { distributionSuffix } from "@effected/kit";
8
7
 
9
8
  // src/server.ts
10
9
  /**
@@ -27,34 +26,21 @@ const SERVER_INSTRUCTIONS = [
27
26
  "Every successful result is a typed object in structuredContent (content[0].text carries the same object as JSON). A failure is an isError result whose content[0].text carries the message and remediation, with no structuredContent. Every tool takes an optional cwd; omit it to use the server's project directory."
28
27
  ].join("\n");
29
28
  /**
30
- * Discharges every tool's declared `dependencies`. Since effect 4.1 a service a
31
- * tool lists in `dependencies` is a per-request `McpRequest<"Requires", S>`
32
- * requirement that only MCP middleware or the transport can meet;
33
- * `Layer.provide` no longer does. The silk runtime is built ONCE (it holds the
34
- * process-lifetime `ConfigInspector`, #229), so the middleware captures its
35
- * context when the layer is built and provides that same context to every
36
- * request.
37
- *
38
- * `Effect.context` captures the whole layer-build context, not only
39
- * `McpServices` (also `Scope`, `Clock`, `Console`, `McpServer`, the memo map),
40
- * and `Effect.provideContext` merges it OVER the request's context. Probed on
41
- * 4.1.1: a handler finalizer still runs at the end of its own request, and no
42
- * request-scoped key (`McpRequestContext`, log level, parent span) is in the
43
- * build context today. Core's own registration capture filters those keys
44
- * (`omitRequestServices`); this capture does not, so do not build this layer
45
- * inside a span or under a request-level reference.
46
- */
47
- const RuntimeMiddleware = McpServer.middleware()(Effect.map(Effect.context(), (context) => (effect) => Effect.provideContext(effect, context)));
48
- /**
49
29
  * The toolkit registration as a layer: `McpToolkit.layer` with the handlers
50
- * bound to `cwd` and {@link RuntimeMiddleware} meeting their request-level
51
- * dependencies. Passed to `McpStdio.layer` as `registrations`, so it builds
30
+ * bound to `cwd`. Passed to `McpStdio.layer` as `registrations`, so it builds
52
31
  * before the first request.
32
+ *
33
+ * Since effect 4.1 a service a tool lists in `dependencies` is a per-request
34
+ * `McpRequest<"Requires", S>` requirement that only MCP middleware or the
35
+ * transport can meet; `Layer.provide` no longer does.
36
+ * `McpToolkit.provideLifetime` is that middleware: the silk runtime is built
37
+ * ONCE (it holds the process-lifetime `ConfigInspector`, #229), and every
38
+ * request gets what the runtime layer outputs and nothing else.
53
39
  */
54
- const SilkToolsLayer = (cwd) => McpToolkit.layer(SilkToolkit, { strict: "annotated" }).pipe(Layer.provide(ToolsLayer(cwd)), Layer.provide(RuntimeMiddleware.layer));
40
+ const SilkToolsLayer = (cwd) => McpToolkit.layer(SilkToolkit, { strict: "annotated" }).pipe(Layer.provide(ToolsLayer(cwd)), Layer.provide(McpToolkit.provideLifetime(makeSilkRuntimeLayer(cwd))));
55
41
  /**
56
42
  * The whole server as one layer: the ten-tool toolkit, the silk-effects
57
- * runtime discharging its dependencies, over `@effected/mcp`'s
43
+ * runtime discharging its dependencies, over `@effected/mcp-kit`'s
58
44
  * `McpStdio.layer`.
59
45
  *
60
46
  * `McpStdio.layer` is `McpServer.layerStdio` with the kit's default
@@ -70,6 +56,6 @@ const ServerLayer = (cwd, options = {}) => McpStdio.layer({
70
56
  description: "Structured Silk Suite workspace tools: workspace, turbo, biome, changesets and vendored repos.",
71
57
  instructions: SERVER_INSTRUCTIONS,
72
58
  registrations: SilkToolsLayer(cwd)
73
- }).pipe(Layer.provide(makeSilkRuntimeLayer(cwd)));
59
+ });
74
60
 
75
61
  export { SERVER_INSTRUCTIONS, ServerLayer };
package/toolkit.js CHANGED
@@ -9,7 +9,7 @@ import { handleReposManage, reposManageTool } from "./tools/repos-manage.js";
9
9
  import { handleTurboInspect, turboInspectTool } from "./tools/turbo-inspect.js";
10
10
  import { handleWorkspaceInfo, workspaceInfoTool } from "./tools/workspace-info.js";
11
11
  import { Effect } from "effect";
12
- import { Exclusive } from "@effected/engine";
12
+ import { Exclusive } from "@effected/kit";
13
13
  import { Toolkit } from "effect/ai";
14
14
 
15
15
  // src/toolkit.ts
@@ -1,12 +1,13 @@
1
1
  import { BiomeFailed, McpToolError } from "../errors.js";
2
- import { ToolFailure, ToolRefusal } from "@effected/mcp";
3
- import { Effect, Option, Schema } from "effect";
2
+ import { ToolFailure, ToolRefusal } from "@effected/mcp-kit";
3
+ import { Effect, FileSystem, Option, Path, Schema } from "effect";
4
4
  import { Run, Tool, ToolDiscovery } from "@effected/commands";
5
+ import { ChildProcess, ChildProcessSpawner } from "effect/process";
6
+ import { PathContainment } from "@effected/kit";
5
7
  import { Tool as Tool$1 } from "effect/ai";
6
8
  import { realpathSync } from "node:fs";
7
- import { relative, resolve, sep } from "node:path";
9
+ import { relative, resolve } from "node:path";
8
10
  import { Git, TreeIdentity } from "@effected/git";
9
- import { ChildProcess, ChildProcessSpawner } from "effect/process";
10
11
 
11
12
  // src/tools/biome-check.ts
12
13
  /**
@@ -127,9 +128,8 @@ const buildBiomeResult = (params) => {
127
128
  };
128
129
  };
129
130
  /**
130
- * Canonicalize a caller-supplied path, falling back to lexical resolution when
131
- * it does not exist (a non-existent target cannot be a symlink pointing out of
132
- * tree). Also applied to a sibling worktree's `TreeIdentity.toplevel`, so the
131
+ * Canonicalize a working directory, falling back to lexical resolution when it
132
+ * does not exist. Also applied to a sibling worktree's `TreeIdentity.toplevel`, so the
133
133
  * containment root is spelled the same way as the realpath'd caller paths.
134
134
  */
135
135
  const canonicalize = (p) => {
@@ -168,7 +168,7 @@ const treeIdentity = (git, dir) => git.treeIdentity(dir).pipe(Effect.orElseSucce
168
168
  * @returns the directory tree to contain to, or `Option.none` to reject
169
169
  */
170
170
  const resolveContainmentRoot = Effect.fn("biome_check.resolveContainmentRoot")(function* (root, cwd) {
171
- if (cwd === root || cwd.startsWith(`${root}${sep}`)) return Option.some(root);
171
+ if (yield* PathContainment.isWithin(root, cwd)) return Option.some(root);
172
172
  const git = yield* Git;
173
173
  const from = yield* treeIdentity(git, cwd);
174
174
  if (Option.isNone(from)) return Option.none();
@@ -244,12 +244,11 @@ const runBiomeCheck = Effect.fn("biome_check.run")(function* (args, fallbackCwd,
244
244
  const contained = yield* resolveContainmentRoot(root, cwd);
245
245
  if (Option.isNone(contained)) return yield* ToolRefusal.refuse(`cwd escapes the workspace root: ${ToolFailure.truncate(args.cwd ?? fallbackCwd)}.`, CONTAINMENT_REMEDIATION);
246
246
  const containmentRoot = contained.value;
247
- const within = (abs) => abs === containmentRoot || abs.startsWith(`${containmentRoot}${sep}`);
248
247
  const rawPaths = args.paths && args.paths.length > 0 ? args.paths : ["."];
249
248
  const paths = [];
250
249
  for (const p of rawPaths) {
251
250
  const lexical = resolve(cwd, p);
252
- if (!within(canonicalize(lexical))) return yield* ToolRefusal.refuse(`path escapes the workspace root: ${ToolFailure.truncate(p)}.`, CONTAINMENT_REMEDIATION);
251
+ if (!(yield* PathContainment.isWithin(containmentRoot, lexical))) return yield* ToolRefusal.refuse(`path escapes the workspace root: ${ToolFailure.truncate(p)}.`, CONTAINMENT_REMEDIATION);
253
252
  paths.push(relative(cwd, lexical) || ".");
254
253
  }
255
254
  const doWrite = Boolean(args.write || args.unsafe);
@@ -295,8 +294,9 @@ const BiomeCheckParams = Schema.Struct({
295
294
  /**
296
295
  * The `biome_check` tool value. Mutating when `write`/`unsafe` is set, so it is
297
296
  * annotated non-read-only and non-idempotent. `dependencies` lists what the
298
- * handler yields: `Git` (worktree containment), `ToolDiscovery` (the Biome
299
- * binary) and core's `ChildProcessSpawner` (`Run.collect`).
297
+ * handler yields: `Git` (worktree containment), `FileSystem` and `Path`
298
+ * (`PathContainment`), `ToolDiscovery` (the Biome binary) and core's
299
+ * `ChildProcessSpawner` (`Run.collect`).
300
300
  */
301
301
  const biomeCheckTool = Tool$1.make("biome_check", {
302
302
  description: "Run Biome over a path and get structured diagnostics back. mode=check (default; lint + format + organize-imports) or mode=lint. Set write=true to apply safe fixes (--write), unsafe=true for unsafe fixes (--write --unsafe). Severities match the project's Biome config (what `biome check` reports); set strict=true to surface project warnings as errors, each marked with its originalSeverity. Prefer this over shelling out to biome; the LSP already covers files you've edited. Returns a typed object in structuredContent (content[] carries the same object as JSON). NOTE: with write/unsafe this tool MUTATES files (git-reversible).",
@@ -305,6 +305,8 @@ const biomeCheckTool = Tool$1.make("biome_check", {
305
305
  failure: McpToolError,
306
306
  dependencies: [
307
307
  Git,
308
+ FileSystem.FileSystem,
309
+ Path.Path,
308
310
  ToolDiscovery,
309
311
  ChildProcessSpawner.ChildProcessSpawner
310
312
  ]
@@ -1,5 +1,5 @@
1
1
  import { McpToolError, mapEngineError } from "../errors.js";
2
- import { ToolOutputSchema } from "@effected/mcp";
2
+ import { ToolOutputSchema } from "@effected/mcp-kit";
3
3
  import { Effect, Schema } from "effect";
4
4
  import { WorkspaceRoot } from "@effected/workspaces";
5
5
  import { Changesets } from "@savvy-web/silk-effects";
@@ -1,5 +1,5 @@
1
1
  import { McpToolError, mapEngineError } from "../errors.js";
2
- import { ToolFailure, ToolRefusal } from "@effected/mcp";
2
+ import { ToolFailure, ToolRefusal } from "@effected/mcp-kit";
3
3
  import { Data, Effect, Schema } from "effect";
4
4
  import { WorkspaceRoot } from "@effected/workspaces";
5
5
  import { Changesets } from "@savvy-web/silk-effects";
@@ -1,5 +1,5 @@
1
1
  import { McpToolError, mapEngineError } from "../errors.js";
2
- import { ToolOutputSchema } from "@effected/mcp";
2
+ import { ToolOutputSchema } from "@effected/mcp-kit";
3
3
  import { Effect, FileSystem, Option, Path, Result, Schema } from "effect";
4
4
  import { WorkspaceRoot } from "@effected/workspaces";
5
5
  import { Repos } from "@savvy-web/silk-effects";
@@ -1,5 +1,5 @@
1
1
  import { McpToolError, mapEngineError } from "../errors.js";
2
- import { McpToolkit, ToolOutputSchema, ToolRefusal } from "@effected/mcp";
2
+ import { McpToolkit, ToolOutputSchema, ToolRefusal } from "@effected/mcp-kit";
3
3
  import { Effect, Result, Schema } from "effect";
4
4
  import { WorkspaceRoot } from "@effected/workspaces";
5
5
  import { Repos } from "@savvy-web/silk-effects";
@@ -10,7 +10,7 @@ import { Tool } from "effect/ai";
10
10
  * The `repos_manage` MCP tool: one action-discriminated mutating tool
11
11
  * covering `sync`, `pin`, `add`, `note`, `remove`, `rename`, `restore`, and
12
12
  * `deregister` against the vendored `.repos/` submodules. Its parameters are
13
- * a `Schema.Union` of one struct per action, served by `@effected/mcp`'s
13
+ * a `Schema.Union` of one struct per action, served by `@effected/mcp-kit`'s
14
14
  * `McpToolkit.unionTool` as a strict `oneOf` keyed by `action`; the handler
15
15
  * receives the decoded member. Mutating — no `readOnlyHint`.
16
16
  *
@@ -1,5 +1,5 @@
1
1
  import { McpToolError, mapEngineError } from "../errors.js";
2
- import { ToolOutputSchema } from "@effected/mcp";
2
+ import { ToolOutputSchema } from "@effected/mcp-kit";
3
3
  import { Effect, Schema } from "effect";
4
4
  import { WorkspaceRoot } from "@effected/workspaces";
5
5
  import { Turbo } from "@savvy-web/silk-effects";
package/version.js CHANGED
@@ -6,6 +6,6 @@
6
6
  *
7
7
  * @packageDocumentation
8
8
  */
9
- const CURRENT_MCP_VERSION = "3.4.20";
9
+ const CURRENT_MCP_VERSION = "3.4.22";
10
10
 
11
11
  export { CURRENT_MCP_VERSION };